From 44c8537666222374e2e045886716e94024f28583 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 23 Jun 2018 08:44:20 +1000 Subject: [PATCH 001/730] fix #691 Allow binding epoch time millis directly to date types --- CHANGELOG.md | 3 +- VERSION_MATRIX.md | 2 +- .../java/act/data/JodaDateTimeCodecBase.java | 35 ++++++++++++++++--- .../java/testapp/endpoint/ghissues/GH691.java | 18 ++++++++++ .../java/testapp/endpoint/GHIssue691.java | 31 ++++++++++++++++ 5 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 testapp/src/main/java/testapp/endpoint/ghissues/GH691.java create mode 100644 testapp/src/test/java/testapp/endpoint/GHIssue691.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b5f68d9f..f35d0502b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log -**1.8.8-RC11** 20/Jun/2018 +**1.8.8** +* Allow binding epoch time millis directly to date types #691 * `ActionContext.allowIgnoreParamNamespace` not effective when POJO has collection typed fields #690 * ParamLoader: POJO array or container field shall be initialized even if no request data for them #689 * JWT token expiration is not effect #688 diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index eb2a274fe..0cb779dd8 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,6 +1,6 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8-RC11 | +| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8-RC11 | | --- | ----: | ----: | ----: | ----: | | aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.1 | | beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.4 | diff --git a/src/main/java/act/data/JodaDateTimeCodecBase.java b/src/main/java/act/data/JodaDateTimeCodecBase.java index 65f6adf7d..d9ed42027 100644 --- a/src/main/java/act/data/JodaDateTimeCodecBase.java +++ b/src/main/java/act/data/JodaDateTimeCodecBase.java @@ -30,6 +30,8 @@ import org.osgl.$; import org.osgl.util.*; +import java.lang.reflect.Type; +import java.util.List; import java.util.Locale; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -41,9 +43,10 @@ public abstract class JodaDateTimeCodecBase extends StringValueResolver im private Locale defLocale; protected DateTimeFormatter formatter; private AppConfig conf; + private Class dateTimeType; public JodaDateTimeCodecBase(DateTimeFormatter formatter) { - E.NPE(formatter); + exploreDateTimeType(); conf = Act.appConfig(); i18n = conf.i18nEnabled(); defLocale = conf.locale(); @@ -51,6 +54,7 @@ public JodaDateTimeCodecBase(DateTimeFormatter formatter) { } public JodaDateTimeCodecBase(String pattern) { + exploreDateTimeType(); E.illegalArgumentIf(S.blank(pattern)); conf = Act.appConfig(); i18n = conf.i18nEnabled(); @@ -70,7 +74,18 @@ public final Class targetClass() { @Override public final T resolve(String value) { - return S.blank(value) ? null : parse(formatter(), value); + if (S.blank(value)) { + return null; + } + // for #691 + int len = value.length(); + if (9 == len || 10 == len) { + if (S.isIntOrLong(value)) { + long epoc = Long.parseLong(value); + return (T) $.convert(epoc).to(dateTimeType); + } + } + return parse(formatter(), value); } public final String toJSONString(T o) { @@ -84,8 +99,15 @@ public final StringValueResolver amended(AnnotationAware beanSpec) { if (null != dfp) { return create(dfp.value()); } - Pattern pattern = beanSpec.getAnnotation(Pattern.class); - return null == pattern ? this : create(pattern.value()); + String format = null; + DateFormatPattern pattern = beanSpec.getAnnotation(DateFormatPattern.class); + if (null == pattern) { + Pattern patternLegacy = beanSpec.getAnnotation(Pattern.class); + format = null == patternLegacy ? null : patternLegacy.value(); + } else { + format = pattern.value(); + } + return null == format ? this : create(format); } protected abstract T parse(DateTimeFormatter formatter, String value); @@ -150,6 +172,11 @@ private void initFormatter(DateTimeFormatter formatter) { verify(); } + private void exploreDateTimeType() { + List types = Generics.typeParamImplementations(getClass(), StringValueResolver.class); + dateTimeType = (Class) types.get(0); + } + private DateTimeFormatter formatter(String pattern, Locale locale) { if (S.blank(pattern)) { return defaultFormatter(); diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH691.java b/testapp/src/main/java/testapp/endpoint/ghissues/GH691.java new file mode 100644 index 000000000..7af501f46 --- /dev/null +++ b/testapp/src/main/java/testapp/endpoint/ghissues/GH691.java @@ -0,0 +1,18 @@ +package testapp.endpoint.ghissues; + +import org.joda.time.DateTime; +import org.joda.time.LocalDate; +import org.osgl.mvc.annotation.GetAction; + +public class GH691 extends GithubIssueBase { + + @GetAction("691/1") + public DateTime test1(DateTime timestamp) { + return timestamp; + } + + @GetAction("691/2") + public LocalDate test2(LocalDate timestamp) { + return timestamp; + } +} diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue691.java b/testapp/src/test/java/testapp/endpoint/GHIssue691.java new file mode 100644 index 000000000..af40e4422 --- /dev/null +++ b/testapp/src/test/java/testapp/endpoint/GHIssue691.java @@ -0,0 +1,31 @@ +package testapp.endpoint; + +import org.junit.Test; +import org.osgl.mvc.result.BadRequest; + +public class GHIssue691 extends EndpointTester { + + @Test + public void test1() throws Exception { + url("/gh/691/1?timestamp=100000000").get(); + checkRespCode(); + } + + @Test(expected = BadRequest.class) + public void test1OutOfRange() throws Exception { + url("/gh/691/1?timestamp=10000000").get(); + checkRespCode(); + } + + @Test + public void test2() throws Exception { + url("/gh/691/2?timestamp=2500000000").get(); + checkRespCode(); + } + + @Test(expected = BadRequest.class) + public void test2OutOfRange() throws Exception { + url("/gh/691/2?timestamp=12500000000").get(); + checkRespCode(); + } +} From a2cabf8f0a191fb703953160866221db990fc434 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 25 Jun 2018 06:44:52 +1000 Subject: [PATCH 002/730] CATPCHA support - coding finished --- pom.xml | 9 +- src/main/java/act/act_messages.java | 4 +- src/main/java/act/app/ActionContext.java | 48 ++++++++++ src/main/java/act/app/App.java | 22 +++++ src/main/java/act/conf/AppConfig.java | 80 +++++++++++++++++ src/main/java/act/conf/AppConfigKey.java | 38 ++++++++ .../captcha/CaptchaPluginManager.java | 43 +++++++++ .../controller/captcha/CaptchaService.java | 61 +++++++++++++ .../controller/captcha/CaptchaSession.java | 80 +++++++++++++++++ .../captcha/CaptchaSessionGenerator.java | 11 +++ .../controller/captcha/CaptchaViolation.java | 62 +++++++++++++ .../controller/captcha/MediaGenerator.java | 8 ++ .../controller/captcha/RequireCaptcha.java | 38 ++++++++ .../generator/ArithmeticGenerator.java | 89 +++++++++++++++++++ .../generator/RandomTextGenerator.java | 51 +++++++++++ .../captcha/render/BackgroundGenerator.java | 31 +++++++ .../captcha/render/CaptchaImageRender.java | 7 ++ .../captcha/render/DefaultImageRender.java | 34 +++++++ .../captcha/render/FontProvider.java | 57 ++++++++++++ .../captcha/render/img/CurvesFilter.java | 15 ++++ .../render/img/DoubleRippleFilter.java | 15 ++++ .../captcha/render/img/MarbleFilter.java | 15 ++++ .../captcha/render/img/RippleFilter.java | 15 ++++ .../captcha/render/img/WobbleFilter.java | 15 ++++ src/main/java/act/crypto/AppCrypto.java | 2 + .../java/act/data/JodaDateTimeCodecBase.java | 2 +- .../impl/ReflectedHandlerInvoker.java | 24 +++-- .../act/httpclient/HttpClientService.java | 64 +++++++++++++ src/main/resources/act.scan.list | 1 + .../resources/act/act_messages.properties | 5 ++ .../resources/act/act_messages_zh.properties | 4 + .../act/act_messages_zh_HK.properties | 4 + .../act/act_messages_zh_TW.properties | 4 + 33 files changed, 949 insertions(+), 9 deletions(-) create mode 100644 src/main/java/act/controller/captcha/CaptchaPluginManager.java create mode 100644 src/main/java/act/controller/captcha/CaptchaService.java create mode 100644 src/main/java/act/controller/captcha/CaptchaSession.java create mode 100644 src/main/java/act/controller/captcha/CaptchaSessionGenerator.java create mode 100644 src/main/java/act/controller/captcha/CaptchaViolation.java create mode 100644 src/main/java/act/controller/captcha/MediaGenerator.java create mode 100644 src/main/java/act/controller/captcha/RequireCaptcha.java create mode 100644 src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java create mode 100644 src/main/java/act/controller/captcha/generator/RandomTextGenerator.java create mode 100644 src/main/java/act/controller/captcha/render/BackgroundGenerator.java create mode 100644 src/main/java/act/controller/captcha/render/CaptchaImageRender.java create mode 100644 src/main/java/act/controller/captcha/render/DefaultImageRender.java create mode 100644 src/main/java/act/controller/captcha/render/FontProvider.java create mode 100644 src/main/java/act/controller/captcha/render/img/CurvesFilter.java create mode 100644 src/main/java/act/controller/captcha/render/img/DoubleRippleFilter.java create mode 100644 src/main/java/act/controller/captcha/render/img/MarbleFilter.java create mode 100644 src/main/java/act/controller/captcha/render/img/RippleFilter.java create mode 100644 src/main/java/act/controller/captcha/render/img/WobbleFilter.java create mode 100644 src/main/java/act/httpclient/HttpClientService.java diff --git a/pom.xml b/pom.xml index 3eb03e7f4..224cc01da 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ 1.0.0.Final 2.9.9 3.10.0 - 1.17.0 + 1.18.0-SNAPSHOT 1.5.0 1.8.0 1.8.0 @@ -70,6 +70,7 @@ 1.7.0 1.2.0 2.0.0-BETA-1 + 0.0.1 1.11.3 1.3.0 1.1.0.Final @@ -198,6 +199,12 @@ ${jfiglet.version} + + com.github.bingoohuang + patchca + ${patcha.version} + + org.actframework act-asm diff --git a/src/main/java/act/act_messages.java b/src/main/java/act/act_messages.java index 25b4adc2e..239830b0e 100644 --- a/src/main/java/act/act_messages.java +++ b/src/main/java/act/act_messages.java @@ -1,4 +1,6 @@ -package act;/*- +package act; + +/*- * #%L * ACT Framework * %% diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index d7d53557b..f4e0d9e2a 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -29,6 +29,7 @@ import act.Trace; import act.conf.AppConfig; import act.controller.ResponseCache; +import act.controller.captcha.CaptchaViolation; import act.data.MapUtil; import act.data.RequestBodyParser; import act.event.ActEvent; @@ -57,6 +58,7 @@ import org.osgl.util.C; import org.osgl.util.E; import org.osgl.util.S; +import org.osgl.util.Token; import org.osgl.web.util.UserAgent; import java.lang.annotation.Annotation; @@ -106,6 +108,7 @@ public class ActionContext extends ActContext.Base implements Des private String urlContext; private boolean byPassImplicitTemplateVariable; private boolean isLargeResponse; + private boolean requireCaptcha; private int pathVarCount; private UrlPath urlPath; private Set pathVarNames = new HashSet<>(); @@ -263,6 +266,51 @@ public ActionContext router(Router router) { return this; } + public void markAsRequireCaptcha() { + this.requireCaptcha = true; + } + + public void ensureCaptcha() { + if (!subjectToCaptchaProtection()) { + return; + } + if (verifyReCaptcha()) { + return; + } + if (!verifyActCaptcha()) { + addViolation("captcha", new CaptchaViolation()); + } + } + + private boolean verifyReCaptcha() { + return app().httpClientService().verifyReCaptchaResponse(this); + } + + private boolean verifyActCaptcha() { + String token = paramVal("a-captcha-token"); + if (S.blank(token)) { + return false; + } + String answer = paramVal("a-captcha-answer"); + if (S.blank(answer)) { + return false; + } + Token theToken = app().crypto().parseToken(token); + if (!theToken.isValid()) { + return false; + } + theToken.consume(); + return S.eq(answer, theToken.id()); + } + + private boolean subjectToCaptchaProtection() { + if (!requireCaptcha) { + return false; + } + H.Method method = req().method(); + return method == H.Method.POST || method == H.Method.PUT || method == H.Method.PATCH; + } + public MissingAuthenticationHandler missingAuthenticationHandler() { if (null != forceMissingAuthenticationHandler) { return forceMissingAuthenticationHandler; diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index c1bdc7d65..901a71f44 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -40,6 +40,7 @@ import act.conf.AppConfigKey; import act.conf.ConfigurationByteCodeScanner; import act.controller.bytecode.ControllerByteCodeScanner; +import act.controller.captcha.CaptchaPluginManager; import act.crypto.AppCrypto; import act.data.DataPropertyRepository; import act.data.JodaDateTimeCodec; @@ -52,6 +53,7 @@ import act.handler.RequestHandler; import act.handler.builtin.ResourceGetter; import act.handler.builtin.controller.FastRequestHandler; +import act.httpclient.HttpClientService; import act.i18n.I18n; import act.inject.ActProviders; import act.inject.DependencyInjectionBinder; @@ -137,6 +139,7 @@ public enum F { private File appHome; private Router router; private CliDispatcher cliDispatcher; + private CaptchaPluginManager captchaPluginManager; private Map moreRouters; private AppConfig config; private AppClassLoader classLoader; @@ -156,6 +159,7 @@ public enum F { private BinderManager binderManager; private AppInterceptorManager interceptorManager; private DependencyInjector dependencyInjector; + private HttpClientService httpClientService; private UploadFileStorageService uploadFileStorageService; private AppServiceRegistry appServiceRegistry; private MasterEntityMetaInfoRepo entityMetaInfoRepo; @@ -392,6 +396,10 @@ public CliDispatcher cliDispatcher() { return cliDispatcher; } + public CaptchaPluginManager captchaSessionGeneratorManager() { + return captchaPluginManager; + } + public Router router() { return router; } @@ -635,6 +643,8 @@ public synchronized void refresh() { loadRoutes(); emit(ROUTER_LOADED); initApiManager(); + initHttpClientService(); + initCaptchaPluginManager(); initCliDispatcher(); initCliServer(); initMetricMetaInfoRepo(); @@ -893,6 +903,10 @@ public EventBus eventBus() { return eventBus; } + public HttpClientService httpClientService() { + return httpClientService; + } + public MasterEntityMetaInfoRepo entityMetaInfoRepo() { return entityMetaInfoRepo; } @@ -1273,6 +1287,10 @@ private void initCliDispatcher() { } } + private void initCaptchaPluginManager() { + captchaPluginManager = new CaptchaPluginManager(this); + } + private void initCliServer() { if (config().cliEnabled()) { cliServer = new CliServer(this); @@ -1363,6 +1381,10 @@ private void initInterceptorManager() { interceptorManager = new AppInterceptorManager(this); } + private void initHttpClientService() { + httpClientService = new HttpClientService(this); + } + private void initScannerManager() { scannerManager = new AppCodeScannerManager(this); } diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index c0e640d5f..325edd748 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -62,13 +62,16 @@ import org.osgl.web.util.UserAgent; import org.rythmengine.utils.Time; +import java.awt.*; import java.io.File; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import javax.inject.Provider; @@ -272,6 +275,83 @@ private void _mergeCacheForOnDev(AppConfig config){ } } + private Integer captchaWidth; + protected T captchaWidth(int w) { + this.captchaWidth = w; + return me(); + } + public int captchaWidth() { + if (null == captchaWidth) { + captchaWidth = getInteger(CAPTCHA_WIDTH, 200); + } + return captchaWidth; + } + private void _mergeCaptchaWidth(AppConfig config){ + if (!hasConfiguration(CAPTCHA_WIDTH)) { + captchaWidth = config.captchaWidth; + } + } + private Integer captchaHeight; + protected T captchaHeight(int h) { + this.captchaHeight = h; + return me(); + } + public int captchaHeight() { + if (null == captchaHeight) { + captchaHeight = getInteger(CAPTCHA_HEIGHT, 70); + } + return captchaHeight; + } + private void _mergeCaptchaHeight(AppConfig config){ + if (!hasConfiguration(CAPTCHA_HEIGHT)) { + captchaHeight = config.captchaHeight; + } + } + + private Color captchaBgColor; + protected T captchaBgColor(Color color) { + this.captchaBgColor = color; + return me(); + } + public Color captchaBgColor() { + if (null == captchaBgColor) { + String s = get(CAPTCHA_BG_COLOR, "white"); + Field f = $.fieldOf(Color.class, s, false); + if (null == f) { + warn("Invalid captcha.background.color found: " + s); + info("will use white as captcha.background.color"); + captchaBgColor = Color.WHITE; + } else { + captchaBgColor = $.getFieldValue(null, f); + } + } + return captchaBgColor; + } + private void _mergeCaptchaBgColor(AppConfig config) { + if (!hasConfiguration(CAPTCHA_BG_COLOR)) { + captchaBgColor = config.captchaBgColor; + } + } + + private String reCaptchaSecret; + protected T reCaptchaSecret(String secret) { + this.reCaptchaSecret = secret; + return me(); + } + public String reCaptchaSecret() { + if (null != reCaptchaSecret) { + reCaptchaSecret = get(CAPTCHA_RECAPTCHA_SECRET, ""); + } + return reCaptchaSecret; + } + public boolean reCaptchaActivated() { + return S.notBlank(reCaptchaSecret()); + } + private void _mergeReCaptchaSecret(AppConfig config) { + if (!hasConfiguration(CAPTCHA_RECAPTCHA_SECRET)) { + reCaptchaSecret = config.reCaptchaSecret; + } + } private Boolean cors; diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index c2268d5d0..2443c71fb 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -126,6 +126,44 @@ public enum AppConfigKey implements ConfigKey { */ CACHE_FOR_ON_DEV("cacheFor.dev"), + /** + * `captcha.width` + * + * Specify the width of the captcha image + * + * Default value: 200 + */ + CAPTCHA_WIDTH("captcha.width"), + + /** + * `captcha.height` + * + * Specify the height of the captcha image + * + * Default value: 70 + */ + CAPTCHA_HEIGHT("captcha.height"), + + /** + * `captcha.background.color` + * + * Specify the background color of the captcha image. + * + * It shall be valid color constant name defined in {@link java.awt.Color} class. + * + * Default value: white + */ + CAPTCHA_BG_COLOR("captcha.background.color"), + + /** + * `captcha.recaptcha.secret` - specifies your + * site's google reCAPTCHA secret. + * + * Once this is setup, then it enables reCAPTCHA server + * side verification. + */ + CAPTCHA_RECAPTCHA_SECRET("captcha.recaptcha.secret"), + /** * {@code act.cli.enabled} * diff --git a/src/main/java/act/controller/captcha/CaptchaPluginManager.java b/src/main/java/act/controller/captcha/CaptchaPluginManager.java new file mode 100644 index 000000000..95aab0796 --- /dev/null +++ b/src/main/java/act/controller/captcha/CaptchaPluginManager.java @@ -0,0 +1,43 @@ +package act.controller.captcha; + +import act.app.App; +import act.app.AppServiceBase; +import act.controller.captcha.render.CaptchaImageRender; +import act.util.Stateless; +import org.osgl.$; + +import java.util.ArrayList; +import java.util.List; + +@Stateless +public class CaptchaPluginManager extends AppServiceBase { + + private List generators = new ArrayList<>(); + private List imageRender = new ArrayList<>(); + + public CaptchaPluginManager(App app) { + super(app); + } + + public void registerGenerator(CaptchaSessionGenerator generator) { + generators.add(generator); + } + + public void registerImageGenerator(CaptchaImageRender generator) { + imageRender.add(generator); + } + + @Override + protected void releaseResources() { + generators.clear(); + } + + public CaptchaSessionGenerator randomGenerator() { + return $.random(generators); + } + + public CaptchaImageRender randomImageRender() { + return $.random(imageRender); + } + +} diff --git a/src/main/java/act/controller/captcha/CaptchaService.java b/src/main/java/act/controller/captcha/CaptchaService.java new file mode 100644 index 000000000..102f64c69 --- /dev/null +++ b/src/main/java/act/controller/captcha/CaptchaService.java @@ -0,0 +1,61 @@ +package act.controller.captcha; + +import act.app.ActionContext; +import act.controller.Controller; +import act.controller.annotation.UrlContext; +import act.controller.captcha.render.CaptchaImageRender; +import act.crypto.AppCrypto; +import act.handler.NonBlock; +import act.util.JsonView; +import act.util.SubClassFinder; +import org.osgl.Lang; +import org.osgl.http.H; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.Img; +import org.osgl.util.Output; + +import javax.inject.Inject; + +@UrlContext("captcha") +public class CaptchaService extends Controller.Util { + + @Inject + private AppCrypto crypto; + + @Inject + private CaptchaPluginManager pluginManager; + + @SubClassFinder + public void foundSessionGenerator(CaptchaSessionGenerator generator) { + pluginManager.registerGenerator(generator); + } + + @SubClassFinder + public void foundImageRender(CaptchaImageRender render) { + pluginManager.registerImageGenerator(render); + } + + @GetAction() + @NonBlock + @JsonView + public CaptchaSession randomSession(ActionContext context) { + return pluginManager.randomGenerator().generate(); + } + + @GetAction("{encrypted}") + public void renderMedia(String encrypted) { + try { + final String text = crypto.decrypt(encrypted); + renderBinary(new Lang.Visitor() { + @Override + public void visit(Output output) throws Lang.Break { + CaptchaImageRender imageRender = pluginManager.randomImageRender(); + Img.source(imageRender.render(text)).writeTo(Output.Adaptors.asOutputStream(output), H.Format.JPG.contentType()); + } + }); + } catch (Exception e) { + throw notFound(); + } + } + +} diff --git a/src/main/java/act/controller/captcha/CaptchaSession.java b/src/main/java/act/controller/captcha/CaptchaSession.java new file mode 100644 index 000000000..e9dc965c2 --- /dev/null +++ b/src/main/java/act/controller/captcha/CaptchaSession.java @@ -0,0 +1,80 @@ +package act.controller.captcha; + +import act.Act; +import act.act_messages; +import act.i18n.I18n; +import org.osgl.util.S; + +import java.io.Serializable; +import java.util.Set; + +/** + * A `CaptchaSession` is composed of a text (used to generate media) + * , a corresponding answer and a media URL + */ +public class CaptchaSession implements Serializable { + + private static final long serialVersionUID = 3648122710489336079L; + + private String caption; + private String text; + private String answer; + private String mediaUrl; + private String instruction; + private Set options; + + + /** + * Construct a CAPTCHA session with text, an answer and a media URL. + * + * @param text the text literal + * @param answer + * the answer, optional. When omitted then the answer should be + * the text. + * @param mediaUrl + * the media URL. When omitted, then the URL is /~/captcha/{encrypted-text}. + * @param instruction + * the instruction to guide how end user should treat the CAPTCHA. + * @param options + * the optional a set of option from which the answer could be selected. + */ + public CaptchaSession(String text, String answer, String mediaUrl, String instruction, Set options) { + this.caption = I18n.i18n(act_messages.class, "act.captcha.caption"); + this.text = S.requireNotBlank(text); + this.answer = answer; + this.mediaUrl = ensureMediaUrl(mediaUrl, text); + this.instruction = S.requireNotBlank(instruction); + this.options = options; + } + + public String getCaption() { + return caption; + } + + /** + * Returns an encrypted token combined with answer. + */ + public String getToken() { + return Act.app().crypto().generateToken(answer); + } + + public String getMediaUrl() { + return mediaUrl; + } + + public String getInstruction() { + return instruction; + } + + public Set getOptions() { + return options; + } + + private String ensureMediaUrl(String url, String text) { + if (S.isBlank(url)) { + String encrypted = Act.crypto().encrypt(text); + return "/~/captcha/" + encrypted; + } + return url; + } +} diff --git a/src/main/java/act/controller/captcha/CaptchaSessionGenerator.java b/src/main/java/act/controller/captcha/CaptchaSessionGenerator.java new file mode 100644 index 000000000..7d24c2cd8 --- /dev/null +++ b/src/main/java/act/controller/captcha/CaptchaSessionGenerator.java @@ -0,0 +1,11 @@ +package act.controller.captcha; + +public interface CaptchaSessionGenerator { + + /** + * Generate a random {@link CaptchaSession} + * @return the CAPTCHA session generated + */ + CaptchaSession generate(); + +} diff --git a/src/main/java/act/controller/captcha/CaptchaViolation.java b/src/main/java/act/controller/captcha/CaptchaViolation.java new file mode 100644 index 000000000..8fe395fe1 --- /dev/null +++ b/src/main/java/act/controller/captcha/CaptchaViolation.java @@ -0,0 +1,62 @@ +package act.controller.captcha; + +import javax.validation.ConstraintViolation; +import javax.validation.Path; +import javax.validation.metadata.ConstraintDescriptor; + +public class CaptchaViolation implements ConstraintViolation { + @Override + public String getMessage() { + return "CAPTCHA protection failed"; + } + + @Override + public String getMessageTemplate() { + return "captcha.fail"; + } + + @Override + public Object getRootBean() { + return null; + } + + @Override + public Class getRootBeanClass() { + return null; + } + + @Override + public Object getLeafBean() { + return null; + } + + @Override + public Object[] getExecutableParameters() { + return new Object[0]; + } + + @Override + public Object getExecutableReturnValue() { + return null; + } + + @Override + public Path getPropertyPath() { + return null; + } + + @Override + public Object getInvalidValue() { + return null; + } + + @Override + public ConstraintDescriptor getConstraintDescriptor() { + return null; + } + + @Override + public Object unwrap(Class type) { + return null; + } +} diff --git a/src/main/java/act/controller/captcha/MediaGenerator.java b/src/main/java/act/controller/captcha/MediaGenerator.java new file mode 100644 index 000000000..bfd09e616 --- /dev/null +++ b/src/main/java/act/controller/captcha/MediaGenerator.java @@ -0,0 +1,8 @@ +package act.controller.captcha; + +/** + * Generate media stream for a CAPTCHA token + */ +public interface MediaGenerator { + void generate(String token); +} diff --git a/src/main/java/act/controller/captcha/RequireCaptcha.java b/src/main/java/act/controller/captcha/RequireCaptcha.java new file mode 100644 index 000000000..cc2745267 --- /dev/null +++ b/src/main/java/act/controller/captcha/RequireCaptcha.java @@ -0,0 +1,38 @@ +package act.controller.captcha; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Mark an request handler method as CAPTCHA protection is required. + * + * This annotation should be added to only POST/PUT request handler. + * Adding this annotation to GET request handler method will not effect. + */ +@Retention(RetentionPolicy.CLASS) +@Target(ElementType.METHOD) +public @interface RequireCaptcha { + +} diff --git a/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java b/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java new file mode 100644 index 000000000..6ba4585bd --- /dev/null +++ b/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java @@ -0,0 +1,89 @@ +package act.controller.captcha.generator; + +import act.act_messages; +import act.controller.captcha.CaptchaSession; +import act.controller.captcha.CaptchaSessionGenerator; +import act.i18n.I18n; +import org.osgl.$; +import org.osgl.util.N; +import org.osgl.util.S; + +/** + * Generate {@link act.controller.captcha.CaptchaSession} with + * a random arithmetic expression. + */ +public class ArithmeticGenerator implements CaptchaSessionGenerator { + + private enum Operator { + ADD() { + @Override + int apply(int left, int right) { + return left + right; + } + + @Override + public String toString() { + return "+"; + } + }, + SUBSTRACT() { + @Override + int apply(int left, int right) { + return left - right; + } + + @Override + public String toString() { + return "-"; + } + }, + TIMES() { + @Override + int apply(int left, int right) { + return left * right; + } + + @Override + public String toString() { + return "x"; + } + }; + + abstract int apply(int left, int right); + + public abstract String toString(); + } + + // a simple ternary arithmetic expression + private static class ArithmeticExpression { + int first = N.randInt(10); + Operator o1 = $.random(Operator.class); + int second = N.randInt(10); + Operator o2 = $.random(Operator.class); + int third = N.randInt(10); + + int evaluate() { + if (o2 == Operator.TIMES) { + return o1.apply(first, o2.apply(second, third)); + } else { + return o2.apply(o1.apply(first, second), third); + } + } + + @Override + public String toString() { + return S.concat(first, o1, second, o2, third); + } + } + + @Override + public CaptchaSession generate() { + ArithmeticExpression expression = new ArithmeticExpression(); + return new CaptchaSession( + expression.toString(), S.string(expression.evaluate()), null, + I18n.i18n(act_messages.class, "act.captcha.generator.arithmetic.instruction"), + null + ); + } + +} diff --git a/src/main/java/act/controller/captcha/generator/RandomTextGenerator.java b/src/main/java/act/controller/captcha/generator/RandomTextGenerator.java new file mode 100644 index 000000000..bc73e1d4e --- /dev/null +++ b/src/main/java/act/controller/captcha/generator/RandomTextGenerator.java @@ -0,0 +1,51 @@ +package act.controller.captcha.generator; + +import act.act_messages; +import act.controller.captcha.CaptchaSession; +import act.controller.captcha.CaptchaSessionGenerator; +import act.i18n.I18n; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +/** + * Generate {@link CaptchaSession} with a string consists of 6 random alphabetic characters. + */ +public class RandomTextGenerator implements CaptchaSessionGenerator { + + @Override + public CaptchaSession generate() { + return new CaptchaSession( + randomString(), null, null, + I18n.i18n(act_messages.class, "act.captcha.generator.random_text.instruction"), + null); + } + + private static char[] SPACE_ = { + '0', '1', '2', '3', '4', + '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v', 'w', 'x', 'y', 'z', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', + 'U', 'V', 'W', 'X', 'Y', 'Z' + }; + + public static final String SPACE = new String(SPACE_); + + private static final int SPACE_SIZE = SPACE_.length; + + private String randomString() { + int len = 6; + char[] chars = SPACE_; + int charsLen = SPACE_SIZE; + Random r = ThreadLocalRandom.current(); + StringBuilder sb = new StringBuilder(len); + while (len-- > 0) { + int i = r.nextInt(charsLen); + sb.append(chars[i]); + } + return sb.toString(); + } +} diff --git a/src/main/java/act/controller/captcha/render/BackgroundGenerator.java b/src/main/java/act/controller/captcha/render/BackgroundGenerator.java new file mode 100644 index 000000000..899094954 --- /dev/null +++ b/src/main/java/act/controller/captcha/render/BackgroundGenerator.java @@ -0,0 +1,31 @@ +package act.controller.captcha.render; + +import act.conf.AppConfig; +import org.osgl.$; +import org.osgl.util.Img; + +import java.awt.*; +import java.awt.image.BufferedImage; +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class BackgroundGenerator extends $.Producer { + + private int w; + private int h; + private Color bgColor; + + @Inject + public BackgroundGenerator(AppConfig config) { + w = config.captchaWidth(); + h = config.captchaHeight(); + bgColor = config.captchaBgColor(); + } + + @Override + public BufferedImage produce() { + return Img.F.background(w, h, bgColor).produce(); + } + +} diff --git a/src/main/java/act/controller/captcha/render/CaptchaImageRender.java b/src/main/java/act/controller/captcha/render/CaptchaImageRender.java new file mode 100644 index 000000000..926ab37af --- /dev/null +++ b/src/main/java/act/controller/captcha/render/CaptchaImageRender.java @@ -0,0 +1,7 @@ +package act.controller.captcha.render; + +import java.awt.image.BufferedImage; + +public interface CaptchaImageRender { + BufferedImage render(String text); +} diff --git a/src/main/java/act/controller/captcha/render/DefaultImageRender.java b/src/main/java/act/controller/captcha/render/DefaultImageRender.java new file mode 100644 index 000000000..c9338d6fd --- /dev/null +++ b/src/main/java/act/controller/captcha/render/DefaultImageRender.java @@ -0,0 +1,34 @@ +package act.controller.captcha.render; + +import act.controller.captcha.render.img.*; +import org.osgl.$; +import org.osgl.util.Img; + +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.List; +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class DefaultImageRender implements CaptchaImageRender { + + private List filters = new ArrayList<>(); + + @Inject + private BackgroundGenerator backgroundGenerator; + + public DefaultImageRender() { + filters.add(new CurvesFilter()); + filters.add(new DoubleRippleFilter()); + filters.add(new RippleFilter()); + filters.add(new WobbleFilter()); + filters.add(new MarbleFilter()); + } + + @Override + public BufferedImage render(String text) { + List processors = $.randomSubList(filters); + return Img.source(backgroundGenerator).text(text).pipeline(processors).get(); + } +} diff --git a/src/main/java/act/controller/captcha/render/FontProvider.java b/src/main/java/act/controller/captcha/render/FontProvider.java new file mode 100644 index 000000000..6636f946c --- /dev/null +++ b/src/main/java/act/controller/captcha/render/FontProvider.java @@ -0,0 +1,57 @@ +package act.controller.captcha.render; + +import act.controller.captcha.generator.RandomTextGenerator; +import org.osgl.$; +import org.osgl.Lang; +import org.osgl.exception.NotAppliedException; +import org.osgl.util.C; + +import java.awt.*; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import javax.inject.Singleton; + +@Singleton +public class FontProvider extends $.F1 { + + private static final int MIN_SIZE = 28; + private static final int MAX_SIZE = 36; + + private C.List families = C.newList(); + + public FontProvider() { + String[] fontNames = GraphicsEnvironment + .getLocalGraphicsEnvironment() + .getAvailableFontFamilyNames(); + for (String name : fontNames) { + if (goodToUse(name)) { + families.add(name); + } + } + } + + @Override + public Font apply(String text) throws NotAppliedException, Lang.Break { + Random r = ThreadLocalRandom.current(); + int style = randomStyle(r); + String fontName = $.random(families); + int size = MIN_SIZE + r.nextInt(MAX_SIZE - MIN_SIZE); + return new Font(fontName, style, size); + } + + private int randomStyle(Random r) { + int style = Font.PLAIN; + if (r.nextBoolean()) { + style = Font.BOLD; + } + if (r.nextBoolean()) { + style |= Font.ITALIC; + } + return style; + } + + private boolean goodToUse(String fontFamily) { + Font font = new Font(fontFamily, Font.PLAIN, 10); + return -1 == font.canDisplayUpTo(RandomTextGenerator.SPACE); + } +} diff --git a/src/main/java/act/controller/captcha/render/img/CurvesFilter.java b/src/main/java/act/controller/captcha/render/img/CurvesFilter.java new file mode 100644 index 000000000..b4382b4c4 --- /dev/null +++ b/src/main/java/act/controller/captcha/render/img/CurvesFilter.java @@ -0,0 +1,15 @@ +package act.controller.captcha.render.img; + +import com.github.bingoohuang.patchca.filter.library.CurvesImageOp; +import org.osgl.util.Img; + +import java.awt.image.BufferedImage; + +public class CurvesFilter extends Img.Filter { + @Override + protected BufferedImage run() { + CurvesImageOp op = new CurvesImageOp(); + target = op.filter(target, null); + return target; + } +} diff --git a/src/main/java/act/controller/captcha/render/img/DoubleRippleFilter.java b/src/main/java/act/controller/captcha/render/img/DoubleRippleFilter.java new file mode 100644 index 000000000..928990535 --- /dev/null +++ b/src/main/java/act/controller/captcha/render/img/DoubleRippleFilter.java @@ -0,0 +1,15 @@ +package act.controller.captcha.render.img; + +import com.github.bingoohuang.patchca.filter.library.DoubleRippleImageOp; +import org.osgl.util.Img; + +import java.awt.image.BufferedImage; + +public class DoubleRippleFilter extends Img.Filter { + @Override + protected BufferedImage run() { + DoubleRippleImageOp op = new DoubleRippleImageOp(); + target = op.filter(target, null); + return target; + } +} diff --git a/src/main/java/act/controller/captcha/render/img/MarbleFilter.java b/src/main/java/act/controller/captcha/render/img/MarbleFilter.java new file mode 100644 index 000000000..f559da9ce --- /dev/null +++ b/src/main/java/act/controller/captcha/render/img/MarbleFilter.java @@ -0,0 +1,15 @@ +package act.controller.captcha.render.img; + +import com.github.bingoohuang.patchca.filter.library.MarbleImageOp; +import org.osgl.util.Img; + +import java.awt.image.BufferedImage; + +public class MarbleFilter extends Img.Filter { + @Override + protected BufferedImage run() { + MarbleImageOp op = new MarbleImageOp(); + target = op.filter(target, null); + return target; + } +} diff --git a/src/main/java/act/controller/captcha/render/img/RippleFilter.java b/src/main/java/act/controller/captcha/render/img/RippleFilter.java new file mode 100644 index 000000000..549cb8f06 --- /dev/null +++ b/src/main/java/act/controller/captcha/render/img/RippleFilter.java @@ -0,0 +1,15 @@ +package act.controller.captcha.render.img; + +import com.github.bingoohuang.patchca.filter.library.RippleImageOp; +import org.osgl.util.Img; + +import java.awt.image.BufferedImage; + +public class RippleFilter extends Img.Filter { + @Override + protected BufferedImage run() { + RippleImageOp op = new RippleImageOp(); + target = op.filter(target, null); + return target; + } +} diff --git a/src/main/java/act/controller/captcha/render/img/WobbleFilter.java b/src/main/java/act/controller/captcha/render/img/WobbleFilter.java new file mode 100644 index 000000000..abbc6f32b --- /dev/null +++ b/src/main/java/act/controller/captcha/render/img/WobbleFilter.java @@ -0,0 +1,15 @@ +package act.controller.captcha.render.img; + +import com.github.bingoohuang.patchca.filter.library.WobbleImageOp; +import org.osgl.util.Img; + +import java.awt.image.BufferedImage; + +public class WobbleFilter extends Img.Filter { + @Override + protected BufferedImage run() { + WobbleImageOp op = new WobbleImageOp(); + target = op.filter(target, null); + return target; + } +} diff --git a/src/main/java/act/crypto/AppCrypto.java b/src/main/java/act/crypto/AppCrypto.java index 78291786b..097c09cdd 100644 --- a/src/main/java/act/crypto/AppCrypto.java +++ b/src/main/java/act/crypto/AppCrypto.java @@ -21,6 +21,7 @@ */ import act.conf.AppConfig; +import act.util.Stateless; import org.mindrot.jbcrypt.BCrypt; import org.osgl.exception.UnexpectedException; import org.osgl.logging.LogManager; @@ -33,6 +34,7 @@ import java.security.MessageDigest; import java.security.SecureRandom; +@Stateless public class AppCrypto { protected static final Logger LOGGER = LogManager.get(AppCrypto.class); diff --git a/src/main/java/act/data/JodaDateTimeCodecBase.java b/src/main/java/act/data/JodaDateTimeCodecBase.java index d9ed42027..731ecf7ba 100644 --- a/src/main/java/act/data/JodaDateTimeCodecBase.java +++ b/src/main/java/act/data/JodaDateTimeCodecBase.java @@ -99,7 +99,7 @@ public final StringValueResolver amended(AnnotationAware beanSpec) { if (null != dfp) { return create(dfp.value()); } - String format = null; + String format; DateFormatPattern pattern = beanSpec.getAnnotation(DateFormatPattern.class); if (null == pattern) { Pattern patternLegacy = beanSpec.getAnnotation(Pattern.class); diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 06f1bdca4..bd0b1fba5 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -34,6 +34,7 @@ import act.controller.annotation.HandleMissingAuthentication; import act.controller.annotation.Throttled; import act.controller.builtin.ThrottleFilter; +import act.controller.captcha.RequireCaptcha; import act.controller.meta.*; import act.data.annotation.DateFormatPattern; import act.data.annotation.Pattern; @@ -125,6 +126,7 @@ public void visit(H.Format format) throws $.Break { private String csp; private boolean disableCsp; private boolean isStatic; + private boolean requireCaptcha; private Object singleton; private H.Format forceResponseContentType; private H.Status forceResponseStatus; @@ -188,6 +190,10 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { method.setAccessible(true); } + if (method.isAnnotationPresent(RequireCaptcha.class)) { + this.requireCaptcha = true; + } + Throttled throttleControl = method.getAnnotation(Throttled.class); if (null != throttleControl) { int throttle = throttleControl.value(); @@ -214,13 +220,13 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { features = featureAnno.value(); } - DateFormatPattern dfp = method.getAnnotation(DateFormatPattern.class); - if (null != dfp) { - this.dateFormatPattern = dfp.value(); + DateFormatPattern pattern = method.getAnnotation(DateFormatPattern.class); + if (null != pattern) { + this.dateFormatPattern = pattern.value(); } else { - Pattern pattern = method.getAnnotation(Pattern.class); - if (null != pattern) { - this.dateFormatPattern = pattern.value(); + Pattern patternLegacy = method.getAnnotation(Pattern.class); + if (null != patternLegacy) { + this.dateFormatPattern = patternLegacy.value(); } } if (null != this.dateFormatPattern) { @@ -389,6 +395,10 @@ public Result handle(final ActionContext context) { return result; } + if (requireCaptcha) { + context.markAsRequireCaptcha(); + } + context.setReflectedHandlerInvoker(this); app.eventBus().emit(new ReflectedHandlerInvokerInvoke(this, context)); @@ -451,6 +461,8 @@ public Result handle(final ActionContext context) { final Object[] params = params(controller, context); + context.ensureCaptcha(); + if (failOnViolation && context.hasViolation()) { String msg = context.violationMessage(";"); return ActBadRequest.create(msg); diff --git a/src/main/java/act/httpclient/HttpClientService.java b/src/main/java/act/httpclient/HttpClientService.java new file mode 100644 index 000000000..26d89db0d --- /dev/null +++ b/src/main/java/act/httpclient/HttpClientService.java @@ -0,0 +1,64 @@ +package act.httpclient; + +import act.app.ActionContext; +import act.app.App; +import act.app.AppServiceBase; +import act.conf.AppConfig; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.osgl.util.S; + +import java.io.IOException; + +/** + * Manages HTTP Client. + * + * Note this class is subject to future change. Application shall not + * use this class or any facility provided by this class directly. + */ +public class HttpClientService extends AppServiceBase { + + private OkHttpClient http; + private AppConfig config; + private String reCaptchaSercret; + + public HttpClientService(App app) { + super(app); + config = app.config(); + reCaptchaSercret = config.reCaptchaSecret(); + initHttp(); + } + + @Override + protected void releaseResources() { + } + + public boolean verifyReCaptchaResponse(ActionContext ctx) { + if (S.blank(reCaptchaSercret)) { + return false; + } + String url = "https://www.google.com/recaptcha/api/siteverify?secret=" + + reCaptchaSercret + "&response=" + + ctx.paramVal("g-recaptcha-response"); + Request req = new Request.Builder().url(url).get().build(); + try { + Response response = sendRequest(req); + JSONObject json = JSON.parseObject(response.body().string()); + return json.getBoolean("success"); + } catch (IOException e) { + warn(e, "Error sending response"); + return false; + } + } + + private Response sendRequest(Request req) throws IOException { + return http.newCall(req).execute(); + } + + private void initHttp() { + http = new OkHttpClient.Builder().build(); + } +} diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 85d118842..02b8c4c99 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -4,6 +4,7 @@ act.app.SingletonFinder act.app.util.SimpleRestfulServiceBase act.app.conf.AppConfigPlugin act.controller.builtin.CliOverHttp +act.controller.captcha.CaptchaService act.db.DbBind act.handler.builtin.controller.RequestHandlerProxy act.i18n.TimeZoneResolver diff --git a/src/main/resources/act/act_messages.properties b/src/main/resources/act/act_messages.properties index 0c7d0213d..1db0b6f50 100644 --- a/src/main/resources/act/act_messages.properties +++ b/src/main/resources/act/act_messages.properties @@ -22,3 +22,8 @@ cli.shutdown=About to shutdown app. Your CLI session will be terminated. {act.validation.constraints.NotBlank.message}=must not be blank string act.progress.report=current progress: {0}% +act.progress.capFirst=Progress + +act.captcha.caption=Prove you are not a robot +act.captcha.generator.arithmetic.instruction=Please write down the result of the arithmetic expression +act.captcha.generator.random_text.instruction=Please type the code shown \ No newline at end of file diff --git a/src/main/resources/act/act_messages_zh.properties b/src/main/resources/act/act_messages_zh.properties index 12a7f1bba..e9ed479b0 100644 --- a/src/main/resources/act/act_messages_zh.properties +++ b/src/main/resources/act/act_messages_zh.properties @@ -21,3 +21,7 @@ e404.desc=\u7A0B\u5E8F\u629B\u51FA404\u9519\u8BEF: act.progress.report=\u5F53\u524D\u8FDB\u5EA6\uFF1A{0}% act.progress.capFirst=\u8FDB\u5EA6 + +act.captcha.caption=\u9A8C\u8BC1\u4F60\u4E0D\u662F\u4E00\u6BB5\u4EE3\u7801 +act.captcha.generator.arithmetic.instruction=\u8BF7\u8F93\u5165\u56FE\u7247\u4E2D\u7B97\u5F0F\u7684\u8BA1\u7B97\u7ED3\u679C +act.captcha.generator.random_text.instruction=\u8BF7\u8F93\u5165\u56FE\u7247\u4E2D\u7684\u5B57\u7B26 \ No newline at end of file diff --git a/src/main/resources/act/act_messages_zh_HK.properties b/src/main/resources/act/act_messages_zh_HK.properties index a89d2a495..3c02525b4 100644 --- a/src/main/resources/act/act_messages_zh_HK.properties +++ b/src/main/resources/act/act_messages_zh_HK.properties @@ -21,3 +21,7 @@ e404.desc=\u7A0B\u5E8F\u62CB\u51FA404\u932F\u8AA4: act.progress.report=\u76EE\u524D\u9032\u5EA6\uFF1A{0}% act.progress.capFirst=\u9032\u5EA6 + +act.captcha.caption=\u9A8C\u8BC1\u4F60\u4E0D\u662F\u4E00\u6BB5\u4EE3\u7801 +act.captcha.generator.arithmetic.instruction=\u8BF7\u8F93\u5165\u56FE\u7247\u4E2D\u7B97\u5F0F\u7684\u8BA1\u7B97\u7ED3\u679C +act.captcha.generator.random_text.instruction=\u8BF7\u8F93\u5165\u56FE\u7247\u4E2D\u7684\u5B57\u7B26 \ No newline at end of file diff --git a/src/main/resources/act/act_messages_zh_TW.properties b/src/main/resources/act/act_messages_zh_TW.properties index b49ded288..73bf53b4f 100644 --- a/src/main/resources/act/act_messages_zh_TW.properties +++ b/src/main/resources/act/act_messages_zh_TW.properties @@ -21,3 +21,7 @@ e404.desc=\u7A0B\u5F0F\u62CB\u51FA404\u932F\u8AA4: act.progress.report=\u4F5C\u696D\u9032\u5EA6\uFF1A{0}% act.progress.capFirst=\u9032\u5EA6 + +act.captcha.caption=\u9A8C\u8BC1\u4F60\u4E0D\u662F\u4E00\u6BB5\u4EE3\u7801 +act.captcha.generator.arithmetic.instruction=\u8BF7\u8F93\u5165\u56FE\u7247\u4E2D\u7B97\u5F0F\u7684\u8BA1\u7B97\u7ED3\u679C +act.captcha.generator.random_text.instruction=\u8BF7\u8F93\u5165\u56FE\u7247\u4E2D\u7684\u5B57\u7B26 \ No newline at end of file From bd1f66b11c6c8309eff826afd9929369a890e0a8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 25 Jun 2018 06:57:15 +1000 Subject: [PATCH 003/730] CAPTCHA support - wip --- .../captcha/CaptchaPluginManager.java | 20 +++++++++++++++++++ .../controller/captcha/CaptchaService.java | 20 +++++++++++++++++++ .../controller/captcha/CaptchaSession.java | 20 +++++++++++++++++++ .../captcha/CaptchaSessionGenerator.java | 20 +++++++++++++++++++ .../controller/captcha/CaptchaViolation.java | 20 +++++++++++++++++++ .../controller/captcha/MediaGenerator.java | 20 +++++++++++++++++++ .../generator/ArithmeticGenerator.java | 20 +++++++++++++++++++ .../generator/RandomTextGenerator.java | 20 +++++++++++++++++++ .../captcha/render/BackgroundGenerator.java | 20 +++++++++++++++++++ .../captcha/render/CaptchaImageRender.java | 20 +++++++++++++++++++ .../captcha/render/DefaultImageRender.java | 20 +++++++++++++++++++ .../captcha/render/FontProvider.java | 20 +++++++++++++++++++ .../captcha/render/img/CurvesFilter.java | 20 +++++++++++++++++++ .../render/img/DoubleRippleFilter.java | 20 +++++++++++++++++++ .../captcha/render/img/MarbleFilter.java | 20 +++++++++++++++++++ .../captcha/render/img/RippleFilter.java | 20 +++++++++++++++++++ .../captcha/render/img/WobbleFilter.java | 20 +++++++++++++++++++ .../impl/ReflectedHandlerInvoker.java | 2 +- .../act/httpclient/HttpClientService.java | 20 +++++++++++++++++++ 19 files changed, 361 insertions(+), 1 deletion(-) diff --git a/src/main/java/act/controller/captcha/CaptchaPluginManager.java b/src/main/java/act/controller/captcha/CaptchaPluginManager.java index 95aab0796..2d15144ed 100644 --- a/src/main/java/act/controller/captcha/CaptchaPluginManager.java +++ b/src/main/java/act/controller/captcha/CaptchaPluginManager.java @@ -1,5 +1,25 @@ package act.controller.captcha; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.app.App; import act.app.AppServiceBase; import act.controller.captcha.render.CaptchaImageRender; diff --git a/src/main/java/act/controller/captcha/CaptchaService.java b/src/main/java/act/controller/captcha/CaptchaService.java index 102f64c69..ceb6de811 100644 --- a/src/main/java/act/controller/captcha/CaptchaService.java +++ b/src/main/java/act/controller/captcha/CaptchaService.java @@ -1,5 +1,25 @@ package act.controller.captcha; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.app.ActionContext; import act.controller.Controller; import act.controller.annotation.UrlContext; diff --git a/src/main/java/act/controller/captcha/CaptchaSession.java b/src/main/java/act/controller/captcha/CaptchaSession.java index e9dc965c2..cde5a17f1 100644 --- a/src/main/java/act/controller/captcha/CaptchaSession.java +++ b/src/main/java/act/controller/captcha/CaptchaSession.java @@ -1,5 +1,25 @@ package act.controller.captcha; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.Act; import act.act_messages; import act.i18n.I18n; diff --git a/src/main/java/act/controller/captcha/CaptchaSessionGenerator.java b/src/main/java/act/controller/captcha/CaptchaSessionGenerator.java index 7d24c2cd8..8a9e95de0 100644 --- a/src/main/java/act/controller/captcha/CaptchaSessionGenerator.java +++ b/src/main/java/act/controller/captcha/CaptchaSessionGenerator.java @@ -1,5 +1,25 @@ package act.controller.captcha; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + public interface CaptchaSessionGenerator { /** diff --git a/src/main/java/act/controller/captcha/CaptchaViolation.java b/src/main/java/act/controller/captcha/CaptchaViolation.java index 8fe395fe1..213f62c1b 100644 --- a/src/main/java/act/controller/captcha/CaptchaViolation.java +++ b/src/main/java/act/controller/captcha/CaptchaViolation.java @@ -1,5 +1,25 @@ package act.controller.captcha; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import javax.validation.ConstraintViolation; import javax.validation.Path; import javax.validation.metadata.ConstraintDescriptor; diff --git a/src/main/java/act/controller/captcha/MediaGenerator.java b/src/main/java/act/controller/captcha/MediaGenerator.java index bfd09e616..4c390e284 100644 --- a/src/main/java/act/controller/captcha/MediaGenerator.java +++ b/src/main/java/act/controller/captcha/MediaGenerator.java @@ -1,5 +1,25 @@ package act.controller.captcha; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + /** * Generate media stream for a CAPTCHA token */ diff --git a/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java b/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java index 6ba4585bd..0676e15df 100644 --- a/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java +++ b/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java @@ -1,5 +1,25 @@ package act.controller.captcha.generator; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.act_messages; import act.controller.captcha.CaptchaSession; import act.controller.captcha.CaptchaSessionGenerator; diff --git a/src/main/java/act/controller/captcha/generator/RandomTextGenerator.java b/src/main/java/act/controller/captcha/generator/RandomTextGenerator.java index bc73e1d4e..13ea9bd6f 100644 --- a/src/main/java/act/controller/captcha/generator/RandomTextGenerator.java +++ b/src/main/java/act/controller/captcha/generator/RandomTextGenerator.java @@ -1,5 +1,25 @@ package act.controller.captcha.generator; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.act_messages; import act.controller.captcha.CaptchaSession; import act.controller.captcha.CaptchaSessionGenerator; diff --git a/src/main/java/act/controller/captcha/render/BackgroundGenerator.java b/src/main/java/act/controller/captcha/render/BackgroundGenerator.java index 899094954..0dbda13b1 100644 --- a/src/main/java/act/controller/captcha/render/BackgroundGenerator.java +++ b/src/main/java/act/controller/captcha/render/BackgroundGenerator.java @@ -1,5 +1,25 @@ package act.controller.captcha.render; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.conf.AppConfig; import org.osgl.$; import org.osgl.util.Img; diff --git a/src/main/java/act/controller/captcha/render/CaptchaImageRender.java b/src/main/java/act/controller/captcha/render/CaptchaImageRender.java index 926ab37af..e1144f861 100644 --- a/src/main/java/act/controller/captcha/render/CaptchaImageRender.java +++ b/src/main/java/act/controller/captcha/render/CaptchaImageRender.java @@ -1,5 +1,25 @@ package act.controller.captcha.render; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import java.awt.image.BufferedImage; public interface CaptchaImageRender { diff --git a/src/main/java/act/controller/captcha/render/DefaultImageRender.java b/src/main/java/act/controller/captcha/render/DefaultImageRender.java index c9338d6fd..d1c3c30d6 100644 --- a/src/main/java/act/controller/captcha/render/DefaultImageRender.java +++ b/src/main/java/act/controller/captcha/render/DefaultImageRender.java @@ -1,5 +1,25 @@ package act.controller.captcha.render; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.controller.captcha.render.img.*; import org.osgl.$; import org.osgl.util.Img; diff --git a/src/main/java/act/controller/captcha/render/FontProvider.java b/src/main/java/act/controller/captcha/render/FontProvider.java index 6636f946c..91a39e2a2 100644 --- a/src/main/java/act/controller/captcha/render/FontProvider.java +++ b/src/main/java/act/controller/captcha/render/FontProvider.java @@ -1,5 +1,25 @@ package act.controller.captcha.render; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.controller.captcha.generator.RandomTextGenerator; import org.osgl.$; import org.osgl.Lang; diff --git a/src/main/java/act/controller/captcha/render/img/CurvesFilter.java b/src/main/java/act/controller/captcha/render/img/CurvesFilter.java index b4382b4c4..4ea458d81 100644 --- a/src/main/java/act/controller/captcha/render/img/CurvesFilter.java +++ b/src/main/java/act/controller/captcha/render/img/CurvesFilter.java @@ -1,5 +1,25 @@ package act.controller.captcha.render.img; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import com.github.bingoohuang.patchca.filter.library.CurvesImageOp; import org.osgl.util.Img; diff --git a/src/main/java/act/controller/captcha/render/img/DoubleRippleFilter.java b/src/main/java/act/controller/captcha/render/img/DoubleRippleFilter.java index 928990535..95cad0001 100644 --- a/src/main/java/act/controller/captcha/render/img/DoubleRippleFilter.java +++ b/src/main/java/act/controller/captcha/render/img/DoubleRippleFilter.java @@ -1,5 +1,25 @@ package act.controller.captcha.render.img; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import com.github.bingoohuang.patchca.filter.library.DoubleRippleImageOp; import org.osgl.util.Img; diff --git a/src/main/java/act/controller/captcha/render/img/MarbleFilter.java b/src/main/java/act/controller/captcha/render/img/MarbleFilter.java index f559da9ce..f53016e39 100644 --- a/src/main/java/act/controller/captcha/render/img/MarbleFilter.java +++ b/src/main/java/act/controller/captcha/render/img/MarbleFilter.java @@ -1,5 +1,25 @@ package act.controller.captcha.render.img; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import com.github.bingoohuang.patchca.filter.library.MarbleImageOp; import org.osgl.util.Img; diff --git a/src/main/java/act/controller/captcha/render/img/RippleFilter.java b/src/main/java/act/controller/captcha/render/img/RippleFilter.java index 549cb8f06..a4a539418 100644 --- a/src/main/java/act/controller/captcha/render/img/RippleFilter.java +++ b/src/main/java/act/controller/captcha/render/img/RippleFilter.java @@ -1,5 +1,25 @@ package act.controller.captcha.render.img; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import com.github.bingoohuang.patchca.filter.library.RippleImageOp; import org.osgl.util.Img; diff --git a/src/main/java/act/controller/captcha/render/img/WobbleFilter.java b/src/main/java/act/controller/captcha/render/img/WobbleFilter.java index abbc6f32b..fe602494d 100644 --- a/src/main/java/act/controller/captcha/render/img/WobbleFilter.java +++ b/src/main/java/act/controller/captcha/render/img/WobbleFilter.java @@ -1,5 +1,25 @@ package act.controller.captcha.render.img; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import com.github.bingoohuang.patchca.filter.library.WobbleImageOp; import org.osgl.util.Img; diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index bd0b1fba5..7ccea4a69 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -462,7 +462,7 @@ public Result handle(final ActionContext context) { final Object[] params = params(controller, context); context.ensureCaptcha(); - + if (failOnViolation && context.hasViolation()) { String msg = context.violationMessage(";"); return ActBadRequest.create(msg); diff --git a/src/main/java/act/httpclient/HttpClientService.java b/src/main/java/act/httpclient/HttpClientService.java index 26d89db0d..43f87bd6e 100644 --- a/src/main/java/act/httpclient/HttpClientService.java +++ b/src/main/java/act/httpclient/HttpClientService.java @@ -1,5 +1,25 @@ package act.httpclient; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.app.ActionContext; import act.app.App; import act.app.AppServiceBase; From dfa22a6ec575645fbeba846104365a05808349c0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 26 Jun 2018 20:56:22 +1000 Subject: [PATCH 004/730] CAPTCHA support - testing and bug fixing --- pom.xml | 6 ++ src/main/java/act/Act.java | 21 +++++ .../controller/captcha/CaptchaService.java | 16 ++-- .../controller/captcha/CaptchaSession.java | 3 +- .../controller/captcha/RequireCaptcha.java | 2 +- .../generator/ArithmeticGenerator.java | 2 +- .../captcha/render/BackgroundGenerator.java | 2 +- .../captcha/render/DefaultImageRender.java | 49 +++++++++-- src/main/java/act/util/ActError.java | 7 +- .../act/util/ClassFinderByteCodeScanner.java | 36 ++++++-- src/main/java/act/util/ClassFinderData.java | 20 ++++- .../resources/asset/~act/css/act_captcha.css | 10 +++ src/main/resources/asset/~act/img/refresh.png | Bin 0 -> 1906 bytes .../resources/asset/~act/js/act_captcha.js | 78 ++++++++++++++++++ .../endpoint/ghissues/gh692/Gh692Service.java | 28 +++++++ .../endpoint/ghissues/gh692/HelloService.java | 8 ++ .../java/testapp/endpoint/GHIssue692.java | 13 +++ 17 files changed, 270 insertions(+), 31 deletions(-) create mode 100644 src/main/resources/asset/~act/css/act_captcha.css create mode 100644 src/main/resources/asset/~act/img/refresh.png create mode 100644 src/main/resources/asset/~act/js/act_captcha.js create mode 100644 testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java create mode 100644 testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java create mode 100644 testapp/src/test/java/testapp/endpoint/GHIssue692.java diff --git a/pom.xml b/pom.xml index 224cc01da..1c01f93da 100644 --- a/pom.xml +++ b/pom.xml @@ -185,6 +185,12 @@ com.google.zxing javase ${zxing.javase.version} + + + com.github.jai-imageio + jai-imageio-core + + diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 358acf9d6..b79cb48c6 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -61,6 +61,8 @@ import act.xio.Network; import act.xio.NetworkHandler; import act.xio.undertow.UndertowNetwork; +import com.sun.imageio.plugins.gif.GIFImageWriter; +import com.sun.imageio.plugins.gif.GIFImageWriterSpi; import org.joda.time.*; import org.osgl.$; import org.osgl.cache.CacheService; @@ -74,6 +76,9 @@ import osgl.version.Version; import osgl.version.Versioned; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -90,6 +95,10 @@ import java.util.Map; import java.util.jar.Attributes; import java.util.jar.Manifest; +import javax.imageio.IIOImage; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.MemoryCacheImageOutputStream; /** * The Act runtime and facade @@ -1135,4 +1144,16 @@ public Mode apply() throws NotAppliedException, $.Break { // // run `mvn javadoc:javadoc -Prelease -Ddebug=true` to generate options and packages file // com.sun.tools.javadoc.Main.execute(args); // } + + public static void main(String[] args) throws Exception { + BufferedImage trackPixel = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR); + trackPixel.setRGB(0, 0, new Color(0, 0, 0, 0).getRGB()); + GIFImageWriterSpi spi = new GIFImageWriterSpi(); + ImageWriter writer = new GIFImageWriter(spi); + ImageWriteParam params = writer.getDefaultWriteParam(); + IIOImage img = new IIOImage(trackPixel, null, null); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + writer.setOutput(new MemoryCacheImageOutputStream(os)); + writer.write(null, img, params); + } } diff --git a/src/main/java/act/controller/captcha/CaptchaService.java b/src/main/java/act/controller/captcha/CaptchaService.java index ceb6de811..dc4384d29 100644 --- a/src/main/java/act/controller/captcha/CaptchaService.java +++ b/src/main/java/act/controller/captcha/CaptchaService.java @@ -20,7 +20,9 @@ * #L% */ -import act.app.ActionContext; +import static org.osgl.http.H.Format.JPG; +import static org.osgl.http.H.Header.Names.CACHE_CONTROL; + import act.controller.Controller; import act.controller.annotation.UrlContext; import act.controller.captcha.render.CaptchaImageRender; @@ -31,6 +33,7 @@ import org.osgl.Lang; import org.osgl.http.H; import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.result.Result; import org.osgl.util.Img; import org.osgl.util.Output; @@ -58,21 +61,22 @@ public void foundImageRender(CaptchaImageRender render) { @GetAction() @NonBlock @JsonView - public CaptchaSession randomSession(ActionContext context) { + public CaptchaSession randomSession(H.Response resp) { + resp.addHeader(CACHE_CONTROL, "no-store"); return pluginManager.randomGenerator().generate(); } @GetAction("{encrypted}") - public void renderMedia(String encrypted) { + public Result renderMedia(String encrypted) { try { final String text = crypto.decrypt(encrypted); - renderBinary(new Lang.Visitor() { + return renderBinary(new Lang.Visitor() { @Override public void visit(Output output) throws Lang.Break { CaptchaImageRender imageRender = pluginManager.randomImageRender(); - Img.source(imageRender.render(text)).writeTo(Output.Adaptors.asOutputStream(output), H.Format.JPG.contentType()); + Img.source(imageRender.render(text)).writeTo(Output.Adaptors.asOutputStream(output), JPG.contentType()); } - }); + }).contentType(JPG); } catch (Exception e) { throw notFound(); } diff --git a/src/main/java/act/controller/captcha/CaptchaSession.java b/src/main/java/act/controller/captcha/CaptchaSession.java index cde5a17f1..6c922d9de 100644 --- a/src/main/java/act/controller/captcha/CaptchaSession.java +++ b/src/main/java/act/controller/captcha/CaptchaSession.java @@ -75,7 +75,8 @@ public String getCaption() { * Returns an encrypted token combined with answer. */ public String getToken() { - return Act.app().crypto().generateToken(answer); + String id = null == answer ? text : answer; + return Act.app().crypto().generateToken(id); } public String getMediaUrl() { diff --git a/src/main/java/act/controller/captcha/RequireCaptcha.java b/src/main/java/act/controller/captcha/RequireCaptcha.java index cc2745267..2ccc2e62d 100644 --- a/src/main/java/act/controller/captcha/RequireCaptcha.java +++ b/src/main/java/act/controller/captcha/RequireCaptcha.java @@ -31,7 +31,7 @@ * This annotation should be added to only POST/PUT request handler. * Adding this annotation to GET request handler method will not effect. */ -@Retention(RetentionPolicy.CLASS) +@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface RequireCaptcha { diff --git a/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java b/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java index 0676e15df..c5d565a93 100644 --- a/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java +++ b/src/main/java/act/controller/captcha/generator/ArithmeticGenerator.java @@ -92,7 +92,7 @@ int evaluate() { @Override public String toString() { - return S.concat(first, o1, second, o2, third); + return S.concat(first, o1, second, o2, third, " = ?"); } } diff --git a/src/main/java/act/controller/captcha/render/BackgroundGenerator.java b/src/main/java/act/controller/captcha/render/BackgroundGenerator.java index 0dbda13b1..7e0d6397c 100644 --- a/src/main/java/act/controller/captcha/render/BackgroundGenerator.java +++ b/src/main/java/act/controller/captcha/render/BackgroundGenerator.java @@ -45,7 +45,7 @@ public BackgroundGenerator(AppConfig config) { @Override public BufferedImage produce() { - return Img.F.background(w, h, bgColor).produce(); + return Img.source(Img.F.background(w, h, bgColor).get()).get(); } } diff --git a/src/main/java/act/controller/captcha/render/DefaultImageRender.java b/src/main/java/act/controller/captcha/render/DefaultImageRender.java index d1c3c30d6..8b4b269e6 100644 --- a/src/main/java/act/controller/captcha/render/DefaultImageRender.java +++ b/src/main/java/act/controller/captcha/render/DefaultImageRender.java @@ -20,10 +20,14 @@ * #L% */ +import static org.osgl.util.Img.F.randomPixels; +import static org.osgl.util.N.randInt; + import act.controller.captcha.render.img.*; import org.osgl.$; import org.osgl.util.Img; +import java.awt.*; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; @@ -33,22 +37,51 @@ @Singleton public class DefaultImageRender implements CaptchaImageRender { - private List filters = new ArrayList<>(); + private List optionalA = new ArrayList<>(); + private List optionalB = new ArrayList<>(); @Inject private BackgroundGenerator backgroundGenerator; public DefaultImageRender() { - filters.add(new CurvesFilter()); - filters.add(new DoubleRippleFilter()); - filters.add(new RippleFilter()); - filters.add(new WobbleFilter()); - filters.add(new MarbleFilter()); + optionalB.add(new CurvesFilter()); + optionalA.add(new WobbleFilter()); + optionalB.add(new DoubleRippleFilter()); + + optionalA.add(new RippleFilter()); + optionalA.add(new MarbleFilter()); } @Override public BufferedImage render(String text) { - List processors = $.randomSubList(filters); - return Img.source(backgroundGenerator).text(text).pipeline(processors).get(); + List processors = $.random(true, false) ? optionalA : optionalB; + return Img.source(backgroundGenerator) + .text(text) + .color(Img.Random.darkColor()) + .makeNoise() + .setMaxLines(2 + randInt(5)) + .setMaxLineWidth(3) + .pipeline(processors) + .get(); + } + + public static void main(String[] args) { + DefaultImageRender r = new DefaultImageRender(); + Img.source(randomPixels(200, 70, Color.WHITE)) + .text("Hello World") + .color(Img.Random.darkColor()) + .makeNoise() + .setMaxLines(7) + .setMaxLineWidth(3) + .pipeline(r.optionalA) + .writeTo("/tmp/1/x.png"); + Img.source(randomPixels(200, 70, Color.WHITE)) + .text("Hello World") + .color(Img.Random.darkColor()) + .makeNoise() + .setMaxLines(7) + .setMaxLineWidth(3) + .pipeline(r.optionalB) + .writeTo("/tmp/1/y.png"); } } diff --git a/src/main/java/act/util/ActError.java b/src/main/java/act/util/ActError.java index f75b80c13..ef141d371 100644 --- a/src/main/java/act/util/ActError.java +++ b/src/main/java/act/util/ActError.java @@ -83,8 +83,11 @@ public static SourceInfo loadSourceInfo(Throwable cause, Class errorClass) { int len = sa.length; - StackTraceElement[] caller = new StackTraceElement[len - 1]; - System.arraycopy(sa, 1, caller, 0, len - 1); + StackTraceElement[] caller = sa; + if (len > 0) { + caller = new StackTraceElement[len - 1]; + System.arraycopy(sa, 1, caller, 0, len - 1); + } ActContext ctx = ActContext.Base.currentContext(); if (null == ctx) { diff --git a/src/main/java/act/util/ClassFinderByteCodeScanner.java b/src/main/java/act/util/ClassFinderByteCodeScanner.java index c3c309c94..e3bcbe2cd 100644 --- a/src/main/java/act/util/ClassFinderByteCodeScanner.java +++ b/src/main/java/act/util/ClassFinderByteCodeScanner.java @@ -20,13 +20,14 @@ * #L% */ +import static act.util.ClassFinderData.By.ANNOTATION; +import static act.util.ClassFinderData.By.SUPER_TYPE; + import act.app.AppByteCodeScannerBase; import act.asm.AnnotationVisitor; import act.asm.MethodVisitor; import act.asm.Type; - -import static act.util.ClassFinderData.By.ANNOTATION; -import static act.util.ClassFinderData.By.SUPER_TYPE; +import org.osgl.util.S; /** * Scans all public non-abstract methods for {@link SubClassFinder} @@ -63,13 +64,14 @@ public void visit(int version, int access, String name, String signature, String } @Override - public MethodVisitor visitMethod(int access, String name, String desc, final String signature, String[] exceptions) { - MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); + public MethodVisitor visitMethod(int access, String name, final String methodDesc, final String signature, String[] exceptions) { + MethodVisitor mv = super.visitMethod(access, name, methodDesc, signature, exceptions); if (null == className || !AsmTypes.isPublicNotAbstract(access)) { return mv; } final String methodName = name; final boolean isStatic = AsmTypes.isStatic(access); + final boolean paramIsInstance = null == signature; return new MethodVisitor(ASM5, mv) { @Override public AnnotationVisitor visitAnnotation(final String desc, boolean visible) { @@ -112,10 +114,10 @@ public void visitEnum(String name, String desc, String value) { @Override public void visitEnd() { if (SUPER_TYPE == how && !finder.whatSpecified()) { - finder.what(classNameFromMethodSignature()); + finder.what(classNameFromMethod(null != signature ? signature : methodDesc)); } finder.how(how); - finder.callback(className, methodName, isStatic); + finder.callback(className, methodName, isStatic, paramIsInstance); if (finder.isValid()) { finder.scheduleFind(); } @@ -128,7 +130,25 @@ public void visitEnd() { * And we need to get the type descriptor "Lorg/osgl/aaa/AAAPersistentService;" * from inside */ - private String classNameFromMethodSignature() { + private String classNameFromMethod(String spec) { + if (spec.contains("<")) { + return classNameFromMethodSignature(spec); + } else { + return classNameFromMethodDesc(spec); + } + } + + private String classNameFromMethodDesc(String desc) { + String s = desc.substring(1); // skip to first `(` + s = S.cut(s).beforeFirst(";"); // till the first `;` + if (s.startsWith("+")) { + // this is an interface? + s = s.substring(1); + } + return Type.getType(s + ";").getClassName(); + } + + private String classNameFromMethodSignature(String signature) { String descriptor = signature.substring(18); descriptor = descriptor.substring(0, descriptor.length() - 4); if (descriptor.startsWith("+")) { diff --git a/src/main/java/act/util/ClassFinderData.java b/src/main/java/act/util/ClassFinderData.java index fe1dd8f0c..0ef581640 100644 --- a/src/main/java/act/util/ClassFinderData.java +++ b/src/main/java/act/util/ClassFinderData.java @@ -88,16 +88,20 @@ public void visit(ClassNode classNode) throws $.Break { cl = cl.getParent(); } Class targetClass = $.classForName(classNode.name(), app.classLoader()); + Object param = targetClass; + if (data.paramIsInstance) { + param = app.getInstance(targetClass); + } if (!Env.matches(targetClass)) { logger.debug("ignore target class[%s]: environment spec not matching", targetClass); return; } if (data.isStatic) { Class host = $.classForName(data.className, cl); - $.invokeStatic(host, data.methodName, targetClass); + $.invokeStatic(host, data.methodName, param); } else { Object host = app.getInstance(data.className); - $.invokeVirtual(host, data.methodName, targetClass); + $.invokeVirtual(host, data.methodName, param); } } }; @@ -137,6 +141,10 @@ abstract void tryFind( * The name of the class that host the found callback logic */ private String className; + /** + * Report if param is an instance of a class + */ + private boolean paramIsInstance; /** * The name of the method that defines the found callback logic */ @@ -161,6 +169,11 @@ public ClassFinderData publicOnly(boolean b) { return this; } + public ClassFinderData paramIsInstance(boolean b) { + this.paramIsInstance = b; + return this; + } + public ClassFinderData noAbstract(boolean b) { this.noAbstract = b; return this; @@ -180,10 +193,11 @@ public ClassFinderData how(By by) { return this; } - public ClassFinderData callback(String className, String methodName, boolean isStatic) { + public ClassFinderData callback(String className, String methodName, boolean isStatic, boolean paramIsInstance) { this.className = className; this.methodName = methodName; this.isStatic = isStatic; + this.paramIsInstance = paramIsInstance; return this; } diff --git a/src/main/resources/asset/~act/css/act_captcha.css b/src/main/resources/asset/~act/css/act_captcha.css new file mode 100644 index 000000000..151a12295 --- /dev/null +++ b/src/main/resources/asset/~act/css/act_captcha.css @@ -0,0 +1,10 @@ +#act_captcha_dock, #act_captcha_dock div { + position: relative; +} +.act_captcha_title {display: none;} +img.act_captcha_icon { + position: relative; + top: 7px; + width: 24px; + cursor: pointer; +} diff --git a/src/main/resources/asset/~act/img/refresh.png b/src/main/resources/asset/~act/img/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..c174e1972e6f0e29751713f7b95cf33400604d1f GIT binary patch literal 1906 zcmaJ?dpOe#8~$y}mNBO=qph)w97^Vkm5SKfSdobG4$C?a(pygDu$6idH6w@OTWKmK zr)Wgpb!4`zR1OJ~A{sVx2)(?%>;3+Iuj_uE`@Wy+dj7coy3@V)?nc0k;Q#<2s1$df z6=wZ!Rzp|ziyaIx0KkY;cURx|qVeK$Y5pYrmYs{yF}-hma0Ye%v9-mex6ug8q7s@lAksele}TCw_o5*O@Dnma%)DVmh)f{-$r4nd z9lgqF^)FB@(8xm5Q#>IA7PQOp;hCft`gYI)hy;8Gg4FA4A95l1D0z@|I1txC%u*?J zfCPqKmHu(C2gcK)3LU@J$x&DQa^76_Fg1A-!55^;ws?Q{{i4RDH!jP)PCLjFL`V7f!sh#m1LGA#Cft`B&&+e3} zqw03wavVW!0os91z5ZMKJYWj5=<64sCK3PSfT9f))`Mu2zyXqP)ZNQdX&`~i*>Q@u z?Wg^&fHfAXba6Pu^)d2{S3)P*m5PBNsPi|)QsEKH3B9ewLc8v+%XBxMMd21>R0Gv$)qI&##$HhvZN;JA|mhZY*=nwcJ z5=ANeBNpwuz7W>jV*aV9U6laMlIGt}E03ymU8x%9{JX zq$z01f26#ozLU9zWFDH!*nw`c;E-Pt5Czg09+DC|s4QF^URytlKWUYltV}rm!CBI^ zki_mYe(r3i-Q)8*HA~3D)WtK5rf%J(BHvPSIG#OC4bz+aS$1cpdSfO{@HwMzVeTV?iGL22k9`@lv+wg^^Dphmns6bD5{Ag~qU9K) z!sLLoV&%4~ZIRaFnZPW=A2#Efd-kv$S0yN8Ii9zS@gmL!wxxJ!<^Sl*qMPS(#=q6H zKkDw??wIBy&Bgt7eGlmjAV}5uk!I<-Ow}n>-<)&&1}S*mt_a##wV0jD$s8b=zQl{d z<-Cm8nvXX97w4TR(i)r8Zhjdk_HZx}-8woLc1JTH<7uS1%vy2`MvywljNVy|?dfPJ z{_HKIm-I{{?KUKc80j@hiE%yD>7kw^JJ@_1@&0y!MTL`j6K&e#2N3jp!jsvRiC;R{ zB3)mxmE;RduBikEX5XfJd3n!8%fckc=2^ea!8pGI_>Q|I8>kpR3+T)Ez@%leIvYYif#t^YLZMTGlC*Nla*d}WS z;?~tX>u?lmw+*Xuac`B6T7_m47e%c%+P+bCPI6~jt$0IMCU0n1vHefY@k<|; zW9i!T@P@136V5y2-4=rL4SZKs0Lf-esxNs*L+%ef*`QfRsSw73Hy}zO@ff1LSGp)d z?uAAie2lX#_`-p&Pio3nXiYq*1>(3bK01e$7#A8um^Qs=6mMk8u4lw8mUySrN+Qf8 zMzWuR^jjY<3`FK@#X(c>Sld?=CcFVU`bf;-?>CuZj|DMv9`LejmFZv2tusn2{|#!( Z;NA-~)LwlH&y_9(sHDB_6}v*t{|&4vcU%Af literal 0 HcmV?d00001 diff --git a/src/main/resources/asset/~act/js/act_captcha.js b/src/main/resources/asset/~act/js/act_captcha.js new file mode 100644 index 000000000..3003ba477 --- /dev/null +++ b/src/main/resources/asset/~act/js/act_captcha.js @@ -0,0 +1,78 @@ +document.addEventListener("DOMContentLoaded", function(event) { + +var act_captchaDock = document.getElementById('act_captcha_dock'); +if (!act_captchaDock) { +throw "cannot find act_captcha_dock element"; +} +var act_onCaptcha = function(captcha) { +var top = document.getElementById('act_captcha_dock_inner'); +if (top) { + act_captchaDock.removeChild(top); +} + +top = document.createElement('div'); +top.id = 'act_captcha_dock_inner'; +act_captchaDock.appendChild(top); + + +var divTitle = document.createElement('div'); +divTitle.classList.add('act_captcha_title'); +divTitle.innerText = captcha.caption; +top.appendChild(divTitle); + +var imgCaptcha = document.createElement('img'); +imgCaptcha.classList.add('act_captcha_img'); +imgCaptcha.setAttribute('src', captcha.mediaUrl); +top.appendChild(imgCaptcha); + +var divInstruction = document.createElement('div'); +divInstruction.classList.add('act_captcha_instruction'); +divInstruction.innerText = captcha.instruction +top.appendChild(divInstruction); + +var divContainer = document.createElement('div'); +divContainer.classList.add('act_captcha_input_container'); +top.appendChild(divContainer); + +var inputToken = document.createElement('input'); +inputToken.setAttribute('name', 'a-captcha-token'); +inputToken.setAttribute('type', 'hidden'); +inputToken.setAttribute('value', captcha.token); +divContainer.appendChild(inputToken); + +var inputAnswer = document.createElement('input'); +inputAnswer.setAttribute('name', 'a-captcha-answer'); +divContainer.appendChild(inputAnswer); + +var btnRefresh = document.createElement('img'); +btnRefresh.classList.add('act_captcha_icon'); +btnRefresh.setAttribute('src', '/~/asset/img/refresh.png'); +divContainer.appendChild(btnRefresh); +btnRefresh.onclick=act_loadCaptcha; +} + +var httpRequest = new XMLHttpRequest(); +httpRequest.onreadystatechange = function() { +if (httpRequest.readyState === 4) { + if (httpRequest.status === 200) { + var captcha = JSON.parse(httpRequest.responseText); + if (typeof act_captcha_handler === 'function') { + act_captcha_handler(captcha); + } else { + act_onCaptcha(captcha); + } + } else { + console.warn("error getting captcha session data"); + } +} +}; + +function act_loadCaptcha() { + httpRequest.open('GET', '/~/captcha'); + httpRequest.send(); +} + +act_loadCaptcha(); + +}); + diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java b/testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java new file mode 100644 index 000000000..ed3cb80a1 --- /dev/null +++ b/testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java @@ -0,0 +1,28 @@ +package testapp.endpoint.ghissues.gh692; + +import act.controller.annotation.UrlContext; +import act.util.SubClassFinder; +import org.osgl.mvc.annotation.GetAction; +import testapp.endpoint.ghissues.GithubIssueBase; + +import java.util.ArrayList; +import java.util.List; + +public interface Gh692Service { + String name(); + + @UrlContext("692") + class Manager extends GithubIssueBase { + private List serviceList = new ArrayList<>(); + + @SubClassFinder + public void foundService(Gh692Service svc) { + serviceList.add(svc); + } + + @GetAction + public int count() { + return serviceList.size(); + } + } +} diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java b/testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java new file mode 100644 index 000000000..28df60d7e --- /dev/null +++ b/testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java @@ -0,0 +1,8 @@ +package testapp.endpoint.ghissues.gh692; + +public class HelloService implements Gh692Service { + @Override + public String name() { + return "Hello"; + } +} diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue692.java b/testapp/src/test/java/testapp/endpoint/GHIssue692.java new file mode 100644 index 000000000..1de96cc7b --- /dev/null +++ b/testapp/src/test/java/testapp/endpoint/GHIssue692.java @@ -0,0 +1,13 @@ +package testapp.endpoint; + +import org.junit.Test; + +public class GHIssue692 extends EndpointTester { + + @Test + public void test() throws Exception { + url("/gh/692").get(); + bodyEq("1"); + } + +} From 8d287ec96541be845546bd0e607dee496317bee4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 27 Jun 2018 09:58:58 +1000 Subject: [PATCH 005/730] fix Allow developer to configure app cache default TTL #696 --- CHANGELOG.md | 2 + VERSION_MATRIX.md | 4 +- src/main/java/act/app/ActionContext.java | 3 + src/main/java/act/app/App.java | 10 +- src/main/java/act/conf/AppConfig.java | 242 ++++++++++++++++-- src/main/java/act/conf/AppConfigKey.java | 7 + src/main/java/act/conf/Config.java | 4 +- ...PluginManager.java => CaptchaManager.java} | 19 +- .../controller/captcha/CaptchaService.java | 2 +- src/main/java/act/view/rythm/Tags.java | 30 ++- 10 files changed, 292 insertions(+), 31 deletions(-) rename src/main/java/act/controller/captcha/{CaptchaPluginManager.java => CaptchaManager.java} (79%) diff --git a/CHANGELOG.md b/CHANGELOG.md index f35d0502b..ca450c939 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Allow developer to configure app cache default TTL #696 +* Provide a mechanism to disable CAPTCHA protection #694 * Allow binding epoch time millis directly to date types #691 * `ActionContext.allowIgnoreParamNamespace` not effective when POJO has collection typed fields #690 * ParamLoader: POJO array or container field shall be initialized even if no request data for them #689 diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 0cb779dd8..7f98f8e2c 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,11 +1,11 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8-RC11 | +| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8-RC12 | | --- | ----: | ----: | ----: | ----: | | aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.1 | | beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.4 | | beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.2 | -| e2e | | | | 1.0.0 | +| e2e | | | | 1.0.1 | | ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.2 | | ebean | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.2 | | eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.1 | diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index f4e0d9e2a..c8229a11c 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -271,6 +271,9 @@ public void markAsRequireCaptcha() { } public void ensureCaptcha() { + if (app().captchaManager().disabled()) { + return; + } if (!subjectToCaptchaProtection()) { return; } diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 901a71f44..1f495e854 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -40,7 +40,7 @@ import act.conf.AppConfigKey; import act.conf.ConfigurationByteCodeScanner; import act.controller.bytecode.ControllerByteCodeScanner; -import act.controller.captcha.CaptchaPluginManager; +import act.controller.captcha.CaptchaManager; import act.crypto.AppCrypto; import act.data.DataPropertyRepository; import act.data.JodaDateTimeCodec; @@ -139,7 +139,7 @@ public enum F { private File appHome; private Router router; private CliDispatcher cliDispatcher; - private CaptchaPluginManager captchaPluginManager; + private CaptchaManager captchaManager; private Map moreRouters; private AppConfig config; private AppClassLoader classLoader; @@ -396,8 +396,8 @@ public CliDispatcher cliDispatcher() { return cliDispatcher; } - public CaptchaPluginManager captchaSessionGeneratorManager() { - return captchaPluginManager; + public CaptchaManager captchaManager() { + return captchaManager; } public Router router() { @@ -1288,7 +1288,7 @@ private void initCliDispatcher() { } private void initCaptchaPluginManager() { - captchaPluginManager = new CaptchaPluginManager(this); + captchaManager = new CaptchaManager(this); } private void initCliServer() { diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 325edd748..ef357249f 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -160,13 +160,39 @@ public void preloadConfigurations() { OsglConfig.setThreadLocalBufferLimit(threadLocalBufRetentionLimit()); OsglConfig.registerGlobalInstanceFactory(new $.Function() { final App app = Act.app(); + @Override public Object apply(Class aClass) throws NotAppliedException, $.Break { return app.getInstance(aClass); } }); + + app().cache().setDefaultTTL(cacheTtl()); + Map cacheSettings = subSet("cache"); + for (Map.Entry entry : cacheSettings.entrySet()) { + String key = entry.getKey(); + if (key.endsWith(".ttl")) { + String s = S.string(entry.getValue()); + int ttl; + if (S.isInt(s)) { + ttl = Integer.parseInt(s); + } else if (s.contains("*")) { + List sl = S.fastSplit(s, "*"); + int n = 1; + for (String sn : sl) { + n *= Integer.parseInt(sn.trim()); + } + ttl = n; + } else { + throw new ConfigurationException("Invalid cache ttl configuration: " + key); + } + key = S.cut(key.substring(6)).beforeLast("."); + app().cache(key).setDefaultTTL(ttl); + } + } } + public App app() { return app; } @@ -206,12 +232,14 @@ protected T hideBuiltInEndpointsInApiDoc(boolean b) { this.apiDocBuiltInHide = b; return me(); } + public boolean isHideBuiltInEndpointsInApiDoc() { if (null == apiDocBuiltInHide) { apiDocBuiltInHide = get(API_DOC_HIDE_BUILT_IN_ENDPOINTS, false); } return apiDocBuiltInHide; } + private void _mergeHideBuiltInEndpointsInApiDoc(AppConfig conf) { if (!hasConfiguration(API_DOC_HIDE_BUILT_IN_ENDPOINTS)) { this.apiDocBuiltInHide = conf.apiDocBuiltInHide; @@ -259,60 +287,72 @@ private void _mergeBuiltInReqHandler(AppConfig conf) { } private Boolean cacheForOnDev; + protected T enableCacheForOnDevMode() { cacheForOnDev = false; return me(); } + public boolean cacheForOnDevMode() { if (null == cacheForOnDev) { cacheForOnDev = get(CACHE_FOR_ON_DEV, false); } return cacheForOnDev; } - private void _mergeCacheForOnDev(AppConfig config){ + + private void _mergeCacheForOnDev(AppConfig config) { if (!hasConfiguration(CACHE_FOR_ON_DEV)) { cacheForOnDev = config.cacheForOnDev; } } private Integer captchaWidth; + protected T captchaWidth(int w) { this.captchaWidth = w; return me(); } + public int captchaWidth() { if (null == captchaWidth) { captchaWidth = getInteger(CAPTCHA_WIDTH, 200); } return captchaWidth; } - private void _mergeCaptchaWidth(AppConfig config){ + + private void _mergeCaptchaWidth(AppConfig config) { if (!hasConfiguration(CAPTCHA_WIDTH)) { captchaWidth = config.captchaWidth; } } + private Integer captchaHeight; + protected T captchaHeight(int h) { this.captchaHeight = h; return me(); } + public int captchaHeight() { if (null == captchaHeight) { captchaHeight = getInteger(CAPTCHA_HEIGHT, 70); } return captchaHeight; } - private void _mergeCaptchaHeight(AppConfig config){ + + private void _mergeCaptchaHeight(AppConfig config) { if (!hasConfiguration(CAPTCHA_HEIGHT)) { captchaHeight = config.captchaHeight; } } private Color captchaBgColor; + protected T captchaBgColor(Color color) { this.captchaBgColor = color; return me(); } + public Color captchaBgColor() { if (null == captchaBgColor) { String s = get(CAPTCHA_BG_COLOR, "white"); @@ -327,6 +367,7 @@ public Color captchaBgColor() { } return captchaBgColor; } + private void _mergeCaptchaBgColor(AppConfig config) { if (!hasConfiguration(CAPTCHA_BG_COLOR)) { captchaBgColor = config.captchaBgColor; @@ -334,19 +375,23 @@ private void _mergeCaptchaBgColor(AppConfig config) { } private String reCaptchaSecret; + protected T reCaptchaSecret(String secret) { this.reCaptchaSecret = secret; return me(); } + public String reCaptchaSecret() { if (null != reCaptchaSecret) { reCaptchaSecret = get(CAPTCHA_RECAPTCHA_SECRET, ""); } return reCaptchaSecret; } + public boolean reCaptchaActivated() { return S.notBlank(reCaptchaSecret()); } + private void _mergeReCaptchaSecret(AppConfig config) { if (!hasConfiguration(CAPTCHA_RECAPTCHA_SECRET)) { reCaptchaSecret = config.reCaptchaSecret; @@ -434,16 +479,19 @@ private void _mergeCorsHeadersExpose(AppConfig conf) { } private Boolean corsOptionCheck; + protected T corsOptionCheck(Boolean b) { this.corsOptionCheck = b; return me(); } + public Boolean corsOptionCheck() { if (null == corsOptionCheck) { corsOptionCheck = get(CORS_CHECK_OPTION_METHOD, true); } return corsOptionCheck; } + private void _mergeCorsOptionCheck(AppConfig conf) { if (!hasConfiguration(CORS_CHECK_OPTION_METHOD)) { corsOptionCheck = conf.corsOptionCheck; @@ -492,16 +540,19 @@ private void _mergeCorsMaxAge(AppConfig conf) { } private Boolean corsAllowCredentials; + protected T corsAllowCredentials(boolean b) { this.corsAllowCredentials = b; return me(); } + public boolean corsAllowCredentials() { if (null == corsAllowCredentials) { corsAllowCredentials = get(CORS_ALLOW_CREDENTIALS, false); } return corsAllowCredentials; } + private void _mergeCorsAllowCredential(AppConfig conf) { if (!hasConfiguration(CORS_ALLOW_CREDENTIALS)) { corsAllowCredentials = conf.corsAllowCredentials; @@ -510,11 +561,13 @@ private void _mergeCorsAllowCredential(AppConfig conf) { private String contentSecurityPolicy; private boolean cspSet; + protected T contentSecurityPolicy(String policy) { this.contentSecurityPolicy = policy; cspSet = null != policy; return me(); } + public String contentSecurityPolicy() { if (!cspSet) { contentSecurityPolicy = get(CONTENT_SECURITY_POLICY, null); @@ -522,6 +575,7 @@ public String contentSecurityPolicy() { } return contentSecurityPolicy; } + private void _mergeCsp(AppConfig conf) { if (!hasConfiguration(CONTENT_SECURITY_POLICY)) { contentSecurityPolicy = conf.contentSecurityPolicy; @@ -660,7 +714,7 @@ private void _mergeCliEnabled(AppConfig conf) { cliEnabled = conf.cliEnabled; } } - + private int cliTablePageSz = -1; protected T cliTablePageSz(int sz) { @@ -943,10 +997,12 @@ private void _mergeMaxCliSession(AppConfig conf) { } private Boolean enumResolvingCaseSensitive; + protected T enumResolvingCaseSensitive(boolean b) { enumResolvingCaseSensitive = b; return me(); } + @Deprecated public boolean enumResolvingCaseSensitive() { synchronized (ENUM_RESOLVING_CASE_SENSITIVE) { @@ -956,6 +1012,7 @@ public boolean enumResolvingCaseSensitive() { return enumResolvingCaseSensitive; } } + private void _mergeEnumResolvingCaseSensitive(AppConfig conf) { if (!hasConfiguration(ENUM_RESOLVING_CASE_SENSITIVE)) { enumResolvingCaseSensitive = conf.enumResolvingCaseSensitive; @@ -963,10 +1020,12 @@ private void _mergeEnumResolvingCaseSensitive(AppConfig conf) { } private Boolean enumResolvingExactMatch; + protected T enumResolvingExactMatch(boolean b) { enumResolvingExactMatch = b; return me(); } + public boolean enumResolvingExactMatch() { synchronized (ENUM_RESOLVING_EXACT_MATCH) { if (null == enumResolvingExactMatch) { @@ -975,6 +1034,7 @@ public boolean enumResolvingExactMatch() { return enumResolvingExactMatch; } } + private void _mergeEnumResolvingExactMatch(AppConfig config) { if (!hasConfiguration(ENUM_RESOLVING_EXACT_MATCH)) { enumResolvingExactMatch = config.enumResolvingExactMatch; @@ -1088,16 +1148,19 @@ private void _mergeErrorTemplatePathResolver(AppConfig conf) { } private Boolean headerOverwrite; + protected T allowHeaderOverwrite(boolean b) { headerOverwrite = b; return me(); } + public boolean allowHeaderOverwrite() { if (null == headerOverwrite) { headerOverwrite = get(HEADER_OVERWRITE, false); } return headerOverwrite; } + private void _mergeHeaderOverwrite(AppConfig config) { if (!hasConfiguration(HEADER_OVERWRITE)) { headerOverwrite = config.headerOverwrite; @@ -1146,18 +1209,21 @@ private void _mergeHost(AppConfig conf) { host = conf.host; } } - + private Boolean i18nEnabled; + protected T i18n(boolean enabled) { i18nEnabled = enabled; return me(); } + public boolean i18nEnabled() { if (null == i18nEnabled) { i18nEnabled = get(I18N, false); } return i18nEnabled; } + private void _mergeI18nEnabled(AppConfig conf) { if (!hasConfiguration(I18N)) { i18nEnabled = conf.i18nEnabled; @@ -1165,10 +1231,12 @@ private void _mergeI18nEnabled(AppConfig conf) { } private Boolean jwtEnabled; + protected T jwtEnabled(boolean enabled) { jwtEnabled = enabled; return me(); } + public boolean jwtEnabled() { if (null == jwtEnabled) { jwtEnabled = get(JWT, false); @@ -1189,6 +1257,7 @@ public boolean jwtEnabled() { } return jwtEnabled; } + private void _mergeJWT(AppConfig config) { if (!hasConfiguration(JWT)) { jwtEnabled = config.jwtEnabled; @@ -1196,10 +1265,12 @@ private void _mergeJWT(AppConfig config) { } private HMAC jwtAlgo; + protected T jwtArgo(HMAC.Algorithm algo) { jwtAlgo = new HMAC(secret(), algo); return me(); } + public HMAC jwtAlgo() { if (null == jwtAlgo) { String algoKey = get(JWT_ALGO, "SHA256"); @@ -1211,6 +1282,7 @@ public HMAC jwtAlgo() { } return jwtAlgo; } + private void _mergeJWTAlgo(AppConfig config) { if (!hasConfiguration(JWT_ALGO)) { jwtAlgo = config.jwtAlgo; @@ -1218,17 +1290,20 @@ private void _mergeJWTAlgo(AppConfig config) { } private String jwtIssuer; + protected T jwtIssuer(String issuer) { E.illegalArgumentIf(S.blank(issuer), "issuer cannot be empty"); jwtIssuer = issuer; return me(); } + public String jwtIssuer() { if (null == jwtIssuer) { jwtIssuer = get(AppConfigKey.JWT_ISSUER, cookiePrefix().substring(0, cookiePrefix().length() - 1)); } return jwtIssuer; } + private void _mergeJwtIssuer(AppConfig config) { if (!hasConfiguration(JWT_ISSUER)) { jwtIssuer = config.jwtIssuer; @@ -1236,17 +1311,20 @@ private void _mergeJwtIssuer(AppConfig config) { } private String localeParamName; + protected T localeParamName(String name) { E.illegalArgumentIf(S.blank(name), "locale param name must not be empty"); localeParamName = name; return me(); } + public String localeParamName() { if (null == localeParamName) { localeParamName = get(I18N_LOCALE_PARAM_NAME, "act_locale"); } return localeParamName; } + private void _mergeLocaleParamName(AppConfig conf) { if (!hasConfiguration(I18N_LOCALE_PARAM_NAME)) { localeParamName = conf.localeParamName; @@ -1255,17 +1333,20 @@ private void _mergeLocaleParamName(AppConfig conf) { private String localeCookieName; + protected T localeCookieName(String name) { E.illegalArgumentIf(S.blank(name), "locale Cookie name must not be empty"); localeCookieName = name; return me(); } + public String localeCookieName() { if (null == localeCookieName) { localeCookieName = get(I18N_LOCALE_COOKIE_NAME, "locale"); } return localeCookieName; } + private void _mergeLocaleCookieName(AppConfig conf) { if (!hasConfiguration(I18N_LOCALE_COOKIE_NAME)) { localeCookieName = conf.localeCookieName; @@ -1273,17 +1354,20 @@ private void _mergeLocaleCookieName(AppConfig conf) { } Integer ipEffectiveBytes; + protected T ipEffectiveBytes(int n) { E.illegalArgumentIf(n < 1 || n > 4, "integer from 1 to 4 (inclusive) expected"); ipEffectiveBytes = n; return me(); } + public int ipEffectiveBytes() { if (null == ipEffectiveBytes) { ipEffectiveBytes = getInteger(ID_GEN_NODE_ID_EFFECTIVE_IP_BYTES, 4); } return ipEffectiveBytes; } + private void _mergeIpEffectiveBytes(AppConfig conf) { if (!hasConfiguration(ID_GEN_NODE_ID_EFFECTIVE_IP_BYTES)) { ipEffectiveBytes = conf.ipEffectiveBytes; @@ -1291,16 +1375,19 @@ private void _mergeIpEffectiveBytes(AppConfig conf) { } private IdGenerator.NodeIdProvider nodeIdProvider; + protected T nodeIdProvider(IdGenerator.NodeIdProvider provider) { this.nodeIdProvider = $.NPE(provider); return me(); } + public IdGenerator.NodeIdProvider nodeIdProvider() { if (null == nodeIdProvider) { nodeIdProvider = get(ID_GEN_NODE_ID_PROVIDER, new IdGenerator.NodeIdProvider.IpProvider(ipEffectiveBytes())); } return nodeIdProvider; } + private void _mergeNodeIdProvider(AppConfig conf) { if (!hasConfiguration(ID_GEN_NODE_ID_PROVIDER)) { nodeIdProvider = conf.nodeIdProvider; @@ -1308,17 +1395,20 @@ private void _mergeNodeIdProvider(AppConfig conf) { } private String startIdFile; + protected T startIdFile(String file) { E.illegalArgumentIf(S.blank(file)); startIdFile = file; return me(); } + public String startIdFile() { if (null == startIdFile) { startIdFile = get(ID_GEN_START_ID_FILE, ".act.id-app"); } return startIdFile; } + private void _mergeStartIdFile(AppConfig conf) { if (!hasConfiguration(ID_GEN_START_ID_FILE)) { startIdFile = conf.startIdFile; @@ -1326,16 +1416,19 @@ private void _mergeStartIdFile(AppConfig conf) { } private IdGenerator.StartIdProvider startIdProvider; + protected T startIdProvider(IdGenerator.StartIdProvider provider) { startIdProvider = $.NPE(provider); return me(); } + public IdGenerator.StartIdProvider startIdProvider() { if (null == startIdProvider) { startIdProvider = get(ID_GEN_START_ID_PROVIDER, new IdGenerator.StartIdProvider.DefaultStartIdProvider(startIdFile())); } return startIdProvider; } + private void _mergeStartIdProvider(AppConfig conf) { if (!hasConfiguration(ID_GEN_START_ID_PROVIDER)) { startIdProvider = conf.startIdProvider; @@ -1343,16 +1436,19 @@ private void _mergeStartIdProvider(AppConfig conf) { } private IdGenerator.SequenceProvider sequenceProvider; + protected T sequenceProvider(IdGenerator.SequenceProvider provider) { this.sequenceProvider = $.NPE(provider); return me(); } + public IdGenerator.SequenceProvider sequenceProvider() { if (null == sequenceProvider) { sequenceProvider = get(ID_GEN_SEQ_ID_PROVIDER, new IdGenerator.SequenceProvider.AtomicLongSeq()); } return sequenceProvider; } + private void _mergeSequenceProvider(AppConfig conf) { if (!hasConfiguration(ID_GEN_SEQ_ID_PROVIDER)) { sequenceProvider = conf.sequenceProvider; @@ -1361,16 +1457,19 @@ private void _mergeSequenceProvider(AppConfig conf) { private IdGenerator.LongEncoder longEncoder; + protected T longEncoder(IdGenerator.LongEncoder longEncoder) { this.longEncoder = $.NPE(longEncoder); return me(); } + public IdGenerator.LongEncoder longEncoder() { if (null == longEncoder) { longEncoder = get(ID_GEN_LONG_ENCODER, IdGenerator.SAFE_ENCODER); } return longEncoder; } + private void _mergeLongEncoder(AppConfig conf) { if (!hasConfiguration(ID_GEN_LONG_ENCODER)) { longEncoder = conf.longEncoder; @@ -1378,11 +1477,13 @@ private void _mergeLongEncoder(AppConfig conf) { } private String loginUrl = null; + protected T loginUrl(String url) { E.illegalArgumentIf(!url.startsWith("/"), "login URL shall start with '/'"); this.loginUrl = url; return me(); } + public String loginUrl() { if (null == loginUrl) { loginUrl = get(URL_LOGIN, "/login"); @@ -1393,6 +1494,7 @@ public String loginUrl() { } return loginUrl; } + private void _mergeLoginUrl(AppConfig conf) { if (!hasConfiguration(URL_LOGIN)) { loginUrl = conf.loginUrl; @@ -1400,17 +1502,20 @@ private void _mergeLoginUrl(AppConfig conf) { } private String ajaxLoginUrl = null; + protected T ajaxLoginUrl(String url) { E.illegalArgumentIf(!url.startsWith("/"), "login URL shall start with '/'"); this.ajaxLoginUrl = url; return me(); } + public String ajaxLoginUrl() { if (null == ajaxLoginUrl) { ajaxLoginUrl = get(URL_LOGIN_AJAX, loginUrl()); } return ajaxLoginUrl; } + private void _mergeAjaxLoginUrl(AppConfig conf) { if (!hasConfiguration(URL_LOGIN_AJAX)) { ajaxLoginUrl = conf.ajaxLoginUrl; @@ -1419,11 +1524,13 @@ private void _mergeAjaxLoginUrl(AppConfig conf) { private boolean urlContextInitialized; private String urlContext; + protected T urlContext(String context) { this.urlContext = context; urlContextInitialized = S.notBlank(context); return me(); } + public String urlContext() { if (!urlContextInitialized) { urlContext = get(URL_CONTEXT, null); @@ -1449,6 +1556,7 @@ public String urlContext() { } return urlContext; } + private void _mergeUrlContext(AppConfig conf) { if (!hasConfiguration(URL_CONTEXT)) { urlContext = conf.urlContext; @@ -1458,11 +1566,13 @@ private void _mergeUrlContext(AppConfig conf) { private int httpMaxParams = -1; + protected T httpMaxParams(int max) { E.illegalArgumentIf(max < 0, "max params cannot be negative number: %s", max); this.httpMaxParams = max; return me(); } + public int httpMaxParams() { if (-1 == httpMaxParams) { httpMaxParams = getInteger(HTTP_MAX_PARAMS, 128); @@ -1472,6 +1582,7 @@ public int httpMaxParams() { } return httpMaxParams; } + private void _mergeHttpMaxParams(AppConfig conf) { if (!hasConfiguration(HTTP_MAX_PARAMS)) { httpMaxParams = conf.httpMaxParams; @@ -1498,22 +1609,22 @@ private void _mergeJobPoolSize(AppConfig conf) { jobPoolSize = conf.jobPoolSize; } } - + private int httpExternalPort = -1; - + protected T httpExternalPort(int port) { E.illegalArgumentIf(port < 1, "port value not valid: %s", port); this.httpExternalPort = port; return me(); } - + public int httpExternalPort() { if (-1 == httpExternalPort) { httpExternalPort = get(HTTP_EXTERNAL_PORT, httpExternal() ? 80 : httpPort()); } return httpExternalPort; } - + private void _mergeHttpExternalPort(AppConfig conf) { if (!hasConfiguration(HTTP_EXTERNAL_PORT)) { this.httpExternalPort = conf.httpExternalPort(); @@ -1625,11 +1736,13 @@ private void _mergeHttpsPort(AppConfig conf) { } private MissingAuthenticationHandler mah = null; + protected T missingAuthenticationHandler(MissingAuthenticationHandler handler) { E.NPE(handler); mah = handler; return me(); } + public MissingAuthenticationHandler missingAuthenticationHandler() { if (null == mah) { RedirectToLoginUrl redirectToLoginUrl = app.getInstance(RedirectToLoginUrl.class); @@ -1638,6 +1751,7 @@ public MissingAuthenticationHandler missingAuthenticationHandler() { } return mah; } + private void _mergeMissingAuthenticationHandler(AppConfig config) { if (!hasConfiguration(HANDLER_MISSING_AUTHENTICATION)) { mah = config.mah; @@ -1645,17 +1759,20 @@ private void _mergeMissingAuthenticationHandler(AppConfig config) { } private MissingAuthenticationHandler ajaxMah = null; + protected T ajaxMissingAuthenticationHandler(MissingAuthenticationHandler handler) { E.NPE(handler); ajaxMah = handler; return me(); } + public MissingAuthenticationHandler ajaxMissingAuthenticationHandler() { if (null == ajaxMah) { ajaxMah = get(HANDLER_MISSING_AUTHENTICATION_AJAX, missingAuthenticationHandler()); } return ajaxMah; } + private void _mergeAjaxMissingAuthenticationHandler(AppConfig config) { if (!hasConfiguration(HANDLER_MISSING_AUTHENTICATION_AJAX)) { ajaxMah = config.ajaxMah; @@ -1663,17 +1780,20 @@ private void _mergeAjaxMissingAuthenticationHandler(AppConfig config) { } private MissingAuthenticationHandler csrfCheckFailureHandler = null; + protected T csrfCheckFailureHandler(MissingAuthenticationHandler handler) { E.NPE(handler); csrfCheckFailureHandler = handler; return me(); } + public MissingAuthenticationHandler csrfCheckFailureHandler() { if (null == csrfCheckFailureHandler) { csrfCheckFailureHandler = get(HANDLER_CSRF_CHECK_FAILURE, missingAuthenticationHandler()); } return csrfCheckFailureHandler; } + private void _mergeCsrfCheckFailureHandler(AppConfig config) { if (!hasConfiguration(HANDLER_CSRF_CHECK_FAILURE)) { csrfCheckFailureHandler = config.csrfCheckFailureHandler; @@ -1681,17 +1801,20 @@ private void _mergeCsrfCheckFailureHandler(AppConfig config) { } private MissingAuthenticationHandler ajaxCsrfCheckFailureHandler = null; + protected T ajaxCsrfCheckFailureHandler(MissingAuthenticationHandler handler) { E.NPE(handler); ajaxCsrfCheckFailureHandler = handler; return me(); } + public MissingAuthenticationHandler ajaxCsrfCheckFailureHandler() { if (null == ajaxCsrfCheckFailureHandler) { ajaxCsrfCheckFailureHandler = get(HANDLER_AJAX_CSRF_CHECK_FAILURE, csrfCheckFailureHandler()); } return ajaxCsrfCheckFailureHandler; } + private void _mergeAjaxCsrfCheckFailureHandler(AppConfig config) { if (!hasConfiguration(HANDLER_AJAX_CSRF_CHECK_FAILURE)) { csrfCheckFailureHandler = config.csrfCheckFailureHandler; @@ -1699,10 +1822,12 @@ private void _mergeAjaxCsrfCheckFailureHandler(AppConfig config) { } private Integer threadlocalBufRetentionLimit; + protected T threadLocalBufRetentionLimit(int limit) { threadlocalBufRetentionLimit = limit; return me(); } + public int threadLocalBufRetentionLimit() { if (null == threadlocalBufRetentionLimit) { StrBufRetentionLimitCalculator calc = new StrBufRetentionLimitCalculator(); @@ -1710,6 +1835,7 @@ public int threadLocalBufRetentionLimit() { } return threadlocalBufRetentionLimit; } + private void _mergeStrBufRetentionLimit(AppConfig config) { if (!hasConfiguration(OSGL_THREADLOCAL_BUF_LIMIT)) { threadlocalBufRetentionLimit = config.threadlocalBufRetentionLimit; @@ -1722,10 +1848,12 @@ protected T defPasswordValidator(Password.Validator validator) { defPasswordValidator = $.requireNotNull(validator); return me(); } + protected T defPasswordSpec(String spec) { _defPasswordSpec(spec); return me(); } + public Password.Validator defPasswordValidator() { if (null == defPasswordValidator) { String s = get(PASSWORD_DEF_SPEC, Act.isDev() ? "a[3,]" : "aA0[6,]"); @@ -1733,6 +1861,7 @@ public Password.Validator defPasswordValidator() { } return defPasswordValidator; } + private void _defPasswordSpec(String spec) { try { defPasswordValidator = PasswordSpec.parse(spec); @@ -1968,7 +2097,7 @@ public String localizedTimePattern(Locale locale) { } return s; } - + private volatile String dateTimePattern = null; private SimpleDateFormat dateTimeFormat = null; @@ -2027,6 +2156,7 @@ private void _mergeDateTimeFmt(AppConfig conf) { dateTimePattern = conf.dateTimePattern; } } + private Map localizedDateTimePatterns = new HashMap<>(); public String localizedDateTimePattern(Locale locale) { @@ -2118,7 +2248,7 @@ public boolean test(String s) { if (scanList.contains(s)) { return true; } - for (String scan: scanList) { + for (String scan : scanList) { if (s.startsWith(scan + "$") || s.matches(scan)) { return true; } @@ -2237,17 +2367,20 @@ private void _mergePingPath(AppConfig config) { } private Integer reqThrottle; + protected T requestThrottle(final int throttle) { E.illegalArgumentIf(throttle < 1, "request throttle must be positive integer"); this.reqThrottle = throttle; return me(); } + public int requestThrottle() { if (null == reqThrottle) { reqThrottle = get(REQUEST_THROTTLE, 2); } return reqThrottle; } + private void _mergeReqThrottle(AppConfig config) { if (!hasConfiguration(REQUEST_THROTTLE)) { this.reqThrottle = config.reqThrottle; @@ -2255,16 +2388,19 @@ private void _mergeReqThrottle(AppConfig config) { } private Boolean reqThrottleExpireScale; + protected T requestThrottleExpireScale(final boolean enabled) { this.reqThrottleExpireScale = enabled; return me(); } + public boolean requestThrottleExpireScale() { if (null == reqThrottleExpireScale) { reqThrottleExpireScale = get(REQUEST_THROTTLE_EXPIRE_SCALE, false); } return reqThrottleExpireScale; } + private void _mergeReqThrottleExpireScale(AppConfig config) { if (!hasConfiguration(REQUEST_THROTTLE_EXPIRE_SCALE)) { this.reqThrottleExpireScale = config.reqThrottleExpireScale; @@ -2274,10 +2410,12 @@ private void _mergeReqThrottleExpireScale(AppConfig config) { private $.Func0 jsonContentTypeProvider = null; private Boolean renderJsonIeFix = null; private H.Format jsonIE; + protected T renderJsonContentTypeIE(final String contentType) { setRenderJsonContenTypeIE(contentType); return me(); } + private void setRenderJsonContenTypeIE(final String contentType) { if (H.Format.JSON.contentType().equalsIgnoreCase(contentType)) { renderJsonIeFix = false; @@ -2299,6 +2437,7 @@ public H.Format apply() throws NotAppliedException, $.Break { } }; } + public $.Func0 jsonContentTypeProvider() { if (null == renderJsonIeFix) { String contentType = get(RENDER_JSON_CONTENT_TYPE_IE, null); @@ -2310,6 +2449,7 @@ public H.Format apply() throws NotAppliedException, $.Break { } return renderJsonIeFix ? jsonContentTypeProvider : null; } + private void _mergeRenderJsonContentTypeIE(AppConfig conf) { if (!hasConfiguration(RENDER_JSON_CONTENT_TYPE_IE)) { jsonContentTypeProvider = conf.jsonContentTypeProvider; @@ -2319,16 +2459,19 @@ private void _mergeRenderJsonContentTypeIE(AppConfig conf) { } private Boolean renderJsonOutputCharset; + protected T renderJsonOutputCharset(boolean outputCharset) { this.renderJsonOutputCharset = outputCharset; return me(); } + public boolean renderJsonOutputCharset() { if (null == renderJsonOutputCharset) { renderJsonOutputCharset = get(RENDER_JSON_OUTPUT_CHARSET, false); } return renderJsonOutputCharset; } + private void _mergeRenderJsonOutputCharset(AppConfig config) { if (!hasConfiguration(RENDER_JSON_OUTPUT_CHARSET)) { renderJsonOutputCharset = config.renderJsonOutputCharset; @@ -2567,11 +2710,13 @@ public boolean sessionOutputExpiration() { private String sessionHeader; private boolean sessionHeaderSet; + protected T sessionHeader(String header) { this.sessionHeader = header; this.sessionHeaderSet = true; return me(); } + public String sessionHeader() { if (!sessionHeaderSet) { sessionHeader = get(SESSION_HEADER, null); @@ -2579,6 +2724,7 @@ public String sessionHeader() { } return sessionHeader; } + private void _mergeSessionHeader(AppConfig conf) { if (!hasConfiguration(SESSION_HEADER)) { sessionHeader = conf.sessionHeader; @@ -2587,10 +2733,12 @@ private void _mergeSessionHeader(AppConfig conf) { } private String sessionHeaderPrefix; + protected T sessionHeaderPrefix(String prefix) { this.sessionHeaderPrefix = prefix; return me(); } + public String sessionHeaderPrefix() { if (null == sessionHeaderPrefix) { sessionHeaderPrefix = get(SESSION_HEADER_PREFIX, HeaderTokenSessionMapper.DEF_HEADER_PREFIX); @@ -2599,15 +2747,18 @@ public String sessionHeaderPrefix() { } private String sessionHeaderPayloadPrefix = null; + protected void sessionHeaderPayloadPrefix(String prefix) { this.sessionHeaderPayloadPrefix = prefix; } + public String sessionHeaderPayloadPrefix() { if (null == sessionHeaderPayloadPrefix) { sessionHeaderPayloadPrefix = get(SESSION_HEADER_PAYLOAD_PREFIX, HeaderTokenSessionMapper.DEF_PAYLOAD_PREFIX); } return sessionHeaderPayloadPrefix; } + private void _mergeSessionHeaderPayloadPrefix(AppConfig config) { if (!hasConfiguration(AppConfigKey.SESSION_HEADER_PAYLOAD_PREFIX)) { sessionHeaderPayloadPrefix = config.sessionHeaderPayloadPrefix; @@ -2635,11 +2786,13 @@ private void _mergeSessionSecure(AppConfig config) { } private volatile String secret = null; + protected T secret(String secret) { E.illegalArgumentIf(S.blank(secret)); this.secret = secret; return me(); } + public String secret() { if (null == secret) { secret = get(AppConfigKey.SECRET, "myawesomeapp"); @@ -2649,6 +2802,7 @@ public String secret() { } return secret; } + private void _mergeSecret(AppConfig config) { if (!hasConfiguration(AppConfigKey.SECRET)) { secret = config.secret; @@ -2656,16 +2810,19 @@ private void _mergeSecret(AppConfig config) { } private Boolean secretRotate = null; + protected T secretRotate(boolean enabled) { secretRotate = enabled; return me(); } + public boolean rotateSecret() { if (null == secretRotate) { secretRotate = get(SECRET_ROTATE, false); } return secretRotate; } + private void _mergeSecretRotate(AppConfig config) { if (!hasConfiguration(SECRET_ROTATE)) { secretRotate = config.secretRotate; @@ -2677,7 +2834,8 @@ private void _mergeSecretRotate(AppConfig config) { /** * Set `secret.rotate.period` in terms of minute * - * @param period the minutes between two secret rotate happening + * @param period + * the minutes between two secret rotate happening * @return this config object * @see AppConfigKey#SECRET_ROTATE_PERIOD */ @@ -2686,6 +2844,7 @@ protected T secretRotatePeroid(int period) { secretRotatePeriod = period; return me(); } + public int secretRotatePeriod() { if (null == secretRotatePeriod) { boolean validSetting = true; @@ -2714,6 +2873,7 @@ public int secretRotatePeriod() { } return secretRotatePeriod; } + private void _mergeSecretRotatePeriod(AppConfig config) { if (!hasConfiguration(SECRET_ROTATE_PERIOD)) { secretRotatePeriod = config.secretRotatePeriod; @@ -2722,14 +2882,17 @@ private void _mergeSecretRotatePeriod(AppConfig config) { private volatile SecureTicketCodec secureTicketCodec; private String secureTicketCodecClass; + protected T secureTicketCodec(String secureTicketCodecClass) { this.secureTicketCodecClass = $.requireNotNull(secureTicketCodecClass); return me(); } + protected T secureTicketCodec(SecureTicketCodec codec) { this.secureTicketCodec = $.requireNotNull(codec); return me(); } + public SecureTicketCodec secureTicketCodec() { if (null != secureTicketCodec) { return secureTicketCodec; @@ -2753,6 +2916,7 @@ public SecureTicketCodec secureTicketCodec() { } return secureTicketCodec; } + private void _mergeSecureTicketCodec(AppConfig config) { if (!hasConfiguration(AppConfigKey.SECURE_TICKET_CODEC)) { secureTicketCodec = config.secureTicketCodec; @@ -2761,16 +2925,19 @@ private void _mergeSecureTicketCodec(AppConfig config) { } private Boolean traceHandler; + protected T traceHandler(boolean enabled) { this.traceHandler = enabled; return me(); } + public boolean traceHandler() { if (null == traceHandler) { traceHandler = get(TRACE_HANDLER_ENABLED, false); } return traceHandler; } + private void _mergeTraceHandler(AppConfig config) { if (!hasConfiguration(TRACE_HANDLER_ENABLED)) { this.traceHandler = config.traceHandler; @@ -2778,16 +2945,19 @@ private void _mergeTraceHandler(AppConfig config) { } private Boolean traceRequest; + protected T traceRequests(boolean enabled) { this.traceRequest = enabled; return me(); } + public boolean traceRequests() { if (null == traceRequest) { traceRequest = get(TRACE_REQUEST_ENABLED, false); } return traceRequest; } + private void _mergeTraceRequests(AppConfig config) { if (!hasConfiguration(TRACE_REQUEST_ENABLED)) { this.traceRequest = config.traceRequest; @@ -2795,6 +2965,7 @@ private void _mergeTraceRequests(AppConfig config) { } private List moduleBases; + public List moduleBases() { if (null == moduleBases) { String v = get(AppConfigKey.MODULES, null); @@ -2809,7 +2980,7 @@ private List processModules(String v) { } else { List files = new ArrayList<>(); File base = app.base(); - for (String s: v.trim().split("[;:]+")) { + for (String s : v.trim().split("[;:]+")) { s = s.trim(); File file; if (s.startsWith("/") || s.startsWith("\\")) { @@ -2925,6 +3096,32 @@ public String cacheNameSession() { return _cacheNameSession; } + private void _mergeCacheNameSession(AppConfig config) { + if (!hasConfiguration(CACHE_NAME_SESSION)) { + _cacheNameSession = config._cacheNameSession; + } + } + + private Integer cacheTtl; + + protected T cacheTtl(int ttl) { + cacheTtl = ttl; + return me(); + } + + public int cacheTtl() { + if (null == cacheTtl) { + cacheTtl = getInteger(CACHE_TTL, 60); + } + return cacheTtl; + } + + private void _mergeCacheTtl(AppConfig config) { + if (!hasConfiguration(CACHE_TTL)) { + cacheTtl = config.cacheTtl; + } + } + private UnknownHttpMethodProcessor _unknownHttpMethodProcessor = null; protected T unknownHttpMethodProcessor(UnknownHttpMethodProcessor handler) { @@ -2946,10 +3143,12 @@ private void _mergeUnknownHttpMethodHandler(AppConfig config) { } private Integer resourcePreloadSizeLimit; + protected T resourcePreloadSizeLimit(int limit) { resourcePreloadSizeLimit = limit; return me(); } + public int resourcePreloadSizeLimit() { if (null == resourcePreloadSizeLimit) { resourcePreloadSizeLimit = get(RESOURCE_PRELOAD_SIZE_LIMIT, 1024 * 10); @@ -2959,6 +3158,7 @@ public int resourcePreloadSizeLimit() { } return resourcePreloadSizeLimit; } + private void _mergeResourcePreloadSizeLimit(AppConfig conf) { if (!hasConfiguration(RESOURCE_PRELOAD_SIZE_LIMIT)) { this.resourcePreloadSizeLimit = conf.resourcePreloadSizeLimit; @@ -2966,16 +3166,19 @@ private void _mergeResourcePreloadSizeLimit(AppConfig conf) { } private Integer uploadInMemoryCacheThreshold; + protected T uploadInMemoryCacheThreshold(int l) { uploadInMemoryCacheThreshold = l; return me(); } + public int uploadInMemoryCacheThreshold() { if (null == uploadInMemoryCacheThreshold) { uploadInMemoryCacheThreshold = get(UPLOAD_IN_MEMORY_CACHE_THRESHOLD, 1024 * 10); } return uploadInMemoryCacheThreshold; } + private void _mergeUploadInMemoryCacheThreshold(AppConfig config) { if (!hasConfiguration(UPLOAD_IN_MEMORY_CACHE_THRESHOLD)) { uploadInMemoryCacheThreshold = config.uploadInMemoryCacheThreshold; @@ -2983,16 +3186,19 @@ private void _mergeUploadInMemoryCacheThreshold(AppConfig config) { } private Boolean ssl; + protected T supportSsl(boolean b) { ssl = b; return me(); } + public boolean supportSsl() { if (null == ssl) { ssl = get(SSL, false); } return ssl; } + private void _mergeSslSupport(AppConfig config) { if (!hasConfiguration(SSL)) { ssl = config.ssl; @@ -3054,7 +3260,8 @@ private void loadJarProperties(Properties p) { * settings has lower priority as it's hardcoded thus only when configuration file * does not provided the settings, the app configurator will take effect * - * @param conf the application configurator + * @param conf + * the application configurator */ public void _merge(AppConfigurator conf) { app.emit(SysEventId.CONFIG_PREMERGE); @@ -3142,6 +3349,7 @@ private String getLocalizedDateTimePattern(Locale locale, DateTimeType dateTimeT private volatile DateTimeStyle dateTimeStyle; + public DateTimeStyle dateTimeStyle() { if (null == dateTimeStyle) { synchronized (this) { @@ -3154,6 +3362,7 @@ public DateTimeStyle dateTimeStyle() { } private volatile DateTimeStyle dateStyle; + public DateTimeStyle dateStyle() { if (null == dateStyle) { synchronized (this) { @@ -3166,6 +3375,7 @@ public DateTimeStyle dateStyle() { } private volatile DateTimeStyle timeStyle; + public DateTimeStyle timeStyle() { if (null == timeStyle) { synchronized (this) { diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 2443c71fb..a4f3a0a08 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -99,6 +99,13 @@ public enum AppConfigKey implements ConfigKey { */ CACHE_IMPL("cache.impl"), + /** + * `act.cache.ttl` specifies the default TTL for default cache. + * + * Default value: 60s + */ + CACHE_TTL("cache.ttl"), + /** * {@code act.cache.name} * diff --git a/src/main/java/act/conf/Config.java b/src/main/java/act/conf/Config.java index 5dde05813..de3b5ca49 100644 --- a/src/main/java/act/conf/Config.java +++ b/src/main/java/act/conf/Config.java @@ -188,9 +188,7 @@ public Map rawConfiguration() { public Map subSet(String namespace) { namespace = Config.canonical(namespace); - if (!namespace.endsWith(".")) { - namespace = namespace + "."; - } + namespace = S.ensure(namespace).endWith("."); String prefix2 = "act." + namespace; Map subset = new HashMap<>(); for (String key : raw.keySet()) { diff --git a/src/main/java/act/controller/captcha/CaptchaPluginManager.java b/src/main/java/act/controller/captcha/CaptchaManager.java similarity index 79% rename from src/main/java/act/controller/captcha/CaptchaPluginManager.java rename to src/main/java/act/controller/captcha/CaptchaManager.java index 2d15144ed..80ad3e40b 100644 --- a/src/main/java/act/controller/captcha/CaptchaPluginManager.java +++ b/src/main/java/act/controller/captcha/CaptchaManager.java @@ -30,15 +30,30 @@ import java.util.List; @Stateless -public class CaptchaPluginManager extends AppServiceBase { +public class CaptchaManager extends AppServiceBase { private List generators = new ArrayList<>(); private List imageRender = new ArrayList<>(); - public CaptchaPluginManager(App app) { + // so we can allow end to end test to by pass CAPTCHA protection + private boolean disabled; + + public CaptchaManager(App app) { super(app); } + public boolean disabled() { + return disabled; + } + + public void disable() { + this.disabled = true; + } + + public void enable() { + this.disabled = false; + } + public void registerGenerator(CaptchaSessionGenerator generator) { generators.add(generator); } diff --git a/src/main/java/act/controller/captcha/CaptchaService.java b/src/main/java/act/controller/captcha/CaptchaService.java index dc4384d29..39cf3e887 100644 --- a/src/main/java/act/controller/captcha/CaptchaService.java +++ b/src/main/java/act/controller/captcha/CaptchaService.java @@ -46,7 +46,7 @@ public class CaptchaService extends Controller.Util { private AppCrypto crypto; @Inject - private CaptchaPluginManager pluginManager; + private CaptchaManager pluginManager; @SubClassFinder public void foundSessionGenerator(CaptchaSessionGenerator generator) { diff --git a/src/main/java/act/view/rythm/Tags.java b/src/main/java/act/view/rythm/Tags.java index bf78a3217..096b921e9 100644 --- a/src/main/java/act/view/rythm/Tags.java +++ b/src/main/java/act/view/rythm/Tags.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -24,6 +24,7 @@ import act.Destroyable; import act.act_messages; import act.app.ActionContext; +import act.app.App; import act.i18n.I18n; import act.internal.util.ResourceChecksumManager; import act.job.OnAppStart; @@ -124,6 +125,31 @@ protected void call(__ParameterList params, __Body body) { } } + public static class Cached extends JavaTagBase { + @Inject + private App app; + + @Override + public String __getName() { + return "appCached"; + } + + @Override + protected void call(__ParameterList params, __Body body) { + int paramNumber = params.size(); + switch (paramNumber) { + case 1: + p(app.cache().get(S.string(params.get(0).value))); + return; + case 2: + p(app.cache(S.string(params.get(1).value)).get(S.string(params.get(0).value))); + return; + default: + throw new IllegalArgumentException("@appCached support 1 or 2 string type parameter"); + } + } + } + public static class Resource extends JavaTagBase { @Inject From 02c19037b570172889664f237d35a8658c5d8155 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 28 Jun 2018 19:47:36 +1000 Subject: [PATCH 006/730] Add pass-through mode to wave session resolution #697 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 6 ++++-- src/main/java/act/conf/AppConfig.java | 19 ++++++++++++++++++- src/main/java/act/conf/AppConfigKey.java | 8 ++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca450c939..3ec894805 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Add pass-through mode to wave session resolution #697 * Allow developer to configure app cache default TTL #696 * Provide a mechanism to disable CAPTCHA protection #694 * Allow binding epoch time millis directly to date types #691 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index c8229a11c..7c27237f9 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -96,6 +96,7 @@ public class ActionContext extends ActContext.Base implements Des private RequestHandler handler; private UserAgent ua; private String sessionKeyUsername; + private boolean sessionPassThrough; private LocaleResolver localeResolver; private boolean disableCors; private boolean disableCsrf; @@ -172,6 +173,7 @@ private ActionContext(App app, H.Request request, ActResponse response) { this.disableCors = !config.corsEnabled(); this.disableCsrf = req().method().safe(); this.sessionKeyUsername = config.sessionKeyUsername(); + this.sessionPassThrough = config.sessionPassThrough(); this.localeResolver = new LocaleResolver(this); this.sessionManager = app.sessionManager(); } @@ -1080,7 +1082,7 @@ public void logout() { public void resolve() { E.illegalStateIf(state != State.CREATED); localeResolver.resolve(); - boolean sessionFree = handler.sessionFree(); + boolean sessionFree = handler.sessionFree() || sessionPassThrough; setWasUnauthenticated(); H.Request req = req(); if (!sessionFree) { @@ -1132,7 +1134,7 @@ public void dissolve() { if (state == State.SESSION_DISSOLVED) { return; } - if (handler.sessionFree()) { + if (handler.sessionFree() || sessionPassThrough) { return; } if (null == session) { diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index ef357249f..28131f9eb 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -2611,7 +2611,24 @@ private void _mergeSessionTtl(AppConfig conf) { } } - private Boolean sessionPersistent = null; + private Boolean sessionPassThrough; + protected T sessionPassThrough(boolean b) { + sessionPassThrough = b; + return me(); + } + public boolean sessionPassThrough() { + if (null == sessionPassThrough) { + sessionPassThrough = get(SESSION_PASS_THROUGH, false); + } + return sessionPassThrough; + } + private void _mergeSessionPassThrough(AppConfig config) { + if (!hasConfiguration(SESSION_PASS_THROUGH)) { + sessionPassThrough = config.sessionPassThrough; + } + } + + private Boolean sessionPersistent; protected T sessionPersistent(boolean persistenSession) { sessionPersistent = persistenSession; diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index a4f3a0a08..90d77a5fc 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -996,6 +996,14 @@ public T val(Map configuration) { */ SESSION_OUTPUT_EXPIRATION("session.outputExpiration.enabled"), + /** + * `session.pass_through` turn on/off session pass through mode. + * + * When session pass_through is turned on the framework will not + * tried to resolve or serialize the session + */ + SESSION_PASS_THROUGH("session.pass_through.enabled"), + /** * `session.ttl` specifies the session duration in seconds. * If user failed to interact with server for amount of time that From c45da25a20b3dc12520b7273f04b43ac96ac1b1a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 28 Jun 2018 19:54:00 +1000 Subject: [PATCH 007/730] minor tune of sessionPassThrough config --- src/main/java/act/conf/AppConfig.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 28131f9eb..54db53ef9 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -2611,13 +2611,14 @@ private void _mergeSessionTtl(AppConfig conf) { } } - private Boolean sessionPassThrough; + private boolean sessionPassThrough; + private boolean sessionPassThroughSet; // use this to save auto-box of sessionPassThrough flag protected T sessionPassThrough(boolean b) { sessionPassThrough = b; return me(); } public boolean sessionPassThrough() { - if (null == sessionPassThrough) { + if (!sessionPassThroughSet) { sessionPassThrough = get(SESSION_PASS_THROUGH, false); } return sessionPassThrough; From d9f95cea04ac7c30f6af118d681b3682cc26b015 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 30 Jun 2018 18:05:20 +1000 Subject: [PATCH 008/730] fix Make `SessionFree`, `NonBlock` and `SkipBuiltInEvents` annotation support at class level #703 --- CHANGELOG.md | 1 + pom.xml | 2 +- .../act/controller/ExpressController.java | 39 +++++++++++++++++++ src/main/java/act/handler/NonBlock.java | 2 +- .../java/act/handler/SkipBuiltInEvents.java | 7 +--- .../impl/ReflectedHandlerInvoker.java | 13 +++++-- 6 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 src/main/java/act/controller/ExpressController.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ec894805..8adeab093 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Make `SessionFree`, `NonBlock` and `SkipBuiltInEvents` annotation support at class level #703 * Add pass-through mode to wave session resolution #697 * Allow developer to configure app cache default TTL #696 * Provide a mechanism to disable CAPTCHA protection #694 diff --git a/pom.xml b/pom.xml index 1c01f93da..863f1e430 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 1.5.0 1.8.0 1.8.0 - 1.8.0 + 1.8.1-SNAPSHOT 1.7.0 1.2.0 2.0.0-BETA-1 diff --git a/src/main/java/act/controller/ExpressController.java b/src/main/java/act/controller/ExpressController.java new file mode 100644 index 000000000..b4c8593ce --- /dev/null +++ b/src/main/java/act/controller/ExpressController.java @@ -0,0 +1,39 @@ +package act.controller; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Mark a class as an express controller. + * + * All request handlers in an express controller are automated treated as marked by: + * * {@link act.handler.NonBlock} + * * {@link org.osgl.mvc.annotation.SessionFree} + * * {@link act.handler.SkipBuiltInEvents} + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface ExpressController { +} diff --git a/src/main/java/act/handler/NonBlock.java b/src/main/java/act/handler/NonBlock.java index 6287d1e94..6ecb03c76 100644 --- a/src/main/java/act/handler/NonBlock.java +++ b/src/main/java/act/handler/NonBlock.java @@ -32,6 +32,6 @@ * method the handler will be treated as an {@link ExpressHandler} */ @Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) +@Target({ElementType.METHOD, ElementType.TYPE}) public @interface NonBlock { } diff --git a/src/main/java/act/handler/SkipBuiltInEvents.java b/src/main/java/act/handler/SkipBuiltInEvents.java index a93050407..d928133da 100644 --- a/src/main/java/act/handler/SkipBuiltInEvents.java +++ b/src/main/java/act/handler/SkipBuiltInEvents.java @@ -22,10 +22,7 @@ import act.app.ActionContext; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * Mark a request handling method shall skip result commit events triggering @@ -34,6 +31,6 @@ * {@link RequestHandler#skipEvents(ActionContext)} returns `true`. */ @Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) +@Target({ElementType.METHOD, ElementType.TYPE}) public @interface SkipBuiltInEvents { } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 7ccea4a69..3f7454c38 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -30,6 +30,7 @@ import act.conf.AppConfig; import act.controller.CacheSupportMetaInfo; import act.controller.Controller; +import act.controller.ExpressController; import act.controller.annotation.HandleCsrfFailure; import act.controller.annotation.HandleMissingAuthentication; import act.controller.annotation.Throttled; @@ -233,9 +234,15 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { handlerMetaInfo.dateFormatPattern(this.dateFormatPattern); } - sessionFree = method.isAnnotationPresent(SessionFree.class); - express = method.isAnnotationPresent(NonBlock.class); - skipEvents = method.isAnnotationPresent(SkipBuiltInEvents.class); + if (controllerClass.isAnnotationPresent(ExpressController.class)) { + sessionFree = true; + express = true; + skipEvents = true; + } else { + sessionFree = hasAnnotation(SessionFree.class); + express = hasAnnotation(NonBlock.class); + skipEvents = hasAnnotation(SkipBuiltInEvents.class); + } noTemplateCache = method.isAnnotationPresent(Template.NoCache.class); paramCount = handler.paramCount(); From 341e38abfd723302879dc4cf53200922fecab661 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 30 Jun 2018 18:17:23 +1000 Subject: [PATCH 009/730] When `Accept` is not specified or unknown then use JSON as the output content type #704 --- CHANGELOG.md | 1 + src/main/java/act/controller/Controller.java | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8adeab093..2e8be122d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* When `Accept` is not specified or unknown then use JSON as the output content type #704 * Make `SessionFree`, `NonBlock` and `SkipBuiltInEvents` annotation support at class level #703 * Add pass-through mode to wave session resolution #697 * Allow developer to configure app cache default TTL #696 diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 4982649ff..60e168710 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1557,6 +1557,13 @@ public static Result inferPrimitiveResult(Object v, ActionContext actionContext, return new RenderBinary((byte[]) v); } else { H.Format fmt = actionContext.accept(); + if (H.Format.UNKNOWN == fmt) { + // use JSON by default + if (isArray) { + return RenderJSON.of(status, $.toString2(v)); + } + return RenderJSON.of(status, C.Map("result", v)); + } String s = $$.toString(v, isDateTime, isArray); if (HTML == fmt || H.Format.UNKNOWN == fmt) { return RenderHtml.of(status, s); @@ -1697,7 +1704,7 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } else if (v instanceof Map) { return RenderJSON.of(status, v); } else { - if (requireJSON) { + if (requireJSON || H.Format.UNKNOWN == context.req().accept()) { boolean isIterable = v instanceof Iterable; if (isIterable) { v = new FastJsonIterable((Iterable) v); From b9f1a066025eee9517d9d565f91203ee3a02764f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 30 Jun 2018 20:36:07 +1000 Subject: [PATCH 010/730] fix #705 and #706 --- CHANGELOG.md | 2 + .../bytecode/ReflectedCommandExecutor.java | 15 ++++++-- .../impl/ReflectedHandlerInvoker.java | 8 +++- src/main/java/act/util/ActContext.java | 14 +++++++ .../util/EnableCircularReferenceDetect.java | 37 +++++++++++++++++++ src/main/java/act/util/JsonUtilConfig.java | 14 ++----- 6 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 src/main/java/act/util/EnableCircularReferenceDetect.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e8be122d..45d569475 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Create an annotation to force application to add `DisableCircularReferenceDetect` to FastJSON #706 +* Add `DisableCircularReferenceDetect` feature to FastJSON by default #705 * When `Accept` is not specified or unknown then use JSON as the output content type #704 * Make `SessionFree`, `NonBlock` and `SkipBuiltInEvents` annotation support at class level #703 * Add pass-through mode to wave session resolution #697 diff --git a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java index 573ffb29e..77e41c991 100644 --- a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java +++ b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java @@ -32,16 +32,14 @@ import act.inject.param.ParamValueLoaderManager; import act.job.JobManager; import act.job.TrackableWorker; -import act.util.Async; -import act.util.FastJsonFeature; -import act.util.FastJsonFilter; -import act.util.ProgressGauge; +import act.util.*; import com.alibaba.fastjson.serializer.SerializeFilter; import com.alibaba.fastjson.serializer.SerializerFeature; import com.esotericsoftware.reflectasm.MethodAccess; import org.osgl.$; import org.osgl.util.E; +import java.lang.annotation.Annotation; import java.lang.reflect.Method; /** @@ -69,6 +67,7 @@ public class ReflectedCommandExecutor extends CommandExecutor { private String dateFormatPattern; private Class filters[]; private SerializerFeature features[]; + private boolean enableCircularReferenceDetect = false; public ReflectedCommandExecutor(CommandMethodMetaInfo methodMetaInfo, App app) { this.methodMetaInfo = $.requireNotNull(methodMetaInfo); @@ -109,6 +108,7 @@ public ReflectedCommandExecutor(CommandMethodMetaInfo methodMetaInfo, App app) { } } this.paramLoaderService = app.service(ParamValueLoaderManager.class).get(CliContext.class); + this.enableCircularReferenceDetect = hasAnnotation(EnableCircularReferenceDetect.class); this.buildParsingContext(); } @@ -121,6 +121,9 @@ public Object execute(CliContext context) { context.fastjsonFeatures(features); context.fastjsonFilters(filters); context.prepare(parsingContext); + if (enableCircularReferenceDetect) { + context.enableCircularReferenceDetect(); + } paramLoaderService.preParseOptions(method, methodMetaInfo, context); final Object cmd = commanderInstance(context); final Object[] params = params(cmd, context); @@ -200,6 +203,10 @@ private Object invoke(Object commander, Object[] params) { return result; } + private boolean hasAnnotation(Class type) { + return method.isAnnotationPresent(type) || commanderClass.isAnnotationPresent(type); + } + private void buildParsingContext() { CliContextParamLoader loader = app.service(ParamValueLoaderManager.class).get(CliContext.class); this.parsingContext = loader.buildParsingContext(commanderClass, method, methodMetaInfo); diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 3f7454c38..304eed9f1 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -156,6 +156,7 @@ public void visit(H.Format format) throws $.Break { private $.Function pluginBeforeHandler; private $.Func2 pluginAfterHandler; private Map attributes = new HashMap<>(); + private boolean enableCircularReferenceDetect; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -220,6 +221,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { if (null != featureAnno) { features = featureAnno.value(); } + enableCircularReferenceDetect = hasAnnotation(EnableCircularReferenceDetect.class); DateFormatPattern pattern = method.getAnnotation(DateFormatPattern.class); if (null != pattern) { @@ -406,6 +408,10 @@ public Result handle(final ActionContext context) { context.markAsRequireCaptcha(); } + if (enableCircularReferenceDetect) { + context.enableCircularReferenceDetect(); + } + context.setReflectedHandlerInvoker(this); app.eventBus().emit(new ReflectedHandlerInvokerInvoke(this, context)); @@ -611,10 +617,10 @@ private String patchedJsonBody(ActionContext context) { return body; } String theName = singleJsonFieldName(context); - int theNameLen = theName.length(); if (null == theName) { return body; } + int theNameLen = theName.length(); body = body.trim(); boolean needPatch = body.charAt(0) == '['; if (!needPatch) { diff --git a/src/main/java/act/util/ActContext.java b/src/main/java/act/util/ActContext.java index 85c0c6e6c..4c48b1331 100644 --- a/src/main/java/act/util/ActContext.java +++ b/src/main/java/act/util/ActContext.java @@ -242,6 +242,9 @@ public interface ActContext extends ParamValueProvi String dateFormatPattern(); + boolean isDisableCircularReferenceDetect(); + + interface Listener { void onDestroy(ActContext context); } @@ -272,6 +275,7 @@ abstract class Base extends DestroyableBase private Class[] fastjsonFilters; private SerializerFeature[] fastjsonFeatures; private String dateFormatPattern; + private boolean disableCircularReferenceDetect = true; public Base(App app) { this(app, false); @@ -560,6 +564,16 @@ public Map i18n(Class bundleSpec, Class enumC return I18n.i18n(locale(true), bundleSpec, enumClass, outputProperties); } + public CTX enableCircularReferenceDetect() { + disableCircularReferenceDetect = false; + return me(); + } + + public boolean isDisableCircularReferenceDetect() { + return disableCircularReferenceDetect; + } + + protected CTX me() { return (CTX) this; } diff --git a/src/main/java/act/util/EnableCircularReferenceDetect.java b/src/main/java/act/util/EnableCircularReferenceDetect.java new file mode 100644 index 000000000..5a9a4756c --- /dev/null +++ b/src/main/java/act/util/EnableCircularReferenceDetect.java @@ -0,0 +1,37 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Mark on a class or method so it enables FastJSON's circular reference detect. + * + * If it is marked on a class, then all request handler methods in this class is + * subject to circular reference detect. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface EnableCircularReferenceDetect { +} diff --git a/src/main/java/act/util/JsonUtilConfig.java b/src/main/java/act/util/JsonUtilConfig.java index 5bb9804d1..03109f41f 100644 --- a/src/main/java/act/util/JsonUtilConfig.java +++ b/src/main/java/act/util/JsonUtilConfig.java @@ -53,8 +53,7 @@ public static class JsonWriter extends $.Visitor { private SerializerFeature[] features; private SerializeFilter[] filters; private DateFormat dateFormat; - private boolean disableCircularReferenceDetect; - private boolean hasPropFilter; + private boolean disableCircularReferenceDetect = true; public JsonWriter(Object v, PropertySpec.MetaInfo spec, boolean format, ActContext context) { if (null == v) { @@ -88,21 +87,15 @@ public JsonWriter(Object v, PropertySpec.MetaInfo spec, boolean format, ActConte } else { this.dateFormat = new SimpleDateFormat(dateFormatPattern, locale); } + this.disableCircularReferenceDetect = context.isDisableCircularReferenceDetect(); this.filters = initFilters(v, spec, context); this.features = initFeatures(format, context); } } - public void disableCircularReferenceDetect() { - disableCircularReferenceDetect = true; - } - private SerializeFilter[] initFilters(Object v, PropertySpec.MetaInfo spec, ActContext context) { Set filterSet = new LinkedHashSet<>(); FastJsonPropertyPreFilter propertyFilter = initPropertyPreFilter(v, spec, context); - if (null != propertyFilter) { - hasPropFilter = true; - } if (null != spec && null != context) { MappedFastJsonNameFilter nameFilter = new MappedFastJsonNameFilter(spec.labelMapping(context)); filterSet.add(nameFilter); @@ -216,7 +209,8 @@ public static void configure(final App app) { MvcConfig.jsonSerializer(new $.Func2() { @Override public Void apply(Writer writer, Object v) throws NotAppliedException, $.Break { - new JsonWriter(v, null, false, ActContext.Base.currentContext()).apply(writer); + ActContext ctx = ActContext.Base.currentContext(); + new JsonWriter(v, null, false, ctx).apply(writer); return null; } }); From ed0182479daaad0fef7b595cca12e034818a5696 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 30 Jun 2018 22:24:08 +1000 Subject: [PATCH 011/730] fix ACT-1.8.8-RC11 performance issue with Fortunes mustache templates --- CHANGELOG.md | 1 + .../java/act/xio/undertow/UndertowResponse.java | 4 +++- .../act/xio/undertow/UndertowResponseOutput.java | 13 ++++++++----- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45d569475..41fb0a858 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Add `DisableCircularReferenceDetect` feature to FastJSON by default #705 * When `Accept` is not specified or unknown then use JSON as the output content type #704 * Make `SessionFree`, `NonBlock` and `SkipBuiltInEvents` annotation support at class level #703 +* ACT-1.8.8-RC11 performance issue with Fortunes mustache templates #698 * Add pass-through mode to wave session resolution #697 * Allow developer to configure app cache default TTL #696 * Provide a mechanism to disable CAPTCHA protection #694 diff --git a/src/main/java/act/xio/undertow/UndertowResponse.java b/src/main/java/act/xio/undertow/UndertowResponse.java index ae8e142fd..b9d33ddad 100644 --- a/src/main/java/act/xio/undertow/UndertowResponse.java +++ b/src/main/java/act/xio/undertow/UndertowResponse.java @@ -363,7 +363,9 @@ private File tryGetFileFrom(ISObject sobj) { @Override protected Writer createWriter() { - return blocking() ? super.createWriter() : new UndertowResponseOutput(this); + // TODO #698 - understand why the following line cause performance issue + //return blocking() ? super.createWriter() : new UndertowResponseOutput(this); + return super.createWriter(); } @Override diff --git a/src/main/java/act/xio/undertow/UndertowResponseOutput.java b/src/main/java/act/xio/undertow/UndertowResponseOutput.java index 2d07ec205..b1db4cb1a 100644 --- a/src/main/java/act/xio/undertow/UndertowResponseOutput.java +++ b/src/main/java/act/xio/undertow/UndertowResponseOutput.java @@ -77,9 +77,14 @@ public void write(char[] cbuf, int off, int len) { } public UndertowResponseOutput append(char str[], int offset, int len) { - char[] payload = new char[len]; - System.arraycopy(str, offset, payload, 0, len); - byte[] bytes = toBytes(payload); + byte[] bytes; + if (0 == offset && len == str.length) { + bytes = toBytes(str); + } else { + char[] payload = new char[len]; + System.arraycopy(str, offset, payload, 0, len); + bytes = toBytes(payload); + } return append(bytes); } @@ -136,8 +141,6 @@ private static byte[] toBytes(char[] chars) { ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer); byte[] bytes = Arrays.copyOfRange(byteBuffer.array(), byteBuffer.position(), byteBuffer.limit()); - Arrays.fill(charBuffer.array(), '\u0000'); // clear sensitive data - Arrays.fill(byteBuffer.array(), (byte) 0); // clear sensitive data return bytes; } } From 4d35cdb1a7a556d539928b1074c3c194290e1ce6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 4 Jul 2018 21:14:59 +1000 Subject: [PATCH 012/730] fix API doc - provide a mechanism allow plugin sample data generator #709 --- CHANGELOG.md | 1 + pom.xml | 15 +- src/main/java/act/apidoc/Endpoint.java | 32 +- src/main/java/act/apidoc/SampleData.java | 54 ++ .../java/act/apidoc/SampleDataCategory.java | 103 ++++ .../java/act/apidoc/SampleDataProvider.java | 60 +++ .../act/apidoc/SampleDataProviderFinder.java | 40 ++ .../act/apidoc/SampleDataProviderManager.java | 168 ++++++ .../sampledata/CompanyNameProvider.java | 31 ++ .../apidoc/sampledata/DobJDKDateProvider.java | 49 ++ .../sampledata/DobJodaDateTimeProvider.java | 46 ++ .../sampledata/DobJodaLocalDateProvider.java | 46 ++ .../DobJodaLocalDateTimeProvider.java | 46 ++ .../apidoc/sampledata/DobStringProvider.java | 51 ++ .../act/apidoc/sampledata/EmailProvider.java | 47 ++ .../apidoc/sampledata/FirstNameProvider.java | 31 ++ .../apidoc/sampledata/FullNameProvider.java | 42 ++ .../act/apidoc/sampledata/HostProvider.java | 31 ++ .../apidoc/sampledata/LastNameProvider.java | 31 ++ .../act/apidoc/sampledata/MobileProvider.java | 31 ++ .../apidoc/sampledata/NamedListProvider.java | 45 ++ .../act/apidoc/sampledata/PhoneProvider.java | 31 ++ .../apidoc/sampledata/PostCodeProvider.java | 31 ++ .../sampledata/RandomStringProvider.java | 32 ++ .../act/apidoc/sampledata/StateProvider.java | 31 ++ .../act/apidoc/sampledata/StreetProvider.java | 31 ++ .../apidoc/sampledata/StringListProvider.java | 72 +++ .../sampledata/StringListStringProvider.java | 28 + .../act/apidoc/sampledata/SuburbProvider.java | 31 ++ src/main/java/act/app/App.java | 11 + src/main/java/act/conf/AppConfig.java | 2 +- src/main/resources/act.scan.list | 1 + .../sampledata/~act/companyname.list | 500 ++++++++++++++++++ .../resources/sampledata/~act/firstname.list | 500 ++++++++++++++++++ src/main/resources/sampledata/~act/host.list | 495 +++++++++++++++++ .../resources/sampledata/~act/lastname.list | 500 ++++++++++++++++++ .../resources/sampledata/~act/mobile.list | 500 ++++++++++++++++++ src/main/resources/sampledata/~act/phone.list | 500 ++++++++++++++++++ .../resources/sampledata/~act/postcode.list | 500 ++++++++++++++++++ src/main/resources/sampledata/~act/state.list | 7 + .../resources/sampledata/~act/street.list | 500 ++++++++++++++++++ .../resources/sampledata/~act/suburb.list | 500 ++++++++++++++++++ 42 files changed, 5784 insertions(+), 19 deletions(-) create mode 100644 src/main/java/act/apidoc/SampleData.java create mode 100644 src/main/java/act/apidoc/SampleDataCategory.java create mode 100644 src/main/java/act/apidoc/SampleDataProvider.java create mode 100644 src/main/java/act/apidoc/SampleDataProviderFinder.java create mode 100644 src/main/java/act/apidoc/SampleDataProviderManager.java create mode 100644 src/main/java/act/apidoc/sampledata/CompanyNameProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/DobJDKDateProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/DobJodaDateTimeProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/DobJodaLocalDateProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/DobJodaLocalDateTimeProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/DobStringProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/EmailProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/FirstNameProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/FullNameProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/HostProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/LastNameProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/MobileProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/NamedListProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/PhoneProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/PostCodeProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/RandomStringProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/StateProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/StreetProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/StringListProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/StringListStringProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/SuburbProvider.java create mode 100644 src/main/resources/sampledata/~act/companyname.list create mode 100644 src/main/resources/sampledata/~act/firstname.list create mode 100644 src/main/resources/sampledata/~act/host.list create mode 100644 src/main/resources/sampledata/~act/lastname.list create mode 100644 src/main/resources/sampledata/~act/mobile.list create mode 100644 src/main/resources/sampledata/~act/phone.list create mode 100644 src/main/resources/sampledata/~act/postcode.list create mode 100644 src/main/resources/sampledata/~act/state.list create mode 100644 src/main/resources/sampledata/~act/street.list create mode 100644 src/main/resources/sampledata/~act/suburb.list diff --git a/CHANGELOG.md b/CHANGELOG.md index 41fb0a858..7817a35e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* API doc - provide a mechanism allow plugin sample data generator #709 * Create an annotation to force application to add `DisableCircularReferenceDetect` to FastJSON #706 * Add `DisableCircularReferenceDetect` feature to FastJSON by default #705 * When `Accept` is not specified or unknown then use JSON as the output content type #704 diff --git a/pom.xml b/pom.xml index 863f1e430..42d474e3b 100644 --- a/pom.xml +++ b/pom.xml @@ -91,18 +91,14 @@ src/main/resources true - **/act.scan.list - **/aaa.authenticate.list **/*.version **/*.properties **/*.xml **/*.csv + **/*.list **/*.txt **/*.css **/*.js - **/*.png - **/*.jpg - **/*.gif **/*.json **/*.html **/*.tag @@ -110,6 +106,15 @@ *.flf + + src/main/resources + false + + **/*.gif + **/*.png + **/*.jpg + + diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index ebdfa0681..fe25388a0 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -43,6 +43,7 @@ import org.osgl.logging.Logger; import org.osgl.mvc.result.Result; import org.osgl.storage.ISObject; +import org.osgl.storage.impl.SObject; import org.osgl.util.*; import java.lang.annotation.Annotation; @@ -195,6 +196,7 @@ public enum Scheme { private String sampleQuery; private Class controllerClass; private Locale defLocale; + private transient SampleDataProviderManager sampleDataProviderManager; Endpoint(int port, H.Method httpMethod, String path, RequestHandler handler) { AppConfig conf = Act.appConfig(); @@ -204,6 +206,7 @@ public enum Scheme { this.handler = handler.toString(); this.port = port; this.defLocale = conf.locale(); + this.sampleDataProviderManager = Act.app().sampleDataProviderManager(); explore(handler); } @@ -497,7 +500,9 @@ private String generateSampleQuery(BeanSpec spec, String bindName, Set typ return bindName + "="; } if (null != stringValueResolver(type)) { - return bindName + "=" + S.random(5); + SampleData.Category anno = spec.getAnnotation(SampleData.Category.class); + SampleDataCategory category = null != anno ? anno.value() : null; + return bindName + "=" + sampleDataProviderManager.getSampleData(category, bindName, String.class); } List queryPairs = new ArrayList<>(); List fields = $.fieldsOf(type); @@ -545,6 +550,8 @@ private Object generateSampleData(BeanSpec spec, Set typeChain, List classType = spec.rawType(); try { if (void.class == classType || Void.class == classType || Result.class.isAssignableFrom(classType)) { @@ -561,11 +568,11 @@ private Object generateSampleData(BeanSpec spec, Set typeChain, List typeChain, List"; + return sampleDataProviderManager.getSampleData(category, name, Date.class); } else if (BigDecimal.class == classType) { return BigDecimal.valueOf(1.1); } else if (BigInteger.class == classType) { return BigInteger.valueOf(1); } else if (ISObject.class.isAssignableFrom(classType)) { - return null; + return SObject.of("blob data"); } else if (Map.class.isAssignableFrom(classType)) { Map map = $.cast(Act.getInstance(classType)); List typeParams = spec.typeParams(); @@ -632,11 +637,12 @@ private Object generateSampleData(BeanSpec spec, Set typeChain, List fields = $.fieldsOf(classType); for (Field field : fields) { if (Modifier.isStatic(field.getModifiers())) { diff --git a/src/main/java/act/apidoc/SampleData.java b/src/main/java/act/apidoc/SampleData.java new file mode 100644 index 000000000..9f755f3dc --- /dev/null +++ b/src/main/java/act/apidoc/SampleData.java @@ -0,0 +1,54 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Namespace + */ +public abstract class SampleData { + private SampleData() {} + + /** + * Marked on an implementation class of {@link SampleDataProvider} + * to specify the sample data category the provider applied + */ + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.TYPE, ElementType.FIELD}) + public @interface Category { + SampleDataCategory value(); + } + + /** + * Marked on an implementation class of {@link SampleDataProvider} + * to specify the sample data locale the provider applied + */ + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.TYPE, ElementType.FIELD}) + public @interface Locale { + String value(); + } + +} diff --git a/src/main/java/act/apidoc/SampleDataCategory.java b/src/main/java/act/apidoc/SampleDataCategory.java new file mode 100644 index 000000000..b42312718 --- /dev/null +++ b/src/main/java/act/apidoc/SampleDataCategory.java @@ -0,0 +1,103 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.C; +import org.osgl.util.Keyword; +import org.osgl.util.S; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public enum SampleDataCategory { + FIRST_NAME("given name", "forename", "firstname", "fname"), + LAST_NAME("surname", "family name", "lname", "lastname"), + FULL_NAME("fullname"), + DOB("Birthday", "生日", "DateOfBirth", "*date", "date*"), + EMAIL, + HOST, + STREET, + SUBURB("city"), + POSTCODE("postalCode", "postalcode", "post", "postCode"), + PHONE("landphone", "landline", "landLine", "landPhone", "tel", "phoneNumber"), + MOBILE("mobilePhone", "cellularPhone", "mobileNo", "mobileNumber"), + STATE("province"), + COMPANY_NAME("clientName", "client", "company", "organizationName", "organisationName", "organization", "organisation"), + PERMISSION, + PERMISSIONS, + ROLE, + ROLES, + PRIVILEGE, + ; + + private Set aliases = C.Set(); + + SampleDataCategory() {} + + SampleDataCategory(String ... aliases) { + this.aliases = C.setOf(aliases); + } + + private Set aliases() { + return aliases; + } + + private static Map lookup = new HashMap<>(); + private static Map prefixLookup = new HashMap<>(); + private static Map suffixLookup = new HashMap<>(); + static { + for (SampleDataCategory c : SampleDataCategory.values()) { + lookup.put(Keyword.of(c.name()), c); + for (String s : c.aliases()) { + if (s.startsWith("*")) { + suffixLookup.put(s.substring(1).toLowerCase(), c); + } else if (s.endsWith("*")) { + prefixLookup.put(s.substring(0, s.length() - 1).toLowerCase(), c); + } else { + lookup.put(Keyword.of(s), c); + } + } + } + } + + public static SampleDataCategory of(String s) { + if (S.blank(s)) { + return null; + } + SampleDataCategory category = lookup.get(Keyword.of(s)); + if (null != category) { + return category; + } + s = s.toLowerCase(); + for (Map.Entry entry : prefixLookup.entrySet()) { + if (s.startsWith(entry.getKey())) { + return entry.getValue(); + } + } + for (Map.Entry entry : suffixLookup.entrySet()) { + if (s.endsWith(entry.getKey())) { + return entry.getValue(); + } + } + return S.blank(s) ? null : lookup.get(Keyword.of(s)); + } +} diff --git a/src/main/java/act/apidoc/SampleDataProvider.java b/src/main/java/act/apidoc/SampleDataProvider.java new file mode 100644 index 000000000..f58efcf60 --- /dev/null +++ b/src/main/java/act/apidoc/SampleDataProvider.java @@ -0,0 +1,60 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.util.LogSupport; +import org.osgl.util.Generics; + +import java.lang.reflect.Type; +import java.util.List; + +public abstract class SampleDataProvider extends LogSupport { + + private Class targetType; + + public SampleDataProvider() { + exploreType(); + } + + public abstract T get(); + + public Class targetType() { + return targetType; + } + + private void exploreType() { + List types = Generics.typeParamImplementations(getClass(), SampleDataProvider.class); + if (types.size() != 1) { + warnTargetTypeNotDetermined(); + } else { + Type type = types.get(0); + if (! (type instanceof Class)) { + warnTargetTypeNotDetermined(); + } else { + targetType = (Class) type; + } + } + } + + private void warnTargetTypeNotDetermined() { + warn("Cannot determine target type of SampleDataProvider: " + getClass()); + } +} diff --git a/src/main/java/act/apidoc/SampleDataProviderFinder.java b/src/main/java/act/apidoc/SampleDataProviderFinder.java new file mode 100644 index 000000000..4fb6b63f9 --- /dev/null +++ b/src/main/java/act/apidoc/SampleDataProviderFinder.java @@ -0,0 +1,40 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.event.SysEventId; +import act.job.OnSysEvent; +import act.util.SubClassFinder; + +public class SampleDataProviderFinder { + + @SubClassFinder + public void foundSampleDataProvider(SampleDataProvider provider) { + Act.app().sampleDataProviderManager().foundSampleDataProvider(provider); + } + + @OnSysEvent(SysEventId.EVENT_BUS_INITIALIZED) + public void reset() { + Act.app().sampleDataProviderManager().reset(); + } + +} diff --git a/src/main/java/act/apidoc/SampleDataProviderManager.java b/src/main/java/act/apidoc/SampleDataProviderManager.java new file mode 100644 index 000000000..c38d41185 --- /dev/null +++ b/src/main/java/act/apidoc/SampleDataProviderManager.java @@ -0,0 +1,168 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.sampledata.NamedListProvider; +import act.app.App; +import act.app.AppServiceBase; +import act.app.event.SysEventId; +import act.job.OnSysEvent; +import act.util.SubClassFinder; + +import java.util.*; + +public class SampleDataProviderManager extends AppServiceBase { + + private static class Key { + String className; + SampleDataCategory category; + Locale locale; + + Key(String className, SampleDataCategory category, Locale locale) { + this.className = className; + this.category = category; + this.locale = locale; + } + + Key(Class type, SampleDataCategory category, Locale locale) { + this.className = type.getName(); + this.category = category; + this.locale = locale; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Key key = (Key) o; + return Objects.equals(className, key.className) && + category == key.category && + Objects.equals(locale, key.locale); + } + + @Override + public int hashCode() { + return Objects.hash(className, category, locale); + } + + List broaderKeys() { + List list = new ArrayList<>(); + if (locale != null) { + String country = locale.getCountry(); + String language = locale.getLanguage(); + String variant = locale.getVariant(); + if (null != variant) { + list.add(new Key(className, category, new Locale(language, country))); + } else if (null != country) { + list.add(new Key(className, category, new Locale(language))); + } else { + list.add(new Key(className, category, null)); + } + } + if (category != null) { + list.add(new Key(className, null, locale)); + } + return list; + } + } + + private Map repo = new HashMap<>(); + + public SampleDataProviderManager(App app) { + super(app); + } + + @Override + protected void releaseResources() { + repo.clear(); + } + + @OnSysEvent(SysEventId.EVENT_BUS_INITIALIZED) + public void reset() { + repo.clear(); + } + + @SubClassFinder + public void foundSampleDataProvider(SampleDataProvider provider) { + Class targetType = provider.targetType(); + if (targetType == NamedListProvider.class) { + return; + } + if (null != targetType) { + Key key = new Key(targetType, null, null); + SampleData.Category c = provider.getClass().getAnnotation(SampleData.Category.class); + if (null != c) { + key.category = c.value(); + } + SampleData.Locale l = provider.getClass().getAnnotation(SampleData.Locale.class); + if (null != l) { + String s = l.value(); + Locale locale = Locale.forLanguageTag(s); + key.locale = locale; + } + repo.put(key, provider); + for (Key k2 : key.broaderKeys()) { + registerForBroaderKey(k2, provider); + } + } + } + + private void registerForBroaderKey(Key key, SampleDataProvider provider) { + if (!repo.containsKey(key)) { + repo.put(key, provider); + } + for (Key k2 : key.broaderKeys()) { + registerForBroaderKey(k2, provider); + } + } + + public T getSampleData(SampleDataCategory category, String fieldName, Class type) { + return getSampleData(category, fieldName, null, type); + } + + public T getSampleData(SampleDataCategory category, String fieldName, Locale locale, Class type) { + Key key = new Key(type, categoryOf(category, fieldName), locale); + return getSampleData(key); + } + + private T getSampleData(Key key) { + SampleDataProvider provider = getProvider(key); + return null == provider ? null : provider.get(); + } + + private SampleDataProvider getProvider(Key key) { + SampleDataProvider provider = repo.get(key); + if (null == provider) { + List keys = key.broaderKeys(); + for (Key k2 : keys) { + provider = getProvider(k2); + if (null != provider) { + return provider; + } + } + } + return provider; + } + + private static SampleDataCategory categoryOf(SampleDataCategory category, String name) { + return null != category ? category : SampleDataCategory.of(name); + } +} diff --git a/src/main/java/act/apidoc/sampledata/CompanyNameProvider.java b/src/main/java/act/apidoc/sampledata/CompanyNameProvider.java new file mode 100644 index 000000000..3018910a8 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/CompanyNameProvider.java @@ -0,0 +1,31 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.COMPANY_NAME) +public class CompanyNameProvider extends StringListStringProvider { +} diff --git a/src/main/java/act/apidoc/sampledata/DobJDKDateProvider.java b/src/main/java/act/apidoc/sampledata/DobJDKDateProvider.java new file mode 100644 index 000000000..de49a7f17 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/DobJDKDateProvider.java @@ -0,0 +1,49 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; + +import java.text.SimpleDateFormat; +import java.util.Date; +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.DOB) +public class DobJDKDateProvider extends SampleDataProvider { + + @Inject + private DobStringProvider provider; + + private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + + @Override + public Date get() { + try { + return format.parse(provider.get()); + } catch (Exception e) { + return new Date(); + } + } +} diff --git a/src/main/java/act/apidoc/sampledata/DobJodaDateTimeProvider.java b/src/main/java/act/apidoc/sampledata/DobJodaDateTimeProvider.java new file mode 100644 index 000000000..c697a1575 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/DobJodaDateTimeProvider.java @@ -0,0 +1,46 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.DOB) +public class DobJodaDateTimeProvider extends SampleDataProvider { + + @Inject + private DobStringProvider provider; + + private DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd"); + + @Override + public DateTime get() { + return format.parseDateTime(provider.get()); + } +} diff --git a/src/main/java/act/apidoc/sampledata/DobJodaLocalDateProvider.java b/src/main/java/act/apidoc/sampledata/DobJodaLocalDateProvider.java new file mode 100644 index 000000000..4477429bf --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/DobJodaLocalDateProvider.java @@ -0,0 +1,46 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; +import org.joda.time.LocalDate; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.DOB) +public class DobJodaLocalDateProvider extends SampleDataProvider { + + @Inject + private DobStringProvider provider; + + private DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd"); + + @Override + public LocalDate get() { + return format.parseLocalDate(provider.get()); + } +} diff --git a/src/main/java/act/apidoc/sampledata/DobJodaLocalDateTimeProvider.java b/src/main/java/act/apidoc/sampledata/DobJodaLocalDateTimeProvider.java new file mode 100644 index 000000000..c99413e90 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/DobJodaLocalDateTimeProvider.java @@ -0,0 +1,46 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; +import org.joda.time.LocalDateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.DOB) +public class DobJodaLocalDateTimeProvider extends SampleDataProvider { + + @Inject + private DobStringProvider provider; + + private DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd"); + + @Override + public LocalDateTime get() { + return format.parseLocalDateTime(provider.get()); + } +} diff --git a/src/main/java/act/apidoc/sampledata/DobStringProvider.java b/src/main/java/act/apidoc/sampledata/DobStringProvider.java new file mode 100644 index 000000000..0c39de837 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/DobStringProvider.java @@ -0,0 +1,51 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; +import org.osgl.$; +import org.osgl.util.IntRange; +import org.osgl.util.S; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.DOB) +public class DobStringProvider extends SampleDataProvider { + @Override + public String get() { + return S.join("-", randYear(), randMon(), randDoM()); + } + + private String randYear() { + return S.string($.random(IntRange.of(1940, 2018))); + } + + private String randMon() { + return S.string($.random(IntRange.of(1, 13))); + } + + private String randDoM() { + return S.string($.random(IntRange.of(1, 31))); + } +} diff --git a/src/main/java/act/apidoc/sampledata/EmailProvider.java b/src/main/java/act/apidoc/sampledata/EmailProvider.java new file mode 100644 index 000000000..2e67137cc --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/EmailProvider.java @@ -0,0 +1,47 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; +import org.osgl.util.S; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.EMAIL) +public class EmailProvider extends SampleDataProvider { + @Inject + private HostProvider hostProvider; + + @Inject + private FirstNameProvider firstNameProvider; + + @Inject + private LastNameProvider lastNameProvider; + + @Override + public String get() { + return S.fmt("%s.%s@%s", firstNameProvider.get(), lastNameProvider.get(), hostProvider.get()).toLowerCase(); + } +} diff --git a/src/main/java/act/apidoc/sampledata/FirstNameProvider.java b/src/main/java/act/apidoc/sampledata/FirstNameProvider.java new file mode 100644 index 000000000..7ae8dfc87 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/FirstNameProvider.java @@ -0,0 +1,31 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.FIRST_NAME) +public class FirstNameProvider extends StringListStringProvider { +} diff --git a/src/main/java/act/apidoc/sampledata/FullNameProvider.java b/src/main/java/act/apidoc/sampledata/FullNameProvider.java new file mode 100644 index 000000000..1fdc199fd --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/FullNameProvider.java @@ -0,0 +1,42 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleDataProvider; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class FullNameProvider extends SampleDataProvider { + + @Inject + private FirstNameProvider firstNameProvider; + + @Inject + private LastNameProvider lastNameProvider; + + @Override + public String get() { + return firstNameProvider.get() + " " + lastNameProvider.get(); + } + +} diff --git a/src/main/java/act/apidoc/sampledata/HostProvider.java b/src/main/java/act/apidoc/sampledata/HostProvider.java new file mode 100644 index 000000000..1b38d4942 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/HostProvider.java @@ -0,0 +1,31 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.HOST) +public class HostProvider extends StringListStringProvider { +} diff --git a/src/main/java/act/apidoc/sampledata/LastNameProvider.java b/src/main/java/act/apidoc/sampledata/LastNameProvider.java new file mode 100644 index 000000000..aefafa367 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/LastNameProvider.java @@ -0,0 +1,31 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.FIRST_NAME) +public class LastNameProvider extends StringListStringProvider { +} diff --git a/src/main/java/act/apidoc/sampledata/MobileProvider.java b/src/main/java/act/apidoc/sampledata/MobileProvider.java new file mode 100644 index 000000000..44bb8e579 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/MobileProvider.java @@ -0,0 +1,31 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.MOBILE) +public class MobileProvider extends StringListStringProvider { +} diff --git a/src/main/java/act/apidoc/sampledata/NamedListProvider.java b/src/main/java/act/apidoc/sampledata/NamedListProvider.java new file mode 100644 index 000000000..f701a4065 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/NamedListProvider.java @@ -0,0 +1,45 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.S; + +public class NamedListProvider extends StringListProvider { + + private String listName; + + public NamedListProvider() {} + + public NamedListProvider(String listName) { + this.listName = S.requireNotBlank(listName); + } + + @Override + protected String listName() { + return listName; + } + + @Override + public String get() { + return randomStr(); + } + +} diff --git a/src/main/java/act/apidoc/sampledata/PhoneProvider.java b/src/main/java/act/apidoc/sampledata/PhoneProvider.java new file mode 100644 index 000000000..ccd9c92c8 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/PhoneProvider.java @@ -0,0 +1,31 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.PHONE) +public class PhoneProvider extends StringListStringProvider { +} diff --git a/src/main/java/act/apidoc/sampledata/PostCodeProvider.java b/src/main/java/act/apidoc/sampledata/PostCodeProvider.java new file mode 100644 index 000000000..88ddb81c3 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/PostCodeProvider.java @@ -0,0 +1,31 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.POSTCODE) +public class PostCodeProvider extends StringListStringProvider { +} diff --git a/src/main/java/act/apidoc/sampledata/RandomStringProvider.java b/src/main/java/act/apidoc/sampledata/RandomStringProvider.java new file mode 100644 index 000000000..021a2908b --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/RandomStringProvider.java @@ -0,0 +1,32 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleDataProvider; +import org.osgl.util.N; +import org.osgl.util.S; + +public class RandomStringProvider extends SampleDataProvider { + @Override + public String get() { + return S.random(2 + N.randInt(20)); + } +} diff --git a/src/main/java/act/apidoc/sampledata/StateProvider.java b/src/main/java/act/apidoc/sampledata/StateProvider.java new file mode 100644 index 000000000..108ba2ab6 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/StateProvider.java @@ -0,0 +1,31 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.STATE) +public class StateProvider extends StringListStringProvider { +} diff --git a/src/main/java/act/apidoc/sampledata/StreetProvider.java b/src/main/java/act/apidoc/sampledata/StreetProvider.java new file mode 100644 index 000000000..b9d88bdf8 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/StreetProvider.java @@ -0,0 +1,31 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.STREET) +public class StreetProvider extends StringListStringProvider { +} diff --git a/src/main/java/act/apidoc/sampledata/StringListProvider.java b/src/main/java/act/apidoc/sampledata/StringListProvider.java new file mode 100644 index 000000000..90caa310a --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/StringListProvider.java @@ -0,0 +1,72 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.apidoc.SampleDataProvider; +import org.osgl.$; +import org.osgl.util.C; +import org.osgl.util.IO; +import org.osgl.util.S; + +import java.net.URL; +import java.util.List; + +public abstract class StringListProvider extends SampleDataProvider { + + private List stringList; + + protected String listName() { + String fileName = getClass().getSimpleName().toLowerCase(); + if (fileName.endsWith("provider")) { + fileName = fileName.substring(0, fileName.length() - 8); + } + return fileName; + } + + public StringListProvider() { + if (Act.isProd()) { + return; + } + String fileName = listName() + ".list"; + ClassLoader cl = Act.app().classLoader(); + URL url = cl.getResource("sampledata/" + fileName); + if (null != url) { + stringList = readUrl(url); + } else { + // try built-in resource + url = cl.getResource("sampledata/~act/" + fileName); + if (null != url) { + stringList = readUrl(url); + } else { + warn("Cannot find the string list: " + fileName.toLowerCase() + ".list"); + } + } + } + + private List readUrl(URL url) { + return C.list(IO.read(url).toLines()).filter(S.F.NOT_BLANK); + } + + protected String randomStr() { + return null == stringList || stringList.isEmpty() ? S.random() : $.random(stringList); + } +} diff --git a/src/main/java/act/apidoc/sampledata/StringListStringProvider.java b/src/main/java/act/apidoc/sampledata/StringListStringProvider.java new file mode 100644 index 000000000..56757ce03 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/StringListStringProvider.java @@ -0,0 +1,28 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +public abstract class StringListStringProvider extends StringListProvider { + @Override + public String get() { + return randomStr(); + } +} diff --git a/src/main/java/act/apidoc/sampledata/SuburbProvider.java b/src/main/java/act/apidoc/sampledata/SuburbProvider.java new file mode 100644 index 000000000..3fad4e968 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/SuburbProvider.java @@ -0,0 +1,31 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.SUBURB) +public class SuburbProvider extends StringListStringProvider { +} diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 1f495e854..82ce476c1 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -26,6 +26,7 @@ import act.Act; import act.Destroyable; import act.apidoc.ApiManager; +import act.apidoc.SampleDataProviderManager; import act.app.data.BinderManager; import act.app.data.StringValueResolverManager; import act.app.event.SysEventId; @@ -166,6 +167,7 @@ public enum F { private Map daemonRegistry; private WebSocketConnectionManager webSocketConnectionManager; private MetricMetaInfoRepo metricMetaInfoRepo; + private SampleDataProviderManager sampleDataProviderManager; private AppCrypto crypto; private IdGenerator idGenerator; private SessionManager sessionManager; @@ -643,6 +645,7 @@ public synchronized void refresh() { loadRoutes(); emit(ROUTER_LOADED); initApiManager(); + initSampleDataProviderManager(); initHttpClientService(); initCaptchaPluginManager(); initCliDispatcher(); @@ -833,6 +836,10 @@ public File resource(String path) { return new File(this.layout().resource(appBase), path); } + public SampleDataProviderManager sampleDataProviderManager() { + return sampleDataProviderManager; + } + public void registerDaemon(Daemon daemon) { daemonRegistry.put(daemon.id(), daemon); } @@ -1370,6 +1377,10 @@ private void initApiManager() { apiManager = new ApiManager(this); } + private void initSampleDataProviderManager() { + sampleDataProviderManager = new SampleDataProviderManager(this); + } + private void initScanlist() { ClassLoader classLoader = getClass().getClassLoader(); if (classLoader instanceof BootstrapClassLoader) { diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 54db53ef9..fcdbb8335 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -235,7 +235,7 @@ protected T hideBuiltInEndpointsInApiDoc(boolean b) { public boolean isHideBuiltInEndpointsInApiDoc() { if (null == apiDocBuiltInHide) { - apiDocBuiltInHide = get(API_DOC_HIDE_BUILT_IN_ENDPOINTS, false); + apiDocBuiltInHide = get(API_DOC_HIDE_BUILT_IN_ENDPOINTS, true); } return apiDocBuiltInHide; } diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 02b8c4c99..a66325e9e 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -1,5 +1,6 @@ # Put package/class names that needs Act to scan. It can be regular expressions act\..*Admin +act.apidoc.SampleDataProviderFinder act.app.SingletonFinder act.app.util.SimpleRestfulServiceBase act.app.conf.AppConfigPlugin diff --git a/src/main/resources/sampledata/~act/companyname.list b/src/main/resources/sampledata/~act/companyname.list new file mode 100644 index 000000000..55e4a9253 --- /dev/null +++ b/src/main/resources/sampledata/~act/companyname.list @@ -0,0 +1,500 @@ +Brandt, Jonathan F Esq +Landrum Temporary Services +Inabinet, Macre Esq +Morris Downing & Sherred +Buelt, David L Esq +Artesian Ice & Cold Storage Co +Midway Hotel +Selsor, Robert J Esq +Vincent J Petti & Co +Prentiss, Paul F Esq +Public Works Department +Prudential Lighting Corp +Wood, J Scott Esq +Swanson Peterson Fnrl Home Inc +Old Cider Mill Grove +Cooper Myers Y Co +Angelo International +Blackley, William J Pa +Phoenix Phototype +Quartzite Processing Inc +Biltmore Textile Co Inc +Gateway Refrigeration +Anchorage Yamaha +Wynns Precision Inc Az Div +Paragon Cable Tv +Eagle Computer Services Inc +Kansas Association Ins Agtts +Di Giacomo, Richard F Esq +Butler, Frank B Esq +Alphagraphics Printshops +Voyager Travel Service +N Amer Plast & Chemls Co Inc +D L Downing General Contr Inc +Community Insurance Agy Inc +House Of Ing +Vei Inc +Hanna, Robert J Esq +Design Rite Homes Inc +State Library +Vista Grande Baptist Church +Poole Publications Inc +Affilated Consulting Group Inc +Northwestern Mutual Life Ins +Barrett Burke Wilson Castl +Helricks Inc +Wynn, Mary Ellen Esq +Mackraft Signs +Ansaring Answering Service +Joiner & Goudeau Law Offices +Cox, J Thomas Jr +Bill, Michael M +A B C Tank Co +Jolley, Mark A Cpa +Melco Embroidery Systems +Witchs Brew +Funding Equity Corp +Saturn Of Delray +Motel 6 +Ultimate In Womens Apparel The +Ballinger, Maria Chan Esq +N E Industrial Distr Inc +Joondeph, Jerome J Esq +Art In Forms +Central Hudson Ent Corp +Marscher, William F Iii +Smith, Sean O Esq +Maverik Country Stores Inc +United Christian Cmnty Crdt Un +Radecker, H Philip Jr +Cullen, Jack J Esq +Kszl Am Radio +Blewett, Yvonne S +Sheraton Inn Atlanta Northwest +Preston, Anne M Esq +A & A Custom Rubber Stamps +Hirsch, Walter W Esq +Jones, Peter B Esq +Sterling Institute +Cross Western Store +Demer Normann Smith Ltd +Ny Stat Trial Lawyers Assn +Mann, Charles E Esq +Airnetics Engineering Co +American Pie Co Inc +Brown Chiropractic +Classic Video Duplication Inc +Mcclier Corp +Gormley Lore Murphy +Thudium Mail Advg Company +Jen E Distributing Co +Re/max Realty Services +Roundys Pole Fence Co +Chadds Ford Winery +Barragar, Anne L Esq +Kvoo Radio +Donovan, William P Esq +Overseas General Business Co +Nilad Machining +Byrne, Beth Hobbs +Dileo, Lucille A Esq +First Express +Elbin Internatl Baskets +Multiform Business Printing +Jin Shin Travel Agency +Electra Gear Divsn Regal +Sparta Home Center +R A C E Enterprises Inc +Jersey Wholesale Fence Co Inc +Ryan, Barry M Esq +Albright, Alexandra W Esq +Gazette Record +Cochnower Pest Control +Als Village Stationers +A B C Pattern & Foundry Co +Gaddis Court Reporting +Howard Johnson +Sunrise Cirby Animal Hospital +Braid Electric Co +Lisko, Roy K Esq +House Of Ing +Hassanein, Nesa E Esq +Frasier Karen L Kolligs +Arc Of Montgomery County Inc +Redington, Thomas P Esq +Milwaukee Courier Inc +Mervis Steel Co +M Sorkin Sanford Associates +Low Country Kitchen & Bath +Spieker Properties +Walker & Brehn Pa +U Stor +Moorhead, Michael D Esq +R M Sloan Co Inc +Star Limousine +Pioneer Telephone Paging +Communication Buildings Amer +Components & Equipment Co +Grand Rapids Right To Life +Martin Nighswander & Mitchell +Barter Systems Inc +W R Grace & Co +Davis, J Mark Esq +Roswell Honda Partners +Era Mclachlan John Morgan Real +Vaughan, James J Esq +Wzyx 1440 Am +Amercn Spdy Printg Ctrs Ocala +A & D Pallet Co +Nationwide Insurance +Gallagher, Owen Esq +Thomas Somerville Co +Unr Rohn +Cath Lea For Relig & Cvl Rgts +Eagles Nest +Epsilon Products Company +Anderson, Julie A Esq +Oakey & Oakey Abstrct Burnett +Pacific Scientific Co +Krausert, Diane D Esq +Blaney Sheet Metal +Goodknight, David R +Sullivan & Associates Ltd +American Board Of Surgery +Vernon Manor Hotel +Keith Altizer & Company Pa +H P Stran & Co +Southern National Bank S Car +American Western Mortgage +Oxner Vallerie +Rochelle Cold Storage +Mail Boxes Etc +Xandex Inc +Hander, Deborah G Esq +Vinco Furniture Inc +Stamp House +Burton & Davis +Maier, Kristine M +J M Edmunds Co Inc +Art Concepts +Richards, Don R Esq +B & B Environmental Inc +Printing Delite +Weil Mclain Co +Jones, Andrew D Esq +South Adams Savings Bank +Universal Granite & Marble Inc +Imagelink +Wrrr Fm +Lord Aeck & Sargent Architects +Dalbec Agency Inc +Reese Press Inc +Stokes, Fred J Esq +Slachter, David Esq +Girling Health Care Inc +Welders Supply Service Inc +Engelbrecht, William H Esq +Nancy Brandon Realtor +Flanagan Lieberman Hoffman +Walter W Lawrence Ink +Ship It Packaging Inc +Malsbary Mfg Co +Independence Marine Corp +Anthonys +L M H Inc +Milgo Industrial Inc +Rogers, Clay M Esq +Usa Asbestos Co +Voils, Otis V +Oaz Communications +Elan Techlgy A Divsn Mansol +Norfolk County Newton Lung +Parker Bush & Lane Pc +Stylecraft Corporation +Bennett, Matthew T Esq +Highland Meadows Golf Club +Nelson, Michael J Esq +Henry, Robert J Esq +Mackraft Signs +Orco State Empl Fed Crdt Un +Johnsen, Robert U Esq +Abe Goldstein Ofc Furn +Roland Ashcroft +Village Meadows +Busada Manufacturing Corp +Air Flow Co Inc +Freitag Pc +Saw Repair & Supply Co +Middendorf Meat Quality Foods +Eagle Plywood & Door Mfrs Inc +Leigh, Lewis R Esq +Bare Bones +Avila, Edward G Esq +Oregon Handling Equip Co +Reynolds, Stephen R Esq +Credit Union Of The Rockies +Sullivan, John M Esq +Henry D Lederman +Burress, S Paige Esq +Dynetics +West Pac Environmental Inc +Progressive Machine Co +Berhanu International Foods +Mcmillan, Regina E Esq +Central Nebraska Home Care +Unicircuit Inc +F H Overseas Export Inc +Musgrave, R Todd Esq +Santek Inc +Springer Industrial Equip Inc +Long, Robert B Jr +Prusax, Maximilian M Esq +Custom Jig Grinding +Senior Village Nursing Home +Mchale, Joseph G Esq +Pestmaster Services Inc +Moorhead Associates Inc +Alb Inc +Atrium Marketing Inc +Machine Design Service Inc +Mcwhirter Realty Corp +National Mortgage Co +Alvis, John W Esq +Community Health Law Project +Highway Rentals Inc +Rapid Reproductions Printing +Autocrat Inc +Venino And Venino +Corporex Companies Inc +Economy Stainless Supl Co Inc +Dgstv Diseases Cnslnts +Broaches Inc +Woods Manufactured Housing +Theos Software Corp +Stanco Metal Products Inc +Xyvision Inc +Carrera Casting Corp +Asian Jewelry +Southwark Corporation +Kdhl Am Radio +Kelly, Charles G Esq +Fennessey Buick Inc +Apex Bottle Co +Shamrock Food Service +Plastic Supply Inc +Gaylord +Bank Of New York Na +Cole, Gary D Esq +Gencheff, Nelson E Do +American General Finance +Feutz, James F Esq +Kwik Kopy Printing & Copying +Borough Clerk +U S Rentals +Katz Brothers Market Inc +Grossman Tuchman & Shah +American Inst Muscl Studies +Joyces Submarine Sandwiches +Domurad, John M Esq +Debbies Golden Touch +Johnston, George M Esq +Chateau Sonesta Hotel +Superior Trading Co +Breathitt Fnrl Home & Mnmt Co +Viking Lodge +Brown Bear Bait Company +Pakzad Advertising +Jean Barbara Ltd +Thurmon, Steven P +Bussard, Vicki L Esq +Stamell Tabacco & Schager +Aztech Controls Inc +Hutchinson Inc +Curtis & Curtis Inc +Roane, Matthew H Esq +Best Western Gloucester Inn +Shine +Schwartz, Seymour I Md +American Express Publshng Corp +Saratoga Land Office +Jaywork, John Terence Esq +Northbros Co Divsn Natl Svc +Psychotherapy Associates +K J N Advertising Inc +Automatic Feed Co +Newton Clerk +Pleasantville Finance Dept +Body Part Connection +Cooper And Raley +H T Communications Group Ltd +Debbie Reynolds Hotel +Crew, Robert B Esq +Reef Encrustaceans +Reporters Inc +Arizona Equipment Trnsprt Inc +Hub Manufacturing Company Inc +Dippin Flavors +Harfred Oil Co +Wilheim, Kari A Esq +Gilardis Frozen Food +Ronald Massingill Pc +Colosi, Darryl J Esq +Tripuraneni, Prabhakar Md +Carlyle Abstract Co +Streator Onized Fed Crdt Un +Valley Hi Bank +Pep Boys Manny Moe & Jack +Knights Inn +Telcom Communication Center +Bell Electric Co +Signs Now +Chieftain Four Inc +South Carolina State Housing F +Lucas Cntrl Systems Prod Deeco +J C S Iron Works Inc +Lsr Pokorny Schwartz Friedman +Branom Instrument Co +Young, Craig C Md +Midwest Marketing Inc +Korolishin, Michael Esq +Perrysburg Animal Care Inc +Hospitality Design Group +Ciba Geigy Corp +Robinson, Michael C Esq +De Woskin, Alan E Esq +Alumi Span Inc +M C Publishing +Phoenix Marketing Rep Inc +Remc South Eastern +Curran, Carol N Esq +Faber Castell Corporation +Palmetto Food Equipment Co Inc +Greater Ky Corp +Kajo 1270 Am Radio +Fried, Monte Esq +Dayer Real Estate Group +On Your Feet +South Side Machine Works Inc +Milner Inn +United Mortgage +Cahill, Steven J Esq +G Whitfield Richards Co +Cuzzo, Michael J Esq +Swanson Travel +Jackson, Brian C +Fables Gallery +Forsyth Steel Co +Lally, Lawrence D Esq +Sassy Lassie Dolls +Performance Consulting Grp Inc +Padrick, Comer W Jr +Analytical Laboratories +Signs Of The Times +Brown, Alan Esq +Biancas La Petite French Bkry +Williams Design Group +Community Communication Servs +Hampton Inn Hotel +Hoffman, Carl Esq +Sonoco Products Co +Brattleboro Printing Inc +Scientific Agrcltl Svc Inc +Booster Farms +Accent Copy Center Inc +Mccaffreys Supermarket +Chemex Labs Ltd +Galaxie Displays Inc +Harris, Eric C Esq +Tarix Printing +Chem Aqua +Kern Valley Printing +American Speedy Printing Ctrs +Doane Products Company +Jerico Group +Mortenson Broadcasting Co +M & M Quality Printing +Georgia Business Machines +Leo, Frank M +S E M A +Arthur Andersen & Co +Triangle Engineering Inc +Schmidt, Charles E Jr +Emess Professional Svces +White, Mark A Cpa +Vicon Corporation +Turl Engineering Works +Deep Creek Pharmacy +Mister Bagel +Howard Winig Realty Assocs Inc +Jordan, Mark D Esq +Marin Sun Printing +Verde, Louis J Esq +Convum Internatl Corp +Thomas Torto Constr Corp +Astromatic +Kuhio Photo +Lehigh Furn Divsn Lehigh +Okon Inc +Postlewaite, Jack A Esq +Regent Consultants Corp +Hinkson Cooper Weaver Inc +Spclty Fastening Systems Inc +Rudolph, William S Cpa +Choo Choo Caboose At Jade Bbq +Anthony & Langford +Shapiro Bag Company +Lescure Company Inc +Higgins, Daniel B Esq +Dot Pitch Electronics +Henri D Kahn Insurance +Test Tools Inc +Rachmel & Company Cpa Pa +Hermann Assocs Inc Safe Mart +Palmer Publications Inc +Southern Imperial Inc +United Water Resources Inc +Burke, Jonathan H Esq +Nurses Ofr Newborns +Para Laboratories +New Orleans Credit Service Inc +Signs By Berry +Saum, Scott J Esq +Ulrich, Lawrence M Esq +Stewart Levine & Davis +Bark Eater Inn +Reich, Richard J Esq +Kappus Co +Terri, Teresa Hutchens Esq +Hong Iwai Hulbert & Kawano +Fraser Dante Ltd +Die Craft Stamping +Sako, Bradley T Esq +Country Comfort +Amberley Suite Hotels +Warren Leadership +Alexander, David T Esq +Fairfield Inn By Marriott +Skyline Lodge & Restaurant +Aviation Design +Malmon, Alvin S Esq +Transit Cargo Services Inc +Comfort Inn Of Revere +Duncan & Associates +Philip Kingsley Trichological +Burlington Homes Of Maine +Carson, Scott W Esq +Dewitt Cnty Fed Svngs & Ln +Art Material Services Inc +Consolidated Manufacturing Inc +Reliance Credit Union +Sinclair Machine Products Inc +Kent, Wendy M Esq +Dixon, Eric D Esq +Wood Sign & Banner Co +Adkins, Russell Esq +Danform Shoe Stores +Antietam Cable Television +Lombardi Bros Inc +Nathaniel Electronics +Rodriguez, Joseph A Esq +Stilling, William J Esq \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/firstname.list b/src/main/resources/sampledata/~act/firstname.list new file mode 100644 index 000000000..f8805d7ee --- /dev/null +++ b/src/main/resources/sampledata/~act/firstname.list @@ -0,0 +1,500 @@ +Rebbecca +Stevie +Mariko +Gerardo +Mayra +Idella +Sherill +Ena +Vince +Theron +Amira +Marica +Shawna +Paulina +Rose +Reita +Maybelle +Camellia +Roy +Albert +Hayley +Norah +Rosina +Royal +Barrie +Linsey +Laura +Fanny +Kristian +Gwen +Ben +Trina +Emelda +Zana +Shaun +Oren +Catherin +Pearlene +Kathryn +Suzan +Sommer +Keena +Rupert +Aleta +Jamal +Luz +Janessa +Lavonne +Honey +Jean +Katlyn +Cassie +Rolf +Darnell +Cherilyn +Lynda +Leigha +Delfina +Carlota +Alida +Donte +Lou +Dortha +Genevive +Alease +Veda +Craig +Lauran +Aaron +Francene +Zena +Brigette +Jeniffer +Selma +Elenora +Nadine +Kristin +Melinda +Kirby +Kent +Dan +Millie +Moira +Reta +Brittney +Leandro +Edison +Breana +Jarvis +Felicitas +Geraldine +Alfred +Leatha +Jacquelyne +Jonelle +Rosamond +Johnson +Elliot +Gerri +Rosendo +Eveline +Laurene +Tegan +Tracie +Mertie +Clare +Rebeca +Nilsa +Samuel +Ivette +Merrilee +Gianna +Hyman +Buck +Kenny +Tabetha +Alonso +Alonzo +Son +Jesusita +Annice +Delila +Iraida +Alona +Lajuana +Madelyn +Louann +William +Corazon +Fairy +Lashawn +Ronald +Shizue +Nida +Amos +Dexter +Ludivina +Ariel +Haley +Raelene +Micaela +Alpha +Zack +Wilford +Carman +Carylon +Gladys +Matilda +Jacklyn +Tashia +Dorian +Jesus +Brandee +Edda +Felix +Ben +Mickie +Phung +Lashonda +Patria +Nidia +Skye +Kanisha +Hector +Stefan +Francoise +Lindy +Arthur +Nicholle +Tijuana +Lorenza +Iola +Sang +Leonor +Silvana +Anthony +Wenona +Isadora +Mose +Marci +Michel +Stephania +Charolette +Katie +Inocencia +Nikita +Malcolm +Desiree +Holley +Maryann +Ling +Hailey +Farrah +Candra +Reuben +Anglea +Paris +Latricia +Jeffrey +Dean +Deane +Edelmira +Andrew +Miesha +Javier +Kizzy +Sharan +Novella +German +Robt +Rossana +Henriette +Buffy +Christiane +Annamae +Vanesa +Gennie +Tamra +Tien +Malcom +Claudia +Page +Lorita +Annita +Eliseo +Tyisha +Colene +Francis +Hester +Susana +Dahlia +Osvaldo +Armando +Torie +Tamie +Lettie +Chaya +Terina +Lisbeth +Lillian +Corrina +Dylan +Jerrod +Gracie +Barabara +Delsie +Cassie +Tamekia +Johanna +Sharita +Gerald +Ardella +Jackie +Mabelle +Jonell +Linwood +Samira +Julieta +Serita +Tori +Nancey +Wilbert +Werner +Sunny +Keva +Mary +Huey +Antonio +Quinn +Carin +Jill +Sanjuana +Elin +Charlena +Annette +Alexis +Princess +Ashton +Elmer +Aliza +Ora +Brent +Tora +Hildred +Dante +Emmanuel +Keshia +Sherman +Lore +Shawn +Karima +Francesco +King +Mica +Lamonica +Curtis +Sabrina +Denae +Anastacia +Irving +Elenor +Mary +Crista +Lawana +Maryrose +Lindsey +Lynelle +Brice +Laine +Rachael +Della +Thomasena +Frederic +Halina +Ryann +Shawn +Leah +Ira +Paris +Shayne +Ernestine +Eleonore +Misty +Na +Juan +Gerald +Desmond +Tommy +Adrianna +Adaline +Tammi +Virgilio +Emeline +Marcos +Yuonne +Gladis +Muriel +Juliann +Reiko +Verdell +Arleen +Launa +Casandra +Julio +Alica +Karol +Wava +Felicitas +Jamie +Fidelia +Kris +Lashawna +Lachelle +Katy +Bettyann +Valda +Lynette +Victor +Pa +Dorathy +Rodrigo +Stanford +Michael +Ines +Dorinda +Clarence +Omer +Winifred +Theresia +Daisy +Aretha +Bettina +Omega +Dana +Naomi +Luis +Dominga +Isreal +Myrtie +Jodi +Pearly +Aileen +Glory +Kathrine +Domingo +Julian +Marylou +Louis +Ellsworth +Wilburn +Arlie +Alysa +Marilynn +Scot +Adelaide +Jackie +Carli +Coletta +Katheryn +Santos +Kimberely +Earlean +Dannette +Odelia +Lina +Fredric +Alfreda +Bernadine +Ming +Gracia +Yuette +Yuriko +Hyman +Linette +Jospeh +Anna +Shawnta +Ettie +Chara +Lauran +Pansy +Georgeanna +Jesus +Jamey +Alberta +Ronald +Tamala +Gerry +Isaiah +Magnolia +Ngoc +Julene +Magda +Shantell +Audria +Nickole +Grover +Rocco +Ethan +Glynda +Yolande +Twanna +Rosenda +Lacey +Cordie +Annalee +Dana +Wai +Johana +Tomas +Karon +Delbert +Ashleigh +Nenita +Micah +Stefany +Rene +Cary +Micheal +Frederick +Burma +Cherry +Gabriele +Clement +Beckie +Catrice +Richelle +Cherri +Dorethea +Barb +Bettye +Sherrell +Ruth +Alva +Carri +Onita +Jessenia +Tricia +Stephaine +Florinda +Marsha +Josefa +Deeann +Jeannetta +Desmond +Trina +Ramonita +Temeka +Bea +Soledad +Margurite +Artie +Major +Veronika +Christene +Miles +Julio +Aide +Noelia +Lenora \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/host.list b/src/main/resources/sampledata/~act/host.list new file mode 100644 index 000000000..bcc40b790 --- /dev/null +++ b/src/main/resources/sampledata/~act/host.list @@ -0,0 +1,495 @@ +didio.com.au +hotmail.com +gmail.com +hotmail.com +desjardiws.com.au +yahoo.com +chudej.net.au +albrough.com.au +maker.net.au +jebb.net.au +hotmail.com +yahoo.com +gmail.com +nybo.net.au +gmail.com +taghon.net.au +daleo.net.au +gmail.com +costeira.com.au +nicley.com.au +gedman.net.au +yahoo.com +hotmail.com +yahoo.com +hotmail.com +hotmail.com +oto.com.au +gmail.com +ploszaj.net.au +rael.com.au +hotmail.com +gmail.com +boudrie.net.au +yahoo.com +gmail.com +agar.net.au +rebich.net.au +hinkson.net.au +gmail.com +gmail.com +hotmail.com +yahoo.com +yahoo.com +lymaster.net.au +gmail.com +hotmail.com +gmail.com +gene.com.au +yahoo.com +fraize.net.au +gmail.com +capelli.com.au +binnie.net.au +gephardt.com.au +helger.com.au +yahoo.com +hotmail.com +vrieze.net.au +hotmail.com +strawbridge.com.au +mishkin.com.au +yahoo.com +tovmasyan.net.au +kloska.net.au +skursky.net.au +gmail.com +breckenstein.com.au +gmail.com +elm.net.au +yahoo.com +okojie.com.au +hotmail.com +fellhauer.com.au +hotmail.com +yahoo.com +hotmail.com +gmail.com +gmail.com +yahoo.com +lolley.net.au +hotmail.com +sumera.net.au +yahoo.com +gmail.com +orlinski.com.au +gmail.com +pacleb.net.au +gmail.com +yahoo.com +hotmail.com +gmail.com +gmail.com +hotmail.com +yahoo.com +hotmail.com +yahoo.com +gmail.com +hotmail.com +gmail.com +kazeck.com.au +hotmail.com +hotmail.com +pawell.net.au +arellanes.net.au +servantes.com.au +fajen.net.au +yahoo.com +yahoo.com +yahoo.com +leicht.com.au +gmail.com +hotmail.com +polek.net.au +magnotta.net.au +druck.net.au +kunich.net.au +hotmail.com +yahoo.com +hotmail.com +yahoo.com +yahoo.com +yahoo.com +devol.net.au +gmail.com +burket.com.au +yahoo.com +hotmail.com +gmail.com +hotmail.com +limberg.com.au +prosienski.net.au +yahoo.com +stavely.com.au +vaughn.net.au +gmail.com +shiflett.com.au +hotmail.com +gmail.com +pata.net.au +hotmail.com +gmail.com +schmale.net.au +hotmail.com +hotmail.com +charney.net.au +gmail.com +merkt.net.au +svoboda.net.au +yahoo.com +bumby.com.au +kellman.net.au +yahoo.com +yahoo.com +langanke.net.au +gmail.com +gmail.com +hotmail.com +yahoo.com +barras.com.au +mongolo.net.au +hotmail.com +vandermeer.com.au +gmail.com +hulme.com.au +gmail.com +schoenleber.com.au +baird.net.au +gmail.com +prez.com.au +yahoo.com +hotmail.com +gmail.com +hotmail.com +hotmail.com +hotmail.com +hoyne.com.au +connon.com.au +yahoo.com +gmail.com +angeron.net.au +novosel.net.au +yahoo.com +gmail.com +hotmail.com +yahoo.com +yahoo.com +kopet.com.au +malboeuf.com.au +deritis.net.au +yahoo.com +andrion.com.au +hotmail.com +hotmail.com +yahoo.com +vollstedt.com.au +hotmail.com +hotmail.com +gmail.com +decelles.net.au +osmer.com.au +yahoo.com +wodicka.net.au +fritch.com.au +gmail.com +yahoo.com +biler.net.au +gish.net.au +stitely.com.au +gmail.com +hotmail.com +glockner.com.au +gmail.com +kenfield.com.au +kinney.com.au +leja.com.au +gmail.com +entzi.net.au +roches.net.au +lek.net.au +mikovec.com.au +yahoo.com +tolbent.net.au +gmail.com +gmail.com +yahoo.com +gmail.com +yahoo.com +yahoo.com +yahoo.com +hollimon.com.au +hessenthaler.net.au +muhlbauer.net.au +wildeboer.com.au +agney.net.au +hotmail.com +gmail.com +hotmail.com +luening.com.au +hotmail.com +amedro.net.au +hotmail.com +digregorio.net.au +yahoo.com +yahoo.com +gmail.com +chrusciel.net.au +yahoo.com +kellebrew.com.au +ramero.net.au +biasi.net.au +hotmail.com +yahoo.com +yahoo.com +gmail.com +tepley.net.au +whal.net.au +hotmail.com +hermens.net.au +catton.com.au +moehring.net.au +gmail.com +hotmail.com +yahoo.com +weissbrodt.com.au +gmail.com +davoren.net.au +goodness.net.au +koerner.com.au +gmail.com +hotmail.com +morguson.com.au +hotmail.com +gmail.com +hotmail.com +yahoo.com +gmail.com +ahlborn.com.au +telch.net.au +eilbeck.net.au +freiman.net.au +yahoo.com +wasp.net.au +mahmud.com.au +hotmail.com +hotmail.com +hotmail.com +kloos.com.au +hotmail.com +gmail.com +hotmail.com +ware.net.au +hotmail.com +hotmail.com +yahoo.com +hotmail.com +yahoo.com +gmail.com +gmail.com +yuasa.net.au +hotmail.com +rathmann.com.au +koury.net.au +hotmail.com +gmail.com +gmail.com +gmail.com +gmail.com +schimke.com.au +dellen.com.au +hotmail.com +vugteveen.net.au +milsap.com.au +yahoo.com +gmail.com +gmail.com +paavola.com.au +hotmail.com +yahoo.com +hotmail.com +gmail.com +yahoo.com +hotmail.com +hotmail.com +poncio.com.au +galagher.com.au +hotmail.com +phay.com.au +gmail.com +gmail.com +carabajal.com.au +kazemi.net.au +hotmail.com +gmail.com +dejarme.net.au +yahoo.com +hotmail.com +gmail.com +gordis.com.au +gmail.com +alerte.com.au +yahoo.com +gmail.com +gong.com.au +kushnir.net.au +gmail.com +hotmail.com +filan.net.au +andrzejewski.com.au +yahoo.com +fernades.com.au +levay.net.au +hotmail.com +laroia.net.au +badgero.com.au +gmail.com +gmail.com +waganer.net.au +gmail.com +tokich.net.au +hotmail.com +gmail.com +radel.net.au +yahoo.com +gmail.com +yahoo.com +hotmail.com +diciano.com.au +hotmail.com +yahoo.com +yahoo.com +hotmail.com +hotmail.com +gmail.com +hotmail.com +hotmail.com +gmail.com +menez.net.au +gmail.com +yahoo.com +mckale.net.au +laprade.net.au +lofts.com.au +brueck.net.au +hotmail.com +lary.net.au +gmail.com +hotmail.com +herrera.net.au +jarva.com.au +gmail.com +hotmail.com +yahoo.com +thro.net.au +gmail.com +wisenbaker.net.au +weyman.com.au +suffern.net.au +gmail.com +hutchin.com.au +yahoo.com +hotmail.com +yahoo.com +yahoo.com +gmail.com +hotmail.com +metevelis.net.au +gmail.com +hotmail.com +hotmail.com +couzens.com.au +hotmail.com +woodhams.com.au +yahoo.com +gmail.com +huntsberger.net.au +gmail.com +silverstone.net.au +hotmail.com +gmail.com +hotmail.com +yahoo.com +yahoo.com +mohrmann.net.au +kueter.com.au +overbough.com.au +hotmail.com +gmail.com +yahoo.com +gmail.com +gmail.com +hotmail.com +gmail.com +yahoo.com +quintero.com.au +sanzenbacher.com.au +yahoo.com +yahoo.com +gmail.com +francis.net.au +hotmail.com +hotmail.com +ladeau.net.au +raddle.com.au +conquest.net.au +fults.net.au +hotmail.com +hotmail.com +hotmail.com +yahoo.com +hotmail.com +figueras.net.au +burnsworth.net.au +hotmail.com +ocken.net.au +hotmail.com +gmail.com +yahoo.com +gmail.com +hotmail.com +gmail.com +hotmail.com +remillard.net.au +gmail.com +taketa.net.au +hotmail.com +yahoo.com +hotmail.com +hotmail.com +gmail.com +palaspas.net.au +milbrandt.com.au +hotmail.com +yahoo.com +yahoo.com +gudgel.com.au +farnham.com.au +oakland.com.au +gmail.com +gmail.com +hotmail.com +bakey.com.au +yahoo.com +gmail.com +iida.net.au +yahoo.com +hotmail.com +yahoo.com +gmail.com +buchauer.net.au +hotmail.com +hotmail.com +mikel.net.au +ghera.com.au +brackett.net.au +delacruz.net.au \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/lastname.list b/src/main/resources/sampledata/~act/lastname.list new file mode 100644 index 000000000..4921f63f0 --- /dev/null +++ b/src/main/resources/sampledata/~act/lastname.list @@ -0,0 +1,500 @@ +Didio +Hallo +Stayer +Woodka +Bena +Scotland +Klar +Desjardiws +Siena +Jarding +Chudej +Tarbor +Albrough +Maker +Jebb +Tabar +Bewley +Pylant +Nybo +Sonier +Taghon +Daleo +Sidhu +Costeira +Nicley +Gedman +Bourbonnais +Stoneking +Ellerbusch +Julye +Majorga +Oto +Geffers +Ploszaj +Rael +Lobosco +Aguele +Boudrie +Bonalumi +Landa +Agar +Rebich +Hinkson +Poarch +Korczynski +Broccoli +Ruthers +Esco +Lymaster +Cecchinato +Flitcroft +Soros +Gene +Moothart +Fraize +Lazzaro +Capelli +Binnie +Gephardt +Helger +Resureccion +Kriner +Vrieze +Sanborn +Strawbridge +Mishkin +Vandersloot +Tovmasyan +Kloska +Skursky +Daria +Breckenstein +Jezek +Elm +Handler +Okojie +Shiflet +Fellhauer +Litherland +Ivans +Platz +Pirkl +Qadir +Qazi +Lolley +Bolka +Sumera +Cassi +Nicols +Orlinski +Neisius +Pacleb +Block +Rosso +Epps +Amlin +Mcenery +Scatton +Perra +Jelsma +Brickhouse +Bennett +Ebershoff +Huro +Kazeck +Bortignon +Baley +Pawell +Arellanes +Servantes +Fajen +Eilers +Phinazee +Pascucci +Leicht +Bai +Popper +Polek +Magnotta +Druck +Kunich +Buchman +Sionesini +Driesenga +Vonderahe +Maestri +Susmilch +Devol +Grafenstein +Burket +Urion +Gayner +Hayduk +Fitz +Limberg +Prosienski +Calamarino +Stavely +Vaughn +Legeyt +Shiflett +Prudhomme +Warman +Pata +Robasciotti +Bayot +Schmale +Peleg +Wojnar +Charney +Eischens +Merkt +Svoboda +Mcquaide +Bumby +Kellman +Upton +Krome +Langanke +Popa +Horr +Culcasi +Reyelts +Barras +Mongolo +Byon +Vandermeer +Diniz +Hulme +Mesch +Schoenleber +Baird +Weigner +Prez +Whelpley +Stever +Carmel +Yurick +Vonseggern +Aveline +Hoyne +Connon +Turk +Magro +Angeron +Novosel +Gohlke +Englund +Worland +Tates +Dibello +Kopet +Malboeuf +Deritis +Hegland +Andrion +Tuccio +Schmoyer +Leuenberger +Vollstedt +Haag +Pedregon +Keks +Decelles +Osmer +Stangle +Wodicka +Fritch +Dones +Blanck +Biler +Gish +Stitely +Osmanski +Lothridge +Glockner +Pastorino +Kenfield +Kinney +Leja +Gawrych +Entzi +Roches +Lek +Mikovec +Layland +Tolbent +Senters +Dollins +Baumgarter +Tummons +Falvey +Barkley +Deras +Hollimon +Hessenthaler +Muhlbauer +Wildeboer +Agney +Dominique +Lindblom +Chaleun +Luening +Vicente +Amedro +Ducos +Digregorio +Kajder +Saffer +Kruk +Chrusciel +Dieterich +Kellebrew +Ramero +Biasi +Wessner +Heninger +Cropsey +Barthlow +Tepley +Whal +Beckes +Hermens +Catton +Moehring +Dingler +Bukovac +Eighmy +Weissbrodt +Georgiades +Davoren +Goodness +Koerner +Decamp +Breyer +Morguson +Saffo +Sutherburg +Redlon +Akiyama +Handrick +Ahlborn +Telch +Eilbeck +Freiman +Avera +Wasp +Mahmud +Brothers +Weibe +Cheever +Kloos +Picton +Simco +Princiotta +Ware +Rabena +Saeteun +Carranzo +Plocica +Siefken +Irene +Padua +Yuasa +Cove +Rathmann +Koury +Bogacz +Killean +Crawley +Selestewa +Graziosi +Schimke +Dellen +Riston +Vugteveen +Milsap +Zihal +Kinnison +Sundahl +Paavola +Everline +Leriche +Hodges +Knudtson +Kloepper +Tarkowski +Gennusa +Poncio +Galagher +Schiavi +Phay +Sotelo +Seniff +Carabajal +Kazemi +Drozdowski +Dammeyer +Dejarme +Garness +Kane +Vanauken +Gordis +Puccini +Alerte +Sarkissian +Ochs +Gong +Kushnir +Dampier +Medich +Filan +Andrzejewski +Saltourides +Fernades +Levay +Beaureguard +Laroia +Badgero +Miskelly +Schuh +Waganer +Orehek +Tokich +Markoff +Gabbert +Radel +Kingshott +Salomone +Kearsey +Bodle +Diciano +Mangino +Vock +Tuamoheloa +Yerry +Barchacky +Calizo +Korba +Naifeh +Hedstrom +Menez +Carlo +Francoise +Mckale +Laprade +Lofts +Brueck +Guenther +Lary +Borra +Lehoux +Herrera +Jarva +Ender +Borchelt +Bame +Thro +Lamers +Wisenbaker +Weyman +Suffern +Heimbaugh +Hutchin +Schwiebert +Johanningmeie +Delsoin +Elamin +Thaxton +Pecot +Metevelis +Kazarian +Hegeman +Summerfield +Couzens +Ovit +Woodhams +Luckenbach +Leveston +Huntsberger +Todesco +Silverstone +Liversedge +Tetter +Motter +Grube +Hickie +Mohrmann +Kueter +Overbough +Guglielmina +Lauretta +Lindbeck +Lizama +Piccinich +Derenzis +Reynolds +Bergstrom +Quintero +Sanzenbacher +Scrimsher +Sieber +Petteway +Francis +Meikle +Graleski +Ladeau +Raddle +Conquest +Fults +Etzler +Houben +Rimmer +Mckenna +Shear +Figueras +Burnsworth +Orazine +Ocken +Tamburello +Noa +Roh +Frabotta +Chee +Apodace +Fowlkes +Remillard +Miccio +Taketa +Latina +Meray +Sprowl +Niglio +Shoulders +Palaspas +Milbrandt +Sarp +Peressini +Manin +Gudgel +Farnham +Oakland +Nicklous +Vonstaden +Amuso +Bakey +Picotte +Bodine +Iida +Mockus +Okon +Saine +Studwell +Buchauer +Cisney +Feldner +Mikel +Ghera +Brackett +Delacruz \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/mobile.list b/src/main/resources/sampledata/~act/mobile.list new file mode 100644 index 000000000..41ae1da3d --- /dev/null +++ b/src/main/resources/sampledata/~act/mobile.list @@ -0,0 +1,500 @@ +0458-665-290 +0497-622-620 +0427-885-282 +0443-795-912 +0453-666-885 +0451-966-921 +0427-991-688 +0415-961-606 +0411-732-965 +0461-862-457 +0478-867-289 +0494-982-617 +0441-255-802 +0420-123-282 +0496-441-929 +0431-669-863 +0448-221-640 +0423-446-913 +0416-394-795 +0420-575-355 +0491-976-291 +0462-327-613 +0458-753-924 +0480-443-612 +0455-270-505 +0433-965-131 +0491-455-112 +0465-778-983 +0442-982-316 +0465-547-766 +0462-648-621 +0460-377-727 +0454-643-433 +0430-656-502 +0498-627-281 +0495-838-492 +0444-150-950 +0462-627-260 +0455-699-311 +0471-251-939 +0486-599-199 +0468-708-802 +0489-430-358 +0419-138-629 +0427-970-674 +0416-525-908 +0410-358-989 +0444-359-546 +0411-717-109 +0448-530-536 +0465-519-356 +0423-281-356 +0482-882-653 +0419-656-117 +0468-743-337 +0472-315-303 +0432-580-634 +0460-951-322 +0415-230-654 +0412-699-567 +0478-459-448 +0496-387-592 +0430-222-319 +0431-413-930 +0497-868-525 +0474-823-917 +0492-408-109 +0459-680-488 +0473-600-733 +0485-944-417 +0466-820-981 +0462-308-800 +0493-644-827 +0418-581-770 +0481-367-908 +0424-801-736 +0488-223-788 +0493-258-647 +0480-676-186 +0429-746-524 +0441-978-907 +0410-688-713 +0471-106-909 +0446-105-779 +0451-120-660 +0413-530-467 +0463-377-181 +0495-644-883 +0436-246-951 +0444-326-506 +0440-707-817 +0453-896-533 +0445-211-162 +0464-763-350 +0461-339-731 +0438-251-615 +0446-721-262 +0481-878-290 +0416-887-937 +0477-239-199 +0463-242-525 +0468-234-875 +0499-760-910 +0494-620-234 +0446-422-535 +0423-874-910 +0486-736-129 +0486-504-582 +0446-710-661 +0488-109-742 +0489-493-308 +0418-994-884 +0446-460-955 +0453-818-566 +0486-712-822 +0438-141-107 +0448-235-525 +0419-100-429 +0446-520-807 +0424-741-530 +0449-775-616 +0454-544-286 +0490-625-307 +0428-176-191 +0430-111-686 +0413-115-438 +0489-594-290 +0485-183-917 +0481-500-964 +0472-806-350 +0436-337-750 +0499-737-220 +0456-480-906 +0473-495-435 +0492-444-651 +0472-707-132 +0482-267-844 +0441-579-823 +0430-736-276 +0463-745-755 +0451-514-152 +0464-687-686 +0414-749-850 +0445-797-121 +0420-704-683 +0475-926-458 +0410-812-931 +0481-222-272 +0434-382-805 +0450-769-383 +0428-946-162 +0492-739-675 +0419-644-936 +0416-330-811 +0485-718-212 +0441-733-809 +0499-576-666 +0417-815-258 +0491-793-730 +0493-319-728 +0437-170-488 +0451-601-420 +0423-358-965 +0438-431-666 +0495-777-435 +0430-357-187 +0417-325-352 +0429-206-122 +0476-915-729 +0444-393-673 +0445-830-408 +0482-635-206 +0419-565-485 +0466-155-348 +0489-343-254 +0495-801-419 +0439-849-209 +0412-855-847 +0467-531-601 +0447-443-927 +0481-466-206 +0416-443-185 +0430-400-899 +0439-832-641 +0482-712-669 +0470-886-805 +0450-887-422 +0414-731-630 +0469-808-491 +0479-474-917 +0444-175-406 +0443-979-875 +0472-511-112 +0439-769-439 +0489-476-500 +0442-946-694 +0417-281-870 +0459-945-995 +0436-612-609 +0492-559-630 +0453-828-758 +0454-458-365 +0499-155-325 +0440-277-657 +0489-202-570 +0474-218-755 +0413-129-424 +0458-731-791 +0495-882-447 +0415-690-961 +0461-569-843 +0413-952-396 +0451-121-905 +0418-813-310 +0495-759-817 +0496-610-278 +0425-685-933 +0438-378-139 +0468-244-186 +0412-417-394 +0465-885-293 +0497-335-342 +0436-530-773 +0426-888-203 +0497-955-472 +0490-478-206 +0466-541-467 +0463-965-946 +0473-268-319 +0491-209-954 +0430-768-907 +0437-545-265 +0465-254-471 +0426-991-115 +0423-870-900 +0454-956-810 +0469-609-289 +0438-810-326 +0449-675-754 +0490-548-561 +0463-118-373 +0412-631-864 +0451-857-511 +0420-776-847 +0467-209-469 +0458-548-827 +0433-677-495 +0418-218-423 +0477-424-229 +0442-976-132 +0426-833-750 +0426-488-593 +0448-206-407 +0427-579-588 +0486-778-453 +0487-913-509 +0443-539-658 +0420-286-404 +0493-703-129 +0449-807-281 +0426-612-418 +0455-947-547 +0462-625-869 +0450-440-670 +0448-465-944 +0452-920-972 +0486-924-555 +0438-100-197 +0432-253-912 +0475-701-279 +0468-451-905 +0436-444-424 +0472-281-671 +0469-445-592 +0484-806-405 +0475-760-952 +0467-758-219 +0427-327-492 +0463-757-229 +0445-609-538 +0411-111-689 +0492-994-709 +0429-419-390 +0463-881-817 +0432-682-937 +0498-489-459 +0439-885-729 +0468-488-918 +0449-337-116 +0456-595-946 +0416-963-557 +0420-185-206 +0468-322-703 +0471-169-302 +0425-628-359 +0484-331-585 +0486-768-529 +0410-539-386 +0481-193-115 +0465-434-187 +0419-509-353 +0411-620-740 +0471-602-916 +0456-330-756 +0440-811-454 +0499-741-651 +0462-987-152 +0467-821-930 +0411-276-383 +0459-738-842 +0456-162-659 +0434-497-618 +0435-982-307 +0478-235-293 +0423-341-752 +0480-561-819 +0452-193-155 +0466-603-340 +0454-257-906 +0443-386-213 +0414-354-955 +0497-442-813 +0414-661-490 +0444-777-459 +0474-730-764 +0437-819-518 +0445-121-372 +0498-290-826 +0432-130-553 +0416-156-336 +0425-809-254 +0460-368-567 +0451-790-704 +0464-786-310 +0470-345-731 +0444-157-156 +0473-213-595 +0492-961-209 +0414-715-583 +0474-367-875 +0430-271-168 +0423-125-880 +0418-327-906 +0452-766-262 +0423-831-803 +0419-430-467 +0445-285-375 +0470-655-661 +0426-830-817 +0478-179-538 +0469-243-477 +0488-276-458 +0453-493-910 +0481-278-876 +0427-971-504 +0434-637-971 +0417-544-301 +0421-987-667 +0480-433-145 +0432-706-521 +0430-503-397 +0479-127-500 +0482-613-598 +0481-799-605 +0412-153-776 +0486-302-652 +0439-808-753 +0471-558-187 +0437-687-429 +0455-503-406 +0481-452-729 +0472-631-448 +0422-968-757 +0411-398-917 +0430-962-223 +0490-571-461 +0412-225-824 +0455-472-994 +0412-679-832 +0488-646-644 +0460-335-582 +0495-852-298 +0490-570-424 +0449-461-650 +0418-290-707 +0419-587-898 +0473-727-909 +0471-229-188 +0442-173-327 +0431-743-155 +0423-740-512 +0475-366-466 +0474-199-825 +0445-480-672 +0473-505-816 +0423-545-966 +0499-207-236 +0444-915-799 +0497-455-126 +0411-294-588 +0441-151-810 +0452-941-575 +0422-884-614 +0472-399-247 +0487-835-113 +0425-214-447 +0419-246-570 +0448-195-542 +0486-557-304 +0472-903-534 +0483-854-984 +0476-877-991 +0413-650-821 +0453-580-611 +0452-605-630 +0459-496-184 +0410-116-435 +0424-568-217 +0415-341-310 +0476-605-889 +0467-468-894 +0436-793-916 +0467-331-796 +0481-690-589 +0491-832-907 +0457-126-909 +0432-182-830 +0490-947-955 +0494-282-122 +0488-624-111 +0490-128-503 +0451-946-241 +0451-383-562 +0459-937-449 +0426-175-813 +0480-120-597 +0447-228-633 +0457-212-114 +0488-425-192 +0451-639-283 +0472-691-355 +0451-406-157 +0438-478-951 +0415-135-989 +0441-386-796 +0447-563-450 +0480-125-331 +0494-517-582 +0442-561-392 +0473-757-584 +0432-184-936 +0417-833-905 +0467-120-854 +0419-730-349 +0432-703-516 +0474-975-307 +0422-183-541 +0419-720-227 +0449-668-295 +0466-921-460 +0448-770-746 +0476-917-926 +0460-834-526 +0485-660-179 +0469-490-273 +0418-429-485 +0416-611-806 +0476-736-800 +0436-606-487 +0443-657-148 +0420-742-142 +0417-795-558 +0428-843-553 +0471-940-163 +0499-165-889 +0485-105-744 +0422-775-760 +0484-192-990 +0438-847-885 +0444-376-606 +0470-386-894 +0493-826-469 +0440-980-784 +0435-530-318 +0427-106-677 +0495-376-112 +0479-654-997 +0452-835-388 +0493-653-304 +0444-126-746 +0442-360-982 +0433-550-202 +0426-784-480 +0434-402-895 +0451-465-174 +0475-337-188 +0464-594-316 +0443-448-467 +0454-135-614 +0454-434-110 \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/phone.list b/src/main/resources/sampledata/~act/phone.list new file mode 100644 index 000000000..d35c657c3 --- /dev/null +++ b/src/main/resources/sampledata/~act/phone.list @@ -0,0 +1,500 @@ +03-8174-9123 +07-9997-3366 +08-5558-9019 +02-6044-4682 +02-1455-6085 +08-7868-1355 +08-6522-8931 +02-5226-9402 +07-3184-9989 +08-6890-4661 +07-8135-3271 +03-1174-6817 +07-7977-6039 +08-8344-8929 +07-4941-9471 +02-3518-7078 +07-9387-7293 +02-5171-4345 +02-5311-7778 +07-9354-2612 +02-1638-4380 +02-5322-6127 +07-6460-4488 +07-5338-6357 +03-6443-2786 +07-4785-3781 +03-6543-6688 +07-3721-9123 +08-2748-1250 +03-7063-6734 +02-8171-9051 +07-1153-8567 +08-7097-3947 +07-7991-8880 +03-8998-5485 +02-5046-1307 +07-6476-1399 +07-4463-7223 +08-3071-2258 +07-1576-1412 +08-9130-3372 +02-4972-3570 +02-7160-2066 +03-2691-1298 +02-3877-9654 +07-2679-1774 +02-2367-6845 +03-3474-2120 +07-8087-2603 +08-5263-2786 +07-1778-9968 +08-2666-6390 +02-4458-2810 +02-3996-9188 +02-4873-1914 +03-4933-4205 +07-4823-9785 +08-3692-5784 +02-5078-4389 +07-1642-3251 +07-2373-6048 +02-7328-3350 +03-1981-6209 +02-6246-5711 +07-3760-1546 +07-6034-2422 +02-5487-7528 +02-2546-5344 +07-9896-4827 +02-5941-3178 +03-2822-8156 +03-5722-3451 +03-3268-5102 +03-9183-9493 +08-5671-3318 +08-9746-2341 +03-4529-7210 +03-4387-3800 +07-5284-3845 +07-8661-4016 +07-4306-1623 +03-6023-2680 +08-7687-4883 +03-1974-9948 +03-4072-7094 +03-8157-4609 +08-9114-1763 +03-2305-8627 +08-2117-5217 +03-2451-1896 +03-8243-2999 +08-9450-7978 +08-7635-8350 +02-4565-6425 +07-8085-8351 +02-8007-5034 +02-1718-4983 +02-3647-9507 +07-6019-7861 +08-7712-4785 +03-9517-9800 +08-2969-2908 +02-6604-9720 +07-1951-6787 +08-5475-6162 +08-9256-6135 +02-7049-7728 +07-8997-8513 +02-7995-6787 +03-9801-9429 +07-9104-1459 +03-4328-5253 +08-5756-9456 +08-9279-1731 +03-6240-8274 +07-6813-6477 +03-7036-7071 +03-2403-7167 +02-2376-7653 +08-3605-3943 +02-6769-6153 +08-1791-7668 +03-4812-5654 +08-6777-4159 +03-5661-2424 +02-2129-8131 +07-5035-4889 +07-4963-5297 +08-1624-7236 +08-9159-7562 +02-4794-6673 +03-7734-9557 +03-2297-9891 +07-7445-2572 +03-4539-9131 +03-2454-6523 +07-5378-4498 +03-6510-4788 +03-7035-6484 +03-4878-1766 +08-8856-8589 +07-9053-8045 +08-9948-2940 +07-7445-2538 +03-1570-9956 +03-8858-7088 +08-4564-2338 +03-1130-5685 +02-6287-8787 +07-7659-5711 +02-7739-6600 +03-9341-9757 +08-3614-5966 +03-1465-8645 +03-1431-3996 +02-7968-9243 +07-7647-5420 +03-9617-5392 +03-9838-7533 +02-6522-3993 +07-8441-8214 +03-9075-3104 +03-2921-8418 +03-3017-8394 +08-4563-6214 +08-3914-9404 +07-9407-9202 +03-2517-3453 +07-7144-4719 +07-1415-9307 +08-8081-7779 +08-2325-5905 +03-8912-5755 +02-7463-8776 +03-5175-6193 +07-7092-8542 +02-2832-1545 +07-9595-6042 +07-5769-8004 +08-3342-3889 +08-6183-9260 +02-5725-5992 +08-4735-5054 +02-7265-9702 +03-6268-2647 +03-5716-1053 +07-9826-3950 +08-5289-4594 +02-9885-9593 +08-1520-4093 +07-1330-6750 +07-3799-1667 +03-7139-6376 +03-4231-3633 +02-1402-5215 +07-3239-2830 +08-8868-2010 +08-5444-3296 +08-1267-4421 +03-6776-1146 +02-9718-2944 +08-8484-3223 +03-5251-3153 +03-5185-6258 +03-8369-6924 +08-1937-3980 +08-4712-2157 +02-2612-1455 +02-2393-3289 +03-6517-9318 +08-9855-2125 +03-9935-5135 +03-1600-5230 +08-9693-9052 +02-1919-3941 +07-7052-4547 +08-4753-2870 +08-5614-9153 +03-7767-6169 +03-2477-9133 +02-4246-3092 +03-2484-5500 +08-2358-3115 +08-3384-3181 +02-9829-2371 +08-2158-6758 +02-4376-1104 +03-5933-7288 +02-1622-6412 +02-5410-5137 +03-8216-8640 +07-4854-5045 +08-8161-8201 +07-8371-4719 +08-7046-5484 +03-5855-5156 +08-5943-4352 +03-9107-7349 +08-1184-4145 +07-3594-6592 +08-7915-5110 +07-2319-2889 +02-9554-9632 +03-2444-8291 +02-3449-6894 +03-1361-8465 +02-7922-5417 +02-7498-8576 +02-5970-1748 +02-7386-4544 +07-7446-6315 +07-3581-9462 +07-9840-6419 +07-8857-6463 +02-5095-2983 +03-6053-2447 +07-9512-2457 +07-4217-6258 +08-2941-7378 +02-2493-1870 +02-3248-3283 +07-9178-6430 +03-9085-5714 +07-1217-9907 +02-9187-4769 +07-3963-4469 +08-5236-2143 +03-6144-7318 +02-7239-9923 +08-8343-3550 +07-1698-9047 +02-2208-2711 +08-5221-9700 +08-7615-2416 +07-5417-9612 +08-1895-1457 +02-2656-6234 +03-9215-3224 +02-1075-4690 +02-9324-7803 +03-8357-4617 +08-4563-9520 +08-8808-8104 +08-2922-4115 +07-1964-4238 +02-1987-8525 +08-1683-9243 +02-2621-3361 +03-8780-3473 +03-9480-9611 +02-5977-8561 +08-1687-4873 +08-7605-2080 +07-1037-3391 +08-5227-2620 +08-6278-9532 +03-5662-3542 +03-2802-7434 +02-6078-3417 +03-9050-2741 +07-5085-8138 +08-8012-6469 +02-9472-5814 +03-2324-3472 +02-8010-8344 +08-1269-1489 +03-5213-8219 +08-5203-2193 +03-2813-6426 +08-2089-8553 +02-4885-8382 +08-4849-4417 +03-4829-5695 +08-6742-2308 +07-9920-3550 +07-3103-8372 +08-4040-9192 +07-4724-9987 +07-4518-4450 +08-8587-1196 +08-1140-6357 +03-5355-5505 +07-5486-1002 +08-8215-1588 +03-9173-6140 +07-4297-4607 +07-6793-5954 +02-5444-1961 +07-6113-9653 +02-3225-1954 +08-9707-2679 +08-8147-9584 +07-7240-6480 +03-6340-5010 +08-7432-4632 +07-6444-3666 +07-5686-8088 +08-3562-8644 +08-3733-5261 +02-6291-7620 +07-3476-2066 +08-9808-2647 +02-5808-6388 +02-5632-9914 +02-6974-7785 +02-3490-2407 +02-1222-7812 +07-8516-6453 +02-4623-8120 +02-8035-9997 +03-6589-2556 +08-6937-4366 +02-3416-9617 +02-3003-1369 +08-2901-3421 +08-2401-5672 +07-6679-3722 +02-8156-6969 +03-1861-5074 +03-6340-9772 +02-3869-4096 +08-3200-1670 +02-1919-1709 +07-5017-7337 +02-6529-9317 +02-4776-1384 +08-9919-9540 +02-5318-1342 +07-8250-2277 +08-2127-5977 +08-7385-2716 +02-3566-7608 +03-6623-5501 +02-6689-1150 +08-6137-1726 +03-4492-4927 +08-3087-9658 +02-3494-3282 +08-3174-2706 +02-6193-5184 +08-3412-6699 +08-1196-2822 +07-9265-7183 +03-8791-9436 +08-9919-7850 +07-2627-9976 +03-1765-4584 +08-5228-3628 +03-2749-1381 +08-1042-4275 +02-1211-3823 +02-1385-3480 +03-1447-7041 +02-9676-4462 +07-7538-5504 +03-8055-8668 +07-5354-7251 +08-1991-6947 +02-4885-1611 +02-2957-4812 +02-7091-8948 +02-9653-2199 +07-8738-4205 +08-9895-1954 +03-3608-5660 +02-1827-1736 +07-7369-8849 +02-1815-8700 +03-4010-1900 +02-8081-3883 +08-4700-8894 +08-1109-5346 +08-9280-9177 +07-7489-7577 +03-8451-7537 +02-4649-5341 +02-5770-8546 +08-9378-7021 +03-2574-8915 +08-2704-3706 +03-3233-4255 +03-7416-6750 +02-4418-5927 +07-6073-5039 +03-1248-8221 +08-3305-5436 +03-3695-2399 +08-1399-2471 +03-3725-6290 +02-7947-2980 +08-2264-5559 +03-1036-9594 +02-3713-3646 +07-5346-5917 +08-9757-2379 +02-5573-6627 +08-7785-3040 +08-3987-7521 +08-8280-9492 +03-1051-7865 +08-2136-2433 +07-5235-7319 +03-9599-4122 +07-4119-3981 +02-8727-4906 +02-6118-8773 +07-3511-9233 +03-4811-3832 +08-6579-7569 +07-1536-4805 +03-6698-8416 +03-1560-6800 +03-5354-9557 +02-5059-2649 +08-6270-6829 +08-2209-8647 +08-8222-3171 +08-7718-8495 +02-9828-4921 +03-4800-7102 +03-6438-4586 +08-5175-3585 +03-2689-6049 +03-2775-4083 +02-5630-3114 +07-9032-5149 +08-6831-6370 +07-5626-7937 +07-2209-2731 +08-8506-7259 +03-9424-2956 +02-4074-4461 +07-5128-8956 +08-8329-4211 +08-6069-1579 +02-1157-3829 +08-8878-5994 +08-4326-1560 +07-2031-6566 +02-2501-8301 +02-5402-8024 +07-5404-6221 +07-6382-5073 +02-8222-9319 +02-1706-8506 +07-5922-1983 +02-4360-8467 +02-2581-7479 +07-6984-9278 +02-1291-8182 +03-9721-7313 +03-3457-2524 +07-1377-6898 +02-4202-5191 +03-3630-2467 +07-8561-5894 +02-6995-9902 +02-3738-7508 +08-3773-3770 +02-7862-5151 \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/postcode.list b/src/main/resources/sampledata/~act/postcode.list new file mode 100644 index 000000000..5f33c9eb5 --- /dev/null +++ b/src/main/resources/sampledata/~act/postcode.list @@ -0,0 +1,500 @@ +7315 +4613 +6215 +2640 +1595 +6316 +6258 +2803 +4356 +5357 +4343 +7140 +4343 +6931 +4030 +2820 +4560 +2259 +2603 +4610 +2806 +2289 +4505 +4879 +3959 +4816 +7264 +4411 +810 +3249 +2429 +4343 +6909 +4066 +3357 +2083 +4605 +4311 +6532 +4721 +5554 +2452 +2250 +3557 +2261 +4719 +2372 +3002 +4068 +6733 +4552 +6280 +2529 +2257 +2030 +3971 +4350 +6472 +2441 +4741 +4887 +2092 +7258 +2446 +4359 +4053 +2669 +2284 +4816 +2675 +3079 +3630 +3341 +3995 +6311 +6352 +3927 +7140 +4740 +4520 +4800 +3350 +5603 +3860 +7315 +7172 +5374 +3221 +6355 +3782 +3640 +5172 +6037 +2710 +4741 +2340 +2448 +2333 +4350 +6953 +3124 +6906 +2470 +4703 +6935 +6210 +2665 +4670 +1595 +3073 +4055 +3885 +5730 +5062 +7112 +4122 +7321 +3888 +2650 +5115 +2481 +6286 +3240 +6338 +7330 +2155 +4489 +4860 +6521 +5126 +2300 +7005 +3072 +4075 +7310 +3987 +4871 +7260 +3765 +3046 +5083 +4615 +5068 +4214 +3701 +3714 +5661 +7252 +2287 +4128 +2786 +3858 +6460 +3155 +3670 +2159 +4703 +7301 +3465 +2429 +4816 +3688 +7275 +3889 +5015 +5087 +4710 +3032 +4387 +4570 +836 +6330 +3081 +2017 +3392 +4555 +1220 +4564 +4493 +6056 +5113 +2652 +5485 +2035 +3697 +3215 +4350 +6535 +2262 +6420 +4659 +4481 +3134 +7004 +2538 +4871 +5025 +5011 +5171 +3462 +1235 +6450 +3494 +3095 +3109 +6477 +6008 +2145 +2232 +7120 +810 +3691 +7116 +6430 +2608 +4680 +5244 +6280 +3420 +3809 +2229 +7255 +6061 +812 +2483 +5063 +2422 +3081 +2474 +2703 +3284 +4820 +6407 +4703 +6320 +3241 +6207 +3011 +6462 +4823 +6152 +4344 +2324 +3678 +2530 +3314 +2877 +2340 +2194 +2160 +4813 +4615 +4311 +4551 +2795 +7186 +4702 +4610 +6522 +2329 +2484 +4615 +3167 +4871 +2317 +4670 +5213 +3084 +2381 +5158 +4626 +2765 +5034 +6285 +4860 +5573 +1835 +7004 +2871 +2798 +3401 +5046 +5120 +5153 +4227 +2560 +846 +2150 +3791 +7316 +2322 +6397 +6215 +4412 +6503 +6030 +3981 +3194 +2298 +3496 +4870 +6405 +2443 +3995 +2166 +5291 +3309 +5353 +3019 +6302 +2321 +6031 +3934 +5480 +4064 +4858 +5131 +4621 +4305 +5204 +6409 +3631 +4871 +6336 +3370 +4355 +4740 +2138 +4205 +3644 +6155 +6056 +4516 +3782 +6394 +4227 +4454 +6210 +6983 +2322 +4009 +5301 +2008 +2263 +2474 +2469 +2539 +4497 +2901 +2083 +7030 +6302 +2126 +2663 +6532 +5236 +4494 +2447 +3810 +7140 +2540 +6532 +2000 +4405 +2304 +2440 +6521 +2420 +4217 +6112 +5220 +2820 +3260 +2600 +6225 +7250 +5495 +2580 +6320 +2330 +6308 +6258 +4051 +3223 +5724 +4718 +3128 +820 +3008 +6041 +2700 +2666 +3697 +2550 +4120 +3216 +4221 +6159 +2609 +2425 +2208 +2463 +4825 +6556 +3501 +2477 +4356 +2024 +3236 +2620 +6237 +6472 +5042 +4355 +3265 +2669 +2761 +6210 +3465 +6155 +3551 +3775 +2481 +4670 +3207 +5159 +3900 +6701 +3468 +2750 +5642 +7304 +2456 +4207 +5723 +2082 +6018 +6514 +6608 +3757 +6155 +4570 +3023 +4555 +2259 +2793 +4741 +3442 +6076 +4754 +7190 +3701 +7321 +1455 +6447 +5240 +5416 +5483 +2323 +7150 +3185 +6445 +3895 +3451 +2068 +4001 +6452 +4740 +4313 +820 +7163 +2529 +4455 +6106 +6532 +2650 +6320 +6623 +4562 +2311 +2745 +4856 +4615 +2850 +2429 +4712 +2326 +2480 +4401 +2600 +7275 +3814 +4362 +2339 +3038 +4490 +2388 +2138 +6450 +2850 \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/state.list b/src/main/resources/sampledata/~act/state.list new file mode 100644 index 000000000..7ff3c2b34 --- /dev/null +++ b/src/main/resources/sampledata/~act/state.list @@ -0,0 +1,7 @@ +NSW +QLD +WA +NT +TA +ACT +VIC \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/street.list b/src/main/resources/sampledata/~act/street.list new file mode 100644 index 000000000..e4fb795af --- /dev/null +++ b/src/main/resources/sampledata/~act/street.list @@ -0,0 +1,500 @@ +171 E 24th St +22222 Acoma St +534 Schoenborn St #51 +69206 Jackson Ave +808 Glen Cove Ave +373 Lafayette St +87 Sylvan Ave +60562 Ky Rt 321 +70 S 18th Pl +8839 Ventura Blvd +3684 N Wacker Dr +68828 S 32nd St #6 +43157 Cypress St +6 S Hanover Ave +27916 Tarrytown Rd +79620 Timber Dr +387 Airway Cir #62 +570 W Pine St +823 Fishers Ln +4 Brookcrest Dr #7786 +72 Wyoming Ave +754 Sammis Ave +660 N Green St +970 Waterloo Rd +4129 Abbott Dr +1529 Prince Rodgers Ave +2 N Valley Mills Dr +50968 Kurtz St #45 +71585 S Ayon Ave #9 +8 Old County Rd #3 +13904 S 35th St +6149 Kapiolani Blvd #6 +95431 34th Ave #62 +25 Swift Ave +14304 Old Alexandria Ferry Rd +1585 Salem Church Rd #59 +75962 E Drinker St +8978 W Henrietta Rd +86 Worth St #272 +15 Campville Rd #191 +3 N Ridge Ave +3713 Poway Rd +1 E 17th St +5 Liberty Ave +404 Broxton Ave +4 S Main St #285 +1255 W Passaic St #1553 +377 Excalibur Dr +7 Wilshire Blvd +7 Hugh Wallis Rd +7177 E 14th St +67765 W 11th St +99968 Merced St #79 +40 E 19th Ave +84826 Plaza Dr +20214 W Main St +8039 Howard Ave +8 Austin Bluffs Pky +96605 Pioneer Rd +6 Hope Rd #10 +65898 E St Nw +39 Broad St +654 Seguine Ave +78 31st St +35673 Annapolis Rd #190 +98247 Russell Blvd +3 S Willow St #82 +199 Maple Ave +423 S Navajo St #56 +5 30w W #3083 +57245 W Union Blvd #25 +971 Northwest Blvd +1089 Pacific Coast Hwy +6787 Emerson St +8 Middletown Blvd #708 +56 Tank Farm Rd +503 Fulford Ave +8275 Calle De Industrias +92 South St +56710 Euclid Ave +5210 E Airy St #2 +31 Schuyler Ave +661 Plummer St #963 +1351 Simpson St +2391 Pacific Blvd +1886 2nd Ave +52404 S Clinton Ave +405 W Lee St +5656 N Fiesta Blvd +9 Beverly Rd #5 +96 Armitage Ave +523 N Prince St +6926 Orange Ave +6940 Prospect Pl +52347 San Fernando Rd +5399 Mcwhorter Rd +7 Hall St +5 W Allen St +15126 Goldenwest St +94 I 55s S +288 N 168th Ave #266 +5 Richmond Ct +28 Aaronwood Ave Ne +39701 6th Ave #1485 +35662 S University Blvd +73 Dennison St #70 +9591 Bayshore Rd #637 +57 N Weinbach Ave +286 Santa Rosa Ave +446 Woodward Ave #1 +1 Jenks Ave +7 Valley Blvd +42741 Anania Dr +5 Shakespeare Ave +245 5th Ave +2 Gateway Ctr +3175 Northwestern Hwy +8 S Plaza Dr +8 Collins Ave +9526 Lincoln St +406 E 4th St +361 Via Colinas +94 S Jefferson Rd +8961 S Central Expy +7 Wiley Post Way +60 S 4th St +6 Lafayette St #3034 +35 Jefferson Ave +3492 88th St +20 Sw 28th Ter +6 Argyle Rd +438 E Reynolds Rd #239 +47 Hall St +17720 Beach Blvd +8 2nd St +490 Court St +1456 Hill Rd +6 7th St +29 Nottingham Way #926 +8818 Century Park E #33 +4 Commerce Center Dr +979 S La Cienega Blvd #627 +9181 E 26th St +8855 North Ave +4 Spinning Wheel Ln +5905 S 32nd St +514 Glenn Way +708 S Wilson Way +16949 Harristown Rd +9 13th Ave S +1 Rock Island Rd #8 +1554 Bracken Crk +7 10th St W +9 Cron Hill Dr +82 Tremont St #4 +30024 Whipple Ave Nw +900 W Wood St +847 Norristown Rd +667 S Highland Dr #4 +21 W 2nd St +2 W Henrietta Rd #6 +82655 Shawnee Mission Pky #5798 +9 Taylor Ave +62 J St #450 +2 Pennington St +5496 Ne Columbia Blvd +4244 Lucas Creek Rd +79819 Palmetto Ave +7 N Glenn Rd +61 Center St #8 +562 Nw Cornell Rd +48 General George Patton Dr #8611 +9 W Passaic St +968 Delaware Ave +548 Charmonie Ln +91114 Grand Ave +44 Bush St +6 Mahler Rd +1 E Main St +58 State St #998 +11408 Green St +297 8th Ave S #9 +1 Wyckoff Ave +8 E North Ave +13386 Tamarco Dr #20 +70 W Market St #20 +53247 Montgomery St #36 +9495 Central Hwy #66 +2 Route 9 +75700 Academy Rd +6 Monte Ave +5 France Ave S +803 Tupper Ln +43 Nolan St +6 W 39th St +910 21st St +2677 S Jackson St +6 Central Ave #4 +564 Almeria Ave #7474 +4 Grand St +9 Hamilton Blvd #299 +50638 Northwest Blvd +51 Bridge Ave +457 St Sebastian Way #189 +6 Ackerman Rd +8 W Lake St #1 +8454 6 17 M At Bradleys +5 Ellestad Dr +9 N Nevada Ave +790 E Wisconsin Ave +60481 N Clark St +43 E Main St +5 Madison St #4651 +85 Nw Frontage Rd +584 Meridian St #997 +28220 Park Avenue W +5 Austin Ave +481 925n N #959 +9 9th St #4 +56232 Hohman Ave +3 Wall St #26 +63154 Artesia Blvd +32 E Poythress St +86274 Howell Mill Rd Nw +25488 Brickell Ave +270 5th Ave +891 Union Pacific Ave #8463 +4562 Aurora Ave N +4864 N 168th Ave +7 Elm Ave +6508 Adams St #32 +6434 Westchester Ave #28 +70680 S Rider Trl +700 Factory Ave #5649 +3 Cherokee St +76542 W Bijou St +44009 W 63rd #269 +462 Morris Ave +1 El Camino Real #603 +92417 Arbuckle Ct +1 Westpark Dr +5 Montana Ave +6629 Main St +4 W 18th St +95412 16th St #6 +17 Kamehameha Hwy +8650 S Valley View Bld #6941 +16 Talmadge Rd +750 Lancaster Ave +8808 Northern Blvd +76596 Pleasant Hill Rd +94 Delta Fair Blvd #2702 +25 Sw End Blvd #609 +15258 W Charleston Blvd +75 Ryan Dr #70 +9634 South St +40490 Morrow St +9 Commerce Cir +190 34th St #8 +1036 Malone Rd +398 Fort Campbell Blvd #923 +2799 Cajon Blvd +302 N 10th St #3896 +79346 Firestone Blvd +37564 Grace Ln +470 W Irving Park Rd +6 Jefferson St +1758 Park Pl +7659 Market St +95830 Webster Dr +26 Old William Penn Hwy +343 E Main St +8 Cabot Rd +8 Allied Dr +26921 Vassar St +9 Old York Rd #418 +12398 Duluth St +960 S Arroyo Pkwy +53 Euclid Ave +700 Wilmson Rd +466 Hillsdale Ave +86351 Pine Ave +6139 Contractors Dr #450 +83 Longhurst Rd +76 Daylight Way #7 +3883 N Central Ave +75 E Main +9 Memorial Pky Nw +70086 Division St #3 +4 Middletown Blvd #33 +20907 65s S +82136 Post Rd +3 W Pioneer Dr +5610 Holliday Rd +29133 Hammond Dr #1 +51 Greenwood Ave +327 Ward Pky +52680 W Hwy 55 #59 +654 Se 29th St +65 Clayton Rd +136 2nd Ave N +3 N Michigan Ave +1607 Laurel St +77818 Prince Drew Rd +1 Vogel Rd +5 Main St +7696 Carey Ave +76 San Pablo Ave +767 9th Ave Sw +82 Hopkins Plz +64 Prairie Ave +5 Jackson St +705 Stanwix St +3318 Buckelew Ave +38494 Port Reading Ave +81 Us Highway 9 +45 Mountain View Ave +6 W Meadow St +2 Old Corlies Ave +5614 Public Sq +6 E Gloria Switch Rd #96 +1 Us Highway 206 +5289 Ramblewood Dr +5 Aquarium Pl #1 +466 Lincoln Blvd +42 United Dr +5920 E Arapahoe Rd +2 New Brooklyn Rd +9 34th Ave #69 +32716 N Michigan Ave #82 +78 Sw Beaverton Hillsdale H +8494 E 57th St +46 Broadway St +228 S Tyler St +2714 Beach Blvd +3266 Welsh Rd +1 S Maryland Pky +6 De Belier Rue +57869 Alemany Blvd +39 Plummer St +78717 Graves Ln +30338 S Dunworth St +6 Walnut St +2244 Franquette Ave +9892 Hernando W +9296 Prince Rodgers Ave +9 Chandler Ave #355 +173 Howard Ave +3216 W Wabansia Ave +947 W Harrison St #640 +94843 Trabold Rd #59 +8 Lincoln Way W #6698 +262 Montauk Blvd +5040 Teague Rd #65 +54648 Hylan Blvd #883 +7463 Elmwood Park Blvd +630 E Plano Pky +166 N Maple Dr +20 Meadow Ln +73 Robert S +512 E Idaho St +98021 Harwin Dr +892 Sw Broadway #8 +192 N Sheffield Ave +5 Columbia Pike +35983 Daubert St +678 S Main St +532 Saint Marks Ct +1337 N 26th St +556 Bernardo Cent +9561 Chartres St +11999 Main St +495 Distribution Dr #996 +49 Walnut St +85 S Washington Ave +72984 W 1st St +3 Ridge Rd W #949 +2 Landmeier Rd +82 W Market St +89 N Himes Ave +62296 S Elliott Rd #2 +8 S Main St +50808 A Pamalee Dr +30691 Poplar Ave #4 +80968 Armitage Ave +5 Pittsburg St +812 Berry Blvd #96 +73 12th St +27730 American Ave +72 Park Ave +59215 W 80th St +186 Geary Blvd #923 +717 Midway Pl +68 Camden Rd +175 N Central Ave +80896 South Ave +6584 S Bascom Ave #371 +64865 Main St +62171 E 6th Ave +67729 180th St +7721 Harrison St +5351 E Thousand Oaks Blvd +5 Carpenter Ave +374 Sunrise Ave +68538 N Bentz St #1451 +23 S Orange Ave #55 +4373 Washington St +61550 S Figueroa St +8 N Town East Blvd +2452 Bango Rd +8219 Roswell Rd Ne +3 Davis Blvd +1 S Marginal Rd +78 S Robson +2749 Van Nuys Blvd +722 E Liberty St +9 Gunnison St +2902 Edison Dr #278 +72 N Buckeye Ave +41 E Jackson St +684 William St +185 W Guadalupe Rd +18514 E 4th St #8 +28 Standiford Ave #6 +33108 S Yosemite Ct +73778 Battery St +351 Crooks Rd +8 Glenn Way #3 +8 W Virginia St +65484 Bainbridge Rd +156 Morris St +1881 Market St +6 Kings St #4790 +9787 Dunksferry Rd +13 Blanchard St #996 +2 Pompton Ave +2867 Industrial Way +850 Warwick Blvd #58 +2 Ellis Rd +80 Monroe St +71089 Queens Blvd +66094 Pioneer Rd +66 Congress St +44 105th Ave +40809 Rockburn Hill Rd +9 Green Rd #5877 +63 W 41st Ave #93 +2 Stirrup Dr #4907 +19 Court St +3 Hwy 61 #2491 +97539 Connecticut Ave Nw #3586 +59 Murray Hill Pky +15 W 11mile Rd +709 New Market St +324 Shawnee Mission Pky +37 Saint Louis Ave #292 +80289 Victory Ave #9 +16 Governors Dr Sw +4 E Aven #284 +262 8th St +79 State Route 35 +75 Blackington Ave +6 Abbott Rd +5159 Saint Ann St +26 Ripley St #5444 +39828 Abbott Rd +2495 Beach Blvd #557 +3 Bustleton Ave +7 N 4th St +1 National Plac #6619 +248 Academy Rd +2 State Hwy +6 W Cornelia Ave +461 S Fannin Ave +51255 Tea Town Rd #9 +93 Bloomfield Ave #829 +5775 Mechanic St #517 +3 Industrial Blvd +8202 Cornwall Rd +53597 W Clarendon Ave +577 Cleveland Ave +259 1st Ave +79 Mechanic St +269 Executive Dr +79 Runamuck Pl +31 Guilford Rd #7904 +504 Steve Dr +407 E 57th Ave +72 W Ripley Ave +75 Elm Rd #1190 +32 Broadway St +41 Washington Blvd +5 Buford Hwy Ne #3 +6 Flex Ave +21058 Massillon Rd +28465 Downey Ave #4238 +2803 N Catalina Ave +22 Livingston Ave +403 Conn Valley Rd +5400 Market St \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/suburb.list b/src/main/resources/sampledata/~act/suburb.list new file mode 100644 index 000000000..b779cafb6 --- /dev/null +++ b/src/main/resources/sampledata/~act/suburb.list @@ -0,0 +1,500 @@ +Leith +Proston +Hamel +Talmalmo +Lane Cove +Cartmeticup +Nyamup +Bendick Murrell +Purrawunda +Blanchetown +Rockside +Rosegarland +Ringwood +Maylands +Wooloowin +Arthurville +Mapleton +Tuggerawong +Red Hill +Inverlaw +Eugowra +Kotara Fair +Burpengary +Ellis Beach +Fish Creek +Kennedy +Cape Portland +Warra +Wanguri +Alvie +Wherrol Flat +Placid Hills +Nedlands +Auchenflower +Buninyong +Dangar Island +Sunny Nook +Minden +Tibradden +Clermont +Kadina +Sawtell +East Gosford +Fosterville +Bateau Bay +Glenmoral +Bolivia +East Melbourne +Taringa +Koolan Island +Maleny +Yelverton +Flinders +Empire Bay +Rose Bay North +Macks Creek +East Toowoomba +Bimbijy +Kundabung +Pinnacle +Watsonville +Seaforth +White Hills +Bellangry +Ascot +Stafford Heights +Bygalorie +Boolaroo +Brookhill +Hillston +Ivanhoe East +Caniambo +Myrniong +Woolamai +Wardering +Kukerin +Somers +Wayatinah +Alligator Creek +Camp Mountain +Brandy Creek +Sovereign Hill +Arno Bay +Maffra +Ulverstone +Wattle Hill +Bower +Stonehaven +East Newdegate +Emerald +Katunga +Willunga +Two Rocks +Caldwell +Coppabella +Calala +Nambucca Heads +Mccullys Gap +Toowoomba South +Applecross +Camberwell West +North Perth +Coombell +Pacific Heights +Guildford +Herron +Mirrool +Bundaberg West +Lane Cove +Reservoir +Upper Kedron +Buchan +Beltana +Kingswood +Nicholls Rivulet +Upper Mount Gravatt +Ridgley +Tubbut +Collingullie +Munno Para +Tyagarah +Redgate +Modewarre +Stirling Range National Park +Trowutta +Rouse Hill +Wyandra +Goondi Hill +Hill River +Fairview Park +Bar Beach +University Of Tasmania +Regent West +Oxley +Don +Nyora +Croydon +Scottsdale +Montrose +Oak Park +Nailsworth +Tarong +Kensington Park +Ashmore +Granya +Alexandra +Wirrulla +Weymouth +Summer Hill +Shailer Park +Bell +Licola +Walyormouring +Boronia +Baddaginnie +Berrilee +Barmaryee +Longford +Simson +Killabakh +Paluma +Barnawartha +Holwell +Combienbar +Port Adelaide +Klemzig +Emu Park +Travancore +Whetstone +Corella +Humpty Doo +Goode Beach +Heidelberg Rgh +Waterloo +Minyip +Hunchy +Grosvenor Place +Pacific Paradise +Hungerford +Boya +Elizabeth West +Gumly Gumly +Wilmington +Pagewood +Tawonga +Hamlyn Heights +Southtown +East Bowes +Blue Haven +Cramphorne +Beelbi Creek +Tanbar +Ringwood +Battery Point +Milton +Laura +Kidman Park +Woodville +Pedler Creek +Muckleford South +Sydney South +Bandy Creek +Carwarp +Eltham +Doncaster East +Welbungin +Shenton Park +Girraween +Woronora +Woodbury +Lee Point +Baranduda +Police Point +Williamstown +Civic Square +Taragoola +Charleston +Kealy +Lillimur +Officer +Lilli Pilli +Blue Rocks +Westminster +Karama +Ocean Shores +Eastwood +Gloucester +Heidelberg Rgh +The Risk +Yanco +Port Fairy +Queenton +Watercarrin +Yeppoon +Bobalong +Wurdiboluc +North Dandalup +Seddon +Hindmarsh +Julia Creek +Salter Point +Lilydale +Tea Gardens +Oxley +Yallah +Cavendish +Condobolin +West Tamworth +Campsie +Merrylands +Townsville Milpo +Runnymede +Coominya +Aroona +Duramana +Saltwater River +Bluff +Kingaroy +Nangetty +Uarbry +Cudgera Creek +East Nanango +Oakleigh South +Gununa +Salamander Bay +Bundaberg North +Middleton +Eaglemont +Premer +Trott Park +Boynewood +Maraylya +Wayville +Burnside +Daradgee +Weetulta +Auburn +South Hobart +Forbes +Forest Reefs +Rocklands +Oaklands Park +Buckland Park +Longwood +Varsity Lakes +Appin +Adelaide River +Harris Park +Kallista +Camena +Woodberry +Rocky Gully +Preston Beach +Brigalow +Beermullah +Ridgewood +Bayles +Moorabbin Airport +Waratah West +Cullulleraine +Cairns City +Warding East +North Haven +Cape Paterson +Cabramatta +Kongorong +Digby +Sedan +Braybrook +Inkpen +Gillieston Heights +Neerabup +Mount Martha +Appila +Milton +Etty Bay +Lower Hermitage +Degilbo +Eastern Heights +Normanville +Yorkrakine +Kialla East +Glen Boughton +Ongerup +Clunes +Pierces Creek +Andergrove +Concord West +Bethania +Barooga +Willetton +Stratton +Elimbah +Emerald +Changerup +Varsity Lakes +Durham Downs +Bouvard +Bentley Dc +Thornton +Eagle Farm +Peake +Chippendale +Gorokan +Grevillia +Chatsworth +Bawley Point +Weengallon +Tuggeranong Dc +Dangar Island +Shannon +Greenhills +Cherrybrook +Junee +Tibradden +Tungkillo +Tarawera +Scotts Head +Pakenham Upper +Westerway +Burrier +East Nabawa +Millers Point +Bunya Mountains +Mayfield East +Verges Creek +Hill River +Marshdale +Bundall +Mount Nasura +Parndana +Dripstone +Gnotuk +Yarralumla +Muja +Summerhill +Port Flinders +Wombeyan Caves +Dartnall +Dural +Wandering +Manjimup +Grange +Indented Head +Marla +Mungabunda +Houston +Larrakeyah +Docklands +Gabbadah +Morundah +Trungley Hall +Tawonga +Kingswood +Greenslopes +Grovedale +Elanora +North Fremantle +Fyshwick +Allworth +Kingsway West +Woodford +Breakaway +Gorrie +Koorlong +Wardell +Bongeen +Waverley +Forrest +Gundaroo +North Boyanup +Mouroubra +Flinders University +Crows Nest +Panmure +Bygalorie +Oakhurst +Mandurah East +Daisy Hill +Willetton +Tarnagulla +Steels Creek +Broken Head +Bundaberg West +Port Melbourne +Happy Valley +Benambra +Brockman +Amphitheatre +Penrith +Darke Peak +Mole Creek +Emerald Beach +Logan Village +Coober Pedy +Berowra Heights +Innaloo +Leeman +East Damboring +Kinglake West +Canning Vale +Upper Glastonbury +Caroline Springs +Hunchy +Hamlyn Terrace +Darbys Falls +Pinnacle +Carlsruhe +Paulls Valley +Mirani +Buckland +Mitta Mitta +Boat Harbour Beach +Botany +Scaddan +Lenswood +Farrell Flat +Melrose +Freemans Waterhole +Simpsons Bay +Ripponlea +North Cascade +Ensay +Golden Point +Middle Cove +Waterfront Place +Buraminya +Balnagowan +Lower Cressbrook +Larrakeyah +Middleton +Oak Flats +Orange Hill +Welshpool +Minnenooka +Wagga Wagga South +Wansbrough +Pintharuka +Eumundi +Halton +Glenmore Park +Mccutcheon +Pimpimbudgee +Ilford +Caparra +Duaringa +Weston +Clunes +Oakey +Barton +Lanena +Cora Lynn +Allora +Willow Tree +Keilor Downs +Barringun +Pilliga +Rhodes +Castletown +Turill \ No newline at end of file From 4fa23a744277d796faf4b50556bca936cf188609 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 6 Jul 2018 14:22:32 +1000 Subject: [PATCH 013/730] Allow use app name and version as server header #710 --- CHANGELOG.md | 1 + src/main/java/act/conf/AppConfig.java | 33 +++++++++++++++++++++++- src/main/java/act/conf/AppConfigKey.java | 8 ++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7817a35e3..cd8e941d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Allow use app name and version as server header #710 * API doc - provide a mechanism allow plugin sample data generator #709 * Create an annotation to force application to add `DisableCircularReferenceDetect` to FastJSON #706 * Add `DisableCircularReferenceDetect` feature to FastJSON by default #705 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index fcdbb8335..bc556b964 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -61,6 +61,7 @@ import org.osgl.util.*; import org.osgl.web.util.UserAgent; import org.rythmengine.utils.Time; +import osgl.version.Version; import java.awt.*; import java.io.File; @@ -2480,6 +2481,19 @@ private void _mergeRenderJsonOutputCharset(AppConfig config) { private String serverHeader; private static final String DEF_SERVER_HEADER = "act/" + Act.VERSION.getProjectVersion(); + private static String DEF_APP_SERVER_HEADER = appServerHeader(); + private static String appServerHeader() { + App app = Act.app(); + if (null == app) { + return "app/1.0"; + } + String shortId = app.shortId(); + if (null == shortId) { + shortId = "app"; + } + Version version = app.version(); + return shortId + "/" + (null == version ? "1.0" : version.getProjectVersion()); + } protected T serverHeader(String header) { serverHeader = header; @@ -2488,7 +2502,7 @@ protected T serverHeader(String header) { public String serverHeader() { if (null == serverHeader) { - serverHeader = get(AppConfigKey.SERVER_HEADER, DEF_SERVER_HEADER); + serverHeader = get(AppConfigKey.SERVER_HEADER, serverHeaderUseApp() ? DEF_APP_SERVER_HEADER : DEF_SERVER_HEADER); } return serverHeader; } @@ -2499,6 +2513,23 @@ private void _mergeServerHeader(AppConfig config) { } } + private Boolean serverHeaderUseApp; + protected T serverHeaderUseApp(boolean b) { + serverHeaderUseApp = b; + return me(); + } + private boolean serverHeaderUseApp() { + if (null == serverHeaderUseApp) { + serverHeaderUseApp = get(AppConfigKey.SERVER_HEADER_USE_APP, true); + } + return serverHeaderUseApp; + } + private void _mergeServerHeaderUseApp(AppConfig config) { + if (!hasConfiguration(SERVER_HEADER_USE_APP)) { + serverHeaderUseApp = config.serverHeaderUseApp; + } + } + private String sessionKeyUsername = null; protected T sessionKeyUsername(String name) { diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 90d77a5fc..99dbf14b9 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -984,6 +984,14 @@ public T val(Map configuration) { */ SERVER_HEADER("server.header"), + /** + * `server.header.user-app.enabled` specifies whether use app name and + * version as the server header. + * + * Default value: `true` + */ + SERVER_HEADER_USE_APP("server.header.use-app.enabled"), + /** * `session.outputExpiration.enabled` turn on/off expiration output to * response header. From f535e35bca19acaa87986d51bb23bf2d34f523b8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 7 Jul 2018 13:48:23 +1000 Subject: [PATCH 014/730] `NullPointerException` encountered when app started with SQL db plugin without model classes #707 --- CHANGELOG.md | 1 + .../java/act/apidoc/SampleDataCategory.java | 2 +- .../act/db/meta/MasterEntityMetaInfoRepo.java | 71 ++++++++++++++++++- .../java/act/util/FastJsonJodaDateCodec.java | 4 +- 4 files changed, 74 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd8e941d3..736e7a67d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `NullPointerException` encountered when app started with SQL db plugin without model classes #707 * Allow use app name and version as server header #710 * API doc - provide a mechanism allow plugin sample data generator #709 * Create an annotation to force application to add `DisableCircularReferenceDetect` to FastJSON #706 diff --git a/src/main/java/act/apidoc/SampleDataCategory.java b/src/main/java/act/apidoc/SampleDataCategory.java index b42312718..8967c1df5 100644 --- a/src/main/java/act/apidoc/SampleDataCategory.java +++ b/src/main/java/act/apidoc/SampleDataCategory.java @@ -33,7 +33,7 @@ public enum SampleDataCategory { LAST_NAME("surname", "family name", "lname", "lastname"), FULL_NAME("fullname"), DOB("Birthday", "生日", "DateOfBirth", "*date", "date*"), - EMAIL, + EMAIL("mail"), HOST, STREET, SUBURB("city"), diff --git a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java index f675a7faf..9991ebfb4 100644 --- a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java +++ b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java @@ -26,6 +26,8 @@ import act.db.DB; import act.job.JobManager; import act.util.ClassInfoRepository; +import org.osgl.util.C; +import org.osgl.util.E; import java.lang.annotation.Annotation; import java.util.HashMap; @@ -41,6 +43,8 @@ @Singleton public class MasterEntityMetaInfoRepo extends EntityMetaInfoRepo { + private static EntityMetaInfoRepo EMPTY; + // map entity meta info repo to db id private Map regions = new HashMap<>(); @@ -52,6 +56,71 @@ public class MasterEntityMetaInfoRepo extends EntityMetaInfoRepo { @Inject public MasterEntityMetaInfoRepo(final App app) { super(app); + EMPTY = new EntityMetaInfoRepo(app){ + @Override + public void registerEntityOrMappedSuperClass(String className) { + E.unsupport(); + } + + @Override + public void registerEntityName(String className, String entityName) { + E.unsupport(); + } + + @Override + public void markEntityListenersFound(String className) { + E.unsupport(); + } + + @Override + public void registerCreatedField(String className, String fieldName) { + E.unsupport(); + } + + @Override + public void registerLastModifiedField(String className, String fieldName) { + E.unsupport(); + } + + @Override + public void registerIdField(String className, String fieldName) { + E.unsupport(); + } + + @Override + public void registerColumnName(String className, String fieldName, String columnName) { + E.unsupport(); + } + + @Override + public boolean isRegistered(String className) { + return false; + } + + @Override + public Set entityClasses() { + return C.Set(); + } + + @Override + public EntityClassMetaInfo classMetaInfo(Class entityClass) { + return null; + } + + @Override + public EntityClassMetaInfo classMetaInfo(String className) { + return null; + } + + @Override + protected void releaseResources() { + } + + @Override + void register(Class entityClass, EntityClassMetaInfo info) { + E.unsupport(); + } + }; registerEntityAnnotation(Entity.class); registerMappedSuperClassAnnotation(MappedSuperclass.class); registerEntityListenerAnnotation(EntityListeners.class); @@ -135,6 +204,6 @@ public EntityMetaInfoRepo forDb(String dbId) { } repo = regions.get(dbId); } - return repo; + return null != repo ? repo : EMPTY; } } diff --git a/src/main/java/act/util/FastJsonJodaDateCodec.java b/src/main/java/act/util/FastJsonJodaDateCodec.java index b08edbd47..f5fe0996d 100644 --- a/src/main/java/act/util/FastJsonJodaDateCodec.java +++ b/src/main/java/act/util/FastJsonJodaDateCodec.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. From 22d9dc6de3985c2692fb5124a5f2ef34a53052e5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 7 Jul 2018 21:20:58 +1000 Subject: [PATCH 015/730] #704 - update to osgl-http-1.8.1-SNAPSHOT; update testapp --- pom.xml | 2 +- .../main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java | 2 ++ testapp/src/test/java/testapp/endpoint/EndpointTester.java | 2 +- testapp/src/test/java/testapp/endpoint/GHIssue547.java | 2 +- testapp/src/test/java/testapp/endpoint/GHIssue657.java | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 42d474e3b..bcac827fd 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ 1.18.0-SNAPSHOT 1.5.0 1.8.0 - 1.8.0 + 1.8.1-SNAPSHOT 1.8.1-SNAPSHOT 1.7.0 1.2.0 diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java b/testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java index ed3cb80a1..0982e17ab 100644 --- a/testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java +++ b/testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java @@ -1,6 +1,7 @@ package testapp.endpoint.ghissues.gh692; import act.controller.annotation.UrlContext; +import act.util.Stateless; import act.util.SubClassFinder; import org.osgl.mvc.annotation.GetAction; import testapp.endpoint.ghissues.GithubIssueBase; @@ -12,6 +13,7 @@ public interface Gh692Service { String name(); @UrlContext("692") + @Stateless class Manager extends GithubIssueBase { private List serviceList = new ArrayList<>(); diff --git a/testapp/src/test/java/testapp/endpoint/EndpointTester.java b/testapp/src/test/java/testapp/endpoint/EndpointTester.java index 8552e8f8c..185f21bf9 100644 --- a/testapp/src/test/java/testapp/endpoint/EndpointTester.java +++ b/testapp/src/test/java/testapp/endpoint/EndpointTester.java @@ -138,7 +138,7 @@ protected void verifyPostJsonBody(String expected, String url, String key, Objec } protected ReqBuilder url(String pathTmpl, Object ... args) { - reqBuilder = new ReqBuilder(pathTmpl, args); + reqBuilder = new ReqBuilder(pathTmpl, args).header("Accept", "text/html"); return reqBuilder; } diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue547.java b/testapp/src/test/java/testapp/endpoint/GHIssue547.java index 050a6b251..cc63c089a 100644 --- a/testapp/src/test/java/testapp/endpoint/GHIssue547.java +++ b/testapp/src/test/java/testapp/endpoint/GHIssue547.java @@ -58,7 +58,7 @@ public void test() throws Exception { "table[search][value]", "", "table[search][regex]", false ); - bodyEq("{\"columns\":[{\"data\":\"name\",\"name\":\"name\",\"orderable\":true,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vip\",\"name\":\"is_vip\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vipStartTime\",\"name\":\"vipStartTime\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vipEndTime\",\"name\":\"vipEndTime\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"lastGoodsName\",\"name\":\"lastGoodsName\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"regTime\",\"name\":\"regTime\",\"orderable\":true,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"id\",\"name\":\"id\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true}],\"data\":[],\"draw\":1,\"length\":30,\"order\":[{\"column\":0,\"dir\":\"asc\"}],\"orderProperty\":{\"$ref\":\"$.order[0]\"},\"recordsFiltered\":0,\"recordsTotal\":0,\"search\":{\"value\":\"\",\"regex\":\"false\"},\"start\":0}"); + bodyEq("{\"columns\":[{\"data\":\"name\",\"name\":\"name\",\"orderable\":true,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vip\",\"name\":\"is_vip\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vipStartTime\",\"name\":\"vipStartTime\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vipEndTime\",\"name\":\"vipEndTime\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"lastGoodsName\",\"name\":\"lastGoodsName\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"regTime\",\"name\":\"regTime\",\"orderable\":true,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"id\",\"name\":\"id\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true}],\"data\":[],\"draw\":1,\"length\":30,\"order\":[{\"column\":0,\"dir\":\"asc\"}],\"orderProperty\":{\"column\":0,\"dir\":\"asc\"},\"recordsFiltered\":0,\"recordsTotal\":0,\"search\":{\"value\":\"\",\"regex\":\"false\"},\"start\":0}"); } } diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue657.java b/testapp/src/test/java/testapp/endpoint/GHIssue657.java index 435a7b982..0bb64f481 100644 --- a/testapp/src/test/java/testapp/endpoint/GHIssue657.java +++ b/testapp/src/test/java/testapp/endpoint/GHIssue657.java @@ -6,7 +6,7 @@ public class GHIssue657 extends EndpointTester { @Test public void testList1() throws Exception { - url("/gh/657/1").header("accept", "application/json").get(); + url("/gh/657/1").getJSON(); bodyContains("2018"); } From c579f6c5711f12fc663f417a1dc39a00c0dcddd6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 8 Jul 2018 08:56:11 +1000 Subject: [PATCH 016/730] Act start failed when set session.mapper=act.session.HeaderTokenSessionMapper #701 --- CHANGELOG.md | 1 + src/main/java/act/conf/AppConfig.java | 7 ++++- src/main/java/act/conf/AppConfigKey.java | 9 +----- src/main/java/act/conf/ConfigKeyHelper.java | 29 +++++++++++-------- .../act/session/HeaderTokenSessionMapper.java | 4 +-- src/main/java/act/util/Lazy.java | 7 +++-- 6 files changed, 32 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 736e7a67d..54fc1656c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Act start failed when set session.mapper=act.session.HeaderTokenSessionMapper #701 * `NullPointerException` encountered when app started with SQL db plugin without model classes #707 * Allow use app name and version as server header #710 * API doc - provide a mechanism allow plugin sample data generator #709 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index bc556b964..4de21c7e7 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -146,7 +146,10 @@ public void preloadConfigurations() { for (Method method : AppConfig.class.getDeclaredMethods()) { boolean isPublic = Modifier.isPublic(method.getModifiers()); - if (isPublic && 0 == method.getParameterTypes().length && !"preloadConfigurations".equals(method.getName())) { + if (!isPublic || method.isAnnotationPresent(Lazy.class)) { + continue; + } + if (0 == method.getParameterTypes().length && !"preloadConfigurations".equals(method.getName())) { $.invokeVirtual(this, method); } } @@ -2706,6 +2709,7 @@ protected void sessionMapper(act.session.SessionMapper sessionMapper) { this.sessionMapper = sessionMapper; } + @Lazy public act.session.SessionMapper sessionMapper() { if (null == sessionMapper && null != app.injector()) { sessionMapper = get(SESSION_MAPPER, app().getInstance(CookieSessionMapper.class)); @@ -2725,6 +2729,7 @@ protected void sessionCodec(SessionCodec codec) { this.sessionCodec = $.requireNotNull(codec); } + @Lazy public SessionCodec sessionCodec() { if (null == sessionCodec) { if (null == app.injector()) { diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 99dbf14b9..20afd6592 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -29,8 +29,6 @@ import act.view.View; import act.ws.DefaultSecureTicketCodec; import act.ws.SecureTicketCodec; -import org.osgl.$; -import org.osgl.exception.NotAppliedException; import org.osgl.util.E; import org.osgl.util.S; @@ -1256,12 +1254,7 @@ public T val(Map configuration) { } public static void onApp(final App app) { - helper.classLoaderProvider(new $.F0() { - @Override - public ClassLoader apply() throws NotAppliedException, $.Break { - return app.classLoader(); - } - }); + helper.onApp(); } /** diff --git a/src/main/java/act/conf/ConfigKeyHelper.java b/src/main/java/act/conf/ConfigKeyHelper.java index 728ab526c..fe8dd4fc6 100644 --- a/src/main/java/act/conf/ConfigKeyHelper.java +++ b/src/main/java/act/conf/ConfigKeyHelper.java @@ -42,22 +42,19 @@ class ConfigKeyHelper { private static Logger logger = L.get(ConfigKeyHelper.class); private $.F0 mode; - private $.F0 classLoaderProvider; + private ClassLoader cl; + private boolean useAppClassLoader; public ConfigKeyHelper($.F0 mode, final ClassLoader cl) { this.mode = mode; - this.classLoaderProvider = new $.F0() { - @Override - public ClassLoader apply() throws NotAppliedException, $.Break { - return cl; - } - }; + this.cl = $.requireNotNull(cl); } public ConfigKeyHelper($.F0 mode) { this.mode = mode; } - ConfigKeyHelper classLoaderProvider($.F0 provider) { - this.classLoaderProvider = provider; + + ConfigKeyHelper onApp() { + this.useAppClassLoader = true; return this; } T getConfiguration(final ConfigKey confKey, Map configuration) { @@ -245,7 +242,7 @@ private Boolean getEnabled(String key, Map configuration, $.F0 def } private ClassLoader myClassLoader() { - return classLoaderProvider.apply(); + return cl; } T getImpl(Map configuration, String key, String suffix, $.F0 defVal) { @@ -253,7 +250,7 @@ T getImpl(Map configuration, String key, String suffix, $.F0 d if (null == v) return null; if (v instanceof Class) { try { - return $.newInstance((Class) v, myClassLoader()); + return instanceOf((Class) v); } catch (Exception e) { throw new ConfigurationException(e, "Error getting implementation configuration: %s", key); } @@ -261,12 +258,20 @@ T getImpl(Map configuration, String key, String suffix, $.F0 d if (!(v instanceof String)) return (T) v; String clsName = (String) v; try { - return $.newInstance(clsName, myClassLoader()); + return instanceOf(clsName); } catch (Exception e) { throw new ConfigurationException(e, "Error getting implementation configuration: %s", key); } } + private T instanceOf(Class type) { + return useAppClassLoader ? Act.getInstance(type) : $.newInstance(type, myClassLoader()); + } + + private T instanceOf(String typeName) { + return (T) (useAppClassLoader ? Act.getInstance(typeName) : $.newInstance(typeName, myClassLoader())); + } + private URI getUri(Map configuration, String key, String suffix, $.F0 defVal) { Object v = getValFromAliases(configuration, key, suffix, defVal); if (null == v) return null; diff --git a/src/main/java/act/session/HeaderTokenSessionMapper.java b/src/main/java/act/session/HeaderTokenSessionMapper.java index 8073a2c2e..2d453bdda 100644 --- a/src/main/java/act/session/HeaderTokenSessionMapper.java +++ b/src/main/java/act/session/HeaderTokenSessionMapper.java @@ -21,16 +21,16 @@ */ import act.conf.AppConfig; +import act.util.Stateless; import org.osgl.http.H; import org.osgl.util.S; import javax.inject.Inject; -import javax.inject.Singleton; /** * Implement {@link SessionMapper} using HTTP header */ -@Singleton +@Stateless public class HeaderTokenSessionMapper implements SessionMapper { public static final String DEF_HEADER_PREFIX = "X-Act-"; diff --git a/src/main/java/act/util/Lazy.java b/src/main/java/act/util/Lazy.java index 21c870ddc..89218b7be 100644 --- a/src/main/java/act/util/Lazy.java +++ b/src/main/java/act/util/Lazy.java @@ -26,9 +26,12 @@ import java.lang.annotation.Target; /** - * Mark an singleton class to be initialized after application started + * Mark an singleton class to be lazy initialized or a method + * that is not subject to eager load (e.g. the method in + * AppConfig) + * */ -@Target({ElementType.TYPE}) +@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Lazy { } From fd30d0d71b9d4b9e865ec492ad12f629f9fd3945 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 8 Jul 2018 15:34:07 +1000 Subject: [PATCH 017/730] fix #711 and #702 --- CHANGELOG.md | 2 ++ src/main/java/act/app/ActionContext.java | 3 +- src/main/java/act/app/App.java | 4 +-- .../java/act/session/DefaultSessionCodec.java | 2 +- src/main/java/act/session/JWT.java | 4 ++- .../act/session/JsonWebTokenSessionCodec.java | 7 ++-- src/main/java/act/session/SessionManager.java | 32 +++++++++++++++++-- src/test/java/act/ActTestBase.java | 15 +++++---- 8 files changed, 52 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54fc1656c..2187bb2ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* session id not serialized in JWT token #711 +* Act session token still validate even when user has logout #702 * Act start failed when set session.mapper=act.session.HeaderTokenSessionMapper #701 * `NullPointerException` encountered when app started with SQL db plugin without model classes #707 * Allow use app name and version as server header #710 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 7c27237f9..2affd8b97 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -1072,7 +1072,8 @@ public void loginAndRedirect(String username, String url) { * the session will be cleared */ public void logout() { - session().clear(); + SessionManager sessionManager = app().sessionManager(); + sessionManager.logout(session); } /** diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 82ce476c1..34ab32ac7 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -206,7 +206,7 @@ private App() { this.appHome = RuntimeDirs.home(this); this.config = new AppConfig<>().app(this); INST = this; - this.sessionManager = new SessionManager(this.config); + this.sessionManager = new SessionManager(this.config, config().cacheService("logout-session")); this.dependencyInjector = new GenieInjector(this); this.singletonRegistry = new SingletonRegistry(this); this.singletonRegistry.register(SessionManager.class, this.sessionManager); @@ -1340,7 +1340,7 @@ public void shutdownEventBus() { } private void initSessionManager() { - sessionManager = new SessionManager(config); + sessionManager = getInstance(SessionManager.class); singletonRegistry.register(SessionManager.class, sessionManager); } diff --git a/src/main/java/act/session/DefaultSessionCodec.java b/src/main/java/act/session/DefaultSessionCodec.java index 37d502061..2e2d80261 100644 --- a/src/main/java/act/session/DefaultSessionCodec.java +++ b/src/main/java/act/session/DefaultSessionCodec.java @@ -54,7 +54,7 @@ public class DefaultSessionCodec extends DestroyableBase implements SessionCodec public DefaultSessionCodec(AppConfig conf, RotateSecretCrypto crypto) { ttlInMillis = conf.sessionTtl() * 1000; sessionWillExpire = ttlInMillis > 0; - pingPath = conf .pingPath(); + pingPath = conf.pingPath(); encryptSession = conf.encryptSession(); this.crypto = $.requireNotNull(crypto); } diff --git a/src/main/java/act/session/JWT.java b/src/main/java/act/session/JWT.java index 97518c2d3..e4866451b 100644 --- a/src/main/java/act/session/JWT.java +++ b/src/main/java/act/session/JWT.java @@ -41,6 +41,8 @@ @Singleton public class JWT extends SingletonBase { + public static final String ID = "jti"; + public enum Header { ALGO("alg"); private String key; @@ -56,7 +58,7 @@ public enum Payload { NOT_BEFORE("nbf"), ISSUED_AT("iat"), ISSUER("iss"), - JWT_ID("jti"),; + JWT_ID(ID),; private String key; Payload(String key) { diff --git a/src/main/java/act/session/JsonWebTokenSessionCodec.java b/src/main/java/act/session/JsonWebTokenSessionCodec.java index 3c6062c62..5f46a2219 100644 --- a/src/main/java/act/session/JsonWebTokenSessionCodec.java +++ b/src/main/java/act/session/JsonWebTokenSessionCodec.java @@ -22,6 +22,7 @@ import static act.session.JWT.Payload.EXPIRES_AT; import static act.session.JWT.Payload.ISSUER; +import static act.session.JWT.Payload.JWT_ID; import static org.osgl.http.H.Session.KEY_EXPIRATION; import act.conf.AppConfig; @@ -110,7 +111,7 @@ private JWT.Token populateToken(JWT.Token token, H.KV state) { long l = Long.parseLong(v); token.payload(EXPIRES_AT, l / 1000); } else if (H.Session.KEY_ID.equals(k)) { - // ignore this + token.payload(JWT_ID, v); } else { token.payload(k, v); } @@ -126,9 +127,9 @@ private void resolveFromJwtToken(H.KV state, String tokenString, boolean isSe for (Map.Entry entry : token.payloads().entrySet()) { String key = entry.getKey(); Object val = entry.getValue(); - if (isSession && "jti".equals(key)) { + if (isSession && JWT.ID.equals(key)) { state.put(H.Session.KEY_ID, val); - } else if ( ISSUER.key().equals(key)) { + } else if (ISSUER.key().equals(key)) { // ignore } else if (EXPIRES_AT.key().equals(key)) { Number number = (Number) val; diff --git a/src/main/java/act/session/SessionManager.java b/src/main/java/act/session/SessionManager.java index b2a40f23a..8f8281013 100644 --- a/src/main/java/act/session/SessionManager.java +++ b/src/main/java/act/session/SessionManager.java @@ -23,28 +23,54 @@ import act.app.ActionContext; import act.conf.AppConfig; import act.util.DestroyableBase; +import org.osgl.cache.CacheService; import org.osgl.http.H; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; @Singleton public class SessionManager extends DestroyableBase { private SessionCodec codec; - private SessionMapper mapper; + private int sessionTimeout; + + private CacheService logoutSessionCache; @Inject - public SessionManager(AppConfig config) { + public SessionManager(AppConfig config, @Named("act-logout-session") CacheService cacheService) { codec = config.sessionCodec(); mapper = config.sessionMapper(); + sessionTimeout = config.sessionTtl(); + logoutSessionCache = cacheService; + } + + public void logout(H.Session session) { + if (sessionTimeout > 0) { + logoutSessionCache.put(session.id(), "", sessionTimeout); + } + session.clear(); } public H.Session resolveSession(H.Request request, ActionContext context) { String encodedSession = mapper.readSession(request); context.encodedSessionToken = encodedSession; - return null == encodedSession ? new H.Session() : codec.decodeSession(encodedSession, request); + if (null == encodedSession) { + return new H.Session(); + } + H.Session session = codec.decodeSession(encodedSession, request); + if (sessionTimeout <= 0) { + // session never timeout + return session; + } + // check if session has been logged out + String id = session.id(); + if (null != logoutSessionCache.get(id)) { + session = new H.Session(); + } + return session; } public H.Flash resolveFlash(H.Request request) { diff --git a/src/test/java/act/ActTestBase.java b/src/test/java/act/ActTestBase.java index d3bb90239..3c92a4948 100644 --- a/src/test/java/act/ActTestBase.java +++ b/src/test/java/act/ActTestBase.java @@ -20,6 +20,11 @@ * #L% */ +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.argThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import act.app.ActionContext; import act.app.App; import act.app.SingletonRegistry; @@ -37,6 +42,7 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.osgl.$; +import org.osgl.cache.CacheService; import org.osgl.http.H; import org.osgl.util.FastStr; import org.osgl.util.IO; @@ -47,11 +53,6 @@ import java.io.InputStream; import java.lang.reflect.Field; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.argThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - @Ignore public class ActTestBase extends TestBase { @@ -87,6 +88,7 @@ public static File root() { protected EventBus mockEventBus; protected H.Request mockReq; protected ActResponse mockResp; + protected CacheService mockCacheService; protected void setup() throws Exception { initActMetricPlugin(); @@ -109,13 +111,14 @@ protected void setup() throws Exception { when(mockApp.config()).thenReturn(mockAppConfig); when(mockApp.router()).thenReturn(mockRouter); when(mockApp.router(Matchers.same(""))).thenReturn(mockRouter); + mockCacheService = mock(CacheService.class); when(mockApp.getInstance(any(Class.class))).thenAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); Class cls = (Class) args[0]; if (SessionManager.class == cls) { - return new SessionManager(mockAppConfig); + return new SessionManager(mockAppConfig, mockCacheService); } return $.newInstance((Class)args[0]); } From 113b1bfdc1ae10e1d216821e3cc60ddd7f91e03f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 9 Jul 2018 21:45:38 +1000 Subject: [PATCH 018/730] API doc `generateSampleData` - `fastJsonPropertyPreFilter` treatment for collection type #716 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/Endpoint.java | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2187bb2ab..9051a3986 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* API doc `generateSampleData` - `fastJsonPropertyPreFilter` treatment for collection type #716 * session id not serialized in JWT token #711 * Act session token still validate even when user has logout #702 * Act start failed when set session.mapper=act.session.HeaderTokenSessionMapper #701 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index fe25388a0..97425cd01 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -547,7 +547,11 @@ private Object generateSampleData(BeanSpec spec, Set typeChain, List Date: Mon, 9 Jul 2018 21:51:31 +1000 Subject: [PATCH 019/730] forward shall not raise `PreHandle` event #717 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9051a3986..8e7a1ba58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* forward shall not raise `PreHandle` event #717 * API doc `generateSampleData` - `fastJsonPropertyPreFilter` treatment for collection type #716 * session id not serialized in JWT token #711 * Act session token still validate even when user has logout #702 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 2affd8b97..5c301b700 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -36,7 +36,6 @@ import act.event.SystemEvent; import act.handler.RequestHandler; import act.handler.builtin.controller.impl.ReflectedHandlerInvoker; -import act.handler.event.PreHandle; import act.i18n.LocaleResolver; import act.route.Router; import act.route.UrlPath; @@ -385,9 +384,6 @@ public void forward(String url) { state = State.CREATED; req.forward(url); final RequestHandler requestHandler = router.getInvoker(H.Method.GET, url, this); - if (!skipEvents()) { - app().eventBus().emit(new PreHandle(this)); - } requestHandler.handle(this); } From 52d8c2c220d4208ac6c99d808065498fc211be6f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 10 Jul 2018 08:59:16 +1000 Subject: [PATCH 020/730] fix #720 and #719, minor enhancement to sample data generation: UsernameProvider --- CHANGELOG.md | 2 + src/main/java/act/apidoc/Endpoint.java | 18 +++++-- .../java/act/apidoc/SampleDataCategory.java | 5 +- .../apidoc/sampledata/FullNameProvider.java | 3 ++ .../apidoc/sampledata/LastNameProvider.java | 2 +- .../apidoc/sampledata/usernameProvider.java | 47 +++++++++++++++++++ src/main/java/act/app/ActionContext.java | 8 ++-- src/main/java/act/xio/NetworkHandler.java | 5 +- src/main/resources/aaa.authenticate.list | 2 + 9 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 src/main/java/act/apidoc/sampledata/usernameProvider.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e7a1ba58..2f7a9f859 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Add API doc to act aaa authentication list #720 +* `PostHandle` event not raised in rare case #719 * forward shall not raise `PreHandle` event #717 * API doc `generateSampleData` - `fastJsonPropertyPreFilter` treatment for collection type #716 * session id not serialized in JWT token #711 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 97425cd01..cc79e6df3 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -40,6 +40,7 @@ import org.osgl.$; import org.osgl.http.H; import org.osgl.inject.BeanSpec; +import org.osgl.inject.Injector; import org.osgl.logging.Logger; import org.osgl.mvc.result.Result; import org.osgl.storage.ISObject; @@ -648,6 +649,7 @@ private Object generateSampleData(BeanSpec spec, Set typeChain, List fields = $.fieldsOf(classType); + Injector injector = Act.injector(); for (Field field : fields) { if (Modifier.isStatic(field.getModifiers())) { continue; @@ -655,13 +657,23 @@ private Object generateSampleData(BeanSpec spec, Set typeChain, List fieldType = field.getType(); + Class fieldClass = field.getType(); Object val = null; try { field.setAccessible(true); - val = generateSampleData(BeanSpec.of(field, Act.injector()), C.newSet(typeChain), C.newList(nameChain)); + String fieldName = field.getName(); + if ("name".equalsIgnoreCase(fieldName)) { + fieldName = field.getDeclaringClass().getSimpleName(); + } + Annotation[] annotations = field.getDeclaredAnnotations(); + Type fieldType = field.getGenericType(); + if (fieldType instanceof TypeVariable) { + fieldType = field.getType(); + } + BeanSpec fieldSpec = BeanSpec.of(fieldType, annotations, fieldName, injector, field.getModifiers()); + val = generateSampleData(fieldSpec, C.newSet(typeChain), C.newList(nameChain)); Class valType = null == val ? null : val.getClass(); - if (null != valType && fieldType.isAssignableFrom(valType)) { + if (null != valType && fieldClass.isAssignableFrom(valType)) { field.set(obj, val); } } catch (Exception e) { diff --git a/src/main/java/act/apidoc/SampleDataCategory.java b/src/main/java/act/apidoc/SampleDataCategory.java index 8967c1df5..2c201f68d 100644 --- a/src/main/java/act/apidoc/SampleDataCategory.java +++ b/src/main/java/act/apidoc/SampleDataCategory.java @@ -32,6 +32,7 @@ public enum SampleDataCategory { FIRST_NAME("given name", "forename", "firstname", "fname"), LAST_NAME("surname", "family name", "lname", "lastname"), FULL_NAME("fullname"), + USERNAME("userName", "login", "loginName"), DOB("Birthday", "生日", "DateOfBirth", "*date", "date*"), EMAIL("mail"), HOST, @@ -44,8 +45,8 @@ public enum SampleDataCategory { COMPANY_NAME("clientName", "client", "company", "organizationName", "organisationName", "organization", "organisation"), PERMISSION, PERMISSIONS, - ROLE, - ROLES, + ROLE("roleName"), + ROLES("roleNames"), PRIVILEGE, ; diff --git a/src/main/java/act/apidoc/sampledata/FullNameProvider.java b/src/main/java/act/apidoc/sampledata/FullNameProvider.java index 1fdc199fd..45d2da055 100644 --- a/src/main/java/act/apidoc/sampledata/FullNameProvider.java +++ b/src/main/java/act/apidoc/sampledata/FullNameProvider.java @@ -20,12 +20,15 @@ * #L% */ +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; import act.apidoc.SampleDataProvider; import javax.inject.Inject; import javax.inject.Singleton; @Singleton +@SampleData.Category(SampleDataCategory.FULL_NAME) public class FullNameProvider extends SampleDataProvider { @Inject diff --git a/src/main/java/act/apidoc/sampledata/LastNameProvider.java b/src/main/java/act/apidoc/sampledata/LastNameProvider.java index aefafa367..30672bef6 100644 --- a/src/main/java/act/apidoc/sampledata/LastNameProvider.java +++ b/src/main/java/act/apidoc/sampledata/LastNameProvider.java @@ -26,6 +26,6 @@ import javax.inject.Singleton; @Singleton -@SampleData.Category(SampleDataCategory.FIRST_NAME) +@SampleData.Category(SampleDataCategory.LAST_NAME) public class LastNameProvider extends StringListStringProvider { } diff --git a/src/main/java/act/apidoc/sampledata/usernameProvider.java b/src/main/java/act/apidoc/sampledata/usernameProvider.java new file mode 100644 index 000000000..60e11660d --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/usernameProvider.java @@ -0,0 +1,47 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.USERNAME) +public class usernameProvider extends SampleDataProvider { + + @Inject + private FirstNameProvider firstNameProvider; + + @Inject + private LastNameProvider lastNameProvider; + + @Override + public String get() { + String lastName = lastNameProvider.get(); + String firstName = firstNameProvider.get(); + return (firstName + lastName.charAt(0)).toLowerCase(); + } + +} diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 5c301b700..9adfeb90a 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -203,7 +203,10 @@ public ActResponse prepareRespForResultEvaluation() { } public boolean skipEvents() { - return handler().skipEvents(this); + if (null == handler) { + return true; + } + return handler.skipEvents(this); } public void markAsConsumed() { @@ -428,8 +431,7 @@ public RequestHandler handler() { } public ActionContext handler(RequestHandler handler) { - E.NPE(handler); - this.handler = handler; + this.handler = $.requireNotNull(handler); return this; } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 27a76ba2b..6c1ea72f5 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -152,8 +152,9 @@ public void run() { } ctx.saveLocal(); EventBus eventBus = app.eventBus(); + final boolean skipEvents = ctx.skipEvents(); try { - if (!ctx.skipEvents()) { + if (!skipEvents) { eventBus.emit(new PreHandle(ctx)); } requestHandler.handle(ctx); @@ -185,7 +186,7 @@ public void run() { } catch (Exception e) { handleException(e, ctx, "Error handling network request"); } finally { - if (!ctx.skipEvents()) { + if (!skipEvents) { eventBus.emit(new PostHandle(ctx)); } if (ctx.isReadyForDestroy()) { diff --git a/src/main/resources/aaa.authenticate.list b/src/main/resources/aaa.authenticate.list index 1168f2c36..302625c2c 100644 --- a/src/main/resources/aaa.authenticate.list +++ b/src/main/resources/aaa.authenticate.list @@ -1,3 +1,5 @@ # By default waive authentication check on `act.Zen.` and `act.i18n.` -act.i18n. -act.Zen. +[dev]-act.apidoc. +[dev]-act.Info \ No newline at end of file From 6bbe61a52ecfeedcb7e158ef81f49d1810da437c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 10 Jul 2018 21:39:36 +1000 Subject: [PATCH 021/730] fix #723 and #722 --- CHANGELOG.md | 4 +- src/main/java/act/inject/ActProviders.java | 8 + .../java/act/util/AnnotatedClassFinder.java | 5 +- src/main/java/act/util/FastJson.java | 179 ++++++++++++++++++ src/main/resources/act.scan.list | 1 + 5 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 src/main/java/act/util/FastJson.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f7a9f859..c5e5053ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Make `ClassInfoRepository` injectable #723 +* Provide a mechanism to allow developer easily define global FastJSON serializer and deserializer #722 * Add API doc to act aaa authentication list #720 * `PostHandle` event not raised in rare case #719 * forward shall not raise `PreHandle` event #717 @@ -41,7 +43,7 @@ * It shall ignore Exception raised during app shutdown process #667 * It shall clear OSGL Config's internal cache on app restart #666 * update osgl library dependencies - - osgl-tool to 1.17.0 + - osgl-tool to 1.18.0 - osgl-cache to 1.5.0 - osgl-genie to 1.8.0 - osgl-http to 1.8.0 diff --git a/src/main/java/act/inject/ActProviders.java b/src/main/java/act/inject/ActProviders.java index 9225b24a7..336b1eb14 100644 --- a/src/main/java/act/inject/ActProviders.java +++ b/src/main/java/act/inject/ActProviders.java @@ -34,6 +34,7 @@ import act.mail.MailerContext; import act.route.Router; import act.util.ActContext; +import act.util.ClassInfoRepository; import act.util.ProgressGauge; import act.util.SimpleProgressGauge; import act.view.ViewManager; @@ -153,6 +154,13 @@ public CliSession get() { } }; + public static final Provider CLASS_INFO_REPO = new Provider() { + @Override + public ClassInfoRepository get() { + return Act.app().classLoader().classInfoRepository(); + } + }; + public static final Provider PROGRESS_GAUGE = new Provider() { @Override public ProgressGauge get() { diff --git a/src/main/java/act/util/AnnotatedClassFinder.java b/src/main/java/act/util/AnnotatedClassFinder.java index a16e458dc..1174cee2c 100644 --- a/src/main/java/act/util/AnnotatedClassFinder.java +++ b/src/main/java/act/util/AnnotatedClassFinder.java @@ -22,10 +22,7 @@ import act.app.event.SysEventId; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * The annotation is used on a certain method to mark it diff --git a/src/main/java/act/util/FastJson.java b/src/main/java/act/util/FastJson.java new file mode 100644 index 000000000..e9716beff --- /dev/null +++ b/src/main/java/act/util/FastJson.java @@ -0,0 +1,179 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.App; +import com.alibaba.fastjson.parser.ParserConfig; +import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; +import com.alibaba.fastjson.serializer.ObjectSerializer; +import com.alibaba.fastjson.serializer.SerializeConfig; +import org.osgl.Lang; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Namespace for FastJSON relevant annotations/utilities + */ +public enum FastJson { + ; + + /** + * Used to annotate on user defined {@link com.alibaba.fastjson.serializer.ObjectSerializer} + * or {@link com.alibaba.fastjson.parser.deserializer.ObjectDeserializer} to specify + * the type and sub type to which it shall apply + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.TYPE) + public @interface For { + /** + * Specify the classes of the type the annotated Serializer/Deserializer shall + * apply to. + * + * @return the classes as described above + */ + Class[] value(); + } + + /** + * Used to annotate on a class that specified {@link com.alibaba.fastjson.serializer.ObjectSerializer} + * shall be applied to. + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.TYPE) + public @interface Serializer { + /** + * Specify the Serializer class the annotated type and it's sub type shall be applied + * + * @return the Serializer type + */ + Class value(); + } + + /** + * Used to annotate on a class that specified {@link com.alibaba.fastjson.parser.deserializer.ObjectDeserializer} + * shall be applied to. + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.TYPE) + public @interface Deserializer { + /** + * Specify the Deserializer class the annotated type and it's sub type shall be applied + * + * @return the Deserializer type + */ + Class value(); + } + + @Singleton + public static class Explorer extends LogSupport { + + @Inject + private App app; + + @Inject + private ClassInfoRepository repo; + + @AnnotatedClassFinder(For.class) + public void foundFor(Class type) { + For forAnno = type.getAnnotation(For.class); + Class[] targetTypes = forAnno.value(); + if (0 == targetTypes.length) { + warn("@For annotation on [%s] must have target type specified", type.getName()); + return; + } + if (ObjectSerializer.class.isAssignableFrom(type)) { + ObjectSerializer serializer = (ObjectSerializer) app.getInstance(type); + handleForSerializer(serializer, targetTypes); + } else if (ObjectDeserializer.class.isAssignableFrom(type)) { + ObjectDeserializer deserializer = (ObjectDeserializer) app.getInstance(type); + handleForDeserializer(deserializer, targetTypes); + } + } + + @AnnotatedClassFinder(Serializer.class) + public void foundSerializer(Class targetType) { + Serializer serializerAnno = targetType.getAnnotation(Serializer.class); + Class serializerType = serializerAnno.value(); + ObjectSerializer serializer = app.getInstance(serializerType); + handleForSerializer(serializer, targetType); + } + + @AnnotatedClassFinder(Deserializer.class) + public void foundDeserializer(Class targetType) { + Deserializer deserializerAnno = targetType.getAnnotation(Deserializer.class); + Class deserializerType = deserializerAnno.value(); + ObjectDeserializer deserializer = app.getInstance(deserializerType); + handleForDeserializer(deserializer, targetType); + } + + private void handleForSerializer(ObjectSerializer serializer, Class[] targetTypes) { + for (Class type : targetTypes) { + handleForSerializer(serializer, type); + } + } + + private void handleForSerializer(final ObjectSerializer serializer, Class targetType) { + ClassNode node = repo.node(targetType.getName()); + if (null == node) { + warn("Unknown target type: " + targetType.getName()); + return; + } + final SerializeConfig config = SerializeConfig.getGlobalInstance(); + node.visitSubTree(new Lang.Visitor() { + @Override + public void visit(ClassNode classNode) throws Lang.Break { + Class type = app.classForName(classNode.name()); + config.put(type, serializer); + } + }); + config.put(targetType, serializer); + } + + private void handleForDeserializer(ObjectDeserializer serializer, Class[] targetTypes) { + for (Class type : targetTypes) { + handleForDeserializer(serializer, type); + } + } + + private void handleForDeserializer(final ObjectDeserializer deserializer, Class targetType) { + ClassNode node = repo.node(targetType.getName()); + if (null == node) { + warn("Unknown target type: " + targetType.getName()); + return; + } + final ParserConfig config = ParserConfig.getGlobalInstance(); + node.visitSubTree(new Lang.Visitor() { + @Override + public void visit(ClassNode classNode) throws Lang.Break { + Class type = app.classForName(classNode.name()); + config.putDeserializer(type, deserializer); + } + }); + config.putDeserializer(targetType, deserializer); + } + } + +} diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index a66325e9e..034d88587 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -15,6 +15,7 @@ act.inject.genie.GenieInjector act.Info act.meta.ClassMetaInfoManager act.util.AdaptiveRecordCodec +act.util.FastJson act.validation.ValidationPlugin act.Zen act.apidoc.Endpoint.Service From 726d9511e84dcca1dc551e3778cbe1bbdac81652 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 13 Jul 2018 13:53:12 +1000 Subject: [PATCH 022/730] fix #721, #724, #725, #726, #727 --- CHANGELOG.md | 5 + src/main/java/act/Act.java | 35 ++- src/main/java/act/ActResponse.java | 18 ++ .../java/act/handler/builtin/FileGetter.java | 6 +- .../act/handler/builtin/ResourceGetter.java | 89 ++++++-- src/main/java/act/i18n/EnumLookupCache.java | 141 ++++++++++++ src/main/java/act/i18n/EnumService.java | 42 ++++ src/main/java/act/i18n/GlobalEnumService.java | 42 ++++ src/main/java/act/i18n/I18n.java | 12 +- .../java/act/job/JobAnnotationProcessor.java | 8 +- .../java/act/util/ClassInfoRepository.java | 5 +- src/main/java/act/util/ClassNode.java | 16 +- src/main/java/act/util/FastJson.java | 3 +- .../act/xio/undertow/UndertowResponse.java | 210 ++++-------------- .../xio/undertow/UndertowResponseOutput.java | 146 ------------ .../UndertowResponseOutputStream.java | 63 ------ src/main/resources/aaa.authenticate.list | 7 +- src/main/resources/act.scan.list | 3 + .../resources/asset/~act/js/jquery.ext.js | 20 +- 19 files changed, 433 insertions(+), 438 deletions(-) create mode 100644 src/main/java/act/i18n/EnumLookupCache.java create mode 100644 src/main/java/act/i18n/EnumService.java create mode 100644 src/main/java/act/i18n/GlobalEnumService.java delete mode 100644 src/main/java/act/xio/undertow/UndertowResponseOutput.java delete mode 100644 src/main/java/act/xio/undertow/UndertowResponseOutputStream.java diff --git a/CHANGELOG.md b/CHANGELOG.md index c5e5053ec..a3b8c66d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,13 @@ # ActFramework Change Log **1.8.8** +* Ajax redirect callback not get called when there are parsing error for JSON request #727 +* Add TypeConverter from String to Joda datetime #726 +* Large static resource output failure #725 +* `job already registered` error when multiple job annotation put on the same method #724 * Make `ClassInfoRepository` injectable #723 * Provide a mechanism to allow developer easily define global FastJSON serializer and deserializer #722 +* Provide built-in endpoint to fetch Enum i18n strings #721 * Add API doc to act aaa authentication list #720 * `PostHandle` event not raised in rare case #719 * forward shall not raise `PreHandle` event #717 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index b79cb48c6..979e351de 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -53,10 +53,7 @@ import act.plugin.PluginScanner; import act.route.RouteSource; import act.sys.Env; -import act.util.AppCodeScannerPluginManager; -import act.util.Banner; -import act.util.ClassInfoRepository; -import act.util.SysProps; +import act.util.*; import act.view.ViewManager; import act.xio.Network; import act.xio.NetworkHandler; @@ -64,6 +61,7 @@ import com.sun.imageio.plugins.gif.GIFImageWriter; import com.sun.imageio.plugins.gif.GIFImageWriterSpi; import org.joda.time.*; +import org.joda.time.format.DateTimeFormat; import org.osgl.$; import org.osgl.cache.CacheService; import org.osgl.exception.NotAppliedException; @@ -89,10 +87,8 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; +import java.util.*; import java.util.List; -import java.util.Map; import java.util.jar.Attributes; import java.util.jar.Manifest; import javax.imageio.IIOImage; @@ -808,6 +804,31 @@ public static void registerTypeConverters() { public Long convert(ReadableInstant o) { return o.getMillis(); } + }).register(new $.TypeConverter() { + @Override + public DateTime convert(String s) { + if (S.isIntOrLong(s)) { + Long l = Long.valueOf(s); + return $.convert(l).to(DateTime.class); + } + ActContext ctx = ActContext.Base.currentContext(); + Locale locale = ctx.locale(true); + AppConfig config = Act.appConfig(); + String pattern = config.localizedDateTimePattern(locale); + return (DateTimeFormat.forPattern(pattern)).parseDateTime(s); + } + @Override + public DateTime convert(String s, Object hint) { + if (null == hint) { + return convert(s); + } + if (S.isIntOrLong(s)) { + Long l = Long.valueOf(s); + return $.convert(l).to(DateTime.class); + } + String pattern = S.string(hint); + return (DateTimeFormat.forPattern(pattern)).parseDateTime(s); + } }).register(new $.TypeConverter() { @Override public DateTime convert(Long o) { diff --git a/src/main/java/act/ActResponse.java b/src/main/java/act/ActResponse.java index 3a88985e0..055d9d3be 100644 --- a/src/main/java/act/ActResponse.java +++ b/src/main/java/act/ActResponse.java @@ -27,8 +27,12 @@ import org.osgl.mvc.MvcConfig; import org.osgl.mvc.result.Ok; import org.osgl.mvc.result.Redirect; +import org.osgl.storage.impl.SObject; import org.osgl.util.E; +import org.osgl.util.IO; +import java.io.File; +import java.net.URL; import java.util.Locale; public abstract class ActResponse extends H.Response { @@ -62,6 +66,20 @@ public T characterEncoding(String encoding) { return me(); } + public T send(URL url) { + String protocol = url.getProtocol(); + if ("file".equals(protocol)) { + return send(new File(url.getPath())); + } + writeBinary(SObject.of(IO.inputStream(url))); + return me(); + } + + public T send(File file) { + writeBinary(SObject.of(file)); + return me(); + } + @Override public T sendError(int sc, String msg) { throw E.unsupport(); diff --git a/src/main/java/act/handler/builtin/FileGetter.java b/src/main/java/act/handler/builtin/FileGetter.java index 85373dfc1..526440bfa 100644 --- a/src/main/java/act/handler/builtin/FileGetter.java +++ b/src/main/java/act/handler/builtin/FileGetter.java @@ -28,12 +28,9 @@ import org.osgl.$; import org.osgl.http.H; import org.osgl.util.FastStr; -import org.osgl.util.IO; import org.osgl.util.S; -import java.io.BufferedInputStream; import java.io.File; -import java.io.InputStream; public class FileGetter extends FastRequestHandler { @@ -99,8 +96,7 @@ public void handle(ActionContext context) { fmt = contentType(file.getPath()); resp.contentType(fmt); context.applyCorsSpec().applyContentSecurityPolicy().applyContentType(); - InputStream is = new BufferedInputStream(IO.is(file)); - IO.copy(is, resp.outputStream()); + resp.send(file); } // for unit test diff --git a/src/main/java/act/handler/builtin/ResourceGetter.java b/src/main/java/act/handler/builtin/ResourceGetter.java index b97141e98..c745e989d 100644 --- a/src/main/java/act/handler/builtin/ResourceGetter.java +++ b/src/main/java/act/handler/builtin/ResourceGetter.java @@ -26,6 +26,7 @@ import act.Act; import act.ActResponse; import act.app.ActionContext; +import act.conf.AppConfig; import act.controller.ParamNames; import act.handler.RequestHandler; import act.handler.builtin.controller.FastRequestHandler; @@ -72,6 +73,7 @@ public class ResourceGetter extends FastRequestHandler { private Map cachedBuffers = new HashMap<>(); private Map cachedContentType = new HashMap<>(); private Map cachedFailures = new HashMap<>(); + private Set largeResource = new HashSet<>(); public ResourceGetter(String base) { E.illegalArgumentIf(S.blank(base), "empty resource string encountered"); @@ -136,7 +138,8 @@ protected String path(ActionContext context) { protected void handle(String path, ActionContext context) { H.Request req = context.req(); - if (Act.isProd()) { + final boolean isProd = Act.isProd(); + if (isProd) { ActResponse resp = context.prepareRespForResultEvaluation(); if (preloaded) { // this is a reloaded file resource @@ -145,6 +148,9 @@ protected void handle(String path, ActionContext context) { } else { resp.contentType(preloadedContentType); if (req.etagMatches(etag)) { + // still need to generates the headers + // see https://stackoverflow.com/questions/1587667/should-http-304-not-modified-responses-contain-cache-control-headers + resp.header(CACHE_CONTROL, "max-age=86400").etag(this.etag); AlwaysNotModified.INSTANCE.handle(context); } else { H.Format contentType = cachedContentType.get(path); @@ -153,7 +159,7 @@ protected void handle(String path, ActionContext context) { } resp .contentType(contentType) - .header(CACHE_CONTROL, "public, max-age=7200") + .header(CACHE_CONTROL, "max-age=86400") .etag(this.etag) .writeContent(buffer.duplicate()); } @@ -166,12 +172,15 @@ protected void handle(String path, ActionContext context) { return; } - if (null != req.etag() && req.etagMatches(etags.get(path))) { + final String reqEtag = req.etag(); + if (null != reqEtag && req.etagMatches(etags.get(path))) { H.Format contentType = cachedContentType.get(path); if (null == contentType) { contentType = req.contentType(); } - resp.contentType(contentType); + // still need to generates the headers + // see https://stackoverflow.com/questions/1587667/should-http-304-not-modified-responses-contain-cache-control-headers + resp.contentType(contentType).header(CACHE_CONTROL, "max-age=86400").etag(reqEtag); AlwaysNotModified.INSTANCE.handle(context); return; } @@ -214,32 +223,76 @@ protected void handle(String path, ActionContext context) { if (preventFolderAccess(target, loadPath, context)) { return; } - H.Format contentType = FileGetter.contentType(target.getPath()); ActResponse resp = context.prepareRespForResultEvaluation(); + H.Format contentType; + if (isProd) { + contentType = cachedContentType.get(path); + if (null == contentType) { + contentType = FileGetter.contentType(target.getPath()); + cachedContentType.put(path, contentType); + } + } else { + contentType = FileGetter.contentType(target.getPath()); + } resp.contentType(contentType); - if (Act.isProd()) { - resp.header(CACHE_CONTROL, "public, max-age=7200"); + if (isProd) { + resp.header(CACHE_CONTROL, "max-age=86400"); + String etag = etags.get(path); + if (null != etag) { + resp.etag(etag); + } } context.applyCorsSpec().applyContentSecurityPolicy().applyContentType(); - try { - int n = IO.copy(target.openStream(), resp.outputStream()); + final AppConfig config = context.config(); + boolean isFile = "file".equals(target.getProtocol()); + if (isFile) { + File file = new File(target.getPath()); + long len = file.length(); + if (Act.isProd()) { + etags.put(path, String.valueOf(len)); + } if (Act.isProd()) { - etags.put(path, String.valueOf(n)); - if (n < context.config().resourcePreloadSizeLimit()) { + boolean smallResource = len < config.resourcePreloadSizeLimit(); + if (smallResource) { $.Var etagBag = $.var(); buffer = doPreload(target, etagBag); if (null == buffer) { cachedFailures.put(path, true); - } else { - cachedBuffers.put(path, buffer); - cachedContentType.put(path, contentType); + return; + } + cachedBuffers.put(path, buffer); + resp.writeContent(buffer.duplicate()); + return; + } + } + resp.send(file); + } else if (largeResource.contains(path)) { + resp.send(target); + } else { + try { + int n = IO.copy(target.openStream(), resp.outputStream()); + boolean smallResource = n < config.resourcePreloadSizeLimit(); + if (!smallResource) { + largeResource.add(path); + } + if (Act.isProd()) { + etags.put(path, String.valueOf(n)); + if (smallResource) { + $.Var etagBag = $.var(); + buffer = doPreload(target, etagBag); + if (null == buffer) { + cachedFailures.put(path, true); + } else { + cachedBuffers.put(path, buffer); + cachedContentType.put(path, contentType); + } } } + } catch (NullPointerException e) { + // this is caused by accessing folder inside jar URL + folders.add(target); + AlwaysForbidden.INSTANCE.handle(context); } - } catch (NullPointerException e) { - // this is caused by accessing folder inside jar URL - folders.add(target); - AlwaysForbidden.INSTANCE.handle(context); } } catch (IOException e) { logger.warn(e, "Error servicing static resource request"); diff --git a/src/main/java/act/i18n/EnumLookupCache.java b/src/main/java/act/i18n/EnumLookupCache.java new file mode 100644 index 000000000..e83f757d2 --- /dev/null +++ b/src/main/java/act/i18n/EnumLookupCache.java @@ -0,0 +1,141 @@ +package act.i18n; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.App; +import act.job.OnAppStart; +import act.util.ClassInfoRepository; +import act.util.ClassNode; +import act.util.LogSupport; +import org.osgl.$; +import org.osgl.Lang; +import org.osgl.util.Keyword; + +import java.util.*; +import javax.inject.Singleton; + +@Singleton +public class EnumLookupCache extends LogSupport { + + private Map> eligibleEnums = new HashMap<>(); + private int eligibleEnumSize; + + // locale + // -> enum type name (as keyword) + // --> enum name + // ---> enum message + private Map>> withoutProperties = new HashMap<>(); + + // locale + // -> enum type name (as keyword) + // --> enum name + // ---> enum field name + // ----> enum field value + private Map>>> withProperties = new HashMap<>(); + + public Map> withoutProperties(Locale locale) { + return ensureWithoutProperties(locale); + } + + public Map>> withProperties(Locale locale) { + return ensureWithProperties(locale); + } + + public Map withoutProperties(String enumTypeName, Locale locale) { + Map> map = ensureWithoutProperties(locale); + return map.get(Keyword.of(enumTypeName)); + } + + public Map> withProperties(String enumTypeName, Locale locale) { + Map>> map = ensureWithProperties(locale); + return map.get(Keyword.of(enumTypeName)); + } + + @OnAppStart(async = true) + public void loadEligibleEnums(ClassInfoRepository repo, final App app) { + final ClassNode enumRoot = repo.node(Enum.class.getName()); + final $.Predicate tester = app.config().appClassTester(); + enumRoot.visitSubTree(new Lang.Visitor() { + @Override + public void visit(ClassNode classNode) throws Lang.Break { + String name = classNode.name(); + if (tester.test(name) && !name.startsWith("act.")) { + Class enumType = $.cast(app.classForName(name)); + Object[] constants = enumType.getEnumConstants(); + if (null != constants && constants.length > 0) { + String simpleName = enumType.getSimpleName(); + Class existing = eligibleEnums.get(simpleName); + if (null != existing && existing.getName().equals(enumType.getName())) { + warn("Ambiguous enum name found between %s and %s", existing.getName(), enumType.getName()); + } else { + eligibleEnums.put(simpleName, enumType); + } + } + } + } + }); + eligibleEnumSize = eligibleEnums.size(); + } + + private Map> ensureWithoutProperties(Locale locale) { + Map> map = withoutProperties.get(locale); + if (null == map) { + map = new HashMap<>(); + withoutProperties.put(locale, map); + } + if (map.size() < eligibleEnumSize) { + populateWithoutProperties(map, locale); + } + return map; + } + + private Map>> ensureWithProperties(Locale locale) { + Map>> map = withProperties.get(locale); + if (null == map) { + map = new HashMap<>(); + withProperties.put(locale, map); + } + if (map.size() < eligibleEnumSize) { + populateWithProperties(map, locale); + } + return map; + } + + private void populateWithoutProperties(Map> withoutProperties, Locale locale) { + for (Map.Entry> entry: eligibleEnums.entrySet()) { + String key = entry.getKey(); + if (!withoutProperties.containsKey(key)) { + Map map = $.cast(I18n.i18n(locale, entry.getValue())); + withoutProperties.put(Keyword.of(key), map); + } + } + } + + private void populateWithProperties(Map>> withProperties, Locale locale) { + for (Map.Entry> entry: eligibleEnums.entrySet()) { + String key = entry.getKey(); + if (!withProperties.containsKey(key)) { + Map> map = $.cast(I18n.i18n(locale, entry.getValue(), true)); + withProperties.put(Keyword.of(key), map); + } + } + } +} diff --git a/src/main/java/act/i18n/EnumService.java b/src/main/java/act/i18n/EnumService.java new file mode 100644 index 000000000..194b85df3 --- /dev/null +++ b/src/main/java/act/i18n/EnumService.java @@ -0,0 +1,42 @@ +package act.i18n; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.inject.DefaultValue; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Locale; +import java.util.Map; +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class EnumService { + + @Inject + EnumLookupCache cache; + + @GetAction("i18n/enum/{type}") + public Map lookupTable(String type, @DefaultValue("false") boolean outputProperties, Locale locale) { + return outputProperties ? cache.withProperties(type, locale) : cache.withoutProperties(type, locale); + } + +} diff --git a/src/main/java/act/i18n/GlobalEnumService.java b/src/main/java/act/i18n/GlobalEnumService.java new file mode 100644 index 000000000..30528877a --- /dev/null +++ b/src/main/java/act/i18n/GlobalEnumService.java @@ -0,0 +1,42 @@ +package act.i18n; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.inject.DefaultValue; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Locale; +import java.util.Map; +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class GlobalEnumService { + + @Inject + EnumLookupCache cache; + + @GetAction("i18n/enum/") + public Map lookupTable(@DefaultValue("false") boolean outputProperties, Locale locale) { + return outputProperties ? cache.withProperties(locale) : cache.withoutProperties(locale); + } + +} diff --git a/src/main/java/act/i18n/I18n.java b/src/main/java/act/i18n/I18n.java index b38798106..84861c26a 100644 --- a/src/main/java/act/i18n/I18n.java +++ b/src/main/java/act/i18n/I18n.java @@ -201,7 +201,17 @@ public static Map i18n(Locale locale, String bundleName, Class> getters = enumPropertyGetters(enumClass); for (Map.Entry> entry : getters.entrySet()) { - values.put(entry.getKey(), entry.getValue().apply(enumInstance)); + String key = entry.getKey(); + if (key.startsWith("get")) { + String newKey = key.substring(3); + if (S.notEmpty(newKey)) { + char c = newKey.charAt(0); + if (Character.isUpperCase(c)) { + key = S.lowerFirst(newKey); + } + } + } + values.put(key, entry.getValue().apply(enumInstance)); } } else { map.put(name, val); diff --git a/src/main/java/act/job/JobAnnotationProcessor.java b/src/main/java/act/job/JobAnnotationProcessor.java index f434aec7d..94fa43042 100644 --- a/src/main/java/act/job/JobAnnotationProcessor.java +++ b/src/main/java/act/job/JobAnnotationProcessor.java @@ -62,7 +62,7 @@ public void run() { }); return; } - Job job = createMethodJob(method); + Job job = getOrCreateMethodJob(method); String value = info.value; if (Cron.class.isAssignableFrom(anno)) { registerCron(job, evaluateExpression(value, anno)); @@ -153,8 +153,10 @@ private boolean isAbstract(JobMethodMetaInfo method) { return (classMetaInfo.isAbstract()); } - private Job createMethodJob(JobMethodMetaInfo method) { + private Job getOrCreateMethodJob(JobMethodMetaInfo method) { String id = method.id(); - return new Job(id, app().jobManager(), new ReflectedJobInvoker<>(method, app()), false); + JobManager jobManager = app().jobManager(); + Job job = jobManager.jobById(id); + return null == job ? new Job(id, app().jobManager(), new ReflectedJobInvoker<>(method, app()), false) : job; } } diff --git a/src/main/java/act/util/ClassInfoRepository.java b/src/main/java/act/util/ClassInfoRepository.java index acf083b0b..a7c67bf19 100644 --- a/src/main/java/act/util/ClassInfoRepository.java +++ b/src/main/java/act/util/ClassInfoRepository.java @@ -21,7 +21,6 @@ */ import act.Act; -import act.Destroyable; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import org.osgl.$; @@ -41,6 +40,9 @@ @ApplicationScoped public class ClassInfoRepository extends DestroyableBase { + public ClassInfoRepository() { + } + protected ConcurrentMap classes = new ConcurrentHashMap(); public boolean has(String className) { @@ -79,7 +81,6 @@ public boolean isEmpty() { @Override protected void releaseResources() { - Destroyable.Util.destroyAll(classes.values(), ApplicationScoped.class); classes.clear(); } diff --git a/src/main/java/act/util/ClassNode.java b/src/main/java/act/util/ClassNode.java index c6df7b357..30675cc16 100644 --- a/src/main/java/act/util/ClassNode.java +++ b/src/main/java/act/util/ClassNode.java @@ -30,7 +30,7 @@ import java.util.Map; import java.util.Set; -public class ClassNode extends DestroyableBase { +public class ClassNode { private transient ClassInfoRepository infoBase; private String name; @@ -92,6 +92,10 @@ public boolean publicNotAbstract() { return isPublic() && !isAbstract(); } + public void setInfoBase(ClassInfoRepository repo) { + this.infoBase = $.requireNotNull(repo); + } + public ClassNode parent() { return parent; } @@ -397,16 +401,6 @@ public boolean isMyAncestor(ClassNode node) { return node.isMyDescendant(this); } - @Override - protected void releaseResources() { - descendants.clear(); - children.clear(); - interfaces.clear(); - annotated.clear(); - annotations.clear(); - infoBase = null; - } - ClassNodeDTO toDTO() { return new ClassNodeDTO(this); } diff --git a/src/main/java/act/util/FastJson.java b/src/main/java/act/util/FastJson.java index e9716beff..f62931ad9 100644 --- a/src/main/java/act/util/FastJson.java +++ b/src/main/java/act/util/FastJson.java @@ -107,7 +107,8 @@ public void foundFor(Class type) { if (ObjectSerializer.class.isAssignableFrom(type)) { ObjectSerializer serializer = (ObjectSerializer) app.getInstance(type); handleForSerializer(serializer, targetTypes); - } else if (ObjectDeserializer.class.isAssignableFrom(type)) { + } + if (ObjectDeserializer.class.isAssignableFrom(type)) { ObjectDeserializer deserializer = (ObjectDeserializer) app.getInstance(type); handleForDeserializer(deserializer, targetTypes); } diff --git a/src/main/java/act/xio/undertow/UndertowResponse.java b/src/main/java/act/xio/undertow/UndertowResponse.java index b9d33ddad..7289384b3 100644 --- a/src/main/java/act/xio/undertow/UndertowResponse.java +++ b/src/main/java/act/xio/undertow/UndertowResponse.java @@ -23,10 +23,11 @@ import act.ActResponse; import act.app.ActionContext; import act.conf.AppConfig; -import io.undertow.io.DefaultIoCallback; import io.undertow.io.IoCallback; import io.undertow.io.Sender; import io.undertow.server.HttpServerExchange; +import io.undertow.server.handlers.resource.Resource; +import io.undertow.server.handlers.resource.URLResource; import io.undertow.util.HeaderMap; import io.undertow.util.Headers; import io.undertow.util.HttpString; @@ -36,103 +37,25 @@ import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.storage.ISObject; -import org.osgl.util.*; +import org.osgl.util.E; +import org.osgl.util.IO; +import org.osgl.util.Output; +import org.osgl.util.OutputStreamOutput; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; +import java.net.URL; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; -import java.nio.charset.StandardCharsets; import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; public class UndertowResponse extends ActResponse { protected static Logger LOGGER = LogManager.get(UndertowResponse.class); - private static class Buffer { - boolean isSending; - ByteBuffer buffer; - IoCallback callback; - ReentrantLock lock; - Condition finalPartToGo; - - Buffer(IoCallback callback, ReentrantLock lock) { - this.callback = $.requireNotNull(callback); - this.isSending = true; - this.lock = lock; - } - - void sendOrBuf(String content, Sender sender) { - sendOrBuf(ByteBuffer.wrap(content.getBytes(StandardCharsets.UTF_8)), sender); - } - - void sendOrBuf(ByteBuffer content, Sender sender) { - lock.lock(); - try { - if (null == buffer) { - buffer = content; - } else { - ByteBuffer merged = ByteBuffer.allocate(buffer.limit() + content.limit()); - merged.put(buffer).put(content).flip(); - buffer = merged; - } - if (!isSending) { - isSending = true; - ByteBuffer buffer = this.buffer; - this.buffer = null; - sender.send(buffer, callback); - } - } finally { - lock.unlock(); - } - } - - void sendThroughFinalPart(Sender sender) { - if (null == this.buffer) { - return; - } - lock.lock(); - try { - if (!isSending) { - isSending = true; - sender.send(this.buffer); - } else { - finalPartToGo = lock.newCondition(); - while (isSending) { - try { - finalPartToGo.await(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - throw E.unexpected(e); - } - } - ByteBuffer buffer = this.buffer; - this.buffer = null; - sender.send(buffer, callback); - } - } finally { - lock.unlock(); - } - } - - void partSent() { - isSending = false; - if (null != finalPartToGo) { - finalPartToGo.signal(); - } - } - - private void clear() { - isSending = false; - buffer = null; - } - } - private static final HttpString _SERVER = new HttpString(H.Header.Names.SERVER); private static final HttpStringCache HEADER_NAMES = HttpStringCache.HEADER; @@ -140,34 +63,8 @@ private void clear() { private boolean endAsync; private Sender sender; - private ReentrantLock lock; - private boolean isPartialMode; - private AtomicBoolean partialSent = new AtomicBoolean(); + private AtomicBoolean sending = new AtomicBoolean(false); private AtomicBoolean closeExchange = new AtomicBoolean(false); - private IoCallback ioCallback = new DefaultIoCallback() { - @Override - public void onComplete(HttpServerExchange exchange, Sender sender) { - if (null != lock) { - lock.lock(); - buffer.partSent(); - lock.unlock(); - } else if (closeExchange.get()) { - exchange.endExchange(); - } else { - partialSent.set(true); - } - } - - @Override - public void onException(HttpServerExchange exchange, Sender sender, IOException exception) { - if (null != buffer) { - buffer.clear(); - buffer = null; - } - super.onException(exchange, sender, exception); - } - }; - private Buffer buffer; public UndertowResponse(HttpServerExchange exchange, AppConfig config) { super(config); @@ -177,7 +74,7 @@ public UndertowResponse(HttpServerExchange exchange, AppConfig config) { @Override protected Output createOutput() { - return BufferedOutput.wrap(blocking() ? new OutputStreamOutput(createOutputStream()) : new UndertowResponseOutput(this)); + return new OutputStreamOutput(createOutputStream()); } @Override @@ -223,36 +120,17 @@ public UndertowResponse writeContent(String s) { return this; } - public void writeContentPart(String s) { - ByteBuffer buffer = ByteBuffer.wrap(s.getBytes(StandardCharsets.UTF_8)); - writeContentPart(buffer); - } - - public void writeContentPart(ByteBuffer buffer) { - isPartialMode = true; - try { - if (null != buffer) { - partialSent.set(false); - sender().send(buffer, ioCallback); - } else { - this.buffer.sendOrBuf(buffer, sender()); - } - } catch (IllegalStateException e) { - lock = new ReentrantLock(); - this.buffer = new Buffer(ioCallback, lock); - this.buffer.sendOrBuf(buffer, sender()); - } catch (RuntimeException e) { - endAsync = false; - throw e; - } - } - @Override public UndertowResponse writeContent(ByteBuffer byteBuffer) { beforeWritingContent(); try { - sender().send(byteBuffer); endAsync = !blocking(); + Sender sender = sender(); + if (endAsync) { + sender.send(byteBuffer, IoCallback.END_EXCHANGE); + } else { + sender.send(byteBuffer); + } afterWritingContent(); } catch (RuntimeException e) { endAsync = false; @@ -266,24 +144,36 @@ public UndertowResponse writeContent(ByteBuffer byteBuffer) { public UndertowResponse writeBinary(ISObject binary) { beforeWritingContent(); File file = tryGetFileFrom(binary); - if (null == file) { - byte[] ba = binary.asByteArray(); - ByteBuffer buffer = ByteBuffer.wrap(ba); - sender().send(buffer); + if (null != file) { + return send(file); + } + byte[] ba = binary.asByteArray(); + ByteBuffer buffer = ByteBuffer.wrap(ba); + sender().send(buffer); + endAsync = !blocking(); + afterWritingContent(); + return this; + } + + @Override + public UndertowResponse send(URL url) { + Resource resource = new URLResource(url, ""); + resource.serve(sender(), hse, IoCallback.END_EXCHANGE); + return me(); + } + + @Override + public UndertowResponse send(File file) { + try { + sender().transferFrom(FileChannel.open(file.toPath()), IoCallback.END_EXCHANGE); endAsync = !blocking(); afterWritingContent(); - } else { - try { - sender().transferFrom(FileChannel.open(file.toPath()), IoCallback.END_EXCHANGE); - endAsync = !blocking(); - afterWritingContent(); - } catch (IOException e) { - endAsync = false; - afterWritingContent(); - throw E.ioException(e); - } + } catch (IOException e) { + endAsync = false; + afterWritingContent(); + throw E.ioException(e); } - return this; + return me(); } @Override @@ -307,16 +197,6 @@ public void commit() { } if (!endAsync) { hse.endExchange(); - } else { - if (null != buffer) { - buffer.sendThroughFinalPart(sender()); - } else if (isPartialMode) { - if (partialSent.get()) { - hse.endExchange(); - } else { - closeExchange.set(true); - } - } } markClosed(); } @@ -370,10 +250,6 @@ protected Writer createWriter() { @Override protected OutputStream createOutputStream() { - return blocking() ? createBlockingOutputStream() : new UndertowResponseOutputStream(this); - } - - private OutputStream createBlockingOutputStream() { ensureBlocking(); return hse.getOutputStream(); } @@ -395,7 +271,7 @@ protected Class _impl() { private boolean responseStarted() { return hse.isResponseStarted(); } - + private boolean blocking() { return hse.isBlocking(); } diff --git a/src/main/java/act/xio/undertow/UndertowResponseOutput.java b/src/main/java/act/xio/undertow/UndertowResponseOutput.java deleted file mode 100644 index b1db4cb1a..000000000 --- a/src/main/java/act/xio/undertow/UndertowResponseOutput.java +++ /dev/null @@ -1,146 +0,0 @@ -package act.xio.undertow; - -/*- - * #%L - * ACT Framework - * %% - * Copyright (C) 2014 - 2018 ActFramework - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import org.osgl.util.Output; - -import java.io.OutputStream; -import java.io.Writer; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.Charset; -import java.util.Arrays; - -public class UndertowResponseOutput extends Writer implements Output { - - private UndertowResponse resp; - - public UndertowResponseOutput(UndertowResponse resp) { - this.resp = resp; - } - - @Override - public void open() { - resp.beforeWritingContent(); - } - - @Override - public void close() { - resp.afterWritingContent(); - } - - @Override - public void flush() { - } - - @Override - public void write(int c) { - append((char) c); - } - - @Override - public void write(char[] cbuf) { - write(cbuf, 0, cbuf.length); - } - - @Override - public void write(String str) { - write(str, 0, str.length()); - } - - @Override - public void write(String str, int off, int len) { - append(str, off, off + len); - } - - @Override - public void write(char[] cbuf, int off, int len) { - append(cbuf, off, len); - } - - public UndertowResponseOutput append(char str[], int offset, int len) { - byte[] bytes; - if (0 == offset && len == str.length) { - bytes = toBytes(str); - } else { - char[] payload = new char[len]; - System.arraycopy(str, offset, payload, 0, len); - bytes = toBytes(payload); - } - return append(bytes); - } - - - @Override - public UndertowResponseOutput append(CharSequence csq) { - resp.writeContentPart(csq.toString()); - return this; - } - - @Override - public UndertowResponseOutput append(CharSequence csq, int start, int end) { - return append(csq.subSequence(start, end)); - } - - @Override - public UndertowResponseOutput append(char c) { - return append("" + c); - } - - @Override - public UndertowResponseOutput append(byte[] bytes) { - return append(ByteBuffer.wrap(bytes)); - } - - @Override - public UndertowResponseOutput append(byte[] bytes, int start, int end) { - return append(ByteBuffer.wrap(bytes, start, end)); - } - - @Override - public UndertowResponseOutput append(byte b) { - return append(new byte[b]); - } - - @Override - public UndertowResponseOutput append(ByteBuffer buffer) { - resp.writeContentPart(buffer); - return this; - } - - @Override - public OutputStream asOutputStream() { - return new UndertowResponseOutputStream(resp); - } - - @Override - public Writer asWriter() { - return this; - } - - private static byte[] toBytes(char[] chars) { - CharBuffer charBuffer = CharBuffer.wrap(chars); - ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer); - byte[] bytes = Arrays.copyOfRange(byteBuffer.array(), - byteBuffer.position(), byteBuffer.limit()); - return bytes; - } -} diff --git a/src/main/java/act/xio/undertow/UndertowResponseOutputStream.java b/src/main/java/act/xio/undertow/UndertowResponseOutputStream.java deleted file mode 100644 index 5f90fe307..000000000 --- a/src/main/java/act/xio/undertow/UndertowResponseOutputStream.java +++ /dev/null @@ -1,63 +0,0 @@ -package act.xio.undertow; - -/*- - * #%L - * ACT Framework - * %% - * Copyright (C) 2014 - 2018 ActFramework - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; - -public class UndertowResponseOutputStream extends OutputStream { - - private UndertowResponse resp; - - public UndertowResponseOutputStream(UndertowResponse resp) { - this.resp = resp; - } - - @Override - public void write(byte[] b) throws IOException { - ByteBuffer byteBuffer = ByteBuffer.wrap(b); - this.resp.writeContentPart(byteBuffer); - } - - @Override - public void write(byte[] b, int off, int len) throws IOException { - ByteBuffer byteBuffer = ByteBuffer.wrap(b, off, len); - this.resp.writeContentPart(byteBuffer); - } - - @Override - public void flush() { - } - - @Override - public void close() { - resp.afterWritingContent(); - } - - @Override - public void write(int b) { - ByteBuffer byteBuffer = ByteBuffer.allocate(1); - byteBuffer.put((byte) b); - byteBuffer.flip(); - this.resp.writeContentPart(byteBuffer); - } -} diff --git a/src/main/resources/aaa.authenticate.list b/src/main/resources/aaa.authenticate.list index 302625c2c..190b5893c 100644 --- a/src/main/resources/aaa.authenticate.list +++ b/src/main/resources/aaa.authenticate.list @@ -1,5 +1,8 @@ # By default waive authentication check on `act.Zen.` and `act.i18n.` --act.i18n. +-act.i18n.LocaleResolver +-act.i18n.TimeZoneResolver +-act.i18n.EnumService -act.Zen. [dev]-act.apidoc. -[dev]-act.Info \ No newline at end of file +[dev]-act.Info +[dev]-act.i18n. \ No newline at end of file diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 034d88587..9e4394213 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -10,6 +10,9 @@ act.db.DbBind act.handler.builtin.controller.RequestHandlerProxy act.i18n.TimeZoneResolver act.i18n.LocaleResolver +act.i18n.EnumService +act.i18n.GlobalEnumService +act.i18n.EnumLookupCache act.inject.DependencyInjectorBase act.inject.genie.GenieInjector act.Info diff --git a/src/main/resources/asset/~act/js/jquery.ext.js b/src/main/resources/asset/~act/js/jquery.ext.js index f0af322aa..a4ffd8ad9 100644 --- a/src/main/resources/asset/~act/js/jquery.ext.js +++ b/src/main/resources/asset/~act/js/jquery.ext.js @@ -16,14 +16,10 @@ jQuery.createWebSocket = function(path) { return new WebSocket(((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + path); } -var callbackWithAjaxRedirect = function(realCallback) { - return function() { - var jqXHR = arguments[2]; - if (jqXHR.status === 278) { - window.location = jqXHR.getResponseHeader("Location"); - } - if (realCallback) realCallback.apply(this, arguments); - } +var checkAjaxRedirect = function(data, testStatus, jqXHR) { + if (data.status === 278) { + window.location = data.getResponseHeader("Location"); + } } jQuery.each(["get", "post", "put", "delete", "patch" ], function (i, method) { @@ -48,8 +44,8 @@ jQuery.each(["get", "post", "put", "delete", "patch" ], function (i, method) { type: submitMethod, dataType: type, data: data, - success: callbackWithAjaxRedirect(callback) - }); + success: callback + }).always(checkAjaxRedirect); }; }); @@ -80,7 +76,7 @@ jQuery.each(["getJSON", "postJSON", "putJSON", "deleteJSON", "patchJSON"], funct type: submitMethod.replace("JSON", ""), dataType: "json", data: data, - success: callbackWithAjaxRedirect(callback) - }); + success: callback + }).always(checkAjaxRedirect); }; }); From bc1fc47e70928b2e60ae7713d6e0b473f3bf5948 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 14 Jul 2018 08:13:19 +1000 Subject: [PATCH 023/730] fix false warning on job not found --- src/main/java/act/job/JobAnnotationProcessor.java | 2 +- src/main/java/act/job/JobManager.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/act/job/JobAnnotationProcessor.java b/src/main/java/act/job/JobAnnotationProcessor.java index 94fa43042..f52b11195 100644 --- a/src/main/java/act/job/JobAnnotationProcessor.java +++ b/src/main/java/act/job/JobAnnotationProcessor.java @@ -156,7 +156,7 @@ private boolean isAbstract(JobMethodMetaInfo method) { private Job getOrCreateMethodJob(JobMethodMetaInfo method) { String id = method.id(); JobManager jobManager = app().jobManager(); - Job job = jobManager.jobById(id); + Job job = jobManager.jobById(id, false); return null == job ? new Job(id, app().jobManager(), new ReflectedJobInvoker<>(method, app()), false) : job; } } diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index aae389bc4..dfc81f58a 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -356,13 +356,19 @@ void futureScheduled(String id, ScheduledFuture future) { } Job jobById(String id) { + return jobById(id, true); + } + + Job jobById(String id, boolean warn) { Job job = jobs.get(id); if (null == job) { ScheduledFuture future = scheduled.get(id); if (null != future) { return new Job(id, Act.jobManager()); } - Act.LOGGER.warn("cannot find job by id: %s", id); + if (warn) { + Act.LOGGER.warn("cannot find job by id: %s", id); + } } return job; } From 4a1a46c003a23e6da75bd8d7eb29497e8703b355 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 14 Jul 2018 20:22:11 +1000 Subject: [PATCH 024/730] Register TypeConverter automatically #728 --- CHANGELOG.md | 1 + .../java/act/util/TypeConverterRegister.java | 38 +++++++++++++++++++ src/main/resources/act.scan.list | 1 + 3 files changed, 40 insertions(+) create mode 100644 src/main/java/act/util/TypeConverterRegister.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a3b8c66d6..00bbb7f41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Register TypeConverter automatically #728 * Ajax redirect callback not get called when there are parsing error for JSON request #727 * Add TypeConverter from String to Joda datetime #726 * Large static resource output failure #725 diff --git a/src/main/java/act/util/TypeConverterRegister.java b/src/main/java/act/util/TypeConverterRegister.java new file mode 100644 index 000000000..676d43576 --- /dev/null +++ b/src/main/java/act/util/TypeConverterRegister.java @@ -0,0 +1,38 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.Lang; +import org.osgl.util.converter.TypeConverterRegistry; + +import javax.inject.Singleton; + +@Singleton +public class TypeConverterRegister { + + TypeConverterRegistry registry = TypeConverterRegistry.INSTANCE; + + @SubClassFinder() + public void foundTypeConverter(Lang.TypeConverter converter) { + registry.register(converter); + } + +} diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 9e4394213..ba6c245e0 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -19,6 +19,7 @@ act.Info act.meta.ClassMetaInfoManager act.util.AdaptiveRecordCodec act.util.FastJson +act.util.TypeConverterRegister act.validation.ValidationPlugin act.Zen act.apidoc.Endpoint.Service From 4f7b99c3fdc2c1bb13206b116d627d0048935eef Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 18 Jul 2018 06:53:20 +1000 Subject: [PATCH 025/730] fix #730 and #733 --- CHANGELOG.md | 2 + pom.xml | 2 +- src/main/java/act/db/AdaptiveRecord.java | 722 +--------------- src/main/java/act/util/AdaptiveBean.java | 122 +++ src/main/java/act/util/AdaptiveBeanCodec.java | 340 ++++++++ .../java/act/util/AdaptiveRecordCodec.java | 6 +- .../java/act/util/EnhancedAdaptiveMap.java | 784 ++++++++++++++++++ src/main/resources/act.scan.list | 1 + 8 files changed, 1259 insertions(+), 720 deletions(-) create mode 100644 src/main/java/act/util/AdaptiveBean.java create mode 100644 src/main/java/act/util/AdaptiveBeanCodec.java create mode 100644 src/main/java/act/util/EnhancedAdaptiveMap.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 00bbb7f41..34e6c9ad4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* AdaptiveRecord enhancement #733 +* Password enhancement - ignore the case when password is empty #730 * Register TypeConverter automatically #728 * Ajax redirect callback not get called when there are parsing error for JSON request #727 * Add TypeConverter from String to Joda datetime #726 diff --git a/pom.xml b/pom.xml index bcac827fd..88b852e9a 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ 3.10.0 1.18.0-SNAPSHOT 1.5.0 - 1.8.0 + 1.9.0-SNAPSHOT 1.8.1-SNAPSHOT 1.8.1-SNAPSHOT 1.7.0 diff --git a/src/main/java/act/db/AdaptiveRecord.java b/src/main/java/act/db/AdaptiveRecord.java index 737b049a5..1dffe3cc9 100644 --- a/src/main/java/act/db/AdaptiveRecord.java +++ b/src/main/java/act/db/AdaptiveRecord.java @@ -20,32 +20,18 @@ * #L% */ -import act.Act; -import act.app.App; -import act.plugin.AppServicePlugin; -import act.util.SimpleBean; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import org.osgl.$; -import org.osgl.exception.NotAppliedException; -import org.osgl.inject.BeanSpec; -import org.osgl.inject.Injector; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; -import org.osgl.util.ValueObject; +import act.util.EnhancedAdaptiveMap; import java.beans.Transient; -import java.lang.reflect.*; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; +import java.util.Map; +import java.util.Set; /** * The `AdaptiveRecord` interface specifies a special {@link Model} in that * the fields/columns could be implicitly defined by database */ -public interface AdaptiveRecord extends Model { +public interface AdaptiveRecord + extends Model, EnhancedAdaptiveMap { Map internalMap(); @@ -136,17 +122,6 @@ public interface AdaptiveRecord exte */ Set> entrySet(); - /** - * Returns a set of entries stored in the active record. For - * field entries, use the field filter specified to check - * if it needs to be added into the return set - * - * @param fieldFilter the function that returns `true` or `false` for - * bean spec of a certain field declared in the class - * @return the entry set with field filter applied - */ - Set> entrySet($.Function fieldFilter); - /** * Returns a Map typed object backed by this active record * @@ -160,691 +135,6 @@ public interface AdaptiveRecord exte * @return AdaptiveRecord meta info */ @Transient - MetaInfo metaInfo(); - - class Util { - - public static MODEL_TYPE putValue(MODEL_TYPE ar, String key, Object val) { - Map kv = ar.internalMap(); - $.Func2 setter = ar.metaInfo().fieldSetters.get(key); - if (null != setter) { - setter.apply(ar, val); - } else { - kv.put(key, val); - } - return ar; - } - - public static MODEL_TYPE mergeValue(MODEL_TYPE ar, String key, Object val) { - Map kv = ar.internalMap(); - $.Func2 merger = ar.metaInfo().fieldMergers.get(key); - if (null != merger) { - merger.apply(ar, val); - } else { - Object v0 = kv.get(key); - kv.put(key, AdaptiveRecord.MetaInfo.merge(v0, val)); - } - return ar; - } - - public static T getValue(MODEL_TYPE ar, String key) { - Map kv = ar.internalMap(); - $.Function getter = ar.metaInfo().fieldGetters.get(key); - if (null != getter) { - return (T) getter.apply(ar); - } - return (T) kv.get(key); - } - - public static MODEL_TYPE putValues(MODEL_TYPE ar, Map map) { - for (Map.Entry entry: map.entrySet()) { - String key = entry.getKey(); - if ("id".equals(key)) { - continue; - } - ar.putValue(entry.getKey(), entry.getValue()); - } - return ar; - } - - public static MODEL_TYPE mergeValues(MODEL_TYPE ar, Map map) { - for (Map.Entry entry: map.entrySet()) { - ar.mergeValue(entry.getKey(), entry.getValue()); - } - return ar; - } - - public static boolean containsKey(MODEL_TYPE ar, String key) { - Map kv = ar.internalMap(); - return kv.containsKey(key) || ar.metaInfo().getterFieldSpecs.containsKey(key); - } - - public static Map toMap(final AdaptiveRecord ar) { - Map kv = ar.internalMap(); - Map map = new HashMap<>(kv); - for (Map.Entry entry : ar.metaInfo().fieldGetters.entrySet()) { - map.put(entry.getKey(), entry.getValue().apply(ar)); - } - return map; - } - - private static int fieldsSize(final AdaptiveRecord ar) { - return ar.metaInfo().getterFieldSpecs.size(); - } - - public static int size(final AdaptiveRecord ar) { - Map kv = ar.internalMap(); - return kv.size() + fieldsSize(ar); - } - - private static boolean hasFields(AdaptiveRecord ar) { - return !ar.metaInfo().getterFieldSpecs.isEmpty(); - } - - - public static Set keySet(AdaptiveRecord ar) { - Map kv = ar.internalMap(); - if (!hasFields(ar)) { - return kv.keySet(); - } - Set set = new HashSet(ar.metaInfo().getterFieldSpecs.keySet()); - set.addAll(kv.keySet()); - return set; - } - - public static Set> entrySet(AdaptiveRecord ar, $.Function function) { - Map kv = ar.internalMap(); - if (!hasFields(ar)) { - return kv.entrySet(); - } - Set> set = new HashSet>(kv.entrySet()); - AdaptiveRecord.MetaInfo metaInfo = ar.metaInfo(); - boolean filter = null != function; - for (Map.Entry entry: metaInfo.fieldGetters.entrySet()) { - String fieldName = entry.getKey(); - if ("kv".equals(fieldName)) { - continue; - } - if (filter) { - BeanSpec field = metaInfo.getterFieldSpecs.get(fieldName); - if (!function.apply(field)) { - continue; - } - } - $.Function getter = entry.getValue(); - set.add(new C.Map.Entry(fieldName, getter.apply(ar))); - } - return set; - } - - - public static Map asMap(final AdaptiveRecord ar) { - final Map kv = ar.internalMap(); - // TODO: should we check the field value on size, remove, containsXxx etc methods? - return new Map() { - @Override - public int size() { - return ar.size(); - } - - @Override - public boolean isEmpty() { - return ar.size() == 0; - } - - @Override - public boolean containsKey(Object key) { - return kv.containsKey(key) || ar.metaInfo().getterFieldSpecs.containsKey(key); - } - - @Override - public boolean containsValue(Object value) { - return kv.containsValue(value); - } - - @Override - public Object get(Object key) { - $.Function getter = ar.metaInfo().fieldGetters.get(key); - return null != getter ? getter.apply(ar) : kv.get((String)key); - } - - @Override - public Object put(String key, Object value) { - $.Func2 setter = ar.metaInfo().fieldSetters.get(key); - if (null != setter) { - Object o = get(key); - setter.apply(ar, value); - return o; - } - return kv.put(key, value); - } - - @Override - public Object remove(Object key) { - $.Function getter = ar.metaInfo().fieldGetters.get(key); - if (null != getter) { - return null; - } else { - return kv.remove(key); - } - } - - @Override - public void putAll(Map m) { - ar.putValues((Map)m); - } - - @Override - public void clear() { - kv.clear(); - // TODO: should we clear field values? - } - - @Override - public Set keySet() { - return ar.keySet(); - } - - @Override - public Collection values() { - List list = new ArrayList(); - list.addAll(kv.values()); - for ($.Function getter : ar.metaInfo().fieldGetters.values()) { - list.add(getter.apply(ar)); - } - return list; - } - - @Override - public Set> entrySet() { - return ar.entrySet(); - } - }; - } - - public static AdaptiveRecord.MetaInfo generateMetaInfo(AdaptiveRecord ar) { - AdaptiveRecord.MetaInfo.Repository r = Act.appServicePluginManager().get(AdaptiveRecord.MetaInfo.Repository.class); - return r.get(ar.getClass(), new $.Transformer, AdaptiveRecord.MetaInfo>() { - @Override - public AdaptiveRecord.MetaInfo transform(Class aClass) { - return new AdaptiveRecord.MetaInfo(aClass); - } - }); - } - } - - class MetaInfo { - private Class arClass; - public String className; - public Map getterFieldSpecs; - public Map getterFieldClasses; - public Map setterFieldSpecs; - public Map setterFieldClasses; - public Map fieldGetters; - public Map fieldSetters; - public Map fieldMergers; - private SimpleBean.MetaInfo metaInfo; - - public MetaInfo(Class clazz) { - this.className = clazz.getName(); - this.metaInfo = Act.app().classLoader().simpleBeanInfoManager().get(className); - this.arClass = clazz; - this.discoverProperties(clazz); - } - - @Deprecated - public Class fieldClass(String fieldName) { - Class clazz = setterFieldClasses.get(fieldName); - return null == clazz ? getterFieldClasses.get(fieldName) : clazz; - } - - public Class getterFieldClass(String fieldName) { - return getterFieldClasses.get(fieldName); - } - - public Class setterFieldClass(String fieldName) { - return setterFieldClasses.get(fieldName); - } - - public Type getterFieldType(String fieldName) { - BeanSpec spec = getterFieldSpecs.get(fieldName); - return null == spec ? null : spec.type(); - } - - public Type setterFieldType(String fieldName) { - BeanSpec spec = setterFieldSpecs.get(fieldName); - return null == spec ? null : spec.type(); - } - - private void discoverProperties(Class clazz) { - getterFieldSpecs = new HashMap<>(); - getterFieldClasses = new HashMap<>(); - setterFieldSpecs = new HashMap<>(); - setterFieldClasses = new HashMap<>(); - fieldGetters = new HashMap<>(); - fieldSetters = new HashMap<>(); - fieldMergers = new HashMap<>(); - Injector injector = Act.app().injector(); - for (final Method m : clazz.getMethods()) { - String name = propertyName(m); - String alias; - final boolean hasAlias; - if (S.blank(name)) { - continue; - } else { - name = S.lowerFirst(name); - alias = null == metaInfo ? name : metaInfo.aliasOf(name); - hasAlias = name != alias; - if ("idAsStr".equals(name)) { - // special case for MorphiaModel - continue; - } - } - final Class returnClass = m.getReturnType(); - Type returnType = m.getGenericReturnType(); - Class paramClass = null; - Type paramType = null; - Class[] params = m.getParameterTypes(); - Type[] paramTypes = m.getGenericParameterTypes(); - if (null != params && params.length == 1) { - paramClass = params[0]; - paramType = paramTypes[0]; - } - Class fieldClass = null == paramClass ? returnClass : paramClass; - Type fieldType = null == paramType ? returnType : paramType; - if (!(fieldType instanceof ParameterizedType)) { - fieldType = fieldClass; - } - if (null == paramClass) { - BeanSpec spec = BeanSpec.of(fieldType, m.getDeclaredAnnotations(), name, injector); - getterFieldSpecs.put(name, spec); - getterFieldClasses.put(name, fieldClass); - if (hasAlias) { - getterFieldSpecs.put(alias, spec); - getterFieldClasses.put(alias, fieldClass); - } - } else { - BeanSpec existingSpec = setterFieldSpecs.get(name); - if (null == existingSpec && hasAlias) { - existingSpec = setterFieldSpecs.get(alias); - } - if (null != existingSpec) { - // we need to infer the type from field in this case - Field field = $.fieldOf(clazz, name, true); - if (null != field) { - BeanSpec spec = BeanSpec.of(field, injector); - setterFieldSpecs.put(name, spec); - setterFieldClasses.put(name, field.getType()); - if (hasAlias) { - setterFieldSpecs.put(alias, spec); - setterFieldClasses.put(alias, field.getType()); - } - } else { - if (fieldClass == Object.class) { - // ignore - } else if (existingSpec.rawType() == Object.class) { - BeanSpec spec = BeanSpec.of(fieldType, m.getDeclaredAnnotations(), name, injector); - setterFieldSpecs.put(name, spec); - setterFieldClasses.put(name, fieldClass); - if (hasAlias) { - setterFieldSpecs.put(alias, spec); - setterFieldClasses.put(alias, fieldClass); - } - } - } - } else { - BeanSpec spec = BeanSpec.of(fieldType, m.getDeclaredAnnotations(), name, injector); - setterFieldSpecs.put(name, spec); - setterFieldClasses.put(name, fieldClass); - if (hasAlias) { - setterFieldSpecs.put(alias, spec); - setterFieldClasses.put(alias, fieldClass); - } - } - } - if (null != paramClass) { - final String fieldName = name; - $.Func2 fn = new $.Func2() { - @Override - public Object apply(Object host, Object value) throws NotAppliedException, $.Break { - BeanSpec spec = setterFieldSpecs.get(fieldName); - if (null != value && !spec.isInstance(value)) { - if (value instanceof String) { - value = Act.app().resolverManager().resolve((String)value, spec.rawType()); - } else if (value instanceof JSONObject) { - value = JSON.parseObject(((JSONObject) value).toJSONString(), spec.rawType()); - } - } - $.invokeVirtual(host, m, value); - return null; - } - }; - fieldSetters.put(name, fn); - if (hasAlias) { - fieldSetters.put(alias, fn); - } - fn = new $.Func2() { - @Override - public Object apply(Object host, Object value) throws NotAppliedException, $.Break { - BeanSpec spec = setterFieldSpecs.get(fieldName); - if (null != value && !spec.isInstance(value)) { - if (value instanceof String) { - value = Act.app().resolverManager().resolve((String)value, spec.rawType()); - } - } - $.Function getter = fieldGetters.get(fieldName); - if (null == getter) { - $.invokeVirtual(host, m, value); - return null; - } - Object value0 = getter.apply(host); - value = merge(value0, value); - $.invokeVirtual(host, m, value); - return null; - } - }; - fieldMergers.put(name, fn); - if (hasAlias) { - fieldMergers.put(alias, fn); - } - } else { - $.F1 fn = new $.F1() { - @Override - public Object apply(Object host) throws NotAppliedException, $.Break { - return $.invokeVirtual(host, m); - } - }; - fieldGetters.put(name, fn); - if (hasAlias) { - fieldGetters.put(alias, fn); - } - } - } - } - - private String propertyName(Method m) { - String name = m.getName(); - if ("getClass".equals(name)) { - return null; - } - Type[] paramTypes = m.getGenericParameterTypes(); - if (name.startsWith("set") && void.class == m.getReturnType() && null != paramTypes && paramTypes.length == 1) { - return name.substring(3); - } - boolean isGet = name.startsWith("get"); - boolean isIs = name.startsWith("is"); - if ((isGet || isIs) && void.class != m.getReturnType() && (null == paramTypes || paramTypes.length == 0)) { - return isGet ? name.substring(3) : name.substring(2); - } - return null; - } - - public static Object merge(Object to, Object from) { - if (null == to) { - return from; - } - if (null == from) { - return to; - } - if (canBeMerged(to.getClass())) { - return _merge(to, from); - } - return from; - } - - private static Object _merge(Object to, Object from) { - if (to instanceof ValueObject) { - if (from instanceof ValueObject) { - return ValueObject.of(merge(((ValueObject) to).value(), ((ValueObject) from).value())); - } - return ValueObject.of(merge(((ValueObject) to).value(), from)); - } - if (to instanceof AdaptiveRecord) { - AdaptiveRecord ar = (AdaptiveRecord) to; - return mergeIntoAdaptiveRecord(ar, from); - } - if (to instanceof Map) { - Map map = (Map) to; - return mergeIntoMap(map, from); - } - if (to instanceof Set) { - Set set = (Set) to; - return mergeIntoSet(set, from); - } - if (to instanceof List) { - List list = (List) to; - return mergeIntoList(list, from); - } - if (to.getClass().isArray()) { - List list = new ArrayList(); - int len = Array.getLength(to); - for (int i = 0; i < len; ++i) { - list.add(Array.get(to, i)); - } - List list1 = mergeIntoList(list, from); - int sz1 = list1.size(); - Object a1 = Array.newInstance(to.getClass().getComponentType(), sz1); - for (int i = 0; i < sz1; ++i) { - Array.set(a1, i, list1.get(i)); - } - return a1; - } - return mergeIntoPojo(to, from); - } - - private static String getterName(Field field) { - boolean isBoolean = field.getType() == Boolean.class || field.getType() == boolean.class; - return (isBoolean ? "is" : "get") + S.capFirst(field.getName()); - } - - private static String setterName(Field field) { - return "set" + S.capFirst(field.getName()); - } - - private static boolean canBeMerged(Class c) { - return !($.isSimpleType(c) || isDateType(c)); - } - - private static boolean isDateType(Class c) { - String name = c.getSimpleName(); - return (name.endsWith("Date") || name.endsWith("DateTime") || name.endsWith("Calendar")); - } - - private static AdaptiveRecord mergeIntoAdaptiveRecord(AdaptiveRecord ar, Object value) { - if (value instanceof Map) { - return mergeMapIntoAdaptiveRecord(ar, (Map) value); - } - if (value instanceof AdaptiveRecord) { - return mergeMapIntoAdaptiveRecord(ar, ((AdaptiveRecord) value).asMap()); - } - List fields = $.fieldsOf(value.getClass(), true); - for (Field f : fields) { - f.setAccessible(true); - try { - String fn = f.getName(); - Object fv = f.get(value); - Object o0 = ar.getValue(fn); - ar.putValue(fn, merge(o0, fv)); - } catch (IllegalAccessException e) { - throw E.unexpected(e, "error merging into adaptive record"); - } - } - return ar; - } - - private static AdaptiveRecord mergeMapIntoAdaptiveRecord(AdaptiveRecord ar, Map map) { - return ar.putValues(map); - } - - private static Map mergeIntoMap(Map map, Object value) { - if (value instanceof Map) { - return mergeMapIntoMap(map, (Map) value); - } - if (value instanceof AdaptiveRecord) { - return mergeMapIntoMap(map, ((AdaptiveRecord) value).asMap()); - } - Map retval = new HashMap(map); - List fields = $.fieldsOf(value.getClass(), true); - for (Field f : fields) { - f.setAccessible(true); - try { - String fn = f.getName(); - Object fv = f.get(value); - Object o0 = map.get(fn); - retval.put(fn, merge(o0, fv)); - } catch (IllegalAccessException e) { - throw E.unexpected(e, "error merging into adaptive record"); - } - } - return retval; - } - - private static Map mergeMapIntoMap(Map m0, Map m1) { - Map retval = (Map) Act.injector().get(m0.getClass()); - retval.putAll(m0); - for (Map.Entry entry : m1.entrySet()) { - Object k = entry.getKey(); - Object v = entry.getValue(); - retval.put(k, merge(m0.get(k), v)); - } - return retval; - } - - private static Set mergeIntoSet(Set set, Object value) { - if (value instanceof Collection) { - return mergeCollectionIntoSet(set, (Collection) value); - } - if (value.getClass().isArray()) { - List list = new ArrayList(); - int len = Array.getLength(value); - for (int i = 0; i < len; ++i) { - list.add(Array.get(value, i)); - } - return mergeCollectionIntoSet(set, list); - } - throw new IllegalArgumentException("Cannot merge " + value.getClass() + " into Set"); - } - - private static Set mergeCollectionIntoSet(Set set, Collection col) { - Set set1 = (Set) Act.injector().get(set.getClass()); - set1.addAll(col); - return set1; - } - - private static List mergeIntoList(List list, Object value) { - if (value instanceof Set) { - return mergeSetIntoList(list, (Set) value); - } - if (value instanceof List) { - return mergeListIntoList(list, (List) value); - } - if (value.getClass().isArray()) { - List list0 = new ArrayList(); - int len = Array.getLength(value); - for (int i = 0; i < len; ++i) { - list0.add(Array.get(value, i)); - } - return mergeListIntoList(list, list0); - } - throw new IllegalArgumentException("Cannot merge " + value.getClass() + " into List"); - } - - private static List mergeSetIntoList(List list, Set set) { - List retval = (List) Act.injector().get(list.getClass()); - retval.addAll(list); - retval.addAll(set); - return retval; - } - - private static List mergeListIntoList(List to, List from) { - List retval = (List) Act.injector().get(to.getClass()); - int szTo = to.size(); - int szFrom = from.size(); - int szMin = Math.min(szTo, szFrom); - for (int i = 0; i < szMin; ++i) { - Object o0 = to.get(i); - Object o1 = from.get(i); - retval.add(merge(o0, o1)); - } - if (szTo > szFrom) { - for (int i = szMin; i < szTo; ++i) { - retval.add(to.get(i)); - } - } else if (szFrom > szTo) { - for (int i = szMin; i < szFrom; ++i) { - retval.add(from.get(i)); - } - } - return retval; - } - - private static Object mergeIntoPojo(Object o0, Object o1) { - if (o1 instanceof Map) { - return mergeMapIntoPojo(o0, (Map) o1); - } - if (o1 instanceof AdaptiveRecord) { - return mergeMapIntoPojo(o0, ((AdaptiveRecord) o1).asMap()); - } - if (o1 instanceof Collection || o1.getClass().isArray()) { - throw E.unexpected("cannot merge " + o1.getClass() + " into " + o0.getClass()); - } - Class c0 = o0.getClass(); - List fields = $.fieldsOf(o1.getClass(), true); - for (Field f : fields) { - f.setAccessible(true); - try { - String fn = f.getName(); - Field f0 = $.fieldOf(c0, fn); - if (null == f0) { - continue; - } - Object fv = f.get(o1); - f0.setAccessible(true); - Object fv0 = merge(f0.get(o0), fv); - f0.set(o0, fv0); - } catch (IllegalAccessException e) { - throw E.unexpected(e, "error merging into POJO"); - } - } - return o0; - } - - private static Object mergeMapIntoPojo(Object o0, Map map) { - List fields = $.fieldsOf(o0.getClass(), true); - for (Field f : fields) { - String fn = f.getName(); - if (map.containsKey(fn)) { - f.setAccessible(true); - try { - Object v = f.get(o0); - f.set(o0, merge(v, map.get(fn))); - } catch (IllegalAccessException e) { - throw E.unexpected(e, "error merging into POJO"); - } - } - } - return o0; - } - - public static class Repository extends AppServicePlugin { - @Override - protected void applyTo(App app) { - } - - private ConcurrentMap, MetaInfo> map = new ConcurrentHashMap<>(); - - public MetaInfo get(Class clazz, $.Function, MetaInfo> factory) { - MetaInfo info = map.get(clazz); - if (null == info) { - MetaInfo theInfo = factory.apply(clazz); - info = map.putIfAbsent(clazz, theInfo); - if (null == info) { - info = theInfo; - } - } - return info; - } - } - } + EnhancedAdaptiveMap.MetaInfo metaInfo(); } diff --git a/src/main/java/act/util/AdaptiveBean.java b/src/main/java/act/util/AdaptiveBean.java new file mode 100644 index 000000000..324619d72 --- /dev/null +++ b/src/main/java/act/util/AdaptiveBean.java @@ -0,0 +1,122 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.data.annotation.Data; +import act.inject.param.NoBind; +import com.alibaba.fastjson.JSONObject; +import org.osgl.Lang; +import org.osgl.util.BeanInfo; + +import java.util.Map; +import java.util.Set; + +@Data +public class AdaptiveBean implements SimpleBean, EnhancedAdaptiveMap { + + @NoBind + private transient JSONObject kv = new JSONObject(); + + private transient volatile EnhancedAdaptiveMap.MetaInfo metaInfo; + + @Override + public Map internalMap() { + return kv; + } + + // --- implement KV + @Override + public AdaptiveBean putValue(String key, Object val) { + Util.putValue(this, key, val); + return this; + } + + @Override + public AdaptiveBean mergeValue(String key, Object val) { + Util.mergeValue(this, key, val); + return this; + } + + @Override + public T getValue(String key) { + return Util.getValue(this, key); + } + + @Override + public AdaptiveBean putValues(Map map) { + Util.putValues(this, map); + return this; + } + + @Override + public AdaptiveBean mergeValues(Map map) { + Util.mergeValues(this, map); + return this; + } + + @Override + public boolean containsKey(String key) { + return Util.containsKey(this, key); + } + + @Override + public Map toMap() { + return Util.toMap(this); + } + + @Override + public int size() { + return Util.size(this); + } + + @Override + public Set keySet() { + return Util.keySet(this); + } + + @Override + public Set> entrySet() { + return entrySet(null); + } + + @Override + public Set> entrySet(Lang.Function fieldFilter) { + return Util.entrySet(this, fieldFilter); + } + + public Map asMap() { + return Util.asMap(this); + } + + @Override + @java.beans.Transient + public EnhancedAdaptiveMap.MetaInfo metaInfo() { + if (null == metaInfo) { + synchronized (this) { + if (null == metaInfo) { + metaInfo = Util.generateMetaInfo(this); + } + } + } + return metaInfo; + } + +} diff --git a/src/main/java/act/util/AdaptiveBeanCodec.java b/src/main/java/act/util/AdaptiveBeanCodec.java new file mode 100644 index 000000000..ee0e2aae9 --- /dev/null +++ b/src/main/java/act/util/AdaptiveBeanCodec.java @@ -0,0 +1,340 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.event.SysEventId; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.*; +import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; +import com.alibaba.fastjson.serializer.*; +import org.osgl.$; +import org.osgl.util.BeanInfo; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class AdaptiveBeanCodec extends SerializeFilterable implements ObjectDeserializer, ObjectSerializer{ + + @Override + public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { + final JSONLexer lexer = parser.lexer; + if (lexer.token() == JSONToken.NULL) { + lexer.nextToken(JSONToken.COMMA); + return null; + } + + AdaptiveBean ar = Act.app().getInstance((Class) type); + + ParseContext context = parser.getContext(); + + try { + parser.setContext(context, ar, fieldName); + return (T) parseActiveBean(parser, ar, fieldName); + } finally { + parser.setContext(context); + } + } + + @SuppressWarnings("rawtypes") + public static AdaptiveBean parseActiveBean(DefaultJSONParser parser, AdaptiveBean ar, Object fieldName) { + JSONLexer lexer = parser.lexer; + + if (lexer.token() != JSONToken.LBRACE) { + throw new JSONException("syntax error, expect {, actual " + lexer.token()); + } + + ParseContext context = parser.getContext(); + try { + for (int i = 0;;++i) { + lexer.skipWhitespace(); + char ch = lexer.getCurrent(); + if (lexer.isEnabled(Feature.AllowArbitraryCommas)) { + while (ch == ',') { + lexer.next(); + lexer.skipWhitespace(); + ch = lexer.getCurrent(); + } + } + + String key; + if (ch == '"') { + key = lexer.scanSymbol(parser.getSymbolTable(), '"'); + lexer.skipWhitespace(); + ch = lexer.getCurrent(); + if (ch != ':') { + throw new JSONException("expect ':' at " + lexer.pos()); + } + } else if (ch == '}') { + lexer.next(); + lexer.resetStringPosition(); + lexer.nextToken(JSONToken.COMMA); + return ar; + } else if (ch == '\'') { + if (!lexer.isEnabled(Feature.AllowSingleQuotes)) { + throw new JSONException("syntax error"); + } + + key = lexer.scanSymbol(parser.getSymbolTable(), '\''); + lexer.skipWhitespace(); + ch = lexer.getCurrent(); + if (ch != ':') { + throw new JSONException("expect ':' at " + lexer.pos()); + } + } else { + if (!lexer.isEnabled(Feature.AllowUnQuotedFieldNames)) { + throw new JSONException("syntax error"); + } + + key = lexer.scanSymbolUnQuoted(parser.getSymbolTable()); + lexer.skipWhitespace(); + ch = lexer.getCurrent(); + if (ch != ':') { + throw new JSONException("expect ':' at " + lexer.pos() + ", actual " + ch); + } + } + + lexer.next(); + lexer.skipWhitespace(); + lexer.getCurrent(); + + lexer.resetStringPosition(); + + Object value; + lexer.nextToken(); + + if (i != 0) { + parser.setContext(context); + } + + if (lexer.token() == JSONToken.NULL) { + value = null; + lexer.nextToken(); + } else { + value = parser.parseObject(ar.metaInfo().setterFieldType(key), key); + } + + ar.putValue(key, value); + parser.checkMapResolve(ar.asMap(), key); + + parser.setContext(context, value, key); + parser.setContext(context); + + final int tok = lexer.token(); + if (tok == JSONToken.EOF || tok == JSONToken.RBRACKET) { + return ar; + } + + if (tok == JSONToken.RBRACE) { + lexer.nextToken(); + return ar; + } + } + } finally { + parser.setContext(context); + } + + } + + private static $.Predicate fieldFilter = new $.Predicate() { + @Override + public boolean test(BeanInfo beanSpec) { + return !beanSpec.isTransient(); + } + }; + + @Override + public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { + SerializeWriter out = serializer.out; + + if (object == null) { + out.writeNull(); + return; + } + + AdaptiveBean ar = (AdaptiveBean) object; + + if (serializer.containsReference(object)) { + serializer.writeReference(object); + return; + } + + SerialContext parent = serializer.getContext(); + serializer.setContext(parent, object, fieldName, 0); + try { + out.write('{'); + + serializer.incrementIndent(); + + Class preClazz = null; + ObjectSerializer preWriter = null; + + boolean first = true; + + if (out.isEnabled(SerializerFeature.WriteClassName)) { + String typeKey = serializer.getMapping().getTypeKey(); + Class mapClass = ar.getClass(); + boolean containsKey = (mapClass == JSONObject.class || mapClass == HashMap.class || mapClass == LinkedHashMap.class) + && ar.containsKey(typeKey); + if (!containsKey) { + out.writeFieldName(typeKey); + out.writeString(object.getClass().getName()); + first = false; + } + } + + for (Map.Entry entry : ar.entrySet(fieldFilter)) { + Object value = entry.getValue(); + + String entryKey = entry.getKey(); + + { + List preFilters = serializer.getPropertyPreFilters(); + if (preFilters != null && preFilters.size() > 0) { + if (!this.applyName(serializer, object, entryKey)) { + continue; + } + } + } + { + List preFilters = this.propertyPreFilters; + if (preFilters != null && preFilters.size() > 0) { + if (!this.applyName(serializer, object, entryKey)) { + continue; + } + } + } + + { + List propertyFilters = serializer.getPropertyFilters(); + if (propertyFilters != null && propertyFilters.size() > 0) { + if (!this.apply(serializer, object, entryKey, value)) { + continue; + } + } + } + { + List propertyFilters = this.propertyFilters; + if (propertyFilters != null && propertyFilters.size() > 0) { + if (!this.apply(serializer, object, entryKey, value)) { + continue; + } + } + } + + { + List nameFilters = serializer.getNameFilters(); + if (nameFilters != null && nameFilters.size() > 0) { + entryKey = this.processKey(serializer, object, entryKey, value); + } + } + { + List nameFilters = this.nameFilters; + if (nameFilters != null && nameFilters.size() > 0) { + entryKey = this.processKey(serializer, object, entryKey, value); + } + } + + { + List valueFilters = serializer.getValueFilters(); + List contextValueFilters = this.contextValueFilters; + if ((valueFilters != null && valueFilters.size() > 0) // + || (contextValueFilters != null && contextValueFilters.size() > 0)) { + value = this.processValue(serializer, null, object, entryKey, value); + } + } + { + List valueFilters = this.valueFilters; + List contextValueFilters = this.contextValueFilters; + if ((valueFilters != null && valueFilters.size() > 0) // + || (contextValueFilters != null && contextValueFilters.size() > 0)) { + value = this.processValue(serializer, null, object, entryKey, value); + } + } + + if (value == null) { + if (!out.isEnabled(SerializerFeature.WRITE_MAP_NULL_FEATURES)) { + continue; + } + } + + String key = entryKey; + + if (!first) { + out.write(','); + } + + if (out.isEnabled(SerializerFeature.PrettyFormat)) { + serializer.println(); + } + out.writeFieldName(key, true); + + first = false; + + if (value == null) { + out.writeNull(); + continue; + } + + Class clazz = value.getClass(); + + if (clazz == preClazz) { + preWriter.write(serializer, value, entryKey, null, 0); + } else { + preClazz = clazz; + preWriter = serializer.getObjectWriter(clazz); + + preWriter.write(serializer, value, entryKey, null, 0); + } + } + } finally { + serializer.setContext(parent); + } + + serializer.decrementIdent(); + if (out.isEnabled(SerializerFeature.PrettyFormat) && ar.size() > 0) { + serializer.println(); + } + out.write('}'); + } + + public int getFastMatchToken() { + return JSONToken.LBRACE; + } + + @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_PROVISIONED) + public static void foundAdaptiveBeanClass(Class clazz) { + + AdaptiveBeanCodec codec = new AdaptiveBeanCodec(); + + SerializeConfig config = SerializeConfig.getGlobalInstance(); + config.put(clazz, codec); + + ParserConfig parserConfig = ParserConfig.getGlobalInstance(); + parserConfig.putDeserializer(clazz, codec); + } + +} diff --git a/src/main/java/act/util/AdaptiveRecordCodec.java b/src/main/java/act/util/AdaptiveRecordCodec.java index 66651fd77..bc47170fc 100644 --- a/src/main/java/act/util/AdaptiveRecordCodec.java +++ b/src/main/java/act/util/AdaptiveRecordCodec.java @@ -29,7 +29,7 @@ import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; import com.alibaba.fastjson.serializer.*; import org.osgl.$; -import org.osgl.inject.BeanSpec; +import org.osgl.util.BeanInfo; import java.io.IOException; import java.lang.reflect.Type; @@ -160,9 +160,9 @@ public static AdaptiveRecord parseActiveRecord(DefaultJSONParser parser, Adaptiv } - private static $.Predicate fieldFilter = new $.Predicate() { + private static $.Predicate fieldFilter = new $.Predicate() { @Override - public boolean test(BeanSpec beanSpec) { + public boolean test(BeanInfo beanSpec) { return !beanSpec.isTransient(); } }; diff --git a/src/main/java/act/util/EnhancedAdaptiveMap.java b/src/main/java/act/util/EnhancedAdaptiveMap.java new file mode 100644 index 000000000..74de32356 --- /dev/null +++ b/src/main/java/act/util/EnhancedAdaptiveMap.java @@ -0,0 +1,784 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.App; +import act.db.AdaptiveRecord; +import act.db.Model; +import act.plugin.AppServicePlugin; +import act.validation.Password; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.osgl.$; +import org.osgl.exception.NotAppliedException; +import org.osgl.inject.BeanSpec; +import org.osgl.inject.Injector; +import org.osgl.util.*; + +import java.beans.Transient; +import java.lang.annotation.Annotation; +import java.lang.reflect.*; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +public interface EnhancedAdaptiveMap extends AdaptiveMap { + /** + * Returns the meta info of this EnhancedAdaptiveMap + * + * @return AdaptiveRecord meta info + */ + @Transient + MetaInfo metaInfo(); + + class Util { + + public static MODEL_TYPE putValue(MODEL_TYPE ar, String key, Object val) { + Map kv = ar.internalMap(); + $.Func2 setter = ar.metaInfo().fieldSetters.get(key); + if (null != setter) { + setter.apply(ar, val); + } else { + kv.put(key, val); + } + return ar; + } + + public static MODEL_TYPE mergeValue(MODEL_TYPE ar, String key, Object val) { + Map kv = ar.internalMap(); + $.Func2 merger = ar.metaInfo().fieldMergers.get(key); + if (null != merger) { + merger.apply(ar, val); + } else { + Object v0 = kv.get(key); + kv.put(key, MetaInfo.merge(v0, val)); + } + return ar; + } + + public static T getValue(MODEL_TYPE ar, String key) { + Map kv = ar.internalMap(); + $.Function getter = ar.metaInfo().fieldGetters.get(key); + if (null != getter) { + return (T) getter.apply(ar); + } + return (T) kv.get(key); + } + + public static MODEL_TYPE putValues(MODEL_TYPE ar, Map map) { + MetaInfo metaInfo = generateMetaInfo(ar); + Map beanSpecMap = metaInfo.setterFieldSpecs; + final boolean isModel = ar instanceof Model; + for (Map.Entry entry: map.entrySet()) { + String key = entry.getKey(); + if ("id".equals(key)) { + continue; + } + Object val = entry.getValue(); + BeanInfo spec = beanSpecMap.get(key); + if (isModel && null != spec && spec.hasAnnotation(Password.class)) { + if (null == val || S.blank($.convert(val).toString())) { + if (((Model)ar)._isNew()) { + // generating random password for new record + val = S.secureRandom(11); + } else { + // skip empty password for record updating + continue; + } + } + } + ar.putValue(key, val); + } + return ar; + } + + public static MODEL_TYPE mergeValues(MODEL_TYPE ar, Map map) { + MetaInfo metaInfo = generateMetaInfo(ar); + Map beanSpecMap = metaInfo.setterFieldSpecs; + final boolean isModel = ar instanceof Model; + for (Map.Entry entry: map.entrySet()) { + String key = entry.getKey(); + if ("id".equals(key)) { + continue; + } + Object val = entry.getValue(); + BeanInfo spec = beanSpecMap.get(key); + if (null != spec && spec.hasAnnotation(Password.class)) { + if (null == val || S.blank($.convert(val).toString())) { + if (((Model)ar)._isNew()) { + // generating random password for new record + val = S.secureRandom(11); + } else { + // skip empty password for record updating + continue; + } + } + } + ar.mergeValue(key, val); + } + return ar; + } + + public static boolean containsKey(MODEL_TYPE ar, String key) { + Map kv = ar.internalMap(); + return kv.containsKey(key) || ar.metaInfo().getterFieldSpecs.containsKey(key); + } + + public static Map toMap(final EnhancedAdaptiveMap ar) { + Map kv = ar.internalMap(); + Map map = new HashMap<>(kv); + for (Map.Entry entry : ar.metaInfo().fieldGetters.entrySet()) { + map.put(entry.getKey(), entry.getValue().apply(ar)); + } + return map; + } + + private static int fieldsSize(final EnhancedAdaptiveMap ar) { + return ar.metaInfo().getterFieldSpecs.size(); + } + + public static int size(final EnhancedAdaptiveMap ar) { + Map kv = ar.internalMap(); + return kv.size() + fieldsSize(ar); + } + + private static boolean hasFields(EnhancedAdaptiveMap ar) { + return !ar.metaInfo().getterFieldSpecs.isEmpty(); + } + + + public static Set keySet(EnhancedAdaptiveMap ar) { + Map kv = ar.internalMap(); + if (!hasFields(ar)) { + return kv.keySet(); + } + Set set = new HashSet(ar.metaInfo().getterFieldSpecs.keySet()); + set.addAll(kv.keySet()); + return set; + } + + public static Set> entrySet(EnhancedAdaptiveMap ar, $.Function function) { + Map kv = ar.internalMap(); + if (!hasFields(ar)) { + return kv.entrySet(); + } + Set> set = new HashSet>(kv.entrySet()); + MetaInfo metaInfo = ar.metaInfo(); + boolean filter = null != function; + for (Map.Entry entry: metaInfo.fieldGetters.entrySet()) { + String fieldName = entry.getKey(); + if ("kv".equals(fieldName)) { + continue; + } + if (filter) { + BeanInfo field = metaInfo.getterFieldSpecs.get(fieldName); + if (!function.apply(field)) { + continue; + } + } + $.Function getter = entry.getValue(); + set.add(new C.Map.Entry(fieldName, getter.apply(ar))); + } + return set; + } + + + public static Map asMap(final EnhancedAdaptiveMap ar) { + final Map kv = ar.internalMap(); + // TODO: should we check the field value on size, remove, containsXxx etc methods? + return new Map() { + @Override + public int size() { + return ar.size(); + } + + @Override + public boolean isEmpty() { + return ar.size() == 0; + } + + @Override + public boolean containsKey(Object key) { + return kv.containsKey(key) || ar.metaInfo().getterFieldSpecs.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return kv.containsValue(value); + } + + @Override + public Object get(Object key) { + $.Function getter = ar.metaInfo().fieldGetters.get(key); + return null != getter ? getter.apply(ar) : kv.get((String)key); + } + + @Override + public Object put(String key, Object value) { + $.Func2 setter = ar.metaInfo().fieldSetters.get(key); + if (null != setter) { + Object o = get(key); + setter.apply(ar, value); + return o; + } + return kv.put(key, value); + } + + @Override + public Object remove(Object key) { + $.Function getter = ar.metaInfo().fieldGetters.get(key); + if (null != getter) { + return null; + } else { + return kv.remove(key); + } + } + + @Override + public void putAll(Map m) { + ar.putValues((Map)m); + } + + @Override + public void clear() { + kv.clear(); + // TODO: should we clear field values? + } + + @Override + public Set keySet() { + return ar.keySet(); + } + + @Override + public Collection values() { + List list = new ArrayList(); + list.addAll(kv.values()); + for ($.Function getter : ar.metaInfo().fieldGetters.values()) { + list.add(getter.apply(ar)); + } + return list; + } + + @Override + public Set> entrySet() { + return ar.entrySet(); + } + }; + } + + public static MetaInfo generateMetaInfo(EnhancedAdaptiveMap ar) { + MetaInfo.Repository r = Act.appServicePluginManager().get(MetaInfo.Repository.class); + return r.get(ar.getClass(), new $.Transformer, MetaInfo>() { + @Override + public MetaInfo transform(Class aClass) { + return new MetaInfo(aClass); + } + }); + } + } + + class MetaInfo { + private Class arClass; + public String className; + public Map getterFieldSpecs; + public Map getterFieldClasses; + public Map setterFieldSpecs; + public Map setterFieldClasses; + public Map fieldGetters; + public Map fieldSetters; + public Map fieldMergers; + private SimpleBean.MetaInfo metaInfo; + + public MetaInfo(Class clazz) { + this.className = clazz.getName(); + this.metaInfo = Act.app().classLoader().simpleBeanInfoManager().get(className); + this.arClass = clazz; + this.discoverProperties(clazz); + } + + @Deprecated + public Class fieldClass(String fieldName) { + Class clazz = setterFieldClasses.get(fieldName); + return null == clazz ? getterFieldClasses.get(fieldName) : clazz; + } + + public Class getterFieldClass(String fieldName) { + return getterFieldClasses.get(fieldName); + } + + public Class setterFieldClass(String fieldName) { + return setterFieldClasses.get(fieldName); + } + + public Type getterFieldType(String fieldName) { + BeanInfo spec = getterFieldSpecs.get(fieldName); + return null == spec ? null : spec.type(); + } + + public Type setterFieldType(String fieldName) { + BeanInfo spec = setterFieldSpecs.get(fieldName); + return null == spec ? null : spec.type(); + } + + private void discoverProperties(Class clazz) { + getterFieldSpecs = new HashMap<>(); + getterFieldClasses = new HashMap<>(); + setterFieldSpecs = new HashMap<>(); + setterFieldClasses = new HashMap<>(); + fieldGetters = new HashMap<>(); + fieldSetters = new HashMap<>(); + fieldMergers = new HashMap<>(); + Injector injector = Act.app().injector(); + for (final Method m : clazz.getMethods()) { + String name = propertyName(m); + String alias; + final boolean hasAlias; + if (S.blank(name)) { + continue; + } else { + name = S.lowerFirst(name); + alias = null == metaInfo ? name : metaInfo.aliasOf(name); + hasAlias = name != alias; + if ("idAsStr".equals(name)) { + // special case for MorphiaModel + continue; + } + } + final Class returnClass = m.getReturnType(); + Type returnType = m.getGenericReturnType(); + Class paramClass = null; + Type paramType = null; + Class[] params = m.getParameterTypes(); + Type[] paramTypes = m.getGenericParameterTypes(); + if (null != params && params.length == 1) { + paramClass = params[0]; + paramType = paramTypes[0]; + } + Class fieldClass = null == paramClass ? returnClass : paramClass; + Type fieldType = null == paramType ? returnType : paramType; + if (!(fieldType instanceof ParameterizedType)) { + fieldType = fieldClass; + } + if (null == paramClass) { + BeanSpec spec = BeanSpec.of(fieldType, m.getDeclaredAnnotations(), name, injector); + getterFieldSpecs.put(name, spec); + getterFieldClasses.put(name, fieldClass); + if (hasAlias) { + getterFieldSpecs.put(alias, spec); + getterFieldClasses.put(alias, fieldClass); + } + } else { + BeanInfo existingSpec = setterFieldSpecs.get(name); + if (null == existingSpec && hasAlias) { + existingSpec = setterFieldSpecs.get(alias); + } + if (null != existingSpec) { + // we need to infer the type from field in this case + Field field = $.fieldOf(clazz, name, true); + if (null != field) { + BeanSpec spec = BeanSpec.of(field, injector); + setterFieldSpecs.put(name, spec); + setterFieldClasses.put(name, field.getType()); + if (hasAlias) { + setterFieldSpecs.put(alias, spec); + setterFieldClasses.put(alias, field.getType()); + } + } else { + if (fieldClass == Object.class) { + // ignore + } else if (existingSpec.rawType() == Object.class) { + BeanSpec spec = BeanSpec.of(fieldType, m.getDeclaredAnnotations(), name, injector); + setterFieldSpecs.put(name, spec); + setterFieldClasses.put(name, fieldClass); + if (hasAlias) { + setterFieldSpecs.put(alias, spec); + setterFieldClasses.put(alias, fieldClass); + } + } + } + } else { + Annotation[] annotations = m.getAnnotations(); + Field field = $.fieldOf(clazz, name); + if (null != field) { + Annotation[] fieldAnnotations = field.getAnnotations(); + if (annotations.length == 0) { + annotations = fieldAnnotations; + } else if (fieldAnnotations.length > 0) { + annotations = $.concat(annotations, fieldAnnotations); + } + } + BeanSpec spec = BeanSpec.of(fieldType, annotations, name, injector); + setterFieldSpecs.put(name, spec); + setterFieldClasses.put(name, fieldClass); + if (hasAlias) { + setterFieldSpecs.put(alias, spec); + setterFieldClasses.put(alias, fieldClass); + } + } + } + if (null != paramClass) { + final String fieldName = name; + $.Func2 fn = new $.Func2() { + @Override + public Object apply(Object host, Object value) throws NotAppliedException, $.Break { + BeanInfo spec = setterFieldSpecs.get(fieldName); + if (null != value && !spec.isInstance(value)) { + if (value instanceof String) { + value = Act.app().resolverManager().resolve((String)value, spec.rawType()); + } else if (value instanceof JSONObject) { + value = JSON.parseObject(((JSONObject) value).toJSONString(), spec.rawType()); + } + } + $.invokeVirtual(host, m, value); + return null; + } + }; + fieldSetters.put(name, fn); + if (hasAlias) { + fieldSetters.put(alias, fn); + } + fn = new $.Func2() { + @Override + public Object apply(Object host, Object value) throws NotAppliedException, $.Break { + BeanInfo spec = setterFieldSpecs.get(fieldName); + if (null != value && !spec.isInstance(value)) { + if (value instanceof String) { + value = Act.app().resolverManager().resolve((String)value, spec.rawType()); + } + } + $.Function getter = fieldGetters.get(fieldName); + if (null == getter) { + $.invokeVirtual(host, m, value); + return null; + } + Object value0 = getter.apply(host); + value = merge(value0, value); + $.invokeVirtual(host, m, value); + return null; + } + }; + fieldMergers.put(name, fn); + if (hasAlias) { + fieldMergers.put(alias, fn); + } + } else { + $.F1 fn = new $.F1() { + @Override + public Object apply(Object host) throws NotAppliedException, $.Break { + return $.invokeVirtual(host, m); + } + }; + fieldGetters.put(name, fn); + if (hasAlias) { + fieldGetters.put(alias, fn); + } + } + } + } + + private String propertyName(Method m) { + String name = m.getName(); + if ("getClass".equals(name)) { + return null; + } + Type[] paramTypes = m.getGenericParameterTypes(); + if (name.startsWith("set") && void.class == m.getReturnType() && null != paramTypes && paramTypes.length == 1) { + return name.substring(3); + } + boolean isGet = name.startsWith("get"); + boolean isIs = name.startsWith("is"); + if ((isGet || isIs) && void.class != m.getReturnType() && (null == paramTypes || paramTypes.length == 0)) { + return isGet ? name.substring(3) : name.substring(2); + } + return null; + } + + public static Object merge(Object to, Object from) { + if (null == to) { + return from; + } + if (null == from) { + return to; + } + if (canBeMerged(to.getClass())) { + return _merge(to, from); + } + return from; + } + + private static Object _merge(Object to, Object from) { + if (to instanceof ValueObject) { + if (from instanceof ValueObject) { + return ValueObject.of(merge(((ValueObject) to).value(), ((ValueObject) from).value())); + } + return ValueObject.of(merge(((ValueObject) to).value(), from)); + } + if (to instanceof AdaptiveRecord) { + AdaptiveRecord ar = (AdaptiveRecord) to; + return mergeIntoAdaptiveRecord(ar, from); + } + if (to instanceof Map) { + Map map = (Map) to; + return mergeIntoMap(map, from); + } + if (to instanceof Set) { + Set set = (Set) to; + return mergeIntoSet(set, from); + } + if (to instanceof List) { + List list = (List) to; + return mergeIntoList(list, from); + } + if (to.getClass().isArray()) { + List list = new ArrayList(); + int len = Array.getLength(to); + for (int i = 0; i < len; ++i) { + list.add(Array.get(to, i)); + } + List list1 = mergeIntoList(list, from); + int sz1 = list1.size(); + Object a1 = Array.newInstance(to.getClass().getComponentType(), sz1); + for (int i = 0; i < sz1; ++i) { + Array.set(a1, i, list1.get(i)); + } + return a1; + } + return mergeIntoPojo(to, from); + } + + private static String getterName(Field field) { + boolean isBoolean = field.getType() == Boolean.class || field.getType() == boolean.class; + return (isBoolean ? "is" : "get") + S.capFirst(field.getName()); + } + + private static String setterName(Field field) { + return "set" + S.capFirst(field.getName()); + } + + private static boolean canBeMerged(Class c) { + return !($.isSimpleType(c) || isDateType(c)); + } + + private static boolean isDateType(Class c) { + String name = c.getSimpleName(); + return (name.endsWith("Date") || name.endsWith("DateTime") || name.endsWith("Calendar")); + } + + private static AdaptiveRecord mergeIntoAdaptiveRecord(AdaptiveRecord ar, Object value) { + if (value instanceof Map) { + return mergeMapIntoAdaptiveRecord(ar, (Map) value); + } + if (value instanceof AdaptiveRecord) { + return mergeMapIntoAdaptiveRecord(ar, ((AdaptiveRecord) value).asMap()); + } + List fields = $.fieldsOf(value.getClass(), true); + for (Field f : fields) { + f.setAccessible(true); + try { + String fn = f.getName(); + Object fv = f.get(value); + Object o0 = ar.getValue(fn); + ar.putValue(fn, merge(o0, fv)); + } catch (IllegalAccessException e) { + throw E.unexpected(e, "error merging into adaptive record"); + } + } + return ar; + } + + private static AdaptiveRecord mergeMapIntoAdaptiveRecord(AdaptiveRecord ar, Map map) { + return ar.putValues(map); + } + + private static Map mergeIntoMap(Map map, Object value) { + if (value instanceof Map) { + return mergeMapIntoMap(map, (Map) value); + } + if (value instanceof AdaptiveRecord) { + return mergeMapIntoMap(map, ((AdaptiveRecord) value).asMap()); + } + Map retval = new HashMap(map); + List fields = $.fieldsOf(value.getClass(), true); + for (Field f : fields) { + f.setAccessible(true); + try { + String fn = f.getName(); + Object fv = f.get(value); + Object o0 = map.get(fn); + retval.put(fn, merge(o0, fv)); + } catch (IllegalAccessException e) { + throw E.unexpected(e, "error merging into adaptive record"); + } + } + return retval; + } + + private static Map mergeMapIntoMap(Map m0, Map m1) { + Map retval = (Map) Act.injector().get(m0.getClass()); + retval.putAll(m0); + for (Map.Entry entry : m1.entrySet()) { + Object k = entry.getKey(); + Object v = entry.getValue(); + retval.put(k, merge(m0.get(k), v)); + } + return retval; + } + + private static Set mergeIntoSet(Set set, Object value) { + if (value instanceof Collection) { + return mergeCollectionIntoSet(set, (Collection) value); + } + if (value.getClass().isArray()) { + List list = new ArrayList(); + int len = Array.getLength(value); + for (int i = 0; i < len; ++i) { + list.add(Array.get(value, i)); + } + return mergeCollectionIntoSet(set, list); + } + throw new IllegalArgumentException("Cannot merge " + value.getClass() + " into Set"); + } + + private static Set mergeCollectionIntoSet(Set set, Collection col) { + Set set1 = (Set) Act.injector().get(set.getClass()); + set1.addAll(col); + return set1; + } + + private static List mergeIntoList(List list, Object value) { + if (value instanceof Set) { + return mergeSetIntoList(list, (Set) value); + } + if (value instanceof List) { + return mergeListIntoList(list, (List) value); + } + if (value.getClass().isArray()) { + List list0 = new ArrayList(); + int len = Array.getLength(value); + for (int i = 0; i < len; ++i) { + list0.add(Array.get(value, i)); + } + return mergeListIntoList(list, list0); + } + throw new IllegalArgumentException("Cannot merge " + value.getClass() + " into List"); + } + + private static List mergeSetIntoList(List list, Set set) { + List retval = (List) Act.injector().get(list.getClass()); + retval.addAll(list); + retval.addAll(set); + return retval; + } + + private static List mergeListIntoList(List to, List from) { + List retval = (List) Act.injector().get(to.getClass()); + int szTo = to.size(); + int szFrom = from.size(); + int szMin = Math.min(szTo, szFrom); + for (int i = 0; i < szMin; ++i) { + Object o0 = to.get(i); + Object o1 = from.get(i); + retval.add(merge(o0, o1)); + } + if (szTo > szFrom) { + for (int i = szMin; i < szTo; ++i) { + retval.add(to.get(i)); + } + } else if (szFrom > szTo) { + for (int i = szMin; i < szFrom; ++i) { + retval.add(from.get(i)); + } + } + return retval; + } + + private static Object mergeIntoPojo(Object o0, Object o1) { + if (o1 instanceof Map) { + return mergeMapIntoPojo(o0, (Map) o1); + } + if (o1 instanceof AdaptiveRecord) { + return mergeMapIntoPojo(o0, ((AdaptiveRecord) o1).asMap()); + } + if (o1 instanceof Collection || o1.getClass().isArray()) { + throw E.unexpected("cannot merge " + o1.getClass() + " into " + o0.getClass()); + } + Class c0 = o0.getClass(); + List fields = $.fieldsOf(o1.getClass(), true); + for (Field f : fields) { + f.setAccessible(true); + try { + String fn = f.getName(); + Field f0 = $.fieldOf(c0, fn); + if (null == f0) { + continue; + } + Object fv = f.get(o1); + f0.setAccessible(true); + Object fv0 = merge(f0.get(o0), fv); + f0.set(o0, fv0); + } catch (IllegalAccessException e) { + throw E.unexpected(e, "error merging into POJO"); + } + } + return o0; + } + + private static Object mergeMapIntoPojo(Object o0, Map map) { + List fields = $.fieldsOf(o0.getClass(), true); + for (Field f : fields) { + String fn = f.getName(); + if (map.containsKey(fn)) { + f.setAccessible(true); + try { + Object v = f.get(o0); + f.set(o0, merge(v, map.get(fn))); + } catch (IllegalAccessException e) { + throw E.unexpected(e, "error merging into POJO"); + } + } + } + return o0; + } + + public static class Repository extends AppServicePlugin { + @Override + protected void applyTo(App app) { + } + + private ConcurrentMap, MetaInfo> map = new ConcurrentHashMap<>(); + + public MetaInfo get(Class clazz, $.Function, MetaInfo> factory) { + MetaInfo info = map.get(clazz); + if (null == info) { + MetaInfo theInfo = factory.apply(clazz); + info = map.putIfAbsent(clazz, theInfo); + if (null == info) { + info = theInfo; + } + } + return info; + } + } + } + +} diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index ba6c245e0..64a8dabdd 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -18,6 +18,7 @@ act.inject.genie.GenieInjector act.Info act.meta.ClassMetaInfoManager act.util.AdaptiveRecordCodec +act.util.AdaptiveBeanCodec act.util.FastJson act.util.TypeConverterRegister act.validation.ValidationPlugin From 7c929fefc1dd524d082fbf34481cd0ed8e999de7 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 18 Jul 2018 08:49:05 +1000 Subject: [PATCH 026/730] Use FastJsonEnhancedAdaptiveMapCodec to replace AdaptiveRecordCodec and AdaptiveBeanCodec --- .../java/act/util/AdaptiveRecordCodec.java | 342 ------------------ ... => FastJsonEnhancedAdaptiveMapCodec.java} | 12 +- src/main/resources/act.scan.list | 3 +- 3 files changed, 7 insertions(+), 350 deletions(-) delete mode 100644 src/main/java/act/util/AdaptiveRecordCodec.java rename src/main/java/act/util/{AdaptiveBeanCodec.java => FastJsonEnhancedAdaptiveMapCodec.java} (95%) diff --git a/src/main/java/act/util/AdaptiveRecordCodec.java b/src/main/java/act/util/AdaptiveRecordCodec.java deleted file mode 100644 index bc47170fc..000000000 --- a/src/main/java/act/util/AdaptiveRecordCodec.java +++ /dev/null @@ -1,342 +0,0 @@ -package act.util; - -/*- - * #%L - * ACT Framework - * %% - * Copyright (C) 2014 - 2017 ActFramework - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import act.Act; -import act.app.event.SysEventId; -import act.db.AdaptiveRecord; -import com.alibaba.fastjson.JSONException; -import com.alibaba.fastjson.JSONObject; -import com.alibaba.fastjson.parser.*; -import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; -import com.alibaba.fastjson.serializer.*; -import org.osgl.$; -import org.osgl.util.BeanInfo; - -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public class AdaptiveRecordCodec extends SerializeFilterable implements ObjectDeserializer, ObjectSerializer{ - - @Override - public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { - final JSONLexer lexer = parser.lexer; - if (lexer.token() == JSONToken.NULL) { - lexer.nextToken(JSONToken.COMMA); - return null; - } - - AdaptiveRecord ar = Act.app().getInstance((Class) type); - - ParseContext context = parser.getContext(); - - try { - parser.setContext(context, ar, fieldName); - return (T) parseActiveRecord(parser, ar, fieldName); - } finally { - parser.setContext(context); - } - } - - @SuppressWarnings("rawtypes") - public static AdaptiveRecord parseActiveRecord(DefaultJSONParser parser, AdaptiveRecord ar, Object fieldName) { - JSONLexer lexer = parser.lexer; - - if (lexer.token() != JSONToken.LBRACE) { - throw new JSONException("syntax error, expect {, actual " + lexer.token()); - } - - ParseContext context = parser.getContext(); - try { - for (int i = 0;;++i) { - lexer.skipWhitespace(); - char ch = lexer.getCurrent(); - if (lexer.isEnabled(Feature.AllowArbitraryCommas)) { - while (ch == ',') { - lexer.next(); - lexer.skipWhitespace(); - ch = lexer.getCurrent(); - } - } - - String key; - if (ch == '"') { - key = lexer.scanSymbol(parser.getSymbolTable(), '"'); - lexer.skipWhitespace(); - ch = lexer.getCurrent(); - if (ch != ':') { - throw new JSONException("expect ':' at " + lexer.pos()); - } - } else if (ch == '}') { - lexer.next(); - lexer.resetStringPosition(); - lexer.nextToken(JSONToken.COMMA); - return ar; - } else if (ch == '\'') { - if (!lexer.isEnabled(Feature.AllowSingleQuotes)) { - throw new JSONException("syntax error"); - } - - key = lexer.scanSymbol(parser.getSymbolTable(), '\''); - lexer.skipWhitespace(); - ch = lexer.getCurrent(); - if (ch != ':') { - throw new JSONException("expect ':' at " + lexer.pos()); - } - } else { - if (!lexer.isEnabled(Feature.AllowUnQuotedFieldNames)) { - throw new JSONException("syntax error"); - } - - key = lexer.scanSymbolUnQuoted(parser.getSymbolTable()); - lexer.skipWhitespace(); - ch = lexer.getCurrent(); - if (ch != ':') { - throw new JSONException("expect ':' at " + lexer.pos() + ", actual " + ch); - } - } - - lexer.next(); - lexer.skipWhitespace(); - lexer.getCurrent(); - - lexer.resetStringPosition(); - - Object value; - lexer.nextToken(); - - if (i != 0) { - parser.setContext(context); - } - - if (lexer.token() == JSONToken.NULL) { - value = null; - lexer.nextToken(); - } else { - value = parser.parseObject(ar.metaInfo().setterFieldType(key), key); - } - - ar.putValue(key, value); - parser.checkMapResolve(ar.asMap(), key); - - parser.setContext(context, value, key); - parser.setContext(context); - - final int tok = lexer.token(); - if (tok == JSONToken.EOF || tok == JSONToken.RBRACKET) { - return ar; - } - - if (tok == JSONToken.RBRACE) { - lexer.nextToken(); - return ar; - } - } - } finally { - parser.setContext(context); - } - - } - - private static $.Predicate fieldFilter = new $.Predicate() { - @Override - public boolean test(BeanInfo beanSpec) { - return !beanSpec.isTransient(); - } - }; - - @Override - public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { - SerializeWriter out = serializer.out; - - if (object == null) { - out.writeNull(); - return; - } - - AdaptiveRecord ar = (AdaptiveRecord) object; - - if (serializer.containsReference(object)) { - serializer.writeReference(object); - return; - } - - SerialContext parent = serializer.getContext(); - serializer.setContext(parent, object, fieldName, 0); - try { - out.write('{'); - - serializer.incrementIndent(); - - Class preClazz = null; - ObjectSerializer preWriter = null; - - boolean first = true; - - if (out.isEnabled(SerializerFeature.WriteClassName)) { - String typeKey = serializer.getMapping().getTypeKey(); - Class mapClass = ar.getClass(); - boolean containsKey = (mapClass == JSONObject.class || mapClass == HashMap.class || mapClass == LinkedHashMap.class) - && ar.containsKey(typeKey); - if (!containsKey) { - out.writeFieldName(typeKey); - out.writeString(object.getClass().getName()); - first = false; - } - } - - for (Map.Entry entry : ar.entrySet(fieldFilter)) { - Object value = entry.getValue(); - - String entryKey = entry.getKey(); - - { - List preFilters = serializer.getPropertyPreFilters(); - if (preFilters != null && preFilters.size() > 0) { - if (!this.applyName(serializer, object, entryKey)) { - continue; - } - } - } - { - List preFilters = this.propertyPreFilters; - if (preFilters != null && preFilters.size() > 0) { - if (!this.applyName(serializer, object, entryKey)) { - continue; - } - } - } - - { - List propertyFilters = serializer.getPropertyFilters(); - if (propertyFilters != null && propertyFilters.size() > 0) { - if (!this.apply(serializer, object, entryKey, value)) { - continue; - } - } - } - { - List propertyFilters = this.propertyFilters; - if (propertyFilters != null && propertyFilters.size() > 0) { - if (!this.apply(serializer, object, entryKey, value)) { - continue; - } - } - } - - { - List nameFilters = serializer.getNameFilters(); - if (nameFilters != null && nameFilters.size() > 0) { - entryKey = this.processKey(serializer, object, entryKey, value); - } - } - { - List nameFilters = this.nameFilters; - if (nameFilters != null && nameFilters.size() > 0) { - entryKey = this.processKey(serializer, object, entryKey, value); - } - } - - { - List valueFilters = serializer.getValueFilters(); - List contextValueFilters = this.contextValueFilters; - if ((valueFilters != null && valueFilters.size() > 0) // - || (contextValueFilters != null && contextValueFilters.size() > 0)) { - value = this.processValue(serializer, null, object, entryKey, value); - } - } - { - List valueFilters = this.valueFilters; - List contextValueFilters = this.contextValueFilters; - if ((valueFilters != null && valueFilters.size() > 0) // - || (contextValueFilters != null && contextValueFilters.size() > 0)) { - value = this.processValue(serializer, null, object, entryKey, value); - } - } - - if (value == null) { - if (!out.isEnabled(SerializerFeature.WRITE_MAP_NULL_FEATURES)) { - continue; - } - } - - String key = entryKey; - - if (!first) { - out.write(','); - } - - if (out.isEnabled(SerializerFeature.PrettyFormat)) { - serializer.println(); - } - out.writeFieldName(key, true); - - first = false; - - if (value == null) { - out.writeNull(); - continue; - } - - Class clazz = value.getClass(); - - if (clazz == preClazz) { - preWriter.write(serializer, value, entryKey, null, 0); - } else { - preClazz = clazz; - preWriter = serializer.getObjectWriter(clazz); - - preWriter.write(serializer, value, entryKey, null, 0); - } - } - } finally { - serializer.setContext(parent); - } - - serializer.decrementIdent(); - if (out.isEnabled(SerializerFeature.PrettyFormat) && ar.size() > 0) { - serializer.println(); - } - out.write('}'); - } - - public int getFastMatchToken() { - return JSONToken.LBRACE; - } - - @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_PROVISIONED) - public static void foundActiveRecordClass(Class clazz) { - - AdaptiveRecordCodec codec = new AdaptiveRecordCodec(); - - SerializeConfig config = SerializeConfig.getGlobalInstance(); - config.put(clazz, codec); - - ParserConfig parserConfig = ParserConfig.getGlobalInstance(); - parserConfig.putDeserializer(clazz, codec); - } - - -} diff --git a/src/main/java/act/util/AdaptiveBeanCodec.java b/src/main/java/act/util/FastJsonEnhancedAdaptiveMapCodec.java similarity index 95% rename from src/main/java/act/util/AdaptiveBeanCodec.java rename to src/main/java/act/util/FastJsonEnhancedAdaptiveMapCodec.java index ee0e2aae9..cb8f3f0d2 100644 --- a/src/main/java/act/util/AdaptiveBeanCodec.java +++ b/src/main/java/act/util/FastJsonEnhancedAdaptiveMapCodec.java @@ -37,7 +37,7 @@ import java.util.List; import java.util.Map; -public class AdaptiveBeanCodec extends SerializeFilterable implements ObjectDeserializer, ObjectSerializer{ +public class FastJsonEnhancedAdaptiveMapCodec extends SerializeFilterable implements ObjectDeserializer, ObjectSerializer{ @Override public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { @@ -47,7 +47,7 @@ public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { return null; } - AdaptiveBean ar = Act.app().getInstance((Class) type); + EnhancedAdaptiveMap ar = Act.app().getInstance((Class) type); ParseContext context = parser.getContext(); @@ -60,7 +60,7 @@ public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { } @SuppressWarnings("rawtypes") - public static AdaptiveBean parseActiveBean(DefaultJSONParser parser, AdaptiveBean ar, Object fieldName) { + public static EnhancedAdaptiveMap parseActiveBean(DefaultJSONParser parser, EnhancedAdaptiveMap ar, Object fieldName) { JSONLexer lexer = parser.lexer; if (lexer.token() != JSONToken.LBRACE) { @@ -175,7 +175,7 @@ public void write(JSONSerializer serializer, Object object, Object fieldName, Ty return; } - AdaptiveBean ar = (AdaptiveBean) object; + EnhancedAdaptiveMap ar = (EnhancedAdaptiveMap) object; if (serializer.containsReference(object)) { serializer.writeReference(object); @@ -326,9 +326,9 @@ public int getFastMatchToken() { } @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_PROVISIONED) - public static void foundAdaptiveBeanClass(Class clazz) { + public static void foundEnhancedAdaptiveMapClass(Class clazz) { - AdaptiveBeanCodec codec = new AdaptiveBeanCodec(); + FastJsonEnhancedAdaptiveMapCodec codec = new FastJsonEnhancedAdaptiveMapCodec(); SerializeConfig config = SerializeConfig.getGlobalInstance(); config.put(clazz, codec); diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 64a8dabdd..03f1c9576 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -17,8 +17,7 @@ act.inject.DependencyInjectorBase act.inject.genie.GenieInjector act.Info act.meta.ClassMetaInfoManager -act.util.AdaptiveRecordCodec -act.util.AdaptiveBeanCodec +act.util.FastJsonEnhancedAdaptiveMapCodec act.util.FastJson act.util.TypeConverterRegister act.validation.ValidationPlugin From b7ced438af96c2be97ee1ff79bf1d6307d8f393a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 19 Jul 2018 17:28:16 +1000 Subject: [PATCH 027/730] `@Configuration` field shall be stateless for a Controller #734 --- CHANGELOG.md | 1 + src/main/java/act/util/ReflectedInvokerHelper.java | 3 ++- src/main/java/act/util/Stateful.java | 2 +- src/main/java/act/util/Stateless.java | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34e6c9ad4..99202903c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `@Configuration` field shall be stateless for a Controller #734 * AdaptiveRecord enhancement #733 * Password enhancement - ignore the case when password is empty #730 * Register TypeConverter automatically #728 diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 9a995ad09..a598a5a83 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -24,6 +24,7 @@ import act.app.App; import act.app.AppServiceBase; import org.osgl.$; +import org.osgl.inject.annotation.Configuration; import java.lang.reflect.Field; import java.util.List; @@ -61,7 +62,7 @@ public static Object tryGetSingleton(Class invokerClass, App app) { private static boolean isGlobalOrStateless(Field field) { - if (null != field.getAnnotation(Stateless.class) || null != field.getAnnotation(Global.class)) { + if (null != field.getAnnotation(Stateless.class) || null != field.getAnnotation(Global.class) || null != field.getAnnotation(Configuration.class)) { return true; } Class fieldType = field.getType(); diff --git a/src/main/java/act/util/Stateful.java b/src/main/java/act/util/Stateful.java index 902cbd995..8ec038489 100644 --- a/src/main/java/act/util/Stateful.java +++ b/src/main/java/act/util/Stateful.java @@ -36,6 +36,6 @@ * See https://github.com/actframework/actframework/issues/223 */ @Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE, ElementType.FIELD}) +@Target({ElementType.TYPE, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) public @interface Stateful { } diff --git a/src/main/java/act/util/Stateless.java b/src/main/java/act/util/Stateless.java index 84995b483..d1b1c7b11 100644 --- a/src/main/java/act/util/Stateless.java +++ b/src/main/java/act/util/Stateless.java @@ -36,6 +36,6 @@ * See https://github.com/actframework/actframework/issues/161 */ @Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE, ElementType.FIELD}) +@Target({ElementType.TYPE, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) public @interface Stateless { } From 074304c3592d4efdfcd6a44f01a8c98544eac2c6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 21 Jul 2018 21:42:02 +1000 Subject: [PATCH 028/730] improvement for singleton checking --- CHANGELOG.md | 2 ++ src/main/java/act/apidoc/SampleDataCategory.java | 4 ++-- src/main/java/act/app/App.java | 8 ++++++++ src/main/java/act/conf/AppConfig.java | 6 ++++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99202903c..7e0d7a91f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* improvement for checking singleton object +* `SampleDataCategory` - make aliases() method be public * `@Configuration` field shall be stateless for a Controller #734 * AdaptiveRecord enhancement #733 * Password enhancement - ignore the case when password is empty #730 diff --git a/src/main/java/act/apidoc/SampleDataCategory.java b/src/main/java/act/apidoc/SampleDataCategory.java index 2c201f68d..0e95b893c 100644 --- a/src/main/java/act/apidoc/SampleDataCategory.java +++ b/src/main/java/act/apidoc/SampleDataCategory.java @@ -58,7 +58,7 @@ public enum SampleDataCategory { this.aliases = C.setOf(aliases); } - private Set aliases() { + public Set aliases() { return aliases; } @@ -68,7 +68,7 @@ private Set aliases() { static { for (SampleDataCategory c : SampleDataCategory.values()) { lookup.put(Keyword.of(c.name()), c); - for (String s : c.aliases()) { + for (String s : c.aliases) { if (s.startsWith("*")) { suffixLookup.put(s.substring(1).toLowerCase(), c); } else if (s.endsWith("*")) { diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 34ab32ac7..3adb90254 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -780,6 +780,14 @@ public boolean isSingleton(Class cls) { return null != singletonRegistry.get(cls) || hasSingletonAnnotation(cls); } + public boolean isSingleton(Object o) { + if (null == o) { + return true; + } + Class type = o instanceof Class ? (Class) o : o.getClass(); + return isSingleton(type); + } + private void registerMetricProvider() { GenieInjector gi = this.injector(); MetricProvider mp = new MetricProvider(); diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 4de21c7e7..16be35e3a 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -170,6 +170,12 @@ public Object apply(Class aClass) throws NotAppliedException, $.Break { return app.getInstance(aClass); } }); + OsglConfig.setSingletonChecker(new $.Predicate() { + @Override + public boolean test(Object o) { + return app.isSingleton(o); + } + }); app().cache().setDefaultTTL(cacheTtl()); Map cacheSettings = subSet("cache"); From cb3a132bca1eb8e7b9fc4f97245049eed60daaf1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 22 Jul 2018 08:39:24 +1000 Subject: [PATCH 029/730] fix #738 and #739 --- CHANGELOG.md | 2 + src/main/java/act/controller/Controller.java | 2 +- .../impl/ReflectedHandlerInvoker.java | 30 +++++ .../java/act/xio/undertow/NonBlockOutput.java | 105 ++++++++++++++++++ .../act/xio/undertow/UndertowResponse.java | 9 +- 5 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 src/main/java/act/xio/undertow/NonBlockOutput.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e0d7a91f..485942eb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Improve JSON output of String type result #739 +* Support returning JSON response in nonblock mode #738 * improvement for checking singleton object * `SampleDataCategory` - make aliases() method be public * `@Configuration` field shall be stateless for a Controller #734 diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 60e168710..68e1c259d 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1546,7 +1546,7 @@ public static Result inferPrimitiveResult(Object v, ActionContext actionContext, if (isArray) { return RenderJSON.of(status, $.toString2(v)); } - return RenderJSON.of(status, C.Map("result", v)); + return RenderJSON.of(status, v instanceof String ? v : C.Map("result", v)); } else if (requireXML) { return RenderXML.of(status, S.concat("", S.string(v), "")); } else if (v instanceof byte[]) { diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 304eed9f1..99fa3f751 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -157,6 +157,11 @@ public void visit(H.Format format) throws $.Break { private $.Func2 pluginAfterHandler; private Map attributes = new HashMap<>(); private boolean enableCircularReferenceDetect; + // it shall do full JSON string check when Accept is JSON and return type is String + // however if the first full check is good, then the following check shall rely on quick check + private boolean returnString; + private boolean fullJsonStringChecked; + private boolean fullJsonStringCheckFailure; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -175,6 +180,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { } catch (NoSuchMethodException e) { throw E.unexpected(e); } + this.returnString = method.getReturnType() == String.class; this.pluginBeforeHandler = ControllerPlugin.Manager.INST.beforeHandler(controllerClass, method); this.pluginAfterHandler = ControllerPlugin.Manager.INST.afterHandler(controllerClass, method); this.disabled = this.disabled || !Env.matches(method); @@ -837,6 +843,9 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle Trace.LOGGER_HANDLER.trace(invocationInfo); } result = null == methodAccess ? $.invokeStatic(method, params) : methodAccess.invoke(controller, handlerIndex, params); + if (returnString && context.acceptJson()) { + result = ensureValidJson(S.string(result)); + } } catch (Result r) { result = r; } catch (Exception e) { @@ -862,6 +871,27 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle return Controller.Util.inferResult(handlerMetaInfo, result, context, hasTemplate); } + private String ensureValidJson(String result) { + if (S.blank(result)) { + return "{}"; + } + boolean looksOkay = (result.startsWith("{") && result.endsWith("}")) || (result.startsWith("[") && result.endsWith("]")); + if (!looksOkay) { + fullJsonStringCheckFailure = true; + return "{\"result\":\"" + result + "\"}"; + } + if (fullJsonStringCheckFailure || !fullJsonStringChecked) { + fullJsonStringChecked = true; + try { + JSON.parse(result); + } catch (Exception e) { + fullJsonStringCheckFailure = true; + return "{\"result\":\"" + result + "\"}"; + } + } + return result; + } + public boolean checkTemplate(ActionContext context) { if (!context.state().isHandling()) { //we don't check template on interceptors diff --git a/src/main/java/act/xio/undertow/NonBlockOutput.java b/src/main/java/act/xio/undertow/NonBlockOutput.java new file mode 100644 index 000000000..138af4ed0 --- /dev/null +++ b/src/main/java/act/xio/undertow/NonBlockOutput.java @@ -0,0 +1,105 @@ +package act.xio.undertow; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import io.undertow.io.IoCallback; +import io.undertow.io.Sender; +import org.osgl.$; +import org.osgl.util.Output; + +import java.io.OutputStream; +import java.io.Writer; +import java.nio.ByteBuffer; + +class NonBlockOutput implements Output { + + private Sender sender; + + NonBlockOutput(Sender sender) { + this.sender = $.requireNotNull(sender); + } + + @Override + public void open() { + } + + @Override + public void close() { + sender.close(IoCallback.END_EXCHANGE); + } + + @Override + public void flush() { + } + + @Override + public Output append(CharSequence csq) { + sender.send(csq.toString()); + return this; + } + + @Override + public Output append(CharSequence csq, int start, int end) { + sender.send(csq.subSequence(start, end).toString()); + return this; + } + + @Override + public Output append(char c) { + return append(String.valueOf(c)); + } + + @Override + public Output append(byte[] bytes) { + ByteBuffer buffer = ByteBuffer.wrap(bytes); + return append(buffer); + } + + @Override + public Output append(byte[] bytes, int start, int end) { + ByteBuffer buffer = ByteBuffer.wrap(bytes, start, end); + return append(buffer); + } + + @Override + public Output append(byte b) { + ByteBuffer buffer = ByteBuffer.allocate(1); + buffer.put(b); + buffer.flip(); + return append(buffer); + } + + @Override + public Output append(ByteBuffer buffer) { + sender.send(buffer); + return this; + } + + @Override + public OutputStream asOutputStream() { + return Adaptors.asOutputStream(this); + } + + @Override + public Writer asWriter() { + return Adaptors.asWriter(this); + } +} diff --git a/src/main/java/act/xio/undertow/UndertowResponse.java b/src/main/java/act/xio/undertow/UndertowResponse.java index 7289384b3..08b01249f 100644 --- a/src/main/java/act/xio/undertow/UndertowResponse.java +++ b/src/main/java/act/xio/undertow/UndertowResponse.java @@ -50,7 +50,6 @@ import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.Locale; -import java.util.concurrent.atomic.AtomicBoolean; public class UndertowResponse extends ActResponse { @@ -63,8 +62,6 @@ public class UndertowResponse extends ActResponse { private boolean endAsync; private Sender sender; - private AtomicBoolean sending = new AtomicBoolean(false); - private AtomicBoolean closeExchange = new AtomicBoolean(false); public UndertowResponse(HttpServerExchange exchange, AppConfig config) { super(config); @@ -74,7 +71,7 @@ public UndertowResponse(HttpServerExchange exchange, AppConfig config) { @Override protected Output createOutput() { - return new OutputStreamOutput(createOutputStream()); + return isIoThread() ? new NonBlockOutput(sender()) : new OutputStreamOutput(createOutputStream()); } @Override @@ -276,4 +273,8 @@ private boolean blocking() { return hse.isBlocking(); } + private boolean isIoThread() { + return hse.isInIoThread(); + } + } From fdfa2f9b1b1e47aaf943530692332683a63f1348 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 22 Jul 2018 21:28:47 +1000 Subject: [PATCH 030/730] fix #735, #741, #742 and #743 --- CHANGELOG.md | 4 ++ .../apidoc/sampledata/NamedListProvider.java | 2 +- src/main/java/act/app/App.java | 61 +++++++++++++++++-- src/main/java/act/app/AppClassLoader.java | 10 ++- src/main/java/act/app/AppCompiler.java | 11 +++- .../java/act/app/CompilationException.java | 9 ++- src/main/java/act/app/SourceInfo.java | 8 +++ src/main/java/act/app/SourceInfoImpl.java | 12 ++++ .../java/act/boot/BootstrapClassLoader.java | 17 ++++-- src/main/java/act/conf/AppConfig.java | 37 ++++++++++- .../java/act/job/JobAnnotationProcessor.java | 3 + src/main/java/act/util/ActError.java | 3 + src/main/java/act/view/rythm/RythmView.java | 20 ++++++ src/main/java/act/xio/NetworkHandler.java | 3 +- src/main/resources/act.jar.black.list | 28 +++++++++ .../resources/rythm/error/dev/errorPage.html | 19 +++++- 16 files changed, 227 insertions(+), 20 deletions(-) create mode 100644 src/main/resources/act.jar.black.list diff --git a/CHANGELOG.md b/CHANGELOG.md index 485942eb3..0750993c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # ActFramework Change Log **1.8.8** +* Improve SYSTEM_SCAN_LIST matching performance #743 +* Add `App.wasStarted()` method #742 +* `JobAnnotationProcessor` issue: non static method in abstract class shall not be treated as static #741 +* Compiler error shall print out source code and the line that break compiling in dev mode #735 * Improve JSON output of String type result #739 * Support returning JSON response in nonblock mode #738 * improvement for checking singleton object diff --git a/src/main/java/act/apidoc/sampledata/NamedListProvider.java b/src/main/java/act/apidoc/sampledata/NamedListProvider.java index f701a4065..b22623e72 100644 --- a/src/main/java/act/apidoc/sampledata/NamedListProvider.java +++ b/src/main/java/act/apidoc/sampledata/NamedListProvider.java @@ -22,7 +22,7 @@ import org.osgl.util.S; -public class NamedListProvider extends StringListProvider { +public abstract class NamedListProvider extends StringListProvider { private String listName; diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 3adb90254..93c9802bd 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -111,6 +111,7 @@ import java.net.URL; import java.util.*; import java.util.concurrent.ConcurrentMap; +import java.util.regex.Pattern; import javax.enterprise.context.ApplicationScoped; import javax.inject.Singleton; @@ -176,9 +177,14 @@ public enum F { private CompilationException compilationException; private AsmException asmException; private SysEventId currentState; + private boolean hasStarted; private Set eventEmitted; private Thread mainThread; + private Set jarFileBlackList; private Set scanList; + private Set scanPatterns; + private Set scanPrefixList; + private Set scanSuffixList; private List baseDirs; private volatile File tmpDir; private boolean restarting; @@ -534,6 +540,14 @@ public boolean isStarted() { return currentState == POST_START || currentState == ACT_START; } + /** + * Check if the app has been started before. This could be useful to + * fix some state issue that caused by hotreload in dev mode + */ + public boolean wasStarted() { + return hasStarted; + } + public boolean isMainThread() { return Thread.currentThread() == mainThread; } @@ -603,7 +617,8 @@ public synchronized void refresh() { blockIssueCause = null; Act.viewManager().clearAppDefinedVars(); - initScanlist(); + initScanList(); + initJarFileBlackList(); initServiceResourceManager(); reload(); @@ -738,6 +753,7 @@ public void run() { daemonKeeper(); logger.info("App[%s] loaded in %sms", name(), $.ms() - ms); emit(POST_START); + hasStarted = true; } }; if (!dbServiceManager().hasDbService() || eventEmitted(DB_SVC_LOADED)) { @@ -1125,8 +1141,24 @@ public void emit(SysEventId sysEvent) { } } + public Set jarFileBlackList() { + return jarFileBlackList; + } + public Set scanList() { - return new HashSet<>(scanList); + return scanList; + } + + public Set scanPrefixList() { + return scanPrefixList; + } + + public Set scanSuffixList() { + return scanSuffixList; + } + + public Set scanPattern() { + return scanPatterns; } private Set eventEmitted() { @@ -1389,10 +1421,31 @@ private void initSampleDataProviderManager() { sampleDataProviderManager = new SampleDataProviderManager(this); } - private void initScanlist() { + private void initScanList() { + ClassLoader classLoader = getClass().getClassLoader(); + if (classLoader instanceof BootstrapClassLoader) { + scanList = new HashSet<>(); + scanPatterns = new HashSet<>(); + scanPrefixList = new HashSet<>(); + scanSuffixList = new HashSet<>(); + for (String scanPackage: ((BootstrapClassLoader) classLoader).scanList()) { + if (scanPackage.contains("\\.") || scanPackage.contains("*")) { + scanPatterns.add(Pattern.compile(scanPackage)); + String prefix = S.cut(scanPackage).beforeFirst("\\"); + scanPrefixList.add(prefix); + String suffix = S.cut(scanPackage).afterLast("*"); + scanSuffixList.add(suffix); + } else { + scanList.add(scanPackage); + } + } + } + } + + private void initJarFileBlackList() { ClassLoader classLoader = getClass().getClassLoader(); if (classLoader instanceof BootstrapClassLoader) { - scanList = ((BootstrapClassLoader) classLoader).scanList(); + jarFileBlackList = ((BootstrapClassLoader) classLoader).jarBlackList(); } } diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index 4bbf5b62e..d023cd0a7 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -375,8 +375,16 @@ private void preloadLib() { Jars.F.JarEntryVisitor classNameIndexBuilder = Jars.F.classNameIndexBuilder(bytecodeIdx, ignoredClassNames); Jars.F.JarEntryVisitor confIndexBuilder = Jars.F.appConfigFileIndexBuilder(jarConf); List jars = FullStackAppBootstrapClassLoader.jars(AppClassLoader.class.getClassLoader()); + Set blackList = app().jarFileBlackList(); for (File jar : jars) { - Jars.scan(jar, classNameIndexBuilder, confIndexBuilder); + String filename = jar.getName(); + String name = S.cut(filename).beforeFirst("-"); + if ("".equals(name)) { + name = S.cut(filename).beforeLast("."); + } + if (!blackList.contains(name)) { + Jars.scan(jar, classNameIndexBuilder, confIndexBuilder); + } } libClsCache.putAll(bytecodeIdx); AppConfig config = app().config(); diff --git a/src/main/java/act/app/AppCompiler.java b/src/main/java/act/app/AppCompiler.java index e542cc7e2..39255ea44 100644 --- a/src/main/java/act/app/AppCompiler.java +++ b/src/main/java/act/app/AppCompiler.java @@ -20,6 +20,8 @@ * #L% */ +import static org.eclipse.jdt.internal.compiler.impl.CompilerOptions.*; + import act.Act; import act.conf.AppConfig; import act.metric.Metric; @@ -35,6 +37,7 @@ import org.eclipse.jdt.internal.compiler.env.INameEnvironment; import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; +import org.eclipse.jdt.internal.compiler.problem.DefaultProblem; import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; import org.osgl.$; import org.osgl.util.E; @@ -45,8 +48,6 @@ import java.util.Locale; import java.util.Map; -import static org.eclipse.jdt.internal.compiler.impl.CompilerOptions.*; - /** * Compile App srccode code in memory. Only used when Act is running * in DEV mode @@ -250,7 +251,11 @@ public void acceptResult(CompilationResult result) { } Source src = classLoader.source(className); if (null != src) { - throw new CompilationException(src.file(), message, problem.getSourceLineNumber(), problem.getSourceStart(), problem.getSourceEnd()); + int column = 0; + if (problem instanceof DefaultProblem) { + column = ((DefaultProblem) problem).getSourceColumnNumber(); + } + throw new CompilationException(src.file(), message, problem.getSourceLineNumber(), column, problem.getSourceStart(), problem.getSourceEnd()); } else { throw new CompilationException(problem.getMessage()); } diff --git a/src/main/java/act/app/CompilationException.java b/src/main/java/act/app/CompilationException.java index d00cc53fc..00e094731 100644 --- a/src/main/java/act/app/CompilationException.java +++ b/src/main/java/act/app/CompilationException.java @@ -32,6 +32,7 @@ public class CompilationException extends ActAppException implements SourceInfo private String problem; private File source; private Integer line; + private Integer column; private Integer start; private Integer end; @@ -40,10 +41,11 @@ public CompilationException(String problem) { this.problem = problem; } - public CompilationException(File source, String problem, int line, int start, int end) { + public CompilationException(File source, String problem, int line, int column, int start, int end) { super(problem); this.problem = problem; this.line = line; + this.column = column; this.source = source; this.start = start; this.end = end; @@ -82,6 +84,11 @@ public Integer lineNumber() { return line; } + @Override + public Integer column() { + return column; + } + @Override public boolean isSourceAvailable() { return source != null && line != null; diff --git a/src/main/java/act/app/SourceInfo.java b/src/main/java/act/app/SourceInfo.java index bb337a838..76f26fae0 100644 --- a/src/main/java/act/app/SourceInfo.java +++ b/src/main/java/act/app/SourceInfo.java @@ -32,12 +32,15 @@ public interface SourceInfo { Integer lineNumber(); + Integer column(); + boolean isSourceAvailable(); abstract class Base implements SourceInfo { protected String fileName; protected List lines; protected int lineNumber; + protected int column = -1; @Override public String fileName() { @@ -54,6 +57,11 @@ public Integer lineNumber() { return lineNumber; } + @Override + public Integer column() { + return column; + } + @Override public boolean isSourceAvailable() { return true; diff --git a/src/main/java/act/app/SourceInfoImpl.java b/src/main/java/act/app/SourceInfoImpl.java index ecc6f538c..5406d1c82 100644 --- a/src/main/java/act/app/SourceInfoImpl.java +++ b/src/main/java/act/app/SourceInfoImpl.java @@ -28,10 +28,17 @@ public class SourceInfoImpl implements SourceInfo { private Source source; private int line; + private int column; + public SourceInfoImpl(Source source, int line) { + this(source, line, -1); + } + + public SourceInfoImpl(Source source, int line, int column) { E.NPE(source); this.source = source; this.line = line; + this.column = column; } @Override @@ -49,6 +56,11 @@ public Integer lineNumber() { return line; } + @Override + public Integer column() { + return column; + } + @Override public boolean isSourceAvailable() { return true; diff --git a/src/main/java/act/boot/BootstrapClassLoader.java b/src/main/java/act/boot/BootstrapClassLoader.java index 1ad2f7da5..bfc7df57a 100644 --- a/src/main/java/act/boot/BootstrapClassLoader.java +++ b/src/main/java/act/boot/BootstrapClassLoader.java @@ -51,6 +51,7 @@ public abstract class BootstrapClassLoader extends ClassLoader implements PluginClassProvider, ActClassLoader { public static final String FILE_SCAN_LIST = "act.scan.list"; + public static final String JAR_FILE_BLACK_LIST = "act.jar.black.list"; protected static final Logger logger = L.get(BootstrapClassLoader.class); @@ -158,13 +159,21 @@ public Object run() { ); public Set scanList() { - Set scanList = new HashSet(); + return loadListFrom(FILE_SCAN_LIST); + } + + public Set jarBlackList() { + return loadListFrom(JAR_FILE_BLACK_LIST); + } + + private Set loadListFrom(String fileName) { + Set list = new HashSet(); try { - final Enumeration systemResources = this.getResources(FILE_SCAN_LIST); + final Enumeration systemResources = this.getResources(fileName); while (systemResources.hasMoreElements()) { InputStream is = systemResources.nextElement().openStream(); String s = IO.readContentAsString(is); - scanList.addAll( + list.addAll( C.listOf(s.split("[\r\n]+")) .filter(S.F.startsWith("#").negate()) .filter(S.F.IS_BLANK.negate())); @@ -172,7 +181,7 @@ public Set scanList() { } catch (IOException e) { throw E.ioException(e); } - return scanList; + return list; } } diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 16be35e3a..9ea1155b8 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -75,6 +75,7 @@ import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.regex.Pattern; import javax.inject.Provider; public class AppConfig extends Config implements AppHolder> { @@ -2258,8 +2259,40 @@ public boolean test(String s) { if (scanList.contains(s)) { return true; } - for (String scan : scanList) { - if (s.startsWith(scan + "$") || s.matches(scan)) { + if (s.startsWith("java.") || s.startsWith("javax.")) { + return false; + } + if (s.contains("$")) { + for (String pkg: scanList) { + if (s.startsWith(pkg + "$")) { + return true; + } + } + } + boolean shouldCheckPattern = false; + Set prefixList = app().scanPrefixList(); + for (String prefix : prefixList) { + if (s.startsWith(prefix)) { + shouldCheckPattern = true; + break; + } + } + if (!shouldCheckPattern) { + return false; + } + shouldCheckPattern = false; + Set suffixList = app().scanSuffixList(); + for (String suffix : suffixList) { + if (s.endsWith(suffix)) { + shouldCheckPattern = true; + break; + } + } + if (!shouldCheckPattern) { + return false; + } + for (Pattern pattern : app().scanPattern()) { + if (pattern.matcher(s).matches()) { return true; } } diff --git a/src/main/java/act/job/JobAnnotationProcessor.java b/src/main/java/act/job/JobAnnotationProcessor.java index f52b11195..83e75b0a4 100644 --- a/src/main/java/act/job/JobAnnotationProcessor.java +++ b/src/main/java/act/job/JobAnnotationProcessor.java @@ -149,6 +149,9 @@ private void registerOnSysEvent(Job job, SysEventId sysEventId, boolean async) { } private boolean isAbstract(JobMethodMetaInfo method) { + if (method.isStatic()) { + return false; + } JobClassMetaInfo classMetaInfo = method.classInfo(); return (classMetaInfo.isAbstract()); } diff --git a/src/main/java/act/util/ActError.java b/src/main/java/act/util/ActError.java index ef141d371..43fa532a1 100644 --- a/src/main/java/act/util/ActError.java +++ b/src/main/java/act/util/ActError.java @@ -78,6 +78,9 @@ public static String errorMessage(H.Status status, String message, Object ... ar } public static SourceInfo loadSourceInfo(Throwable cause, Class errorClass) { + if (cause instanceof SourceInfo) { + return (SourceInfo) cause; + } return _loadSourceInfo(cause.getStackTrace(), errorClass); } diff --git a/src/main/java/act/view/rythm/RythmView.java b/src/main/java/act/view/rythm/RythmView.java index 4cf632751..a4a087094 100644 --- a/src/main/java/act/view/rythm/RythmView.java +++ b/src/main/java/act/view/rythm/RythmView.java @@ -34,8 +34,10 @@ import org.rythmengine.RythmEngine; import org.rythmengine.extension.IFormatter; import org.rythmengine.extension.ISourceCodeEnhancer; +import org.rythmengine.extension.Transformer; import org.rythmengine.resource.ClasspathResourceLoader; import org.rythmengine.template.ITemplate; +import org.rythmengine.utils.RawData; import java.io.File; import java.util.HashMap; @@ -176,6 +178,7 @@ public void setRenderArgs(ITemplate iTemplate) { engine.resourceManager().prependResourceLoader(new ClasspathResourceLoader(engine, home)); } } + engine.registerTransformer("rythm", "", RythmView.class); Tags tags = app.getInstance(Tags.class); tags.register(engine); @@ -209,4 +212,21 @@ private File createTempHome(App app) { } return f; } + + @Transformer + public static RawData errorLine(String data, int errorColumn) { + String line = S.string(data); + if (errorColumn > -1 && errorColumn < line.length()) { + String a = line.substring(0, errorColumn); + char c = line.charAt(errorColumn); + String b = line.substring(errorColumn + 1); + line = S.concat(a, "", c, "", b); + line = S.replace(" ").with(" ").in(line); + line = S.replace("span_class").with("span class").in(line); + } else { + line = S.replace(" ").with(" ").in(line); + } + return new RawData(line); + } + } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 6c1ea72f5..10bba1556 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -102,7 +102,8 @@ public void handle(final ActionContext ctx, final NetworkDispatcher dispatcher) return; } Exception refreshError = null; - if (Act.isDev()) { + final boolean isDev = Act.isDev(); + if (isDev) { try { boolean updated = app.checkUpdates(false); if (updated && !app.hasBlockIssue()) { diff --git a/src/main/resources/act.jar.black.list b/src/main/resources/act.jar.black.list new file mode 100644 index 000000000..3f1cc09b1 --- /dev/null +++ b/src/main/resources/act.jar.black.list @@ -0,0 +1,28 @@ +activation +asm +byte +debugger +fastjson +guava +hamcrest +idea_rt +image4j +jansi +java +javaparser +javase +javax.el +jboss +jcommander +jfiglet +joda +jsoup +junit +mail +mockito +objenesis +org.apache.bval.bundle +osgl +patchca +reflectasm +slf4j \ No newline at end of file diff --git a/src/main/resources/rythm/error/dev/errorPage.html b/src/main/resources/rythm/error/dev/errorPage.html index c9cee0d88..cd2e2e7ba 100644 --- a/src/main/resources/rythm/error/dev/errorPage.html +++ b/src/main/resources/rythm/error/dev/errorPage.html @@ -86,7 +86,8 @@ padding: 4px 15px; } .template-line, .source-line { - padding: 2px 0px; + padding: 0px 0px; + padding-bottom: 2px; } .tabs .tab { display: inline-block; @@ -99,6 +100,11 @@ background: #efefef; color: #333; } + .error-column { + background-color: white; + color: red; + padding: 2px; + } @render(moreStyles) @@ -173,11 +179,18 @@
@for(String line: sourceInfo.lines()) { @{ - String cls = line_index == sourceInfo.lineNumber() ? "error nohighlight" : "" + boolean isErrorLine = line_index == sourceInfo.lineNumber(); + String cls = isErrorLine ? "error nohighlight" : "" }
@line_index - @line.sp2nbsp() + + @ifNot(isErrorLine || sourceInfo.column() < 0) { + @line.sp2nbsp() + } else { + @line.errorLine(sourceInfo.column()) + } +
}
From 2fdb5c92e5d45183939404aca4ac960d8db46ace Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 23 Jul 2018 20:57:33 +1000 Subject: [PATCH 031/730] fix #744 and #745 --- CHANGELOG.md | 2 ++ src/main/java/act/util/ActError.java | 4 +++ src/main/java/act/view/ActUnauthorized.java | 29 +++++---------------- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0750993c4..3b5db9b57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* `ActUnauthorized` - source info shall be populated upon each call #745 +* Error page: error highlight line not matched the line triggered the runtime error #744 * Improve SYSTEM_SCAN_LIST matching performance #743 * Add `App.wasStarted()` method #742 * `JobAnnotationProcessor` issue: non static method in abstract class shall not be treated as static #741 diff --git a/src/main/java/act/util/ActError.java b/src/main/java/act/util/ActError.java index 43fa532a1..79e511426 100644 --- a/src/main/java/act/util/ActError.java +++ b/src/main/java/act/util/ActError.java @@ -85,6 +85,10 @@ public static SourceInfo loadSourceInfo(Throwable cause, Class errorClass) { + SourceInfo info = loadSourceInfo(sa, errorClass); + if (null != info) { + return info; + } int len = sa.length; StackTraceElement[] caller = sa; if (len > 0) { diff --git a/src/main/java/act/view/ActUnauthorized.java b/src/main/java/act/view/ActUnauthorized.java index c249f43dc..0ac5f6005 100644 --- a/src/main/java/act/view/ActUnauthorized.java +++ b/src/main/java/act/view/ActUnauthorized.java @@ -26,33 +26,22 @@ import act.app.SourceInfo; import act.util.ActError; import org.osgl.mvc.result.Unauthorized; +import org.osgl.util.C; import java.util.List; public class ActUnauthorized extends Unauthorized implements ActError { - private SourceInfo sourceInfo; - public ActUnauthorized() { super(); - if (Act.isDev()) { - doFillInStackTrace(); - sourceInfo = loadSourceInfo(ActUnauthorized.class); - } } public ActUnauthorized(String realm) { super(realm); - if (Act.isDev()) { - sourceInfo = loadSourceInfo(ActUnauthorized.class); - } } public ActUnauthorized(String realm, boolean digest) { super(realm, digest); - if (Act.isDev()) { - sourceInfo = loadSourceInfo(ActUnauthorized.class); - } } @Override @@ -61,23 +50,19 @@ public Throwable getCauseOrThis() { } public SourceInfo sourceInfo() { - return sourceInfo; + if (Act.isDev()) { + return loadSourceInfo(ActUnauthorized.class); + } + return null; } @Override public StackTraceElement[] getStackTrace() { - StackTraceElement[] raw = super.getStackTrace(); - if (raw.length < 3) { - return raw; - } - int len = raw.length - 3; - StackTraceElement[] effective = new StackTraceElement[len]; - System.arraycopy(raw, 3, effective, 0, len); - return effective; + return null; } public List stackTrace() { - return Util.stackTraceOf(this); + return C.list(); } @Override From a5802b3b6c02910d8add8ee599d7520f3d9b120d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 25 Jul 2018 21:31:52 +1000 Subject: [PATCH 032/730] fix #748 and #749 --- CHANGELOG.md | 2 + pom.xml | 6 -- src/main/java/act/controller/Controller.java | 6 ++ .../java/act/handler/builtin/FileGetter.java | 2 +- src/main/java/act/route/Router.java | 58 ++++++++++--------- .../act/xio/undertow/ActBlockingExchange.java | 4 +- 6 files changed, 43 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b5db9b57..6b1f0101d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Remove `undertow-websockets-jsr` dependency #749 +* It shall send back 404 if return File does not exist #748 * `ActUnauthorized` - source info shall be populated upon each call #745 * Error page: error highlight line not matched the line triggered the runtime error #744 * Improve SYSTEM_SCAN_LIST matching performance #743 diff --git a/pom.xml b/pom.xml index 88b852e9a..0083ba544 100644 --- a/pom.xml +++ b/pom.xml @@ -240,12 +240,6 @@ ${undertow.version} - - io.undertow - undertow-websockets-jsr - ${undertow.version} - - com.squareup.okhttp3 okhttp diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 68e1c259d..a36c97e0f 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1625,6 +1625,12 @@ public static Result inferResult(InputStream is, ActionContext actionContext) { * @return a Result inferred from the file specified */ public static Result inferResult(File file, ActionContext actionContext) { + if (null == file || !file.exists()) { + return notFound(); + } + if (!file.canRead()) { + return forbidden(); + } if (actionContext.acceptJson()) { return RenderJSON.of(actionContext.successStatus(), IO.readContentAsString(file)); } else { diff --git a/src/main/java/act/handler/builtin/FileGetter.java b/src/main/java/act/handler/builtin/FileGetter.java index 526440bfa..238e1bc45 100644 --- a/src/main/java/act/handler/builtin/FileGetter.java +++ b/src/main/java/act/handler/builtin/FileGetter.java @@ -104,7 +104,7 @@ public File base() { return base; } - static H.Format contentType(String path) { + public static H.Format contentType(String path) { H.Format retVal = null; if (path.contains(".")) { FastStr s = FastStr.unsafeOf(path).afterLast('.'); diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 852e1bc7f..33f517c7b 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -1,24 +1,24 @@ package act.route; - /*- - * #%L - * ACT Framework - * %% - * Copyright (C) 2014 - 2017 ActFramework - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ import act.Act; import act.Destroyable; @@ -65,9 +65,12 @@ public interface Visitor { /** * Visit a route mapping in the router * - * @param method the HTTP method - * @param path the URL path - * @param handler the handler + * @param method + * the HTTP method + * @param path + * the URL path + * @param handler + * the handler */ void visit(H.Method method, String path, RequestHandler handler); } @@ -168,7 +171,8 @@ public int port() { * Accept a {@link Visitor} to traverse route mapping in this * router * - * @param visitor the visitor + * @param visitor + * the visitor */ public void accept(Visitor visitor) { visit(_GET, H.Method.GET, visitor); @@ -572,8 +576,10 @@ public String fullUrl(String path, Object... args) { /** * Return full URL of reverse rout of specified action * - * @param action the action path - * @param renderArgs the render arguments + * @param action + * the action path + * @param renderArgs + * the render arguments * @return the full URL as described above */ public String fullUrl(String action, Map renderArgs) { @@ -973,7 +979,7 @@ private void findOutConflictNodes(Set nodes) { nodes.add(staticNode); continue; } - for (Node dynamicNode: parentConflictNode.dynamicChilds) { + for (Node dynamicNode : parentConflictNode.dynamicChilds) { if (metaInfoConflict(dynamicNode.name)) { nodes.add(dynamicNode); } diff --git a/src/main/java/act/xio/undertow/ActBlockingExchange.java b/src/main/java/act/xio/undertow/ActBlockingExchange.java index 2e74cbf0c..0641f9be9 100644 --- a/src/main/java/act/xio/undertow/ActBlockingExchange.java +++ b/src/main/java/act/xio/undertow/ActBlockingExchange.java @@ -25,9 +25,9 @@ import io.undertow.io.*; import io.undertow.server.BlockingHttpExchange; import io.undertow.server.HttpServerExchange; -import io.undertow.servlet.core.BlockingWriterSenderImpl; import io.undertow.util.AttachmentKey; import org.osgl.http.H; +import org.osgl.util.WriterOutputStream; import java.io.InputStream; import java.io.OutputStream; @@ -65,7 +65,7 @@ public OutputStream getOutputStream() { public Sender getSender() { H.Response response = ctx().resp(); if (response.writerCreated()) { - return new BlockingWriterSenderImpl(exchange, response.printWriter(), response.characterEncoding()); + return new BlockingSenderImpl(exchange, new WriterOutputStream(response.writer())); } else { return new BlockingSenderImpl(exchange, response.outputStream()); } From 0205c89c13d143624cda1f571dcd3285b5c51c66 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 27 Jul 2018 20:24:03 +1000 Subject: [PATCH 033/730] fix #751 and #752 --- CHANGELOG.md | 2 ++ src/main/java/act/controller/Controller.java | 14 ++++-------- .../java/act/util/ReflectedInvokerHelper.java | 22 +++++++++++-------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b1f0101d..a12689f19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* JSON string return issue when Accept is not specified #752 +* It generates 10 controller instances when app starts up #751 * Remove `undertow-websockets-jsr` dependency #749 * It shall send back 404 if return File does not exist #748 * `ActUnauthorized` - source info shall be populated upon each call #745 diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index a36c97e0f..82b9d08de 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1557,15 +1557,8 @@ public static Result inferPrimitiveResult(Object v, ActionContext actionContext, return new RenderBinary((byte[]) v); } else { H.Format fmt = actionContext.accept(); - if (H.Format.UNKNOWN == fmt) { - // use JSON by default - if (isArray) { - return RenderJSON.of(status, $.toString2(v)); - } - return RenderJSON.of(status, C.Map("result", v)); - } String s = $$.toString(v, isDateTime, isArray); - if (HTML == fmt || H.Format.UNKNOWN == fmt) { + if (HTML == fmt) { return RenderHtml.of(status, s); } if (fmt.isText()) { @@ -1688,8 +1681,9 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon return inferToTemplate(v, context); } - boolean requireJSON = context.acceptJson(); - boolean requireXML = !requireJSON && context.acceptXML(); + H.Format accept = context.accept(); + boolean requireJSON = (accept == H.Format.JSON) || (accept == H.Format.UNKNOWN); + boolean requireXML = !requireJSON && accept == H.Format.XML; if (null == v) { // the following code breaks before handler without returning result diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index a598a5a83..ca6a3b79b 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -45,17 +45,21 @@ public static Object tryGetSingleton(Class invokerClass, App app) { List fields = $.fieldsOf(invokerClass); if (fields.isEmpty()) { singleton = app.getInstance(invokerClass); - } - boolean stateful = false; - for (Field field : fields) { - if (!isGlobalOrStateless(field)) { - stateful = true; - break; + } else { + boolean stateful = false; + for (Field field : fields) { + if (!isGlobalOrStateless(field)) { + stateful = true; + break; + } + } + if (!stateful) { + singleton = app.getInstance(invokerClass); } } - if (!stateful) { - singleton = app.getInstance(invokerClass); - } + } + if (null != singleton) { + app.registerSingleton(singleton); } return singleton; } From a7d466673b37949f73f4f710042aecfe51505c06 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 28 Jul 2018 22:21:37 +1000 Subject: [PATCH 034/730] fix #755 and #757 --- CHANGELOG.md | 3 + pom.xml | 7 ++ .../java/act/inject/util/ResourceLoader.java | 108 ++++++++++++++++-- .../ValidationMessages_zh.properties | 15 +++ .../resources/rythm/error/dev/errorPage.html | 1 + .../act/inject/util/LoadResourceTest.java | 15 +++ src/test/resources/public/foo/matrix.txt | 2 + src/test/resources/public/foo/str_matrix.txt | 2 + 8 files changed, 141 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/ValidationMessages_zh.properties create mode 100644 src/test/resources/public/foo/matrix.txt create mode 100644 src/test/resources/public/foo/str_matrix.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index a12689f19..7c29d64b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.8.8** +* Enhance `ResourceLoader` #757 +* Missing Chinese message for some validation violations #755 +* `@LoadResource` cannot inject resource content into Map or Properties #753 * JSON string return issue when Accept is not specified #752 * It generates 10 controller instances when app starts up #751 * Remove `undertow-websockets-jsr` dependency #749 diff --git a/pom.xml b/pom.xml index 0083ba544..a5139d883 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,7 @@ 1.3.0 1.1.0.Final 1.4.25.Final + 1.21 3.3.2 @@ -276,6 +277,12 @@ ${joda-time.version} + + org.yaml + snakeyaml + ${snakeyaml.version} + + org.osgl genie diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index 85f423f36..3d9dba1db 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -24,7 +24,6 @@ import act.app.App; import act.app.data.StringValueResolverManager; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; import org.osgl.$; import org.osgl.exception.UnexpectedException; import org.osgl.inject.BeanSpec; @@ -38,19 +37,21 @@ import org.osgl.util.E; import org.osgl.util.IO; import org.osgl.util.S; +import org.osgl.util.TypeReference; +import org.yaml.snakeyaml.Yaml; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; +import java.lang.reflect.Array; import java.lang.reflect.Type; import java.net.URISyntaxException; import java.net.URL; import java.nio.ByteBuffer; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Collection; -import java.util.List; +import java.util.*; public class ResourceLoader extends ValueLoader.Base { @@ -140,22 +141,107 @@ protected static Object _load(String resourcePath, BeanSpec spec, boolean ignore } return null; } - boolean isJson = resourcePath.endsWith(".json"); Class rawType = spec.rawType(); if (URL.class == rawType) { return url; + } + if (rawType.isArray()) { + if (byte[].class == rawType) { + return readContent(url); + } + Class componentType = rawType.getComponentType(); + if (componentType.isArray()) { + Class subComponentType = componentType.getComponentType(); + boolean isString = String.class == subComponentType; + boolean isPrimitive = !isString && $.isPrimitiveType(subComponentType); + boolean isWrapper = !isPrimitive && !isString && $.isWrapperType(subComponentType); + if (isString || isPrimitive || isWrapper) { + List lines = IO.readLines(url); + int len = lines.size(); + Object a2 = Array.newInstance(componentType, len); + for (int i = 0; i < len; ++i) { + String line = lines.get(i); + List elements = S.fastSplit(line, ","); + int len2 = elements.size(); + Object a = Array.newInstance(subComponentType, len2); + Array.set(a2, i, a); + for (int j = 0; j < len2; ++j) { + Object e = $.convert(elements.get(j)).to(subComponentType); + if (isPrimitive) { + if (int.class == subComponentType) { + Array.setInt(a, j, (Integer) e); + } else if (double.class == subComponentType) { + Array.setDouble(a, j, (Double) e); + } else if (long.class == subComponentType) { + Array.setLong(a, j, (Long) e); + } else if (float.class == subComponentType) { + Array.setFloat(a, j, (Float) e); + } else if (boolean.class == subComponentType) { + Array.setBoolean(a, j, (Boolean) e); + } else if (short.class == subComponentType) { + Array.setShort(a, j, (Short) e); + } else if (byte.class == subComponentType) { + Array.setByte(a, j, (Byte) e); + } else if (char.class == subComponentType) { + Array.setChar(a, j, (Character) e); + } else { + throw E.unsupport("Sub component type not supported: " + subComponentType.getName()); + } + } else { + Array.set(a, j, e); + } + } + } + return a2; + } else { + throw E.unsupport("Sub component type not supported: " + subComponentType.getName()); + } + } else { + List lines = IO.readLines(url); + if (String.class == componentType) { + return lines.toArray(new String[lines.size()]); + } + Object array = Array.newInstance(componentType, lines.size()); + return $.map(lines).to(array); + } + } + boolean isJson = resourcePath.endsWith(".json"); + if (isJson) { + String content = IO.readContentAsString(url); + content = content.trim(); + Object o = content.startsWith("[") ? JSON.parseArray(content) : JSON.parseObject(content); + return $.map(o).to(rawType); + } + boolean isYaml = !isJson && (resourcePath.endsWith(".yml") || resourcePath.endsWith(".yaml")); + if (isYaml) { + Object o = new Yaml().load(IO.readContentAsString(url)); + return $.map(o).to(rawType); } else if (String.class == rawType) { return IO.readContentAsString(url); - } else if (byte[].class == rawType) { - return readContent(url); } else if (List.class.equals(rawType)) { List typeParams = spec.typeParams(); + List lines = IO.readLines(url); if (!typeParams.isEmpty()) { if (String.class == typeParams.get(0)) { - return IO.readLines(url); - } else if (isJson) { - return JSON.parseObject(IO.readContentAsString(url), spec.type()); + return lines; + } + Type typeParam = typeParams.get(0); + if (typeParam instanceof Class) { + List list = new ArrayList(lines.size()); + for (String line : lines) { + list.add($.convert(line).to((Class) typeParam)); + } + return list; } + throw E.unsupport("List element type not supported: " + typeParam); + } + } else if (Map.class.isAssignableFrom(rawType)) { + if (resourcePath.endsWith(".properties")) { + Properties properties = IO.loadProperties(url); + if (Properties.class == rawType || Properties.class.isAssignableFrom(rawType)) { + return properties; + } + return $.map(properties).to(rawType); } } else if (Collection.class.isAssignableFrom(rawType)) { List typeParams = spec.typeParams(); @@ -198,9 +284,7 @@ protected static Object _load(String resourcePath, BeanSpec spec, boolean ignore } else if (Reader.class == rawType) { return new InputStreamReader(IO.is(url)); } - if (isJson) { - return JSON.parseObject(IO.readContentAsString(url), spec.type()); - } + String content = IO.readContentAsString(url); try { return Act.app().resolverManager().resolve(IO.readContentAsString(url), rawType); } catch (RuntimeException e) { diff --git a/src/main/resources/ValidationMessages_zh.properties b/src/main/resources/ValidationMessages_zh.properties new file mode 100644 index 000000000..ef1ca37ac --- /dev/null +++ b/src/main/resources/ValidationMessages_zh.properties @@ -0,0 +1,15 @@ +javax.validation.constraints.Size.message=\u5927\u5C0F\u9700\u4ECB\u4E8E {min} \u548C {max} \u4E4B\u95F4 +javax.validation.constraints.DecimalMax.message=\u5FC5\u987B\u5C0F\u4E8E\u6216\u8005\u7B49\u4E8E {value} +javax.validation.constraints.NotNull.message=\u4E0D\u80FD\u4E3A\u7A7A\u503C +javax.validation.constraints.Digits.message=\u6570\u503C\u8D8A\u754C (\u6709\u6548\u503C: <{integer} \u6570\u5B57>.<{fraction} \u6570\u5B57>) +javax.validation.constraints.DecimalMin.message=\u5FC5\u987B\u5927\u4E8E\u6216\u7B49\u4E8E {value} +org.apache.bval.constraints.Email.message=\u65E0\u6548 email \u5730\u5740 +javax.validation.constraints.AssertTrue.message=\u5FC5\u987B\u4E3A\u771F +javax.validation.constraints.Max.message=\u5FC5\u987B\u5C0F\u4E8E\u6216\u8005\u7B49\u4E8E {value} +org.apache.bval.constraints.NotEmpty.message=\u4E0D\u80FD\u4E3A\u7A7A\u5B57\u4E32 +javax.validation.constraints.AssertFalse.message=\u5FC5\u987B\u4E3A\u5047 +javax.validation.constraints.Null.message=\u5FC5\u987B\u4E3A\u7A7A\u503C +javax.validation.constraints.Past.message=\u5FC5\u987B\u4E3A\u8FC7\u53BB\u65E5\u671F +javax.validation.constraints.Min.message=\u5FC5\u987B\u5927\u4E8E\u6216\u7B49\u4E8E {value} +javax.validation.constraints.Pattern.message=\u5FC5\u987B\u5339\u914D\u6B63\u5219\u8868\u8FBE\u5F0F: {regexp} +javax.validation.constraints.Future.message=\u5FC5\u987B\u4E3A\u5C06\u6765\u65E5\u671F diff --git a/src/main/resources/rythm/error/dev/errorPage.html b/src/main/resources/rythm/error/dev/errorPage.html index cd2e2e7ba..b96118c59 100644 --- a/src/main/resources/rythm/error/dev/errorPage.html +++ b/src/main/resources/rythm/error/dev/errorPage.html @@ -68,6 +68,7 @@ font-weight: bold; padding-left: 0px; border-bottom: 1px solid #aaa; + color: red; } .source-info.active { background-color: #000; diff --git a/src/test/java/act/inject/util/LoadResourceTest.java b/src/test/java/act/inject/util/LoadResourceTest.java index 02aba32e5..ebbf85d7d 100644 --- a/src/test/java/act/inject/util/LoadResourceTest.java +++ b/src/test/java/act/inject/util/LoadResourceTest.java @@ -48,6 +48,12 @@ public static class TestBed { @LoadResource("public/foo/foo.list") private byte[] ba; + @LoadResource("public/foo/matrix.txt") + private int[][] intMatrix; + + @LoadResource("public/foo/str_matrix.txt") + private String[][] strMatrix; + } Genie genie = Genie.createWithoutPlugins(); @@ -83,5 +89,14 @@ public void testByteArray() { eq("line1\nline2", new String(testBed.ba)); } + @Test + public void testIntMatrix() { + eq(4, testBed.intMatrix[1][1]); + } + + @Test + public void testStrMatrix() { + eq("yesterday", testBed.strMatrix[1][1]); + } } diff --git a/src/test/resources/public/foo/matrix.txt b/src/test/resources/public/foo/matrix.txt new file mode 100644 index 000000000..23cb06d3e --- /dev/null +++ b/src/test/resources/public/foo/matrix.txt @@ -0,0 +1,2 @@ +1,3,5 +2,4,6 \ No newline at end of file diff --git a/src/test/resources/public/foo/str_matrix.txt b/src/test/resources/public/foo/str_matrix.txt new file mode 100644 index 000000000..09815e19b --- /dev/null +++ b/src/test/resources/public/foo/str_matrix.txt @@ -0,0 +1,2 @@ +hello,world +bye,yesterday \ No newline at end of file From 813a550f8966ed350b630646b0a0065612932952 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 29 Jul 2018 10:31:12 +1000 Subject: [PATCH 035/730] fix #758 --- CHANGELOG.md | 1 + src/main/java/act/Act.java | 3 +- .../java/act/inject/util/ResourceLoader.java | 101 +++++++++++++++++- src/main/java/act/util/Jars.java | 41 ++++--- .../act/inject/util/LoadResourceTest.java | 19 ++++ src/test/resources/tags/bar.tag | 1 + src/test/resources/tags/foo.tag | 1 + 7 files changed, 146 insertions(+), 21 deletions(-) create mode 100644 src/test/resources/tags/bar.tag create mode 100644 src/test/resources/tags/foo.tag diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c29d64b2..6da737688 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `ResourceLoader` - load files in directory into `Map` structure #758 * Enhance `ResourceLoader` #757 * Missing Chinese message for some validation violations #755 * `@LoadResource` cannot inject resource content into Map or Properties #753 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 979e351de..c327b7877 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -545,7 +545,8 @@ public static T getInstance(String className) { * @return the instance of the class */ public static T getInstance(Class clz) { - return app().getInstance(clz); + App app = app(); + return null == app ? $.newInstance(clz) : app.getInstance(clz); } /** diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index 3d9dba1db..a3a3a1a27 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -23,6 +23,7 @@ import act.Act; import act.app.App; import act.app.data.StringValueResolverManager; +import act.util.Jars; import com.alibaba.fastjson.JSON; import org.osgl.$; import org.osgl.exception.UnexpectedException; @@ -34,10 +35,7 @@ import org.osgl.logging.Logger; import org.osgl.storage.ISObject; import org.osgl.storage.impl.SObject; -import org.osgl.util.E; -import org.osgl.util.IO; -import org.osgl.util.S; -import org.osgl.util.TypeReference; +import org.osgl.util.*; import org.yaml.snakeyaml.Yaml; import java.io.File; @@ -46,12 +44,15 @@ import java.io.Reader; import java.lang.reflect.Array; import java.lang.reflect.Type; +import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.nio.ByteBuffer; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; public class ResourceLoader extends ValueLoader.Base { @@ -141,6 +142,82 @@ protected static Object _load(String resourcePath, BeanSpec spec, boolean ignore } return null; } + return _load(url, spec); + } + + private static Object _load(URL url, BeanSpec spec) { + $.Var entryBag = $.var(); + $.Var jarFileBag = $.var(); + $.Var fileBag = $.var(); + if (isDir(url, entryBag, jarFileBag, fileBag)) { + E.unsupportedIfNot(Map.class.isAssignableFrom(spec.rawType()), "Does not support loading directory into " + spec); + JarEntry entry = entryBag.get(); + Map map = $.cast(Act.getInstance(spec.rawType())); + List mapTypes = spec.typeParams(); + Type valType = mapTypes.size() > 1 ? mapTypes.get(1) : String.class; + BeanSpec subSpec = BeanSpec.of(valType, spec.injector()); + boolean isKeyword = false; + if (mapTypes.size() > 0) { + Type keyType = mapTypes.get(0); + if (keyType instanceof Class) { + isKeyword = Keyword.class == keyType; + E.unsupportedIfNot(isKeyword || String.class == keyType, "Map spec not supported: " + spec); + } else { + throw E.unsupport("Map spec not supported: " + spec); + } + } + if (null != entry) { + String dirName = entry.getName(); + int dirNameLen = dirName.length(); + JarFile file = jarFileBag.get(); + String parentSpec = file.toString(); + Enumeration entries = file.entries(); + while (entries.hasMoreElements()) { + JarEntry entry0 = entries.nextElement(); + String entryName = entry0.getName(); + if (dirName.equals(entryName)) { + continue; + } + if (!entryName.startsWith(dirName)) { + continue; + } + if (entry0.isDirectory()) { + // we don't support loading recursively + continue; + } + String fileName = entryName.substring(dirNameLen); + if (fileName.contains("/")) { + // we don't support sub dir resources + continue; + } + String subUrlSpec = S.concat(parentSpec, "/", fileName); + try { + URL subUrl = new URL(subUrlSpec); + String s = S.cut(fileName).beforeLast("."); + map.put(isKeyword ? Keyword.of(s) : s, _load(subUrl, subSpec)); + } catch (MalformedURLException e) { + throw E.unexpected(e); + } + } + } else { + File dir = fileBag.get(); + File[] files = dir.listFiles(); + for (File file : files) { + if (file.isDirectory()) { + // we don't support loading recursively + continue; + } + String key = S.cut(file.getName()).beforeLast("."); + try { + URL fileUrl = file.toURI().toURL(); + map.put(isKeyword ? Keyword.of(key) : key, _load(fileUrl, subSpec)); + } catch (MalformedURLException e) { + throw E.unexpected(e); + } + } + } + return map; + } Class rawType = spec.rawType(); if (URL.class == rawType) { return url; @@ -205,6 +282,7 @@ protected static Object _load(String resourcePath, BeanSpec spec, boolean ignore return $.map(lines).to(array); } } + String resourcePath = url.getPath(); boolean isJson = resourcePath.endsWith(".json"); if (isJson) { String content = IO.readContentAsString(url); @@ -292,6 +370,21 @@ protected static Object _load(String resourcePath, BeanSpec spec, boolean ignore } } + private static boolean isDir(URL url, $.Var entryBag, $.Var jarFileBag, $.Var fileBag) { + String protocol = url.getProtocol(); + if ("file".equals(protocol)) { + File file = new File(url.getFile()); + fileBag.set(file); + return file.isDirectory(); + } else if ("jar".equals(protocol)) { + JarEntry entry = Jars.jarEntry(url, jarFileBag); + entryBag.set(entry); + return entry.isDirectory(); + } else { + throw E.unsupport("URL protocol not supported: " + url); + } + } + private static byte[] readContent(URL url) { return IO.readContent(IO.is(url)); } diff --git a/src/main/java/act/util/Jars.java b/src/main/java/act/util/Jars.java index fc1a6f4f6..511103a4c 100644 --- a/src/main/java/act/util/Jars.java +++ b/src/main/java/act/util/Jars.java @@ -87,22 +87,14 @@ public static void scan(File file, F.JarEntryVisitor... visitors) { if (file.isDirectory()) { scanDir(file, visitors); } else { - try { - scanFile(file, visitors); - } catch (IOException e) { - logger.warn(e, "Error scanning jar file: %s", file.getName()); - } + scanFile(file, visitors); } } private static void scanList(List jars, F.JarEntryVisitor visitor) { for (int i = 0, j = jars.size(); i < j; ++i) { File jar = jars.get(i); - try { - scanFile(jar, visitor); - } catch (IOException e) { - logger.warn(e, "Error scanning jar file: %s", jar.getName()); - } + scanFile(jar, visitor); } } @@ -116,15 +108,11 @@ public boolean accept(File dir, String name) { int n = jars.length; for (int i = 0; i < n; ++i) { File file = jars[i]; - try { - scanFile(file, visitors); - } catch (IOException e) { - logger.warn(e, "Error scanning jar file: %s", file.getName()); - } + scanFile(file, visitors); } } - private static void scanFile(File file, F.JarEntryVisitor... visitors) throws IOException { + private static void scanFile(File file, F.JarEntryVisitor... visitors) { try { JarFile jar = new JarFile(file); try { @@ -149,6 +137,27 @@ private static void scanFile(File file, F.JarEntryVisitor... visitors) throws IO } } + public static JarEntry jarEntry(URL url, $.Var jarFileBag) { + E.illegalArgumentIfNot("jar".equals(url.getProtocol()), "jar URL expected"); + String path = url.getPath(); + E.unexpectedIfNot(path.startsWith("file:"), "Expected `file:` prefix in the path, found: " + path); + E.unexpectedIfNot(path.contains("!"), "`!` not found in the path: " + path); + + S.Pair pair = S.binarySplit(path, '!'); + String jarFilePath = pair.left(); + String entryPath = pair.right(); + try { + JarFile jarFile = new JarFile(jarFilePath); + jarFileBag.set(jarFile); + if (entryPath.startsWith("/")) { + entryPath = entryPath.substring(1); + } + return jarFile.getJarEntry(entryPath); + } catch (IOException e) { + throw E.ioException(e); + } + } + public static byte[] getBytes(JarFile jar, JarEntry entry) { try { InputStream is = jar.getInputStream(entry); diff --git a/src/test/java/act/inject/util/LoadResourceTest.java b/src/test/java/act/inject/util/LoadResourceTest.java index ebbf85d7d..02bd479f5 100644 --- a/src/test/java/act/inject/util/LoadResourceTest.java +++ b/src/test/java/act/inject/util/LoadResourceTest.java @@ -24,10 +24,12 @@ import org.junit.Test; import org.osgl.inject.Genie; import org.osgl.util.C; +import org.osgl.util.Keyword; import osgl.ut.TestBase; import java.nio.ByteBuffer; import java.util.List; +import java.util.Map; public class LoadResourceTest extends TestBase { @@ -54,6 +56,12 @@ public static class TestBed { @LoadResource("public/foo/str_matrix.txt") private String[][] strMatrix; + @LoadResource("tags") + private Map tagsByString; + + @LoadResource("tags") + private Map tagsByKeyword; + } Genie genie = Genie.createWithoutPlugins(); @@ -99,4 +107,15 @@ public void testStrMatrix() { eq("yesterday", testBed.strMatrix[1][1]); } + @Test + public void testTagsByString() { + eq("foo_tag", testBed.tagsByString.get("foo")); + eq("bar_tag", testBed.tagsByString.get("bar")); + } + + @Test + public void testTagsByKeyword() { + eq("foo_tag", testBed.tagsByKeyword.get(Keyword.of("foo"))); + eq("bar_tag", testBed.tagsByKeyword.get(Keyword.of("bar"))); + } } diff --git a/src/test/resources/tags/bar.tag b/src/test/resources/tags/bar.tag new file mode 100644 index 000000000..5d68495a0 --- /dev/null +++ b/src/test/resources/tags/bar.tag @@ -0,0 +1 @@ +bar_tag \ No newline at end of file diff --git a/src/test/resources/tags/foo.tag b/src/test/resources/tags/foo.tag new file mode 100644 index 000000000..3fc2791df --- /dev/null +++ b/src/test/resources/tags/foo.tag @@ -0,0 +1 @@ +foo_tag \ No newline at end of file From 7fb0c27f34204633f13ea987b30e53f34a69e7a0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 29 Jul 2018 17:58:29 +1000 Subject: [PATCH 036/730] fix #759 and #760 --- CHANGELOG.md | 2 + src/main/java/act/conf/AppConfigKey.java | 2 +- src/main/java/act/data/DateResolver.java | 22 ++++++++ .../impl/ReflectedHandlerInvoker.java | 2 +- .../java/act/util/ReflectedInvokerHelper.java | 54 +++++++++++++------ testapp/pom.xml | 2 +- 6 files changed, 65 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6da737688..f8c7b5db0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Error starting app when `cacheFor.dev` set to `true` #760 +* @DateFormatPattern has no effect on `Date` field #759 * `ResourceLoader` - load files in directory into `Map` structure #758 * Enhance `ResourceLoader` #757 * Missing Chinese message for some validation violations #755 diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 20afd6592..7747e22c7 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -129,7 +129,7 @@ public enum AppConfigKey implements ConfigKey { * * Default value: `false` */ - CACHE_FOR_ON_DEV("cacheFor.dev"), + CACHE_FOR_ON_DEV("cacheFor.dev.enabled"), /** * `captcha.width` diff --git a/src/main/java/act/data/DateResolver.java b/src/main/java/act/data/DateResolver.java index e220dad61..9b99706ba 100644 --- a/src/main/java/act/data/DateResolver.java +++ b/src/main/java/act/data/DateResolver.java @@ -21,6 +21,10 @@ */ import act.conf.AppConfig; +import act.data.annotation.DateFormatPattern; +import act.data.annotation.Pattern; +import org.osgl.util.AnnotationAware; +import org.osgl.util.StringValueResolver; import java.util.Date; import javax.inject.Inject; @@ -38,6 +42,24 @@ public DateResolver(String pattern) { super(pattern); } + @Override + public StringValueResolver amended(AnnotationAware beanSpec) { + DateFormatPattern dfp = beanSpec.getAnnotation(DateFormatPattern.class); + if (null != dfp) { + return new DateResolver(dfp.value()); + } + String format; + DateFormatPattern pattern = beanSpec.getAnnotation(DateFormatPattern.class); + if (null == pattern) { + Pattern patternLegacy = beanSpec.getAnnotation(Pattern.class); + format = null == patternLegacy ? null : patternLegacy.value(); + } else { + format = pattern.value(); + } + return null == format ? this : new DateResolver(format); + + } + @Override protected Date cast(Date date) { return date; diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 99fa3f751..ee24aa413 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -844,7 +844,7 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle } result = null == methodAccess ? $.invokeStatic(method, params) : methodAccess.invoke(controller, handlerIndex, params); if (returnString && context.acceptJson()) { - result = ensureValidJson(S.string(result)); + result = null == result ? null : ensureValidJson(S.string(result)); } } catch (Result r) { result = r; diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index ca6a3b79b..205c314ac 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -23,11 +23,16 @@ import act.Act; import act.app.App; import act.app.AppServiceBase; +import act.inject.util.LoadResource; import org.osgl.$; import org.osgl.inject.annotation.Configuration; +import org.osgl.util.C; +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Field; import java.util.List; +import javax.inject.Singleton; public class ReflectedInvokerHelper { @@ -41,21 +46,8 @@ public class ReflectedInvokerHelper { public static Object tryGetSingleton(Class invokerClass, App app) { Object singleton = app.singleton(invokerClass); if (null == singleton) { - // check if there are fields - List fields = $.fieldsOf(invokerClass); - if (fields.isEmpty()) { + if (_isGlobalOrStateless(invokerClass)) { singleton = app.getInstance(invokerClass); - } else { - boolean stateful = false; - for (Field field : fields) { - if (!isGlobalOrStateless(field)) { - stateful = true; - break; - } - } - if (!stateful) { - singleton = app.getInstance(invokerClass); - } } } if (null != singleton) { @@ -64,13 +56,43 @@ public static Object tryGetSingleton(Class invokerClass, App app) { return singleton; } + public static boolean isGlobalOrStateless(Class type) { + if (Act.app().isSingleton(type) || AppServiceBase.class.isAssignableFrom(type) || _isGllobalOrStateless2(type)) { + return true; + } + return _isGllobalOrStateless2(type); + } + + private static boolean _isGlobalOrStateless(Class type) { + List fields = $.fieldsOf(type); + if (fields.isEmpty()) { + return true; + } + for (Field field : fields) { + if (!isGlobalOrStateless(field)) { + return false; + } + } + return true; + } private static boolean isGlobalOrStateless(Field field) { - if (null != field.getAnnotation(Stateless.class) || null != field.getAnnotation(Global.class) || null != field.getAnnotation(Configuration.class)) { + if (_isGllobalOrStateless2(field)) { return true; } Class fieldType = field.getType(); - return Act.app().isSingleton(fieldType) || AppServiceBase.class.isAssignableFrom(fieldType); + return isGlobalOrStateless(fieldType); + } + + private final static List> statelessMarkers = C.list(Singleton.class, Stateless.class, Global.class, Configuration.class, LoadResource.class); + + private static boolean _isGllobalOrStateless2(AnnotatedElement element) { + for (Class type : statelessMarkers) { + if (null != element.getAnnotation(type)) { + return true; + } + } + return false; } } diff --git a/testapp/pom.xml b/testapp/pom.xml index e0489d8d3..90592792c 100644 --- a/testapp/pom.xml +++ b/testapp/pom.xml @@ -75,7 +75,7 @@ UTF-8 1.8.8-RC12-SNAPSHOT [0.13.0, 2.0.0) - 1.6.1 + 1.6.2-SNAPSHOT testapp.TestApp From 808cbb926e585dcac5c9f2f48311ee5a3dd40e13 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 29 Jul 2018 20:25:07 +1000 Subject: [PATCH 037/730] fix #736 --- CHANGELOG.md | 1 + src/main/java/act/controller/OutputCache.java | 126 ++++++++++++++++++ .../java/act/controller/ResponseCache.java | 14 +- .../controller/RequestHandlerProxy.java | 3 + 4 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 src/main/java/act/controller/OutputCache.java diff --git a/CHANGELOG.md b/CHANGELOG.md index f8c7b5db0..0f16dfb9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* @CacheFor have problems #736 * Error starting app when `cacheFor.dev` set to `true` #760 * @DateFormatPattern has no effect on `Date` field #759 * `ResourceLoader` - load files in directory into `Map` structure #758 diff --git a/src/main/java/act/controller/OutputCache.java b/src/main/java/act/controller/OutputCache.java new file mode 100644 index 000000000..560a54f30 --- /dev/null +++ b/src/main/java/act/controller/OutputCache.java @@ -0,0 +1,126 @@ +package act.controller; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.ActResponse; +import org.osgl.util.Output; + +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.nio.ByteBuffer; + +public class OutputCache implements Output { + private ByteArrayOutputStream baos = new ByteArrayOutputStream(); + private Output tee = Output.Adaptors.of(baos); + private Output out; + private ByteBuffer buffer; + + public OutputCache(Output out) { + this.out = out; + } + + @Override + public void open() { + } + + @Override + public void close() { + if (null == buffer) { + flush(); + } + } + + @Override + public void flush() { + byte[] ba = baos.toByteArray(); + ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); + buffer.put(ba); + buffer.flip(); + this.buffer = buffer; + // out already closed + //out.close(); + } + + @Override + public Output append(CharSequence csq) { + tee.append(csq); + out.append(csq); + return this; + } + + @Override + public Output append(CharSequence csq, int start, int end) { + tee.append(csq, start, end); + out.append(csq, start, end); + return this; + } + + @Override + public Output append(char c) { + tee.append(c); + out.append(c); + return this; + } + + @Override + public Output append(byte[] bytes) { + tee.append(bytes); + out.append(bytes); + return this; + } + + @Override + public Output append(byte[] bytes, int start, int end) { + tee.append(bytes, start, end); + out.append(bytes, start, end); + return this; + } + + @Override + public Output append(byte b) { + tee.append(b); + out.append(b); + return this; + } + + @Override + public Output append(ByteBuffer buffer) { + tee.append(buffer); + out.append(buffer); + return this; + } + + @Override + public OutputStream asOutputStream() { + return Output.Adaptors.asOutputStream(this); + } + + @Override + public Writer asWriter() { + return Output.Adaptors.asWriter(this); + } + + void apply(ActResponse resp) { + resp.writeContent(buffer.duplicate()); + } + +} diff --git a/src/main/java/act/controller/ResponseCache.java b/src/main/java/act/controller/ResponseCache.java index 5041f2b7c..7d7c7a3a9 100644 --- a/src/main/java/act/controller/ResponseCache.java +++ b/src/main/java/act/controller/ResponseCache.java @@ -20,13 +20,14 @@ * #L% */ +import static org.osgl.http.H.Format.*; + import act.ActResponse; import org.osgl.$; import org.osgl.exception.UnexpectedIOException; import org.osgl.http.H; import org.osgl.storage.ISObject; import org.osgl.util.Charsets; -import org.osgl.util.IO; import org.osgl.util.Output; import java.io.OutputStream; @@ -38,8 +39,6 @@ import java.util.Locale; import java.util.Map; -import static org.osgl.http.H.Format.*; - public class ResponseCache extends ActResponse implements Serializable { private Map cookies = new HashMap<>(); @@ -50,6 +49,7 @@ public class ResponseCache extends ActResponse implements Serializable { private ByteBuffer buffer; private OutputStreamCache osCache; private WriterCache writerCache; + private OutputCache outputCache; private transient ActResponse realResponse; @@ -88,6 +88,8 @@ public void applyTo(ActResponse response) { osCache.apply(response); } else if (null != writerCache) { writerCache.apply(response); + } else if (null != outputCache) { + outputCache.apply(response); } } @@ -113,6 +115,12 @@ public OutputStream outputStream() throws IllegalStateException, UnexpectedIOExc return osCache; } + @Override + public Output output() { + outputCache = new OutputCache(realResponse.output()); + return outputCache; + } + @Override public Writer writer() throws IllegalStateException, UnexpectedIOException { writerCache = new WriterCache(realResponse.writer()); diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index b7967084a..728ccd2be 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -213,6 +213,9 @@ public void handle(ActionContext context) { if (null == result) { result = context.nullValueResult(); } + if (supportCache) { + context.resp().addHeaderIfNotAdded(H.Header.Names.CACHE_CONTROL, "public, max-age=" + cacheSupport.ttl); + } onResult(result, context); if (supportCache) { this.cache.put(cacheKey, context.resp(), cacheSupport.ttl); From cf8d52489fad31db3d5800d5d2e7275876a4cb67 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 30 Jul 2018 15:09:01 +1000 Subject: [PATCH 038/730] try fix FileNotFoundException caused by ResourceLoader change --- src/main/java/act/util/Jars.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/act/util/Jars.java b/src/main/java/act/util/Jars.java index 511103a4c..966ef4c45 100644 --- a/src/main/java/act/util/Jars.java +++ b/src/main/java/act/util/Jars.java @@ -144,7 +144,7 @@ public static JarEntry jarEntry(URL url, $.Var jarFileBag) { E.unexpectedIfNot(path.contains("!"), "`!` not found in the path: " + path); S.Pair pair = S.binarySplit(path, '!'); - String jarFilePath = pair.left(); + String jarFilePath = pair.left().substring(5); String entryPath = pair.right(); try { JarFile jarFile = new JarFile(jarFilePath); From 678a8ce6cde2e15bdd3bedbe0833a1485884d0bb Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 3 Aug 2018 08:01:48 +1000 Subject: [PATCH 039/730] fix #765, #766 and #767 --- CHANGELOG.md | 4 +- src/main/java/act/apidoc/Endpoint.java | 86 +++++++++---------- src/main/java/act/app/App.java | 16 +++- src/main/java/act/app/AppClassLoader.java | 13 ++- src/main/java/act/db/di/FindBy.java | 4 +- .../impl/ReflectedHandlerInvoker.java | 16 ++-- .../param/{JsonDTO.java => JsonDto.java} | 2 +- ...erator.java => JsonDtoClassGenerator.java} | 17 ++-- ...sManager.java => JsonDtoClassManager.java} | 47 +++++----- .../inject/param/JsonParamValueLoader.java | 2 +- .../java/act/inject/util/ResourceLoader.java | 32 ++++++- .../java/act/util/ReflectedInvokerHelper.java | 32 ++++--- .../act/xio/WebSocketConnectionHandler.java | 10 +-- src/main/resources/act.jar.black.list | 7 +- 14 files changed, 184 insertions(+), 104 deletions(-) rename src/main/java/act/inject/param/{JsonDTO.java => JsonDto.java} (97%) rename src/main/java/act/inject/param/{JsonDTOClassGenerator.java => JsonDtoClassGenerator.java} (88%) rename src/main/java/act/inject/param/{JsonDTOClassManager.java => JsonDtoClassManager.java} (85%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f16dfb9d..837748f39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ # ActFramework Change Log **1.8.8** -* @CacheFor have problems #736 +* Improve Singleton detection for controller instance creation #767 +* JsonDto class generation - support request handler reuse #766 +* API Doc - Support request handler reuse #765 * Error starting app when `cacheFor.dev` set to `true` #760 * @DateFormatPattern has no effect on `Date` field #759 * `ResourceLoader` - load files in directory into `Map` structure #758 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index cc79e6df3..269e99a4a 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -316,24 +316,24 @@ private void explore(RequestHandler handler) { } // just ignore cli value here } - this.id = id(method); - returnSample = generateSampleJson(BeanSpec.of(method.getGenericReturnType(), null, Act.injector())); + this.id = id(controllerClass, method); + Type returnType = method.getGenericReturnType(); + Map typeParamLookup = C.Map(); + if (controllerClass != method.getDeclaringClass()) { + typeParamLookup = Generics.buildTypeParamImplLookup(controllerClass); + } + returnSample = generateSampleJson(BeanSpec.of(returnType, null, Act.injector(), typeParamLookup), typeParamLookup); Description descAnno = method.getAnnotation(Description.class); - this.description = null == descAnno ? methodDescription(method) : descAnno.value(); - exploreParamInfo(method); + this.description = null == descAnno ? id(controllerClass, method) : descAnno.value(); + exploreParamInfo(method, typeParamLookup); if (!Modifier.isStatic(method.getModifiers())) { - exploreParamInfo(controllerClass); + exploreParamInfo(controllerClass, typeParamLookup); } this.controllerClass = controllerClass; } - private String methodDescription(Method method) { - return id(method); - } - - private String id(Method method) { - Class hosting = method.getDeclaringClass(); - return className(hosting) + "." + method.getName(); + private String id(Class controllerClass, Method method) { + return className(controllerClass) + "." + method.getName(); } private String className(Class clz) { @@ -344,7 +344,7 @@ private String className(Class clz) { return clz.getSimpleName(); } - private void exploreParamInfo(Method method) { + private void exploreParamInfo(Method method, Map typeParamLookup) { Type[] paramTypes = method.getGenericParameterTypes(); int paramCount = paramTypes.length; if (0 == paramCount) { @@ -358,7 +358,7 @@ private void exploreParamInfo(Method method) { for (int i = 0; i < paramCount; ++i) { Type type = paramTypes[i]; Annotation[] annos = allAnnos[i]; - ParamInfo info = paramInfo(type, annos, injector, null); + ParamInfo info = paramInfo(type, typeParamLookup, annos, injector, null); if (null != info) { params.add(info); if (path.contains("{" + info.getName() + "}")) { @@ -369,10 +369,10 @@ private void exploreParamInfo(Method method) { if (null != info.defaultValue) { sample = resolver.resolve(info.defaultValue, info.beanSpec.rawType()); } else { - sample = generateSampleData(info.beanSpec, new HashSet(), new ArrayList()); + sample = generateSampleData(info.beanSpec, typeParamLookup, new HashSet(), new ArrayList()); } if (H.Method.GET == this.httpMethod) { - String query = generateSampleQuery(info.beanSpec.withoutName(), info.bindName, new HashSet(), C.newList()); + String query = generateSampleQuery(info.beanSpec.withoutName(), typeParamLookup, info.bindName, new HashSet(), C.newList()); if (S.notBlank(query)) { sampleQuery.add(query); } @@ -397,24 +397,24 @@ public boolean test(Field field) { } }; - private void exploreParamInfo(Class controller) { + private void exploreParamInfo(Class controller, Map typeParamLookup) { DependencyInjector injector = Act.injector(); List fields = $.fieldsOf(controller, FIELD_PREDICATE); for (Field field : fields) { Type type = field.getGenericType(); Annotation[] annos = field.getAnnotations(); - ParamInfo info = paramInfo(type, annos, injector, field.getName()); + ParamInfo info = paramInfo(type, typeParamLookup, annos, injector, field.getName()); if (null != info) { params.add(info); } } } - private ParamInfo paramInfo(Type type, Annotation[] annos, DependencyInjector injector, String name) { + private ParamInfo paramInfo(Type type, Map typeParamLookup, Annotation[] annos, DependencyInjector injector, String name) { if (isLoginUser(annos)) { return null; } - BeanSpec spec = BeanSpec.of(type, annos, name, injector); + BeanSpec spec = BeanSpec.of(type, annos, name, injector, typeParamLookup); if (ParamValueLoaderService.providedButNotDbBind(spec, injector)) { return null; } @@ -422,7 +422,7 @@ private ParamInfo paramInfo(Type type, Annotation[] annos, DependencyInjector in if (org.osgl.util.S.blank(name)) { name = spec.name(); } - return new ParamInfo(name, BeanSpec.of(String.class, Act.injector()), name + " id"); + return new ParamInfo(name, BeanSpec.of(String.class, injector, typeParamLookup), name + " id"); } String description = ""; Description descAnno = spec.getAnnotation(Description.class); @@ -441,12 +441,12 @@ private boolean isLoginUser(Annotation[] annos) { return false; } - private String generateSampleJson(BeanSpec spec) { + private String generateSampleJson(BeanSpec spec, Map typeParamLookup) { Class type = spec.rawType(); if (Result.class.isAssignableFrom(type)) { return null; } - Object sample = generateSampleData(spec, new HashSet(), new ArrayList()); + Object sample = generateSampleData(spec, typeParamLookup, new HashSet(), new ArrayList()); if (null == sample) { return null; } @@ -456,14 +456,14 @@ private String generateSampleJson(BeanSpec spec) { return JSON.toJSONString(sample, true); } - private String generateSampleQuery(BeanSpec spec, String bindName, Set typeChain, List nameChain) { + private String generateSampleQuery(BeanSpec spec, Map typeParamLookup, String bindName, Set typeChain, List nameChain) { Class type = spec.rawType(); String specName = spec.name(); if (S.notBlank(specName)) { nameChain.add(specName); } if ($.isSimpleType(type)) { - Object o = generateSampleData(spec, typeChain, nameChain); + Object o = generateSampleData(spec, typeParamLookup, typeChain, nameChain); if (null == o) { return ""; } @@ -472,27 +472,27 @@ private String generateSampleQuery(BeanSpec spec, String bindName, Set typ if (type.isArray()) { // TODO handle datetime component type Class elementType = type.getComponentType(); - BeanSpec elementSpec = BeanSpec.of(elementType, Act.injector()); + BeanSpec elementSpec = BeanSpec.of(elementType, Act.injector(), typeParamLookup); if ($.isSimpleType(elementType)) { - Object o = generateSampleData(elementSpec, typeChain, nameChain); + Object o = generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain); if (null == o) { return ""; } return bindName + "=" + o - + "&" + bindName + "=" + generateSampleData(elementSpec, typeChain, nameChain); + + "&" + bindName + "=" + generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain); } } else if (Collection.class.isAssignableFrom(type)) { // TODO handle datetime component type List typeParams = spec.typeParams(); Type elementType = typeParams.isEmpty() ? Object.class : typeParams.get(0); - BeanSpec elementSpec = BeanSpec.of(elementType, null, Act.injector()); + BeanSpec elementSpec = BeanSpec.of(elementType, null, Act.injector(), typeParamLookup); if ($.isSimpleType(elementSpec.rawType())) { - Object o = generateSampleData(elementSpec, typeChain, nameChain); + Object o = generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain); if (null == o) { return ""; } return bindName + "=" + o - + "&" + bindName + "=" + generateSampleData(elementSpec, typeChain, nameChain); + + "&" + bindName + "=" + generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain); } } else if (Map.class.isAssignableFrom(type)) { LOGGER.warn("Map not supported yet"); @@ -512,7 +512,7 @@ private String generateSampleQuery(BeanSpec spec, String bindName, Set typ continue; } String fieldBindName = bindName + "." + field.getName(); - String pair = generateSampleQuery(BeanSpec.of(field, Act.injector()), fieldBindName, C.newSet(typeChain), C.newList(nameChain)); + String pair = generateSampleQuery(BeanSpec.of(field, Act.injector(), typeParamLookup), typeParamLookup, fieldBindName, C.newSet(typeChain), C.newList(nameChain)); if (S.notBlank(pair)) { queryPairs.add(pair); } @@ -535,7 +535,7 @@ private static boolean isCollection(Type type) { return false; } - private Object generateSampleData(BeanSpec spec, Set typeChain, List nameChain) { + private Object generateSampleData(BeanSpec spec, Map typeParamLookup, Set typeChain, List nameChain) { Type type = spec.type(); if (typeChain.contains(type) && !isCollection(type)) { return S.concat(spec.name(), ":", type); // circular reference detected @@ -580,8 +580,8 @@ private Object generateSampleData(BeanSpec spec, Set typeChain, List typeChain, List typeChain, List typeChain, List valType = null == val ? null : val.getClass(); if (null != valType && fieldClass.isAssignableFrom(valType)) { field.set(obj, val); diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 93c9802bd..b71464738 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -62,7 +62,7 @@ import act.inject.genie.GenieFactoryFinder; import act.inject.genie.GenieInjector; import act.inject.genie.GenieModuleScanner; -import act.inject.param.JsonDTOClassManager; +import act.inject.param.JsonDtoClassManager; import act.inject.param.ParamValueLoaderManager; import act.inject.param.ParamValueLoaderService; import act.inject.param.ProvidedValueLoader; @@ -181,6 +181,7 @@ public enum F { private Set eventEmitted; private Thread mainThread; private Set jarFileBlackList; + private Set jarFileBlackList2; private Set scanList; private Set scanPatterns; private Set scanPrefixList; @@ -1145,6 +1146,10 @@ public Set jarFileBlackList() { return jarFileBlackList; } + public Set jarFileBlackList2() { + return jarFileBlackList2; + } + public Set scanList() { return scanList; } @@ -1446,6 +1451,13 @@ private void initJarFileBlackList() { ClassLoader classLoader = getClass().getClassLoader(); if (classLoader instanceof BootstrapClassLoader) { jarFileBlackList = ((BootstrapClassLoader) classLoader).jarBlackList(); + jarFileBlackList2 = new HashSet<>(); + for (String s : jarFileBlackList) { + if (s.contains("-")) { + jarFileBlackList2.add(s); + } + } + jarFileBlackList.removeAll(jarFileBlackList2); } } @@ -1549,7 +1561,7 @@ private void initClassLoader() { } private void initJsonDTOClassManager() { - new JsonDTOClassManager(this); + new JsonDtoClassManager(this); } private void preloadClasses() { diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index d023cd0a7..671126d64 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -376,13 +376,24 @@ private void preloadLib() { Jars.F.JarEntryVisitor confIndexBuilder = Jars.F.appConfigFileIndexBuilder(jarConf); List jars = FullStackAppBootstrapClassLoader.jars(AppClassLoader.class.getClassLoader()); Set blackList = app().jarFileBlackList(); + Set blackList2 = app().jarFileBlackList2(); for (File jar : jars) { String filename = jar.getName(); String name = S.cut(filename).beforeFirst("-"); if ("".equals(name)) { name = S.cut(filename).beforeLast("."); } - if (!blackList.contains(name)) { + if (blackList.contains(name)) { + continue; + } + boolean shouldScan = true; + for (String prefix : blackList2) { + if (filename.startsWith(prefix)) { + shouldScan = false; + break; + } + } + if (shouldScan) { Jars.scan(jar, classNameIndexBuilder, confIndexBuilder); } } diff --git a/src/main/java/act/db/di/FindBy.java b/src/main/java/act/db/di/FindBy.java index 76c431d32..f4129a64e 100644 --- a/src/main/java/act/db/di/FindBy.java +++ b/src/main/java/act/db/di/FindBy.java @@ -24,7 +24,7 @@ import act.app.ActionContext; import act.app.App; import act.db.Dao; -import act.inject.param.JsonDTO; +import act.inject.param.JsonDto; import act.inject.param.ParamValueLoaderService; import act.util.ActContext; import act.view.ActBadRequest; @@ -146,7 +146,7 @@ private static String resolve(String bindName, ActContext ctx) { if (ctx instanceof ActionContext) { ActionContext actionContext = (ActionContext) ctx; - JsonDTO dto = actionContext.attribute(JsonDTO.CTX_ATTR_KEY); + JsonDto dto = actionContext.attribute(JsonDto.CTX_ATTR_KEY); if (null != dto) { value = S.string(dto.get(bindName)); } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index ee24aa413..d2eeda3ed 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -47,8 +47,8 @@ import act.handler.event.ReflectedHandlerInvokerInit; import act.handler.event.ReflectedHandlerInvokerInvoke; import act.inject.DependencyInjector; -import act.inject.param.JsonDTO; -import act.inject.param.JsonDTOClassManager; +import act.inject.param.JsonDto; +import act.inject.param.JsonDtoClassManager; import act.inject.param.ParamValueLoaderManager; import act.inject.param.ParamValueLoaderService; import act.job.JobManager; @@ -114,7 +114,7 @@ public void visit(H.Format format) throws $.Break { }; protected Method method; // private ParamValueLoaderService paramLoaderService; - private JsonDTOClassManager jsonDTOClassManager; + private JsonDtoClassManager jsonDTOClassManager; private int paramCount; private int fieldsAndParamsCount; private String singleJsonFieldName; @@ -172,7 +172,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.disabled = !Env.matches(controllerClass); this.traceHandler = app.config().traceHandler(); this.paramLoaderService = app.service(ParamValueLoaderManager.class).get(ActionContext.class); - this.jsonDTOClassManager = app.service(JsonDTOClassManager.class); + this.jsonDTOClassManager = app.service(JsonDtoClassManager.class); Class[] paramTypes = paramTypes(cl); try { @@ -566,21 +566,21 @@ public void setLargeResponseHint() { } } - private void cacheJsonDTO(ActContext context, JsonDTO dto) { - context.attribute(JsonDTO.CTX_ATTR_KEY, dto); + private void cacheJsonDTO(ActContext context, JsonDto dto) { + context.attribute(JsonDto.CTX_ATTR_KEY, dto); } private void ensureJsonDTOGenerated(ActionContext context) { if (0 == fieldsAndParamsCount || !context.jsonEncoded()) { return; } - Class dtoClass = jsonDTOClassManager.get(controllerClass, method); + Class dtoClass = jsonDTOClassManager.get(controllerClass, method); if (null == dtoClass) { // there are neither fields nor params return; } try { - JsonDTO dto = JSON.parseObject(patchedJsonBody(context), dtoClass); + JsonDto dto = JSON.parseObject(patchedJsonBody(context), dtoClass); cacheJsonDTO(context, dto); } catch (JSONException e) { if (e.getCause() != null) { diff --git a/src/main/java/act/inject/param/JsonDTO.java b/src/main/java/act/inject/param/JsonDto.java similarity index 97% rename from src/main/java/act/inject/param/JsonDTO.java rename to src/main/java/act/inject/param/JsonDto.java index 5d8c9022a..040625664 100644 --- a/src/main/java/act/inject/param/JsonDTO.java +++ b/src/main/java/act/inject/param/JsonDto.java @@ -27,7 +27,7 @@ * The base class of system generated data transfer object to support converting JSON string into * handler method parameters (or plus controller class fields) */ -public abstract class JsonDTO { +public abstract class JsonDto { public static final String CTX_ATTR_KEY = "__json_dto__"; diff --git a/src/main/java/act/inject/param/JsonDTOClassGenerator.java b/src/main/java/act/inject/param/JsonDtoClassGenerator.java similarity index 88% rename from src/main/java/act/inject/param/JsonDTOClassGenerator.java rename to src/main/java/act/inject/param/JsonDtoClassGenerator.java index 9313a8fd8..f659d8f35 100644 --- a/src/main/java/act/inject/param/JsonDTOClassGenerator.java +++ b/src/main/java/act/inject/param/JsonDtoClassGenerator.java @@ -21,15 +21,16 @@ */ import act.asm.*; -import act.inject.param.JsonDTOClassManager.DynamicClassLoader; +import act.inject.param.JsonDtoClassManager.DynamicClassLoader; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.util.FastStr; import org.osgl.util.S; import java.util.List; +import java.util.Map; -class JsonDTOClassGenerator implements Opcodes { +class JsonDtoClassGenerator implements Opcodes { private static final String JSON_DTO_CLASS = "act/inject/param/JsonDTO"; @@ -39,15 +40,17 @@ class JsonDTOClassGenerator implements Opcodes { private DynamicClassLoader dynamicClassLoader; private ClassWriter cw; private MethodVisitor mv; + private Map typeParamLookup; - JsonDTOClassGenerator(String name, List list, DynamicClassLoader classLoader) { + JsonDtoClassGenerator(String name, List list, DynamicClassLoader classLoader, Map typeParamLookup) { this.className = name; this.beanSpecs = list; this.dynamicClassLoader = classLoader; this.cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); + this.typeParamLookup = typeParamLookup; } - Class generate() { + Class generate() { return $.cast(dynamicClassLoader.defineClass(className, generateByteCode())); } @@ -99,11 +102,11 @@ private static String setterDescriptor(BeanSpec spec) { return S.fmt("(%s)V", classDesc(spec.rawType())); } - private static String setterSignature(BeanSpec spec) { + private String setterSignature(BeanSpec spec) { return S.fmt("(%s)V", typeDesc(spec)); } - private static String typeDesc(BeanSpec spec) { + private String typeDesc(BeanSpec spec) { String root = classDesc(spec.rawType()); List typeParams = spec.typeParams(); if (typeParams.isEmpty()) { @@ -111,7 +114,7 @@ private static String typeDesc(BeanSpec spec) { } S.Buffer sb = S.newBuffer("<"); for (java.lang.reflect.Type type : typeParams) { - BeanSpec specx = BeanSpec.of(type, null, spec.injector()); + BeanSpec specx = BeanSpec.of(type, null, spec.injector(), typeParamLookup); sb.append(typeDesc(specx)); } sb.append(">"); diff --git a/src/main/java/act/inject/param/JsonDTOClassManager.java b/src/main/java/act/inject/param/JsonDtoClassManager.java similarity index 85% rename from src/main/java/act/inject/param/JsonDTOClassManager.java rename to src/main/java/act/inject/param/JsonDtoClassManager.java index 53fcb7ab1..3d6aea6b7 100644 --- a/src/main/java/act/inject/param/JsonDTOClassManager.java +++ b/src/main/java/act/inject/param/JsonDtoClassManager.java @@ -21,26 +21,23 @@ */ import act.Act; -import act.app.App; -import act.app.AppClassLoader; -import act.app.AppServiceBase; +import act.app.*; import act.db.DbBind; import act.inject.DependencyInjector; +import act.util.ReflectedInvokerHelper; import org.osgl.$; import org.osgl.exception.UnexpectedException; import org.osgl.inject.BeanSpec; -import org.osgl.util.E; -import org.osgl.util.Generics; -import org.osgl.util.S; +import org.osgl.util.*; -import javax.inject.Inject; import java.lang.annotation.Annotation; import java.lang.reflect.*; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import javax.inject.Inject; -public class JsonDTOClassManager extends AppServiceBase { +public class JsonDtoClassManager extends AppServiceBase { static class DynamicClassLoader extends ClassLoader { private DynamicClassLoader(AppClassLoader parent) { @@ -53,13 +50,14 @@ Class defineClass(String name, byte[] b) { } } - private ConcurrentMap> dtoClasses = new ConcurrentHashMap>(); + private ConcurrentMap> dtoClasses = new ConcurrentHashMap>(); private DependencyInjector injector; private DynamicClassLoader dynamicClassLoader; + private Map<$.T2, List> beanSpecCache = new HashMap<>(); - public JsonDTOClassManager(App app) { + public JsonDtoClassManager(App app) { super(app); this.injector = app.injector(); this.dynamicClassLoader = new DynamicClassLoader(app.classLoader()); @@ -70,16 +68,17 @@ protected void releaseResources() { } - public Class get(Class host, Method method) { + public Class get(Class host, Method method) { List beanSpecs = beanSpecs(host, method); String key = key(beanSpecs); if (S.blank(key)) { return null; } - Class cls = dtoClasses.get(key); + Class cls = dtoClasses.get(key); if (null == cls) { try { - Class newClass = generate(key, beanSpecs); + Map typeParamLookup = Generics.buildTypeParamImplLookup(host); + Class newClass = generate(key, beanSpecs, typeParamLookup); cls = dtoClasses.putIfAbsent(key, newClass); if (null == cls) { cls = newClass; @@ -97,8 +96,8 @@ public Class get(Class host, Method method) { return cls; } - private Class generate(String name, List beanSpecs) { - return new JsonDTOClassGenerator(name, beanSpecs, dynamicClassLoader).generate(); + private Class generate(String name, List beanSpecs, Map typeParamLookup) { + return new JsonDtoClassGenerator(name, beanSpecs, dynamicClassLoader, typeParamLookup).generate(); } public static final $.Predicate> CLASS_FILTER = new $.Predicate>() { @@ -120,6 +119,9 @@ public boolean test(Field field) { if (Modifier.isStatic(field.getModifiers())) { return false; } + if (ReflectedInvokerHelper.isGlobalOrStateless(field)) { + return false; + } if (field.isAnnotationPresent(NoBind.class)) { return false; } @@ -129,12 +131,17 @@ public boolean test(Field field) { }; public List beanSpecs(Class host, Method method) { - List list = new ArrayList(); - if (!Modifier.isStatic(method.getModifiers())) { - extractBeanSpec(list, $.fieldsOf(host, CLASS_FILTER, FIELD_FILTER), host); + $.T2 key = $.cast($.T2(host, method)); + List list = beanSpecCache.get(key); + if (null == list) { + list = new ArrayList<>(); + beanSpecCache.put(key, list); + if (!Modifier.isStatic(method.getModifiers())) { + extractBeanSpec(list, $.fieldsOf(host, CLASS_FILTER, FIELD_FILTER), host); + } + extractBeanSpec(list, method, host); + Collections.sort(list, CMP); } - extractBeanSpec(list, method, host); - Collections.sort(list, CMP); return list; } diff --git a/src/main/java/act/inject/param/JsonParamValueLoader.java b/src/main/java/act/inject/param/JsonParamValueLoader.java index b1ff01a5a..7379e7db0 100644 --- a/src/main/java/act/inject/param/JsonParamValueLoader.java +++ b/src/main/java/act/inject/param/JsonParamValueLoader.java @@ -62,7 +62,7 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (isPathVariable) { return fallBack.load(bean, context, noDefaultValue); } - JsonDTO dto = context.attribute(JsonDTO.CTX_ATTR_KEY); + JsonDto dto = context.attribute(JsonDto.CTX_ATTR_KEY); if (null == dto) { return this.fallBack.load(bean, context, noDefaultValue); } else { diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index a3a3a1a27..9c4ec73b5 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -64,7 +64,7 @@ public class ResourceLoader extends ValueLoader.Base { protected void initialized() { String path = (String) options.get("value"); E.unexpectedIf(S.blank(path), "resource path not specified"); - boolean trimLeadingSlash = !(Boolean) options.get("skipTrimLeadingSlash"); + boolean trimLeadingSlash = !$.bool(options.get("skipTrimLeadingSlash")); while (trimLeadingSlash && path.startsWith("/")) { path = path.substring(1); } @@ -320,6 +320,34 @@ private static Object _load(URL url, BeanSpec spec) { return properties; } return $.map(properties).to(rawType); + } else { + // try my best + List lines = IO.readLines(url); + if (lines.isEmpty()) { + return C.Map(); + } + ListIterator itr = lines.listIterator(); + String firstLine = itr.next(); + while (itr.hasNext()) { + if (!firstLine.startsWith("#")) { + break; + } + firstLine = itr.next(); + } + char sep; + if (firstLine.contains("=")) { + sep = '='; + } else if (firstLine.contains(":")) { + sep = ':'; + } else { + throw new UnexpectedException("Unable to load resource into Map: " + resourcePath); + } + Map map = new HashMap<>(); + for (String line : lines) { + S.Pair pair = S.binarySplit(line, sep); + map.put(pair.left(), pair.right()); + } + return map; } } else if (Collection.class.isAssignableFrom(rawType)) { List typeParams = spec.typeParams(); @@ -364,7 +392,7 @@ private static Object _load(URL url, BeanSpec spec) { } String content = IO.readContentAsString(url); try { - return Act.app().resolverManager().resolve(IO.readContentAsString(url), rawType); + return Act.app().resolverManager().resolve(content, rawType); } catch (RuntimeException e) { throw new UnexpectedException("return type not supported: " + spec); } diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 205c314ac..228af88ae 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -31,7 +31,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Field; -import java.util.List; +import java.util.*; import javax.inject.Singleton; public class ReflectedInvokerHelper { @@ -46,7 +46,7 @@ public class ReflectedInvokerHelper { public static Object tryGetSingleton(Class invokerClass, App app) { Object singleton = app.singleton(invokerClass); if (null == singleton) { - if (_isGlobalOrStateless(invokerClass)) { + if (_isGlobalOrStateless(invokerClass, new HashSet())) { singleton = app.getInstance(invokerClass); } } @@ -57,36 +57,48 @@ public static Object tryGetSingleton(Class invokerClass, App app) { } public static boolean isGlobalOrStateless(Class type) { - if (Act.app().isSingleton(type) || AppServiceBase.class.isAssignableFrom(type) || _isGllobalOrStateless2(type)) { + return isGlobalOrStateless(type, new HashSet()); + } + + public static boolean isGlobalOrStateless(Field field) { + return isGlobalOrStateless(field, new HashSet()); + } + + private static boolean isGlobalOrStateless(Class type, Set circularReferenceDetector) { + if (Act.app().isSingleton(type) || AppServiceBase.class.isAssignableFrom(type) || _hasGlobalOrStatelessAnnotations(type)) { return true; } - return _isGllobalOrStateless2(type); + if (circularReferenceDetector.contains(type)) { + return false; + } + circularReferenceDetector.add(type); + return _isGlobalOrStateless(type, circularReferenceDetector); } - private static boolean _isGlobalOrStateless(Class type) { + private static boolean _isGlobalOrStateless(Class type, Set circularReferenceDetector) { List fields = $.fieldsOf(type); if (fields.isEmpty()) { return true; } for (Field field : fields) { - if (!isGlobalOrStateless(field)) { + if (!isGlobalOrStateless(field, circularReferenceDetector)) { return false; } } return true; } - private static boolean isGlobalOrStateless(Field field) { - if (_isGllobalOrStateless2(field)) { + private static boolean isGlobalOrStateless(Field field, Set circularReferenceDetector) { + if (_hasGlobalOrStatelessAnnotations(field)) { return true; } Class fieldType = field.getType(); - return isGlobalOrStateless(fieldType); + return isGlobalOrStateless(fieldType, circularReferenceDetector); } private final static List> statelessMarkers = C.list(Singleton.class, Stateless.class, Global.class, Configuration.class, LoadResource.class); - private static boolean _isGllobalOrStateless2(AnnotatedElement element) { + private static boolean _hasGlobalOrStatelessAnnotations(AnnotatedElement element) { for (Class type : statelessMarkers) { if (null != element.getAnnotation(type)) { return true; diff --git a/src/main/java/act/xio/WebSocketConnectionHandler.java b/src/main/java/act/xio/WebSocketConnectionHandler.java index 0e263d7fc..450c932ef 100644 --- a/src/main/java/act/xio/WebSocketConnectionHandler.java +++ b/src/main/java/act/xio/WebSocketConnectionHandler.java @@ -60,7 +60,7 @@ public abstract class WebSocketConnectionHandler extends RequestHandlerBase { private int methodIndex; protected boolean isStatic; private ParamValueLoaderService paramLoaderService; - private JsonDTOClassManager jsonDTOClassManager; + private JsonDtoClassManager jsonDTOClassManager; private int paramCount; private int fieldsAndParamsCount; private String singleJsonFieldName; @@ -90,7 +90,7 @@ public WebSocketConnectionHandler(ActionMethodMetaInfo methodInfo, WebSocketConn this.controller = handler.classInfo(); this.paramLoaderService = app.service(ParamValueLoaderManager.class).get(WebSocketContext.class); - this.jsonDTOClassManager = app.service(JsonDTOClassManager.class); + this.jsonDTOClassManager = app.service(JsonDtoClassManager.class); this.handlerClass = $.classForName(controller.className(), cl); this.disabled = !Env.matches(handlerClass); @@ -216,14 +216,14 @@ private void ensureJsonDTOGenerated(WebSocketContext context) { if (0 == fieldsAndParamsCount || !context.isJson()) { return; } - Class dtoClass = jsonDTOClassManager.get(handlerClass, method); + Class dtoClass = jsonDTOClassManager.get(handlerClass, method); if (null == dtoClass) { // there are neither fields nor params return; } try { - JsonDTO dto = JSON.parseObject(patchedJsonBody(context), dtoClass); - context.attribute(JsonDTO.CTX_ATTR_KEY, dto); + JsonDto dto = JSON.parseObject(patchedJsonBody(context), dtoClass); + context.attribute(JsonDto.CTX_ATTR_KEY, dto); } catch (JSONException e) { if (e.getCause() != null) { logger.warn(e.getCause(), "error parsing JSON data"); diff --git a/src/main/resources/act.jar.black.list b/src/main/resources/act.jar.black.list index 3f1cc09b1..f8c8f545d 100644 --- a/src/main/resources/act.jar.black.list +++ b/src/main/resources/act.jar.black.list @@ -1,8 +1,12 @@ activation asm -byte +byte-buddy +commons +core debugger +ecj fastjson +genie guava hamcrest idea_rt @@ -25,4 +29,5 @@ org.apache.bval.bundle osgl patchca reflectasm +rythm slf4j \ No newline at end of file From 5b9f32688ffcf23b98988036c11aa5e77b14cb70 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 3 Aug 2018 10:41:01 +1000 Subject: [PATCH 040/730] update parent to osgl-parent-1.0.0-BETA-2; suppress version warning on dev mode --- pom.xml | 2 +- src/main/java/act/Act.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a5139d883..d5a75a5b9 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ org.osgl parent - 1.0.0-BETA-1 + 1.0.0-BETA-2 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index c327b7877..1cafcdff3 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -790,6 +790,9 @@ private static void processEnvironment(AppDescriptor descriptor) { } } } + if (mode.isDev()) { + Version.suppressVariableFoundWarning = true; + } s = System.getProperty("app.nodeGroup"); if (null != s) { nodeGroup = s; From 9046f0b0479a5616b98c049b6e83fe1d6fa4b444 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 3 Aug 2018 15:19:44 +1000 Subject: [PATCH 041/730] fix ClassNotFoundException caused by JsonDTO renaming --- src/main/java/act/app/App.java | 4 ++-- .../builtin/controller/impl/ReflectedHandlerInvoker.java | 8 ++++---- src/main/java/act/inject/param/JsonDtoClassGenerator.java | 4 ++-- src/main/java/act/xio/WebSocketConnectionHandler.java | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index b71464738..1cad74107 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -718,7 +718,7 @@ public synchronized void refresh() { if (null == blockIssue && null == blockIssueCause) { try { - initJsonDTOClassManager(); + initJsonDtoClassManager(); initParamValueLoaderManager(); initMailerConfigManager(); @@ -1560,7 +1560,7 @@ private void initClassLoader() { classLoader = Act.mode().classLoader(this); } - private void initJsonDTOClassManager() { + private void initJsonDtoClassManager() { new JsonDtoClassManager(this); } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index d2eeda3ed..ad1b7c381 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -466,7 +466,7 @@ public Result handle(final ActionContext context) { preventDoubleSubmission(context); processForceResponse(context); if (forceDataBinding || context.state().isHandling()) { - ensureJsonDTOGenerated(context); + ensureJsonDtoGenerated(context); } final Object controller = controllerInstance(context); @@ -566,11 +566,11 @@ public void setLargeResponseHint() { } } - private void cacheJsonDTO(ActContext context, JsonDto dto) { + private void cacheJsonDto(ActContext context, JsonDto dto) { context.attribute(JsonDto.CTX_ATTR_KEY, dto); } - private void ensureJsonDTOGenerated(ActionContext context) { + private void ensureJsonDtoGenerated(ActionContext context) { if (0 == fieldsAndParamsCount || !context.jsonEncoded()) { return; } @@ -581,7 +581,7 @@ private void ensureJsonDTOGenerated(ActionContext context) { } try { JsonDto dto = JSON.parseObject(patchedJsonBody(context), dtoClass); - cacheJsonDTO(context, dto); + cacheJsonDto(context, dto); } catch (JSONException e) { if (e.getCause() != null) { warn(e.getCause(), "error parsing JSON data"); diff --git a/src/main/java/act/inject/param/JsonDtoClassGenerator.java b/src/main/java/act/inject/param/JsonDtoClassGenerator.java index f659d8f35..cad05c6e3 100644 --- a/src/main/java/act/inject/param/JsonDtoClassGenerator.java +++ b/src/main/java/act/inject/param/JsonDtoClassGenerator.java @@ -33,7 +33,7 @@ class JsonDtoClassGenerator implements Opcodes { - private static final String JSON_DTO_CLASS = "act/inject/param/JsonDTO"; + private static final String JSON_DTO_CLASS = "act/inject/param/JsonDto"; private String className; private List beanSpecs; @@ -65,7 +65,7 @@ private void generateConstructor() { mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESPECIAL, "act/inject/param/JsonDTO", "", "()V", false); + mv.visitMethodInsn(INVOKESPECIAL, "act/inject/param/JsonDto", "", "()V", false); mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); diff --git a/src/main/java/act/xio/WebSocketConnectionHandler.java b/src/main/java/act/xio/WebSocketConnectionHandler.java index 450c932ef..e64954e6d 100644 --- a/src/main/java/act/xio/WebSocketConnectionHandler.java +++ b/src/main/java/act/xio/WebSocketConnectionHandler.java @@ -162,7 +162,7 @@ protected void invoke(WebSocketContext context) { if (disabled) { return; } - ensureJsonDTOGenerated(context); + ensureJsonDtoGenerated(context); Object[] params = params(context); Object retVal; if (this.isStatic) { @@ -212,7 +212,7 @@ private Class[] paramTypes(ClassLoader cl) { return ca; } - private void ensureJsonDTOGenerated(WebSocketContext context) { + private void ensureJsonDtoGenerated(WebSocketContext context) { if (0 == fieldsAndParamsCount || !context.isJson()) { return; } From 79c09e0954ded42f3cddebb4d239c9e67b5fc221 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 4 Aug 2018 16:26:32 +1000 Subject: [PATCH 042/730] fix #768, #769 and #770 --- CHANGELOG.md | 3 + src/main/java/act/Act.java | 4 +- src/main/java/act/app/App.java | 10 ++ src/main/java/act/app/AppClassLoader.java | 110 +++++++++++++++--- src/main/java/act/db/CreatedBy.java | 34 ++++++ src/main/java/act/db/LastModifiedBy.java | 34 ++++++ src/main/java/act/inject/ActProviders.java | 8 ++ .../java/act/internal/util/AppDescriptor.java | 1 + .../java/act/plugin/PrincipalProvider.java | 29 +++++ 9 files changed, 216 insertions(+), 17 deletions(-) create mode 100644 src/main/java/act/db/CreatedBy.java create mode 100644 src/main/java/act/db/LastModifiedBy.java create mode 100644 src/main/java/act/plugin/PrincipalProvider.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 837748f39..f27602b52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.8.8** +* Add `PrincipalProvider` mechanism #770 +* Add annotation to mark creator/modifier of an entity #769 +* `AppClassLoader` - return enhanced bytecode for `getResource` call #768 * Improve Singleton detection for controller instance creation #767 * JsonDto class generation - support request handler reuse #766 * API Doc - Support request handler reuse #765 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 1cafcdff3..18de8bd09 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -790,9 +790,7 @@ private static void processEnvironment(AppDescriptor descriptor) { } } } - if (mode.isDev()) { - Version.suppressVariableFoundWarning = true; - } + Version.suppressVariableFoundWarning = mode.isDev(); s = System.getProperty("app.nodeGroup"); if (null != s) { nodeGroup = s; diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 1cad74107..05edcd0d7 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -76,6 +76,7 @@ import act.metric.MetricContextScanner; import act.metric.MetricMetaInfoRepo; import act.metric.MetricProvider; +import act.plugin.PrincipalProvider; import act.route.RouteSource; import act.route.RouteTableRouterBuilder; import act.route.Router; @@ -205,6 +206,7 @@ public String toString() { }; private final Version version; private List hotReloadListeners = new ArrayList<>(); + private PrincipalProvider principalProvider = PrincipalProvider.DefaultPrincipalProvider.INSTANCE; private App() { this.version = Version.get(); @@ -966,6 +968,14 @@ public UploadFileStorageService uploadFileStorageService() { return uploadFileStorageService; } + public PrincipalProvider principalProvider() { + return principalProvider; + } + + public void registerPrincipalProvider(PrincipalProvider principalProvider) { + this.principalProvider = $.requireNotNull(principalProvider); + } + public String sign(String message) { return crypto().sign(message); } diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index 671126d64..ae455fba6 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -57,10 +57,9 @@ import org.osgl.util.IO; import org.osgl.util.S; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.InputStream; +import java.io.*; import java.lang.annotation.Annotation; +import java.net.*; import java.util.*; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; @@ -81,6 +80,7 @@ public class AppClassLoader private final static Logger logger = L.get(AppClassLoader.class); private App app; private Map libClsCache = new HashMap<>(); + private Map enhancedResourceCache = new HashMap<>(); private ClassInfoRepository classInfoRepository; private boolean destroyed; protected ControllerClassMetaInfoManager controllerInfo; @@ -402,17 +402,6 @@ private void preloadLib() { config.loadJarProperties(jarConf); } - void loadClasses() { - for (String key : libClsCache.keySet()) { - try { - Class c = loadClass(key, true); - cache(c); - } catch (Exception e) { - logger.warn(e, "error loading class"); - } - } - } - protected void preloadClasses() { File base = RuntimeDirs.classes(app); List files = Files.filter(base, _F.SAFE_CLASS); @@ -480,6 +469,9 @@ private Class loadAppClass(String name, boolean resolve) throws ClassNotFound if (resolve) { super.resolveClass(c); } + if (baNew.length != bytecode.length) { + enhancedResourceCache.put(name.replace('.', '/') + ".class", baNew); + } return c; } catch (VerifyError e) { File f = File.createTempFile(name, ".class"); @@ -495,6 +487,96 @@ private Class loadAppClass(String name, boolean resolve) throws ClassNotFound } } + /** + * This returns the normal {@link ClassLoader#getResourceAsStream(String)} + * result. + * + * @param name the resource name + * @return the input stream pointing to the resource + * @see #getResourceAsStream(String) + */ + public InputStream getOriginalResourceAsStream(String name) { + return super.getResourceAsStream(name); + } + + /** + * The implementation check if the name is an enhanced class and + * returns an input stream pointing to the enhanced bytecode. + * + * Otherwise it delegate the call to normal + * {@link ClassLoader#getResourceAsStream(String)} call. + * + * To make sure it returns real inputstream from the class file, + * use {@link #getOriginalResourceAsStream(String)} method instead. + * + * @param name the resource name + * @return a URL pointing to the resource. + */ + @Override + public InputStream getResourceAsStream(String name) { + byte[] ba = enhancedResourceCache.get(name); + if (null != ba) { + return new ByteArrayInputStream(ba); + } + return super.getResourceAsStream(name); + } + + /** + * This returns the normal {@link ClassLoader#getResource(String)} result + * + * @param name the resource name + * @return the URL pointing to the resource + * @see #getResource(String) + */ + public URL getOriginalResource(String name) { + return super.getResource(name); + } + + /** + * The implementation check if the name is an enhanced class and + * returns a URL pointing to the enhanced bytecode. + * + * In which case the URL returned is using a special protocol `act-class` + * instead of `jar` or `file`, the only meaningful operation on the + * returned URL is {@link URL#openConnection()} which has special + * implementation of {@link URLConnection#getInputStream()} to return + * a {@link ByteArrayInputStream} pointing to the enhanced bytecode + * of the class. + * + * To make sure it returns real URL to the class file, + * use {@link #getOriginalResource(String)} method instead. + * + * @param name the resource name + * @return a URL pointing to the resource. + */ + @Override + public URL getResource(String name) { + final byte[] ba = enhancedResourceCache.get(name); + if (null != ba) { + try { + return new URL("act-class", "", -1, name, new URLStreamHandler() { + @Override + protected URLConnection openConnection(URL u) { + return new URLConnection(null) { + @Override + public void connect() { + } + + @Override + public InputStream getInputStream() { + return new ByteArrayInputStream(ba); + } + + }; + } + }); + } catch (MalformedURLException e) { + throw E.unexpected(e); + } + } + return super.getResource(name); + } + protected byte[] enhance(String className, byte[] bytecode) { return asmEnhance(className, bytecode); } diff --git a/src/main/java/act/db/CreatedBy.java b/src/main/java/act/db/CreatedBy.java new file mode 100644 index 000000000..e61f3b691 --- /dev/null +++ b/src/main/java/act/db/CreatedBy.java @@ -0,0 +1,34 @@ +package act.db; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Used to mark a field of a model class as store the + * user who created the record. + * + * **Note** the type of the field must be {@link String} + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface CreatedBy { +} diff --git a/src/main/java/act/db/LastModifiedBy.java b/src/main/java/act/db/LastModifiedBy.java new file mode 100644 index 000000000..29136ec52 --- /dev/null +++ b/src/main/java/act/db/LastModifiedBy.java @@ -0,0 +1,34 @@ +package act.db; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Used to mark a field of a model class that keep + * track the user who last modified the record. + * + * **Note** the type of the field must be {@link String} + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface LastModifiedBy { +} diff --git a/src/main/java/act/inject/ActProviders.java b/src/main/java/act/inject/ActProviders.java index 336b1eb14..62c314e87 100644 --- a/src/main/java/act/inject/ActProviders.java +++ b/src/main/java/act/inject/ActProviders.java @@ -32,6 +32,7 @@ import act.event.EventBus; import act.job.JobContext; import act.mail.MailerContext; +import act.plugin.PrincipalProvider; import act.route.Router; import act.util.ActContext; import act.util.ClassInfoRepository; @@ -317,6 +318,13 @@ public SecureTicketCodec get() { } }; + public static final Provider PRINCIPAL_PROVIDER = new Provider() { + @Override + public PrincipalProvider get() { + return Act.app().principalProvider(); + } + }; + public static void registerBuiltInProviders(Class providersClass, $.Func2 register) { for (Field field : providersClass.getDeclaredFields()) { try { diff --git a/src/main/java/act/internal/util/AppDescriptor.java b/src/main/java/act/internal/util/AppDescriptor.java index c1c16da1f..5db0e7638 100644 --- a/src/main/java/act/internal/util/AppDescriptor.java +++ b/src/main/java/act/internal/util/AppDescriptor.java @@ -189,6 +189,7 @@ public static AppDescriptor of(String appName, Class entryClass, Version appV * an `AppDescriptor` instance */ public static AppDescriptor of(String appName, Class entryClass) { + Version.suppressVariableFoundWarning = true; return of(appName, entryClass, Version.of(entryClass)); } diff --git a/src/main/java/act/plugin/PrincipalProvider.java b/src/main/java/act/plugin/PrincipalProvider.java new file mode 100644 index 000000000..59dd55710 --- /dev/null +++ b/src/main/java/act/plugin/PrincipalProvider.java @@ -0,0 +1,29 @@ +package act.plugin; + +import act.app.ActionContext; + +import javax.inject.Provider; + +/** + * Provide the current user principal name. + */ +public interface PrincipalProvider extends Provider { + + /** + * The default implementation of {@link PrincipalProvider}. + * + * It fetch the principal name from {@link ActionContext#username()} + */ + class DefaultPrincipalProvider implements PrincipalProvider { + + public static final PrincipalProvider INSTANCE = new DefaultPrincipalProvider(); + + private DefaultPrincipalProvider() {} + + @Override + public String get() { + ActionContext context = ActionContext.current(); + return null == context ? null : context.username(); + } + } +} From a702f98167ec6bef1fb22c355ccfdd9503d46285 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 5 Aug 2018 08:15:30 +1000 Subject: [PATCH 043/730] fix #771; #769: support grab meta field information for the new annotations --- CHANGELOG.md | 1 + src/main/java/act/app/ProjectLayout.java | 47 +++++++++++++++++++ .../java/act/db/meta/EntityClassMetaInfo.java | 36 +++++++++++--- .../java/act/db/meta/EntityFieldMetaInfo.java | 26 ++++++++-- .../db/meta/EntityInfoByteCodeScanner.java | 30 ++++++++---- .../java/act/db/meta/EntityMetaInfoRepo.java | 30 +++++++----- .../act/db/meta/MasterEntityMetaInfoRepo.java | 4 +- .../java/act/plugin/PrincipalProvider.java | 20 ++++++++ 8 files changed, 161 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f27602b52..ad2edf467 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Support gradle/Java project structure #771 * Add `PrincipalProvider` mechanism #770 * Add annotation to mark creator/modifier of an entity #769 * `AppClassLoader` - return enhanced bytecode for `getResource` call #768 diff --git a/src/main/java/act/app/ProjectLayout.java b/src/main/java/act/app/ProjectLayout.java index 0eec36738..7ca25992c 100644 --- a/src/main/java/act/app/ProjectLayout.java +++ b/src/main/java/act/app/ProjectLayout.java @@ -128,6 +128,53 @@ public File target(File appBase) { }, + GRADLE_JAVA() { + @Override + public File source(File appBase) { + return file(appBase, "src/main/java"); + } + + @Override + public File testSource(File appBase) { + return file(appBase, "src/test/java"); + } + + @Override + public File resource(File appBase) { + String resources = Act.isDev() ? "src/main/resources" : "classes"; + return file(appBase, resources); + } + + @Override + public File testResource(File appBase) { + String resources = Act.isDev() ? "src/test/resources" : "test-classes"; + return file(appBase, resources); + } + + @Override + public File lib(File appBase) { + String lib = Act.isDev() ? "src/main/lib" : "lib"; + return file(appBase, lib); + } + + @Override + public File testLib(File appBase) { + String lib = Act.isDev() ? "src/test/lib" : "test-lib"; + return file(appBase, lib); + } + + @Override + public String classes() { + return RuntimeDirs.CLASSES; + } + + @Override + public File target(File appBase) { + return file(appBase, "out/production"); + } + + }, + GRADLE_GROOVY() { @Override public File source(File appBase) { diff --git a/src/main/java/act/db/meta/EntityClassMetaInfo.java b/src/main/java/act/db/meta/EntityClassMetaInfo.java index 420fa783b..490efd7a7 100644 --- a/src/main/java/act/db/meta/EntityClassMetaInfo.java +++ b/src/main/java/act/db/meta/EntityClassMetaInfo.java @@ -26,9 +26,7 @@ import org.osgl.util.E; import org.osgl.util.S; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; +import java.util.*; /** * Keep track meta information about an entity class @@ -41,6 +39,8 @@ public class EntityClassMetaInfo { private EntityFieldMetaInfo idField; private EntityFieldMetaInfo createdAtField; private EntityFieldMetaInfo lastModifiedAtField; + private EntityFieldMetaInfo createdByField; + private EntityFieldMetaInfo lastModifiedByField; private Map fields = new HashMap<>(); public String className() { @@ -72,10 +72,18 @@ public EntityFieldMetaInfo createdAtField() { return createdAtField; } + public EntityFieldMetaInfo createdByField() { + return createdByField; + } + public EntityFieldMetaInfo lastModifiedAtField() { return lastModifiedAtField; } + public EntityFieldMetaInfo lastModifiedByField() { + return lastModifiedByField; + } + public EntityFieldMetaInfo idField() { return idField; } @@ -135,11 +143,21 @@ void createdAtField(EntityFieldMetaInfo fieldInfo) { this.createdAtField = $.requireNotNull(fieldInfo); } + void createdByField(EntityFieldMetaInfo fieldInfo) { + E.illegalStateIf(null != createdByField, "createdBy field already set"); + this.createdByField = $.requireNotNull(fieldInfo); + } + void lastModifiedAtField(EntityFieldMetaInfo fieldInfo) { E.illegalArgumentIf(null != lastModifiedAtField, "lastModifiedAt field already set"); this.lastModifiedAtField = $.requireNotNull(fieldInfo); } + void lastModifiedByField(EntityFieldMetaInfo fieldInfo) { + E.illegalArgumentIf(null != lastModifiedByField, "lastModifiedBy field already set"); + this.lastModifiedByField = $.requireNotNull(fieldInfo); + } + void idField(EntityFieldMetaInfo fieldInfo) { E.illegalArgumentIf(null != idField, "ID field already set"); this.idField = $.requireNotNull(fieldInfo); @@ -148,15 +166,21 @@ void idField(EntityFieldMetaInfo fieldInfo) { private void mergeFrom(ClassNode parent, EntityMetaInfoRepo repo) { EntityClassMetaInfo parentInfo = repo.classMetaInfo(parent.name()); if (null != parentInfo) { - if (null != idField) { + if (null == idField) { idField = parentInfo.idField; } - if (null != createdAtField) { + if (null == createdAtField) { createdAtField = parentInfo.createdAtField; } - if (null != lastModifiedAtField) { + if (null == lastModifiedAtField) { lastModifiedAtField = parentInfo.lastModifiedAtField; } + if (null == createdByField) { + createdByField = parentInfo.createdByField; + } + if (null == lastModifiedByField) { + lastModifiedByField = parentInfo.lastModifiedByField; + } for (Map.Entry entry : parentInfo.fields.entrySet()) { if (!fields.containsKey(entry.getKey())) { fields.put(entry.getKey(), entry.getValue()); diff --git a/src/main/java/act/db/meta/EntityFieldMetaInfo.java b/src/main/java/act/db/meta/EntityFieldMetaInfo.java index b9e4bfb54..31c3ecbb4 100644 --- a/src/main/java/act/db/meta/EntityFieldMetaInfo.java +++ b/src/main/java/act/db/meta/EntityFieldMetaInfo.java @@ -31,7 +31,11 @@ public class EntityFieldMetaInfo { enum Trait { - CREATED, LAST_MODIFIED, ID + ID, + CREATED_AT, + CREATED_BY, + LAST_MODIFIED_AT, + LAST_MODIFIED_BY } private Trait trait; @@ -50,23 +54,35 @@ public Trait trait() { public void trait(Trait trait) { this.trait = $.requireNotNull(trait); - if (Trait.CREATED == trait) { + if (Trait.CREATED_AT == trait) { classInfo.createdAtField(this); - } else if (Trait.LAST_MODIFIED == trait) { + } else if (Trait.LAST_MODIFIED_AT == trait) { classInfo.lastModifiedAtField(this); } else if (Trait.ID == trait) { classInfo.idField(this); + } else if (Trait.CREATED_BY == trait) { + classInfo.createdByField(this); + } else if (Trait.LAST_MODIFIED_BY == trait) { + classInfo.lastModifiedByField(this); } else { throw E.unexpected("oops"); } } public boolean isCreatedAt() { - return Trait.CREATED == trait; + return Trait.CREATED_AT == trait; } public boolean isLastModifiedAt() { - return Trait.LAST_MODIFIED == trait; + return Trait.LAST_MODIFIED_AT == trait; + } + + public boolean isCreatedBy() { + return Trait.CREATED_BY == trait; + } + + public boolean isLastModifiedBy() { + return Trait.LAST_MODIFIED_BY == trait; } public String className() { diff --git a/src/main/java/act/db/meta/EntityInfoByteCodeScanner.java b/src/main/java/act/db/meta/EntityInfoByteCodeScanner.java index e5c37dfec..459864f7f 100644 --- a/src/main/java/act/db/meta/EntityInfoByteCodeScanner.java +++ b/src/main/java/act/db/meta/EntityInfoByteCodeScanner.java @@ -21,12 +21,8 @@ */ import act.app.AppByteCodeScannerBase; -import act.asm.AnnotationVisitor; -import act.asm.ClassVisitor; -import act.asm.FieldVisitor; -import act.asm.Type; -import act.db.CreatedAt; -import act.db.LastModifiedAt; +import act.asm.*; +import act.db.*; import act.util.ByteCodeVisitor; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; @@ -46,6 +42,8 @@ public class EntityInfoByteCodeScanner extends AppByteCodeScannerBase { private static final String DESC_CREATED_AT = Type.getDescriptor(CreatedAt.class); private static final String DESC_LAST_MODIFIED_AT = Type.getDescriptor(LastModifiedAt.class); + private static final String DESC_CREATED_BY = Type.getDescriptor(CreatedBy.class); + private static final String DESC_LAST_MODIFIED_BY = Type.getDescriptor(LastModifiedBy.class); private static final String DESC_ID = Type.getDescriptor(Id.class); private static final String DESC_COLUMN = Type.getDescriptor(Column.class); @@ -77,7 +75,9 @@ private class _ByteCodeVisitor extends ByteCodeVisitor { boolean isEntityListener; String className; boolean foundCreatedAt; + boolean foundCreatedBy; boolean foundLastModifiedAt; + boolean foundLastModifiedBy; boolean foundId; MasterEntityMetaInfoRepo metaInfoRepo; @@ -142,14 +142,14 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { if (foundCreatedAt) { LOGGER.warn("multiple @CreatedAt field found in class: " + className); } else { - repo.registerCreatedField(className, fieldName); + repo.registerCreatedAtField(className, fieldName); } foundCreatedAt = true; } else if (S.eq(DESC_LAST_MODIFIED_AT, desc)) { if (foundLastModifiedAt) { LOGGER.warn("multiple @LastModifiedAt field found in class: " + className); } else { - repo.registerLastModifiedField(className, fieldName); + repo.registerLastModifiedAtField(className, fieldName); } foundLastModifiedAt = true; } else if (S.eq(DESC_ID, desc)) { @@ -159,6 +159,20 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { repo.registerIdField(className, fieldName); } foundId = true; + } else if (S.eq(DESC_CREATED_BY, desc)) { + if (foundCreatedBy) { + LOGGER.warn("multiple @CreatedBy field found in class: " + className); + } else { + repo.registerCreatedByField(className, fieldName); + } + foundCreatedBy = true; + } else if (S.eq(DESC_LAST_MODIFIED_BY, desc)) { + if (foundLastModifiedBy) { + LOGGER.warn("multiple @LastModifiedBy field found in class: " + className); + } else { + repo.registerLastModifiedByField(className, fieldName); + } + foundLastModifiedBy = true; } else if (null != columnName && S.eq(DESC_COLUMN, desc)) { return new AnnotationVisitor(ASM5, av) { @Override diff --git a/src/main/java/act/db/meta/EntityMetaInfoRepo.java b/src/main/java/act/db/meta/EntityMetaInfoRepo.java index 6dfcfdaf0..127073148 100644 --- a/src/main/java/act/db/meta/EntityMetaInfoRepo.java +++ b/src/main/java/act/db/meta/EntityMetaInfoRepo.java @@ -20,20 +20,16 @@ * #L% */ +import static act.db.meta.EntityFieldMetaInfo.Trait.*; + import act.app.App; import act.app.AppServiceBase; -import act.db.CreatedAt; -import act.db.DB; -import act.db.LastModifiedAt; +import act.db.*; import act.util.Stateless; import org.osgl.inject.NamedProvider; +import java.util.*; import javax.inject.Inject; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import static act.db.meta.EntityFieldMetaInfo.Trait.*; /** * Stores meta information about entity classes. At the moment there @@ -83,14 +79,24 @@ public void markEntityListenersFound(String className) { info.foundEntityListenersAnnotation(); } - public void registerCreatedField(String className, String fieldName) { + public void registerCreatedAtField(String className, String fieldName) { + EntityClassMetaInfo info = getOrCreate(className); + info.getOrCreateFieldInfo(fieldName).trait(CREATED_AT); + } + + public void registerLastModifiedAtField(String className, String fieldName) { + EntityClassMetaInfo info = getOrCreate(className); + info.getOrCreateFieldInfo(fieldName).trait(LAST_MODIFIED_AT); + } + + public void registerCreatedByField(String className, String fieldName) { EntityClassMetaInfo info = getOrCreate(className); - info.getOrCreateFieldInfo(fieldName).trait(CREATED); + info.getOrCreateFieldInfo(fieldName).trait(CREATED_BY); } - public void registerLastModifiedField(String className, String fieldName) { + public void registerLastModifiedByField(String className, String fieldName) { EntityClassMetaInfo info = getOrCreate(className); - info.getOrCreateFieldInfo(fieldName).trait(LAST_MODIFIED); + info.getOrCreateFieldInfo(fieldName).trait(LAST_MODIFIED_BY); } public void registerIdField(String className, String fieldName) { diff --git a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java index 9991ebfb4..eeca48a2d 100644 --- a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java +++ b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java @@ -73,12 +73,12 @@ public void markEntityListenersFound(String className) { } @Override - public void registerCreatedField(String className, String fieldName) { + public void registerCreatedAtField(String className, String fieldName) { E.unsupport(); } @Override - public void registerLastModifiedField(String className, String fieldName) { + public void registerLastModifiedAtField(String className, String fieldName) { E.unsupport(); } diff --git a/src/main/java/act/plugin/PrincipalProvider.java b/src/main/java/act/plugin/PrincipalProvider.java index 59dd55710..1d51b8c7b 100644 --- a/src/main/java/act/plugin/PrincipalProvider.java +++ b/src/main/java/act/plugin/PrincipalProvider.java @@ -1,5 +1,25 @@ package act.plugin; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.app.ActionContext; import javax.inject.Provider; From d8c77d645472a4620a0e71b96d61b5fc8d74a573 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 6 Aug 2018 05:56:13 +1000 Subject: [PATCH 044/730] #769 - support parsing bytecode for new auditing annotations --- src/main/java/act/db/meta/EntityMetaInfoRepo.java | 10 ++++++++++ src/main/java/act/util/ClassFinderByteCodeScanner.java | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/act/db/meta/EntityMetaInfoRepo.java b/src/main/java/act/db/meta/EntityMetaInfoRepo.java index 127073148..adcc67a1e 100644 --- a/src/main/java/act/db/meta/EntityMetaInfoRepo.java +++ b/src/main/java/act/db/meta/EntityMetaInfoRepo.java @@ -60,6 +60,8 @@ public EntityMetaInfoRepo get(String s) { Map lookup = new HashMap<>(); Map lookup2 = new HashMap<>(); + // for JPA converter discovery + private Set converters = new HashSet<>(); EntityMetaInfoRepo(final App app) { super(app); @@ -109,6 +111,10 @@ public void registerColumnName(String className, String fieldName, String column info.getOrCreateFieldInfo(fieldName).columnName(columnName); } + public void registerConverter(Class converterClass) { + converters.add(converterClass); + } + public boolean isRegistered(String className) { return lookup.containsKey(className); } @@ -117,6 +123,10 @@ public Set entityClasses() { return lookup2.keySet(); } + public Set converterClasses() { + return converters; + } + public EntityClassMetaInfo classMetaInfo(Class entityClass) { return lookup2.get(entityClass); } diff --git a/src/main/java/act/util/ClassFinderByteCodeScanner.java b/src/main/java/act/util/ClassFinderByteCodeScanner.java index e3bcbe2cd..b46a1aa3e 100644 --- a/src/main/java/act/util/ClassFinderByteCodeScanner.java +++ b/src/main/java/act/util/ClassFinderByteCodeScanner.java @@ -71,7 +71,7 @@ public MethodVisitor visitMethod(int access, String name, final String methodDes } final String methodName = name; final boolean isStatic = AsmTypes.isStatic(access); - final boolean paramIsInstance = null == signature; + final boolean paramIsInstance = null == signature && !"(Ljava/lang/Class;)V".equals(methodDesc); return new MethodVisitor(ASM5, mv) { @Override public AnnotationVisitor visitAnnotation(final String desc, boolean visible) { From 290f3f13823be9405c0417e67545aa3c99d1e1f6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 8 Aug 2018 07:13:38 +1000 Subject: [PATCH 045/730] fix #772, #773 and #774 --- CHANGELOG.md | 3 ++ src/main/java/act/crypto/AppCrypto.java | 15 ++++++ src/main/java/act/job/JobManager.java | 2 +- src/main/java/act/job/JobTrigger.java | 12 ++--- .../java/act/validation/PasswordSpec.java | 3 ++ src/main/java/act/view/ViewManager.java | 50 ++++++++++++++++--- 6 files changed, 69 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad2edf467..e48781901 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.8.8** +* Support simplified mail template path #774 +* `PasswordSpec` - allow `null` value for password validation #773 +* `@InvokeAfter` does not work #772 * Support gradle/Java project structure #771 * Add `PrincipalProvider` mechanism #770 * Add annotation to mark creator/modifier of an entity #769 diff --git a/src/main/java/act/crypto/AppCrypto.java b/src/main/java/act/crypto/AppCrypto.java index 097c09cdd..276a72523 100644 --- a/src/main/java/act/crypto/AppCrypto.java +++ b/src/main/java/act/crypto/AppCrypto.java @@ -67,6 +67,9 @@ public String sign(String message) { * @return the password hash */ public char[] passwordHash(char[] password) { + if (null == password) { + return null; + } return BCrypt.hashpw(password, BCrypt.gensalt()); } @@ -76,10 +79,16 @@ public char[] passwordHash(char[] password) { * @return the password hash */ public String passwordHash(String password) { + if (null == password) { + return null; + } return BCrypt.hashpw(password, BCrypt.gensalt()); } public boolean verifyPassword(String password, String hash) { + if (null == password) { + return false; + } try { return BCrypt.checkpw(password, hash); } catch (Exception e) { @@ -88,6 +97,9 @@ public boolean verifyPassword(String password, String hash) { } public boolean verifyPassword(char[] password, String hash) { + if (null == password) { + return false; + } try { return BCrypt.checkpw(password, hash); } catch (Exception e) { @@ -96,6 +108,9 @@ public boolean verifyPassword(char[] password, String hash) { } public boolean verifyPassword(char[] password, char[] hash) { + if (null == password) { + return false; + } try { return BCrypt.checkpw(password, new String(hash)); } catch (Exception e) { diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index dfc81f58a..7110ddfd2 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -367,7 +367,7 @@ Job jobById(String id, boolean warn) { return new Job(id, Act.jobManager()); } if (warn) { - Act.LOGGER.warn("cannot find job by id: %s", id); + LOGGER.warn("cannot find job by id: %s", id); } } return job; diff --git a/src/main/java/act/job/JobTrigger.java b/src/main/java/act/job/JobTrigger.java index 01faa3fd6..dc5fcd71b 100644 --- a/src/main/java/act/job/JobTrigger.java +++ b/src/main/java/act/job/JobTrigger.java @@ -383,16 +383,12 @@ private abstract static class _AssociatedTo extends JobTrigger { @Override void schedule(JobManager manager, Job job) { traceSchedule(job); - if (null == targetId) { + Job associateTarget = manager.jobById(targetId, false); + if (null == associateTarget) { LOGGER.warn("Failed to register job because target job not found: %s. Will try again after app started", targetId); scheduleDelayedRegister(manager, job); } else { - Job associateTarget = manager.jobById(targetId); - if (null == associateTarget) { - LOGGER.warn("Cannot find associated job: %s", targetId); - } else { - associate(job, associateTarget); - } + associate(job, associateTarget); } } @@ -401,7 +397,7 @@ private void scheduleDelayedRegister(final JobManager manager, final Job job) { before(START).register(new Job(id, manager, new $.F0() { @Override public Void apply() throws NotAppliedException, $.Break { - Job associateTo = manager.jobById(id); + Job associateTo = manager.jobById(targetId); if (null == associateTo) { LOGGER.warn("Cannot find associated job: %s", id); } else { diff --git a/src/main/java/act/validation/PasswordSpec.java b/src/main/java/act/validation/PasswordSpec.java index 84056bc9d..a881ab021 100644 --- a/src/main/java/act/validation/PasswordSpec.java +++ b/src/main/java/act/validation/PasswordSpec.java @@ -143,6 +143,9 @@ public String toString() { @Override public boolean isValid(char[] password) { + if (null == password) { + return true; + } int len = password.length; if (len < minLength() || len > maxLength()) { return false; diff --git a/src/main/java/act/view/ViewManager.java b/src/main/java/act/view/ViewManager.java index 7ee2d3785..da2a7b054 100644 --- a/src/main/java/act/view/ViewManager.java +++ b/src/main/java/act/view/ViewManager.java @@ -20,21 +20,20 @@ * #L% */ +import static act.Destroyable.Util.tryDestroyAll; + import act.Act; import act.app.App; import act.conf.AppConfig; +import act.mail.MailerContext; import act.util.ActContext; import act.util.DestroyableBase; import org.osgl.$; import org.osgl.exception.UnexpectedException; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.util.*; -import javax.enterprise.context.ApplicationScoped; import java.util.*; - -import static act.Destroyable.Util.tryDestroyAll; +import javax.enterprise.context.ApplicationScoped; /** * Manage different view solutions @@ -47,6 +46,7 @@ public class ViewManager extends DestroyableBase { private Map appDefined = new HashMap<>(); private Map templateCache = new HashMap<>(); private boolean multiViews = false; + private Keyword.Style mailTemplateNamingStyle = Keyword.Style.CAMEL_CASE; void register(View view) { E.NPE(view); @@ -125,6 +125,41 @@ public Template load(ActContext context) { TemplatePathResolver resolver = config.templatePathResolver(); String path = resolver.resolve(context); + if (context instanceof MailerContext) { + String fileName = path.contains("/") ? S.cut(path).afterLast("/") : path; + String mailTemplatePath = S.concat("mail/", fileName); + template = getTemplate(context, config, mailTemplatePath); + if (null == template) { + // try template file name variations - without prefix `send` + fileName = fileName.substring(4); + S.Pair pair = S.binarySplit(fileName, '.'); + fileName = pair.left(); + String suffix = "." + pair.right(); + Keyword keyword = Keyword.of(fileName); + String variation = mailTemplateNamingStyle.toString(keyword); + mailTemplatePath = S.concat("mail/", variation, suffix); + template = getTemplate(context, config, mailTemplatePath); + if (null == template) { + for (Keyword.Style style : Keyword.Style.values()) { + if (mailTemplateNamingStyle == style) { + continue; + } + mailTemplateNamingStyle = style; + variation = mailTemplateNamingStyle.toString(keyword); + mailTemplatePath = S.concat("mail/", variation, suffix); + template = getTemplate(context, config, mailTemplatePath); + if (null != template) { + break; + } + } + } + } + if (null != template) { + context.templatePath(mailTemplatePath); + return template; + } + } + template = getTemplate(context, config, path); if (null == template) { String amendedPath = resolver.resolveWithContextMethodPath(context); @@ -275,7 +310,8 @@ private void cache(String key, Template template) { * ** dot "." * ** dollar: "$" * - * @param string the string to be tested + * @param string + * the string to be tested * @return `true` if the string literal is template content or `false` otherwise */ public static boolean isTemplatePath(String string) { From 3b25e926da4bbc1169c49028a4412c1bc99c178d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 8 Aug 2018 21:13:46 +1000 Subject: [PATCH 046/730] fix #776 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 19 +++++++------------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e48781901..fad73aa1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Upload always failed after the first time #776 * Support simplified mail template path #774 * `PasswordSpec` - allow `null` value for password validation #773 * `@InvokeAfter` does not work #772 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 9adfeb90a..d0f13cacc 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -23,10 +23,7 @@ import static act.controller.Controller.Util.*; import static org.osgl.http.H.Header.Names.*; -import act.ActResponse; -import act.Destroyable; -import act.RequestImplBase; -import act.Trace; +import act.*; import act.conf.AppConfig; import act.controller.ResponseCache; import act.controller.captcha.CaptchaViolation; @@ -41,10 +38,7 @@ import act.route.UrlPath; import act.security.CORS; import act.session.SessionManager; -import act.util.ActContext; -import act.util.MissingAuthenticationHandler; -import act.util.PropertySpec; -import act.util.RedirectToLoginUrl; +import act.util.*; import act.view.RenderAny; import act.xio.undertow.UndertowRequest; import org.osgl.$; @@ -54,10 +48,7 @@ import org.osgl.logging.Logger; import org.osgl.mvc.result.Result; import org.osgl.storage.ISObject; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; -import org.osgl.util.Token; +import org.osgl.util.*; import org.osgl.web.util.UserAgent; import java.lang.annotation.Annotation; @@ -1100,11 +1091,15 @@ public void resolve() { } public void proceedWithHandler(RequestHandler handler) { + /** + * TODO: fix Dalian-Dong issue if (requireBodyParsing) { ((RequestImplBase) req()).receiveFullBytesAndProceed(this, handler); } else { handler.handle(this); } + */ + handler.handle(this); } @Override From e81f6ad982cc763920a55ed3aa76fc94aa9350d1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 9 Aug 2018 20:56:41 +1000 Subject: [PATCH 047/730] fix Merge act-e2e into act core framework #779 --- CHANGELOG.md | 1 + pom.xml | 7 +++ src/main/java/act/app/App.java | 11 ++-- src/main/java/act/mail/Mailer.java | 4 +- src/main/java/act/mail/MailerContext.java | 18 +++++- src/main/resources/aaa.authenticate.list | 4 +- src/main/resources/act.scan.list | 5 ++ src/test/java/act/e2e/util/E2ETestBase.java | 36 ++++++++++++ .../utils/SeparateClassloaderTestRunner.java | 56 +++++++++++++++++++ 9 files changed, 131 insertions(+), 11 deletions(-) create mode 100644 src/test/java/act/e2e/util/E2ETestBase.java create mode 100644 src/test/java/utils/SeparateClassloaderTestRunner.java diff --git a/CHANGELOG.md b/CHANGELOG.md index fad73aa1c..b00481cc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Merge act-e2e into act core framework #779 * Upload always failed after the first time #776 * Support simplified mail template path #774 * `PasswordSpec` - allow `null` value for password validation #773 diff --git a/pom.xml b/pom.xml index d5a75a5b9..2d4fd177c 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,7 @@ 2.14.3 1.0.0.Final 2.9.9 + 1.11.3 3.10.0 1.18.0-SNAPSHOT 1.5.0 @@ -211,6 +212,12 @@ ${jfiglet.version} + + org.jsoup + jsoup + ${jsoup.version} + + com.github.bingoohuang patchca diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 05edcd0d7..2fe955c67 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -72,10 +72,7 @@ import act.mail.bytecode.MailerByteCodeScanner; import act.meta.ClassMetaInfoBase; import act.meta.ClassMetaInfoManager; -import act.metric.Metric; -import act.metric.MetricContextScanner; -import act.metric.MetricMetaInfoRepo; -import act.metric.MetricProvider; +import act.metric.*; import act.plugin.PrincipalProvider; import act.route.RouteSource; import act.route.RouteTableRouterBuilder; @@ -208,6 +205,7 @@ public String toString() { private List hotReloadListeners = new ArrayList<>(); private PrincipalProvider principalProvider = PrincipalProvider.DefaultPrincipalProvider.INSTANCE; + // for unit test purpose private App() { this.version = Version.get(); this.appBase = new File("."); @@ -215,6 +213,11 @@ private App() { this.appHome = RuntimeDirs.home(this); this.config = new AppConfig<>().app(this); INST = this; + $.setFieldValue("metricPlugin", Act.class, new SimpleMetricPlugin()); + this.eventEmitted = new HashSet<>(); + this.eventBus = new EventBus(this); + this.jobManager = new JobManager(this); + this.classLoader = new AppClassLoader(this); this.sessionManager = new SessionManager(this.config, config().cacheService("logout-session")); this.dependencyInjector = new GenieInjector(this); this.singletonRegistry = new SingletonRegistry(this); diff --git a/src/main/java/act/mail/Mailer.java b/src/main/java/act/mail/Mailer.java index 5bf5b30e5..63772fce9 100644 --- a/src/main/java/act/mail/Mailer.java +++ b/src/main/java/act/mail/Mailer.java @@ -166,9 +166,7 @@ public static Future doSend(final MailerContext context) { if (S.notBlank(ctx.bcc)) { context.bcc(ctx.bcc); } - if (S.notBlank(ctx.subject)) { - context.subject(ctx.subject, ctx.subjectArgs); - } + context.subject(ctx.subject, ctx.subjectArgs); if (!ctx.attachments.isEmpty()) { context.attach(ctx.attachments); } diff --git a/src/main/java/act/mail/MailerContext.java b/src/main/java/act/mail/MailerContext.java index 3beaad0bd..6e68f281d 100644 --- a/src/main/java/act/mail/MailerContext.java +++ b/src/main/java/act/mail/MailerContext.java @@ -23,6 +23,7 @@ import act.Act; import act.app.ActionContext; import act.app.App; +import act.e2e.E2E; import act.event.ActEvent; import act.event.SystemEvent; import act.util.ActContext; @@ -35,9 +36,7 @@ import org.osgl.logging.Logger; import org.osgl.storage.ISObject; import org.osgl.storage.impl.SObject; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.util.*; import java.io.File; import java.util.*; @@ -197,11 +196,24 @@ public String subject() { } public MailerContext subject(String subject, Object ... args) { + String emailId = E2E.generateEmailId(); + if (null != emailId) { + emailId = "[e2e-" + emailId + "]"; + } + if (S.blank(subject)) { + if (null != emailId) { + this.subject = emailId; + } + return this; + } if (app().config().i18nEnabled()) { this.subject = i18n(subject, args); } else { this.subject = S.fmt(subject, args); } + if (null != emailId) { + this.subject = emailId + this.subject; + } return this; } diff --git a/src/main/resources/aaa.authenticate.list b/src/main/resources/aaa.authenticate.list index 190b5893c..c2a586b6a 100644 --- a/src/main/resources/aaa.authenticate.list +++ b/src/main/resources/aaa.authenticate.list @@ -1,8 +1,10 @@ -# By default waive authentication check on `act.Zen.` and `act.i18n.` +-act.e2e. -act.i18n.LocaleResolver -act.i18n.TimeZoneResolver -act.i18n.EnumService -act.Zen. + +# The following endpoints are only public on dev mode [dev]-act.apidoc. [dev]-act.Info [dev]-act.i18n. \ No newline at end of file diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 03f1c9576..41a5c6e77 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -7,6 +7,11 @@ act.app.conf.AppConfigPlugin act.controller.builtin.CliOverHttp act.controller.captcha.CaptchaService act.db.DbBind +act.e2e.E2E +act.e2e.ScenarioDebugHelper +act.e2e.ScenarioDebugHelper$LoadFixtures +act.e2e.ScenarioDebugHelper$ClearFixtures +act.e2e.func.SampleDataProviderAdaptor act.handler.builtin.controller.RequestHandlerProxy act.i18n.TimeZoneResolver act.i18n.LocaleResolver diff --git a/src/test/java/act/e2e/util/E2ETestBase.java b/src/test/java/act/e2e/util/E2ETestBase.java new file mode 100644 index 000000000..d1b9d082d --- /dev/null +++ b/src/test/java/act/e2e/util/E2ETestBase.java @@ -0,0 +1,36 @@ +package act.e2e.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.App; +import org.junit.Before; +import org.osgl.$; +import osgl.ut.TestBase; + +public class E2ETestBase extends TestBase { + + @Before + public void clearActMockup() { + $.setFieldValue("INST", App.class, null); + Thread.currentThread().setContextClassLoader(E2ETestBase.class.getClassLoader()); + } + +} diff --git a/src/test/java/utils/SeparateClassloaderTestRunner.java b/src/test/java/utils/SeparateClassloaderTestRunner.java new file mode 100644 index 000000000..a63196101 --- /dev/null +++ b/src/test/java/utils/SeparateClassloaderTestRunner.java @@ -0,0 +1,56 @@ +package utils; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.junit.runners.BlockJUnit4ClassRunner; +import org.junit.runners.model.InitializationError; + +import java.net.URLClassLoader; + +public class SeparateClassloaderTestRunner extends BlockJUnit4ClassRunner { + + public SeparateClassloaderTestRunner(Class clazz) throws InitializationError { + super(getFromTestClassloader(clazz)); + } + + private static Class getFromTestClassloader(Class clazz) throws InitializationError { + try { + ClassLoader testClassLoader = new TestClassLoader(); + return Class.forName(clazz.getName(), true, testClassLoader); + } catch (ClassNotFoundException e) { + throw new InitializationError(e); + } + } + + public static class TestClassLoader extends URLClassLoader { + public TestClassLoader() { + super(((URLClassLoader)getSystemClassLoader()).getURLs()); + } + + @Override + public Class loadClass(String name) throws ClassNotFoundException { + if (name.startsWith("e2e.") || name.startsWith("act.e2e.")) { + return super.findClass(name); + } + return super.loadClass(name); + } + } +} From 4d2d1e3e451a901fbf1dde7b1d46e733a3c3ca9d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 9 Aug 2018 20:56:52 +1000 Subject: [PATCH 048/730] fix Merge act-e2e into act core framework #779 --- src/main/java/act/e2e/AcceptType.java | 25 + src/main/java/act/e2e/E2E.java | 274 ++++++ src/main/java/act/e2e/E2EStart.java | 27 + src/main/java/act/e2e/E2EStatus.java | 37 + src/main/java/act/e2e/E2EStop.java | 27 + src/main/java/act/e2e/Interaction.java | 176 ++++ src/main/java/act/e2e/InteractionPart.java | 36 + src/main/java/act/e2e/RequestSpec.java | 155 ++++ src/main/java/act/e2e/ResponseSpec.java | 70 ++ src/main/java/act/e2e/Scenario.java | 873 ++++++++++++++++++ .../java/act/e2e/ScenarioDebugHelper.java | 104 +++ src/main/java/act/e2e/ScenarioPart.java | 34 + src/main/java/act/e2e/func/Func.java | 289 ++++++ .../e2e/func/SampleDataProviderAdaptor.java | 90 ++ src/main/java/act/e2e/macro/Macro.java | 132 +++ .../act/e2e/req_modifier/RequestModifier.java | 85 ++ src/main/java/act/e2e/util/CookieStore.java | 71 ++ src/main/java/act/e2e/util/ErrorMessage.java | 59 ++ src/main/java/act/e2e/util/JSONTraverser.java | 70 ++ src/main/java/act/e2e/util/NamedLogic.java | 180 ++++ .../java/act/e2e/util/NullDaoLocator.java | 31 + .../act/e2e/util/RequestTemplateManager.java | 129 +++ .../java/act/e2e/util/ScenarioComparator.java | 58 ++ .../java/act/e2e/util/ScenarioManager.java | 187 ++++ src/main/java/act/e2e/util/TxScope.java | 49 + .../java/act/e2e/util/TxScopeProvider.java | 49 + src/main/java/act/e2e/util/YamlLoader.java | 351 +++++++ src/main/java/act/e2e/verifier/After.java | 28 + src/main/java/act/e2e/verifier/Before.java | 28 + src/main/java/act/e2e/verifier/Compare.java | 83 ++ src/main/java/act/e2e/verifier/Contains.java | 51 + .../act/e2e/verifier/DateTimeVerifier.java | 126 +++ src/main/java/act/e2e/verifier/Ends.java | 39 + src/main/java/act/e2e/verifier/Eq.java | 39 + .../java/act/e2e/verifier/EqIgnoreCase.java | 39 + src/main/java/act/e2e/verifier/Exists.java | 51 + src/main/java/act/e2e/verifier/Gt.java | 37 + src/main/java/act/e2e/verifier/Gte.java | 37 + src/main/java/act/e2e/verifier/Lt.java | 38 + src/main/java/act/e2e/verifier/Lte.java | 37 + src/main/java/act/e2e/verifier/Starts.java | 39 + src/main/java/act/e2e/verifier/Verifier.java | 39 + src/main/resources/rythm/~e2e.html | 103 +++ .../act/e2e/controller/CourseService.java | 39 + src/test/java/act/e2e/model/Course.java | 35 + src/test/java/act/e2e/model/User.java | 40 + src/test/java/act/e2e/util/AssertTest.java | 40 + .../java/act/e2e/util/CompareTypeTest.java | 67 ++ src/test/java/act/e2e/util/ExistsTest.java | 65 ++ src/test/java/act/e2e/util/FuncTest.java | 179 ++++ .../java/act/e2e/util/JSONTraverserTest.java | 81 ++ .../e2e/util/RequestTemplateManagerTest.java | 44 + .../act/e2e/util/ScenarioManagerTest.java | 91 ++ .../java/act/e2e/util/YamlLoaderTest.java | 90 ++ src/test/resources/e2e/fixtures/init-data.yml | 27 + src/test/resources/e2e/requests.yml | 8 + src/test/resources/e2e/scenarios.yml | 82 ++ src/test/resources/e2e/scenarios/a.yml | 8 + src/test/resources/e2e/scenarios/b.yml | 11 + src/test/resources/e2e/scenarios/c.yml | 9 + 60 files changed, 5398 insertions(+) create mode 100644 src/main/java/act/e2e/AcceptType.java create mode 100644 src/main/java/act/e2e/E2E.java create mode 100644 src/main/java/act/e2e/E2EStart.java create mode 100644 src/main/java/act/e2e/E2EStatus.java create mode 100644 src/main/java/act/e2e/E2EStop.java create mode 100644 src/main/java/act/e2e/Interaction.java create mode 100644 src/main/java/act/e2e/InteractionPart.java create mode 100644 src/main/java/act/e2e/RequestSpec.java create mode 100644 src/main/java/act/e2e/ResponseSpec.java create mode 100644 src/main/java/act/e2e/Scenario.java create mode 100644 src/main/java/act/e2e/ScenarioDebugHelper.java create mode 100644 src/main/java/act/e2e/ScenarioPart.java create mode 100644 src/main/java/act/e2e/func/Func.java create mode 100644 src/main/java/act/e2e/func/SampleDataProviderAdaptor.java create mode 100644 src/main/java/act/e2e/macro/Macro.java create mode 100644 src/main/java/act/e2e/req_modifier/RequestModifier.java create mode 100644 src/main/java/act/e2e/util/CookieStore.java create mode 100644 src/main/java/act/e2e/util/ErrorMessage.java create mode 100644 src/main/java/act/e2e/util/JSONTraverser.java create mode 100644 src/main/java/act/e2e/util/NamedLogic.java create mode 100644 src/main/java/act/e2e/util/NullDaoLocator.java create mode 100644 src/main/java/act/e2e/util/RequestTemplateManager.java create mode 100644 src/main/java/act/e2e/util/ScenarioComparator.java create mode 100644 src/main/java/act/e2e/util/ScenarioManager.java create mode 100644 src/main/java/act/e2e/util/TxScope.java create mode 100644 src/main/java/act/e2e/util/TxScopeProvider.java create mode 100644 src/main/java/act/e2e/util/YamlLoader.java create mode 100644 src/main/java/act/e2e/verifier/After.java create mode 100644 src/main/java/act/e2e/verifier/Before.java create mode 100644 src/main/java/act/e2e/verifier/Compare.java create mode 100644 src/main/java/act/e2e/verifier/Contains.java create mode 100644 src/main/java/act/e2e/verifier/DateTimeVerifier.java create mode 100644 src/main/java/act/e2e/verifier/Ends.java create mode 100644 src/main/java/act/e2e/verifier/Eq.java create mode 100644 src/main/java/act/e2e/verifier/EqIgnoreCase.java create mode 100644 src/main/java/act/e2e/verifier/Exists.java create mode 100644 src/main/java/act/e2e/verifier/Gt.java create mode 100644 src/main/java/act/e2e/verifier/Gte.java create mode 100644 src/main/java/act/e2e/verifier/Lt.java create mode 100644 src/main/java/act/e2e/verifier/Lte.java create mode 100644 src/main/java/act/e2e/verifier/Starts.java create mode 100644 src/main/java/act/e2e/verifier/Verifier.java create mode 100644 src/main/resources/rythm/~e2e.html create mode 100644 src/test/java/act/e2e/controller/CourseService.java create mode 100644 src/test/java/act/e2e/model/Course.java create mode 100644 src/test/java/act/e2e/model/User.java create mode 100644 src/test/java/act/e2e/util/AssertTest.java create mode 100644 src/test/java/act/e2e/util/CompareTypeTest.java create mode 100644 src/test/java/act/e2e/util/ExistsTest.java create mode 100644 src/test/java/act/e2e/util/FuncTest.java create mode 100644 src/test/java/act/e2e/util/JSONTraverserTest.java create mode 100644 src/test/java/act/e2e/util/RequestTemplateManagerTest.java create mode 100644 src/test/java/act/e2e/util/ScenarioManagerTest.java create mode 100644 src/test/java/act/e2e/util/YamlLoaderTest.java create mode 100644 src/test/resources/e2e/fixtures/init-data.yml create mode 100644 src/test/resources/e2e/requests.yml create mode 100644 src/test/resources/e2e/scenarios.yml create mode 100644 src/test/resources/e2e/scenarios/a.yml create mode 100644 src/test/resources/e2e/scenarios/b.yml create mode 100644 src/test/resources/e2e/scenarios/c.yml diff --git a/src/main/java/act/e2e/AcceptType.java b/src/main/java/act/e2e/AcceptType.java new file mode 100644 index 000000000..082530114 --- /dev/null +++ b/src/main/java/act/e2e/AcceptType.java @@ -0,0 +1,25 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +public enum AcceptType { + HTML, JSON, CSV, XLSX, XLS +} diff --git a/src/main/java/act/e2e/E2E.java b/src/main/java/act/e2e/E2E.java new file mode 100644 index 000000000..9afe9d1b2 --- /dev/null +++ b/src/main/java/act/e2e/E2E.java @@ -0,0 +1,274 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.App; +import act.app.DbServiceManager; +import act.db.Dao; +import act.db.DbService; +import act.e2e.func.Func; +import act.e2e.macro.Macro; +import act.e2e.req_modifier.RequestModifier; +import act.e2e.util.*; +import act.e2e.verifier.Verifier; +import act.event.EventBus; +import act.job.OnAppStart; +import act.sys.Env; +import act.util.LogSupport; +import org.osgl.$; +import org.osgl.logging.LogManager; +import org.osgl.logging.Logger; +import org.osgl.mvc.annotation.DeleteAction; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.*; + +import java.net.URL; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import javax.inject.Inject; + +@Env.RequireMode(Act.Mode.DEV) +public class E2E extends LogSupport { + + static final Logger LOGGER = LogManager.get(E2E.class); + + private static final AtomicBoolean STARTED = new AtomicBoolean(false); + + /** + * keep the ID of the email been sent last time when E2E is in progress + */ + private static String lastEmailId; + + public static class ConstantPool { + private static Map pool = new HashMap<>(); + static { + load(); + } + private static void load() { + URL url = Act.getResource("e2e/constants.properties"); + if (null != url) { + Properties p = IO.loadProperties(url); + for (Map.Entry entry : p.entrySet()) { + String key = S.string(entry.getKey()); + key = S.underscore(key); + pool.put(key, S.string(entry.getValue())); + } + } + } + public static String get(String name) { + return pool.get(S.underscore(name)); + } + } + + @Inject + private DbServiceManager dbServiceManager; + + @Inject + private YamlLoader yamlLoader; + + /** + * Load fixture data for testing. + * + * Requested by e2e executor and executed on test host to + * setup testing data + */ + @PostAction("e2e/fixtures") + public void loadFixtures(List fixtures) { + for (String fixture : fixtures) { + yamlLoader.loadFixture(fixture, dbServiceManager); + } + } + + /** + * Clear fixture data. + * + * Requested by e2e executor and executed on test host to + * setup testing data + */ + @DeleteAction("e2e/fixtures") + public void clearFixtures() { + List toBeDeleted = new ArrayList<>(); + for (DbService svc : dbServiceManager.registeredServices()) { + for (Class entityClass : svc.entityClasses()) { + try { + toBeDeleted.add(dbServiceManager.dao(entityClass)); + } catch (IllegalArgumentException e) { + if (e.getMessage().contains("Cannot find out Dao for model type")) { + // ignore - must be caused by MappedSuperClass + logger.debug(e, "error getting dao for %s", entityClass); + continue; + } + } + } + } + /* + * The following logic is to deal with the case where two + * models have relationship, and the one that is not the owner + * has been called to delete first, in which case it will + * fail because reference exists in other table(s). so + * we want to ignore that case and keep removing other tables. + * Hopefully when the owner model get removed eventually and + * back to the previous model, it will be good to go. + */ + int count = 1000; + while (!toBeDeleted.isEmpty() && count-- > 0) { + List list = new ArrayList<>(toBeDeleted); + for (Dao dao : list) { + try { + TxScope.enter(); + dao.drop(); + try { + TxScope.commit(); + } catch (Exception e) { + continue; + } + toBeDeleted.remove(dao); + } catch (Exception e) { + // ignore and try next dao + } finally { + TxScope.clear(); + } + } + } + } + + // wait 1 seconds to allow app setup the network + @OnAppStart(delayInSeconds = 1) + public void run(App app) { + boolean run = $.bool(app.config().get("e2e.run")) || "e2e".equalsIgnoreCase(Act.profile()); + if (run) { + run(app, true); + } + } + + public List run(App app, boolean shutdownApp) { + E.illegalStateIf(inProgress()); + info("Start running E2E test scenarios\n"); + int exitCode = 0; + EventBus eventBus = app.eventBus(); + STARTED.set(true); + try { + eventBus.trigger(E2EStart.INSTANCE); + app.captchaManager().disable(); + registerTypeConverters(); + RequestTemplateManager requestTemplateManager = new RequestTemplateManager(); + requestTemplateManager.load(); + final ScenarioManager scenarioManager = new ScenarioManager(); + Map scenarios = scenarioManager.load(); + if (scenarios.isEmpty()) { + LOGGER.warn("No scenario defined."); + } else { + C.List list = C.list(scenarios.values()).sorted(new ScenarioComparator(scenarioManager)); + for (Scenario scenario : list) { + try { + scenario.start(scenarioManager, requestTemplateManager); + } catch (Exception e) { + scenario.errorMessage = e.getMessage(); + scenario.cause = e.getCause(); + scenario.status = E2EStatus.FAIL; + } + } + } + List list = new ArrayList<>(); + for (Scenario scenario : scenarios.values()) { + addToList(scenario, list, scenarioManager); + } + if (shutdownApp) { + for (Scenario scenario : list) { + if (!scenario.status.pass()) { + exitCode = -1; + } + output(scenario); + } + } + return list; + } catch (Exception e) { + exitCode = -1; + throw e; + } finally { + STARTED.set(false); + if (shutdownApp) { + app.shutdown(exitCode); + } else { + app.captchaManager().enable(); + } + eventBus.trigger(E2EStop.INSTANCE); + } + } + + private void output(Scenario scenario) { + printBanner(scenario); + printInteractions(scenario); + printFooter(); + } + + private void printBanner(Scenario scenario) { + printDoubleDashedLine(); + info(scenario.title()); + printDashedLine(); + } + + private void printInteractions(Scenario scenario) { + for (Interaction interaction : scenario.interactions) { + String msg = S.concat("[", interaction.status, "]", interaction.description); + info(msg); + } + } + + private void printFooter() { + println(); + } + + public static String constant(String name) { + return ConstantPool.get(name); + } + + public static void registerTypeConverters() { + Verifier.registerTypeConverters(); + Macro.registerTypeConverters(); + RequestModifier.registerTypeConverters(); + Func.registerTypeConverters(); + } + + public static boolean inProgress() { + return STARTED.get(); + } + + public static String generateEmailId() { + if (!E2E.inProgress()) { + return null; + } + lastEmailId = S.random(8); + return lastEmailId; + } + + private static void addToList(Scenario scenario, List list, ScenarioManager manager) { + for (String s : scenario.depends) { + Scenario dep = manager.get(s); + addToList(dep, list, manager); + } + if (!list.contains(scenario)) { + list.add(scenario); + } + } + +} diff --git a/src/main/java/act/e2e/E2EStart.java b/src/main/java/act/e2e/E2EStart.java new file mode 100644 index 000000000..a98ed5edb --- /dev/null +++ b/src/main/java/act/e2e/E2EStart.java @@ -0,0 +1,27 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.event.ActEvent; + +public class E2EStart extends ActEvent { + public static final E2EStart INSTANCE = new E2EStart(); +} diff --git a/src/main/java/act/e2e/E2EStatus.java b/src/main/java/act/e2e/E2EStatus.java new file mode 100644 index 000000000..f565c7e75 --- /dev/null +++ b/src/main/java/act/e2e/E2EStatus.java @@ -0,0 +1,37 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +public enum E2EStatus { + PENDING, PASS, FAIL; + + public static E2EStatus of(boolean result) { + return result ? PASS : FAIL; + } + + public boolean finished() { + return PENDING != this; + } + + public boolean pass() { + return PASS == this; + } +} diff --git a/src/main/java/act/e2e/E2EStop.java b/src/main/java/act/e2e/E2EStop.java new file mode 100644 index 000000000..5b43b7155 --- /dev/null +++ b/src/main/java/act/e2e/E2EStop.java @@ -0,0 +1,27 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.event.ActEvent; + +public class E2EStop extends ActEvent { + public static final E2EStop INSTANCE = new E2EStop(); +} diff --git a/src/main/java/act/e2e/Interaction.java b/src/main/java/act/e2e/Interaction.java new file mode 100644 index 000000000..c7be6b2f6 --- /dev/null +++ b/src/main/java/act/e2e/Interaction.java @@ -0,0 +1,176 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static act.e2e.E2EStatus.PENDING; +import static act.e2e.util.ErrorMessage.error; + +import act.e2e.macro.Macro; +import okhttp3.Response; +import org.osgl.exception.UnexpectedException; +import org.osgl.http.H; +import org.osgl.util.E; +import org.osgl.util.IO; +import org.osgl.util.S; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Interaction implements ScenarioPart { + public List preActions = new ArrayList<>(); + public String description; + public RequestSpec request; + public ResponseSpec response; + public List postActions = new ArrayList<>(); + public Map cache = new HashMap<>(); + public String errorMessage; + public Throwable cause; + public E2EStatus status = PENDING; + + @Override + public void validate(Scenario scenario) throws UnexpectedException { + E.unexpectedIf(S.blank(description), "no description in the interaction of [%s]", scenario); + E.unexpectedIf(null == request, "request spec not specified in interaction[%s]", this); + //E.unexpectedIf(null == response, "response spec not specified"); + scenario.resolveRequest(request); + request.validate(this); + if (null != response) { + response.validate(this); + } + reset(); + } + + @Override + public String toString() { + return description; + } + + public boolean run() { + boolean pass = run(preActions) && verify() && run(postActions); + status = E2EStatus.of(pass); + return pass; + } + public String causeStackTrace() { + return null == cause ? null: E.stackTrace(cause); + } + + private void reset() { + errorMessage = null; + cause = null; + } + + private boolean verify() { + Response resp = null; + try { + resp = Scenario.get().sendRequest(request); + doVerify(resp); + return true; + } catch (Exception e) { + errorMessage = e.getMessage(); + if (null == errorMessage) { + errorMessage = e.getClass().getName(); + } + cause = causeOf(e); + return false; + } finally { + IO.close(resp); + } + } + + private void doVerify(Response resp) throws Exception { + verifyStatus(resp); + verifyHeaders(resp); + verifyBody(resp); + } + + private boolean run(List macros) { + for (Macro macro : macros) { + boolean okay = run(macro); + if (!okay) { + return false; + } + } + return true; + } + + private boolean run(Macro macro) { + try { + macro.run(Scenario.get()); + return true; + } catch (Exception e) { + errorMessage = e.getMessage(); + if (null == errorMessage) { + errorMessage = e.getClass().getName(); + } + cause = causeOf(e); + return false; + } + } + + private void verifyStatus(Response resp) { + H.Status expected = expectedStatus(); + if (null == expected) { + if (!resp.isSuccessful()) { + error("Status verification failure. Expected: successful, Found: " + resp.code()); + } + } else { + if (expected.code() != resp.code()) { + error("Status verification failure. Expected: %s, Found: %s", expected.code(), resp.code()); + } + } + } + + private void verifyHeaders(Response resp) { + if (null == response) { + return; + } + for (Map.Entry entry : response.headers.entrySet()) { + String headerName = entry.getKey(); + String headerVal = resp.header(headerName); + try { + Scenario.get().verifyValue(headerName, headerVal, entry.getValue()); + } catch (Exception e) { + error(e, S.concat("Failed verifying header[", headerName, "]: ", e.getMessage())); + } + } + Scenario.get().lastHeaders.set(resp.headers()); + } + + private void verifyBody(Response rs) throws Exception { + if (null != response && S.notBlank(response.checksum)) { + Scenario.get().verifyDownload(rs, response.checksum); + } else { + String bodyString = S.string(rs.body().string()).trim(); + Scenario.get().verifyBody(bodyString, response); + } + } + + private H.Status expectedStatus() { + return null == response ? null : response.status; + } + + private static Throwable causeOf(Exception e) { + Throwable cause = e.getCause(); + return null == cause ? e : cause; + } +} diff --git a/src/main/java/act/e2e/InteractionPart.java b/src/main/java/act/e2e/InteractionPart.java new file mode 100644 index 000000000..1ffb21e5a --- /dev/null +++ b/src/main/java/act/e2e/InteractionPart.java @@ -0,0 +1,36 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.exception.UnexpectedException; + +public interface InteractionPart { + /** + * Check if the interaction part is valid. + * + * If the data is not valid then throw out {@link UnexpectedException} + * + * @param interaction + * the interaction in which this part is in + * @throws {@link UnexpectedException} if the data is not valid + */ + void validate(Interaction interaction) throws UnexpectedException; +} diff --git a/src/main/java/act/e2e/RequestSpec.java b/src/main/java/act/e2e/RequestSpec.java new file mode 100644 index 000000000..ce9790a5e --- /dev/null +++ b/src/main/java/act/e2e/RequestSpec.java @@ -0,0 +1,155 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static org.osgl.http.H.Header.Names.CONTENT_TYPE; + +import act.e2e.req_modifier.RequestModifier; +import act.e2e.util.RequestTemplateManager; +import com.alibaba.fastjson.JSON; +import org.osgl.exception.UnexpectedException; +import org.osgl.http.H; +import org.osgl.util.*; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class RequestSpec implements InteractionPart { + + public static final RequestSpec RS_CLEAR_FIXTURE = clearFixture(); + + public String parent; + public H.Method method; + public String url; + // shortcut for (GET, url) pair + public String get; + // shortcut for (POST, url) pair + public String post; + // shortcut for (PUT, url) pair + public String put; + // shortcut for (DELETE, url) pair + public String delete; + public String accept; + public Boolean ajax; + public List modifiers = new ArrayList<>(); + public Map params = new LinkedHashMap<>(); + public Map headers = new LinkedHashMap<>(); + public Map parts = new LinkedHashMap<>(); + public Object json; + + private boolean resolved; + + public RequestSpec() {} + + @Override + public String toString() { + return JSON.toJSONString(this); + } + + public void resolveParent(RequestTemplateManager manager) { + if (resolved) { + return; + } + if (null == parent) { + parent = "global"; + } + RequestSpec parentSpec = manager.getTemplate(parent); + if (null != parentSpec && this != parentSpec) { + parentSpec.resolveParent(manager); + extendsParent(parentSpec); + } else if (!"global".equals(parent)) { + throw new UnexpectedException("parent request template not found: " + parent); + } + resolved = true; + } + + @Override + public void validate(Interaction interaction) throws UnexpectedException { + if (S.notBlank(get)) { + method = H.Method.GET; + url = get; + } else if (S.notBlank(post)) { + method = H.Method.POST; + url = post; + } else if (S.notBlank(put)) { + method = H.Method.PUT; + url = put; + } else if (S.notBlank(delete)) { + method = H.Method.DELETE; + url = delete; + } + E.unexpectedIf(null == method, "method not specified in request spec of interaction[%s]", interaction); + E.unexpectedIf(null == url, "url not specified in the request spec of interaction[%s]", interaction); + } + + public void markAsResolved() { + resolved = true; + } + + public void unsetResolvedMark() { + resolved = false; + } + + private void extendsParent(RequestSpec parent) { + if (null == accept) { + accept = parent.accept; + } + if (null == ajax) { + ajax = parent.ajax; + } + if (null == url) { + url = parent.url; + } + if (null == method) { + method = parent.method; + } + for (Map.Entry entry : parent.params.entrySet()) { + String key = entry.getKey(); + if (!params.containsKey(key)) { + params.put(key, entry.getValue()); + } + } + for (Map.Entry entry : parent.headers.entrySet()) { + String key = entry.getKey(); + if (!headers.containsKey(key)) { + headers.put(key, entry.getValue()); + } + } + } + + private static RequestSpec clearFixture() { + RequestSpec rs = new RequestSpec(); + rs.method = H.Method.DELETE; + rs.url = "/~/e2e/fixtures"; + return rs; + } + + public static RequestSpec loadFixtures(List fixtures) { + RequestSpec rs = new RequestSpec(); + rs.method = H.Method.POST; + rs.headers.put(CONTENT_TYPE, H.Format.JSON.contentType()); + rs.url = "/~/e2e/fixtures"; + rs.json = JSON.toJSONString(C.Map("fixtures", fixtures)); + return rs; + } +} diff --git a/src/main/java/act/e2e/ResponseSpec.java b/src/main/java/act/e2e/ResponseSpec.java new file mode 100644 index 000000000..ff7e663ff --- /dev/null +++ b/src/main/java/act/e2e/ResponseSpec.java @@ -0,0 +1,70 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.alibaba.fastjson.JSON; +import org.osgl.exception.UnexpectedException; +import org.osgl.http.H; + +import java.util.LinkedHashMap; + +public class ResponseSpec implements InteractionPart { + + public H.Status status; + public Object text; + public LinkedHashMap html = new LinkedHashMap<>(); + public LinkedHashMap json = new LinkedHashMap<>(); + public LinkedHashMap headers = new LinkedHashMap<>(); + public String checksum; + + @Override + public void validate(Interaction interaction) throws UnexpectedException { + checkForEmpty(interaction); + } + + @Override + public String toString() { + return JSON.toJSONString(this); + } + + private void checkForEmpty(Interaction interaction) { + if (null != status) { + return; + } + if (null != text) { + return; + } + if (!json.isEmpty()) { + return; + } + if (!html.isEmpty()) { + return; + } + if (!headers.isEmpty()) { + return; + } + if (null != checksum) { + return; + } + throw new UnexpectedException("Empty response spec found in interaction[%s]", interaction); + } + +} diff --git a/src/main/java/act/e2e/Scenario.java b/src/main/java/act/e2e/Scenario.java new file mode 100644 index 000000000..ff9ffd68b --- /dev/null +++ b/src/main/java/act/e2e/Scenario.java @@ -0,0 +1,873 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static act.e2e.E2EStatus.PENDING; +import static act.e2e.util.ErrorMessage.*; +import static org.osgl.http.H.Header.Names.ACCEPT; +import static org.osgl.http.H.Header.Names.X_REQUESTED_WITH; +import static org.osgl.http.H.Method.POST; + +import act.Act; +import act.app.App; +import act.e2e.func.Func; +import act.e2e.req_modifier.RequestModifier; +import act.e2e.util.CookieStore; +import act.e2e.util.JSONTraverser; +import act.e2e.util.RequestTemplateManager; +import act.e2e.util.ScenarioManager; +import act.e2e.verifier.Verifier; +import act.handler.builtin.FileGetter; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import okhttp3.*; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.osgl.$; +import org.osgl.exception.UnexpectedException; +import org.osgl.http.H; +import org.osgl.logging.Logger; +import org.osgl.util.*; + +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; + +public class Scenario implements ScenarioPart { + + private static final Logger LOGGER = E2E.LOGGER; + + private static final ThreadLocal current = new ThreadLocal<>(); + + private static final RequestBody EMPTY_BODY = RequestBody.create(null, ""); + + private class RequestBuilder { + + private Request.Builder builder; + + RequestBuilder(RequestSpec requestSpec) { + builder = new Request.Builder(); + String accept = requestSpec.accept; + if (null != accept) { + if (S.eq("json", accept, S.IGNORECASE)) { + accept = H.Format.JSON.contentType(); + } else { + H.Format format = H.Format.of(accept); + if (null == format) { + format = H.Format.resolve(accept); + } + if (H.Format.UNKNOWN == format) { + throw new UnexpectedException("Invalid accept in request spec: " + accept); + } + accept = format.contentType(); + } + builder.addHeader(ACCEPT, accept); + } + if ($.bool(requestSpec.ajax)) { + builder.addHeader(X_REQUESTED_WITH, "XMLHttpRequest"); + } + for (RequestModifier modifier : requestSpec.modifiers) { + modifier.modifyRequest(builder); + } + for (Map.Entry entry : requestSpec.headers.entrySet()) { + String headerName = entry.getKey(); + String headerVal = S.string(entry.getValue()); + if (headerVal.startsWith("last:") || headerVal.startsWith("last|")) { + String payload = headerVal.substring(5); + if (S.blank(payload)) { + payload = headerName; + } + Headers headers = lastHeaders.get(); + headerVal = null == headers ? null : S.string(lastHeaders.get().get(payload)); + } + if (null != headerVal) { + builder.addHeader(headerName, headerVal); + } + } + String url = S.concat("http://localhost:", port, S.ensure(processStringSubstitution(requestSpec.url)).startWith("/")); + boolean hasParams = !requestSpec.params.isEmpty(); + if (hasParams) { + processParamSubstitution(requestSpec.params); + } + boolean hasParts = !hasParams && POST == requestSpec.method && !requestSpec.parts.isEmpty(); + if (hasParts) { + processParamSubstitution(requestSpec.parts); + } + switch (requestSpec.method) { + case GET: + case HEAD: + if (hasParams) { + S.Buffer buf = S.buffer(url); + if (!url.contains("?")) { + buf.a("?__nil__=nil"); + } + for (Map.Entry entry : requestSpec.params.entrySet()) { + String paramName = Codec.encodeUrl(entry.getKey()); + String paramVal = Codec.encodeUrl(S.string(entry.getValue())); + buf.a("&").a(paramName).a("=").a(paramVal); + } + url = buf.toString(); + } + case DELETE: + builder.method(requestSpec.method.name(), null); + break; + case POST: + case PUT: + case PATCH: + RequestBody body = EMPTY_BODY; + String jsonBody = verifyJsonBody(requestSpec.json); + if (S.notBlank(jsonBody)) { + body = RequestBody.create(MediaType.parse("application/json"), jsonBody); + } else if (hasParams) { + FormBody.Builder formBuilder = new FormBody.Builder(); + for (Map.Entry entry : requestSpec.params.entrySet()) { + formBuilder.add(entry.getKey(), S.string(entry.getValue())); + } + body = formBuilder.build(); + } else if (hasParts) { + MultipartBody.Builder formBuilder = new MultipartBody.Builder(); + for (Map.Entry entry : requestSpec.parts.entrySet()) { + String key = entry.getKey(); + String val = S.string(entry.getValue()); + String path = S.pathConcat("e2e/upload", '/', val); + URL fileUrl = Act.getResource(path); + if (null != fileUrl) { + String filePath = fileUrl.getFile(); + H.Format fileFormat = FileGetter.contentType(filePath); + byte[] content = $.convert(fileUrl).to(byte[].class); + String checksum = IO.checksum(content); + RequestBody fileBody = RequestBody.create(MediaType.parse(fileFormat.contentType()), content); + formBuilder.addFormDataPart(key, S.cut(filePath).afterLast("/"), fileBody); + cache("checksum-last", checksum); + cache("checksum-" + val, checksum); + } else { + formBuilder.addFormDataPart(key, val); + } + } + body = formBuilder.build(); + } + builder.method((requestSpec.method.name()), body); + break; + default: + throw E.unexpected("HTTP method not supported: " + requestSpec.method); + } + builder.url(url); + } + + private void processParamSubstitution(Map params) { + for (Map.Entry entry : params.entrySet()) { + Object val = entry.getValue(); + if (val instanceof String) { + String sVal = (String) val; + if (sVal.startsWith("last:") || sVal.startsWith("last|")) { + String ref = sVal.substring(5); + entry.setValue(getLastVal(ref)); + } else if (sVal.contains("${")) { + sVal = processStringSubstitution(sVal); + entry.setValue(sVal); + } + } else if (val instanceof Map) { + processParamSubstitution((Map) val); + } + } + } + + Request build() { + return builder.build(); + } + + private String verifyJsonBody(Object jsonBody) { + if (jsonBody instanceof Map) { + processParamSubstitution((Map) jsonBody); + } + String s = null == jsonBody ? "" : (jsonBody instanceof String) ? (String) jsonBody : JSON.toJSONString(jsonBody); + if (S.blank(s)) { + return ""; + } + final String origin = s; + if (s.startsWith("resource:")) { + s = S.ensure(s.substring(9).trim()).startWith("/"); + URL url = Act.getResource(s); + E.unexpectedIf(null == url, "Cannot find JSON body: " + origin); + s = IO.read(url).toString(); + } + try { + JSON.parse(s); + } catch (Exception e) { + E.unexpected(e, "Invalid JSON body: " + origin); + } + return s; + } + + } + + + private int port = 5460; + private OkHttpClient http; + private CookieStore cookieStore; + private App app; + public String name; + public String description; + public List fixtures = new ArrayList<>(); + public List depends = new ArrayList<>(); + public List interactions = new ArrayList<>(); + public Map constants = new HashMap<>(); + public E2EStatus status = PENDING; + public String errorMessage; + public Throwable cause; + + $.Var lastData = $.var(); + $.Var lastHeaders = $.var(); + + ScenarioManager scenarioManager; + RequestTemplateManager requestTemplateManager; + + private Map cache = new HashMap<>(); + + public Scenario() { + app = Act.app(); + if (null != app) { + port = app.config().httpPort(); + } + } + + @Override + public String toString() { + return title(); + } + + public String title() { + return S.blank(description) ? name : description; + } + + public void cache(String name, Object payload) { + cache.put(name, payload); + } + + public Object cached(String name) { + return cache.get(name); + } + + public E2EStatus statusOf(Interaction interaction) { + return interaction.status; + } + + public String errorMessageOf(Interaction interaction) { + return interaction.errorMessage; + } + + @Override + public void validate(Scenario scenario) throws UnexpectedException { + errorIf(S.blank(name), "Scenario name not defined"); + errorIf(interactions.isEmpty(), "No interactions defined in Scenario[%s]", scenario.name); + for (Interaction interaction : interactions) { + interaction.validate(scenario); + } + processConstants(); + } + + private void processConstants() { + Map copy = new HashMap<>(constants); + for (Map.Entry entry : copy.entrySet()) { + Object value = entry.getValue(); + String sVal = S.string(value); + if (sVal.startsWith("${")) { + String expr = S.strip(sVal).of("${", "}"); + value = eval(expr); + } + String key = entry.getKey(); + constants.remove(key); + constants.put(S.underscore(key), value); + } + } + + private Object eval(String expr) { + if (expr.startsWith("func:")) { + return evalFunc(expr.substring(5)); + } else if (expr.contains("(")) { + return evalFunc(expr); + } + String key = S.underscore(expr); + Object o = constants.get(key); + return null == o ? E2E.constant(key) : o; + } + + private Object evalFunc(String funcExpr) { + String funcName = funcExpr; + List vals = C.list(); + if (funcExpr.contains("(")) { + funcName = S.cut(funcExpr).beforeFirst("("); + String paramStr = S.cut(funcExpr).afterFirst("("); + paramStr = S.cut(paramStr).beforeLast(")"); + if (S.notBlank(paramStr)) { + vals = C.newList(S.fastSplit(paramStr, ",")); + for (int i = 0; i < vals.size(); ++i) { + String val = vals.get(i).trim(); + val = processStringSubstitution(val); + vals.set(i, val); + } + } + } + Func func = $.convert(funcName).to(Func.class); + switch (vals.size()) { + case 0: + break; + case 1: + func.init(vals.get(0)); + break; + default: + func.init(vals); + } + return func.apply(); + } + + public void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager) { + this.scenarioManager = $.requireNotNull(scenarioManager); + this.requestTemplateManager = $.requireNotNull(requestTemplateManager); + this.status = PENDING; + current.set(this); + validate(this); + prepareHttp(); + boolean pass = reset() && run(); + this.status = E2EStatus.of(pass); + } + + public void clearSession() { + if (depends.isEmpty()) { + cookieStore().clear(); + } + } + + public boolean clearFixtures() { + return verify(RequestSpec.RS_CLEAR_FIXTURE, "clearing fixtures"); + } + + public String causeStackTrace() { + return null == cause ? null: E.stackTrace(cause); + } + + void resolveRequest(RequestSpec req) { + req.resolveParent(requestTemplateManager); + } + + Response sendRequest(RequestSpec req) throws IOException { + Request httpRequest = new RequestBuilder(req).build(); + Response resp = http.newCall(httpRequest).execute(); + lastHeaders.set(resp.headers()); + return resp; + } + + private boolean createFixtures() { + if (fixtures.isEmpty()) { + return true; + } + RequestSpec req = RequestSpec.loadFixtures(fixtures); + return verify(req, "creating fixtures"); + } + + private boolean verify(RequestSpec req, String operation) { + boolean pass = true; + Response resp = null; + try { + resp = sendRequest(req); + if (!resp.isSuccessful()) { + pass = false; + errorMessage = "Fixtures loading failure"; + } + return pass; + } catch (IOException e) { + errorMessage = "Error " + operation; + LOGGER.error(e, errorMessage); + return false; + } finally { + IO.close(resp); + } + } + + private void prepareHttp() { + long timeout = "e2e".equalsIgnoreCase(Act.profile()) ? 10 : 60 * 60; + http = new OkHttpClient.Builder() + .cookieJar(cookieStore()) + .connectTimeout(timeout, TimeUnit.SECONDS) + .readTimeout(timeout, TimeUnit.SECONDS) + .writeTimeout(timeout, TimeUnit.SECONDS) + .build(); + } + + private boolean reset() { + errorMessage = null; + clearSession(); + if (depends.isEmpty()) { + return clearFixtures() && createFixtures(); + } + return true; + } + + private boolean run() { + if (status.finished()) { + return status.pass(); + } + return runDependents() && runInteractions(); + } + + private boolean runDependents() { + for (String dependent : depends) { + Scenario scenario = scenarioManager.get(dependent); + if (!scenario.run()) { + errorMessage = "dependency failure: " + dependent; + return false; + } + inheritFrom(scenario); + } + return true; + } + + private void inheritFrom(Scenario dependent) { + lastHeaders.set(dependent.lastHeaders.get()); + lastData.set(dependent.lastData.get()); + cache.putAll(dependent.cache); + http = dependent.http; + Map map = C.newMap(dependent.constants); + map.putAll(constants); + constants.putAll(map); + } + + private boolean runInteractions() { + for (Interaction interaction : interactions) { + boolean pass = run(interaction); + if (!pass) { + //errorMessage = S.fmt("interaction[%s] failure", interaction.description); + return false; + } + } + return true; + } + + private boolean run(Interaction interaction) { + boolean okay = interaction.run(); + if (!okay) { + return false; + } + + for (Map.Entry entry : interaction.cache.entrySet()) { + String ref = entry.getValue(); + Object value = getLastVal(ref); + if (null != value) { + cache.put(entry.getKey(), value); + } + } + return true; + } + + private synchronized CookieStore cookieStore() { + if (null == cookieStore) { + App app = Act.app(); + cookieStore = null == app ? new CookieStore() : app.getInstance(CookieStore.class); + } + return cookieStore; + } + + void verifyDownload(Response response, String checksum) { + Object o = cached(checksum); + if (null == o) { + o = cached("checksum-last"); + } + if (null == o) { + o = checksum; + } + String downloadChecksum = IO.checksum(response.body().byteStream()); + errorIfNot($.eq(downloadChecksum, o), "Download checksum not match"); + } + + void verifyBody(String bodyString, ResponseSpec spec) { + lastData.set(bodyString); + if (null == spec) { + if (bodyString.startsWith("[")) { + JSONArray array = JSON.parseArray(bodyString); + lastData.set(array); + } else if (bodyString.startsWith("{")) { + JSONObject obj = JSON.parseObject(bodyString); + lastData.set(obj); + } + return; + } + if (null != spec.text) { + verifyValue("body text", bodyString, spec.text); + } else if (null != spec.json && !spec.json.isEmpty()) { + if (bodyString.startsWith("[")) { + JSONArray array = JSON.parseArray(bodyString); + lastData.set(array); + verifyList("body json array", array, spec.json); + } else if (bodyString.startsWith("{")) { + JSONObject obj = JSON.parseObject(bodyString); + lastData.set(obj); + verifyJsonObject(obj, spec.json); + } else { + error("Unknown JSON string: \n%s", bodyString); + } + } else if (null != spec.html && !spec.html.isEmpty()) { + lastData.set(bodyString); + Document doc = Jsoup.parse(bodyString, S.concat("http://localhost:", port, "/")); + for (Map.Entry entry : spec.html.entrySet()) { + String path = entry.getKey(); + Elements elements = doc.select(path); + verifyValue("body html path", elements, entry.getValue()); + } + } + } + + void verifyList(String name, List array, Map spec) { + for (Object obj : spec.entrySet()) { + Map.Entry entry = $.cast(obj); + Object key = entry.getKey(); + String sKey = S.string(key); + Object test = entry.getValue(); + Object value = null; + if ("size".equals(key) || "len".equals(key) || "length".equals(key)) { + value = array.size(); + } else if ("toString".equals(key) || "string".equals(key) || "str".equals(key)) { + value = JSON.toJSONString(array); + } else if ("?".equals(key) || "".equalsIgnoreCase(sKey)) { + for (Object arrayElement : array) { + try { + verifyValue(name, arrayElement, test); + return; + } catch (Exception e) { + // try next one + } + } + } else if (S.isInt(sKey)) { + int id = Integer.parseInt(sKey); + value = array.get(id); + } else { + if (sKey.contains(".")) { + String id = S.cut(key).beforeFirst("."); + String prop = S.cut(key).afterFirst("."); + if ("?".equals(id) || "".equalsIgnoreCase(id)) { + for (Object arrayElement : array) { + if (!(arrayElement instanceof JSONObject)) { + continue; + } + try { + verifyValue(prop, ((JSONObject) arrayElement).get(prop), test); + return; + } catch (Exception e) { + // try next one + } + } + } else if (S.isInt(id)) { + int i = Integer.parseInt(id); + Object o = array.get(i); + if (o instanceof JSONObject) { + JSONObject json = (JSONObject) o; + value = json.get(prop); + } + } + } + if (null == value) { + throw error("Unknown attribute of array verification: %s", key); + } + } + verifyValue(name, value, test); + } + } + + void verifyJsonObject(JSONObject obj, Map jsonSpec) { + for (Map.Entry entry : jsonSpec.entrySet()) { + String key = entry.getKey(); + Object value = $.getProperty(obj, key); + verifyValue(key, value, entry.getValue()); + } + } + + void verifyValue(String name, Object value, Object test) { + if (test instanceof List) { + verifyValue_(name, value, (List) test); + } else if (value instanceof List && test instanceof Map) { + verifyList(name, (List) value, (Map) test); + } else { + if (matches(value, test)) { + return; + } + if (value instanceof JSONObject) { + errorIfNot(test instanceof Map, "Cannot verify %s value[%s] with test [%s]", name, value, test); + JSONObject json = (JSONObject) value; + Map testMap = (Map) test; + for (Map.Entry entry : testMap.entrySet()) { + Object testKey = entry.getKey(); + Object testValue = entry.getValue(); + Object attr = json.get(testKey); + verifyValue(S.concat(name, ".", testKey), attr, testValue); + } + } else if (value instanceof Elements) { + if (test instanceof Map) { + verifyList(name, (Elements) value, (Map) test); + } else { + Elements elements = (Elements) value; + if (elements.isEmpty()) { + value = null; + } else { + value = elements.first(); + } + verifyValue(name, value, test); + } + } else if (value instanceof Number) { + Number found = (Number) value; + Number expected = null; + if (test instanceof Number) { + expected = (Number) test; + } else { + String s = S.string(test); + s = S.isNumeric(s) ? s : processStringSubstitution(s); + if (S.isNumeric(S.string(s))) { + expected = $.convert(s).to(Double.class); + } else { + error("Cannot verify %s value[%s] against test [%s]", name, value, test); + } + } + double delta = Math.abs(expected.doubleValue() - found.doubleValue()); + if ((delta / found.doubleValue()) > 0.001) { + error("Cannot verify %s value[%s] against test [%s]", name, value, test); + } + } else { + // try convert the test into String + String testString = $.convert(test).toString(); + boolean verified = verifyStringValue_(testString, value, test); + if (!verified) { + String processedString = processStringSubstitution(testString); + if (S.neq(processedString, testString)) { + verified = verifyStringValue_(processedString, value, test); + } + } + errorIfNot(verified, "Cannot verify %s value[%s] with test [%s]", name, value, test); + } + } + } + + private boolean verifyStringValue_(String testString, Object value, Object test) { + if (matches(testString, value)) { + return true; + } + if (null != value && ("*".equals(test) || "...".equals(test) || "".equals(test))) { + return true; + } + try { + Pattern p = Pattern.compile(testString); + return p.matcher(S.string(value)).matches(); + } catch (Exception e) { + // ignore + } + Verifier v = tryLoadVerifier(testString); + if (null != v && v.verify(value)) { + return true; + } + return false; + } + + private void verifyValue_(String name, Object value, List tests) { + // try to do the literal match + if (value instanceof List) { + List found = (List) value; + boolean ok = found.size() == tests.size(); + if (ok) { + for (int i = 0; i < found.size(); ++i) { + Object foundElement = found.get(i); + Object testElement = tests.get(i); + if (!matches(foundElement, testElement)) { + ok = false; + break; + } + } + } + if (ok) { + return; + } + } + // now try verifiers + if (value instanceof Elements) { + Elements elements = (Elements) value; + if (elements.size() > 0) { + value = elements.first(); + } else { + value = null; + } + } + for (Object test : tests) { + errorIfNot(test instanceof Map, "Cannot verify %s value[%s] against test[%s]", name, value, test); + Map map = (Map) test; + errorIfNot(map.size() == 1, "Cannot verify %s value[%s] against test[%s]", name, value, test); + Map.Entry entry = map.entrySet().iterator().next(); + Object entryValue = entry.getValue(); + if (entryValue instanceof String) { + String s = (String) entryValue; + String processed = processStringSubstitution(s); + if (S.neq(processed, s)) { + entry.setValue(processed); + } + } + Verifier v = $.convert(map).to(Verifier.class); + errorIf(null == v, "Cannot verify %s value[%s] against test[%s]", name, value, test); + errorIf(!verify(v, value), "Cannot verify %s value[%s] against test[%s]", name, value, v); + } + } + + private boolean verify(Verifier test, Object value) { + if (test.verify(value)) { + return true; + } + if (value instanceof Element) { + Element e = (Element) value; + if (test.verify(e.val())) { + return true; + } + if (test.verify(e.text())) { + return true; + } + if (test.verify(e.html())) { + return true; + } + } + return false; + } + + private static boolean matches(Object a, Object b) { + if ($.eq(a, b)) { + return true; + } + if (!((b instanceof String) && (a instanceof Element))) { + return false; + } + String test = S.string(b); + Element element = (Element) a; + // try html + String html = element.html(); + if (S.eq(html, test, S.IGNORECASE)) { + return true; + } + // try text + String text = element.text(); + if (S.eq(text, test, S.IGNORECASE)) { + return true; + } + // try val + String val = element.val(); + if (S.eq(val, test, S.IGNORECASE)) { + return true; + } + return false; + } + + private Class tryLoadClass(String name) { + try { + return null != app ? app.classForName(name) : $.classForName(name); + } catch (Exception e) { + return null; + } + } + + private Verifier tryLoadVerifier(String name) { + Class c = tryLoadClass(name); + if (null != c) { + if (Verifier.class.isAssignableFrom(c)) { + return (Verifier) (null != app ? app.getInstance(c) : $.newInstance(c)); + } else { + throw new UnexpectedException("Class not supported: " + name); + } + } + return null; + } + + private Object getVal(String key, String ref) { + Object stuff = getVal(key); + return S.blank(ref) ? stuff : JSONTraverser.traverse(stuff, ref); + } + + private Object getVal(String key) { + if ("last".equals(key)) { + return lastData.get(); + } + Object o = cache.get(key); + if (null != o) { + return o; + } + key = S.underscore(key); + o = constants.get(key); + if (null != o) { + return o; + } + o = E2E.constant(key); + if (null != o) { + return o; + } + try { + return evalFunc(key); + } catch (Exception e) { + return null; + } + } + + private String processStringSubstitution(String s) { + int n = s.indexOf("${"); + if (n < 0) { + return s; + } + int a = 0; + int z = n; + S.Buffer buf = S.buffer(); + while (true) { + buf.append(s.substring(a, z)); + n = s.indexOf("}", z); + a = n; + E.illegalArgumentIf(n < -1, "Invalid string: " + s); + String part = s.substring(z + 2, a); + String key = part; + String payload = ""; + if (part.contains(":")) { + S.Binary binary = S.binarySplit(part, ':'); + key = binary.first(); + payload = binary.second(); + } + buf.append(getVal(key, payload)); + n = s.indexOf("${", a); + if (n < 0) { + buf.append(s.substring(a + 1)); + return buf.toString(); + } + z = n; + } + } + + private Object getLastVal(String ref) { + return getVal("last", ref); + } + + static Scenario get() { + return current.get(); + } +} diff --git a/src/main/java/act/e2e/ScenarioDebugHelper.java b/src/main/java/act/e2e/ScenarioDebugHelper.java new file mode 100644 index 000000000..cc456005b --- /dev/null +++ b/src/main/java/act/e2e/ScenarioDebugHelper.java @@ -0,0 +1,104 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static act.controller.Controller.Util.renderTemplate; + +import act.Act; +import act.app.ActionContext; +import act.app.App; +import act.handler.RequestHandlerBase; +import act.sys.Env; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.osgl.http.H; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Allows debug scenario file via: + * 1. provide a command to launch e2e test + * 2. register e2e built-in services even when it is not in e2e profile + */ +@Singleton +@Env.RequireMode(Act.Mode.DEV) +public class ScenarioDebugHelper { + + public static class LoadFixtures extends RequestHandlerBase { + + private E2E e2e; + + public LoadFixtures(E2E e2e) { + this.e2e = e2e; + } + + @Override + public void handle(ActionContext context) { + JSONObject json = JSON.parseObject(context.body()); + JSONArray fixtures = json.getJSONArray("fixtures"); + e2e.loadFixtures((List) fixtures); + H.Response resp = context.resp(); + resp.status(H.Status.OK); + resp.commit(); + } + + @Override + public void prepareAuthentication(ActionContext context) { + + } + } + + public static class ClearFixtures extends RequestHandlerBase { + private E2E e2e; + + public ClearFixtures(E2E e2e) { + this.e2e = e2e; + } + + @Override + public void handle(ActionContext context) { + e2e.clearFixtures(); + H.Response resp = context.resp(); + resp.status(H.Status.NO_CONTENT); + resp.commit(); + } + + @Override + public void prepareAuthentication(ActionContext context) { + + } + } + + + @Inject + private E2E e2e; + + @GetAction("e2e") + public void run(App app) { + List scenarios = e2e.run(app, false); + renderTemplate("/~e2e.html", scenarios); + } + +} diff --git a/src/main/java/act/e2e/ScenarioPart.java b/src/main/java/act/e2e/ScenarioPart.java new file mode 100644 index 000000000..f224dd3a8 --- /dev/null +++ b/src/main/java/act/e2e/ScenarioPart.java @@ -0,0 +1,34 @@ +package act.e2e; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.exception.UnexpectedException; + +public interface ScenarioPart { + /** + * Check if the data is valid. + * + * If the data is not valid then throw out {@link UnexpectedException} + * + * @throws {@link UnexpectedException} if the data is not valid + */ + void validate(Scenario scenario) throws UnexpectedException; +} diff --git a/src/main/java/act/e2e/func/Func.java b/src/main/java/act/e2e/func/Func.java new file mode 100644 index 000000000..ac4b20792 --- /dev/null +++ b/src/main/java/act/e2e/func/Func.java @@ -0,0 +1,289 @@ +package act.e2e.func; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.e2e.util.NamedLogic; +import org.osgl.$; +import org.osgl.util.C; +import org.osgl.util.E; +import org.osgl.util.N; +import org.osgl.util.S; +import org.osgl.util.converter.TypeConverterRegistry; + +import java.util.List; + +public abstract class Func extends NamedLogic { + + @Override + protected Class type() { + return Func.class; + } + + public abstract Object apply(); + + /** + * Apply subString function to given string. + * + * If one param is provided it must be an integer which specify the + * begin index of the substr. + * + * If two parameters are provided, the second one specify the end + * index (exclusive) of the substr. + * + * @see String#substring(int) + * @see String#substring(int, int) + */ + public static class SubStr extends Func { + + private String targetStr; + + @Override + public void init(Object param) { + E.illegalArgumentIfNot(param instanceof List, "At least 2 parameters expected for subStr function"); + List params = (List) param; + targetStr = S.ensure(params.get(0)).strippedOff(S.DOUBLE_QUOTES); + String sBegin = params.get(1); + E.illegalArgumentIfNot(S.isInt(sBegin), "the 2nd parameter must be valid integer"); + int begin = Integer.parseInt(sBegin); + E.illegalArgumentIf(begin < 0, "the 2nd parameter must be valid integer"); + int end = -1; + if (params.size() > 2) { + String sEnd = params.get(2); + E.illegalArgumentIfNot(S.isInt(sEnd), "the 3nd parameter must be valid integer"); + end = Integer.parseInt(sEnd); + E.illegalArgumentIf(end < begin, "the 3nd parameter not be less than the 2nd parameter"); + if (end > targetStr.length()) { + end = targetStr.length(); + } + } + targetStr = -1 == end ? targetStr.substring(begin) : targetStr.substring(begin, end); + } + + @Override + public Object apply() { + return targetStr; + } + + @Override + protected List aliases() { + return C.list("subString", "substr"); + } + } + + /** + * Random pick up from a list of parameters. + */ + public static class RandomOf extends Func { + + private boolean isList; + private List list; + + @Override + public void init(Object param) { + super.init(param); + isList = param instanceof List; + if (isList) { + list = (List) param; + } + } + + @Override + public Object apply() { + return isList ? $.random(list) : initVal; + } + + @Override + protected List aliases() { + return C.list("randOf", "randSelect", "randomSelect", "pickOne"); + } + } + + /** + * Generate random string. + * + * If initVal is provided then it must be a positive integer which indicate + * the length of the random string. Otherwise the length will be any + * where between 5 and 15. + */ + public static class RandomStr extends Func { + @Override + public Object apply() { + int length = 0; + if (null != initVal) { + try { + length = $.convert(initVal).toInt(); + } catch (Exception e) { + warn(e, "RandomStr func init value (max length) shall be evaluated to an integer, found: " + initVal); + } + } + if (length < 1) { + length = 5 + N.randInt(10); + } + return S.random(length); + } + + @Override + protected List aliases() { + return C.list("randStr", "randomString", "randString"); + } + } + + /** + * Generate random int value. + * + * If initVal is provided then + * - if there is 1 init val, it specify the ceiling of the random integer + * - if there are 2 values, the first is the bottom of the random val and the second is the ceiling of the val + */ + public static class RandomInt extends Func { + @Override + public Object apply() { + int max = 0; + boolean positive = true; + int min = 0; + if (null != initVal) { + Object ceilling = initVal; + if (initVal instanceof List) { + List list = (List) initVal; + Object bottom = list.get(0); + min = $.convert(bottom).toInt(); + ceilling = list.get(1); + } + try { + max = $.convert(ceilling).toInt(); + if (max < 0) { + positive = false; + if (max > min) { + int tmp = min; + min = max; + max = tmp; + } + max = min - max; + } else { + if (max < min) { + int tmp = min; + min = max; + max = tmp; + } + max = max - min; + } + } catch (Exception e) { + warn(e, "RandomInt func init value (max) shall be evaluated to an integer, found: " + initVal); + } + } + if (max == 0) { + max = 100; + } + int retVal = N.randInt(max); + if (!positive) { + retVal = -retVal; + } + retVal += min; + return retVal; + } + + @Override + protected List aliases() { + return C.list("randInt", "randomInteger", "randInteger"); + } + } + + /** + * Generate random `true`, `false` + */ + public static class RandomBoolean extends Func { + @Override + public Object apply() { + return $.random(true, false); + } + + @Override + protected List aliases() { + return C.list("randBoolean", "randomBool", "randBool"); + } + } + + /** + * Generate random long value. + * + * If initVal is provided then + * - if there is 1 init val, it specify the ceiling of the random long value + * - if there are 2 values, the first is the bottom of the random val and the second is the ceiling of the val + */ + public static class RandomLong extends Func { + @Override + public Object apply() { + long max = 0; + long min = 0; + boolean positive = true; + if (null != initVal) { + Object ceilling = initVal; + if (initVal instanceof List) { + List list = (List) initVal; + Object bottom = list.get(0); + min = $.convert(bottom).toLong(); + ceilling = list.get(1); + } + try { + max = $.convert(ceilling).toLong(); + if (max < 0) { + positive = false; + if (max > min) { + long tmp = min; + min = max; + max = tmp; + } + max = min - max; + } else { + if (max < min) { + long tmp = min; + min = max; + max = tmp; + } + max = max - min; + } + } catch (Exception e) { + warn(e, "RandomLong func init value (max) shall be evaluated to an long, found: " + initVal); + } + } + if (max == 0) { + max = 100000L; + } + long retVal = N.randLong(max); + if (!positive) { + retVal = -retVal; + } + retVal += min; + return retVal; + } + + @Override + protected List aliases() { + return C.list("randLong"); + } + } + + public static void registerTypeConverters() { + TypeConverterRegistry.INSTANCE.register(new FromLinkedHashMap(Func.class)); + TypeConverterRegistry.INSTANCE.register(new FromString(Func.class)); + } + +} diff --git a/src/main/java/act/e2e/func/SampleDataProviderAdaptor.java b/src/main/java/act/e2e/func/SampleDataProviderAdaptor.java new file mode 100644 index 000000000..f79c341d0 --- /dev/null +++ b/src/main/java/act/e2e/func/SampleDataProviderAdaptor.java @@ -0,0 +1,90 @@ +package act.e2e.func; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; +import act.util.SubClassFinder; +import org.osgl.util.C; +import org.osgl.util.Keyword; +import org.osgl.util.S; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Set; + +public abstract class SampleDataProviderAdaptor extends Func implements Cloneable { + + private SampleDataProvider provider; + private String name; + private List aliases; + + private SampleDataProviderAdaptor() {} + + private SampleDataProviderAdaptor(SampleDataProvider provider, SampleDataCategory category) { + this.provider = provider; + this.name = "rand-" + category.name(); + this.aliases = new ArrayList<>(); + this.aliases.add("random-" + category.name()); + Set aliases = category.aliases(); + this.aliases.addAll(C.newList(aliases).map(S.F.prepend("rand-"))); + this.aliases.addAll(C.newList(aliases).map(S.F.prepend("random-"))); + } + + @Override + protected Keyword keyword() { + return Keyword.of(name); + } + + @Override + public Object apply() { + return provider.get(); + } + + @Override + protected List aliases() { + return aliases; + } + + @SubClassFinder + public static void found(SampleDataProvider provider) { + SampleData.Category anno = provider.getClass().getAnnotation(SampleData.Category.class); + if (null == anno) { + return; + } + SampleDataCategory category = anno.value(); + if (category == SampleDataCategory.DOB) { + Class targetType = provider.targetType(); + // just need to support one Date type + if (targetType != Date.class) { + return; + } + } + SampleDataProviderAdaptor adaptor = new SampleDataProviderAdaptor(provider, category){}; + boolean forceRegister = Act.app().wasStarted(); + adaptor.register(forceRegister); + Act.app().registerSingleton(adaptor); + } + +} diff --git a/src/main/java/act/e2e/macro/Macro.java b/src/main/java/act/e2e/macro/Macro.java new file mode 100644 index 000000000..f95a02ea1 --- /dev/null +++ b/src/main/java/act/e2e/macro/Macro.java @@ -0,0 +1,132 @@ +package act.e2e.macro; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.App; +import act.e2e.Scenario; +import act.e2e.util.NamedLogic; +import org.osgl.$; +import org.osgl.util.C; +import org.osgl.util.E; +import org.osgl.util.IO; +import org.osgl.util.S; +import org.osgl.util.converter.TypeConverterRegistry; + +import java.io.File; +import java.net.URL; +import java.util.List; + +public abstract class Macro extends NamedLogic { + + public abstract void run(Scenario scenario); + + @Override + protected final Class type() { + return Macro.class; + } + + public static class ClearFixture extends Macro { + + @Override + public void run(Scenario scenario) { + scenario.clearFixtures(); + } + + @Override + protected List aliases() { + return C.listOf("clear-data"); + } + } + + public static class ClearSession extends Macro { + @Override + public void run(Scenario scenario) { + scenario.clearSession(); + } + } + + /** + * Read file content into a string and cache the string + * with the underscore style of the file name. + */ + public static class ReadContent extends Macro { + @Override + public void run(Scenario scenario) { + String fileName = (String) initVal; + File file = new File(fileName); + String content; + if (file.exists() && file.canRead()) { + content = IO.read(file).toString(); + } else { + URL url = App.class.getResource(fileName); + if (null == url) { + url = App.class.getClassLoader().getResource(fileName); + } + E.unexpectedIf(null == url, "Cannot find file or resource by " + fileName); + content = IO.read(url).toString(); + } + scenario.cache(S.underscore(fileName), content); + } + + @Override + protected List aliases() { + return C.list("readFile", "readResource", "readFrom"); + } + } + + public static class Pause extends Macro { + + long time; + + @Override + public void init(Object param) { + time = $.convert(param).toLong(); + E.illegalArgumentIf(time < 1); + } + + @Override + public void run(Scenario scenario) { + try { + Thread.sleep(time); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw E.unexpected(e); + } + } + + @Override + protected List aliases() { + return C.list("sleep"); + } + } + + public static void registerTypeConverters() { + TypeConverterRegistry.INSTANCE.register(new FromLinkedHashMap(Macro.class)); + TypeConverterRegistry.INSTANCE.register(new FromString(Macro.class)); + } + + public static void registerActions() { + new ClearFixture().register(); + new ClearSession().register(); + new ReadContent().register(); + new Pause().register(); + } +} diff --git a/src/main/java/act/e2e/req_modifier/RequestModifier.java b/src/main/java/act/e2e/req_modifier/RequestModifier.java new file mode 100644 index 000000000..5e9541edf --- /dev/null +++ b/src/main/java/act/e2e/req_modifier/RequestModifier.java @@ -0,0 +1,85 @@ +package act.e2e.req_modifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static org.osgl.http.H.Header.Names.*; + +import act.e2e.util.NamedLogic; +import okhttp3.Request; +import org.osgl.util.C; +import org.osgl.util.S; +import org.osgl.util.converter.TypeConverterRegistry; + +import java.util.List; + +public abstract class RequestModifier extends NamedLogic { + + public abstract void modifyRequest(Request.Builder builder); + + @Override + protected Class type() { + return RequestModifier.class; + } + + public static class AcceptJson extends RequestModifier { + @Override + public void modifyRequest(Request.Builder builder) { + builder.header(ACCEPT, "application/json"); + } + + @Override + protected List aliases() { + return C.list("need-json", "json"); + } + } + + + public static class RemoteAddress extends RequestModifier { + @Override + public void modifyRequest(Request.Builder builder) { + builder.header(X_FORWARDED_FOR, S.string(initVal)); + } + + @Override + protected List aliases() { + return C.list("remote-ip", "ip"); + } + } + + public static class JsonContent extends RequestModifier { + @Override + public void modifyRequest(Request.Builder builder) { + builder.header(CONTENT_TYPE, "application/json"); + } + } + + public static void registerTypeConverters() { + TypeConverterRegistry.INSTANCE.register(new FromLinkedHashMap(RequestModifier.class)); + TypeConverterRegistry.INSTANCE.register(new FromString(RequestModifier.class)); + } + + public static void registerModifiers() { + new JsonContent().register(); + new AcceptJson().register(); + new RemoteAddress().register(); + } + +} diff --git a/src/main/java/act/e2e/util/CookieStore.java b/src/main/java/act/e2e/util/CookieStore.java new file mode 100644 index 000000000..908ec1faf --- /dev/null +++ b/src/main/java/act/e2e/util/CookieStore.java @@ -0,0 +1,71 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.util.SingletonBase; +import okhttp3.Cookie; +import okhttp3.CookieJar; +import okhttp3.HttpUrl; +import org.osgl.util.C; +import org.osgl.util.S; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.inject.Singleton; + +@Singleton +public class CookieStore extends SingletonBase implements CookieJar { + + private Map> store = new HashMap<>(); + + @Override + public synchronized void saveFromResponse(HttpUrl url, List cookies) { + String key = key(url); + Map cookieMap = store.get(key); + if (null == cookieMap) { + cookieMap = new HashMap<>(); + store.put(key, cookieMap); + } + for (Cookie cookie : cookies) { + cookieMap.put(cookie.name(), cookie); + } + } + + @Override + public synchronized List loadForRequest(HttpUrl url) { + Map cookieMap = store.get(key(url)); + if (null == cookieMap) { + return C.list(); + } + return C.list(cookieMap.values()); + } + + public synchronized void clear() { + store.clear(); + } + + private static String key(HttpUrl url) { + String host = url.host(); + int port = url.port(); + return S.pathConcat(host, ':', S.string(port)); + } +} diff --git a/src/main/java/act/e2e/util/ErrorMessage.java b/src/main/java/act/e2e/util/ErrorMessage.java new file mode 100644 index 000000000..6917cf00c --- /dev/null +++ b/src/main/java/act/e2e/util/ErrorMessage.java @@ -0,0 +1,59 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.exception.FastRuntimeException; + +public class ErrorMessage extends FastRuntimeException { + public ErrorMessage(String message) { + super(message); + } + + public ErrorMessage(String message, Object... args) { + super(message, args); + } + + public ErrorMessage(Throwable cause) { + super(cause); + } + + public ErrorMessage(Throwable cause, String message, Object... args) { + super(cause, message, args); + } + + public static void errorIf(boolean test, String message, Object... args) { + if (test) { + error(message, args); + } + } + + public static void errorIfNot(boolean test, String message, Object... args) { + errorIf(!test, message, args); + } + + public static ErrorMessage error(String message, Object... args) { + throw new ErrorMessage(message, args); + } + + public static ErrorMessage error(Throwable cause, String message, Object... args) { + throw new ErrorMessage(cause, message, args); + } +} diff --git a/src/main/java/act/e2e/util/JSONTraverser.java b/src/main/java/act/e2e/util/JSONTraverser.java new file mode 100644 index 000000000..72258eecd --- /dev/null +++ b/src/main/java/act/e2e/util/JSONTraverser.java @@ -0,0 +1,70 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.osgl.util.C; +import org.osgl.util.S; + +import java.util.List; + +public class JSONTraverser { + + private JSONObject obj; + private JSONArray array; + + public JSONTraverser(Object o) { + if (o instanceof JSONObject) { + obj = (JSONObject) o; + } else if (o instanceof JSONArray) { + array = (JSONArray) o; + } else { + throw new IllegalArgumentException(); + } + } + + public Object traverse(String path) { + String[] sa = path.split("[\\.\\[\\]]+"); + if (sa.length == 1) { + if (obj != null) { + return obj.get(path); + } else { + return array.get(Integer.parseInt(path)); + } + } + List list = C.newListOf(sa); + String first = list.remove(0); + if ("".equalsIgnoreCase(first)) { + first = list.remove(0); + } + Object o = traverse(first); + JSONTraverser traverser = new JSONTraverser(o); + String rest = S.join(list).by(".").get(); + return traverser.traverse(rest); + } + + + public static Object traverse(Object obj, String path) { + return new JSONTraverser(obj).traverse(path); + } + +} diff --git a/src/main/java/act/e2e/util/NamedLogic.java b/src/main/java/act/e2e/util/NamedLogic.java new file mode 100644 index 000000000..11d0c6815 --- /dev/null +++ b/src/main/java/act/e2e/util/NamedLogic.java @@ -0,0 +1,180 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.plugin.Plugin; +import act.util.LogSupport; +import org.osgl.$; +import org.osgl.util.C; +import org.osgl.util.E; +import org.osgl.util.Keyword; +import org.osgl.util.S; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * An `NamedLogic` encapsulate a piece of logic with a name, which can + * be used to specify the logic in `scenarios.yml` file. + * + * The named logic could belong to different types, e.g. + * + * * Action - trigger an macro, e.g. clear current session + * * Assert - used to verify the data + * * Modifier - used to modify request + */ +public abstract class NamedLogic extends LogSupport implements Plugin { + + private static Map, Map> registry = new HashMap<>(); + + protected abstract Class type(); + + protected Object initVal; + + @Override + public void register() { + register(false); + } + + protected void register(boolean force) { + Keyword keyword = keyword(); + register(keyword, force); + for (String alias : aliases()) { + keyword = Keyword.of(alias); + register(keyword, force); + } + } + + @Override + public String toString() { + if (null == initVal) { + return keyword().hyphenated(); + } + return S.concat(keyword().hyphenated(), ": ", initVal); + } + + @Override + public int hashCode() { + return $.hc(initVal, getClass()); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj == null) { + return false; + } + Class type = obj.getClass(); + if (type != getClass()) { + return false; + } + return $.eq(((NamedLogic) obj).initVal, initVal); + } + + + /** + * Sub class can override this method to initialization work + * + * @param param + * the initialization string + */ + public void init(Object param) { + this.initVal = param; + } + + /** + * Sub class can override this method to provide aliases + * of the logic piece. + * + * For example `Eq` assert provides the following aliases: + * + * * `equalTo` + * * `value` + * + * @return a list of aliases. + */ + protected List aliases() { + return C.list(); + } + + protected Keyword keyword() { + String name = getClass().getSimpleName(); + return Keyword.of(name); + } + + private void register(Keyword keyword, boolean force) { + Class type = type(); + Map lookup = registry.get(type); + if (null == lookup) { + lookup = new HashMap<>(); + registry.put(type, lookup); + } + NamedLogic existing = lookup.put(keyword, this); + E.unexpectedIf(!force && null != existing, "Keyword already used: " + keyword.hyphenated()); + } + + private static T get(Class logicType, String name) { + Map lookup = registry.get(logicType); + if (null == lookup) { + return null; + } + return (T) lookup.get(Keyword.of(name)); + } + + protected static class FromLinkedHashMap extends $.TypeConverter { + public FromLinkedHashMap(Class toType) { + super(LinkedHashMap.class, toType); + } + + @Override + public T convert(LinkedHashMap o) { + E.illegalStateIfNot(o.size() == 1, "single element map expected"); + Map.Entry entry = (Map.Entry) o.entrySet().iterator().next(); + String key = S.string(entry.getKey()); + T logic = get(toType, key); + E.illegalArgumentIf(null == logic, "%s not found: %s", toType.getName(), key); + logic = $.cloneOf(logic); + logic.init(entry.getValue()); + return logic; + } + } + + protected static class FromString extends $.TypeConverter { + public FromString(Class toType) { + super(String.class, toType); + } + + @Override + public T convert(String o) { + E.illegalStateIf(S.blank(o)); + String key = o; + T logic = get(toType, key); + E.illegalArgumentIf(null == logic, "%s not found: %s", toType.getName(), key); + logic = $.cloneOf(logic); + return logic; + } + } + +} diff --git a/src/main/java/act/e2e/util/NullDaoLocator.java b/src/main/java/act/e2e/util/NullDaoLocator.java new file mode 100644 index 000000000..4a101973d --- /dev/null +++ b/src/main/java/act/e2e/util/NullDaoLocator.java @@ -0,0 +1,31 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.DaoLocator; +import act.db.Dao; + +public class NullDaoLocator implements DaoLocator { + @Override + public Dao dao(Class modelType) { + return null; + } +} diff --git a/src/main/java/act/e2e/util/RequestTemplateManager.java b/src/main/java/act/e2e/util/RequestTemplateManager.java new file mode 100644 index 000000000..68364e06d --- /dev/null +++ b/src/main/java/act/e2e/util/RequestTemplateManager.java @@ -0,0 +1,129 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.App; +import act.app.DaoLocator; +import act.e2e.RequestSpec; +import org.osgl.$; +import org.osgl.util.E; +import org.osgl.util.Keyword; +import org.osgl.util.S; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RequestTemplateManager extends YamlLoader { + + private static DaoLocator NULL_DAO = new NullDaoLocator(); + + private Map store = new HashMap<>(); + + public RequestTemplateManager() { + super("act.e2e"); + setFixtureFolder("/e2e/"); + } + + public void load() { + String content = getResourceAsString("requests.yml"); + if (null != content) { + try { + doParse(content); + } catch (RuntimeException e) { + throw E.unexpected(e, "Error loading requests.yml"); + } + } + addBuildInTemplates(); + } + + public RequestSpec getTemplate(String id) { + return store.get(Keyword.of(id)); + } + + private void doParse(String content) { + Map map = parse(content, NULL_DAO); + List toBeResolved = new ArrayList<>(); + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + RequestSpec spec = (RequestSpec) entry.getValue(); + store.put(Keyword.of(key), spec); + if (!"global".equalsIgnoreCase(key)) { + toBeResolved.add(spec); + } else { + spec.markAsResolved(); + } + } + for (RequestSpec spec : toBeResolved) { + spec.resolveParent(this); + } + } + + private void addBuildInTemplates() { + addAjax(); + addGlobal(); + } + + private void addGlobal() { + Keyword key = Keyword.of("global"); + if (store.containsKey(key)) { + return; + } + RequestSpec spec = new RequestSpec(); + App app = Act.app(); + if (null != app) { + String sessionHeader = app.config().sessionHeader(); + if (S.notBlank(sessionHeader)) { + spec.headers.put(sessionHeader, "last:"); + } + if ($.bool(app.config().get("act.e2e.json"))) { + spec.accept = "json"; + } + } + store.put(key, spec); + + // we need to redo parent resolving so that + // the new global templates be applied. + for (RequestSpec rs : store.values()) { + rs.unsetResolvedMark(); + } + + // global template must be mark as resolved + spec.markAsResolved(); + + for (RequestSpec rs : store.values()) { + rs.resolveParent(this); + } + } + + private void addAjax() { + Keyword key = Keyword.of("ajax"); + if (store.containsKey(key)) { + return; + } + RequestSpec spec = new RequestSpec(); + spec.ajax = true; + spec.json = true; + store.put(key, spec); + } +} diff --git a/src/main/java/act/e2e/util/ScenarioComparator.java b/src/main/java/act/e2e/util/ScenarioComparator.java new file mode 100644 index 000000000..2abe95882 --- /dev/null +++ b/src/main/java/act/e2e/util/ScenarioComparator.java @@ -0,0 +1,58 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.e2e.Scenario; +import org.osgl.$; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class ScenarioComparator implements Comparator { + + private ScenarioManager scenarioManager; + + public ScenarioComparator(ScenarioManager manager) { + scenarioManager = $.requireNotNull(manager); + } + + @Override + public int compare(Scenario o1, Scenario o2) { + List d1 = depends(o1, new ArrayList()); + List d2 = depends(o2, new ArrayList()); + if (d1.contains(o2)) { + return 1; + } + if (d2.contains(o1)) { + return -1; + } + return o1.name.compareTo(o2.name); + } + private List depends(Scenario s, List depends) { + for (String name : s.depends) { + Scenario scenario = scenarioManager.get(name); + depends(scenario, depends); + depends.add(scenario); + } + return depends; + } +} diff --git a/src/main/java/act/e2e/util/ScenarioManager.java b/src/main/java/act/e2e/util/ScenarioManager.java new file mode 100644 index 000000000..7ea4a64df --- /dev/null +++ b/src/main/java/act/e2e/util/ScenarioManager.java @@ -0,0 +1,187 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.App; +import act.app.DaoLocator; +import act.app.RuntimeDirs; +import act.e2e.Scenario; +import org.osgl.$; +import org.osgl.util.C; +import org.osgl.util.IO; +import org.osgl.util.Keyword; +import org.osgl.util.S; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class ScenarioManager extends YamlLoader { + + private static DaoLocator NULL_DAO = new NullDaoLocator(); + + private Map store = new LinkedHashMap<>(); + + public ScenarioManager() { + super("act.e2e"); + setFixtureFolder("/e2e/"); + configure(); + } + + public ScenarioManager(String modelPackage, String... modelPackages) { + super(); + addModelPackages("act.e2e"); + addModelPackages(modelPackage, modelPackages); + setFixtureFolder("/e2e"); + configure(); + } + + public Scenario get(String name) { + return store.get(Keyword.of(name)); + } + + public Map load() { + loadDefault(); + searchScenarioFolder(); + Map scenarioMap = new LinkedHashMap<>(); + for (Map.Entry entry : store.entrySet()) { + scenarioMap.put(entry.getKey().hyphenated(), entry.getValue()); + } + return scenarioMap; + } + + private void configure() { + App app = Act.app(); + if (null == app) { + return; + } + } + + private void loadDefault() { + String content = getResourceAsString("scenarios.yml"); + if (null == content) { + return; + } + parseOne(content); + } + + private void searchScenarioFolder() { + App app = Act.app(); + if (null != app) { + searchWhenInAppContext(app); + } else { + URL url = ScenarioManager.class.getResource("/e2e/scenarios"); + if (null != url) { + File file = new File(url.getFile()); + if (file.exists()) { + loadFromScenarioDir(file); + } + } + } + } + + private void searchWhenInAppContext(App app) { + File resource = RuntimeDirs.resource(app); + if (resource.exists()) { + loadFromDir(resource); + } else { + String appJarFile = System.getProperty(Act.PROP_APP_JAR_FILE); + if (null != appJarFile) { + File jarFile = new File(appJarFile); + loadFromJar(jarFile); + } + } + } + + private void loadFromDir(File resourceDir) { + if (!resourceDir.exists()) { + return; + } + File scenariosDir = new File(resourceDir, "e2e/scenarios"); + if (!scenariosDir.exists()) { + return; + } + loadFromScenarioDir(scenariosDir); + } + + private void loadFromScenarioDir(File scenariosDir) { + File[] ymlFiles = scenariosDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".yml"); + } + }); + if (null == ymlFiles) { + return; + } + for (File file : ymlFiles) { + String content = IO.read(file).toString(); + if (S.blank(content)) { + warn("Empty yaml file found: " + file.getPath()); + continue; + } + try { + parseOne(content); + } catch (RuntimeException e) { + error(e, "Error parsing scenario file: %s", file.getName()); + throw e; + } + } + } + + private void loadFromJar(File jarFile) { + try (JarFile jar = new JarFile(jarFile)) { + for (JarEntry entry : C.enumerable(jar.entries())) { + String name = entry.getName(); + if (isScenarioFile(name)) { + InputStream is = jar.getInputStream(entry); + String content = IO.readContentAsString(is); + parseOne(content); + } + } + } catch (IOException e) { + warn(e, "Error loading scenario from jar file"); + } + } + + private boolean isScenarioFile(String name) { + return name.startsWith("e2e/scenarios/") && name.endsWith(".yml"); + } + + private void parseOne(String content) { + Map map = parse(content, NULL_DAO); + Map loaded = $.cast(map); + for (Map.Entry entry : loaded.entrySet()) { + String key = entry.getKey(); + Scenario scenario = entry.getValue(); + scenario.name = key; + this.store.put(Keyword.of(key), scenario); + } + } + +} diff --git a/src/main/java/act/e2e/util/TxScope.java b/src/main/java/act/e2e/util/TxScope.java new file mode 100644 index 000000000..e6bba7284 --- /dev/null +++ b/src/main/java/act/e2e/util/TxScope.java @@ -0,0 +1,49 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; + +public class TxScope { + + private static TxScopeProvider provider; + static { + try { + provider = Act.getInstance("act.act.e2e.util.SqlTxScope"); + } catch (Throwable e) { + provider = new TxScopeProvider.DumbProvider(); + } + } + + public static void enter() { + provider.enter(); + } + public static void rollback(Exception e) { + provider.rollback(e); + } + public static void commit() { + provider.commit(); + } + public static void clear() { + provider.clear(); + } + +} diff --git a/src/main/java/act/e2e/util/TxScopeProvider.java b/src/main/java/act/e2e/util/TxScopeProvider.java new file mode 100644 index 000000000..2321c7ec8 --- /dev/null +++ b/src/main/java/act/e2e/util/TxScopeProvider.java @@ -0,0 +1,49 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.E; + +public interface TxScopeProvider { + void enter(); + void rollback(Exception e); + void commit(); + void clear(); + + class DumbProvider implements TxScopeProvider { + @Override + public void enter() { + } + + @Override + public void rollback(Exception e) { + throw E.asRuntimeException(e); + } + + @Override + public void commit() { + } + + @Override + public void clear() { + } + } +} diff --git a/src/main/java/act/e2e/util/YamlLoader.java b/src/main/java/act/e2e/util/YamlLoader.java new file mode 100644 index 000000000..7300abae9 --- /dev/null +++ b/src/main/java/act/e2e/util/YamlLoader.java @@ -0,0 +1,351 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.App; +import act.app.DaoLocator; +import act.conf.AppConfig; +import act.db.Dao; +import act.e2e.E2E; +import act.util.LogSupport; +import com.alibaba.fastjson.JSONObject; +import org.osgl.$; +import org.osgl.Lang; +import org.osgl.OsglConfig; +import org.osgl.exception.UnexpectedException; +import org.osgl.util.C; +import org.osgl.util.E; +import org.osgl.util.IO; +import org.osgl.util.S; +import org.yaml.snakeyaml.Yaml; + +import java.net.URL; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class YamlLoader extends LogSupport { + + static Pattern keyPattern = Pattern.compile("([^(]+)\\(([^)]+)\\)"); + + private List modelPackages = new ArrayList<>(); + + private String fixtureFolder = "/e2e/fixtures/"; + + private ClassLoader classLoader = appClassLoader(); + + public YamlLoader() { + resetModelPackages(); + loadConfig(); + } + + /** + * Add model packages to the loader. + * + * The model package can be used to concat with the type string when it + * does not contains `.`. + * + * For example, given the following yaml file: + * + * ```yaml + * User(tom) + * name: Tom + * ``` + * + * The model type `User` does not contains `.`, so the loader assume it + * need a model package. Assume it has the following model packages set: + * + * * `com.xprj.util` + * * `com.xprj.model` + * + * Then it will try to use the above packages to search for the model. Firstly it + * will try `com.xprj.util.User`, if it cannot load class, then it will try `com.xprj.model.User`. + * + * If both `come.xprj.util` and `com.xprj.model` has `User` class defined, then it will + * use the first one. To specify the User in the second package, use full notation in your + * yaml file: + * + * ```yaml + * com.xproj.model.User(tom) + * name: Tom + * ``` + * + * @param modelPackage + * @param modelPackages + */ + protected YamlLoader(String modelPackage, String... modelPackages) { + resetModelPackages(); + loadConfig(); + addModelPackages(modelPackage, modelPackages); + } + + private void addModelPackage(String packageSpec) { + for (String pkg : S.fastSplit(packageSpec, ",")) { + pkg = pkg.trim(); + if (S.empty(pkg)) { + continue; + } + this.modelPackages.add(S.ensure(pkg).endWith(".")); + } + } + + + public Map loadFixture(String fixtureName, DaoLocator daoLocator) { + String content = getResourceAsString(fixtureName); + if (null == content) { + return C.Map(); + } + return parse(content, daoLocator); + } + + /** + * Read the data YAML file and returns List of model objects mapped to their class names + * + * @param yaml + * the yaml content + * @return the loaded data mapped to name + */ + public Map parse(String yaml, DaoLocator daoLocator) { + Object o = new Yaml().load(yaml); + Map> objects = $.cast(o); + resolveConstants(objects); + Map> mapCache = C.newMap(); + Map entityCache = new LinkedHashMap<>(); + Map classCache = C.newMap(); + Map nameCounters = C.newMap(); + for (Object key : objects.keySet()) { + String keyStr = key.toString().trim(); + if (!keyStr.contains("(")) { + String type = keyStr.contains(".") ? S.cut(keyStr).afterLast(".") : keyStr; + type = S.camelCase(type); + AtomicInteger counter = nameCounters.get(type); + if (null == counter) { + counter = new AtomicInteger(); + nameCounters.put(type, counter); + } + keyStr = keyStr + "(" + type + " - " + counter.getAndIncrement() + ")"; + } + Matcher matcher = keyPattern.matcher(keyStr.trim()); + if (matcher.matches()) { + String type = matcher.group(1); + String id = matcher.group(2); + + Class modelType = classCache.get(type); + if (null == modelType) { + modelType = loadModelType(type); + classCache.put(type, modelType); + } + + if (null != id && mapCache.containsKey(id)) { + throw E.unexpected("Duplicate id '" + id + "' for type " + type); + } + + Map entityValues = objects.get(key); + Dao dao = null == daoLocator ? null : daoLocator.dao(modelType); + resolveDependencies(entityValues, mapCache, entityCache, dao); + mapCache.put(id, entityValues); + Object entity = OsglConfig.INSTANCE_FACTORY.apply(modelType); + $.map(entityValues) + .withConverter(new Lang.TypeConverter() { + @Override + public Class convert(String s) { + return loadModelType(s); + } + }) + .to(entity); + if (null != dao) { + TxScope.enter(); + try { + dao.save(entity); + TxScope.commit(); + } catch (Exception e) { + TxScope.rollback(e); + } finally { + TxScope.clear(); + } + } + if (null != id) { + entityCache.put(id, entity); + } + } + } + return entityCache; + } + + private void resolveConstants(Map entityValue) { + for (Map.Entry entry : entityValue.entrySet()) { + Object v = entry.getValue(); + if (v instanceof String) { + String s = ((String) v).trim(); + if (s.startsWith("${") && s.endsWith("}")) { + s = s.substring(2); + s = s.substring(0, s.length() - 1); + String constant = E2E.constant(s); + if (null != constant) { + entry.setValue(constant); + } + } + } else if (v instanceof Map) { + resolveConstants((Map) v); + } + } + } + + protected String getResourceAsString(String name) { + URL url = YamlLoader.class.getResource(patchResourceName(name)); + return null == url ? null : IO.read(url).toString(); + } + + private String patchResourceName(String name) { + return S.ensure(name).startWith(fixtureFolder); + } + + private Class loadModelType(String type) { + if (type.contains(".") || $.isPrimitiveType(type)) { + return $.classForName(type, classLoader); + } + for (String pkg : modelPackages) { + String patched = S.concat(pkg, type); + try { + return $.classForName(patched, classLoader); + } catch (Exception e) { + // ignore + } + } + throw new UnexpectedException("Cannot load type: %s", type); + } + + protected void setFixtureFolder(String fixtureFolder) { + if (S.notBlank(fixtureFolder)) { + this.fixtureFolder = S.ensure(S.ensure(fixtureFolder.trim()).startWith("/")).endWith("/"); + } + } + + protected void resetModelPackages() { + this.modelPackages.add("java.util."); + this.modelPackages.add("java.lang."); + } + + protected void addModelPackages(String modelPackage, String... modelPackages) { + this.addModelPackage(modelPackage); + for (String s : modelPackages) { + this.addModelPackage(s); + } + } + + private ClassLoader appClassLoader() { + App app = Act.app(); + if (null == app) { + return Thread.currentThread().getContextClassLoader(); + } + ClassLoader appClassLoader = app.classLoader(); + return null == appClassLoader ? Thread.currentThread().getContextClassLoader() : appClassLoader; + } + + private void resolveDependencies(Map objects, Map> mapCache, Map entityCache, Dao dao) { + for (String k : objects.keySet()) { + Object v = objects.get(k); + if (v instanceof Map) { + resolveDependencies((Map) v, mapCache, entityCache, dao); + } else if (v instanceof String) { + String s = (String) v; + if (s.startsWith("$")) { + String id = s.substring(1); + Map embedded = mapCache.get(id); + objects.put(k, null != embedded ? embedded : s); + } else if (s.startsWith("ref:")) { + String id = s.substring(4); + Object reference = entityCache.get(id); + if (null == reference) { + throw E.unexpected("Cannot find reference object by ID: %s", id); + } else if (null == dao) { + throw E.unexpected("Cannot resolve reference when Dao is missing"); + } + Object theId = dao.getId(reference); + objects.put(k, theId); + } else if (s.startsWith("password:")) { + String password = s.substring(9); + objects.put(k, Act.crypto().passwordHash(password)); + } else if (k.equals("password")) { + objects.put(k, Act.crypto().passwordHash(s)); + } + } else if (v instanceof List) { + List array = (List) v; + int len = array.size(); + for (int i = 0; i < len; i++) { + Object e = array.get(i); + if (e instanceof JSONObject) { + resolveDependencies((JSONObject) e, mapCache, entityCache, dao); + } else if (e instanceof String) { + String s = (String) e; + if (s.startsWith("[") && s.endsWith("]")) { + String id = s.substring(1, s.length() - 1); + Map embedded = mapCache.get(id); + if (null == embedded) { + throw E.unexpected("Cannot find embedded object by ID: %s", id); + } + array.set(i, embedded); + } else if (s.startsWith("embed:")) { + String id = s.substring(6); + Object embedded = entityCache.get(id); + if (null != embedded) { + array.set(i, embedded); + } + } else if (s.startsWith("ref:")) { + String id = s.substring(4); + Object reference = entityCache.get(id); + if (null == reference) { + throw E.unexpected("Cannot find reference object by ID: %s", id); + } else if (null == dao) { + throw E.unexpected("Cannot resolve reference when Dao is missing"); + } + Object theId = dao.getId(reference); + array.set(i, theId); + } + } + } + } + } + } + + private void loadConfig() { + App app = Act.app(); + if (null == app) { + return; + } + AppConfig config = app.config(); + if (null == config) { + return; + } + String modelPackages = config.get("e2e.model-packages"); + if (S.notBlank(modelPackages)) { + addModelPackage(modelPackages); + } + String fixtureFolder = config.get("e2e.fixture-folder"); + setFixtureFolder(fixtureFolder); + } + +} diff --git a/src/main/java/act/e2e/verifier/After.java b/src/main/java/act/e2e/verifier/After.java new file mode 100644 index 000000000..03fd8d767 --- /dev/null +++ b/src/main/java/act/e2e/verifier/After.java @@ -0,0 +1,28 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +public class After extends DateTimeVerifier { + @Override + protected boolean verify(long expected, long found) { + return found > expected; + } +} diff --git a/src/main/java/act/e2e/verifier/Before.java b/src/main/java/act/e2e/verifier/Before.java new file mode 100644 index 000000000..580df296f --- /dev/null +++ b/src/main/java/act/e2e/verifier/Before.java @@ -0,0 +1,28 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +public class Before extends DateTimeVerifier { + @Override + protected boolean verify(long expected, long found) { + return found < expected; + } +} diff --git a/src/main/java/act/e2e/verifier/Compare.java b/src/main/java/act/e2e/verifier/Compare.java new file mode 100644 index 000000000..1386787b3 --- /dev/null +++ b/src/main/java/act/e2e/verifier/Compare.java @@ -0,0 +1,83 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.$; +import org.osgl.util.E; + +public abstract class Compare extends Verifier { + + public enum Type { + GT() { + @Override + public boolean test(int delta) { + return delta < 0; + } + }, + GTE() { + @Override + public boolean test(int delta) { + return delta <= 0; + } + }, + LT() { + @Override + public boolean test(int delta) { + return delta > 0; + } + }, + LTE() { + @Override + public boolean test(int delta) { + return delta >= 0; + } + }; + + public abstract boolean test(int delta); + + public boolean applyTo(T expected, T found) { + return test(expected.compareTo(found)); + } + } + + private Type type; + + protected Compare(Type type) { + this.type = $.requireNotNull(type); + } + + @Override + public void init(Object expected) { + boolean isComparable = expected instanceof Comparable; + E.illegalArgumentIf(!isComparable, "expected value must be either a Comparable"); + super.init(expected); + } + + @Override + public boolean verify(Object value) { + E.illegalArgumentIfNot(value instanceof Comparable); + Class commonSuperType = $.commonSuperTypeOf(initVal, value); + E.illegalArgumentIfNot(Comparable.class.isAssignableFrom(commonSuperType), "Expected value (%s) cannot be compared to found value (%s)", initVal, value); + Comparable expected = (Comparable) this.initVal; + Comparable found = (Comparable) value; + return type.applyTo(expected, found); + } +} diff --git a/src/main/java/act/e2e/verifier/Contains.java b/src/main/java/act/e2e/verifier/Contains.java new file mode 100644 index 000000000..86f09ad84 --- /dev/null +++ b/src/main/java/act/e2e/verifier/Contains.java @@ -0,0 +1,51 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.$; +import org.osgl.util.S; + +import java.lang.reflect.Array; +import java.util.Collection; + +public class Contains extends Verifier { + + @Override + public boolean verify(Object value) { + if (null == value) { + return initVal == null; + } + if (value instanceof String) { + return S.string(value).contains(S.string(initVal)); + } else if (value instanceof Collection) { + return ((Collection) value).contains(initVal); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + for (int i = 0; i < len; ++i) { + Object component = Array.get(value, i); + if ($.eq(component, initVal)) { + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/act/e2e/verifier/DateTimeVerifier.java b/src/main/java/act/e2e/verifier/DateTimeVerifier.java new file mode 100644 index 000000000..0d8d5a504 --- /dev/null +++ b/src/main/java/act/e2e/verifier/DateTimeVerifier.java @@ -0,0 +1,126 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.App; +import act.conf.AppConfig; +import org.joda.time.LocalDate; +import org.joda.time.ReadableDateTime; +import org.joda.time.ReadableInstant; +import org.osgl.$; +import org.osgl.util.E; +import org.osgl.util.S; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +public abstract class DateTimeVerifier extends Verifier { + + protected long timestamp; + + @Override + public void init(Object param) { + super.init(param); + timestamp = convert($.requireNotNull(param)); + } + + @Override + public boolean verify(Object value) { + if (null == value) { + return false; + } + return verify(timestamp, convert(value)); + } + + protected abstract boolean verify(long expected, long found); + + private Long convert(Object value) { + if (value instanceof Date) { + return ((Date) value).getTime(); + } else if (value instanceof ReadableDateTime) { + return ((ReadableDateTime) value).getMillis(); + } else if (value instanceof ReadableInstant) { + return ((ReadableInstant) value).getMillis(); + } else if (value instanceof LocalDate) { + return ((LocalDate) value).toDate().getTime(); + } else { + return convert(S.string(value)); + } + } + + private long convert(String param) { + App app = Act.app(); + if (null != app) { + AppConfig config = app.config(); + Long l = tryWithAppConfig(param, config); + if (null != l) { + return l; + } + } + Long l = tryWithDefaultDateTimeFormats(param); + E.unexpectedIf(null == l, "Unknown date time string: " + param); + return l; + } + + private Long tryWithAppConfig(String s, AppConfig config) { + Long l = tryWithFormat(s, config.dateTimeFormat()); + if (null != l) { + return l; + } + return tryWithFormat(s, config.dateFormat()); + } + + private Long tryWithDefaultDateTimeFormats(String s) { + return tryWithFormat(s, "yyyy-MM-dd hh:mm:ss", "yyyy-MM-dd HH:mm:ss", + "yyyy-MM-dd", + "yyyyMMdd HH:mm:ss", + "yyyyMMdd", + "dd/MMM/yyyy", + "dd-MMM-yyyy", + "dd MMM yyyy"); + } + + private Long tryWithFormat(String s, String pattern, String... otherPatterns) { + Long l = tryWithFormat(s, new SimpleDateFormat(pattern)); + if (null != l) { + return l; + } + for (String op : otherPatterns) { + l = tryWithFormat(s, new SimpleDateFormat(op)); + if (null != l) { + return l; + } + } + return null; + } + + private Long tryWithFormat(String s, DateFormat format) { + try { + Date date = format.parse(s); + return date.getTime(); + } catch (Exception e) { + return null; + } + } + +} diff --git a/src/main/java/act/e2e/verifier/Ends.java b/src/main/java/act/e2e/verifier/Ends.java new file mode 100644 index 000000000..476c5757c --- /dev/null +++ b/src/main/java/act/e2e/verifier/Ends.java @@ -0,0 +1,39 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.C; +import org.osgl.util.S; + +import java.util.List; + +public class Ends extends Verifier { + + @Override + public boolean verify(Object value) { + return S.string(value).endsWith(S.string(initVal)); + } + + @Override + protected List aliases() { + return C.list("endsWith", "end", "endWith"); + } +} diff --git a/src/main/java/act/e2e/verifier/Eq.java b/src/main/java/act/e2e/verifier/Eq.java new file mode 100644 index 000000000..fc1de6ea8 --- /dev/null +++ b/src/main/java/act/e2e/verifier/Eq.java @@ -0,0 +1,39 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.$; +import org.osgl.util.C; + +import java.util.List; + +public class Eq extends Verifier { + + @Override + public boolean verify(Object value) { + return $.eq(value, initVal); + } + + @Override + protected List aliases() { + return C.list("value", "equals", "equalsTo", "equal", "equalTo"); + } +} diff --git a/src/main/java/act/e2e/verifier/EqIgnoreCase.java b/src/main/java/act/e2e/verifier/EqIgnoreCase.java new file mode 100644 index 000000000..00984a727 --- /dev/null +++ b/src/main/java/act/e2e/verifier/EqIgnoreCase.java @@ -0,0 +1,39 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.C; +import org.osgl.util.S; + +import java.util.List; + +public class EqIgnoreCase extends Verifier { + + @Override + public boolean verify(Object value) { + return S.eq(S.string(value).toUpperCase(), S.string(initVal).toUpperCase(), S.IGNORECASE); + } + + @Override + protected List aliases() { + return C.list("eqi", "equalsIgnoreCase"); + } +} diff --git a/src/main/java/act/e2e/verifier/Exists.java b/src/main/java/act/e2e/verifier/Exists.java new file mode 100644 index 000000000..c4eb8977e --- /dev/null +++ b/src/main/java/act/e2e/verifier/Exists.java @@ -0,0 +1,51 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.$; +import org.osgl.util.C; +import org.osgl.util.S; + +import java.util.List; + +public class Exists extends Verifier { + + @Override + public boolean verify(Object value) { + boolean b = $.bool(initVal); + return b == exists(value); + } + + @Override + protected List aliases() { + return C.list("notEmpty"); + } + + private boolean exists(Object value) { + if (null == value) { + return false; + } + if (value instanceof String) { + return S.notEmpty((String) value); + } + return true; + } +} diff --git a/src/main/java/act/e2e/verifier/Gt.java b/src/main/java/act/e2e/verifier/Gt.java new file mode 100644 index 000000000..ab8f469f1 --- /dev/null +++ b/src/main/java/act/e2e/verifier/Gt.java @@ -0,0 +1,37 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.C; + +import java.util.List; + +public class Gt extends Compare { + + public Gt() { + super(Type.GT); + } + + @Override + protected List aliases() { + return C.listOf("greaterThan", "greatThan"); + } +} diff --git a/src/main/java/act/e2e/verifier/Gte.java b/src/main/java/act/e2e/verifier/Gte.java new file mode 100644 index 000000000..9a5c9f821 --- /dev/null +++ b/src/main/java/act/e2e/verifier/Gte.java @@ -0,0 +1,37 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.C; + +import java.util.List; + +public class Gte extends Compare { + + public Gte() { + super(Type.GTE); + } + + @Override + protected List aliases() { + return C.listOf("greaterThanOrEqualTo", "greatThanEqualTo"); + } +} diff --git a/src/main/java/act/e2e/verifier/Lt.java b/src/main/java/act/e2e/verifier/Lt.java new file mode 100644 index 000000000..82a41affe --- /dev/null +++ b/src/main/java/act/e2e/verifier/Lt.java @@ -0,0 +1,38 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.C; + +import java.util.List; + +public class Lt extends Compare { + + public Lt() { + super(Type.LT); + } + + @Override + protected List aliases() { + return C.listOf("lessThan"); + } + +} diff --git a/src/main/java/act/e2e/verifier/Lte.java b/src/main/java/act/e2e/verifier/Lte.java new file mode 100644 index 000000000..e81080d90 --- /dev/null +++ b/src/main/java/act/e2e/verifier/Lte.java @@ -0,0 +1,37 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.C; + +import java.util.List; + +public class Lte extends Compare { + + public Lte() { + super(Type.LTE); + } + + @Override + protected List aliases() { + return C.listOf("lessThanOrEqualTo"); + } +} diff --git a/src/main/java/act/e2e/verifier/Starts.java b/src/main/java/act/e2e/verifier/Starts.java new file mode 100644 index 000000000..d32ba347a --- /dev/null +++ b/src/main/java/act/e2e/verifier/Starts.java @@ -0,0 +1,39 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.C; +import org.osgl.util.S; + +import java.util.List; + +public class Starts extends Verifier { + + @Override + public boolean verify(Object value) { + return S.string(value).startsWith(S.string(initVal)); + } + + @Override + protected List aliases() { + return C.list("startsWith", "start", "startWith"); + } +} diff --git a/src/main/java/act/e2e/verifier/Verifier.java b/src/main/java/act/e2e/verifier/Verifier.java new file mode 100644 index 000000000..c112c724f --- /dev/null +++ b/src/main/java/act/e2e/verifier/Verifier.java @@ -0,0 +1,39 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.e2e.util.NamedLogic; +import org.osgl.util.converter.TypeConverterRegistry; + +public abstract class Verifier extends NamedLogic { + + public abstract boolean verify(Object value); + + @Override + protected final Class type() { + return Verifier.class; + } + + public static void registerTypeConverters() { + TypeConverterRegistry.INSTANCE.register(new FromLinkedHashMap(Verifier.class)); + TypeConverterRegistry.INSTANCE.register(new FromString(Verifier.class)); + } +} diff --git a/src/main/resources/rythm/~e2e.html b/src/main/resources/rythm/~e2e.html new file mode 100644 index 000000000..04ba952cc --- /dev/null +++ b/src/main/resources/rythm/~e2e.html @@ -0,0 +1,103 @@ + +@import act.e2e.Scenario +@import act.e2e.Interaction +@args List scenarios + + + + + @render(head) + + +

End To End Test Result

+@for(Scenario scenario: scenarios) { +

+@if(scenario.description) { + @scenario.description +} else { + @scenario.name.toUpperCase() +} +

+ + +@if(!scenario.status.pass() && null != scenario.errorMessage) { +
+ [@scenario.status] @scenario.errorMessage + @if(scenario.cause) { +
+@scenario.causeStackTrace()
+  
+ } +
+} + +
    +@for (Interaction interaction: scenario.interactions) { +
  • + [@interaction.status] @interaction.description.capFirst() + @if(interaction.errorMessage) { +
    - @interaction.errorMessage
    + @if(interaction.cause) { +
    +@interaction.causeStackTrace()
    +
    + } + } +
  • +} +
+ +} +actframework-@act.Act.VERSION.getVersion() + + \ No newline at end of file diff --git a/src/test/java/act/e2e/controller/CourseService.java b/src/test/java/act/e2e/controller/CourseService.java new file mode 100644 index 000000000..7f3c257c6 --- /dev/null +++ b/src/test/java/act/e2e/controller/CourseService.java @@ -0,0 +1,39 @@ +package act.e2e.controller; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.controller.annotation.UrlContext; +import act.e2e.model.Course; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.N; + +import javax.validation.Valid; + +@UrlContext("courses") +public class CourseService { + + @PostAction + public Course create(@Valid Course course) { + course.id = N.randInt(); + return course; + } + +} diff --git a/src/test/java/act/e2e/model/Course.java b/src/test/java/act/e2e/model/Course.java new file mode 100644 index 000000000..bd275553f --- /dev/null +++ b/src/test/java/act/e2e/model/Course.java @@ -0,0 +1,35 @@ +package act.e2e.model; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.data.annotation.Data; +import act.util.SimpleBean; +import act.validation.NotBlank; + +@Data +public class Course implements SimpleBean { + + public int id; + + @NotBlank + public String name; + +} diff --git a/src/test/java/act/e2e/model/User.java b/src/test/java/act/e2e/model/User.java new file mode 100644 index 000000000..bb8ee0f28 --- /dev/null +++ b/src/test/java/act/e2e/model/User.java @@ -0,0 +1,40 @@ +package act.e2e.model; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.data.annotation.Data; +import act.util.SimpleBean; +import org.joda.time.DateTime; + +import java.util.List; + +@Data +public class User implements SimpleBean { + + public int id; + + public String name; + + public DateTime birthday; + + public List courses; + +} diff --git a/src/test/java/act/e2e/util/AssertTest.java b/src/test/java/act/e2e/util/AssertTest.java new file mode 100644 index 000000000..0bca4dc2d --- /dev/null +++ b/src/test/java/act/e2e/util/AssertTest.java @@ -0,0 +1,40 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.e2e.verifier.Eq; +import org.junit.Test; +import org.osgl.$; +import org.rythmengine.utils.S; +import osgl.ut.TestBase; + +public class AssertTest extends TestBase { + + @Test + public void cloneShallNotBeIdenticalToOrigin() { + Eq eq = new Eq(); + eq.init(S.random()); + Eq clone = $.cloneOf(eq); + notSame(eq, clone); + eq(eq, clone); + } + +} diff --git a/src/test/java/act/e2e/util/CompareTypeTest.java b/src/test/java/act/e2e/util/CompareTypeTest.java new file mode 100644 index 000000000..f5edc1be4 --- /dev/null +++ b/src/test/java/act/e2e/util/CompareTypeTest.java @@ -0,0 +1,67 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static act.e2e.verifier.Compare.Type.*; + +import org.junit.Test; +import osgl.ut.TestBase; + +public class CompareTypeTest extends TestBase { + + @Test + public void testGT() { + yes(GT.applyTo(1, 5)); + yes(GT.applyTo("a", "z")); + no(GT.applyTo(1, 1)); + no(GT.applyTo("a", "a")); + } + + @Test + public void testGTE() { + yes(GTE.applyTo(1, 5)); + yes(GTE.applyTo("a", "z")); + yes(GTE.applyTo(1, 1)); + yes(GTE.applyTo("a", "a")); + no(GTE.applyTo(10, 1)); + no(GTE.applyTo("z", "a")); + } + + + @Test + public void testLT() { + yes(LT.applyTo(5, 1)); + yes(LT.applyTo("z", "a")); + no(LT.applyTo(1, 1)); + no(LT.applyTo("a", "a")); + } + + @Test + public void testLTE() { + yes(LTE.applyTo(5, 1)); + yes(LTE.applyTo("z", "a")); + yes(LTE.applyTo(1, 1)); + yes(LTE.applyTo("a", "a")); + no(LTE.applyTo(1, 5)); + no(LTE.applyTo("a", "z")); + } + +} diff --git a/src/test/java/act/e2e/util/ExistsTest.java b/src/test/java/act/e2e/util/ExistsTest.java new file mode 100644 index 000000000..62a3b996f --- /dev/null +++ b/src/test/java/act/e2e/util/ExistsTest.java @@ -0,0 +1,65 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.e2e.verifier.Exists; +import org.junit.Test; +import osgl.ut.TestBase; + +public class ExistsTest extends TestBase { + + @Test + public void nonNullObjectShallExists() { + Exists e = new Exists(); + e.init(true); + yes(e.verify(new Object())); + e.init(false); + no(e.verify(new Object())); + } + + @Test + public void nullObjectShallNotExists() { + Exists e = new Exists(); + e.init("true"); + no(e.verify(null)); + e.init("false"); + yes(e.verify(null)); + } + + @Test + public void nonEmptyStringIsExist() { + Exists e = new Exists(); + e.init("true"); + yes(e.verify(" ")); + e.init("false"); + no(e.verify(" ")); + } + + @Test + public void emptyStringShallNotExists() { + Exists e = new Exists(); + e.init("true"); + no(e.verify("")); + e.init("false"); + yes(e.verify("")); + } + +} diff --git a/src/test/java/act/e2e/util/FuncTest.java b/src/test/java/act/e2e/util/FuncTest.java new file mode 100644 index 000000000..b7e098538 --- /dev/null +++ b/src/test/java/act/e2e/util/FuncTest.java @@ -0,0 +1,179 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.e2e.func.Func; +import org.junit.Test; +import org.osgl.util.C; +import org.osgl.util.S; +import osgl.ut.TestBase; + +public class FuncTest extends TestBase { + + @Test + public void randOf() { + Func func = new Func.RandomOf(); + func.init(C.list("foo", "bar")); + Object o = func.apply(); + yes(C.setOf("foo", "bar").contains(o)); + } + + @Test + public void randStrWithoutInitVal() { + Func func = new Func.RandomStr(); + Object o = func.apply(); + notNull(o); + yes(o instanceof String); + int len = S.string(o).length(); + yes(len >= 5); + yes(len < 15); + } + + @Test + public void randStrWithValidInitVal() { + Func func = new Func.RandomStr(); + func.init(10); + Object o = func.apply(); + notNull(o); + yes(o instanceof String); + eq(10, S.string(o).length()); + } + + @Test + public void randIntWithoutInitVal() { + Func func = new Func.RandomInt(); + Object o = func.apply(); + notNull(o); + yes(o instanceof Integer); + int i = (Integer) o; + yes(i >= 0); + yes(i < 100); + } + + @Test + public void randIntWithSingleInitVal() { + Func func = new Func.RandomInt(); + func.init(3); + Object o = func.apply(); + notNull(o); + yes(o instanceof Integer); + int i = (Integer) o; + yes(i >= 0); + yes(i < 3); + } + + @Test + public void randIntWithSingleInitVal2() { + Func func = new Func.RandomInt(); + func.init(-3); + Object o = func.apply(); + notNull(o); + yes(o instanceof Integer); + int i = (Integer) o; + yes(i <= 0); + yes(i > -3); + } + + @Test + public void randIntWithTwoInitVals() { + Func func = new Func.RandomInt(); + func.init(C.list("10", "14")); + Object o = func.apply(); + notNull(o); + yes(o instanceof Integer); + int i = (Integer) o; + yes(i >= 10); + yes(i < 14); + } + + @Test + public void randIntWithTwoInitVals2() { + Func func = new Func.RandomInt(); + func.init(C.list("-10", "-14")); + Object o = func.apply(); + notNull(o); + yes(o instanceof Integer); + int i = (Integer) o; + yes(i <= -10); + yes(i > -14); + } + + + @Test + public void randLongWithoutInitVal() { + Func func = new Func.RandomLong(); + Object o = func.apply(); + notNull(o); + yes(o instanceof Long); + long i = (Long) o; + yes(i >= 0); + yes(i < 100000L); + } + + @Test + public void RandLongWithSingleInitVal() { + Func func = new Func.RandomLong(); + func.init(3); + Object o = func.apply(); + notNull(o); + yes(o instanceof Long); + long i = (Long) o; + yes(i >= 0); + yes(i < 3); + } + + @Test + public void RandLongWithSingleInitVal2() { + Func func = new Func.RandomLong(); + func.init(-3); + Object o = func.apply(); + notNull(o); + yes(o instanceof Long); + long i = (Long) o; + yes(i <= 0); + yes(i > -3); + } + + @Test + public void RandLongWithTwoInitVals() { + Func func = new Func.RandomLong(); + func.init(C.list("10", "14")); + Object o = func.apply(); + notNull(o); + yes(o instanceof Long); + long i = (Long) o; + yes(i >= 10); + yes(i < 14); + } + + @Test + public void RandLongWithTwoInitVals2() { + Func func = new Func.RandomLong(); + func.init(C.list("-10", "-14")); + Object o = func.apply(); + notNull(o); + yes(o instanceof Long); + long i = (Long) o; + yes(i <= -10); + yes(i > -14); + } + +} diff --git a/src/test/java/act/e2e/util/JSONTraverserTest.java b/src/test/java/act/e2e/util/JSONTraverserTest.java new file mode 100644 index 000000000..020e47e33 --- /dev/null +++ b/src/test/java/act/e2e/util/JSONTraverserTest.java @@ -0,0 +1,81 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static act.e2e.util.JSONTraverser.traverse; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.junit.Before; +import org.junit.Test; +import osgl.ut.TestBase; + +public class JSONTraverserTest extends TestBase { + + public JSONObject simpleObj; + public JSONArray simpleArray; + + public JSONObject fooBar; + public JSONArray complexArray; + + @Before + public void prepare() { + simpleObj = new JSONObject(); + simpleObj.put("foo", "bar"); + simpleObj.put("bar", 10); + + simpleArray = new JSONArray(); + simpleArray.add("foo"); + simpleArray.add(10); + + fooBar = new JSONObject(); + JSONArray bar = new JSONArray(); + bar.add(0, simpleObj); + fooBar.put("bar", bar); + fooBar.put("foo", simpleArray); + complexArray = new JSONArray(); + complexArray.add(0, fooBar); + } + + @Test + public void testSimpleObj() { + eq("bar", traverse(simpleObj, "foo")); + eq(10, traverse(simpleObj, "bar")); + } + + @Test(expected = IllegalArgumentException.class) + public void testSimpleObjFail() { + traverse(simpleObj, "foo.bar"); + } + + @Test + public void testSimpleArray() { + eq("foo", traverse(simpleArray, "0")); + eq(10, traverse(simpleArray, "1")); + } + + @Test + public void testComplexCase() { + eq("foo", traverse(complexArray, "0.foo[0]")); + eq("bar", traverse(complexArray, "[0][bar][0][foo]")); + eq(10, traverse(complexArray, "0.bar.0.bar")); + } +} diff --git a/src/test/java/act/e2e/util/RequestTemplateManagerTest.java b/src/test/java/act/e2e/util/RequestTemplateManagerTest.java new file mode 100644 index 000000000..7de3e57cb --- /dev/null +++ b/src/test/java/act/e2e/util/RequestTemplateManagerTest.java @@ -0,0 +1,44 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.e2e.RequestSpec; +import org.junit.Test; + +public class RequestTemplateManagerTest extends E2ETestBase { + + @Test + public void test() { + RequestTemplateManager manager = new RequestTemplateManager(); + manager.load(); + RequestSpec spec = manager.getTemplate("global"); + notNull(spec); + eq("last|", spec.headers.get("Authorization")); + isNull(spec.ajax); + isNull(spec.json); + spec = manager.getTemplate("ajax"); + notNull(spec); + eq("last|", spec.headers.get("Authorization")); + yes(spec.ajax); + eq("json", spec.accept); + } + +} diff --git a/src/test/java/act/e2e/util/ScenarioManagerTest.java b/src/test/java/act/e2e/util/ScenarioManagerTest.java new file mode 100644 index 000000000..7d2670011 --- /dev/null +++ b/src/test/java/act/e2e/util/ScenarioManagerTest.java @@ -0,0 +1,91 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.e2e.*; +import act.e2e.macro.Macro; +import act.e2e.req_modifier.RequestModifier; +import act.e2e.verifier.*; +import org.junit.BeforeClass; +import org.junit.Test; +import org.osgl.http.H; + +import java.util.Map; + +public class ScenarioManagerTest extends E2ETestBase { + + private ScenarioManager loader = new ScenarioManager("act.e2e.model"); + + @BeforeClass + public static void prepare() { + new Contains().register(); + new Eq().register(); + new Exists().register(); + new Gt().register(); + E2E.registerTypeConverters(); + RequestModifier.registerModifiers(); + Macro.registerActions(); + } + + @Test + public void test() { + Map map = loader.load(); + no(map.isEmpty()); + Scenario createTask = map.get("create-task"); + verifyCreateTask(createTask); + String s = createTask.depends.get(0); + Scenario signIn = loader.get(s); + notNull(signIn); + s = signIn.depends.get(0); + Scenario signUp = loader.get(s); + verifySignUp(signUp); + } + + private void verifySignUp(Scenario signUp) { + notNull(signUp); + eq(1, signUp.fixtures.size()); + String fixture = signUp.fixtures.get(0); + eq("init-data.yml", fixture); + eq(1, signUp.interactions.size()); + Interaction interaction = signUp.interactions.get(0); + notNull(interaction); + RequestSpec req = interaction.request; + eq(2, req.modifiers.size()); + RequestModifier json = req.modifiers.get(0); + eq("accept-json", json.toString()); + RequestModifier ip = req.modifiers.get(1); + eq("remote-address: 127.0.0.2", ip.toString()); + eq(H.Method.POST, req.method); + eq("/sign_up", req.url); + eq(3, req.params.size()); + Map params = req.params; + eq("test@123.com", params.get("email")); + eq("abc", params.get("password")); + eq(1, params.get("value")); + ResponseSpec resp = interaction.response; + eq(H.Status.CREATED, resp.status); + } + + private void verifyCreateTask(Scenario createTask) { + notNull(createTask); + } + +} diff --git a/src/test/java/act/e2e/util/YamlLoaderTest.java b/src/test/java/act/e2e/util/YamlLoaderTest.java new file mode 100644 index 000000000..e9e96ea5d --- /dev/null +++ b/src/test/java/act/e2e/util/YamlLoaderTest.java @@ -0,0 +1,90 @@ +package act.e2e.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.DaoLocator; +import act.db.Dao; +import act.e2e.model.User; +import org.joda.time.DateTime; +import org.junit.Before; +import org.junit.Test; + +import java.util.Map; + +public class YamlLoaderTest extends E2ETestBase { + + YamlLoader loader; + DaoLocator daoLocator; + + @Before + public void prepareLoader() { + Act.registerTypeConverters(); + loader = new YamlLoader("act.e2e.model"); + } + + @Before + public void prepareDaoLocator() { + daoLocator = new DaoLocator() { + @Override + public Dao dao(Class aClass) { + return null; + } + }; + } + + @Test + public void testLoad() { + Map data = loader.loadFixture("init-data.yml", daoLocator); + eq(5, data.size()); + User user = (User) data.get("green"); + notNull(user); + eq("Green Luo", user.name); + eq(1, user.courses.size()); + eq("Maths", user.courses.get(0).name); + assertDate(user.birthday, 1919, 1, 1); + + user = (User) data.get("black"); + notNull(user); + eq("Black Smith", user.name); + eq(2, user.courses.size()); + eq("Maths", user.courses.get(0).name); + eq("History", user.courses.get(1).name); + assertDate(user.birthday, 1818, 2, 2); + + user = (User) data.get("john"); + notNull(user); + eq("John Brad", user.name); + eq(3, user.id); + isNull(user.birthday); + eq(2, user.courses.size()); + eq("Physics", user.courses.get(0).name); + eq("Science", user.courses.get(1).name); + eq(4, user.courses.get(1).id); + } + + private void assertDate(DateTime dt, int y, int m, int d) { + eq(y, dt.getYear()); + eq(m, dt.getMonthOfYear()); + eq(d, dt.getDayOfMonth()); + } + +} diff --git a/src/test/resources/e2e/fixtures/init-data.yml b/src/test/resources/e2e/fixtures/init-data.yml new file mode 100644 index 000000000..02a32d4e0 --- /dev/null +++ b/src/test/resources/e2e/fixtures/init-data.yml @@ -0,0 +1,27 @@ +Course(math): + id: 1 + name: Maths +Course(history): + id: 2 + name: History +User(green): + id: 1 + name: Green Luo + birthday: 1919-01-01 + courses: + - embed:math +act.e2e.model.User(black): + id: 2 + name: Black Smith + birthday: 1818-02-02 + courses: + - embed:math + - embed:history +User(john): + id: 3 + name: John Brad + courses: + - id: 3 + name: Physics + - id: 4 + name: Science \ No newline at end of file diff --git a/src/test/resources/e2e/requests.yml b/src/test/resources/e2e/requests.yml new file mode 100644 index 000000000..3cc73da1a --- /dev/null +++ b/src/test/resources/e2e/requests.yml @@ -0,0 +1,8 @@ +# Define common requests +RequestSpec(global): + headers: + Authorization: last| + +RequestSpec(ajax): + accept: json + ajax: true diff --git a/src/test/resources/e2e/scenarios.yml b/src/test/resources/e2e/scenarios.yml new file mode 100644 index 000000000..9b60a0d9f --- /dev/null +++ b/src/test/resources/e2e/scenarios.yml @@ -0,0 +1,82 @@ +Scenario(sign_up): + fixtures: + - init-data.yml + interactions: + - description: Sign up a user + request: + modifiers: + - json + - ip: 127.0.0.2 + method: POST + url: /sign_up + params: + email: test@123.com + password: abc + value: 1 + response: + status: 201 + +Scenario(sign_in): + depends: + - sign_up + interactions: + - description: login user `test@123.com` + request: + method: POST + url: /sign_up + headers: + Cache-Control: abc + params: + email: test@123.com + password: abc + response: + status: 201 + +Scenario(create-task): + description: the main scenario + fixtures: + - init-data.yml + depends: + - sign_in + interactions: + - description: Create the first course with name "History" + request: + modifiers: + - json + - ip: 127.0.0.2 + method: POST + url: /courses + headers: + Last-Modified: + - eq: 123456 + params: + course.name: History + course.value: 100 + response: + headers: + Content-Type: application/json + Last-Modified: + - exists: true + json: + size: 5 + toString: "[1, 2, 3, 4, 5]" + 3: 4 + postAction: + remember: + + - description: Create the second course with name "Math"\n * name param without `cours.` prefix + request: + method: POST + url: /courses + params: + name: Math + response: + json: + course.name: "Math" + - description: Create a course without name + request: + method: POST + url: /courses + response: + status: 400 + text: Hello World \ No newline at end of file diff --git a/src/test/resources/e2e/scenarios/a.yml b/src/test/resources/e2e/scenarios/a.yml new file mode 100644 index 000000000..9c48d65d5 --- /dev/null +++ b/src/test/resources/e2e/scenarios/a.yml @@ -0,0 +1,8 @@ +Scenario(a): + interactions: + - description: test a + request: + method: GET + url: /foo/a + response: + status: 200 diff --git a/src/test/resources/e2e/scenarios/b.yml b/src/test/resources/e2e/scenarios/b.yml new file mode 100644 index 000000000..be9e211e3 --- /dev/null +++ b/src/test/resources/e2e/scenarios/b.yml @@ -0,0 +1,11 @@ +Scenario(b): + depends: + - a + - c + interactions: + - description: test b + request: + method: GET + url: /foo/b + response: + status: 200 \ No newline at end of file diff --git a/src/test/resources/e2e/scenarios/c.yml b/src/test/resources/e2e/scenarios/c.yml new file mode 100644 index 000000000..72a9e0c14 --- /dev/null +++ b/src/test/resources/e2e/scenarios/c.yml @@ -0,0 +1,9 @@ +Scenario(c): + interactions: + - description: test c + request: + extends: + method: GET + url: /foo/c + response: + status: 200 From b43bff2637e9d161ca310cfdd351e838d30e1285 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 10 Aug 2018 21:51:15 +1000 Subject: [PATCH 049/730] fix #781 --- CHANGELOG.md | 1 + src/main/java/act/cli/view/CliView.java | 6 ++- .../java/act/data/DataPropertyRepository.java | 44 +++++++++++++++---- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b00481cc3..64c8d58c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `java.util.NoSuchElementException: null` issue when force respond `csv` type #781 * Merge act-e2e into act core framework #779 * Upload always failed after the first time #776 * Support simplified mail template path #774 diff --git a/src/main/java/act/cli/view/CliView.java b/src/main/java/act/cli/view/CliView.java index c96ee99d0..3f0c784e1 100644 --- a/src/main/java/act/cli/view/CliView.java +++ b/src/main/java/act/cli/view/CliView.java @@ -225,7 +225,8 @@ public void remove() { } else { iterator = C.list(result).iterator(); } - Object firstElement = iterator.hasNext() ? iterator.next() : null; + boolean hasElement = iterator.hasNext(); + Object firstElement = hasElement ? iterator.next() : null; if (null == firstElement) { return; } @@ -237,6 +238,9 @@ public void remove() { spec.onValue("-not_exists"); } List outputFields = repo.outputFields(spec, componentType, context); + if (outputFields.isEmpty()) { + return; + } IO.write(buildHeaderLine(outputFields, spec.labelMapping()), writer); IO.write($.OS.lineSeparator(), writer); IO.write(buildDataLine(firstElement, outputFields), writer); diff --git a/src/main/java/act/data/DataPropertyRepository.java b/src/main/java/act/data/DataPropertyRepository.java index c9674bf5e..3ff4b70c1 100644 --- a/src/main/java/act/data/DataPropertyRepository.java +++ b/src/main/java/act/data/DataPropertyRepository.java @@ -31,9 +31,7 @@ import org.osgl.util.C; import org.rythmengine.utils.S; -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; +import java.lang.reflect.*; import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; @@ -101,6 +99,10 @@ private List buildPropertyList(Class c) { for (Method m: ma) { buildPropertyPath(context, m, retLst); } + Field[] fa = c.getFields(); + for (Field f: fa) { + buildPropertyPath(context, f, retLst); + } return retLst; } @@ -122,6 +124,15 @@ private void buildPropertyPath(String context, Method m, List repo) { return; } Class c = m.getReturnType(); + buildPropertyPath(c, m.getGenericReturnType(), context, propName, repo); + } + + + private void buildPropertyPath(String context, Field field, List repo) { + buildPropertyPath(field.getType(), field.getGenericType(), context, field.getName(), repo); + } + + private void buildPropertyPath(Class c, Type genericType, String context, String propName, List repo) { if (Class.class.equals(c)) { return; } @@ -130,16 +141,22 @@ private void buildPropertyPath(String context, Method m, List repo) { List retTypeProperties = propertyListOf(componentType); context = context + propName + "."; for (String s: retTypeProperties) { - repo.add(context + s); + String s0 = context + s; + if (!repo.contains(s0)) { + repo.add(s0); + } } return; } if ($.isSimpleType(c)) { - repo.add(context + propName); + String s0 = context + propName; + if (!repo.contains(s0)) { + repo.add(s0); + } return; } if (Iterable.class.isAssignableFrom(c)) { - Type t = m.getGenericReturnType(); + Type t = genericType; if (t instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) t; Type[] ta = pt.getActualTypeArguments(); @@ -148,20 +165,29 @@ private void buildPropertyPath(String context, Method m, List repo) { List retTypeProperties = propertyListOf(c0); context = context + propName + "."; for (String s: retTypeProperties) { - repo.add(context + s); + String s0 = context + s; + if (!repo.contains(s0)) { + repo.add(s0); + } } } } return; } if (terminators.contains(c) || extendedTerminators.contains(c.getName())) { - repo.add(context + propName); + String s0 = context + propName; + if (!repo.contains(s0)) { + repo.add(s0); + } return; } List retTypeProperties = propertyListOf(c); context = context + propName + "."; for (String s : retTypeProperties) { - repo.add(context + s); + String s0 = context + s; + if (!repo.contains(s0)) { + repo.add(s0); + } } } From d5ce29724ae59e39e11c39bd39c57398eae5a640 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 10 Aug 2018 23:02:36 +1000 Subject: [PATCH 050/730] fix #778 and #780 --- CHANGELOG.md | 2 ++ src/main/java/act/app/ActionContext.java | 14 ++++++++++ .../act/controller/CacheSupportMetaInfo.java | 4 ++- .../java/act/controller/ResponseCache.java | 26 ++++++++++++++----- .../controller/RequestHandlerProxy.java | 17 +++++++----- .../impl/ReflectedHandlerInvoker.java | 8 +++--- src/main/java/act/util/CacheFor.java | 6 +++++ 7 files changed, 60 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64c8d58c3..539f539ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,9 @@ **1.8.8** * `java.util.NoSuchElementException: null` issue when force respond `csv` type #781 +* Allow it specify `private` in `@CacheFor`for `Cache-Control` directive #780 * Merge act-e2e into act core framework #779 +* Generate etag for `@CacheFor` request handlers #778 * Upload always failed after the first time #776 * Support simplified mail template path #774 * `PasswordSpec` - allow `null` value for password validation #773 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index d0f13cacc..95f411d3b 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -110,6 +110,7 @@ public class ActionContext extends ActContext.Base implements Des private boolean allowIgnoreParamNamespace; private boolean consumed; private boolean readyForDestroy; + private int resultHash = Integer.MIN_VALUE; // see https://github.com/actframework/actframework/issues/492 public String encodedSessionToken; @@ -309,6 +310,19 @@ private boolean subjectToCaptchaProtection() { return method == H.Method.POST || method == H.Method.PUT || method == H.Method.PATCH; } + public ActionContext calcResultHashForEtag(Object o) { + if (cacheEnabled && null != o && !(o instanceof Result)) { + resultHash = $.hc(o); + } + return this; + } + + public void applyResultHashToEtag() { + if (resultHash > Integer.MIN_VALUE) { + resp().addHeaderIfNotAdded(ETAG, S.string(resultHash)); + } + } + public MissingAuthenticationHandler missingAuthenticationHandler() { if (null != forceMissingAuthenticationHandler) { return forceMissingAuthenticationHandler; diff --git a/src/main/java/act/controller/CacheSupportMetaInfo.java b/src/main/java/act/controller/CacheSupportMetaInfo.java index fb9c8ba62..f0d6e5093 100644 --- a/src/main/java/act/controller/CacheSupportMetaInfo.java +++ b/src/main/java/act/controller/CacheSupportMetaInfo.java @@ -29,6 +29,7 @@ public class CacheSupportMetaInfo { public boolean enabled; public int ttl; public boolean supportPost; + public boolean usePrivate; private CacheSupportMetaInfo() {} @@ -40,11 +41,12 @@ public static CacheSupportMetaInfo disabled() { return new CacheSupportMetaInfo(); } - public static CacheSupportMetaInfo enabled($.Function keyGenerator, int ttl, boolean supportPost) { + public static CacheSupportMetaInfo enabled($.Function keyGenerator, int ttl, boolean supportPost, boolean usePrivate) { CacheSupportMetaInfo meta = new CacheSupportMetaInfo(); meta.enabled = true; meta.ttl = ttl; meta.supportPost = supportPost; + meta.usePrivate = usePrivate; meta.keyGenerator = $.requireNotNull(keyGenerator); return meta; } diff --git a/src/main/java/act/controller/ResponseCache.java b/src/main/java/act/controller/ResponseCache.java index 7d7c7a3a9..a2165bb78 100644 --- a/src/main/java/act/controller/ResponseCache.java +++ b/src/main/java/act/controller/ResponseCache.java @@ -21,6 +21,7 @@ */ import static org.osgl.http.H.Format.*; +import static org.osgl.http.H.Header.Names.ETAG; import act.ActResponse; import org.osgl.$; @@ -30,14 +31,9 @@ import org.osgl.util.Charsets; import org.osgl.util.Output; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.Serializable; -import java.io.Writer; +import java.io.*; import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; +import java.util.*; public class ResponseCache extends ActResponse implements Serializable { @@ -45,6 +41,7 @@ public class ResponseCache extends ActResponse implements Serializable { private Map headers = new HashMap<>(); private Long len; private H.Status status; + private String etag; private ByteBuffer buffer; private OutputStreamCache osCache; @@ -59,6 +56,10 @@ public ResponseCache(ActResponse realResponse) { this.realResponse = $.requireNotNull(realResponse); } + public String etag() { + return this.etag; + } + public void applyTo(ActResponse response) { for (H.Cookie cookie : cookies.values()) { response.addCookie(cookie); @@ -175,6 +176,7 @@ public H.Response prepareDownload(String filename) { @Override public H.Response etag(String etag) { + this.etag = etag; realResponse.etag(etag); // set through header call return this; @@ -205,6 +207,9 @@ public H.Response addHeaderIfNotAdded(String name, String value) { realResponse.addHeaderIfNotAdded(name, value); if (!headers.containsKey(name)) { headers.put(name, value); + if (ETAG.equalsIgnoreCase(name)) { + this.etag = value; + } } return this; } @@ -333,6 +338,10 @@ public ActResponse sendRedirect(String location) { @Override public H.Response header(String name, String value) { realResponse.header(name, value); + headers.put(name, value); + if (ETAG.equalsIgnoreCase(name)) { + this.etag = value; + } return this; } @@ -346,6 +355,9 @@ protected void _setStatusCode(int sc) { public H.Response addHeader(String name, String value) { realResponse.addHeader(name, value); headers.put(name, value); + if (ETAG.equalsIgnoreCase(name)) { + this.etag = value; + } return this; } diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index 728ccd2be..e3391e191 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -30,8 +30,7 @@ import act.app.App; import act.app.AppInterceptorManager; import act.app.event.SysEventId; -import act.controller.CacheSupportMetaInfo; -import act.controller.ResponseCache; +import act.controller.*; import act.controller.meta.*; import act.handler.RequestHandlerBase; import act.security.CORS; @@ -48,8 +47,7 @@ import org.osgl.http.H; import org.osgl.logging.L; import org.osgl.logging.Logger; -import org.osgl.mvc.result.ErrorResult; -import org.osgl.mvc.result.Result; +import org.osgl.mvc.result.*; import org.osgl.util.E; import org.osgl.util.S; @@ -190,7 +188,12 @@ public void handle(ActionContext context) { cacheKey = cacheSupport.cacheKey(context); ResponseCache cached = this.cache.get(cacheKey); if (null != cached) { - cached.applyTo(context.prepareRespForResultEvaluation()); + String etag = cached.etag(); + if (null != etag && context.req().etagMatches(etag)) { + NotModified.of(etag).apply(context.req(), context.resp()); + } else { + cached.applyTo(context.prepareRespForResultEvaluation()); + } return; } context.enableCache(); @@ -214,7 +217,8 @@ public void handle(ActionContext context) { result = context.nullValueResult(); } if (supportCache) { - context.resp().addHeaderIfNotAdded(H.Header.Names.CACHE_CONTROL, "public, max-age=" + cacheSupport.ttl); + String s = cacheSupport.usePrivate ? "private, max-age=" : "public, max-age="; + context.resp().addHeaderIfNotAdded(H.Header.Names.CACHE_CONTROL, s + cacheSupport.ttl); } onResult(result, context); if (supportCache) { @@ -292,6 +296,7 @@ private void onResult(Result result, ActionContext context) { context.dissolve(); boolean isRenderAny = false; try { + context.applyResultHashToEtag(); if (result instanceof RenderAny) { RenderAny any = (RenderAny) result; isRenderAny = true; diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index ad1b7c381..39c587c5e 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -516,13 +516,13 @@ protected void run(ProgressGauge progressGauge) { } @Override - public Result handle(Result result, ActionContext actionContext) throws Exception { + public Result handle(Result result, ActionContext actionContext) { actionContext.setResult(result); return handle(actionContext); } @Override - public Result handle(Exception e, ActionContext actionContext) throws Exception { + public Result handle(Exception e, ActionContext actionContext) { actionContext.attribute(ActionContext.ATTR_EXCEPTION, e); return handle(actionContext); } @@ -723,7 +723,8 @@ private void initCacheParams(AppConfig config) { cacheSupport = null == cacheFor ? CacheSupportMetaInfo.disabled() : CacheSupportMetaInfo.enabled( new CacheKeyBuilder(cacheFor, S.concat(controllerClass.getName(), ".", method.getName())), cacheFor.value(), - cacheFor.supportPost() + cacheFor.supportPost(), + cacheFor.usePrivate() ); } @@ -846,6 +847,7 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle if (returnString && context.acceptJson()) { result = null == result ? null : ensureValidJson(S.string(result)); } + context.calcResultHashForEtag(result); } catch (Result r) { result = r; } catch (Exception e) { diff --git a/src/main/java/act/util/CacheFor.java b/src/main/java/act/util/CacheFor.java index 49bf3d146..895020ac2 100644 --- a/src/main/java/act/util/CacheFor.java +++ b/src/main/java/act/util/CacheFor.java @@ -58,4 +58,10 @@ * @return `true` if enable cache on POST request */ boolean supportPost() default false; + + /** + * Specify it shall use `private` for `Cache-Control` + * @return + */ + boolean usePrivate() default false; } From 2b4b747eb202814b49cad6dddc389133b9d450a6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 12 Aug 2018 07:25:31 +1000 Subject: [PATCH 051/730] update to osgl-parent-1.0.0-BETA-3 --- pom.xml | 2 +- src/main/java/act/Act.java | 6 +++++- src/main/java/act/internal/util/AppDescriptor.java | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 2d4fd177c..cbeaa029b 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ org.osgl parent - 1.0.0-BETA-2 + 1.0.0-BETA-3 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 18de8bd09..43fbd867e 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -790,7 +790,11 @@ private static void processEnvironment(AppDescriptor descriptor) { } } } - Version.suppressVariableFoundWarning = mode.isDev(); + if (mode.isDev()) { + System.setProperty(Version.PROP_SUPPRESS_VAR_FOUND_WARNING, "true"); + } else { + System.clearProperty(Version.PROP_SUPPRESS_VAR_FOUND_WARNING); + } s = System.getProperty("app.nodeGroup"); if (null != s) { nodeGroup = s; diff --git a/src/main/java/act/internal/util/AppDescriptor.java b/src/main/java/act/internal/util/AppDescriptor.java index 5db0e7638..98d2e1108 100644 --- a/src/main/java/act/internal/util/AppDescriptor.java +++ b/src/main/java/act/internal/util/AppDescriptor.java @@ -189,7 +189,7 @@ public static AppDescriptor of(String appName, Class entryClass, Version appV * an `AppDescriptor` instance */ public static AppDescriptor of(String appName, Class entryClass) { - Version.suppressVariableFoundWarning = true; + System.setProperty(Version.PROP_SUPPRESS_VAR_FOUND_WARNING, "true"); return of(appName, entryClass, Version.of(entryClass)); } From cbcd4cde88aa4a633d8e99a6c005b1017dfb9ba4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 13 Aug 2018 16:28:15 +1000 Subject: [PATCH 052/730] fix #782 and #783 --- CHANGELOG.md | 2 + src/main/java/act/Act.java | 5 +- src/main/java/act/app/ActionContext.java | 23 ++++++++ src/main/java/act/controller/Controller.java | 6 +- .../java/act/inject/util/ResourceLoader.java | 2 +- .../java/act/internal/util/AppDescriptor.java | 2 +- src/main/java/act/view/DirectRender.java | 27 +++++++++ .../java/act/view/DirectRenderResult.java | 40 +++++++++++++ src/main/java/act/view/RenderAny.java | 12 ++-- src/main/java/act/view/View.java | 6 +- src/main/java/act/view/ViewManager.java | 59 ++++++++----------- src/main/java/act/xio/NetworkHandler.java | 3 + 12 files changed, 137 insertions(+), 50 deletions(-) create mode 100644 src/main/java/act/view/DirectRender.java create mode 100644 src/main/java/act/view/DirectRenderResult.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 539f539ba..613b4ad2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Add `attachmentName()` method to `ActionContext` #783 +* Extend View framework to support direct rendering of non-text content without template #782 * `java.util.NoSuchElementException: null` issue when force respond `csv` type #781 * Allow it specify `private` in `@CacheFor`for `Cache-Control` directive #780 * Merge act-e2e into act core framework #779 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 43fbd867e..5bc8c9c6e 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -103,7 +103,6 @@ public final class Act { public static final Version VERSION = Version.of(Act.class); - public static final Logger LOGGER = LogManager.get(Act.class); /** @@ -791,9 +790,9 @@ private static void processEnvironment(AppDescriptor descriptor) { } } if (mode.isDev()) { - System.setProperty(Version.PROP_SUPPRESS_VAR_FOUND_WARNING, "true"); + System.setProperty("osgl.version.suppress-var-found-warning", "true"); } else { - System.clearProperty(Version.PROP_SUPPRESS_VAR_FOUND_WARNING); + System.clearProperty("osgl.version.suppress-var-found-warning"); } s = System.getProperty("app.nodeGroup"); if (null != s) { diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 95f411d3b..546e4eb8f 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -83,6 +83,7 @@ public class ActionContext extends ActContext.Base implements Des private Map controllerInstances; private Map uploads; private Router router; + private String processedUrl; private RequestHandler handler; private UserAgent ua; private String sessionKeyUsername; @@ -262,6 +263,28 @@ public ActionContext router(Router router) { return this; } + public ActionContext processedUrl(String url) { + this.processedUrl = url; + return this; + } + + private String processedUrl() { + return null == processedUrl ? req().url() : processedUrl; + } + + public String attachmentName() { + String s = processedUrl; + if (s.contains("/")) { + s = S.cut(s).afterLast("/"); + } else { + s = methodPath(); + if (s.contains(".")) { + s = S.cut(s).afterLast("."); + } + } + return s + "." + accept().name(); + } + public void markAsRequireCaptcha() { this.requireCaptcha = true; } diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 82b9d08de..df595c4a5 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1564,7 +1564,11 @@ public static Result inferPrimitiveResult(Object v, ActionContext actionContext, if (fmt.isText()) { return RenderText.of(status, fmt, s, status.toString()); } - throw E.unexpected("Cannot apply text result to format: %s", fmt); + DirectRender dr = Act.viewManager().loadDirectRender(actionContext); + if (null == dr) { + throw E.unexpected("Cannot apply text result to format: %s", fmt); + } + return new DirectRenderResult(dr, v); } } diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index 9c4ec73b5..cdf93ba44 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -319,7 +319,7 @@ private static Object _load(URL url, BeanSpec spec) { if (Properties.class == rawType || Properties.class.isAssignableFrom(rawType)) { return properties; } - return $.map(properties).to(rawType); + return $.map(properties).targetGenericType(spec.type()).to(rawType); } else { // try my best List lines = IO.readLines(url); diff --git a/src/main/java/act/internal/util/AppDescriptor.java b/src/main/java/act/internal/util/AppDescriptor.java index 98d2e1108..380d0a62d 100644 --- a/src/main/java/act/internal/util/AppDescriptor.java +++ b/src/main/java/act/internal/util/AppDescriptor.java @@ -189,7 +189,7 @@ public static AppDescriptor of(String appName, Class entryClass, Version appV * an `AppDescriptor` instance */ public static AppDescriptor of(String appName, Class entryClass) { - System.setProperty(Version.PROP_SUPPRESS_VAR_FOUND_WARNING, "true"); + System.setProperty("osgl.version.suppress-var-found-warning", "true"); return of(appName, entryClass, Version.of(entryClass)); } diff --git a/src/main/java/act/view/DirectRender.java b/src/main/java/act/view/DirectRender.java new file mode 100644 index 000000000..9d9fb5171 --- /dev/null +++ b/src/main/java/act/view/DirectRender.java @@ -0,0 +1,27 @@ +package act.view; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.ActionContext; + +public interface DirectRender { + void render(Object result, ActionContext context); +} diff --git a/src/main/java/act/view/DirectRenderResult.java b/src/main/java/act/view/DirectRenderResult.java new file mode 100644 index 000000000..d556c1776 --- /dev/null +++ b/src/main/java/act/view/DirectRenderResult.java @@ -0,0 +1,40 @@ +package act.view; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.ActionContext; +import org.osgl.$; + +public class DirectRenderResult extends RenderAny { + + private DirectRender directRender; + private Object result; + + public DirectRenderResult(DirectRender directRender, Object result) { + this.directRender = $.requireNotNull(directRender); + this.result = result; + } + + @Override + public void apply(ActionContext context) { + directRender.render(result, context); + } +} diff --git a/src/main/java/act/view/RenderAny.java b/src/main/java/act/view/RenderAny.java index 294df12fb..7c529f1cd 100644 --- a/src/main/java/act/view/RenderAny.java +++ b/src/main/java/act/view/RenderAny.java @@ -20,23 +20,19 @@ * #L% */ +import static org.osgl.http.H.Format.*; + import act.ActResponse; import act.app.ActionContext; import org.osgl.http.H; -import org.osgl.mvc.result.RenderBinary; -import org.osgl.mvc.result.RenderJSON; -import org.osgl.mvc.result.Result; +import org.osgl.mvc.result.*; import org.osgl.storage.ISObject; import org.osgl.util.E; import org.osgl.util.S; import java.io.File; import java.io.InputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.osgl.http.H.Format.*; +import java.util.*; /** * Render a template with template path and arguments provided diff --git a/src/main/java/act/view/View.java b/src/main/java/act/view/View.java index 3c2c5ae8c..3760341f6 100644 --- a/src/main/java/act/view/View.java +++ b/src/main/java/act/view/View.java @@ -65,7 +65,6 @@ public boolean appliedTo(ActContext context) { * Sub class must implement this method to load the template * * @param resourcePath the path to the template - * @param context the view context * @return the template instance or {@code null} if template not found */ // TODO it shall not need context to load template, revise this interface to remove it @@ -75,7 +74,6 @@ public boolean appliedTo(ActContext context) { * Sub class must implement this method to load the template from string literal * * @param content the template content string literal - * @param context the view context * @return the template instance * @since 1.6 */ @@ -99,6 +97,10 @@ protected final String templateHome() { return templateHome; } + public DirectRender directRenderFor(H.Format acceptType) { + return null; + } + /** * Load template content. *

diff --git a/src/main/java/act/view/ViewManager.java b/src/main/java/act/view/ViewManager.java index da2a7b054..06fea0768 100644 --- a/src/main/java/act/view/ViewManager.java +++ b/src/main/java/act/view/ViewManager.java @@ -23,6 +23,7 @@ import static act.Destroyable.Util.tryDestroyAll; import act.Act; +import act.app.ActionContext; import act.app.App; import act.conf.AppConfig; import act.mail.MailerContext; @@ -30,6 +31,7 @@ import act.util.DestroyableBase; import org.osgl.$; import org.osgl.exception.UnexpectedException; +import org.osgl.http.H; import org.osgl.util.*; import java.util.*; @@ -43,6 +45,9 @@ public class ViewManager extends DestroyableBase { private C.List viewList = C.newList(); private Map implicitActionViewVariables = new HashMap<>(); private Map implicitMailerViewVariables = new HashMap<>(); + private Map directViewQuickLookup = new HashMap<>(); + private Set directViewBlackList = new HashSet<>(); + private Map appDefined = new HashMap<>(); private Map templateCache = new HashMap<>(); private boolean multiViews = false; @@ -174,40 +179,6 @@ public Template load(ActContext context) { return template; } - public Template getTemplate(String path) { - ActContext.Base ctx = ActContext.Base.currentContext(); - if (null != ctx) { - String curPath = ctx.templatePath(); - ctx.templateLiteral(path); - try { - return load(ctx); - } finally { - ctx.templatePath(curPath); - } - } - final String templatePath = S.ensureStartsWith(path, '/'); - Template template = null; - - View defView = Act.appConfig().defaultView(); - - if (null != defView) { - template = !isTemplatePath(path) ? defView.loadInlineTemplate(path) : defView.loadTemplate(templatePath); - } - if (null == template && multiViews) { - for (View view : viewList) { - if (view == defView) continue; - template = view.loadTemplate(templatePath); - if (null != template) { - break; - } - } - } - if (null != template) { - templateCache.put(path, template); - } - return template; - } - private Template getInlineTemplate(ActContext context, AppConfig config, String content) { View defView = config.defaultView(); if (null != defView && defView.appliedTo(context)) { @@ -246,6 +217,26 @@ private Template getTemplate(ActContext context, AppConfig config, String path) return template; } + public DirectRender loadDirectRender(ActionContext context) { + H.Format accept = context.accept(); + if (directViewBlackList.contains(accept)) { + return null; + } + View view = directViewQuickLookup.get(accept); + if (null != view) { + return view.directRenderFor(accept); + } + for (View view1 : viewList) { + DirectRender dr = view1.directRenderFor(accept); + if (null != dr) { + directViewQuickLookup.put(accept, view1); + return dr; + } + } + directViewBlackList.add(accept); + return null; + } + public Collection implicitActionViewVariables() { return implicitActionViewVariables.values(); diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 10bba1556..29283375f 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -124,6 +124,9 @@ public void run() { String url = req.url(); H.Method method = req.method(); url = contentSuffixProcessor.apply(req, url); + if (!url.equals(req.url())) { + ctx.processedUrl(url); + } try { url = urlContextProcessor.apply(req, url); } catch (NotFound notFound) { From d585ccc01344d53c20c2613185a5c53a943723cc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 13 Aug 2018 22:16:22 +1000 Subject: [PATCH 053/730] add Controller.Util.download(InputStream) method, improve attachment name infering for Controller.Util.download(URL) --- src/main/java/act/controller/Controller.java | 18 +++++++++++++++--- .../java/act/inject/util/ResourceLoader.java | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index df595c4a5..c03cbec9f 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1350,9 +1350,7 @@ public static RenderBinary renderBinary($.Visitor outputStreamWriter) { * @return a `RenderBinary` result as described above */ public static RenderBinary download(URL url) { - String file = url.getPath(); - String fileName = S.afterLast(file, "/"); - return new RenderBinary(IO.is(url), fileName, false); + return new RenderBinary(IO.is(url), ActionContext.current().attachmentName(), false); } /** @@ -1396,6 +1394,20 @@ public static RenderBinary download(File file, String attachmentName) { return new RenderBinary(file, attachmentName, false); } + /** + * Returns a {@link RenderBinary} result with an `InputStream`. The result will + * render the binary using "attachment" content disposition, with + * {@link ActionContext#attachmentName()} as the name of the download attachment. + * + * @param inputStream + * the input stream from which byte content will be written to the + * attachment. + * @return a `RenderBinary` result as described above + */ + public static RenderBinary download(InputStream inputStream) { + return new RenderBinary(inputStream, ActionContext.current().attachmentName(), false); + } + /** * Returns a {@link RenderBinary} result with an `InputStream`. The result will * render the binary using "attachment" content disposition, with diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index cdf93ba44..f0efea5f6 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -288,12 +288,12 @@ private static Object _load(URL url, BeanSpec spec) { String content = IO.readContentAsString(url); content = content.trim(); Object o = content.startsWith("[") ? JSON.parseArray(content) : JSON.parseObject(content); - return $.map(o).to(rawType); + return $.map(o).targetGenericType(spec.type()).to(rawType); } boolean isYaml = !isJson && (resourcePath.endsWith(".yml") || resourcePath.endsWith(".yaml")); if (isYaml) { Object o = new Yaml().load(IO.readContentAsString(url)); - return $.map(o).to(rawType); + return $.map(o).targetGenericType(spec.type()).to(rawType); } else if (String.class == rawType) { return IO.readContentAsString(url); } else if (List.class.equals(rawType)) { From b8ff241fb99aa0f6f800f839e7270504d7ea194b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 14 Aug 2018 09:22:00 +1000 Subject: [PATCH 054/730] add new testapps folder; move previous testapp to testapp-legacy; fix #785 add `notEquals` verifier --- CHANGELOG.md | 1 + src/main/java/act/e2e/verifier/Neq.java | 39 + {testapp => testapp-legacy}/.gitignore | 0 {testapp => testapp-legacy}/pom.xml | 0 {testapp => testapp-legacy}/run.sh | 0 .../src/assembly/pkg.xml | 0 .../src/main/bin/start | 0 .../src/main/bin/start.bat | 0 .../main/java/testapp/FastJson37Issue.java | 0 .../src/main/java/testapp/TestApp.java | 0 .../main/java/testapp/endpoint/Arguments.java | 0 .../BindingWithAnnotationTestBed.java | 0 .../java/testapp/endpoint/CORSTestBed.java | 0 .../java/testapp/endpoint/CSPTestBed.java | 0 .../java/testapp/endpoint/CSRFTestBed.java | 0 .../endpoint/ChineseGreetingService.java | 0 .../endpoint/ContextHierarchiTestBed.java | 0 .../java/testapp/endpoint/CustomBinder.java | 0 .../java/testapp/endpoint/DspTestBed.java | 0 .../java/testapp/endpoint/ETagTestBed.java | 0 .../endpoint/EnglishGreetingService.java | 0 .../testapp/endpoint/GreetingService.java | 0 .../main/java/testapp/endpoint/HelloCli.java | 0 .../testapp/endpoint/HelloController.java | 0 .../java/testapp/endpoint/I18nTestBed.java | 0 .../testapp/endpoint/InheritedOption.java | 0 .../endpoint/InterceptorTestController.java | 0 .../java/testapp/endpoint/MiscsTestBed.java | 0 .../java/testapp/endpoint/MorphiaTestBed.java | 0 .../endpoint/OutputRequestParamsTestBed.java | 0 .../java/testapp/endpoint/ParamAndField.java | 0 .../java/testapp/endpoint/PojoBinding.java | 0 .../SimpleArrayParameterResolver.java | 0 .../testapp/endpoint/SimpleBeanTestBed.java | 0 .../SimpleEventListenerMarkerTestBed.java | 0 .../endpoint/SimpleMapParameterResolver.java | 0 .../endpoint/SimpleParameterResolver.java | 0 .../java/testapp/endpoint/SingleOption.java | 0 .../testapp/endpoint/StatelessTestBed.java | 0 .../java/testapp/endpoint/SysController.java | 0 .../testapp/endpoint/ValidationTestBed.java | 0 .../endpoint/VirtualControllerTestBed.java | 0 .../enhancement/Controler20160911.java | 0 .../java/testapp/endpoint/ghissues/GH136.java | 0 .../endpoint/ghissues/GH136Interceptor.java | 0 .../endpoint/ghissues/GH152Controller.java | 0 .../endpoint/ghissues/GH152Interceptor.java | 0 .../GH152InterceptorGlobalOnMethod.java | 0 .../java/testapp/endpoint/ghissues/GH222.java | 0 .../java/testapp/endpoint/ghissues/GH229.java | 0 .../java/testapp/endpoint/ghissues/GH232.java | 0 .../java/testapp/endpoint/ghissues/GH287.java | 0 .../java/testapp/endpoint/ghissues/GH289.java | 0 .../java/testapp/endpoint/ghissues/GH295.java | 0 .../java/testapp/endpoint/ghissues/GH296.java | 0 .../java/testapp/endpoint/ghissues/GH297.java | 0 .../java/testapp/endpoint/ghissues/GH301.java | 0 .../java/testapp/endpoint/ghissues/GH317.java | 0 .../java/testapp/endpoint/ghissues/GH319.java | 0 .../java/testapp/endpoint/ghissues/GH325.java | 0 .../java/testapp/endpoint/ghissues/GH349.java | 0 .../java/testapp/endpoint/ghissues/GH350.java | 0 .../java/testapp/endpoint/ghissues/GH352.java | 0 .../java/testapp/endpoint/ghissues/GH354.java | 0 .../java/testapp/endpoint/ghissues/GH421.java | 0 .../java/testapp/endpoint/ghissues/GH449.java | 0 .../java/testapp/endpoint/ghissues/GH504.java | 0 .../java/testapp/endpoint/ghissues/GH506.java | 0 .../java/testapp/endpoint/ghissues/GH518.java | 0 .../java/testapp/endpoint/ghissues/GH536.java | 0 .../java/testapp/endpoint/ghissues/GH537.java | 0 .../java/testapp/endpoint/ghissues/GH538.java | 0 .../java/testapp/endpoint/ghissues/GH542.java | 0 .../java/testapp/endpoint/ghissues/GH555.java | 0 .../java/testapp/endpoint/ghissues/GH562.java | 0 .../java/testapp/endpoint/ghissues/GH631.java | 0 .../java/testapp/endpoint/ghissues/GH636.java | 0 .../java/testapp/endpoint/ghissues/GH657.java | 0 .../java/testapp/endpoint/ghissues/GH671.java | 0 .../java/testapp/endpoint/ghissues/GH678.java | 0 .../java/testapp/endpoint/ghissues/GH691.java | 0 .../java/testapp/endpoint/ghissues/Gh318.java | 0 .../java/testapp/endpoint/ghissues/Gh438.java | 0 .../endpoint/ghissues/GithubIssueBase.java | 0 .../endpoint/ghissues/gh304/Gh304Event.java | 0 .../ghissues/gh304/Gh304EventListener.java | 0 .../endpoint/ghissues/gh310/GH310.java | 0 .../endpoint/ghissues/gh310/GH310Model.java | 0 .../endpoint/ghissues/gh353/GH353.java | 0 .../testapp/endpoint/ghissues/gh353/User.java | 0 .../ghissues/gh417/FastJsonIssue.java | 0 .../endpoint/ghissues/gh417/GH417.java | 0 .../endpoint/ghissues/gh417/Record.java | 0 .../endpoint/ghissues/gh426/GH426.java | 0 .../endpoint/ghissues/gh434/ByeService.java | 0 .../ghissues/gh434/FarewellService.java | 0 .../endpoint/ghissues/gh434/GH434.java | 0 .../ghissues/gh434/GreetingService.java | 0 .../endpoint/ghissues/gh434/HelloService.java | 0 .../endpoint/ghissues/gh434/NiHaoService.java | 0 .../endpoint/ghissues/gh434/Service.java | 0 .../ghissues/gh434/ZaiJianService.java | 0 .../endpoint/ghissues/gh446/DataTable.java | 0 .../endpoint/ghissues/gh446/GH446.java | 0 .../endpoint/ghissues/gh471/FooEvent.java | 0 .../endpoint/ghissues/gh471/GH471.java | 0 .../testapp/endpoint/ghissues/gh473/Foo.java | 0 .../endpoint/ghissues/gh473/GH473.java | 0 .../endpoint/ghissues/gh547/DataTable.java | 0 .../endpoint/ghissues/gh547/GH547.java | 0 .../ghissues/gh554/EventListener.java | 0 .../endpoint/ghissues/gh554/GH554.java | 0 .../endpoint/ghissues/gh554/MsgTemplate.java | 0 .../endpoint/ghissues/gh692/Gh692Service.java | 0 .../endpoint/ghissues/gh692/HelloService.java | 0 .../src/main/java/testapp/model/Bar.java | 0 .../src/main/java/testapp/model/Contact.java | 0 .../src/main/java/testapp/model/Foo.java | 0 .../main/java/testapp/model/ModelBase.java | 0 .../src/main/java/testapp/model/RGB.java | 0 .../src/main/java/testapp/model/User.java | 0 .../java/testapp/model/VersionedModel.java | 0 .../java/testapp/model/mongo/GH301Model.java | 0 .../main/java/testapp/model/mongo/Group.java | 0 .../testapp/model/mongo/KVStoreModel.java | 0 .../main/java/testapp/model/mongo/Person.java | 0 .../java/testapp/sbean/DerivedSimpleBean.java | 0 .../NotSimpleBeanWithDefaultConstructor.java | 0 ...otSimpleBeanWithoutDefaultConstructor.java | 0 .../SimpleBeanWithDefaultConstructor.java | 0 .../SimpleBeanWithoutDefaultConstructor.java | 0 .../main/java/testapp/sbean/SimpleModel.java | 0 .../src/main/resources/act.router.macro | 0 .../src/main/resources/app.properties | 0 .../src/main/resources/app.version | 0 .../src/main/resources/bigfile | Bin .../src/main/resources/gh434.properties | 0 .../src/main/resources/gh536.properties | 0 .../src/main/resources/gh631.properties | 0 .../src/main/resources/gh671.properties | 0 .../src/main/resources/logback.xml | 0 .../src/main/resources/messages.properties | 0 .../src/main/resources/messages_en.properties | 0 .../main/resources/messages_zh_CN.properties | 0 .../src/main/resources/routes.conf | 0 .../src/main/resources/rythm/gh/287/foo.html | 0 .../src/main/resources/rythm/gh/352/test.html | 0 .../src/main/resources/rythm/gh/354/foo.html | 0 .../endpoint/HelloController/hello5.html | 0 .../src/main/resources/smallfile | Bin .../src/main/resources/testapp/.version | 0 .../main/resources/testapp/TestApp.properties | 0 .../resources/testapp/TestApp_en.properties | 0 .../testapp/TestApp_zh_CN.properties | 0 .../src/test/java/testapp/TestBase.java | 0 .../java/testapp/benchmark/CuidBenchmark.java | 0 .../test/java/testapp/endpoint/CORSTest.java | 0 .../test/java/testapp/endpoint/CSPTest.java | 0 .../test/java/testapp/endpoint/CSRFTest.java | 0 .../endpoint/ContextHierarchiTest.java | 0 .../testapp/endpoint/CustomBinderTest.java | 0 .../test/java/testapp/endpoint/DspTest.java | 0 .../test/java/testapp/endpoint/ETagTest.java | 0 .../testapp/endpoint/EndPointTestContext.java | 0 .../java/testapp/endpoint/EndpointTester.java | 0 .../java/testapp/endpoint/GHIssue136.java | 0 .../java/testapp/endpoint/GHIssue222.java | 0 .../java/testapp/endpoint/GHIssue229.java | 0 .../java/testapp/endpoint/GHIssue232.java | 0 .../java/testapp/endpoint/GHIssue287.java | 0 .../java/testapp/endpoint/GHIssue289.java | 0 .../java/testapp/endpoint/GHIssue295.java | 0 .../java/testapp/endpoint/GHIssue296.java | 0 .../java/testapp/endpoint/GHIssue297.java | 0 .../java/testapp/endpoint/GHIssue301.java | 0 .../java/testapp/endpoint/GHIssue304.java | 0 .../java/testapp/endpoint/GHIssue310.java | 0 .../java/testapp/endpoint/GHIssue317.java | 0 .../java/testapp/endpoint/GHIssue319.java | 0 .../java/testapp/endpoint/GHIssue325.java | 0 .../java/testapp/endpoint/GHIssue349.java | 0 .../java/testapp/endpoint/GHIssue350.java | 0 .../java/testapp/endpoint/GHIssue352.java | 0 .../java/testapp/endpoint/GHIssue353.java | 0 .../java/testapp/endpoint/GHIssue354.java | 0 .../java/testapp/endpoint/GHIssue421.java | 0 .../java/testapp/endpoint/GHIssue426.java | 0 .../java/testapp/endpoint/GHIssue434.java | 0 .../java/testapp/endpoint/GHIssue438.java | 0 .../java/testapp/endpoint/GHIssue449.java | 0 .../java/testapp/endpoint/GHIssue471.java | 0 .../java/testapp/endpoint/GHIssue473.java | 0 .../java/testapp/endpoint/GHIssue504.java | 0 .../java/testapp/endpoint/GHIssue506.java | 0 .../java/testapp/endpoint/GHIssue518.java | 0 .../java/testapp/endpoint/GHIssue536.java | 0 .../java/testapp/endpoint/GHIssue537.java | 0 .../java/testapp/endpoint/GHIssue538.java | 0 .../java/testapp/endpoint/GHIssue542.java | 0 .../java/testapp/endpoint/GHIssue547.java | 0 .../java/testapp/endpoint/GHIssue554.java | 0 .../java/testapp/endpoint/GHIssue555.java | 0 .../java/testapp/endpoint/GHIssue562.java | 0 .../java/testapp/endpoint/GHIssue631.java | 0 .../java/testapp/endpoint/GHIssue636.java | 0 .../java/testapp/endpoint/GHIssue657.java | 0 .../java/testapp/endpoint/GHIssue671.java | 0 .../java/testapp/endpoint/GHIssue678.java | 0 .../java/testapp/endpoint/GHIssue691.java | 0 .../java/testapp/endpoint/GHIssue692.java | 0 .../testapp/endpoint/HelloControllerTest.java | 0 .../test/java/testapp/endpoint/I18nTest.java | 0 .../testapp/endpoint/InterceptorTest.java | 0 .../java/testapp/endpoint/MorphiaTest.java | 0 .../testapp/endpoint/OutputParamTest.java | 0 .../java/testapp/endpoint/ParamEncoding.java | 0 .../test/java/testapp/endpoint/ReqTest.java | 0 .../java/testapp/endpoint/SimpleBeanTest.java | 0 .../SimpleEventListenerMarkerTest.java | 0 .../java/testapp/endpoint/StatelessTest.java | 0 .../testapp/endpoint/VirtualHandlerTest.java | 0 .../ActionParameterBindingTestBase.java | 0 .../binding/BindingWithAnnotationTest.java | 0 .../endpoint/binding/ParamAndFieldTest.java | 0 ...ecimalArrayActionParameterBindingTest.java | 0 ...ntegerArrayActionParameterBindingTest.java | 0 ...ooleanArrayActionParameterBindingTest.java | 0 .../ByteArrayActionParameterBindingTest.java | 0 .../CharArrayActionParameterBindingTest.java | 0 ...DoubleArrayActionParameterBindingTest.java | 0 .../EnumArrayActionParameterBindingTest.java | 0 .../FloatArrayActionParameterBindingTest.java | 0 .../IntArrayActionParameterBindingTest.java | 0 .../LongArrayActionParameterBindingTest.java | 0 ...peArrayActionParameterBindingTestBase.java | 0 .../ShortArrayActionParameterBindingTest.java | 0 ...peArrayActionParameterBindingTestBase.java | 0 ...StringArrayActionParameterBindingTest.java | 0 .../binding/collection/package-info.java | 0 .../map/BooleanTypeMapValBindingTest.java | 0 .../map/ByteTypeMapValBindingTest.java | 0 .../map/CharacterTypeMapValBindingTest.java | 0 .../map/DoubleTypeMapValBindingTest.java | 0 .../map/EnumTypeMapValBindingTest.java | 0 .../map/FloatTypeMapValBindingTest.java | 0 .../binding/map/IntTypeMapValBindingTest.java | 0 .../map/LongTypeMapValBindingTest.java | 0 .../map/ShortTypeMapValBindingTest.java | 0 .../map/SimpleTypeMapValBindingTestBase.java | 0 .../map/StringTypeMapValBindingTest.java | 0 .../binding/pojo/PojoBindingTest.java | 0 .../endpoint/binding/pojo/PojoEncoder.java | 0 .../BooleanActionParameterBindingTest.java | 0 .../ByteActionParameterBindingTest.java | 0 .../CharActionParameterBindingTest.java | 0 .../DoubleActionParameterBindingTest.java | 0 .../EnumActionParameterBindingTest.java | 0 .../FloatActionParameterBindingTest.java | 0 .../single/IntActionParameterBindingTest.java | 0 .../LongActionParameterBindingTest.java | 0 ...iveTypeActionParameterBindingTestBase.java | 0 .../ShortActionParameterBindingTest.java | 0 ...pleTypeActionParameterBindingTestBase.java | 0 .../StringActionParameterBindingTest.java | 0 .../endpoint/binding/single/package-info.java | 0 .../issue/enhancement/Controler20160911.java | 0 .../issue/enhancement/GHIssue152.java | 0 .../src/test/resources/photo.jpg | Bin testapps/GHIssues/.gitignore | 19 + testapps/GHIssues/pom.xml | 29 + testapps/GHIssues/run_dev | 3 + testapps/GHIssues/run_dev.bat | 2 + testapps/GHIssues/run_e2e | 3 + testapps/GHIssues/run_e2e.bat | 2 + testapps/GHIssues/run_prod | 10 + .../src/main/java/ghissues/AppEntry.java | 12 + .../src/main/java/ghissues/Gh784.java | 16 + .../src/main/java/ghissues/Gh785.java | 21 + .../src/main/resources/asset/changelog.txt | 630 + .../asset/demo-mobile/accordion/_content.html | 18 + .../asset/demo-mobile/accordion/basic.html | 1 + .../asset/demo-mobile/accordion/header.html | 1 + .../asset/demo-mobile/animation/basic.html | 1 + .../asset/demo-mobile/animation/fade.html | 1 + .../asset/demo-mobile/animation/pop.html | 1 + .../asset/demo-mobile/animation/slide.html | 1 + .../asset/demo-mobile/badge/basic.html | 1 + .../asset/demo-mobile/badge/button.html | 1 + .../asset/demo-mobile/badge/list.html | 1 + .../asset/demo-mobile/badge/tabs.html | 1 + .../asset/demo-mobile/button/basic.html | 1 + .../asset/demo-mobile/button/group.html | 1 + .../asset/demo-mobile/button/style.html | 1 + .../asset/demo-mobile/button/switch.html | 1 + .../asset/demo-mobile/datagrid/basic.html | 1 + .../demo-mobile/datagrid/rowediting.html | 104 + .../asset/demo-mobile/datalist/basic.html | 1 + .../asset/demo-mobile/datalist/group.html | 1 + .../asset/demo-mobile/datalist/selection.html | 1 + .../asset/demo-mobile/dialog/basic.html | 46 + .../asset/demo-mobile/dialog/message.html | 41 + .../asset/demo-mobile/form/basic.html | 44 + .../asset/demo-mobile/images/login1.jpg | Bin 0 -> 25789 bytes .../asset/demo-mobile/images/modem.png | Bin 0 -> 1633 bytes .../asset/demo-mobile/images/more.png | Bin 0 -> 110 bytes .../asset/demo-mobile/images/pda.png | Bin 0 -> 1787 bytes .../asset/demo-mobile/images/scanner.png | Bin 0 -> 2600 bytes .../asset/demo-mobile/images/tablet.png | Bin 0 -> 2505 bytes .../demo-mobile/input/numberspinner.html | 1 + .../asset/demo-mobile/input/textbox.html | 1 + .../asset/demo-mobile/layout/basic.html | 32 + .../asset/demo-mobile/menu/basic.html | 39 + .../asset/demo-mobile/menu/menubar.html | 45 + .../asset/demo-mobile/panel/_content.html | 18 + .../asset/demo-mobile/panel/ajax.html | 1 + .../asset/demo-mobile/panel/basic.html | 1 + .../asset/demo-mobile/panel/nav.html | 39 + .../asset/demo-mobile/simplelist/basic.html | 1 + .../asset/demo-mobile/simplelist/button.html | 1 + .../asset/demo-mobile/simplelist/group.html | 1 + .../asset/demo-mobile/simplelist/image.html | 1 + .../asset/demo-mobile/simplelist/link.html | 1 + .../asset/demo-mobile/tabs/basic.html | 1 + .../resources/asset/demo-mobile/tabs/nav.html | 1 + .../asset/demo-mobile/tabs/pill.html | 1 + .../asset/demo-mobile/toolbar/basic.html | 63 + .../asset/demo-mobile/toolbar/button.html | 45 + .../asset/demo-mobile/toolbar/menu.html | 76 + .../asset/demo-mobile/tree/basic.html | 56 + .../resources/asset/demo-mobile/tree/dnd.html | 56 + .../asset/demo/accordion/_content.html | 18 + .../asset/demo/accordion/actions.html | 51 + .../resources/asset/demo/accordion/ajax.html | 28 + .../resources/asset/demo/accordion/basic.html | 52 + .../asset/demo/accordion/datagrid_data1.json | 12 + .../asset/demo/accordion/expandable.html | 33 + .../resources/asset/demo/accordion/fluid.html | 33 + .../asset/demo/accordion/horizontal.html | 52 + .../asset/demo/accordion/multiple.html | 34 + .../resources/asset/demo/accordion/tools.html | 48 + .../resources/asset/demo/calendar/basic.html | 19 + .../resources/asset/demo/calendar/custom.html | 46 + .../asset/demo/calendar/disabledate.html | 28 + .../asset/demo/calendar/firstday.html | 30 + .../resources/asset/demo/calendar/fluid.html | 23 + .../asset/demo/calendar/weeknumber.html | 19 + .../resources/asset/demo/combo/animation.html | 41 + .../resources/asset/demo/combo/basic.html | 48 + .../asset/demo/combobox/actions.html | 88 + .../resources/asset/demo/combobox/basic.html | 73 + .../asset/demo/combobox/combobox_data1.json | 22 + .../asset/demo/combobox/combobox_data2.json | 47 + .../asset/demo/combobox/customformat.html | 39 + .../asset/demo/combobox/dynamicdata.html | 31 + .../resources/asset/demo/combobox/fluid.html | 43 + .../resources/asset/demo/combobox/group.html | 33 + .../resources/asset/demo/combobox/icons.html | 36 + .../asset/demo/combobox/itemicon.html | 35 + .../asset/demo/combobox/multiline.html | 75 + .../asset/demo/combobox/multiple.html | 32 + .../asset/demo/combobox/navigation.html | 77 + .../asset/demo/combobox/remotedata.html | 30 + .../asset/demo/combobox/remotejsonp.html | 54 + .../asset/demo/combogrid/actions.html | 60 + .../resources/asset/demo/combogrid/basic.html | 40 + .../asset/demo/combogrid/datagrid_data1.json | 12 + .../resources/asset/demo/combogrid/fluid.html | 63 + .../asset/demo/combogrid/initvalue.html | 41 + .../asset/demo/combogrid/multiple.html | 42 + .../asset/demo/combogrid/navigation.html | 43 + .../asset/demo/combogrid/setvalue.html | 59 + .../asset/demo/combotree/actions.html | 43 + .../resources/asset/demo/combotree/basic.html | 22 + .../resources/asset/demo/combotree/fluid.html | 25 + .../asset/demo/combotree/initvalue.html | 22 + .../asset/demo/combotree/multiple.html | 26 + .../asset/demo/combotree/tree_data1.json | 49 + .../asset/demo/combotreegrid/basic.html | 34 + .../asset/demo/combotreegrid/multiple.html | 36 + .../demo/combotreegrid/treegrid_data1.json | 73 + .../asset/demo/datagrid/aligncolumns.html | 32 + .../resources/asset/demo/datagrid/basic.html | 32 + .../asset/demo/datagrid/cacheeditor.html | 149 + .../asset/demo/datagrid/cellediting.html | 94 + .../asset/demo/datagrid/cellstyle.html | 42 + .../asset/demo/datagrid/checkbox.html | 42 + .../asset/demo/datagrid/clientpagination.html | 160 + .../asset/demo/datagrid/columngroup.html | 34 + .../asset/demo/datagrid/complextoolbar.html | 50 + .../asset/demo/datagrid/contextmenu.html | 89 + .../asset/demo/datagrid/custompager.html | 53 + .../asset/demo/datagrid/datagrid_data1.json | 12 + .../asset/demo/datagrid/datagrid_data2.json | 15 + .../resources/asset/demo/datagrid/fluid.html | 32 + .../resources/asset/demo/datagrid/footer.html | 38 + .../asset/demo/datagrid/formatcolumns.html | 39 + .../asset/demo/datagrid/frozencolumns.html | 35 + .../asset/demo/datagrid/frozenrows.html | 44 + .../asset/demo/datagrid/mergecells.html | 58 + .../asset/demo/datagrid/multisorting.html | 37 + .../asset/demo/datagrid/products.json | 9 + .../asset/demo/datagrid/rowborder.html | 60 + .../asset/demo/datagrid/rowediting.html | 125 + .../asset/demo/datagrid/rowstyle.html | 41 + .../asset/demo/datagrid/selection.html | 57 + .../asset/demo/datagrid/simpletoolbar.html | 45 + .../asset/demo/datagrid/transform.html | 46 + .../resources/asset/demo/datalist/basic.html | 69 + .../asset/demo/datalist/checkbox.html | 25 + .../asset/demo/datalist/datalist_data1.json | 18 + .../resources/asset/demo/datalist/group.html | 23 + .../asset/demo/datalist/multiselect.html | 23 + .../asset/demo/datalist/remotedata.html | 22 + .../resources/asset/demo/datebox/basic.html | 25 + .../resources/asset/demo/datebox/buttons.html | 34 + .../resources/asset/demo/datebox/clone.html | 31 + .../asset/demo/datebox/dateformat.html | 45 + .../resources/asset/demo/datebox/events.html | 31 + .../resources/asset/demo/datebox/fluid.html | 25 + .../asset/demo/datebox/restrict.html | 34 + .../asset/demo/datebox/sharedcalendar.html | 26 + .../asset/demo/datebox/validate.html | 37 + .../asset/demo/datetimebox/basic.html | 25 + .../asset/demo/datetimebox/fluid.html | 25 + .../asset/demo/datetimebox/initvalue.html | 22 + .../asset/demo/datetimebox/showseconds.html | 25 + .../asset/demo/datetimespinner/basic.html | 25 + .../asset/demo/datetimespinner/clearicon.html | 33 + .../asset/demo/datetimespinner/fluid.html | 25 + .../asset/demo/datetimespinner/format.html | 55 + .../src/main/resources/asset/demo/demo.css | 24 + .../resources/asset/demo/dialog/basic.html | 23 + .../asset/demo/dialog/complextoolbar.html | 46 + .../resources/asset/demo/dialog/fluid.html | 24 + .../asset/demo/dialog/toolbarbuttons.html | 52 + .../resources/asset/demo/draggable/basic.html | 21 + .../asset/demo/draggable/constrain.html | 35 + .../resources/asset/demo/draggable/snap.html | 37 + .../asset/demo/droppable/accept.html | 78 + .../resources/asset/demo/droppable/basic.html | 77 + .../resources/asset/demo/droppable/sort.html | 71 + .../asset/demo/easyloader/basic.html | 75 + .../resources/asset/demo/filebox/basic.html | 31 + .../asset/demo/filebox/buttonalign.html | 32 + .../resources/asset/demo/filebox/fluid.html | 25 + .../main/resources/asset/demo/form/basic.html | 48 + .../resources/asset/demo/form/form_data1.json | 8 + .../main/resources/asset/demo/form/load.html | 62 + .../asset/demo/form/validateonsubmit.html | 52 + .../resources/asset/demo/layout/_content.html | 18 + .../asset/demo/layout/addremove.html | 53 + .../asset/demo/layout/autoheight.html | 59 + .../resources/asset/demo/layout/basic.html | 39 + .../asset/demo/layout/collapsetitle.html | 39 + .../resources/asset/demo/layout/complex.html | 57 + .../demo/layout/customcollapsetitle.html | 51 + .../asset/demo/layout/datagrid_data1.json | 12 + .../resources/asset/demo/layout/fluid.html | 24 + .../resources/asset/demo/layout/full.html | 19 + .../asset/demo/layout/nestedlayout.html | 31 + .../asset/demo/layout/nocollapsible.html | 34 + .../asset/demo/layout/propertygrid_data1.json | 20 + .../asset/demo/layout/tree_data1.json | 49 + .../asset/demo/linkbutton/basic.html | 33 + .../asset/demo/linkbutton/fluid.html | 33 + .../asset/demo/linkbutton/group.html | 33 + .../asset/demo/linkbutton/iconalign.html | 32 + .../asset/demo/linkbutton/plain.html | 28 + .../resources/asset/demo/linkbutton/size.html | 34 + .../asset/demo/linkbutton/style.html | 31 + .../asset/demo/linkbutton/toggle.html | 25 + .../resources/asset/demo/maskedbox/basic.html | 30 + .../main/resources/asset/demo/menu/basic.html | 68 + .../resources/asset/demo/menu/customitem.html | 50 + .../resources/asset/demo/menu/events.html | 40 + .../resources/asset/demo/menu/inline.html | 59 + .../main/resources/asset/demo/menu/nav.html | 146 + .../asset/demo/menubutton/actions.html | 58 + .../asset/demo/menubutton/alignment.html | 69 + .../asset/demo/menubutton/basic.html | 54 + .../resources/asset/demo/menubutton/nav.html | 166 + .../resources/asset/demo/messager/alert.html | 40 + .../resources/asset/demo/messager/basic.html | 56 + .../asset/demo/messager/interactive.html | 36 + .../asset/demo/messager/position.html | 140 + .../resources/asset/demo/numberbox/basic.html | 29 + .../resources/asset/demo/numberbox/fluid.html | 26 + .../asset/demo/numberbox/format.html | 34 + .../resources/asset/demo/numberbox/range.html | 28 + .../asset/demo/numberspinner/align.html | 31 + .../asset/demo/numberspinner/basic.html | 27 + .../asset/demo/numberspinner/fluid.html | 25 + .../asset/demo/numberspinner/increment.html | 28 + .../asset/demo/numberspinner/range.html | 25 + .../asset/demo/pagination/attaching.html | 32 + .../asset/demo/pagination/basic.html | 20 + .../asset/demo/pagination/custombuttons.html | 38 + .../asset/demo/pagination/layout.html | 62 + .../asset/demo/pagination/links.html | 23 + .../asset/demo/pagination/simple.html | 25 + .../resources/asset/demo/panel/_content.html | 18 + .../resources/asset/demo/panel/basic.html | 31 + .../asset/demo/panel/customtools.html | 35 + .../resources/asset/demo/panel/fluid.html | 21 + .../resources/asset/demo/panel/footer.html | 22 + .../resources/asset/demo/panel/halign.html | 26 + .../asset/demo/panel/loadcontent.html | 27 + .../asset/demo/panel/nestedpanel.html | 30 + .../asset/demo/panel/paneltools.html | 37 + .../asset/demo/passwordbox/basic.html | 25 + .../asset/demo/passwordbox/flash.html | 48 + .../demo/passwordbox/validatepassword.html | 40 + .../asset/demo/progressbar/basic.html | 30 + .../asset/demo/progressbar/fluid.html | 21 + .../asset/demo/propertygrid/basic.html | 61 + .../demo/propertygrid/customcolumns.html | 31 + .../asset/demo/propertygrid/groupformat.html | 30 + .../demo/propertygrid/propertygrid_data1.json | 20 + .../resources/asset/demo/resizable/basic.html | 24 + .../resources/asset/demo/searchbox/basic.html | 25 + .../asset/demo/searchbox/category.html | 30 + .../resources/asset/demo/searchbox/fluid.html | 29 + .../resources/asset/demo/sidemenu/basic.html | 58 + .../resources/asset/demo/sidemenu/style.css | 63 + .../resources/asset/demo/sidemenu/style.html | 70 + .../resources/asset/demo/slider/basic.html | 18 + .../resources/asset/demo/slider/fluid.html | 21 + .../asset/demo/slider/formattip.html | 28 + .../asset/demo/slider/nonlinear.html | 58 + .../resources/asset/demo/slider/range.html | 23 + .../resources/asset/demo/slider/rule.html | 21 + .../resources/asset/demo/slider/vertical.html | 25 + .../asset/demo/splitbutton/actions.html | 64 + .../asset/demo/splitbutton/basic.html | 61 + .../asset/demo/switchbutton/action.html | 24 + .../asset/demo/switchbutton/basic.html | 32 + .../resources/asset/demo/tabs/_content.html | 18 + .../resources/asset/demo/tabs/autoheight.html | 36 + .../main/resources/asset/demo/tabs/basic.html | 36 + .../resources/asset/demo/tabs/dropdown.html | 55 + .../resources/asset/demo/tabs/fixedwidth.html | 37 + .../main/resources/asset/demo/tabs/fluid.html | 24 + .../main/resources/asset/demo/tabs/hover.html | 46 + .../asset/demo/tabs/images/modem.png | Bin 0 -> 1633 bytes .../resources/asset/demo/tabs/images/pda.png | Bin 0 -> 1787 bytes .../asset/demo/tabs/images/scanner.png | Bin 0 -> 2600 bytes .../asset/demo/tabs/images/tablet.png | Bin 0 -> 2505 bytes .../resources/asset/demo/tabs/nestedtabs.html | 54 + .../resources/asset/demo/tabs/striptools.html | 39 + .../main/resources/asset/demo/tabs/style.html | 51 + .../resources/asset/demo/tabs/tabimage.html | 41 + .../asset/demo/tabs/tabposition.html | 45 + .../resources/asset/demo/tabs/tabstools.html | 41 + .../resources/asset/demo/tabs/tree_data1.json | 49 + .../asset/demo/tagbox/autocomplete.html | 29 + .../resources/asset/demo/tagbox/basic.html | 20 + .../resources/asset/demo/tagbox/button.html | 25 + .../resources/asset/demo/tagbox/format.html | 24 + .../resources/asset/demo/tagbox/style.html | 35 + .../asset/demo/tagbox/tagbox_data1.json | 21 + .../resources/asset/demo/tagbox/validate.html | 34 + .../resources/asset/demo/textbox/basic.html | 35 + .../resources/asset/demo/textbox/button.html | 25 + .../asset/demo/textbox/clearicon.html | 68 + .../resources/asset/demo/textbox/custom.html | 34 + .../resources/asset/demo/textbox/fluid.html | 25 + .../resources/asset/demo/textbox/icons.html | 51 + .../asset/demo/textbox/multiline.html | 25 + .../resources/asset/demo/textbox/size.html | 31 + .../asset/demo/timespinner/actions.html | 42 + .../asset/demo/timespinner/basic.html | 25 + .../asset/demo/timespinner/fluid.html | 25 + .../asset/demo/timespinner/range.html | 24 + .../asset/demo/tooltip/_content.html | 18 + .../resources/asset/demo/tooltip/_dialog.html | 23 + .../resources/asset/demo/tooltip/ajax.html | 32 + .../resources/asset/demo/tooltip/basic.html | 20 + .../asset/demo/tooltip/customcontent.html | 32 + .../asset/demo/tooltip/customstyle.html | 52 + .../asset/demo/tooltip/position.html | 34 + .../resources/asset/demo/tooltip/toolbar.html | 40 + .../asset/demo/tooltip/tooltipdialog.html | 44 + .../resources/asset/demo/tree/actions.html | 47 + .../resources/asset/demo/tree/animation.html | 20 + .../main/resources/asset/demo/tree/basic.html | 53 + .../resources/asset/demo/tree/checkbox.html | 37 + .../asset/demo/tree/contextmenu.html | 65 + .../asset/demo/tree/customcheckbox.html | 29 + .../main/resources/asset/demo/tree/dnd.html | 20 + .../resources/asset/demo/tree/editable.html | 27 + .../resources/asset/demo/tree/formatting.html | 32 + .../main/resources/asset/demo/tree/icons.html | 20 + .../resources/asset/demo/tree/lazyload.html | 82 + .../main/resources/asset/demo/tree/lines.html | 20 + .../resources/asset/demo/tree/tree_data1.json | 49 + .../resources/asset/demo/tree/tree_data2.json | 61 + .../asset/demo/treegrid/actions.html | 64 + .../resources/asset/demo/treegrid/basic.html | 34 + .../asset/demo/treegrid/checkbox.html | 35 + .../asset/demo/treegrid/clientpagination.html | 189 + .../asset/demo/treegrid/contextmenu.html | 106 + .../asset/demo/treegrid/customcheckbox.html | 40 + .../asset/demo/treegrid/editable.html | 93 + .../resources/asset/demo/treegrid/fluid.html | 33 + .../resources/asset/demo/treegrid/footer.html | 55 + .../resources/asset/demo/treegrid/lines.html | 35 + .../asset/demo/treegrid/reports.html | 49 + .../asset/demo/treegrid/treegrid_data1.json | 73 + .../asset/demo/treegrid/treegrid_data2.json | 11 + .../asset/demo/treegrid/treegrid_data3.json | 13 + .../asset/demo/validatebox/basic.html | 45 + .../asset/demo/validatebox/customtooltip.html | 56 + .../demo/validatebox/errorplacement.html | 62 + .../demo/validatebox/validateonblur.html | 45 + .../resources/asset/demo/window/basic.html | 23 + .../asset/demo/window/borderstyle.html | 53 + .../asset/demo/window/customtools.html | 30 + .../resources/asset/demo/window/fluid.html | 24 + .../resources/asset/demo/window/footer.html | 24 + .../asset/demo/window/inlinewindow.html | 26 + .../asset/demo/window/modalwindow.html | 24 + .../asset/demo/window/windowlayout.html | 33 + .../src/main/resources/asset/easyloader.js | 190 + .../main/resources/asset/jquery.easyui.min.js | 16776 ++++++++++++++++ .../resources/asset/jquery.easyui.mobile.js | 141 + .../src/main/resources/asset/jquery.min.js | 5 + .../main/resources/asset/license_freeware.txt | 14 + .../resources/asset/locale/easyui-lang-af.js | 44 + .../resources/asset/locale/easyui-lang-am.js | 46 + .../resources/asset/locale/easyui-lang-ar.js | 45 + .../resources/asset/locale/easyui-lang-bg.js | 44 + .../resources/asset/locale/easyui-lang-ca.js | 44 + .../resources/asset/locale/easyui-lang-cs.js | 44 + .../resources/asset/locale/easyui-lang-cz.js | 44 + .../resources/asset/locale/easyui-lang-da.js | 44 + .../resources/asset/locale/easyui-lang-de.js | 63 + .../resources/asset/locale/easyui-lang-el.js | 45 + .../resources/asset/locale/easyui-lang-en.js | 45 + .../resources/asset/locale/easyui-lang-es.js | 45 + .../resources/asset/locale/easyui-lang-fa.js | 45 + .../resources/asset/locale/easyui-lang-fr.js | 62 + .../resources/asset/locale/easyui-lang-it.js | 64 + .../resources/asset/locale/easyui-lang-jp.js | 45 + .../resources/asset/locale/easyui-lang-ko.js | 45 + .../resources/asset/locale/easyui-lang-nl.js | 44 + .../resources/asset/locale/easyui-lang-pl.js | 45 + .../asset/locale/easyui-lang-pt_BR.js | 45 + .../resources/asset/locale/easyui-lang-ru.js | 46 + .../asset/locale/easyui-lang-sv_SE.js | 45 + .../resources/asset/locale/easyui-lang-tr.js | 59 + .../resources/asset/locale/easyui-lang-ua.js | 46 + .../asset/locale/easyui-lang-zh_CN.js | 66 + .../asset/locale/easyui-lang-zh_TW.js | 48 + .../asset/plugins/jquery.accordion.js | 350 + .../asset/plugins/jquery.calendar.js | 403 + .../resources/asset/plugins/jquery.combo.js | 404 + .../asset/plugins/jquery.combobox.js | 611 + .../asset/plugins/jquery.combogrid.js | 351 + .../asset/plugins/jquery.combotree.js | 237 + .../asset/plugins/jquery.combotreegrid.js | 317 + .../asset/plugins/jquery.datagrid.js | 2580 +++ .../asset/plugins/jquery.datalist.js | 136 + .../resources/asset/plugins/jquery.datebox.js | 215 + .../asset/plugins/jquery.datetimebox.js | 179 + .../asset/plugins/jquery.datetimespinner.js | 61 + .../resources/asset/plugins/jquery.dialog.js | 136 + .../asset/plugins/jquery.draggable.js | 306 + .../asset/plugins/jquery.droppable.js | 62 + .../resources/asset/plugins/jquery.filebox.js | 100 + .../resources/asset/plugins/jquery.form.js | 410 + .../resources/asset/plugins/jquery.layout.js | 519 + .../asset/plugins/jquery.linkbutton.js | 184 + .../asset/plugins/jquery.maskedbox.js | 221 + .../resources/asset/plugins/jquery.menu.js | 502 + .../asset/plugins/jquery.menubutton.js | 123 + .../asset/plugins/jquery.messager.js | 186 + .../resources/asset/plugins/jquery.mobile.js | 141 + .../asset/plugins/jquery.numberbox.js | 184 + .../asset/plugins/jquery.numberspinner.js | 58 + .../asset/plugins/jquery.pagination.js | 296 + .../resources/asset/plugins/jquery.panel.js | 691 + .../resources/asset/plugins/jquery.parser.js | 386 + .../asset/plugins/jquery.passwordbox.js | 156 + .../asset/plugins/jquery.progressbar.js | 84 + .../asset/plugins/jquery.propertygrid.js | 427 + .../asset/plugins/jquery.resizable.js | 173 + .../asset/plugins/jquery.searchbox.js | 132 + .../asset/plugins/jquery.sidemenu.js | 226 + .../resources/asset/plugins/jquery.slider.js | 347 + .../resources/asset/plugins/jquery.spinner.js | 128 + .../asset/plugins/jquery.splitbutton.js | 49 + .../asset/plugins/jquery.switchbutton.js | 193 + .../resources/asset/plugins/jquery.tabs.js | 716 + .../resources/asset/plugins/jquery.tagbox.js | 223 + .../resources/asset/plugins/jquery.textbox.js | 566 + .../asset/plugins/jquery.timespinner.js | 149 + .../resources/asset/plugins/jquery.tooltip.js | 238 + .../resources/asset/plugins/jquery.tree.js | 1247 ++ .../asset/plugins/jquery.treegrid.js | 1353 ++ .../asset/plugins/jquery.validatebox.js | 310 + .../resources/asset/plugins/jquery.window.js | 311 + .../src/main/resources/asset/readme.txt | 4 + .../main/resources/asset/src/easyloader.js | 439 + .../resources/asset/src/jquery.accordion.js | 493 + .../resources/asset/src/jquery.calendar.js | 455 + .../resources/asset/src/jquery.combobox.js | 742 + .../resources/asset/src/jquery.datebox.js | 288 + .../resources/asset/src/jquery.draggable.js | 399 + .../resources/asset/src/jquery.droppable.js | 81 + .../main/resources/asset/src/jquery.form.js | 492 + .../resources/asset/src/jquery.linkbutton.js | 243 + .../main/resources/asset/src/jquery.menu.js | 648 + .../main/resources/asset/src/jquery.parser.js | 431 + .../resources/asset/src/jquery.progressbar.js | 107 + .../asset/src/jquery.propertygrid.js | 525 + .../resources/asset/src/jquery.resizable.js | 228 + .../main/resources/asset/src/jquery.slider.js | 455 + .../main/resources/asset/src/jquery.tabs.js | 927 + .../main/resources/asset/src/jquery.window.js | 417 + .../main/resources/asset/themes/angular.css | 639 + .../asset/themes/black/accordion.css | 89 + .../resources/asset/themes/black/calendar.css | 203 + .../resources/asset/themes/black/checkbox.css | 31 + .../resources/asset/themes/black/combo.css | 35 + .../resources/asset/themes/black/combobox.css | 40 + .../resources/asset/themes/black/datagrid.css | 291 + .../resources/asset/themes/black/datalist.css | 95 + .../resources/asset/themes/black/datebox.css | 36 + .../resources/asset/themes/black/dialog.css | 47 + .../resources/asset/themes/black/easyui.css | 3427 ++++ .../resources/asset/themes/black/filebox.css | 20 + .../themes/black/images/accordion_arrows.png | Bin 0 -> 122 bytes .../asset/themes/black/images/blank.gif | Bin 0 -> 43 bytes .../themes/black/images/calendar_arrows.png | Bin 0 -> 173 bytes .../asset/themes/black/images/combo_arrow.png | Bin 0 -> 100 bytes .../themes/black/images/datagrid_icons.png | Bin 0 -> 300 bytes .../themes/black/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/black/images/layout_arrows.png | Bin 0 -> 179 bytes .../themes/black/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/black/images/loading.gif | Bin 0 -> 1737 bytes .../asset/themes/black/images/menu_arrows.png | Bin 0 -> 134 bytes .../themes/black/images/messager_icons.png | Bin 0 -> 6116 bytes .../themes/black/images/pagination_icons.png | Bin 0 -> 339 bytes .../asset/themes/black/images/panel_tools.png | Bin 0 -> 184 bytes .../themes/black/images/passwordbox_close.png | Bin 0 -> 149 bytes .../themes/black/images/passwordbox_open.png | Bin 0 -> 160 bytes .../themes/black/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/black/images/slider_handle.png | Bin 0 -> 863 bytes .../themes/black/images/spinner_arrows.png | Bin 0 -> 140 bytes .../asset/themes/black/images/tabs_icons.png | Bin 0 -> 144 bytes .../themes/black/images/tagbox_icons.png | Bin 0 -> 133 bytes .../asset/themes/black/images/tree_icons.png | Bin 0 -> 3086 bytes .../black/images/validatebox_warning.png | Bin 0 -> 921 bytes .../resources/asset/themes/black/layout.css | 150 + .../asset/themes/black/linkbutton.css | 203 + .../resources/asset/themes/black/menu.css | 119 + .../asset/themes/black/menubutton.css | 94 + .../resources/asset/themes/black/messager.css | 44 + .../asset/themes/black/numberbox.css | 0 .../asset/themes/black/pagination.css | 77 + .../resources/asset/themes/black/panel.css | 267 + .../asset/themes/black/passwordbox.css | 6 + .../asset/themes/black/progressbar.css | 33 + .../asset/themes/black/propertygrid.css | 27 + .../asset/themes/black/radiobutton.css | 25 + .../asset/themes/black/searchbox.css | 61 + .../resources/asset/themes/black/sidemenu.css | 69 + .../resources/asset/themes/black/slider.css | 101 + .../resources/asset/themes/black/spinner.css | 114 + .../asset/themes/black/splitbutton.css | 12 + .../asset/themes/black/switchbutton.css | 77 + .../resources/asset/themes/black/tabs.css | 413 + .../resources/asset/themes/black/tagbox.css | 44 + .../resources/asset/themes/black/textbox.css | 144 + .../resources/asset/themes/black/tooltip.css | 103 + .../resources/asset/themes/black/tree.css | 164 + .../asset/themes/black/validatebox.css | 5 + .../resources/asset/themes/black/window.css | 188 + .../asset/themes/bootstrap/accordion.css | 89 + .../asset/themes/bootstrap/calendar.css | 203 + .../asset/themes/bootstrap/checkbox.css | 31 + .../asset/themes/bootstrap/combo.css | 35 + .../asset/themes/bootstrap/combobox.css | 40 + .../asset/themes/bootstrap/datagrid.css | 291 + .../asset/themes/bootstrap/datalist.css | 95 + .../asset/themes/bootstrap/datebox.css | 36 + .../asset/themes/bootstrap/dialog.css | 47 + .../asset/themes/bootstrap/easyui.css | 3446 ++++ .../asset/themes/bootstrap/filebox.css | 20 + .../bootstrap/images/accordion_arrows.png | Bin 0 -> 184 bytes .../asset/themes/bootstrap/images/blank.gif | Bin 0 -> 43 bytes .../bootstrap/images/calendar_arrows.png | Bin 0 -> 173 bytes .../themes/bootstrap/images/combo_arrow.png | Bin 0 -> 117 bytes .../bootstrap/images/datagrid_icons.png | Bin 0 -> 307 bytes .../themes/bootstrap/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/bootstrap/images/layout_arrows.png | Bin 0 -> 319 bytes .../themes/bootstrap/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/bootstrap/images/loading.gif | Bin 0 -> 1737 bytes .../themes/bootstrap/images/menu_arrows.png | Bin 0 -> 160 bytes .../bootstrap/images/messager_icons.png | Bin 0 -> 6116 bytes .../bootstrap/images/pagination_icons.png | Bin 0 -> 628 bytes .../themes/bootstrap/images/panel_tools.png | Bin 0 -> 194 bytes .../bootstrap/images/passwordbox_close.png | Bin 0 -> 159 bytes .../bootstrap/images/passwordbox_open.png | Bin 0 -> 165 bytes .../bootstrap/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/bootstrap/images/slider_handle.png | Bin 0 -> 863 bytes .../bootstrap/images/spinner_arrows.png | Bin 0 -> 149 bytes .../themes/bootstrap/images/tabs_icons.png | Bin 0 -> 150 bytes .../themes/bootstrap/images/tagbox_icons.png | Bin 0 -> 134 bytes .../themes/bootstrap/images/tree_icons.png | Bin 0 -> 3115 bytes .../bootstrap/images/validatebox_warning.png | Bin 0 -> 921 bytes .../asset/themes/bootstrap/layout.css | 150 + .../asset/themes/bootstrap/linkbutton.css | 203 + .../resources/asset/themes/bootstrap/menu.css | 119 + .../asset/themes/bootstrap/menubutton.css | 94 + .../asset/themes/bootstrap/messager.css | 44 + .../asset/themes/bootstrap/numberbox.css | 0 .../asset/themes/bootstrap/pagination.css | 77 + .../asset/themes/bootstrap/panel.css | 267 + .../asset/themes/bootstrap/passwordbox.css | 6 + .../asset/themes/bootstrap/progressbar.css | 33 + .../asset/themes/bootstrap/propertygrid.css | 27 + .../asset/themes/bootstrap/radiobutton.css | 25 + .../asset/themes/bootstrap/searchbox.css | 61 + .../asset/themes/bootstrap/sidemenu.css | 69 + .../asset/themes/bootstrap/slider.css | 101 + .../asset/themes/bootstrap/spinner.css | 114 + .../asset/themes/bootstrap/splitbutton.css | 12 + .../asset/themes/bootstrap/switchbutton.css | 77 + .../resources/asset/themes/bootstrap/tabs.css | 413 + .../asset/themes/bootstrap/tagbox.css | 44 + .../asset/themes/bootstrap/textbox.css | 144 + .../asset/themes/bootstrap/tooltip.css | 103 + .../resources/asset/themes/bootstrap/tree.css | 164 + .../asset/themes/bootstrap/validatebox.css | 5 + .../asset/themes/bootstrap/window.css | 188 + .../src/main/resources/asset/themes/color.css | 210 + .../asset/themes/default/accordion.css | 89 + .../asset/themes/default/calendar.css | 203 + .../asset/themes/default/checkbox.css | 31 + .../resources/asset/themes/default/combo.css | 35 + .../asset/themes/default/combobox.css | 40 + .../asset/themes/default/datagrid.css | 291 + .../asset/themes/default/datalist.css | 95 + .../asset/themes/default/datebox.css | 36 + .../resources/asset/themes/default/dialog.css | 47 + .../resources/asset/themes/default/easyui.css | 3427 ++++ .../asset/themes/default/filebox.css | 20 + .../default/images/accordion_arrows.png | Bin 0 -> 184 bytes .../asset/themes/default/images/blank.gif | Bin 0 -> 43 bytes .../themes/default/images/calendar_arrows.png | Bin 0 -> 173 bytes .../themes/default/images/combo_arrow.png | Bin 0 -> 117 bytes .../themes/default/images/datagrid_icons.png | Bin 0 -> 307 bytes .../themes/default/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/default/images/layout_arrows.png | Bin 0 -> 319 bytes .../themes/default/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/default/images/loading.gif | Bin 0 -> 1737 bytes .../themes/default/images/menu_arrows.png | Bin 0 -> 160 bytes .../themes/default/images/messager_icons.png | Bin 0 -> 6116 bytes .../default/images/pagination_icons.png | Bin 0 -> 628 bytes .../themes/default/images/panel_tools.png | Bin 0 -> 852 bytes .../default/images/passwordbox_close.png | Bin 0 -> 159 bytes .../default/images/passwordbox_open.png | Bin 0 -> 165 bytes .../default/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/default/images/slider_handle.png | Bin 0 -> 863 bytes .../themes/default/images/spinner_arrows.png | Bin 0 -> 149 bytes .../themes/default/images/tabs_icons.png | Bin 0 -> 150 bytes .../themes/default/images/tagbox_icons.png | Bin 0 -> 134 bytes .../themes/default/images/tree_icons.png | Bin 0 -> 3115 bytes .../default/images/validatebox_warning.png | Bin 0 -> 921 bytes .../resources/asset/themes/default/layout.css | 150 + .../asset/themes/default/linkbutton.css | 203 + .../resources/asset/themes/default/menu.css | 119 + .../asset/themes/default/menubutton.css | 94 + .../asset/themes/default/messager.css | 44 + .../asset/themes/default/numberbox.css | 0 .../asset/themes/default/pagination.css | 77 + .../resources/asset/themes/default/panel.css | 267 + .../asset/themes/default/passwordbox.css | 6 + .../asset/themes/default/progressbar.css | 33 + .../asset/themes/default/propertygrid.css | 27 + .../asset/themes/default/radiobutton.css | 25 + .../asset/themes/default/searchbox.css | 61 + .../asset/themes/default/sidemenu.css | 69 + .../resources/asset/themes/default/slider.css | 101 + .../asset/themes/default/spinner.css | 114 + .../asset/themes/default/splitbutton.css | 12 + .../asset/themes/default/switchbutton.css | 77 + .../resources/asset/themes/default/tabs.css | 413 + .../resources/asset/themes/default/tagbox.css | 44 + .../asset/themes/default/textbox.css | 144 + .../asset/themes/default/tooltip.css | 103 + .../resources/asset/themes/default/tree.css | 164 + .../asset/themes/default/validatebox.css | 5 + .../resources/asset/themes/default/window.css | 188 + .../resources/asset/themes/gray/accordion.css | 89 + .../resources/asset/themes/gray/calendar.css | 203 + .../resources/asset/themes/gray/checkbox.css | 31 + .../resources/asset/themes/gray/combo.css | 35 + .../resources/asset/themes/gray/combobox.css | 40 + .../resources/asset/themes/gray/datagrid.css | 291 + .../resources/asset/themes/gray/datalist.css | 95 + .../resources/asset/themes/gray/datebox.css | 36 + .../resources/asset/themes/gray/dialog.css | 47 + .../resources/asset/themes/gray/easyui.css | 3427 ++++ .../resources/asset/themes/gray/filebox.css | 20 + .../themes/gray/images/accordion_arrows.png | Bin 0 -> 125 bytes .../asset/themes/gray/images/blank.gif | Bin 0 -> 43 bytes .../themes/gray/images/calendar_arrows.png | Bin 0 -> 173 bytes .../asset/themes/gray/images/combo_arrow.png | Bin 0 -> 103 bytes .../themes/gray/images/datagrid_icons.png | Bin 0 -> 330 bytes .../themes/gray/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/gray/images/layout_arrows.png | Bin 0 -> 181 bytes .../themes/gray/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/gray/images/loading.gif | Bin 0 -> 1737 bytes .../asset/themes/gray/images/menu_arrows.png | Bin 0 -> 160 bytes .../themes/gray/images/messager_icons.png | Bin 0 -> 6116 bytes .../themes/gray/images/pagination_icons.png | Bin 0 -> 466 bytes .../asset/themes/gray/images/panel_tools.png | Bin 0 -> 191 bytes .../themes/gray/images/passwordbox_close.png | Bin 0 -> 149 bytes .../themes/gray/images/passwordbox_open.png | Bin 0 -> 160 bytes .../themes/gray/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/gray/images/slider_handle.png | Bin 0 -> 863 bytes .../themes/gray/images/spinner_arrows.png | Bin 0 -> 149 bytes .../asset/themes/gray/images/tabs_icons.png | Bin 0 -> 144 bytes .../asset/themes/gray/images/tagbox_icons.png | Bin 0 -> 133 bytes .../asset/themes/gray/images/tree_icons.png | Bin 0 -> 3115 bytes .../gray/images/validatebox_warning.png | Bin 0 -> 921 bytes .../resources/asset/themes/gray/layout.css | 150 + .../asset/themes/gray/linkbutton.css | 203 + .../main/resources/asset/themes/gray/menu.css | 119 + .../asset/themes/gray/menubutton.css | 94 + .../resources/asset/themes/gray/messager.css | 44 + .../resources/asset/themes/gray/numberbox.css | 0 .../asset/themes/gray/pagination.css | 77 + .../resources/asset/themes/gray/panel.css | 267 + .../asset/themes/gray/passwordbox.css | 6 + .../asset/themes/gray/progressbar.css | 33 + .../asset/themes/gray/propertygrid.css | 27 + .../asset/themes/gray/radiobutton.css | 25 + .../resources/asset/themes/gray/searchbox.css | 61 + .../resources/asset/themes/gray/sidemenu.css | 69 + .../resources/asset/themes/gray/slider.css | 101 + .../resources/asset/themes/gray/spinner.css | 114 + .../asset/themes/gray/splitbutton.css | 12 + .../asset/themes/gray/switchbutton.css | 77 + .../main/resources/asset/themes/gray/tabs.css | 413 + .../resources/asset/themes/gray/tagbox.css | 44 + .../resources/asset/themes/gray/textbox.css | 144 + .../resources/asset/themes/gray/tooltip.css | 103 + .../main/resources/asset/themes/gray/tree.css | 164 + .../asset/themes/gray/validatebox.css | 5 + .../resources/asset/themes/gray/window.css | 188 + .../src/main/resources/asset/themes/icon.css | 96 + .../resources/asset/themes/icons/back.png | Bin 0 -> 912 bytes .../resources/asset/themes/icons/blank.gif | Bin 0 -> 43 bytes .../resources/asset/themes/icons/cancel.png | Bin 0 -> 1133 bytes .../resources/asset/themes/icons/clear.png | Bin 0 -> 779 bytes .../main/resources/asset/themes/icons/cut.png | Bin 0 -> 1024 bytes .../resources/asset/themes/icons/edit_add.png | Bin 0 -> 1088 bytes .../asset/themes/icons/edit_remove.png | Bin 0 -> 625 bytes .../resources/asset/themes/icons/filesave.png | Bin 0 -> 898 bytes .../resources/asset/themes/icons/filter.png | Bin 0 -> 305 bytes .../resources/asset/themes/icons/help.png | Bin 0 -> 1187 bytes .../asset/themes/icons/large_chart.png | Bin 0 -> 1669 bytes .../asset/themes/icons/large_clipart.png | Bin 0 -> 1727 bytes .../asset/themes/icons/large_picture.png | Bin 0 -> 1667 bytes .../asset/themes/icons/large_shapes.png | Bin 0 -> 1318 bytes .../asset/themes/icons/large_smartart.png | Bin 0 -> 1336 bytes .../resources/asset/themes/icons/lock.png | Bin 0 -> 311 bytes .../main/resources/asset/themes/icons/man.png | Bin 0 -> 244 bytes .../resources/asset/themes/icons/mini_add.png | Bin 0 -> 244 bytes .../asset/themes/icons/mini_edit.png | Bin 0 -> 161 bytes .../asset/themes/icons/mini_refresh.png | Bin 0 -> 160 bytes .../resources/asset/themes/icons/more.png | Bin 0 -> 110 bytes .../main/resources/asset/themes/icons/no.png | Bin 0 -> 922 bytes .../main/resources/asset/themes/icons/ok.png | Bin 0 -> 883 bytes .../resources/asset/themes/icons/pencil.png | Bin 0 -> 713 bytes .../resources/asset/themes/icons/print.png | Bin 0 -> 1057 bytes .../resources/asset/themes/icons/redo.png | Bin 0 -> 708 bytes .../resources/asset/themes/icons/reload.png | Bin 0 -> 1045 bytes .../resources/asset/themes/icons/search.png | Bin 0 -> 813 bytes .../main/resources/asset/themes/icons/sum.png | Bin 0 -> 289 bytes .../main/resources/asset/themes/icons/tip.png | Bin 0 -> 743 bytes .../resources/asset/themes/icons/undo.png | Bin 0 -> 707 bytes .../asset/themes/material-teal/accordion.css | 89 + .../asset/themes/material-teal/calendar.css | 203 + .../asset/themes/material-teal/checkbox.css | 31 + .../asset/themes/material-teal/combo.css | 35 + .../asset/themes/material-teal/combobox.css | 40 + .../asset/themes/material-teal/datagrid.css | 285 + .../asset/themes/material-teal/datalist.css | 95 + .../asset/themes/material-teal/datebox.css | 36 + .../asset/themes/material-teal/dialog.css | 47 + .../asset/themes/material-teal/easyui.css | 3549 ++++ .../asset/themes/material-teal/filebox.css | 20 + .../themes/material-teal/images/Thumbs.db | Bin 0 -> 35328 bytes .../material-teal/images/accordion_arrows.png | Bin 0 -> 121 bytes .../themes/material-teal/images/blank.gif | Bin 0 -> 43 bytes .../material-teal/images/calendar_arrows.png | Bin 0 -> 173 bytes .../material-teal/images/combo_arrow.png | Bin 0 -> 103 bytes .../material-teal/images/datagrid_icons.png | Bin 0 -> 330 bytes .../material-teal/images/datebox_arrow.png | Bin 0 -> 626 bytes .../material-teal/images/layout_arrows.png | Bin 0 -> 170 bytes .../material-teal/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../themes/material-teal/images/loading.gif | Bin 0 -> 1737 bytes .../material-teal/images/menu_arrows.png | Bin 0 -> 160 bytes .../material-teal/images/messager_icons.png | Bin 0 -> 6116 bytes .../material-teal/images/pagination_icons.png | Bin 0 -> 466 bytes .../material-teal/images/panel_tools.png | Bin 0 -> 191 bytes .../images/passwordbox_close.png | Bin 0 -> 149 bytes .../material-teal/images/passwordbox_open.png | Bin 0 -> 160 bytes .../material-teal/images/searchbox_button.png | Bin 0 -> 813 bytes .../material-teal/images/slider_handle.png | Bin 0 -> 863 bytes .../material-teal/images/spinner_arrows.png | Bin 0 -> 149 bytes .../material-teal/images/tabs_icons.png | Bin 0 -> 143 bytes .../material-teal/images/tagbox_icons.png | Bin 0 -> 133 bytes .../material-teal/images/tree_icons.png | Bin 0 -> 3115 bytes .../images/validatebox_warning.png | Bin 0 -> 921 bytes .../asset/themes/material-teal/layout.css | 150 + .../asset/themes/material-teal/linkbutton.css | 191 + .../asset/themes/material-teal/menu.css | 119 + .../asset/themes/material-teal/menubutton.css | 94 + .../asset/themes/material-teal/messager.css | 44 + .../asset/themes/material-teal/numberbox.css | 0 .../asset/themes/material-teal/pagination.css | 77 + .../asset/themes/material-teal/panel.css | 261 + .../themes/material-teal/passwordbox.css | 6 + .../themes/material-teal/progressbar.css | 33 + .../themes/material-teal/propertygrid.css | 27 + .../themes/material-teal/radiobutton.css | 25 + .../asset/themes/material-teal/searchbox.css | 61 + .../asset/themes/material-teal/sidemenu.css | 69 + .../asset/themes/material-teal/slider.css | 101 + .../asset/themes/material-teal/spinner.css | 114 + .../themes/material-teal/splitbutton.css | 12 + .../themes/material-teal/switchbutton.css | 77 + .../asset/themes/material-teal/tabs.css | 377 + .../asset/themes/material-teal/tagbox.css | 44 + .../asset/themes/material-teal/textbox.css | 144 + .../asset/themes/material-teal/tooltip.css | 103 + .../asset/themes/material-teal/tree.css | 164 + .../themes/material-teal/validatebox.css | 5 + .../asset/themes/material-teal/window.css | 182 + .../asset/themes/material/accordion.css | 89 + .../asset/themes/material/calendar.css | 203 + .../asset/themes/material/checkbox.css | 31 + .../resources/asset/themes/material/combo.css | 35 + .../asset/themes/material/combobox.css | 40 + .../asset/themes/material/datagrid.css | 285 + .../asset/themes/material/datalist.css | 95 + .../asset/themes/material/datebox.css | 36 + .../asset/themes/material/dialog.css | 47 + .../asset/themes/material/easyui.css | 3436 ++++ .../asset/themes/material/filebox.css | 20 + .../asset/themes/material/images/Thumbs.db | Bin 0 -> 35328 bytes .../material/images/accordion_arrows.png | Bin 0 -> 121 bytes .../asset/themes/material/images/blank.gif | Bin 0 -> 43 bytes .../material/images/calendar_arrows.png | Bin 0 -> 173 bytes .../themes/material/images/combo_arrow.png | Bin 0 -> 103 bytes .../themes/material/images/datagrid_icons.png | Bin 0 -> 330 bytes .../themes/material/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/material/images/layout_arrows.png | Bin 0 -> 170 bytes .../themes/material/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/material/images/loading.gif | Bin 0 -> 1737 bytes .../themes/material/images/menu_arrows.png | Bin 0 -> 160 bytes .../themes/material/images/messager_icons.png | Bin 0 -> 6116 bytes .../material/images/pagination_icons.png | Bin 0 -> 466 bytes .../themes/material/images/panel_tools.png | Bin 0 -> 191 bytes .../material/images/passwordbox_close.png | Bin 0 -> 149 bytes .../material/images/passwordbox_open.png | Bin 0 -> 160 bytes .../material/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/material/images/slider_handle.png | Bin 0 -> 863 bytes .../themes/material/images/spinner_arrows.png | Bin 0 -> 149 bytes .../themes/material/images/tabs_icons.png | Bin 0 -> 143 bytes .../themes/material/images/tagbox_icons.png | Bin 0 -> 133 bytes .../themes/material/images/tree_icons.png | Bin 0 -> 3115 bytes .../material/images/validatebox_warning.png | Bin 0 -> 921 bytes .../asset/themes/material/layout.css | 150 + .../asset/themes/material/linkbutton.css | 191 + .../resources/asset/themes/material/menu.css | 119 + .../asset/themes/material/menubutton.css | 94 + .../asset/themes/material/messager.css | 44 + .../asset/themes/material/numberbox.css | 0 .../asset/themes/material/pagination.css | 77 + .../resources/asset/themes/material/panel.css | 261 + .../asset/themes/material/passwordbox.css | 6 + .../asset/themes/material/progressbar.css | 33 + .../asset/themes/material/propertygrid.css | 27 + .../asset/themes/material/radiobutton.css | 25 + .../asset/themes/material/searchbox.css | 61 + .../asset/themes/material/sidemenu.css | 69 + .../asset/themes/material/slider.css | 101 + .../asset/themes/material/spinner.css | 114 + .../asset/themes/material/splitbutton.css | 12 + .../asset/themes/material/switchbutton.css | 77 + .../resources/asset/themes/material/tabs.css | 377 + .../asset/themes/material/tagbox.css | 44 + .../asset/themes/material/textbox.css | 144 + .../asset/themes/material/tooltip.css | 103 + .../resources/asset/themes/material/tree.css | 164 + .../asset/themes/material/validatebox.css | 5 + .../asset/themes/material/window.css | 182 + .../asset/themes/metro/accordion.css | 89 + .../resources/asset/themes/metro/calendar.css | 203 + .../resources/asset/themes/metro/checkbox.css | 31 + .../resources/asset/themes/metro/combo.css | 35 + .../resources/asset/themes/metro/combobox.css | 40 + .../resources/asset/themes/metro/datagrid.css | 285 + .../resources/asset/themes/metro/datalist.css | 95 + .../resources/asset/themes/metro/datebox.css | 36 + .../resources/asset/themes/metro/dialog.css | 47 + .../resources/asset/themes/metro/easyui.css | 3373 ++++ .../resources/asset/themes/metro/filebox.css | 20 + .../themes/metro/images/accordion_arrows.png | Bin 0 -> 184 bytes .../asset/themes/metro/images/blank.gif | Bin 0 -> 43 bytes .../themes/metro/images/calendar_arrows.png | Bin 0 -> 173 bytes .../asset/themes/metro/images/combo_arrow.png | Bin 0 -> 117 bytes .../themes/metro/images/datagrid_icons.png | Bin 0 -> 307 bytes .../themes/metro/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/metro/images/layout_arrows.png | Bin 0 -> 319 bytes .../themes/metro/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/metro/images/loading.gif | Bin 0 -> 1737 bytes .../asset/themes/metro/images/menu_arrows.png | Bin 0 -> 160 bytes .../themes/metro/images/messager_icons.png | Bin 0 -> 6116 bytes .../themes/metro/images/pagination_icons.png | Bin 0 -> 628 bytes .../asset/themes/metro/images/panel_tools.png | Bin 0 -> 194 bytes .../themes/metro/images/passwordbox_close.png | Bin 0 -> 159 bytes .../themes/metro/images/passwordbox_open.png | Bin 0 -> 165 bytes .../themes/metro/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/metro/images/slider_handle.png | Bin 0 -> 863 bytes .../themes/metro/images/spinner_arrows.png | Bin 0 -> 149 bytes .../asset/themes/metro/images/tabs_icons.png | Bin 0 -> 150 bytes .../themes/metro/images/tagbox_icons.png | Bin 0 -> 134 bytes .../asset/themes/metro/images/tree_icons.png | Bin 0 -> 3115 bytes .../metro/images/validatebox_warning.png | Bin 0 -> 921 bytes .../resources/asset/themes/metro/layout.css | 150 + .../asset/themes/metro/linkbutton.css | 203 + .../resources/asset/themes/metro/menu.css | 119 + .../asset/themes/metro/menubutton.css | 94 + .../resources/asset/themes/metro/messager.css | 44 + .../asset/themes/metro/numberbox.css | 0 .../asset/themes/metro/pagination.css | 77 + .../resources/asset/themes/metro/panel.css | 261 + .../asset/themes/metro/passwordbox.css | 6 + .../asset/themes/metro/progressbar.css | 33 + .../asset/themes/metro/propertygrid.css | 27 + .../asset/themes/metro/radiobutton.css | 25 + .../asset/themes/metro/searchbox.css | 61 + .../resources/asset/themes/metro/sidemenu.css | 69 + .../resources/asset/themes/metro/slider.css | 101 + .../resources/asset/themes/metro/spinner.css | 114 + .../asset/themes/metro/splitbutton.css | 12 + .../asset/themes/metro/switchbutton.css | 77 + .../resources/asset/themes/metro/tabs.css | 377 + .../resources/asset/themes/metro/tagbox.css | 44 + .../resources/asset/themes/metro/textbox.css | 144 + .../resources/asset/themes/metro/tooltip.css | 103 + .../resources/asset/themes/metro/tree.css | 164 + .../asset/themes/metro/validatebox.css | 5 + .../resources/asset/themes/metro/window.css | 182 + .../main/resources/asset/themes/mobile.css | 355 + .../src/main/resources/asset/themes/vue.css | 650 + .../resources/com/mycom/helloworld/.version | 3 + .../src/main/resources/conf/app.properties | 800 + .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + .../src/main/resources/e2e/scenarios.yml | 16 + .../GHIssues/src/main/resources/logback.xml | 115 + .../com/mycom/helloworld/AppEntry/home.html | 13 + 1170 files changed, 107231 insertions(+) create mode 100644 src/main/java/act/e2e/verifier/Neq.java rename {testapp => testapp-legacy}/.gitignore (100%) rename {testapp => testapp-legacy}/pom.xml (100%) rename {testapp => testapp-legacy}/run.sh (100%) rename {testapp => testapp-legacy}/src/assembly/pkg.xml (100%) rename {testapp => testapp-legacy}/src/main/bin/start (100%) rename {testapp => testapp-legacy}/src/main/bin/start.bat (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/FastJson37Issue.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/TestApp.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/Arguments.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/CORSTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/CSPTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/CSRFTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ChineseGreetingService.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/CustomBinder.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/DspTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ETagTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/EnglishGreetingService.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/GreetingService.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/HelloCli.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/HelloController.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/I18nTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/InheritedOption.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/InterceptorTestController.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/MiscsTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/MorphiaTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ParamAndField.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/PojoBinding.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/SimpleBeanTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/SimpleParameterResolver.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/SingleOption.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/StatelessTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/SysController.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ValidationTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/VirtualControllerTestBed.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/enhancement/Controler20160911.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH136.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH152Controller.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH222.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH229.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH232.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH287.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH289.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH295.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH296.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH297.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH301.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH317.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH319.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH325.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH349.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH350.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH352.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH354.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH421.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH449.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH504.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH506.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH518.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH536.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH537.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH538.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH542.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH555.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH562.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH631.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH636.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH657.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH671.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH678.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GH691.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/Gh318.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/Gh438.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh353/User.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh417/Record.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh434/Service.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/Bar.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/Contact.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/Foo.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/ModelBase.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/RGB.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/User.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/VersionedModel.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/mongo/GH301Model.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/mongo/Group.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/mongo/KVStoreModel.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/model/mongo/Person.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/sbean/DerivedSimpleBean.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java (100%) rename {testapp => testapp-legacy}/src/main/java/testapp/sbean/SimpleModel.java (100%) rename {testapp => testapp-legacy}/src/main/resources/act.router.macro (100%) rename {testapp => testapp-legacy}/src/main/resources/app.properties (100%) rename {testapp => testapp-legacy}/src/main/resources/app.version (100%) rename {testapp => testapp-legacy}/src/main/resources/bigfile (100%) rename {testapp => testapp-legacy}/src/main/resources/gh434.properties (100%) rename {testapp => testapp-legacy}/src/main/resources/gh536.properties (100%) rename {testapp => testapp-legacy}/src/main/resources/gh631.properties (100%) rename {testapp => testapp-legacy}/src/main/resources/gh671.properties (100%) rename {testapp => testapp-legacy}/src/main/resources/logback.xml (100%) rename {testapp => testapp-legacy}/src/main/resources/messages.properties (100%) rename {testapp => testapp-legacy}/src/main/resources/messages_en.properties (100%) rename {testapp => testapp-legacy}/src/main/resources/messages_zh_CN.properties (100%) rename {testapp => testapp-legacy}/src/main/resources/routes.conf (100%) rename {testapp => testapp-legacy}/src/main/resources/rythm/gh/287/foo.html (100%) rename {testapp => testapp-legacy}/src/main/resources/rythm/gh/352/test.html (100%) rename {testapp => testapp-legacy}/src/main/resources/rythm/gh/354/foo.html (100%) rename {testapp => testapp-legacy}/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html (100%) rename {testapp => testapp-legacy}/src/main/resources/smallfile (100%) rename {testapp => testapp-legacy}/src/main/resources/testapp/.version (100%) rename {testapp => testapp-legacy}/src/main/resources/testapp/TestApp.properties (100%) rename {testapp => testapp-legacy}/src/main/resources/testapp/TestApp_en.properties (100%) rename {testapp => testapp-legacy}/src/main/resources/testapp/TestApp_zh_CN.properties (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/TestBase.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/benchmark/CuidBenchmark.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/CORSTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/CSPTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/CSRFTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/ContextHierarchiTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/CustomBinderTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/DspTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/ETagTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/EndPointTestContext.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/EndpointTester.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue136.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue222.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue229.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue232.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue287.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue289.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue295.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue296.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue297.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue301.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue304.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue310.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue317.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue319.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue325.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue349.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue350.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue352.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue353.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue354.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue421.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue426.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue434.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue438.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue449.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue471.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue473.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue504.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue506.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue518.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue536.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue537.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue538.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue542.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue547.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue554.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue555.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue562.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue631.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue636.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue657.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue671.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue678.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue691.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/GHIssue692.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/HelloControllerTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/I18nTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/InterceptorTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/MorphiaTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/OutputParamTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/ParamEncoding.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/ReqTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/SimpleBeanTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/StatelessTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/VirtualHandlerTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/collection/package-info.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/binding/single/package-info.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java (100%) rename {testapp => testapp-legacy}/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java (100%) rename {testapp => testapp-legacy}/src/test/resources/photo.jpg (100%) create mode 100644 testapps/GHIssues/.gitignore create mode 100644 testapps/GHIssues/pom.xml create mode 100755 testapps/GHIssues/run_dev create mode 100755 testapps/GHIssues/run_dev.bat create mode 100755 testapps/GHIssues/run_e2e create mode 100755 testapps/GHIssues/run_e2e.bat create mode 100755 testapps/GHIssues/run_prod create mode 100644 testapps/GHIssues/src/main/java/ghissues/AppEntry.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh784.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh785.java create mode 100755 testapps/GHIssues/src/main/resources/asset/changelog.txt create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/accordion/_content.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/accordion/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/accordion/header.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/fade.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/pop.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/slide.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/button.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/list.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/tabs.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/button/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/button/group.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/button/style.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/button/switch.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/datagrid/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/datagrid/rowediting.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/group.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/selection.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/dialog/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/dialog/message.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/form/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/images/login1.jpg create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/images/modem.png create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/images/more.png create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/images/pda.png create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/images/scanner.png create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/images/tablet.png create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/input/numberspinner.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/input/textbox.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/layout/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/menu/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/menu/menubar.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/_content.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/ajax.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/nav.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/button.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/group.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/image.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/link.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/nav.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/pill.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/button.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/menu.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/tree/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo-mobile/tree/dnd.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/accordion/_content.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/accordion/actions.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/accordion/ajax.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/accordion/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/accordion/datagrid_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/accordion/expandable.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/accordion/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/accordion/horizontal.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/accordion/multiple.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/accordion/tools.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/calendar/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/calendar/custom.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/calendar/disabledate.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/calendar/firstday.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/calendar/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/calendar/weeknumber.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combo/animation.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combo/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/actions.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/combobox_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/combobox_data2.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/customformat.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/dynamicdata.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/group.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/icons.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/combobox/itemicon.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/multiline.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/multiple.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/navigation.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/remotedata.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combobox/remotejsonp.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combogrid/actions.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combogrid/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combogrid/datagrid_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combogrid/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combogrid/initvalue.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combogrid/multiple.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combogrid/navigation.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combogrid/setvalue.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combotree/actions.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combotree/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combotree/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combotree/initvalue.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combotree/multiple.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combotree/tree_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/multiple.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/aligncolumns.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/cacheeditor.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/cellediting.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/cellstyle.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/checkbox.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/clientpagination.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/columngroup.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/complextoolbar.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/contextmenu.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/custompager.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/datagrid_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/datagrid_data2.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/footer.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/formatcolumns.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/frozencolumns.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/frozenrows.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/mergecells.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/multisorting.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/products.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowborder.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowediting.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowstyle.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/selection.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/simpletoolbar.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datagrid/transform.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datalist/basic.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datalist/checkbox.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datalist/datalist_data1.json create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datalist/group.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datalist/multiselect.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datalist/remotedata.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datebox/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datebox/buttons.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datebox/clone.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datebox/dateformat.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datebox/events.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datebox/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datebox/restrict.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datebox/sharedcalendar.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datebox/validate.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datetimebox/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datetimebox/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datetimebox/initvalue.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/datetimebox/showseconds.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/basic.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/clearicon.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/fluid.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/format.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/demo.css create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/dialog/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/dialog/complextoolbar.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/dialog/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/dialog/toolbarbuttons.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/draggable/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/draggable/constrain.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/draggable/snap.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/droppable/accept.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/droppable/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/droppable/sort.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/easyloader/basic.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/filebox/basic.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/filebox/buttonalign.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/filebox/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/form/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/form/form_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/form/load.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/form/validateonsubmit.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/_content.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/addremove.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/autoheight.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/collapsetitle.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/complex.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/customcollapsetitle.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/datagrid_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/full.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/nestedlayout.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/nocollapsible.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/propertygrid_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/layout/tree_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/linkbutton/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/linkbutton/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/linkbutton/group.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/linkbutton/iconalign.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/linkbutton/plain.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/linkbutton/size.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/linkbutton/style.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/linkbutton/toggle.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/maskedbox/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/menu/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/menu/customitem.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/menu/events.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/menu/inline.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/menu/nav.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/menubutton/actions.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/menubutton/alignment.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/menubutton/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/menubutton/nav.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/messager/alert.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/messager/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/messager/interactive.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/messager/position.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/numberbox/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/numberbox/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/numberbox/format.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/numberbox/range.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/numberspinner/align.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/numberspinner/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/numberspinner/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/numberspinner/increment.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/numberspinner/range.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/pagination/attaching.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/pagination/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/pagination/custombuttons.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/pagination/layout.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/pagination/links.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/pagination/simple.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/panel/_content.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/panel/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/panel/customtools.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/panel/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/panel/footer.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/panel/halign.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/panel/loadcontent.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/panel/nestedpanel.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/panel/paneltools.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/passwordbox/basic.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/passwordbox/flash.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/passwordbox/validatepassword.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/progressbar/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/progressbar/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/propertygrid/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/propertygrid/customcolumns.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/propertygrid/groupformat.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/resizable/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/searchbox/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/searchbox/category.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/searchbox/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/sidemenu/basic.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/sidemenu/style.css create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/sidemenu/style.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/slider/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/slider/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/slider/formattip.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/slider/nonlinear.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/slider/range.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/slider/rule.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/slider/vertical.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/splitbutton/actions.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/splitbutton/basic.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/switchbutton/action.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/switchbutton/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/_content.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/autoheight.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/dropdown.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/fixedwidth.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/hover.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/images/modem.png create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/images/pda.png create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/images/scanner.png create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/images/tablet.png create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/nestedtabs.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/striptools.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/style.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/tabimage.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/tabposition.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/tabstools.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tabs/tree_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tagbox/autocomplete.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tagbox/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tagbox/button.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/tagbox/format.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tagbox/style.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tagbox/tagbox_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tagbox/validate.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/textbox/basic.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/textbox/button.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/textbox/clearicon.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/textbox/custom.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/textbox/fluid.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/textbox/icons.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/textbox/multiline.html create mode 100644 testapps/GHIssues/src/main/resources/asset/demo/textbox/size.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/timespinner/actions.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/timespinner/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/timespinner/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/timespinner/range.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tooltip/_content.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tooltip/_dialog.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tooltip/ajax.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tooltip/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tooltip/customcontent.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tooltip/customstyle.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tooltip/position.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tooltip/toolbar.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tooltip/tooltipdialog.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/actions.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/animation.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/checkbox.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/contextmenu.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/customcheckbox.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/dnd.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/editable.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/formatting.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/icons.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/lazyload.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/lines.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/tree_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/tree/tree_data2.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/actions.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/checkbox.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/clientpagination.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/contextmenu.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/customcheckbox.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/editable.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/footer.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/lines.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/reports.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data1.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data2.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data3.json create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/validatebox/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/validatebox/customtooltip.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/validatebox/errorplacement.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/validatebox/validateonblur.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/window/basic.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/window/borderstyle.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/window/customtools.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/window/fluid.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/window/footer.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/window/inlinewindow.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/window/modalwindow.html create mode 100755 testapps/GHIssues/src/main/resources/asset/demo/window/windowlayout.html create mode 100755 testapps/GHIssues/src/main/resources/asset/easyloader.js create mode 100755 testapps/GHIssues/src/main/resources/asset/jquery.easyui.min.js create mode 100644 testapps/GHIssues/src/main/resources/asset/jquery.easyui.mobile.js create mode 100644 testapps/GHIssues/src/main/resources/asset/jquery.min.js create mode 100755 testapps/GHIssues/src/main/resources/asset/license_freeware.txt create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-af.js create mode 100644 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-am.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-ar.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-bg.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-ca.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-cs.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-cz.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-da.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-de.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-el.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-en.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-es.js create mode 100644 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-fa.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-fr.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-it.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-jp.js create mode 100644 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-ko.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-nl.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-pl.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-pt_BR.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-ru.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-sv_SE.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-tr.js create mode 100644 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-ua.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-zh_CN.js create mode 100755 testapps/GHIssues/src/main/resources/asset/locale/easyui-lang-zh_TW.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.accordion.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.calendar.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.combo.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.combobox.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.combogrid.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.combotree.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.combotreegrid.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.datagrid.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.datalist.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.datebox.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.datetimebox.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.datetimespinner.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.dialog.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.draggable.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.droppable.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.filebox.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.form.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.layout.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.linkbutton.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.maskedbox.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.menu.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.menubutton.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.messager.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.mobile.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.numberbox.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.numberspinner.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.pagination.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.panel.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.parser.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.passwordbox.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.progressbar.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.propertygrid.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.resizable.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.searchbox.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.sidemenu.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.slider.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.spinner.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.splitbutton.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.switchbutton.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.tabs.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.tagbox.js create mode 100644 testapps/GHIssues/src/main/resources/asset/plugins/jquery.textbox.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.timespinner.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.tooltip.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.tree.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.treegrid.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.validatebox.js create mode 100755 testapps/GHIssues/src/main/resources/asset/plugins/jquery.window.js create mode 100755 testapps/GHIssues/src/main/resources/asset/readme.txt create mode 100644 testapps/GHIssues/src/main/resources/asset/src/easyloader.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.accordion.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.calendar.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.combobox.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.datebox.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.draggable.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.droppable.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.form.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.linkbutton.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.menu.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.parser.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.progressbar.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.propertygrid.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.resizable.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.slider.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.tabs.js create mode 100644 testapps/GHIssues/src/main/resources/asset/src/jquery.window.js create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/angular.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/accordion.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/calendar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/checkbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/combo.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/combobox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/datagrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/datalist.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/datebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/dialog.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/easyui.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/filebox.css create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/accordion_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/blank.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/calendar_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/combo_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/datagrid_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/datebox_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/layout_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/linkbutton_bg.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/loading.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/menu_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/messager_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/pagination_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/panel_tools.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/images/passwordbox_close.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/images/passwordbox_open.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/searchbox_button.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/slider_handle.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/spinner_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/tabs_icons.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/images/tagbox_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/tree_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/black/images/validatebox_warning.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/layout.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/linkbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/menu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/menubutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/messager.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/numberbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/pagination.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/panel.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/passwordbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/progressbar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/propertygrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/radiobutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/searchbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/sidemenu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/slider.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/spinner.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/splitbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/switchbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/tabs.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/tagbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/textbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/tooltip.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/tree.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/validatebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/black/window.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/accordion.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/calendar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/checkbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/combo.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/combobox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datagrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datalist.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/dialog.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/easyui.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/filebox.css create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/accordion_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/blank.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/calendar_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/combo_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/datagrid_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/datebox_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/layout_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/linkbutton_bg.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/loading.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/menu_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/messager_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/pagination_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/panel_tools.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/passwordbox_close.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/passwordbox_open.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/searchbox_button.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/slider_handle.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/spinner_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/tabs_icons.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/tagbox_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/tree_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/validatebox_warning.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/layout.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/linkbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/menu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/menubutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/messager.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/numberbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/pagination.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/panel.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/passwordbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/progressbar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/propertygrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/radiobutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/searchbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/sidemenu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/slider.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/spinner.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/splitbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/switchbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tabs.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tagbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/textbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tooltip.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tree.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/validatebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/bootstrap/window.css create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/color.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/accordion.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/calendar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/checkbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/combo.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/combobox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/datagrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/datalist.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/datebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/dialog.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/easyui.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/filebox.css create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/accordion_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/blank.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/calendar_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/combo_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/datagrid_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/datebox_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/layout_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/linkbutton_bg.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/loading.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/menu_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/messager_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/pagination_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/panel_tools.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/images/passwordbox_close.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/images/passwordbox_open.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/searchbox_button.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/slider_handle.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/spinner_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/tabs_icons.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/images/tagbox_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/tree_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/default/images/validatebox_warning.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/layout.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/linkbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/menu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/menubutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/messager.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/numberbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/pagination.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/panel.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/passwordbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/progressbar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/propertygrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/radiobutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/searchbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/sidemenu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/slider.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/spinner.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/splitbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/switchbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/tabs.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/tagbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/textbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/tooltip.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/tree.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/validatebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/default/window.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/accordion.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/calendar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/checkbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/combo.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/combobox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/datagrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/datalist.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/datebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/dialog.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/easyui.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/filebox.css create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/accordion_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/blank.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/calendar_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/combo_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/datagrid_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/datebox_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/layout_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/linkbutton_bg.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/loading.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/menu_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/messager_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/pagination_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/panel_tools.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/images/passwordbox_close.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/images/passwordbox_open.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/searchbox_button.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/slider_handle.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/spinner_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/tabs_icons.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/images/tagbox_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/tree_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/gray/images/validatebox_warning.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/layout.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/linkbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/menu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/menubutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/messager.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/numberbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/pagination.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/panel.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/passwordbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/progressbar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/propertygrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/radiobutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/searchbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/sidemenu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/slider.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/spinner.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/splitbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/switchbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/tabs.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/tagbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/textbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/tooltip.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/tree.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/validatebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/gray/window.css create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icon.css create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/back.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/blank.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/cancel.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/icons/clear.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/cut.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/edit_add.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/edit_remove.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/filesave.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/filter.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/help.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/icons/large_chart.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/icons/large_clipart.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/icons/large_picture.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/icons/large_shapes.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/icons/large_smartart.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/icons/lock.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/icons/man.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/mini_add.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/mini_edit.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/mini_refresh.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/more.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/no.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/ok.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/pencil.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/print.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/redo.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/reload.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/search.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/sum.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/tip.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/icons/undo.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/accordion.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/calendar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/checkbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/combo.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/combobox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/datagrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/datalist.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/datebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/dialog.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/easyui.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/filebox.css create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/Thumbs.db create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/accordion_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/blank.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/calendar_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/combo_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/datagrid_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/datebox_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/layout_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/linkbutton_bg.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/loading.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/menu_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/messager_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/pagination_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/panel_tools.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/passwordbox_close.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/passwordbox_open.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/searchbox_button.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/slider_handle.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/spinner_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/tabs_icons.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/tagbox_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/tree_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/validatebox_warning.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/layout.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/linkbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/menu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/menubutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/messager.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/numberbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/pagination.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/panel.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/passwordbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/progressbar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/propertygrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/radiobutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/searchbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/sidemenu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/slider.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/spinner.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/splitbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/switchbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/tabs.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/tagbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/textbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/tooltip.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/tree.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/validatebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material-teal/window.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/accordion.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/calendar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/checkbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/combo.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/combobox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/datagrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/datalist.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/datebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/dialog.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/easyui.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/filebox.css create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/Thumbs.db create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/accordion_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/blank.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/calendar_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/combo_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/datagrid_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/datebox_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/layout_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/linkbutton_bg.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/loading.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/menu_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/messager_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/pagination_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/panel_tools.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/images/passwordbox_close.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/images/passwordbox_open.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/searchbox_button.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/slider_handle.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/spinner_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/tabs_icons.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/images/tagbox_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/tree_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/material/images/validatebox_warning.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/layout.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/linkbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/menu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/menubutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/messager.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/numberbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/pagination.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/panel.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/passwordbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/progressbar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/propertygrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/radiobutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/searchbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/sidemenu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/slider.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/spinner.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/splitbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/switchbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/tabs.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/tagbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/textbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/tooltip.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/tree.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/validatebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/material/window.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/accordion.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/calendar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/checkbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/combo.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/combobox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/datagrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/datalist.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/datebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/dialog.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/easyui.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/filebox.css create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/accordion_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/blank.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/calendar_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/combo_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/datagrid_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/datebox_arrow.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/layout_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/linkbutton_bg.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/loading.gif create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/menu_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/messager_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/pagination_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/panel_tools.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/images/passwordbox_close.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/images/passwordbox_open.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/searchbox_button.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/slider_handle.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/spinner_arrows.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/tabs_icons.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/images/tagbox_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/tree_icons.png create mode 100755 testapps/GHIssues/src/main/resources/asset/themes/metro/images/validatebox_warning.png create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/layout.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/linkbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/menu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/menubutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/messager.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/numberbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/pagination.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/panel.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/passwordbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/progressbar.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/propertygrid.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/radiobutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/searchbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/sidemenu.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/slider.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/spinner.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/splitbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/switchbutton.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/tabs.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/tagbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/textbox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/tooltip.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/tree.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/validatebox.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/metro/window.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/mobile.css create mode 100644 testapps/GHIssues/src/main/resources/asset/themes/vue.css create mode 100644 testapps/GHIssues/src/main/resources/com/mycom/helloworld/.version create mode 100644 testapps/GHIssues/src/main/resources/conf/app.properties create mode 100644 testapps/GHIssues/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GHIssues/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GHIssues/src/main/resources/e2e/scenarios.yml create mode 100644 testapps/GHIssues/src/main/resources/logback.xml create mode 100644 testapps/GHIssues/src/main/resources/rythm/com/mycom/helloworld/AppEntry/home.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 613b4ad2a..00a62e527 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Add `notEqual` e2e verifier #785 * Add `attachmentName()` method to `ActionContext` #783 * Extend View framework to support direct rendering of non-text content without template #782 * `java.util.NoSuchElementException: null` issue when force respond `csv` type #781 diff --git a/src/main/java/act/e2e/verifier/Neq.java b/src/main/java/act/e2e/verifier/Neq.java new file mode 100644 index 000000000..a7a08dff9 --- /dev/null +++ b/src/main/java/act/e2e/verifier/Neq.java @@ -0,0 +1,39 @@ +package act.e2e.verifier; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.$; +import org.osgl.util.C; + +import java.util.List; + +public class Neq extends Verifier { + + @Override + public boolean verify(Object value) { + return $.ne(value, initVal); + } + + @Override + protected List aliases() { + return C.list("not-equals", "notEqualsTo", "not-equal", "notEqualTo", "ne"); + } +} diff --git a/testapp/.gitignore b/testapp-legacy/.gitignore similarity index 100% rename from testapp/.gitignore rename to testapp-legacy/.gitignore diff --git a/testapp/pom.xml b/testapp-legacy/pom.xml similarity index 100% rename from testapp/pom.xml rename to testapp-legacy/pom.xml diff --git a/testapp/run.sh b/testapp-legacy/run.sh similarity index 100% rename from testapp/run.sh rename to testapp-legacy/run.sh diff --git a/testapp/src/assembly/pkg.xml b/testapp-legacy/src/assembly/pkg.xml similarity index 100% rename from testapp/src/assembly/pkg.xml rename to testapp-legacy/src/assembly/pkg.xml diff --git a/testapp/src/main/bin/start b/testapp-legacy/src/main/bin/start similarity index 100% rename from testapp/src/main/bin/start rename to testapp-legacy/src/main/bin/start diff --git a/testapp/src/main/bin/start.bat b/testapp-legacy/src/main/bin/start.bat similarity index 100% rename from testapp/src/main/bin/start.bat rename to testapp-legacy/src/main/bin/start.bat diff --git a/testapp/src/main/java/testapp/FastJson37Issue.java b/testapp-legacy/src/main/java/testapp/FastJson37Issue.java similarity index 100% rename from testapp/src/main/java/testapp/FastJson37Issue.java rename to testapp-legacy/src/main/java/testapp/FastJson37Issue.java diff --git a/testapp/src/main/java/testapp/TestApp.java b/testapp-legacy/src/main/java/testapp/TestApp.java similarity index 100% rename from testapp/src/main/java/testapp/TestApp.java rename to testapp-legacy/src/main/java/testapp/TestApp.java diff --git a/testapp/src/main/java/testapp/endpoint/Arguments.java b/testapp-legacy/src/main/java/testapp/endpoint/Arguments.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/Arguments.java rename to testapp-legacy/src/main/java/testapp/endpoint/Arguments.java diff --git a/testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/CORSTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/CORSTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/CORSTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/CORSTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/CSPTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/CSPTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/CSPTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/CSPTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/CSRFTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/CSRFTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/CSRFTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/CSRFTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/ChineseGreetingService.java b/testapp-legacy/src/main/java/testapp/endpoint/ChineseGreetingService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ChineseGreetingService.java rename to testapp-legacy/src/main/java/testapp/endpoint/ChineseGreetingService.java diff --git a/testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/CustomBinder.java b/testapp-legacy/src/main/java/testapp/endpoint/CustomBinder.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/CustomBinder.java rename to testapp-legacy/src/main/java/testapp/endpoint/CustomBinder.java diff --git a/testapp/src/main/java/testapp/endpoint/DspTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/DspTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/DspTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/DspTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/ETagTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/ETagTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ETagTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/ETagTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/EnglishGreetingService.java b/testapp-legacy/src/main/java/testapp/endpoint/EnglishGreetingService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/EnglishGreetingService.java rename to testapp-legacy/src/main/java/testapp/endpoint/EnglishGreetingService.java diff --git a/testapp/src/main/java/testapp/endpoint/GreetingService.java b/testapp-legacy/src/main/java/testapp/endpoint/GreetingService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/GreetingService.java rename to testapp-legacy/src/main/java/testapp/endpoint/GreetingService.java diff --git a/testapp/src/main/java/testapp/endpoint/HelloCli.java b/testapp-legacy/src/main/java/testapp/endpoint/HelloCli.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/HelloCli.java rename to testapp-legacy/src/main/java/testapp/endpoint/HelloCli.java diff --git a/testapp/src/main/java/testapp/endpoint/HelloController.java b/testapp-legacy/src/main/java/testapp/endpoint/HelloController.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/HelloController.java rename to testapp-legacy/src/main/java/testapp/endpoint/HelloController.java diff --git a/testapp/src/main/java/testapp/endpoint/I18nTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/I18nTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/I18nTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/I18nTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/InheritedOption.java b/testapp-legacy/src/main/java/testapp/endpoint/InheritedOption.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/InheritedOption.java rename to testapp-legacy/src/main/java/testapp/endpoint/InheritedOption.java diff --git a/testapp/src/main/java/testapp/endpoint/InterceptorTestController.java b/testapp-legacy/src/main/java/testapp/endpoint/InterceptorTestController.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/InterceptorTestController.java rename to testapp-legacy/src/main/java/testapp/endpoint/InterceptorTestController.java diff --git a/testapp/src/main/java/testapp/endpoint/MiscsTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/MiscsTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/MiscsTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/MiscsTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/MorphiaTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/MorphiaTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/MorphiaTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/MorphiaTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/ParamAndField.java b/testapp-legacy/src/main/java/testapp/endpoint/ParamAndField.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ParamAndField.java rename to testapp-legacy/src/main/java/testapp/endpoint/ParamAndField.java diff --git a/testapp/src/main/java/testapp/endpoint/PojoBinding.java b/testapp-legacy/src/main/java/testapp/endpoint/PojoBinding.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/PojoBinding.java rename to testapp-legacy/src/main/java/testapp/endpoint/PojoBinding.java diff --git a/testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java b/testapp-legacy/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java rename to testapp-legacy/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java diff --git a/testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/SimpleBeanTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/SimpleBeanTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java b/testapp-legacy/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java rename to testapp-legacy/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java diff --git a/testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java b/testapp-legacy/src/main/java/testapp/endpoint/SimpleParameterResolver.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java rename to testapp-legacy/src/main/java/testapp/endpoint/SimpleParameterResolver.java diff --git a/testapp/src/main/java/testapp/endpoint/SingleOption.java b/testapp-legacy/src/main/java/testapp/endpoint/SingleOption.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/SingleOption.java rename to testapp-legacy/src/main/java/testapp/endpoint/SingleOption.java diff --git a/testapp/src/main/java/testapp/endpoint/StatelessTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/StatelessTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/StatelessTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/StatelessTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/SysController.java b/testapp-legacy/src/main/java/testapp/endpoint/SysController.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/SysController.java rename to testapp-legacy/src/main/java/testapp/endpoint/SysController.java diff --git a/testapp/src/main/java/testapp/endpoint/ValidationTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/ValidationTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ValidationTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/ValidationTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java b/testapp-legacy/src/main/java/testapp/endpoint/VirtualControllerTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java rename to testapp-legacy/src/main/java/testapp/endpoint/VirtualControllerTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/enhancement/Controler20160911.java b/testapp-legacy/src/main/java/testapp/endpoint/enhancement/Controler20160911.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/enhancement/Controler20160911.java rename to testapp-legacy/src/main/java/testapp/endpoint/enhancement/Controler20160911.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH136.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH136.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH136.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH136.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH152Controller.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152Controller.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH152Controller.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152Controller.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH222.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH222.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH222.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH222.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH229.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH229.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH229.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH229.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH232.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH232.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH232.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH232.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH287.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH287.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH287.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH287.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH289.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH289.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH289.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH289.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH295.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH295.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH295.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH295.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH296.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH296.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH296.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH296.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH297.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH297.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH297.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH297.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH301.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH301.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH301.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH301.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH317.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH317.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH317.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH317.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH319.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH319.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH319.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH319.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH325.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH325.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH325.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH325.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH349.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH349.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH349.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH349.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH350.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH350.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH350.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH350.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH352.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH352.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH352.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH352.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH354.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH354.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH354.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH354.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH421.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH421.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH421.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH421.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH449.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH449.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH449.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH449.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH504.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH504.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH504.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH504.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH506.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH506.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH506.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH506.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH518.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH518.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH518.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH518.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH536.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH536.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH536.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH536.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH537.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH537.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH537.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH537.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH538.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH538.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH538.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH538.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH542.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH542.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH542.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH542.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH555.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH555.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH555.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH555.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH562.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH562.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH562.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH562.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH631.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH631.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH631.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH631.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH636.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH636.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH636.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH636.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH657.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH657.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH657.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH657.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH671.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH671.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH671.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH671.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH678.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH678.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH678.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH678.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH691.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH691.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH691.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH691.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/Gh318.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/Gh318.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/Gh318.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/Gh318.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/Gh438.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/Gh438.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/Gh438.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/Gh438.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh353/User.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh353/User.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh353/User.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh353/User.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh417/Record.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/Record.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh417/Record.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/Record.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/Service.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/Service.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/Service.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/Service.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java rename to testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java diff --git a/testapp/src/main/java/testapp/model/Bar.java b/testapp-legacy/src/main/java/testapp/model/Bar.java similarity index 100% rename from testapp/src/main/java/testapp/model/Bar.java rename to testapp-legacy/src/main/java/testapp/model/Bar.java diff --git a/testapp/src/main/java/testapp/model/Contact.java b/testapp-legacy/src/main/java/testapp/model/Contact.java similarity index 100% rename from testapp/src/main/java/testapp/model/Contact.java rename to testapp-legacy/src/main/java/testapp/model/Contact.java diff --git a/testapp/src/main/java/testapp/model/Foo.java b/testapp-legacy/src/main/java/testapp/model/Foo.java similarity index 100% rename from testapp/src/main/java/testapp/model/Foo.java rename to testapp-legacy/src/main/java/testapp/model/Foo.java diff --git a/testapp/src/main/java/testapp/model/ModelBase.java b/testapp-legacy/src/main/java/testapp/model/ModelBase.java similarity index 100% rename from testapp/src/main/java/testapp/model/ModelBase.java rename to testapp-legacy/src/main/java/testapp/model/ModelBase.java diff --git a/testapp/src/main/java/testapp/model/RGB.java b/testapp-legacy/src/main/java/testapp/model/RGB.java similarity index 100% rename from testapp/src/main/java/testapp/model/RGB.java rename to testapp-legacy/src/main/java/testapp/model/RGB.java diff --git a/testapp/src/main/java/testapp/model/User.java b/testapp-legacy/src/main/java/testapp/model/User.java similarity index 100% rename from testapp/src/main/java/testapp/model/User.java rename to testapp-legacy/src/main/java/testapp/model/User.java diff --git a/testapp/src/main/java/testapp/model/VersionedModel.java b/testapp-legacy/src/main/java/testapp/model/VersionedModel.java similarity index 100% rename from testapp/src/main/java/testapp/model/VersionedModel.java rename to testapp-legacy/src/main/java/testapp/model/VersionedModel.java diff --git a/testapp/src/main/java/testapp/model/mongo/GH301Model.java b/testapp-legacy/src/main/java/testapp/model/mongo/GH301Model.java similarity index 100% rename from testapp/src/main/java/testapp/model/mongo/GH301Model.java rename to testapp-legacy/src/main/java/testapp/model/mongo/GH301Model.java diff --git a/testapp/src/main/java/testapp/model/mongo/Group.java b/testapp-legacy/src/main/java/testapp/model/mongo/Group.java similarity index 100% rename from testapp/src/main/java/testapp/model/mongo/Group.java rename to testapp-legacy/src/main/java/testapp/model/mongo/Group.java diff --git a/testapp/src/main/java/testapp/model/mongo/KVStoreModel.java b/testapp-legacy/src/main/java/testapp/model/mongo/KVStoreModel.java similarity index 100% rename from testapp/src/main/java/testapp/model/mongo/KVStoreModel.java rename to testapp-legacy/src/main/java/testapp/model/mongo/KVStoreModel.java diff --git a/testapp/src/main/java/testapp/model/mongo/Person.java b/testapp-legacy/src/main/java/testapp/model/mongo/Person.java similarity index 100% rename from testapp/src/main/java/testapp/model/mongo/Person.java rename to testapp-legacy/src/main/java/testapp/model/mongo/Person.java diff --git a/testapp/src/main/java/testapp/sbean/DerivedSimpleBean.java b/testapp-legacy/src/main/java/testapp/sbean/DerivedSimpleBean.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/DerivedSimpleBean.java rename to testapp-legacy/src/main/java/testapp/sbean/DerivedSimpleBean.java diff --git a/testapp/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java b/testapp-legacy/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java rename to testapp-legacy/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java diff --git a/testapp/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java b/testapp-legacy/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java rename to testapp-legacy/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java diff --git a/testapp/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java b/testapp-legacy/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java rename to testapp-legacy/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java diff --git a/testapp/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java b/testapp-legacy/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java rename to testapp-legacy/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java diff --git a/testapp/src/main/java/testapp/sbean/SimpleModel.java b/testapp-legacy/src/main/java/testapp/sbean/SimpleModel.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/SimpleModel.java rename to testapp-legacy/src/main/java/testapp/sbean/SimpleModel.java diff --git a/testapp/src/main/resources/act.router.macro b/testapp-legacy/src/main/resources/act.router.macro similarity index 100% rename from testapp/src/main/resources/act.router.macro rename to testapp-legacy/src/main/resources/act.router.macro diff --git a/testapp/src/main/resources/app.properties b/testapp-legacy/src/main/resources/app.properties similarity index 100% rename from testapp/src/main/resources/app.properties rename to testapp-legacy/src/main/resources/app.properties diff --git a/testapp/src/main/resources/app.version b/testapp-legacy/src/main/resources/app.version similarity index 100% rename from testapp/src/main/resources/app.version rename to testapp-legacy/src/main/resources/app.version diff --git a/testapp/src/main/resources/bigfile b/testapp-legacy/src/main/resources/bigfile similarity index 100% rename from testapp/src/main/resources/bigfile rename to testapp-legacy/src/main/resources/bigfile diff --git a/testapp/src/main/resources/gh434.properties b/testapp-legacy/src/main/resources/gh434.properties similarity index 100% rename from testapp/src/main/resources/gh434.properties rename to testapp-legacy/src/main/resources/gh434.properties diff --git a/testapp/src/main/resources/gh536.properties b/testapp-legacy/src/main/resources/gh536.properties similarity index 100% rename from testapp/src/main/resources/gh536.properties rename to testapp-legacy/src/main/resources/gh536.properties diff --git a/testapp/src/main/resources/gh631.properties b/testapp-legacy/src/main/resources/gh631.properties similarity index 100% rename from testapp/src/main/resources/gh631.properties rename to testapp-legacy/src/main/resources/gh631.properties diff --git a/testapp/src/main/resources/gh671.properties b/testapp-legacy/src/main/resources/gh671.properties similarity index 100% rename from testapp/src/main/resources/gh671.properties rename to testapp-legacy/src/main/resources/gh671.properties diff --git a/testapp/src/main/resources/logback.xml b/testapp-legacy/src/main/resources/logback.xml similarity index 100% rename from testapp/src/main/resources/logback.xml rename to testapp-legacy/src/main/resources/logback.xml diff --git a/testapp/src/main/resources/messages.properties b/testapp-legacy/src/main/resources/messages.properties similarity index 100% rename from testapp/src/main/resources/messages.properties rename to testapp-legacy/src/main/resources/messages.properties diff --git a/testapp/src/main/resources/messages_en.properties b/testapp-legacy/src/main/resources/messages_en.properties similarity index 100% rename from testapp/src/main/resources/messages_en.properties rename to testapp-legacy/src/main/resources/messages_en.properties diff --git a/testapp/src/main/resources/messages_zh_CN.properties b/testapp-legacy/src/main/resources/messages_zh_CN.properties similarity index 100% rename from testapp/src/main/resources/messages_zh_CN.properties rename to testapp-legacy/src/main/resources/messages_zh_CN.properties diff --git a/testapp/src/main/resources/routes.conf b/testapp-legacy/src/main/resources/routes.conf similarity index 100% rename from testapp/src/main/resources/routes.conf rename to testapp-legacy/src/main/resources/routes.conf diff --git a/testapp/src/main/resources/rythm/gh/287/foo.html b/testapp-legacy/src/main/resources/rythm/gh/287/foo.html similarity index 100% rename from testapp/src/main/resources/rythm/gh/287/foo.html rename to testapp-legacy/src/main/resources/rythm/gh/287/foo.html diff --git a/testapp/src/main/resources/rythm/gh/352/test.html b/testapp-legacy/src/main/resources/rythm/gh/352/test.html similarity index 100% rename from testapp/src/main/resources/rythm/gh/352/test.html rename to testapp-legacy/src/main/resources/rythm/gh/352/test.html diff --git a/testapp/src/main/resources/rythm/gh/354/foo.html b/testapp-legacy/src/main/resources/rythm/gh/354/foo.html similarity index 100% rename from testapp/src/main/resources/rythm/gh/354/foo.html rename to testapp-legacy/src/main/resources/rythm/gh/354/foo.html diff --git a/testapp/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html b/testapp-legacy/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html similarity index 100% rename from testapp/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html rename to testapp-legacy/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html diff --git a/testapp/src/main/resources/smallfile b/testapp-legacy/src/main/resources/smallfile similarity index 100% rename from testapp/src/main/resources/smallfile rename to testapp-legacy/src/main/resources/smallfile diff --git a/testapp/src/main/resources/testapp/.version b/testapp-legacy/src/main/resources/testapp/.version similarity index 100% rename from testapp/src/main/resources/testapp/.version rename to testapp-legacy/src/main/resources/testapp/.version diff --git a/testapp/src/main/resources/testapp/TestApp.properties b/testapp-legacy/src/main/resources/testapp/TestApp.properties similarity index 100% rename from testapp/src/main/resources/testapp/TestApp.properties rename to testapp-legacy/src/main/resources/testapp/TestApp.properties diff --git a/testapp/src/main/resources/testapp/TestApp_en.properties b/testapp-legacy/src/main/resources/testapp/TestApp_en.properties similarity index 100% rename from testapp/src/main/resources/testapp/TestApp_en.properties rename to testapp-legacy/src/main/resources/testapp/TestApp_en.properties diff --git a/testapp/src/main/resources/testapp/TestApp_zh_CN.properties b/testapp-legacy/src/main/resources/testapp/TestApp_zh_CN.properties similarity index 100% rename from testapp/src/main/resources/testapp/TestApp_zh_CN.properties rename to testapp-legacy/src/main/resources/testapp/TestApp_zh_CN.properties diff --git a/testapp/src/test/java/testapp/TestBase.java b/testapp-legacy/src/test/java/testapp/TestBase.java similarity index 100% rename from testapp/src/test/java/testapp/TestBase.java rename to testapp-legacy/src/test/java/testapp/TestBase.java diff --git a/testapp/src/test/java/testapp/benchmark/CuidBenchmark.java b/testapp-legacy/src/test/java/testapp/benchmark/CuidBenchmark.java similarity index 100% rename from testapp/src/test/java/testapp/benchmark/CuidBenchmark.java rename to testapp-legacy/src/test/java/testapp/benchmark/CuidBenchmark.java diff --git a/testapp/src/test/java/testapp/endpoint/CORSTest.java b/testapp-legacy/src/test/java/testapp/endpoint/CORSTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/CORSTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/CORSTest.java diff --git a/testapp/src/test/java/testapp/endpoint/CSPTest.java b/testapp-legacy/src/test/java/testapp/endpoint/CSPTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/CSPTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/CSPTest.java diff --git a/testapp/src/test/java/testapp/endpoint/CSRFTest.java b/testapp-legacy/src/test/java/testapp/endpoint/CSRFTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/CSRFTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/CSRFTest.java diff --git a/testapp/src/test/java/testapp/endpoint/ContextHierarchiTest.java b/testapp-legacy/src/test/java/testapp/endpoint/ContextHierarchiTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/ContextHierarchiTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/ContextHierarchiTest.java diff --git a/testapp/src/test/java/testapp/endpoint/CustomBinderTest.java b/testapp-legacy/src/test/java/testapp/endpoint/CustomBinderTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/CustomBinderTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/CustomBinderTest.java diff --git a/testapp/src/test/java/testapp/endpoint/DspTest.java b/testapp-legacy/src/test/java/testapp/endpoint/DspTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/DspTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/DspTest.java diff --git a/testapp/src/test/java/testapp/endpoint/ETagTest.java b/testapp-legacy/src/test/java/testapp/endpoint/ETagTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/ETagTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/ETagTest.java diff --git a/testapp/src/test/java/testapp/endpoint/EndPointTestContext.java b/testapp-legacy/src/test/java/testapp/endpoint/EndPointTestContext.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/EndPointTestContext.java rename to testapp-legacy/src/test/java/testapp/endpoint/EndPointTestContext.java diff --git a/testapp/src/test/java/testapp/endpoint/EndpointTester.java b/testapp-legacy/src/test/java/testapp/endpoint/EndpointTester.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/EndpointTester.java rename to testapp-legacy/src/test/java/testapp/endpoint/EndpointTester.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue136.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue136.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue136.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue136.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue222.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue222.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue222.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue222.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue229.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue229.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue229.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue229.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue232.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue232.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue232.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue232.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue287.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue287.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue287.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue287.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue289.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue289.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue289.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue289.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue295.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue295.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue295.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue295.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue296.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue296.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue296.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue296.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue297.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue297.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue297.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue297.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue301.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue301.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue301.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue301.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue304.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue304.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue304.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue304.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue310.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue310.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue310.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue310.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue317.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue317.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue317.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue317.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue319.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue319.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue319.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue319.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue325.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue325.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue325.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue325.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue349.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue349.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue349.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue349.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue350.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue350.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue350.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue350.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue352.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue352.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue352.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue352.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue353.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue353.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue353.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue353.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue354.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue354.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue354.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue354.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue421.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue421.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue421.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue421.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue426.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue426.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue426.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue426.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue434.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue434.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue434.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue434.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue438.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue438.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue438.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue438.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue449.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue449.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue449.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue449.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue471.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue471.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue471.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue471.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue473.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue473.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue473.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue473.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue504.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue504.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue504.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue504.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue506.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue506.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue506.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue506.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue518.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue518.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue518.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue518.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue536.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue536.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue536.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue536.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue537.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue537.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue537.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue537.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue538.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue538.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue538.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue538.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue542.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue542.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue542.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue542.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue547.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue547.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue547.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue547.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue554.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue554.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue554.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue554.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue555.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue555.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue555.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue555.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue562.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue562.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue562.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue562.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue631.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue631.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue631.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue631.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue636.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue636.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue636.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue636.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue657.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue657.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue657.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue657.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue671.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue671.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue671.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue671.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue678.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue678.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue678.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue678.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue691.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue691.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue691.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue691.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue692.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue692.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue692.java rename to testapp-legacy/src/test/java/testapp/endpoint/GHIssue692.java diff --git a/testapp/src/test/java/testapp/endpoint/HelloControllerTest.java b/testapp-legacy/src/test/java/testapp/endpoint/HelloControllerTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/HelloControllerTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/HelloControllerTest.java diff --git a/testapp/src/test/java/testapp/endpoint/I18nTest.java b/testapp-legacy/src/test/java/testapp/endpoint/I18nTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/I18nTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/I18nTest.java diff --git a/testapp/src/test/java/testapp/endpoint/InterceptorTest.java b/testapp-legacy/src/test/java/testapp/endpoint/InterceptorTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/InterceptorTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/InterceptorTest.java diff --git a/testapp/src/test/java/testapp/endpoint/MorphiaTest.java b/testapp-legacy/src/test/java/testapp/endpoint/MorphiaTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/MorphiaTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/MorphiaTest.java diff --git a/testapp/src/test/java/testapp/endpoint/OutputParamTest.java b/testapp-legacy/src/test/java/testapp/endpoint/OutputParamTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/OutputParamTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/OutputParamTest.java diff --git a/testapp/src/test/java/testapp/endpoint/ParamEncoding.java b/testapp-legacy/src/test/java/testapp/endpoint/ParamEncoding.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/ParamEncoding.java rename to testapp-legacy/src/test/java/testapp/endpoint/ParamEncoding.java diff --git a/testapp/src/test/java/testapp/endpoint/ReqTest.java b/testapp-legacy/src/test/java/testapp/endpoint/ReqTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/ReqTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/ReqTest.java diff --git a/testapp/src/test/java/testapp/endpoint/SimpleBeanTest.java b/testapp-legacy/src/test/java/testapp/endpoint/SimpleBeanTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/SimpleBeanTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/SimpleBeanTest.java diff --git a/testapp/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java b/testapp-legacy/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java diff --git a/testapp/src/test/java/testapp/endpoint/StatelessTest.java b/testapp-legacy/src/test/java/testapp/endpoint/StatelessTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/StatelessTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/StatelessTest.java diff --git a/testapp/src/test/java/testapp/endpoint/VirtualHandlerTest.java b/testapp-legacy/src/test/java/testapp/endpoint/VirtualHandlerTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/VirtualHandlerTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/VirtualHandlerTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/package-info.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/package-info.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/package-info.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/collection/package-info.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/package-info.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/package-info.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/package-info.java rename to testapp-legacy/src/test/java/testapp/endpoint/binding/single/package-info.java diff --git a/testapp/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java b/testapp-legacy/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java rename to testapp-legacy/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java diff --git a/testapp/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java b/testapp-legacy/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java rename to testapp-legacy/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java diff --git a/testapp/src/test/resources/photo.jpg b/testapp-legacy/src/test/resources/photo.jpg similarity index 100% rename from testapp/src/test/resources/photo.jpg rename to testapp-legacy/src/test/resources/photo.jpg diff --git a/testapps/GHIssues/.gitignore b/testapps/GHIssues/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GHIssues/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml new file mode 100644 index 000000000..45575de79 --- /dev/null +++ b/testapps/GHIssues/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + org.actframework + act-ghissues + 1.8.8.8-SNAPSHOT + + ActFramework Github Issue Reproduce App + + + org.actframework + act-starter-parent + 1.8.8.7-SNAPSHOT + + + + + 1.8 + ghissues.AppEntry + + + + + + + diff --git a/testapps/GHIssues/run_dev b/testapps/GHIssues/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GHIssues/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GHIssues/run_dev.bat b/testapps/GHIssues/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GHIssues/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GHIssues/run_e2e b/testapps/GHIssues/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GHIssues/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GHIssues/run_e2e.bat b/testapps/GHIssues/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GHIssues/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GHIssues/run_prod b/testapps/GHIssues/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GHIssues/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GHIssues/src/main/java/ghissues/AppEntry.java b/testapps/GHIssues/src/main/java/ghissues/AppEntry.java new file mode 100644 index 000000000..c441db43d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/AppEntry.java @@ -0,0 +1,12 @@ +package ghissues; + +import act.Act; + +@SuppressWarnings("unused") +public class AppEntry { + + public static void main(String[] args) throws Exception { + Act.start(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh784.java b/testapps/GHIssues/src/main/java/ghissues/Gh784.java new file mode 100644 index 000000000..f23ea7613 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh784.java @@ -0,0 +1,16 @@ +package ghissues; + +import act.data.annotation.Data; +import org.osgl.mvc.annotation.GetAction; + +public class Gh784 { + + @Data + public static class Foo {} + + @GetAction("784") + public int test() { + return new Foo().hashCode(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh785.java b/testapps/GHIssues/src/main/java/ghissues/Gh785.java new file mode 100644 index 000000000..0328c77bb --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh785.java @@ -0,0 +1,21 @@ +package ghissues; + +import act.data.annotation.Data; +import act.util.AdaptiveBean; +import org.osgl.mvc.annotation.GetAction; + +public class Gh785 { + + @Data + public static class Foo extends AdaptiveBean {} + + @GetAction("785") + public int test() { + Foo f1 = new Foo(); + f1.putValue("id", 123); + Foo f2 = new Foo(); + f2.putValue("id", 246); + return f1.hashCode() - f2.hashCode(); + } + +} diff --git a/testapps/GHIssues/src/main/resources/asset/changelog.txt b/testapps/GHIssues/src/main/resources/asset/changelog.txt new file mode 100755 index 000000000..d06e2fba7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/changelog.txt @@ -0,0 +1,630 @@ +Version 1.5.5.x +--------------- +* Bug + * maskedbox: The component does not accept numeric keypad. fixed. + * combogrid: When selecting multiple records, the datagrid will scroll to the last checked record. fixed. +* Improvement + * Compatible with jQuery 3.x. + * tabs: The 'toolPosition' property can accept 'top' and 'bottom' values. + * textbox: The textbox label has the animating feature when focus or blur on it. + * tooltip: Add 'valign' property. + * tree: The node class can be initialized by setting the 'nodeCls' in the data. + +Version 1.5.5 +------------- +* Bug + * tabs: The selecting history has wrong order when the title contains complex elements. fixed. + * combo: The drop-down panel may not be hidden if a bigger 'delay' value is set. fixed. + * layout: The expanding panel does not collapse when move mouse quickly away from it. fixed. + * tagbox: The tagbox and the label don't stay in the same line. fixed. +* Improvement + * combo: The 'blur' event handler is attached to the 'inputEvents' property. + * numberbox: The 'cloneFrom' method is available. + * slider: The 'step' property can be set with a floating number. + * menu: The 'findItem' method allows the user to find menu item by any parameters. + * menubutton: Add 'showEvent' and 'hideEvent' properties. +* New Plugins + * maskedbox: The maskedbox enforces its structure as the user types. + +Version 1.5.4 +------------- +* Bug + * combotreegrid: The 'onChange' event does not fire when entering values on the inputing box. fixed. + * combobox: Clicking on the drop-down panel will jump to the bottom of body on win10 IE11. fixed. + * datebox: Clicking on the 'Today' button doesn't trigger the 'onSelect' event. fixed. + * propertygrid: The 'getChanges' method doesn't work after editing the only one row. fixed. +* Improvement + * combo: Add the 'panelEvents' property. + * combo: Attach the default 'mousedown' event handler. + * combobox: The 'setValues' method can be called to initialize the displaying text. + * combotreegrid: Press ENTER key to select the highlighted rows. + * panel: Improve the resizing performance. + * filebox: The 'files' method allows the user to get the selected file list. + * searchbox: Improvent the 'selectName' method. + +Version 1.5.3 +------------- +* Bug + * combobox: The 'iconCls' property can not be parsed from the

Here is the content loaded via AJAX.

+
    +
  • easyui is a collection of user-interface plugin based on jQuery.
  • +
  • easyui provides essential functionality for building modern, interactive, javascript applications.
  • +
  • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
  • +
  • complete framework for HTML5 web page.
  • +
  • easyui save your time and scales while developing your products.
  • +
  • easyui is very easy but powerful.
  • +
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/accordion/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/accordion/basic.html new file mode 100755 index 000000000..36eece52a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/accordion/basic.html @@ -0,0 +1 @@ + Basic Accordion - jQuery EasyUI Mobile Demo
Basic Accordion
  • WLAN
  • Memory
  • Screen
  • More...
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/accordion/header.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/accordion/header.html new file mode 100755 index 000000000..6ea6250b4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/accordion/header.html @@ -0,0 +1 @@ + Custom Accordion Header - jQuery EasyUI Mobile Demo
Custom Accordion Header
List 26/51
  • WLAN
  • Memory
  • Screen
  • More...
Ajax Loading via ajax 23
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/basic.html new file mode 100755 index 000000000..995b0f932 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/basic.html @@ -0,0 +1 @@ + Basic Animation - jQuery EasyUI Mobile Demo
Panel2
Panel3

Panel3 Content.

\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/fade.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/fade.html new file mode 100755 index 000000000..b85c7846b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/fade.html @@ -0,0 +1 @@ + Fade Animation - jQuery EasyUI Mobile Demo
Fade Animation
Panel2

Panel2 Content.

\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/pop.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/pop.html new file mode 100755 index 000000000..6bcebccd1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/pop.html @@ -0,0 +1 @@ + Pop Animation - jQuery EasyUI Mobile Demo
Pop Animation
Panel2

Panel2 Content.

\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/slide.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/slide.html new file mode 100755 index 000000000..4528d68c8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/animation/slide.html @@ -0,0 +1 @@ + Slide Animation - jQuery EasyUI Mobile Demo
Panel2

Panel2 Content.

\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/basic.html new file mode 100755 index 000000000..6f9cdc6a9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/basic.html @@ -0,0 +1 @@ + Basic Badge - jQuery EasyUI Mobile Demo \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/button.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/button.html new file mode 100755 index 000000000..db5d5310f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/button.html @@ -0,0 +1 @@ + Button Badge - jQuery EasyUI Mobile Demo \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/list.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/list.html new file mode 100755 index 000000000..c06f18b3c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/list.html @@ -0,0 +1 @@ + List Badge - jQuery EasyUI Mobile Demo
List Badge
  • Large
    234
  • Spotted Adult Female
    215
  • Venomless
    12
  • Rattleless
    6
  • Green Adult
  • Tailless
  • With tail
  • Adult Female
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/tabs.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/tabs.html new file mode 100755 index 000000000..51cd85977 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/badge/tabs.html @@ -0,0 +1 @@ + Tabs Badge - jQuery EasyUI Mobile Demo
Tabs Badge

Modem

A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.


Scanner

In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.


Pda 23

A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.


Pda 13

A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/basic.html new file mode 100755 index 000000000..e500fbe7d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/basic.html @@ -0,0 +1 @@ + Basic LinkButton - jQuery EasyUI Mobile Demo
Login to System
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/group.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/group.html new file mode 100755 index 000000000..8bd165da9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/group.html @@ -0,0 +1 @@ + Group LinkButton - jQuery EasyUI Mobile Demo
Button Group

A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.

\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/style.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/style.html new file mode 100755 index 000000000..66620940a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/style.html @@ -0,0 +1 @@ + Button Style - jQuery EasyUI Mobile Demo \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/switch.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/switch.html new file mode 100755 index 000000000..f2e128e34 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/button/switch.html @@ -0,0 +1 @@ + Switch Button - jQuery EasyUI Mobile Demo
Switch Button
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/datagrid/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/datagrid/basic.html new file mode 100755 index 000000000..d81c652de --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/datagrid/basic.html @@ -0,0 +1 @@ + Basic DataGrid - jQuery EasyUI Mobile Demo
Item ID Product List Price Unit Cost
Basic DataGrid
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/datagrid/rowediting.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/datagrid/rowediting.html new file mode 100755 index 000000000..8c425e862 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/datagrid/rowediting.html @@ -0,0 +1,104 @@ + + + + + + Row Editing DataGrid - jQuery EasyUI Mobile Demo + + + + + + + + + + + + + + + + + +
Item IDProductList PriceUnit Cost
+
+
+
Row Editing
+
+ + + +
+
+
+ + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/basic.html new file mode 100755 index 000000000..33f5e5bc5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/basic.html @@ -0,0 +1 @@ + Basic DataList - jQuery EasyUI Mobile Demo
Basic DataList
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/group.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/group.html new file mode 100755 index 000000000..d9e644352 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/group.html @@ -0,0 +1 @@ + Group DataList - jQuery EasyUI Mobile Demo
Group DataList
Detail
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/selection.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/selection.html new file mode 100755 index 000000000..06b262303 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/datalist/selection.html @@ -0,0 +1 @@ + DataList Selection - jQuery EasyUI Mobile Demo
DataList Selection
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/dialog/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/dialog/basic.html new file mode 100755 index 000000000..d02c84d96 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/dialog/basic.html @@ -0,0 +1,46 @@ + + + + + + Basic Dialog - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Basic Dialog
+
+
+ +
+ Login +
+ +
+
+ +
+
+ +
+
+ Sign in +
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/dialog/message.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/dialog/message.html new file mode 100755 index 000000000..0254dbe49 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/dialog/message.html @@ -0,0 +1,41 @@ + + + + + + Message Dialog - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Message Dialog
+
+
+ +
+ Click me +
+ +
+

This is a message dialog.

+
+ OK +
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/form/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/form/basic.html new file mode 100755 index 000000000..3d0860d7c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/form/basic.html @@ -0,0 +1,44 @@ + + + + + + Basic Form - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Basic Form
+
+ Reset +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/images/login1.jpg b/testapps/GHIssues/src/main/resources/asset/demo-mobile/images/login1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e9faa80895abbf60d56eb871bd1e8a2b49d4a1e7 GIT binary patch literal 25789 zcmeFXWmFwsvnPBAn&83R4iMbkCAho0yK8{pc8~+X-67%N9Gu`5Bsd)0gS(St_&@iV zJG17~++jOvO#qgHjJym04h{}r_PPQ7ZUGcN`q|q6 z0Lsb$MgRbS0)U4j1|YstaIZTj9Layuf^Z)I@c+912EhAz1_ZWpSc?w2P-=pKv>Mr&D_$_+KbY{+ScAhg#NtaJ3Xbn zl?c5qk21Tmo0PSkyVMnf>+8$v%f;&IVavuLARxfT&dJ8f$@0p< z;_2_=W$wq~;z{#w0n*lZ1cw{Z3L5~23?wzm?rF}LBdu(IM|u`uVd zV&UMhGG{Tj;^JVj;^MO6HyYjZDGkN>b=)7t(2oBdAqqAIQ)Hm**Nl)Cm#R!;Ud)|6Tv-kx5vnC*YJ;a^Pun-BiY{p!|N>OVW-^-aqEAKHH_`7b&7zuooU?)ooz z;J?KDe~hmGHIZApyw2XfuhaD36@U}~5gq{n0Uq)7fQX2Qgp7uQ{Ms;4QQx9rW4?cn zjfstogHK9;gG-EujZH{JNK8gXK|z5-KnqXxXehJ(k3`#S)jcnxTXuVL?>$oKCC_XZx})k>7N?@(VEny~uG_ZqPOXZsIe{|7GYS6pviy9ELHA6#&6d|!8XYy?Cq z4y5-I>d5BqIMke>D7cc~qWa#qG+Y`NcorVh@9=@#TeO$|K>HW6|2tq||4+#N6WIU4 z1p}bL!@YJMJT^cKP_%`Kv7~=2IC#B2YKvDB=^jYi2Beld+&c%{po3@Q;`{MEj@1r{ zg?c(pOKok4gd_l#qPJyb4k+nQ$0iaEhn05LSRUg8<9O7Re*uk&Tt9V9H=XG)(H{bg zO}039gAc`feMA5g9tu8fOYNLaq0{J;B6%WG zr|jeF7W7@_r*m;c=IKdp%zRjuo+we$Badr6Lnf><$|sP4eat%#W?&XaXNfZq2Nn>Bbu$N2lBqd zUqF9I{jXre1#h5k%04h!rRC#R{AjQ6{m@P}ZQWe8*E(^oLpM)H&Q!iU{@SwibY%jr zZCICn{aO-v8WJSvz&-;fI(aoyT`K9zN1P9Au*^6(yK&+nwKR%8lg@lwVhJeM&PRDe;VTjl^W_lI|jIm+_# zoX(8sQW|j1r=xM6&l5)~yPA198H7ejnV0!_T*m3?)HynS>SZbN+6S%Oa#Gacpp%aP ztS&yUoi~*aoOee%#?3#An)$(L5n+C1MuiQiDzrF?ApO>?#@Dv8%!IN5?-a0!}79h zKd)*GFh;wC05jkQn>ZumEMQl!9U#l+Hl z0tTCyW?Ma|$AzVcvU%v!7Z)S|X~*W}q@V{!Tva*k;6ho6K}T0aHN^9P8m_KQ$k6V2 zNj(fxZQ|G%@%Ma(efna675?3{s~uvd@i)|DR2kB%ii97zVby|W3%W=4j_IAq2tEa_ z?cZAnW>$nyqA6OBVw=1DZ0XC0qj*E$n8H!MZ0G03=^>;c-0vA$j5a@}}Lk>4llO zUgkEvj8uFTOqN_L50ByXMz5S!7Ox+uwzD9$70F-h?1kypMif$u`4w?fQ93RD&S=w( zf*Hw}nU)Vz zLI|&I*v!soyWNAR)Jux@o%y5ASxLE({`f-Jq-1g%`twf-8W1=?!qdp6@@}6b6I6uu zjgnfxqbT}a&?A|MV`=B2v(5Ke))Sa);@LV;&5~>+TOE@26m4tIX|`e@b^c(lrMufD zOct%i+Czg*K*pkNC28wm7Ji|@TWs|Qsg8$~Loc5{qHNX3lycVv*CNE#{%Npu!POZ( z_adlj>@8hT*^-;YK{_c`07jsWO|uIc?;*=byWWVN#`+SNr1BY(ny^uH581suAn2%~R%8?R{=4l}JVw@$Bvb;qsL~sqXELE^Y&>~&v>cOm4z6n; z(n!pQ@Z}qZG4fo|)|v>;z|Vdwk46||ncN4T{e_=s^MjLnKBv1ud+vtAdp$v=DbsV}Z#ceH@S_CPj zEIfNfi713AE6Hackladlgl~$3jNcYs;2ix0tdM`0vn8skq)P!Ge@!k6km5`RxDR>?k}hWZf|`dD_a~p6IZ^WD z*P1)Wahk69=-g8T1|3W`k~2|064 zNe=d8XhCBw*Muhc5!WR8_|g1G-P-t%!<4;3oG(t-AWc4MISsT}qv4=~?ww>Q_&M8J zmsLnY6Yp&4eKzg<();8Mhw-mO8R3Z$*EfgqwJQ%bSS&0Sb6k7L&Q4rJu^a_?N$(0n zbInpujTJ5NYy5p9I(a<*0^WWSv|ih6v(`#?BJ1%*O-8P-DcEuHJZ^E_>Ut9x3u*SfMvw7=2kH;B2Mz7&el4;+vHw8zm1r?)osu%?& z21k!uwOnEapRJ3%y9{Q`_~m=j{K5V#Jvqcd{~=%BrcGBoI>Zuv4V-95%Yq{_T^%zHw;blyPY(>%c0u61Pb!sTId2(dve#fpm;`q#6*AmHB z43of25AW5F-1)(~%(Pl8BZnie!`$ac(eOK>ogiIKAiNS?%H0X>BN&<{(Omy~+jBOq z|1yGl;p&WsBw^rZN)PFGg!}Ue7r#=_UtFy~$?m=Z$K%EYg z-M4g}CY~UV7f1G1>Ij4rv5y*Fwm`x;Qg1F!oNmBxJzL*eRO2Zb)Gp=zwfmbZ+ zg?EPUr4b@w<9m2}rfVY5EW5Y@JM=J_Z7sHEqwJu`2A%@! zf%Ic{*K$K4m|j1LnOu*HuN(6CFu?NXb|Vi{RP*$ra^pM?!_Bjv??>o5o{SIS)Y>R= z;iPI8%Vao4`qRgRz9YnG1N}3NlSpPQd~NlCYt24yeNC{-ddwJjX}5O ziELbvFCS5uAoNTreOaEG_zPI5VlAHr>&zXV*!XQ(J&R7WZmzzJvm?WYA8VtNkXDZ; z*cvs4G)a`@U3Nxlvz!{kbgd~EMcI+jQ!tgbGn89rOst!k+;^kj8`~@>SBHd&=DNK- z2sfNw9^Gqu)^E03rqlIaue)+yxzn1r53c7`tdE8;m)WFDM<|TEq!Xb`fEa}9O}CKO>nThxmg-W}ovV#WuE1+B z#`ifHxh1*IU<`f3R$5hqi~(5WUGvvR-G+ES6MrINnN?{IK!;>_3nA*6=afR3n{(5n z$@=VQCwM+0>X_o!;m_nwfCoR(LAHIo#d!?#d2R3%9^@d;n$+eBW=P$$hObr@4tIqJ zZ?BnxA%Qn}_;fqc8LgT<*Y9puI?U45g6JN)PkB)8Z_+l&t=XdRYbIDBwx{)pKBN`XV?6FQ;xiVSO|Q+5QRfm z2}RvnStjQmIZHGoOiJQt6Oh6L5FN)rIIuXI$Q`FbU?pEw z7%KovqWT6J$wqZC8Qhn;W(@DPDgDRMj5_>YoT7h3;N^(DinLKF!xKL?vLAPc-0)4I zWf8pFgciHJOF3bR0L_O6JVIJuxE~lj7eR+l4*ll5l@Nr_#Y58|S0#K6_|4x7$hA&t zd80P@9SI)|e)Y&_Zv?1}>wTwfxty(7X!Lq^T$55uoC#d$^l3p^N#;v0MV3LXGDAfp z-;8T>4YAiP*4po)`n}=uSdWn^p&F97@GX7e-P7#JeIC3rAID^Q-<2Z1-`uAN z=w9y$``U4tsQ*Rp3>#13ubd^IkRnI2E1lGR%tkL+%(=c!-Rqi$8A6){Hiv!}!pxka z4nET+LzW>$+isd}Hm5uJxw3MY{bylrkQ5ef{I#^>bAtL@LP;a()8!=Gv4IbEzk48h z!tW*@)%yO-)keYHJ?+q*qagR}=I!rjtIPIK;?qvl5B9o$4AA;kLeV>j7~w3#XY=R7 zoe^hEQEE-6nD##s4~bvp`IAIf4I_|}-c;yZ{LEZFGI#LR4e)_l)qg0Kai@v6ek<0u z}* z6DDQ`;cp+p?O7!gX@@vKZsG?;HQ@tEM2rl z*G(J5o@uJK%F7JKmZpwM!>T#O1)M$$9?%!!sVcP3vUO738M_cgu5~Ip?k4x(y>tJJ z;d?i1BEuDKPWPhGxG3OcX32GsdF3DN>&;IUBI?(66SU`_V1_c*|G?{!&9LtBLp#aYANdHQ| z^rOjz8U8JNwU4wbkR^TWDKy=>Ui53MkTfr>BWLvX314Jv=eg~ER^qYh9^KB zmcZPdGWVy%3`g3DJxE@heMYjN>7lBd9Ouvga-4dLZ~C}^$}+OB&JcLpkVR8BUbVY1 zki~@CJ43GZlatNxWbJf68(eP>G9eO_dPp>UYG6E&!aDUw(7+~xtIBSY!g;6qS6TPVcRMnm;^88DuAw->dLKXE_wJ{m zNtPy-g(K5`-ab>rXB|qN{fuAx^EpPy({`qPR!{Q}WJ`jg{9U*e^B7qij>r<;$-f`4 zaULjGXI~{X<3m#=B0{Pw>+B4P(J*opG?TZ|c{D?de4q(lm|R>-SW7awo%i#gO`p`G z)N0GJ9k^$eqKZC?(whQ4bL=#GuG7w+?kuJnN6F@Yz%6S^O$LH9ko{qzXR`45{55gl zy*OP`YkvZ7r6Ys&FqVZQ-N59(0GnjGO#pybH$0czZxe&*>t)k~GbB3o1m?B)Op~H3 zX`E`mLJS|;lIZ5CcUmoB>rZwXF<8{)1#Psq7>J2R+WI_v-%xm4)lKJ!okY0W4;)~= zo91u%#I2DAdc&?dwgbZJ4+_vxh7A}T(D>Sl93&OZ6lWQe`(@J*t;@pGRGlx~RCapu zmef8>X*4#5o>GTx4czeO|0Qro;lhprgEw-5nm+0 zsUu7fKMFD|B+Yh>z`G4{*{2UBQR|quc1(-C2MUb@W4eP_Ro(1|^^KD(OD_nbS-AO6 zn!nXMyP~DWZ0bJGC=7fWH%xIK6&o?r3Ks6{h}%(b>X>IcOD8JD>IhnYAS5N#Roo#H z)9$#`$%Lk#;zyU^g@Qo!LnrKdpXD}E+;8wQc1}g%zplk(>Cj?QyQGq2#R}|H9fI8B z(jUutnkO|CXXy%zrcYQs77lPYQ-?E9R)+}>!N-p}Wv4Hx0;yi{!iyeeCzFFdt7`#1 zdG9K#ZB*+fsryh?J~;xB3&x1{nl;HGrz-1ZX2*F7x4jrLHw?LR$$&J+ zlB%BzR}?YCAzz}VcUx>D*P@0&yG%HL0g1T_7Ds}S>(KNK`(-GB{`)oYtMBatq2L!; zfo~?r*^1|cAHC5sh*PC1CR!WAuh9oSi}%&Yb~9yOEG@8V$SYq<(GFC6f>yr$IIKJz z767+`yW?W^%UffuIV~LW!=N*RI2ObV`qZ4r(PV~`&OA(+n-cVu3h#vX4wherEm*Ik z=ub}=w;JX-OA{i|b3A1*ak1({@E2g)HBV<~JrgUNrs;LhDL^X@|L_?(bvR(QqdW1U z^m2LZS0ipq5-Odfa(%x)SDAX-f4djh!+2L)Oq!C;eB{u1BA8(acZQ#F}Py^~VwEBSP(MAIXZ6*q8 zZx9^%>M~k9v-D+_q-+s+^a4gk$vZ+=Z}g#K`*L41?sz>!(`-L9r_q26(}`%aWU0g% zQAn+JpDZB18V{kwKpnn-h$@22A*T4~jXQ=|YsR&4Clxs&n4Ebp56CMA*zMXhX~kH1 z`2$HlIZd;drW})gX+bs4qAUH%jwXab?;AcNJh#>7!hobjh=|6V^6Ker0*CqZUQ1e^ z>DFmBo)YKYPXb_~3=%Rw&2=?BhyB&M%#eLkQnFxb+w=&`MA*$Raj6Us-hhnnCkYcqtU{?dX`nqI139n z+fGTiCHYkDQ`E+)aaf*saH^h6yoRwnw~2=FR&>3Du);q5!~ONz@1|AByFk=(y!y7Z z=&#_@^J?kuWdNm{TaVctk2WNNoO602wcm?APR>AX z&bd{xBb>CLYl&gcJ&xr^5oSB11BaoWX+L+Ob^LhZ+rH04Bm#+2OI0qv!*ParOm$kX zxdRE$^2NYSz}Cos#19ySMa#n-(U zpf4~#_{)T-pVwai_Adg#KrRJ@W>q=eW}LPho)1*JS<^vb}E3WM-Js1>a@&R$-2YcHL{Z?>H@NjOyU4h{!}HOux6KZy%_987V%~{R_}f z{<;^10^b64pcpKiF4;1S;R*W4Mwfs3NsI-g{?XekLhyq}8DRzWM-5-wWEByn_=iAO z#HhB~)n%dzTe=+u`GRpNioCk?gG!?-|6U&2YJ-d@nX+vbB(n}fmy!zM%tW<~>+z(H z4=Z`Y=bFl$KM!H1al%6G2ZuU3yUnmjQvsrt30)SlauwMtHAQH&c~h%;0kb0ztZu>F4iEI8l3+ds+EM;F z8WJb$IUWiM>ZDg{6D59_FJGJR+Fn0H2n)<2RZ1OX{9=o6*|M+M^n0CY`INP`iAbd& zB(Ss#QfEP>=o6)U6zp7z&z9f0-EKE_SZ=9~+{;OO1dv!t8W!A~R%Wy=8bR9R zfYyV4xu>;LHB5<-g;#Hmp4-jQ;N@Wzwl8m{ORn#BkucIVI*NHd1u?Tz!HiDpUb6hy zj-oZ3Jp9~xJU3|)@(}o}WBq-$={a5wQd9D2kbg`LNe(8+gn4dzT^*m%+%(Nn z%z`GcuCJG{600UZq=G`~yHjS*+cizw_Fc$SvD!{&+m%aEE6$L)hK%zwKYbN#-Lh!Y zMgkvi(oUYj!UExbDt1htS?s&wl<~k1X91}_U)4igH`eW8qIngxUE}IN2A*rIvUmby z+jSb`3IIs^#~Ok5Y{mRvK$FYI-{)d>bJB*vvmY4Wu-!{00&XgscS&9|QG!lQ)4cT@ zil+v9Aa$kD$T-$$id7;p%|u6u<~*7{w^g?2ZGBe*8P2uSm9EQ4u_a^*rTG;RN7%8c*>DH; zFsZIUAZcnJ6kiu>MOJj}9+A|)b;y4gAgkhLKiH)gPb>nNZ+cQ_QinZWDZ9JLZ8lbJ zKEow48P{wjsdu)4ztAKx%$uHlF4>2taJym`6CCYse#_s%$^0ROor&a3%Lu)I;}0D? z5YwdDD1>K_gwUIu#RY{SiajTZFS7-&8A%A{8ro(QPkj>J=T zBdn-aa)Zz?l0pR1q#6bReFu&B)Srj+bJ5FI-|-K*7kMv@2z*BpIZ&7gMd~D+e0fIf zJ)0XHbX5V4u{H5Dr|Z*5fQHD|Bq~J#8RKbZ3vyq(u$w#(lP))XFqu?Id)b%c1Q&Ct zq@^AI>2z;w1!g2qxVAq^I8e@Q{F@_}=>WOztA9~_ZtBVu@B>r{Ux|rx z^Aw(DLo8BEm&1@J)mW~c$p~=vl?1u*l=LECrzYsD2(gg%eDg<$& zxigVA?JppPAEA~e!?=z9qSEV!kfUOzl}&5B?A%Vmt#rhnJ^e;fJ__+3mmy9Jbnjq} zS@S3|9YhItT%|D@S+QT2F})*}b5|;FcT*6}q^eNQQGf=YeC{m*r5m$-Y(KI)_1c&i zx(f`GzD^k2sdmvc`HSB0n9-+Aza`yxFfrFfA{J(bqw@JgWQ5R5z_WWakbnsMsclSb zB4@k<`8V}o3QwGR`FE;o8o`$$gZ_MRUR?%92vL{xNdv@MjQ8;a1$Ol-nKdN#TXW{5 zq*%PG;Veh#dN!M+eb`l32=*0=q6T>qaK?-wQaFb7gL{L zM7om80Xm8}1b@31)5tUR_O^!LE@Po^x|`GpMq9EHR9^^9DEd?=V=?Y?M=1U#f4>V; zseO?$MGk!^rxNt%ArvUdl^e9JB7aLCy2!Iv(2V;X_UC;|Q**tcmtu^ur9FWQirb3m zS#JI?!cN?g$8?saYL?OEuk|zgPEIu=MW$#lni4`zk#XihC339@|8|R0=ZI5z+zbb! zHETq-`U-IiW$w+9>}|CxrYh}y9Hc3bpV$tv{?K<>|EMFg7M}RkJv_;My*&i|2)nmJ ze+oBlItapjTxsR}tv(iBq&|Gu9NIawlD07HTrz6grl>frtL2y=xUY|0g4XMN)os>m z;Ts~@xXFUCaIIVCsHoRHXo2roApvgU6B<2O$?v>_tT>9uYF{Qi^;orpAz!h%WCF09 zht+%Op+dwz=8PT!mD?}wqggf1{sIiUtXr-o-yy&%PYel_%Njfrmfz$kJiWC`aOT{y zeE4SR@6D|O$;qPC{JhdeFLv@7Hy{$ZOVQDc<#xi=wA+iK7cmv}4$&gRiSLd3@;_6hFlTyGZQED#*?(nClz8GfuuyWilV}t5z*bl)U zxG9m^Mw@WCpqrhms`9+~q0_N(h{_DfkJ6|iq-W>B0X0aEw=0*!`(ZM1B4ipOo{sG` z;yzR|Oy$;&)DupbRG=K;V+lQ{GnpY{aIP-zIeAXyL%8m&MJ(}x7&R^vHrf-U;I|BqBwQGRf$Th{LY#LY@A%bwksY-_5j%i&*LMxuDUu-cf-2ESYEakgEXm z%L9>BYr7_4x*AcG%t?U}fMY$cMu|!>L{Qgn+#bD3$42i0UX*K6o|4a1g)!B~$(g3I z4f?FxmjGARrr((pAC(AO2S{F~Sp;whqurP)-If)v`~_Isr~9^`OsfWxtab>O@iG7z z^P^dkMs!-@!LwVK5lv;u^f0YtrF2B;h0gZ>hi*=8}dI zYqn(h!`ngt;mP};Za?)|=i|kR54&NAt+;dlic$mq^&CYOJldzFDP)QSy~LT>XIhs9 zDNdejffR;BiEFp&ABo{4Dk4b`?dnkvOKu2Oi1n&*wWc8Ki|-dXPPjdznqc$%?s>K_ z7uM6;Q5ZXep~dn!)bP zSmgnCBQM9OdeN$Jd_Uh`$h`)(F>psgj#Z?!4B&tOo35wa+W<57e#fzgpuO?%#eFat+j!5kai&L}`kx1k(%mNZDL`^_KPwnIZvo<_S) zopTG@Fh$2QC{*99$CSBJ{X}NlO}v~ZZI$n}nCG4owX%j4;rzpqJ9^JlFkG-BAAVX~ z{LlSDpAcL~b7m&KZaVsjs18T+q~PwBD%rPyeKAp#8*e4p`jW^u&W zdpfJK!e*rJ1Z0Vb!xh6Eh4k_-6OLiPg~dz7ec3kgx6GKD1! zc#q}es_Dn?W`@btEeb5#vEGg*WN~))ez|IH-mIdJ?|mYzV^5)ItScutl$qiA>85u(~nqQ#0tU}Ql zasIS#odbJMLz0&fk0$J0YVIu$=gF`Sl=;_Xlb~tT?zItnn3*{}Y8%kgrZjJ`!Bx}ZfdTZDqF zl8i40^?RZBcrd^0XLaaIQy#f1BkYK2)|&i8$t9da=i0q5at9cmFBEr;iEWg?XBfrA ze%Wt#v0(r`Z@aEa5l-w(UA+}yn)^ffNDxflILBO!u!__jIwLOnXPS~c(!(=#Qnk#; zYL?4UQ`E<>0Nv5GB6i`9iu)tE>AF~Yj?u?n)>03D1i1CD4>Wz3M+O)L_T^LT(la!z z?Q)qF`9$}e-~IwnLF8hcNTQe354IU97k4GT&RnQDhX=8|bv6++FDa}W?F0x&@T9*T zYcDcl*qWvghq--pDzq~^CWNrQno=@@i+7!^5YWt!)@FG=ZJ>{)FVbEPMHkkjT7Uf{ zEN`*km6gu$a?hLV8fli^q zPg;n)Jt`$1YBF!X#3%qhr6o+I;jAL$n62P)u@kACsrVLj2DuHx^Tcl^2wqD+l)V0O zNTE$wD00PUiuuaN@I#g}Q4mjnrp)P1DdH?it**sU@AS{CNT<$LCQ2;x+1CK@i~b!U z`R!ovEEs0u$GaB3!o@O9Zomlo-1|tl=|v{uzu!gDPizeWH7Ewr_9pT=Ryc;eCHzBO zh%+RrCQhMgV*jkef&)XRnrm+JnIytg(U5* ze(geug;`bkhrGO^{8*G`PFN%eaV;-xOy56)f4zr+wZ3W-utP7lMtH2Rd;jOdW#nJL zaO-M0`DG>Vz4#x@7iYQ|~cP-xBT4vFa-ZrC>*jV^V^`@Q^h;7upCna}*agBUL1d+F5iT_d9avOY`vmv&AuO9BV;b#WVI;>UCO1-N5uZF zJWSW7w8RsysB9^JA(Fz&bpF`N=Vq9T^iUVqwiTU`K`CQ5rL8&}vipsvVi$Y5fe zHA0c^n0*OcXb%CsrgxmIo6~fLr|g|uWz&*(!6|$=i=?*MhcDQq?WUir35UDRYJeTd zkw;)E7x~i;yaefOm__`)dU2$u3SXJYW<+sx^XKim+5(b5~}nEao3Hk8u&jD&1bYH zJ2E->{vmBzEYl)@4a`g-V5Lw&ff05krZt?Z^Z+l2vsEU&*JK%|^$n z6`Hdar7fADOAmQ-%Z~r7+JoZeec}iG-4w<5XCCZEE=Esg?}NWgkvm|~#UiCSP0OMu z!K$HS+g`Ql}xc)Sz^l$v4+KKjoX+ny^Zp?y(>Yp%g2B@iD&3r!_5AlMb9p^ z5PLV2o$u|b&nm-|-xytcweH72p~pI%I(N{;KL`tFbgoURwTkX;;P(nl&Tp^DSIL7s zwSy^+4&6oLxA7tm+J5T5WUQaJv7YJHexHN;Ndt7E6P#~OHTyl{C2Nt=Ao?&V$|(kx z9ee>&=YBNe)-`G3xvuT#?BPL(MGY+h-+3hiKbr8eCCnovI(4xMsiCRTw)Ik_t!8y# zFtJS}TZm4r8XS~Ezbd-nG?z~k7IKLK{zV`rhIF&Imn@W}!DbuX$UhoXWVv)S*@E0>!)03K*5k}4bO*Ob4}m3Ge32+pzd zY$iI%zUn)_6o(joZ+6T!DRRhI z)G>gjGOZY_GC8NnAw=S9?4&mSHe{G0bPX7~U!CWsjhupco#IHffgz{2r~)vUCAp4J zs@tQgIVS)qBo-M$Im^9*iN5j{K||5ENJd*Sm&Si3OYA)Bt-xW^lQyccb+c;Z*)!1b z^bJ?J5yM}ALHvGHm}cUUBHB}Jm&>YO+@jI!&4i79gePku3oBSWFkMz z;3o@YoFcBWrRr{lg;j`fQ%NO)2_YfoG1|LVyXQPRzW@H%AM)U;)zP7jn2>j}2qz)U z3eIJlyZr2F*glXgy@A;&%W@NWb^tRYaU(%1+`T15!z}Z!jbewU%5x1_hRs}2wKWJ2 zOEe_~1mRFQOvyaxnr}_e^un98Lo?LpYY?VY8iWv|nZQ_6q_(2F`;Eakeqqy15d4KB z20WJiz_;41pso0i!#V<#w#6x2DlOSO7xV4Ezj29I6C(>#`St*BesN7f%>8(W$W;3Y zC=Qu$lRUX&bm(Y_45|7tTagh89J+l@t!zImlV_OOD(2+ywt@~d$9_8bM^wM0tZ2E9 z@B=RZJO{PgOwSv!(3b3oW0!Uo5X`GZMqH^_eXj?z{!w;c+2z+lJbGRyjMIOSpdUvD z$x8Kn6H{hYgugmZwg0VmwcoL7CrUsWuE^N2Ay;IL{)MahAQ*<5T*Y|+H@M8BJZYd z`dWDJ@SD0%9L!S{6Xh#RkJ(YZxFO!#7;rW$8vv`+Bc`;D(!^2--Q;~=fL41(tj#4_ zI+V>9B??t&i7YuMT60Kr>uQl%g&)SqMqtu)yO8xerE!X^PM>nUr;#yA^3QGy@GqcQ zx6>XXv4x4;19LK;;^j4OMc^YKfPe1U{XpGT#Jmtd5lz&&WaFo9X-V+X;4j%mU!;Tl z)2nLVMZWmdZaFi%u(809gPZPbUkbgUIEfJmyw3a1b-4k`Z$2TXO`KJk-<}C8bvLk^ zUa66Lcdev4BJjLK`tB+TZ6(C+lTu?MNt7?&IWXViOh9KPH^1^VvU+JU0mcGpal>MQ%Z-M=4-oU!=+DGFEu-gt(r zy7}*y%~{XipcBY+MtMp3e`A>2XL}y8wnld?FyjoaAWw5pSio!M2_XOOeD8kbR=4(rzvgmsuhc0tT7LN13lbW&EkZ%>+d@B@>WB zfL6cY-CqEkX=llj?}U3d@q%T;EO#t0vKBMT6K8+~gS5Dw_WRoT(z|tNdy-N&zFOVu z*RHK$PS|N3!L?QzO+5^m?3;nNh67L`XU{_fXV_v~|1evKc09q{g8T|A2Of#^%Do`R z{dmaJgsITDNtEVYz7zJUDo_K7DhKUdq~&Tt&%t+t8;Y3hv(O5^_WdLN{l5T(I>{L0 zvDoli8Uf10@L!I@-Vn9XZIa{G%o2qGD1{wHKckz-bKtzL{fcIO-mI-RSevE$Q94@$YU3TDHiJv*;l;U}KqhsKudv)YY9a#@ZYNj2O#9roT@tue2A8P3p@=A2+qLq#ddk zPC?%NbRtfFIklyFN!NmwZ5nr40riPP_2L-dCxKTG4E$6AzutOGVE=-YNQ*MPwo#iO z?Q=RkO!;KRLGkD7r$do<^@oBl7ltn^7t#!j{xDDLP!rS~jUM+6h|Z!DE02CBo4*iD zm|d9l7X|I7bc>UNdJA2M=O5wh$shgMblKKI`*U>QInwVOol@{W(a1#@oy7(ytf#&B zapfNC+MzZh-u}kea|J{pZZqCjAL={7mW(mqI zkhBy_@DRLBXdaHd#ex74a8a+evV_asL@St1XVTa?`F5eH<`MLMd%n|p72jtDCt>qW&RNg`j?LN`h zNRgE`MDA(T!6q?0ff|))ff${02D_TSHeRdk8p~#OqGr|FB*DdWG;LvOzR7~&#Nf~) zCa%6ZnB&#PLx@2tehYyrPoWO1$_p#Q^iDc9w&-%Ux9`oUp2g0ikh;l~MRoYWUohti#R=mEgp--)1as z*?_quMlA?C{5b7cm*6Z*G+i)apq@nadONg zSKpavo5IP z41FwPubF<4uH5y47Z?udi(k=_?%Qg1SCg%n2P zB!B~80NZiTO2_cc&EfdD;`Fs;j%`NDd6X((7E&JodyT{2HJRbvTI>E6^Ii*IImN4> zjs*aWp;PoDH0o6MU5kqMjNPiHTe3rlltkwS{6AQPHh!OG<4_n1d`;k|B>dvOkFYkpewhyBnQWJu5`K zXf745^*DvSyAV_@tV@#EAKqh%W%I9TI6oO&qa z{uS7G(@r;D4~tW?pD@}))|U*Q!?Ok^$Dtsv;47Kabbsts)wNM8%OsJ>90AZMU{Dzu zS2-a;+7GEUXH(a%G;bo-8+E$0)U9tU?-kz*kinvFVhXVyxFW5!vKKGAc2f9W(nYUo zTHJtzv9yv#B=lej>-9A66WbLUU8TmSaXit5GWn!`qcqW$MO<_nl$@TXpWrKIm%)0f zu6JrzP}?&D*`yi$0i)t2jkcetU)&3MATqkyd0_IB!0Pcg(c@#!wPk?^SH>B-LK}DW=-++}qqJO#HjD7~`S)qp!VP z`i(1YE}oO?-wyQa-I1Awtu?t+=^R%KuD?KCU-Pd=_&YzB&IhyyTB{*0g_XX_8eqavv?lD(!=7S*+$~x0$^R>?$7R5=Ffbb zx8qKu&>~6U%{?>^26(>VWGL77w>o5Gf*oQ7i?%wF0T`;D5r^y_2s}rqM!+1@#@dX_sp<3FqsG(N#==!3WU`m?^(!mXBw+5zjQ)UEF8ZJROEDvE5VICL zvz2_SAIy)+rJnKbQ0nU=JEPddJK{wSO&n6sAWyxs&1`;P zAIR2$u{N)5VG*6y*7_3*tK-c_AfZv*?Qhb!tBY&xM*BySWxJXyWRf=#KwJb8u*m3t zjQiH#!*93Uc%x0x=3w(_dX2KjF_R=9-L!MtZv)brXe{hp@dddaJ@E#a46N;Or?tdr z!v_#ayBPH;zmIA)n~`s&+^jDo#lFohPa|X7j1O)XZ{b&UTbQoCBPG;DVG>^5M6Aj4 zqRD8)sXp)0xaclsdtE}>;s*^L*wAMuVvL?T5~PfF`A@Aa)ymlz*7}q--w*F}_lT>D z#Rf&|wWL6JrA6!(%nqp=?(ke1p{(<{fd zdJ(;f@56ef{1C-&6z^lMMHm?n+{17nxlTF&NF&&a@ox`m?KSm}oo)$<=8y#77ni9X zn6BsH(Y(2rQt{2x>RPijg42}hd~qd=dasD|dxm9)?Pf$M zyHCjO4(xRtgI-7B+sQQDS4`FlIF1R2ngQet;E%);itRorT)dt&x>)XGD|aKg-f&qR z5x^vR6ZzK>5`(9k02DdqQ<6Sm_dxB(8T!+;wk2w{J1u%yBfr%myEuw#hh>@9JCLYo zn0pX0&wAbPx%*zPaSXD-7u(>uWMmjd*kc?h>Bz^{xasv6F8nj6&pZzI32Q7<^ONRA z$`qe$8jr(z&Ao;0jehZ|2{UgQI7BP~B>EB8+*G|$jGMXW5zldXq1ah7$Sw#~KqUEB zZdBxc9cwql!4t!tcy`}q+qW{&nl9?`U+lMVGF zJAf5_ePSEEKI+nAB$o0;EG`jId2HoD#zxe($lB`BImLU zGY*B%wPwC6olU2p-x6!mN8*=QWx4*&v$SYTV`(XFamg6MyJsisil4@}b{D!wn{0~0 z+fkA$c@cP#0%v}E^4R=MWq7)H;L!#WA^4k&m89DC>)rX|XfJYQ)UIb?ZK*-_TbtP30{p7%x$BL@e8hAgTEOtviNVy4v3G%b z5L#U!Br9%Bo4_25vZ**D2Cv*|8fLSv>DHwPePxlaaK{N6uyU$BmU8>qW{{We4Pdlxp zk7*h2h5+WXp0FHC-YL8nUMsiK1T7@7dCoR~cC!vxl6VI{UYM+JjQ2Lsd_%FYXF(r^ z^f-}F@)lW+?Z@Bl*6oxwY4NvPn^KY}<5_K@+|9;JVTd011me8^0K`*Es`#Jcj=qKo zr!tFcG%fOt&H@m7ZB;*wLf26uDJ?H_>wmK8bGTS?u>e30}evZAR3^cm^sDJ=B}q>2-9Wg)l-p~CGUn{Ow!JJspsvS`)vfzAm;QsX$!-cygt zqVh*%AsZt;Y4yv51l&&<$Xu8ZHap;&&6*urWy@UZEO`VpQAQ3s=M|-OC8&I@#Bm+D z++rki{Lj{)7nW-$nJwFpG8hPc@jVY-G1jR$b_qr%Mv0<}9d6fJn%#j_VRIakVOZ_P zROf+{o}H%vW%=U&nMa<3c$h~ zsO|=O5<31>P;2nOr|gMz*$T!eo5@xBmBxRaUF6oL5~l^RmoJ3uqtd2W?KL-zpkyz< zP#~FisEaTvnBPHlGd5A`@jJTz#e~H=YDuO##=t4HH7vWmA1ON#7XvBrTLHV)T5kWvGmA2Ye3(<)u)=I#crP}u#JkS z9fmo_(zi6ND_g#U?CB^zbYP@XvUzf=bQpHeKHVsbkz9!9YN4rmTG(H+ zbM~7;?2dYXrGO`BAQOR;(y-G>o?Ttzy3xW|sUkl*9lO|j<28K9hf3Os6WWN3aZ4L2 zjKv4Z8kF-y@ReF9W@~>U^oeRyYPWo16kWD0{ zC(L|_g4{$#Jv_-59kE_(tJq&(y4z1PGw|ygC(HHxDx&PgQYysuULk;Ze(K-Lm2N!6 z%OPE?#Qp4^nO+DTNC(!7Ws3S6OE|${62?wO0La|L%i-g*jFE==$h61e`b<40yQqBn;QpGFnH^Z zojX@atJ=vF_I@GrWk;PEHy8RJjBF%${HZkAmR2L8r#T;h&1HB)TZc#S?vt-Itj(v1 zTGv$#jjwGm*(PuY_p|AdU7y1JF+4Z%w_fm7^vKX(THV=2C_gNTBxlND^#oID@ib9! z(8t%jQ*Yv*h=1EZ+cJfYWrp6|*}AGCNH`35$>fvkSl5=aYCb2{o-I-zmh$3PxSl2e zpER=o2;}qw*0HVaVYk*Tt?pu-4a}j+9vGqExMSCm)Ow22OSOq+nIf7n@~g{*AL};o zr|3vEpTd#VV%@;Ig8nPnB!+QvRz2QpG_B@z4Z!1rz~Z%jCzg)?07-T{C4Pt56O@FHC7MB|%g(irZbNpX7IQHb?x@&in#6K8Knq92cu)4(QuFf)cB`V(RBSL9UoAgR_4b^TZ?G$Pnk2n3xU+_1oPPDxp{uqp?F>! z3@_X7-}^%2a2zlEvs2D`TPg+EZE1Kzl8cUIH& zU1IN7y+@Ks^DJiI&HP5 z*`&7?SBW*^eX)Q-G3B@b6Z|J`@0ZZmPc_#mo2Kt_oratx@yOO09RXP3jQ|cs%SW|v zaz5`F^y9g!I!3;p0r9=9{OZkRBQ=JnImgBa21h|Zu0F2}~EzpzsQoHIFv(W4OX>+OH>;5gd zvW!otL3LxPLH2TGNzx?9Iqa^ZKD^XgGHQBmnW^e`+HKIe*6t#>5yGn52F>iiF&O}` zTzgj^@YBUp*-H{V*%z8rFKq@;4>H}ua9hh#yJ%ot@W0pZ1UP_F*I`^+Z?vQka+ayartpk$+|n4BQi%8%;U|2%K@lN&(wC%?DjN+N=5 z&E8d~oc{pp3O|>D^~nd1YK8Qenk6D;M10`xRv->|KEGbIak3^_m2Y&*6_~0dZVy5w zQ;&SsMb4Wv4IGyC$k73`v%2yRV~&TK+?z*&Lb4*x%z4^~rv3@AT7C; zG4iiwQ=V#@*)qPxXry?Q1qhhj0msaG@!G7lx}a7uJGlAcUBO8JeZ!6hYc|t0P*0&s zJ#%H*p6(g^wIps$ibqaPc){!MS8e=5r3pN_w7KQ;0p0$dRJd+<+PEBNo=-|uv$lpW zHtfVpwj%`#uLG4Qr&2!}%bMFr6RgQRu&m9sjB$ljBLFh>^zG|HlITRK$!vETcZ;o~ zX%@%9`an~)ciqVMF00V7EI`LjgB)VAZ7;OBHCZ)Vy%Nh*pUnBAxGWGH;1Hno9ftr` zL|3t^F_L+sgsF~ix_77@1_vX**P5OQtfQIQJLy$O#B6Q?hETl^9er-0z*Irwe`z)(z8z5Ck)gnf~BOoe}248$SFAH+@w>%~Q-+G%=XC8FGqC^=!~ zt4fL(bGf>=IODb|bh^`RWmzOx1c`$hyr(LpjQRpk3XP*@oV}n|lH{&!%grI@P3dyr#z5<8a+7$q%nN z+737)wL^8QSTQ$q+Nu>H6=Sw|%7St_@#)vK9M78mQ%J*nHcJ5}o>JM`ZeT`N? zyy8NkhkWzbKhCM&+|Lt6*A~!$w1h%ghTIX7bN4|%rYcCT-Ww_H;n5OB4VdJS3b4;4 zk)M8^l@FOTflL;6vP|F|@e5v`$yU1GYOfdwE@713BU+(pHrX0 zv+jHys|%=xbhhCArTvF2_l!-d#`QsjaS+=C_JZCM9w{P|KVt z1LYt&$sU5M>V{A3@nvqlU}=TTw6UFp#@Pos>$l}N`u3R|%zR7Yi#1e|!UX8OT4SR`4v6 zeW7M9%^;cZ?spym=O?{mCgmv?YepwiEYl>B-0B+47GWeaJ)0kzUzf@SiuGI*^7TD( zD=$xjQRWeFRH4vJU|O_ zq#0bR5I$milb%mgT-Bw`z`K$^K2nP77*fQIyK{_vYgb3Sx)+hj=f31DUtANE3SbeeZQFAU z_CHQ))S9lLcXK;jT$u{Ih%%sIayaQ)8h8`xvWb9@M`&bC!#i7W8T_fO$!kN8(>y06 z7oXZ`rQKRfXo@Z^i?CUjINU{-t^JyA|{k83sD`6seklVuGh~xwf!S?*? zj1QZfk7}c@OEYOQ%4eH;L`t79@z2(@CbouaSdvuSvA`KdaVr^6jmWFFf(qk~Ip@C>XTp9k)b;IdBc@NKSm|-IK^w^$w7_TYIAU;c z2mp4+HN@*E6(C^FeAIp5xghNvaCqXmp90&&HA5cLwdF$DVtEX3eT`a*vuw@F-cde- z)g_6q9y@&^)?LuxT?qD*&jW8hp8WAy0_MtDpx+dbd9rNs(TORHoM3WE>%~QVES8ID zb!_G-lHGQ)@r}fW{Od;PQfoAs<4-XlSrwH+klV45kEL@ZsoBt_becm>lFJsN@fZI9 zS}n38CmS4+M^Vwa>NCwY6tKd`nuMU0*y||r-8$eNdH3(0oK~Kd8eLdJ_JQX4bF!}E zoCQ!o`ec)jde7IbEu)pTK!f+=sL%1I_?l>!p-@L1&Je|PWOIP=;|$}V+BwPf>BUr@ z&Fva9E};HGw*lPlYz(nndL9p`=}~JIuqTOxamVGULQcX|=jP`loYM*{66rSakKM{x zIB%Gc6rQIfb6Q%&r*dniv`;GHN4QVjsRcJPM))~9alj-TW3kU_Wt!>oIFT*<)h~}N z)T84a*RdJSSJZk`w)QsH4|5c##S&*l0oZUO+&Uh{qKy;ncE}U}_VG;E;Fmec&)_LE zkxOwdAhZyw2=4sQrb$66b_E1_edEB!PDt%hX;9c3LnyU(SCa`ZmVQzPM^@;$n6E0MVE0kASa+%UKUIHOjcQQ})jOYe?!R*_r= z1mivWatBI|S?2!GR5CLr-W85O`IvAIN+m0zBLy2?cJ0p2`7>O>5Ona z>a@CyrqwLlPd_|+VRry-#~`8PV?Md9OQ>Uy!yjpl1adBR?DkUrvodIEZnTCsDgM?Hf>4W{IZ zB?t>MZerOdX&*Ki{{SP}q|^%=>ln+wmn=$MHyxzsu;@Atl_|A?-&48r6U!OK6^I{k zo2S>BTZX9Q{Bv&%mfBL^T-w^lb9oZUBOy$wWnIiiOl5{gPW9DmGFw~f7nX~rM*daA zmgyOvDyWUM4gmu@Kp>vEt~=tSF+<^~k|YYaSuy_6bQ!Nj)!>M-xm=gH!*Y2A0XeJt zDUiN4bJmh8mSv2P%e!gLbJT?gI43v*9Q4SiTic<%ge3CKDZ`lJW<|>N$sBJVmMD_? z>N_1cEP$DABo5A@nYcYk8SFnQU3C)LTWO$0NBd+ja0WJPA1*p#mn$9DQBjVa9Magv z(|M8*?YM$u86-A2Bmzcz@mbNy=RkwcxeNiDan2APIw;A{PDLfm^CgtdlS-}%uHff5 zOnSO4r$e7@K`x^`Rf!>;kle*BCPm=i{jx8~6kyJD)&a8HC>(qBW3F%bt zp_%oREB&CisEUsSv$@`bCjB6eO~CS4HwQg)SsHGiX?b~i Vw=tPSLox1l`AKeZ%~vTW|JfiVbr}Ev literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/images/modem.png b/testapps/GHIssues/src/main/resources/asset/demo-mobile/images/modem.png new file mode 100755 index 0000000000000000000000000000000000000000..be5a2eb2fc48a8f16681b591f4ef74888ee09c33 GIT binary patch literal 1633 zcmV-n2A=teP)DSXo(n z6%-WGq@<)6*xA{^2Ei8OFVPRn@pc;RG z0K(}2kU_v;uacIQE|igxVPIil0lOU8LJ$V2gBcFvgF+DKL$KN}U%tQ{3j&`%e`fgj z@gvL=d;kH2(*Zz33V;^3sH&=hEe8c1aykKFkQgk@fP4zVAcH}^2L(OIK_D>@4RRES ze)sMj*gUAC{s9CKRtErm69G(cJz`>Fj2}LHfCnwe5SVX(p#$bKGczNn7qEqVe0*Tb zKx$wP1gU%b_AT5|K=waih<*VGAQtps2Pz2H)YP1#tEdz1LA-G{v90jAo(|M-Y{Iec=5@nPoJ&=1Q2>IaFvsjn`>!l$t@@-2(}dD z0GK0?EkXud!iJNWd(GMH9%!pb!uh6=itz=n=!YbLZ{?6XRZ>k+%Q> zhy`Q`&;nIpmRY8(tSkWx7KUffo-s&DO2QK#$WmB3Ko0?!SPXU#m1Z4_<00M=8Jg|USYhq#|2XZmU!j~^!g0l-ZH#ay%!+e4s0^qV7 zCl zzk}l%xnx6*cces$;#;tKkUTJDgZV%`;9LP^gB$_!J;-ce!utdC{SlxvDE_~K)Byw# z3oyP-K}9Sx5VA6|Gca)cV_^9Y%36#J|Cs)QM1f48BN)Nn1tk_xApwc!e}BRC+4mpc z86F%z4whpB71y9L1E@wA=qY;#2Zjsh&of-Ue3{|QnKSo*QNADMdk_E!AQqr6xn4eh z#qi+MGlt6_&NBGR1u$ z0{{Yu<Cx%1A~kt11BpmeSi!CrWZyY9!TmJ7G?m2;TK>OdVJl%92G$?!48NGZF}SmPF>w9nW%&C26N4Xf z00ZYQUWPA1Um5-f1~UBq_k)2IR52MCGQ4~95>y1jif%}W2lO#BFiL>+E&~^z05CCs zVmN;M_>U(~p6rME{s*!H00M|*&z?PPz=SkSTvS{D7-$Skj7;G4z`*hXOoI&m$Mlkc znS+yo>HT}K&zO058JK{<%mPXaz!VNj<)Add07`g3`se1&48M$w7?`+u!SR3g?Afcp z#0yIKkI;*KfB*tHn;DoBY=PJr$mRzc!~(>uKtn+^3nLRF3ou86#ef(n%*@Kf$jA&< z2T=p$g5`mpXJG*;`2Fr3Gnc3+Gb50H=l1Ql4<9~U4~&|{K=YrVI{+Yn7?GN0TtLhY zauAfygvLh4gw(;r{y;5$3@UKZ9RLtOj04>>0tlc1Z!hq!(QaR^6>_B54Jn1#~Jije3o~(=`7H5>`;cz1${9F%W##sAI~(r1scHM>FVdQ I&MBb@08~pNrT_o{ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/images/pda.png b/testapps/GHIssues/src/main/resources/asset/demo-mobile/images/pda.png new file mode 100755 index 0000000000000000000000000000000000000000..1458d9bfa4ef7d27c2434177c8d54294ba9f4028 GIT binary patch literal 1787 zcmW+%X;f1O7JkXg1|$%KLIPM`gi_jp0ZbGHH7_i($k1pRHgO1$ut<9(fPf0VEH;5s zA=Dyxuq9L0899Q>XtfG21Qdk=RTSi)EQ1{_6i^UCwl}dq?)Kwu=icw$3Vv(^&DzBp z003H4WY{5#gx(W{WZ?xTPp(-6A&d7n9sqO>1QNe~ZLyh!;faNxAImH(PRkboJmIl) z5ft@hT9)XLC{1`m{6Mq^07z$}!gz5dlj%kb<7#2N1V~S32mm?^E&&!@<5jOx&3q{o za+2cX&tua)2r{taVogmAuD$W)qm~2Jb-st=OE#9C%TaGk*+GINT|sbi^6jAAyQ69v z8kDn-+d5(SDD|F*MUq!Y8 zc(PIdZebZiFlP5@(-6e!MAaf;@5+D2xe6|d8cfdKc6~j+K7)-5c4y4Sx{BFnKaWtq z>5TRFH=1ZgLzdQf!x{T;+PrT8Xs^e8w-+;+?n9TsNf?}i%e{^x&~3>;nZbF>Wk~-xi=)I9adQP-N!XQOOPah0O(QZ>2owWjyN~2)5!9nUX;qfIGvsHp@IVxcl=2QSj-aDrbsm+71?S} z(P`Ip&yPj&*46_(_|&4!Hz=_a?i71#2Li$LLi<)nVL z!{}WfIN}P&}jcP#>G?Gb4@Dg8Slpya_Y>1sq)VLm%q6alT7GG9ciH z=o`?VqJQAg0KhTaeay7TgYio%ePJb?E);6I?M9S?xW$@CT%}tOf{H0q7 zl`i}Cu}DQlJM)s>yd2C@xO01?p`g&-I~j%}`IIk6Y_>=2dpr+&3oX_Q8)ei(kFHYPxu*ps zYp-_l-RgrA8RDn!$Lm2bgGYu5Mdd0wSFTWOo4`S!NZ7|18*^m7=q?+~d$Wx!S3~ad z+qd`d_qu8q#;X~go_&(vYbA?;RKI^rk(F-U-T(#aumx`5F2EK1)KvG2^wc{g_+chg z$@@b)Sm!5c3i<3aJ0E2Ax4)~wB=r2XF8_c%C3(*EJ1#I%Qc@Vr&3)3U6U3N=3DN{@*z34hoRim^Arg_jcG>cCncl_cW}jS2nCa`kchCB!qvQ7I z=uc6;itt-`r&{6r(~xd+mFyq3twZh~O*rUVb*%k2+a5q+M`OXKY6x!|)7R8~b} zRQte@Xl8~+psdw=Kq)?VK}7sJE0SkH5r z2LOO|aL}fmrbzs@EHI}1#M!gcreGEyuq^-pDqDQe*`ua2K4o)M%1?=LDW{poV}XE} z#OPRJ@KI)b?9Nzb%$elYSU&);tP9>05W)H1iWnwxi( z35bh~vl9bllm9;Bm|~5OTm-YU69c^q@(A*Cv!8l93qnHH5jc8{4qtAxavOpx)su3t zmNn(O!v?S*3Q-NI+Vr2lbQX(pkjT`>3dQHP@o`xjqaih3qnq&vH|)yjEDq3ENj~*X zHu!OjW0JD%1loDs^o+wRE&(SBPF;+pu?5j!9T3>*lVMBnrwD~YZ{KzQkk_w2SMZ=J zIZE+guB(d+&c)T$a-Fj2l1G_{6W`s{-5owOJPc~IUwufI!6p&g5H~n7!W>j8mF%zY zFMYYQ<@79aQSRyzgqfW~RX>{FM*E8)BA;%`zTE52*1u5AsTqPkuL_*w27&a?l9IN; z_wVB>%gb-tu1a$%d}5MpQ%I3vYUrh5^%3U}6K~I`B$W(~xC9!omvc*|iW^^r7c}#oKM-NxzD*T(-)|KN1dXb}#%=YvteLUV5fj?QWh?F#CY?Buwoy4L z=R{FRcUdeJ4u{8YHp$&Oqnr8qj_$^m$dKPUCU^0(=R~(VZA6bUq)go=uBAqky{lu% zKBp0-hnxjVXxt1HYRIW5*NEKu6jf1CANS=;c1UPw=wN#0$^fI$kcs%UORLpFBlDg% zUiZi=N;T@IJY_@(K&}VXpRdyydb2uQOiLmrGV&DW)TvV#cXwwntDO4rBcJ+lY!6vj zRYeU7UIsO>O^I_aE?;VX@?`UmQmHf@Z`|lPXI-Nw@G&>C!DM&$HJGrlH7^q7?89;q zXYQkj!zt!21nlUZeQ6rgjo>$6Uy#9Quo@>_;g^(HlSqyJJ0rTI4SFpv|5_TZ;C8*E zc3D89fkJ-s&M*}KsBvH2-$)o&e` zeQZ5Jk_XdpQME?zdYwK`@frob;-GYTS2q-mYQ^*Qa^U$AtayNjD=$k-!<_t?DR8UB zAA9RNX`3QGZ1R;Q36%0ky~Hx~5dMwxZ-2ab6L?MC5Ja8+eF$V3Gr8QodJk0dg18KZ zoR7!#@wqmLYCIpuHpa(jR3l!JujVwIf4!~)NcnMNaGE3UV%2;}W*!Z9!;|>|>Eea8 zqq7zPA%671(%VaWl*3>`+Yc2|;n3m*l99>;EN2rAZ^i+v?s$poGHzbw+Nba4L#rH6 zq+MiGe?o-}D~G1MR<^zfzq+(@km=Q-(zW}5CylOrwh4>Vb%z8_K1v z{}MwZw_Q@a*%FqqwK59Fw(zE8C3}B&C? zVuA%ti8StfH{XZc2D8U_J|AyH{NhfILtZi<_ZTM@xbX@teKzjklX>M9=8`#Ed1Jrk z`Gv38>mF)aL&|8kP52^nQ#%GVws*XEG5;VahotE%ja@!`-&8RZhC-_mDh+X z=UGQpR`C`B!&I*F7JfdG22&_W)fCFGR!FUNO{VG(#$axsU>vlzfI0g2&z!Q*(e=i$ zp6es@6#)$*^JItW*m3o4-rEJ#L9 z*=8N2x83C0Xso1i*qhR#qLO0@sT3UP1j_21GkA#Notip#m8q2W%RhAdUiaZ;f%+xn zK4GR*3$K_M2~m(W_C`&j2-->mlPx`~d~q7cUxC`=j;vVIpx3_?Pt6e|1)Vuq4x5{b zPFZAERh{-X!c9^ml40Giad7jeVKOO5Mb;ZTWn!D0;=MJC$qygRJR7J@)^-%rL@UvI zl5kl&T-?98E1c60o$b2I)!8x#^2ut6A*9!6Isf^KKJv)K7Y%>4YSykdhIk% zG3y$bafGoO=g*Eumo9S0Y=2UTz4{vsI?HNo>_F$-kz{s~yL)T=)}^wV_XwIHzG9Uf zyrDDs82Z;OeZGFzLA43QCeL`1*}N`1?pHA_%fC;wv@OD4F+%=u9u zt-<>(M_a6z@xfr+c7ypZJpinAWK!d!Ghh8dYNbMFnq_p$qt8!?WC$6CA`S#_9<50R>^sn!rDR{DTdpKSy zZnNCkjFc6LaB=N>W^3-<8=3AZQ#+&DD znap!$rDu-T1i*cbI2HlTBPDG_Nil0PGBd4YM!nW`BSW6UxbA+Ea8~^pO{zMIezf1h zX$C-~-(vtWbL>jHE0^Cf%t?YrO9MI9##yQY#miw?pxwq6g9^*n`9 zsG$Q$SFfL-v2nrJMU08YC1iBZ160*gviuODFfn)e^088ae|`Mg)1O-qhoYaF{TULJ z4A6nAW5Dp6RUV{vfKm>dkEQ#6*K^zsupk2q+Ea4=oYE*vUp*jrbJ(W)8^E;x12P5j A&;S4c literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/images/tablet.png b/testapps/GHIssues/src/main/resources/asset/demo-mobile/images/tablet.png new file mode 100755 index 0000000000000000000000000000000000000000..fa871f54035fcd0bb0f7f2068d2b2ed4e5e0e0cf GIT binary patch literal 2505 zcmW+&Yh02C7k>ank;hAE24+c9(=C@5nzmOHNV6i*EwWAy0MbXsy0K#HV?N8$W`pv6QT zjiNmD$4~(?B4QR`0#=CzfSwt;NKvh#!WIdB z%YB|dcjx@oo`(`bd`9z^!A(QY1iPF%6?1cRBpWIN`RzH8N~L-O;@a)6gcQs3YyzKw zS8F8Q3ey0*t9pI8N+#*A02%I+ZZ5pG(swWbrgxqRY_5pm-6ONBQaTL##bG};rs z&qhw~Rdm&{2#oiLSHT~s%W05S|HMj#%*G5_Q`N~l#tE|oK9qIHDCueJIiqjoqJ=wO z6)(8utZ6E4$g|H1?q;%R#Ct)#J#a%@GeQfg7RTQWmfVkW;@u1Y&%)-}AgKBB(WfWU zMkk(IE3Q~3d{#80MM@-ZWnYeq(Pk^lAvkxY6adTrme$>nUA@}@IHZ-*dA*#|*s z==2flXx~Gi>+WTGOz&Jfl3-vyh50 zz08MfbZ+=dFZfWOL<32pD7ipvfmfEHE?|m}55gxR!ge>D!C1>p=^xoLm$yh!(Idwi zgfB;FH=L4ZIgiApTPB@R*tXbfad!eL+$<+1CaK}0k>TOwv4{w>@Th3Bk6MY~RfkB> z(Ivu(#3IFtr>)~HAf=nZCIk?*1X^+Sf!44H<>Ea2J_3LjZLols2`mbb8JN@v^pelH zL(|XyR%Q%nUBB-kEP4+FvI&0&T$1<2_#yqM;fUgtWEXr6V#gAJ*lkiqP6$3|lCgT7 zB{O%Ke}K3p8?*IebNE`9-4>hTHEHM1ZR}NtxRe5L!&>x!o}F1JIiGcfGJ_tk(j23B zd9^gAh>x-3oVBh$4p^biJYFxBuYZ<+M*BeUCcF#`$|FQRUi|EhaNdF_Fmvd&jz+R2 zd<@1L7`L(bbFLkRxKdNex-xH5z%xV_wBO@wLfDq>x*r6C8(PCB`ewPmqIUTC+3wu` z%X@kBKEEIe6dpUUR3eiGB_T6uNcJ3M&dqn=uxkdU)P=XEzAo$M6Tl%S9w>$O?UQ+2 z)GnKb|6@RPR09h&tc?%Hut^QVq%eoKxFO_{<9%g2LQNj+VH=OVEJH8o8a++W=3 zBH|;?Qe*Ks1|_bDBaj+Vy%bu5Y0uMia(751xVUYjurf@BqYfhjFosrrVO&b=UaBJ* zRVN78NkBo!#fmE0cTcT_jX@G@AWtc#%DLj^v8gTWtqy10)QAq%X6{P@Q|Um~Nce`J z6C6{`db6PK_*$qBhHKT~6^QX= z`2pm`0;Xk>TfmW!Xr*QzEBvF%8Jp_Vg0=jd*PS>&;faj4v=c)(nbhpBxpufuO(|-M z#Q-P#lEIs7?HOWR6zM!d&uouzVwZgTrZGW@?`cWH&GeCx|9B=m+Ud-^A%LZd9FWLN z>X>TjvxiUr!YMF_{{Zg@H-9PVG{wBNO=Z=i(R;M4C*?Bd-670aa(Iqu0NPqGG(WLS zL2jo-vyV>)sfXWhyYyP2lJEQfURv$sY*5OL*_76my7x&_Gb2Gn1na~#8Q$eMq%}qT zL;!yW?cbaP%Rj|~O$kHMk5d+1g}K~m;yVXNy*yGbH0`{bq`eR+UKKnPJb(Q{G4_#x z%+Ah@K95C{cN^*wT3Hcr`U$&c!dhcBEqw6M7sMV4lO%$71xuO5(|tjH$WuP9NQ0Ip za5k6+=H&B03ge6XZIP~yM{tlF32eoRgP9~mYfNC`e9z9wMj+I=s;>H4oxLV^& z(hzt0iAT`jb*aE?)L;i^uGhlkP@h%y% z4F*xWY>D>oAR7q#t9>=b_W~AcLW!YfXg_Sl-xlb$eXWTSnjPVo7p_S5=0F|=B^c3B zBr=%nm;*@^^UG-VoV49d;qU0yoQ%fjXiSP5I22rawBFTM;`KU~c{Q$`q3#qQoPN3T zp&B#r1cUvjRxN2x{M5nc+r+o)J)E#50W0)M@Q6w6p{N zZ6g%Axx1*dc;Md~b;UWI27CD17uycnas}P0v1hRWU)K4fR1O z_GBXjE!MHHv6fqU4|87?aSAtB;K2$ODqVa6cZM+vRg51?!1GSGqHbs5$>`hH=Z$g9 zP=yCQ&n4$SZBbp%Z^6#?ct4Nl%rat>>dn=|dwj9g3_R@ck)rziA#RRI{NOwgckukd z@=SR5BNa0^UYdPf_WoIY6K3}7Jaue7@z%) zyF|hvcM#Y?q7EGb(K5dgQ+A^PC*V}dKZ6eh`6Jux$~3_-b>1`oEkSLng_yMZ$A NumberSpinner - jQuery EasyUI Mobile Demo
NumberSpinner
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/input/textbox.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/input/textbox.html new file mode 100755 index 000000000..a03bf1e76 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/input/textbox.html @@ -0,0 +1 @@ + TextBox - jQuery EasyUI Mobile Demo
TextBox
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/layout/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/layout/basic.html new file mode 100755 index 000000000..c1ecaffb5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/layout/basic.html @@ -0,0 +1,32 @@ + + + + + + Basic Layout - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Layout
+
+ Back +
+
+ Search +
+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/menu/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/menu/basic.html new file mode 100755 index 000000000..fb9709615 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/menu/basic.html @@ -0,0 +1,39 @@ + + + + + + Basic Menu - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Menu
+
+ + +
+
+
+
+
+
Undo
+
Redo
+ +
Cut
+
Copy
+
Paste
+ +
Toolbar
+
Delete
+
Select All
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/menu/menubar.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/menu/menubar.html new file mode 100755 index 000000000..5ef8eef8f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/menu/menubar.html @@ -0,0 +1,45 @@ + + + + + + Menubar - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
+ Home + Edit + Help + About +
+
+
+
+
+
Undo
+
Redo
+ +
Cut
+
Copy
+
Paste
+ +
Toolbar
+
Delete
+
Select All
+
+
+
Help
+
Update
+
About
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/_content.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

Here is the content loaded via AJAX.

+
    +
  • easyui is a collection of user-interface plugin based on jQuery.
  • +
  • easyui provides essential functionality for building modern, interactive, javascript applications.
  • +
  • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
  • +
  • complete framework for HTML5 web page.
  • +
  • easyui save your time and scales while developing your products.
  • +
  • easyui is very easy but powerful.
  • +
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/ajax.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/ajax.html new file mode 100755 index 000000000..e4b4f2de3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/ajax.html @@ -0,0 +1 @@ + Ajax Panel - jQuery EasyUI Mobile Demo
Ajax Panel
Panel Footer
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/basic.html new file mode 100755 index 000000000..407a2f32c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/basic.html @@ -0,0 +1 @@ + Basic Panel - jQuery EasyUI Mobile Demo
Panel Header
Panel Footer
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/nav.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/nav.html new file mode 100755 index 000000000..0362890b0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/panel/nav.html @@ -0,0 +1,39 @@ + + + + + + Navigation Panel - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Navigation
+
+
+ +
+
+
+
+
Panel2
+
+ Back +
+
+
+
+ Go Back +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/basic.html new file mode 100755 index 000000000..906d94261 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/basic.html @@ -0,0 +1 @@ + Simple List - jQuery EasyUI Mobile Demo
Simple List
  • Large
  • Spotted Adult Female
  • Venomless
  • Rattleless
  • Green Adult
  • Tailless
  • With tail
  • Adult Female
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/button.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/button.html new file mode 100755 index 000000000..f326ba970 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/button.html @@ -0,0 +1 @@ + Button on List - jQuery EasyUI Mobile Demo
Button on List
  • HP Deskjet 1000 Printer
    Add
  • Epson WorkForce 845
    Add
  • Logitech Keyboard K120
    Add
  • Nikon COOLPIX L26 16.1 MP
    Add
  • SanDisk Sansa Clip Zip 4GB
    Add
  • BLUE MP3 Metal Mini Clip Player
    Add
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/group.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/group.html new file mode 100755 index 000000000..e64c2e4aa --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/group.html @@ -0,0 +1 @@ + Group List - jQuery EasyUI Mobile Demo
Detail
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/image.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/image.html new file mode 100755 index 000000000..ddf79e592 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/image.html @@ -0,0 +1 @@ + List with Image - jQuery EasyUI Mobile Demo
List with Image
  • modem
    modulates an analog carrier signal to encode digital information.
  • scanner
    scans images, printed text, handwriting, or an object.
  • pda
    A personal digital assistant.
  • tablet
    one-piece mobile computer.
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/link.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/link.html new file mode 100755 index 000000000..c630576da --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/simplelist/link.html @@ -0,0 +1 @@ + Link List - jQuery EasyUI Mobile Demo
Detail
\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/basic.html new file mode 100755 index 000000000..4654e1256 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/basic.html @@ -0,0 +1 @@ + Basic Tabs - jQuery EasyUI Mobile Demo

Java is a general-purpose, concurrent, class-based, object-oriented computer programming language that is specifically designed to have as few implementation dependencies as possible.

Java applications are typically compiled to bytecode (class file) that can run on any Java virtual machine (JVM) regardless of computer architecture.

Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing. Originally developed by IBM at their campus in south San Jose, California[1] in the 1950s for scientific and engineering applications.

Perl is a family of high-level, general-purpose, interpreted, dynamic programming languages. The languages in this family include Perl 5 and Perl 6.

Though Perl is not officially an acronym, there are various backronyms in use, such as: Practical Extraction and Reporting Language. Perl was originally developed by Larry Wall in 1987 as a general-purpose Unix scripting language to make report processing easier. Since then, it has undergone many changes and revisions.

\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/nav.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/nav.html new file mode 100755 index 000000000..061218f35 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/nav.html @@ -0,0 +1 @@ + Navigation Tabs - jQuery EasyUI Mobile Demo
Devices

Modem

A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.


Scanner

In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.


Pda

A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.


Pda

A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/pill.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/pill.html new file mode 100755 index 000000000..ead286386 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/tabs/pill.html @@ -0,0 +1 @@ + Pill Tabs - jQuery EasyUI Mobile Demo

Java is a general-purpose, concurrent, class-based, object-oriented computer programming language that is specifically designed to have as few implementation dependencies as possible.

Java applications are typically compiled to bytecode (class file) that can run on any Java virtual machine (JVM) regardless of computer architecture.

Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing. Originally developed by IBM at their campus in south San Jose, California[1] in the 1950s for scientific and engineering applications.

Perl is a family of high-level, general-purpose, interpreted, dynamic programming languages. The languages in this family include Perl 5 and Perl 6.

Though Perl is not officially an acronym, there are various backronyms in use, such as: Practical Extraction and Reporting Language. Perl was originally developed by Larry Wall in 1987 as a general-purpose Unix scripting language to make report processing easier. Since then, it has undergone many changes and revisions.

\ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/basic.html new file mode 100755 index 000000000..9bed8acb6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/basic.html @@ -0,0 +1,63 @@ + + + + + + Basic Toolbar - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Basic Toolbar
+
+ Back +
+
+ Next +
+
+
+
    +
  • Large
  • +
  • Spotted Adult Female
  • +
  • Venomless
  • +
  • Rattleless
  • +
  • Green Adult
  • +
  • Tailless
  • +
  • With tail
  • +
  • Adult Female
  • +
+
+
+
+
+ Detail +
+ Back +
+
+
+
+ Go Back +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/button.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/button.html new file mode 100755 index 000000000..3db342ad0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/button.html @@ -0,0 +1,45 @@ + + + + + + Toolbar Button - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Toolbar Button
+
+
+ +
    +
  • Large
  • +
  • Spotted Adult Female
  • +
  • Venomless
  • +
  • Rattleless
  • +
  • Green Adult
  • +
  • Tailless
  • +
  • With tail
  • +
  • Adult Female
  • +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/menu.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/menu.html new file mode 100755 index 000000000..356747beb --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/toolbar/menu.html @@ -0,0 +1,76 @@ + + + + + + Menu on Toolbar - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Menu on Toolbar
+
+ +
+
+ + +
+
+
+
+
Undo
+
Redo
+ +
Cut
+
Copy
+
Paste
+ +
Toolbar
+
Delete
+
Select All
+
+
    +
  • Large
  • +
  • Spotted Adult Female
  • +
  • Venomless
  • +
  • Rattleless
  • +
  • Green Adult
  • +
  • Tailless
  • +
  • With tail
  • +
  • Adult Female
  • +
+
+
+
+
+ Detail +
+ Back +
+
+
+
+ Go Back +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/tree/basic.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/tree/basic.html new file mode 100755 index 000000000..9284505d2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/tree/basic.html @@ -0,0 +1,56 @@ + + + + + + Basic Tree - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Basic Tree
+
+
+
    +
  • + My Documents +
      +
    • + Photos +
        +
      • + Friend +
      • +
      • + Wife +
      • +
      • + Company +
      • +
      +
    • +
    • + Program Files +
        +
      • Intel
      • +
      • Java
      • +
      • Microsoft Office
      • +
      • Games
      • +
      +
    • +
    • index.html
    • +
    • about.html
    • +
    • welcome.html
    • +
    +
  • +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo-mobile/tree/dnd.html b/testapps/GHIssues/src/main/resources/asset/demo-mobile/tree/dnd.html new file mode 100755 index 000000000..ecb8e3131 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo-mobile/tree/dnd.html @@ -0,0 +1,56 @@ + + + + + + Drag Drop Tree Nodes - jQuery EasyUI Mobile Demo + + + + + + + + +
+
+
+
Drag Drop Tree Nodes
+
+
+
    +
  • + My Documents +
      +
    • + Photos +
        +
      • + Friend +
      • +
      • + Wife +
      • +
      • + Company +
      • +
      +
    • +
    • + Program Files +
        +
      • Intel
      • +
      • Java
      • +
      • Microsoft Office
      • +
      • Games
      • +
      +
    • +
    • index.html
    • +
    • about.html
    • +
    • welcome.html
    • +
    +
  • +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/accordion/_content.html b/testapps/GHIssues/src/main/resources/asset/demo/accordion/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/accordion/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

Here is the content loaded via AJAX.

+
    +
  • easyui is a collection of user-interface plugin based on jQuery.
  • +
  • easyui provides essential functionality for building modern, interactive, javascript applications.
  • +
  • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
  • +
  • complete framework for HTML5 web page.
  • +
  • easyui save your time and scales while developing your products.
  • +
  • easyui is very easy but powerful.
  • +
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/accordion/actions.html b/testapps/GHIssues/src/main/resources/asset/demo/accordion/actions.html new file mode 100755 index 000000000..f895ebb01 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/accordion/actions.html @@ -0,0 +1,51 @@ + + + + + Accordion Actions - jQuery EasyUI Demo + + + + + + + +

Accordion Actions

+

Click the buttons below to add or remove accordion items.

+
+ Select + Add + Remove +
+
+
+

Accordion for jQuery

+

Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/accordion/ajax.html b/testapps/GHIssues/src/main/resources/asset/demo/accordion/ajax.html new file mode 100755 index 000000000..e5c77f330 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/accordion/ajax.html @@ -0,0 +1,28 @@ + + + + + Loading Accordion Content with AJAX - jQuery EasyUI Demo + + + + + + + +

Loading Accordion Content with AJAX

+

Click AJAX panel header to load content via AJAX.

+
+
+
+

Accordion for jQuery

+

Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

+
+
+

The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

+
+
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/accordion/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/accordion/basic.html new file mode 100755 index 000000000..b643f5b53 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/accordion/basic.html @@ -0,0 +1,52 @@ + + + + + Basic Accordion - jQuery EasyUI Demo + + + + + + + +

Basic Accordion

+

Click on panel header to show its content.

+
+
+
+

Accordion for jQuery

+

Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

+
+
+

The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

+
+
+
    +
  • + Foods +
      +
    • + Fruits +
        +
      • apple
      • +
      • orange
      • +
      +
    • +
    • + Vegetables +
        +
      • tomato
      • +
      • carrot
      • +
      • cabbage
      • +
      • potato
      • +
      • lettuce
      • +
      +
    • +
    +
  • +
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/accordion/datagrid_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/accordion/datagrid_data1.json new file mode 100755 index 000000000..63d647358 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/accordion/datagrid_data1.json @@ -0,0 +1,12 @@ +{"total":28,"rows":[ + {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, + {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, + {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, + {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} +]} diff --git a/testapps/GHIssues/src/main/resources/asset/demo/accordion/expandable.html b/testapps/GHIssues/src/main/resources/asset/demo/accordion/expandable.html new file mode 100755 index 000000000..5353ca51a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/accordion/expandable.html @@ -0,0 +1,33 @@ + + + + + Keep Expandable Panel in Accordion - jQuery EasyUI Demo + + + + + + + +

Keep Expandable Panel in Accordion

+

Keep a expandable panel and prevent it from collapsing.

+
+
+
+ +
+
+

Accordion for jQuery

+

Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

+
+
+

Content1

+
+
+

Content2

+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/accordion/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/accordion/fluid.html new file mode 100755 index 000000000..184880266 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/accordion/fluid.html @@ -0,0 +1,33 @@ + + + + + Fluid Accordion - jQuery EasyUI Demo + + + + + + + +

Fluid Accordion

+

This example shows how to set the width of accordion to a percentage of its parent container.

+
+
+
+

width: 100%

+
+
+
+
+
+ +
+
+

width: 50%

+
+
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/accordion/horizontal.html b/testapps/GHIssues/src/main/resources/asset/demo/accordion/horizontal.html new file mode 100755 index 000000000..c52d25f0b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/accordion/horizontal.html @@ -0,0 +1,52 @@ + + + + + Horizontal Accordion - jQuery EasyUI Demo + + + + + + + +

Horizontal Accordion

+

You can easily set the 'halign' property to create a horizontal accordion.

+
+
+
+

Accordion for jQuery

+

Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

+
+
+

The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

+
+
+
    +
  • + Foods +
      +
    • + Fruits +
        +
      • apple
      • +
      • orange
      • +
      +
    • +
    • + Vegetables +
        +
      • tomato
      • +
      • carrot
      • +
      • cabbage
      • +
      • potato
      • +
      • lettuce
      • +
      +
    • +
    +
  • +
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/accordion/multiple.html b/testapps/GHIssues/src/main/resources/asset/demo/accordion/multiple.html new file mode 100755 index 000000000..12b90a83c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/accordion/multiple.html @@ -0,0 +1,34 @@ + + + + + Multiple Accordion Panels - jQuery EasyUI Demo + + + + + + + +

Multiple Accordion Panels

+

Enable 'multiple' mode to expand multiple panels at one time.

+
+
+
+

A programming language is a formal language designed to communicate instructions to a machine, particularly a computer. Programming languages can be used to create programs that control the behavior of a machine and/or to express algorithms precisely.

+
+
+

Java (Indonesian: Jawa) is an island of Indonesia. With a population of 135 million (excluding the 3.6 million on the island of Madura which is administered as part of the provinces of Java), Java is the world's most populous island, and one of the most densely populated places in the world.

+
+
+

C# is a multi-paradigm programming language encompassing strong typing, imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.

+
+
+

A dynamic, reflective, general-purpose object-oriented programming language.

+
+
+

Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing.

+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/accordion/tools.html b/testapps/GHIssues/src/main/resources/asset/demo/accordion/tools.html new file mode 100755 index 000000000..271694b46 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/accordion/tools.html @@ -0,0 +1,48 @@ + + + + + Accordion Tools - jQuery EasyUI Demo + + + + + + + +

Accordion Tools

+

Click the tools on top right of panel to perform actions.

+
+
+
+

Accordion for jQuery

+

Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

+
+
+

The accordion allows you to provide multiple panels and display one ore more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

+
+
+ + + + + + + + + + + +
Item IDProduct IDList PriceUnit CostAttributeStatus
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/calendar/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/calendar/basic.html new file mode 100755 index 000000000..64f37fe84 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/calendar/basic.html @@ -0,0 +1,19 @@ + + + + + Basic Calendar - jQuery EasyUI Demo + + + + + + + +

Basic Calendar

+

Click to select date.

+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/calendar/custom.html b/testapps/GHIssues/src/main/resources/asset/demo/calendar/custom.html new file mode 100755 index 000000000..f3fea452c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/calendar/custom.html @@ -0,0 +1,46 @@ + + + + + Custom Calendar - jQuery EasyUI Demo + + + + + + + +

Custom Calendar

+

This example shows how to custom the calendar date by using 'formatter' function.

+
+ +
+ + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/calendar/disabledate.html b/testapps/GHIssues/src/main/resources/asset/demo/calendar/disabledate.html new file mode 100755 index 000000000..ef2c7ea59 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/calendar/disabledate.html @@ -0,0 +1,28 @@ + + + + + Disable Calendar Date - jQuery EasyUI Demo + + + + + + + +

Disable Calendar Date

+

This example shows how to disable specified dates, only allows the user to select Mondays.

+
+ +
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/calendar/firstday.html b/testapps/GHIssues/src/main/resources/asset/demo/calendar/firstday.html new file mode 100755 index 000000000..c636a0700 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/calendar/firstday.html @@ -0,0 +1,30 @@ + + + + + First Day of Week - jQuery EasyUI Demo + + + + + + + +

First Day of Week

+

Choose the first day of the week.

+ +
+ +
+ +
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/calendar/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/calendar/fluid.html new file mode 100755 index 000000000..e5e707024 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/calendar/fluid.html @@ -0,0 +1,23 @@ + + + + + Fluid Calendar - jQuery EasyUI Demo + + + + + + + +

Fluid Calendar

+

This example shows how to set the width of calendar to a percentage of its parent container.

+
+
+

width: 50%, height: 250px

+
+

width: 30%, height: 40%

+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/calendar/weeknumber.html b/testapps/GHIssues/src/main/resources/asset/demo/calendar/weeknumber.html new file mode 100755 index 000000000..37d38b243 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/calendar/weeknumber.html @@ -0,0 +1,19 @@ + + + + + Week Number on Calendar - jQuery EasyUI Demo + + + + + + + +

Week Number on Calendar

+

This example shows how to display the week number on calendar.

+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combo/animation.html b/testapps/GHIssues/src/main/resources/asset/demo/combo/animation.html new file mode 100755 index 000000000..4f1d4af90 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combo/animation.html @@ -0,0 +1,41 @@ + + + + + Combo Animation - jQuery EasyUI Demo + + + + + + + +

Combo Animation

+

Change the animation type when open & close the drop-down panel.

+
+ Animation Type: + +
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combo/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/combo/basic.html new file mode 100755 index 000000000..cd966241a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combo/basic.html @@ -0,0 +1,48 @@ + + + + + Basic Combo - jQuery EasyUI Demo + + + + + + + +

Basic Combo

+

Click the right arrow button to show drop down panel that can be filled with any content.

+
+
+
+ +
+
+
+
Select a language
+
+ Java
+ C#
+ Ruby
+ Basic
+ Fortran +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/actions.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/actions.html new file mode 100755 index 000000000..a883e174d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/actions.html @@ -0,0 +1,88 @@ + + + + + ComboBox Actions - jQuery EasyUI Demo + + + + + + + +

ComboBox

+

Click the buttons below to perform actions.

+ + +
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/basic.html new file mode 100755 index 000000000..1f268ea57 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/basic.html @@ -0,0 +1,73 @@ + + + + + Basic ComboBox - jQuery EasyUI Demo + + + + + + + +

Basic ComboBox

+

Type in ComboBox to try auto complete.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/combobox_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/combobox/combobox_data1.json new file mode 100755 index 000000000..9c8f7f5b1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/combobox_data1.json @@ -0,0 +1,22 @@ +[{ + "id":1, + "text":"Java", + "desc":"Write once, run anywhere" +},{ + "id":2, + "text":"C#", + "desc":"One of the programming languages designed for the Common Language Infrastructure" +},{ + "id":3, + "text":"Ruby", + "selected":true, + "desc":"A dynamic, reflective, general-purpose object-oriented programming language" +},{ + "id":4, + "text":"Perl", + "desc":"A high-level, general-purpose, interpreted, dynamic programming language" +},{ + "id":5, + "text":"Basic", + "desc":"A family of general-purpose, high-level programming languages" +}] \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/combobox_data2.json b/testapps/GHIssues/src/main/resources/asset/demo/combobox/combobox_data2.json new file mode 100755 index 000000000..c3baf77dc --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/combobox_data2.json @@ -0,0 +1,47 @@ +[{ + "value":"f20", + "text":"Firefox 2.0 or higher", + "group":"Firefox" +},{ + "value":"f15", + "text":"Firefox 1.5.x", + "group":"Firefox" +},{ + "value":"f10", + "text":"Firefox 1.0.x", + "group":"Firefox" +},{ + "value":"ie7", + "text":"Microsoft Internet Explorer 7.0 or higher", + "group":"Microsoft Internet Explorer" +},{ + "value":"ie6", + "text":"Microsoft Internet Explorer 6.x", + "group":"Microsoft Internet Explorer" +},{ + "value":"ie5", + "text":"Microsoft Internet Explorer 5.x", + "group":"Microsoft Internet Explorer" +},{ + "value":"ie4", + "text":"Microsoft Internet Explorer 4.x", + "group":"Microsoft Internet Explorer" +},{ + "value":"op9", + "text":"Opera 9.0 or higher", + "group":"Opera" +},{ + "value":"op8", + "text":"Opera 8.x", + "group":"Opera" +},{ + "value":"op7", + "text":"Opera 7.x", + "group":"Opera" +},{ + "value":"Safari", + "text":"Safari" +},{ + "value":"Other", + "text":"Other" +}] \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/customformat.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/customformat.html new file mode 100755 index 000000000..4ccadfe86 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/customformat.html @@ -0,0 +1,39 @@ + + + + + Custom Format in ComboBox - jQuery EasyUI Demo + + + + + + + +

Custom Format in ComboBox

+

This sample shows how to custom the format of list item.

+
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/dynamicdata.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/dynamicdata.html new file mode 100755 index 000000000..ce151461a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/dynamicdata.html @@ -0,0 +1,31 @@ + + + + + Load Dynamic ComboBox Data - jQuery EasyUI Demo + + + + + + + +

Load Dynamic ComboBox Data

+

Click the button below to load data.

+ +
+ LoadData +
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/fluid.html new file mode 100755 index 000000000..0f5cd2596 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/fluid.html @@ -0,0 +1,43 @@ + + + + + Fluid ComboBox - jQuery EasyUI Demo + + + + + + + +

Fluid ComboBox

+

This example shows how to set the width of combobox to a percentage of its parent container.

+
+
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/group.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/group.html new file mode 100755 index 000000000..8bc3ad87c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/group.html @@ -0,0 +1,33 @@ + + + + + Group ComboBox - jQuery EasyUI Demo + + + + + + + +

Group ComboBox

+

This example shows how to display combobox items in groups.

+
+ + Sticky Group +
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/icons.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/icons.html new file mode 100755 index 000000000..0c30cc1fa --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/icons.html @@ -0,0 +1,36 @@ + + + + + ComboBox with Extra Icons- jQuery EasyUI Demo + + + + + + + +

ComboBox with Extra Icons

+

The user can attach extra icons to the ComboBox.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/itemicon.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/itemicon.html new file mode 100644 index 000000000..6a818197c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/itemicon.html @@ -0,0 +1,35 @@ + + + + + Show Item Icon in ComboBox - jQuery EasyUI Demo + + + + + + + +

Show Item Icon in ComboBox

+

This example shows how to display item icon in ComboBox.

+
+
+
+ +
+
+ diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/multiline.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/multiline.html new file mode 100755 index 000000000..133221f3a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/multiline.html @@ -0,0 +1,75 @@ + + + + + Multiline ComboBox - jQuery EasyUI Demo + + + + + + + +

Multiline ComboBox

+

This example shows how to create a multiline ComboBox.

+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/multiple.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/multiple.html new file mode 100755 index 000000000..9fd2a114b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/multiple.html @@ -0,0 +1,32 @@ + + + + + Multiple Select - jQuery EasyUI Demo + + + + + + + +

Load Dynamic ComboBox Data

+

Drop down the panel and select multiple items.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/navigation.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/navigation.html new file mode 100755 index 000000000..691bc7c07 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/navigation.html @@ -0,0 +1,77 @@ + + + + + Navigate ComboBox - jQuery EasyUI Demo + + + + + + + +

Navigate ComboBox

+

Navigate through combobox items width keyboard to select an item.

+
+ + SelectOnNavigation +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/remotedata.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/remotedata.html new file mode 100755 index 000000000..8277d27d6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/remotedata.html @@ -0,0 +1,30 @@ + + + + + Binding to Remote Data - jQuery EasyUI Demo + + + + + + + +

Binding to Remote Data

+

The ComboBox is bound to a remote data.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combobox/remotejsonp.html b/testapps/GHIssues/src/main/resources/asset/demo/combobox/remotejsonp.html new file mode 100755 index 000000000..1fbc04fdb --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combobox/remotejsonp.html @@ -0,0 +1,54 @@ + + + + + Remote JSONP - jQuery EasyUI Demo + + + + + + + +

Remote JSONP

+

This sample shows how to use JSONP to retrieve data from a remote site.

+
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combogrid/actions.html b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/actions.html new file mode 100755 index 000000000..64443e5fe --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/actions.html @@ -0,0 +1,60 @@ + + + + + ComboGrid Actions - jQuery EasyUI Demo + + + + + + + +

ComboGrid Actions

+

Click the buttons below to perform actions.

+ +
+
+ +
+
+ + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combogrid/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/basic.html new file mode 100755 index 000000000..3edc31ee2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/basic.html @@ -0,0 +1,40 @@ + + + + + Basic ComboGrid - jQuery EasyUI Demo + + + + + + + +

Basic ComboGrid

+

Click the right arrow button to show the DataGrid.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combogrid/datagrid_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/datagrid_data1.json new file mode 100755 index 000000000..c74fa230d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/datagrid_data1.json @@ -0,0 +1,12 @@ +{"total":28,"rows":[ + {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, + {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, + {"selected":true,"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, + {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} +]} diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combogrid/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/fluid.html new file mode 100755 index 000000000..52b0ac75e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/fluid.html @@ -0,0 +1,63 @@ + + + + + Fluid ComboGrid - jQuery EasyUI Demo + + + + + + + +

Fluid ComboGrid

+

This example shows how to set the width of ComboGrid to a percentage of its parent container.

+
+
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combogrid/initvalue.html b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/initvalue.html new file mode 100755 index 000000000..be122a091 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/initvalue.html @@ -0,0 +1,41 @@ + + + + + Initialize Value for ComboGrid - jQuery EasyUI Demo + + + + + + + +

Initialize Value for ComboGrid

+

Initialize value when ComboGrid is created.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combogrid/multiple.html b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/multiple.html new file mode 100755 index 000000000..c357d7be8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/multiple.html @@ -0,0 +1,42 @@ + + + + + Multiple ComboGrid - jQuery EasyUI Demo + + + + + + + +

Multiple ComboGrid

+

Click the right arrow button to show the DataGrid and select items.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combogrid/navigation.html b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/navigation.html new file mode 100755 index 000000000..793c74e1a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/navigation.html @@ -0,0 +1,43 @@ + + + + + Navigate ComboGrid - jQuery EasyUI Demo + + + + + + + +

Navigate ComboGrid

+

Navigate through grid items with keyboard to select an item.

+
+ + SelectOnNavigation +
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combogrid/setvalue.html b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/setvalue.html new file mode 100755 index 000000000..df86ba4e2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combogrid/setvalue.html @@ -0,0 +1,59 @@ + + + + + Set Value for ComboGrid - jQuery EasyUI Demo + + + + + + + +

Set Value for ComboGrid

+

Click the buttons below to perform actions.

+ +
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combotree/actions.html b/testapps/GHIssues/src/main/resources/asset/demo/combotree/actions.html new file mode 100755 index 000000000..1d4660af2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combotree/actions.html @@ -0,0 +1,43 @@ + + + + + ComboTree Actions - jQuery EasyUI Demo + + + + + + + +

ComboTree Actions

+

Click the buttons below to perform actions

+ +
+
+ +
+
+ + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combotree/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/combotree/basic.html new file mode 100755 index 000000000..687207cbf --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combotree/basic.html @@ -0,0 +1,22 @@ + + + + + Basic ComboTree - jQuery EasyUI Demo + + + + + + + +

Basic ComboTree

+

Click the right arrow button to show the tree panel.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combotree/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/combotree/fluid.html new file mode 100755 index 000000000..bc77d9e6a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combotree/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid ComboTree - jQuery EasyUI Demo + + + + + + + +

Fluid ComboTree

+

This example shows how to set the width of ComboTree to a percentage of its parent container.

+
+
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combotree/initvalue.html b/testapps/GHIssues/src/main/resources/asset/demo/combotree/initvalue.html new file mode 100755 index 000000000..92af22ddc --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combotree/initvalue.html @@ -0,0 +1,22 @@ + + + + + Initialize Value for ComboTree - jQuery EasyUI Demo + + + + + + + +

Initialize Value for ComboTree

+

Initialize Value when ComboTree is created.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combotree/multiple.html b/testapps/GHIssues/src/main/resources/asset/demo/combotree/multiple.html new file mode 100755 index 000000000..7ae86eab3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combotree/multiple.html @@ -0,0 +1,26 @@ + + + + + Multiple ComboTree - jQuery EasyUI Demo + + + + + + + +

Multiple ComboTree

+

Click the right arrow button to show the tree panel and select multiple nodes.

+
+ Cascade Check: + +
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combotree/tree_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/combotree/tree_data1.json new file mode 100755 index 000000000..e0c619226 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combotree/tree_data1.json @@ -0,0 +1,49 @@ +[{ + "id":1, + "text":"My Documents", + "children":[{ + "id":11, + "text":"Photos", + "state":"closed", + "children":[{ + "id":111, + "text":"Friend" + },{ + "id":112, + "text":"Wife" + },{ + "id":113, + "text":"Company" + }] + },{ + "id":12, + "text":"Program Files", + "children":[{ + "id":121, + "text":"Intel" + },{ + "id":122, + "text":"Java", + "attributes":{ + "p1":"Custom Attribute1", + "p2":"Custom Attribute2" + } + },{ + "id":123, + "text":"Microsoft Office" + },{ + "id":124, + "text":"Games", + "checked":true + }] + },{ + "id":13, + "text":"index.html" + },{ + "id":14, + "text":"about.html" + },{ + "id":15, + "text":"welcome.html" + }] +}] diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/basic.html new file mode 100755 index 000000000..f4fac4bfb --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/basic.html @@ -0,0 +1,34 @@ + + + + + Basic ComboTreeGrid - jQuery EasyUI Demo + + + + + + + +

Basic ComboTreeGrid

+

Click the right arrow button to show the TreeGrid.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/multiple.html b/testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/multiple.html new file mode 100755 index 000000000..91d35299c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/multiple.html @@ -0,0 +1,36 @@ + + + + + Multiple ComboTreeGrid - jQuery EasyUI Demo + + + + + + + +

Multiple ComboTreeGrid

+

Click the right arrow button to show the TreeGrid and select items.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json new file mode 100755 index 000000000..6cc109739 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json @@ -0,0 +1,73 @@ +[{ + "id":1, + "name":"C", + "size":"", + "date":"02/19/2010", + "children":[{ + "id":2, + "name":"Program Files", + "size":"120 MB", + "date":"03/20/2010", + "children":[{ + "id":21, + "name":"Java", + "size":"", + "date":"01/13/2010", + "state":"closed", + "children":[{ + "id":211, + "name":"java.exe", + "size":"142 KB", + "date":"01/13/2010" + },{ + "id":212, + "name":"jawt.dll", + "size":"5 KB", + "date":"01/13/2010" + }] + },{ + "id":22, + "name":"MySQL", + "size":"", + "date":"01/13/2010", + "state":"closed", + "children":[{ + "id":221, + "name":"my.ini", + "size":"10 KB", + "date":"02/26/2009" + },{ + "id":222, + "name":"my-huge.ini", + "size":"5 KB", + "date":"02/26/2009" + },{ + "id":223, + "name":"my-large.ini", + "size":"5 KB", + "date":"02/26/2009" + }] + }] + },{ + "id":3, + "name":"eclipse", + "size":"", + "date":"01/20/2010", + "children":[{ + "id":31, + "name":"eclipse.exe", + "size":"56 KB", + "date":"05/19/2009" + },{ + "id":32, + "name":"eclipse.ini", + "size":"1 KB", + "date":"04/20/2010" + },{ + "id":33, + "name":"notice.html", + "size":"7 KB", + "date":"03/17/2005" + }] + }] +}] \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/aligncolumns.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/aligncolumns.html new file mode 100755 index 000000000..602196211 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/aligncolumns.html @@ -0,0 +1,32 @@ + + + + + Aligning Columns in DataGrid - jQuery EasyUI Demo + + + + + + + +

Aligning Columns in DataGrid

+

Use align and halign properties to set the alignment of the columns and their header.

+
+ + + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/basic.html new file mode 100755 index 000000000..6870ac217 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/basic.html @@ -0,0 +1,32 @@ + + + + + Basic DataGrid - jQuery EasyUI Demo + + + + + + + +

Basic DataGrid

+

The DataGrid is created from markup, no JavaScript code needed.

+
+ + + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/cacheeditor.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/cacheeditor.html new file mode 100755 index 000000000..df55e30f6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/cacheeditor.html @@ -0,0 +1,149 @@ + + + + + Cache Editor for DataGrid - jQuery EasyUI Demo + + + + + + + +

Cache Editor for DataGrid

+

This example shows how to cache the editors for datagrid to improve the editing speed.

+
+ + + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/cellediting.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/cellediting.html new file mode 100755 index 000000000..385b2d4d8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/cellediting.html @@ -0,0 +1,94 @@ + + + + + Cell Editing in DataGrid - jQuery EasyUI Demo + + + + + + + +

Cell Editing in DataGrid

+

Click a cell to start editing.

+
+ + + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/cellstyle.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/cellstyle.html new file mode 100755 index 000000000..9230ac214 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/cellstyle.html @@ -0,0 +1,42 @@ + + + + + DataGrid Cell Style - jQuery EasyUI Demo + + + + + + + +

DataGrid Cell Style

+

The cells which listprice value is less than 30 are highlighted.

+
+ + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/checkbox.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/checkbox.html new file mode 100755 index 000000000..ca1c81c2e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/checkbox.html @@ -0,0 +1,42 @@ + + + + + CheckBox Selection on DataGrid - jQuery EasyUI Demo + + + + + + + +

CheckBox Selection on DataGrid

+

Click the checkbox on header to select or unselect all selections.

+
+ + + + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+
+ Selection Mode: +
+ SelectOnCheck:
+ CheckOnSelect: +
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/clientpagination.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/clientpagination.html new file mode 100755 index 000000000..3bec54cd8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/clientpagination.html @@ -0,0 +1,160 @@ + + + + + Client Side Pagination in DataGrid - jQuery EasyUI Demo + + + + + + + +

Client Side Pagination in DataGrid

+

This sample shows how to implement client side pagination in DataGrid.

+
+ + + + + + + + + + + + + +
Inv NoDateNameAmountPriceCostNote
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/columngroup.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/columngroup.html new file mode 100755 index 000000000..9c3340e11 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/columngroup.html @@ -0,0 +1,34 @@ + + + + + Column Group - jQuery EasyUI Demo + + + + + + + +

Column Group

+

The header cells can be merged. Useful to group columns under a category.

+
+ + + + + + + + + + + + + + +
Item IDProductItem Details
List PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/complextoolbar.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/complextoolbar.html new file mode 100755 index 000000000..35c9ba186 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/complextoolbar.html @@ -0,0 +1,50 @@ + + + + + DataGrid Complex Toolbar - jQuery EasyUI Demo + + + + + + + +

DataGrid Complex Toolbar

+

The DataGrid toolbar can be defined from a <div> markup, so you can define the layout of toolbar easily.

+
+ + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+
+ Date From: + To: + Language: + + Search +
+
+ + + + + +
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/contextmenu.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/contextmenu.html new file mode 100755 index 000000000..4da2f842d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/contextmenu.html @@ -0,0 +1,89 @@ + + + + + Context Menu on DataGrid - jQuery EasyUI Demo + + + + + + + +

Context Menu on DataGrid

+

Right click on the header of DataGrid to display context menu.

+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/custompager.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/custompager.html new file mode 100755 index 000000000..c4c62d707 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/custompager.html @@ -0,0 +1,53 @@ + + + + + Custom DataGrid Pager - jQuery EasyUI Demo + + + + + + + +

Custom DataGrid Pager

+

You can append some buttons to the standard datagrid pager bar.

+
+ + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/datagrid_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/datagrid_data1.json new file mode 100755 index 000000000..63d647358 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/datagrid_data1.json @@ -0,0 +1,12 @@ +{"total":28,"rows":[ + {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, + {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, + {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, + {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} +]} diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/datagrid_data2.json b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/datagrid_data2.json new file mode 100755 index 000000000..ce91babf0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/datagrid_data2.json @@ -0,0 +1,15 @@ +{"total":28,"rows":[ + {"productid":"FI-SW-01","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, + {"productid":"K9-DL-01","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, + {"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":28.50,"attr1":"Venomless","itemid":"EST-11"}, + {"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, + {"productid":"RP-LI-02","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, + {"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, + {"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, + {"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":63.50,"attr1":"Adult Female","itemid":"EST-16"}, + {"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, + {"productid":"AV-CB-01","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} +],"footer":[ + {"unitcost":19.80,"listprice":60.40,"productid":"Average:"}, + {"unitcost":198.00,"listprice":604.00,"productid":"Total:"} +]} diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/fluid.html new file mode 100755 index 000000000..463f570c5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/fluid.html @@ -0,0 +1,32 @@ + + + + + Fluid DataGrid - jQuery EasyUI Demo + + + + + + + +

Fluid DataGrid

+

This example shows how to assign percentage width to a column in DataGrid.

+
+ + + + + + + + + + + + +
Item ID(15%)Product(15%)List Price(15%)Unit Cost(15%)Attribute(25%)Status(15%)
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/footer.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/footer.html new file mode 100755 index 000000000..ccb8885fa --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/footer.html @@ -0,0 +1,38 @@ + + + + + Footer Rows in DataGrid - jQuery EasyUI Demo + + + + + + + +

Footer Rows in DataGrid

+

The summary informations can be displayed in footer rows.

+
+ + + + + + + + + + + +
Item IDProduct IDList PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/formatcolumns.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/formatcolumns.html new file mode 100755 index 000000000..e5a2e0252 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/formatcolumns.html @@ -0,0 +1,39 @@ + + + + + Format DataGrid Columns - jQuery EasyUI Demo + + + + + + + +

Format DataGrid Columns

+

The list price value will show red color when less than 30.

+
+ + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/frozencolumns.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/frozencolumns.html new file mode 100755 index 000000000..3542017b4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/frozencolumns.html @@ -0,0 +1,35 @@ + + + + + Frozen Columns in DataGrid - jQuery EasyUI Demo + + + + + + + +

Frozen Columns in DataGrid

+

You can freeze some columns that can't scroll out of view.

+
+ + + + + + + + + + + + + + + +
Item IDProduct
List PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/frozenrows.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/frozenrows.html new file mode 100755 index 000000000..be27afd83 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/frozenrows.html @@ -0,0 +1,44 @@ + + + + + Frozen Rows in DataGrid - jQuery EasyUI Demo + + + + + + + +

Frozen Rows in DataGrid

+

This sample shows how to freeze some rows that will always be displayed at the top when the datagrid is scrolled down.

+
+ + + + + + + + + + + + + + + +
Item IDProduct
List PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/mergecells.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/mergecells.html new file mode 100755 index 000000000..3d0ff75e8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/mergecells.html @@ -0,0 +1,58 @@ + + + + + Merge Cells for DataGrid - jQuery EasyUI Demo + + + + + + + +

Merge Cells for DataGrid

+

Cells in DataGrid body can be merged.

+
+ + + + + + + + + + + +
ProductItem IDList PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/multisorting.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/multisorting.html new file mode 100755 index 000000000..d7337f3d8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/multisorting.html @@ -0,0 +1,37 @@ + + + + + Multiple Sorting - jQuery EasyUI Demo + + + + + + + +

Multiple Sorting

+

Set 'multiSort' property to true to enable multiple column sorting.

+
+ + + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/products.json b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/products.json new file mode 100755 index 000000000..b0b6a936e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/products.json @@ -0,0 +1,9 @@ +[ +{"productid":"FI-SW-01","productname":"Koi"}, +{"productid":"K9-DL-01","productname":"Dalmation"}, +{"productid":"RP-SN-01","productname":"Rattlesnake"}, +{"productid":"RP-LI-02","productname":"Iguana"}, +{"productid":"FL-DSH-01","productname":"Manx"}, +{"productid":"FL-DLH-02","productname":"Persian"}, +{"productid":"AV-CB-01","productname":"Amazon Parrot"} +] diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowborder.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowborder.html new file mode 100755 index 000000000..21843f451 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowborder.html @@ -0,0 +1,60 @@ + + + + + Row Border in DataGrid - jQuery EasyUI Demo + + + + + + + +

Row Border in DataGrid

+

This sample shows how to change the row border style of datagrid.

+
+ Border: + + Striped: + +
+ + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowediting.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowediting.html new file mode 100755 index 000000000..c9dd52683 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowediting.html @@ -0,0 +1,125 @@ + + + + + Row Editing in DataGrid - jQuery EasyUI Demo + + + + + + + +

Row Editing in DataGrid

+

Click the row to start editing.

+
+ + + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowstyle.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowstyle.html new file mode 100755 index 000000000..d4e36a877 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/rowstyle.html @@ -0,0 +1,41 @@ + + + + + DataGrid Row Style - jQuery EasyUI Demo + + + + + + + +

DataGrid Row Style

+

The rows which listprice value is less than 30 are highlighted.

+
+ + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/selection.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/selection.html new file mode 100755 index 000000000..d6b4047bc --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/selection.html @@ -0,0 +1,57 @@ + + + + + DataGrid Selection - jQuery EasyUI Demo + + + + + + + +

DataGrid Selection

+

Choose a selection mode and select one or more rows.

+ + + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+
+ Selection Mode: + +
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/simpletoolbar.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/simpletoolbar.html new file mode 100755 index 000000000..4c67f56e7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/simpletoolbar.html @@ -0,0 +1,45 @@ + + + + + DataGrid with Toolbar - jQuery EasyUI Demo + + + + + + + +

DataGrid with Toolbar

+

Put buttons on top toolbar of DataGrid.

+
+ + + + + + + + + + + +
Item IDProductList PriceUnit CostAttributeStatus
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datagrid/transform.html b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/transform.html new file mode 100755 index 000000000..9379832ae --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datagrid/transform.html @@ -0,0 +1,46 @@ + + + + + Transform DataGrid from Table - jQuery EasyUI Demo + + + + + + + +

Transform DataGrid from Table

+

Transform DataGrid from an existing, unformatted html table.

+
+ Transform +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Item IDProductList PriceAttribute
EST-1FI-SW-0136.50Large
EST-10K9-DL-0118.50Spotted Adult Female
EST-11RP-SN-0128.50Venomless
EST-12RP-SN-0126.50Rattleless
EST-13RP-LI-0235.50Green Adult
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datalist/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/datalist/basic.html new file mode 100644 index 000000000..491021908 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datalist/basic.html @@ -0,0 +1,69 @@ + + + + + Basic DataList - jQuery EasyUI Demo + + + + + + + +

Basic DataList

+

The DataList can be created from the <ul> element.

+
+
    +
  • Alabama
  • +
  • Alaska
  • +
  • Arizona
  • +
  • Arkansas
  • +
  • California
  • +
  • Colorado
  • +
  • Connecticut
  • +
  • Delaware
  • +
  • Florida
  • +
  • Georgia
  • +
  • Hawaii
  • +
  • Idaho
  • +
  • Illinois
  • +
  • Indiana
  • +
  • Iowa
  • +
  • Kansas
  • +
  • Kentucky
  • +
  • Louisiana
  • +
  • Maine
  • +
  • Maryland
  • +
  • Massachusetts
  • +
  • Michigan
  • +
  • Minnesota
  • +
  • Mississippi
  • +
  • Missouri
  • +
  • Montana
  • +
  • Nebraska
  • +
  • Nevada
  • +
  • New Hampshire
  • +
  • New Jersey
  • +
  • New Mexico
  • +
  • New York
  • +
  • North Carolina
  • +
  • North Dakota
  • +
  • Ohio
  • +
  • Oklahoma
  • +
  • Oregon
  • +
  • Pennsylvania
  • +
  • Rhode Island
  • +
  • South Carolina
  • +
  • South Dakota
  • +
  • Tennessee
  • +
  • Texas
  • +
  • Utah
  • +
  • Vermont
  • +
  • Virginia
  • +
  • Washington
  • +
  • West Virginia
  • +
  • Wisconsin
  • +
  • Wyoming
  • +
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datalist/checkbox.html b/testapps/GHIssues/src/main/resources/asset/demo/datalist/checkbox.html new file mode 100644 index 000000000..dd18f5b1c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datalist/checkbox.html @@ -0,0 +1,25 @@ + + + + + Checkbox in DataList - jQuery EasyUI Demo + + + + + + + +

Checkbox in DataList

+

Each item in the DataList has a checkbox.

+
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datalist/datalist_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/datalist/datalist_data1.json new file mode 100644 index 000000000..d53cf62a0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datalist/datalist_data1.json @@ -0,0 +1,18 @@ +[ +{"text":"Epson WorkForce 845","group":"Printer"}, +{"text":"Canon PIXMA MG5320","group":"Printer"}, +{"text":"HP Deskjet 1000 Printer","group":"Printer"}, +{"text":"Cisco RV110W-A-NA-K9","group":"Firewall"}, +{"text":"ZyXEL ZyWALL USG50","group":"Firewall"}, +{"text":"NETGEAR FVS318","group":"Firewall"}, +{"text":"Logitech Keyboard K120","group":"Keyboard"}, +{"text":"Microsoft Natural Ergonomic Keyboard 4000","group":"Keyboard"}, +{"text":"Logitech Wireless Touch Keyboard K400","group":"Keyboard"}, +{"text":"Logitech Gaming Keyboard G110","group":"Keyboard"}, +{"text":"Nikon COOLPIX L26 16.1 MP","group":"Camera"}, +{"text":"Canon PowerShot A1300","group":"Camera"}, +{"text":"Canon PowerShot A2300","group":"Camera"} + + + +] \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datalist/group.html b/testapps/GHIssues/src/main/resources/asset/demo/datalist/group.html new file mode 100644 index 000000000..bf22b6f03 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datalist/group.html @@ -0,0 +1,23 @@ + + + + + Group DataList - jQuery EasyUI Demo + + + + + + + +

Group DataList

+

This example shows how to display items in groups.

+
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datalist/multiselect.html b/testapps/GHIssues/src/main/resources/asset/demo/datalist/multiselect.html new file mode 100644 index 000000000..704924c6a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datalist/multiselect.html @@ -0,0 +1,23 @@ + + + + + Multiple Selection DataList - jQuery EasyUI Demo + + + + + + + +

Multiple Selection DataList

+

The multiple selection allows the user to select multiple items in a datalist.

+
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datalist/remotedata.html b/testapps/GHIssues/src/main/resources/asset/demo/datalist/remotedata.html new file mode 100644 index 000000000..0c71604aa --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datalist/remotedata.html @@ -0,0 +1,22 @@ + + + + + Binding to Remote Data - jQuery EasyUI Demo + + + + + + + +

Binding to Remote Data

+

The DataList is bound to a remote data.

+
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datebox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/datebox/basic.html new file mode 100755 index 000000000..ccbde6f3d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datebox/basic.html @@ -0,0 +1,25 @@ + + + + + Basic DateBox - jQuery EasyUI Demo + + + + + + + +

Basic DateBox

+

Click the calendar image on the right side.

+
+
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datebox/buttons.html b/testapps/GHIssues/src/main/resources/asset/demo/datebox/buttons.html new file mode 100755 index 000000000..10b566a58 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datebox/buttons.html @@ -0,0 +1,34 @@ + + + + + DateBox Buttons - jQuery EasyUI Demo + + + + + + + +

DateBox Buttons

+

This example shows how to customize the datebox buttons underneath the calendar.

+
+
+
+ +
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datebox/clone.html b/testapps/GHIssues/src/main/resources/asset/demo/datebox/clone.html new file mode 100755 index 000000000..be975ecc7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datebox/clone.html @@ -0,0 +1,31 @@ + + + + + Clone DateBox - jQuery EasyUI Demo + + + + + + + +

Clone DateBox

+

Click the 'Clone' button to clone datebox components from the exiting datebox.

+
+ Clone +
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datebox/dateformat.html b/testapps/GHIssues/src/main/resources/asset/demo/datebox/dateformat.html new file mode 100755 index 000000000..3fa8b3b62 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datebox/dateformat.html @@ -0,0 +1,45 @@ + + + + + Date Format - jQuery EasyUI Demo + + + + + + + +

Date Format

+

Different date formats are applied to different DateBox components.

+
+
+
+ +
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datebox/events.html b/testapps/GHIssues/src/main/resources/asset/demo/datebox/events.html new file mode 100755 index 000000000..3d75faefd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datebox/events.html @@ -0,0 +1,31 @@ + + + + + DateBox Events - jQuery EasyUI Demo + + + + + + + +

DateBox Events

+

Click the calendar image on the right side.

+
+
+
+ +
+
+ Selected Date: + +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datebox/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/datebox/fluid.html new file mode 100755 index 000000000..3bf3dd400 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datebox/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid DateBox - jQuery EasyUI Demo + + + + + + + +

Fluid DateBox

+

This example shows how to set the width of DateBox to a percentage of its parent container.

+
+
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datebox/restrict.html b/testapps/GHIssues/src/main/resources/asset/demo/datebox/restrict.html new file mode 100755 index 000000000..0622efe49 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datebox/restrict.html @@ -0,0 +1,34 @@ + + + + + Restrict Date Range in DateBox - jQuery EasyUI Demo + + + + + + + +

Restrict Date Range in DateBox

+

This example shows how to restrict the user to select only ten days from now.

+
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datebox/sharedcalendar.html b/testapps/GHIssues/src/main/resources/asset/demo/datebox/sharedcalendar.html new file mode 100644 index 000000000..ca06eb82a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datebox/sharedcalendar.html @@ -0,0 +1,26 @@ + + + + + Shared Calendar in DateBox - jQuery EasyUI Demo + + + + + + + +

Shared Calendar in DateBox

+

Multiple datebox components can share a calendar and use it to pick dates.

+
+
+
+ +
+
+ +
+
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datebox/validate.html b/testapps/GHIssues/src/main/resources/asset/demo/datebox/validate.html new file mode 100755 index 000000000..067582dba --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datebox/validate.html @@ -0,0 +1,37 @@ + + + + + Validate DateBox - jQuery EasyUI Demo + + + + + + + +

Validate DateBox

+

When the selected date is greater than specified date. The field validator will raise an error.

+
+
+
+ +
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/basic.html new file mode 100755 index 000000000..f1521d02c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/basic.html @@ -0,0 +1,25 @@ + + + + + Basic DateTimeBox - jQuery EasyUI Demo + + + + + + + +

Basic DateTimeBox

+

Click the calendar image on the right side.

+
+
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/fluid.html new file mode 100755 index 000000000..827a1b2a0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid DateTimeBox - jQuery EasyUI Demo + + + + + + + +

Fluid DateTimeBox

+

This example shows how to set the width of DateTimeBox to a percentage of its parent container.

+
+
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/initvalue.html b/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/initvalue.html new file mode 100755 index 000000000..59079f556 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/initvalue.html @@ -0,0 +1,22 @@ + + + + + Initialize Value for DateTime - jQuery EasyUI Demo + + + + + + + +

Initialize Value for DateTime

+

The value is initialized when DateTimeBox has been created.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/showseconds.html b/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/showseconds.html new file mode 100755 index 000000000..508ac19ff --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datetimebox/showseconds.html @@ -0,0 +1,25 @@ + + + + + Display Seconds - jQuery EasyUI Demo + + + + + + + +

Display Seconds

+

The user can decide to display seconds part or not.

+
+ Show Seconds: + +
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/basic.html new file mode 100644 index 000000000..8a00c41a2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/basic.html @@ -0,0 +1,25 @@ + + + + + Basic DateTimeSpinner - jQuery EasyUI Demo + + + + + + + +

Basic DateTimeSpinner

+

Click spin button to adjust date and time.

+
+
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/clearicon.html b/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/clearicon.html new file mode 100644 index 000000000..74e2795d0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/clearicon.html @@ -0,0 +1,33 @@ + + + + + DateTimeSpinner with Clear Icon - jQuery EasyUI Demo + + + + + + + +

DateTimeSpinner with Clear Icon

+

A clear icon can be attached to the datetimespinner. Click it to clear the entered value.

+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/fluid.html new file mode 100644 index 000000000..e5e3f1fe9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid DateTimeSpinner - jQuery EasyUI Demo + + + + + + + +

Fluid DateTimeSpinner

+

The width of datetimespinner is set in percentages.

+
+
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/format.html b/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/format.html new file mode 100644 index 000000000..f470c715b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/datetimespinner/format.html @@ -0,0 +1,55 @@ + + + + + Format DateTimeSpinner - jQuery EasyUI Demo + + + + + + + +

Format DateTimeSpinner

+

The DataTimeSpinner value can be formatted by specifying the 'formatter' and 'parser' functions.

+
+
+
+ +
+
+ +
+
+ +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/demo.css b/testapps/GHIssues/src/main/resources/asset/demo/demo.css new file mode 100755 index 000000000..fe8b3c70a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/demo.css @@ -0,0 +1,24 @@ +body { + font-family:verdana,helvetica,arial,sans-serif; + padding:20px; + font-size:12px; + margin:0; +} +h2 { + font-size:18px; + font-weight:bold; + margin:0; + margin-bottom:15px; +} +.demo-info{ + padding:0 0 12px 0; +} +.demo-tip{ + display:none; +} +.label-top{ + display: block; + height: 22px; + line-height: 22px; + vertical-align: middle; +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/dialog/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/dialog/basic.html new file mode 100755 index 000000000..37ca83059 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/dialog/basic.html @@ -0,0 +1,23 @@ + + + + + Basic Dialog - jQuery EasyUI Demo + + + + + + + +

Basic Dialog

+

Click below button to open or close dialog.

+
+ Open + Close +
+
+ The dialog content. +
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/dialog/complextoolbar.html b/testapps/GHIssues/src/main/resources/asset/demo/dialog/complextoolbar.html new file mode 100755 index 000000000..adaa97b7b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/dialog/complextoolbar.html @@ -0,0 +1,46 @@ + + + + + Complex Toolbar on Dialog - jQuery EasyUI Demo + + + + + + + +

Complex Toolbar on Dialog

+

This sample shows how to create complex toolbar on dialog.

+
+ Open + Close +
+
+ The dialog content. +
+
+ + + + + +
+ Edit + Help + + +
+
+
+ Save + Close +
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/dialog/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/dialog/fluid.html new file mode 100755 index 000000000..f64f72e0d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/dialog/fluid.html @@ -0,0 +1,24 @@ + + + + + Fluid Dialog - jQuery EasyUI Demo + + + + + + + +

Fluid Dialog

+

This example shows how to set the width of Dialog to a percentage of its parent container.

+
+
+

width: 80%; height: 200px

+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/dialog/toolbarbuttons.html b/testapps/GHIssues/src/main/resources/asset/demo/dialog/toolbarbuttons.html new file mode 100755 index 000000000..12e230758 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/dialog/toolbarbuttons.html @@ -0,0 +1,52 @@ + + + + + Toolbar and Buttons - jQuery EasyUI Demo + + + + + + + +

Toolbar and Buttons

+

The toolbar and buttons can be added to dialog.

+
+ Open + Close +
+
+ The dialog content. +
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/draggable/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/draggable/basic.html new file mode 100755 index 000000000..3a73cf230 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/draggable/basic.html @@ -0,0 +1,21 @@ + + + + + Basic Draggable - jQuery EasyUI Demo + + + + + + + +

Basic Draggable

+

Move the boxes below by clicking on it with mouse.

+
+
+
+
Title
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/draggable/constrain.html b/testapps/GHIssues/src/main/resources/asset/demo/draggable/constrain.html new file mode 100755 index 000000000..b72e3ff44 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/draggable/constrain.html @@ -0,0 +1,35 @@ + + + + + Constrain Draggable - jQuery EasyUI Demo + + + + + + + +

Constrain Draggable

+

The draggable object can only be moved within its parent container.

+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/draggable/snap.html b/testapps/GHIssues/src/main/resources/asset/demo/draggable/snap.html new file mode 100755 index 000000000..c3ddd0584 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/draggable/snap.html @@ -0,0 +1,37 @@ + + + + + Snap Draggable - jQuery EasyUI Demo + + + + + + + +

Snap Draggable

+

This sample shows how to snap a draggable object to a 20x20 grid.

+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/droppable/accept.html b/testapps/GHIssues/src/main/resources/asset/demo/droppable/accept.html new file mode 100755 index 000000000..8da0d42cd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/droppable/accept.html @@ -0,0 +1,78 @@ + + + + + Accept a Drop - jQuery EasyUI Demo + + + + + + + +

Accept a Drop

+

Some draggable object can not be accepted.

+
+
+ drag me! +
Drag 1
+
Drag 2
+
Drag 3
+
+
+ drop here! +
+
+ + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/droppable/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/droppable/basic.html new file mode 100755 index 000000000..7738c0688 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/droppable/basic.html @@ -0,0 +1,77 @@ + + + + + Basic Droppable - jQuery EasyUI Demo + + + + + + + +

Basic Droppable

+

Drag the boxed on left to the target area on right.

+
+
+
Source
+
+
Apple
+
Peach
+
Orange
+
+
+
+
Target
+
+
+
+
+ + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/droppable/sort.html b/testapps/GHIssues/src/main/resources/asset/demo/droppable/sort.html new file mode 100755 index 000000000..1d99cd822 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/droppable/sort.html @@ -0,0 +1,71 @@ + + + + + Change Items Order - jQuery EasyUI Demo + + + + + + + +

Change Items Order

+

Drag the list items to change their order.

+
+
    +
  • Drag 1
  • +
  • Drag 2
  • +
  • Drag 3
  • +
  • Drag 4
  • +
  • Drag 5
  • +
  • Drag 6
  • +
+ + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/easyloader/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/easyloader/basic.html new file mode 100755 index 000000000..0d7ba7b12 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/easyloader/basic.html @@ -0,0 +1,75 @@ + + + + + Basic EasyLoader - jQuery EasyUI Demo + + + + + + + +

Basic EasyLoader

+
+
+
Click the buttons below to load components dynamically.
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/filebox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/filebox/basic.html new file mode 100644 index 000000000..394dcf983 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/filebox/basic.html @@ -0,0 +1,31 @@ + + + + + Basic FileBox - jQuery EasyUI Demo + + + + + + + +

Basic FileBox

+

The filebox component represents a file field of the forms.

+
+
+
+ +
+
+ +
+
+ +
+
+ Upload +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/filebox/buttonalign.html b/testapps/GHIssues/src/main/resources/asset/demo/filebox/buttonalign.html new file mode 100644 index 000000000..072a4067c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/filebox/buttonalign.html @@ -0,0 +1,32 @@ + + + + + Button Align on FileBox - jQuery EasyUI Demo + + + + + + + +

Button Align on FileBox

+

Change the button align to the left or right of filebox.

+
+ Select Button Align: + +
+
+ +
+ + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/filebox/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/filebox/fluid.html new file mode 100644 index 000000000..67eaf1dfa --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/filebox/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid FileBox - jQuery EasyUI Demo + + + + + + + +

Fluid FileBox

+

This example shows how to set the width of FileBox to a percentage of its parent container.

+
+
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/form/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/form/basic.html new file mode 100755 index 000000000..7df82aa02 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/form/basic.html @@ -0,0 +1,48 @@ + + + + + Basic Form - jQuery EasyUI Demo + + + + + + + +

Basic Form

+

Fill the form and submit it.

+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ Submit + Clear +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/form/form_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/form/form_data1.json new file mode 100755 index 000000000..4ac269bfc --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/form/form_data1.json @@ -0,0 +1,8 @@ +{ + "name":"easyui", + "email":"easyui@gmail.com", + "subject":"Subject Title", + "message":"Message Content", + "language":"de", + "accept":"true" +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/form/load.html b/testapps/GHIssues/src/main/resources/asset/demo/form/load.html new file mode 100755 index 000000000..c699b6ece --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/form/load.html @@ -0,0 +1,62 @@ + + + + + Load Form Data - jQuery EasyUI Demo + + + + + + + +

Load Form Data

+

Click the buttons below to load form data.

+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/form/validateonsubmit.html b/testapps/GHIssues/src/main/resources/asset/demo/form/validateonsubmit.html new file mode 100755 index 000000000..2c0c349fd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/form/validateonsubmit.html @@ -0,0 +1,52 @@ + + + + + Validate Form on Submit - jQuery EasyUI Demo + + + + + + + +

Validate Form on Submit

+

The form does not perform validation before being submitted.

+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ Submit + Clear +
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/_content.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/_content.html new file mode 100755 index 000000000..76f2506a6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

jQuery EasyUI framework help you build your web page easily.

+
    +
  • easyui is a collection of user-interface plugin based on jQuery.
  • +
  • easyui provides essential functionality for building modern, interactive, javascript applications.
  • +
  • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
  • +
  • complete framework for HTML5 web page.
  • +
  • easyui save your time and scales while developing your products.
  • +
  • easyui is very easy but powerful.
  • +
+ + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/addremove.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/addremove.html new file mode 100755 index 000000000..ede288918 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/addremove.html @@ -0,0 +1,53 @@ + + + + + Add and Remove Layout - jQuery EasyUI Demo + + + + + + + +

Add and Remove Layout

+

Click the buttons below to add or remove region panel of layout.

+
+ Select Region Panel: + + Add + Remove +
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/autoheight.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/autoheight.html new file mode 100755 index 000000000..b9ccc7e3d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/autoheight.html @@ -0,0 +1,59 @@ + + + + + Auto Height for Layout - jQuery EasyUI Demo + + + + + + + +

Auto Height for Layout

+

This example shows how to auto adjust layout height after dynamically adding items.

+ +
+
+
+
+
+

Panel Content.

+

Panel Content.

+

Panel Content.

+

Panel Content.

+

Panel Content.

+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/basic.html new file mode 100755 index 000000000..f428724fe --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/basic.html @@ -0,0 +1,39 @@ + + + + + Basic Layout - jQuery EasyUI Demo + + + + + + + +

Basic Layout

+

The layout contains north,south,west,east and center regions.

+
+
+
+
+
+
+
+ + + + + + + + + + + +
Item IDProduct IDList PriceUnit CostAttributeStatus
+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/collapsetitle.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/collapsetitle.html new file mode 100755 index 000000000..0d103e65f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/collapsetitle.html @@ -0,0 +1,39 @@ + + + + + Collapse Title in Layout - jQuery EasyUI Demo + + + + + + + +

Collapse Title in Layout

+

The title bar will display while collapse a region panel.

+
+
+
+
+
+
+
+ + + + + + + + + + + +
Item IDProduct IDList PriceUnit CostAttributeStatus
+
+
+ + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/complex.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/complex.html new file mode 100755 index 000000000..9d1ab66a0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/complex.html @@ -0,0 +1,57 @@ + + + + + Complex Layout - jQuery EasyUI Demo + + + + + + + +

Complex Layout

+

This sample shows how to create a complex layout.

+
+
+
+
+
+
    +
    +
    +
    +
    + content1 +
    +
    + content2 +
    +
    + content3 +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + +
    Item IDProduct IDList PriceUnit CostAttributeStatus
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/customcollapsetitle.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/customcollapsetitle.html new file mode 100755 index 000000000..945b6afaa --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/customcollapsetitle.html @@ -0,0 +1,51 @@ + + + + + Custom Collapse Title in Layout - jQuery EasyUI Demo + + + + + + + +

    Custom Collapse Title in Layout

    +

    Any components can display on the title bar of a collapsed panel.

    +
    +
    +
    +
    +
    + + + + + + + + + + + +
    Item IDProduct IDList PriceUnit CostAttributeStatus
    +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/datagrid_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/layout/datagrid_data1.json new file mode 100755 index 000000000..63d647358 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/datagrid_data1.json @@ -0,0 +1,12 @@ +{"total":28,"rows":[ + {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, + {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, + {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, + {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} +]} diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/fluid.html new file mode 100755 index 000000000..8ddd50fc4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/fluid.html @@ -0,0 +1,24 @@ + + + + + Fluid Layout - jQuery EasyUI Demo + + + + + + + +

    Fluid Layout

    +

    Percentage width of region panel in a layout.

    +
    +
    +
    +

    width: 30%

    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/full.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/full.html new file mode 100755 index 000000000..13eb94ade --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/full.html @@ -0,0 +1,19 @@ + + + + + Full Layout - jQuery EasyUI Demo + + + + + + + +
    north region
    +
    west content
    +
    east region
    +
    south region
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/nestedlayout.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/nestedlayout.html new file mode 100755 index 000000000..b0e1b2c18 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/nestedlayout.html @@ -0,0 +1,31 @@ + + + + + Nested Layout - jQuery EasyUI Demo + + + + + + + +

    Nested Layout

    +

    The layout region panel contains another layout or other components.

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/nocollapsible.html b/testapps/GHIssues/src/main/resources/asset/demo/layout/nocollapsible.html new file mode 100755 index 000000000..5854b2d0b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/nocollapsible.html @@ -0,0 +1,34 @@ + + + + + No collapsible button in Layout - jQuery EasyUI Demo + + + + + + + +

    No collapsible button in Layout

    +

    The layout region panel has no collapsible button.

    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/propertygrid_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/layout/propertygrid_data1.json new file mode 100755 index 000000000..a458d83fc --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/propertygrid_data1.json @@ -0,0 +1,20 @@ +{"total":7,"rows":[ + {"name":"Name","value":"Bill Smith","group":"ID Settings","editor":"text"}, + {"name":"Address","value":"","group":"ID Settings","editor":"text"}, + {"name":"Age","value":"40","group":"ID Settings","editor":"numberbox"}, + {"name":"Birthday","value":"01/02/2012","group":"ID Settings","editor":"datebox"}, + {"name":"SSN","value":"123-456-7890","group":"ID Settings","editor":"text"}, + {"name":"Email","value":"bill@gmail.com","group":"Marketing Settings","editor":{ + "type":"validatebox", + "options":{ + "validType":"email" + } + }}, + {"name":"FrequentBuyer","value":"false","group":"Marketing Settings","editor":{ + "type":"checkbox", + "options":{ + "on":true, + "off":false + } + }} +]} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/layout/tree_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/layout/tree_data1.json new file mode 100755 index 000000000..e0c619226 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/layout/tree_data1.json @@ -0,0 +1,49 @@ +[{ + "id":1, + "text":"My Documents", + "children":[{ + "id":11, + "text":"Photos", + "state":"closed", + "children":[{ + "id":111, + "text":"Friend" + },{ + "id":112, + "text":"Wife" + },{ + "id":113, + "text":"Company" + }] + },{ + "id":12, + "text":"Program Files", + "children":[{ + "id":121, + "text":"Intel" + },{ + "id":122, + "text":"Java", + "attributes":{ + "p1":"Custom Attribute1", + "p2":"Custom Attribute2" + } + },{ + "id":123, + "text":"Microsoft Office" + },{ + "id":124, + "text":"Games", + "checked":true + }] + },{ + "id":13, + "text":"index.html" + },{ + "id":14, + "text":"about.html" + },{ + "id":15, + "text":"welcome.html" + }] +}] diff --git a/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/basic.html new file mode 100755 index 000000000..d46c47f63 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/basic.html @@ -0,0 +1,33 @@ + + + + + Basic LinkButton - jQuery EasyUI Demo + + + + + + + +

    Basic LinkButton

    +

    Buttons can be created from <a> or <button> elements.

    +
    +

    Basic Buttons

    +
    + Add + Remove + Save + Cut + Text Button +
    +

    Fixed Width Buttons

    +
    + Search + Print + Reload + Help +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/fluid.html new file mode 100755 index 000000000..cb033e774 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/fluid.html @@ -0,0 +1,33 @@ + + + + + Fluid LinkButton - jQuery EasyUI Demo + + + + + + + +

    Fluid LinkButton

    +

    This example shows how to set the width of LinkButton to a percentage of its parent container.

    +
    +

    width: 15%

    +
    + Add + Remove + Save + Cut + Text Button +
    +

    width: 20%

    +
    + Search + Print + Reload + Help +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/group.html b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/group.html new file mode 100755 index 000000000..4c1293d9b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/group.html @@ -0,0 +1,33 @@ + + + + + Button Group - jQuery EasyUI Demo + + + + + + + +

    Button Group

    +

    In a button group only one button can be selected.

    +
    + +
    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/iconalign.html b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/iconalign.html new file mode 100755 index 000000000..21835f089 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/iconalign.html @@ -0,0 +1,32 @@ + + + + + Icon Align on LinkButton - jQuery EasyUI Demo + + + + + + + +

    Icon Align on LinkButton

    +

    Change the icon align to place icon on left, right, top or bottom of button.

    +
    +
    + Select Icon Align: + +
    +
    + Add + Remove + Save + Cut +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/plain.html b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/plain.html new file mode 100755 index 000000000..71c89cd65 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/plain.html @@ -0,0 +1,28 @@ + + + + + Plain LinkButton - jQuery EasyUI Demo + + + + + + + +

    Plain LinkButton

    +

    The buttons with plain style have transparent background.

    +
    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/size.html b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/size.html new file mode 100755 index 000000000..3e121bb4c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/size.html @@ -0,0 +1,34 @@ + + + + + LinkButton Size - jQuery EasyUI Demo + + + + + + + +

    LinkButton Size

    +

    This sample shows how to display small buttons and large buttons.

    +
    +

    Small Buttons

    +
    + Add + Remove + Save + Cut + Text Button +
    +

    Large Buttons

    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/style.html b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/style.html new file mode 100755 index 000000000..fe61dd927 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/style.html @@ -0,0 +1,31 @@ + + + + + Style LinkButton - jQuery EasyUI Demo + + + + + + + +

    Style LinkButton

    +

    This example shows how to style a linkbutton.

    +
    + + + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/toggle.html b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/toggle.html new file mode 100755 index 000000000..352001a3e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/linkbutton/toggle.html @@ -0,0 +1,25 @@ + + + + + Toggle Button - jQuery EasyUI Demo + + + + + + + +

    Toggle Button

    +

    Click the button below to switch its selected state.

    +
    +
    + Add + Remove + Save + Cut + Text Button +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/maskedbox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/maskedbox/basic.html new file mode 100755 index 000000000..780f987af --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/maskedbox/basic.html @@ -0,0 +1,30 @@ + + + + + Basic MaskedBox - jQuery EasyUI Demo + + + + + + + +

    Basic MaskedBox

    +

    The maskedbox enforces its structure as the user types.

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/menu/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/menu/basic.html new file mode 100755 index 000000000..c1bf0d35e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/menu/basic.html @@ -0,0 +1,68 @@ + + + + + Basic Menu - jQuery EasyUI Demo + + + + + + + +

    Basic Menu

    +

    Right click on page to display menu.

    +
    + +
    +
    New
    +
    + Open +
    +
    Word
    +
    Excel
    +
    PowerPoint
    +
    + M1 +
    +
    sub1
    +
    sub2
    +
    + Sub +
    +
    sub21
    +
    sub22
    +
    sub23
    +
    +
    +
    sub3
    +
    +
    +
    + Window Demos +
    +
    Window
    +
    Dialog
    + +
    +
    +
    +
    +
    Save
    +
    Print
    + +
    Exit
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/menu/customitem.html b/testapps/GHIssues/src/main/resources/asset/demo/menu/customitem.html new file mode 100755 index 000000000..43b35e999 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/menu/customitem.html @@ -0,0 +1,50 @@ + + + + + Custom Menu Item - jQuery EasyUI Demo + + + + + + + +

    Custom Menu Item

    +

    Right click on page to display menu, move to the 'Open' item to display its custom sub content.

    +
    +
    +
    New
    +
    + Open + +
    +
    Save
    +
    Print
    + +
    Exit
    +
    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/menu/events.html b/testapps/GHIssues/src/main/resources/asset/demo/menu/events.html new file mode 100755 index 000000000..c26b060d5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/menu/events.html @@ -0,0 +1,40 @@ + + + + + Menu Events - jQuery EasyUI Demo + + + + + + + +

    Menu Events

    +

    Right click on page to display menu and click an item.

    +
    +
    +
    New
    +
    Save
    +
    Print
    + +
    Exit
    +
    +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/menu/inline.html b/testapps/GHIssues/src/main/resources/asset/demo/menu/inline.html new file mode 100755 index 000000000..e23e3ae75 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/menu/inline.html @@ -0,0 +1,59 @@ + + + + + Inline Menu - jQuery EasyUI Demo + + + + + + + +

    Inline Menu

    +

    The inline menu stays inside its parent container.

    +
    + +
    +
    +
    New
    +
    + Open +
    +
    Word
    +
    Excel
    +
    PowerPoint
    +
    + M1 +
    +
    sub1
    +
    sub2
    +
    + Sub +
    +
    sub21
    +
    sub22
    +
    sub23
    +
    +
    +
    sub3
    +
    +
    +
    + Window Demos +
    +
    Window
    +
    Dialog
    + +
    +
    +
    +
    +
    Save
    +
    Print
    + +
    Exit
    +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/menu/nav.html b/testapps/GHIssues/src/main/resources/asset/demo/menu/nav.html new file mode 100755 index 000000000..bc419df1c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/menu/nav.html @@ -0,0 +1,146 @@ + + + + + Keyboard Navigation in Menu - jQuery EasyUI Demo + + + + + + + +

    Keyboard Navigation in Menu

    +

    Press Alt+W to focus the menu. Once the menu get focus, you will be able to navigate menu using keyboard keys.

    +
    + +
    +
    +
    New
    +
    + Open +
    +
    Word
    +
    Excel
    +
    PowerPoint
    +
    + M1 +
    +
    sub1
    +
    sub2
    +
    + Sub +
    +
    sub21
    +
    sub22
    +
    sub23
    +
    +
    +
    sub3
    +
    +
    +
    + Window Demos +
    +
    Window
    +
    Dialog
    +
    EasyUI
    +
    +
    +
    +
    +
    Save
    +
    Print
    + +
    Exit
    +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/menubutton/actions.html b/testapps/GHIssues/src/main/resources/asset/demo/menubutton/actions.html new file mode 100755 index 000000000..5d447fe98 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/menubutton/actions.html @@ -0,0 +1,58 @@ + + + + + MenuButton Actions - jQuery EasyUI Demo + + + + + + + +

    MenuButton Actions

    +

    Click the buttons below to perform actions.

    + +
    + Home + Edit + Help + About +
    +
    +
    Undo
    +
    Redo
    + +
    Cut
    +
    Copy
    +
    Paste
    + +
    + Toolbar +
    +
    Address
    +
    Link
    +
    Navigation Toolbar
    +
    Bookmark Toolbar
    + +
    New Toolbar...
    +
    +
    +
    Delete
    +
    Select All
    +
    +
    +
    Help
    +
    Update
    +
    About
    +
    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/menubutton/alignment.html b/testapps/GHIssues/src/main/resources/asset/demo/menubutton/alignment.html new file mode 100755 index 000000000..f34f89a03 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/menubutton/alignment.html @@ -0,0 +1,69 @@ + + + + + Menu Alignment on MenuButton - jQuery EasyUI Demo + + + + + + + +

    Menu Alignment on MenuButton

    +

    This example shows how to change the alignment of the top level menu.

    +
    + Change Alignment: + +
    +
    + Home + Edit + Help + About + +
    +
    +
    Undo
    +
    Redo
    + +
    Cut
    +
    Copy
    +
    Paste
    + +
    + Toolbar +
    +
    Address
    +
    Link
    +
    Navigation Toolbar
    +
    Bookmark Toolbar
    + +
    New Toolbar...
    +
    +
    +
    Delete
    +
    Select All
    +
    +
    +
    Help
    +
    Update
    +
    About
    +
    +
    +
    History
    +
    Faq
    +
    Our Team
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/menubutton/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/menubutton/basic.html new file mode 100755 index 000000000..932309b76 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/menubutton/basic.html @@ -0,0 +1,54 @@ + + + + + Basic MenuButton - jQuery EasyUI Demo + + + + + + + +

    Basic MenuButton

    +

    Move mouse over the button to drop down menu.

    +
    +
    + Home + Edit + Help + About +
    +
    +
    Undo
    +
    Redo
    + +
    Cut
    +
    Copy
    +
    Paste
    + +
    + Toolbar +
    +
    Address
    +
    Link
    +
    Navigation Toolbar
    +
    Bookmark Toolbar
    + +
    New Toolbar...
    +
    +
    +
    Delete
    +
    Select All
    +
    +
    +
    Help
    +
    Update
    +
    About
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/menubutton/nav.html b/testapps/GHIssues/src/main/resources/asset/demo/menubutton/nav.html new file mode 100755 index 000000000..7c34b3d47 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/menubutton/nav.html @@ -0,0 +1,166 @@ + + + + + Keyboard Navigation in MenuButton - jQuery EasyUI Demo + + + + + + + +

    Keyboard Navigation in MenuButton

    +

    Press Alt+W to focus the menubutton. Once the menubutton get focus, you will be able to navigate menubutton using keyboard keys.

    +
    +
    + Home + Edit + Help + About +
    +
    +
    Undo
    +
    Redo
    + +
    Cut
    +
    Copy
    +
    Paste
    + +
    + Toolbar +
    +
    Address
    +
    Link
    +
    Navigation Toolbar
    +
    Bookmark Toolbar
    + +
    New Toolbar...
    +
    +
    +
    Delete
    +
    Select All
    +
    +
    +
    Help
    +
    Update
    +
    About
    +
    + + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/messager/alert.html b/testapps/GHIssues/src/main/resources/asset/demo/messager/alert.html new file mode 100755 index 000000000..a69c16603 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/messager/alert.html @@ -0,0 +1,40 @@ + + + + + Alert Messager - jQuery EasyUI Demo + + + + + + + +

    Alert Messager

    +

    Click on each button to display different alert message box.

    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/messager/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/messager/basic.html new file mode 100755 index 000000000..65026efc4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/messager/basic.html @@ -0,0 +1,56 @@ + + + + + Basic Messager - jQuery EasyUI Demo + + + + + + + +

    Basic Messager

    +

    Click on each button to see a distinct message box.

    +
    + Show + Slide + Fade + Progress +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/messager/interactive.html b/testapps/GHIssues/src/main/resources/asset/demo/messager/interactive.html new file mode 100755 index 000000000..e71224312 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/messager/interactive.html @@ -0,0 +1,36 @@ + + + + + Interactive Messager - jQuery EasyUI Demo + + + + + + + +

    Interactive Messager

    +

    Click on each button to display interactive message box.

    +
    + Confirm + Prompt +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/messager/position.html b/testapps/GHIssues/src/main/resources/asset/demo/messager/position.html new file mode 100755 index 000000000..6a6273e96 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/messager/position.html @@ -0,0 +1,140 @@ + + + + + Message Box Position - jQuery EasyUI Demo + + + + + + + +

    Message Box Position

    +

    Click the buttons below to display message box on different position.

    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/numberbox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/numberbox/basic.html new file mode 100755 index 000000000..3b1a68416 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/numberbox/basic.html @@ -0,0 +1,29 @@ + + + + + Basic NumberBox - jQuery EasyUI Demo + + + + + + + +

    Basic NumberBox

    +

    The NumberBox can only accept inputing numbers.

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/numberbox/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/numberbox/fluid.html new file mode 100755 index 000000000..4b5981e97 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/numberbox/fluid.html @@ -0,0 +1,26 @@ + + + + + Fluid NumberBox - jQuery EasyUI Demo + + + + + + + +

    Fluid NumberBox

    +

    This example shows how to set the width of NumberBox to a percentage of its parent container.

    +
    +
    +
    + +
    +
    + +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/numberbox/format.html b/testapps/GHIssues/src/main/resources/asset/demo/numberbox/format.html new file mode 100755 index 000000000..8fcb82239 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/numberbox/format.html @@ -0,0 +1,34 @@ + + + + + Format NumberBox - jQuery EasyUI Demo + + + + + + + +

    Format NumberBox

    +

    Number formatting is the ability to control how a number is displayed.

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/numberbox/range.html b/testapps/GHIssues/src/main/resources/asset/demo/numberbox/range.html new file mode 100755 index 000000000..fee11e961 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/numberbox/range.html @@ -0,0 +1,28 @@ + + + + + Number Range - jQuery EasyUI Demo + + + + + + + +

    Number Range

    +

    The value is constrained to a specified range.

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/align.html b/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/align.html new file mode 100755 index 000000000..f36a681f3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/align.html @@ -0,0 +1,31 @@ + + + + + Number Spin Alignment - jQuery EasyUI Demo + + + + + + + +

    Number Spin Alignment

    +

    This example shows how to set different spin alignments on numberspinner.

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/basic.html new file mode 100755 index 000000000..b04560d7f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/basic.html @@ -0,0 +1,27 @@ + + + + + Basic NumberSpinner - jQuery EasyUI Demo + + + + + + + +

    Basic NumberSpinner

    +

    Click spinner button to change value.

    +
    +
    + +
    + Value: +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/fluid.html new file mode 100755 index 000000000..69c94f5c9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid NumberSpinner - jQuery EasyUI Demo + + + + + + + +

    Fluid NumberSpinner

    +

    This example shows how to set the width of NumberSpinner to a percentage of its parent container.

    +
    +
    +
    + +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/increment.html b/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/increment.html new file mode 100755 index 000000000..76eab5845 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/increment.html @@ -0,0 +1,28 @@ + + + + + Increment Number - jQuery EasyUI Demo + + + + + + + +

    Increment Number

    +

    The sample shows how to set the increment step.

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/range.html b/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/range.html new file mode 100755 index 000000000..a0a037278 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/numberspinner/range.html @@ -0,0 +1,25 @@ + + + + + Number Range - jQuery EasyUI Demo + + + + + + + +

    Number Range

    +

    The value is constrained to a range between 10 and 100.

    +
    +
    +
    + +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/pagination/attaching.html b/testapps/GHIssues/src/main/resources/asset/demo/pagination/attaching.html new file mode 100755 index 000000000..0e56bb35e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/pagination/attaching.html @@ -0,0 +1,32 @@ + + + + + Attaching Other Components - jQuery EasyUI Demo + + + + + + + +

    Attaching Other Components

    +

    Any other components can be attached to page bar.

    +
    +
    +
    +
    +
    + + + + + +
    + + + +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/pagination/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/pagination/basic.html new file mode 100755 index 000000000..bcdba63df --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/pagination/basic.html @@ -0,0 +1,20 @@ + + + + + Basic Pagination - jQuery EasyUI Demo + + + + + + + +

    Basic Pagination

    +

    The user can change page number and page size on page bar.

    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/pagination/custombuttons.html b/testapps/GHIssues/src/main/resources/asset/demo/pagination/custombuttons.html new file mode 100755 index 000000000..113e92116 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/pagination/custombuttons.html @@ -0,0 +1,38 @@ + + + + + Custom Pagination Buttons - jQuery EasyUI Demo + + + + + + + +

    Custom Pagination Buttons

    +

    The customized buttons can be appended to page bar.

    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/pagination/layout.html b/testapps/GHIssues/src/main/resources/asset/demo/pagination/layout.html new file mode 100755 index 000000000..1992f4ecb --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/pagination/layout.html @@ -0,0 +1,62 @@ + + + + + Pagination Layout - jQuery EasyUI Demo + + + + + + + +

    Pagination Layout

    +

    The pagination layout supports various types of pages which you can choose.

    +
    +
    +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/pagination/links.html b/testapps/GHIssues/src/main/resources/asset/demo/pagination/links.html new file mode 100755 index 000000000..dafab34b7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/pagination/links.html @@ -0,0 +1,23 @@ + + + + + Pagination Links - jQuery EasyUI Demo + + + + + + + +

    Pagination Links

    +

    The example shows how to customize numbered pagination links.

    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/pagination/simple.html b/testapps/GHIssues/src/main/resources/asset/demo/pagination/simple.html new file mode 100755 index 000000000..23a0eee08 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/pagination/simple.html @@ -0,0 +1,25 @@ + + + + + Simplify Pagination - jQuery EasyUI Demo + + + + + + + +

    Simplify Pagination

    +

    The sample shows how to simplify pagination.

    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/panel/_content.html b/testapps/GHIssues/src/main/resources/asset/demo/panel/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/panel/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

    Here is the content loaded via AJAX.

    +
      +
    • easyui is a collection of user-interface plugin based on jQuery.
    • +
    • easyui provides essential functionality for building modern, interactive, javascript applications.
    • +
    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
    • +
    • complete framework for HTML5 web page.
    • +
    • easyui save your time and scales while developing your products.
    • +
    • easyui is very easy but powerful.
    • +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/panel/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/panel/basic.html new file mode 100755 index 000000000..ec0e535d9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/panel/basic.html @@ -0,0 +1,31 @@ + + + + + Basic Panel - jQuery EasyUI Demo + + + + + + + +

    Basic Panel

    +

    The panel is a container for other components or elements.

    +
    + Open + Close +
    +
    +

    jQuery EasyUI framework helps you build your web pages easily.

    +
      +
    • easyui is a collection of user-interface plugin based on jQuery.
    • +
    • easyui provides essential functionality for building modem, interactive, javascript applications.
    • +
    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
    • +
    • complete framework for HTML5 web page.
    • +
    • easyui save your time and scales while developing your products.
    • +
    • easyui is very easy but powerful.
    • +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/panel/customtools.html b/testapps/GHIssues/src/main/resources/asset/demo/panel/customtools.html new file mode 100755 index 000000000..670001e9b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/panel/customtools.html @@ -0,0 +1,35 @@ + + + + + Custom Panel Tools - jQuery EasyUI Demo + + + + + + + +

    Custom Panel Tools

    +

    Click the right top buttons to perform actions with panel.

    +
    +
    +

    jQuery EasyUI framework helps you build your web pages easily.

    +
      +
    • easyui is a collection of user-interface plugin based on jQuery.
    • +
    • easyui provides essential functionality for building modem, interactive, javascript applications.
    • +
    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
    • +
    • complete framework for HTML5 web page.
    • +
    • easyui save your time and scales while developing your products.
    • +
    • easyui is very easy but powerful.
    • +
    +
    +
    + + + + +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/panel/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/panel/fluid.html new file mode 100755 index 000000000..72510f23d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/panel/fluid.html @@ -0,0 +1,21 @@ + + + + + Fluid Panel - jQuery EasyUI Demo + + + + + + + +

    Fluid Panel

    +

    This example shows how to set the width of Panel to a percentage of its parent container.

    +
    +
    +
    +

    The panel has a width of 100%.

    +

    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/panel/footer.html b/testapps/GHIssues/src/main/resources/asset/demo/panel/footer.html new file mode 100755 index 000000000..31e6385c2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/panel/footer.html @@ -0,0 +1,22 @@ + + + + + Panel Footer - jQuery EasyUI Demo + + + + + + + +

    Panel Footer

    +

    The panel footer is displayed at the bottom of the panel and can consist of any other components.

    +
    +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/panel/halign.html b/testapps/GHIssues/src/main/resources/asset/demo/panel/halign.html new file mode 100755 index 000000000..77ae7b499 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/panel/halign.html @@ -0,0 +1,26 @@ + + + + + Panel Header Alignment - jQuery EasyUI Demo + + + + + + + +

    Panel Header Alignment

    +

    The panel header can be aligned horizontally or vertically.

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/panel/loadcontent.html b/testapps/GHIssues/src/main/resources/asset/demo/panel/loadcontent.html new file mode 100755 index 000000000..6db638d39 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/panel/loadcontent.html @@ -0,0 +1,27 @@ + + + + + Load Panel Content - jQuery EasyUI Demo + + + + + + + +

    Load Panel Content

    +

    Click the refresh button on top right of panel to load content.

    +
    +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/panel/nestedpanel.html b/testapps/GHIssues/src/main/resources/asset/demo/panel/nestedpanel.html new file mode 100755 index 000000000..28f51703d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/panel/nestedpanel.html @@ -0,0 +1,30 @@ + + + + + Nested Panel - jQuery EasyUI Demo + + + + + + + +

    Nested Panel

    +

    The panel can be placed inside containers and can contain other components.

    +
    +
    +
    +
    + Left Content +
    +
    + Right Content +
    +
    + Center Content +
    +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/panel/paneltools.html b/testapps/GHIssues/src/main/resources/asset/demo/panel/paneltools.html new file mode 100755 index 000000000..47efc11f7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/panel/paneltools.html @@ -0,0 +1,37 @@ + + + + + Panel Tools - jQuery EasyUI Demo + + + + + + + +

    Panel Tools

    +

    Click the right top buttons to perform actions with panel.

    + +
    +
    +

    jQuery EasyUI framework helps you build your web pages easily.

    +
      +
    • easyui is a collection of user-interface plugin based on jQuery.
    • +
    • easyui provides essential functionality for building modem, interactive, javascript applications.
    • +
    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
    • +
    • complete framework for HTML5 web page.
    • +
    • easyui save your time and scales while developing your products.
    • +
    • easyui is very easy but powerful.
    • +
    +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/passwordbox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/passwordbox/basic.html new file mode 100644 index 000000000..f725bc087 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/passwordbox/basic.html @@ -0,0 +1,25 @@ + + + + + Basic PasswordBox - jQuery EasyUI Demo + + + + + + + +

    Basic PasswordBox

    +

    The passwordbox allows a user to enter passwords.

    +
    +
    +
    + +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/passwordbox/flash.html b/testapps/GHIssues/src/main/resources/asset/demo/passwordbox/flash.html new file mode 100644 index 000000000..391a09cda --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/passwordbox/flash.html @@ -0,0 +1,48 @@ + + + + + Flash PasswordBox Letters - jQuery EasyUI Demo + + + + + + + +

    Flash PasswordBox Letters

    +

    This example shows how to flash the entered password letter by letter.

    +
    +
    +
    + +
    +
    + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/passwordbox/validatepassword.html b/testapps/GHIssues/src/main/resources/asset/demo/passwordbox/validatepassword.html new file mode 100644 index 000000000..630dbc7a1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/passwordbox/validatepassword.html @@ -0,0 +1,40 @@ + + + + + Validate Password - jQuery EasyUI Demo + + + + + + + +

    Validate Password

    +

    This example shows how to validate whether a user enters the same password.

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/progressbar/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/progressbar/basic.html new file mode 100755 index 000000000..966d5560f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/progressbar/basic.html @@ -0,0 +1,30 @@ + + + + + Basic ProgressBar - jQuery EasyUI Demo + + + + + + + +

    Basic ProgressBar

    +

    Click the button below to show progress information.

    +
    + Start +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/progressbar/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/progressbar/fluid.html new file mode 100755 index 000000000..613e180f1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/progressbar/fluid.html @@ -0,0 +1,21 @@ + + + + + Fluid ProgressBar - jQuery EasyUI Demo + + + + + + + +

    Fluid ProgressBar

    +

    This example shows how to set the width of ProgressBar to a percentage of its parent container.

    +
    +

    width: 50%

    +
    +

    width: 30%

    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/basic.html new file mode 100755 index 000000000..8f7743c4e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/basic.html @@ -0,0 +1,61 @@ + + + + + Basic PropertyGrid - jQuery EasyUI Demo + + + + + + + +

    Basic PropertyGrid

    +

    Click on row to change each property value.

    + + +
    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/customcolumns.html b/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/customcolumns.html new file mode 100755 index 000000000..0a683ef3e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/customcolumns.html @@ -0,0 +1,31 @@ + + + + + Customize Columns of PropertyGrid - jQuery EasyUI Demo + + + + + + + +

    Customize Columns of PropertyGrid

    +

    The columns of PropertyGrid can be changed.

    +
    + +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/groupformat.html b/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/groupformat.html new file mode 100755 index 000000000..d4eb883ce --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/groupformat.html @@ -0,0 +1,30 @@ + + + + + Group Format - jQuery EasyUI Demo + + + + + + + +

    Group Format

    +

    The user can change the group information.

    +
    + +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json new file mode 100755 index 000000000..a458d83fc --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json @@ -0,0 +1,20 @@ +{"total":7,"rows":[ + {"name":"Name","value":"Bill Smith","group":"ID Settings","editor":"text"}, + {"name":"Address","value":"","group":"ID Settings","editor":"text"}, + {"name":"Age","value":"40","group":"ID Settings","editor":"numberbox"}, + {"name":"Birthday","value":"01/02/2012","group":"ID Settings","editor":"datebox"}, + {"name":"SSN","value":"123-456-7890","group":"ID Settings","editor":"text"}, + {"name":"Email","value":"bill@gmail.com","group":"Marketing Settings","editor":{ + "type":"validatebox", + "options":{ + "validType":"email" + } + }}, + {"name":"FrequentBuyer","value":"false","group":"Marketing Settings","editor":{ + "type":"checkbox", + "options":{ + "on":true, + "off":false + } + }} +]} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/resizable/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/resizable/basic.html new file mode 100755 index 000000000..7b9e74773 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/resizable/basic.html @@ -0,0 +1,24 @@ + + + + + Basic Resizable - jQuery EasyUI Demo + + + + + + + +

    Basic Resizable

    +

    Click on the edge of box and move the edge to resize the box.

    +
    +
    +
    Resize Me
    +
    +
    +
    Title
    +
    Drag and Resize Me
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/searchbox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/searchbox/basic.html new file mode 100755 index 000000000..a152113fa --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/searchbox/basic.html @@ -0,0 +1,25 @@ + + + + + Basic SearchBox - jQuery EasyUI Demo + + + + + + + +

    Basic SearchBox

    +

    Click search button or press enter key in input box to do searching.

    +
    +
    + +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/searchbox/category.html b/testapps/GHIssues/src/main/resources/asset/demo/searchbox/category.html new file mode 100755 index 000000000..ca3029f04 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/searchbox/category.html @@ -0,0 +1,30 @@ + + + + + Search Category - jQuery EasyUI Demo + + + + + + + +

    Search Category

    +

    Select a category and click search button or press enter key in input box to do searching.

    +
    +
    + +
    +
    +
    All News
    +
    Sports News
    +
    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/searchbox/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/searchbox/fluid.html new file mode 100755 index 000000000..c48096f1c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/searchbox/fluid.html @@ -0,0 +1,29 @@ + + + + + Fluid SearchBox - jQuery EasyUI Demo + + + + + + + +

    Fluid SearchBox

    +

    This example shows how to set the width of SearchBox to a percentage of its parent container.

    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    All News
    +
    Sports News
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/sidemenu/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/sidemenu/basic.html new file mode 100755 index 000000000..5096d28b0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/sidemenu/basic.html @@ -0,0 +1,58 @@ + + + + + Basic SideMenu - jQuery EasyUI Demo + + + + + + + + +

    Basic SideMenu

    +

    Collapse the side menu to display the main icon.

    +
    + Toggle +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/sidemenu/style.css b/testapps/GHIssues/src/main/resources/asset/demo/sidemenu/style.css new file mode 100644 index 000000000..6ae84e1e8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/sidemenu/style.css @@ -0,0 +1,63 @@ +@import 'http://netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'; + +.sidemenu .accordion .panel-title{ + color: #b8c7ce; +} +.sidemenu .accordion .accordion-header{ + background: #222d32; + color: #b8c7ce; +} +.sidemenu .accordion .accordion-body{ + background: #2c3b41; + color: #8aa4af; +} +.sidemenu .accordion .accordion-header-selected{ + background: #1e282c; +} +.sidemenu .accordion .accordion-collapse{ + background: transparent; +} +.sidemenu .tree-node-hover{ + background: #2c3b41; + color: #fff; +} +.sidemenu .tree-node-selected{ + background: #2c3b41; + color: #fff; +} +.sidemenu .accordion-header .panel-icon{ + font-size: 16px; +} +.sidemenu .accordion-header .panel-tool{ + display: none; +} +.sidemenu .accordion-header::after, +.sidemenu .tree-node-nonleaf::after{ + display: inline-block; + vertical-align: top; + border-style: solid; + transform:rotate(45deg); + width: 4px; + height: 4px; + content: ''; + position: absolute; + right: 10px; + top: 50%; + margin-top: -3px; + border-width: 0 1px 1px 0; +} +.sidemenu .accordion-header-selected::after{ + transform:rotate(-135deg); +} +.sidemenu .tree-node-nonleaf::after{ + transform:rotate(-135deg); +} +.sidemenu .tree-node-nonleaf-collapsed::after{ + transform:rotate(45deg); +} +.sidemenu-collapsed .accordion-header::after{ + display: none; +} +.sidemenu-tooltip .accordion{ + border-color: #1e282c; +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/sidemenu/style.html b/testapps/GHIssues/src/main/resources/asset/demo/sidemenu/style.html new file mode 100644 index 000000000..332e74f34 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/sidemenu/style.html @@ -0,0 +1,70 @@ + + + + + Basic SideMenu - jQuery EasyUI Demo + + + + + + + + + +

    Basic SideMenu

    +

    Collapse the side menu to display the main icon.

    +
    + Toggle +
    +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/slider/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/slider/basic.html new file mode 100755 index 000000000..a71f0e4c3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/slider/basic.html @@ -0,0 +1,18 @@ + + + + + Basic Slider - jQuery EasyUI Demo + + + + + + + +

    Basic Slider

    +

    Drag the slider to change value.

    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/slider/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/slider/fluid.html new file mode 100755 index 000000000..745927687 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/slider/fluid.html @@ -0,0 +1,21 @@ + + + + + Fluid Slider - jQuery EasyUI Demo + + + + + + + +

    Fluid Slider

    +

    This example shows how to set the width of Slider to a percentage of its parent container.

    +
    +

    width: 50%

    + +

    width: 30%

    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/slider/formattip.html b/testapps/GHIssues/src/main/resources/asset/demo/slider/formattip.html new file mode 100755 index 000000000..6b5c39835 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/slider/formattip.html @@ -0,0 +1,28 @@ + + + + + Format Tip Information - jQuery EasyUI Demo + + + + + + + +

    Format Tip Information

    +

    This sample shows how to format tip information.

    +
    + +
    jQuery EasyUI
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/slider/nonlinear.html b/testapps/GHIssues/src/main/resources/asset/demo/slider/nonlinear.html new file mode 100755 index 000000000..b07c61bd5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/slider/nonlinear.html @@ -0,0 +1,58 @@ + + + + + Non Linear Slider - jQuery EasyUI Demo + + + + + + + +

    Non Linear Slider

    +

    This example shows how to create a slider with a non-linear scale.

    +
    +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/slider/range.html b/testapps/GHIssues/src/main/resources/asset/demo/slider/range.html new file mode 100755 index 000000000..c7e6cf533 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/slider/range.html @@ -0,0 +1,23 @@ + + + + + Range Slider - jQuery EasyUI Demo + + + + + + + +

    Range Slider

    +

    This sample shows how to define a range slider.

    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/slider/rule.html b/testapps/GHIssues/src/main/resources/asset/demo/slider/rule.html new file mode 100755 index 000000000..652b4e52b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/slider/rule.html @@ -0,0 +1,21 @@ + + + + + Slider Rule - jQuery EasyUI Demo + + + + + + + +

    Slider Rule

    +

    This sample shows how to define slider rule.

    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/slider/vertical.html b/testapps/GHIssues/src/main/resources/asset/demo/slider/vertical.html new file mode 100755 index 000000000..59d3b4994 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/slider/vertical.html @@ -0,0 +1,25 @@ + + + + + Vertical Slider - jQuery EasyUI Demo + + + + + + + +

    Vertical Slider

    +

    This sample shows how to create a vertical slider.

    +
    +
    + +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/splitbutton/actions.html b/testapps/GHIssues/src/main/resources/asset/demo/splitbutton/actions.html new file mode 100755 index 000000000..311048468 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/splitbutton/actions.html @@ -0,0 +1,64 @@ + + + + + SplitButton Actions - jQuery EasyUI Demo + + + + + + + +

    SplitButton Actions

    +

    Click the buttons below to perform actions.

    + +
    + Home + Edit + Ok + Help +
    +
    +
    Undo
    +
    Redo
    + +
    Cut
    +
    Copy
    +
    Paste
    + +
    + Toolbar +
    +
    Address
    +
    Link
    +
    Navigation Toolbar
    +
    Bookmark Toolbar
    + +
    New Toolbar...
    +
    +
    +
    Delete
    +
    Select All
    +
    +
    +
    Ok
    +
    Cancel
    +
    +
    +
    Help
    +
    Update
    +
    + About + +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/splitbutton/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/splitbutton/basic.html new file mode 100755 index 000000000..795d526e8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/splitbutton/basic.html @@ -0,0 +1,61 @@ + + + + + Basic SplitButton - jQuery EasyUI Demo + + + + + + + +

    Basic SplitButton

    +

    Move mouse over the arrow area of button to drop down menu.

    +
    +
    + Home + Edit + Ok + Help +
    +
    +
    Undo
    +
    Redo
    + +
    Cut
    +
    Copy
    +
    Paste
    + +
    + Toolbar +
    +
    Address
    +
    Link
    +
    Navigation Toolbar
    +
    Bookmark Toolbar
    + +
    New Toolbar...
    +
    +
    +
    Delete
    +
    Select All
    +
    +
    +
    Ok
    +
    Cancel
    +
    +
    +
    Help
    +
    Update
    +
    + About + +
    +
    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/switchbutton/action.html b/testapps/GHIssues/src/main/resources/asset/demo/switchbutton/action.html new file mode 100644 index 000000000..0a6e197d8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/switchbutton/action.html @@ -0,0 +1,24 @@ + + + + + SwitchButton Actions - jQuery EasyUI Demo + + + + + + + +

    SwitchButton Actions

    +

    Click the buttons below to perform actions.

    +
    + +
    + Disable + Enable +
    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/switchbutton/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/switchbutton/basic.html new file mode 100644 index 000000000..56a09b586 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/switchbutton/basic.html @@ -0,0 +1,32 @@ + + + + + Basic SwitchButton - jQuery EasyUI Demo + + + + + + + +

    Basic SwitchButton

    +

    Click the switchbutton to change its state.

    +
    + + + + + + + + + + + + + + +
    Receive mail:
    Shared network:
    Subscribed:
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/_content.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

    Here is the content loaded via AJAX.

    +
      +
    • easyui is a collection of user-interface plugin based on jQuery.
    • +
    • easyui provides essential functionality for building modern, interactive, javascript applications.
    • +
    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
    • +
    • complete framework for HTML5 web page.
    • +
    • easyui save your time and scales while developing your products.
    • +
    • easyui is very easy but powerful.
    • +
    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/autoheight.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/autoheight.html new file mode 100755 index 000000000..8fd287ad6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/autoheight.html @@ -0,0 +1,36 @@ + + + + + Auto Height for Tabs - jQuery EasyUI Demo + + + + + + + +

    Auto Height for Tabs

    +

    The tabs height is auto adjusted according to tab panel content.

    +
    +
    +
    +

    jQuery EasyUI framework helps you build your web pages easily.

    +
      +
    • easyui is a collection of user-interface plugin based on jQuery.
    • +
    • easyui provides essential functionality for building modem, interactive, javascript applications.
    • +
    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
    • +
    • complete framework for HTML5 web page.
    • +
    • easyui save your time and scales while developing your products.
    • +
    • easyui is very easy but powerful.
    • +
    +
    +
    +
      +
      +
      + This is the help content. +
      +
      + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/basic.html new file mode 100755 index 000000000..c5a7ce675 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/basic.html @@ -0,0 +1,36 @@ + + + + + Basic Tabs - jQuery EasyUI Demo + + + + + + + +

      Basic Tabs

      +

      Click tab strip to swap tab panel content.

      +
      +
      +
      +

      jQuery EasyUI framework helps you build your web pages easily.

      +
        +
      • easyui is a collection of user-interface plugin based on jQuery.
      • +
      • easyui provides essential functionality for building modem, interactive, javascript applications.
      • +
      • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
      • +
      • complete framework for HTML5 web page.
      • +
      • easyui save your time and scales while developing your products.
      • +
      • easyui is very easy but powerful.
      • +
      +
      +
      +
        +
        +
        + This is the help content. +
        +
        + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/dropdown.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/dropdown.html new file mode 100755 index 000000000..e13426c39 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/dropdown.html @@ -0,0 +1,55 @@ + + + + + Tabs with DropDown - jQuery EasyUI Demo + + + + + + + +

        Tabs with DropDown

        +

        This sample shows how to add a dropdown menu over a tab strip.

        +
        +
        +
        +

        jQuery EasyUI framework helps you build your web pages easily.

        +
          +
        • easyui is a collection of user-interface plugin based on jQuery.
        • +
        • easyui provides essential functionality for building modem, interactive, javascript applications.
        • +
        • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
        • +
        • complete framework for HTML5 web page.
        • +
        • easyui save your time and scales while developing your products.
        • +
        • easyui is very easy but powerful.
        • +
        +
        +
        +
          +
          +
          + This is the help content. +
          +
          +
          +
          Welcome
          +
          Help Contents
          +
          Search
          +
          Dynamic Help
          +
          + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/fixedwidth.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/fixedwidth.html new file mode 100755 index 000000000..18030664a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/fixedwidth.html @@ -0,0 +1,37 @@ + + + + + Fixed Tab Width - jQuery EasyUI Demo + + + + + + + +

          Fixed Tab Width

          +

          The tab strips have fixed width and height.

          +
          +
          +
          +

          Home Content.

          +
          +
          +

          Maps Content.

          +
          +
          +

          Journal Content.

          +
          +
          +

          History Content.

          +
          +
          +

          References Content.

          +
          +
          +

          Contact Content.

          +
          +
          + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/fluid.html new file mode 100755 index 000000000..42cf7fc36 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/fluid.html @@ -0,0 +1,24 @@ + + + + + Fluid Tabs - jQuery EasyUI Demo + + + + + + + +

          Fluid Tabs

          +

          This example shows how to set the width of Tabs to a percentage of its parent container.

          +
          +
          +
          +

          The tabs has a width of 100%.

          +
          +
          +
          +
          + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/hover.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/hover.html new file mode 100755 index 000000000..04419c852 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/hover.html @@ -0,0 +1,46 @@ + + + + + Hover Tabs - jQuery EasyUI Demo + + + + + + + +

          Hover Tabs

          +

          Move mouse over the tab strip to open the tab panel.

          +
          +
          +
          +

          jQuery EasyUI framework helps you build your web pages easily.

          +
            +
          • easyui is a collection of user-interface plugin based on jQuery.
          • +
          • easyui provides essential functionality for building modem, interactive, javascript applications.
          • +
          • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
          • +
          • complete framework for HTML5 web page.
          • +
          • easyui save your time and scales while developing your products.
          • +
          • easyui is very easy but powerful.
          • +
          +
          +
          +
            +
            +
            + This is the help content. +
            +
            + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/images/modem.png b/testapps/GHIssues/src/main/resources/asset/demo/tabs/images/modem.png new file mode 100755 index 0000000000000000000000000000000000000000..be5a2eb2fc48a8f16681b591f4ef74888ee09c33 GIT binary patch literal 1633 zcmV-n2A=teP)DSXo(n z6%-WGq@<)6*xA{^2Ei8OFVPRn@pc;RG z0K(}2kU_v;uacIQE|igxVPIil0lOU8LJ$V2gBcFvgF+DKL$KN}U%tQ{3j&`%e`fgj z@gvL=d;kH2(*Zz33V;^3sH&=hEe8c1aykKFkQgk@fP4zVAcH}^2L(OIK_D>@4RRES ze)sMj*gUAC{s9CKRtErm69G(cJz`>Fj2}LHfCnwe5SVX(p#$bKGczNn7qEqVe0*Tb zKx$wP1gU%b_AT5|K=waih<*VGAQtps2Pz2H)YP1#tEdz1LA-G{v90jAo(|M-Y{Iec=5@nPoJ&=1Q2>IaFvsjn`>!l$t@@-2(}dD z0GK0?EkXud!iJNWd(GMH9%!pb!uh6=itz=n=!YbLZ{?6XRZ>k+%Q> zhy`Q`&;nIpmRY8(tSkWx7KUffo-s&DO2QK#$WmB3Ko0?!SPXU#m1Z4_<00M=8Jg|USYhq#|2XZmU!j~^!g0l-ZH#ay%!+e4s0^qV7 zCl zzk}l%xnx6*cces$;#;tKkUTJDgZV%`;9LP^gB$_!J;-ce!utdC{SlxvDE_~K)Byw# z3oyP-K}9Sx5VA6|Gca)cV_^9Y%36#J|Cs)QM1f48BN)Nn1tk_xApwc!e}BRC+4mpc z86F%z4whpB71y9L1E@wA=qY;#2Zjsh&of-Ue3{|QnKSo*QNADMdk_E!AQqr6xn4eh z#qi+MGlt6_&NBGR1u$ z0{{Yu<Cx%1A~kt11BpmeSi!CrWZyY9!TmJ7G?m2;TK>OdVJl%92G$?!48NGZF}SmPF>w9nW%&C26N4Xf z00ZYQUWPA1Um5-f1~UBq_k)2IR52MCGQ4~95>y1jif%}W2lO#BFiL>+E&~^z05CCs zVmN;M_>U(~p6rME{s*!H00M|*&z?PPz=SkSTvS{D7-$Skj7;G4z`*hXOoI&m$Mlkc znS+yo>HT}K&zO058JK{<%mPXaz!VNj<)Add07`g3`se1&48M$w7?`+u!SR3g?Afcp z#0yIKkI;*KfB*tHn;DoBY=PJr$mRzc!~(>uKtn+^3nLRF3ou86#ef(n%*@Kf$jA&< z2T=p$g5`mpXJG*;`2Fr3Gnc3+Gb50H=l1Ql4<9~U4~&|{K=YrVI{+Yn7?GN0TtLhY zauAfygvLh4gw(;r{y;5$3@UKZ9RLtOj04>>0tlc1ZXtfG21Qdk=RTSi)EQ1{_6i^UCwl}dq?)Kwu=icw$3Vv(^&DzBp z003H4WY{5#gx(W{WZ?xTPp(-6A&d7n9sqO>1QNe~ZLyh!;faNxAImH(PRkboJmIl) z5ft@hT9)XLC{1`m{6Mq^07z$}!gz5dlj%kb<7#2N1V~S32mm?^E&&!@<5jOx&3q{o za+2cX&tua)2r{taVogmAuD$W)qm~2Jb-st=OE#9C%TaGk*+GINT|sbi^6jAAyQ69v z8kDn-+d5(SDD|F*MUq!Y8 zc(PIdZebZiFlP5@(-6e!MAaf;@5+D2xe6|d8cfdKc6~j+K7)-5c4y4Sx{BFnKaWtq z>5TRFH=1ZgLzdQf!x{T;+PrT8Xs^e8w-+;+?n9TsNf?}i%e{^x&~3>;nZbF>Wk~-xi=)I9adQP-N!XQOOPah0O(QZ>2owWjyN~2)5!9nUX;qfIGvsHp@IVxcl=2QSj-aDrbsm+71?S} z(P`Ip&yPj&*46_(_|&4!Hz=_a?i71#2Li$LLi<)nVL z!{}WfIN}P&}jcP#>G?Gb4@Dg8Slpya_Y>1sq)VLm%q6alT7GG9ciH z=o`?VqJQAg0KhTaeay7TgYio%ePJb?E);6I?M9S?xW$@CT%}tOf{H0q7 zl`i}Cu}DQlJM)s>yd2C@xO01?p`g&-I~j%}`IIk6Y_>=2dpr+&3oX_Q8)ei(kFHYPxu*ps zYp-_l-RgrA8RDn!$Lm2bgGYu5Mdd0wSFTWOo4`S!NZ7|18*^m7=q?+~d$Wx!S3~ad z+qd`d_qu8q#;X~go_&(vYbA?;RKI^rk(F-U-T(#aumx`5F2EK1)KvG2^wc{g_+chg z$@@b)Sm!5c3i<3aJ0E2Ax4)~wB=r2XF8_c%C3(*EJ1#I%Qc@Vr&3)3U6U3N=3DN{@*z34hoRim^Arg_jcG>cCncl_cW}jS2nCa`kchCB!qvQ7I z=uc6;itt-`r&{6r(~xd+mFyq3twZh~O*rUVb*%k2+a5q+M`OXKY6x!|)7R8~b} zRQte@Xl8~+psdw=Kq)?VK}7sJE0SkH5r z2LOO|aL}fmrbzs@EHI}1#M!gcreGEyuq^-pDqDQe*`ua2K4o)M%1?=LDW{poV}XE} z#OPRJ@KI)b?9Nzb%$elYSU&);tP9>05W)H1iWnwxi( z35bh~vl9bllm9;Bm|~5OTm-YU69c^q@(A*Cv!8l93qnHH5jc8{4qtAxavOpx)su3t zmNn(O!v?S*3Q-NI+Vr2lbQX(pkjT`>3dQHP@o`xjqaih3qnq&vH|)yjEDq3ENj~*X zHu!OjW0JD%1loDs^o+wRE&(SBPF;+pu?5j!9T3>*lVMBnrwD~YZ{KzQkk_w2SMZ=J zIZE+guB(d+&c)T$a-Fj2l1G_{6W`s{-5owOJPc~IUwufI!6p&g5H~n7!W>j8mF%zY zFMYYQ<@79aQSRyzgqfW~RX>{FM*E8)BA;%`zTE52*1u5AsTqPkuL_*w27&a?l9IN; z_wVB>%gb-tu1a$%d}5MpQ%I3vYUrh5^%3U}6K~I`B$W(~xC9!omvc*|iW^^r7c}#oKM-NxzD*T(-)|KN1dXb}#%=YvteLUV5fj?QWh?F#CY?Buwoy4L z=R{FRcUdeJ4u{8YHp$&Oqnr8qj_$^m$dKPUCU^0(=R~(VZA6bUq)go=uBAqky{lu% zKBp0-hnxjVXxt1HYRIW5*NEKu6jf1CANS=;c1UPw=wN#0$^fI$kcs%UORLpFBlDg% zUiZi=N;T@IJY_@(K&}VXpRdyydb2uQOiLmrGV&DW)TvV#cXwwntDO4rBcJ+lY!6vj zRYeU7UIsO>O^I_aE?;VX@?`UmQmHf@Z`|lPXI-Nw@G&>C!DM&$HJGrlH7^q7?89;q zXYQkj!zt!21nlUZeQ6rgjo>$6Uy#9Quo@>_;g^(HlSqyJJ0rTI4SFpv|5_TZ;C8*E zc3D89fkJ-s&M*}KsBvH2-$)o&e` zeQZ5Jk_XdpQME?zdYwK`@frob;-GYTS2q-mYQ^*Qa^U$AtayNjD=$k-!<_t?DR8UB zAA9RNX`3QGZ1R;Q36%0ky~Hx~5dMwxZ-2ab6L?MC5Ja8+eF$V3Gr8QodJk0dg18KZ zoR7!#@wqmLYCIpuHpa(jR3l!JujVwIf4!~)NcnMNaGE3UV%2;}W*!Z9!;|>|>Eea8 zqq7zPA%671(%VaWl*3>`+Yc2|;n3m*l99>;EN2rAZ^i+v?s$poGHzbw+Nba4L#rH6 zq+MiGe?o-}D~G1MR<^zfzq+(@km=Q-(zW}5CylOrwh4>Vb%z8_K1v z{}MwZw_Q@a*%FqqwK59Fw(zE8C3}B&C? zVuA%ti8StfH{XZc2D8U_J|AyH{NhfILtZi<_ZTM@xbX@teKzjklX>M9=8`#Ed1Jrk z`Gv38>mF)aL&|8kP52^nQ#%GVws*XEG5;VahotE%ja@!`-&8RZhC-_mDh+X z=UGQpR`C`B!&I*F7JfdG22&_W)fCFGR!FUNO{VG(#$axsU>vlzfI0g2&z!Q*(e=i$ zp6es@6#)$*^JItW*m3o4-rEJ#L9 z*=8N2x83C0Xso1i*qhR#qLO0@sT3UP1j_21GkA#Notip#m8q2W%RhAdUiaZ;f%+xn zK4GR*3$K_M2~m(W_C`&j2-->mlPx`~d~q7cUxC`=j;vVIpx3_?Pt6e|1)Vuq4x5{b zPFZAERh{-X!c9^ml40Giad7jeVKOO5Mb;ZTWn!D0;=MJC$qygRJR7J@)^-%rL@UvI zl5kl&T-?98E1c60o$b2I)!8x#^2ut6A*9!6Isf^KKJv)K7Y%>4YSykdhIk% zG3y$bafGoO=g*Eumo9S0Y=2UTz4{vsI?HNo>_F$-kz{s~yL)T=)}^wV_XwIHzG9Uf zyrDDs82Z;OeZGFzLA43QCeL`1*}N`1?pHA_%fC;wv@OD4F+%=u9u zt-<>(M_a6z@xfr+c7ypZJpinAWK!d!Ghh8dYNbMFnq_p$qt8!?WC$6CA`S#_9<50R>^sn!rDR{DTdpKSy zZnNCkjFc6LaB=N>W^3-<8=3AZQ#+&DD znap!$rDu-T1i*cbI2HlTBPDG_Nil0PGBd4YM!nW`BSW6UxbA+Ea8~^pO{zMIezf1h zX$C-~-(vtWbL>jHE0^Cf%t?YrO9MI9##yQY#miw?pxwq6g9^*n`9 zsG$Q$SFfL-v2nrJMU08YC1iBZ160*gviuODFfn)e^088ae|`Mg)1O-qhoYaF{TULJ z4A6nAW5Dp6RUV{vfKm>dkEQ#6*K^zsupk2q+Ea4=oYE*vUp*jrbJ(W)8^E;x12P5j A&;S4c literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/images/tablet.png b/testapps/GHIssues/src/main/resources/asset/demo/tabs/images/tablet.png new file mode 100755 index 0000000000000000000000000000000000000000..fa871f54035fcd0bb0f7f2068d2b2ed4e5e0e0cf GIT binary patch literal 2505 zcmW+&Yh02C7k>ank;hAE24+c9(=C@5nzmOHNV6i*EwWAy0MbXsy0K#HV?N8$W`pv6QT zjiNmD$4~(?B4QR`0#=CzfSwt;NKvh#!WIdB z%YB|dcjx@oo`(`bd`9z^!A(QY1iPF%6?1cRBpWIN`RzH8N~L-O;@a)6gcQs3YyzKw zS8F8Q3ey0*t9pI8N+#*A02%I+ZZ5pG(swWbrgxqRY_5pm-6ONBQaTL##bG};rs z&qhw~Rdm&{2#oiLSHT~s%W05S|HMj#%*G5_Q`N~l#tE|oK9qIHDCueJIiqjoqJ=wO z6)(8utZ6E4$g|H1?q;%R#Ct)#J#a%@GeQfg7RTQWmfVkW;@u1Y&%)-}AgKBB(WfWU zMkk(IE3Q~3d{#80MM@-ZWnYeq(Pk^lAvkxY6adTrme$>nUA@}@IHZ-*dA*#|*s z==2flXx~Gi>+WTGOz&Jfl3-vyh50 zz08MfbZ+=dFZfWOL<32pD7ipvfmfEHE?|m}55gxR!ge>D!C1>p=^xoLm$yh!(Idwi zgfB;FH=L4ZIgiApTPB@R*tXbfad!eL+$<+1CaK}0k>TOwv4{w>@Th3Bk6MY~RfkB> z(Ivu(#3IFtr>)~HAf=nZCIk?*1X^+Sf!44H<>Ea2J_3LjZLols2`mbb8JN@v^pelH zL(|XyR%Q%nUBB-kEP4+FvI&0&T$1<2_#yqM;fUgtWEXr6V#gAJ*lkiqP6$3|lCgT7 zB{O%Ke}K3p8?*IebNE`9-4>hTHEHM1ZR}NtxRe5L!&>x!o}F1JIiGcfGJ_tk(j23B zd9^gAh>x-3oVBh$4p^biJYFxBuYZ<+M*BeUCcF#`$|FQRUi|EhaNdF_Fmvd&jz+R2 zd<@1L7`L(bbFLkRxKdNex-xH5z%xV_wBO@wLfDq>x*r6C8(PCB`ewPmqIUTC+3wu` z%X@kBKEEIe6dpUUR3eiGB_T6uNcJ3M&dqn=uxkdU)P=XEzAo$M6Tl%S9w>$O?UQ+2 z)GnKb|6@RPR09h&tc?%Hut^QVq%eoKxFO_{<9%g2LQNj+VH=OVEJH8o8a++W=3 zBH|;?Qe*Ks1|_bDBaj+Vy%bu5Y0uMia(751xVUYjurf@BqYfhjFosrrVO&b=UaBJ* zRVN78NkBo!#fmE0cTcT_jX@G@AWtc#%DLj^v8gTWtqy10)QAq%X6{P@Q|Um~Nce`J z6C6{`db6PK_*$qBhHKT~6^QX= z`2pm`0;Xk>TfmW!Xr*QzEBvF%8Jp_Vg0=jd*PS>&;faj4v=c)(nbhpBxpufuO(|-M z#Q-P#lEIs7?HOWR6zM!d&uouzVwZgTrZGW@?`cWH&GeCx|9B=m+Ud-^A%LZd9FWLN z>X>TjvxiUr!YMF_{{Zg@H-9PVG{wBNO=Z=i(R;M4C*?Bd-670aa(Iqu0NPqGG(WLS zL2jo-vyV>)sfXWhyYyP2lJEQfURv$sY*5OL*_76my7x&_Gb2Gn1na~#8Q$eMq%}qT zL;!yW?cbaP%Rj|~O$kHMk5d+1g}K~m;yVXNy*yGbH0`{bq`eR+UKKnPJb(Q{G4_#x z%+Ah@K95C{cN^*wT3Hcr`U$&c!dhcBEqw6M7sMV4lO%$71xuO5(|tjH$WuP9NQ0Ip za5k6+=H&B03ge6XZIP~yM{tlF32eoRgP9~mYfNC`e9z9wMj+I=s;>H4oxLV^& z(hzt0iAT`jb*aE?)L;i^uGhlkP@h%y% z4F*xWY>D>oAR7q#t9>=b_W~AcLW!YfXg_Sl-xlb$eXWTSnjPVo7p_S5=0F|=B^c3B zBr=%nm;*@^^UG-VoV49d;qU0yoQ%fjXiSP5I22rawBFTM;`KU~c{Q$`q3#qQoPN3T zp&B#r1cUvjRxN2x{M5nc+r+o)J)E#50W0)M@Q6w6p{N zZ6g%Axx1*dc;Md~b;UWI27CD17uycnas}P0v1hRWU)K4fR1O z_GBXjE!MHHv6fqU4|87?aSAtB;K2$ODqVa6cZM+vRg51?!1GSGqHbs5$>`hH=Z$g9 zP=yCQ&n4$SZBbp%Z^6#?ct4Nl%rat>>dn=|dwj9g3_R@ck)rziA#RRI{NOwgckukd z@=SR5BNa0^UYdPf_WoIY6K3}7Jaue7@z%) zyF|hvcM#Y?q7EGb(K5dgQ+A^PC*V}dKZ6eh`6Jux$~3_-b>1`oEkSLng_yMZ$A + + + + Nested Tabs - jQuery EasyUI Demo + + + + + + + +

            Nested Tabs

            +

            The tab panel can contain sub tabs or other components.

            +
            +
            +
            +
            +
            Content 1
            +
            Content 2
            +
            Content 3
            +
            +
            +
            +
            + +
            +
            + + + + + + + + + + + + + + + + + + + + +
            Title1Title2Title3
            d11d12d13
            d21d22d23
            +
            +
            + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/striptools.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/striptools.html new file mode 100755 index 000000000..13ca5b458 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/striptools.html @@ -0,0 +1,39 @@ + + + + + Tabs Strip Tools - jQuery EasyUI Demo + + + + + + + +

            Tabs Strip Tools

            +

            Click the mini-buttons on the tab strip to perform actions.

            +
            +
            +
            +

            jQuery EasyUI framework helps you build your web pages easily.

            +
              +
            • easyui is a collection of user-interface plugin based on jQuery.
            • +
            • easyui provides essential functionality for building modem, interactive, javascript applications.
            • +
            • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
            • +
            • complete framework for HTML5 web page.
            • +
            • easyui save your time and scales while developing your products.
            • +
            • easyui is very easy but powerful.
            • +
            +
            +
            + This is the help content. +
            +
            +
            + + + +
            + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/style.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/style.html new file mode 100755 index 000000000..adcb50771 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/style.html @@ -0,0 +1,51 @@ + + + + + Tabs Style - jQuery EasyUI Demo + + + + + + + +

            Tabs Style

            +

            Click the options below to change the tabs style.

            +
            + plain
            + narrow
            + pill
            + justified +
            +
            +
            +

            jQuery EasyUI framework helps you build your web pages easily.

            +
              +
            • easyui is a collection of user-interface plugin based on jQuery.
            • +
            • easyui provides essential functionality for building modem, interactive, javascript applications.
            • +
            • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
            • +
            • complete framework for HTML5 web page.
            • +
            • easyui save your time and scales while developing your products.
            • +
            • easyui is very easy but powerful.
            • +
            +
            +
            +
              +
              +
              + This is the help content. +
              +
              + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/tabimage.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/tabimage.html new file mode 100755 index 000000000..415cbef86 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/tabimage.html @@ -0,0 +1,41 @@ + + + + + Tabs with Images - jQuery EasyUI Demo + + + + + + + +

              Tabs with Images

              +

              The tab strip can display big images.

              +
              +
              +
              +

              A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.

              +
              +
              +

              In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.

              +
              +
              +

              A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.

              +
              +
              +

              A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

              +
              +
              + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/tabposition.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/tabposition.html new file mode 100755 index 000000000..43547367c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/tabposition.html @@ -0,0 +1,45 @@ + + + + + Tab Position - jQuery EasyUI Demo + + + + + + + +

              Tab Position

              +

              Click the 'position' drop-down list and select an item to change the tab position.

              +
              + Position: + +
              +
              +
              +

              jQuery EasyUI framework helps you build your web pages easily.

              +
                +
              • easyui is a collection of user-interface plugin based on jQuery.
              • +
              • easyui provides essential functionality for building modem, interactive, javascript applications.
              • +
              • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
              • +
              • complete framework for HTML5 web page.
              • +
              • easyui save your time and scales while developing your products.
              • +
              • easyui is very easy but powerful.
              • +
              +
              +
              +
                +
                +
                + This is the help content. +
                +
                + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/tabstools.html b/testapps/GHIssues/src/main/resources/asset/demo/tabs/tabstools.html new file mode 100755 index 000000000..9c8fa1012 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/tabstools.html @@ -0,0 +1,41 @@ + + + + + Tabs Tools - jQuery EasyUI Demo + + + + + + + +

                Tabs Tools

                +

                Click the buttons on the top right of tabs header to add or remove tab panel.

                +
                +
                +
                +
                + + +
                + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tabs/tree_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/tabs/tree_data1.json new file mode 100755 index 000000000..e0c619226 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tabs/tree_data1.json @@ -0,0 +1,49 @@ +[{ + "id":1, + "text":"My Documents", + "children":[{ + "id":11, + "text":"Photos", + "state":"closed", + "children":[{ + "id":111, + "text":"Friend" + },{ + "id":112, + "text":"Wife" + },{ + "id":113, + "text":"Company" + }] + },{ + "id":12, + "text":"Program Files", + "children":[{ + "id":121, + "text":"Intel" + },{ + "id":122, + "text":"Java", + "attributes":{ + "p1":"Custom Attribute1", + "p2":"Custom Attribute2" + } + },{ + "id":123, + "text":"Microsoft Office" + },{ + "id":124, + "text":"Games", + "checked":true + }] + },{ + "id":13, + "text":"index.html" + },{ + "id":14, + "text":"about.html" + },{ + "id":15, + "text":"welcome.html" + }] +}] diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tagbox/autocomplete.html b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/autocomplete.html new file mode 100755 index 000000000..f192f3e87 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/autocomplete.html @@ -0,0 +1,29 @@ + + + + + TagBox with Autocomplete - jQuery EasyUI Demo + + + + + + + +

                TagBox with Autocomplete

                +

                The autocomplete is the built-in feature that allows the user to select a value from the drop-down list.

                +
                +
                + +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tagbox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/basic.html new file mode 100755 index 000000000..256bb931f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/basic.html @@ -0,0 +1,20 @@ + + + + + Basic TagBox - jQuery EasyUI Demo + + + + + + + +

                Basic TagBox

                +

                The TagBox is created from a simple input element.

                +
                +
                + +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tagbox/button.html b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/button.html new file mode 100755 index 000000000..b16ac1cea --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/button.html @@ -0,0 +1,25 @@ + + + + + TagBox with Button - jQuery EasyUI Demo + + + + + + + +

                TagBox with Button

                +

                The button can be attached to a tagbox.

                +
                +
                + +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tagbox/format.html b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/format.html new file mode 100644 index 000000000..0a441bd94 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/format.html @@ -0,0 +1,24 @@ + + + + + Format TagBox - jQuery EasyUI Demo + + + + + + + +

                Format TagBox

                +

                This example shows how to format the tagbox values.

                +
                +
                + +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tagbox/style.html b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/style.html new file mode 100755 index 000000000..26cb95e15 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/style.html @@ -0,0 +1,35 @@ + + + + + Custom TagBox Style - jQuery EasyUI Demo + + + + + + + +

                Custom TagBox Style

                +

                This example shows how to apply different CSS styles to different tags.

                +
                +
                + +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tagbox/tagbox_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/tagbox_data1.json new file mode 100755 index 000000000..4e4f03c3c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/tagbox_data1.json @@ -0,0 +1,21 @@ +[{ + "id":"1", + "text":"Java", + "desc":"Write once, run anywhere" +},{ + "id":"2", + "text":"C#", + "desc":"One of the programming languages designed for the Common Language Infrastructure" +},{ + "id":"3", + "text":"Ruby", + "desc":"A dynamic, reflective, general-purpose object-oriented programming language" +},{ + "id":"4", + "text":"Perl", + "desc":"A high-level, general-purpose, interpreted, dynamic programming language" +},{ + "id":"5", + "text":"Basic", + "desc":"A family of general-purpose, high-level programming languages" +}] \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tagbox/validate.html b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/validate.html new file mode 100755 index 000000000..86e57b38e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tagbox/validate.html @@ -0,0 +1,34 @@ + + + + + Validate TagBox - jQuery EasyUI Demo + + + + + + + +

                Validate TagBox

                +

                This example shows how to validate the tagbox values.

                +
                +
                + +
                + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/textbox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/textbox/basic.html new file mode 100644 index 000000000..d7f93327f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/textbox/basic.html @@ -0,0 +1,35 @@ + + + + + Basic TextBox - jQuery EasyUI Demo + + + + + + + +

                Basic TextBox

                +

                The textbox allows a user to enter information.

                +
                +
                +
                + +
                +
                + +
                +
                + +
                +
                + +
                + +
                + Register +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/textbox/button.html b/testapps/GHIssues/src/main/resources/asset/demo/textbox/button.html new file mode 100644 index 000000000..bc78b1f1a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/textbox/button.html @@ -0,0 +1,25 @@ + + + + + TextBox with Button - jQuery EasyUI Demo + + + + + + + +

                TextBox with Button

                +

                The button can be attached to a textbox.

                +
                +
                +
                + +
                +
                + +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/textbox/clearicon.html b/testapps/GHIssues/src/main/resources/asset/demo/textbox/clearicon.html new file mode 100644 index 000000000..94a0ee1b7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/textbox/clearicon.html @@ -0,0 +1,68 @@ + + + + + TextBox with Clear Icon - jQuery EasyUI Demo + + + + + + + +

                TextBox with Clear Icon

                +

                This example shows how to create an textbox with an icon to clear the input element itself.

                +
                +
                +
                + +
                +
                + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/textbox/custom.html b/testapps/GHIssues/src/main/resources/asset/demo/textbox/custom.html new file mode 100644 index 000000000..b4cf18237 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/textbox/custom.html @@ -0,0 +1,34 @@ + + + + + Custom TextBox - jQuery EasyUI Demo + + + + + + + +

                Custom TextBox

                +

                This example shows how to custom a login form.

                +
                +
                +
                + +
                +
                + +
                +
                + + Remember me +
                + +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/textbox/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/textbox/fluid.html new file mode 100644 index 000000000..1c62dc232 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/textbox/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid TextBox - jQuery EasyUI Demo + + + + + + + +

                Fluid TextBox

                +

                This example shows how to set the width of TextBox to a percentage of its parent container.

                +
                +
                +
                + +
                +
                + +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/textbox/icons.html b/testapps/GHIssues/src/main/resources/asset/demo/textbox/icons.html new file mode 100644 index 000000000..10a9653ea --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/textbox/icons.html @@ -0,0 +1,51 @@ + + + + + TextBox with Icons - jQuery EasyUI Demo + + + + + + + +

                TextBox with Icons

                +

                Click the icons on textbox to perform actions.

                +
                +
                + Select Icon Align: + +
                +
                +
                + +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/textbox/multiline.html b/testapps/GHIssues/src/main/resources/asset/demo/textbox/multiline.html new file mode 100644 index 000000000..f56b4e5e6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/textbox/multiline.html @@ -0,0 +1,25 @@ + + + + + Multiline TextBox - jQuery EasyUI Demo + + + + + + + +

                Multiline TextBox

                +

                This example shows how to define a textbox for the user to enter multi-line text input.

                +
                +
                +
                + +
                +
                + +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/textbox/size.html b/testapps/GHIssues/src/main/resources/asset/demo/textbox/size.html new file mode 100644 index 000000000..12e17dcaa --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/textbox/size.html @@ -0,0 +1,31 @@ + + + + + TextBox Size - jQuery EasyUI Demo + + + + + + + +

                TextBox Size

                +

                The textbox can vary in size.

                +
                +
                +
                + +
                +
                + +
                +
                + +
                +
                + +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/timespinner/actions.html b/testapps/GHIssues/src/main/resources/asset/demo/timespinner/actions.html new file mode 100755 index 000000000..2480f8a17 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/timespinner/actions.html @@ -0,0 +1,42 @@ + + + + + TimeSpinner Actions - jQuery EasyUI Demo + + + + + + + +

                TimeSpinner Actions

                +

                Click the buttons below to perform actions.

                + +
                +
                + +
                +
                + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/timespinner/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/timespinner/basic.html new file mode 100755 index 000000000..9a30add42 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/timespinner/basic.html @@ -0,0 +1,25 @@ + + + + + Basic TimeSpinner - jQuery EasyUI Demo + + + + + + + +

                Basic TimeSpinner

                +

                Click spin button to adjust time.

                +
                +
                +
                + +
                +
                + +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/timespinner/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/timespinner/fluid.html new file mode 100755 index 000000000..403ead1bd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/timespinner/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid TimeSpinner - jQuery EasyUI Demo + + + + + + + +

                Fluid TimeSpinner

                +

                This example shows how to set the width of TimeSpinner to a percentage of its parent container.

                +
                +
                +
                + +
                +
                + +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/timespinner/range.html b/testapps/GHIssues/src/main/resources/asset/demo/timespinner/range.html new file mode 100755 index 000000000..042c26ae1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/timespinner/range.html @@ -0,0 +1,24 @@ + + + + + Time Range - jQuery EasyUI Demo + + + + + + + +

                Time Range

                +

                The time value is constrained in specified range.

                +
                + From 08:30 to 18:00 +
                +
                +
                + +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tooltip/_content.html b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

                Here is the content loaded via AJAX.

                +
                  +
                • easyui is a collection of user-interface plugin based on jQuery.
                • +
                • easyui provides essential functionality for building modern, interactive, javascript applications.
                • +
                • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                • +
                • complete framework for HTML5 web page.
                • +
                • easyui save your time and scales while developing your products.
                • +
                • easyui is very easy but powerful.
                • +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tooltip/_dialog.html b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/_dialog.html new file mode 100755 index 000000000..ddcdc074c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/_dialog.html @@ -0,0 +1,23 @@ + + + + + Dialog Content + + +
                +
                +
                User Name:
                + +
                +
                +
                Password:
                + +
                +
                + Login + Cancel +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tooltip/ajax.html b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/ajax.html new file mode 100755 index 000000000..c0095fa2b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/ajax.html @@ -0,0 +1,32 @@ + + + + + Ajax Tooltip - jQuery EasyUI Demo + + + + + + + +

                Ajax Tooltip

                +

                The tooltip content can be loaded via AJAX.

                +
                + Hove me to display tooltip content via AJAX. + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tooltip/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/basic.html new file mode 100755 index 000000000..3fb13625b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/basic.html @@ -0,0 +1,20 @@ + + + + + Basic Tooltip - jQuery EasyUI Demo + + + + + + + +

                Basic Tooltip

                +

                Hover the links to display tooltip message.

                +
                +

                The tooltip can use each elements title attribute. + Hover me to display tooltip. +

                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tooltip/customcontent.html b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/customcontent.html new file mode 100755 index 000000000..68ce13c20 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/customcontent.html @@ -0,0 +1,32 @@ + + + + + Custom Tooltip Content - jQuery EasyUI Demo + + + + + + + +

                Custom Tooltip Content

                +

                Access to each elements attribute to get the tooltip content.

                +
                +
                +
                +
                + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tooltip/customstyle.html b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/customstyle.html new file mode 100755 index 000000000..13f10ac59 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/customstyle.html @@ -0,0 +1,52 @@ + + + + + Custom Tooltip Style - jQuery EasyUI Demo + + + + + + + +

                Custom Tooltip Style

                +

                This sample shows how to change the tooltip style.

                +
                +
                +
                Hover Me
                +
                +
                +
                Hover Me
                +
                + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tooltip/position.html b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/position.html new file mode 100755 index 000000000..8707b2557 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/position.html @@ -0,0 +1,34 @@ + + + + + Tooltip Position - jQuery EasyUI Demo + + + + + + + +

                Tooltip Position

                +

                Click the drop-down list below to change where the tooltip appears.

                +
                + Select position: + +
                +
                Hover Me
                +
                + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tooltip/toolbar.html b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/toolbar.html new file mode 100755 index 000000000..c376ea2cd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/toolbar.html @@ -0,0 +1,40 @@ + + + + + Tooltip as Toolbar - jQuery EasyUI Demo + + + + + + + +

                Tooltip as Toolbar

                +

                This sample shows how to create a tooltip style toolbar.

                +
                +
                +

                Hover me to display toolbar.

                +
                +
                +
                + + + + + +
                +
                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tooltip/tooltipdialog.html b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/tooltipdialog.html new file mode 100755 index 000000000..a22bcac0b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tooltip/tooltipdialog.html @@ -0,0 +1,44 @@ + + + + + Tooltip Dialog - jQuery EasyUI Demo + + + + + + + +

                Tooltip Dialog

                +

                This sample shows how to create a tooltip dialog.

                +
                +
                +

                Click here to see the tooltip dialog. +

                + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/actions.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/actions.html new file mode 100755 index 000000000..4b194e724 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/actions.html @@ -0,0 +1,47 @@ + + + + + Tree Actions - jQuery EasyUI Demo + + + + + + + +

                Tree Actions

                +

                Click the buttons below to perform actions.

                + +
                +
                  +
                  + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/animation.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/animation.html new file mode 100755 index 000000000..83fb263fe --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/animation.html @@ -0,0 +1,20 @@ + + + + + Animation Tree - jQuery EasyUI Demo + + + + + + + +

                  Animation Tree

                  +

                  Apply 'animate' property to true to enable animation effect.

                  +
                  +
                  +
                    +
                    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/basic.html new file mode 100755 index 000000000..96f4396ec --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/basic.html @@ -0,0 +1,53 @@ + + + + + Basic Tree - jQuery EasyUI Demo + + + + + + + +

                    Basic Tree

                    +

                    Click the arrow on the left to expand or collapse nodes.

                    +
                    +
                    +
                      +
                    • + My Documents +
                        +
                      • + Photos +
                          +
                        • + Friend +
                        • +
                        • + Wife +
                        • +
                        • + Company +
                        • +
                        +
                      • +
                      • + Program Files +
                          +
                        • Intel
                        • +
                        • Java
                        • +
                        • Microsoft Office
                        • +
                        • Games
                        • +
                        +
                      • +
                      • index.html
                      • +
                      • about.html
                      • +
                      • welcome.html
                      • +
                      +
                    • +
                    +
                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/checkbox.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/checkbox.html new file mode 100755 index 000000000..2d1f8d564 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/checkbox.html @@ -0,0 +1,37 @@ + + + + + CheckBox Tree - jQuery EasyUI Demo + + + + + + + +

                    CheckBox Tree

                    +

                    Tree nodes with check boxes.

                    + +
                    + CascadeCheck + OnlyLeafCheck +
                    +
                    +
                      +
                      + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/contextmenu.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/contextmenu.html new file mode 100755 index 000000000..342fcf3ee --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/contextmenu.html @@ -0,0 +1,65 @@ + + + + + Tree Context Menu - jQuery EasyUI Demo + + + + + + + +

                      Tree Context Menu

                      +

                      Right click on a node to display context menu.

                      +
                      +
                      +
                        +
                        +
                        +
                        Append
                        +
                        Remove
                        + +
                        Expand
                        +
                        Collapse
                        +
                        + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/customcheckbox.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/customcheckbox.html new file mode 100755 index 000000000..366639abd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/customcheckbox.html @@ -0,0 +1,29 @@ + + + + + Custom CheckBox Tree - jQuery EasyUI Demo + + + + + + + +

                        Custom CheckBox Tree

                        +

                        Tree nodes with customized check boxes.

                        +
                        +
                        +
                          +
                          + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/dnd.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/dnd.html new file mode 100755 index 000000000..4be5bbd45 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/dnd.html @@ -0,0 +1,20 @@ + + + + + Drag Drop Tree Nodes - jQuery EasyUI Demo + + + + + + + +

                          Drag Drop Tree Nodes

                          +

                          Press mouse down and drag a node to another position.

                          +
                          +
                          +
                            +
                            + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/editable.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/editable.html new file mode 100755 index 000000000..9d3b62c80 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/editable.html @@ -0,0 +1,27 @@ + + + + + Editable Tree - jQuery EasyUI Demo + + + + + + + +

                            Editable Tree

                            +

                            Click the node to begin edit, press enter key to stop edit or esc key to cancel edit.

                            +
                            +
                            +
                              +
                              + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/formatting.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/formatting.html new file mode 100755 index 000000000..187f58869 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/formatting.html @@ -0,0 +1,32 @@ + + + + + Formatting Tree Nodes - jQuery EasyUI Demo + + + + + + + +

                              Formatting Tree Nodes

                              +

                              This example shows how to display extra information on nodes.

                              +
                              +
                              +
                                +
                              +
                              + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/icons.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/icons.html new file mode 100755 index 000000000..c4cecb84d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/icons.html @@ -0,0 +1,20 @@ + + + + + Tree Node Icons - jQuery EasyUI Demo + + + + + + + +

                              Tree Node Icons

                              +

                              This sample illustrates how to add icons to tree node.

                              +
                              +
                              +
                                +
                                + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/lazyload.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/lazyload.html new file mode 100755 index 000000000..865cee614 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/lazyload.html @@ -0,0 +1,82 @@ + + + + + Lazy Load Tree Nodes - jQuery EasyUI Demo + + + + + + + +

                                Lazy Load Tree Nodes

                                +

                                Get full hierarchical tree data but lazy load nodes level by level.

                                +
                                +
                                +
                                  +
                                  + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/lines.html b/testapps/GHIssues/src/main/resources/asset/demo/tree/lines.html new file mode 100755 index 000000000..681a16b4a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/lines.html @@ -0,0 +1,20 @@ + + + + + Tree Lines - jQuery EasyUI Demo + + + + + + + +

                                  Tree Lines

                                  +

                                  This sample shows how to show tree lines.

                                  +
                                  +
                                  +
                                    +
                                    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/tree_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/tree/tree_data1.json new file mode 100755 index 000000000..e0c619226 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/tree_data1.json @@ -0,0 +1,49 @@ +[{ + "id":1, + "text":"My Documents", + "children":[{ + "id":11, + "text":"Photos", + "state":"closed", + "children":[{ + "id":111, + "text":"Friend" + },{ + "id":112, + "text":"Wife" + },{ + "id":113, + "text":"Company" + }] + },{ + "id":12, + "text":"Program Files", + "children":[{ + "id":121, + "text":"Intel" + },{ + "id":122, + "text":"Java", + "attributes":{ + "p1":"Custom Attribute1", + "p2":"Custom Attribute2" + } + },{ + "id":123, + "text":"Microsoft Office" + },{ + "id":124, + "text":"Games", + "checked":true + }] + },{ + "id":13, + "text":"index.html" + },{ + "id":14, + "text":"about.html" + },{ + "id":15, + "text":"welcome.html" + }] +}] diff --git a/testapps/GHIssues/src/main/resources/asset/demo/tree/tree_data2.json b/testapps/GHIssues/src/main/resources/asset/demo/tree/tree_data2.json new file mode 100755 index 000000000..a6e225177 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/tree/tree_data2.json @@ -0,0 +1,61 @@ +[{ + "id":1, + "text":"My Documents", + "children":[{ + "id":11, + "text":"Photos", + "state":"closed", + "children":[{ + "id":111, + "text":"Friend" + },{ + "id":112, + "text":"Wife" + },{ + "id":113, + "text":"Company" + }] + },{ + "id":12, + "text":"Program Files", + "state":"closed", + "children":[{ + "id":121, + "text":"Intel" + },{ + "id":122, + "text":"Java" + },{ + "id":123, + "text":"Microsoft Office" + },{ + "id":124, + "text":"Games" + }] + },{ + "id":16, + "text":"Actions", + "children":[{ + "text":"Add", + "iconCls":"icon-add" + },{ + "text":"Remove", + "iconCls":"icon-remove" + },{ + "text":"Save", + "iconCls":"icon-save" + },{ + "text":"Search", + "iconCls":"icon-search" + }] + },{ + "id":13, + "text":"index.html" + },{ + "id":14, + "text":"about.html" + },{ + "id":15, + "text":"welcome.html" + }] +}] diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/actions.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/actions.html new file mode 100755 index 000000000..6249a9eed --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/actions.html @@ -0,0 +1,64 @@ + + + + + TreeGrid Actions - jQuery EasyUI Demo + + + + + + + +

                                    TreeGrid Actions

                                    +

                                    Click the buttons below to perform actions.

                                    + + + + + + + + + + + +
                                    Task NamePersonsBegin DateEnd DateProgress
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/basic.html new file mode 100755 index 000000000..3b5076bb2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/basic.html @@ -0,0 +1,34 @@ + + + + + Basic TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                    Basic TreeGrid

                                    +

                                    TreeGrid allows you to expand or collapse group rows.

                                    +
                                    + + + + + + + + +
                                    NameSizeModified Date
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/checkbox.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/checkbox.html new file mode 100755 index 000000000..bbf6f8309 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/checkbox.html @@ -0,0 +1,35 @@ + + + + + Cascade CheckBox in TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                    Cascade CheckBox in TreeGrid

                                    +

                                    TreeGrid nodes with cascade check boxes.

                                    +
                                    + + + + + + + + +
                                    NameSizeModified Date
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/clientpagination.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/clientpagination.html new file mode 100755 index 000000000..03f8bf3a5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/clientpagination.html @@ -0,0 +1,189 @@ + + + + + Client Side Pagination in TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                    Client Side Pagination in TreeGrid

                                    +

                                    This sample shows how to implement client side pagination in TreeGrid.

                                    +
                                    + + + + + + + + + + +
                                    Task NamePersonsBegin DateEnd DateProgress
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/contextmenu.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/contextmenu.html new file mode 100755 index 000000000..3394ea15d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/contextmenu.html @@ -0,0 +1,106 @@ + + + + + TreeGrid ContextMenu - jQuery EasyUI Demo + + + + + + + +

                                    TreeGrid ContextMenu

                                    +

                                    Right click to display the context menu.

                                    +
                                    + + + + + + + + + + +
                                    Task NamePersonsBegin DateEnd DateProgress
                                    +
                                    +
                                    Append
                                    +
                                    Remove
                                    + +
                                    Collapse
                                    +
                                    Expand
                                    +
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/customcheckbox.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/customcheckbox.html new file mode 100755 index 000000000..40a34c02d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/customcheckbox.html @@ -0,0 +1,40 @@ + + + + + Custom CheckBox in TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                    Custom CheckBox in TreeGrid

                                    +

                                    TreeGrid nodes with customized check boxes.

                                    +
                                    + + + + + + + + +
                                    NameSizeModified Date
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/editable.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/editable.html new file mode 100755 index 000000000..0b79d39d4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/editable.html @@ -0,0 +1,93 @@ + + + + + Editable TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                    Editable TreeGrid

                                    +

                                    Select one node and click edit button to perform editing.

                                    +
                                    + Edit + Save + Cancel +
                                    + + + + + + + + + + +
                                    Task NamePersonsBegin DateEnd DateProgress
                                    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/fluid.html new file mode 100755 index 000000000..1fd82f674 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/fluid.html @@ -0,0 +1,33 @@ + + + + + Fluid TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                    Fluid TreeGrid

                                    +

                                    This example shows how to assign percentage width to a column in TreeGrid.

                                    +
                                    + + + + + + + + +
                                    Name(50%)Size(20%)Modified Date(30%)
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/footer.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/footer.html new file mode 100755 index 000000000..d03e7563f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/footer.html @@ -0,0 +1,55 @@ + + + + + TreeGrid with Footer - jQuery EasyUI Demo + + + + + + + +

                                    TreeGrid with Footer

                                    +

                                    Show summary information on TreeGrid footer.

                                    +
                                    +
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/lines.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/lines.html new file mode 100755 index 000000000..935f862a3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/lines.html @@ -0,0 +1,35 @@ + + + + + TreeGrid Lines - jQuery EasyUI Demo + + + + + + + +

                                    TreeGrid Lines

                                    +

                                    This example shows how to show treegrid lines.

                                    +
                                    + + + + + + + + +
                                    NameSizeModified Date
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/reports.html b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/reports.html new file mode 100755 index 000000000..062e6c87b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/reports.html @@ -0,0 +1,49 @@ + + + + + Reports using TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                    Reports using TreeGrid

                                    +

                                    Using TreeGrid to show complex reports.

                                    +
                                    + + + + + + + + + + + + + + + + + + + + + + +
                                    Region
                                    20092010
                                    1st qrt.2st qrt.3st qrt.4st qrt.1st qrt.2st qrt.3st qrt.4st qrt.
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data1.json b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data1.json new file mode 100755 index 000000000..6cc109739 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data1.json @@ -0,0 +1,73 @@ +[{ + "id":1, + "name":"C", + "size":"", + "date":"02/19/2010", + "children":[{ + "id":2, + "name":"Program Files", + "size":"120 MB", + "date":"03/20/2010", + "children":[{ + "id":21, + "name":"Java", + "size":"", + "date":"01/13/2010", + "state":"closed", + "children":[{ + "id":211, + "name":"java.exe", + "size":"142 KB", + "date":"01/13/2010" + },{ + "id":212, + "name":"jawt.dll", + "size":"5 KB", + "date":"01/13/2010" + }] + },{ + "id":22, + "name":"MySQL", + "size":"", + "date":"01/13/2010", + "state":"closed", + "children":[{ + "id":221, + "name":"my.ini", + "size":"10 KB", + "date":"02/26/2009" + },{ + "id":222, + "name":"my-huge.ini", + "size":"5 KB", + "date":"02/26/2009" + },{ + "id":223, + "name":"my-large.ini", + "size":"5 KB", + "date":"02/26/2009" + }] + }] + },{ + "id":3, + "name":"eclipse", + "size":"", + "date":"01/20/2010", + "children":[{ + "id":31, + "name":"eclipse.exe", + "size":"56 KB", + "date":"05/19/2009" + },{ + "id":32, + "name":"eclipse.ini", + "size":"1 KB", + "date":"04/20/2010" + },{ + "id":33, + "name":"notice.html", + "size":"7 KB", + "date":"03/17/2005" + }] + }] +}] \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data2.json b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data2.json new file mode 100755 index 000000000..52c2c0527 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data2.json @@ -0,0 +1,11 @@ +{"total":7,"rows":[ + {"id":1,"name":"All Tasks","begin":"3/4/2010","end":"3/20/2010","progress":60,"iconCls":"icon-ok"}, + {"id":2,"name":"Designing","begin":"3/4/2010","end":"3/10/2010","progress":100,"_parentId":1,"state":"closed"}, + {"id":21,"name":"Database","persons":2,"begin":"3/4/2010","end":"3/6/2010","progress":100,"_parentId":2}, + {"id":22,"name":"UML","persons":1,"begin":"3/7/2010","end":"3/8/2010","progress":100,"_parentId":2}, + {"id":23,"name":"Export Document","persons":1,"begin":"3/9/2010","end":"3/10/2010","progress":100,"_parentId":2}, + {"id":3,"name":"Coding","persons":2,"begin":"3/11/2010","end":"3/18/2010","progress":80}, + {"id":4,"name":"Testing","persons":1,"begin":"3/19/2010","end":"3/20/2010","progress":20} +],"footer":[ + {"name":"Total Persons:","persons":7,"iconCls":"icon-sum"} +]} diff --git a/testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data3.json b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data3.json new file mode 100755 index 000000000..7015d317b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/treegrid/treegrid_data3.json @@ -0,0 +1,13 @@ +{"total":9,"rows":[ + {"id":1,"region":"Wyoming"}, + {"id":11,"region":"Albin","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, + {"id":12,"region":"Canon","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, + {"id":13,"region":"Egbert","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, + {"id":2,"region":"Washington"}, + {"id":21,"region":"Bellingham","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, + {"id":22,"region":"Chehalis","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, + {"id":23,"region":"Ellensburg","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, + {"id":24,"region":"Monroe","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2} +],"footer":[ + {"region":"Total","f1":14000,"f2":12600,"f3":13321,"f4":15281,"f5":14931,"f6":13461,"f7":14126,"f8":12866} +]} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/validatebox/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/validatebox/basic.html new file mode 100755 index 000000000..41bd5097c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/validatebox/basic.html @@ -0,0 +1,45 @@ + + + + + Basic ValidateBox - jQuery EasyUI Demo + + + + + + + +

                                    Basic ValidateBox

                                    +

                                    It's easy to add validate logic to a input box.

                                    +
                                    +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/validatebox/customtooltip.html b/testapps/GHIssues/src/main/resources/asset/demo/validatebox/customtooltip.html new file mode 100755 index 000000000..a5adf6a5b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/validatebox/customtooltip.html @@ -0,0 +1,56 @@ + + + + + Custom ValidateBox Tooltip - jQuery EasyUI Demo + + + + + + + +

                                    Custom ValidateBox Tooltip

                                    +

                                    This sample shows how to display another tooltip message on a valid textbox.

                                    +
                                    +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/validatebox/errorplacement.html b/testapps/GHIssues/src/main/resources/asset/demo/validatebox/errorplacement.html new file mode 100755 index 000000000..7bc164886 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/validatebox/errorplacement.html @@ -0,0 +1,62 @@ + + + + + Error Placement in ValidateBox - jQuery EasyUI Demo + + + + + + + +

                                    Error Placement in ValidateBox

                                    +

                                    This example shows how to display the error message below the field.

                                    +
                                    +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/validatebox/validateonblur.html b/testapps/GHIssues/src/main/resources/asset/demo/validatebox/validateonblur.html new file mode 100755 index 000000000..372cff452 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/validatebox/validateonblur.html @@ -0,0 +1,45 @@ + + + + + Validate On Blur - jQuery EasyUI Demo + + + + + + + +

                                    Validate On Blur

                                    +

                                    Active validation on first blur event.

                                    +
                                    +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + +
                                    +
                                    + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/window/basic.html b/testapps/GHIssues/src/main/resources/asset/demo/window/basic.html new file mode 100755 index 000000000..fb402468b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/window/basic.html @@ -0,0 +1,23 @@ + + + + + Basic Window - jQuery EasyUI Demo + + + + + + + +

                                    Basic Window

                                    +

                                    Window can be dragged freely on screen.

                                    +
                                    + Open + Close +
                                    +
                                    + The window content. +
                                    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/window/borderstyle.html b/testapps/GHIssues/src/main/resources/asset/demo/window/borderstyle.html new file mode 100755 index 000000000..fd7a8f495 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/window/borderstyle.html @@ -0,0 +1,53 @@ + + + + + Window Border Style - jQuery EasyUI Demo + + + + + + + + +

                                    Window Border Style

                                    +

                                    This example shows how to set the different border style.

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Window content

                                    +
                                    +
                                    +

                                    Window content

                                    +
                                    +
                                    +

                                    Window content

                                    +
                                    +
                                    +

                                    Window content

                                    +
                                    +
                                    +

                                    Window content

                                    +
                                    +
                                    +

                                    Window content

                                    +
                                    +
                                    + + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/window/customtools.html b/testapps/GHIssues/src/main/resources/asset/demo/window/customtools.html new file mode 100755 index 000000000..4a0e2c45d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/window/customtools.html @@ -0,0 +1,30 @@ + + + + + Custom Window Tools - jQuery EasyUI Demo + + + + + + + +

                                    Custom Window Tools

                                    +

                                    Click the right top buttons to perform actions.

                                    +
                                    + Open + Close +
                                    +
                                    + The window content. +
                                    +
                                    + + + + +
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/window/fluid.html b/testapps/GHIssues/src/main/resources/asset/demo/window/fluid.html new file mode 100755 index 000000000..13406fa19 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/window/fluid.html @@ -0,0 +1,24 @@ + + + + + Fluid Window - jQuery EasyUI Demo + + + + + + + +

                                    Fluid Window

                                    +

                                    This example shows how to set the width of Window to a percentage of its parent container.

                                    +
                                    +
                                    +

                                    The window has a width of 80%.

                                    +
                                    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/window/footer.html b/testapps/GHIssues/src/main/resources/asset/demo/window/footer.html new file mode 100755 index 000000000..60e8b9aeb --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/window/footer.html @@ -0,0 +1,24 @@ + + + + + Window with a Footer - jQuery EasyUI Demo + + + + + + + +

                                    Window with a Footer

                                    +

                                    This example shows how to attach a footer bar to the window.

                                    +
                                    + Open + Close +
                                    +
                                    + The window content. +
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/window/inlinewindow.html b/testapps/GHIssues/src/main/resources/asset/demo/window/inlinewindow.html new file mode 100755 index 000000000..f272bb167 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/window/inlinewindow.html @@ -0,0 +1,26 @@ + + + + + Inline Window - jQuery EasyUI Demo + + + + + + + +

                                    Inline Window

                                    +

                                    The inline window stay inside its parent.

                                    +
                                    + Open + Close +
                                    +
                                    +
                                    + This window stay inside its parent +
                                    +
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/window/modalwindow.html b/testapps/GHIssues/src/main/resources/asset/demo/window/modalwindow.html new file mode 100755 index 000000000..ee273ec91 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/window/modalwindow.html @@ -0,0 +1,24 @@ + + + + + Modal Window - jQuery EasyUI Demo + + + + + + + +

                                    Modal Window

                                    +

                                    Click the open button below to open the modal window.

                                    +
                                    + Open + Close +
                                    +
                                    + The window content. +
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/demo/window/windowlayout.html b/testapps/GHIssues/src/main/resources/asset/demo/window/windowlayout.html new file mode 100755 index 000000000..d79927213 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/demo/window/windowlayout.html @@ -0,0 +1,33 @@ + + + + + Window Layout - jQuery EasyUI Demo + + + + + + + +

                                    Window Layout

                                    +

                                    Using layout on window.

                                    +
                                    + Open + Close +
                                    +
                                    +
                                    +
                                    +
                                    + jQuery EasyUI framework help you build your web page easily. +
                                    +
                                    + Ok + Cancel +
                                    +
                                    +
                                    + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/easyloader.js b/testapps/GHIssues/src/main/resources/asset/easyloader.js new file mode 100755 index 000000000..d082ad2bd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/easyloader.js @@ -0,0 +1,190 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function(){ +var _1={draggable:{js:"jquery.draggable.js"},droppable:{js:"jquery.droppable.js"},resizable:{js:"jquery.resizable.js"},linkbutton:{js:"jquery.linkbutton.js",css:"linkbutton.css"},progressbar:{js:"jquery.progressbar.js",css:"progressbar.css"},tooltip:{js:"jquery.tooltip.js",css:"tooltip.css"},pagination:{js:"jquery.pagination.js",css:"pagination.css",dependencies:["linkbutton"]},datagrid:{js:"jquery.datagrid.js",css:"datagrid.css",dependencies:["panel","resizable","linkbutton","pagination"]},treegrid:{js:"jquery.treegrid.js",css:"tree.css",dependencies:["datagrid"]},propertygrid:{js:"jquery.propertygrid.js",css:"propertygrid.css",dependencies:["datagrid"]},datalist:{js:"jquery.datalist.js",css:"datalist.css",dependencies:["datagrid"]},panel:{js:"jquery.panel.js",css:"panel.css"},window:{js:"jquery.window.js",css:"window.css",dependencies:["resizable","draggable","panel"]},dialog:{js:"jquery.dialog.js",css:"dialog.css",dependencies:["linkbutton","window"]},messager:{js:"jquery.messager.js",css:"messager.css",dependencies:["linkbutton","dialog","progressbar"]},layout:{js:"jquery.layout.js",css:"layout.css",dependencies:["resizable","panel"]},form:{js:"jquery.form.js"},menu:{js:"jquery.menu.js",css:"menu.css"},tabs:{js:"jquery.tabs.js",css:"tabs.css",dependencies:["panel","linkbutton"]},menubutton:{js:"jquery.menubutton.js",css:"menubutton.css",dependencies:["linkbutton","menu"]},splitbutton:{js:"jquery.splitbutton.js",css:"splitbutton.css",dependencies:["menubutton"]},switchbutton:{js:"jquery.switchbutton.js",css:"switchbutton.css"},accordion:{js:"jquery.accordion.js",css:"accordion.css",dependencies:["panel"]},calendar:{js:"jquery.calendar.js",css:"calendar.css"},textbox:{js:"jquery.textbox.js",css:"textbox.css",dependencies:["validatebox","linkbutton"]},passwordbox:{js:"jquery.passwordbox.js",css:"passwordbox.css",dependencies:["textbox"]},filebox:{js:"jquery.filebox.js",css:"filebox.css",dependencies:["textbox"]},combo:{js:"jquery.combo.js",css:"combo.css",dependencies:["panel","textbox"]},combobox:{js:"jquery.combobox.js",css:"combobox.css",dependencies:["combo"]},combotree:{js:"jquery.combotree.js",dependencies:["combo","tree"]},combogrid:{js:"jquery.combogrid.js",dependencies:["combo","datagrid"]},combotreegrid:{js:"jquery.combotreegrid.js",dependencies:["combo","treegrid"]},tagbox:{js:"jquery.tagbox.js",dependencies:["combobox"]},validatebox:{js:"jquery.validatebox.js",css:"validatebox.css",dependencies:["tooltip"]},numberbox:{js:"jquery.numberbox.js",dependencies:["textbox"]},searchbox:{js:"jquery.searchbox.js",css:"searchbox.css",dependencies:["menubutton","textbox"]},spinner:{js:"jquery.spinner.js",css:"spinner.css",dependencies:["textbox"]},numberspinner:{js:"jquery.numberspinner.js",dependencies:["spinner","numberbox"]},timespinner:{js:"jquery.timespinner.js",dependencies:["spinner"]},tree:{js:"jquery.tree.js",css:"tree.css",dependencies:["draggable","droppable"]},datebox:{js:"jquery.datebox.js",css:"datebox.css",dependencies:["calendar","combo"]},datetimebox:{js:"jquery.datetimebox.js",dependencies:["datebox","timespinner"]},slider:{js:"jquery.slider.js",dependencies:["draggable"]},parser:{js:"jquery.parser.js"},mobile:{js:"jquery.mobile.js"}}; +var _2={"af":"easyui-lang-af.js","ar":"easyui-lang-ar.js","bg":"easyui-lang-bg.js","ca":"easyui-lang-ca.js","cs":"easyui-lang-cs.js","cz":"easyui-lang-cz.js","da":"easyui-lang-da.js","de":"easyui-lang-de.js","el":"easyui-lang-el.js","en":"easyui-lang-en.js","es":"easyui-lang-es.js","fr":"easyui-lang-fr.js","it":"easyui-lang-it.js","jp":"easyui-lang-jp.js","nl":"easyui-lang-nl.js","pl":"easyui-lang-pl.js","pt_BR":"easyui-lang-pt_BR.js","ru":"easyui-lang-ru.js","sv_SE":"easyui-lang-sv_SE.js","tr":"easyui-lang-tr.js","zh_CN":"easyui-lang-zh_CN.js","zh_TW":"easyui-lang-zh_TW.js"}; +var _3={}; +function _4(_5,_6){ +var _7=false; +var _8=document.createElement("script"); +_8.type="text/javascript"; +_8.language="javascript"; +_8.src=_5; +_8.onload=_8.onreadystatechange=function(){ +if(!_7&&(!_8.readyState||_8.readyState=="loaded"||_8.readyState=="complete")){ +_7=true; +_8.onload=_8.onreadystatechange=null; +if(_6){ +_6.call(_8); +} +} +}; +document.getElementsByTagName("head")[0].appendChild(_8); +}; +function _9(_a,_b){ +_4(_a,function(){ +document.getElementsByTagName("head")[0].removeChild(this); +if(_b){ +_b(); +} +}); +}; +function _c(_d,_e){ +var _f=document.createElement("link"); +_f.rel="stylesheet"; +_f.type="text/css"; +_f.media="screen"; +_f.href=_d; +document.getElementsByTagName("head")[0].appendChild(_f); +if(_e){ +_e.call(_f); +} +}; +function _10(_11,_12){ +_3[_11]="loading"; +var _13=_1[_11]; +var _14="loading"; +var _15=(easyloader.css&&_13["css"])?"loading":"loaded"; +if(easyloader.css&&_13["css"]){ +if(/^http/i.test(_13["css"])){ +var url=_13["css"]; +}else{ +var url=easyloader.base+"themes/"+easyloader.theme+"/"+_13["css"]; +} +_c(url,function(){ +_15="loaded"; +if(_14=="loaded"&&_15=="loaded"){ +_16(); +} +}); +} +if(/^http/i.test(_13["js"])){ +var url=_13["js"]; +}else{ +var url=easyloader.base+"plugins/"+_13["js"]; +} +_4(url,function(){ +_14="loaded"; +if(_14=="loaded"&&_15=="loaded"){ +_16(); +} +}); +function _16(){ +_3[_11]="loaded"; +easyloader.onProgress(_11); +if(_12){ +_12(); +} +}; +}; +function _17(_18,_19){ +var mm=[]; +var _1a=false; +if(typeof _18=="string"){ +add(_18); +}else{ +for(var i=0;i<_18.length;i++){ +add(_18[i]); +} +} +function add(_1b){ +if(!_1[_1b]){ +return; +} +var d=_1[_1b]["dependencies"]; +if(d){ +for(var i=0;i=0;i--){ +_9.unshift(_a.children[i]); +} +} +} +}}; +$.parser={auto:true,onComplete:function(_b){ +},plugins:["draggable","droppable","resizable","pagination","tooltip","linkbutton","menu","sidemenu","menubutton","splitbutton","switchbutton","progressbar","tree","textbox","passwordbox","maskedbox","filebox","combo","combobox","combotree","combogrid","combotreegrid","tagbox","numberbox","validatebox","searchbox","spinner","numberspinner","timespinner","datetimespinner","calendar","datebox","datetimebox","slider","layout","panel","datagrid","propertygrid","treegrid","datalist","tabs","accordion","window","dialog","form"],parse:function(_c){ +var aa=[]; +for(var i=0;i<$.parser.plugins.length;i++){ +var _d=$.parser.plugins[i]; +var r=$(".easyui-"+_d,_c); +if(r.length){ +if(r[_d]){ +r.each(function(){ +$(this)[_d]($.data(this,"options")||{}); +}); +}else{ +aa.push({name:_d,jq:r}); +} +} +} +if(aa.length&&window.easyloader){ +var _e=[]; +for(var i=0;i=0){ +v=Math.floor((_12.width()-_13)*v/100); +}else{ +v=Math.floor((_12.height()-_13)*v/100); +} +}else{ +v=parseInt(v)||undefined; +} +return v; +},parseOptions:function(_15,_16){ +var t=$(_15); +var _17={}; +var s=$.trim(t.attr("data-options")); +if(s){ +if(s.substring(0,1)!="{"){ +s="{"+s+"}"; +} +_17=(new Function("return "+s))(); +} +$.map(["width","height","left","top","minWidth","maxWidth","minHeight","maxHeight"],function(p){ +var pv=$.trim(_15.style[p]||""); +if(pv){ +if(pv.indexOf("%")==-1){ +pv=parseInt(pv); +if(isNaN(pv)){ +pv=undefined; +} +} +_17[p]=pv; +} +}); +if(_16){ +var _18={}; +for(var i=0;i<_16.length;i++){ +var pp=_16[i]; +if(typeof pp=="string"){ +_18[pp]=t.attr(pp); +}else{ +for(var _19 in pp){ +var _1a=pp[_19]; +if(_1a=="boolean"){ +_18[_19]=t.attr(_19)?(t.attr(_19)=="true"):undefined; +}else{ +if(_1a=="number"){ +_18[_19]=t.attr(_19)=="0"?0:parseFloat(t.attr(_19))||undefined; +} +} +} +} +} +$.extend(_17,_18); +} +return _17; +}}; +$(function(){ +var d=$("
                                    ").appendTo("body"); +$._boxModel=d.outerWidth()!=100; +d.remove(); +d=$("
                                    ").appendTo("body"); +$._positionFixed=(d.css("position")=="fixed"); +d.remove(); +if(!window.easyloader&&$.parser.auto){ +$.parser.parse(); +} +}); +$.fn._outerWidth=function(_1b){ +if(_1b==undefined){ +if(this[0]==window){ +return this.width()||document.body.clientWidth; +} +return this.outerWidth()||0; +} +return this._size("width",_1b); +}; +$.fn._outerHeight=function(_1c){ +if(_1c==undefined){ +if(this[0]==window){ +return this.height()||document.body.clientHeight; +} +return this.outerHeight()||0; +} +return this._size("height",_1c); +}; +$.fn._scrollLeft=function(_1d){ +if(_1d==undefined){ +return this.scrollLeft(); +}else{ +return this.each(function(){ +$(this).scrollLeft(_1d); +}); +} +}; +$.fn._propAttr=$.fn.prop||$.fn.attr; +$.fn._size=function(_1e,_1f){ +if(typeof _1e=="string"){ +if(_1e=="clear"){ +return this.each(function(){ +$(this).css({width:"",minWidth:"",maxWidth:"",height:"",minHeight:"",maxHeight:""}); +}); +}else{ +if(_1e=="fit"){ +return this.each(function(){ +_20(this,this.tagName=="BODY"?$("body"):$(this).parent(),true); +}); +}else{ +if(_1e=="unfit"){ +return this.each(function(){ +_20(this,$(this).parent(),false); +}); +}else{ +if(_1f==undefined){ +return _21(this[0],_1e); +}else{ +return this.each(function(){ +_21(this,_1e,_1f); +}); +} +} +} +} +}else{ +return this.each(function(){ +_1f=_1f||$(this).parent(); +$.extend(_1e,_20(this,_1f,_1e.fit)||{}); +var r1=_22(this,"width",_1f,_1e); +var r2=_22(this,"height",_1f,_1e); +if(r1||r2){ +$(this).addClass("easyui-fluid"); +}else{ +$(this).removeClass("easyui-fluid"); +} +}); +} +function _20(_23,_24,fit){ +if(!_24.length){ +return false; +} +var t=$(_23)[0]; +var p=_24[0]; +var _25=p.fcount||0; +if(fit){ +if(!t.fitted){ +t.fitted=true; +p.fcount=_25+1; +$(p).addClass("panel-noscroll"); +if(p.tagName=="BODY"){ +$("html").addClass("panel-fit"); +} +} +return {width:($(p).width()||1),height:($(p).height()||1)}; +}else{ +if(t.fitted){ +t.fitted=false; +p.fcount=_25-1; +if(p.fcount==0){ +$(p).removeClass("panel-noscroll"); +if(p.tagName=="BODY"){ +$("html").removeClass("panel-fit"); +} +} +} +return false; +} +}; +function _22(_26,_27,_28,_29){ +var t=$(_26); +var p=_27; +var p1=p.substr(0,1).toUpperCase()+p.substr(1); +var min=$.parser.parseValue("min"+p1,_29["min"+p1],_28); +var max=$.parser.parseValue("max"+p1,_29["max"+p1],_28); +var val=$.parser.parseValue(p,_29[p],_28); +var _2a=(String(_29[p]||"").indexOf("%")>=0?true:false); +if(!isNaN(val)){ +var v=Math.min(Math.max(val,min||0),max||99999); +if(!_2a){ +_29[p]=v; +} +t._size("min"+p1,""); +t._size("max"+p1,""); +t._size(p,v); +}else{ +t._size(p,""); +t._size("min"+p1,min); +t._size("max"+p1,max); +} +return _2a||_29.fit; +}; +function _21(_2b,_2c,_2d){ +var t=$(_2b); +if(_2d==undefined){ +_2d=parseInt(_2b.style[_2c]); +if(isNaN(_2d)){ +return undefined; +} +if($._boxModel){ +_2d+=_2e(); +} +return _2d; +}else{ +if(_2d===""){ +t.css(_2c,""); +}else{ +if($._boxModel){ +_2d-=_2e(); +if(_2d<0){ +_2d=0; +} +} +t.css(_2c,_2d+"px"); +} +} +function _2e(){ +if(_2c.toLowerCase().indexOf("width")>=0){ +return t.outerWidth()-t.width(); +}else{ +return t.outerHeight()-t.height(); +} +}; +}; +}; +})(jQuery); +(function($){ +var _2f=null; +var _30=null; +var _31=false; +function _32(e){ +if(e.touches.length!=1){ +return; +} +if(!_31){ +_31=true; +dblClickTimer=setTimeout(function(){ +_31=false; +},500); +}else{ +clearTimeout(dblClickTimer); +_31=false; +_33(e,"dblclick"); +} +_2f=setTimeout(function(){ +_33(e,"contextmenu",3); +},1000); +_33(e,"mousedown"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _34(e){ +if(e.touches.length!=1){ +return; +} +if(_2f){ +clearTimeout(_2f); +} +_33(e,"mousemove"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _35(e){ +if(_2f){ +clearTimeout(_2f); +} +_33(e,"mouseup"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _33(e,_36,_37){ +var _38=new $.Event(_36); +_38.pageX=e.changedTouches[0].pageX; +_38.pageY=e.changedTouches[0].pageY; +_38.which=_37||1; +$(e.target).trigger(_38); +}; +if(document.addEventListener){ +document.addEventListener("touchstart",_32,true); +document.addEventListener("touchmove",_34,true); +document.addEventListener("touchend",_35,true); +} +})(jQuery); +(function($){ +function _39(e){ +var _3a=$.data(e.data.target,"draggable"); +var _3b=_3a.options; +var _3c=_3a.proxy; +var _3d=e.data; +var _3e=_3d.startLeft+e.pageX-_3d.startX; +var top=_3d.startTop+e.pageY-_3d.startY; +if(_3c){ +if(_3c.parent()[0]==document.body){ +if(_3b.deltaX!=null&&_3b.deltaX!=undefined){ +_3e=e.pageX+_3b.deltaX; +}else{ +_3e=e.pageX-e.data.offsetWidth; +} +if(_3b.deltaY!=null&&_3b.deltaY!=undefined){ +top=e.pageY+_3b.deltaY; +}else{ +top=e.pageY-e.data.offsetHeight; +} +}else{ +if(_3b.deltaX!=null&&_3b.deltaX!=undefined){ +_3e+=e.data.offsetWidth+_3b.deltaX; +} +if(_3b.deltaY!=null&&_3b.deltaY!=undefined){ +top+=e.data.offsetHeight+_3b.deltaY; +} +} +} +if(e.data.parent!=document.body){ +_3e+=$(e.data.parent).scrollLeft(); +top+=$(e.data.parent).scrollTop(); +} +if(_3b.axis=="h"){ +_3d.left=_3e; +}else{ +if(_3b.axis=="v"){ +_3d.top=top; +}else{ +_3d.left=_3e; +_3d.top=top; +} +} +}; +function _3f(e){ +var _40=$.data(e.data.target,"draggable"); +var _41=_40.options; +var _42=_40.proxy; +if(!_42){ +_42=$(e.data.target); +} +_42.css({left:e.data.left,top:e.data.top}); +$("body").css("cursor",_41.cursor); +}; +function _43(e){ +if(!$.fn.draggable.isDragging){ +return false; +} +var _44=$.data(e.data.target,"draggable"); +var _45=_44.options; +var _46=$(".droppable:visible").filter(function(){ +return e.data.target!=this; +}).filter(function(){ +var _47=$.data(this,"droppable").options.accept; +if(_47){ +return $(_47).filter(function(){ +return this==e.data.target; +}).length>0; +}else{ +return true; +} +}); +_44.droppables=_46; +var _48=_44.proxy; +if(!_48){ +if(_45.proxy){ +if(_45.proxy=="clone"){ +_48=$(e.data.target).clone().insertAfter(e.data.target); +}else{ +_48=_45.proxy.call(e.data.target,e.data.target); +} +_44.proxy=_48; +}else{ +_48=$(e.data.target); +} +} +_48.css("position","absolute"); +_39(e); +_3f(e); +_45.onStartDrag.call(e.data.target,e); +return false; +}; +function _49(e){ +if(!$.fn.draggable.isDragging){ +return false; +} +var _4a=$.data(e.data.target,"draggable"); +_39(e); +if(_4a.options.onDrag.call(e.data.target,e)!=false){ +_3f(e); +} +var _4b=e.data.target; +_4a.droppables.each(function(){ +var _4c=$(this); +if(_4c.droppable("options").disabled){ +return; +} +var p2=_4c.offset(); +if(e.pageX>p2.left&&e.pageXp2.top&&e.pageYp2.left&&e.pageXp2.top&&e.pageY_62.options.edge; +}; +}); +}; +$.fn.draggable.methods={options:function(jq){ +return $.data(jq[0],"draggable").options; +},proxy:function(jq){ +return $.data(jq[0],"draggable").proxy; +},enable:function(jq){ +return jq.each(function(){ +$(this).draggable({disabled:false}); +}); +},disable:function(jq){ +return jq.each(function(){ +$(this).draggable({disabled:true}); +}); +}}; +$.fn.draggable.parseOptions=function(_67){ +var t=$(_67); +return $.extend({},$.parser.parseOptions(_67,["cursor","handle","axis",{"revert":"boolean","deltaX":"number","deltaY":"number","edge":"number","delay":"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); +}; +$.fn.draggable.defaults={proxy:null,revert:false,cursor:"move",deltaX:null,deltaY:null,handle:null,disabled:false,edge:0,axis:null,delay:100,onBeforeDrag:function(e){ +},onStartDrag:function(e){ +},onDrag:function(e){ +},onEndDrag:function(e){ +},onStopDrag:function(e){ +}}; +$.fn.draggable.isDragging=false; +})(jQuery); +(function($){ +function _68(_69){ +$(_69).addClass("droppable"); +$(_69).bind("_dragenter",function(e,_6a){ +$.data(_69,"droppable").options.onDragEnter.apply(_69,[e,_6a]); +}); +$(_69).bind("_dragleave",function(e,_6b){ +$.data(_69,"droppable").options.onDragLeave.apply(_69,[e,_6b]); +}); +$(_69).bind("_dragover",function(e,_6c){ +$.data(_69,"droppable").options.onDragOver.apply(_69,[e,_6c]); +}); +$(_69).bind("_drop",function(e,_6d){ +$.data(_69,"droppable").options.onDrop.apply(_69,[e,_6d]); +}); +}; +$.fn.droppable=function(_6e,_6f){ +if(typeof _6e=="string"){ +return $.fn.droppable.methods[_6e](this,_6f); +} +_6e=_6e||{}; +return this.each(function(){ +var _70=$.data(this,"droppable"); +if(_70){ +$.extend(_70.options,_6e); +}else{ +_68(this); +$.data(this,"droppable",{options:$.extend({},$.fn.droppable.defaults,$.fn.droppable.parseOptions(this),_6e)}); +} +}); +}; +$.fn.droppable.methods={options:function(jq){ +return $.data(jq[0],"droppable").options; +},enable:function(jq){ +return jq.each(function(){ +$(this).droppable({disabled:false}); +}); +},disable:function(jq){ +return jq.each(function(){ +$(this).droppable({disabled:true}); +}); +}}; +$.fn.droppable.parseOptions=function(_71){ +var t=$(_71); +return $.extend({},$.parser.parseOptions(_71,["accept"]),{disabled:(t.attr("disabled")?true:undefined)}); +}; +$.fn.droppable.defaults={accept:null,disabled:false,onDragEnter:function(e,_72){ +},onDragOver:function(e,_73){ +},onDragLeave:function(e,_74){ +},onDrop:function(e,_75){ +}}; +})(jQuery); +(function($){ +function _76(e){ +var _77=e.data; +var _78=$.data(_77.target,"resizable").options; +if(_77.dir.indexOf("e")!=-1){ +var _79=_77.startWidth+e.pageX-_77.startX; +_79=Math.min(Math.max(_79,_78.minWidth),_78.maxWidth); +_77.width=_79; +} +if(_77.dir.indexOf("s")!=-1){ +var _7a=_77.startHeight+e.pageY-_77.startY; +_7a=Math.min(Math.max(_7a,_78.minHeight),_78.maxHeight); +_77.height=_7a; +} +if(_77.dir.indexOf("w")!=-1){ +var _79=_77.startWidth-e.pageX+_77.startX; +_79=Math.min(Math.max(_79,_78.minWidth),_78.maxWidth); +_77.width=_79; +_77.left=_77.startLeft+_77.startWidth-_77.width; +} +if(_77.dir.indexOf("n")!=-1){ +var _7a=_77.startHeight-e.pageY+_77.startY; +_7a=Math.min(Math.max(_7a,_78.minHeight),_78.maxHeight); +_77.height=_7a; +_77.top=_77.startTop+_77.startHeight-_77.height; +} +}; +function _7b(e){ +var _7c=e.data; +var t=$(_7c.target); +t.css({left:_7c.left,top:_7c.top}); +if(t.outerWidth()!=_7c.width){ +t._outerWidth(_7c.width); +} +if(t.outerHeight()!=_7c.height){ +t._outerHeight(_7c.height); +} +}; +function _7d(e){ +$.fn.resizable.isResizing=true; +$.data(e.data.target,"resizable").options.onStartResize.call(e.data.target,e); +return false; +}; +function _7e(e){ +_76(e); +if($.data(e.data.target,"resizable").options.onResize.call(e.data.target,e)!=false){ +_7b(e); +} +return false; +}; +function _7f(e){ +$.fn.resizable.isResizing=false; +_76(e,true); +_7b(e); +$.data(e.data.target,"resizable").options.onStopResize.call(e.data.target,e); +$(document).unbind(".resizable"); +$("body").css("cursor",""); +return false; +}; +function _80(e){ +var _81=$(e.data.target).resizable("options"); +var tt=$(e.data.target); +var dir=""; +var _82=tt.offset(); +var _83=tt.outerWidth(); +var _84=tt.outerHeight(); +var _85=_81.edge; +if(e.pageY>_82.top&&e.pageY<_82.top+_85){ +dir+="n"; +}else{ +if(e.pageY<_82.top+_84&&e.pageY>_82.top+_84-_85){ +dir+="s"; +} +} +if(e.pageX>_82.left&&e.pageX<_82.left+_85){ +dir+="w"; +}else{ +if(e.pageX<_82.left+_83&&e.pageX>_82.left+_83-_85){ +dir+="e"; +} +} +var _86=_81.handles.split(","); +_86=$.map(_86,function(h){ +return $.trim(h).toLowerCase(); +}); +if($.inArray("all",_86)>=0||$.inArray(dir,_86)>=0){ +return dir; +} +for(var i=0;i=0){ +return _86[_87]; +} +} +return ""; +}; +$.fn.resizable=function(_88,_89){ +if(typeof _88=="string"){ +return $.fn.resizable.methods[_88](this,_89); +} +return this.each(function(){ +var _8a=null; +var _8b=$.data(this,"resizable"); +if(_8b){ +$(this).unbind(".resizable"); +_8a=$.extend(_8b.options,_88||{}); +}else{ +_8a=$.extend({},$.fn.resizable.defaults,$.fn.resizable.parseOptions(this),_88||{}); +$.data(this,"resizable",{options:_8a}); +} +if(_8a.disabled==true){ +return; +} +$(this).bind("mousemove.resizable",{target:this},function(e){ +if($.fn.resizable.isResizing){ +return; +} +var dir=_80(e); +$(e.data.target).css("cursor",dir?dir+"-resize":""); +}).bind("mouseleave.resizable",{target:this},function(e){ +$(e.data.target).css("cursor",""); +}).bind("mousedown.resizable",{target:this},function(e){ +var dir=_80(e); +if(dir==""){ +return; +} +function _8c(css){ +var val=parseInt($(e.data.target).css(css)); +if(isNaN(val)){ +return 0; +}else{ +return val; +} +}; +var _8d={target:e.data.target,dir:dir,startLeft:_8c("left"),startTop:_8c("top"),left:_8c("left"),top:_8c("top"),startX:e.pageX,startY:e.pageY,startWidth:$(e.data.target).outerWidth(),startHeight:$(e.data.target).outerHeight(),width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),deltaWidth:$(e.data.target).outerWidth()-$(e.data.target).width(),deltaHeight:$(e.data.target).outerHeight()-$(e.data.target).height()}; +$(document).bind("mousedown.resizable",_8d,_7d); +$(document).bind("mousemove.resizable",_8d,_7e); +$(document).bind("mouseup.resizable",_8d,_7f); +$("body").css("cursor",dir+"-resize"); +}); +}); +}; +$.fn.resizable.methods={options:function(jq){ +return $.data(jq[0],"resizable").options; +},enable:function(jq){ +return jq.each(function(){ +$(this).resizable({disabled:false}); +}); +},disable:function(jq){ +return jq.each(function(){ +$(this).resizable({disabled:true}); +}); +}}; +$.fn.resizable.parseOptions=function(_8e){ +var t=$(_8e); +return $.extend({},$.parser.parseOptions(_8e,["handles",{minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number",edge:"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); +}; +$.fn.resizable.defaults={disabled:false,handles:"n, e, s, w, ne, se, sw, nw, all",minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000,edge:5,onStartResize:function(e){ +},onResize:function(e){ +},onStopResize:function(e){ +}}; +$.fn.resizable.isResizing=false; +})(jQuery); +(function($){ +function _8f(_90,_91){ +var _92=$.data(_90,"linkbutton").options; +if(_91){ +$.extend(_92,_91); +} +if(_92.width||_92.height||_92.fit){ +var btn=$(_90); +var _93=btn.parent(); +var _94=btn.is(":visible"); +if(!_94){ +var _95=$("
                                    ").insertBefore(_90); +var _96={position:btn.css("position"),display:btn.css("display"),left:btn.css("left")}; +btn.appendTo("body"); +btn.css({position:"absolute",display:"inline-block",left:-20000}); +} +btn._size(_92,_93); +var _97=btn.find(".l-btn-left"); +_97.css("margin-top",0); +_97.css("margin-top",parseInt((btn.height()-_97.height())/2)+"px"); +if(!_94){ +btn.insertAfter(_95); +btn.css(_96); +_95.remove(); +} +} +}; +function _98(_99){ +var _9a=$.data(_99,"linkbutton").options; +var t=$(_99).empty(); +t.addClass("l-btn").removeClass("l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline"); +t.removeClass("l-btn-small l-btn-medium l-btn-large").addClass("l-btn-"+_9a.size); +if(_9a.plain){ +t.addClass("l-btn-plain"); +} +if(_9a.outline){ +t.addClass("l-btn-outline"); +} +if(_9a.selected){ +t.addClass(_9a.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); +} +t.attr("group",_9a.group||""); +t.attr("id",_9a.id||""); +var _9b=$("").appendTo(t); +if(_9a.text){ +$("").html(_9a.text).appendTo(_9b); +}else{ +$(" ").appendTo(_9b); +} +if(_9a.iconCls){ +$(" ").addClass(_9a.iconCls).appendTo(_9b); +_9b.addClass("l-btn-icon-"+_9a.iconAlign); +} +t.unbind(".linkbutton").bind("focus.linkbutton",function(){ +if(!_9a.disabled){ +$(this).addClass("l-btn-focus"); +} +}).bind("blur.linkbutton",function(){ +$(this).removeClass("l-btn-focus"); +}).bind("click.linkbutton",function(){ +if(!_9a.disabled){ +if(_9a.toggle){ +if(_9a.selected){ +$(this).linkbutton("unselect"); +}else{ +$(this).linkbutton("select"); +} +} +_9a.onClick.call(this); +} +}); +_9c(_99,_9a.selected); +_9d(_99,_9a.disabled); +}; +function _9c(_9e,_9f){ +var _a0=$.data(_9e,"linkbutton").options; +if(_9f){ +if(_a0.group){ +$("a.l-btn[group=\""+_a0.group+"\"]").each(function(){ +var o=$(this).linkbutton("options"); +if(o.toggle){ +$(this).removeClass("l-btn-selected l-btn-plain-selected"); +o.selected=false; +} +}); +} +$(_9e).addClass(_a0.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); +_a0.selected=true; +}else{ +if(!_a0.group){ +$(_9e).removeClass("l-btn-selected l-btn-plain-selected"); +_a0.selected=false; +} +} +}; +function _9d(_a1,_a2){ +var _a3=$.data(_a1,"linkbutton"); +var _a4=_a3.options; +$(_a1).removeClass("l-btn-disabled l-btn-plain-disabled"); +if(_a2){ +_a4.disabled=true; +var _a5=$(_a1).attr("href"); +if(_a5){ +_a3.href=_a5; +$(_a1).attr("href","javascript:;"); +} +if(_a1.onclick){ +_a3.onclick=_a1.onclick; +_a1.onclick=null; +} +_a4.plain?$(_a1).addClass("l-btn-disabled l-btn-plain-disabled"):$(_a1).addClass("l-btn-disabled"); +}else{ +_a4.disabled=false; +if(_a3.href){ +$(_a1).attr("href",_a3.href); +} +if(_a3.onclick){ +_a1.onclick=_a3.onclick; +} +} +}; +$.fn.linkbutton=function(_a6,_a7){ +if(typeof _a6=="string"){ +return $.fn.linkbutton.methods[_a6](this,_a7); +} +_a6=_a6||{}; +return this.each(function(){ +var _a8=$.data(this,"linkbutton"); +if(_a8){ +$.extend(_a8.options,_a6); +}else{ +$.data(this,"linkbutton",{options:$.extend({},$.fn.linkbutton.defaults,$.fn.linkbutton.parseOptions(this),_a6)}); +$(this)._propAttr("disabled",false); +$(this).bind("_resize",function(e,_a9){ +if($(this).hasClass("easyui-fluid")||_a9){ +_8f(this); +} +return false; +}); +} +_98(this); +_8f(this); +}); +}; +$.fn.linkbutton.methods={options:function(jq){ +return $.data(jq[0],"linkbutton").options; +},resize:function(jq,_aa){ +return jq.each(function(){ +_8f(this,_aa); +}); +},enable:function(jq){ +return jq.each(function(){ +_9d(this,false); +}); +},disable:function(jq){ +return jq.each(function(){ +_9d(this,true); +}); +},select:function(jq){ +return jq.each(function(){ +_9c(this,true); +}); +},unselect:function(jq){ +return jq.each(function(){ +_9c(this,false); +}); +}}; +$.fn.linkbutton.parseOptions=function(_ab){ +var t=$(_ab); +return $.extend({},$.parser.parseOptions(_ab,["id","iconCls","iconAlign","group","size","text",{plain:"boolean",toggle:"boolean",selected:"boolean",outline:"boolean"}]),{disabled:(t.attr("disabled")?true:undefined),text:($.trim(t.html())||undefined),iconCls:(t.attr("icon")||t.attr("iconCls"))}); +}; +$.fn.linkbutton.defaults={id:null,disabled:false,toggle:false,selected:false,outline:false,group:null,plain:false,text:"",iconCls:null,iconAlign:"left",size:"small",onClick:function(){ +}}; +})(jQuery); +(function($){ +function _ac(_ad){ +var _ae=$.data(_ad,"pagination"); +var _af=_ae.options; +var bb=_ae.bb={}; +var _b0=$(_ad).addClass("pagination").html("
                                    "); +var tr=_b0.find("tr"); +var aa=$.extend([],_af.layout); +if(!_af.showPageList){ +_b1(aa,"list"); +} +if(!_af.showPageInfo){ +_b1(aa,"info"); +} +if(!_af.showRefresh){ +_b1(aa,"refresh"); +} +if(aa[0]=="sep"){ +aa.shift(); +} +if(aa[aa.length-1]=="sep"){ +aa.pop(); +} +for(var _b2=0;_b2"); +ps.bind("change",function(){ +_af.pageSize=parseInt($(this).val()); +_af.onChangePageSize.call(_ad,_af.pageSize); +_b9(_ad,_af.pageNumber); +}); +for(var i=0;i<_af.pageList.length;i++){ +$("").text(_af.pageList[i]).appendTo(ps); +} +$("").append(ps).appendTo(tr); +}else{ +if(_b3=="sep"){ +$("
                                    ").appendTo(tr); +}else{ +if(_b3=="first"){ +bb.first=_b4("first"); +}else{ +if(_b3=="prev"){ +bb.prev=_b4("prev"); +}else{ +if(_b3=="next"){ +bb.next=_b4("next"); +}else{ +if(_b3=="last"){ +bb.last=_b4("last"); +}else{ +if(_b3=="manual"){ +$("").html(_af.beforePageText).appendTo(tr).wrap(""); +bb.num=$("").appendTo(tr).wrap(""); +bb.num.unbind(".pagination").bind("keydown.pagination",function(e){ +if(e.keyCode==13){ +var _b5=parseInt($(this).val())||1; +_b9(_ad,_b5); +return false; +} +}); +bb.after=$("").appendTo(tr).wrap(""); +}else{ +if(_b3=="refresh"){ +bb.refresh=_b4("refresh"); +}else{ +if(_b3=="links"){ +$("").appendTo(tr); +}else{ +if(_b3=="info"){ +if(_b2==aa.length-1){ +$("
                                    ").appendTo(_b0); +}else{ +$("
                                    ").appendTo(tr); +} +} +} +} +} +} +} +} +} +} +} +} +if(_af.buttons){ +$("
                                    ").appendTo(tr); +if($.isArray(_af.buttons)){ +for(var i=0;i<_af.buttons.length;i++){ +var btn=_af.buttons[i]; +if(btn=="-"){ +$("
                                    ").appendTo(tr); +}else{ +var td=$("").appendTo(tr); +var a=$("").appendTo(td); +a[0].onclick=eval(btn.handler||function(){ +}); +a.linkbutton($.extend({},btn,{plain:true})); +} +} +}else{ +var td=$("").appendTo(tr); +$(_af.buttons).appendTo(td).show(); +} +} +$("
                                    ").appendTo(_b0); +function _b4(_b6){ +var btn=_af.nav[_b6]; +var a=$("").appendTo(tr); +a.wrap(""); +a.linkbutton({iconCls:btn.iconCls,plain:true}).unbind(".pagination").bind("click.pagination",function(){ +btn.handler.call(_ad); +}); +return a; +}; +function _b1(aa,_b7){ +var _b8=$.inArray(_b7,aa); +if(_b8>=0){ +aa.splice(_b8,1); +} +return aa; +}; +}; +function _b9(_ba,_bb){ +var _bc=$.data(_ba,"pagination").options; +_bd(_ba,{pageNumber:_bb}); +_bc.onSelectPage.call(_ba,_bc.pageNumber,_bc.pageSize); +}; +function _bd(_be,_bf){ +var _c0=$.data(_be,"pagination"); +var _c1=_c0.options; +var bb=_c0.bb; +$.extend(_c1,_bf||{}); +var ps=$(_be).find("select.pagination-page-list"); +if(ps.length){ +ps.val(_c1.pageSize+""); +_c1.pageSize=parseInt(ps.val()); +} +var _c2=Math.ceil(_c1.total/_c1.pageSize)||1; +if(_c1.pageNumber<1){ +_c1.pageNumber=1; +} +if(_c1.pageNumber>_c2){ +_c1.pageNumber=_c2; +} +if(_c1.total==0){ +_c1.pageNumber=0; +_c2=0; +} +if(bb.num){ +bb.num.val(_c1.pageNumber); +} +if(bb.after){ +bb.after.html(_c1.afterPageText.replace(/{pages}/,_c2)); +} +var td=$(_be).find("td.pagination-links"); +if(td.length){ +td.empty(); +var _c3=_c1.pageNumber-Math.floor(_c1.links/2); +if(_c3<1){ +_c3=1; +} +var _c4=_c3+_c1.links-1; +if(_c4>_c2){ +_c4=_c2; +} +_c3=_c4-_c1.links+1; +if(_c3<1){ +_c3=1; +} +for(var i=_c3;i<=_c4;i++){ +var a=$("").appendTo(td); +a.linkbutton({plain:true,text:i}); +if(i==_c1.pageNumber){ +a.linkbutton("select"); +}else{ +a.unbind(".pagination").bind("click.pagination",{pageNumber:i},function(e){ +_b9(_be,e.data.pageNumber); +}); +} +} +} +var _c5=_c1.displayMsg; +_c5=_c5.replace(/{from}/,_c1.total==0?0:_c1.pageSize*(_c1.pageNumber-1)+1); +_c5=_c5.replace(/{to}/,Math.min(_c1.pageSize*(_c1.pageNumber),_c1.total)); +_c5=_c5.replace(/{total}/,_c1.total); +$(_be).find("div.pagination-info").html(_c5); +if(bb.first){ +bb.first.linkbutton({disabled:((!_c1.total)||_c1.pageNumber==1)}); +} +if(bb.prev){ +bb.prev.linkbutton({disabled:((!_c1.total)||_c1.pageNumber==1)}); +} +if(bb.next){ +bb.next.linkbutton({disabled:(_c1.pageNumber==_c2)}); +} +if(bb.last){ +bb.last.linkbutton({disabled:(_c1.pageNumber==_c2)}); +} +_c6(_be,_c1.loading); +}; +function _c6(_c7,_c8){ +var _c9=$.data(_c7,"pagination"); +var _ca=_c9.options; +_ca.loading=_c8; +if(_ca.showRefresh&&_c9.bb.refresh){ +_c9.bb.refresh.linkbutton({iconCls:(_ca.loading?"pagination-loading":"pagination-load")}); +} +}; +$.fn.pagination=function(_cb,_cc){ +if(typeof _cb=="string"){ +return $.fn.pagination.methods[_cb](this,_cc); +} +_cb=_cb||{}; +return this.each(function(){ +var _cd; +var _ce=$.data(this,"pagination"); +if(_ce){ +_cd=$.extend(_ce.options,_cb); +}else{ +_cd=$.extend({},$.fn.pagination.defaults,$.fn.pagination.parseOptions(this),_cb); +$.data(this,"pagination",{options:_cd}); +} +_ac(this); +_bd(this); +}); +}; +$.fn.pagination.methods={options:function(jq){ +return $.data(jq[0],"pagination").options; +},loading:function(jq){ +return jq.each(function(){ +_c6(this,true); +}); +},loaded:function(jq){ +return jq.each(function(){ +_c6(this,false); +}); +},refresh:function(jq,_cf){ +return jq.each(function(){ +_bd(this,_cf); +}); +},select:function(jq,_d0){ +return jq.each(function(){ +_b9(this,_d0); +}); +}}; +$.fn.pagination.parseOptions=function(_d1){ +var t=$(_d1); +return $.extend({},$.parser.parseOptions(_d1,[{total:"number",pageSize:"number",pageNumber:"number",links:"number"},{loading:"boolean",showPageList:"boolean",showPageInfo:"boolean",showRefresh:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined)}); +}; +$.fn.pagination.defaults={total:1,pageSize:10,pageNumber:1,pageList:[10,20,30,50],loading:false,buttons:null,showPageList:true,showPageInfo:true,showRefresh:true,links:10,layout:["list","sep","first","prev","sep","manual","sep","next","last","sep","refresh","info"],onSelectPage:function(_d2,_d3){ +},onBeforeRefresh:function(_d4,_d5){ +},onRefresh:function(_d6,_d7){ +},onChangePageSize:function(_d8){ +},beforePageText:"Page",afterPageText:"of {pages}",displayMsg:"Displaying {from} to {to} of {total} items",nav:{first:{iconCls:"pagination-first",handler:function(){ +var _d9=$(this).pagination("options"); +if(_d9.pageNumber>1){ +$(this).pagination("select",1); +} +}},prev:{iconCls:"pagination-prev",handler:function(){ +var _da=$(this).pagination("options"); +if(_da.pageNumber>1){ +$(this).pagination("select",_da.pageNumber-1); +} +}},next:{iconCls:"pagination-next",handler:function(){ +var _db=$(this).pagination("options"); +var _dc=Math.ceil(_db.total/_db.pageSize); +if(_db.pageNumber<_dc){ +$(this).pagination("select",_db.pageNumber+1); +} +}},last:{iconCls:"pagination-last",handler:function(){ +var _dd=$(this).pagination("options"); +var _de=Math.ceil(_dd.total/_dd.pageSize); +if(_dd.pageNumber<_de){ +$(this).pagination("select",_de); +} +}},refresh:{iconCls:"pagination-refresh",handler:function(){ +var _df=$(this).pagination("options"); +if(_df.onBeforeRefresh.call(this,_df.pageNumber,_df.pageSize)!=false){ +$(this).pagination("select",_df.pageNumber); +_df.onRefresh.call(this,_df.pageNumber,_df.pageSize); +} +}}}}; +})(jQuery); +(function($){ +function _e0(_e1){ +var _e2=$(_e1); +_e2.addClass("tree"); +return _e2; +}; +function _e3(_e4){ +var _e5=$.data(_e4,"tree").options; +$(_e4).unbind().bind("mouseover",function(e){ +var tt=$(e.target); +var _e6=tt.closest("div.tree-node"); +if(!_e6.length){ +return; +} +_e6.addClass("tree-node-hover"); +if(tt.hasClass("tree-hit")){ +if(tt.hasClass("tree-expanded")){ +tt.addClass("tree-expanded-hover"); +}else{ +tt.addClass("tree-collapsed-hover"); +} +} +e.stopPropagation(); +}).bind("mouseout",function(e){ +var tt=$(e.target); +var _e7=tt.closest("div.tree-node"); +if(!_e7.length){ +return; +} +_e7.removeClass("tree-node-hover"); +if(tt.hasClass("tree-hit")){ +if(tt.hasClass("tree-expanded")){ +tt.removeClass("tree-expanded-hover"); +}else{ +tt.removeClass("tree-collapsed-hover"); +} +} +e.stopPropagation(); +}).bind("click",function(e){ +var tt=$(e.target); +var _e8=tt.closest("div.tree-node"); +if(!_e8.length){ +return; +} +if(tt.hasClass("tree-hit")){ +_146(_e4,_e8[0]); +return false; +}else{ +if(tt.hasClass("tree-checkbox")){ +_10d(_e4,_e8[0]); +return false; +}else{ +_189(_e4,_e8[0]); +_e5.onClick.call(_e4,_eb(_e4,_e8[0])); +} +} +e.stopPropagation(); +}).bind("dblclick",function(e){ +var _e9=$(e.target).closest("div.tree-node"); +if(!_e9.length){ +return; +} +_189(_e4,_e9[0]); +_e5.onDblClick.call(_e4,_eb(_e4,_e9[0])); +e.stopPropagation(); +}).bind("contextmenu",function(e){ +var _ea=$(e.target).closest("div.tree-node"); +if(!_ea.length){ +return; +} +_e5.onContextMenu.call(_e4,e,_eb(_e4,_ea[0])); +e.stopPropagation(); +}); +}; +function _ec(_ed){ +var _ee=$.data(_ed,"tree").options; +_ee.dnd=false; +var _ef=$(_ed).find("div.tree-node"); +_ef.draggable("disable"); +_ef.css("cursor","pointer"); +}; +function _f0(_f1){ +var _f2=$.data(_f1,"tree"); +var _f3=_f2.options; +var _f4=_f2.tree; +_f2.disabledNodes=[]; +_f3.dnd=true; +_f4.find("div.tree-node").draggable({disabled:false,revert:true,cursor:"pointer",proxy:function(_f5){ +var p=$("
                                    ").appendTo("body"); +p.html(" "+$(_f5).find(".tree-title").html()); +p.hide(); +return p; +},deltaX:15,deltaY:15,onBeforeDrag:function(e){ +if(_f3.onBeforeDrag.call(_f1,_eb(_f1,this))==false){ +return false; +} +if($(e.target).hasClass("tree-hit")||$(e.target).hasClass("tree-checkbox")){ +return false; +} +if(e.which!=1){ +return false; +} +var _f6=$(this).find("span.tree-indent"); +if(_f6.length){ +e.data.offsetWidth-=_f6.length*_f6.width(); +} +},onStartDrag:function(e){ +$(this).next("ul").find("div.tree-node").each(function(){ +$(this).droppable("disable"); +_f2.disabledNodes.push(this); +}); +$(this).draggable("proxy").css({left:-10000,top:-10000}); +_f3.onStartDrag.call(_f1,_eb(_f1,this)); +var _f7=_eb(_f1,this); +if(_f7.id==undefined){ +_f7.id="easyui_tree_node_id_temp"; +_12d(_f1,_f7); +} +_f2.draggingNodeId=_f7.id; +},onDrag:function(e){ +var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY; +var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); +if(d>3){ +$(this).draggable("proxy").show(); +} +this.pageY=e.pageY; +},onStopDrag:function(){ +for(var i=0;i<_f2.disabledNodes.length;i++){ +$(_f2.disabledNodes[i]).droppable("enable"); +} +_f2.disabledNodes=[]; +var _f8=_183(_f1,_f2.draggingNodeId); +if(_f8&&_f8.id=="easyui_tree_node_id_temp"){ +_f8.id=""; +_12d(_f1,_f8); +} +_f3.onStopDrag.call(_f1,_f8); +}}).droppable({accept:"div.tree-node",onDragEnter:function(e,_f9){ +if(_f3.onDragEnter.call(_f1,this,_fa(_f9))==false){ +_fb(_f9,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +$(this).droppable("disable"); +_f2.disabledNodes.push(this); +} +},onDragOver:function(e,_fc){ +if($(this).droppable("options").disabled){ +return; +} +var _fd=_fc.pageY; +var top=$(this).offset().top; +var _fe=top+$(this).outerHeight(); +_fb(_fc,true); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +if(_fd>top+(_fe-top)/2){ +if(_fe-_fd<5){ +$(this).addClass("tree-node-bottom"); +}else{ +$(this).addClass("tree-node-append"); +} +}else{ +if(_fd-top<5){ +$(this).addClass("tree-node-top"); +}else{ +$(this).addClass("tree-node-append"); +} +} +if(_f3.onDragOver.call(_f1,this,_fa(_fc))==false){ +_fb(_fc,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +$(this).droppable("disable"); +_f2.disabledNodes.push(this); +} +},onDragLeave:function(e,_ff){ +_fb(_ff,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +_f3.onDragLeave.call(_f1,this,_fa(_ff)); +},onDrop:function(e,_100){ +var dest=this; +var _101,_102; +if($(this).hasClass("tree-node-append")){ +_101=_103; +_102="append"; +}else{ +_101=_104; +_102=$(this).hasClass("tree-node-top")?"top":"bottom"; +} +if(_f3.onBeforeDrop.call(_f1,dest,_fa(_100),_102)==false){ +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +return; +} +_101(_100,dest,_102); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +}}); +function _fa(_105,pop){ +return $(_105).closest("ul.tree").tree(pop?"pop":"getData",_105); +}; +function _fb(_106,_107){ +var icon=$(_106).draggable("proxy").find("span.tree-dnd-icon"); +icon.removeClass("tree-dnd-yes tree-dnd-no").addClass(_107?"tree-dnd-yes":"tree-dnd-no"); +}; +function _103(_108,dest){ +if(_eb(_f1,dest).state=="closed"){ +_13e(_f1,dest,function(){ +_109(); +}); +}else{ +_109(); +} +function _109(){ +var node=_fa(_108,true); +$(_f1).tree("append",{parent:dest,data:[node]}); +_f3.onDrop.call(_f1,dest,node,"append"); +}; +}; +function _104(_10a,dest,_10b){ +var _10c={}; +if(_10b=="top"){ +_10c.before=dest; +}else{ +_10c.after=dest; +} +var node=_fa(_10a,true); +_10c.data=node; +$(_f1).tree("insert",_10c); +_f3.onDrop.call(_f1,dest,node,_10b); +}; +}; +function _10d(_10e,_10f,_110,_111){ +var _112=$.data(_10e,"tree"); +var opts=_112.options; +if(!opts.checkbox){ +return; +} +var _113=_eb(_10e,_10f); +if(!_113.checkState){ +return; +} +var ck=$(_10f).find(".tree-checkbox"); +if(_110==undefined){ +if(ck.hasClass("tree-checkbox1")){ +_110=false; +}else{ +if(ck.hasClass("tree-checkbox0")){ +_110=true; +}else{ +if(_113._checked==undefined){ +_113._checked=$(_10f).find(".tree-checkbox").hasClass("tree-checkbox1"); +} +_110=!_113._checked; +} +} +} +_113._checked=_110; +if(_110){ +if(ck.hasClass("tree-checkbox1")){ +return; +} +}else{ +if(ck.hasClass("tree-checkbox0")){ +return; +} +} +if(!_111){ +if(opts.onBeforeCheck.call(_10e,_113,_110)==false){ +return; +} +} +if(opts.cascadeCheck){ +_114(_10e,_113,_110); +_115(_10e,_113); +}else{ +_116(_10e,_113,_110?"1":"0"); +} +if(!_111){ +opts.onCheck.call(_10e,_113,_110); +} +}; +function _114(_117,_118,_119){ +var opts=$.data(_117,"tree").options; +var flag=_119?1:0; +_116(_117,_118,flag); +if(opts.deepCheck){ +$.easyui.forEach(_118.children||[],true,function(n){ +_116(_117,n,flag); +}); +}else{ +var _11a=[]; +if(_118.children&&_118.children.length){ +_11a.push(_118); +} +$.easyui.forEach(_118.children||[],true,function(n){ +if(!n.hidden){ +_116(_117,n,flag); +if(n.children&&n.children.length){ +_11a.push(n); +} +} +}); +for(var i=_11a.length-1;i>=0;i--){ +var node=_11a[i]; +_116(_117,node,_11b(node)); +} +} +}; +function _116(_11c,_11d,flag){ +var opts=$.data(_11c,"tree").options; +if(!_11d.checkState||flag==undefined){ +return; +} +if(_11d.hidden&&!opts.deepCheck){ +return; +} +var ck=$("#"+_11d.domId).find(".tree-checkbox"); +_11d.checkState=["unchecked","checked","indeterminate"][flag]; +_11d.checked=(_11d.checkState=="checked"); +ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); +ck.addClass("tree-checkbox"+flag); +}; +function _115(_11e,_11f){ +var pd=_120(_11e,$("#"+_11f.domId)[0]); +if(pd){ +_116(_11e,pd,_11b(pd)); +_115(_11e,pd); +} +}; +function _11b(row){ +var c0=0; +var c1=0; +var len=0; +$.easyui.forEach(row.children||[],false,function(r){ +if(r.checkState){ +len++; +if(r.checkState=="checked"){ +c1++; +}else{ +if(r.checkState=="unchecked"){ +c0++; +} +} +} +}); +if(len==0){ +return undefined; +} +var flag=0; +if(c0==len){ +flag=0; +}else{ +if(c1==len){ +flag=1; +}else{ +flag=2; +} +} +return flag; +}; +function _121(_122,_123){ +var opts=$.data(_122,"tree").options; +if(!opts.checkbox){ +return; +} +var node=$(_123); +var ck=node.find(".tree-checkbox"); +var _124=_eb(_122,_123); +if(opts.view.hasCheckbox(_122,_124)){ +if(!ck.length){ +_124.checkState=_124.checkState||"unchecked"; +$("").insertBefore(node.find(".tree-title")); +} +if(_124.checkState=="checked"){ +_10d(_122,_123,true,true); +}else{ +if(_124.checkState=="unchecked"){ +_10d(_122,_123,false,true); +}else{ +var flag=_11b(_124); +if(flag===0){ +_10d(_122,_123,false,true); +}else{ +if(flag===1){ +_10d(_122,_123,true,true); +} +} +} +} +}else{ +ck.remove(); +_124.checkState=undefined; +_124.checked=undefined; +_115(_122,_124); +} +}; +function _125(_126,ul,data,_127,_128){ +var _129=$.data(_126,"tree"); +var opts=_129.options; +var _12a=$(ul).prevAll("div.tree-node:first"); +data=opts.loadFilter.call(_126,data,_12a[0]); +var _12b=_12c(_126,"domId",_12a.attr("id")); +if(!_127){ +_12b?_12b.children=data:_129.data=data; +$(ul).empty(); +}else{ +if(_12b){ +_12b.children?_12b.children=_12b.children.concat(data):_12b.children=data; +}else{ +_129.data=_129.data.concat(data); +} +} +opts.view.render.call(opts.view,_126,ul,data); +if(opts.dnd){ +_f0(_126); +} +if(_12b){ +_12d(_126,_12b); +} +for(var i=0;i<_129.tmpIds.length;i++){ +_10d(_126,$("#"+_129.tmpIds[i])[0],true,true); +} +_129.tmpIds=[]; +setTimeout(function(){ +_12e(_126,_126); +},0); +if(!_128){ +opts.onLoadSuccess.call(_126,_12b,data); +} +}; +function _12e(_12f,ul,_130){ +var opts=$.data(_12f,"tree").options; +if(opts.lines){ +$(_12f).addClass("tree-lines"); +}else{ +$(_12f).removeClass("tree-lines"); +return; +} +if(!_130){ +_130=true; +$(_12f).find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); +$(_12f).find("div.tree-node").removeClass("tree-node-last tree-root-first tree-root-one"); +var _131=$(_12f).tree("getRoots"); +if(_131.length>1){ +$(_131[0].target).addClass("tree-root-first"); +}else{ +if(_131.length==1){ +$(_131[0].target).addClass("tree-root-one"); +} +} +} +$(ul).children("li").each(function(){ +var node=$(this).children("div.tree-node"); +var ul=node.next("ul"); +if(ul.length){ +if($(this).next().length){ +_132(node); +} +_12e(_12f,ul,_130); +}else{ +_133(node); +} +}); +var _134=$(ul).children("li:last").children("div.tree-node").addClass("tree-node-last"); +_134.children("span.tree-join").removeClass("tree-join").addClass("tree-joinbottom"); +function _133(node,_135){ +var icon=node.find("span.tree-icon"); +icon.prev("span.tree-indent").addClass("tree-join"); +}; +function _132(node){ +var _136=node.find("span.tree-indent, span.tree-hit").length; +node.next().find("div.tree-node").each(function(){ +$(this).children("span:eq("+(_136-1)+")").addClass("tree-line"); +}); +}; +}; +function _137(_138,ul,_139,_13a){ +var opts=$.data(_138,"tree").options; +_139=$.extend({},opts.queryParams,_139||{}); +var _13b=null; +if(_138!=ul){ +var node=$(ul).prev(); +_13b=_eb(_138,node[0]); +} +if(opts.onBeforeLoad.call(_138,_13b,_139)==false){ +return; +} +var _13c=$(ul).prev().children("span.tree-folder"); +_13c.addClass("tree-loading"); +var _13d=opts.loader.call(_138,_139,function(data){ +_13c.removeClass("tree-loading"); +_125(_138,ul,data); +if(_13a){ +_13a(); +} +},function(){ +_13c.removeClass("tree-loading"); +opts.onLoadError.apply(_138,arguments); +if(_13a){ +_13a(); +} +}); +if(_13d==false){ +_13c.removeClass("tree-loading"); +} +}; +function _13e(_13f,_140,_141){ +var opts=$.data(_13f,"tree").options; +var hit=$(_140).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +return; +} +var node=_eb(_13f,_140); +if(opts.onBeforeExpand.call(_13f,node)==false){ +return; +} +hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); +hit.next().addClass("tree-folder-open"); +var ul=$(_140).next(); +if(ul.length){ +if(opts.animate){ +ul.slideDown("normal",function(){ +node.state="open"; +opts.onExpand.call(_13f,node); +if(_141){ +_141(); +} +}); +}else{ +ul.css("display","block"); +node.state="open"; +opts.onExpand.call(_13f,node); +if(_141){ +_141(); +} +} +}else{ +var _142=$("
                                      ").insertAfter(_140); +_137(_13f,_142[0],{id:node.id},function(){ +if(_142.is(":empty")){ +_142.remove(); +} +if(opts.animate){ +_142.slideDown("normal",function(){ +node.state="open"; +opts.onExpand.call(_13f,node); +if(_141){ +_141(); +} +}); +}else{ +_142.css("display","block"); +node.state="open"; +opts.onExpand.call(_13f,node); +if(_141){ +_141(); +} +} +}); +} +}; +function _143(_144,_145){ +var opts=$.data(_144,"tree").options; +var hit=$(_145).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-collapsed")){ +return; +} +var node=_eb(_144,_145); +if(opts.onBeforeCollapse.call(_144,node)==false){ +return; +} +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +hit.next().removeClass("tree-folder-open"); +var ul=$(_145).next(); +if(opts.animate){ +ul.slideUp("normal",function(){ +node.state="closed"; +opts.onCollapse.call(_144,node); +}); +}else{ +ul.css("display","none"); +node.state="closed"; +opts.onCollapse.call(_144,node); +} +}; +function _146(_147,_148){ +var hit=$(_148).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +_143(_147,_148); +}else{ +_13e(_147,_148); +} +}; +function _149(_14a,_14b){ +var _14c=_14d(_14a,_14b); +if(_14b){ +_14c.unshift(_eb(_14a,_14b)); +} +for(var i=0;i<_14c.length;i++){ +_13e(_14a,_14c[i].target); +} +}; +function _14e(_14f,_150){ +var _151=[]; +var p=_120(_14f,_150); +while(p){ +_151.unshift(p); +p=_120(_14f,p.target); +} +for(var i=0;i<_151.length;i++){ +_13e(_14f,_151[i].target); +} +}; +function _152(_153,_154){ +var c=$(_153).parent(); +while(c[0].tagName!="BODY"&&c.css("overflow-y")!="auto"){ +c=c.parent(); +} +var n=$(_154); +var ntop=n.offset().top; +if(c[0].tagName!="BODY"){ +var ctop=c.offset().top; +if(ntopctop+c.outerHeight()-18){ +c.scrollTop(c.scrollTop()+ntop+n.outerHeight()-ctop-c.outerHeight()+18); +} +} +}else{ +c.scrollTop(ntop); +} +}; +function _155(_156,_157){ +var _158=_14d(_156,_157); +if(_157){ +_158.unshift(_eb(_156,_157)); +} +for(var i=0;i<_158.length;i++){ +_143(_156,_158[i].target); +} +}; +function _159(_15a,_15b){ +var node=$(_15b.parent); +var data=_15b.data; +if(!data){ +return; +} +data=$.isArray(data)?data:[data]; +if(!data.length){ +return; +} +var ul; +if(node.length==0){ +ul=$(_15a); +}else{ +if(_15c(_15a,node[0])){ +var _15d=node.find("span.tree-icon"); +_15d.removeClass("tree-file").addClass("tree-folder tree-folder-open"); +var hit=$("").insertBefore(_15d); +if(hit.prev().length){ +hit.prev().remove(); +} +} +ul=node.next(); +if(!ul.length){ +ul=$("
                                        ").insertAfter(node); +} +} +_125(_15a,ul[0],data,true,true); +}; +function _15e(_15f,_160){ +var ref=_160.before||_160.after; +var _161=_120(_15f,ref); +var data=_160.data; +if(!data){ +return; +} +data=$.isArray(data)?data:[data]; +if(!data.length){ +return; +} +_159(_15f,{parent:(_161?_161.target:null),data:data}); +var _162=_161?_161.children:$(_15f).tree("getRoots"); +for(var i=0;i<_162.length;i++){ +if(_162[i].domId==$(ref).attr("id")){ +for(var j=data.length-1;j>=0;j--){ +_162.splice((_160.before?i:(i+1)),0,data[j]); +} +_162.splice(_162.length-data.length,data.length); +break; +} +} +var li=$(); +for(var i=0;i").prependTo(node); +node.next().remove(); +} +_12d(_164,_166); +} +_12e(_164,_164); +function del(_167){ +var id=$(_167).attr("id"); +var _168=_120(_164,_167); +var cc=_168?_168.children:$.data(_164,"tree").data; +for(var i=0;i").appendTo(nt); +_192.val(node.text).focus(); +_192.width(_191+20); +_192._outerHeight(opts.editorHeight); +_192.bind("click",function(e){ +return false; +}).bind("mousedown",function(e){ +e.stopPropagation(); +}).bind("mousemove",function(e){ +e.stopPropagation(); +}).bind("keydown",function(e){ +if(e.keyCode==13){ +_193(_18f,_190); +return false; +}else{ +if(e.keyCode==27){ +_197(_18f,_190); +return false; +} +} +}).bind("blur",function(e){ +e.stopPropagation(); +_193(_18f,_190); +}); +}; +function _193(_194,_195){ +var opts=$.data(_194,"tree").options; +$(_195).css("position",""); +var _196=$(_195).find("input.tree-editor"); +var val=_196.val(); +_196.remove(); +var node=_eb(_194,_195); +node.text=val; +_12d(_194,node); +opts.onAfterEdit.call(_194,node); +}; +function _197(_198,_199){ +var opts=$.data(_198,"tree").options; +$(_199).css("position",""); +$(_199).find("input.tree-editor").remove(); +var node=_eb(_198,_199); +_12d(_198,node); +opts.onCancelEdit.call(_198,node); +}; +function _19a(_19b,q){ +var _19c=$.data(_19b,"tree"); +var opts=_19c.options; +var ids={}; +$.easyui.forEach(_19c.data,true,function(node){ +if(opts.filter.call(_19b,q,node)){ +$("#"+node.domId).removeClass("tree-node-hidden"); +ids[node.domId]=1; +node.hidden=false; +}else{ +$("#"+node.domId).addClass("tree-node-hidden"); +node.hidden=true; +} +}); +for(var id in ids){ +_19d(id); +} +function _19d(_19e){ +var p=$(_19b).tree("getParent",$("#"+_19e)[0]); +while(p){ +$(p.target).removeClass("tree-node-hidden"); +p.hidden=false; +p=$(_19b).tree("getParent",p.target); +} +}; +}; +$.fn.tree=function(_19f,_1a0){ +if(typeof _19f=="string"){ +return $.fn.tree.methods[_19f](this,_1a0); +} +var _19f=_19f||{}; +return this.each(function(){ +var _1a1=$.data(this,"tree"); +var opts; +if(_1a1){ +opts=$.extend(_1a1.options,_19f); +_1a1.options=opts; +}else{ +opts=$.extend({},$.fn.tree.defaults,$.fn.tree.parseOptions(this),_19f); +$.data(this,"tree",{options:opts,tree:_e0(this),data:[],tmpIds:[]}); +var data=$.fn.tree.parseData(this); +if(data.length){ +_125(this,this,data); +} +} +_e3(this); +if(opts.data){ +_125(this,this,$.extend(true,[],opts.data)); +} +_137(this,this); +}); +}; +$.fn.tree.methods={options:function(jq){ +return $.data(jq[0],"tree").options; +},loadData:function(jq,data){ +return jq.each(function(){ +_125(this,this,data); +}); +},getNode:function(jq,_1a2){ +return _eb(jq[0],_1a2); +},getData:function(jq,_1a3){ +return _17e(jq[0],_1a3); +},reload:function(jq,_1a4){ +return jq.each(function(){ +if(_1a4){ +var node=$(_1a4); +var hit=node.children("span.tree-hit"); +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +node.next().remove(); +_13e(this,_1a4); +}else{ +$(this).empty(); +_137(this,this); +} +}); +},getRoot:function(jq,_1a5){ +return _16b(jq[0],_1a5); +},getRoots:function(jq){ +return _16f(jq[0]); +},getParent:function(jq,_1a6){ +return _120(jq[0],_1a6); +},getChildren:function(jq,_1a7){ +return _14d(jq[0],_1a7); +},getChecked:function(jq,_1a8){ +return _178(jq[0],_1a8); +},getSelected:function(jq){ +return _17c(jq[0]); +},isLeaf:function(jq,_1a9){ +return _15c(jq[0],_1a9); +},find:function(jq,id){ +return _183(jq[0],id); +},select:function(jq,_1aa){ +return jq.each(function(){ +_189(this,_1aa); +}); +},check:function(jq,_1ab){ +return jq.each(function(){ +_10d(this,_1ab,true); +}); +},uncheck:function(jq,_1ac){ +return jq.each(function(){ +_10d(this,_1ac,false); +}); +},collapse:function(jq,_1ad){ +return jq.each(function(){ +_143(this,_1ad); +}); +},expand:function(jq,_1ae){ +return jq.each(function(){ +_13e(this,_1ae); +}); +},collapseAll:function(jq,_1af){ +return jq.each(function(){ +_155(this,_1af); +}); +},expandAll:function(jq,_1b0){ +return jq.each(function(){ +_149(this,_1b0); +}); +},expandTo:function(jq,_1b1){ +return jq.each(function(){ +_14e(this,_1b1); +}); +},scrollTo:function(jq,_1b2){ +return jq.each(function(){ +_152(this,_1b2); +}); +},toggle:function(jq,_1b3){ +return jq.each(function(){ +_146(this,_1b3); +}); +},append:function(jq,_1b4){ +return jq.each(function(){ +_159(this,_1b4); +}); +},insert:function(jq,_1b5){ +return jq.each(function(){ +_15e(this,_1b5); +}); +},remove:function(jq,_1b6){ +return jq.each(function(){ +_163(this,_1b6); +}); +},pop:function(jq,_1b7){ +var node=jq.tree("getData",_1b7); +jq.tree("remove",_1b7); +return node; +},update:function(jq,_1b8){ +return jq.each(function(){ +_12d(this,$.extend({},_1b8,{checkState:_1b8.checked?"checked":(_1b8.checked===false?"unchecked":undefined)})); +}); +},enableDnd:function(jq){ +return jq.each(function(){ +_f0(this); +}); +},disableDnd:function(jq){ +return jq.each(function(){ +_ec(this); +}); +},beginEdit:function(jq,_1b9){ +return jq.each(function(){ +_18e(this,_1b9); +}); +},endEdit:function(jq,_1ba){ +return jq.each(function(){ +_193(this,_1ba); +}); +},cancelEdit:function(jq,_1bb){ +return jq.each(function(){ +_197(this,_1bb); +}); +},doFilter:function(jq,q){ +return jq.each(function(){ +_19a(this,q); +}); +}}; +$.fn.tree.parseOptions=function(_1bc){ +var t=$(_1bc); +return $.extend({},$.parser.parseOptions(_1bc,["url","method",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean",lines:"boolean",dnd:"boolean"}])); +}; +$.fn.tree.parseData=function(_1bd){ +var data=[]; +_1be(data,$(_1bd)); +return data; +function _1be(aa,tree){ +tree.children("li").each(function(){ +var node=$(this); +var item=$.extend({},$.parser.parseOptions(this,["id","iconCls","state"]),{checked:(node.attr("checked")?true:undefined)}); +item.text=node.children("span").html(); +if(!item.text){ +item.text=node.html(); +} +var _1bf=node.children("ul"); +if(_1bf.length){ +item.children=[]; +_1be(item.children,_1bf); +} +aa.push(item); +}); +}; +}; +var _1c0=1; +var _1c1={render:function(_1c2,ul,data){ +var _1c3=$.data(_1c2,"tree"); +var opts=_1c3.options; +var _1c4=$(ul).prev(".tree-node"); +var _1c5=_1c4.length?$(_1c2).tree("getNode",_1c4[0]):null; +var _1c6=_1c4.find("span.tree-indent, span.tree-hit").length; +var cc=_1c7.call(this,_1c6,data); +$(ul).append(cc.join("")); +function _1c7(_1c8,_1c9){ +var cc=[]; +for(var i=0;i<_1c9.length;i++){ +var item=_1c9[i]; +if(item.state!="open"&&item.state!="closed"){ +item.state="open"; +} +item.domId="_easyui_tree_"+_1c0++; +cc.push("
                                      • "); +cc.push("
                                        "); +for(var j=0;j<_1c8;j++){ +cc.push(""); +} +if(item.state=="closed"){ +cc.push(""); +cc.push(""); +}else{ +if(item.children&&item.children.length){ +cc.push(""); +cc.push(""); +}else{ +cc.push(""); +cc.push(""); +} +} +if(this.hasCheckbox(_1c2,item)){ +var flag=0; +if(_1c5&&_1c5.checkState=="checked"&&opts.cascadeCheck){ +flag=1; +item.checked=true; +}else{ +if(item.checked){ +$.easyui.addArrayItem(_1c3.tmpIds,item.domId); +} +} +item.checkState=flag?"checked":"unchecked"; +cc.push(""); +}else{ +item.checkState=undefined; +item.checked=undefined; +} +cc.push(""+opts.formatter.call(_1c2,item)+""); +cc.push("
                                        "); +if(item.children&&item.children.length){ +var tmp=_1c7.call(this,_1c8+1,item.children); +cc.push("
                                          "); +cc=cc.concat(tmp); +cc.push("
                                        "); +} +cc.push("
                                      • "); +} +return cc; +}; +},hasCheckbox:function(_1ca,item){ +var _1cb=$.data(_1ca,"tree"); +var opts=_1cb.options; +if(opts.checkbox){ +if($.isFunction(opts.checkbox)){ +if(opts.checkbox.call(_1ca,item)){ +return true; +}else{ +return false; +} +}else{ +if(opts.onlyLeafCheck){ +if(item.state=="open"&&!(item.children&&item.children.length)){ +return true; +} +}else{ +return true; +} +} +} +return false; +}}; +$.fn.tree.defaults={url:null,method:"post",animate:false,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,dnd:false,editorHeight:26,data:null,queryParams:{},formatter:function(node){ +return node.text; +},filter:function(q,node){ +var qq=[]; +$.map($.isArray(q)?q:[q],function(q){ +q=$.trim(q); +if(q){ +qq.push(q); +} +}); +for(var i=0;i=0){ +return true; +} +} +return !qq.length; +},loader:function(_1cd,_1ce,_1cf){ +var opts=$(this).tree("options"); +if(!opts.url){ +return false; +} +$.ajax({type:opts.method,url:opts.url,data:_1cd,dataType:"json",success:function(data){ +_1ce(data); +},error:function(){ +_1cf.apply(this,arguments); +}}); +},loadFilter:function(data,_1d0){ +return data; +},view:_1c1,onBeforeLoad:function(node,_1d1){ +},onLoadSuccess:function(node,data){ +},onLoadError:function(){ +},onClick:function(node){ +},onDblClick:function(node){ +},onBeforeExpand:function(node){ +},onExpand:function(node){ +},onBeforeCollapse:function(node){ +},onCollapse:function(node){ +},onBeforeCheck:function(node,_1d2){ +},onCheck:function(node,_1d3){ +},onBeforeSelect:function(node){ +},onSelect:function(node){ +},onContextMenu:function(e,node){ +},onBeforeDrag:function(node){ +},onStartDrag:function(node){ +},onStopDrag:function(node){ +},onDragEnter:function(_1d4,_1d5){ +},onDragOver:function(_1d6,_1d7){ +},onDragLeave:function(_1d8,_1d9){ +},onBeforeDrop:function(_1da,_1db,_1dc){ +},onDrop:function(_1dd,_1de,_1df){ +},onBeforeEdit:function(node){ +},onAfterEdit:function(node){ +},onCancelEdit:function(node){ +}}; +})(jQuery); +(function($){ +function init(_1e0){ +$(_1e0).addClass("progressbar"); +$(_1e0).html("
                                        "); +$(_1e0).bind("_resize",function(e,_1e1){ +if($(this).hasClass("easyui-fluid")||_1e1){ +_1e2(_1e0); +} +return false; +}); +return $(_1e0); +}; +function _1e2(_1e3,_1e4){ +var opts=$.data(_1e3,"progressbar").options; +var bar=$.data(_1e3,"progressbar").bar; +if(_1e4){ +opts.width=_1e4; +} +bar._size(opts); +bar.find("div.progressbar-text").css("width",bar.width()); +bar.find("div.progressbar-text,div.progressbar-value").css({height:bar.height()+"px",lineHeight:bar.height()+"px"}); +}; +$.fn.progressbar=function(_1e5,_1e6){ +if(typeof _1e5=="string"){ +var _1e7=$.fn.progressbar.methods[_1e5]; +if(_1e7){ +return _1e7(this,_1e6); +} +} +_1e5=_1e5||{}; +return this.each(function(){ +var _1e8=$.data(this,"progressbar"); +if(_1e8){ +$.extend(_1e8.options,_1e5); +}else{ +_1e8=$.data(this,"progressbar",{options:$.extend({},$.fn.progressbar.defaults,$.fn.progressbar.parseOptions(this),_1e5),bar:init(this)}); +} +$(this).progressbar("setValue",_1e8.options.value); +_1e2(this); +}); +}; +$.fn.progressbar.methods={options:function(jq){ +return $.data(jq[0],"progressbar").options; +},resize:function(jq,_1e9){ +return jq.each(function(){ +_1e2(this,_1e9); +}); +},getValue:function(jq){ +return $.data(jq[0],"progressbar").options.value; +},setValue:function(jq,_1ea){ +if(_1ea<0){ +_1ea=0; +} +if(_1ea>100){ +_1ea=100; +} +return jq.each(function(){ +var opts=$.data(this,"progressbar").options; +var text=opts.text.replace(/{value}/,_1ea); +var _1eb=opts.value; +opts.value=_1ea; +$(this).find("div.progressbar-value").width(_1ea+"%"); +$(this).find("div.progressbar-text").html(text); +if(_1eb!=_1ea){ +opts.onChange.call(this,_1ea,_1eb); +} +}); +}}; +$.fn.progressbar.parseOptions=function(_1ec){ +return $.extend({},$.parser.parseOptions(_1ec,["width","height","text",{value:"number"}])); +}; +$.fn.progressbar.defaults={width:"auto",height:22,value:0,text:"{value}%",onChange:function(_1ed,_1ee){ +}}; +})(jQuery); +(function($){ +function init(_1ef){ +$(_1ef).addClass("tooltip-f"); +}; +function _1f0(_1f1){ +var opts=$.data(_1f1,"tooltip").options; +$(_1f1).unbind(".tooltip").bind(opts.showEvent+".tooltip",function(e){ +$(_1f1).tooltip("show",e); +}).bind(opts.hideEvent+".tooltip",function(e){ +$(_1f1).tooltip("hide",e); +}).bind("mousemove.tooltip",function(e){ +if(opts.trackMouse){ +opts.trackMouseX=e.pageX; +opts.trackMouseY=e.pageY; +$(_1f1).tooltip("reposition"); +} +}); +}; +function _1f2(_1f3){ +var _1f4=$.data(_1f3,"tooltip"); +if(_1f4.showTimer){ +clearTimeout(_1f4.showTimer); +_1f4.showTimer=null; +} +if(_1f4.hideTimer){ +clearTimeout(_1f4.hideTimer); +_1f4.hideTimer=null; +} +}; +function _1f5(_1f6){ +var _1f7=$.data(_1f6,"tooltip"); +if(!_1f7||!_1f7.tip){ +return; +} +var opts=_1f7.options; +var tip=_1f7.tip; +var pos={left:-100000,top:-100000}; +if($(_1f6).is(":visible")){ +pos=_1f8(opts.position); +if(opts.position=="top"&&pos.top<0){ +pos=_1f8("bottom"); +}else{ +if((opts.position=="bottom")&&(pos.top+tip._outerHeight()>$(window)._outerHeight()+$(document).scrollTop())){ +pos=_1f8("top"); +} +} +if(pos.left<0){ +if(opts.position=="left"){ +pos=_1f8("right"); +}else{ +$(_1f6).tooltip("arrow").css("left",tip._outerWidth()/2+pos.left); +pos.left=0; +} +}else{ +if(pos.left+tip._outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ +if(opts.position=="right"){ +pos=_1f8("left"); +}else{ +var left=pos.left; +pos.left=$(window)._outerWidth()+$(document)._scrollLeft()-tip._outerWidth(); +$(_1f6).tooltip("arrow").css("left",tip._outerWidth()/2-(pos.left-left)); +} +} +} +} +tip.css({left:pos.left,top:pos.top,zIndex:(opts.zIndex!=undefined?opts.zIndex:($.fn.window?$.fn.window.defaults.zIndex++:""))}); +opts.onPosition.call(_1f6,pos.left,pos.top); +function _1f8(_1f9){ +opts.position=_1f9||"bottom"; +tip.removeClass("tooltip-top tooltip-bottom tooltip-left tooltip-right").addClass("tooltip-"+opts.position); +var left,top; +var _1fa=$.isFunction(opts.deltaX)?opts.deltaX.call(_1f6,opts.position):opts.deltaX; +var _1fb=$.isFunction(opts.deltaY)?opts.deltaY.call(_1f6,opts.position):opts.deltaY; +if(opts.trackMouse){ +t=$(); +left=opts.trackMouseX+_1fa; +top=opts.trackMouseY+_1fb; +}else{ +var t=$(_1f6); +left=t.offset().left+_1fa; +top=t.offset().top+_1fb; +} +switch(opts.position){ +case "right": +left+=t._outerWidth()+12+(opts.trackMouse?12:0); +if(opts.valign=="middle"){ +top-=(tip._outerHeight()-t._outerHeight())/2; +} +break; +case "left": +left-=tip._outerWidth()+12+(opts.trackMouse?12:0); +if(opts.valign=="middle"){ +top-=(tip._outerHeight()-t._outerHeight())/2; +} +break; +case "top": +left-=(tip._outerWidth()-t._outerWidth())/2; +top-=tip._outerHeight()+12+(opts.trackMouse?12:0); +break; +case "bottom": +left-=(tip._outerWidth()-t._outerWidth())/2; +top+=t._outerHeight()+12+(opts.trackMouse?12:0); +break; +} +return {left:left,top:top}; +}; +}; +function _1fc(_1fd,e){ +var _1fe=$.data(_1fd,"tooltip"); +var opts=_1fe.options; +var tip=_1fe.tip; +if(!tip){ +tip=$("
                                        "+"
                                        "+"
                                        "+"
                                        "+"
                                        ").appendTo("body"); +_1fe.tip=tip; +_1ff(_1fd); +} +_1f2(_1fd); +_1fe.showTimer=setTimeout(function(){ +$(_1fd).tooltip("reposition"); +tip.show(); +opts.onShow.call(_1fd,e); +var _200=tip.children(".tooltip-arrow-outer"); +var _201=tip.children(".tooltip-arrow"); +var bc="border-"+opts.position+"-color"; +_200.add(_201).css({borderTopColor:"",borderBottomColor:"",borderLeftColor:"",borderRightColor:""}); +_200.css(bc,tip.css(bc)); +_201.css(bc,tip.css("backgroundColor")); +},opts.showDelay); +}; +function _202(_203,e){ +var _204=$.data(_203,"tooltip"); +if(_204&&_204.tip){ +_1f2(_203); +_204.hideTimer=setTimeout(function(){ +_204.tip.hide(); +_204.options.onHide.call(_203,e); +},_204.options.hideDelay); +} +}; +function _1ff(_205,_206){ +var _207=$.data(_205,"tooltip"); +var opts=_207.options; +if(_206){ +opts.content=_206; +} +if(!_207.tip){ +return; +} +var cc=typeof opts.content=="function"?opts.content.call(_205):opts.content; +_207.tip.children(".tooltip-content").html(cc); +opts.onUpdate.call(_205,cc); +}; +function _208(_209){ +var _20a=$.data(_209,"tooltip"); +if(_20a){ +_1f2(_209); +var opts=_20a.options; +if(_20a.tip){ +_20a.tip.remove(); +} +if(opts._title){ +$(_209).attr("title",opts._title); +} +$.removeData(_209,"tooltip"); +$(_209).unbind(".tooltip").removeClass("tooltip-f"); +opts.onDestroy.call(_209); +} +}; +$.fn.tooltip=function(_20b,_20c){ +if(typeof _20b=="string"){ +return $.fn.tooltip.methods[_20b](this,_20c); +} +_20b=_20b||{}; +return this.each(function(){ +var _20d=$.data(this,"tooltip"); +if(_20d){ +$.extend(_20d.options,_20b); +}else{ +$.data(this,"tooltip",{options:$.extend({},$.fn.tooltip.defaults,$.fn.tooltip.parseOptions(this),_20b)}); +init(this); +} +_1f0(this); +_1ff(this); +}); +}; +$.fn.tooltip.methods={options:function(jq){ +return $.data(jq[0],"tooltip").options; +},tip:function(jq){ +return $.data(jq[0],"tooltip").tip; +},arrow:function(jq){ +return jq.tooltip("tip").children(".tooltip-arrow-outer,.tooltip-arrow"); +},show:function(jq,e){ +return jq.each(function(){ +_1fc(this,e); +}); +},hide:function(jq,e){ +return jq.each(function(){ +_202(this,e); +}); +},update:function(jq,_20e){ +return jq.each(function(){ +_1ff(this,_20e); +}); +},reposition:function(jq){ +return jq.each(function(){ +_1f5(this); +}); +},destroy:function(jq){ +return jq.each(function(){ +_208(this); +}); +}}; +$.fn.tooltip.parseOptions=function(_20f){ +var t=$(_20f); +var opts=$.extend({},$.parser.parseOptions(_20f,["position","showEvent","hideEvent","content",{trackMouse:"boolean",deltaX:"number",deltaY:"number",showDelay:"number",hideDelay:"number"}]),{_title:t.attr("title")}); +t.attr("title",""); +if(!opts.content){ +opts.content=opts._title; +} +return opts; +}; +$.fn.tooltip.defaults={position:"bottom",valign:"middle",content:null,trackMouse:false,deltaX:0,deltaY:0,showEvent:"mouseenter",hideEvent:"mouseleave",showDelay:200,hideDelay:100,onShow:function(e){ +},onHide:function(e){ +},onUpdate:function(_210){ +},onPosition:function(left,top){ +},onDestroy:function(){ +}}; +})(jQuery); +(function($){ +$.fn._remove=function(){ +return this.each(function(){ +$(this).remove(); +try{ +this.outerHTML=""; +} +catch(err){ +} +}); +}; +function _211(node){ +node._remove(); +}; +function _212(_213,_214){ +var _215=$.data(_213,"panel"); +var opts=_215.options; +var _216=_215.panel; +var _217=_216.children(".panel-header"); +var _218=_216.children(".panel-body"); +var _219=_216.children(".panel-footer"); +var _21a=(opts.halign=="left"||opts.halign=="right"); +if(_214){ +$.extend(opts,{width:_214.width,height:_214.height,minWidth:_214.minWidth,maxWidth:_214.maxWidth,minHeight:_214.minHeight,maxHeight:_214.maxHeight,left:_214.left,top:_214.top}); +opts.hasResized=false; +} +var _21b=_216.outerWidth(); +var _21c=_216.outerHeight(); +_216._size(opts); +var _21d=_216.outerWidth(); +var _21e=_216.outerHeight(); +if(opts.hasResized&&(_21b==_21d&&_21c==_21e)){ +return; +} +opts.hasResized=true; +if(!_21a){ +_217._outerWidth(_216.width()); +} +_218._outerWidth(_216.width()); +if(!isNaN(parseInt(opts.height))){ +if(_21a){ +if(opts.header){ +var _21f=$(opts.header)._outerWidth(); +}else{ +_217.css("width",""); +var _21f=_217._outerWidth(); +} +var _220=_217.find(".panel-title"); +_21f+=Math.min(_220._outerWidth(),_220._outerHeight()); +var _221=_216.height(); +_217._outerWidth(_21f)._outerHeight(_221); +_220._outerWidth(_217.height()); +_218._outerWidth(_216.width()-_21f-_219._outerWidth())._outerHeight(_221); +_219._outerHeight(_221); +_218.css({left:"",right:""}).css(opts.halign,(_217.position()[opts.halign]+_21f)+"px"); +opts.panelCssWidth=_216.css("width"); +if(opts.collapsed){ +_216._outerWidth(_21f+_219._outerWidth()); +} +}else{ +_218._outerHeight(_216.height()-_217._outerHeight()-_219._outerHeight()); +} +}else{ +_218.css("height",""); +var min=$.parser.parseValue("minHeight",opts.minHeight,_216.parent()); +var max=$.parser.parseValue("maxHeight",opts.maxHeight,_216.parent()); +var _222=_217._outerHeight()+_219._outerHeight()+_216._outerHeight()-_216.height(); +_218._size("minHeight",min?(min-_222):""); +_218._size("maxHeight",max?(max-_222):""); +} +_216.css({height:(_21a?undefined:""),minHeight:"",maxHeight:"",left:opts.left,top:opts.top}); +opts.onResize.apply(_213,[opts.width,opts.height]); +$(_213).panel("doLayout"); +}; +function _223(_224,_225){ +var _226=$.data(_224,"panel"); +var opts=_226.options; +var _227=_226.panel; +if(_225){ +if(_225.left!=null){ +opts.left=_225.left; +} +if(_225.top!=null){ +opts.top=_225.top; +} +} +_227.css({left:opts.left,top:opts.top}); +_227.find(".tooltip-f").each(function(){ +$(this).tooltip("reposition"); +}); +opts.onMove.apply(_224,[opts.left,opts.top]); +}; +function _228(_229){ +$(_229).addClass("panel-body")._size("clear"); +var _22a=$("
                                        ").insertBefore(_229); +_22a[0].appendChild(_229); +_22a.bind("_resize",function(e,_22b){ +if($(this).hasClass("easyui-fluid")||_22b){ +_212(_229,{}); +} +return false; +}); +return _22a; +}; +function _22c(_22d){ +var _22e=$.data(_22d,"panel"); +var opts=_22e.options; +var _22f=_22e.panel; +_22f.css(opts.style); +_22f.addClass(opts.cls); +_22f.removeClass("panel-hleft panel-hright").addClass("panel-h"+opts.halign); +_230(); +_231(); +var _232=$(_22d).panel("header"); +var body=$(_22d).panel("body"); +var _233=$(_22d).siblings(".panel-footer"); +if(opts.border){ +_232.removeClass("panel-header-noborder"); +body.removeClass("panel-body-noborder"); +_233.removeClass("panel-footer-noborder"); +}else{ +_232.addClass("panel-header-noborder"); +body.addClass("panel-body-noborder"); +_233.addClass("panel-footer-noborder"); +} +_232.addClass(opts.headerCls); +body.addClass(opts.bodyCls); +$(_22d).attr("id",opts.id||""); +if(opts.content){ +$(_22d).panel("clear"); +$(_22d).html(opts.content); +$.parser.parse($(_22d)); +} +function _230(){ +if(opts.noheader||(!opts.title&&!opts.header)){ +_211(_22f.children(".panel-header")); +_22f.children(".panel-body").addClass("panel-body-noheader"); +}else{ +if(opts.header){ +$(opts.header).addClass("panel-header").prependTo(_22f); +}else{ +var _234=_22f.children(".panel-header"); +if(!_234.length){ +_234=$("
                                        ").prependTo(_22f); +} +if(!$.isArray(opts.tools)){ +_234.find("div.panel-tool .panel-tool-a").appendTo(opts.tools); +} +_234.empty(); +var _235=$("
                                        ").html(opts.title).appendTo(_234); +if(opts.iconCls){ +_235.addClass("panel-with-icon"); +$("
                                        ").addClass(opts.iconCls).appendTo(_234); +} +if(opts.halign=="left"||opts.halign=="right"){ +_235.addClass("panel-title-"+opts.titleDirection); +} +var tool=$("
                                        ").appendTo(_234); +tool.bind("click",function(e){ +e.stopPropagation(); +}); +if(opts.tools){ +if($.isArray(opts.tools)){ +$.map(opts.tools,function(t){ +_236(tool,t.iconCls,eval(t.handler)); +}); +}else{ +$(opts.tools).children().each(function(){ +$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(tool); +}); +} +} +if(opts.collapsible){ +_236(tool,"panel-tool-collapse",function(){ +if(opts.collapsed==true){ +_257(_22d,true); +}else{ +_248(_22d,true); +} +}); +} +if(opts.minimizable){ +_236(tool,"panel-tool-min",function(){ +_25d(_22d); +}); +} +if(opts.maximizable){ +_236(tool,"panel-tool-max",function(){ +if(opts.maximized==true){ +_260(_22d); +}else{ +_247(_22d); +} +}); +} +if(opts.closable){ +_236(tool,"panel-tool-close",function(){ +_249(_22d); +}); +} +} +_22f.children("div.panel-body").removeClass("panel-body-noheader"); +} +}; +function _236(c,icon,_237){ +var a=$("").addClass(icon).appendTo(c); +a.bind("click",_237); +}; +function _231(){ +if(opts.footer){ +$(opts.footer).addClass("panel-footer").appendTo(_22f); +$(_22d).addClass("panel-body-nobottom"); +}else{ +_22f.children(".panel-footer").remove(); +$(_22d).removeClass("panel-body-nobottom"); +} +}; +}; +function _238(_239,_23a){ +var _23b=$.data(_239,"panel"); +var opts=_23b.options; +if(_23c){ +opts.queryParams=_23a; +} +if(!opts.href){ +return; +} +if(!_23b.isLoaded||!opts.cache){ +var _23c=$.extend({},opts.queryParams); +if(opts.onBeforeLoad.call(_239,_23c)==false){ +return; +} +_23b.isLoaded=false; +if(opts.loadingMessage){ +$(_239).panel("clear"); +$(_239).html($("
                                        ").html(opts.loadingMessage)); +} +opts.loader.call(_239,_23c,function(data){ +var _23d=opts.extractor.call(_239,data); +$(_239).panel("clear"); +$(_239).html(_23d); +$.parser.parse($(_239)); +opts.onLoad.apply(_239,arguments); +_23b.isLoaded=true; +},function(){ +opts.onLoadError.apply(_239,arguments); +}); +} +}; +function _23e(_23f){ +var t=$(_23f); +t.find(".combo-f").each(function(){ +$(this).combo("destroy"); +}); +t.find(".m-btn").each(function(){ +$(this).menubutton("destroy"); +}); +t.find(".s-btn").each(function(){ +$(this).splitbutton("destroy"); +}); +t.find(".tooltip-f").each(function(){ +$(this).tooltip("destroy"); +}); +t.children("div").each(function(){ +$(this)._size("unfit"); +}); +t.empty(); +}; +function _240(_241){ +$(_241).panel("doLayout",true); +}; +function _242(_243,_244){ +var _245=$.data(_243,"panel"); +var opts=_245.options; +var _246=_245.panel; +if(_244!=true){ +if(opts.onBeforeOpen.call(_243)==false){ +return; +} +} +_246.stop(true,true); +if($.isFunction(opts.openAnimation)){ +opts.openAnimation.call(_243,cb); +}else{ +switch(opts.openAnimation){ +case "slide": +_246.slideDown(opts.openDuration,cb); +break; +case "fade": +_246.fadeIn(opts.openDuration,cb); +break; +case "show": +_246.show(opts.openDuration,cb); +break; +default: +_246.show(); +cb(); +} +} +function cb(){ +opts.closed=false; +opts.minimized=false; +var tool=_246.children(".panel-header").find("a.panel-tool-restore"); +if(tool.length){ +opts.maximized=true; +} +opts.onOpen.call(_243); +if(opts.maximized==true){ +opts.maximized=false; +_247(_243); +} +if(opts.collapsed==true){ +opts.collapsed=false; +_248(_243); +} +if(!opts.collapsed){ +if(opts.href&&(!_245.isLoaded||!opts.cache)){ +_238(_243); +_240(_243); +opts.doneLayout=true; +} +} +if(!opts.doneLayout){ +opts.doneLayout=true; +_240(_243); +} +}; +}; +function _249(_24a,_24b){ +var _24c=$.data(_24a,"panel"); +var opts=_24c.options; +var _24d=_24c.panel; +if(_24b!=true){ +if(opts.onBeforeClose.call(_24a)==false){ +return; +} +} +_24d.find(".tooltip-f").each(function(){ +$(this).tooltip("hide"); +}); +_24d.stop(true,true); +_24d._size("unfit"); +if($.isFunction(opts.closeAnimation)){ +opts.closeAnimation.call(_24a,cb); +}else{ +switch(opts.closeAnimation){ +case "slide": +_24d.slideUp(opts.closeDuration,cb); +break; +case "fade": +_24d.fadeOut(opts.closeDuration,cb); +break; +case "hide": +_24d.hide(opts.closeDuration,cb); +break; +default: +_24d.hide(); +cb(); +} +} +function cb(){ +opts.closed=true; +opts.onClose.call(_24a); +}; +}; +function _24e(_24f,_250){ +var _251=$.data(_24f,"panel"); +var opts=_251.options; +var _252=_251.panel; +if(_250!=true){ +if(opts.onBeforeDestroy.call(_24f)==false){ +return; +} +} +$(_24f).panel("clear").panel("clear","footer"); +_211(_252); +opts.onDestroy.call(_24f); +}; +function _248(_253,_254){ +var opts=$.data(_253,"panel").options; +var _255=$.data(_253,"panel").panel; +var body=_255.children(".panel-body"); +var _256=_255.children(".panel-header"); +var tool=_256.find("a.panel-tool-collapse"); +if(opts.collapsed==true){ +return; +} +body.stop(true,true); +if(opts.onBeforeCollapse.call(_253)==false){ +return; +} +tool.addClass("panel-tool-expand"); +if(_254==true){ +if(opts.halign=="left"||opts.halign=="right"){ +_255.animate({width:_256._outerWidth()+_255.children(".panel-footer")._outerWidth()},function(){ +cb(); +}); +}else{ +body.slideUp("normal",function(){ +cb(); +}); +} +}else{ +if(opts.halign=="left"||opts.halign=="right"){ +_255._outerWidth(_256._outerWidth()+_255.children(".panel-footer")._outerWidth()); +} +cb(); +} +function cb(){ +body.hide(); +opts.collapsed=true; +opts.onCollapse.call(_253); +}; +}; +function _257(_258,_259){ +var opts=$.data(_258,"panel").options; +var _25a=$.data(_258,"panel").panel; +var body=_25a.children(".panel-body"); +var tool=_25a.children(".panel-header").find("a.panel-tool-collapse"); +if(opts.collapsed==false){ +return; +} +body.stop(true,true); +if(opts.onBeforeExpand.call(_258)==false){ +return; +} +tool.removeClass("panel-tool-expand"); +if(_259==true){ +if(opts.halign=="left"||opts.halign=="right"){ +body.show(); +_25a.animate({width:opts.panelCssWidth},function(){ +cb(); +}); +}else{ +body.slideDown("normal",function(){ +cb(); +}); +} +}else{ +if(opts.halign=="left"||opts.halign=="right"){ +_25a.css("width",opts.panelCssWidth); +} +cb(); +} +function cb(){ +body.show(); +opts.collapsed=false; +opts.onExpand.call(_258); +_238(_258); +_240(_258); +}; +}; +function _247(_25b){ +var opts=$.data(_25b,"panel").options; +var _25c=$.data(_25b,"panel").panel; +var tool=_25c.children(".panel-header").find("a.panel-tool-max"); +if(opts.maximized==true){ +return; +} +tool.addClass("panel-tool-restore"); +if(!$.data(_25b,"panel").original){ +$.data(_25b,"panel").original={width:opts.width,height:opts.height,left:opts.left,top:opts.top,fit:opts.fit}; +} +opts.left=0; +opts.top=0; +opts.fit=true; +_212(_25b); +opts.minimized=false; +opts.maximized=true; +opts.onMaximize.call(_25b); +}; +function _25d(_25e){ +var opts=$.data(_25e,"panel").options; +var _25f=$.data(_25e,"panel").panel; +_25f._size("unfit"); +_25f.hide(); +opts.minimized=true; +opts.maximized=false; +opts.onMinimize.call(_25e); +}; +function _260(_261){ +var opts=$.data(_261,"panel").options; +var _262=$.data(_261,"panel").panel; +var tool=_262.children(".panel-header").find("a.panel-tool-max"); +if(opts.maximized==false){ +return; +} +_262.show(); +tool.removeClass("panel-tool-restore"); +$.extend(opts,$.data(_261,"panel").original); +_212(_261); +opts.minimized=false; +opts.maximized=false; +$.data(_261,"panel").original=null; +opts.onRestore.call(_261); +}; +function _263(_264,_265){ +$.data(_264,"panel").options.title=_265; +$(_264).panel("header").find("div.panel-title").html(_265); +}; +var _266=null; +$(window).unbind(".panel").bind("resize.panel",function(){ +if(_266){ +clearTimeout(_266); +} +_266=setTimeout(function(){ +var _267=$("body.layout"); +if(_267.length){ +_267.layout("resize"); +$("body").children(".easyui-fluid:visible").each(function(){ +$(this).triggerHandler("_resize"); +}); +}else{ +$("body").panel("doLayout"); +} +_266=null; +},100); +}); +$.fn.panel=function(_268,_269){ +if(typeof _268=="string"){ +return $.fn.panel.methods[_268](this,_269); +} +_268=_268||{}; +return this.each(function(){ +var _26a=$.data(this,"panel"); +var opts; +if(_26a){ +opts=$.extend(_26a.options,_268); +_26a.isLoaded=false; +}else{ +opts=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_268); +$(this).attr("title",""); +_26a=$.data(this,"panel",{options:opts,panel:_228(this),isLoaded:false}); +} +_22c(this); +$(this).show(); +if(opts.doSize==true){ +_26a.panel.css("display","block"); +_212(this); +} +if(opts.closed==true||opts.minimized==true){ +_26a.panel.hide(); +}else{ +_242(this); +} +}); +}; +$.fn.panel.methods={options:function(jq){ +return $.data(jq[0],"panel").options; +},panel:function(jq){ +return $.data(jq[0],"panel").panel; +},header:function(jq){ +return $.data(jq[0],"panel").panel.children(".panel-header"); +},footer:function(jq){ +return jq.panel("panel").children(".panel-footer"); +},body:function(jq){ +return $.data(jq[0],"panel").panel.children(".panel-body"); +},setTitle:function(jq,_26b){ +return jq.each(function(){ +_263(this,_26b); +}); +},open:function(jq,_26c){ +return jq.each(function(){ +_242(this,_26c); +}); +},close:function(jq,_26d){ +return jq.each(function(){ +_249(this,_26d); +}); +},destroy:function(jq,_26e){ +return jq.each(function(){ +_24e(this,_26e); +}); +},clear:function(jq,type){ +return jq.each(function(){ +_23e(type=="footer"?$(this).panel("footer"):this); +}); +},refresh:function(jq,href){ +return jq.each(function(){ +var _26f=$.data(this,"panel"); +_26f.isLoaded=false; +if(href){ +if(typeof href=="string"){ +_26f.options.href=href; +}else{ +_26f.options.queryParams=href; +} +} +_238(this); +}); +},resize:function(jq,_270){ +return jq.each(function(){ +_212(this,_270||{}); +}); +},doLayout:function(jq,all){ +return jq.each(function(){ +_271(this,"body"); +_271($(this).siblings(".panel-footer")[0],"footer"); +function _271(_272,type){ +if(!_272){ +return; +} +var _273=_272==$("body")[0]; +var s=$(_272).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible,.easyui-fluid:visible").filter(function(_274,el){ +var p=$(el).parents(".panel-"+type+":first"); +return _273?p.length==0:p[0]==_272; +}); +s.each(function(){ +$(this).triggerHandler("_resize",[all||false]); +}); +}; +}); +},move:function(jq,_275){ +return jq.each(function(){ +_223(this,_275); +}); +},maximize:function(jq){ +return jq.each(function(){ +_247(this); +}); +},minimize:function(jq){ +return jq.each(function(){ +_25d(this); +}); +},restore:function(jq){ +return jq.each(function(){ +_260(this); +}); +},collapse:function(jq,_276){ +return jq.each(function(){ +_248(this,_276); +}); +},expand:function(jq,_277){ +return jq.each(function(){ +_257(this,_277); +}); +}}; +$.fn.panel.parseOptions=function(_278){ +var t=$(_278); +var hh=t.children(".panel-header,header"); +var ff=t.children(".panel-footer,footer"); +return $.extend({},$.parser.parseOptions(_278,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href","method","header","footer","halign","titleDirection",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"},"openAnimation","closeAnimation",{openDuration:"number",closeDuration:"number"},]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined),header:(hh.length?hh.removeClass("panel-header"):undefined),footer:(ff.length?ff.removeClass("panel-footer"):undefined)}); +}; +$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,halign:"top",titleDirection:"down",collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,openAnimation:false,openDuration:400,closeAnimation:false,closeDuration:400,tools:null,footer:null,header:null,queryParams:{},method:"get",href:null,loadingMessage:"Loading...",loader:function(_279,_27a,_27b){ +var opts=$(this).panel("options"); +if(!opts.href){ +return false; +} +$.ajax({type:opts.method,url:opts.href,cache:false,data:_279,dataType:"html",success:function(data){ +_27a(data); +},error:function(){ +_27b.apply(this,arguments); +}}); +},extractor:function(data){ +var _27c=/]*>((.|[\n\r])*)<\/body>/im; +var _27d=_27c.exec(data); +if(_27d){ +return _27d[1]; +}else{ +return data; +} +},onBeforeLoad:function(_27e){ +},onLoad:function(){ +},onLoadError:function(){ +},onBeforeOpen:function(){ +},onOpen:function(){ +},onBeforeClose:function(){ +},onClose:function(){ +},onBeforeDestroy:function(){ +},onDestroy:function(){ +},onResize:function(_27f,_280){ +},onMove:function(left,top){ +},onMaximize:function(){ +},onRestore:function(){ +},onMinimize:function(){ +},onBeforeCollapse:function(){ +},onBeforeExpand:function(){ +},onCollapse:function(){ +},onExpand:function(){ +}}; +})(jQuery); +(function($){ +function _281(_282,_283){ +var _284=$.data(_282,"window"); +if(_283){ +if(_283.left!=null){ +_284.options.left=_283.left; +} +if(_283.top!=null){ +_284.options.top=_283.top; +} +} +$(_282).panel("move",_284.options); +if(_284.shadow){ +_284.shadow.css({left:_284.options.left,top:_284.options.top}); +} +}; +function _285(_286,_287){ +var opts=$.data(_286,"window").options; +var pp=$(_286).window("panel"); +var _288=pp._outerWidth(); +if(opts.inline){ +var _289=pp.parent(); +opts.left=Math.ceil((_289.width()-_288)/2+_289.scrollLeft()); +}else{ +opts.left=Math.ceil(($(window)._outerWidth()-_288)/2+$(document).scrollLeft()); +} +if(_287){ +_281(_286); +} +}; +function _28a(_28b,_28c){ +var opts=$.data(_28b,"window").options; +var pp=$(_28b).window("panel"); +var _28d=pp._outerHeight(); +if(opts.inline){ +var _28e=pp.parent(); +opts.top=Math.ceil((_28e.height()-_28d)/2+_28e.scrollTop()); +}else{ +opts.top=Math.ceil(($(window)._outerHeight()-_28d)/2+$(document).scrollTop()); +} +if(_28c){ +_281(_28b); +} +}; +function _28f(_290){ +var _291=$.data(_290,"window"); +var opts=_291.options; +var win=$(_290).panel($.extend({},_291.options,{border:false,doSize:true,closed:true,cls:"window "+(!opts.border?"window-thinborder window-noborder ":(opts.border=="thin"?"window-thinborder ":""))+(opts.cls||""),headerCls:"window-header "+(opts.headerCls||""),bodyCls:"window-body "+(opts.noheader?"window-body-noheader ":" ")+(opts.bodyCls||""),onBeforeDestroy:function(){ +if(opts.onBeforeDestroy.call(_290)==false){ +return false; +} +if(_291.shadow){ +_291.shadow.remove(); +} +if(_291.mask){ +_291.mask.remove(); +} +},onClose:function(){ +if(_291.shadow){ +_291.shadow.hide(); +} +if(_291.mask){ +_291.mask.hide(); +} +opts.onClose.call(_290); +},onOpen:function(){ +if(_291.mask){ +_291.mask.css($.extend({display:"block",zIndex:$.fn.window.defaults.zIndex++},$.fn.window.getMaskSize(_290))); +} +if(_291.shadow){ +_291.shadow.css({display:"block",zIndex:$.fn.window.defaults.zIndex++,left:opts.left,top:opts.top,width:_291.window._outerWidth(),height:_291.window._outerHeight()}); +} +_291.window.css("z-index",$.fn.window.defaults.zIndex++); +opts.onOpen.call(_290); +},onResize:function(_292,_293){ +var _294=$(this).panel("options"); +$.extend(opts,{width:_294.width,height:_294.height,left:_294.left,top:_294.top}); +if(_291.shadow){ +_291.shadow.css({left:opts.left,top:opts.top,width:_291.window._outerWidth(),height:_291.window._outerHeight()}); +} +opts.onResize.call(_290,_292,_293); +},onMinimize:function(){ +if(_291.shadow){ +_291.shadow.hide(); +} +if(_291.mask){ +_291.mask.hide(); +} +_291.options.onMinimize.call(_290); +},onBeforeCollapse:function(){ +if(opts.onBeforeCollapse.call(_290)==false){ +return false; +} +if(_291.shadow){ +_291.shadow.hide(); +} +},onExpand:function(){ +if(_291.shadow){ +_291.shadow.show(); +} +opts.onExpand.call(_290); +}})); +_291.window=win.panel("panel"); +if(_291.mask){ +_291.mask.remove(); +} +if(opts.modal){ +_291.mask=$("
                                        ").insertAfter(_291.window); +} +if(_291.shadow){ +_291.shadow.remove(); +} +if(opts.shadow){ +_291.shadow=$("
                                        ").insertAfter(_291.window); +} +var _295=opts.closed; +if(opts.left==null){ +_285(_290); +} +if(opts.top==null){ +_28a(_290); +} +_281(_290); +if(!_295){ +win.window("open"); +} +}; +function _296(left,top,_297,_298){ +var _299=this; +var _29a=$.data(_299,"window"); +var opts=_29a.options; +if(!opts.constrain){ +return {}; +} +if($.isFunction(opts.constrain)){ +return opts.constrain.call(_299,left,top,_297,_298); +} +var win=$(_299).window("window"); +var _29b=opts.inline?win.parent():$(window); +if(left<0){ +left=0; +} +if(top<_29b.scrollTop()){ +top=_29b.scrollTop(); +} +if(left+_297>_29b.width()){ +if(_297==win.outerWidth()){ +left=_29b.width()-_297; +}else{ +_297=_29b.width()-left; +} +} +if(top-_29b.scrollTop()+_298>_29b.height()){ +if(_298==win.outerHeight()){ +top=_29b.height()-_298+_29b.scrollTop(); +}else{ +_298=_29b.height()-top+_29b.scrollTop(); +} +} +return {left:left,top:top,width:_297,height:_298}; +}; +function _29c(_29d){ +var _29e=$.data(_29d,"window"); +_29e.window.draggable({handle:">div.panel-header>div.panel-title",disabled:_29e.options.draggable==false,onBeforeDrag:function(e){ +if(_29e.mask){ +_29e.mask.css("z-index",$.fn.window.defaults.zIndex++); +} +if(_29e.shadow){ +_29e.shadow.css("z-index",$.fn.window.defaults.zIndex++); +} +_29e.window.css("z-index",$.fn.window.defaults.zIndex++); +},onStartDrag:function(e){ +_29f(e); +},onDrag:function(e){ +_2a0(e); +return false; +},onStopDrag:function(e){ +_2a1(e,"move"); +}}); +_29e.window.resizable({disabled:_29e.options.resizable==false,onStartResize:function(e){ +_29f(e); +},onResize:function(e){ +_2a0(e); +return false; +},onStopResize:function(e){ +_2a1(e,"resize"); +}}); +function _29f(e){ +if(_29e.pmask){ +_29e.pmask.remove(); +} +_29e.pmask=$("
                                        ").insertAfter(_29e.window); +_29e.pmask.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top,width:_29e.window._outerWidth(),height:_29e.window._outerHeight()}); +if(_29e.proxy){ +_29e.proxy.remove(); +} +_29e.proxy=$("
                                        ").insertAfter(_29e.window); +_29e.proxy.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top}); +_29e.proxy._outerWidth(e.data.width)._outerHeight(e.data.height); +_29e.proxy.hide(); +setTimeout(function(){ +if(_29e.pmask){ +_29e.pmask.show(); +} +if(_29e.proxy){ +_29e.proxy.show(); +} +},500); +}; +function _2a0(e){ +$.extend(e.data,_296.call(_29d,e.data.left,e.data.top,e.data.width,e.data.height)); +_29e.pmask.show(); +_29e.proxy.css({display:"block",left:e.data.left,top:e.data.top}); +_29e.proxy._outerWidth(e.data.width); +_29e.proxy._outerHeight(e.data.height); +}; +function _2a1(e,_2a2){ +$.extend(e.data,_296.call(_29d,e.data.left,e.data.top,e.data.width+0.1,e.data.height+0.1)); +$(_29d).window(_2a2,e.data); +_29e.pmask.remove(); +_29e.pmask=null; +_29e.proxy.remove(); +_29e.proxy=null; +}; +}; +$(function(){ +if(!$._positionFixed){ +$(window).resize(function(){ +$("body>div.window-mask:visible").css({width:"",height:""}); +setTimeout(function(){ +$("body>div.window-mask:visible").css($.fn.window.getMaskSize()); +},50); +}); +} +}); +$.fn.window=function(_2a3,_2a4){ +if(typeof _2a3=="string"){ +var _2a5=$.fn.window.methods[_2a3]; +if(_2a5){ +return _2a5(this,_2a4); +}else{ +return this.panel(_2a3,_2a4); +} +} +_2a3=_2a3||{}; +return this.each(function(){ +var _2a6=$.data(this,"window"); +if(_2a6){ +$.extend(_2a6.options,_2a3); +}else{ +_2a6=$.data(this,"window",{options:$.extend({},$.fn.window.defaults,$.fn.window.parseOptions(this),_2a3)}); +if(!_2a6.options.inline){ +document.body.appendChild(this); +} +} +_28f(this); +_29c(this); +}); +}; +$.fn.window.methods={options:function(jq){ +var _2a7=jq.panel("options"); +var _2a8=$.data(jq[0],"window").options; +return $.extend(_2a8,{closed:_2a7.closed,collapsed:_2a7.collapsed,minimized:_2a7.minimized,maximized:_2a7.maximized}); +},window:function(jq){ +return $.data(jq[0],"window").window; +},move:function(jq,_2a9){ +return jq.each(function(){ +_281(this,_2a9); +}); +},hcenter:function(jq){ +return jq.each(function(){ +_285(this,true); +}); +},vcenter:function(jq){ +return jq.each(function(){ +_28a(this,true); +}); +},center:function(jq){ +return jq.each(function(){ +_285(this); +_28a(this); +_281(this); +}); +}}; +$.fn.window.getMaskSize=function(_2aa){ +var _2ab=$(_2aa).data("window"); +if(_2ab&&_2ab.options.inline){ +return {}; +}else{ +if($._positionFixed){ +return {position:"fixed"}; +}else{ +return {width:$(document).width(),height:$(document).height()}; +} +} +}; +$.fn.window.parseOptions=function(_2ac){ +return $.extend({},$.fn.panel.parseOptions(_2ac),$.parser.parseOptions(_2ac,[{draggable:"boolean",resizable:"boolean",shadow:"boolean",modal:"boolean",inline:"boolean"}])); +}; +$.fn.window.defaults=$.extend({},$.fn.panel.defaults,{zIndex:9000,draggable:true,resizable:true,shadow:true,modal:false,border:true,inline:false,title:"New Window",collapsible:true,minimizable:true,maximizable:true,closable:true,closed:false,constrain:false}); +})(jQuery); +(function($){ +function _2ad(_2ae){ +var opts=$.data(_2ae,"dialog").options; +opts.inited=false; +$(_2ae).window($.extend({},opts,{onResize:function(w,h){ +if(opts.inited){ +_2b3(this); +opts.onResize.call(this,w,h); +} +}})); +var win=$(_2ae).window("window"); +if(opts.toolbar){ +if($.isArray(opts.toolbar)){ +$(_2ae).siblings("div.dialog-toolbar").remove(); +var _2af=$("
                                        ").appendTo(win); +var tr=_2af.find("tr"); +for(var i=0;i
                                        ").appendTo(tr); +}else{ +var td=$("").appendTo(tr); +var tool=$("").appendTo(td); +tool[0].onclick=eval(btn.handler||function(){ +}); +tool.linkbutton($.extend({},btn,{plain:true})); +} +} +}else{ +$(opts.toolbar).addClass("dialog-toolbar").appendTo(win); +$(opts.toolbar).show(); +} +}else{ +$(_2ae).siblings("div.dialog-toolbar").remove(); +} +if(opts.buttons){ +if($.isArray(opts.buttons)){ +$(_2ae).siblings("div.dialog-button").remove(); +var _2b0=$("
                                        ").appendTo(win); +for(var i=0;i").appendTo(_2b0); +if(p.handler){ +_2b1[0].onclick=p.handler; +} +_2b1.linkbutton(p); +} +}else{ +$(opts.buttons).addClass("dialog-button").appendTo(win); +$(opts.buttons).show(); +} +}else{ +$(_2ae).siblings("div.dialog-button").remove(); +} +opts.inited=true; +var _2b2=opts.closed; +win.show(); +$(_2ae).window("resize",{}); +if(_2b2){ +win.hide(); +} +}; +function _2b3(_2b4,_2b5){ +var t=$(_2b4); +var opts=t.dialog("options"); +var _2b6=opts.noheader; +var tb=t.siblings(".dialog-toolbar"); +var bb=t.siblings(".dialog-button"); +tb.insertBefore(_2b4).css({borderTopWidth:(_2b6?1:0),top:(_2b6?tb.length:0)}); +bb.insertAfter(_2b4); +tb.add(bb)._outerWidth(t._outerWidth()).find(".easyui-fluid:visible").each(function(){ +$(this).triggerHandler("_resize"); +}); +var _2b7=tb._outerHeight()+bb._outerHeight(); +if(!isNaN(parseInt(opts.height))){ +t._outerHeight(t._outerHeight()-_2b7); +}else{ +var _2b8=t._size("min-height"); +if(_2b8){ +t._size("min-height",_2b8-_2b7); +} +var _2b9=t._size("max-height"); +if(_2b9){ +t._size("max-height",_2b9-_2b7); +} +} +var _2ba=$.data(_2b4,"window").shadow; +if(_2ba){ +var cc=t.panel("panel"); +_2ba.css({width:cc._outerWidth(),height:cc._outerHeight()}); +} +}; +$.fn.dialog=function(_2bb,_2bc){ +if(typeof _2bb=="string"){ +var _2bd=$.fn.dialog.methods[_2bb]; +if(_2bd){ +return _2bd(this,_2bc); +}else{ +return this.window(_2bb,_2bc); +} +} +_2bb=_2bb||{}; +return this.each(function(){ +var _2be=$.data(this,"dialog"); +if(_2be){ +$.extend(_2be.options,_2bb); +}else{ +$.data(this,"dialog",{options:$.extend({},$.fn.dialog.defaults,$.fn.dialog.parseOptions(this),_2bb)}); +} +_2ad(this); +}); +}; +$.fn.dialog.methods={options:function(jq){ +var _2bf=$.data(jq[0],"dialog").options; +var _2c0=jq.panel("options"); +$.extend(_2bf,{width:_2c0.width,height:_2c0.height,left:_2c0.left,top:_2c0.top,closed:_2c0.closed,collapsed:_2c0.collapsed,minimized:_2c0.minimized,maximized:_2c0.maximized}); +return _2bf; +},dialog:function(jq){ +return jq.window("window"); +}}; +$.fn.dialog.parseOptions=function(_2c1){ +var t=$(_2c1); +return $.extend({},$.fn.window.parseOptions(_2c1),$.parser.parseOptions(_2c1,["toolbar","buttons"]),{toolbar:(t.children(".dialog-toolbar").length?t.children(".dialog-toolbar").removeClass("dialog-toolbar"):undefined),buttons:(t.children(".dialog-button").length?t.children(".dialog-button").removeClass("dialog-button"):undefined)}); +}; +$.fn.dialog.defaults=$.extend({},$.fn.window.defaults,{title:"New Dialog",collapsible:false,minimizable:false,maximizable:false,resizable:false,toolbar:null,buttons:null}); +})(jQuery); +(function($){ +function _2c2(){ +$(document).unbind(".messager").bind("keydown.messager",function(e){ +if(e.keyCode==27){ +$("body").children("div.messager-window").children("div.messager-body").each(function(){ +$(this).dialog("close"); +}); +}else{ +if(e.keyCode==9){ +var win=$("body").children("div.messager-window"); +if(!win.length){ +return; +} +var _2c3=win.find(".messager-input,.messager-button .l-btn"); +for(var i=0;i<_2c3.length;i++){ +if($(_2c3[i]).is(":focus")){ +$(_2c3[i>=_2c3.length-1?0:i+1]).focus(); +return false; +} +} +}else{ +if(e.keyCode==13){ +var _2c4=$(e.target).closest("input.messager-input"); +if(_2c4.length){ +var dlg=_2c4.closest(".messager-body"); +_2c5(dlg,_2c4.val()); +} +} +} +} +}); +}; +function _2c6(){ +$(document).unbind(".messager"); +}; +function _2c7(_2c8){ +var opts=$.extend({},$.messager.defaults,{modal:false,shadow:false,draggable:false,resizable:false,closed:true,style:{left:"",top:"",right:0,zIndex:$.fn.window.defaults.zIndex++,bottom:-document.body.scrollTop-document.documentElement.scrollTop},title:"",width:300,height:150,minHeight:0,showType:"slide",showSpeed:600,content:_2c8.msg,timeout:4000},_2c8); +var dlg=$("
                                        ").appendTo("body"); +dlg.dialog($.extend({},opts,{noheader:(opts.title?false:true),openAnimation:(opts.showType),closeAnimation:(opts.showType=="show"?"hide":opts.showType),openDuration:opts.showSpeed,closeDuration:opts.showSpeed,onOpen:function(){ +dlg.dialog("dialog").hover(function(){ +if(opts.timer){ +clearTimeout(opts.timer); +} +},function(){ +_2c9(); +}); +_2c9(); +function _2c9(){ +if(opts.timeout>0){ +opts.timer=setTimeout(function(){ +if(dlg.length&&dlg.data("dialog")){ +dlg.dialog("close"); +} +},opts.timeout); +} +}; +if(_2c8.onOpen){ +_2c8.onOpen.call(this); +}else{ +opts.onOpen.call(this); +} +},onClose:function(){ +if(opts.timer){ +clearTimeout(opts.timer); +} +if(_2c8.onClose){ +_2c8.onClose.call(this); +}else{ +opts.onClose.call(this); +} +dlg.dialog("destroy"); +}})); +dlg.dialog("dialog").css(opts.style); +dlg.dialog("open"); +return dlg; +}; +function _2ca(_2cb){ +_2c2(); +var dlg=$("
                                        ").appendTo("body"); +dlg.dialog($.extend({},_2cb,{noheader:(_2cb.title?false:true),onClose:function(){ +_2c6(); +if(_2cb.onClose){ +_2cb.onClose.call(this); +} +dlg.dialog("destroy"); +}})); +var win=dlg.dialog("dialog").addClass("messager-window"); +win.find(".dialog-button").addClass("messager-button").find("a:first").focus(); +return dlg; +}; +function _2c5(dlg,_2cc){ +var opts=dlg.dialog("options"); +dlg.dialog("close"); +opts.fn(_2cc); +}; +$.messager={show:function(_2cd){ +return _2c7(_2cd); +},alert:function(_2ce,msg,icon,fn){ +var opts=typeof _2ce=="object"?_2ce:{title:_2ce,msg:msg,icon:icon,fn:fn}; +var cls=opts.icon?"messager-icon messager-"+opts.icon:""; +opts=$.extend({},$.messager.defaults,{content:"
                                        "+"
                                        "+opts.msg+"
                                        "+"
                                        "},opts); +if(!opts.buttons){ +opts.buttons=[{text:opts.ok,onClick:function(){ +_2c5(dlg); +}}]; +} +var dlg=_2ca(opts); +return dlg; +},confirm:function(_2cf,msg,fn){ +var opts=typeof _2cf=="object"?_2cf:{title:_2cf,msg:msg,fn:fn}; +opts=$.extend({},$.messager.defaults,{content:"
                                        "+"
                                        "+opts.msg+"
                                        "+"
                                        "},opts); +if(!opts.buttons){ +opts.buttons=[{text:opts.ok,onClick:function(){ +_2c5(dlg,true); +}},{text:opts.cancel,onClick:function(){ +_2c5(dlg,false); +}}]; +} +var dlg=_2ca(opts); +return dlg; +},prompt:function(_2d0,msg,fn){ +var opts=typeof _2d0=="object"?_2d0:{title:_2d0,msg:msg,fn:fn}; +opts=$.extend({},$.messager.defaults,{content:"
                                        "+"
                                        "+opts.msg+"
                                        "+"
                                        "+"
                                        "+"
                                        "},opts); +if(!opts.buttons){ +opts.buttons=[{text:opts.ok,onClick:function(){ +_2c5(dlg,dlg.find(".messager-input").val()); +}},{text:opts.cancel,onClick:function(){ +_2c5(dlg); +}}]; +} +var dlg=_2ca(opts); +dlg.find(".messager-input").focus(); +return dlg; +},progress:function(_2d1){ +var _2d2={bar:function(){ +return $("body>div.messager-window").find("div.messager-p-bar"); +},close:function(){ +var dlg=$("body>div.messager-window>div.messager-body:has(div.messager-progress)"); +if(dlg.length){ +dlg.dialog("close"); +} +}}; +if(typeof _2d1=="string"){ +var _2d3=_2d2[_2d1]; +return _2d3(); +} +_2d1=_2d1||{}; +var opts=$.extend({},{title:"",minHeight:0,content:undefined,msg:"",text:undefined,interval:300},_2d1); +var dlg=_2ca($.extend({},$.messager.defaults,{content:"
                                        "+opts.msg+"
                                        ",closable:false,doSize:false},opts,{onClose:function(){ +if(this.timer){ +clearInterval(this.timer); +} +if(_2d1.onClose){ +_2d1.onClose.call(this); +}else{ +$.messager.defaults.onClose.call(this); +} +}})); +var bar=dlg.find("div.messager-p-bar"); +bar.progressbar({text:opts.text}); +dlg.dialog("resize"); +if(opts.interval){ +dlg[0].timer=setInterval(function(){ +var v=bar.progressbar("getValue"); +v+=10; +if(v>100){ +v=0; +} +bar.progressbar("setValue",v); +},opts.interval); +} +return dlg; +}}; +$.messager.defaults=$.extend({},$.fn.dialog.defaults,{ok:"Ok",cancel:"Cancel",width:300,height:"auto",minHeight:150,modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,fn:function(){ +}}); +})(jQuery); +(function($){ +function _2d4(_2d5,_2d6){ +var _2d7=$.data(_2d5,"accordion"); +var opts=_2d7.options; +var _2d8=_2d7.panels; +var cc=$(_2d5); +var _2d9=(opts.halign=="left"||opts.halign=="right"); +cc.children(".panel-last").removeClass("panel-last"); +cc.children(".panel:last").addClass("panel-last"); +if(_2d6){ +$.extend(opts,{width:_2d6.width,height:_2d6.height}); +} +cc._size(opts); +var _2da=0; +var _2db="auto"; +var _2dc=cc.find(">.panel>.accordion-header"); +if(_2dc.length){ +if(_2d9){ +$(_2d8[0]).panel("resize",{width:cc.width(),height:cc.height()}); +_2da=$(_2dc[0])._outerWidth(); +}else{ +_2da=$(_2dc[0]).css("height","")._outerHeight(); +} +} +if(!isNaN(parseInt(opts.height))){ +if(_2d9){ +_2db=cc.width()-_2da*_2dc.length; +}else{ +_2db=cc.height()-_2da*_2dc.length; +} +} +_2dd(true,_2db-_2dd(false)); +function _2dd(_2de,_2df){ +var _2e0=0; +for(var i=0;i<_2d8.length;i++){ +var p=_2d8[i]; +if(_2d9){ +var h=p.panel("header")._outerWidth(_2da); +}else{ +var h=p.panel("header")._outerHeight(_2da); +} +if(p.panel("options").collapsible==_2de){ +var _2e1=isNaN(_2df)?undefined:(_2df+_2da*h.length); +if(_2d9){ +p.panel("resize",{height:cc.height(),width:(_2de?_2e1:undefined)}); +_2e0+=p.panel("panel")._outerWidth()-_2da*h.length; +}else{ +p.panel("resize",{width:cc.width(),height:(_2de?_2e1:undefined)}); +_2e0+=p.panel("panel").outerHeight()-_2da*h.length; +} +} +} +return _2e0; +}; +}; +function _2e2(_2e3,_2e4,_2e5,all){ +var _2e6=$.data(_2e3,"accordion").panels; +var pp=[]; +for(var i=0;i<_2e6.length;i++){ +var p=_2e6[i]; +if(_2e4){ +if(p.panel("options")[_2e4]==_2e5){ +pp.push(p); +} +}else{ +if(p[0]==$(_2e5)[0]){ +return i; +} +} +} +if(_2e4){ +return all?pp:(pp.length?pp[0]:null); +}else{ +return -1; +} +}; +function _2e7(_2e8){ +return _2e2(_2e8,"collapsed",false,true); +}; +function _2e9(_2ea){ +var pp=_2e7(_2ea); +return pp.length?pp[0]:null; +}; +function _2eb(_2ec,_2ed){ +return _2e2(_2ec,null,_2ed); +}; +function _2ee(_2ef,_2f0){ +var _2f1=$.data(_2ef,"accordion").panels; +if(typeof _2f0=="number"){ +if(_2f0<0||_2f0>=_2f1.length){ +return null; +}else{ +return _2f1[_2f0]; +} +} +return _2e2(_2ef,"title",_2f0); +}; +function _2f2(_2f3){ +var opts=$.data(_2f3,"accordion").options; +var cc=$(_2f3); +if(opts.border){ +cc.removeClass("accordion-noborder"); +}else{ +cc.addClass("accordion-noborder"); +} +}; +function init(_2f4){ +var _2f5=$.data(_2f4,"accordion"); +var cc=$(_2f4); +cc.addClass("accordion"); +_2f5.panels=[]; +cc.children("div").each(function(){ +var opts=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); +var pp=$(this); +_2f5.panels.push(pp); +_2f7(_2f4,pp,opts); +}); +cc.bind("_resize",function(e,_2f6){ +if($(this).hasClass("easyui-fluid")||_2f6){ +_2d4(_2f4); +} +return false; +}); +}; +function _2f7(_2f8,pp,_2f9){ +var opts=$.data(_2f8,"accordion").options; +pp.panel($.extend({},{collapsible:true,minimizable:false,maximizable:false,closable:false,doSize:false,collapsed:true,headerCls:"accordion-header",bodyCls:"accordion-body",halign:opts.halign},_2f9,{onBeforeExpand:function(){ +if(_2f9.onBeforeExpand){ +if(_2f9.onBeforeExpand.call(this)==false){ +return false; +} +} +if(!opts.multiple){ +var all=$.grep(_2e7(_2f8),function(p){ +return p.panel("options").collapsible; +}); +for(var i=0;i.panel-last>.accordion-header").removeClass("accordion-header-border"); +if(_2f9.onExpand){ +_2f9.onExpand.call(this); +} +opts.onSelect.call(_2f8,$(this).panel("options").title,_2eb(_2f8,this)); +},onBeforeCollapse:function(){ +if(_2f9.onBeforeCollapse){ +if(_2f9.onBeforeCollapse.call(this)==false){ +return false; +} +} +$(_2f8).find(">.panel-last>.accordion-header").addClass("accordion-header-border"); +var _2fb=$(this).panel("header"); +_2fb.removeClass("accordion-header-selected"); +_2fb.find(".accordion-collapse").addClass("accordion-expand"); +},onCollapse:function(){ +if(isNaN(parseInt(opts.height))){ +$(_2f8).find(">.panel-last>.accordion-header").removeClass("accordion-header-border"); +} +if(_2f9.onCollapse){ +_2f9.onCollapse.call(this); +} +opts.onUnselect.call(_2f8,$(this).panel("options").title,_2eb(_2f8,this)); +}})); +var _2fc=pp.panel("header"); +var tool=_2fc.children("div.panel-tool"); +tool.children("a.panel-tool-collapse").hide(); +var t=$("").addClass("accordion-collapse accordion-expand").appendTo(tool); +t.bind("click",function(){ +_2fd(pp); +return false; +}); +pp.panel("options").collapsible?t.show():t.hide(); +if(opts.halign=="left"||opts.halign=="right"){ +t.hide(); +} +_2fc.click(function(){ +_2fd(pp); +return false; +}); +function _2fd(p){ +var _2fe=p.panel("options"); +if(_2fe.collapsible){ +var _2ff=_2eb(_2f8,p); +if(_2fe.collapsed){ +_300(_2f8,_2ff); +}else{ +_301(_2f8,_2ff); +} +} +}; +}; +function _300(_302,_303){ +var p=_2ee(_302,_303); +if(!p){ +return; +} +_304(_302); +var opts=$.data(_302,"accordion").options; +p.panel("expand",opts.animate); +}; +function _301(_305,_306){ +var p=_2ee(_305,_306); +if(!p){ +return; +} +_304(_305); +var opts=$.data(_305,"accordion").options; +p.panel("collapse",opts.animate); +}; +function _307(_308){ +var opts=$.data(_308,"accordion").options; +$(_308).find(">.panel-last>.accordion-header").addClass("accordion-header-border"); +var p=_2e2(_308,"selected",true); +if(p){ +_309(_2eb(_308,p)); +}else{ +_309(opts.selected); +} +function _309(_30a){ +var _30b=opts.animate; +opts.animate=false; +_300(_308,_30a); +opts.animate=_30b; +}; +}; +function _304(_30c){ +var _30d=$.data(_30c,"accordion").panels; +for(var i=0;i<_30d.length;i++){ +_30d[i].stop(true,true); +} +}; +function add(_30e,_30f){ +var _310=$.data(_30e,"accordion"); +var opts=_310.options; +var _311=_310.panels; +if(_30f.selected==undefined){ +_30f.selected=true; +} +_304(_30e); +var pp=$("
                                        ").appendTo(_30e); +_311.push(pp); +_2f7(_30e,pp,_30f); +_2d4(_30e); +opts.onAdd.call(_30e,_30f.title,_311.length-1); +if(_30f.selected){ +_300(_30e,_311.length-1); +} +}; +function _312(_313,_314){ +var _315=$.data(_313,"accordion"); +var opts=_315.options; +var _316=_315.panels; +_304(_313); +var _317=_2ee(_313,_314); +var _318=_317.panel("options").title; +var _319=_2eb(_313,_317); +if(!_317){ +return; +} +if(opts.onBeforeRemove.call(_313,_318,_319)==false){ +return; +} +_316.splice(_319,1); +_317.panel("destroy"); +if(_316.length){ +_2d4(_313); +var curr=_2e9(_313); +if(!curr){ +_300(_313,0); +} +} +opts.onRemove.call(_313,_318,_319); +}; +$.fn.accordion=function(_31a,_31b){ +if(typeof _31a=="string"){ +return $.fn.accordion.methods[_31a](this,_31b); +} +_31a=_31a||{}; +return this.each(function(){ +var _31c=$.data(this,"accordion"); +if(_31c){ +$.extend(_31c.options,_31a); +}else{ +$.data(this,"accordion",{options:$.extend({},$.fn.accordion.defaults,$.fn.accordion.parseOptions(this),_31a),accordion:$(this).addClass("accordion"),panels:[]}); +init(this); +} +_2f2(this); +_2d4(this); +_307(this); +}); +}; +$.fn.accordion.methods={options:function(jq){ +return $.data(jq[0],"accordion").options; +},panels:function(jq){ +return $.data(jq[0],"accordion").panels; +},resize:function(jq,_31d){ +return jq.each(function(){ +_2d4(this,_31d); +}); +},getSelections:function(jq){ +return _2e7(jq[0]); +},getSelected:function(jq){ +return _2e9(jq[0]); +},getPanel:function(jq,_31e){ +return _2ee(jq[0],_31e); +},getPanelIndex:function(jq,_31f){ +return _2eb(jq[0],_31f); +},select:function(jq,_320){ +return jq.each(function(){ +_300(this,_320); +}); +},unselect:function(jq,_321){ +return jq.each(function(){ +_301(this,_321); +}); +},add:function(jq,_322){ +return jq.each(function(){ +add(this,_322); +}); +},remove:function(jq,_323){ +return jq.each(function(){ +_312(this,_323); +}); +}}; +$.fn.accordion.parseOptions=function(_324){ +var t=$(_324); +return $.extend({},$.parser.parseOptions(_324,["width","height","halign",{fit:"boolean",border:"boolean",animate:"boolean",multiple:"boolean",selected:"number"}])); +}; +$.fn.accordion.defaults={width:"auto",height:"auto",fit:false,border:true,animate:true,multiple:false,selected:0,halign:"top",onSelect:function(_325,_326){ +},onUnselect:function(_327,_328){ +},onAdd:function(_329,_32a){ +},onBeforeRemove:function(_32b,_32c){ +},onRemove:function(_32d,_32e){ +}}; +})(jQuery); +(function($){ +function _32f(c){ +var w=0; +$(c).children().each(function(){ +w+=$(this).outerWidth(true); +}); +return w; +}; +function _330(_331){ +var opts=$.data(_331,"tabs").options; +if(!opts.showHeader){ +return; +} +var _332=$(_331).children("div.tabs-header"); +var tool=_332.children("div.tabs-tool:not(.tabs-tool-hidden)"); +var _333=_332.children("div.tabs-scroller-left"); +var _334=_332.children("div.tabs-scroller-right"); +var wrap=_332.children("div.tabs-wrap"); +if(opts.tabPosition=="left"||opts.tabPosition=="right"){ +if(!tool.length){ +return; +} +tool._outerWidth(_332.width()); +var _335={left:opts.tabPosition=="left"?"auto":0,right:opts.tabPosition=="left"?0:"auto",top:opts.toolPosition=="top"?0:"auto",bottom:opts.toolPosition=="top"?"auto":0}; +var _336={marginTop:opts.toolPosition=="top"?tool.outerHeight():0}; +tool.css(_335); +wrap.css(_336); +return; +} +var _337=_332.outerHeight(); +if(opts.plain){ +_337-=_337-_332.height(); +} +tool._outerHeight(_337); +var _338=_32f(_332.find("ul.tabs")); +var _339=_332.width()-tool._outerWidth(); +if(_338>_339){ +_333.add(_334).show()._outerHeight(_337); +if(opts.toolPosition=="left"){ +tool.css({left:_333.outerWidth(),right:""}); +wrap.css({marginLeft:_333.outerWidth()+tool._outerWidth(),marginRight:_334._outerWidth(),width:_339-_333.outerWidth()-_334.outerWidth()}); +}else{ +tool.css({left:"",right:_334.outerWidth()}); +wrap.css({marginLeft:_333.outerWidth(),marginRight:_334.outerWidth()+tool._outerWidth(),width:_339-_333.outerWidth()-_334.outerWidth()}); +} +}else{ +_333.add(_334).hide(); +if(opts.toolPosition=="left"){ +tool.css({left:0,right:""}); +wrap.css({marginLeft:tool._outerWidth(),marginRight:0,width:_339}); +}else{ +tool.css({left:"",right:0}); +wrap.css({marginLeft:0,marginRight:tool._outerWidth(),width:_339}); +} +} +}; +function _33a(_33b){ +var opts=$.data(_33b,"tabs").options; +var _33c=$(_33b).children("div.tabs-header"); +if(opts.tools){ +if(typeof opts.tools=="string"){ +$(opts.tools).addClass("tabs-tool").appendTo(_33c); +$(opts.tools).show(); +}else{ +_33c.children("div.tabs-tool").remove(); +var _33d=$("
                                        ").appendTo(_33c); +var tr=_33d.find("tr"); +for(var i=0;i").appendTo(tr); +var tool=$("").appendTo(td); +tool[0].onclick=eval(opts.tools[i].handler||function(){ +}); +tool.linkbutton($.extend({},opts.tools[i],{plain:true})); +} +} +}else{ +_33c.children("div.tabs-tool").remove(); +} +}; +function _33e(_33f,_340){ +var _341=$.data(_33f,"tabs"); +var opts=_341.options; +var cc=$(_33f); +if(!opts.doSize){ +return; +} +if(_340){ +$.extend(opts,{width:_340.width,height:_340.height}); +} +cc._size(opts); +var _342=cc.children("div.tabs-header"); +var _343=cc.children("div.tabs-panels"); +var wrap=_342.find("div.tabs-wrap"); +var ul=wrap.find(".tabs"); +ul.children("li").removeClass("tabs-first tabs-last"); +ul.children("li:first").addClass("tabs-first"); +ul.children("li:last").addClass("tabs-last"); +if(opts.tabPosition=="left"||opts.tabPosition=="right"){ +_342._outerWidth(opts.showHeader?opts.headerWidth:0); +_343._outerWidth(cc.width()-_342.outerWidth()); +_342.add(_343)._size("height",isNaN(parseInt(opts.height))?"":cc.height()); +wrap._outerWidth(_342.width()); +ul._outerWidth(wrap.width()).css("height",""); +}else{ +_342.children("div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)").css("display",opts.showHeader?"block":"none"); +_342._outerWidth(cc.width()).css("height",""); +if(opts.showHeader){ +_342.css("background-color",""); +wrap.css("height",""); +}else{ +_342.css("background-color","transparent"); +_342._outerHeight(0); +wrap._outerHeight(0); +} +ul._outerHeight(opts.tabHeight).css("width",""); +ul._outerHeight(ul.outerHeight()-ul.height()-1+opts.tabHeight).css("width",""); +_343._size("height",isNaN(parseInt(opts.height))?"":(cc.height()-_342.outerHeight())); +_343._size("width",cc.width()); +} +if(_341.tabs.length){ +var d1=ul.outerWidth(true)-ul.width(); +var li=ul.children("li:first"); +var d2=li.outerWidth(true)-li.width(); +var _344=_342.width()-_342.children(".tabs-tool:not(.tabs-tool-hidden)")._outerWidth(); +var _345=Math.floor((_344-d1-d2*_341.tabs.length)/_341.tabs.length); +$.map(_341.tabs,function(p){ +_346(p,(opts.justified&&$.inArray(opts.tabPosition,["top","bottom"])>=0)?_345:undefined); +}); +if(opts.justified&&$.inArray(opts.tabPosition,["top","bottom"])>=0){ +var _347=_344-d1-_32f(ul); +_346(_341.tabs[_341.tabs.length-1],_345+_347); +} +} +_330(_33f); +function _346(p,_348){ +var _349=p.panel("options"); +var p_t=_349.tab.find("a.tabs-inner"); +var _348=_348?_348:(parseInt(_349.tabWidth||opts.tabWidth||undefined)); +if(_348){ +p_t._outerWidth(_348); +}else{ +p_t.css("width",""); +} +p_t._outerHeight(opts.tabHeight); +p_t.css("lineHeight",p_t.height()+"px"); +p_t.find(".easyui-fluid:visible").triggerHandler("_resize"); +}; +}; +function _34a(_34b){ +var opts=$.data(_34b,"tabs").options; +var tab=_34c(_34b); +if(tab){ +var _34d=$(_34b).children("div.tabs-panels"); +var _34e=opts.width=="auto"?"auto":_34d.width(); +var _34f=opts.height=="auto"?"auto":_34d.height(); +tab.panel("resize",{width:_34e,height:_34f}); +} +}; +function _350(_351){ +var tabs=$.data(_351,"tabs").tabs; +var cc=$(_351).addClass("tabs-container"); +var _352=$("
                                        ").insertBefore(cc); +cc.children("div").each(function(){ +_352[0].appendChild(this); +}); +cc[0].appendChild(_352[0]); +$("
                                        "+"
                                        "+"
                                        "+"
                                        "+"
                                          "+"
                                          "+"
                                          ").prependTo(_351); +cc.children("div.tabs-panels").children("div").each(function(i){ +var opts=$.extend({},$.parser.parseOptions(this),{disabled:($(this).attr("disabled")?true:undefined),selected:($(this).attr("selected")?true:undefined)}); +_35f(_351,opts,$(this)); +}); +cc.children("div.tabs-header").find(".tabs-scroller-left, .tabs-scroller-right").hover(function(){ +$(this).addClass("tabs-scroller-over"); +},function(){ +$(this).removeClass("tabs-scroller-over"); +}); +cc.bind("_resize",function(e,_353){ +if($(this).hasClass("easyui-fluid")||_353){ +_33e(_351); +_34a(_351); +} +return false; +}); +}; +function _354(_355){ +var _356=$.data(_355,"tabs"); +var opts=_356.options; +$(_355).children("div.tabs-header").unbind().bind("click",function(e){ +if($(e.target).hasClass("tabs-scroller-left")){ +$(_355).tabs("scrollBy",-opts.scrollIncrement); +}else{ +if($(e.target).hasClass("tabs-scroller-right")){ +$(_355).tabs("scrollBy",opts.scrollIncrement); +}else{ +var li=$(e.target).closest("li"); +if(li.hasClass("tabs-disabled")){ +return false; +} +var a=$(e.target).closest("a.tabs-close"); +if(a.length){ +_379(_355,_357(li)); +}else{ +if(li.length){ +var _358=_357(li); +var _359=_356.tabs[_358].panel("options"); +if(_359.collapsible){ +_359.closed?_370(_355,_358):_390(_355,_358); +}else{ +_370(_355,_358); +} +} +} +return false; +} +} +}).bind("contextmenu",function(e){ +var li=$(e.target).closest("li"); +if(li.hasClass("tabs-disabled")){ +return; +} +if(li.length){ +opts.onContextMenu.call(_355,e,li.find("span.tabs-title").html(),_357(li)); +} +}); +function _357(li){ +var _35a=0; +li.parent().children("li").each(function(i){ +if(li[0]==this){ +_35a=i; +return false; +} +}); +return _35a; +}; +}; +function _35b(_35c){ +var opts=$.data(_35c,"tabs").options; +var _35d=$(_35c).children("div.tabs-header"); +var _35e=$(_35c).children("div.tabs-panels"); +_35d.removeClass("tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right"); +_35e.removeClass("tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right"); +if(opts.tabPosition=="top"){ +_35d.insertBefore(_35e); +}else{ +if(opts.tabPosition=="bottom"){ +_35d.insertAfter(_35e); +_35d.addClass("tabs-header-bottom"); +_35e.addClass("tabs-panels-top"); +}else{ +if(opts.tabPosition=="left"){ +_35d.addClass("tabs-header-left"); +_35e.addClass("tabs-panels-right"); +}else{ +if(opts.tabPosition=="right"){ +_35d.addClass("tabs-header-right"); +_35e.addClass("tabs-panels-left"); +} +} +} +} +if(opts.plain==true){ +_35d.addClass("tabs-header-plain"); +}else{ +_35d.removeClass("tabs-header-plain"); +} +_35d.removeClass("tabs-header-narrow").addClass(opts.narrow?"tabs-header-narrow":""); +var tabs=_35d.find(".tabs"); +tabs.removeClass("tabs-pill").addClass(opts.pill?"tabs-pill":""); +tabs.removeClass("tabs-narrow").addClass(opts.narrow?"tabs-narrow":""); +tabs.removeClass("tabs-justified").addClass(opts.justified?"tabs-justified":""); +if(opts.border==true){ +_35d.removeClass("tabs-header-noborder"); +_35e.removeClass("tabs-panels-noborder"); +}else{ +_35d.addClass("tabs-header-noborder"); +_35e.addClass("tabs-panels-noborder"); +} +opts.doSize=true; +}; +function _35f(_360,_361,pp){ +_361=_361||{}; +var _362=$.data(_360,"tabs"); +var tabs=_362.tabs; +if(_361.index==undefined||_361.index>tabs.length){ +_361.index=tabs.length; +} +if(_361.index<0){ +_361.index=0; +} +var ul=$(_360).children("div.tabs-header").find("ul.tabs"); +var _363=$(_360).children("div.tabs-panels"); +var tab=$("
                                        • "+""+""+""+""+"
                                        • "); +if(!pp){ +pp=$("
                                          "); +} +if(_361.index>=tabs.length){ +tab.appendTo(ul); +pp.appendTo(_363); +tabs.push(pp); +}else{ +tab.insertBefore(ul.children("li:eq("+_361.index+")")); +pp.insertBefore(_363.children("div.panel:eq("+_361.index+")")); +tabs.splice(_361.index,0,pp); +} +pp.panel($.extend({},_361,{tab:tab,border:false,noheader:true,closed:true,doSize:false,iconCls:(_361.icon?_361.icon:undefined),onLoad:function(){ +if(_361.onLoad){ +_361.onLoad.apply(this,arguments); +} +_362.options.onLoad.call(_360,$(this)); +},onBeforeOpen:function(){ +if(_361.onBeforeOpen){ +if(_361.onBeforeOpen.call(this)==false){ +return false; +} +} +var p=$(_360).tabs("getSelected"); +if(p){ +if(p[0]!=this){ +$(_360).tabs("unselect",_36b(_360,p)); +p=$(_360).tabs("getSelected"); +if(p){ +return false; +} +}else{ +_34a(_360); +return false; +} +} +var _364=$(this).panel("options"); +_364.tab.addClass("tabs-selected"); +var wrap=$(_360).find(">div.tabs-header>div.tabs-wrap"); +var left=_364.tab.position().left; +var _365=left+_364.tab.outerWidth(); +if(left<0||_365>wrap.width()){ +var _366=left-(wrap.width()-_364.tab.width())/2; +$(_360).tabs("scrollBy",_366); +}else{ +$(_360).tabs("scrollBy",0); +} +var _367=$(this).panel("panel"); +_367.css("display","block"); +_34a(_360); +_367.css("display","none"); +},onOpen:function(){ +if(_361.onOpen){ +_361.onOpen.call(this); +} +var _368=$(this).panel("options"); +var _369=_36b(_360,this); +_362.selectHis.push(_369); +_362.options.onSelect.call(_360,_368.title,_369); +},onBeforeClose:function(){ +if(_361.onBeforeClose){ +if(_361.onBeforeClose.call(this)==false){ +return false; +} +} +$(this).panel("options").tab.removeClass("tabs-selected"); +},onClose:function(){ +if(_361.onClose){ +_361.onClose.call(this); +} +var _36a=$(this).panel("options"); +_362.options.onUnselect.call(_360,_36a.title,_36b(_360,this)); +}})); +$(_360).tabs("update",{tab:pp,options:pp.panel("options"),type:"header"}); +}; +function _36c(_36d,_36e){ +var _36f=$.data(_36d,"tabs"); +var opts=_36f.options; +if(_36e.selected==undefined){ +_36e.selected=true; +} +_35f(_36d,_36e); +opts.onAdd.call(_36d,_36e.title,_36e.index); +if(_36e.selected){ +_370(_36d,_36e.index); +} +}; +function _371(_372,_373){ +_373.type=_373.type||"all"; +var _374=$.data(_372,"tabs").selectHis; +var pp=_373.tab; +var opts=pp.panel("options"); +var _375=opts.title; +$.extend(opts,_373.options,{iconCls:(_373.options.icon?_373.options.icon:undefined)}); +if(_373.type=="all"||_373.type=="body"){ +pp.panel(); +} +if(_373.type=="all"||_373.type=="header"){ +var tab=opts.tab; +if(opts.header){ +tab.find(".tabs-inner").html($(opts.header)); +}else{ +var _376=tab.find("span.tabs-title"); +var _377=tab.find("span.tabs-icon"); +_376.html(opts.title); +_377.attr("class","tabs-icon"); +tab.find("a.tabs-close").remove(); +if(opts.closable){ +_376.addClass("tabs-closable"); +$("").appendTo(tab); +}else{ +_376.removeClass("tabs-closable"); +} +if(opts.iconCls){ +_376.addClass("tabs-with-icon"); +_377.addClass(opts.iconCls); +}else{ +_376.removeClass("tabs-with-icon"); +} +if(opts.tools){ +var _378=tab.find("span.tabs-p-tool"); +if(!_378.length){ +var _378=$("").insertAfter(tab.find("a.tabs-inner")); +} +if($.isArray(opts.tools)){ +_378.empty(); +for(var i=0;i").appendTo(_378); +t.addClass(opts.tools[i].iconCls); +if(opts.tools[i].handler){ +t.bind("click",{handler:opts.tools[i].handler},function(e){ +if($(this).parents("li").hasClass("tabs-disabled")){ +return; +} +e.data.handler.call(this); +}); +} +} +}else{ +$(opts.tools).children().appendTo(_378); +} +var pr=_378.children().length*12; +if(opts.closable){ +pr+=8; +_378.css("right",""); +}else{ +pr-=3; +_378.css("right","5px"); +} +_376.css("padding-right",pr+"px"); +}else{ +tab.find("span.tabs-p-tool").remove(); +_376.css("padding-right",""); +} +} +} +if(opts.disabled){ +opts.tab.addClass("tabs-disabled"); +}else{ +opts.tab.removeClass("tabs-disabled"); +} +_33e(_372); +$.data(_372,"tabs").options.onUpdate.call(_372,opts.title,_36b(_372,pp)); +}; +function _379(_37a,_37b){ +var _37c=$.data(_37a,"tabs"); +var opts=_37c.options; +var tabs=_37c.tabs; +var _37d=_37c.selectHis; +if(!_37e(_37a,_37b)){ +return; +} +var tab=_37f(_37a,_37b); +var _380=tab.panel("options").title; +var _381=_36b(_37a,tab); +if(opts.onBeforeClose.call(_37a,_380,_381)==false){ +return; +} +var tab=_37f(_37a,_37b,true); +tab.panel("options").tab.remove(); +tab.panel("destroy"); +opts.onClose.call(_37a,_380,_381); +_33e(_37a); +var his=[]; +for(var i=0;i<_37d.length;i++){ +var _382=_37d[i]; +if(_382!=_381){ +his.push(_382>_381?_382-1:_382); +} +} +_37c.selectHis=his; +var _383=$(_37a).tabs("getSelected"); +if(!_383&&his.length){ +_381=_37c.selectHis.pop(); +$(_37a).tabs("select",_381); +} +}; +function _37f(_384,_385,_386){ +var tabs=$.data(_384,"tabs").tabs; +var tab=null; +if(typeof _385=="number"){ +if(_385>=0&&_385"); +for(var i=0;i.tabs-header>.tabs-tool"); +if(_39b){ +tool.removeClass("tabs-tool-hidden").show(); +}else{ +tool.addClass("tabs-tool-hidden").hide(); +} +$(_39a).tabs("resize").tabs("scrollBy",0); +}; +$.fn.tabs=function(_39c,_39d){ +if(typeof _39c=="string"){ +return $.fn.tabs.methods[_39c](this,_39d); +} +_39c=_39c||{}; +return this.each(function(){ +var _39e=$.data(this,"tabs"); +if(_39e){ +$.extend(_39e.options,_39c); +}else{ +$.data(this,"tabs",{options:$.extend({},$.fn.tabs.defaults,$.fn.tabs.parseOptions(this),_39c),tabs:[],selectHis:[]}); +_350(this); +} +_33a(this); +_35b(this); +_33e(this); +_354(this); +_38a(this); +}); +}; +$.fn.tabs.methods={options:function(jq){ +var cc=jq[0]; +var opts=$.data(cc,"tabs").options; +var s=_34c(cc); +opts.selected=s?_36b(cc,s):-1; +return opts; +},tabs:function(jq){ +return $.data(jq[0],"tabs").tabs; +},resize:function(jq,_39f){ +return jq.each(function(){ +_33e(this,_39f); +_34a(this); +}); +},add:function(jq,_3a0){ +return jq.each(function(){ +_36c(this,_3a0); +}); +},close:function(jq,_3a1){ +return jq.each(function(){ +_379(this,_3a1); +}); +},getTab:function(jq,_3a2){ +return _37f(jq[0],_3a2); +},getTabIndex:function(jq,tab){ +return _36b(jq[0],tab); +},getSelected:function(jq){ +return _34c(jq[0]); +},select:function(jq,_3a3){ +return jq.each(function(){ +_370(this,_3a3); +}); +},unselect:function(jq,_3a4){ +return jq.each(function(){ +_390(this,_3a4); +}); +},exists:function(jq,_3a5){ +return _37e(jq[0],_3a5); +},update:function(jq,_3a6){ +return jq.each(function(){ +_371(this,_3a6); +}); +},enableTab:function(jq,_3a7){ +return jq.each(function(){ +var opts=$(this).tabs("getTab",_3a7).panel("options"); +opts.tab.removeClass("tabs-disabled"); +opts.disabled=false; +}); +},disableTab:function(jq,_3a8){ +return jq.each(function(){ +var opts=$(this).tabs("getTab",_3a8).panel("options"); +opts.tab.addClass("tabs-disabled"); +opts.disabled=true; +}); +},showHeader:function(jq){ +return jq.each(function(){ +_396(this,true); +}); +},hideHeader:function(jq){ +return jq.each(function(){ +_396(this,false); +}); +},showTool:function(jq){ +return jq.each(function(){ +_399(this,true); +}); +},hideTool:function(jq){ +return jq.each(function(){ +_399(this,false); +}); +},scrollBy:function(jq,_3a9){ +return jq.each(function(){ +var opts=$(this).tabs("options"); +var wrap=$(this).find(">div.tabs-header>div.tabs-wrap"); +var pos=Math.min(wrap._scrollLeft()+_3a9,_3aa()); +wrap.animate({scrollLeft:pos},opts.scrollDuration); +function _3aa(){ +var w=0; +var ul=wrap.children("ul"); +ul.children("li").each(function(){ +w+=$(this).outerWidth(true); +}); +return w-wrap.width()+(ul.outerWidth()-ul.width()); +}; +}); +}}; +$.fn.tabs.parseOptions=function(_3ab){ +return $.extend({},$.parser.parseOptions(_3ab,["tools","toolPosition","tabPosition",{fit:"boolean",border:"boolean",plain:"boolean"},{headerWidth:"number",tabWidth:"number",tabHeight:"number",selected:"number"},{showHeader:"boolean",justified:"boolean",narrow:"boolean",pill:"boolean"}])); +}; +$.fn.tabs.defaults={width:"auto",height:"auto",headerWidth:150,tabWidth:"auto",tabHeight:32,selected:0,showHeader:true,plain:false,fit:false,border:true,justified:false,narrow:false,pill:false,tools:null,toolPosition:"right",tabPosition:"top",scrollIncrement:100,scrollDuration:400,onLoad:function(_3ac){ +},onSelect:function(_3ad,_3ae){ +},onUnselect:function(_3af,_3b0){ +},onBeforeClose:function(_3b1,_3b2){ +},onClose:function(_3b3,_3b4){ +},onAdd:function(_3b5,_3b6){ +},onUpdate:function(_3b7,_3b8){ +},onContextMenu:function(e,_3b9,_3ba){ +}}; +})(jQuery); +(function($){ +var _3bb=false; +function _3bc(_3bd,_3be){ +var _3bf=$.data(_3bd,"layout"); +var opts=_3bf.options; +var _3c0=_3bf.panels; +var cc=$(_3bd); +if(_3be){ +$.extend(opts,{width:_3be.width,height:_3be.height}); +} +if(_3bd.tagName.toLowerCase()=="body"){ +cc._size("fit"); +}else{ +cc._size(opts); +} +var cpos={top:0,left:0,width:cc.width(),height:cc.height()}; +_3c1(_3c2(_3c0.expandNorth)?_3c0.expandNorth:_3c0.north,"n"); +_3c1(_3c2(_3c0.expandSouth)?_3c0.expandSouth:_3c0.south,"s"); +_3c3(_3c2(_3c0.expandEast)?_3c0.expandEast:_3c0.east,"e"); +_3c3(_3c2(_3c0.expandWest)?_3c0.expandWest:_3c0.west,"w"); +_3c0.center.panel("resize",cpos); +function _3c1(pp,type){ +if(!pp.length||!_3c2(pp)){ +return; +} +var opts=pp.panel("options"); +pp.panel("resize",{width:cc.width(),height:opts.height}); +var _3c4=pp.panel("panel").outerHeight(); +pp.panel("move",{left:0,top:(type=="n"?0:cc.height()-_3c4)}); +cpos.height-=_3c4; +if(type=="n"){ +cpos.top+=_3c4; +if(!opts.split&&opts.border){ +cpos.top--; +} +} +if(!opts.split&&opts.border){ +cpos.height++; +} +}; +function _3c3(pp,type){ +if(!pp.length||!_3c2(pp)){ +return; +} +var opts=pp.panel("options"); +pp.panel("resize",{width:opts.width,height:cpos.height}); +var _3c5=pp.panel("panel").outerWidth(); +pp.panel("move",{left:(type=="e"?cc.width()-_3c5:0),top:cpos.top}); +cpos.width-=_3c5; +if(type=="w"){ +cpos.left+=_3c5; +if(!opts.split&&opts.border){ +cpos.left--; +} +} +if(!opts.split&&opts.border){ +cpos.width++; +} +}; +}; +function init(_3c6){ +var cc=$(_3c6); +cc.addClass("layout"); +function _3c7(el){ +var _3c8=$.fn.layout.parsePanelOptions(el); +if("north,south,east,west,center".indexOf(_3c8.region)>=0){ +_3cb(_3c6,_3c8,el); +} +}; +var opts=cc.layout("options"); +var _3c9=opts.onAdd; +opts.onAdd=function(){ +}; +cc.find(">div,>form>div").each(function(){ +_3c7(this); +}); +opts.onAdd=_3c9; +cc.append("
                                          "); +cc.bind("_resize",function(e,_3ca){ +if($(this).hasClass("easyui-fluid")||_3ca){ +_3bc(_3c6); +} +return false; +}); +}; +function _3cb(_3cc,_3cd,el){ +_3cd.region=_3cd.region||"center"; +var _3ce=$.data(_3cc,"layout").panels; +var cc=$(_3cc); +var dir=_3cd.region; +if(_3ce[dir].length){ +return; +} +var pp=$(el); +if(!pp.length){ +pp=$("
                                          ").appendTo(cc); +} +var _3cf=$.extend({},$.fn.layout.paneldefaults,{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),doSize:false,collapsible:true,onOpen:function(){ +var tool=$(this).panel("header").children("div.panel-tool"); +tool.children("a.panel-tool-collapse").hide(); +var _3d0={north:"up",south:"down",east:"right",west:"left"}; +if(!_3d0[dir]){ +return; +} +var _3d1="layout-button-"+_3d0[dir]; +var t=tool.children("a."+_3d1); +if(!t.length){ +t=$("").addClass(_3d1).appendTo(tool); +t.bind("click",{dir:dir},function(e){ +_3e8(_3cc,e.data.dir); +return false; +}); +} +$(this).panel("options").collapsible?t.show():t.hide(); +}},_3cd,{cls:((_3cd.cls||"")+" layout-panel layout-panel-"+dir),bodyCls:((_3cd.bodyCls||"")+" layout-body")}); +pp.panel(_3cf); +_3ce[dir]=pp; +var _3d2={north:"s",south:"n",east:"w",west:"e"}; +var _3d3=pp.panel("panel"); +if(pp.panel("options").split){ +_3d3.addClass("layout-split-"+dir); +} +_3d3.resizable($.extend({},{handles:(_3d2[dir]||""),disabled:(!pp.panel("options").split),onStartResize:function(e){ +_3bb=true; +if(dir=="north"||dir=="south"){ +var _3d4=$(">div.layout-split-proxy-v",_3cc); +}else{ +var _3d4=$(">div.layout-split-proxy-h",_3cc); +} +var top=0,left=0,_3d5=0,_3d6=0; +var pos={display:"block"}; +if(dir=="north"){ +pos.top=parseInt(_3d3.css("top"))+_3d3.outerHeight()-_3d4.height(); +pos.left=parseInt(_3d3.css("left")); +pos.width=_3d3.outerWidth(); +pos.height=_3d4.height(); +}else{ +if(dir=="south"){ +pos.top=parseInt(_3d3.css("top")); +pos.left=parseInt(_3d3.css("left")); +pos.width=_3d3.outerWidth(); +pos.height=_3d4.height(); +}else{ +if(dir=="east"){ +pos.top=parseInt(_3d3.css("top"))||0; +pos.left=parseInt(_3d3.css("left"))||0; +pos.width=_3d4.width(); +pos.height=_3d3.outerHeight(); +}else{ +if(dir=="west"){ +pos.top=parseInt(_3d3.css("top"))||0; +pos.left=_3d3.outerWidth()-_3d4.width(); +pos.width=_3d4.width(); +pos.height=_3d3.outerHeight(); +} +} +} +} +_3d4.css(pos); +$("
                                          ").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc); +},onResize:function(e){ +if(dir=="north"||dir=="south"){ +var _3d7=_3d8(this); +$(this).resizable("options").maxHeight=_3d7; +var _3d9=$(">div.layout-split-proxy-v",_3cc); +var top=dir=="north"?e.data.height-_3d9.height():$(_3cc).height()-e.data.height; +_3d9.css("top",top); +}else{ +var _3da=_3d8(this); +$(this).resizable("options").maxWidth=_3da; +var _3d9=$(">div.layout-split-proxy-h",_3cc); +var left=dir=="west"?e.data.width-_3d9.width():$(_3cc).width()-e.data.width; +_3d9.css("left",left); +} +return false; +},onStopResize:function(e){ +cc.children("div.layout-split-proxy-v,div.layout-split-proxy-h").hide(); +pp.panel("resize",e.data); +_3bc(_3cc); +_3bb=false; +cc.find(">div.layout-mask").remove(); +}},_3cd)); +cc.layout("options").onAdd.call(_3cc,dir); +function _3d8(p){ +var _3db="expand"+dir.substring(0,1).toUpperCase()+dir.substring(1); +var _3dc=_3ce["center"]; +var _3dd=(dir=="north"||dir=="south")?"minHeight":"minWidth"; +var _3de=(dir=="north"||dir=="south")?"maxHeight":"maxWidth"; +var _3df=(dir=="north"||dir=="south")?"_outerHeight":"_outerWidth"; +var _3e0=$.parser.parseValue(_3de,_3ce[dir].panel("options")[_3de],$(_3cc)); +var _3e1=$.parser.parseValue(_3dd,_3dc.panel("options")[_3dd],$(_3cc)); +var _3e2=_3dc.panel("panel")[_3df]()-_3e1; +if(_3c2(_3ce[_3db])){ +_3e2+=_3ce[_3db][_3df]()-1; +}else{ +_3e2+=$(p)[_3df](); +} +if(_3e2>_3e0){ +_3e2=_3e0; +} +return _3e2; +}; +}; +function _3e3(_3e4,_3e5){ +var _3e6=$.data(_3e4,"layout").panels; +if(_3e6[_3e5].length){ +_3e6[_3e5].panel("destroy"); +_3e6[_3e5]=$(); +var _3e7="expand"+_3e5.substring(0,1).toUpperCase()+_3e5.substring(1); +if(_3e6[_3e7]){ +_3e6[_3e7].panel("destroy"); +_3e6[_3e7]=undefined; +} +$(_3e4).layout("options").onRemove.call(_3e4,_3e5); +} +}; +function _3e8(_3e9,_3ea,_3eb){ +if(_3eb==undefined){ +_3eb="normal"; +} +var _3ec=$.data(_3e9,"layout").panels; +var p=_3ec[_3ea]; +var _3ed=p.panel("options"); +if(_3ed.onBeforeCollapse.call(p)==false){ +return; +} +var _3ee="expand"+_3ea.substring(0,1).toUpperCase()+_3ea.substring(1); +if(!_3ec[_3ee]){ +_3ec[_3ee]=_3ef(_3ea); +var ep=_3ec[_3ee].panel("panel"); +if(!_3ed.expandMode){ +ep.css("cursor","default"); +}else{ +ep.bind("click",function(){ +if(_3ed.expandMode=="dock"){ +_3fb(_3e9,_3ea); +}else{ +p.panel("expand",false).panel("open"); +var _3f0=_3f1(); +p.panel("resize",_3f0.collapse); +p.panel("panel").unbind(".layout").bind("mouseleave.layout",{region:_3ea},function(e){ +$(this).stop(true,true); +if(_3bb==true){ +return; +} +if($("body>div.combo-p>div.combo-panel:visible").length){ +return; +} +_3e8(_3e9,e.data.region); +}); +p.panel("panel").animate(_3f0.expand,function(){ +$(_3e9).layout("options").onExpand.call(_3e9,_3ea); +}); +} +return false; +}); +} +} +var _3f2=_3f1(); +if(!_3c2(_3ec[_3ee])){ +_3ec.center.panel("resize",_3f2.resizeC); +} +p.panel("panel").animate(_3f2.collapse,_3eb,function(){ +p.panel("collapse",false).panel("close"); +_3ec[_3ee].panel("open").panel("resize",_3f2.expandP); +$(this).unbind(".layout"); +$(_3e9).layout("options").onCollapse.call(_3e9,_3ea); +}); +function _3ef(dir){ +var _3f3={"east":"left","west":"right","north":"down","south":"up"}; +var isns=(_3ed.region=="north"||_3ed.region=="south"); +var icon="layout-button-"+_3f3[dir]; +var p=$("
                                          ").appendTo(_3e9); +p.panel($.extend({},$.fn.layout.paneldefaults,{cls:("layout-expand layout-expand-"+dir),title:" ",titleDirection:_3ed.titleDirection,iconCls:(_3ed.hideCollapsedContent?null:_3ed.iconCls),closed:true,minWidth:0,minHeight:0,doSize:false,region:_3ed.region,collapsedSize:_3ed.collapsedSize,noheader:(!isns&&_3ed.hideExpandTool),tools:((isns&&_3ed.hideExpandTool)?null:[{iconCls:icon,handler:function(){ +_3fb(_3e9,_3ea); +return false; +}}]),onResize:function(){ +var _3f4=$(this).children(".layout-expand-title"); +if(_3f4.length){ +_3f4._outerWidth($(this).height()); +var left=($(this).width()-Math.min(_3f4._outerWidth(),_3f4._outerHeight()))/2; +var top=Math.max(_3f4._outerWidth(),_3f4._outerHeight()); +if(_3f4.hasClass("layout-expand-title-down")){ +left+=Math.min(_3f4._outerWidth(),_3f4._outerHeight()); +top=0; +} +_3f4.css({left:(left+"px"),top:(top+"px")}); +} +}})); +if(!_3ed.hideCollapsedContent){ +var _3f5=typeof _3ed.collapsedContent=="function"?_3ed.collapsedContent.call(p[0],_3ed.title):_3ed.collapsedContent; +isns?p.panel("setTitle",_3f5):p.html(_3f5); +} +p.panel("panel").hover(function(){ +$(this).addClass("layout-expand-over"); +},function(){ +$(this).removeClass("layout-expand-over"); +}); +return p; +}; +function _3f1(){ +var cc=$(_3e9); +var _3f6=_3ec.center.panel("options"); +var _3f7=_3ed.collapsedSize; +if(_3ea=="east"){ +var _3f8=p.panel("panel")._outerWidth(); +var _3f9=_3f6.width+_3f8-_3f7; +if(_3ed.split||!_3ed.border){ +_3f9++; +} +return {resizeC:{width:_3f9},expand:{left:cc.width()-_3f8},expandP:{top:_3f6.top,left:cc.width()-_3f7,width:_3f7,height:_3f6.height},collapse:{left:cc.width(),top:_3f6.top,height:_3f6.height}}; +}else{ +if(_3ea=="west"){ +var _3f8=p.panel("panel")._outerWidth(); +var _3f9=_3f6.width+_3f8-_3f7; +if(_3ed.split||!_3ed.border){ +_3f9++; +} +return {resizeC:{width:_3f9,left:_3f7-1},expand:{left:0},expandP:{left:0,top:_3f6.top,width:_3f7,height:_3f6.height},collapse:{left:-_3f8,top:_3f6.top,height:_3f6.height}}; +}else{ +if(_3ea=="north"){ +var _3fa=p.panel("panel")._outerHeight(); +var hh=_3f6.height; +if(!_3c2(_3ec.expandNorth)){ +hh+=_3fa-_3f7+((_3ed.split||!_3ed.border)?1:0); +} +_3ec.east.add(_3ec.west).add(_3ec.expandEast).add(_3ec.expandWest).panel("resize",{top:_3f7-1,height:hh}); +return {resizeC:{top:_3f7-1,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:_3f7},collapse:{top:-_3fa,width:cc.width()}}; +}else{ +if(_3ea=="south"){ +var _3fa=p.panel("panel")._outerHeight(); +var hh=_3f6.height; +if(!_3c2(_3ec.expandSouth)){ +hh+=_3fa-_3f7+((_3ed.split||!_3ed.border)?1:0); +} +_3ec.east.add(_3ec.west).add(_3ec.expandEast).add(_3ec.expandWest).panel("resize",{height:hh}); +return {resizeC:{height:hh},expand:{top:cc.height()-_3fa},expandP:{top:cc.height()-_3f7,left:0,width:cc.width(),height:_3f7},collapse:{top:cc.height(),width:cc.width()}}; +} +} +} +} +}; +}; +function _3fb(_3fc,_3fd){ +var _3fe=$.data(_3fc,"layout").panels; +var p=_3fe[_3fd]; +var _3ff=p.panel("options"); +if(_3ff.onBeforeExpand.call(p)==false){ +return; +} +var _400="expand"+_3fd.substring(0,1).toUpperCase()+_3fd.substring(1); +if(_3fe[_400]){ +_3fe[_400].panel("close"); +p.panel("panel").stop(true,true); +p.panel("expand",false).panel("open"); +var _401=_402(); +p.panel("resize",_401.collapse); +p.panel("panel").animate(_401.expand,function(){ +_3bc(_3fc); +$(_3fc).layout("options").onExpand.call(_3fc,_3fd); +}); +} +function _402(){ +var cc=$(_3fc); +var _403=_3fe.center.panel("options"); +if(_3fd=="east"&&_3fe.expandEast){ +return {collapse:{left:cc.width(),top:_403.top,height:_403.height},expand:{left:cc.width()-p.panel("panel")._outerWidth()}}; +}else{ +if(_3fd=="west"&&_3fe.expandWest){ +return {collapse:{left:-p.panel("panel")._outerWidth(),top:_403.top,height:_403.height},expand:{left:0}}; +}else{ +if(_3fd=="north"&&_3fe.expandNorth){ +return {collapse:{top:-p.panel("panel")._outerHeight(),width:cc.width()},expand:{top:0}}; +}else{ +if(_3fd=="south"&&_3fe.expandSouth){ +return {collapse:{top:cc.height(),width:cc.width()},expand:{top:cc.height()-p.panel("panel")._outerHeight()}}; +} +} +} +} +}; +}; +function _3c2(pp){ +if(!pp){ +return false; +} +if(pp.length){ +return pp.panel("panel").is(":visible"); +}else{ +return false; +} +}; +function _404(_405){ +var _406=$.data(_405,"layout"); +var opts=_406.options; +var _407=_406.panels; +var _408=opts.onCollapse; +opts.onCollapse=function(){ +}; +_409("east"); +_409("west"); +_409("north"); +_409("south"); +opts.onCollapse=_408; +function _409(_40a){ +var p=_407[_40a]; +if(p.length&&p.panel("options").collapsed){ +_3e8(_405,_40a,0); +} +}; +}; +function _40b(_40c,_40d,_40e){ +var p=$(_40c).layout("panel",_40d); +p.panel("options").split=_40e; +var cls="layout-split-"+_40d; +var _40f=p.panel("panel").removeClass(cls); +if(_40e){ +_40f.addClass(cls); +} +_40f.resizable({disabled:(!_40e)}); +_3bc(_40c); +}; +$.fn.layout=function(_410,_411){ +if(typeof _410=="string"){ +return $.fn.layout.methods[_410](this,_411); +} +_410=_410||{}; +return this.each(function(){ +var _412=$.data(this,"layout"); +if(_412){ +$.extend(_412.options,_410); +}else{ +var opts=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_410); +$.data(this,"layout",{options:opts,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}}); +init(this); +} +_3bc(this); +_404(this); +}); +}; +$.fn.layout.methods={options:function(jq){ +return $.data(jq[0],"layout").options; +},resize:function(jq,_413){ +return jq.each(function(){ +_3bc(this,_413); +}); +},panel:function(jq,_414){ +return $.data(jq[0],"layout").panels[_414]; +},collapse:function(jq,_415){ +return jq.each(function(){ +_3e8(this,_415); +}); +},expand:function(jq,_416){ +return jq.each(function(){ +_3fb(this,_416); +}); +},add:function(jq,_417){ +return jq.each(function(){ +_3cb(this,_417); +_3bc(this); +if($(this).layout("panel",_417.region).panel("options").collapsed){ +_3e8(this,_417.region,0); +} +}); +},remove:function(jq,_418){ +return jq.each(function(){ +_3e3(this,_418); +_3bc(this); +}); +},split:function(jq,_419){ +return jq.each(function(){ +_40b(this,_419,true); +}); +},unsplit:function(jq,_41a){ +return jq.each(function(){ +_40b(this,_41a,false); +}); +}}; +$.fn.layout.parseOptions=function(_41b){ +return $.extend({},$.parser.parseOptions(_41b,[{fit:"boolean"}])); +}; +$.fn.layout.defaults={fit:false,onExpand:function(_41c){ +},onCollapse:function(_41d){ +},onAdd:function(_41e){ +},onRemove:function(_41f){ +}}; +$.fn.layout.parsePanelOptions=function(_420){ +var t=$(_420); +return $.extend({},$.fn.panel.parseOptions(_420),$.parser.parseOptions(_420,["region",{split:"boolean",collpasedSize:"number",minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number"}])); +}; +$.fn.layout.paneldefaults=$.extend({},$.fn.panel.defaults,{region:null,split:false,collapsedSize:28,expandMode:"float",hideExpandTool:false,hideCollapsedContent:true,collapsedContent:function(_421){ +var p=$(this); +var opts=p.panel("options"); +if(opts.region=="north"||opts.region=="south"){ +return _421; +} +var cc=[]; +if(opts.iconCls){ +cc.push("
                                          "); +} +cc.push("
                                          "); +cc.push(_421); +cc.push("
                                          "); +return cc.join(""); +},minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000}); +})(jQuery); +(function($){ +$(function(){ +$(document).unbind(".menu").bind("mousedown.menu",function(e){ +var m=$(e.target).closest("div.menu,div.combo-p"); +if(m.length){ +return; +} +$("body>div.menu-top:visible").not(".menu-inline").menu("hide"); +_422($("body>div.menu:visible").not(".menu-inline")); +}); +}); +function init(_423){ +var opts=$.data(_423,"menu").options; +$(_423).addClass("menu-top"); +opts.inline?$(_423).addClass("menu-inline"):$(_423).appendTo("body"); +$(_423).bind("_resize",function(e,_424){ +if($(this).hasClass("easyui-fluid")||_424){ +$(_423).menu("resize",_423); +} +return false; +}); +var _425=_426($(_423)); +for(var i=0;i<_425.length;i++){ +_429(_423,_425[i]); +} +function _426(menu){ +var _427=[]; +menu.addClass("menu"); +_427.push(menu); +if(!menu.hasClass("menu-content")){ +menu.children("div").each(function(){ +var _428=$(this).children("div"); +if(_428.length){ +_428.appendTo("body"); +this.submenu=_428; +var mm=_426(_428); +_427=_427.concat(mm); +} +}); +} +return _427; +}; +}; +function _429(_42a,div){ +var menu=$(div).addClass("menu"); +if(!menu.data("menu")){ +menu.data("menu",{options:$.parser.parseOptions(menu[0],["width","height"])}); +} +if(!menu.hasClass("menu-content")){ +menu.children("div").each(function(){ +_42b(_42a,this); +}); +$("
                                          ").prependTo(menu); +} +_42c(_42a,menu); +if(!menu.hasClass("menu-inline")){ +menu.hide(); +} +_42d(_42a,menu); +}; +function _42b(_42e,div,_42f){ +var item=$(div); +var _430=$.extend({},$.parser.parseOptions(item[0],["id","name","iconCls","href",{separator:"boolean"}]),{disabled:(item.attr("disabled")?true:undefined),text:$.trim(item.html()),onclick:item[0].onclick},_42f||{}); +_430.onclick=_430.onclick||_430.handler||null; +item.data("menuitem",{options:_430}); +if(_430.separator){ +item.addClass("menu-sep"); +} +if(!item.hasClass("menu-sep")){ +item.addClass("menu-item"); +item.empty().append($("
                                          ").html(_430.text)); +if(_430.iconCls){ +$("
                                          ").addClass(_430.iconCls).appendTo(item); +} +if(_430.id){ +item.attr("id",_430.id); +} +if(_430.onclick){ +if(typeof _430.onclick=="string"){ +item.attr("onclick",_430.onclick); +}else{ +item[0].onclick=eval(_430.onclick); +} +} +if(_430.disabled){ +_431(_42e,item[0],true); +} +if(item[0].submenu){ +$("
                                          ").appendTo(item); +} +} +}; +function _42c(_432,menu){ +var opts=$.data(_432,"menu").options; +var _433=menu.attr("style")||""; +var _434=menu.is(":visible"); +menu.css({display:"block",left:-10000,height:"auto",overflow:"hidden"}); +menu.find(".menu-item").each(function(){ +$(this)._outerHeight(opts.itemHeight); +$(this).find(".menu-text").css({height:(opts.itemHeight-2)+"px",lineHeight:(opts.itemHeight-2)+"px"}); +}); +menu.removeClass("menu-noline").addClass(opts.noline?"menu-noline":""); +var _435=menu.data("menu").options; +var _436=_435.width; +var _437=_435.height; +if(isNaN(parseInt(_436))){ +_436=0; +menu.find("div.menu-text").each(function(){ +if(_436<$(this).outerWidth()){ +_436=$(this).outerWidth(); +} +}); +_436=_436?_436+40:""; +} +var _438=menu.outerHeight(); +if(isNaN(parseInt(_437))){ +_437=_438; +if(menu.hasClass("menu-top")&&opts.alignTo){ +var at=$(opts.alignTo); +var h1=at.offset().top-$(document).scrollTop(); +var h2=$(window)._outerHeight()+$(document).scrollTop()-at.offset().top-at._outerHeight(); +_437=Math.min(_437,Math.max(h1,h2)); +}else{ +if(_437>$(window)._outerHeight()){ +_437=$(window).height(); +} +} +} +menu.attr("style",_433); +menu.show(); +menu._size($.extend({},_435,{width:_436,height:_437,minWidth:_435.minWidth||opts.minWidth,maxWidth:_435.maxWidth||opts.maxWidth})); +menu.find(".easyui-fluid").triggerHandler("_resize",[true]); +menu.css("overflow",menu.outerHeight()<_438?"auto":"hidden"); +menu.children("div.menu-line")._outerHeight(_438-2); +if(!_434){ +menu.hide(); +} +}; +function _42d(_439,menu){ +var _43a=$.data(_439,"menu"); +var opts=_43a.options; +menu.unbind(".menu"); +for(var _43b in opts.events){ +menu.bind(_43b+".menu",{target:_439},opts.events[_43b]); +} +}; +function _43c(e){ +var _43d=e.data.target; +var _43e=$.data(_43d,"menu"); +if(_43e.timer){ +clearTimeout(_43e.timer); +_43e.timer=null; +} +}; +function _43f(e){ +var _440=e.data.target; +var _441=$.data(_440,"menu"); +if(_441.options.hideOnUnhover){ +_441.timer=setTimeout(function(){ +_442(_440,$(_440).hasClass("menu-inline")); +},_441.options.duration); +} +}; +function _443(e){ +var _444=e.data.target; +var item=$(e.target).closest(".menu-item"); +if(item.length){ +item.siblings().each(function(){ +if(this.submenu){ +_422(this.submenu); +} +$(this).removeClass("menu-active"); +}); +item.addClass("menu-active"); +if(item.hasClass("menu-item-disabled")){ +item.addClass("menu-active-disabled"); +return; +} +var _445=item[0].submenu; +if(_445){ +$(_444).menu("show",{menu:_445,parent:item}); +} +} +}; +function _446(e){ +var item=$(e.target).closest(".menu-item"); +if(item.length){ +item.removeClass("menu-active menu-active-disabled"); +var _447=item[0].submenu; +if(_447){ +if(e.pageX>=parseInt(_447.css("left"))){ +item.addClass("menu-active"); +}else{ +_422(_447); +} +}else{ +item.removeClass("menu-active"); +} +} +}; +function _448(e){ +var _449=e.data.target; +var item=$(e.target).closest(".menu-item"); +if(item.length){ +var opts=$(_449).data("menu").options; +var _44a=item.data("menuitem").options; +if(_44a.disabled){ +return; +} +if(!item[0].submenu){ +_442(_449,opts.inline); +if(_44a.href){ +location.href=_44a.href; +} +} +item.trigger("mouseenter"); +opts.onClick.call(_449,$(_449).menu("getItem",item[0])); +} +}; +function _442(_44b,_44c){ +var _44d=$.data(_44b,"menu"); +if(_44d){ +if($(_44b).is(":visible")){ +_422($(_44b)); +if(_44c){ +$(_44b).show(); +}else{ +_44d.options.onHide.call(_44b); +} +} +} +return false; +}; +function _44e(_44f,_450){ +_450=_450||{}; +var left,top; +var opts=$.data(_44f,"menu").options; +var menu=$(_450.menu||_44f); +$(_44f).menu("resize",menu[0]); +if(menu.hasClass("menu-top")){ +$.extend(opts,_450); +left=opts.left; +top=opts.top; +if(opts.alignTo){ +var at=$(opts.alignTo); +left=at.offset().left; +top=at.offset().top+at._outerHeight(); +if(opts.align=="right"){ +left+=at.outerWidth()-menu.outerWidth(); +} +} +if(left+menu.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ +left=$(window)._outerWidth()+$(document).scrollLeft()-menu.outerWidth()-5; +} +if(left<0){ +left=0; +} +top=_451(top,opts.alignTo); +}else{ +var _452=_450.parent; +left=_452.offset().left+_452.outerWidth()-2; +if(left+menu.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){ +left=_452.offset().left-menu.outerWidth()+2; +} +top=_451(_452.offset().top-3); +} +function _451(top,_453){ +if(top+menu.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ +if(_453){ +top=$(_453).offset().top-menu._outerHeight(); +}else{ +top=$(window)._outerHeight()+$(document).scrollTop()-menu.outerHeight(); +} +} +if(top<0){ +top=0; +} +return top; +}; +menu.css(opts.position.call(_44f,menu[0],left,top)); +menu.show(0,function(){ +if(!menu[0].shadow){ +menu[0].shadow=$("
                                          ").insertAfter(menu); +} +menu[0].shadow.css({display:(menu.hasClass("menu-inline")?"none":"block"),zIndex:$.fn.menu.defaults.zIndex++,left:menu.css("left"),top:menu.css("top"),width:menu.outerWidth(),height:menu.outerHeight()}); +menu.css("z-index",$.fn.menu.defaults.zIndex++); +if(menu.hasClass("menu-top")){ +opts.onShow.call(_44f); +} +}); +}; +function _422(menu){ +if(menu&&menu.length){ +_454(menu); +menu.find("div.menu-item").each(function(){ +if(this.submenu){ +_422(this.submenu); +} +$(this).removeClass("menu-active"); +}); +} +function _454(m){ +m.stop(true,true); +if(m[0].shadow){ +m[0].shadow.hide(); +} +m.hide(); +}; +}; +function _455(_456,_457){ +var _458=null; +var fn=$.isFunction(_457)?_457:function(item){ +for(var p in _457){ +if(item[p]!=_457[p]){ +return false; +} +} +return true; +}; +function find(menu){ +menu.children("div.menu-item").each(function(){ +var opts=$(this).data("menuitem").options; +if(fn.call(_456,opts)==true){ +_458=$(_456).menu("getItem",this); +}else{ +if(this.submenu&&!_458){ +find(this.submenu); +} +} +}); +}; +find($(_456)); +return _458; +}; +function _431(_459,_45a,_45b){ +var t=$(_45a); +if(t.hasClass("menu-item")){ +var opts=t.data("menuitem").options; +opts.disabled=_45b; +if(_45b){ +t.addClass("menu-item-disabled"); +t[0].onclick=null; +}else{ +t.removeClass("menu-item-disabled"); +t[0].onclick=opts.onclick; +} +} +}; +function _45c(_45d,_45e){ +var opts=$.data(_45d,"menu").options; +var menu=$(_45d); +if(_45e.parent){ +if(!_45e.parent.submenu){ +var _45f=$("
                                          ").appendTo("body"); +_45e.parent.submenu=_45f; +$("
                                          ").appendTo(_45e.parent); +_429(_45d,_45f); +} +menu=_45e.parent.submenu; +} +var div=$("
                                          ").appendTo(menu); +_42b(_45d,div,_45e); +}; +function _460(_461,_462){ +function _463(el){ +if(el.submenu){ +el.submenu.children("div.menu-item").each(function(){ +_463(this); +}); +var _464=el.submenu[0].shadow; +if(_464){ +_464.remove(); +} +el.submenu.remove(); +} +$(el).remove(); +}; +_463(_462); +}; +function _465(_466,_467,_468){ +var menu=$(_467).parent(); +if(_468){ +$(_467).show(); +}else{ +$(_467).hide(); +} +_42c(_466,menu); +}; +function _469(_46a){ +$(_46a).children("div.menu-item").each(function(){ +_460(_46a,this); +}); +if(_46a.shadow){ +_46a.shadow.remove(); +} +$(_46a).remove(); +}; +$.fn.menu=function(_46b,_46c){ +if(typeof _46b=="string"){ +return $.fn.menu.methods[_46b](this,_46c); +} +_46b=_46b||{}; +return this.each(function(){ +var _46d=$.data(this,"menu"); +if(_46d){ +$.extend(_46d.options,_46b); +}else{ +_46d=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_46b)}); +init(this); +} +$(this).css({left:_46d.options.left,top:_46d.options.top}); +}); +}; +$.fn.menu.methods={options:function(jq){ +return $.data(jq[0],"menu").options; +},show:function(jq,pos){ +return jq.each(function(){ +_44e(this,pos); +}); +},hide:function(jq){ +return jq.each(function(){ +_442(this); +}); +},destroy:function(jq){ +return jq.each(function(){ +_469(this); +}); +},setText:function(jq,_46e){ +return jq.each(function(){ +var item=$(_46e.target).data("menuitem").options; +item.text=_46e.text; +$(_46e.target).children("div.menu-text").html(_46e.text); +}); +},setIcon:function(jq,_46f){ +return jq.each(function(){ +var item=$(_46f.target).data("menuitem").options; +item.iconCls=_46f.iconCls; +$(_46f.target).children("div.menu-icon").remove(); +if(_46f.iconCls){ +$("
                                          ").addClass(_46f.iconCls).appendTo(_46f.target); +} +}); +},getItem:function(jq,_470){ +var item=$(_470).data("menuitem").options; +return $.extend({},item,{target:$(_470)[0]}); +},findItem:function(jq,text){ +if(typeof text=="string"){ +return _455(jq[0],function(item){ +return $("
                                          "+item.text+"
                                          ").text()==text; +}); +}else{ +return _455(jq[0],text); +} +},appendItem:function(jq,_471){ +return jq.each(function(){ +_45c(this,_471); +}); +},removeItem:function(jq,_472){ +return jq.each(function(){ +_460(this,_472); +}); +},enableItem:function(jq,_473){ +return jq.each(function(){ +_431(this,_473,false); +}); +},disableItem:function(jq,_474){ +return jq.each(function(){ +_431(this,_474,true); +}); +},showItem:function(jq,_475){ +return jq.each(function(){ +_465(this,_475,true); +}); +},hideItem:function(jq,_476){ +return jq.each(function(){ +_465(this,_476,false); +}); +},resize:function(jq,_477){ +return jq.each(function(){ +_42c(this,_477?$(_477):$(this)); +}); +}}; +$.fn.menu.parseOptions=function(_478){ +return $.extend({},$.parser.parseOptions(_478,[{minWidth:"number",itemHeight:"number",duration:"number",hideOnUnhover:"boolean"},{fit:"boolean",inline:"boolean",noline:"boolean"}])); +}; +$.fn.menu.defaults={zIndex:110000,left:0,top:0,alignTo:null,align:"left",minWidth:150,itemHeight:32,duration:100,hideOnUnhover:true,inline:false,fit:false,noline:false,events:{mouseenter:_43c,mouseleave:_43f,mouseover:_443,mouseout:_446,click:_448},position:function(_479,left,top){ +return {left:left,top:top}; +},onShow:function(){ +},onHide:function(){ +},onClick:function(item){ +}}; +})(jQuery); +(function($){ +var _47a=1; +function init(_47b){ +$(_47b).addClass("sidemenu"); +}; +function _47c(_47d,_47e){ +var opts=$(_47d).sidemenu("options"); +if(_47e){ +$.extend(opts,{width:_47e.width,height:_47e.height}); +} +$(_47d)._size(opts); +$(_47d).find(".accordion").accordion("resize"); +}; +function _47f(_480,_481,data){ +var opts=$(_480).sidemenu("options"); +var tt=$("
                                            ").appendTo(_481); +tt.tree({data:data,animate:opts.animate,onBeforeSelect:function(node){ +if(node.children){ +return false; +} +},onSelect:function(node){ +_482(_480,node.id); +},onExpand:function(node){ +_48d(_480,node); +},onCollapse:function(node){ +_48d(_480,node); +},onClick:function(node){ +if(node.children){ +if(node.state=="open"){ +$(node.target).addClass("tree-node-nonleaf-collapsed"); +}else{ +$(node.target).removeClass("tree-node-nonleaf-collapsed"); +} +$(this).tree("toggle",node.target); +} +}}); +tt.unbind(".sidemenu").bind("mouseleave.sidemenu",function(){ +$(_481).trigger("mouseleave"); +}); +_482(_480,opts.selectedItemId); +}; +function _483(_484,_485,data){ +var opts=$(_484).sidemenu("options"); +$(_485).tooltip({content:$("
                                            "),position:opts.floatMenuPosition,valign:"top",data:data,onUpdate:function(_486){ +var _487=$(this).tooltip("options"); +var data=_487.data; +_486.accordion({width:opts.floatMenuWidth,multiple:false}).accordion("add",{title:data.text,iconCls:data.iconCls,collapsed:false,collapsible:false}); +_47f(_484,_486.accordion("panels")[0],data.children); +},onShow:function(){ +var t=$(this); +var tip=t.tooltip("tip").addClass("sidemenu-tooltip"); +tip.children(".tooltip-content").addClass("sidemenu"); +tip.find(".accordion").accordion("resize"); +tip.unbind().bind("mouseenter",function(){ +t.tooltip("show"); +}).bind("mouseleave",function(){ +t.tooltip("hide"); +}); +},onPosition:function(){ +if(!opts.collapsed){ +$(this).tooltip("tip").css({left:-999999}); +} +}}); +}; +function _488(_489,_48a){ +$(_489).find(".sidemenu-tree").each(function(){ +_48a($(this)); +}); +$(_489).find(".tooltip-f").each(function(){ +var tip=$(this).tooltip("tip"); +if(tip){ +tip.find(".sidemenu-tree").each(function(){ +_48a($(this)); +}); +} +}); +}; +function _482(_48b,_48c){ +var opts=$(_48b).sidemenu("options"); +_488(_48b,function(t){ +t.find("div.tree-node-selected").removeClass("tree-node-selected"); +var node=t.tree("find",_48c); +if(node){ +$(node.target).addClass("tree-node-selected"); +opts.selectedItemId=node.id; +t.trigger("mouseleave"); +opts.onSelect.call(_48b,node); +} +}); +}; +function _48d(_48e,item){ +_488(_48e,function(t){ +var node=t.tree("find",item.id); +if(node){ +t.tree(item.state=="open"?"expand":"collapse",node.target); +} +}); +}; +function _48f(_490){ +var opts=$(_490).sidemenu("options"); +$(_490).empty(); +if(opts.data){ +$.easyui.forEach(opts.data,true,function(node){ +if(!node.id){ +node.id="_easyui_sidemenu_"+(_47a++); +} +if(!node.iconCls){ +node.iconCls="sidemenu-default-icon"; +} +if(node.children){ +node.nodeCls="tree-node-nonleaf"; +if(!node.state){ +node.state="closed"; +} +if(node.state=="open"){ +node.nodeCls="tree-node-nonleaf"; +}else{ +node.nodeCls="tree-node-nonleaf tree-node-nonleaf-collapsed"; +} +} +}); +var acc=$("
                                            ").appendTo(_490); +acc.accordion({fit:opts.height=="auto"?false:true,border:opts.border,multiple:opts.multiple}); +for(var i=0;i").addClass(opts.cls.arrow).appendTo(_4a0); +$("").addClass("m-btn-line").appendTo(_4a0); +} +$(_49f).menubutton("resize"); +if(opts.menu){ +$(opts.menu).menu({duration:opts.duration}); +var _4a1=$(opts.menu).menu("options"); +var _4a2=_4a1.onShow; +var _4a3=_4a1.onHide; +$.extend(_4a1,{onShow:function(){ +var _4a4=$(this).menu("options"); +var btn=$(_4a4.alignTo); +var opts=btn.menubutton("options"); +btn.addClass((opts.plain==true)?opts.cls.btn2:opts.cls.btn1); +_4a2.call(this); +},onHide:function(){ +var _4a5=$(this).menu("options"); +var btn=$(_4a5.alignTo); +var opts=btn.menubutton("options"); +btn.removeClass((opts.plain==true)?opts.cls.btn2:opts.cls.btn1); +_4a3.call(this); +}}); +} +}; +function _4a6(_4a7){ +var opts=$.data(_4a7,"menubutton").options; +var btn=$(_4a7); +var t=btn.find("."+opts.cls.trigger); +if(!t.length){ +t=btn; +} +t.unbind(".menubutton"); +var _4a8=null; +t.bind(opts.showEvent+".menubutton",function(){ +if(!_4a9()){ +_4a8=setTimeout(function(){ +_4aa(_4a7); +},opts.duration); +return false; +} +}).bind(opts.hideEvent+".menubutton",function(){ +if(_4a8){ +clearTimeout(_4a8); +} +$(opts.menu).triggerHandler("mouseleave"); +}); +function _4a9(){ +return $(_4a7).linkbutton("options").disabled; +}; +}; +function _4aa(_4ab){ +var opts=$(_4ab).menubutton("options"); +if(opts.disabled||!opts.menu){ +return; +} +$("body>div.menu-top").menu("hide"); +var btn=$(_4ab); +var mm=$(opts.menu); +if(mm.length){ +mm.menu("options").alignTo=btn; +mm.menu("show",{alignTo:btn,align:opts.menuAlign}); +} +btn.blur(); +}; +$.fn.menubutton=function(_4ac,_4ad){ +if(typeof _4ac=="string"){ +var _4ae=$.fn.menubutton.methods[_4ac]; +if(_4ae){ +return _4ae(this,_4ad); +}else{ +return this.linkbutton(_4ac,_4ad); +} +} +_4ac=_4ac||{}; +return this.each(function(){ +var _4af=$.data(this,"menubutton"); +if(_4af){ +$.extend(_4af.options,_4ac); +}else{ +$.data(this,"menubutton",{options:$.extend({},$.fn.menubutton.defaults,$.fn.menubutton.parseOptions(this),_4ac)}); +$(this)._propAttr("disabled",false); +} +init(this); +_4a6(this); +}); +}; +$.fn.menubutton.methods={options:function(jq){ +var _4b0=jq.linkbutton("options"); +return $.extend($.data(jq[0],"menubutton").options,{toggle:_4b0.toggle,selected:_4b0.selected,disabled:_4b0.disabled}); +},destroy:function(jq){ +return jq.each(function(){ +var opts=$(this).menubutton("options"); +if(opts.menu){ +$(opts.menu).menu("destroy"); +} +$(this).remove(); +}); +}}; +$.fn.menubutton.parseOptions=function(_4b1){ +var t=$(_4b1); +return $.extend({},$.fn.linkbutton.parseOptions(_4b1),$.parser.parseOptions(_4b1,["menu",{plain:"boolean",hasDownArrow:"boolean",duration:"number"}])); +}; +$.fn.menubutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,hasDownArrow:true,menu:null,menuAlign:"left",duration:100,showEvent:"mouseenter",hideEvent:"mouseleave",cls:{btn1:"m-btn-active",btn2:"m-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn"}}); +})(jQuery); +(function($){ +function init(_4b2){ +var opts=$.data(_4b2,"splitbutton").options; +$(_4b2).menubutton(opts); +$(_4b2).addClass("s-btn"); +}; +$.fn.splitbutton=function(_4b3,_4b4){ +if(typeof _4b3=="string"){ +var _4b5=$.fn.splitbutton.methods[_4b3]; +if(_4b5){ +return _4b5(this,_4b4); +}else{ +return this.menubutton(_4b3,_4b4); +} +} +_4b3=_4b3||{}; +return this.each(function(){ +var _4b6=$.data(this,"splitbutton"); +if(_4b6){ +$.extend(_4b6.options,_4b3); +}else{ +$.data(this,"splitbutton",{options:$.extend({},$.fn.splitbutton.defaults,$.fn.splitbutton.parseOptions(this),_4b3)}); +$(this)._propAttr("disabled",false); +} +init(this); +}); +}; +$.fn.splitbutton.methods={options:function(jq){ +var _4b7=jq.menubutton("options"); +var _4b8=$.data(jq[0],"splitbutton").options; +$.extend(_4b8,{disabled:_4b7.disabled,toggle:_4b7.toggle,selected:_4b7.selected}); +return _4b8; +}}; +$.fn.splitbutton.parseOptions=function(_4b9){ +var t=$(_4b9); +return $.extend({},$.fn.linkbutton.parseOptions(_4b9),$.parser.parseOptions(_4b9,["menu",{plain:"boolean",duration:"number"}])); +}; +$.fn.splitbutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100,cls:{btn1:"m-btn-active s-btn-active",btn2:"m-btn-plain-active s-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn-line"}}); +})(jQuery); +(function($){ +function init(_4ba){ +var _4bb=$(""+""+""+""+""+""+""+"").insertAfter(_4ba); +var t=$(_4ba); +t.addClass("switchbutton-f").hide(); +var name=t.attr("name"); +if(name){ +t.removeAttr("name").attr("switchbuttonName",name); +_4bb.find(".switchbutton-value").attr("name",name); +} +_4bb.bind("_resize",function(e,_4bc){ +if($(this).hasClass("easyui-fluid")||_4bc){ +_4bd(_4ba); +} +return false; +}); +return _4bb; +}; +function _4bd(_4be,_4bf){ +var _4c0=$.data(_4be,"switchbutton"); +var opts=_4c0.options; +var _4c1=_4c0.switchbutton; +if(_4bf){ +$.extend(opts,_4bf); +} +var _4c2=_4c1.is(":visible"); +if(!_4c2){ +_4c1.appendTo("body"); +} +_4c1._size(opts); +var w=_4c1.width(); +var h=_4c1.height(); +var w=_4c1.outerWidth(); +var h=_4c1.outerHeight(); +var _4c3=parseInt(opts.handleWidth)||_4c1.height(); +var _4c4=w*2-_4c3; +_4c1.find(".switchbutton-inner").css({width:_4c4+"px",height:h+"px",lineHeight:h+"px"}); +_4c1.find(".switchbutton-handle")._outerWidth(_4c3)._outerHeight(h).css({marginLeft:-_4c3/2+"px"}); +_4c1.find(".switchbutton-on").css({width:(w-_4c3/2)+"px",textIndent:(opts.reversed?"":"-")+_4c3/2+"px"}); +_4c1.find(".switchbutton-off").css({width:(w-_4c3/2)+"px",textIndent:(opts.reversed?"-":"")+_4c3/2+"px"}); +opts.marginWidth=w-_4c3; +_4c5(_4be,opts.checked,false); +if(!_4c2){ +_4c1.insertAfter(_4be); +} +}; +function _4c6(_4c7){ +var _4c8=$.data(_4c7,"switchbutton"); +var opts=_4c8.options; +var _4c9=_4c8.switchbutton; +var _4ca=_4c9.find(".switchbutton-inner"); +var on=_4ca.find(".switchbutton-on").html(opts.onText); +var off=_4ca.find(".switchbutton-off").html(opts.offText); +var _4cb=_4ca.find(".switchbutton-handle").html(opts.handleText); +if(opts.reversed){ +off.prependTo(_4ca); +on.insertAfter(_4cb); +}else{ +on.prependTo(_4ca); +off.insertAfter(_4cb); +} +_4c9.find(".switchbutton-value")._propAttr("checked",opts.checked); +_4c9.removeClass("switchbutton-disabled").addClass(opts.disabled?"switchbutton-disabled":""); +_4c9.removeClass("switchbutton-reversed").addClass(opts.reversed?"switchbutton-reversed":""); +_4c5(_4c7,opts.checked); +_4cc(_4c7,opts.readonly); +$(_4c7).switchbutton("setValue",opts.value); +}; +function _4c5(_4cd,_4ce,_4cf){ +var _4d0=$.data(_4cd,"switchbutton"); +var opts=_4d0.options; +opts.checked=_4ce; +var _4d1=_4d0.switchbutton.find(".switchbutton-inner"); +var _4d2=_4d1.find(".switchbutton-on"); +var _4d3=opts.reversed?(opts.checked?opts.marginWidth:0):(opts.checked?0:opts.marginWidth); +var dir=_4d2.css("float").toLowerCase(); +var css={}; +css["margin-"+dir]=-_4d3+"px"; +_4cf?_4d1.animate(css,200):_4d1.css(css); +var _4d4=_4d1.find(".switchbutton-value"); +var ck=_4d4.is(":checked"); +$(_4cd).add(_4d4)._propAttr("checked",opts.checked); +if(ck!=opts.checked){ +opts.onChange.call(_4cd,opts.checked); +} +}; +function _4d5(_4d6,_4d7){ +var _4d8=$.data(_4d6,"switchbutton"); +var opts=_4d8.options; +var _4d9=_4d8.switchbutton; +var _4da=_4d9.find(".switchbutton-value"); +if(_4d7){ +opts.disabled=true; +$(_4d6).add(_4da)._propAttr("disabled",true); +_4d9.addClass("switchbutton-disabled"); +}else{ +opts.disabled=false; +$(_4d6).add(_4da)._propAttr("disabled",false); +_4d9.removeClass("switchbutton-disabled"); +} +}; +function _4cc(_4db,mode){ +var _4dc=$.data(_4db,"switchbutton"); +var opts=_4dc.options; +opts.readonly=mode==undefined?true:mode; +_4dc.switchbutton.removeClass("switchbutton-readonly").addClass(opts.readonly?"switchbutton-readonly":""); +}; +function _4dd(_4de){ +var _4df=$.data(_4de,"switchbutton"); +var opts=_4df.options; +_4df.switchbutton.unbind(".switchbutton").bind("click.switchbutton",function(){ +if(!opts.disabled&&!opts.readonly){ +_4c5(_4de,opts.checked?false:true,true); +} +}); +}; +$.fn.switchbutton=function(_4e0,_4e1){ +if(typeof _4e0=="string"){ +return $.fn.switchbutton.methods[_4e0](this,_4e1); +} +_4e0=_4e0||{}; +return this.each(function(){ +var _4e2=$.data(this,"switchbutton"); +if(_4e2){ +$.extend(_4e2.options,_4e0); +}else{ +_4e2=$.data(this,"switchbutton",{options:$.extend({},$.fn.switchbutton.defaults,$.fn.switchbutton.parseOptions(this),_4e0),switchbutton:init(this)}); +} +_4e2.options.originalChecked=_4e2.options.checked; +_4c6(this); +_4bd(this); +_4dd(this); +}); +}; +$.fn.switchbutton.methods={options:function(jq){ +var _4e3=jq.data("switchbutton"); +return $.extend(_4e3.options,{value:_4e3.switchbutton.find(".switchbutton-value").val()}); +},resize:function(jq,_4e4){ +return jq.each(function(){ +_4bd(this,_4e4); +}); +},enable:function(jq){ +return jq.each(function(){ +_4d5(this,false); +}); +},disable:function(jq){ +return jq.each(function(){ +_4d5(this,true); +}); +},readonly:function(jq,mode){ +return jq.each(function(){ +_4cc(this,mode); +}); +},check:function(jq){ +return jq.each(function(){ +_4c5(this,true); +}); +},uncheck:function(jq){ +return jq.each(function(){ +_4c5(this,false); +}); +},clear:function(jq){ +return jq.each(function(){ +_4c5(this,false); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).switchbutton("options"); +_4c5(this,opts.originalChecked); +}); +},setValue:function(jq,_4e5){ +return jq.each(function(){ +$(this).val(_4e5); +$.data(this,"switchbutton").switchbutton.find(".switchbutton-value").val(_4e5); +}); +}}; +$.fn.switchbutton.parseOptions=function(_4e6){ +var t=$(_4e6); +return $.extend({},$.parser.parseOptions(_4e6,["onText","offText","handleText",{handleWidth:"number",reversed:"boolean"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)}); +}; +$.fn.switchbutton.defaults={handleWidth:"auto",width:60,height:30,checked:false,disabled:false,readonly:false,reversed:false,onText:"ON",offText:"OFF",handleText:"",value:"on",onChange:function(_4e7){ +}}; +})(jQuery); +(function($){ +function init(_4e8){ +$(_4e8).addClass("validatebox-text"); +}; +function _4e9(_4ea){ +var _4eb=$.data(_4ea,"validatebox"); +_4eb.validating=false; +if(_4eb.vtimer){ +clearTimeout(_4eb.vtimer); +} +if(_4eb.ftimer){ +clearTimeout(_4eb.ftimer); +} +$(_4ea).tooltip("destroy"); +$(_4ea).unbind(); +$(_4ea).remove(); +}; +function _4ec(_4ed){ +var opts=$.data(_4ed,"validatebox").options; +$(_4ed).unbind(".validatebox"); +if(opts.novalidate||opts.disabled){ +return; +} +for(var _4ee in opts.events){ +$(_4ed).bind(_4ee+".validatebox",{target:_4ed},opts.events[_4ee]); +} +}; +function _4ef(e){ +var _4f0=e.data.target; +var _4f1=$.data(_4f0,"validatebox"); +var opts=_4f1.options; +if($(_4f0).attr("readonly")){ +return; +} +_4f1.validating=true; +_4f1.value=opts.val(_4f0); +(function(){ +if(!$(_4f0).is(":visible")){ +_4f1.validating=false; +} +if(_4f1.validating){ +var _4f2=opts.val(_4f0); +if(_4f1.value!=_4f2){ +_4f1.value=_4f2; +if(_4f1.vtimer){ +clearTimeout(_4f1.vtimer); +} +_4f1.vtimer=setTimeout(function(){ +$(_4f0).validatebox("validate"); +},opts.delay); +}else{ +if(_4f1.message){ +opts.err(_4f0,_4f1.message); +} +} +_4f1.ftimer=setTimeout(arguments.callee,opts.interval); +} +})(); +}; +function _4f3(e){ +var _4f4=e.data.target; +var _4f5=$.data(_4f4,"validatebox"); +var opts=_4f5.options; +_4f5.validating=false; +if(_4f5.vtimer){ +clearTimeout(_4f5.vtimer); +_4f5.vtimer=undefined; +} +if(_4f5.ftimer){ +clearTimeout(_4f5.ftimer); +_4f5.ftimer=undefined; +} +if(opts.validateOnBlur){ +setTimeout(function(){ +$(_4f4).validatebox("validate"); +},0); +} +opts.err(_4f4,_4f5.message,"hide"); +}; +function _4f6(e){ +var _4f7=e.data.target; +var _4f8=$.data(_4f7,"validatebox"); +_4f8.options.err(_4f7,_4f8.message,"show"); +}; +function _4f9(e){ +var _4fa=e.data.target; +var _4fb=$.data(_4fa,"validatebox"); +if(!_4fb.validating){ +_4fb.options.err(_4fa,_4fb.message,"hide"); +} +}; +function _4fc(_4fd,_4fe,_4ff){ +var _500=$.data(_4fd,"validatebox"); +var opts=_500.options; +var t=$(_4fd); +if(_4ff=="hide"||!_4fe){ +t.tooltip("hide"); +}else{ +if((t.is(":focus")&&_500.validating)||_4ff=="show"){ +t.tooltip($.extend({},opts.tipOptions,{content:_4fe,position:opts.tipPosition,deltaX:opts.deltaX,deltaY:opts.deltaY})).tooltip("show"); +} +} +}; +function _501(_502){ +var _503=$.data(_502,"validatebox"); +var opts=_503.options; +var box=$(_502); +opts.onBeforeValidate.call(_502); +var _504=_505(); +_504?box.removeClass("validatebox-invalid"):box.addClass("validatebox-invalid"); +opts.err(_502,_503.message); +opts.onValidate.call(_502,_504); +return _504; +function _506(msg){ +_503.message=msg; +}; +function _507(_508,_509){ +var _50a=opts.val(_502); +var _50b=/([a-zA-Z_]+)(.*)/.exec(_508); +var rule=opts.rules[_50b[1]]; +if(rule&&_50a){ +var _50c=_509||opts.validParams||eval(_50b[2]); +if(!rule["validator"].call(_502,_50a,_50c)){ +var _50d=rule["message"]; +if(_50c){ +for(var i=0;i<_50c.length;i++){ +_50d=_50d.replace(new RegExp("\\{"+i+"\\}","g"),_50c[i]); +} +} +_506(opts.invalidMessage||_50d); +return false; +} +} +return true; +}; +function _505(){ +_506(""); +if(!opts._validateOnCreate){ +setTimeout(function(){ +opts._validateOnCreate=true; +},0); +return true; +} +if(opts.novalidate||opts.disabled){ +return true; +} +if(opts.required){ +if(opts.val(_502)==""){ +_506(opts.missingMessage); +return false; +} +} +if(opts.validType){ +if($.isArray(opts.validType)){ +for(var i=0;i=_520[0]&&len<=_520[1]; +},message:"Please enter a value between {0} and {1}."},remote:{validator:function(_521,_522){ +var data={}; +data[_522[1]]=_521; +var _523=$.ajax({url:_522[0],dataType:"json",data:data,async:false,cache:false,type:"post"}).responseText; +return _523=="true"; +},message:"Please fix this field."}},onBeforeValidate:function(){ +},onValidate:function(_524){ +}}; +})(jQuery); +(function($){ +var _525=0; +function init(_526){ +$(_526).addClass("textbox-f").hide(); +var span=$(""+""+""+"").insertAfter(_526); +var name=$(_526).attr("name"); +if(name){ +span.find("input.textbox-value").attr("name",name); +$(_526).removeAttr("name").attr("textboxName",name); +} +return span; +}; +function _527(_528){ +var _529=$.data(_528,"textbox"); +var opts=_529.options; +var tb=_529.textbox; +var _52a="_easyui_textbox_input"+(++_525); +tb.addClass(opts.cls); +tb.find(".textbox-text").remove(); +if(opts.multiline){ +$("").prependTo(tb); +}else{ +$("").prependTo(tb); +} +$("#"+_52a).attr("tabindex",$(_528).attr("tabindex")||"").css("text-align",_528.style.textAlign||""); +tb.find(".textbox-addon").remove(); +var bb=opts.icons?$.extend(true,[],opts.icons):[]; +if(opts.iconCls){ +bb.push({iconCls:opts.iconCls,disabled:true}); +} +if(bb.length){ +var bc=$("").prependTo(tb); +bc.addClass("textbox-addon-"+opts.iconAlign); +for(var i=0;i"); +} +} +tb.find(".textbox-button").remove(); +if(opts.buttonText||opts.buttonIcon){ +var btn=$("").prependTo(tb); +btn.addClass("textbox-button-"+opts.buttonAlign).linkbutton({text:opts.buttonText,iconCls:opts.buttonIcon,onClick:function(){ +var t=$(this).parent().prev(); +t.textbox("options").onClickButton.call(t[0]); +}}); +} +if(opts.label){ +if(typeof opts.label=="object"){ +_529.label=$(opts.label); +_529.label.attr("for",_52a); +}else{ +$(_529.label).remove(); +_529.label=$("").html(opts.label); +_529.label.css("textAlign",opts.labelAlign).attr("for",_52a); +if(opts.labelPosition=="after"){ +_529.label.insertAfter(tb); +}else{ +_529.label.insertBefore(_528); +} +_529.label.removeClass("textbox-label-left textbox-label-right textbox-label-top"); +_529.label.addClass("textbox-label-"+opts.labelPosition); +} +}else{ +$(_529.label).remove(); +} +_52b(_528); +_52c(_528,opts.disabled); +_52d(_528,opts.readonly); +}; +function _52e(_52f){ +var _530=$.data(_52f,"textbox"); +var tb=_530.textbox; +tb.find(".textbox-text").validatebox("destroy"); +tb.remove(); +$(_530.label).remove(); +$(_52f).remove(); +}; +function _531(_532,_533){ +var _534=$.data(_532,"textbox"); +var opts=_534.options; +var tb=_534.textbox; +var _535=tb.parent(); +if(_533){ +if(typeof _533=="object"){ +$.extend(opts,_533); +}else{ +opts.width=_533; +} +} +if(isNaN(parseInt(opts.width))){ +var c=$(_532).clone(); +c.css("visibility","hidden"); +c.insertAfter(_532); +opts.width=c.outerWidth(); +c.remove(); +} +var _536=tb.is(":visible"); +if(!_536){ +tb.appendTo("body"); +} +var _537=tb.find(".textbox-text"); +var btn=tb.find(".textbox-button"); +var _538=tb.find(".textbox-addon"); +var _539=_538.find(".textbox-icon"); +if(opts.height=="auto"){ +_537.css({margin:"",paddingTop:"",paddingBottom:"",height:"",lineHeight:""}); +} +tb._size(opts,_535); +if(opts.label&&opts.labelPosition){ +if(opts.labelPosition=="top"){ +_534.label._size({width:opts.labelWidth=="auto"?tb.outerWidth():opts.labelWidth},tb); +if(opts.height!="auto"){ +tb._size("height",tb.outerHeight()-_534.label.outerHeight()); +} +}else{ +_534.label._size({width:opts.labelWidth,height:tb.outerHeight()},tb); +if(!opts.multiline){ +_534.label.css("lineHeight",_534.label.height()+"px"); +} +tb._size("width",tb.outerWidth()-_534.label.outerWidth()); +} +} +if(opts.buttonAlign=="left"||opts.buttonAlign=="right"){ +btn.linkbutton("resize",{height:tb.height()}); +}else{ +btn.linkbutton("resize",{width:"100%"}); +} +var _53a=tb.width()-_539.length*opts.iconWidth-_53b("left")-_53b("right"); +var _53c=opts.height=="auto"?_537.outerHeight():(tb.height()-_53b("top")-_53b("bottom")); +_538.css(opts.iconAlign,_53b(opts.iconAlign)+"px"); +_538.css("top",_53b("top")+"px"); +_539.css({width:opts.iconWidth+"px",height:_53c+"px"}); +_537.css({paddingLeft:(_532.style.paddingLeft||""),paddingRight:(_532.style.paddingRight||""),marginLeft:_53d("left"),marginRight:_53d("right"),marginTop:_53b("top"),marginBottom:_53b("bottom")}); +if(opts.multiline){ +_537.css({paddingTop:(_532.style.paddingTop||""),paddingBottom:(_532.style.paddingBottom||"")}); +_537._outerHeight(_53c); +}else{ +_537.css({paddingTop:0,paddingBottom:0,height:_53c+"px",lineHeight:_53c+"px"}); +} +_537._outerWidth(_53a); +opts.onResizing.call(_532,opts.width,opts.height); +if(!_536){ +tb.insertAfter(_532); +} +opts.onResize.call(_532,opts.width,opts.height); +function _53d(_53e){ +return (opts.iconAlign==_53e?_538._outerWidth():0)+_53b(_53e); +}; +function _53b(_53f){ +var w=0; +btn.filter(".textbox-button-"+_53f).each(function(){ +if(_53f=="left"||_53f=="right"){ +w+=$(this).outerWidth(); +}else{ +w+=$(this).outerHeight(); +} +}); +return w; +}; +}; +function _52b(_540){ +var opts=$(_540).textbox("options"); +var _541=$(_540).textbox("textbox"); +_541.validatebox($.extend({},opts,{deltaX:function(_542){ +return $(_540).textbox("getTipX",_542); +},deltaY:function(_543){ +return $(_540).textbox("getTipY",_543); +},onBeforeValidate:function(){ +opts.onBeforeValidate.call(_540); +var box=$(this); +if(!box.is(":focus")){ +if(box.val()!==opts.value){ +opts.oldInputValue=box.val(); +box.val(opts.value); +} +} +},onValidate:function(_544){ +var box=$(this); +if(opts.oldInputValue!=undefined){ +box.val(opts.oldInputValue); +opts.oldInputValue=undefined; +} +var tb=box.parent(); +if(_544){ +tb.removeClass("textbox-invalid"); +}else{ +tb.addClass("textbox-invalid"); +} +opts.onValidate.call(_540,_544); +}})); +}; +function _545(_546){ +var _547=$.data(_546,"textbox"); +var opts=_547.options; +var tb=_547.textbox; +var _548=tb.find(".textbox-text"); +_548.attr("placeholder",opts.prompt); +_548.unbind(".textbox"); +$(_547.label).unbind(".textbox"); +if(!opts.disabled&&!opts.readonly){ +if(_547.label){ +$(_547.label).bind("click.textbox",function(e){ +if(!opts.hasFocusMe){ +_548.focus(); +$(_546).textbox("setSelectionRange",{start:0,end:_548.val().length}); +} +}); +} +_548.bind("blur.textbox",function(e){ +if(!tb.hasClass("textbox-focused")){ +return; +} +opts.value=$(this).val(); +if(opts.value==""){ +$(this).val(opts.prompt).addClass("textbox-prompt"); +}else{ +$(this).removeClass("textbox-prompt"); +} +tb.removeClass("textbox-focused"); +tb.closest(".form-field").removeClass("form-field-focused"); +}).bind("focus.textbox",function(e){ +opts.hasFocusMe=true; +if(tb.hasClass("textbox-focused")){ +return; +} +if($(this).val()!=opts.value){ +$(this).val(opts.value); +} +$(this).removeClass("textbox-prompt"); +tb.addClass("textbox-focused"); +tb.closest(".form-field").addClass("form-field-focused"); +}); +for(var _549 in opts.inputEvents){ +_548.bind(_549+".textbox",{target:_546},opts.inputEvents[_549]); +} +} +var _54a=tb.find(".textbox-addon"); +_54a.unbind().bind("click",{target:_546},function(e){ +var icon=$(e.target).closest("a.textbox-icon:not(.textbox-icon-disabled)"); +if(icon.length){ +var _54b=parseInt(icon.attr("icon-index")); +var conf=opts.icons[_54b]; +if(conf&&conf.handler){ +conf.handler.call(icon[0],e); +} +opts.onClickIcon.call(_546,_54b); +} +}); +_54a.find(".textbox-icon").each(function(_54c){ +var conf=opts.icons[_54c]; +var icon=$(this); +if(!conf||conf.disabled||opts.disabled||opts.readonly){ +icon.addClass("textbox-icon-disabled"); +}else{ +icon.removeClass("textbox-icon-disabled"); +} +}); +var btn=tb.find(".textbox-button"); +btn.linkbutton((opts.disabled||opts.readonly)?"disable":"enable"); +tb.unbind(".textbox").bind("_resize.textbox",function(e,_54d){ +if($(this).hasClass("easyui-fluid")||_54d){ +_531(_546); +} +return false; +}); +}; +function _52c(_54e,_54f){ +var _550=$.data(_54e,"textbox"); +var opts=_550.options; +var tb=_550.textbox; +var _551=tb.find(".textbox-text"); +var ss=$(_54e).add(tb.find(".textbox-value")); +opts.disabled=_54f; +if(opts.disabled){ +_551.blur(); +_551.validatebox("disable"); +tb.addClass("textbox-disabled"); +ss._propAttr("disabled",true); +$(_550.label).addClass("textbox-label-disabled"); +}else{ +_551.validatebox("enable"); +tb.removeClass("textbox-disabled"); +ss._propAttr("disabled",false); +$(_550.label).removeClass("textbox-label-disabled"); +} +}; +function _52d(_552,mode){ +var _553=$.data(_552,"textbox"); +var opts=_553.options; +var tb=_553.textbox; +var _554=tb.find(".textbox-text"); +opts.readonly=mode==undefined?true:mode; +if(opts.readonly){ +_554.triggerHandler("blur.textbox"); +} +_554.validatebox("readonly",opts.readonly); +tb.removeClass("textbox-readonly").addClass(opts.readonly?"textbox-readonly":""); +}; +$.fn.textbox=function(_555,_556){ +if(typeof _555=="string"){ +var _557=$.fn.textbox.methods[_555]; +if(_557){ +return _557(this,_556); +}else{ +return this.each(function(){ +var _558=$(this).textbox("textbox"); +_558.validatebox(_555,_556); +}); +} +} +_555=_555||{}; +return this.each(function(){ +var _559=$.data(this,"textbox"); +if(_559){ +$.extend(_559.options,_555); +if(_555.value!=undefined){ +_559.options.originalValue=_555.value; +} +}else{ +_559=$.data(this,"textbox",{options:$.extend({},$.fn.textbox.defaults,$.fn.textbox.parseOptions(this),_555),textbox:init(this)}); +_559.options.originalValue=_559.options.value; +} +_527(this); +_545(this); +if(_559.options.doSize){ +_531(this); +} +var _55a=_559.options.value; +_559.options.value=""; +$(this).textbox("initValue",_55a); +}); +}; +$.fn.textbox.methods={options:function(jq){ +return $.data(jq[0],"textbox").options; +},cloneFrom:function(jq,from){ +return jq.each(function(){ +var t=$(this); +if(t.data("textbox")){ +return; +} +if(!$(from).data("textbox")){ +$(from).textbox(); +} +var opts=$.extend(true,{},$(from).textbox("options")); +var name=t.attr("name")||""; +t.addClass("textbox-f").hide(); +t.removeAttr("name").attr("textboxName",name); +var span=$(from).next().clone().insertAfter(t); +var _55b="_easyui_textbox_input"+(++_525); +span.find(".textbox-value").attr("name",name); +span.find(".textbox-text").attr("id",_55b); +var _55c=$($(from).textbox("label")).clone(); +if(_55c.length){ +_55c.attr("for",_55b); +if(opts.labelPosition=="after"){ +_55c.insertAfter(t.next()); +}else{ +_55c.insertBefore(t); +} +} +$.data(this,"textbox",{options:opts,textbox:span,label:(_55c.length?_55c:undefined)}); +var _55d=$(from).textbox("button"); +if(_55d.length){ +t.textbox("button").linkbutton($.extend(true,{},_55d.linkbutton("options"))); +} +_545(this); +_52b(this); +}); +},textbox:function(jq){ +return $.data(jq[0],"textbox").textbox.find(".textbox-text"); +},button:function(jq){ +return $.data(jq[0],"textbox").textbox.find(".textbox-button"); +},label:function(jq){ +return $.data(jq[0],"textbox").label; +},destroy:function(jq){ +return jq.each(function(){ +_52e(this); +}); +},resize:function(jq,_55e){ +return jq.each(function(){ +_531(this,_55e); +}); +},disable:function(jq){ +return jq.each(function(){ +_52c(this,true); +_545(this); +}); +},enable:function(jq){ +return jq.each(function(){ +_52c(this,false); +_545(this); +}); +},readonly:function(jq,mode){ +return jq.each(function(){ +_52d(this,mode); +_545(this); +}); +},isValid:function(jq){ +return jq.textbox("textbox").validatebox("isValid"); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("setValue",""); +}); +},setText:function(jq,_55f){ +return jq.each(function(){ +var opts=$(this).textbox("options"); +var _560=$(this).textbox("textbox"); +_55f=_55f==undefined?"":String(_55f); +if($(this).textbox("getText")!=_55f){ +_560.val(_55f); +} +opts.value=_55f; +if(!_560.is(":focus")){ +if(_55f){ +_560.removeClass("textbox-prompt"); +}else{ +_560.val(opts.prompt).addClass("textbox-prompt"); +} +} +if(opts.value){ +$(this).closest(".form-field").removeClass("form-field-empty"); +}else{ +$(this).closest(".form-field").addClass("form-field-empty"); +} +$(this).textbox("validate"); +}); +},initValue:function(jq,_561){ +return jq.each(function(){ +var _562=$.data(this,"textbox"); +$(this).textbox("setText",_561); +_562.textbox.find(".textbox-value").val(_561); +$(this).val(_561); +}); +},setValue:function(jq,_563){ +return jq.each(function(){ +var opts=$.data(this,"textbox").options; +var _564=$(this).textbox("getValue"); +$(this).textbox("initValue",_563); +if(_564!=_563){ +opts.onChange.call(this,_563,_564); +$(this).closest("form").trigger("_change",[this]); +} +}); +},getText:function(jq){ +var _565=jq.textbox("textbox"); +if(_565.is(":focus")){ +return _565.val(); +}else{ +return jq.textbox("options").value; +} +},getValue:function(jq){ +return jq.data("textbox").textbox.find(".textbox-value").val(); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).textbox("options"); +$(this).textbox("textbox").val(opts.originalValue); +$(this).textbox("setValue",opts.originalValue); +}); +},getIcon:function(jq,_566){ +return jq.data("textbox").textbox.find(".textbox-icon:eq("+_566+")"); +},getTipX:function(jq,_567){ +var _568=jq.data("textbox"); +var opts=_568.options; +var tb=_568.textbox; +var _569=tb.find(".textbox-text"); +var _567=_567||opts.tipPosition; +var p1=tb.offset(); +var p2=_569.offset(); +var w1=tb.outerWidth(); +var w2=_569.outerWidth(); +if(_567=="right"){ +return w1-w2-p2.left+p1.left; +}else{ +if(_567=="left"){ +return p1.left-p2.left; +}else{ +return (w1-w2-p2.left+p1.left)/2-(p2.left-p1.left)/2; +} +} +},getTipY:function(jq,_56a){ +var _56b=jq.data("textbox"); +var opts=_56b.options; +var tb=_56b.textbox; +var _56c=tb.find(".textbox-text"); +var _56a=_56a||opts.tipPosition; +var p1=tb.offset(); +var p2=_56c.offset(); +var h1=tb.outerHeight(); +var h2=_56c.outerHeight(); +if(_56a=="left"||_56a=="right"){ +return (h1-h2-p2.top+p1.top)/2-(p2.top-p1.top)/2; +}else{ +if(_56a=="bottom"){ +return (h1-h2-p2.top+p1.top); +}else{ +return (p1.top-p2.top); +} +} +},getSelectionStart:function(jq){ +return jq.textbox("getSelectionRange").start; +},getSelectionRange:function(jq){ +var _56d=jq.textbox("textbox")[0]; +var _56e=0; +var end=0; +if(typeof _56d.selectionStart=="number"){ +_56e=_56d.selectionStart; +end=_56d.selectionEnd; +}else{ +if(_56d.createTextRange){ +var s=document.selection.createRange(); +var _56f=_56d.createTextRange(); +_56f.setEndPoint("EndToStart",s); +_56e=_56f.text.length; +end=_56e+s.text.length; +} +} +return {start:_56e,end:end}; +},setSelectionRange:function(jq,_570){ +return jq.each(function(){ +var _571=$(this).textbox("textbox")[0]; +var _572=_570.start; +var end=_570.end; +if(_571.setSelectionRange){ +_571.setSelectionRange(_572,end); +}else{ +if(_571.createTextRange){ +var _573=_571.createTextRange(); +_573.collapse(); +_573.moveEnd("character",end); +_573.moveStart("character",_572); +_573.select(); +} +} +}); +}}; +$.fn.textbox.parseOptions=function(_574){ +var t=$(_574); +return $.extend({},$.fn.validatebox.parseOptions(_574),$.parser.parseOptions(_574,["prompt","iconCls","iconAlign","buttonText","buttonIcon","buttonAlign","label","labelPosition","labelAlign",{multiline:"boolean",iconWidth:"number",labelWidth:"number"}]),{value:(t.val()||undefined),type:(t.attr("type")?t.attr("type"):undefined)}); +}; +$.fn.textbox.defaults=$.extend({},$.fn.validatebox.defaults,{doSize:true,width:"auto",height:"auto",cls:null,prompt:"",value:"",type:"text",multiline:false,icons:[],iconCls:null,iconAlign:"right",iconWidth:26,buttonText:"",buttonIcon:null,buttonAlign:"right",label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",inputEvents:{blur:function(e){ +var t=$(e.data.target); +var opts=t.textbox("options"); +if(t.textbox("getValue")!=opts.value){ +t.textbox("setValue",opts.value); +} +},keydown:function(e){ +if(e.keyCode==13){ +var t=$(e.data.target); +t.textbox("setValue",t.textbox("getText")); +} +}},onChange:function(_575,_576){ +},onResizing:function(_577,_578){ +},onResize:function(_579,_57a){ +},onClickButton:function(){ +},onClickIcon:function(_57b){ +}}); +})(jQuery); +(function($){ +function _57c(_57d){ +var _57e=$.data(_57d,"passwordbox"); +var opts=_57e.options; +var _57f=$.extend(true,[],opts.icons); +if(opts.showEye){ +_57f.push({iconCls:"passwordbox-open",handler:function(e){ +opts.revealed=!opts.revealed; +_580(_57d); +}}); +} +$(_57d).addClass("passwordbox-f").textbox($.extend({},opts,{icons:_57f})); +_580(_57d); +}; +function _581(_582,_583,all){ +var t=$(_582); +var opts=t.passwordbox("options"); +if(opts.revealed){ +t.textbox("setValue",_583); +return; +} +var _584=unescape(opts.passwordChar); +var cc=_583.split(""); +var vv=t.passwordbox("getValue").split(""); +for(var i=0;i=0){ +vv.splice(_5ad,1); +} +}else{ +var _5ab=_5a3(_5a8,_5aa.start); +var end=_5ac(_5a8,_5aa.end); +var _5ad=_5ab-_5a5(_5a8,_5ab); +var _5ae=end-_5a5(_5a8,end); +vv.splice(_5ad,_5ae-_5ad+1); +} +$(_5a8).maskedbox("setValue",_59c(_5a8,vv.join(""))); +$(_5a8).maskedbox("setSelectionRange",{start:_5ab,end:_5ab}); +}; +function _5a5(_5af,pos){ +var opts=$(_5af).maskedbox("options"); +var _5b0=0; +if(pos>=opts.mask.length){ +pos--; +} +for(var i=pos;i>=0;i--){ +if(opts.masks[opts.mask[i]]==undefined){ +_5b0++; +} +} +return _5b0; +}; +function _5a3(_5b1,pos){ +var opts=$(_5b1).maskedbox("options"); +var m=opts.mask[pos]; +var r=opts.masks[m]; +while(pos=0&&!r){ +pos--; +m=opts.mask[pos]; +r=opts.masks[m]; +} +return pos<0?0:pos; +}; +function _5b3(e){ +if(e.metaKey||e.ctrlKey){ +return; +} +var _5b4=e.data.target; +var opts=$(_5b4).maskedbox("options"); +var _5b5=[9,13,35,36,37,39]; +if($.inArray(e.keyCode,_5b5)!=-1){ +return true; +} +if(e.keyCode>=96&&e.keyCode<=105){ +e.keyCode-=48; +} +var c=String.fromCharCode(e.keyCode); +if(e.keyCode>=65&&e.keyCode<=90&&!e.shiftKey){ +c=c.toLowerCase(); +}else{ +if(e.keyCode==189){ +c="-"; +}else{ +if(e.keyCode==187){ +c="+"; +}else{ +if(e.keyCode==190){ +c="."; +} +} +} +} +if(e.keyCode==8){ +_5a7(_5b4,true); +}else{ +if(e.keyCode==46){ +_5a7(_5b4,false); +}else{ +_59f(_5b4,c); +} +} +return false; +}; +$.extend($.fn.textbox.methods,{inputMask:function(jq,_5b6){ +return jq.each(function(){ +var _5b7=this; +var opts=$.extend({},$.fn.maskedbox.defaults,_5b6); +$.data(_5b7,"maskedbox",{options:opts}); +var _5b8=$(_5b7).textbox("textbox"); +_5b8.unbind(".maskedbox"); +for(var _5b9 in opts.inputEvents){ +_5b8.bind(_5b9+".maskedbox",{target:_5b7},opts.inputEvents[_5b9]); +} +}); +}}); +$.fn.maskedbox=function(_5ba,_5bb){ +if(typeof _5ba=="string"){ +var _5bc=$.fn.maskedbox.methods[_5ba]; +if(_5bc){ +return _5bc(this,_5bb); +}else{ +return this.textbox(_5ba,_5bb); +} +} +_5ba=_5ba||{}; +return this.each(function(){ +var _5bd=$.data(this,"maskedbox"); +if(_5bd){ +$.extend(_5bd.options,_5ba); +}else{ +$.data(this,"maskedbox",{options:$.extend({},$.fn.maskedbox.defaults,$.fn.maskedbox.parseOptions(this),_5ba)}); +} +_596(this); +}); +}; +$.fn.maskedbox.methods={options:function(jq){ +var opts=jq.textbox("options"); +return $.extend($.data(jq[0],"maskedbox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +},initValue:function(jq,_5be){ +return jq.each(function(){ +_5be=_59c(this,_599(this,_5be)); +$(this).textbox("initValue",_5be); +}); +},setValue:function(jq,_5bf){ +return jq.each(function(){ +_5bf=_59c(this,_599(this,_5bf)); +$(this).textbox("setValue",_5bf); +}); +}}; +$.fn.maskedbox.parseOptions=function(_5c0){ +var t=$(_5c0); +return $.extend({},$.fn.textbox.parseOptions(_5c0),$.parser.parseOptions(_5c0,["mask","promptChar"]),{}); +}; +$.fn.maskedbox.defaults=$.extend({},$.fn.textbox.defaults,{mask:"",promptChar:"_",masks:{"9":"[0-9]","a":"[a-zA-Z]","*":"[0-9a-zA-Z]"},inputEvents:{keydown:_5b3}}); +})(jQuery); +(function($){ +var _5c1=0; +function _5c2(_5c3){ +var _5c4=$.data(_5c3,"filebox"); +var opts=_5c4.options; +opts.fileboxId="filebox_file_id_"+(++_5c1); +$(_5c3).addClass("filebox-f").textbox(opts); +$(_5c3).textbox("textbox").attr("readonly","readonly"); +_5c4.filebox=$(_5c3).next().addClass("filebox"); +var file=_5c5(_5c3); +var btn=$(_5c3).filebox("button"); +if(btn.length){ +$("").appendTo(btn); +if(btn.linkbutton("options").disabled){ +file._propAttr("disabled",true); +}else{ +file._propAttr("disabled",false); +} +} +}; +function _5c5(_5c6){ +var _5c7=$.data(_5c6,"filebox"); +var opts=_5c7.options; +_5c7.filebox.find(".textbox-value").remove(); +opts.oldValue=""; +var file=$("").appendTo(_5c7.filebox); +file.attr("id",opts.fileboxId).attr("name",$(_5c6).attr("textboxName")||""); +file.attr("accept",opts.accept); +file.attr("capture",opts.capture); +if(opts.multiple){ +file.attr("multiple","multiple"); +} +file.change(function(){ +var _5c8=this.value; +if(this.files){ +_5c8=$.map(this.files,function(file){ +return file.name; +}).join(opts.separator); +} +$(_5c6).filebox("setText",_5c8); +opts.onChange.call(_5c6,_5c8,opts.oldValue); +opts.oldValue=_5c8; +}); +return file; +}; +$.fn.filebox=function(_5c9,_5ca){ +if(typeof _5c9=="string"){ +var _5cb=$.fn.filebox.methods[_5c9]; +if(_5cb){ +return _5cb(this,_5ca); +}else{ +return this.textbox(_5c9,_5ca); +} +} +_5c9=_5c9||{}; +return this.each(function(){ +var _5cc=$.data(this,"filebox"); +if(_5cc){ +$.extend(_5cc.options,_5c9); +}else{ +$.data(this,"filebox",{options:$.extend({},$.fn.filebox.defaults,$.fn.filebox.parseOptions(this),_5c9)}); +} +_5c2(this); +}); +}; +$.fn.filebox.methods={options:function(jq){ +var opts=jq.textbox("options"); +return $.extend($.data(jq[0],"filebox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("clear"); +_5c5(this); +}); +},reset:function(jq){ +return jq.each(function(){ +$(this).filebox("clear"); +}); +},setValue:function(jq){ +return jq; +},setValues:function(jq){ +return jq; +},files:function(jq){ +return jq.next().find(".textbox-value")[0].files; +}}; +$.fn.filebox.parseOptions=function(_5cd){ +var t=$(_5cd); +return $.extend({},$.fn.textbox.parseOptions(_5cd),$.parser.parseOptions(_5cd,["accept","capture","separator"]),{multiple:(t.attr("multiple")?true:undefined)}); +}; +$.fn.filebox.defaults=$.extend({},$.fn.textbox.defaults,{buttonIcon:null,buttonText:"Choose File",buttonAlign:"right",inputEvents:{},accept:"",capture:"",separator:",",multiple:false}); +})(jQuery); +(function($){ +function _5ce(_5cf){ +var _5d0=$.data(_5cf,"searchbox"); +var opts=_5d0.options; +var _5d1=$.extend(true,[],opts.icons); +_5d1.push({iconCls:"searchbox-button",handler:function(e){ +var t=$(e.data.target); +var opts=t.searchbox("options"); +opts.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); +}}); +_5d2(); +var _5d3=_5d4(); +$(_5cf).addClass("searchbox-f").textbox($.extend({},opts,{icons:_5d1,buttonText:(_5d3?_5d3.text:"")})); +$(_5cf).attr("searchboxName",$(_5cf).attr("textboxName")); +_5d0.searchbox=$(_5cf).next(); +_5d0.searchbox.addClass("searchbox"); +_5d5(_5d3); +function _5d2(){ +if(opts.menu){ +_5d0.menu=$(opts.menu).menu(); +var _5d6=_5d0.menu.menu("options"); +var _5d7=_5d6.onClick; +_5d6.onClick=function(item){ +_5d5(item); +_5d7.call(this,item); +}; +}else{ +if(_5d0.menu){ +_5d0.menu.menu("destroy"); +} +_5d0.menu=null; +} +}; +function _5d4(){ +if(_5d0.menu){ +var item=_5d0.menu.children("div.menu-item:first"); +_5d0.menu.children("div.menu-item").each(function(){ +var _5d8=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); +if(_5d8.selected){ +item=$(this); +return false; +} +}); +return _5d0.menu.menu("getItem",item[0]); +}else{ +return null; +} +}; +function _5d5(item){ +if(!item){ +return; +} +$(_5cf).textbox("button").menubutton({text:item.text,iconCls:(item.iconCls||null),menu:_5d0.menu,menuAlign:opts.buttonAlign,plain:false}); +_5d0.searchbox.find("input.textbox-value").attr("name",item.name||item.text); +$(_5cf).searchbox("resize"); +}; +}; +$.fn.searchbox=function(_5d9,_5da){ +if(typeof _5d9=="string"){ +var _5db=$.fn.searchbox.methods[_5d9]; +if(_5db){ +return _5db(this,_5da); +}else{ +return this.textbox(_5d9,_5da); +} +} +_5d9=_5d9||{}; +return this.each(function(){ +var _5dc=$.data(this,"searchbox"); +if(_5dc){ +$.extend(_5dc.options,_5d9); +}else{ +$.data(this,"searchbox",{options:$.extend({},$.fn.searchbox.defaults,$.fn.searchbox.parseOptions(this),_5d9)}); +} +_5ce(this); +}); +}; +$.fn.searchbox.methods={options:function(jq){ +var opts=jq.textbox("options"); +return $.extend($.data(jq[0],"searchbox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +},menu:function(jq){ +return $.data(jq[0],"searchbox").menu; +},getName:function(jq){ +return $.data(jq[0],"searchbox").searchbox.find("input.textbox-value").attr("name"); +},selectName:function(jq,name){ +return jq.each(function(){ +var menu=$.data(this,"searchbox").menu; +if(menu){ +menu.children("div.menu-item").each(function(){ +var item=menu.menu("getItem",this); +if(item.name==name){ +$(this).trigger("click"); +return false; +} +}); +} +}); +},destroy:function(jq){ +return jq.each(function(){ +var menu=$(this).searchbox("menu"); +if(menu){ +menu.menu("destroy"); +} +$(this).textbox("destroy"); +}); +}}; +$.fn.searchbox.parseOptions=function(_5dd){ +var t=$(_5dd); +return $.extend({},$.fn.textbox.parseOptions(_5dd),$.parser.parseOptions(_5dd,["menu"]),{searcher:(t.attr("searcher")?eval(t.attr("searcher")):undefined)}); +}; +$.fn.searchbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:$.extend({},$.fn.textbox.defaults.inputEvents,{keydown:function(e){ +if(e.keyCode==13){ +e.preventDefault(); +var t=$(e.data.target); +var opts=t.searchbox("options"); +t.searchbox("setValue",$(this).val()); +opts.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); +return false; +} +}}),buttonAlign:"left",menu:null,searcher:function(_5de,name){ +}}); +})(jQuery); +(function($){ +function _5df(_5e0,_5e1){ +var opts=$.data(_5e0,"form").options; +$.extend(opts,_5e1||{}); +var _5e2=$.extend({},opts.queryParams); +if(opts.onSubmit.call(_5e0,_5e2)==false){ +return; +} +var _5e3=$(_5e0).find(".textbox-text:focus"); +_5e3.triggerHandler("blur"); +_5e3.focus(); +var _5e4=null; +if(opts.dirty){ +var ff=[]; +$.map(opts.dirtyFields,function(f){ +if($(f).hasClass("textbox-f")){ +$(f).next().find(".textbox-value").each(function(){ +ff.push(this); +}); +}else{ +ff.push(f); +} +}); +_5e4=$(_5e0).find("input[name]:enabled,textarea[name]:enabled,select[name]:enabled").filter(function(){ +return $.inArray(this,ff)==-1; +}); +_5e4._propAttr("disabled",true); +} +if(opts.ajax){ +if(opts.iframe){ +_5e5(_5e0,_5e2); +}else{ +if(window.FormData!==undefined){ +_5e6(_5e0,_5e2); +}else{ +_5e5(_5e0,_5e2); +} +} +}else{ +$(_5e0).submit(); +} +if(opts.dirty){ +_5e4._propAttr("disabled",false); +} +}; +function _5e5(_5e7,_5e8){ +var opts=$.data(_5e7,"form").options; +var _5e9="easyui_frame_"+(new Date().getTime()); +var _5ea=$("").appendTo("body"); +_5ea.attr("src",window.ActiveXObject?"javascript:false":"about:blank"); +_5ea.css({position:"absolute",top:-1000,left:-1000}); +_5ea.bind("load",cb); +_5eb(_5e8); +function _5eb(_5ec){ +var form=$(_5e7); +if(opts.url){ +form.attr("action",opts.url); +} +var t=form.attr("target"),a=form.attr("action"); +form.attr("target",_5e9); +var _5ed=$(); +try{ +for(var n in _5ec){ +var _5ee=$("").val(_5ec[n]).appendTo(form); +_5ed=_5ed.add(_5ee); +} +_5ef(); +form[0].submit(); +} +finally{ +form.attr("action",a); +t?form.attr("target",t):form.removeAttr("target"); +_5ed.remove(); +} +}; +function _5ef(){ +var f=$("#"+_5e9); +if(!f.length){ +return; +} +try{ +var s=f.contents()[0].readyState; +if(s&&s.toLowerCase()=="uninitialized"){ +setTimeout(_5ef,100); +} +} +catch(e){ +cb(); +} +}; +var _5f0=10; +function cb(){ +var f=$("#"+_5e9); +if(!f.length){ +return; +} +f.unbind(); +var data=""; +try{ +var body=f.contents().find("body"); +data=body.html(); +if(data==""){ +if(--_5f0){ +setTimeout(cb,100); +return; +} +} +var ta=body.find(">textarea"); +if(ta.length){ +data=ta.val(); +}else{ +var pre=body.find(">pre"); +if(pre.length){ +data=pre.html(); +} +} +} +catch(e){ +} +opts.success.call(_5e7,data); +setTimeout(function(){ +f.unbind(); +f.remove(); +},100); +}; +}; +function _5e6(_5f1,_5f2){ +var opts=$.data(_5f1,"form").options; +var _5f3=new FormData($(_5f1)[0]); +for(var name in _5f2){ +_5f3.append(name,_5f2[name]); +} +$.ajax({url:opts.url,type:"post",xhr:function(){ +var xhr=$.ajaxSettings.xhr(); +if(xhr.upload){ +xhr.upload.addEventListener("progress",function(e){ +if(e.lengthComputable){ +var _5f4=e.total; +var _5f5=e.loaded||e.position; +var _5f6=Math.ceil(_5f5*100/_5f4); +opts.onProgress.call(_5f1,_5f6); +} +},false); +} +return xhr; +},data:_5f3,dataType:"html",cache:false,contentType:false,processData:false,complete:function(res){ +opts.success.call(_5f1,res.responseText); +}}); +}; +function load(_5f7,data){ +var opts=$.data(_5f7,"form").options; +if(typeof data=="string"){ +var _5f8={}; +if(opts.onBeforeLoad.call(_5f7,_5f8)==false){ +return; +} +$.ajax({url:data,data:_5f8,dataType:"json",success:function(data){ +_5f9(data); +},error:function(){ +opts.onLoadError.apply(_5f7,arguments); +}}); +}else{ +_5f9(data); +} +function _5f9(data){ +var form=$(_5f7); +for(var name in data){ +var val=data[name]; +if(!_5fa(name,val)){ +if(!_5fb(name,val)){ +form.find("input[name=\""+name+"\"]").val(val); +form.find("textarea[name=\""+name+"\"]").val(val); +form.find("select[name=\""+name+"\"]").val(val); +} +} +} +opts.onLoadSuccess.call(_5f7,data); +form.form("validate"); +}; +function _5fa(name,val){ +var cc=$(_5f7).find("[switchbuttonName=\""+name+"\"]"); +if(cc.length){ +cc.switchbutton("uncheck"); +cc.each(function(){ +if(_5fc($(this).switchbutton("options").value,val)){ +$(this).switchbutton("check"); +} +}); +return true; +} +cc=$(_5f7).find("input[name=\""+name+"\"][type=radio], input[name=\""+name+"\"][type=checkbox]"); +if(cc.length){ +cc._propAttr("checked",false); +cc.each(function(){ +if(_5fc($(this).val(),val)){ +$(this)._propAttr("checked",true); +} +}); +return true; +} +return false; +}; +function _5fc(v,val){ +if(v==String(val)||$.inArray(v,$.isArray(val)?val:[val])>=0){ +return true; +}else{ +return false; +} +}; +function _5fb(name,val){ +var _5fd=$(_5f7).find("[textboxName=\""+name+"\"],[sliderName=\""+name+"\"]"); +if(_5fd.length){ +for(var i=0;i=0;i--){ +var type=opts.fieldTypes[i]; +var _605=form.find("."+type+"-f"); +if(_605.length&&_605[type]){ +_605[type]("reset"); +} +} +form.form("validate"); +}; +function _606(_607){ +var _608=$.data(_607,"form").options; +$(_607).unbind(".form"); +if(_608.ajax){ +$(_607).bind("submit.form",function(){ +setTimeout(function(){ +_5df(_607,_608); +},0); +return false; +}); +} +$(_607).bind("_change.form",function(e,t){ +if($.inArray(t,_608.dirtyFields)==-1){ +_608.dirtyFields.push(t); +} +_608.onChange.call(this,t); +}).bind("change.form",function(e){ +var t=e.target; +if(!$(t).hasClass("textbox-text")){ +if($.inArray(t,_608.dirtyFields)==-1){ +_608.dirtyFields.push(t); +} +_608.onChange.call(this,t); +} +}); +_609(_607,_608.novalidate); +}; +function _60a(_60b,_60c){ +_60c=_60c||{}; +var _60d=$.data(_60b,"form"); +if(_60d){ +$.extend(_60d.options,_60c); +}else{ +$.data(_60b,"form",{options:$.extend({},$.fn.form.defaults,$.fn.form.parseOptions(_60b),_60c)}); +} +}; +function _60e(_60f){ +if($.fn.validatebox){ +var t=$(_60f); +t.find(".validatebox-text:not(:disabled)").validatebox("validate"); +var _610=t.find(".validatebox-invalid"); +_610.filter(":not(:disabled):first").focus(); +return _610.length==0; +} +return true; +}; +function _609(_611,_612){ +var opts=$.data(_611,"form").options; +opts.novalidate=_612; +$(_611).find(".validatebox-text:not(:disabled)").validatebox(_612?"disableValidation":"enableValidation"); +}; +$.fn.form=function(_613,_614){ +if(typeof _613=="string"){ +this.each(function(){ +_60a(this); +}); +return $.fn.form.methods[_613](this,_614); +} +return this.each(function(){ +_60a(this,_613); +_606(this); +}); +}; +$.fn.form.methods={options:function(jq){ +return $.data(jq[0],"form").options; +},submit:function(jq,_615){ +return jq.each(function(){ +_5df(this,_615); +}); +},load:function(jq,data){ +return jq.each(function(){ +load(this,data); +}); +},clear:function(jq){ +return jq.each(function(){ +_5ff(this); +}); +},reset:function(jq){ +return jq.each(function(){ +_603(this); +}); +},validate:function(jq){ +return _60e(jq[0]); +},disableValidation:function(jq){ +return jq.each(function(){ +_609(this,true); +}); +},enableValidation:function(jq){ +return jq.each(function(){ +_609(this,false); +}); +},resetValidation:function(jq){ +return jq.each(function(){ +$(this).find(".validatebox-text:not(:disabled)").validatebox("resetValidation"); +}); +},resetDirty:function(jq){ +return jq.each(function(){ +$(this).form("options").dirtyFields=[]; +}); +}}; +$.fn.form.parseOptions=function(_616){ +var t=$(_616); +return $.extend({},$.parser.parseOptions(_616,[{ajax:"boolean",dirty:"boolean"}]),{url:(t.attr("action")?t.attr("action"):undefined)}); +}; +$.fn.form.defaults={fieldTypes:["tagbox","combobox","combotree","combogrid","combotreegrid","datetimebox","datebox","combo","datetimespinner","timespinner","numberspinner","spinner","slider","searchbox","numberbox","passwordbox","filebox","textbox","switchbutton"],novalidate:false,ajax:true,iframe:true,dirty:false,dirtyFields:[],url:null,queryParams:{},onSubmit:function(_617){ +return $(this).form("validate"); +},onProgress:function(_618){ +},success:function(data){ +},onBeforeLoad:function(_619){ +},onLoadSuccess:function(data){ +},onLoadError:function(){ +},onChange:function(_61a){ +}}; +})(jQuery); +(function($){ +function _61b(_61c){ +var _61d=$.data(_61c,"numberbox"); +var opts=_61d.options; +$(_61c).addClass("numberbox-f").textbox(opts); +$(_61c).textbox("textbox").css({imeMode:"disabled"}); +$(_61c).attr("numberboxName",$(_61c).attr("textboxName")); +_61d.numberbox=$(_61c).next(); +_61d.numberbox.addClass("numberbox"); +var _61e=opts.parser.call(_61c,opts.value); +var _61f=opts.formatter.call(_61c,_61e); +$(_61c).numberbox("initValue",_61e).numberbox("setText",_61f); +}; +function _620(_621,_622){ +var _623=$.data(_621,"numberbox"); +var opts=_623.options; +opts.value=parseFloat(_622); +var _622=opts.parser.call(_621,_622); +var text=opts.formatter.call(_621,_622); +opts.value=_622; +$(_621).textbox("setText",text).textbox("setValue",_622); +text=opts.formatter.call(_621,$(_621).textbox("getValue")); +$(_621).textbox("setText",text); +}; +$.fn.numberbox=function(_624,_625){ +if(typeof _624=="string"){ +var _626=$.fn.numberbox.methods[_624]; +if(_626){ +return _626(this,_625); +}else{ +return this.textbox(_624,_625); +} +} +_624=_624||{}; +return this.each(function(){ +var _627=$.data(this,"numberbox"); +if(_627){ +$.extend(_627.options,_624); +}else{ +_627=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_624)}); +} +_61b(this); +}); +}; +$.fn.numberbox.methods={options:function(jq){ +var opts=jq.data("textbox")?jq.textbox("options"):{}; +return $.extend($.data(jq[0],"numberbox").options,{width:opts.width,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).textbox("cloneFrom",from); +$.data(this,"numberbox",{options:$.extend(true,{},$(from).numberbox("options"))}); +$(this).addClass("numberbox-f"); +}); +},fix:function(jq){ +return jq.each(function(){ +var opts=$(this).numberbox("options"); +opts.value=null; +var _628=opts.parser.call(this,$(this).numberbox("getText")); +$(this).numberbox("setValue",_628); +}); +},setValue:function(jq,_629){ +return jq.each(function(){ +_620(this,_629); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("clear"); +$(this).numberbox("options").value=""; +}); +},reset:function(jq){ +return jq.each(function(){ +$(this).textbox("reset"); +$(this).numberbox("setValue",$(this).numberbox("getValue")); +}); +}}; +$.fn.numberbox.parseOptions=function(_62a){ +var t=$(_62a); +return $.extend({},$.fn.textbox.parseOptions(_62a),$.parser.parseOptions(_62a,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined)}); +}; +$.fn.numberbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{keypress:function(e){ +var _62b=e.data.target; +var opts=$(_62b).numberbox("options"); +return opts.filter.call(_62b,e); +},blur:function(e){ +$(e.data.target).numberbox("fix"); +},keydown:function(e){ +if(e.keyCode==13){ +$(e.data.target).numberbox("fix"); +} +}},min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",filter:function(e){ +var opts=$(this).numberbox("options"); +var s=$(this).numberbox("getText"); +if(e.metaKey||e.ctrlKey){ +return true; +} +if($.inArray(String(e.which),["46","8","13","0"])>=0){ +return true; +} +var tmp=$(""); +tmp.html(String.fromCharCode(e.which)); +var c=tmp.text(); +tmp.remove(); +if(!c){ +return true; +} +if(c=="-"||c==opts.decimalSeparator){ +return (s.indexOf(c)==-1)?true:false; +}else{ +if(c==opts.groupSeparator){ +return true; +}else{ +if("0123456789".indexOf(c)>=0){ +return true; +}else{ +return false; +} +} +} +},formatter:function(_62c){ +if(!_62c){ +return _62c; +} +_62c=_62c+""; +var opts=$(this).numberbox("options"); +var s1=_62c,s2=""; +var dpos=_62c.indexOf("."); +if(dpos>=0){ +s1=_62c.substring(0,dpos); +s2=_62c.substring(dpos+1,_62c.length); +} +if(opts.groupSeparator){ +var p=/(\d+)(\d{3})/; +while(p.test(s1)){ +s1=s1.replace(p,"$1"+opts.groupSeparator+"$2"); +} +} +if(s2){ +return opts.prefix+s1+opts.decimalSeparator+s2+opts.suffix; +}else{ +return opts.prefix+s1+opts.suffix; +} +},parser:function(s){ +s=s+""; +var opts=$(this).numberbox("options"); +if(opts.prefix){ +s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.prefix),"g"),"")); +} +if(opts.suffix){ +s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.suffix),"g"),"")); +} +if(parseFloat(s)!=opts.value){ +if(opts.groupSeparator){ +s=$.trim(s.replace(new RegExp("\\"+opts.groupSeparator,"g"),"")); +} +if(opts.decimalSeparator){ +s=$.trim(s.replace(new RegExp("\\"+opts.decimalSeparator,"g"),".")); +} +s=s.replace(/\s/g,""); +} +var val=parseFloat(s).toFixed(opts.precision); +if(isNaN(val)){ +val=""; +}else{ +if(typeof (opts.min)=="number"&&valopts.max){ +val=opts.max.toFixed(opts.precision); +} +} +} +return val; +}}); +})(jQuery); +(function($){ +function _62d(_62e,_62f){ +var opts=$.data(_62e,"calendar").options; +var t=$(_62e); +if(_62f){ +$.extend(opts,{width:_62f.width,height:_62f.height}); +} +t._size(opts,t.parent()); +t.find(".calendar-body")._outerHeight(t.height()-t.find(".calendar-header")._outerHeight()); +if(t.find(".calendar-menu").is(":visible")){ +_630(_62e); +} +}; +function init(_631){ +$(_631).addClass("calendar").html("
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+""+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+""+""+""+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "); +$(_631).bind("_resize",function(e,_632){ +if($(this).hasClass("easyui-fluid")||_632){ +_62d(_631); +} +return false; +}); +}; +function _633(_634){ +var opts=$.data(_634,"calendar").options; +var menu=$(_634).find(".calendar-menu"); +menu.find(".calendar-menu-year").unbind(".calendar").bind("keypress.calendar",function(e){ +if(e.keyCode==13){ +_635(true); +} +}); +$(_634).unbind(".calendar").bind("mouseover.calendar",function(e){ +var t=_636(e.target); +if(t.hasClass("calendar-nav")||t.hasClass("calendar-text")||(t.hasClass("calendar-day")&&!t.hasClass("calendar-disabled"))){ +t.addClass("calendar-nav-hover"); +} +}).bind("mouseout.calendar",function(e){ +var t=_636(e.target); +if(t.hasClass("calendar-nav")||t.hasClass("calendar-text")||(t.hasClass("calendar-day")&&!t.hasClass("calendar-disabled"))){ +t.removeClass("calendar-nav-hover"); +} +}).bind("click.calendar",function(e){ +var t=_636(e.target); +if(t.hasClass("calendar-menu-next")||t.hasClass("calendar-nextyear")){ +_637(1); +}else{ +if(t.hasClass("calendar-menu-prev")||t.hasClass("calendar-prevyear")){ +_637(-1); +}else{ +if(t.hasClass("calendar-menu-month")){ +menu.find(".calendar-selected").removeClass("calendar-selected"); +t.addClass("calendar-selected"); +_635(true); +}else{ +if(t.hasClass("calendar-prevmonth")){ +_638(-1); +}else{ +if(t.hasClass("calendar-nextmonth")){ +_638(1); +}else{ +if(t.hasClass("calendar-text")){ +if(menu.is(":visible")){ +menu.hide(); +}else{ +_630(_634); +} +}else{ +if(t.hasClass("calendar-day")){ +if(t.hasClass("calendar-disabled")){ +return; +} +var _639=opts.current; +t.closest("div.calendar-body").find(".calendar-selected").removeClass("calendar-selected"); +t.addClass("calendar-selected"); +var _63a=t.attr("abbr").split(","); +var y=parseInt(_63a[0]); +var m=parseInt(_63a[1]); +var d=parseInt(_63a[2]); +opts.current=new Date(y,m-1,d); +opts.onSelect.call(_634,opts.current); +if(!_639||_639.getTime()!=opts.current.getTime()){ +opts.onChange.call(_634,opts.current,_639); +} +if(opts.year!=y||opts.month!=m){ +opts.year=y; +opts.month=m; +show(_634); +} +} +} +} +} +} +} +} +}); +function _636(t){ +var day=$(t).closest(".calendar-day"); +if(day.length){ +return day; +}else{ +return $(t); +} +}; +function _635(_63b){ +var menu=$(_634).find(".calendar-menu"); +var year=menu.find(".calendar-menu-year").val(); +var _63c=menu.find(".calendar-selected").attr("abbr"); +if(!isNaN(year)){ +opts.year=parseInt(year); +opts.month=parseInt(_63c); +show(_634); +} +if(_63b){ +menu.hide(); +} +}; +function _637(_63d){ +opts.year+=_63d; +show(_634); +menu.find(".calendar-menu-year").val(opts.year); +}; +function _638(_63e){ +opts.month+=_63e; +if(opts.month>12){ +opts.year++; +opts.month=1; +}else{ +if(opts.month<1){ +opts.year--; +opts.month=12; +} +} +show(_634); +menu.find("td.calendar-selected").removeClass("calendar-selected"); +menu.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); +}; +}; +function _630(_63f){ +var opts=$.data(_63f,"calendar").options; +$(_63f).find(".calendar-menu").show(); +if($(_63f).find(".calendar-menu-month-inner").is(":empty")){ +$(_63f).find(".calendar-menu-month-inner").empty(); +var t=$("
                                            ").appendTo($(_63f).find(".calendar-menu-month-inner")); +var idx=0; +for(var i=0;i<3;i++){ +var tr=$("").appendTo(t); +for(var j=0;j<4;j++){ +$("").html(opts.months[idx++]).attr("abbr",idx).appendTo(tr); +} +} +} +var body=$(_63f).find(".calendar-body"); +var sele=$(_63f).find(".calendar-menu"); +var _640=sele.find(".calendar-menu-year-inner"); +var _641=sele.find(".calendar-menu-month-inner"); +_640.find("input").val(opts.year).focus(); +_641.find("td.calendar-selected").removeClass("calendar-selected"); +_641.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); +sele._outerWidth(body._outerWidth()); +sele._outerHeight(body._outerHeight()); +_641._outerHeight(sele.height()-_640._outerHeight()); +}; +function _642(_643,year,_644){ +var opts=$.data(_643,"calendar").options; +var _645=[]; +var _646=new Date(year,_644,0).getDate(); +for(var i=1;i<=_646;i++){ +_645.push([year,_644,i]); +} +var _647=[],week=[]; +var _648=-1; +while(_645.length>0){ +var date=_645.shift(); +week.push(date); +var day=new Date(date[0],date[1]-1,date[2]).getDay(); +if(_648==day){ +day=0; +}else{ +if(day==(opts.firstDay==0?7:opts.firstDay)-1){ +_647.push(week); +week=[]; +} +} +_648=day; +} +if(week.length){ +_647.push(week); +} +var _649=_647[0]; +if(_649.length<7){ +while(_649.length<7){ +var _64a=_649[0]; +var date=new Date(_64a[0],_64a[1]-1,_64a[2]-1); +_649.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); +} +}else{ +var _64a=_649[0]; +var week=[]; +for(var i=1;i<=7;i++){ +var date=new Date(_64a[0],_64a[1]-1,_64a[2]-i); +week.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); +} +_647.unshift(week); +} +var _64b=_647[_647.length-1]; +while(_64b.length<7){ +var _64c=_64b[_64b.length-1]; +var date=new Date(_64c[0],_64c[1]-1,_64c[2]+1); +_64b.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); +} +if(_647.length<6){ +var _64c=_64b[_64b.length-1]; +var week=[]; +for(var i=1;i<=7;i++){ +var date=new Date(_64c[0],_64c[1]-1,_64c[2]+i); +week.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); +} +_647.push(week); +} +return _647; +}; +function show(_64d){ +var opts=$.data(_64d,"calendar").options; +if(opts.current&&!opts.validator.call(_64d,opts.current)){ +opts.current=null; +} +var now=new Date(); +var _64e=now.getFullYear()+","+(now.getMonth()+1)+","+now.getDate(); +var _64f=opts.current?(opts.current.getFullYear()+","+(opts.current.getMonth()+1)+","+opts.current.getDate()):""; +var _650=6-opts.firstDay; +var _651=_650+1; +if(_650>=7){ +_650-=7; +} +if(_651>=7){ +_651-=7; +} +$(_64d).find(".calendar-title span").html(opts.months[opts.month-1]+" "+opts.year); +var body=$(_64d).find("div.calendar-body"); +body.children("table").remove(); +var data=[""]; +data.push(""); +if(opts.showWeek){ +data.push(""); +} +for(var i=opts.firstDay;i"+opts.weeks[i]+""); +} +for(var i=0;i"+opts.weeks[i]+""); +} +data.push(""); +data.push(""); +var _652=_642(_64d,opts.year,opts.month); +for(var i=0;i<_652.length;i++){ +var week=_652[i]; +var cls=""; +if(i==0){ +cls="calendar-first"; +}else{ +if(i==_652.length-1){ +cls="calendar-last"; +} +} +data.push(""); +if(opts.showWeek){ +var _653=opts.getWeekNumber(new Date(week[0][0],parseInt(week[0][1])-1,week[0][2])); +data.push(""); +} +for(var j=0;j"+d+""); +} +data.push(""); +} +data.push(""); +data.push("
                                            "+opts.weekNumberHeader+"
                                            "+_653+"
                                            "); +body.append(data.join("")); +body.children("table.calendar-dtable").prependTo(body); +opts.onNavigate.call(_64d,opts.year,opts.month); +}; +$.fn.calendar=function(_657,_658){ +if(typeof _657=="string"){ +return $.fn.calendar.methods[_657](this,_658); +} +_657=_657||{}; +return this.each(function(){ +var _659=$.data(this,"calendar"); +if(_659){ +$.extend(_659.options,_657); +}else{ +_659=$.data(this,"calendar",{options:$.extend({},$.fn.calendar.defaults,$.fn.calendar.parseOptions(this),_657)}); +init(this); +} +if(_659.options.border==false){ +$(this).addClass("calendar-noborder"); +} +_62d(this); +_633(this); +show(this); +$(this).find("div.calendar-menu").hide(); +}); +}; +$.fn.calendar.methods={options:function(jq){ +return $.data(jq[0],"calendar").options; +},resize:function(jq,_65a){ +return jq.each(function(){ +_62d(this,_65a); +}); +},moveTo:function(jq,date){ +return jq.each(function(){ +if(!date){ +var now=new Date(); +$(this).calendar({year:now.getFullYear(),month:now.getMonth()+1,current:date}); +return; +} +var opts=$(this).calendar("options"); +if(opts.validator.call(this,date)){ +var _65b=opts.current; +$(this).calendar({year:date.getFullYear(),month:date.getMonth()+1,current:date}); +if(!_65b||_65b.getTime()!=date.getTime()){ +opts.onChange.call(this,opts.current,_65b); +} +} +}); +}}; +$.fn.calendar.parseOptions=function(_65c){ +var t=$(_65c); +return $.extend({},$.parser.parseOptions(_65c,["weekNumberHeader",{firstDay:"number",fit:"boolean",border:"boolean",showWeek:"boolean"}])); +}; +$.fn.calendar.defaults={width:180,height:180,fit:false,border:true,showWeek:false,firstDay:0,weeks:["S","M","T","W","T","F","S"],months:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],year:new Date().getFullYear(),month:new Date().getMonth()+1,current:(function(){ +var d=new Date(); +return new Date(d.getFullYear(),d.getMonth(),d.getDate()); +})(),weekNumberHeader:"",getWeekNumber:function(date){ +var _65d=new Date(date.getTime()); +_65d.setDate(_65d.getDate()+4-(_65d.getDay()||7)); +var time=_65d.getTime(); +_65d.setMonth(0); +_65d.setDate(1); +return Math.floor(Math.round((time-_65d)/86400000)/7)+1; +},formatter:function(date){ +return date.getDate(); +},styler:function(date){ +return ""; +},validator:function(date){ +return true; +},onSelect:function(date){ +},onChange:function(_65e,_65f){ +},onNavigate:function(year,_660){ +}}; +})(jQuery); +(function($){ +function _661(_662){ +var _663=$.data(_662,"spinner"); +var opts=_663.options; +var _664=$.extend(true,[],opts.icons); +if(opts.spinAlign=="left"||opts.spinAlign=="right"){ +opts.spinArrow=true; +opts.iconAlign=opts.spinAlign; +var _665={iconCls:"spinner-button-updown",handler:function(e){ +var spin=$(e.target).closest(".spinner-arrow-up,.spinner-arrow-down"); +_66f(e.data.target,spin.hasClass("spinner-arrow-down")); +}}; +if(opts.spinAlign=="left"){ +_664.unshift(_665); +}else{ +_664.push(_665); +} +}else{ +opts.spinArrow=false; +if(opts.spinAlign=="vertical"){ +if(opts.buttonAlign!="top"){ +opts.buttonAlign="bottom"; +} +opts.clsLeft="textbox-button-bottom"; +opts.clsRight="textbox-button-top"; +}else{ +opts.clsLeft="textbox-button-left"; +opts.clsRight="textbox-button-right"; +} +} +$(_662).addClass("spinner-f").textbox($.extend({},opts,{icons:_664,doSize:false,onResize:function(_666,_667){ +if(!opts.spinArrow){ +var span=$(this).next(); +var btn=span.find(".textbox-button:not(.spinner-button)"); +if(btn.length){ +var _668=btn.outerWidth(); +var _669=btn.outerHeight(); +var _66a=span.find(".spinner-button."+opts.clsLeft); +var _66b=span.find(".spinner-button."+opts.clsRight); +if(opts.buttonAlign=="right"){ +_66b.css("marginRight",_668+"px"); +}else{ +if(opts.buttonAlign=="left"){ +_66a.css("marginLeft",_668+"px"); +}else{ +if(opts.buttonAlign=="top"){ +_66b.css("marginTop",_669+"px"); +}else{ +_66a.css("marginBottom",_669+"px"); +} +} +} +} +} +opts.onResize.call(this,_666,_667); +}})); +$(_662).attr("spinnerName",$(_662).attr("textboxName")); +_663.spinner=$(_662).next(); +_663.spinner.addClass("spinner"); +if(opts.spinArrow){ +var _66c=_663.spinner.find(".spinner-button-updown"); +_66c.append(""+""+""+""+""+""); +}else{ +var _66d=$("").addClass(opts.clsLeft).appendTo(_663.spinner); +var _66e=$("").addClass(opts.clsRight).appendTo(_663.spinner); +_66d.linkbutton({iconCls:opts.reversed?"spinner-button-up":"spinner-button-down",onClick:function(){ +_66f(_662,!opts.reversed); +}}); +_66e.linkbutton({iconCls:opts.reversed?"spinner-button-down":"spinner-button-up",onClick:function(){ +_66f(_662,opts.reversed); +}}); +if(opts.disabled){ +$(_662).spinner("disable"); +} +if(opts.readonly){ +$(_662).spinner("readonly"); +} +} +$(_662).spinner("resize"); +}; +function _66f(_670,down){ +var opts=$(_670).spinner("options"); +opts.spin.call(_670,down); +opts[down?"onSpinDown":"onSpinUp"].call(_670); +$(_670).spinner("validate"); +}; +$.fn.spinner=function(_671,_672){ +if(typeof _671=="string"){ +var _673=$.fn.spinner.methods[_671]; +if(_673){ +return _673(this,_672); +}else{ +return this.textbox(_671,_672); +} +} +_671=_671||{}; +return this.each(function(){ +var _674=$.data(this,"spinner"); +if(_674){ +$.extend(_674.options,_671); +}else{ +_674=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_671)}); +} +_661(this); +}); +}; +$.fn.spinner.methods={options:function(jq){ +var opts=jq.textbox("options"); +return $.extend($.data(jq[0],"spinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +}}; +$.fn.spinner.parseOptions=function(_675){ +return $.extend({},$.fn.textbox.parseOptions(_675),$.parser.parseOptions(_675,["min","max","spinAlign",{increment:"number",reversed:"boolean"}])); +}; +$.fn.spinner.defaults=$.extend({},$.fn.textbox.defaults,{min:null,max:null,increment:1,spinAlign:"right",reversed:false,spin:function(down){ +},onSpinUp:function(){ +},onSpinDown:function(){ +}}); +})(jQuery); +(function($){ +function _676(_677){ +$(_677).addClass("numberspinner-f"); +var opts=$.data(_677,"numberspinner").options; +$(_677).numberbox($.extend({},opts,{doSize:false})).spinner(opts); +$(_677).numberbox("setValue",opts.value); +}; +function _678(_679,down){ +var opts=$.data(_679,"numberspinner").options; +var v=parseFloat($(_679).numberbox("getValue")||opts.value)||0; +if(down){ +v-=opts.increment; +}else{ +v+=opts.increment; +} +$(_679).numberbox("setValue",v); +}; +$.fn.numberspinner=function(_67a,_67b){ +if(typeof _67a=="string"){ +var _67c=$.fn.numberspinner.methods[_67a]; +if(_67c){ +return _67c(this,_67b); +}else{ +return this.numberbox(_67a,_67b); +} +} +_67a=_67a||{}; +return this.each(function(){ +var _67d=$.data(this,"numberspinner"); +if(_67d){ +$.extend(_67d.options,_67a); +}else{ +$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_67a)}); +} +_676(this); +}); +}; +$.fn.numberspinner.methods={options:function(jq){ +var opts=jq.numberbox("options"); +return $.extend($.data(jq[0],"numberspinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +}}; +$.fn.numberspinner.parseOptions=function(_67e){ +return $.extend({},$.fn.spinner.parseOptions(_67e),$.fn.numberbox.parseOptions(_67e),{}); +}; +$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(down){ +_678(this,down); +}}); +})(jQuery); +(function($){ +function _67f(_680){ +var opts=$.data(_680,"timespinner").options; +$(_680).addClass("timespinner-f").spinner(opts); +var _681=opts.formatter.call(_680,opts.parser.call(_680,opts.value)); +$(_680).timespinner("initValue",_681); +}; +function _682(e){ +var _683=e.data.target; +var opts=$.data(_683,"timespinner").options; +var _684=$(_683).timespinner("getSelectionStart"); +for(var i=0;i=_685[0]&&_684<=_685[1]){ +_686(_683,i); +return; +} +} +}; +function _686(_687,_688){ +var opts=$.data(_687,"timespinner").options; +if(_688!=undefined){ +opts.highlight=_688; +} +var _689=opts.selections[opts.highlight]; +if(_689){ +var tb=$(_687).timespinner("textbox"); +$(_687).timespinner("setSelectionRange",{start:_689[0],end:_689[1]}); +tb.focus(); +} +}; +function _68a(_68b,_68c){ +var opts=$.data(_68b,"timespinner").options; +var _68c=opts.parser.call(_68b,_68c); +var text=opts.formatter.call(_68b,_68c); +$(_68b).spinner("setValue",text); +}; +function _68d(_68e,down){ +var opts=$.data(_68e,"timespinner").options; +var s=$(_68e).timespinner("getValue"); +var _68f=opts.selections[opts.highlight]; +var s1=s.substring(0,_68f[0]); +var s2=s.substring(_68f[0],_68f[1]); +var s3=s.substring(_68f[1]); +var v=s1+((parseInt(s2,10)||0)+opts.increment*(down?-1:1))+s3; +$(_68e).timespinner("setValue",v); +_686(_68e); +}; +$.fn.timespinner=function(_690,_691){ +if(typeof _690=="string"){ +var _692=$.fn.timespinner.methods[_690]; +if(_692){ +return _692(this,_691); +}else{ +return this.spinner(_690,_691); +} +} +_690=_690||{}; +return this.each(function(){ +var _693=$.data(this,"timespinner"); +if(_693){ +$.extend(_693.options,_690); +}else{ +$.data(this,"timespinner",{options:$.extend({},$.fn.timespinner.defaults,$.fn.timespinner.parseOptions(this),_690)}); +} +_67f(this); +}); +}; +$.fn.timespinner.methods={options:function(jq){ +var opts=jq.data("spinner")?jq.spinner("options"):{}; +return $.extend($.data(jq[0],"timespinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +},setValue:function(jq,_694){ +return jq.each(function(){ +_68a(this,_694); +}); +},getHours:function(jq){ +var opts=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(opts.separator); +return parseInt(vv[0],10); +},getMinutes:function(jq){ +var opts=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(opts.separator); +return parseInt(vv[1],10); +},getSeconds:function(jq){ +var opts=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(opts.separator); +return parseInt(vv[2],10)||0; +}}; +$.fn.timespinner.parseOptions=function(_695){ +return $.extend({},$.fn.spinner.parseOptions(_695),$.parser.parseOptions(_695,["separator",{showSeconds:"boolean",highlight:"number"}])); +}; +$.fn.timespinner.defaults=$.extend({},$.fn.spinner.defaults,{inputEvents:$.extend({},$.fn.spinner.defaults.inputEvents,{click:function(e){ +_682.call(this,e); +},blur:function(e){ +var t=$(e.data.target); +t.timespinner("setValue",t.timespinner("getText")); +},keydown:function(e){ +if(e.keyCode==13){ +var t=$(e.data.target); +t.timespinner("setValue",t.timespinner("getText")); +} +}}),formatter:function(date){ +if(!date){ +return ""; +} +var opts=$(this).timespinner("options"); +var tt=[_696(date.getHours()),_696(date.getMinutes())]; +if(opts.showSeconds){ +tt.push(_696(date.getSeconds())); +} +return tt.join(opts.separator); +function _696(_697){ +return (_697<10?"0":"")+_697; +}; +},parser:function(s){ +var opts=$(this).timespinner("options"); +var date=_698(s); +if(date){ +var min=_698(opts.min); +var max=_698(opts.max); +if(min&&min>date){ +date=min; +} +if(max&&max"]; +for(var i=0;i<_6ad.length;i++){ +_6ac.cache[_6ad[i][0]]={width:_6ad[i][1]}; +} +var _6ae=0; +for(var s in _6ac.cache){ +var item=_6ac.cache[s]; +item.index=_6ae++; +ss.push(s+"{width:"+item.width+"}"); +} +ss.push(""); +$(ss.join("\n")).appendTo(cc); +cc.children("style[easyui]:not(:last)").remove(); +},getRule:function(_6af){ +var _6b0=cc.children("style[easyui]:last")[0]; +var _6b1=_6b0.styleSheet?_6b0.styleSheet:(_6b0.sheet||document.styleSheets[document.styleSheets.length-1]); +var _6b2=_6b1.cssRules||_6b1.rules; +return _6b2[_6af]; +},set:function(_6b3,_6b4){ +var item=_6ac.cache[_6b3]; +if(item){ +item.width=_6b4; +var rule=this.getRule(item.index); +if(rule){ +rule.style["width"]=_6b4; +} +} +},remove:function(_6b5){ +var tmp=[]; +for(var s in _6ac.cache){ +if(s.indexOf(_6b5)==-1){ +tmp.push([s,_6ac.cache[s].width]); +} +} +_6ac.cache={}; +this.add(tmp); +},dirty:function(_6b6){ +if(_6b6){ +_6ac.dirty.push(_6b6); +} +},clean:function(){ +for(var i=0;i<_6ac.dirty.length;i++){ +this.remove(_6ac.dirty[i]); +} +_6ac.dirty=[]; +}}; +}; +function _6b7(_6b8,_6b9){ +var _6ba=$.data(_6b8,"datagrid"); +var opts=_6ba.options; +var _6bb=_6ba.panel; +if(_6b9){ +$.extend(opts,_6b9); +} +if(opts.fit==true){ +var p=_6bb.panel("panel").parent(); +opts.width=p.width(); +opts.height=p.height(); +} +_6bb.panel("resize",opts); +}; +function _6bc(_6bd){ +var _6be=$.data(_6bd,"datagrid"); +var opts=_6be.options; +var dc=_6be.dc; +var wrap=_6be.panel; +var _6bf=wrap.width(); +var _6c0=wrap.height(); +var view=dc.view; +var _6c1=dc.view1; +var _6c2=dc.view2; +var _6c3=_6c1.children("div.datagrid-header"); +var _6c4=_6c2.children("div.datagrid-header"); +var _6c5=_6c3.find("table"); +var _6c6=_6c4.find("table"); +view.width(_6bf); +var _6c7=_6c3.children("div.datagrid-header-inner").show(); +_6c1.width(_6c7.find("table").width()); +if(!opts.showHeader){ +_6c7.hide(); +} +_6c2.width(_6bf-_6c1._outerWidth()); +_6c1.children()._outerWidth(_6c1.width()); +_6c2.children()._outerWidth(_6c2.width()); +var all=_6c3.add(_6c4).add(_6c5).add(_6c6); +all.css("height",""); +var hh=Math.max(_6c5.height(),_6c6.height()); +all._outerHeight(hh); +view.children(".datagrid-empty").css("top",hh+"px"); +dc.body1.add(dc.body2).children("table.datagrid-btable-frozen").css({position:"absolute",top:dc.header2._outerHeight()}); +var _6c8=dc.body2.children("table.datagrid-btable-frozen")._outerHeight(); +var _6c9=_6c8+_6c4._outerHeight()+_6c2.children(".datagrid-footer")._outerHeight(); +wrap.children(":not(.datagrid-view,.datagrid-mask,.datagrid-mask-msg)").each(function(){ +_6c9+=$(this)._outerHeight(); +}); +var _6ca=wrap.outerHeight()-wrap.height(); +var _6cb=wrap._size("minHeight")||""; +var _6cc=wrap._size("maxHeight")||""; +_6c1.add(_6c2).children("div.datagrid-body").css({marginTop:_6c8,height:(isNaN(parseInt(opts.height))?"":(_6c0-_6c9)),minHeight:(_6cb?_6cb-_6ca-_6c9:""),maxHeight:(_6cc?_6cc-_6ca-_6c9:"")}); +view.height(_6c2.height()); +}; +function _6cd(_6ce,_6cf,_6d0){ +var rows=$.data(_6ce,"datagrid").data.rows; +var opts=$.data(_6ce,"datagrid").options; +var dc=$.data(_6ce,"datagrid").dc; +if(!dc.body1.is(":empty")&&(!opts.nowrap||opts.autoRowHeight||_6d0)){ +if(_6cf!=undefined){ +var tr1=opts.finder.getTr(_6ce,_6cf,"body",1); +var tr2=opts.finder.getTr(_6ce,_6cf,"body",2); +_6d1(tr1,tr2); +}else{ +var tr1=opts.finder.getTr(_6ce,0,"allbody",1); +var tr2=opts.finder.getTr(_6ce,0,"allbody",2); +_6d1(tr1,tr2); +if(opts.showFooter){ +var tr1=opts.finder.getTr(_6ce,0,"allfooter",1); +var tr2=opts.finder.getTr(_6ce,0,"allfooter",2); +_6d1(tr1,tr2); +} +} +} +_6bc(_6ce); +if(opts.height=="auto"){ +var _6d2=dc.body1.parent(); +var _6d3=dc.body2; +var _6d4=_6d5(_6d3); +var _6d6=_6d4.height; +if(_6d4.width>_6d3.width()){ +_6d6+=18; +} +_6d6-=parseInt(_6d3.css("marginTop"))||0; +_6d2.height(_6d6); +_6d3.height(_6d6); +dc.view.height(dc.view2.height()); +} +dc.body2.triggerHandler("scroll"); +function _6d1(trs1,trs2){ +for(var i=0;i"); +} +_6de(true); +_6de(false); +_6bc(_6db); +function _6de(_6df){ +var _6e0=_6df?1:2; +var tr=opts.finder.getTr(_6db,_6dc,"body",_6e0); +(_6df?dc.body1:dc.body2).children("table.datagrid-btable-frozen").append(tr); +}; +}; +function _6e1(_6e2,_6e3){ +function _6e4(){ +var _6e5=[]; +var _6e6=[]; +$(_6e2).children("thead").each(function(){ +var opt=$.parser.parseOptions(this,[{frozen:"boolean"}]); +$(this).find("tr").each(function(){ +var cols=[]; +$(this).find("th").each(function(){ +var th=$(this); +var col=$.extend({},$.parser.parseOptions(this,["id","field","align","halign","order","width",{sortable:"boolean",checkbox:"boolean",resizable:"boolean",fixed:"boolean"},{rowspan:"number",colspan:"number"}]),{title:(th.html()||undefined),hidden:(th.attr("hidden")?true:undefined),formatter:(th.attr("formatter")?eval(th.attr("formatter")):undefined),styler:(th.attr("styler")?eval(th.attr("styler")):undefined),sorter:(th.attr("sorter")?eval(th.attr("sorter")):undefined)}); +if(col.width&&String(col.width).indexOf("%")==-1){ +col.width=parseInt(col.width); +} +if(th.attr("editor")){ +var s=$.trim(th.attr("editor")); +if(s.substr(0,1)=="{"){ +col.editor=eval("("+s+")"); +}else{ +col.editor=s; +} +} +cols.push(col); +}); +opt.frozen?_6e5.push(cols):_6e6.push(cols); +}); +}); +return [_6e5,_6e6]; +}; +var _6e7=$("
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+""+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+"
                                            "+""+"
                                            "+"
                                            "+"
                                            "+"
                                            ").insertAfter(_6e2); +_6e7.panel({doSize:false,cls:"datagrid"}); +$(_6e2).addClass("datagrid-f").hide().appendTo(_6e7.children("div.datagrid-view")); +var cc=_6e4(); +var view=_6e7.children("div.datagrid-view"); +var _6e8=view.children("div.datagrid-view1"); +var _6e9=view.children("div.datagrid-view2"); +return {panel:_6e7,frozenColumns:cc[0],columns:cc[1],dc:{view:view,view1:_6e8,view2:_6e9,header1:_6e8.children("div.datagrid-header").children("div.datagrid-header-inner"),header2:_6e9.children("div.datagrid-header").children("div.datagrid-header-inner"),body1:_6e8.children("div.datagrid-body").children("div.datagrid-body-inner"),body2:_6e9.children("div.datagrid-body"),footer1:_6e8.children("div.datagrid-footer").children("div.datagrid-footer-inner"),footer2:_6e9.children("div.datagrid-footer").children("div.datagrid-footer-inner")}}; +}; +function _6ea(_6eb){ +var _6ec=$.data(_6eb,"datagrid"); +var opts=_6ec.options; +var dc=_6ec.dc; +var _6ed=_6ec.panel; +_6ec.ss=$(_6eb).datagrid("createStyleSheet"); +_6ed.panel($.extend({},opts,{id:null,doSize:false,onResize:function(_6ee,_6ef){ +if($.data(_6eb,"datagrid")){ +_6bc(_6eb); +$(_6eb).datagrid("fitColumns"); +opts.onResize.call(_6ed,_6ee,_6ef); +} +},onExpand:function(){ +if($.data(_6eb,"datagrid")){ +$(_6eb).datagrid("fixRowHeight").datagrid("fitColumns"); +opts.onExpand.call(_6ed); +} +}})); +_6ec.rowIdPrefix="datagrid-row-r"+(++_6a2); +_6ec.cellClassPrefix="datagrid-cell-c"+_6a2; +_6f0(dc.header1,opts.frozenColumns,true); +_6f0(dc.header2,opts.columns,false); +_6f1(); +dc.header1.add(dc.header2).css("display",opts.showHeader?"block":"none"); +dc.footer1.add(dc.footer2).css("display",opts.showFooter?"block":"none"); +if(opts.toolbar){ +if($.isArray(opts.toolbar)){ +$("div.datagrid-toolbar",_6ed).remove(); +var tb=$("
                                            ").prependTo(_6ed); +var tr=tb.find("tr"); +for(var i=0;i
                                            ").appendTo(tr); +}else{ +var td=$("").appendTo(tr); +var tool=$("").appendTo(td); +tool[0].onclick=eval(btn.handler||function(){ +}); +tool.linkbutton($.extend({},btn,{plain:true})); +} +} +}else{ +$(opts.toolbar).addClass("datagrid-toolbar").prependTo(_6ed); +$(opts.toolbar).show(); +} +}else{ +$("div.datagrid-toolbar",_6ed).remove(); +} +$("div.datagrid-pager",_6ed).remove(); +if(opts.pagination){ +var _6f2=$("
                                            "); +if(opts.pagePosition=="bottom"){ +_6f2.appendTo(_6ed); +}else{ +if(opts.pagePosition=="top"){ +_6f2.addClass("datagrid-pager-top").prependTo(_6ed); +}else{ +var ptop=$("
                                            ").prependTo(_6ed); +_6f2.appendTo(_6ed); +_6f2=_6f2.add(ptop); +} +} +_6f2.pagination({total:0,pageNumber:opts.pageNumber,pageSize:opts.pageSize,pageList:opts.pageList,onSelectPage:function(_6f3,_6f4){ +opts.pageNumber=_6f3||1; +opts.pageSize=_6f4; +_6f2.pagination("refresh",{pageNumber:_6f3,pageSize:_6f4}); +_73c(_6eb); +}}); +opts.pageSize=_6f2.pagination("options").pageSize; +} +function _6f0(_6f5,_6f6,_6f7){ +if(!_6f6){ +return; +} +$(_6f5).show(); +$(_6f5).empty(); +var tmp=$("
                                            ").appendTo("body"); +tmp._outerWidth(99); +var _6f8=100-parseInt(tmp[0].style.width); +tmp.remove(); +var _6f9=[]; +var _6fa=[]; +var _6fb=[]; +if(opts.sortName){ +_6f9=opts.sortName.split(","); +_6fa=opts.sortOrder.split(","); +} +var t=$("
                                            ").appendTo(_6f5); +for(var i=0;i<_6f6.length;i++){ +var tr=$("").appendTo($("tbody",t)); +var cols=_6f6[i]; +for(var j=0;j").appendTo(tr); +if(col.checkbox){ +td.attr("field",col.field); +$("
                                            ").html("").appendTo(td); +}else{ +if(col.field){ +td.attr("field",col.field); +td.append("
                                            "); +td.find("span:first").html(col.title); +var cell=td.find("div.datagrid-cell"); +var pos=_6a3(_6f9,col.field); +if(pos>=0){ +cell.addClass("datagrid-sort-"+_6fa[pos]); +} +if(col.sortable){ +cell.addClass("datagrid-sort"); +} +if(col.resizable==false){ +cell.attr("resizable","false"); +} +if(col.width){ +var _6fc=$.parser.parseValue("width",col.width,dc.view,opts.scrollbarSize+(opts.rownumbers?opts.rownumberWidth:0)); +col.deltaWidth=_6f8; +col.boxWidth=_6fc-_6f8; +}else{ +col.auto=true; +} +cell.css("text-align",(col.halign||col.align||"")); +col.cellClass=_6ec.cellClassPrefix+"-"+col.field.replace(/[\.|\s]/g,"-"); +cell.addClass(col.cellClass); +}else{ +$("
                                            ").html(col.title).appendTo(td); +} +} +if(col.hidden){ +td.hide(); +_6fb.push(col.field); +} +} +} +if(_6f7&&opts.rownumbers){ +var td=$("
                                            "); +if($("tr",t).length==0){ +td.wrap("").parent().appendTo($("tbody",t)); +}else{ +td.prependTo($("tr:first",t)); +} +} +for(var i=0;i<_6fb.length;i++){ +_73e(_6eb,_6fb[i],-1); +} +}; +function _6f1(){ +var _6fd=[[".datagrid-header-rownumber",(opts.rownumberWidth-1)+"px"],[".datagrid-cell-rownumber",(opts.rownumberWidth-1)+"px"]]; +var _6fe=_6ff(_6eb,true).concat(_6ff(_6eb)); +for(var i=0;i<_6fe.length;i++){ +var col=_700(_6eb,_6fe[i]); +if(col&&!col.checkbox){ +_6fd.push(["."+col.cellClass,col.boxWidth?col.boxWidth+"px":"auto"]); +} +} +_6ec.ss.add(_6fd); +_6ec.ss.dirty(_6ec.cellSelectorPrefix); +_6ec.cellSelectorPrefix="."+_6ec.cellClassPrefix; +}; +}; +function _701(_702){ +var _703=$.data(_702,"datagrid"); +var _704=_703.panel; +var opts=_703.options; +var dc=_703.dc; +var _705=dc.header1.add(dc.header2); +_705.unbind(".datagrid"); +for(var _706 in opts.headerEvents){ +_705.bind(_706+".datagrid",opts.headerEvents[_706]); +} +var _707=_705.find("div.datagrid-cell"); +var _708=opts.resizeHandle=="right"?"e":(opts.resizeHandle=="left"?"w":"e,w"); +_707.each(function(){ +$(this).resizable({handles:_708,edge:opts.resizeEdge,disabled:($(this).attr("resizable")?$(this).attr("resizable")=="false":false),minWidth:25,onStartResize:function(e){ +_703.resizing=true; +_705.css("cursor",$("body").css("cursor")); +if(!_703.proxy){ +_703.proxy=$("
                                            ").appendTo(dc.view); +} +if(e.data.dir=="e"){ +e.data.deltaEdge=$(this)._outerWidth()-(e.pageX-$(this).offset().left); +}else{ +e.data.deltaEdge=$(this).offset().left-e.pageX-1; +} +_703.proxy.css({left:e.pageX-$(_704).offset().left-1+e.data.deltaEdge,display:"none"}); +setTimeout(function(){ +if(_703.proxy){ +_703.proxy.show(); +} +},500); +},onResize:function(e){ +_703.proxy.css({left:e.pageX-$(_704).offset().left-1+e.data.deltaEdge,display:"block"}); +return false; +},onStopResize:function(e){ +_705.css("cursor",""); +$(this).css("height",""); +var _709=$(this).parent().attr("field"); +var col=_700(_702,_709); +col.width=$(this)._outerWidth()+1; +col.boxWidth=col.width-col.deltaWidth; +col.auto=undefined; +$(this).css("width",""); +$(_702).datagrid("fixColumnSize",_709); +_703.proxy.remove(); +_703.proxy=null; +if($(this).parents("div:first.datagrid-header").parent().hasClass("datagrid-view1")){ +_6bc(_702); +} +$(_702).datagrid("fitColumns"); +opts.onResizeColumn.call(_702,_709,col.width); +setTimeout(function(){ +_703.resizing=false; +},0); +}}); +}); +var bb=dc.body1.add(dc.body2); +bb.unbind(); +for(var _706 in opts.rowEvents){ +bb.bind(_706,opts.rowEvents[_706]); +} +dc.body1.bind("mousewheel DOMMouseScroll",function(e){ +e.preventDefault(); +var e1=e.originalEvent||window.event; +var _70a=e1.wheelDelta||e1.detail*(-1); +if("deltaY" in e1){ +_70a=e1.deltaY*-1; +} +var dg=$(e.target).closest("div.datagrid-view").children(".datagrid-f"); +var dc=dg.data("datagrid").dc; +dc.body2.scrollTop(dc.body2.scrollTop()-_70a); +}); +dc.body2.bind("scroll",function(){ +var b1=dc.view1.children("div.datagrid-body"); +b1.scrollTop($(this).scrollTop()); +var c1=dc.body1.children(":first"); +var c2=dc.body2.children(":first"); +if(c1.length&&c2.length){ +var top1=c1.offset().top; +var top2=c2.offset().top; +if(top1!=top2){ +b1.scrollTop(b1.scrollTop()+top1-top2); +} +} +dc.view2.children("div.datagrid-header,div.datagrid-footer")._scrollLeft($(this)._scrollLeft()); +dc.body2.children("table.datagrid-btable-frozen").css("left",-$(this)._scrollLeft()); +}); +}; +function _70b(_70c){ +return function(e){ +var td=$(e.target).closest("td[field]"); +if(td.length){ +var _70d=_70e(td); +if(!$(_70d).data("datagrid").resizing&&_70c){ +td.addClass("datagrid-header-over"); +}else{ +td.removeClass("datagrid-header-over"); +} +} +}; +}; +function _70f(e){ +var _710=_70e(e.target); +var opts=$(_710).datagrid("options"); +var ck=$(e.target).closest("input[type=checkbox]"); +if(ck.length){ +if(opts.singleSelect&&opts.selectOnCheck){ +return false; +} +if(ck.is(":checked")){ +_711(_710); +}else{ +_712(_710); +} +e.stopPropagation(); +}else{ +var cell=$(e.target).closest(".datagrid-cell"); +if(cell.length){ +var p1=cell.offset().left+5; +var p2=cell.offset().left+cell._outerWidth()-5; +if(e.pageXp1){ +_713(_710,cell.parent().attr("field")); +} +} +} +}; +function _714(e){ +var _715=_70e(e.target); +var opts=$(_715).datagrid("options"); +var cell=$(e.target).closest(".datagrid-cell"); +if(cell.length){ +var p1=cell.offset().left+5; +var p2=cell.offset().left+cell._outerWidth()-5; +var cond=opts.resizeHandle=="right"?(e.pageX>p2):(opts.resizeHandle=="left"?(e.pageXp2)); +if(cond){ +var _716=cell.parent().attr("field"); +var col=_700(_715,_716); +if(col.resizable==false){ +return; +} +$(_715).datagrid("autoSizeColumn",_716); +col.auto=false; +} +} +}; +function _717(e){ +var _718=_70e(e.target); +var opts=$(_718).datagrid("options"); +var td=$(e.target).closest("td[field]"); +opts.onHeaderContextMenu.call(_718,e,td.attr("field")); +}; +function _719(_71a){ +return function(e){ +var tr=_71b(e.target); +if(!tr){ +return; +} +var _71c=_70e(tr); +if($.data(_71c,"datagrid").resizing){ +return; +} +var _71d=_71e(tr); +if(_71a){ +_71f(_71c,_71d); +}else{ +var opts=$.data(_71c,"datagrid").options; +opts.finder.getTr(_71c,_71d).removeClass("datagrid-row-over"); +} +}; +}; +function _720(e){ +var tr=_71b(e.target); +if(!tr){ +return; +} +var _721=_70e(tr); +var opts=$.data(_721,"datagrid").options; +var _722=_71e(tr); +var tt=$(e.target); +if(tt.parent().hasClass("datagrid-cell-check")){ +if(opts.singleSelect&&opts.selectOnCheck){ +tt._propAttr("checked",!tt.is(":checked")); +_723(_721,_722); +}else{ +if(tt.is(":checked")){ +tt._propAttr("checked",false); +_723(_721,_722); +}else{ +tt._propAttr("checked",true); +_724(_721,_722); +} +} +}else{ +var row=opts.finder.getRow(_721,_722); +var td=tt.closest("td[field]",tr); +if(td.length){ +var _725=td.attr("field"); +opts.onClickCell.call(_721,_722,_725,row[_725]); +} +if(opts.singleSelect==true){ +_726(_721,_722); +}else{ +if(opts.ctrlSelect){ +if(e.metaKey||e.ctrlKey){ +if(tr.hasClass("datagrid-row-selected")){ +_727(_721,_722); +}else{ +_726(_721,_722); +} +}else{ +if(e.shiftKey){ +$(_721).datagrid("clearSelections"); +var _728=Math.min(opts.lastSelectedIndex||0,_722); +var _729=Math.max(opts.lastSelectedIndex||0,_722); +for(var i=_728;i<=_729;i++){ +_726(_721,i); +} +}else{ +$(_721).datagrid("clearSelections"); +_726(_721,_722); +opts.lastSelectedIndex=_722; +} +} +}else{ +if(tr.hasClass("datagrid-row-selected")){ +_727(_721,_722); +}else{ +_726(_721,_722); +} +} +} +opts.onClickRow.apply(_721,_6a6(_721,[_722,row])); +} +}; +function _72a(e){ +var tr=_71b(e.target); +if(!tr){ +return; +} +var _72b=_70e(tr); +var opts=$.data(_72b,"datagrid").options; +var _72c=_71e(tr); +var row=opts.finder.getRow(_72b,_72c); +var td=$(e.target).closest("td[field]",tr); +if(td.length){ +var _72d=td.attr("field"); +opts.onDblClickCell.call(_72b,_72c,_72d,row[_72d]); +} +opts.onDblClickRow.apply(_72b,_6a6(_72b,[_72c,row])); +}; +function _72e(e){ +var tr=_71b(e.target); +if(tr){ +var _72f=_70e(tr); +var opts=$.data(_72f,"datagrid").options; +var _730=_71e(tr); +var row=opts.finder.getRow(_72f,_730); +opts.onRowContextMenu.call(_72f,e,_730,row); +}else{ +var body=_71b(e.target,".datagrid-body"); +if(body){ +var _72f=_70e(body); +var opts=$.data(_72f,"datagrid").options; +opts.onRowContextMenu.call(_72f,e,-1,null); +} +} +}; +function _70e(t){ +return $(t).closest("div.datagrid-view").children(".datagrid-f")[0]; +}; +function _71b(t,_731){ +var tr=$(t).closest(_731||"tr.datagrid-row"); +if(tr.length&&tr.parent().length){ +return tr; +}else{ +return undefined; +} +}; +function _71e(tr){ +if(tr.attr("datagrid-row-index")){ +return parseInt(tr.attr("datagrid-row-index")); +}else{ +return tr.attr("node-id"); +} +}; +function _713(_732,_733){ +var _734=$.data(_732,"datagrid"); +var opts=_734.options; +_733=_733||{}; +var _735={sortName:opts.sortName,sortOrder:opts.sortOrder}; +if(typeof _733=="object"){ +$.extend(_735,_733); +} +var _736=[]; +var _737=[]; +if(_735.sortName){ +_736=_735.sortName.split(","); +_737=_735.sortOrder.split(","); +} +if(typeof _733=="string"){ +var _738=_733; +var col=_700(_732,_738); +if(!col.sortable||_734.resizing){ +return; +} +var _739=col.order||"asc"; +var pos=_6a3(_736,_738); +if(pos>=0){ +var _73a=_737[pos]=="asc"?"desc":"asc"; +if(opts.multiSort&&_73a==_739){ +_736.splice(pos,1); +_737.splice(pos,1); +}else{ +_737[pos]=_73a; +} +}else{ +if(opts.multiSort){ +_736.push(_738); +_737.push(_739); +}else{ +_736=[_738]; +_737=[_739]; +} +} +_735.sortName=_736.join(","); +_735.sortOrder=_737.join(","); +} +if(opts.onBeforeSortColumn.call(_732,_735.sortName,_735.sortOrder)==false){ +return; +} +$.extend(opts,_735); +var dc=_734.dc; +var _73b=dc.header1.add(dc.header2); +_73b.find("div.datagrid-cell").removeClass("datagrid-sort-asc datagrid-sort-desc"); +for(var i=0;i<_736.length;i++){ +var col=_700(_732,_736[i]); +_73b.find("div."+col.cellClass).addClass("datagrid-sort-"+_737[i]); +} +if(opts.remoteSort){ +_73c(_732); +}else{ +_73d(_732,$(_732).datagrid("getData")); +} +opts.onSortColumn.call(_732,opts.sortName,opts.sortOrder); +}; +function _73e(_73f,_740,_741){ +_742(true); +_742(false); +function _742(_743){ +var aa=_744(_73f,_743); +if(aa.length){ +var _745=aa[aa.length-1]; +var _746=_6a3(_745,_740); +if(_746>=0){ +for(var _747=0;_747=_74c.find("table").width()){ +dc.body2.css("overflow-x","hidden"); +} +function _74f(){ +if(!opts.fitColumns){ +return; +} +if(!_74b.leftWidth){ +_74b.leftWidth=0; +} +var _750=0; +var cc=[]; +var _751=_6ff(_74a,false); +for(var i=0;i<_751.length;i++){ +var col=_700(_74a,_751[i]); +if(_752(col)){ +_750+=col.width; +cc.push({field:col.field,col:col,addingWidth:0}); +} +} +if(!_750){ +return; +} +cc[cc.length-1].addingWidth-=_74b.leftWidth; +var _753=_74c.children("div.datagrid-header-inner").show(); +var _754=_74c.width()-_74c.find("table").width()-opts.scrollbarSize+_74b.leftWidth; +var rate=_754/_750; +if(!opts.showHeader){ +_753.hide(); +} +for(var i=0;i0){ +c.col.boxWidth+=c.addingWidth; +c.col.width+=c.addingWidth; +} +} +_74b.leftWidth=_754; +$(_74a).datagrid("fixColumnSize"); +}; +function _74e(){ +var _756=false; +var _757=_6ff(_74a,true).concat(_6ff(_74a,false)); +$.map(_757,function(_758){ +var col=_700(_74a,_758); +if(String(col.width||"").indexOf("%")>=0){ +var _759=$.parser.parseValue("width",col.width,dc.view,opts.scrollbarSize+(opts.rownumbers?opts.rownumberWidth:0))-col.deltaWidth; +if(_759>0){ +col.boxWidth=_759; +_756=true; +} +} +}); +if(_756){ +$(_74a).datagrid("fixColumnSize"); +} +}; +function _74d(fit){ +var _75a=dc.header1.add(dc.header2).find(".datagrid-cell-group"); +if(_75a.length){ +_75a.each(function(){ +$(this)._outerWidth(fit?$(this).parent().width():10); +}); +if(fit){ +_6bc(_74a); +} +} +}; +function _752(col){ +if(String(col.width||"").indexOf("%")>=0){ +return false; +} +if(!col.hidden&&!col.checkbox&&!col.auto&&!col.fixed){ +return true; +} +}; +}; +function _75b(_75c,_75d){ +var _75e=$.data(_75c,"datagrid"); +var opts=_75e.options; +var dc=_75e.dc; +var tmp=$("
                                            ").appendTo("body"); +if(_75d){ +_6b7(_75d); +$(_75c).datagrid("fitColumns"); +}else{ +var _75f=false; +var _760=_6ff(_75c,true).concat(_6ff(_75c,false)); +for(var i=0;i<_760.length;i++){ +var _75d=_760[i]; +var col=_700(_75c,_75d); +if(col.auto){ +_6b7(_75d); +_75f=true; +} +} +if(_75f){ +$(_75c).datagrid("fitColumns"); +} +} +tmp.remove(); +function _6b7(_761){ +var _762=dc.view.find("div.datagrid-header td[field=\""+_761+"\"] div.datagrid-cell"); +_762.css("width",""); +var col=$(_75c).datagrid("getColumnOption",_761); +col.width=undefined; +col.boxWidth=undefined; +col.auto=true; +$(_75c).datagrid("fixColumnSize",_761); +var _763=Math.max(_764("header"),_764("allbody"),_764("allfooter"))+1; +_762._outerWidth(_763-1); +col.width=_763; +col.boxWidth=parseInt(_762[0].style.width); +col.deltaWidth=_763-col.boxWidth; +_762.css("width",""); +$(_75c).datagrid("fixColumnSize",_761); +opts.onResizeColumn.call(_75c,_761,col.width); +function _764(type){ +var _765=0; +if(type=="header"){ +_765=_766(_762); +}else{ +opts.finder.getTr(_75c,0,type).find("td[field=\""+_761+"\"] div.datagrid-cell").each(function(){ +var w=_766($(this)); +if(_7651){ +var col=_700(_76f,td.attr("field")); +var _771=col.boxWidth+col.deltaWidth-1; +for(var i=1;i<_770;i++){ +td=td.next(); +col=_700(_76f,td.attr("field")); +_771+=col.boxWidth+col.deltaWidth; +} +$(this).children("div.datagrid-cell")._outerWidth(_771); +} +}); +}; +function _76d(_772){ +var dc=$.data(_772,"datagrid").dc; +dc.view.find("div.datagrid-editable").each(function(){ +var cell=$(this); +var _773=cell.parent().attr("field"); +var col=$(_772).datagrid("getColumnOption",_773); +cell._outerWidth(col.boxWidth+col.deltaWidth-1); +var ed=$.data(this,"datagrid.editor"); +if(ed.actions.resize){ +ed.actions.resize(ed.target,cell.width()); +} +}); +}; +function _700(_774,_775){ +function find(_776){ +if(_776){ +for(var i=0;i<_776.length;i++){ +var cc=_776[i]; +for(var j=0;j=0){ +var _77f=col.field||col.id||""; +for(var c=0;c<(col.colspan||1);c++){ +for(var r=0;r<(col.rowspan||1);r++){ +aa[_77c+r][_77d]=_77f; +} +_77d++; +} +} +}); +} +return aa; +function _77b(){ +var _780=0; +$.map(_779[0]||[],function(col){ +_780+=col.colspan||1; +}); +return _780; +}; +function _77e(a){ +for(var i=0;ib?1:-1); +}; +r=_787(r1[sn],r2[sn])*(so=="asc"?1:-1); +if(r!=0){ +return r; +} +} +return r; +}); +} +if(opts.view.onBeforeRender){ +opts.view.onBeforeRender.call(opts.view,_783,data.rows); +} +opts.view.render.call(opts.view,_783,dc.body2,false); +opts.view.render.call(opts.view,_783,dc.body1,true); +if(opts.showFooter){ +opts.view.renderFooter.call(opts.view,_783,dc.footer2,false); +opts.view.renderFooter.call(opts.view,_783,dc.footer1,true); +} +if(opts.view.onAfterRender){ +opts.view.onAfterRender.call(opts.view,_783); +} +_784.ss.clean(); +var _788=$(_783).datagrid("getPager"); +if(_788.length){ +var _789=_788.pagination("options"); +if(_789.total!=data.total){ +_788.pagination("refresh",{pageNumber:opts.pageNumber,total:data.total}); +if(opts.pageNumber!=_789.pageNumber&&_789.pageNumber>0){ +opts.pageNumber=_789.pageNumber; +_73c(_783); +} +} +} +_6cd(_783); +dc.body2.triggerHandler("scroll"); +$(_783).datagrid("setSelectionState"); +$(_783).datagrid("autoSizeColumn"); +opts.onLoadSuccess.call(_783,data); +}; +function _78a(_78b){ +var _78c=$.data(_78b,"datagrid"); +var opts=_78c.options; +var dc=_78c.dc; +dc.header1.add(dc.header2).find("input[type=checkbox]")._propAttr("checked",false); +if(opts.idField){ +var _78d=$.data(_78b,"treegrid")?true:false; +var _78e=opts.onSelect; +var _78f=opts.onCheck; +opts.onSelect=opts.onCheck=function(){ +}; +var rows=opts.finder.getRows(_78b); +for(var i=0;i_7a0.height()-_7a1){ +_7a0.scrollTop(_7a0.scrollTop()+top+tr._outerHeight()-_7a0.height()+_7a1); +} +} +} +}; +function _71f(_7a3,_7a4){ +var _7a5=$.data(_7a3,"datagrid"); +var opts=_7a5.options; +opts.finder.getTr(_7a3,_7a5.highlightIndex).removeClass("datagrid-row-over"); +opts.finder.getTr(_7a3,_7a4).addClass("datagrid-row-over"); +_7a5.highlightIndex=_7a4; +}; +function _726(_7a6,_7a7,_7a8,_7a9){ +var _7aa=$.data(_7a6,"datagrid"); +var opts=_7aa.options; +var row=opts.finder.getRow(_7a6,_7a7); +if(!row){ +return; +} +if(opts.onBeforeSelect.apply(_7a6,_6a6(_7a6,[_7a7,row]))==false){ +return; +} +if(opts.singleSelect){ +_7ab(_7a6,true); +_7aa.selectedRows=[]; +} +if(!_7a8&&opts.checkOnSelect){ +_723(_7a6,_7a7,true); +} +if(opts.idField){ +_6a5(_7aa.selectedRows,opts.idField,row); +} +opts.finder.getTr(_7a6,_7a7).addClass("datagrid-row-selected"); +opts.onSelect.apply(_7a6,_6a6(_7a6,[_7a7,row])); +if(!_7a9&&opts.scrollOnSelect){ +_79b(_7a6,_7a7); +} +}; +function _727(_7ac,_7ad,_7ae){ +var _7af=$.data(_7ac,"datagrid"); +var dc=_7af.dc; +var opts=_7af.options; +var row=opts.finder.getRow(_7ac,_7ad); +if(!row){ +return; +} +if(opts.onBeforeUnselect.apply(_7ac,_6a6(_7ac,[_7ad,row]))==false){ +return; +} +if(!_7ae&&opts.checkOnSelect){ +_724(_7ac,_7ad,true); +} +opts.finder.getTr(_7ac,_7ad).removeClass("datagrid-row-selected"); +if(opts.idField){ +_6a4(_7af.selectedRows,opts.idField,row[opts.idField]); +} +opts.onUnselect.apply(_7ac,_6a6(_7ac,[_7ad,row])); +}; +function _7b0(_7b1,_7b2){ +var _7b3=$.data(_7b1,"datagrid"); +var opts=_7b3.options; +var rows=opts.finder.getRows(_7b1); +var _7b4=$.data(_7b1,"datagrid").selectedRows; +if(!_7b2&&opts.checkOnSelect){ +_711(_7b1,true); +} +opts.finder.getTr(_7b1,"","allbody").addClass("datagrid-row-selected"); +if(opts.idField){ +for(var _7b5=0;_7b5"); +cell.children("table").bind("click dblclick contextmenu",function(e){ +e.stopPropagation(); +}); +$.data(cell[0],"datagrid.editor",{actions:_7ea,target:_7ea.init(cell.find("td"),$.extend({height:opts.editorHeight},_7e9)),field:_7e7,type:_7e8,oldHtml:_7eb}); +} +} +}); +_6cd(_7e5,_7e6,true); +}; +function _7dc(_7ed,_7ee){ +var opts=$.data(_7ed,"datagrid").options; +var tr=opts.finder.getTr(_7ed,_7ee); +tr.children("td").each(function(){ +var cell=$(this).find("div.datagrid-editable"); +if(cell.length){ +var ed=$.data(cell[0],"datagrid.editor"); +if(ed.actions.destroy){ +ed.actions.destroy(ed.target); +} +cell.html(ed.oldHtml); +$.removeData(cell[0],"datagrid.editor"); +cell.removeClass("datagrid-editable"); +cell.css("width",""); +} +}); +}; +function _7cf(_7ef,_7f0){ +var tr=$.data(_7ef,"datagrid").options.finder.getTr(_7ef,_7f0); +if(!tr.hasClass("datagrid-row-editing")){ +return true; +} +var vbox=tr.find(".validatebox-text"); +vbox.validatebox("validate"); +vbox.trigger("mouseleave"); +var _7f1=tr.find(".validatebox-invalid"); +return _7f1.length==0; +}; +function _7f2(_7f3,_7f4){ +var _7f5=$.data(_7f3,"datagrid").insertedRows; +var _7f6=$.data(_7f3,"datagrid").deletedRows; +var _7f7=$.data(_7f3,"datagrid").updatedRows; +if(!_7f4){ +var rows=[]; +rows=rows.concat(_7f5); +rows=rows.concat(_7f6); +rows=rows.concat(_7f7); +return rows; +}else{ +if(_7f4=="inserted"){ +return _7f5; +}else{ +if(_7f4=="deleted"){ +return _7f6; +}else{ +if(_7f4=="updated"){ +return _7f7; +} +} +} +} +return []; +}; +function _7f8(_7f9,_7fa){ +var _7fb=$.data(_7f9,"datagrid"); +var opts=_7fb.options; +var data=_7fb.data; +var _7fc=_7fb.insertedRows; +var _7fd=_7fb.deletedRows; +$(_7f9).datagrid("cancelEdit",_7fa); +var row=opts.finder.getRow(_7f9,_7fa); +if(_6a3(_7fc,row)>=0){ +_6a4(_7fc,row); +}else{ +_7fd.push(row); +} +_6a4(_7fb.selectedRows,opts.idField,row[opts.idField]); +_6a4(_7fb.checkedRows,opts.idField,row[opts.idField]); +opts.view.deleteRow.call(opts.view,_7f9,_7fa); +if(opts.height=="auto"){ +_6cd(_7f9); +} +$(_7f9).datagrid("getPager").pagination("refresh",{total:data.total}); +}; +function _7fe(_7ff,_800){ +var data=$.data(_7ff,"datagrid").data; +var view=$.data(_7ff,"datagrid").options.view; +var _801=$.data(_7ff,"datagrid").insertedRows; +view.insertRow.call(view,_7ff,_800.index,_800.row); +_801.push(_800.row); +$(_7ff).datagrid("getPager").pagination("refresh",{total:data.total}); +}; +function _802(_803,row){ +var data=$.data(_803,"datagrid").data; +var view=$.data(_803,"datagrid").options.view; +var _804=$.data(_803,"datagrid").insertedRows; +view.insertRow.call(view,_803,null,row); +_804.push(row); +$(_803).datagrid("getPager").pagination("refresh",{total:data.total}); +}; +function _805(_806,_807){ +var _808=$.data(_806,"datagrid"); +var opts=_808.options; +var row=opts.finder.getRow(_806,_807.index); +var _809=false; +_807.row=_807.row||{}; +for(var _80a in _807.row){ +if(row[_80a]!==_807.row[_80a]){ +_809=true; +break; +} +} +if(_809){ +if(_6a3(_808.insertedRows,row)==-1){ +if(_6a3(_808.updatedRows,row)==-1){ +_808.updatedRows.push(row); +} +} +opts.view.updateRow.call(opts.view,_806,_807.index,_807.row); +} +}; +function _80b(_80c){ +var _80d=$.data(_80c,"datagrid"); +var data=_80d.data; +var rows=data.rows; +var _80e=[]; +for(var i=0;i=0){ +(_81b=="s"?_726:_723)(_812,_81c,true); +} +} +}; +for(var i=0;i0){ +$(this).datagrid("loadData",data); +}else{ +$(this).datagrid("autoSizeColumn"); +} +} +_73c(this); +}); +}; +function _82c(_82d){ +var _82e={}; +$.map(_82d,function(name){ +_82e[name]=_82f(name); +}); +return _82e; +function _82f(name){ +function isA(_830){ +return $.data($(_830)[0],name)!=undefined; +}; +return {init:function(_831,_832){ +var _833=$("").appendTo(_831); +if(_833[name]&&name!="text"){ +return _833[name](_832); +}else{ +return _833; +} +},destroy:function(_834){ +if(isA(_834,name)){ +$(_834)[name]("destroy"); +} +},getValue:function(_835){ +if(isA(_835,name)){ +var opts=$(_835)[name]("options"); +if(opts.multiple){ +return $(_835)[name]("getValues").join(opts.separator); +}else{ +return $(_835)[name]("getValue"); +} +}else{ +return $(_835).val(); +} +},setValue:function(_836,_837){ +if(isA(_836,name)){ +var opts=$(_836)[name]("options"); +if(opts.multiple){ +if(_837){ +$(_836)[name]("setValues",_837.split(opts.separator)); +}else{ +$(_836)[name]("clear"); +} +}else{ +$(_836)[name]("setValue",_837); +} +}else{ +$(_836).val(_837); +} +},resize:function(_838,_839){ +if(isA(_838,name)){ +$(_838)[name]("resize",_839); +}else{ +$(_838)._size({width:_839,height:$.fn.datagrid.defaults.editorHeight}); +} +}}; +}; +}; +var _83a=$.extend({},_82c(["text","textbox","passwordbox","filebox","numberbox","numberspinner","combobox","combotree","combogrid","combotreegrid","datebox","datetimebox","timespinner","datetimespinner"]),{textarea:{init:function(_83b,_83c){ +var _83d=$("").appendTo(_83b); +_83d.css("vertical-align","middle")._outerHeight(_83c.height); +return _83d; +},getValue:function(_83e){ +return $(_83e).val(); +},setValue:function(_83f,_840){ +$(_83f).val(_840); +},resize:function(_841,_842){ +$(_841)._outerWidth(_842); +}},checkbox:{init:function(_843,_844){ +var _845=$("").appendTo(_843); +_845.val(_844.on); +_845.attr("offval",_844.off); +return _845; +},getValue:function(_846){ +if($(_846).is(":checked")){ +return $(_846).val(); +}else{ +return $(_846).attr("offval"); +} +},setValue:function(_847,_848){ +var _849=false; +if($(_847).val()==_848){ +_849=true; +} +$(_847)._propAttr("checked",_849); +}},validatebox:{init:function(_84a,_84b){ +var _84c=$("").appendTo(_84a); +_84c.validatebox(_84b); +return _84c; +},destroy:function(_84d){ +$(_84d).validatebox("destroy"); +},getValue:function(_84e){ +return $(_84e).val(); +},setValue:function(_84f,_850){ +$(_84f).val(_850); +},resize:function(_851,_852){ +$(_851)._outerWidth(_852)._outerHeight($.fn.datagrid.defaults.editorHeight); +}}}); +$.fn.datagrid.methods={options:function(jq){ +var _853=$.data(jq[0],"datagrid").options; +var _854=$.data(jq[0],"datagrid").panel.panel("options"); +var opts=$.extend(_853,{width:_854.width,height:_854.height,closed:_854.closed,collapsed:_854.collapsed,minimized:_854.minimized,maximized:_854.maximized}); +return opts; +},setSelectionState:function(jq){ +return jq.each(function(){ +_78a(this); +}); +},createStyleSheet:function(jq){ +return _6a8(jq[0]); +},getPanel:function(jq){ +return $.data(jq[0],"datagrid").panel; +},getPager:function(jq){ +return $.data(jq[0],"datagrid").panel.children("div.datagrid-pager"); +},getColumnFields:function(jq,_855){ +return _6ff(jq[0],_855); +},getColumnOption:function(jq,_856){ +return _700(jq[0],_856); +},resize:function(jq,_857){ +return jq.each(function(){ +_6b7(this,_857); +}); +},load:function(jq,_858){ +return jq.each(function(){ +var opts=$(this).datagrid("options"); +if(typeof _858=="string"){ +opts.url=_858; +_858=null; +} +opts.pageNumber=1; +var _859=$(this).datagrid("getPager"); +_859.pagination("refresh",{pageNumber:1}); +_73c(this,_858); +}); +},reload:function(jq,_85a){ +return jq.each(function(){ +var opts=$(this).datagrid("options"); +if(typeof _85a=="string"){ +opts.url=_85a; +_85a=null; +} +_73c(this,_85a); +}); +},reloadFooter:function(jq,_85b){ +return jq.each(function(){ +var opts=$.data(this,"datagrid").options; +var dc=$.data(this,"datagrid").dc; +if(_85b){ +$.data(this,"datagrid").footer=_85b; +} +if(opts.showFooter){ +opts.view.renderFooter.call(opts.view,this,dc.footer2,false); +opts.view.renderFooter.call(opts.view,this,dc.footer1,true); +if(opts.view.onAfterRender){ +opts.view.onAfterRender.call(opts.view,this); +} +$(this).datagrid("fixRowHeight"); +} +}); +},loading:function(jq){ +return jq.each(function(){ +var opts=$.data(this,"datagrid").options; +$(this).datagrid("getPager").pagination("loading"); +if(opts.loadMsg){ +var _85c=$(this).datagrid("getPanel"); +if(!_85c.children("div.datagrid-mask").length){ +$("
                                            ").appendTo(_85c); +var msg=$("
                                            ").html(opts.loadMsg).appendTo(_85c); +msg._outerHeight(40); +msg.css({marginLeft:(-msg.outerWidth()/2),lineHeight:(msg.height()+"px")}); +} +} +}); +},loaded:function(jq){ +return jq.each(function(){ +$(this).datagrid("getPager").pagination("loaded"); +var _85d=$(this).datagrid("getPanel"); +_85d.children("div.datagrid-mask-msg").remove(); +_85d.children("div.datagrid-mask").remove(); +}); +},fitColumns:function(jq){ +return jq.each(function(){ +_749(this); +}); +},fixColumnSize:function(jq,_85e){ +return jq.each(function(){ +_767(this,_85e); +}); +},fixRowHeight:function(jq,_85f){ +return jq.each(function(){ +_6cd(this,_85f); +}); +},freezeRow:function(jq,_860){ +return jq.each(function(){ +_6da(this,_860); +}); +},autoSizeColumn:function(jq,_861){ +return jq.each(function(){ +_75b(this,_861); +}); +},loadData:function(jq,data){ +return jq.each(function(){ +_73d(this,data); +_80b(this); +}); +},getData:function(jq){ +return $.data(jq[0],"datagrid").data; +},getRows:function(jq){ +return $.data(jq[0],"datagrid").data.rows; +},getFooterRows:function(jq){ +return $.data(jq[0],"datagrid").footer; +},getRowIndex:function(jq,id){ +return _792(jq[0],id); +},getChecked:function(jq){ +return _798(jq[0]); +},getSelected:function(jq){ +var rows=_795(jq[0]); +return rows.length>0?rows[0]:null; +},getSelections:function(jq){ +return _795(jq[0]); +},clearSelections:function(jq){ +return jq.each(function(){ +var _862=$.data(this,"datagrid"); +var _863=_862.selectedRows; +var _864=_862.checkedRows; +_863.splice(0,_863.length); +_7ab(this); +if(_862.options.checkOnSelect){ +_864.splice(0,_864.length); +} +}); +},clearChecked:function(jq){ +return jq.each(function(){ +var _865=$.data(this,"datagrid"); +var _866=_865.selectedRows; +var _867=_865.checkedRows; +_867.splice(0,_867.length); +_712(this); +if(_865.options.selectOnCheck){ +_866.splice(0,_866.length); +} +}); +},scrollTo:function(jq,_868){ +return jq.each(function(){ +_79b(this,_868); +}); +},highlightRow:function(jq,_869){ +return jq.each(function(){ +_71f(this,_869); +_79b(this,_869); +}); +},selectAll:function(jq){ +return jq.each(function(){ +_7b0(this); +}); +},unselectAll:function(jq){ +return jq.each(function(){ +_7ab(this); +}); +},selectRow:function(jq,_86a){ +return jq.each(function(){ +_726(this,_86a); +}); +},selectRecord:function(jq,id){ +return jq.each(function(){ +var opts=$.data(this,"datagrid").options; +if(opts.idField){ +var _86b=_792(this,id); +if(_86b>=0){ +$(this).datagrid("selectRow",_86b); +} +} +}); +},unselectRow:function(jq,_86c){ +return jq.each(function(){ +_727(this,_86c); +}); +},checkRow:function(jq,_86d){ +return jq.each(function(){ +_723(this,_86d); +}); +},uncheckRow:function(jq,_86e){ +return jq.each(function(){ +_724(this,_86e); +}); +},checkAll:function(jq){ +return jq.each(function(){ +_711(this); +}); +},uncheckAll:function(jq){ +return jq.each(function(){ +_712(this); +}); +},beginEdit:function(jq,_86f){ +return jq.each(function(){ +_7ca(this,_86f); +}); +},endEdit:function(jq,_870){ +return jq.each(function(){ +_7d0(this,_870,false); +}); +},cancelEdit:function(jq,_871){ +return jq.each(function(){ +_7d0(this,_871,true); +}); +},getEditors:function(jq,_872){ +return _7dd(jq[0],_872); +},getEditor:function(jq,_873){ +return _7e1(jq[0],_873); +},refreshRow:function(jq,_874){ +return jq.each(function(){ +var opts=$.data(this,"datagrid").options; +opts.view.refreshRow.call(opts.view,this,_874); +}); +},validateRow:function(jq,_875){ +return _7cf(jq[0],_875); +},updateRow:function(jq,_876){ +return jq.each(function(){ +_805(this,_876); +}); +},appendRow:function(jq,row){ +return jq.each(function(){ +_802(this,row); +}); +},insertRow:function(jq,_877){ +return jq.each(function(){ +_7fe(this,_877); +}); +},deleteRow:function(jq,_878){ +return jq.each(function(){ +_7f8(this,_878); +}); +},getChanges:function(jq,_879){ +return _7f2(jq[0],_879); +},acceptChanges:function(jq){ +return jq.each(function(){ +_80f(this); +}); +},rejectChanges:function(jq){ +return jq.each(function(){ +_811(this); +}); +},mergeCells:function(jq,_87a){ +return jq.each(function(){ +_823(this,_87a); +}); +},showColumn:function(jq,_87b){ +return jq.each(function(){ +var col=$(this).datagrid("getColumnOption",_87b); +if(col.hidden){ +col.hidden=false; +$(this).datagrid("getPanel").find("td[field=\""+_87b+"\"]").show(); +_73e(this,_87b,1); +$(this).datagrid("fitColumns"); +} +}); +},hideColumn:function(jq,_87c){ +return jq.each(function(){ +var col=$(this).datagrid("getColumnOption",_87c); +if(!col.hidden){ +col.hidden=true; +$(this).datagrid("getPanel").find("td[field=\""+_87c+"\"]").hide(); +_73e(this,_87c,-1); +$(this).datagrid("fitColumns"); +} +}); +},sort:function(jq,_87d){ +return jq.each(function(){ +_713(this,_87d); +}); +},gotoPage:function(jq,_87e){ +return jq.each(function(){ +var _87f=this; +var page,cb; +if(typeof _87e=="object"){ +page=_87e.page; +cb=_87e.callback; +}else{ +page=_87e; +} +$(_87f).datagrid("options").pageNumber=page; +$(_87f).datagrid("getPager").pagination("refresh",{pageNumber:page}); +_73c(_87f,null,function(){ +if(cb){ +cb.call(_87f,page); +} +}); +}); +}}; +$.fn.datagrid.parseOptions=function(_880){ +var t=$(_880); +return $.extend({},$.fn.panel.parseOptions(_880),$.parser.parseOptions(_880,["url","toolbar","idField","sortName","sortOrder","pagePosition","resizeHandle",{sharedStyleSheet:"boolean",fitColumns:"boolean",autoRowHeight:"boolean",striped:"boolean",nowrap:"boolean"},{rownumbers:"boolean",singleSelect:"boolean",ctrlSelect:"boolean",checkOnSelect:"boolean",selectOnCheck:"boolean"},{pagination:"boolean",pageSize:"number",pageNumber:"number"},{multiSort:"boolean",remoteSort:"boolean",showHeader:"boolean",showFooter:"boolean"},{scrollbarSize:"number",scrollOnSelect:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined),loadMsg:(t.attr("loadMsg")!=undefined?t.attr("loadMsg"):undefined),rowStyler:(t.attr("rowStyler")?eval(t.attr("rowStyler")):undefined)}); +}; +$.fn.datagrid.parseData=function(_881){ +var t=$(_881); +var data={total:0,rows:[]}; +var _882=t.datagrid("getColumnFields",true).concat(t.datagrid("getColumnFields",false)); +t.find("tbody tr").each(function(){ +data.total++; +var row={}; +$.extend(row,$.parser.parseOptions(this,["iconCls","state"])); +for(var i=0;i<_882.length;i++){ +row[_882[i]]=$(this).find("td:eq("+i+")").html(); +} +data.rows.push(row); +}); +return data; +}; +var _883={render:function(_884,_885,_886){ +var rows=$(_884).datagrid("getRows"); +$(_885).empty().html(this.renderTable(_884,0,rows,_886)); +},renderFooter:function(_887,_888,_889){ +var opts=$.data(_887,"datagrid").options; +var rows=$.data(_887,"datagrid").footer||[]; +var _88a=$(_887).datagrid("getColumnFields",_889); +var _88b=[""]; +for(var i=0;i"); +_88b.push(this.renderRow.call(this,_887,_88a,_889,i,rows[i])); +_88b.push(""); +} +_88b.push("
                                            "); +$(_888).html(_88b.join("")); +},renderTable:function(_88c,_88d,rows,_88e){ +var _88f=$.data(_88c,"datagrid"); +var opts=_88f.options; +if(_88e){ +if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){ +return ""; +} +} +var _890=$(_88c).datagrid("getColumnFields",_88e); +var _891=[""]; +for(var i=0;i"); +_891.push(this.renderRow.call(this,_88c,_890,_88e,_88d,row)); +_891.push(""); +_88d++; +} +_891.push("
                                            "); +return _891.join(""); +},renderRow:function(_894,_895,_896,_897,_898){ +var opts=$.data(_894,"datagrid").options; +var cc=[]; +if(_896&&opts.rownumbers){ +var _899=_897+1; +if(opts.pagination){ +_899+=(opts.pageNumber-1)*opts.pageSize; +} +cc.push("
                                            "+_899+"
                                            "); +} +for(var i=0;i<_895.length;i++){ +var _89a=_895[i]; +var col=$(_894).datagrid("getColumnOption",_89a); +if(col){ +var _89b=_898[_89a]; +var css=col.styler?(col.styler.call(_894,_89b,_898,_897)||""):""; +var cs=this.getStyleValue(css); +var cls=cs.c?"class=\""+cs.c+"\"":""; +var _89c=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); +cc.push(""); +var _89c=""; +if(!col.checkbox){ +if(col.align){ +_89c+="text-align:"+col.align+";"; +} +if(!opts.nowrap){ +_89c+="white-space:normal;height:auto;"; +}else{ +if(opts.autoRowHeight){ +_89c+="height:auto;"; +} +} +} +cc.push("
                                            "); +if(col.checkbox){ +cc.push(""); +}else{ +if(col.formatter){ +cc.push(col.formatter(_89b,_898,_897)); +}else{ +cc.push(_89b); +} +} +cc.push("
                                            "); +cc.push(""); +} +} +return cc.join(""); +},getStyleValue:function(css){ +var _89d=""; +var _89e=""; +if(typeof css=="string"){ +_89e=css; +}else{ +if(css){ +_89d=css["class"]||""; +_89e=css["style"]||""; +} +} +return {c:_89d,s:_89e}; +},refreshRow:function(_89f,_8a0){ +this.updateRow.call(this,_89f,_8a0,{}); +},updateRow:function(_8a1,_8a2,row){ +var opts=$.data(_8a1,"datagrid").options; +var _8a3=opts.finder.getRow(_8a1,_8a2); +$.extend(_8a3,row); +var cs=_8a4.call(this,_8a2); +var _8a5=cs.s; +var cls="datagrid-row "+(_8a2%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c; +function _8a4(_8a6){ +var css=opts.rowStyler?opts.rowStyler.call(_8a1,_8a6,_8a3):""; +return this.getStyleValue(css); +}; +function _8a7(_8a8){ +var tr=opts.finder.getTr(_8a1,_8a2,"body",(_8a8?1:2)); +if(!tr.length){ +return; +} +var _8a9=$(_8a1).datagrid("getColumnFields",_8a8); +var _8aa=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); +tr.html(this.renderRow.call(this,_8a1,_8a9,_8a8,_8a2,_8a3)); +var _8ab=(tr.hasClass("datagrid-row-checked")?" datagrid-row-checked":"")+(tr.hasClass("datagrid-row-selected")?" datagrid-row-selected":""); +tr.attr("style",_8a5).attr("class",cls+_8ab); +if(_8aa){ +tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); +} +}; +_8a7.call(this,true); +_8a7.call(this,false); +$(_8a1).datagrid("fixRowHeight",_8a2); +},insertRow:function(_8ac,_8ad,row){ +var _8ae=$.data(_8ac,"datagrid"); +var opts=_8ae.options; +var dc=_8ae.dc; +var data=_8ae.data; +if(_8ad==undefined||_8ad==null){ +_8ad=data.rows.length; +} +if(_8ad>data.rows.length){ +_8ad=data.rows.length; +} +function _8af(_8b0){ +var _8b1=_8b0?1:2; +for(var i=data.rows.length-1;i>=_8ad;i--){ +var tr=opts.finder.getTr(_8ac,i,"body",_8b1); +tr.attr("datagrid-row-index",i+1); +tr.attr("id",_8ae.rowIdPrefix+"-"+_8b1+"-"+(i+1)); +if(_8b0&&opts.rownumbers){ +var _8b2=i+2; +if(opts.pagination){ +_8b2+=(opts.pageNumber-1)*opts.pageSize; +} +tr.find("div.datagrid-cell-rownumber").html(_8b2); +} +if(opts.striped){ +tr.removeClass("datagrid-row-alt").addClass((i+1)%2?"datagrid-row-alt":""); +} +} +}; +function _8b3(_8b4){ +var _8b5=_8b4?1:2; +var _8b6=$(_8ac).datagrid("getColumnFields",_8b4); +var _8b7=_8ae.rowIdPrefix+"-"+_8b5+"-"+_8ad; +var tr=""; +if(_8ad>=data.rows.length){ +if(data.rows.length){ +opts.finder.getTr(_8ac,"","last",_8b5).after(tr); +}else{ +var cc=_8b4?dc.body1:dc.body2; +cc.html(""+tr+"
                                            "); +} +}else{ +opts.finder.getTr(_8ac,_8ad+1,"body",_8b5).before(tr); +} +}; +_8af.call(this,true); +_8af.call(this,false); +_8b3.call(this,true); +_8b3.call(this,false); +data.total+=1; +data.rows.splice(_8ad,0,row); +this.setEmptyMsg(_8ac); +this.refreshRow.call(this,_8ac,_8ad); +},deleteRow:function(_8b8,_8b9){ +var _8ba=$.data(_8b8,"datagrid"); +var opts=_8ba.options; +var data=_8ba.data; +function _8bb(_8bc){ +var _8bd=_8bc?1:2; +for(var i=_8b9+1;i
                                            ").appendTo(_8c4.dc.view); +d.html(opts.emptyMsg).css("top",h+"px"); +} +} +},renderEmptyRow:function(_8c6){ +var cols=$.map($(_8c6).datagrid("getColumnFields"),function(_8c7){ +return $(_8c6).datagrid("getColumnOption",_8c7); +}); +$.map(cols,function(col){ +col.formatter1=col.formatter; +col.styler1=col.styler; +col.formatter=col.styler=undefined; +}); +var _8c8=$.data(_8c6,"datagrid").dc.body2; +_8c8.html(this.renderTable(_8c6,0,[{}],false)); +_8c8.find("tbody *").css({height:1,borderColor:"transparent",background:"transparent"}); +var tr=_8c8.find(".datagrid-row"); +tr.removeClass("datagrid-row").removeAttr("datagrid-row-index"); +tr.find(".datagrid-cell,.datagrid-cell-check").empty(); +$.map(cols,function(col){ +col.formatter=col.formatter1; +col.styler=col.styler1; +col.formatter1=col.styler1=undefined; +}); +}}; +$.fn.datagrid.defaults=$.extend({},$.fn.panel.defaults,{sharedStyleSheet:false,frozenColumns:undefined,columns:undefined,fitColumns:false,resizeHandle:"right",resizeEdge:5,autoRowHeight:true,toolbar:null,striped:false,method:"post",nowrap:true,idField:null,url:null,data:null,loadMsg:"Processing, please wait ...",emptyMsg:"",rownumbers:false,singleSelect:false,ctrlSelect:false,selectOnCheck:true,checkOnSelect:true,pagination:false,pagePosition:"bottom",pageNumber:1,pageSize:10,pageList:[10,20,30,40,50],queryParams:{},sortName:null,sortOrder:"asc",multiSort:false,remoteSort:true,showHeader:true,showFooter:false,scrollOnSelect:true,scrollbarSize:18,rownumberWidth:30,editorHeight:31,headerEvents:{mouseover:_70b(true),mouseout:_70b(false),click:_70f,dblclick:_714,contextmenu:_717},rowEvents:{mouseover:_719(true),mouseout:_719(false),click:_720,dblclick:_72a,contextmenu:_72e},rowStyler:function(_8c9,_8ca){ +},loader:function(_8cb,_8cc,_8cd){ +var opts=$(this).datagrid("options"); +if(!opts.url){ +return false; +} +$.ajax({type:opts.method,url:opts.url,data:_8cb,dataType:"json",success:function(data){ +_8cc(data); +},error:function(){ +_8cd.apply(this,arguments); +}}); +},loadFilter:function(data){ +return data; +},editors:_83a,finder:{getTr:function(_8ce,_8cf,type,_8d0){ +type=type||"body"; +_8d0=_8d0||0; +var _8d1=$.data(_8ce,"datagrid"); +var dc=_8d1.dc; +var opts=_8d1.options; +if(_8d0==0){ +var tr1=opts.finder.getTr(_8ce,_8cf,type,1); +var tr2=opts.finder.getTr(_8ce,_8cf,type,2); +return tr1.add(tr2); +}else{ +if(type=="body"){ +var tr=$("#"+_8d1.rowIdPrefix+"-"+_8d0+"-"+_8cf); +if(!tr.length){ +tr=(_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index="+_8cf+"]"); +} +return tr; +}else{ +if(type=="footer"){ +return (_8d0==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index="+_8cf+"]"); +}else{ +if(type=="selected"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-selected"); +}else{ +if(type=="highlight"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-over"); +}else{ +if(type=="checked"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-checked"); +}else{ +if(type=="editing"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-editing"); +}else{ +if(type=="last"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]:last"); +}else{ +if(type=="allbody"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]"); +}else{ +if(type=="allfooter"){ +return (_8d0==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index]"); +} +} +} +} +} +} +} +} +} +} +},getRow:function(_8d2,p){ +var _8d3=(typeof p=="object")?p.attr("datagrid-row-index"):p; +return $.data(_8d2,"datagrid").data.rows[parseInt(_8d3)]; +},getRows:function(_8d4){ +return $(_8d4).datagrid("getRows"); +}},view:_883,onBeforeLoad:function(_8d5){ +},onLoadSuccess:function(){ +},onLoadError:function(){ +},onClickRow:function(_8d6,_8d7){ +},onDblClickRow:function(_8d8,_8d9){ +},onClickCell:function(_8da,_8db,_8dc){ +},onDblClickCell:function(_8dd,_8de,_8df){ +},onBeforeSortColumn:function(sort,_8e0){ +},onSortColumn:function(sort,_8e1){ +},onResizeColumn:function(_8e2,_8e3){ +},onBeforeSelect:function(_8e4,_8e5){ +},onSelect:function(_8e6,_8e7){ +},onBeforeUnselect:function(_8e8,_8e9){ +},onUnselect:function(_8ea,_8eb){ +},onSelectAll:function(rows){ +},onUnselectAll:function(rows){ +},onBeforeCheck:function(_8ec,_8ed){ +},onCheck:function(_8ee,_8ef){ +},onBeforeUncheck:function(_8f0,_8f1){ +},onUncheck:function(_8f2,_8f3){ +},onCheckAll:function(rows){ +},onUncheckAll:function(rows){ +},onBeforeEdit:function(_8f4,_8f5){ +},onBeginEdit:function(_8f6,_8f7){ +},onEndEdit:function(_8f8,_8f9,_8fa){ +},onAfterEdit:function(_8fb,_8fc,_8fd){ +},onCancelEdit:function(_8fe,_8ff){ +},onHeaderContextMenu:function(e,_900){ +},onRowContextMenu:function(e,_901,_902){ +}}); +})(jQuery); +(function($){ +var _903; +$(document).unbind(".propertygrid").bind("mousedown.propertygrid",function(e){ +var p=$(e.target).closest("div.datagrid-view,div.combo-panel"); +if(p.length){ +return; +} +_904(_903); +_903=undefined; +}); +function _905(_906){ +var _907=$.data(_906,"propertygrid"); +var opts=$.data(_906,"propertygrid").options; +$(_906).datagrid($.extend({},opts,{cls:"propertygrid",view:(opts.showGroup?opts.groupView:opts.view),onBeforeEdit:function(_908,row){ +if(opts.onBeforeEdit.call(_906,_908,row)==false){ +return false; +} +var dg=$(this); +var row=dg.datagrid("getRows")[_908]; +var col=dg.datagrid("getColumnOption","value"); +col.editor=row.editor; +},onClickCell:function(_909,_90a,_90b){ +if(_903!=this){ +_904(_903); +_903=this; +} +if(opts.editIndex!=_909){ +_904(_903); +$(this).datagrid("beginEdit",_909); +var ed=$(this).datagrid("getEditor",{index:_909,field:_90a}); +if(!ed){ +ed=$(this).datagrid("getEditor",{index:_909,field:"value"}); +} +if(ed){ +var t=$(ed.target); +var _90c=t.data("textbox")?t.textbox("textbox"):t; +_90c.focus(); +opts.editIndex=_909; +} +} +opts.onClickCell.call(_906,_909,_90a,_90b); +},loadFilter:function(data){ +_904(this); +return opts.loadFilter.call(this,data); +}})); +}; +function _904(_90d){ +var t=$(_90d); +if(!t.length){ +return; +} +var opts=$.data(_90d,"propertygrid").options; +opts.finder.getTr(_90d,null,"editing").each(function(){ +var _90e=parseInt($(this).attr("datagrid-row-index")); +if(t.datagrid("validateRow",_90e)){ +t.datagrid("endEdit",_90e); +}else{ +t.datagrid("cancelEdit",_90e); +} +}); +opts.editIndex=undefined; +}; +$.fn.propertygrid=function(_90f,_910){ +if(typeof _90f=="string"){ +var _911=$.fn.propertygrid.methods[_90f]; +if(_911){ +return _911(this,_910); +}else{ +return this.datagrid(_90f,_910); +} +} +_90f=_90f||{}; +return this.each(function(){ +var _912=$.data(this,"propertygrid"); +if(_912){ +$.extend(_912.options,_90f); +}else{ +var opts=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_90f); +opts.frozenColumns=$.extend(true,[],opts.frozenColumns); +opts.columns=$.extend(true,[],opts.columns); +$.data(this,"propertygrid",{options:opts}); +} +_905(this); +}); +}; +$.fn.propertygrid.methods={options:function(jq){ +return $.data(jq[0],"propertygrid").options; +}}; +$.fn.propertygrid.parseOptions=function(_913){ +return $.extend({},$.fn.datagrid.parseOptions(_913),$.parser.parseOptions(_913,[{showGroup:"boolean"}])); +}; +var _914=$.extend({},$.fn.datagrid.defaults.view,{render:function(_915,_916,_917){ +var _918=[]; +var _919=this.groups; +for(var i=0;i<_919.length;i++){ +_918.push(this.renderGroup.call(this,_915,i,_919[i],_917)); +} +$(_916).html(_918.join("")); +},renderGroup:function(_91a,_91b,_91c,_91d){ +var _91e=$.data(_91a,"datagrid"); +var opts=_91e.options; +var _91f=$(_91a).datagrid("getColumnFields",_91d); +var _920=opts.frozenColumns&&opts.frozenColumns.length; +if(_91d){ +if(!(opts.rownumbers||_920)){ +return ""; +} +} +var _921=[]; +var css=opts.groupStyler.call(_91a,_91c.value,_91c.rows); +var cs=_922(css,"datagrid-group"); +_921.push("
                                            "); +if((_91d&&(opts.rownumbers||opts.frozenColumns.length))||(!_91d&&!(opts.rownumbers||opts.frozenColumns.length))){ +_921.push(""); +_921.push(" "); +_921.push(""); +} +if((_91d&&_920)||(!_91d)){ +_921.push(""); +_921.push(opts.groupFormatter.call(_91a,_91c.value,_91c.rows)); +_921.push(""); +} +_921.push("
                                            "); +_921.push(""); +var _923=_91c.startIndex; +for(var j=0;j<_91c.rows.length;j++){ +var css=opts.rowStyler?opts.rowStyler.call(_91a,_923,_91c.rows[j]):""; +var _924=""; +var _925=""; +if(typeof css=="string"){ +_925=css; +}else{ +if(css){ +_924=css["class"]||""; +_925=css["style"]||""; +} +} +var cls="class=\"datagrid-row "+(_923%2&&opts.striped?"datagrid-row-alt ":" ")+_924+"\""; +var _926=_925?"style=\""+_925+"\"":""; +var _927=_91e.rowIdPrefix+"-"+(_91d?1:2)+"-"+_923; +_921.push(""); +_921.push(this.renderRow.call(this,_91a,_91f,_91d,_923,_91c.rows[j])); +_921.push(""); +_923++; +} +_921.push("
                                            "); +return _921.join(""); +function _922(css,cls){ +var _928=""; +var _929=""; +if(typeof css=="string"){ +_929=css; +}else{ +if(css){ +_928=css["class"]||""; +_929=css["style"]||""; +} +} +return "class=\""+cls+(_928?" "+_928:"")+"\" "+"style=\""+_929+"\""; +}; +},bindEvents:function(_92a){ +var _92b=$.data(_92a,"datagrid"); +var dc=_92b.dc; +var body=dc.body1.add(dc.body2); +var _92c=($.data(body[0],"events")||$._data(body[0],"events")).click[0].handler; +body.unbind("click").bind("click",function(e){ +var tt=$(e.target); +var _92d=tt.closest("span.datagrid-row-expander"); +if(_92d.length){ +var _92e=_92d.closest("div.datagrid-group").attr("group-index"); +if(_92d.hasClass("datagrid-row-collapse")){ +$(_92a).datagrid("collapseGroup",_92e); +}else{ +$(_92a).datagrid("expandGroup",_92e); +} +}else{ +_92c(e); +} +e.stopPropagation(); +}); +},onBeforeRender:function(_92f,rows){ +var _930=$.data(_92f,"datagrid"); +var opts=_930.options; +_931(); +var _932=[]; +for(var i=0;i"+".datagrid-group{height:"+opts.groupHeight+"px;overflow:hidden;font-weight:bold;border-bottom:1px solid #ccc;white-space:nowrap;word-break:normal;}"+".datagrid-group-title,.datagrid-group-expander{display:inline-block;vertical-align:bottom;height:100%;line-height:"+opts.groupHeight+"px;padding:0 4px;}"+".datagrid-group-title{position:relative;}"+".datagrid-group-expander{width:"+opts.expanderWidth+"px;text-align:center;padding:0}"+".datagrid-row-expander{margin:"+Math.floor((opts.groupHeight-16)/2)+"px 0;display:inline-block;width:16px;height:16px;cursor:pointer}"+""); +} +}; +},onAfterRender:function(_939){ +$.fn.datagrid.defaults.view.onAfterRender.call(this,_939); +var view=this; +var _93a=$.data(_939,"datagrid"); +var opts=_93a.options; +if(!_93a.onResizeColumn){ +_93a.onResizeColumn=opts.onResizeColumn; +} +if(!_93a.onResize){ +_93a.onResize=opts.onResize; +} +opts.onResizeColumn=function(_93b,_93c){ +view.resizeGroup(_939); +_93a.onResizeColumn.call(_939,_93b,_93c); +}; +opts.onResize=function(_93d,_93e){ +view.resizeGroup(_939); +_93a.onResize.call($(_939).datagrid("getPanel")[0],_93d,_93e); +}; +view.resizeGroup(_939); +}}); +$.extend($.fn.datagrid.methods,{groups:function(jq){ +return jq.datagrid("options").view.groups; +},expandGroup:function(jq,_93f){ +return jq.each(function(){ +var opts=$(this).datagrid("options"); +var view=$.data(this,"datagrid").dc.view; +var _940=view.find(_93f!=undefined?"div.datagrid-group[group-index=\""+_93f+"\"]":"div.datagrid-group"); +var _941=_940.find("span.datagrid-row-expander"); +if(_941.hasClass("datagrid-row-expand")){ +_941.removeClass("datagrid-row-expand").addClass("datagrid-row-collapse"); +_940.next("table").show(); +} +$(this).datagrid("fixRowHeight"); +if(opts.onExpandGroup){ +opts.onExpandGroup.call(this,_93f); +} +}); +},collapseGroup:function(jq,_942){ +return jq.each(function(){ +var opts=$(this).datagrid("options"); +var view=$.data(this,"datagrid").dc.view; +var _943=view.find(_942!=undefined?"div.datagrid-group[group-index=\""+_942+"\"]":"div.datagrid-group"); +var _944=_943.find("span.datagrid-row-expander"); +if(_944.hasClass("datagrid-row-collapse")){ +_944.removeClass("datagrid-row-collapse").addClass("datagrid-row-expand"); +_943.next("table").hide(); +} +$(this).datagrid("fixRowHeight"); +if(opts.onCollapseGroup){ +opts.onCollapseGroup.call(this,_942); +} +}); +},scrollToGroup:function(jq,_945){ +return jq.each(function(){ +var _946=$.data(this,"datagrid"); +var dc=_946.dc; +var grow=dc.body2.children("div.datagrid-group[group-index=\""+_945+"\"]"); +if(grow.length){ +var _947=grow.outerHeight(); +var _948=dc.view2.children("div.datagrid-header")._outerHeight(); +var _949=dc.body2.outerHeight(true)-dc.body2.outerHeight(); +var top=grow.position().top-_948-_949; +if(top<0){ +dc.body2.scrollTop(dc.body2.scrollTop()+top); +}else{ +if(top+_947>dc.body2.height()-18){ +dc.body2.scrollTop(dc.body2.scrollTop()+top+_947-dc.body2.height()+18); +} +} +} +}); +}}); +$.extend(_914,{refreshGroupTitle:function(_94a,_94b){ +var _94c=$.data(_94a,"datagrid"); +var opts=_94c.options; +var dc=_94c.dc; +var _94d=this.groups[_94b]; +var span=dc.body1.add(dc.body2).children("div.datagrid-group[group-index="+_94b+"]").find("span.datagrid-group-title"); +span.html(opts.groupFormatter.call(_94a,_94d.value,_94d.rows)); +},resizeGroup:function(_94e,_94f){ +var _950=$.data(_94e,"datagrid"); +var dc=_950.dc; +var ht=dc.header2.find("table"); +var fr=ht.find("tr.datagrid-filter-row").hide(); +var ww=ht.width(); +if(_94f==undefined){ +var _951=dc.body2.children("div.datagrid-group"); +}else{ +var _951=dc.body2.children("div.datagrid-group[group-index="+_94f+"]"); +} +_951._outerWidth(ww); +var opts=_950.options; +if(opts.frozenColumns&&opts.frozenColumns.length){ +var _952=dc.view1.width()-opts.expanderWidth; +var _953=dc.view1.css("direction").toLowerCase()=="rtl"; +_951.find(".datagrid-group-title").css(_953?"right":"left",-_952+"px"); +} +if(fr.length){ +if(opts.showFilterBar){ +fr.show(); +} +} +},insertRow:function(_954,_955,row){ +var _956=$.data(_954,"datagrid"); +var opts=_956.options; +var dc=_956.dc; +var _957=null; +var _958; +if(!_956.data.rows.length){ +$(_954).datagrid("loadData",[row]); +return; +} +for(var i=0;i_957.startIndex+_957.rows.length){ +_955=_957.startIndex+_957.rows.length; +} +} +$.fn.datagrid.defaults.view.insertRow.call(this,_954,_955,row); +if(_955>=_957.startIndex+_957.rows.length){ +_959(_955,true); +_959(_955,false); +} +_957.rows.splice(_955-_957.startIndex,0,row); +}else{ +_957={value:row[opts.groupField],rows:[row],startIndex:_956.data.rows.length}; +_958=this.groups.length; +dc.body1.append(this.renderGroup.call(this,_954,_958,_957,true)); +dc.body2.append(this.renderGroup.call(this,_954,_958,_957,false)); +this.groups.push(_957); +_956.data.rows.push(row); +} +this.setGroupIndex(_954); +this.refreshGroupTitle(_954,_958); +this.resizeGroup(_954); +function _959(_95a,_95b){ +var _95c=_95b?1:2; +var _95d=opts.finder.getTr(_954,_95a-1,"body",_95c); +var tr=opts.finder.getTr(_954,_95a,"body",_95c); +tr.insertAfter(_95d); +}; +},updateRow:function(_95e,_95f,row){ +var opts=$.data(_95e,"datagrid").options; +$.fn.datagrid.defaults.view.updateRow.call(this,_95e,_95f,row); +var tb=opts.finder.getTr(_95e,_95f,"body",2).closest("table.datagrid-btable"); +var _960=parseInt(tb.prev().attr("group-index")); +this.refreshGroupTitle(_95e,_960); +},deleteRow:function(_961,_962){ +var _963=$.data(_961,"datagrid"); +var opts=_963.options; +var dc=_963.dc; +var body=dc.body1.add(dc.body2); +var tb=opts.finder.getTr(_961,_962,"body",2).closest("table.datagrid-btable"); +var _964=parseInt(tb.prev().attr("group-index")); +$.fn.datagrid.defaults.view.deleteRow.call(this,_961,_962); +var _965=this.groups[_964]; +if(_965.rows.length>1){ +_965.rows.splice(_962-_965.startIndex,1); +this.refreshGroupTitle(_961,_964); +}else{ +body.children("div.datagrid-group[group-index="+_964+"]").remove(); +for(var i=_964+1;i").insertBefore(tr.find(".tree-title")); +} +if(row.checkState=="checked"){ +_98d(_9a1,_9a2,true,true); +}else{ +if(row.checkState=="unchecked"){ +_98d(_9a1,_9a2,false,true); +}else{ +var flag=_99f(row); +if(flag===0){ +_98d(_9a1,_9a2,false,true); +}else{ +if(flag===1){ +_98d(_9a1,_9a2,true,true); +} +} +} +} +}else{ +ck.remove(); +row.checkState=undefined; +row.checked=undefined; +_996(_9a1,row); +} +}; +function _9a3(_9a4,_9a5){ +var opts=$.data(_9a4,"treegrid").options; +var tr1=opts.finder.getTr(_9a4,_9a5,"body",1); +var tr2=opts.finder.getTr(_9a4,_9a5,"body",2); +var _9a6=$(_9a4).datagrid("getColumnFields",true).length+(opts.rownumbers?1:0); +var _9a7=$(_9a4).datagrid("getColumnFields",false).length; +_9a8(tr1,_9a6); +_9a8(tr2,_9a7); +function _9a8(tr,_9a9){ +$(""+""+"
                                            "+""+"").insertAfter(tr); +}; +}; +function _9aa(_9ab,_9ac,data,_9ad,_9ae){ +var _9af=$.data(_9ab,"treegrid"); +var opts=_9af.options; +var dc=_9af.dc; +data=opts.loadFilter.call(_9ab,data,_9ac); +var node=find(_9ab,_9ac); +if(node){ +var _9b0=opts.finder.getTr(_9ab,_9ac,"body",1); +var _9b1=opts.finder.getTr(_9ab,_9ac,"body",2); +var cc1=_9b0.next("tr.treegrid-tr-tree").children("td").children("div"); +var cc2=_9b1.next("tr.treegrid-tr-tree").children("td").children("div"); +if(!_9ad){ +node.children=[]; +} +}else{ +var cc1=dc.body1; +var cc2=dc.body2; +if(!_9ad){ +_9af.data=[]; +} +} +if(!_9ad){ +cc1.empty(); +cc2.empty(); +} +if(opts.view.onBeforeRender){ +opts.view.onBeforeRender.call(opts.view,_9ab,_9ac,data); +} +opts.view.render.call(opts.view,_9ab,cc1,true); +opts.view.render.call(opts.view,_9ab,cc2,false); +if(opts.showFooter){ +opts.view.renderFooter.call(opts.view,_9ab,dc.footer1,true); +opts.view.renderFooter.call(opts.view,_9ab,dc.footer2,false); +} +if(opts.view.onAfterRender){ +opts.view.onAfterRender.call(opts.view,_9ab); +} +if(!_9ac&&opts.pagination){ +var _9b2=$.data(_9ab,"treegrid").total; +var _9b3=$(_9ab).datagrid("getPager"); +if(_9b3.pagination("options").total!=_9b2){ +_9b3.pagination({total:_9b2}); +} +} +_97c(_9ab); +_984(_9ab); +$(_9ab).treegrid("showLines"); +$(_9ab).treegrid("setSelectionState"); +$(_9ab).treegrid("autoSizeColumn"); +if(!_9ae){ +opts.onLoadSuccess.call(_9ab,node,data); +} +}; +function _97b(_9b4,_9b5,_9b6,_9b7,_9b8){ +var opts=$.data(_9b4,"treegrid").options; +var body=$(_9b4).datagrid("getPanel").find("div.datagrid-body"); +if(_9b5==undefined&&opts.queryParams){ +opts.queryParams.id=undefined; +} +if(_9b6){ +opts.queryParams=_9b6; +} +var _9b9=$.extend({},opts.queryParams); +if(opts.pagination){ +$.extend(_9b9,{page:opts.pageNumber,rows:opts.pageSize}); +} +if(opts.sortName){ +$.extend(_9b9,{sort:opts.sortName,order:opts.sortOrder}); +} +var row=find(_9b4,_9b5); +if(opts.onBeforeLoad.call(_9b4,row,_9b9)==false){ +return; +} +var _9ba=body.find("tr[node-id=\""+_9b5+"\"] span.tree-folder"); +_9ba.addClass("tree-loading"); +$(_9b4).treegrid("loading"); +var _9bb=opts.loader.call(_9b4,_9b9,function(data){ +_9ba.removeClass("tree-loading"); +$(_9b4).treegrid("loaded"); +_9aa(_9b4,_9b5,data,_9b7); +if(_9b8){ +_9b8(); +} +},function(){ +_9ba.removeClass("tree-loading"); +$(_9b4).treegrid("loaded"); +opts.onLoadError.apply(_9b4,arguments); +if(_9b8){ +_9b8(); +} +}); +if(_9bb==false){ +_9ba.removeClass("tree-loading"); +$(_9b4).treegrid("loaded"); +} +}; +function _9bc(_9bd){ +var _9be=_9bf(_9bd); +return _9be.length?_9be[0]:null; +}; +function _9bf(_9c0){ +return $.data(_9c0,"treegrid").data; +}; +function _99e(_9c1,_9c2){ +var row=find(_9c1,_9c2); +if(row._parentId){ +return find(_9c1,row._parentId); +}else{ +return null; +} +}; +function _980(_9c3,_9c4){ +var data=$.data(_9c3,"treegrid").data; +if(_9c4){ +var _9c5=find(_9c3,_9c4); +data=_9c5?(_9c5.children||[]):[]; +} +var _9c6=[]; +$.easyui.forEach(data,true,function(node){ +_9c6.push(node); +}); +return _9c6; +}; +function _9c7(_9c8,_9c9){ +var opts=$.data(_9c8,"treegrid").options; +var tr=opts.finder.getTr(_9c8,_9c9); +var node=tr.children("td[field=\""+opts.treeField+"\"]"); +return node.find("span.tree-indent,span.tree-hit").length; +}; +function find(_9ca,_9cb){ +var _9cc=$.data(_9ca,"treegrid"); +var opts=_9cc.options; +var _9cd=null; +$.easyui.forEach(_9cc.data,true,function(node){ +if(node[opts.idField]==_9cb){ +_9cd=node; +return false; +} +}); +return _9cd; +}; +function _9ce(_9cf,_9d0){ +var opts=$.data(_9cf,"treegrid").options; +var row=find(_9cf,_9d0); +var tr=opts.finder.getTr(_9cf,_9d0); +var hit=tr.find("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-collapsed")){ +return; +} +if(opts.onBeforeCollapse.call(_9cf,row)==false){ +return; +} +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +hit.next().removeClass("tree-folder-open"); +row.state="closed"; +tr=tr.next("tr.treegrid-tr-tree"); +var cc=tr.children("td").children("div"); +if(opts.animate){ +cc.slideUp("normal",function(){ +$(_9cf).treegrid("autoSizeColumn"); +_97c(_9cf,_9d0); +opts.onCollapse.call(_9cf,row); +}); +}else{ +cc.hide(); +$(_9cf).treegrid("autoSizeColumn"); +_97c(_9cf,_9d0); +opts.onCollapse.call(_9cf,row); +} +}; +function _9d1(_9d2,_9d3){ +var opts=$.data(_9d2,"treegrid").options; +var tr=opts.finder.getTr(_9d2,_9d3); +var hit=tr.find("span.tree-hit"); +var row=find(_9d2,_9d3); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +return; +} +if(opts.onBeforeExpand.call(_9d2,row)==false){ +return; +} +hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); +hit.next().addClass("tree-folder-open"); +var _9d4=tr.next("tr.treegrid-tr-tree"); +if(_9d4.length){ +var cc=_9d4.children("td").children("div"); +_9d5(cc); +}else{ +_9a3(_9d2,row[opts.idField]); +var _9d4=tr.next("tr.treegrid-tr-tree"); +var cc=_9d4.children("td").children("div"); +cc.hide(); +var _9d6=$.extend({},opts.queryParams||{}); +_9d6.id=row[opts.idField]; +_97b(_9d2,row[opts.idField],_9d6,true,function(){ +if(cc.is(":empty")){ +_9d4.remove(); +}else{ +_9d5(cc); +} +}); +} +function _9d5(cc){ +row.state="open"; +if(opts.animate){ +cc.slideDown("normal",function(){ +$(_9d2).treegrid("autoSizeColumn"); +_97c(_9d2,_9d3); +opts.onExpand.call(_9d2,row); +}); +}else{ +cc.show(); +$(_9d2).treegrid("autoSizeColumn"); +_97c(_9d2,_9d3); +opts.onExpand.call(_9d2,row); +} +}; +}; +function _98c(_9d7,_9d8){ +var opts=$.data(_9d7,"treegrid").options; +var tr=opts.finder.getTr(_9d7,_9d8); +var hit=tr.find("span.tree-hit"); +if(hit.hasClass("tree-expanded")){ +_9ce(_9d7,_9d8); +}else{ +_9d1(_9d7,_9d8); +} +}; +function _9d9(_9da,_9db){ +var opts=$.data(_9da,"treegrid").options; +var _9dc=_980(_9da,_9db); +if(_9db){ +_9dc.unshift(find(_9da,_9db)); +} +for(var i=0;i<_9dc.length;i++){ +_9ce(_9da,_9dc[i][opts.idField]); +} +}; +function _9dd(_9de,_9df){ +var opts=$.data(_9de,"treegrid").options; +var _9e0=_980(_9de,_9df); +if(_9df){ +_9e0.unshift(find(_9de,_9df)); +} +for(var i=0;i<_9e0.length;i++){ +_9d1(_9de,_9e0[i][opts.idField]); +} +}; +function _9e1(_9e2,_9e3){ +var opts=$.data(_9e2,"treegrid").options; +var ids=[]; +var p=_99e(_9e2,_9e3); +while(p){ +var id=p[opts.idField]; +ids.unshift(id); +p=_99e(_9e2,id); +} +for(var i=0;i").insertBefore(_9e8); +if(hit.prev().length){ +hit.prev().remove(); +} +} +} +_9aa(_9e5,_9e6.parent,_9e6.data,_9e7.data.length>0,true); +}; +function _9e9(_9ea,_9eb){ +var ref=_9eb.before||_9eb.after; +var opts=$.data(_9ea,"treegrid").options; +var _9ec=_99e(_9ea,ref); +_9e4(_9ea,{parent:(_9ec?_9ec[opts.idField]:null),data:[_9eb.data]}); +var _9ed=_9ec?_9ec.children:$(_9ea).treegrid("getRoots"); +for(var i=0;i<_9ed.length;i++){ +if(_9ed[i][opts.idField]==ref){ +var _9ee=_9ed[_9ed.length-1]; +_9ed.splice(_9eb.before?i:(i+1),0,_9ee); +_9ed.splice(_9ed.length-1,1); +break; +} +} +_9ef(true); +_9ef(false); +_984(_9ea); +$(_9ea).treegrid("showLines"); +function _9ef(_9f0){ +var _9f1=_9f0?1:2; +var tr=opts.finder.getTr(_9ea,_9eb.data[opts.idField],"body",_9f1); +var _9f2=tr.closest("table.datagrid-btable"); +tr=tr.parent().children(); +var dest=opts.finder.getTr(_9ea,ref,"body",_9f1); +if(_9eb.before){ +tr.insertBefore(dest); +}else{ +var sub=dest.next("tr.treegrid-tr-tree"); +tr.insertAfter(sub.length?sub:dest); +} +_9f2.remove(); +}; +}; +function _9f3(_9f4,_9f5){ +var _9f6=$.data(_9f4,"treegrid"); +var opts=_9f6.options; +var prow=_99e(_9f4,_9f5); +$(_9f4).datagrid("deleteRow",_9f5); +$.easyui.removeArrayItem(_9f6.checkedRows,opts.idField,_9f5); +_984(_9f4); +if(prow){ +_9a0(_9f4,prow[opts.idField]); +} +_9f6.total-=1; +$(_9f4).datagrid("getPager").pagination("refresh",{total:_9f6.total}); +$(_9f4).treegrid("showLines"); +}; +function _9f7(_9f8){ +var t=$(_9f8); +var opts=t.treegrid("options"); +if(opts.lines){ +t.treegrid("getPanel").addClass("tree-lines"); +}else{ +t.treegrid("getPanel").removeClass("tree-lines"); +return; +} +t.treegrid("getPanel").find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); +t.treegrid("getPanel").find("div.datagrid-cell").removeClass("tree-node-last tree-root-first tree-root-one"); +var _9f9=t.treegrid("getRoots"); +if(_9f9.length>1){ +_9fa(_9f9[0]).addClass("tree-root-first"); +}else{ +if(_9f9.length==1){ +_9fa(_9f9[0]).addClass("tree-root-one"); +} +} +_9fb(_9f9); +_9fc(_9f9); +function _9fb(_9fd){ +$.map(_9fd,function(node){ +if(node.children&&node.children.length){ +_9fb(node.children); +}else{ +var cell=_9fa(node); +cell.find(".tree-icon").prev().addClass("tree-join"); +} +}); +if(_9fd.length){ +var cell=_9fa(_9fd[_9fd.length-1]); +cell.addClass("tree-node-last"); +cell.find(".tree-join").removeClass("tree-join").addClass("tree-joinbottom"); +} +}; +function _9fc(_9fe){ +$.map(_9fe,function(node){ +if(node.children&&node.children.length){ +_9fc(node.children); +} +}); +for(var i=0;i<_9fe.length-1;i++){ +var node=_9fe[i]; +var _9ff=t.treegrid("getLevel",node[opts.idField]); +var tr=opts.finder.getTr(_9f8,node[opts.idField]); +var cc=tr.next().find("tr.datagrid-row td[field=\""+opts.treeField+"\"] div.datagrid-cell"); +cc.find("span:eq("+(_9ff-1)+")").addClass("tree-line"); +} +}; +function _9fa(node){ +var tr=opts.finder.getTr(_9f8,node[opts.idField]); +var cell=tr.find("td[field=\""+opts.treeField+"\"] div.datagrid-cell"); +return cell; +}; +}; +$.fn.treegrid=function(_a00,_a01){ +if(typeof _a00=="string"){ +var _a02=$.fn.treegrid.methods[_a00]; +if(_a02){ +return _a02(this,_a01); +}else{ +return this.datagrid(_a00,_a01); +} +} +_a00=_a00||{}; +return this.each(function(){ +var _a03=$.data(this,"treegrid"); +if(_a03){ +$.extend(_a03.options,_a00); +}else{ +_a03=$.data(this,"treegrid",{options:$.extend({},$.fn.treegrid.defaults,$.fn.treegrid.parseOptions(this),_a00),data:[],checkedRows:[],tmpIds:[]}); +} +_96b(this); +if(_a03.options.data){ +$(this).treegrid("loadData",_a03.options.data); +} +_97b(this); +}); +}; +$.fn.treegrid.methods={options:function(jq){ +return $.data(jq[0],"treegrid").options; +},resize:function(jq,_a04){ +return jq.each(function(){ +$(this).datagrid("resize",_a04); +}); +},fixRowHeight:function(jq,_a05){ +return jq.each(function(){ +_97c(this,_a05); +}); +},loadData:function(jq,data){ +return jq.each(function(){ +_9aa(this,data.parent,data); +}); +},load:function(jq,_a06){ +return jq.each(function(){ +$(this).treegrid("options").pageNumber=1; +$(this).treegrid("getPager").pagination({pageNumber:1}); +$(this).treegrid("reload",_a06); +}); +},reload:function(jq,id){ +return jq.each(function(){ +var opts=$(this).treegrid("options"); +var _a07={}; +if(typeof id=="object"){ +_a07=id; +}else{ +_a07=$.extend({},opts.queryParams); +_a07.id=id; +} +if(_a07.id){ +var node=$(this).treegrid("find",_a07.id); +if(node.children){ +node.children.splice(0,node.children.length); +} +opts.queryParams=_a07; +var tr=opts.finder.getTr(this,_a07.id); +tr.next("tr.treegrid-tr-tree").remove(); +tr.find("span.tree-hit").removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +_9d1(this,_a07.id); +}else{ +_97b(this,null,_a07); +} +}); +},reloadFooter:function(jq,_a08){ +return jq.each(function(){ +var opts=$.data(this,"treegrid").options; +var dc=$.data(this,"datagrid").dc; +if(_a08){ +$.data(this,"treegrid").footer=_a08; +} +if(opts.showFooter){ +opts.view.renderFooter.call(opts.view,this,dc.footer1,true); +opts.view.renderFooter.call(opts.view,this,dc.footer2,false); +if(opts.view.onAfterRender){ +opts.view.onAfterRender.call(opts.view,this); +} +$(this).treegrid("fixRowHeight"); +} +}); +},getData:function(jq){ +return $.data(jq[0],"treegrid").data; +},getFooterRows:function(jq){ +return $.data(jq[0],"treegrid").footer; +},getRoot:function(jq){ +return _9bc(jq[0]); +},getRoots:function(jq){ +return _9bf(jq[0]); +},getParent:function(jq,id){ +return _99e(jq[0],id); +},getChildren:function(jq,id){ +return _980(jq[0],id); +},getLevel:function(jq,id){ +return _9c7(jq[0],id); +},find:function(jq,id){ +return find(jq[0],id); +},isLeaf:function(jq,id){ +var opts=$.data(jq[0],"treegrid").options; +var tr=opts.finder.getTr(jq[0],id); +var hit=tr.find("span.tree-hit"); +return hit.length==0; +},select:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("selectRow",id); +}); +},unselect:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("unselectRow",id); +}); +},collapse:function(jq,id){ +return jq.each(function(){ +_9ce(this,id); +}); +},expand:function(jq,id){ +return jq.each(function(){ +_9d1(this,id); +}); +},toggle:function(jq,id){ +return jq.each(function(){ +_98c(this,id); +}); +},collapseAll:function(jq,id){ +return jq.each(function(){ +_9d9(this,id); +}); +},expandAll:function(jq,id){ +return jq.each(function(){ +_9dd(this,id); +}); +},expandTo:function(jq,id){ +return jq.each(function(){ +_9e1(this,id); +}); +},append:function(jq,_a09){ +return jq.each(function(){ +_9e4(this,_a09); +}); +},insert:function(jq,_a0a){ +return jq.each(function(){ +_9e9(this,_a0a); +}); +},remove:function(jq,id){ +return jq.each(function(){ +_9f3(this,id); +}); +},pop:function(jq,id){ +var row=jq.treegrid("find",id); +jq.treegrid("remove",id); +return row; +},refresh:function(jq,id){ +return jq.each(function(){ +var opts=$.data(this,"treegrid").options; +opts.view.refreshRow.call(opts.view,this,id); +}); +},update:function(jq,_a0b){ +return jq.each(function(){ +var opts=$.data(this,"treegrid").options; +var row=_a0b.row; +opts.view.updateRow.call(opts.view,this,_a0b.id,row); +if(row.checked!=undefined){ +row=find(this,_a0b.id); +$.extend(row,{checkState:row.checked?"checked":(row.checked===false?"unchecked":undefined)}); +_9a0(this,_a0b.id); +} +}); +},beginEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("beginEdit",id); +$(this).treegrid("fixRowHeight",id); +}); +},endEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("endEdit",id); +}); +},cancelEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("cancelEdit",id); +}); +},showLines:function(jq){ +return jq.each(function(){ +_9f7(this); +}); +},setSelectionState:function(jq){ +return jq.each(function(){ +$(this).datagrid("setSelectionState"); +var _a0c=$(this).data("treegrid"); +for(var i=0;i<_a0c.tmpIds.length;i++){ +_98d(this,_a0c.tmpIds[i],true,true); +} +_a0c.tmpIds=[]; +}); +},getCheckedNodes:function(jq,_a0d){ +_a0d=_a0d||"checked"; +var rows=[]; +$.easyui.forEach(jq.data("treegrid").checkedRows,false,function(row){ +if(row.checkState==_a0d){ +rows.push(row); +} +}); +return rows; +},checkNode:function(jq,id){ +return jq.each(function(){ +_98d(this,id,true); +}); +},uncheckNode:function(jq,id){ +return jq.each(function(){ +_98d(this,id,false); +}); +},clearChecked:function(jq){ +return jq.each(function(){ +var _a0e=this; +var opts=$(_a0e).treegrid("options"); +$(_a0e).datagrid("clearChecked"); +$.map($(_a0e).treegrid("getCheckedNodes"),function(row){ +_98d(_a0e,row[opts.idField],false,true); +}); +}); +}}; +$.fn.treegrid.parseOptions=function(_a0f){ +return $.extend({},$.fn.datagrid.parseOptions(_a0f),$.parser.parseOptions(_a0f,["treeField",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean"}])); +}; +var _a10=$.extend({},$.fn.datagrid.defaults.view,{render:function(_a11,_a12,_a13){ +var opts=$.data(_a11,"treegrid").options; +var _a14=$(_a11).datagrid("getColumnFields",_a13); +var _a15=$.data(_a11,"datagrid").rowIdPrefix; +if(_a13){ +if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){ +return; +} +} +var view=this; +if(this.treeNodes&&this.treeNodes.length){ +var _a16=_a17.call(this,_a13,this.treeLevel,this.treeNodes); +$(_a12).append(_a16.join("")); +} +function _a17(_a18,_a19,_a1a){ +var _a1b=$(_a11).treegrid("getParent",_a1a[0][opts.idField]); +var _a1c=(_a1b?_a1b.children.length:$(_a11).treegrid("getRoots").length)-_a1a.length; +var _a1d=[""]; +for(var i=0;i<_a1a.length;i++){ +var row=_a1a[i]; +if(row.state!="open"&&row.state!="closed"){ +row.state="open"; +} +var css=opts.rowStyler?opts.rowStyler.call(_a11,row):""; +var cs=this.getStyleValue(css); +var cls="class=\"datagrid-row "+(_a1c++%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c+"\""; +var _a1e=cs.s?"style=\""+cs.s+"\"":""; +var _a1f=_a15+"-"+(_a18?1:2)+"-"+row[opts.idField]; +_a1d.push(""); +_a1d=_a1d.concat(view.renderRow.call(view,_a11,_a14,_a18,_a19,row)); +_a1d.push(""); +if(row.children&&row.children.length){ +var tt=_a17.call(this,_a18,_a19+1,row.children); +var v=row.state=="closed"?"none":"block"; +_a1d.push(""); +} +} +_a1d.push("
                                            "); +_a1d=_a1d.concat(tt); +_a1d.push("
                                            "); +return _a1d; +}; +},renderFooter:function(_a20,_a21,_a22){ +var opts=$.data(_a20,"treegrid").options; +var rows=$.data(_a20,"treegrid").footer||[]; +var _a23=$(_a20).datagrid("getColumnFields",_a22); +var _a24=[""]; +for(var i=0;i"); +_a24.push(this.renderRow.call(this,_a20,_a23,_a22,0,row)); +_a24.push(""); +} +_a24.push("
                                            "); +$(_a21).html(_a24.join("")); +},renderRow:function(_a25,_a26,_a27,_a28,row){ +var _a29=$.data(_a25,"treegrid"); +var opts=_a29.options; +var cc=[]; +if(_a27&&opts.rownumbers){ +cc.push("
                                            0
                                            "); +} +for(var i=0;i<_a26.length;i++){ +var _a2a=_a26[i]; +var col=$(_a25).datagrid("getColumnOption",_a2a); +if(col){ +var css=col.styler?(col.styler(row[_a2a],row)||""):""; +var cs=this.getStyleValue(css); +var cls=cs.c?"class=\""+cs.c+"\"":""; +var _a2b=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); +cc.push(""); +var _a2b=""; +if(!col.checkbox){ +if(col.align){ +_a2b+="text-align:"+col.align+";"; +} +if(!opts.nowrap){ +_a2b+="white-space:normal;height:auto;"; +}else{ +if(opts.autoRowHeight){ +_a2b+="height:auto;"; +} +} +} +cc.push("
                                            "); +if(col.checkbox){ +if(row.checked){ +cc.push(""); +}else{ +var val=null; +if(col.formatter){ +val=col.formatter(row[_a2a],row); +}else{ +val=row[_a2a]; +} +if(_a2a==opts.treeField){ +for(var j=0;j<_a28;j++){ +cc.push(""); +} +if(row.state=="closed"){ +cc.push(""); +cc.push(""); +}else{ +if(row.children&&row.children.length){ +cc.push(""); +cc.push(""); +}else{ +cc.push(""); +cc.push(""); +} +} +if(this.hasCheckbox(_a25,row)){ +var flag=0; +var crow=$.easyui.getArrayItem(_a29.checkedRows,opts.idField,row[opts.idField]); +if(crow){ +flag=crow.checkState=="checked"?1:2; +row.checkState=crow.checkState; +row.checked=crow.checked; +$.easyui.addArrayItem(_a29.checkedRows,opts.idField,row); +}else{ +var prow=$.easyui.getArrayItem(_a29.checkedRows,opts.idField,row._parentId); +if(prow&&prow.checkState=="checked"&&opts.cascadeCheck){ +flag=1; +row.checked=true; +$.easyui.addArrayItem(_a29.checkedRows,opts.idField,row); +}else{ +if(row.checked){ +$.easyui.addArrayItem(_a29.tmpIds,row[opts.idField]); +} +} +row.checkState=flag?"checked":"unchecked"; +} +cc.push(""); +}else{ +row.checkState=undefined; +row.checked=undefined; +} +cc.push(""+val+""); +}else{ +cc.push(val); +} +} +cc.push("
                                            "); +cc.push(""); +} +} +return cc.join(""); +},hasCheckbox:function(_a2c,row){ +var opts=$.data(_a2c,"treegrid").options; +if(opts.checkbox){ +if($.isFunction(opts.checkbox)){ +if(opts.checkbox.call(_a2c,row)){ +return true; +}else{ +return false; +} +}else{ +if(opts.onlyLeafCheck){ +if(row.state=="open"&&!(row.children&&row.children.length)){ +return true; +} +}else{ +return true; +} +} +} +return false; +},refreshRow:function(_a2d,id){ +this.updateRow.call(this,_a2d,id,{}); +},updateRow:function(_a2e,id,row){ +var opts=$.data(_a2e,"treegrid").options; +var _a2f=$(_a2e).treegrid("find",id); +$.extend(_a2f,row); +var _a30=$(_a2e).treegrid("getLevel",id)-1; +var _a31=opts.rowStyler?opts.rowStyler.call(_a2e,_a2f):""; +var _a32=$.data(_a2e,"datagrid").rowIdPrefix; +var _a33=_a2f[opts.idField]; +function _a34(_a35){ +var _a36=$(_a2e).treegrid("getColumnFields",_a35); +var tr=opts.finder.getTr(_a2e,id,"body",(_a35?1:2)); +var _a37=tr.find("div.datagrid-cell-rownumber").html(); +var _a38=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); +tr.html(this.renderRow(_a2e,_a36,_a35,_a30,_a2f)); +tr.attr("style",_a31||""); +tr.find("div.datagrid-cell-rownumber").html(_a37); +if(_a38){ +tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); +} +if(_a33!=id){ +tr.attr("id",_a32+"-"+(_a35?1:2)+"-"+_a33); +tr.attr("node-id",_a33); +} +}; +_a34.call(this,true); +_a34.call(this,false); +$(_a2e).treegrid("fixRowHeight",id); +},deleteRow:function(_a39,id){ +var opts=$.data(_a39,"treegrid").options; +var tr=opts.finder.getTr(_a39,id); +tr.next("tr.treegrid-tr-tree").remove(); +tr.remove(); +var _a3a=del(id); +if(_a3a){ +if(_a3a.children.length==0){ +tr=opts.finder.getTr(_a39,_a3a[opts.idField]); +tr.next("tr.treegrid-tr-tree").remove(); +var cell=tr.children("td[field=\""+opts.treeField+"\"]").children("div.datagrid-cell"); +cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); +cell.find(".tree-hit").remove(); +$("").prependTo(cell); +} +} +this.setEmptyMsg(_a39); +function del(id){ +var cc; +var _a3b=$(_a39).treegrid("getParent",id); +if(_a3b){ +cc=_a3b.children; +}else{ +cc=$(_a39).treegrid("getData"); +} +for(var i=0;ib?1:-1); +}; +r=_a46(r1[sn],r2[sn])*(so=="asc"?1:-1); +if(r!=0){ +return r; +} +} +return r; +}); +for(var i=0;i"); +if(!_a69){ +_a6c.push(""); +_a6c.push(opts.groupFormatter.call(_a66,_a68.value,_a68.rows)); +_a6c.push(""); +} +_a6c.push("
                                            "); +_a6c.push(this.renderTable(_a66,_a68.startIndex,_a68.rows,_a69)); +return _a6c.join(""); +},groupRows:function(_a6d,rows){ +var _a6e=$.data(_a6d,"datagrid"); +var opts=_a6e.options; +var _a6f=[]; +for(var i=0;idiv.combo-p>div.combo-panel:visible").panel("close"); +}); +}); +function _a7f(_a80){ +var _a81=$.data(_a80,"combo"); +var opts=_a81.options; +if(!_a81.panel){ +_a81.panel=$("
                                            ").appendTo("body"); +_a81.panel.panel({minWidth:opts.panelMinWidth,maxWidth:opts.panelMaxWidth,minHeight:opts.panelMinHeight,maxHeight:opts.panelMaxHeight,doSize:false,closed:true,cls:"combo-p",style:{position:"absolute",zIndex:10},onOpen:function(){ +var _a82=$(this).panel("options").comboTarget; +var _a83=$.data(_a82,"combo"); +if(_a83){ +_a83.options.onShowPanel.call(_a82); +} +},onBeforeClose:function(){ +_a7e($(this).parent()); +},onClose:function(){ +var _a84=$(this).panel("options").comboTarget; +var _a85=$(_a84).data("combo"); +if(_a85){ +_a85.options.onHidePanel.call(_a84); +} +}}); +} +var _a86=$.extend(true,[],opts.icons); +if(opts.hasDownArrow){ +_a86.push({iconCls:"combo-arrow",handler:function(e){ +_a8b(e.data.target); +}}); +} +$(_a80).addClass("combo-f").textbox($.extend({},opts,{icons:_a86,onChange:function(){ +}})); +$(_a80).attr("comboName",$(_a80).attr("textboxName")); +_a81.combo=$(_a80).next(); +_a81.combo.addClass("combo"); +_a81.panel.unbind(".combo"); +for(var _a87 in opts.panelEvents){ +_a81.panel.bind(_a87+".combo",{target:_a80},opts.panelEvents[_a87]); +} +}; +function _a88(_a89){ +var _a8a=$.data(_a89,"combo"); +var opts=_a8a.options; +var p=_a8a.panel; +if(p.is(":visible")){ +p.panel("close"); +} +if(!opts.cloned){ +p.panel("destroy"); +} +$(_a89).textbox("destroy"); +}; +function _a8b(_a8c){ +var _a8d=$.data(_a8c,"combo").panel; +if(_a8d.is(":visible")){ +var _a8e=_a8d.combo("combo"); +_a8f(_a8e); +if(_a8e!=_a8c){ +$(_a8c).combo("showPanel"); +} +}else{ +var p=$(_a8c).closest("div.combo-p").children(".combo-panel"); +$("div.combo-panel:visible").not(_a8d).not(p).panel("close"); +$(_a8c).combo("showPanel"); +} +$(_a8c).combo("textbox").focus(); +}; +function _a7e(_a90){ +$(_a90).find(".combo-f").each(function(){ +var p=$(this).combo("panel"); +if(p.is(":visible")){ +p.panel("close"); +} +}); +}; +function _a91(e){ +var _a92=e.data.target; +var _a93=$.data(_a92,"combo"); +var opts=_a93.options; +if(!opts.editable){ +_a8b(_a92); +}else{ +var p=$(_a92).closest("div.combo-p").children(".combo-panel"); +$("div.combo-panel:visible").not(p).each(function(){ +var _a94=$(this).combo("combo"); +if(_a94!=_a92){ +_a8f(_a94); +} +}); +} +}; +function _a95(e){ +var _a96=e.data.target; +var t=$(_a96); +var _a97=t.data("combo"); +var opts=t.combo("options"); +_a97.panel.panel("options").comboTarget=_a96; +switch(e.keyCode){ +case 38: +opts.keyHandler.up.call(_a96,e); +break; +case 40: +opts.keyHandler.down.call(_a96,e); +break; +case 37: +opts.keyHandler.left.call(_a96,e); +break; +case 39: +opts.keyHandler.right.call(_a96,e); +break; +case 13: +e.preventDefault(); +opts.keyHandler.enter.call(_a96,e); +return false; +case 9: +case 27: +_a8f(_a96); +break; +default: +if(opts.editable){ +if(_a97.timer){ +clearTimeout(_a97.timer); +} +_a97.timer=setTimeout(function(){ +var q=t.combo("getText"); +if(_a97.previousText!=q){ +_a97.previousText=q; +t.combo("showPanel"); +opts.keyHandler.query.call(_a96,q,e); +t.combo("validate"); +} +},opts.delay); +} +} +}; +function _a98(e){ +var _a99=e.data.target; +var _a9a=$(_a99).data("combo"); +if(_a9a.timer){ +clearTimeout(_a9a.timer); +} +}; +function _a9b(_a9c){ +var _a9d=$.data(_a9c,"combo"); +var _a9e=_a9d.combo; +var _a9f=_a9d.panel; +var opts=$(_a9c).combo("options"); +var _aa0=_a9f.panel("options"); +_aa0.comboTarget=_a9c; +if(_aa0.closed){ +_a9f.panel("panel").show().css({zIndex:($.fn.menu?$.fn.menu.defaults.zIndex++:($.fn.window?$.fn.window.defaults.zIndex++:99)),left:-999999}); +_a9f.panel("resize",{width:(opts.panelWidth?opts.panelWidth:_a9e._outerWidth()),height:opts.panelHeight}); +_a9f.panel("panel").hide(); +_a9f.panel("open"); +} +(function(){ +if(_aa0.comboTarget==_a9c&&_a9f.is(":visible")){ +_a9f.panel("move",{left:_aa1(),top:_aa2()}); +setTimeout(arguments.callee,200); +} +})(); +function _aa1(){ +var left=_a9e.offset().left; +if(opts.panelAlign=="right"){ +left+=_a9e._outerWidth()-_a9f._outerWidth(); +} +if(left+_a9f._outerWidth()>$(window)._outerWidth()+$(document).scrollLeft()){ +left=$(window)._outerWidth()+$(document).scrollLeft()-_a9f._outerWidth(); +} +if(left<0){ +left=0; +} +return left; +}; +function _aa2(){ +var top=_a9e.offset().top+_a9e._outerHeight(); +if(top+_a9f._outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ +top=_a9e.offset().top-_a9f._outerHeight(); +} +if(top<$(document).scrollTop()){ +top=_a9e.offset().top+_a9e._outerHeight(); +} +return top; +}; +}; +function _a8f(_aa3){ +var _aa4=$.data(_aa3,"combo").panel; +_aa4.panel("close"); +}; +function _aa5(_aa6,text){ +var _aa7=$.data(_aa6,"combo"); +var _aa8=$(_aa6).textbox("getText"); +if(_aa8!=text){ +$(_aa6).textbox("setText",text); +} +_aa7.previousText=text; +}; +function _aa9(_aaa){ +var _aab=$.data(_aaa,"combo"); +var opts=_aab.options; +var _aac=$(_aaa).next(); +var _aad=[]; +_aac.find(".textbox-value").each(function(){ +_aad.push($(this).val()); +}); +if(opts.multivalue){ +return _aad; +}else{ +return _aad.length?_aad[0].split(opts.separator):_aad; +} +}; +function _aae(_aaf,_ab0){ +var _ab1=$.data(_aaf,"combo"); +var _ab2=_ab1.combo; +var opts=$(_aaf).combo("options"); +if(!$.isArray(_ab0)){ +_ab0=_ab0.split(opts.separator); +} +var _ab3=_aa9(_aaf); +_ab2.find(".textbox-value").remove(); +if(_ab0.length){ +if(opts.multivalue){ +for(var i=0;i<_ab0.length;i++){ +_ab4(_ab0[i]); +} +}else{ +_ab4(_ab0.join(opts.separator)); +} +} +function _ab4(_ab5){ +var name=$(_aaf).attr("textboxName")||""; +var _ab6=$("").appendTo(_ab2); +_ab6.attr("name",name); +if(opts.disabled){ +_ab6.attr("disabled","disabled"); +} +_ab6.val(_ab5); +}; +var _ab7=(function(){ +if(_ab3.length!=_ab0.length){ +return true; +} +for(var i=0;i<_ab0.length;i++){ +if(_ab0[i]!=_ab3[i]){ +return true; +} +} +return false; +})(); +if(_ab7){ +$(_aaf).val(_ab0.join(opts.separator)); +if(opts.multiple){ +opts.onChange.call(_aaf,_ab0,_ab3); +}else{ +opts.onChange.call(_aaf,_ab0[0],_ab3[0]); +} +$(_aaf).closest("form").trigger("_change",[_aaf]); +} +}; +function _ab8(_ab9){ +var _aba=_aa9(_ab9); +return _aba[0]; +}; +function _abb(_abc,_abd){ +_aae(_abc,[_abd]); +}; +function _abe(_abf){ +var opts=$.data(_abf,"combo").options; +var _ac0=opts.onChange; +opts.onChange=function(){ +}; +if(opts.multiple){ +_aae(_abf,opts.value?opts.value:[]); +}else{ +_abb(_abf,opts.value); +} +opts.onChange=_ac0; +}; +$.fn.combo=function(_ac1,_ac2){ +if(typeof _ac1=="string"){ +var _ac3=$.fn.combo.methods[_ac1]; +if(_ac3){ +return _ac3(this,_ac2); +}else{ +return this.textbox(_ac1,_ac2); +} +} +_ac1=_ac1||{}; +return this.each(function(){ +var _ac4=$.data(this,"combo"); +if(_ac4){ +$.extend(_ac4.options,_ac1); +if(_ac1.value!=undefined){ +_ac4.options.originalValue=_ac1.value; +} +}else{ +_ac4=$.data(this,"combo",{options:$.extend({},$.fn.combo.defaults,$.fn.combo.parseOptions(this),_ac1),previousText:""}); +if(_ac4.options.multiple&&_ac4.options.value==""){ +_ac4.options.originalValue=[]; +}else{ +_ac4.options.originalValue=_ac4.options.value; +} +} +_a7f(this); +_abe(this); +}); +}; +$.fn.combo.methods={options:function(jq){ +var opts=jq.textbox("options"); +return $.extend($.data(jq[0],"combo").options,{width:opts.width,height:opts.height,disabled:opts.disabled,readonly:opts.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).textbox("cloneFrom",from); +$.data(this,"combo",{options:$.extend(true,{cloned:true},$(from).combo("options")),combo:$(this).next(),panel:$(from).combo("panel")}); +$(this).addClass("combo-f").attr("comboName",$(this).attr("textboxName")); +}); +},combo:function(jq){ +return jq.closest(".combo-panel").panel("options").comboTarget; +},panel:function(jq){ +return $.data(jq[0],"combo").panel; +},destroy:function(jq){ +return jq.each(function(){ +_a88(this); +}); +},showPanel:function(jq){ +return jq.each(function(){ +_a9b(this); +}); +},hidePanel:function(jq){ +return jq.each(function(){ +_a8f(this); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("setText",""); +var opts=$.data(this,"combo").options; +if(opts.multiple){ +$(this).combo("setValues",[]); +}else{ +$(this).combo("setValue",""); +} +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$.data(this,"combo").options; +if(opts.multiple){ +$(this).combo("setValues",opts.originalValue); +}else{ +$(this).combo("setValue",opts.originalValue); +} +}); +},setText:function(jq,text){ +return jq.each(function(){ +_aa5(this,text); +}); +},getValues:function(jq){ +return _aa9(jq[0]); +},setValues:function(jq,_ac5){ +return jq.each(function(){ +_aae(this,_ac5); +}); +},getValue:function(jq){ +return _ab8(jq[0]); +},setValue:function(jq,_ac6){ +return jq.each(function(){ +_abb(this,_ac6); +}); +}}; +$.fn.combo.parseOptions=function(_ac7){ +var t=$(_ac7); +return $.extend({},$.fn.textbox.parseOptions(_ac7),$.parser.parseOptions(_ac7,["separator","panelAlign",{panelWidth:"number",hasDownArrow:"boolean",delay:"number",reversed:"boolean",multivalue:"boolean",selectOnNavigation:"boolean"},{panelMinWidth:"number",panelMaxWidth:"number",panelMinHeight:"number",panelMaxHeight:"number"}]),{panelHeight:(t.attr("panelHeight")=="auto"?"auto":parseInt(t.attr("panelHeight"))||undefined),multiple:(t.attr("multiple")?true:undefined)}); +}; +$.fn.combo.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{click:_a91,keydown:_a95,paste:_a95,drop:_a95,blur:_a98},panelEvents:{mousedown:function(e){ +e.preventDefault(); +e.stopPropagation(); +}},panelWidth:null,panelHeight:300,panelMinWidth:null,panelMaxWidth:null,panelMinHeight:null,panelMaxHeight:null,panelAlign:"left",reversed:false,multiple:false,multivalue:true,selectOnNavigation:true,separator:",",hasDownArrow:true,delay:200,keyHandler:{up:function(e){ +},down:function(e){ +},left:function(e){ +},right:function(e){ +},enter:function(e){ +},query:function(q,e){ +}},onShowPanel:function(){ +},onHidePanel:function(){ +},onChange:function(_ac8,_ac9){ +}}); +})(jQuery); +(function($){ +function _aca(_acb,_acc){ +var _acd=$.data(_acb,"combobox"); +return $.easyui.indexOfArray(_acd.data,_acd.options.valueField,_acc); +}; +function _ace(_acf,_ad0){ +var opts=$.data(_acf,"combobox").options; +var _ad1=$(_acf).combo("panel"); +var item=opts.finder.getEl(_acf,_ad0); +if(item.length){ +if(item.position().top<=0){ +var h=_ad1.scrollTop()+item.position().top; +_ad1.scrollTop(h); +}else{ +if(item.position().top+item.outerHeight()>_ad1.height()){ +var h=_ad1.scrollTop()+item.position().top+item.outerHeight()-_ad1.height(); +_ad1.scrollTop(h); +} +} +} +_ad1.triggerHandler("scroll"); +}; +function nav(_ad2,dir){ +var opts=$.data(_ad2,"combobox").options; +var _ad3=$(_ad2).combobox("panel"); +var item=_ad3.children("div.combobox-item-hover"); +if(!item.length){ +item=_ad3.children("div.combobox-item-selected"); +} +item.removeClass("combobox-item-hover"); +var _ad4="div.combobox-item:visible:not(.combobox-item-disabled):first"; +var _ad5="div.combobox-item:visible:not(.combobox-item-disabled):last"; +if(!item.length){ +item=_ad3.children(dir=="next"?_ad4:_ad5); +}else{ +if(dir=="next"){ +item=item.nextAll(_ad4); +if(!item.length){ +item=_ad3.children(_ad4); +} +}else{ +item=item.prevAll(_ad4); +if(!item.length){ +item=_ad3.children(_ad5); +} +} +} +if(item.length){ +item.addClass("combobox-item-hover"); +var row=opts.finder.getRow(_ad2,item); +if(row){ +$(_ad2).combobox("scrollTo",row[opts.valueField]); +if(opts.selectOnNavigation){ +_ad6(_ad2,row[opts.valueField]); +} +} +} +}; +function _ad6(_ad7,_ad8,_ad9){ +var opts=$.data(_ad7,"combobox").options; +var _ada=$(_ad7).combo("getValues"); +if($.inArray(_ad8+"",_ada)==-1){ +if(opts.multiple){ +_ada.push(_ad8); +}else{ +_ada=[_ad8]; +} +_adb(_ad7,_ada,_ad9); +} +}; +function _adc(_add,_ade){ +var opts=$.data(_add,"combobox").options; +var _adf=$(_add).combo("getValues"); +var _ae0=$.inArray(_ade+"",_adf); +if(_ae0>=0){ +_adf.splice(_ae0,1); +_adb(_add,_adf); +} +}; +function _adb(_ae1,_ae2,_ae3){ +var opts=$.data(_ae1,"combobox").options; +var _ae4=$(_ae1).combo("panel"); +if(!$.isArray(_ae2)){ +_ae2=_ae2.split(opts.separator); +} +if(!opts.multiple){ +_ae2=_ae2.length?[_ae2[0]]:[""]; +} +var _ae5=$(_ae1).combo("getValues"); +if(_ae4.is(":visible")){ +_ae4.find(".combobox-item-selected").each(function(){ +var row=opts.finder.getRow(_ae1,$(this)); +if(row){ +if($.easyui.indexOfArray(_ae5,row[opts.valueField])==-1){ +$(this).removeClass("combobox-item-selected"); +} +} +}); +} +$.map(_ae5,function(v){ +if($.easyui.indexOfArray(_ae2,v)==-1){ +var el=opts.finder.getEl(_ae1,v); +if(el.hasClass("combobox-item-selected")){ +el.removeClass("combobox-item-selected"); +opts.onUnselect.call(_ae1,opts.finder.getRow(_ae1,v)); +} +} +}); +var _ae6=null; +var vv=[],ss=[]; +for(var i=0;i<_ae2.length;i++){ +var v=_ae2[i]; +var s=v; +var row=opts.finder.getRow(_ae1,v); +if(row){ +s=row[opts.textField]; +_ae6=row; +var el=opts.finder.getEl(_ae1,v); +if(!el.hasClass("combobox-item-selected")){ +el.addClass("combobox-item-selected"); +opts.onSelect.call(_ae1,row); +} +}else{ +s=_ae7(v,opts.mappingRows)||v; +} +vv.push(v); +ss.push(s); +} +if(!_ae3){ +$(_ae1).combo("setText",ss.join(opts.separator)); +} +if(opts.showItemIcon){ +var tb=$(_ae1).combobox("textbox"); +tb.removeClass("textbox-bgicon "+opts.textboxIconCls); +if(_ae6&&_ae6.iconCls){ +tb.addClass("textbox-bgicon "+_ae6.iconCls); +opts.textboxIconCls=_ae6.iconCls; +} +} +$(_ae1).combo("setValues",vv); +_ae4.triggerHandler("scroll"); +function _ae7(_ae8,a){ +var item=$.easyui.getArrayItem(a,opts.valueField,_ae8); +return item?item[opts.textField]:undefined; +}; +}; +function _ae9(_aea,data,_aeb){ +var _aec=$.data(_aea,"combobox"); +var opts=_aec.options; +_aec.data=opts.loadFilter.call(_aea,data); +opts.view.render.call(opts.view,_aea,$(_aea).combo("panel"),_aec.data); +var vv=$(_aea).combobox("getValues"); +$.easyui.forEach(_aec.data,false,function(row){ +if(row["selected"]){ +$.easyui.addArrayItem(vv,row[opts.valueField]+""); +} +}); +if(opts.multiple){ +_adb(_aea,vv,_aeb); +}else{ +_adb(_aea,vv.length?[vv[vv.length-1]]:[],_aeb); +} +opts.onLoadSuccess.call(_aea,data); +}; +function _aed(_aee,url,_aef,_af0){ +var opts=$.data(_aee,"combobox").options; +if(url){ +opts.url=url; +} +_aef=$.extend({},opts.queryParams,_aef||{}); +if(opts.onBeforeLoad.call(_aee,_aef)==false){ +return; +} +opts.loader.call(_aee,_aef,function(data){ +_ae9(_aee,data,_af0); +},function(){ +opts.onLoadError.apply(this,arguments); +}); +}; +function _af1(_af2,q){ +var _af3=$.data(_af2,"combobox"); +var opts=_af3.options; +var _af4=$(); +var qq=opts.multiple?q.split(opts.separator):[q]; +if(opts.mode=="remote"){ +_af5(qq); +_aed(_af2,null,{q:q},true); +}else{ +var _af6=$(_af2).combo("panel"); +_af6.find(".combobox-item-hover").removeClass("combobox-item-hover"); +_af6.find(".combobox-item,.combobox-group").hide(); +var data=_af3.data; +var vv=[]; +$.map(qq,function(q){ +q=$.trim(q); +var _af7=q; +var _af8=undefined; +_af4=$(); +for(var i=0;i=0){ +vv.push(v); +} +}); +t.combobox("setValues",vv); +if(!opts.multiple){ +t.combobox("hidePanel"); +} +}; +function _afd(_afe){ +var _aff=$.data(_afe,"combobox"); +var opts=_aff.options; +$(_afe).addClass("combobox-f"); +$(_afe).combo($.extend({},opts,{onShowPanel:function(){ +$(this).combo("panel").find("div.combobox-item:hidden,div.combobox-group:hidden").show(); +_adb(this,$(this).combobox("getValues"),true); +$(this).combobox("scrollTo",$(this).combobox("getValue")); +opts.onShowPanel.call(this); +}})); +}; +function _b00(e){ +$(this).children("div.combobox-item-hover").removeClass("combobox-item-hover"); +var item=$(e.target).closest("div.combobox-item"); +if(!item.hasClass("combobox-item-disabled")){ +item.addClass("combobox-item-hover"); +} +e.stopPropagation(); +}; +function _b01(e){ +$(e.target).closest("div.combobox-item").removeClass("combobox-item-hover"); +e.stopPropagation(); +}; +function _b02(e){ +var _b03=$(this).panel("options").comboTarget; +if(!_b03){ +return; +} +var opts=$(_b03).combobox("options"); +var item=$(e.target).closest("div.combobox-item"); +if(!item.length||item.hasClass("combobox-item-disabled")){ +return; +} +var row=opts.finder.getRow(_b03,item); +if(!row){ +return; +} +if(opts.blurTimer){ +clearTimeout(opts.blurTimer); +opts.blurTimer=null; +} +opts.onClick.call(_b03,row); +var _b04=row[opts.valueField]; +if(opts.multiple){ +if(item.hasClass("combobox-item-selected")){ +_adc(_b03,_b04); +}else{ +_ad6(_b03,_b04); +} +}else{ +$(_b03).combobox("setValue",_b04).combobox("hidePanel"); +} +e.stopPropagation(); +}; +function _b05(e){ +var _b06=$(this).panel("options").comboTarget; +if(!_b06){ +return; +} +var opts=$(_b06).combobox("options"); +if(opts.groupPosition=="sticky"){ +var _b07=$(this).children(".combobox-stick"); +if(!_b07.length){ +_b07=$("
                                            ").appendTo(this); +} +_b07.hide(); +var _b08=$(_b06).data("combobox"); +$(this).children(".combobox-group:visible").each(function(){ +var g=$(this); +var _b09=opts.finder.getGroup(_b06,g); +var _b0a=_b08.data[_b09.startIndex+_b09.count-1]; +var last=opts.finder.getEl(_b06,_b0a[opts.valueField]); +if(g.position().top<0&&last.position().top>0){ +_b07.show().html(g.html()); +return false; +} +}); +} +}; +$.fn.combobox=function(_b0b,_b0c){ +if(typeof _b0b=="string"){ +var _b0d=$.fn.combobox.methods[_b0b]; +if(_b0d){ +return _b0d(this,_b0c); +}else{ +return this.combo(_b0b,_b0c); +} +} +_b0b=_b0b||{}; +return this.each(function(){ +var _b0e=$.data(this,"combobox"); +if(_b0e){ +$.extend(_b0e.options,_b0b); +}else{ +_b0e=$.data(this,"combobox",{options:$.extend({},$.fn.combobox.defaults,$.fn.combobox.parseOptions(this),_b0b),data:[]}); +} +_afd(this); +if(_b0e.options.data){ +_ae9(this,_b0e.options.data); +}else{ +var data=$.fn.combobox.parseData(this); +if(data.length){ +_ae9(this,data); +} +} +_aed(this); +}); +}; +$.fn.combobox.methods={options:function(jq){ +var _b0f=jq.combo("options"); +return $.extend($.data(jq[0],"combobox").options,{width:_b0f.width,height:_b0f.height,originalValue:_b0f.originalValue,disabled:_b0f.disabled,readonly:_b0f.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).combo("cloneFrom",from); +$.data(this,"combobox",$(from).data("combobox")); +$(this).addClass("combobox-f").attr("comboboxName",$(this).attr("textboxName")); +}); +},getData:function(jq){ +return $.data(jq[0],"combobox").data; +},setValues:function(jq,_b10){ +return jq.each(function(){ +var opts=$(this).combobox("options"); +if($.isArray(_b10)){ +_b10=$.map(_b10,function(_b11){ +if(_b11&&typeof _b11=="object"){ +$.easyui.addArrayItem(opts.mappingRows,opts.valueField,_b11); +return _b11[opts.valueField]; +}else{ +return _b11; +} +}); +} +_adb(this,_b10); +}); +},setValue:function(jq,_b12){ +return jq.each(function(){ +$(this).combobox("setValues",$.isArray(_b12)?_b12:[_b12]); +}); +},clear:function(jq){ +return jq.each(function(){ +_adb(this,[]); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).combobox("options"); +if(opts.multiple){ +$(this).combobox("setValues",opts.originalValue); +}else{ +$(this).combobox("setValue",opts.originalValue); +} +}); +},loadData:function(jq,data){ +return jq.each(function(){ +_ae9(this,data); +}); +},reload:function(jq,url){ +return jq.each(function(){ +if(typeof url=="string"){ +_aed(this,url); +}else{ +if(url){ +var opts=$(this).combobox("options"); +opts.queryParams=url; +} +_aed(this); +} +}); +},select:function(jq,_b13){ +return jq.each(function(){ +_ad6(this,_b13); +}); +},unselect:function(jq,_b14){ +return jq.each(function(){ +_adc(this,_b14); +}); +},scrollTo:function(jq,_b15){ +return jq.each(function(){ +_ace(this,_b15); +}); +}}; +$.fn.combobox.parseOptions=function(_b16){ +var t=$(_b16); +return $.extend({},$.fn.combo.parseOptions(_b16),$.parser.parseOptions(_b16,["valueField","textField","groupField","groupPosition","mode","method","url",{showItemIcon:"boolean",limitToList:"boolean"}])); +}; +$.fn.combobox.parseData=function(_b17){ +var data=[]; +var opts=$(_b17).combobox("options"); +$(_b17).children().each(function(){ +if(this.tagName.toLowerCase()=="optgroup"){ +var _b18=$(this).attr("label"); +$(this).children().each(function(){ +_b19(this,_b18); +}); +}else{ +_b19(this); +} +}); +return data; +function _b19(el,_b1a){ +var t=$(el); +var row={}; +row[opts.valueField]=t.attr("value")!=undefined?t.attr("value"):t.text(); +row[opts.textField]=t.text(); +row["iconCls"]=$.parser.parseOptions(el,["iconCls"]).iconCls; +row["selected"]=t.is(":selected"); +row["disabled"]=t.is(":disabled"); +if(_b1a){ +opts.groupField=opts.groupField||"group"; +row[opts.groupField]=_b1a; +} +data.push(row); +}; +}; +var _b1b=0; +var _b1c={render:function(_b1d,_b1e,data){ +var _b1f=$.data(_b1d,"combobox"); +var opts=_b1f.options; +_b1b++; +_b1f.itemIdPrefix="_easyui_combobox_i"+_b1b; +_b1f.groupIdPrefix="_easyui_combobox_g"+_b1b; +_b1f.groups=[]; +var dd=[]; +var _b20=undefined; +for(var i=0;i"); +dd.push(opts.groupFormatter?opts.groupFormatter.call(_b1d,g):g); +dd.push("
                                            "); +}else{ +_b1f.groups[_b1f.groups.length-1].count++; +} +}else{ +_b20=undefined; +} +var cls="combobox-item"+(row.disabled?" combobox-item-disabled":"")+(g?" combobox-gitem":""); +dd.push("
                                            "); +if(opts.showItemIcon&&row.iconCls){ +dd.push(""); +} +dd.push(opts.formatter?opts.formatter.call(_b1d,row):s); +dd.push("
                                            "); +} +$(_b1e).html(dd.join("")); +}}; +$.fn.combobox.defaults=$.extend({},$.fn.combo.defaults,{valueField:"value",textField:"text",groupPosition:"static",groupField:null,groupFormatter:function(_b21){ +return _b21; +},mode:"local",method:"post",url:null,data:null,queryParams:{},showItemIcon:false,limitToList:false,unselectedValues:[],mappingRows:[],view:_b1c,keyHandler:{up:function(e){ +nav(this,"prev"); +e.preventDefault(); +},down:function(e){ +nav(this,"next"); +e.preventDefault(); +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_af9(this); +},query:function(q,e){ +_af1(this,q); +}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ +$.fn.combo.defaults.inputEvents.blur(e); +var _b22=e.data.target; +var opts=$(_b22).combobox("options"); +if(opts.reversed||opts.limitToList){ +if(opts.blurTimer){ +clearTimeout(opts.blurTimer); +} +opts.blurTimer=setTimeout(function(){ +var _b23=$(_b22).parent().length; +if(_b23){ +if(opts.reversed){ +$(_b22).combobox("setValues",$(_b22).combobox("getValues")); +}else{ +if(opts.limitToList){ +var vv=[]; +$.map($(_b22).combobox("getValues"),function(v){ +var _b24=$.easyui.indexOfArray($(_b22).combobox("getData"),opts.valueField,v); +if(_b24>=0){ +vv.push(v); +} +}); +$(_b22).combobox("setValues",vv); +} +} +opts.blurTimer=null; +} +},50); +} +}}),panelEvents:{mouseover:_b00,mouseout:_b01,mousedown:function(e){ +e.preventDefault(); +e.stopPropagation(); +},click:_b02,scroll:_b05},filter:function(q,row){ +var opts=$(this).combobox("options"); +return row[opts.textField].toLowerCase().indexOf(q.toLowerCase())>=0; +},formatter:function(row){ +var opts=$(this).combobox("options"); +return row[opts.textField]; +},loader:function(_b25,_b26,_b27){ +var opts=$(this).combobox("options"); +if(!opts.url){ +return false; +} +$.ajax({type:opts.method,url:opts.url,data:_b25,dataType:"json",success:function(data){ +_b26(data); +},error:function(){ +_b27.apply(this,arguments); +}}); +},loadFilter:function(data){ +return data; +},finder:{getEl:function(_b28,_b29){ +var _b2a=_aca(_b28,_b29); +var id=$.data(_b28,"combobox").itemIdPrefix+"_"+_b2a; +return $("#"+id); +},getGroupEl:function(_b2b,_b2c){ +var _b2d=$.data(_b2b,"combobox"); +var _b2e=$.easyui.indexOfArray(_b2d.groups,"value",_b2c); +var id=_b2d.groupIdPrefix+"_"+_b2e; +return $("#"+id); +},getGroup:function(_b2f,p){ +var _b30=$.data(_b2f,"combobox"); +var _b31=p.attr("id").substr(_b30.groupIdPrefix.length+1); +return _b30.groups[parseInt(_b31)]; +},getRow:function(_b32,p){ +var _b33=$.data(_b32,"combobox"); +var _b34=(p instanceof $)?p.attr("id").substr(_b33.itemIdPrefix.length+1):_aca(_b32,p); +return _b33.data[parseInt(_b34)]; +}},onBeforeLoad:function(_b35){ +},onLoadSuccess:function(data){ +},onLoadError:function(){ +},onSelect:function(_b36){ +},onUnselect:function(_b37){ +},onClick:function(_b38){ +}}); +})(jQuery); +(function($){ +function _b39(_b3a){ +var _b3b=$.data(_b3a,"combotree"); +var opts=_b3b.options; +var tree=_b3b.tree; +$(_b3a).addClass("combotree-f"); +$(_b3a).combo($.extend({},opts,{onShowPanel:function(){ +if(opts.editable){ +tree.tree("doFilter",""); +} +opts.onShowPanel.call(this); +}})); +var _b3c=$(_b3a).combo("panel"); +if(!tree){ +tree=$("
                                              ").appendTo(_b3c); +_b3b.tree=tree; +} +tree.tree($.extend({},opts,{checkbox:opts.multiple,onLoadSuccess:function(node,data){ +var _b3d=$(_b3a).combotree("getValues"); +if(opts.multiple){ +$.map(tree.tree("getChecked"),function(node){ +$.easyui.addArrayItem(_b3d,node.id); +}); +} +_b42(_b3a,_b3d,_b3b.remainText); +opts.onLoadSuccess.call(this,node,data); +},onClick:function(node){ +if(opts.multiple){ +$(this).tree(node.checked?"uncheck":"check",node.target); +}else{ +$(_b3a).combo("hidePanel"); +} +_b3b.remainText=false; +_b3f(_b3a); +opts.onClick.call(this,node); +},onCheck:function(node,_b3e){ +_b3b.remainText=false; +_b3f(_b3a); +opts.onCheck.call(this,node,_b3e); +}})); +}; +function _b3f(_b40){ +var _b41=$.data(_b40,"combotree"); +var opts=_b41.options; +var tree=_b41.tree; +var vv=[]; +if(opts.multiple){ +vv=$.map(tree.tree("getChecked"),function(node){ +return node.id; +}); +}else{ +var node=tree.tree("getSelected"); +if(node){ +vv.push(node.id); +} +} +vv=vv.concat(opts.unselectedValues); +_b42(_b40,vv,_b41.remainText); +}; +function _b42(_b43,_b44,_b45){ +var _b46=$.data(_b43,"combotree"); +var opts=_b46.options; +var tree=_b46.tree; +var _b47=tree.tree("options"); +var _b48=_b47.onBeforeCheck; +var _b49=_b47.onCheck; +var _b4a=_b47.onSelect; +_b47.onBeforeCheck=_b47.onCheck=_b47.onSelect=function(){ +}; +if(!$.isArray(_b44)){ +_b44=_b44.split(opts.separator); +} +if(!opts.multiple){ +_b44=_b44.length?[_b44[0]]:[""]; +} +var vv=$.map(_b44,function(_b4b){ +return String(_b4b); +}); +tree.find("div.tree-node-selected").removeClass("tree-node-selected"); +$.map(tree.tree("getChecked"),function(node){ +if($.inArray(String(node.id),vv)==-1){ +tree.tree("uncheck",node.target); +} +}); +var ss=[]; +opts.unselectedValues=[]; +$.map(vv,function(v){ +var node=tree.tree("find",v); +if(node){ +tree.tree("check",node.target).tree("select",node.target); +ss.push(_b4c(node)); +}else{ +ss.push(_b4d(v,opts.mappingRows)||v); +opts.unselectedValues.push(v); +} +}); +if(opts.multiple){ +$.map(tree.tree("getChecked"),function(node){ +var id=String(node.id); +if($.inArray(id,vv)==-1){ +vv.push(id); +ss.push(_b4c(node)); +} +}); +} +_b47.onBeforeCheck=_b48; +_b47.onCheck=_b49; +_b47.onSelect=_b4a; +if(!_b45){ +var s=ss.join(opts.separator); +if($(_b43).combo("getText")!=s){ +$(_b43).combo("setText",s); +} +} +$(_b43).combo("setValues",vv); +function _b4d(_b4e,a){ +var item=$.easyui.getArrayItem(a,"id",_b4e); +return item?_b4c(item):undefined; +}; +function _b4c(node){ +return node[opts.textField||""]||node.text; +}; +}; +function _b4f(_b50,q){ +var _b51=$.data(_b50,"combotree"); +var opts=_b51.options; +var tree=_b51.tree; +_b51.remainText=true; +tree.tree("doFilter",opts.multiple?q.split(opts.separator):q); +}; +function _b52(_b53){ +var _b54=$.data(_b53,"combotree"); +_b54.remainText=false; +$(_b53).combotree("setValues",$(_b53).combotree("getValues")); +$(_b53).combotree("hidePanel"); +}; +$.fn.combotree=function(_b55,_b56){ +if(typeof _b55=="string"){ +var _b57=$.fn.combotree.methods[_b55]; +if(_b57){ +return _b57(this,_b56); +}else{ +return this.combo(_b55,_b56); +} +} +_b55=_b55||{}; +return this.each(function(){ +var _b58=$.data(this,"combotree"); +if(_b58){ +$.extend(_b58.options,_b55); +}else{ +$.data(this,"combotree",{options:$.extend({},$.fn.combotree.defaults,$.fn.combotree.parseOptions(this),_b55)}); +} +_b39(this); +}); +}; +$.fn.combotree.methods={options:function(jq){ +var _b59=jq.combo("options"); +return $.extend($.data(jq[0],"combotree").options,{width:_b59.width,height:_b59.height,originalValue:_b59.originalValue,disabled:_b59.disabled,readonly:_b59.readonly}); +},clone:function(jq,_b5a){ +var t=jq.combo("clone",_b5a); +t.data("combotree",{options:$.extend(true,{},jq.combotree("options")),tree:jq.combotree("tree")}); +return t; +},tree:function(jq){ +return $.data(jq[0],"combotree").tree; +},loadData:function(jq,data){ +return jq.each(function(){ +var opts=$.data(this,"combotree").options; +opts.data=data; +var tree=$.data(this,"combotree").tree; +tree.tree("loadData",data); +}); +},reload:function(jq,url){ +return jq.each(function(){ +var opts=$.data(this,"combotree").options; +var tree=$.data(this,"combotree").tree; +if(url){ +opts.url=url; +} +tree.tree({url:opts.url}); +}); +},setValues:function(jq,_b5b){ +return jq.each(function(){ +var opts=$(this).combotree("options"); +if($.isArray(_b5b)){ +_b5b=$.map(_b5b,function(_b5c){ +if(_b5c&&typeof _b5c=="object"){ +$.easyui.addArrayItem(opts.mappingRows,"id",_b5c); +return _b5c.id; +}else{ +return _b5c; +} +}); +} +_b42(this,_b5b); +}); +},setValue:function(jq,_b5d){ +return jq.each(function(){ +$(this).combotree("setValues",$.isArray(_b5d)?_b5d:[_b5d]); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).combotree("setValues",[]); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).combotree("options"); +if(opts.multiple){ +$(this).combotree("setValues",opts.originalValue); +}else{ +$(this).combotree("setValue",opts.originalValue); +} +}); +}}; +$.fn.combotree.parseOptions=function(_b5e){ +return $.extend({},$.fn.combo.parseOptions(_b5e),$.fn.tree.parseOptions(_b5e)); +}; +$.fn.combotree.defaults=$.extend({},$.fn.combo.defaults,$.fn.tree.defaults,{editable:false,textField:null,unselectedValues:[],mappingRows:[],keyHandler:{up:function(e){ +},down:function(e){ +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_b52(this); +},query:function(q,e){ +_b4f(this,q); +}}}); +})(jQuery); +(function($){ +function _b5f(_b60){ +var _b61=$.data(_b60,"combogrid"); +var opts=_b61.options; +var grid=_b61.grid; +$(_b60).addClass("combogrid-f").combo($.extend({},opts,{onShowPanel:function(){ +_b78(this,$(this).combogrid("getValues"),true); +var p=$(this).combogrid("panel"); +var _b62=p.outerHeight()-p.height(); +var _b63=p._size("minHeight"); +var _b64=p._size("maxHeight"); +var dg=$(this).combogrid("grid"); +dg.datagrid("resize",{width:"100%",height:(isNaN(parseInt(opts.panelHeight))?"auto":"100%"),minHeight:(_b63?_b63-_b62:""),maxHeight:(_b64?_b64-_b62:"")}); +var row=dg.datagrid("getSelected"); +if(row){ +dg.datagrid("scrollTo",dg.datagrid("getRowIndex",row)); +} +opts.onShowPanel.call(this); +}})); +var _b65=$(_b60).combo("panel"); +if(!grid){ +grid=$("
                                              ").appendTo(_b65); +_b61.grid=grid; +} +grid.datagrid($.extend({},opts,{border:false,singleSelect:(!opts.multiple),onLoadSuccess:_b66,onClickRow:_b67,onSelect:_b68("onSelect"),onUnselect:_b68("onUnselect"),onSelectAll:_b68("onSelectAll"),onUnselectAll:_b68("onUnselectAll")})); +function _b69(dg){ +return $(dg).closest(".combo-panel").panel("options").comboTarget||_b60; +}; +function _b66(data){ +var _b6a=_b69(this); +var _b6b=$(_b6a).data("combogrid"); +var opts=_b6b.options; +var _b6c=$(_b6a).combo("getValues"); +_b78(_b6a,_b6c,_b6b.remainText); +opts.onLoadSuccess.call(this,data); +}; +function _b67(_b6d,row){ +var _b6e=_b69(this); +var _b6f=$(_b6e).data("combogrid"); +var opts=_b6f.options; +_b6f.remainText=false; +_b70.call(this); +if(!opts.multiple){ +$(_b6e).combo("hidePanel"); +} +opts.onClickRow.call(this,_b6d,row); +}; +function _b68(_b71){ +return function(_b72,row){ +var _b73=_b69(this); +var opts=$(_b73).combogrid("options"); +if(_b71=="onUnselectAll"){ +if(opts.multiple){ +_b70.call(this); +} +}else{ +_b70.call(this); +} +opts[_b71].call(this,_b72,row); +}; +}; +function _b70(){ +var dg=$(this); +var _b74=_b69(dg); +var _b75=$(_b74).data("combogrid"); +var opts=_b75.options; +var vv=$.map(dg.datagrid("getSelections"),function(row){ +return row[opts.idField]; +}); +vv=vv.concat(opts.unselectedValues); +var _b76=dg.data("datagrid").dc.body2; +var _b77=_b76.scrollTop(); +_b78(_b74,vv,_b75.remainText); +_b76.scrollTop(_b77); +}; +}; +function nav(_b79,dir){ +var _b7a=$.data(_b79,"combogrid"); +var opts=_b7a.options; +var grid=_b7a.grid; +var _b7b=grid.datagrid("getRows").length; +if(!_b7b){ +return; +} +var tr=opts.finder.getTr(grid[0],null,"highlight"); +if(!tr.length){ +tr=opts.finder.getTr(grid[0],null,"selected"); +} +var _b7c; +if(!tr.length){ +_b7c=(dir=="next"?0:_b7b-1); +}else{ +var _b7c=parseInt(tr.attr("datagrid-row-index")); +_b7c+=(dir=="next"?1:-1); +if(_b7c<0){ +_b7c=_b7b-1; +} +if(_b7c>=_b7b){ +_b7c=0; +} +} +grid.datagrid("highlightRow",_b7c); +if(opts.selectOnNavigation){ +_b7a.remainText=false; +grid.datagrid("selectRow",_b7c); +} +}; +function _b78(_b7d,_b7e,_b7f){ +var _b80=$.data(_b7d,"combogrid"); +var opts=_b80.options; +var grid=_b80.grid; +var _b81=$(_b7d).combo("getValues"); +var _b82=$(_b7d).combo("options"); +var _b83=_b82.onChange; +_b82.onChange=function(){ +}; +var _b84=grid.datagrid("options"); +var _b85=_b84.onSelect; +var _b86=_b84.onUnselectAll; +_b84.onSelect=_b84.onUnselectAll=function(){ +}; +if(!$.isArray(_b7e)){ +_b7e=_b7e.split(opts.separator); +} +if(!opts.multiple){ +_b7e=_b7e.length?[_b7e[0]]:[""]; +} +var vv=$.map(_b7e,function(_b87){ +return String(_b87); +}); +vv=$.grep(vv,function(v,_b88){ +return _b88===$.inArray(v,vv); +}); +var _b89=$.grep(grid.datagrid("getSelections"),function(row,_b8a){ +return $.inArray(String(row[opts.idField]),vv)>=0; +}); +grid.datagrid("clearSelections"); +grid.data("datagrid").selectedRows=_b89; +var ss=[]; +opts.unselectedValues=[]; +$.map(vv,function(v){ +var _b8b=grid.datagrid("getRowIndex",v); +if(_b8b>=0){ +grid.datagrid("selectRow",_b8b); +}else{ +opts.unselectedValues.push(v); +} +ss.push(_b8c(v,grid.datagrid("getRows"))||_b8c(v,_b89)||_b8c(v,opts.mappingRows)||v); +}); +$(_b7d).combo("setValues",_b81); +_b82.onChange=_b83; +_b84.onSelect=_b85; +_b84.onUnselectAll=_b86; +if(!_b7f){ +var s=ss.join(opts.separator); +if($(_b7d).combo("getText")!=s){ +$(_b7d).combo("setText",s); +} +} +$(_b7d).combo("setValues",_b7e); +function _b8c(_b8d,a){ +var item=$.easyui.getArrayItem(a,opts.idField,_b8d); +return item?item[opts.textField]:undefined; +}; +}; +function _b8e(_b8f,q){ +var _b90=$.data(_b8f,"combogrid"); +var opts=_b90.options; +var grid=_b90.grid; +_b90.remainText=true; +var qq=opts.multiple?q.split(opts.separator):[q]; +qq=$.grep(qq,function(q){ +return $.trim(q)!=""; +}); +if(opts.mode=="remote"){ +_b91(qq); +grid.datagrid("load",$.extend({},opts.queryParams,{q:q})); +}else{ +grid.datagrid("highlightRow",-1); +var rows=grid.datagrid("getRows"); +var vv=[]; +$.map(qq,function(q){ +q=$.trim(q); +var _b92=q; +_b93(opts.mappingRows,q); +_b93(grid.datagrid("getSelections"),q); +var _b94=_b93(rows,q); +if(_b94>=0){ +if(opts.reversed){ +grid.datagrid("highlightRow",_b94); +} +}else{ +$.map(rows,function(row,i){ +if(opts.filter.call(_b8f,q,row)){ +grid.datagrid("highlightRow",i); +} +}); +} +}); +_b91(vv); +} +function _b93(rows,q){ +for(var i=0;i=0){ +$.easyui.addArrayItem(vv,v); +} +}); +$(_b96).combogrid("setValues",vv); +if(!opts.multiple){ +$(_b96).combogrid("hidePanel"); +} +}; +$.fn.combogrid=function(_b99,_b9a){ +if(typeof _b99=="string"){ +var _b9b=$.fn.combogrid.methods[_b99]; +if(_b9b){ +return _b9b(this,_b9a); +}else{ +return this.combo(_b99,_b9a); +} +} +_b99=_b99||{}; +return this.each(function(){ +var _b9c=$.data(this,"combogrid"); +if(_b9c){ +$.extend(_b9c.options,_b99); +}else{ +_b9c=$.data(this,"combogrid",{options:$.extend({},$.fn.combogrid.defaults,$.fn.combogrid.parseOptions(this),_b99)}); +} +_b5f(this); +}); +}; +$.fn.combogrid.methods={options:function(jq){ +var _b9d=jq.combo("options"); +return $.extend($.data(jq[0],"combogrid").options,{width:_b9d.width,height:_b9d.height,originalValue:_b9d.originalValue,disabled:_b9d.disabled,readonly:_b9d.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).combo("cloneFrom",from); +$.data(this,"combogrid",{options:$.extend(true,{cloned:true},$(from).combogrid("options")),combo:$(this).next(),panel:$(from).combo("panel"),grid:$(from).combogrid("grid")}); +}); +},grid:function(jq){ +return $.data(jq[0],"combogrid").grid; +},setValues:function(jq,_b9e){ +return jq.each(function(){ +var opts=$(this).combogrid("options"); +if($.isArray(_b9e)){ +_b9e=$.map(_b9e,function(_b9f){ +if(_b9f&&typeof _b9f=="object"){ +$.easyui.addArrayItem(opts.mappingRows,opts.idField,_b9f); +return _b9f[opts.idField]; +}else{ +return _b9f; +} +}); +} +_b78(this,_b9e); +}); +},setValue:function(jq,_ba0){ +return jq.each(function(){ +$(this).combogrid("setValues",$.isArray(_ba0)?_ba0:[_ba0]); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).combogrid("setValues",[]); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).combogrid("options"); +if(opts.multiple){ +$(this).combogrid("setValues",opts.originalValue); +}else{ +$(this).combogrid("setValue",opts.originalValue); +} +}); +}}; +$.fn.combogrid.parseOptions=function(_ba1){ +var t=$(_ba1); +return $.extend({},$.fn.combo.parseOptions(_ba1),$.fn.datagrid.parseOptions(_ba1),$.parser.parseOptions(_ba1,["idField","textField","mode"])); +}; +$.fn.combogrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.datagrid.defaults,{loadMsg:null,idField:null,textField:null,unselectedValues:[],mappingRows:[],mode:"local",keyHandler:{up:function(e){ +nav(this,"prev"); +e.preventDefault(); +},down:function(e){ +nav(this,"next"); +e.preventDefault(); +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_b95(this); +},query:function(q,e){ +_b8e(this,q); +}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ +$.fn.combo.defaults.inputEvents.blur(e); +var _ba2=e.data.target; +var opts=$(_ba2).combogrid("options"); +if(opts.reversed){ +$(_ba2).combogrid("setValues",$(_ba2).combogrid("getValues")); +} +}}),panelEvents:{mousedown:function(e){ +}},filter:function(q,row){ +var opts=$(this).combogrid("options"); +return (row[opts.textField]||"").toLowerCase().indexOf(q.toLowerCase())>=0; +}}); +})(jQuery); +(function($){ +function _ba3(_ba4){ +var _ba5=$.data(_ba4,"combotreegrid"); +var opts=_ba5.options; +$(_ba4).addClass("combotreegrid-f").combo($.extend({},opts,{onShowPanel:function(){ +var p=$(this).combotreegrid("panel"); +var _ba6=p.outerHeight()-p.height(); +var _ba7=p._size("minHeight"); +var _ba8=p._size("maxHeight"); +var dg=$(this).combotreegrid("grid"); +dg.treegrid("resize",{width:"100%",height:(isNaN(parseInt(opts.panelHeight))?"auto":"100%"),minHeight:(_ba7?_ba7-_ba6:""),maxHeight:(_ba8?_ba8-_ba6:"")}); +var row=dg.treegrid("getSelected"); +if(row){ +dg.treegrid("scrollTo",row[opts.idField]); +} +opts.onShowPanel.call(this); +}})); +if(!_ba5.grid){ +var _ba9=$(_ba4).combo("panel"); +_ba5.grid=$("
                                              ").appendTo(_ba9); +} +_ba5.grid.treegrid($.extend({},opts,{border:false,checkbox:opts.multiple,onLoadSuccess:function(row,data){ +var _baa=$(_ba4).combotreegrid("getValues"); +if(opts.multiple){ +$.map($(this).treegrid("getCheckedNodes"),function(row){ +$.easyui.addArrayItem(_baa,row[opts.idField]); +}); +} +_baf(_ba4,_baa); +opts.onLoadSuccess.call(this,row,data); +_ba5.remainText=false; +},onClickRow:function(row){ +if(opts.multiple){ +$(this).treegrid(row.checked?"uncheckNode":"checkNode",row[opts.idField]); +$(this).treegrid("unselect",row[opts.idField]); +}else{ +$(_ba4).combo("hidePanel"); +} +_bac(_ba4); +opts.onClickRow.call(this,row); +},onCheckNode:function(row,_bab){ +_bac(_ba4); +opts.onCheckNode.call(this,row,_bab); +}})); +}; +function _bac(_bad){ +var _bae=$.data(_bad,"combotreegrid"); +var opts=_bae.options; +var grid=_bae.grid; +var vv=[]; +if(opts.multiple){ +vv=$.map(grid.treegrid("getCheckedNodes"),function(row){ +return row[opts.idField]; +}); +}else{ +var row=grid.treegrid("getSelected"); +if(row){ +vv.push(row[opts.idField]); +} +} +vv=vv.concat(opts.unselectedValues); +_baf(_bad,vv); +}; +function _baf(_bb0,_bb1){ +var _bb2=$.data(_bb0,"combotreegrid"); +var opts=_bb2.options; +var grid=_bb2.grid; +if(!$.isArray(_bb1)){ +_bb1=_bb1.split(opts.separator); +} +if(!opts.multiple){ +_bb1=_bb1.length?[_bb1[0]]:[""]; +} +var vv=$.map(_bb1,function(_bb3){ +return String(_bb3); +}); +vv=$.grep(vv,function(v,_bb4){ +return _bb4===$.inArray(v,vv); +}); +var _bb5=grid.treegrid("getSelected"); +if(_bb5){ +grid.treegrid("unselect",_bb5[opts.idField]); +} +$.map(grid.treegrid("getCheckedNodes"),function(row){ +if($.inArray(String(row[opts.idField]),vv)==-1){ +grid.treegrid("uncheckNode",row[opts.idField]); +} +}); +var ss=[]; +opts.unselectedValues=[]; +$.map(vv,function(v){ +var row=grid.treegrid("find",v); +if(row){ +if(opts.multiple){ +grid.treegrid("checkNode",v); +}else{ +grid.treegrid("select",v); +} +ss.push(_bb6(row)); +}else{ +ss.push(_bb7(v,opts.mappingRows)||v); +opts.unselectedValues.push(v); +} +}); +if(opts.multiple){ +$.map(grid.treegrid("getCheckedNodes"),function(row){ +var id=String(row[opts.idField]); +if($.inArray(id,vv)==-1){ +vv.push(id); +ss.push(_bb6(row)); +} +}); +} +if(!_bb2.remainText){ +var s=ss.join(opts.separator); +if($(_bb0).combo("getText")!=s){ +$(_bb0).combo("setText",s); +} +} +$(_bb0).combo("setValues",vv); +function _bb7(_bb8,a){ +var item=$.easyui.getArrayItem(a,opts.idField,_bb8); +return item?_bb6(item):undefined; +}; +function _bb6(row){ +return row[opts.textField||""]||row[opts.treeField]; +}; +}; +function _bb9(_bba,q){ +var _bbb=$.data(_bba,"combotreegrid"); +var opts=_bbb.options; +var grid=_bbb.grid; +_bbb.remainText=true; +var qq=opts.multiple?q.split(opts.separator):[q]; +qq=$.grep(qq,function(q){ +return $.trim(q)!=""; +}); +grid.treegrid("clearSelections").treegrid("clearChecked").treegrid("highlightRow",-1); +if(opts.mode=="remote"){ +_bbc(qq); +grid.treegrid("load",$.extend({},opts.queryParams,{q:q})); +}else{ +if(q){ +var data=grid.treegrid("getData"); +var vv=[]; +$.map(qq,function(q){ +q=$.trim(q); +if(q){ +var v=undefined; +$.easyui.forEach(data,true,function(row){ +if(q.toLowerCase()==String(row[opts.treeField]).toLowerCase()){ +v=row[opts.idField]; +return false; +}else{ +if(opts.filter.call(_bba,q,row)){ +grid.treegrid("expandTo",row[opts.idField]); +grid.treegrid("highlightRow",row[opts.idField]); +return false; +} +} +}); +if(v==undefined){ +$.easyui.forEach(opts.mappingRows,false,function(row){ +if(q.toLowerCase()==String(row[opts.treeField])){ +v=row[opts.idField]; +return false; +} +}); +} +if(v!=undefined){ +vv.push(v); +}else{ +vv.push(q); +} +} +}); +_bbc(vv); +_bbb.remainText=false; +} +} +function _bbc(vv){ +if(!opts.reversed){ +$(_bba).combotreegrid("setValues",vv); +} +}; +}; +function _bbd(_bbe){ +var _bbf=$.data(_bbe,"combotreegrid"); +var opts=_bbf.options; +var grid=_bbf.grid; +var tr=opts.finder.getTr(grid[0],null,"highlight"); +_bbf.remainText=false; +if(tr.length){ +var id=tr.attr("node-id"); +if(opts.multiple){ +if(tr.hasClass("datagrid-row-selected")){ +grid.treegrid("uncheckNode",id); +}else{ +grid.treegrid("checkNode",id); +} +}else{ +grid.treegrid("selectRow",id); +} +} +var vv=[]; +if(opts.multiple){ +$.map(grid.treegrid("getCheckedNodes"),function(row){ +vv.push(row[opts.idField]); +}); +}else{ +var row=grid.treegrid("getSelected"); +if(row){ +vv.push(row[opts.idField]); +} +} +$.map(opts.unselectedValues,function(v){ +if($.easyui.indexOfArray(opts.mappingRows,opts.idField,v)>=0){ +$.easyui.addArrayItem(vv,v); +} +}); +$(_bbe).combotreegrid("setValues",vv); +if(!opts.multiple){ +$(_bbe).combotreegrid("hidePanel"); +} +}; +$.fn.combotreegrid=function(_bc0,_bc1){ +if(typeof _bc0=="string"){ +var _bc2=$.fn.combotreegrid.methods[_bc0]; +if(_bc2){ +return _bc2(this,_bc1); +}else{ +return this.combo(_bc0,_bc1); +} +} +_bc0=_bc0||{}; +return this.each(function(){ +var _bc3=$.data(this,"combotreegrid"); +if(_bc3){ +$.extend(_bc3.options,_bc0); +}else{ +_bc3=$.data(this,"combotreegrid",{options:$.extend({},$.fn.combotreegrid.defaults,$.fn.combotreegrid.parseOptions(this),_bc0)}); +} +_ba3(this); +}); +}; +$.fn.combotreegrid.methods={options:function(jq){ +var _bc4=jq.combo("options"); +return $.extend($.data(jq[0],"combotreegrid").options,{width:_bc4.width,height:_bc4.height,originalValue:_bc4.originalValue,disabled:_bc4.disabled,readonly:_bc4.readonly}); +},grid:function(jq){ +return $.data(jq[0],"combotreegrid").grid; +},setValues:function(jq,_bc5){ +return jq.each(function(){ +var opts=$(this).combotreegrid("options"); +if($.isArray(_bc5)){ +_bc5=$.map(_bc5,function(_bc6){ +if(_bc6&&typeof _bc6=="object"){ +$.easyui.addArrayItem(opts.mappingRows,opts.idField,_bc6); +return _bc6[opts.idField]; +}else{ +return _bc6; +} +}); +} +_baf(this,_bc5); +}); +},setValue:function(jq,_bc7){ +return jq.each(function(){ +$(this).combotreegrid("setValues",$.isArray(_bc7)?_bc7:[_bc7]); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).combotreegrid("setValues",[]); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).combotreegrid("options"); +if(opts.multiple){ +$(this).combotreegrid("setValues",opts.originalValue); +}else{ +$(this).combotreegrid("setValue",opts.originalValue); +} +}); +}}; +$.fn.combotreegrid.parseOptions=function(_bc8){ +var t=$(_bc8); +return $.extend({},$.fn.combo.parseOptions(_bc8),$.fn.treegrid.parseOptions(_bc8),$.parser.parseOptions(_bc8,["mode",{limitToGrid:"boolean"}])); +}; +$.fn.combotreegrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.treegrid.defaults,{editable:false,singleSelect:true,limitToGrid:false,unselectedValues:[],mappingRows:[],mode:"local",textField:null,keyHandler:{up:function(e){ +},down:function(e){ +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_bbd(this); +},query:function(q,e){ +_bb9(this,q); +}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ +$.fn.combo.defaults.inputEvents.blur(e); +var _bc9=e.data.target; +var opts=$(_bc9).combotreegrid("options"); +if(opts.limitToGrid){ +_bbd(_bc9); +} +}}),filter:function(q,row){ +var opts=$(this).combotreegrid("options"); +return (row[opts.treeField]||"").toLowerCase().indexOf(q.toLowerCase())>=0; +}}); +})(jQuery); +(function($){ +function _bca(_bcb){ +var _bcc=$.data(_bcb,"tagbox"); +var opts=_bcc.options; +$(_bcb).addClass("tagbox-f").combobox($.extend({},opts,{cls:"tagbox",reversed:true,onChange:function(_bcd,_bce){ +_bcf(); +$(this).combobox("hidePanel"); +opts.onChange.call(_bcb,_bcd,_bce); +},onResizing:function(_bd0,_bd1){ +var _bd2=$(this).combobox("textbox"); +var tb=$(this).data("textbox").textbox; +var _bd3=tb.outerWidth(); +tb.css({height:"",paddingLeft:_bd2.css("marginLeft"),paddingRight:_bd2.css("marginRight")}); +_bd2.css("margin",0); +tb._outerWidth(_bd3); +_be6(_bcb); +_bd8(this); +opts.onResizing.call(_bcb,_bd0,_bd1); +},onLoadSuccess:function(data){ +_bcf(); +opts.onLoadSuccess.call(_bcb,data); +}})); +_bcf(); +_be6(_bcb); +function _bcf(){ +$(_bcb).next().find(".tagbox-label").remove(); +var _bd4=$(_bcb).tagbox("textbox"); +var ss=[]; +$.map($(_bcb).tagbox("getValues"),function(_bd5,_bd6){ +var row=opts.finder.getRow(_bcb,_bd5); +var text=opts.tagFormatter.call(_bcb,_bd5,row); +var cs={}; +var css=opts.tagStyler.call(_bcb,_bd5,row)||""; +if(typeof css=="string"){ +cs={s:css}; +}else{ +cs={c:css["class"]||"",s:css["style"]||""}; +} +var _bd7=$("").insertBefore(_bd4).html(text); +_bd7.attr("tagbox-index",_bd6); +_bd7.attr("style",cs.s).addClass(cs.c); +$("").appendTo(_bd7); +}); +_bd8(_bcb); +$(_bcb).combobox("setText",""); +}; +}; +function _bd8(_bd9,_bda){ +var span=$(_bd9).next(); +var _bdb=_bda?$(_bda):span.find(".tagbox-label"); +if(_bdb.length){ +var _bdc=$(_bd9).tagbox("textbox"); +var _bdd=$(_bdb[0]); +var _bde=_bdd.outerHeight(true)-_bdd.outerHeight(); +var _bdf=_bdc.outerHeight()-_bde*2; +_bdb.css({height:_bdf+"px",lineHeight:_bdf+"px"}); +var _be0=span.find(".textbox-addon").css("height","100%"); +_be0.find(".textbox-icon").css("height","100%"); +span.find(".textbox-button").linkbutton("resize",{height:"100%"}); +} +}; +function _be1(_be2){ +var span=$(_be2).next(); +span.unbind(".tagbox").bind("click.tagbox",function(e){ +var opts=$(_be2).tagbox("options"); +if(opts.disabled||opts.readonly){ +return; +} +if($(e.target).hasClass("tagbox-remove")){ +var _be3=parseInt($(e.target).parent().attr("tagbox-index")); +var _be4=$(_be2).tagbox("getValues"); +if(opts.onBeforeRemoveTag.call(_be2,_be4[_be3])==false){ +return; +} +opts.onRemoveTag.call(_be2,_be4[_be3]); +_be4.splice(_be3,1); +$(_be2).tagbox("setValues",_be4); +}else{ +var _be5=$(e.target).closest(".tagbox-label"); +if(_be5.length){ +var _be3=parseInt(_be5.attr("tagbox-index")); +var _be4=$(_be2).tagbox("getValues"); +opts.onClickTag.call(_be2,_be4[_be3]); +} +} +$(this).find(".textbox-text").focus(); +}).bind("keyup.tagbox",function(e){ +_be6(_be2); +}).bind("mouseover.tagbox",function(e){ +if($(e.target).closest(".textbox-button,.textbox-addon,.tagbox-label").length){ +$(this).triggerHandler("mouseleave"); +}else{ +$(this).find(".textbox-text").triggerHandler("mouseenter"); +} +}).bind("mouseleave.tagbox",function(e){ +$(this).find(".textbox-text").triggerHandler("mouseleave"); +}); +}; +function _be6(_be7){ +var opts=$(_be7).tagbox("options"); +var _be8=$(_be7).tagbox("textbox"); +var span=$(_be7).next(); +var tmp=$("").appendTo("body"); +tmp.attr("style",_be8.attr("style")); +tmp.css({position:"absolute",top:-9999,left:-9999,width:"auto",fontFamily:_be8.css("fontFamily"),fontSize:_be8.css("fontSize"),fontWeight:_be8.css("fontWeight"),whiteSpace:"nowrap"}); +var _be9=_bea(_be8.val()); +var _beb=_bea(opts.prompt||""); +tmp.remove(); +var _bec=Math.min(Math.max(_be9,_beb)+20,span.width()); +_be8._outerWidth(_bec); +span.find(".textbox-button").linkbutton("resize",{height:"100%"}); +function _bea(val){ +var s=val.replace(/&/g,"&").replace(/\s/g," ").replace(//g,">"); +tmp.html(s); +return tmp.outerWidth(); +}; +}; +function _bed(_bee){ +var t=$(_bee); +var opts=t.tagbox("options"); +if(opts.limitToList){ +var _bef=t.tagbox("panel"); +var item=_bef.children("div.combobox-item-hover"); +if(item.length){ +item.removeClass("combobox-item-hover"); +var row=opts.finder.getRow(_bee,item); +var _bf0=row[opts.valueField]; +$(_bee).tagbox(item.hasClass("combobox-item-selected")?"unselect":"select",_bf0); +} +$(_bee).tagbox("hidePanel"); +}else{ +var v=$.trim($(_bee).tagbox("getText")); +if(v!==""){ +var _bf1=$(_bee).tagbox("getValues"); +_bf1.push(v); +$(_bee).tagbox("setValues",_bf1); +} +} +}; +function _bf2(_bf3,_bf4){ +$(_bf3).combobox("setText",""); +_be6(_bf3); +$(_bf3).combobox("setValues",_bf4); +$(_bf3).combobox("setText",""); +$(_bf3).tagbox("validate"); +}; +$.fn.tagbox=function(_bf5,_bf6){ +if(typeof _bf5=="string"){ +var _bf7=$.fn.tagbox.methods[_bf5]; +if(_bf7){ +return _bf7(this,_bf6); +}else{ +return this.combobox(_bf5,_bf6); +} +} +_bf5=_bf5||{}; +return this.each(function(){ +var _bf8=$.data(this,"tagbox"); +if(_bf8){ +$.extend(_bf8.options,_bf5); +}else{ +$.data(this,"tagbox",{options:$.extend({},$.fn.tagbox.defaults,$.fn.tagbox.parseOptions(this),_bf5)}); +} +_bca(this); +_be1(this); +}); +}; +$.fn.tagbox.methods={options:function(jq){ +var _bf9=jq.combobox("options"); +return $.extend($.data(jq[0],"tagbox").options,{width:_bf9.width,height:_bf9.height,originalValue:_bf9.originalValue,disabled:_bf9.disabled,readonly:_bf9.readonly}); +},setValues:function(jq,_bfa){ +return jq.each(function(){ +_bf2(this,_bfa); +}); +},reset:function(jq){ +return jq.each(function(){ +$(this).combobox("reset").combobox("setText",""); +}); +}}; +$.fn.tagbox.parseOptions=function(_bfb){ +return $.extend({},$.fn.combobox.parseOptions(_bfb),$.parser.parseOptions(_bfb,[])); +}; +$.fn.tagbox.defaults=$.extend({},$.fn.combobox.defaults,{hasDownArrow:false,multiple:true,reversed:true,selectOnNavigation:false,tipOptions:$.extend({},$.fn.textbox.defaults.tipOptions,{showDelay:200}),val:function(_bfc){ +var vv=$(_bfc).parent().prev().tagbox("getValues"); +if($(_bfc).is(":focus")){ +vv.push($(_bfc).val()); +} +return vv.join(","); +},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ +var _bfd=e.data.target; +var opts=$(_bfd).tagbox("options"); +if(opts.limitToList){ +_bed(_bfd); +} +}}),keyHandler:$.extend({},$.fn.combobox.defaults.keyHandler,{enter:function(e){ +_bed(this); +},query:function(q,e){ +var opts=$(this).tagbox("options"); +if(opts.limitToList){ +$.fn.combobox.defaults.keyHandler.query.call(this,q,e); +}else{ +$(this).combobox("hidePanel"); +} +}}),tagFormatter:function(_bfe,row){ +var opts=$(this).tagbox("options"); +return row?row[opts.textField]:_bfe; +},tagStyler:function(_bff,row){ +return ""; +},onClickTag:function(_c00){ +},onBeforeRemoveTag:function(_c01){ +},onRemoveTag:function(_c02){ +}}); +})(jQuery); +(function($){ +function _c03(_c04){ +var _c05=$.data(_c04,"datebox"); +var opts=_c05.options; +$(_c04).addClass("datebox-f").combo($.extend({},opts,{onShowPanel:function(){ +_c06(this); +_c07(this); +_c08(this); +_c16(this,$(this).datebox("getText"),true); +opts.onShowPanel.call(this); +}})); +if(!_c05.calendar){ +var _c09=$(_c04).combo("panel").css("overflow","hidden"); +_c09.panel("options").onBeforeDestroy=function(){ +var c=$(this).find(".calendar-shared"); +if(c.length){ +c.insertBefore(c[0].pholder); +} +}; +var cc=$("
                                              ").prependTo(_c09); +if(opts.sharedCalendar){ +var c=$(opts.sharedCalendar); +if(!c[0].pholder){ +c[0].pholder=$("
                                              ").insertAfter(c); +} +c.addClass("calendar-shared").appendTo(cc); +if(!c.hasClass("calendar")){ +c.calendar(); +} +_c05.calendar=c; +}else{ +_c05.calendar=$("
                                              ").appendTo(cc).calendar(); +} +$.extend(_c05.calendar.calendar("options"),{fit:true,border:false,onSelect:function(date){ +var _c0a=this.target; +var opts=$(_c0a).datebox("options"); +opts.onSelect.call(_c0a,date); +_c16(_c0a,opts.formatter.call(_c0a,date)); +$(_c0a).combo("hidePanel"); +}}); +} +$(_c04).combo("textbox").parent().addClass("datebox"); +$(_c04).datebox("initValue",opts.value); +function _c06(_c0b){ +var opts=$(_c0b).datebox("options"); +var _c0c=$(_c0b).combo("panel"); +_c0c.unbind(".datebox").bind("click.datebox",function(e){ +if($(e.target).hasClass("datebox-button-a")){ +var _c0d=parseInt($(e.target).attr("datebox-button-index")); +opts.buttons[_c0d].handler.call(e.target,_c0b); +} +}); +}; +function _c07(_c0e){ +var _c0f=$(_c0e).combo("panel"); +if(_c0f.children("div.datebox-button").length){ +return; +} +var _c10=$("
                                              ").appendTo(_c0f); +var tr=_c10.find("tr"); +for(var i=0;i").appendTo(tr); +var btn=opts.buttons[i]; +var t=$("").html($.isFunction(btn.text)?btn.text(_c0e):btn.text).appendTo(td); +t.attr("datebox-button-index",i); +} +tr.find("td").css("width",(100/opts.buttons.length)+"%"); +}; +function _c08(_c11){ +var _c12=$(_c11).combo("panel"); +var cc=_c12.children("div.datebox-calendar-inner"); +_c12.children()._outerWidth(_c12.width()); +_c05.calendar.appendTo(cc); +_c05.calendar[0].target=_c11; +if(opts.panelHeight!="auto"){ +var _c13=_c12.height(); +_c12.children().not(cc).each(function(){ +_c13-=$(this).outerHeight(); +}); +cc._outerHeight(_c13); +} +_c05.calendar.calendar("resize"); +}; +}; +function _c14(_c15,q){ +_c16(_c15,q,true); +}; +function _c17(_c18){ +var _c19=$.data(_c18,"datebox"); +var opts=_c19.options; +var _c1a=_c19.calendar.calendar("options").current; +if(_c1a){ +_c16(_c18,opts.formatter.call(_c18,_c1a)); +$(_c18).combo("hidePanel"); +} +}; +function _c16(_c1b,_c1c,_c1d){ +var _c1e=$.data(_c1b,"datebox"); +var opts=_c1e.options; +var _c1f=_c1e.calendar; +_c1f.calendar("moveTo",opts.parser.call(_c1b,_c1c)); +if(_c1d){ +$(_c1b).combo("setValue",_c1c); +}else{ +if(_c1c){ +_c1c=opts.formatter.call(_c1b,_c1f.calendar("options").current); +} +$(_c1b).combo("setText",_c1c).combo("setValue",_c1c); +} +}; +$.fn.datebox=function(_c20,_c21){ +if(typeof _c20=="string"){ +var _c22=$.fn.datebox.methods[_c20]; +if(_c22){ +return _c22(this,_c21); +}else{ +return this.combo(_c20,_c21); +} +} +_c20=_c20||{}; +return this.each(function(){ +var _c23=$.data(this,"datebox"); +if(_c23){ +$.extend(_c23.options,_c20); +}else{ +$.data(this,"datebox",{options:$.extend({},$.fn.datebox.defaults,$.fn.datebox.parseOptions(this),_c20)}); +} +_c03(this); +}); +}; +$.fn.datebox.methods={options:function(jq){ +var _c24=jq.combo("options"); +return $.extend($.data(jq[0],"datebox").options,{width:_c24.width,height:_c24.height,originalValue:_c24.originalValue,disabled:_c24.disabled,readonly:_c24.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).combo("cloneFrom",from); +$.data(this,"datebox",{options:$.extend(true,{},$(from).datebox("options")),calendar:$(from).datebox("calendar")}); +$(this).addClass("datebox-f"); +}); +},calendar:function(jq){ +return $.data(jq[0],"datebox").calendar; +},initValue:function(jq,_c25){ +return jq.each(function(){ +var opts=$(this).datebox("options"); +var _c26=opts.value; +if(_c26){ +_c26=opts.formatter.call(this,opts.parser.call(this,_c26)); +} +$(this).combo("initValue",_c26).combo("setText",_c26); +}); +},setValue:function(jq,_c27){ +return jq.each(function(){ +_c16(this,_c27); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).datebox("options"); +$(this).datebox("setValue",opts.originalValue); +}); +}}; +$.fn.datebox.parseOptions=function(_c28){ +return $.extend({},$.fn.combo.parseOptions(_c28),$.parser.parseOptions(_c28,["sharedCalendar"])); +}; +$.fn.datebox.defaults=$.extend({},$.fn.combo.defaults,{panelWidth:250,panelHeight:"auto",sharedCalendar:null,keyHandler:{up:function(e){ +},down:function(e){ +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_c17(this); +},query:function(q,e){ +_c14(this,q); +}},currentText:"Today",closeText:"Close",okText:"Ok",buttons:[{text:function(_c29){ +return $(_c29).datebox("options").currentText; +},handler:function(_c2a){ +var opts=$(_c2a).datebox("options"); +var now=new Date(); +var _c2b=new Date(now.getFullYear(),now.getMonth(),now.getDate()); +$(_c2a).datebox("calendar").calendar({year:_c2b.getFullYear(),month:_c2b.getMonth()+1,current:_c2b}); +opts.onSelect.call(_c2a,_c2b); +_c17(_c2a); +}},{text:function(_c2c){ +return $(_c2c).datebox("options").closeText; +},handler:function(_c2d){ +$(this).closest("div.combo-panel").panel("close"); +}}],formatter:function(date){ +var y=date.getFullYear(); +var m=date.getMonth()+1; +var d=date.getDate(); +return (m<10?("0"+m):m)+"/"+(d<10?("0"+d):d)+"/"+y; +},parser:function(s){ +if(!s){ +return new Date(); +} +var ss=s.split("/"); +var m=parseInt(ss[0],10); +var d=parseInt(ss[1],10); +var y=parseInt(ss[2],10); +if(!isNaN(y)&&!isNaN(m)&&!isNaN(d)){ +return new Date(y,m-1,d); +}else{ +return new Date(); +} +},onSelect:function(date){ +}}); +})(jQuery); +(function($){ +function _c2e(_c2f){ +var _c30=$.data(_c2f,"datetimebox"); +var opts=_c30.options; +$(_c2f).datebox($.extend({},opts,{onShowPanel:function(){ +var _c31=$(this).datetimebox("getValue"); +_c37(this,_c31,true); +opts.onShowPanel.call(this); +},formatter:$.fn.datebox.defaults.formatter,parser:$.fn.datebox.defaults.parser})); +$(_c2f).removeClass("datebox-f").addClass("datetimebox-f"); +$(_c2f).datebox("calendar").calendar({onSelect:function(date){ +opts.onSelect.call(this.target,date); +}}); +if(!_c30.spinner){ +var _c32=$(_c2f).datebox("panel"); +var p=$("
                                              ").insertAfter(_c32.children("div.datebox-calendar-inner")); +_c30.spinner=p.children("input"); +} +_c30.spinner.timespinner({width:opts.spinnerWidth,showSeconds:opts.showSeconds,separator:opts.timeSeparator}); +$(_c2f).datetimebox("initValue",opts.value); +}; +function _c33(_c34){ +var c=$(_c34).datetimebox("calendar"); +var t=$(_c34).datetimebox("spinner"); +var date=c.calendar("options").current; +return new Date(date.getFullYear(),date.getMonth(),date.getDate(),t.timespinner("getHours"),t.timespinner("getMinutes"),t.timespinner("getSeconds")); +}; +function _c35(_c36,q){ +_c37(_c36,q,true); +}; +function _c38(_c39){ +var opts=$.data(_c39,"datetimebox").options; +var date=_c33(_c39); +_c37(_c39,opts.formatter.call(_c39,date)); +$(_c39).combo("hidePanel"); +}; +function _c37(_c3a,_c3b,_c3c){ +var opts=$.data(_c3a,"datetimebox").options; +$(_c3a).combo("setValue",_c3b); +if(!_c3c){ +if(_c3b){ +var date=opts.parser.call(_c3a,_c3b); +$(_c3a).combo("setText",opts.formatter.call(_c3a,date)); +$(_c3a).combo("setValue",opts.formatter.call(_c3a,date)); +}else{ +$(_c3a).combo("setText",_c3b); +} +} +var date=opts.parser.call(_c3a,_c3b); +$(_c3a).datetimebox("calendar").calendar("moveTo",date); +$(_c3a).datetimebox("spinner").timespinner("setValue",_c3d(date)); +function _c3d(date){ +function _c3e(_c3f){ +return (_c3f<10?"0":"")+_c3f; +}; +var tt=[_c3e(date.getHours()),_c3e(date.getMinutes())]; +if(opts.showSeconds){ +tt.push(_c3e(date.getSeconds())); +} +return tt.join($(_c3a).datetimebox("spinner").timespinner("options").separator); +}; +}; +$.fn.datetimebox=function(_c40,_c41){ +if(typeof _c40=="string"){ +var _c42=$.fn.datetimebox.methods[_c40]; +if(_c42){ +return _c42(this,_c41); +}else{ +return this.datebox(_c40,_c41); +} +} +_c40=_c40||{}; +return this.each(function(){ +var _c43=$.data(this,"datetimebox"); +if(_c43){ +$.extend(_c43.options,_c40); +}else{ +$.data(this,"datetimebox",{options:$.extend({},$.fn.datetimebox.defaults,$.fn.datetimebox.parseOptions(this),_c40)}); +} +_c2e(this); +}); +}; +$.fn.datetimebox.methods={options:function(jq){ +var _c44=jq.datebox("options"); +return $.extend($.data(jq[0],"datetimebox").options,{originalValue:_c44.originalValue,disabled:_c44.disabled,readonly:_c44.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).datebox("cloneFrom",from); +$.data(this,"datetimebox",{options:$.extend(true,{},$(from).datetimebox("options")),spinner:$(from).datetimebox("spinner")}); +$(this).removeClass("datebox-f").addClass("datetimebox-f"); +}); +},spinner:function(jq){ +return $.data(jq[0],"datetimebox").spinner; +},initValue:function(jq,_c45){ +return jq.each(function(){ +var opts=$(this).datetimebox("options"); +var _c46=opts.value; +if(_c46){ +_c46=opts.formatter.call(this,opts.parser.call(this,_c46)); +} +$(this).combo("initValue",_c46).combo("setText",_c46); +}); +},setValue:function(jq,_c47){ +return jq.each(function(){ +_c37(this,_c47); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).datetimebox("options"); +$(this).datetimebox("setValue",opts.originalValue); +}); +}}; +$.fn.datetimebox.parseOptions=function(_c48){ +var t=$(_c48); +return $.extend({},$.fn.datebox.parseOptions(_c48),$.parser.parseOptions(_c48,["timeSeparator","spinnerWidth",{showSeconds:"boolean"}])); +}; +$.fn.datetimebox.defaults=$.extend({},$.fn.datebox.defaults,{spinnerWidth:"100%",showSeconds:true,timeSeparator:":",panelEvents:{mousedown:function(e){ +}},keyHandler:{up:function(e){ +},down:function(e){ +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_c38(this); +},query:function(q,e){ +_c35(this,q); +}},buttons:[{text:function(_c49){ +return $(_c49).datetimebox("options").currentText; +},handler:function(_c4a){ +var opts=$(_c4a).datetimebox("options"); +_c37(_c4a,opts.formatter.call(_c4a,new Date())); +$(_c4a).datetimebox("hidePanel"); +}},{text:function(_c4b){ +return $(_c4b).datetimebox("options").okText; +},handler:function(_c4c){ +_c38(_c4c); +}},{text:function(_c4d){ +return $(_c4d).datetimebox("options").closeText; +},handler:function(_c4e){ +$(_c4e).datetimebox("hidePanel"); +}}],formatter:function(date){ +var h=date.getHours(); +var M=date.getMinutes(); +var s=date.getSeconds(); +function _c4f(_c50){ +return (_c50<10?"0":"")+_c50; +}; +var _c51=$(this).datetimebox("spinner").timespinner("options").separator; +var r=$.fn.datebox.defaults.formatter(date)+" "+_c4f(h)+_c51+_c4f(M); +if($(this).datetimebox("options").showSeconds){ +r+=_c51+_c4f(s); +} +return r; +},parser:function(s){ +if($.trim(s)==""){ +return new Date(); +} +var dt=s.split(" "); +var d=$.fn.datebox.defaults.parser(dt[0]); +if(dt.length<2){ +return d; +} +var _c52=$(this).datetimebox("spinner").timespinner("options").separator; +var tt=dt[1].split(_c52); +var hour=parseInt(tt[0],10)||0; +var _c53=parseInt(tt[1],10)||0; +var _c54=parseInt(tt[2],10)||0; +return new Date(d.getFullYear(),d.getMonth(),d.getDate(),hour,_c53,_c54); +}}); +})(jQuery); +(function($){ +function init(_c55){ +var _c56=$("
                                              "+"
                                              "+""+""+"
                                              "+"
                                              "+"
                                              "+"
                                              "+""+"
                                              ").insertAfter(_c55); +var t=$(_c55); +t.addClass("slider-f").hide(); +var name=t.attr("name"); +if(name){ +_c56.find("input.slider-value").attr("name",name); +t.removeAttr("name").attr("sliderName",name); +} +_c56.bind("_resize",function(e,_c57){ +if($(this).hasClass("easyui-fluid")||_c57){ +_c58(_c55); +} +return false; +}); +return _c56; +}; +function _c58(_c59,_c5a){ +var _c5b=$.data(_c59,"slider"); +var opts=_c5b.options; +var _c5c=_c5b.slider; +if(_c5a){ +if(_c5a.width){ +opts.width=_c5a.width; +} +if(_c5a.height){ +opts.height=_c5a.height; +} +} +_c5c._size(opts); +if(opts.mode=="h"){ +_c5c.css("height",""); +_c5c.children("div").css("height",""); +}else{ +_c5c.css("width",""); +_c5c.children("div").css("width",""); +_c5c.children("div.slider-rule,div.slider-rulelabel,div.slider-inner")._outerHeight(_c5c._outerHeight()); +} +_c5d(_c59); +}; +function _c5e(_c5f){ +var _c60=$.data(_c5f,"slider"); +var opts=_c60.options; +var _c61=_c60.slider; +var aa=opts.mode=="h"?opts.rule:opts.rule.slice(0).reverse(); +if(opts.reversed){ +aa=aa.slice(0).reverse(); +} +_c62(aa); +function _c62(aa){ +var rule=_c61.find("div.slider-rule"); +var _c63=_c61.find("div.slider-rulelabel"); +rule.empty(); +_c63.empty(); +for(var i=0;i").appendTo(rule); +span.css((opts.mode=="h"?"left":"top"),_c64); +if(aa[i]!="|"){ +span=$("").appendTo(_c63); +span.html(aa[i]); +if(opts.mode=="h"){ +span.css({left:_c64,marginLeft:-Math.round(span.outerWidth()/2)}); +}else{ +span.css({top:_c64,marginTop:-Math.round(span.outerHeight()/2)}); +} +} +} +}; +}; +function _c65(_c66){ +var _c67=$.data(_c66,"slider"); +var opts=_c67.options; +var _c68=_c67.slider; +_c68.removeClass("slider-h slider-v slider-disabled"); +_c68.addClass(opts.mode=="h"?"slider-h":"slider-v"); +_c68.addClass(opts.disabled?"slider-disabled":""); +var _c69=_c68.find(".slider-inner"); +_c69.html(""+""); +if(opts.range){ +_c69.append(""+""); +} +_c68.find("a.slider-handle").draggable({axis:opts.mode,cursor:"pointer",disabled:opts.disabled,onDrag:function(e){ +var left=e.data.left; +var _c6a=_c68.width(); +if(opts.mode!="h"){ +left=e.data.top; +_c6a=_c68.height(); +} +if(left<0||left>_c6a){ +return false; +}else{ +_c6b(left,this); +return false; +} +},onStartDrag:function(){ +_c67.isDragging=true; +opts.onSlideStart.call(_c66,opts.value); +},onStopDrag:function(e){ +_c6b(opts.mode=="h"?e.data.left:e.data.top,this); +opts.onSlideEnd.call(_c66,opts.value); +opts.onComplete.call(_c66,opts.value); +_c67.isDragging=false; +}}); +_c68.find("div.slider-inner").unbind(".slider").bind("mousedown.slider",function(e){ +if(_c67.isDragging||opts.disabled){ +return; +} +var pos=$(this).offset(); +_c6b(opts.mode=="h"?(e.pageX-pos.left):(e.pageY-pos.top)); +opts.onComplete.call(_c66,opts.value); +}); +function _c6c(_c6d){ +var dd=String(opts.step).split("."); +var dlen=dd.length>1?dd[1].length:0; +return parseFloat(_c6d.toFixed(dlen)); +}; +function _c6b(pos,_c6e){ +var _c6f=_c70(_c66,pos); +var s=Math.abs(_c6f%opts.step); +if(s0; +if(_c6f<=v2&&_c71){ +v1=_c6f; +}else{ +if(_c6f>=v1&&(!_c71)){ +v2=_c6f; +} +} +}else{ +if(_c6fv2){ +v2=_c6f; +}else{ +_c6fopts.max){ +_c79=opts.max; +} +var _c7a=$("").appendTo(_c76); +_c7a.attr("name",name); +_c7a.val(_c79); +_c78.push(_c79); +var _c7b=_c76.find(".slider-handle:eq("+i+")"); +var tip=_c7b.next(); +var pos=_c7c(_c73,_c79); +if(opts.showTip){ +tip.show(); +tip.html(opts.tipFormatter.call(_c73,_c79)); +}else{ +tip.hide(); +} +if(opts.mode=="h"){ +var _c7d="left:"+pos+"px;"; +_c7b.attr("style",_c7d); +tip.attr("style",_c7d+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px"); +}else{ +var _c7d="top:"+pos+"px;"; +_c7b.attr("style",_c7d); +tip.attr("style",_c7d+"margin-left:"+(-Math.round(tip.outerWidth()))+"px"); +} +} +opts.value=opts.range?_c78:_c78[0]; +$(_c73).val(opts.range?_c78.join(opts.separator):_c78[0]); +if(_c77.join(",")!=_c78.join(",")){ +opts.onChange.call(_c73,opts.value,(opts.range?_c77:_c77[0])); +} +}; +function _c5d(_c7e){ +var opts=$.data(_c7e,"slider").options; +var fn=opts.onChange; +opts.onChange=function(){ +}; +_c72(_c7e,opts.value); +opts.onChange=fn; +}; +function _c7c(_c7f,_c80){ +var _c81=$.data(_c7f,"slider"); +var opts=_c81.options; +var _c82=_c81.slider; +var size=opts.mode=="h"?_c82.width():_c82.height(); +var pos=opts.converter.toPosition.call(_c7f,_c80,size); +if(opts.mode=="v"){ +pos=_c82.height()-pos; +} +if(opts.reversed){ +pos=size-pos; +} +return pos; +}; +function _c70(_c83,pos){ +var _c84=$.data(_c83,"slider"); +var opts=_c84.options; +var _c85=_c84.slider; +var size=opts.mode=="h"?_c85.width():_c85.height(); +var pos=opts.mode=="h"?(opts.reversed?(size-pos):pos):(opts.reversed?pos:(size-pos)); +var _c86=opts.converter.toValue.call(_c83,pos,size); +return _c86; +}; +$.fn.slider=function(_c87,_c88){ +if(typeof _c87=="string"){ +return $.fn.slider.methods[_c87](this,_c88); +} +_c87=_c87||{}; +return this.each(function(){ +var _c89=$.data(this,"slider"); +if(_c89){ +$.extend(_c89.options,_c87); +}else{ +_c89=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_c87),slider:init(this)}); +$(this)._propAttr("disabled",false); +} +var opts=_c89.options; +opts.min=parseFloat(opts.min); +opts.max=parseFloat(opts.max); +if(opts.range){ +if(!$.isArray(opts.value)){ +opts.value=$.map(String(opts.value).split(opts.separator),function(v){ +return parseFloat(v); +}); +} +if(opts.value.length<2){ +opts.value.push(opts.max); +} +}else{ +opts.value=parseFloat(opts.value); +} +opts.step=parseFloat(opts.step); +opts.originalValue=opts.value; +_c65(this); +_c5e(this); +_c58(this); +}); +}; +$.fn.slider.methods={options:function(jq){ +return $.data(jq[0],"slider").options; +},destroy:function(jq){ +return jq.each(function(){ +$.data(this,"slider").slider.remove(); +$(this).remove(); +}); +},resize:function(jq,_c8a){ +return jq.each(function(){ +_c58(this,_c8a); +}); +},getValue:function(jq){ +return jq.slider("options").value; +},getValues:function(jq){ +return jq.slider("options").value; +},setValue:function(jq,_c8b){ +return jq.each(function(){ +_c72(this,[_c8b]); +}); +},setValues:function(jq,_c8c){ +return jq.each(function(){ +_c72(this,_c8c); +}); +},clear:function(jq){ +return jq.each(function(){ +var opts=$(this).slider("options"); +_c72(this,opts.range?[opts.min,opts.max]:[opts.min]); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).slider("options"); +$(this).slider(opts.range?"setValues":"setValue",opts.originalValue); +}); +},enable:function(jq){ +return jq.each(function(){ +$.data(this,"slider").options.disabled=false; +_c65(this); +}); +},disable:function(jq){ +return jq.each(function(){ +$.data(this,"slider").options.disabled=true; +_c65(this); +}); +}}; +$.fn.slider.parseOptions=function(_c8d){ +var t=$(_c8d); +return $.extend({},$.parser.parseOptions(_c8d,["width","height","mode",{reversed:"boolean",showTip:"boolean",range:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)}); +}; +$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,range:false,value:0,separator:",",min:0,max:100,step:1,rule:[],tipFormatter:function(_c8e){ +return _c8e; +},converter:{toPosition:function(_c8f,size){ +var opts=$(this).slider("options"); +var p=(_c8f-opts.min)/(opts.max-opts.min)*size; +return p; +},toValue:function(pos,size){ +var opts=$(this).slider("options"); +var v=opts.min+(opts.max-opts.min)*(pos/size); +return v; +}},onChange:function(_c90,_c91){ +},onSlideStart:function(_c92){ +},onSlideEnd:function(_c93){ +},onComplete:function(_c94){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/jquery.easyui.mobile.js b/testapps/GHIssues/src/main/resources/asset/jquery.easyui.mobile.js new file mode 100644 index 000000000..e76d4c028 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/jquery.easyui.mobile.js @@ -0,0 +1,141 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +$.fn.navpanel=function(_1,_2){ +if(typeof _1=="string"){ +var _3=$.fn.navpanel.methods[_1]; +return _3?_3(this,_2):this.panel(_1,_2); +}else{ +_1=_1||{}; +return this.each(function(){ +var _4=$.data(this,"navpanel"); +if(_4){ +$.extend(_4.options,_1); +}else{ +_4=$.data(this,"navpanel",{options:$.extend({},$.fn.navpanel.defaults,$.fn.navpanel.parseOptions(this),_1)}); +} +$(this).panel(_4.options); +}); +} +}; +$.fn.navpanel.methods={options:function(jq){ +return $.data(jq[0],"navpanel").options; +}}; +$.fn.navpanel.parseOptions=function(_5){ +return $.extend({},$.fn.panel.parseOptions(_5),$.parser.parseOptions(_5,[])); +}; +$.fn.navpanel.defaults=$.extend({},$.fn.panel.defaults,{fit:true,border:false,cls:"navpanel"}); +$.parser.plugins.push("navpanel"); +})(jQuery); +(function($){ +$(function(){ +$.mobile.init(); +}); +$.mobile={defaults:{animation:"slide",direction:"left",reverseDirections:{up:"down",down:"up",left:"right",right:"left"}},panels:[],init:function(_6){ +$.mobile.panels=[]; +var _7=$(_6||"body").children(".navpanel:visible"); +if(_7.length){ +_7.not(":first").children(".panel-body").navpanel("close"); +var p=_7.eq(0).children(".panel-body"); +$.mobile.panels.push({panel:p,animation:$.mobile.defaults.animation,direction:$.mobile.defaults.direction}); +} +$(document).unbind(".mobile").bind("click.mobile",function(e){ +var a=$(e.target).closest("a"); +if(a.length){ +var _8=$.parser.parseOptions(a[0],["animation","direction",{back:"boolean"}]); +if(_8.back){ +$.mobile.back(); +e.preventDefault(); +}else{ +var _9=$.trim(a.attr("href")); +if(/^#/.test(_9)){ +var to=$(_9); +if(to.length&&to.hasClass("panel-body")){ +$.mobile.go(to,_8.animation,_8.direction); +e.preventDefault(); +} +} +} +} +}); +$(window).unbind(".mobile").bind("hashchange.mobile",function(){ +var _a=$.mobile.panels.length; +if(_a>1){ +var _b=location.hash; +var p=$.mobile.panels[_a-2]; +if(!_b||_b=="#&"+p.panel.attr("id")){ +$.mobile._back(); +} +} +}); +},nav:function(_c,to,_d,_e){ +if(window.WebKitAnimationEvent){ +_d=_d!=undefined?_d:$.mobile.defaults.animation; +_e=_e!=undefined?_e:$.mobile.defaults.direction; +var _f="m-"+_d+(_e?"-"+_e:""); +var p1=$(_c).panel("open").panel("resize").panel("panel"); +var p2=$(to).panel("open").panel("resize").panel("panel"); +p1.add(p2).bind("webkitAnimationEnd",function(){ +$(this).unbind("webkitAnimationEnd"); +var p=$(this).children(".panel-body"); +if($(this).hasClass("m-in")){ +p.panel("open").panel("resize"); +}else{ +p.panel("close"); +} +$(this).removeClass(_f+" m-in m-out"); +}); +p2.addClass(_f+" m-in"); +p1.addClass(_f+" m-out"); +}else{ +$(to).panel("open").panel("resize"); +$(_c).panel("close"); +} +},_go:function(_10,_11,_12){ +_11=_11!=undefined?_11:$.mobile.defaults.animation; +_12=_12!=undefined?_12:$.mobile.defaults.direction; +var _13=$.mobile.panels[$.mobile.panels.length-1].panel; +var to=$(_10); +if(_13[0]!=to[0]){ +$.mobile.nav(_13,to,_11,_12); +$.mobile.panels.push({panel:to,animation:_11,direction:_12}); +} +},_back:function(){ +if($.mobile.panels.length<2){ +return; +} +var p1=$.mobile.panels.pop(); +var p2=$.mobile.panels[$.mobile.panels.length-1]; +var _14=p1.animation; +var _15=$.mobile.defaults.reverseDirections[p1.direction]||""; +$.mobile.nav(p1.panel,p2.panel,_14,_15); +},go:function(_16,_17,_18){ +_17=_17!=undefined?_17:$.mobile.defaults.animation; +_18=_18!=undefined?_18:$.mobile.defaults.direction; +location.hash="#&"+$(_16).attr("id"); +$.mobile._go(_16,_17,_18); +},back:function(){ +history.go(-1); +}}; +$.map(["validatebox","textbox","passwordbox","filebox","searchbox","combo","combobox","combogrid","combotree","combotreegrid","datebox","datetimebox","numberbox","spinner","numberspinner","timespinner","datetimespinner"],function(_19){ +if($.fn[_19]){ +$.extend($.fn[_19].defaults,{iconWidth:28,tipPosition:"bottom"}); +} +}); +$.map(["spinner","numberspinner","timespinner","datetimespinner"],function(_1a){ +if($.fn[_1a]){ +$.extend($.fn[_1a].defaults,{iconWidth:56,spinAlign:"horizontal"}); +} +}); +if($.fn.menu){ +$.extend($.fn.menu.defaults,{itemHeight:30,noline:true}); +} +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/jquery.min.js b/testapps/GHIssues/src/main/resources/asset/jquery.min.js new file mode 100644 index 000000000..e83647587 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; +}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
                                              a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
                                              ","
                                              "],area:[1,"",""],param:[1,"",""],thead:[1,"","
                                              "],tr:[2,"","
                                              "],col:[2,"","
                                              "],td:[3,"","
                                              "],_default:l.htmlSerialize?[0,"",""]:[1,"X
                                              ","
                                              "]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("").appendTo("body"); +_e.attr("src",window.ActiveXObject?"javascript:false":"about:blank"); +_e.css({position:"absolute",top:-1000,left:-1000}); +_e.bind("load",cb); +_f(_b); +function _f(_10){ +var _11=$(_a); +if(_c.url){ +_11.attr("action",_c.url); +} +var t=_11.attr("target"),a=_11.attr("action"); +_11.attr("target",_d); +var _12=$(); +try{ +for(var n in _10){ +var _13=$("").val(_10[n]).appendTo(_11); +_12=_12.add(_13); +} +_14(); +_11[0].submit(); +} +finally{ +_11.attr("action",a); +t?_11.attr("target",t):_11.removeAttr("target"); +_12.remove(); +} +}; +function _14(){ +var f=$("#"+_d); +if(!f.length){ +return; +} +try{ +var s=f.contents()[0].readyState; +if(s&&s.toLowerCase()=="uninitialized"){ +setTimeout(_14,100); +} +} +catch(e){ +cb(); +} +}; +var _15=10; +function cb(){ +var f=$("#"+_d); +if(!f.length){ +return; +} +f.unbind(); +var _16=""; +try{ +var _17=f.contents().find("body"); +_16=_17.html(); +if(_16==""){ +if(--_15){ +setTimeout(cb,100); +return; +} +} +var ta=_17.find(">textarea"); +if(ta.length){ +_16=ta.val(); +}else{ +var pre=_17.find(">pre"); +if(pre.length){ +_16=pre.html(); +} +} +} +catch(e){ +} +_c.success.call(_a,_16); +setTimeout(function(){ +f.unbind(); +f.remove(); +},100); +}; +}; +function _9(_18,_19){ +var _1a=$.data(_18,"form").options; +var _1b=new FormData($(_18)[0]); +for(var _1c in _19){ +_1b.append(_1c,_19[_1c]); +} +$.ajax({url:_1a.url,type:"post",xhr:function(){ +var xhr=$.ajaxSettings.xhr(); +if(xhr.upload){ +xhr.upload.addEventListener("progress",function(e){ +if(e.lengthComputable){ +var _1d=e.total; +var _1e=e.loaded||e.position; +var _1f=Math.ceil(_1e*100/_1d); +_1a.onProgress.call(_18,_1f); +} +},false); +} +return xhr; +},data:_1b,dataType:"html",cache:false,contentType:false,processData:false,complete:function(res){ +_1a.success.call(_18,res.responseText); +}}); +}; +function _20(_21,_22){ +var _23=$.data(_21,"form").options; +if(typeof _22=="string"){ +var _24={}; +if(_23.onBeforeLoad.call(_21,_24)==false){ +return; +} +$.ajax({url:_22,data:_24,dataType:"json",success:function(_25){ +_26(_25); +},error:function(){ +_23.onLoadError.apply(_21,arguments); +}}); +}else{ +_26(_22); +} +function _26(_27){ +var _28=$(_21); +for(var _29 in _27){ +var val=_27[_29]; +if(!_2a(_29,val)){ +if(!_2b(_29,val)){ +_28.find("input[name=\""+_29+"\"]").val(val); +_28.find("textarea[name=\""+_29+"\"]").val(val); +_28.find("select[name=\""+_29+"\"]").val(val); +} +} +} +_23.onLoadSuccess.call(_21,_27); +_28.form("validate"); +}; +function _2a(_2c,val){ +var cc=$(_21).find("[switchbuttonName=\""+_2c+"\"]"); +if(cc.length){ +cc.switchbutton("uncheck"); +cc.each(function(){ +if(_2d($(this).switchbutton("options").value,val)){ +$(this).switchbutton("check"); +} +}); +return true; +} +cc=$(_21).find("input[name=\""+_2c+"\"][type=radio], input[name=\""+_2c+"\"][type=checkbox]"); +if(cc.length){ +cc._propAttr("checked",false); +cc.each(function(){ +if(_2d($(this).val(),val)){ +$(this)._propAttr("checked",true); +} +}); +return true; +} +return false; +}; +function _2d(v,val){ +if(v==String(val)||$.inArray(v,$.isArray(val)?val:[val])>=0){ +return true; +}else{ +return false; +} +}; +function _2b(_2e,val){ +var _2f=$(_21).find("[textboxName=\""+_2e+"\"],[sliderName=\""+_2e+"\"]"); +if(_2f.length){ +for(var i=0;i<_23.fieldTypes.length;i++){ +var _30=_23.fieldTypes[i]; +var _31=_2f.data(_30); +if(_31){ +if(_31.options.multiple||_31.options.range){ +_2f[_30]("setValues",val); +}else{ +_2f[_30]("setValue",val); +} +return true; +} +} +} +return false; +}; +}; +function _32(_33){ +$("input,select,textarea",_33).each(function(){ +if($(this).hasClass("textbox-value")){ +return; +} +var t=this.type,tag=this.tagName.toLowerCase(); +if(t=="text"||t=="hidden"||t=="password"||tag=="textarea"){ +this.value=""; +}else{ +if(t=="file"){ +var _34=$(this); +if(!_34.hasClass("textbox-value")){ +var _35=_34.clone().val(""); +_35.insertAfter(_34); +if(_34.data("validatebox")){ +_34.validatebox("destroy"); +_35.validatebox(); +}else{ +_34.remove(); +} +} +}else{ +if(t=="checkbox"||t=="radio"){ +this.checked=false; +}else{ +if(tag=="select"){ +this.selectedIndex=-1; +} +} +} +} +}); +var tmp=$(); +var _36=$(_33); +var _37=$.data(_33,"form").options; +for(var i=0;i<_37.fieldTypes.length;i++){ +var _38=_37.fieldTypes[i]; +var _39=_36.find("."+_38+"-f").not(tmp); +if(_39.length&&_39[_38]){ +_39[_38]("clear"); +tmp=tmp.add(_39); +} +} +_36.form("validate"); +}; +function _3a(_3b){ +_3b.reset(); +var _3c=$(_3b); +var _3d=$.data(_3b,"form").options; +for(var i=_3d.fieldTypes.length-1;i>=0;i--){ +var _3e=_3d.fieldTypes[i]; +var _3f=_3c.find("."+_3e+"-f"); +if(_3f.length&&_3f[_3e]){ +_3f[_3e]("reset"); +} +} +_3c.form("validate"); +}; +function _40(_41){ +var _42=$.data(_41,"form").options; +$(_41).unbind(".form"); +if(_42.ajax){ +$(_41).bind("submit.form",function(){ +setTimeout(function(){ +_1(_41,_42); +},0); +return false; +}); +} +$(_41).bind("_change.form",function(e,t){ +if($.inArray(t,_42.dirtyFields)==-1){ +_42.dirtyFields.push(t); +} +_42.onChange.call(this,t); +}).bind("change.form",function(e){ +var t=e.target; +if(!$(t).hasClass("textbox-text")){ +if($.inArray(t,_42.dirtyFields)==-1){ +_42.dirtyFields.push(t); +} +_42.onChange.call(this,t); +} +}); +_43(_41,_42.novalidate); +}; +function _44(_45,_46){ +_46=_46||{}; +var _47=$.data(_45,"form"); +if(_47){ +$.extend(_47.options,_46); +}else{ +$.data(_45,"form",{options:$.extend({},$.fn.form.defaults,$.fn.form.parseOptions(_45),_46)}); +} +}; +function _48(_49){ +if($.fn.validatebox){ +var t=$(_49); +t.find(".validatebox-text:not(:disabled)").validatebox("validate"); +var _4a=t.find(".validatebox-invalid"); +_4a.filter(":not(:disabled):first").focus(); +return _4a.length==0; +} +return true; +}; +function _43(_4b,_4c){ +var _4d=$.data(_4b,"form").options; +_4d.novalidate=_4c; +$(_4b).find(".validatebox-text:not(:disabled)").validatebox(_4c?"disableValidation":"enableValidation"); +}; +$.fn.form=function(_4e,_4f){ +if(typeof _4e=="string"){ +this.each(function(){ +_44(this); +}); +return $.fn.form.methods[_4e](this,_4f); +} +return this.each(function(){ +_44(this,_4e); +_40(this); +}); +}; +$.fn.form.methods={options:function(jq){ +return $.data(jq[0],"form").options; +},submit:function(jq,_50){ +return jq.each(function(){ +_1(this,_50); +}); +},load:function(jq,_51){ +return jq.each(function(){ +_20(this,_51); +}); +},clear:function(jq){ +return jq.each(function(){ +_32(this); +}); +},reset:function(jq){ +return jq.each(function(){ +_3a(this); +}); +},validate:function(jq){ +return _48(jq[0]); +},disableValidation:function(jq){ +return jq.each(function(){ +_43(this,true); +}); +},enableValidation:function(jq){ +return jq.each(function(){ +_43(this,false); +}); +},resetValidation:function(jq){ +return jq.each(function(){ +$(this).find(".validatebox-text:not(:disabled)").validatebox("resetValidation"); +}); +},resetDirty:function(jq){ +return jq.each(function(){ +$(this).form("options").dirtyFields=[]; +}); +}}; +$.fn.form.parseOptions=function(_52){ +var t=$(_52); +return $.extend({},$.parser.parseOptions(_52,[{ajax:"boolean",dirty:"boolean"}]),{url:(t.attr("action")?t.attr("action"):undefined)}); +}; +$.fn.form.defaults={fieldTypes:["tagbox","combobox","combotree","combogrid","combotreegrid","datetimebox","datebox","combo","datetimespinner","timespinner","numberspinner","spinner","slider","searchbox","numberbox","passwordbox","filebox","textbox","switchbutton"],novalidate:false,ajax:true,iframe:true,dirty:false,dirtyFields:[],url:null,queryParams:{},onSubmit:function(_53){ +return $(this).form("validate"); +},onProgress:function(_54){ +},success:function(_55){ +},onBeforeLoad:function(_56){ +},onLoadSuccess:function(_57){ +},onLoadError:function(){ +},onChange:function(_58){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.layout.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.layout.js new file mode 100755 index 000000000..0acc557b0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.layout.js @@ -0,0 +1,519 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +var _1=false; +function _2(_3,_4){ +var _5=$.data(_3,"layout"); +var _6=_5.options; +var _7=_5.panels; +var cc=$(_3); +if(_4){ +$.extend(_6,{width:_4.width,height:_4.height}); +} +if(_3.tagName.toLowerCase()=="body"){ +cc._size("fit"); +}else{ +cc._size(_6); +} +var _8={top:0,left:0,width:cc.width(),height:cc.height()}; +_9(_a(_7.expandNorth)?_7.expandNorth:_7.north,"n"); +_9(_a(_7.expandSouth)?_7.expandSouth:_7.south,"s"); +_b(_a(_7.expandEast)?_7.expandEast:_7.east,"e"); +_b(_a(_7.expandWest)?_7.expandWest:_7.west,"w"); +_7.center.panel("resize",_8); +function _9(pp,_c){ +if(!pp.length||!_a(pp)){ +return; +} +var _d=pp.panel("options"); +pp.panel("resize",{width:cc.width(),height:_d.height}); +var _e=pp.panel("panel").outerHeight(); +pp.panel("move",{left:0,top:(_c=="n"?0:cc.height()-_e)}); +_8.height-=_e; +if(_c=="n"){ +_8.top+=_e; +if(!_d.split&&_d.border){ +_8.top--; +} +} +if(!_d.split&&_d.border){ +_8.height++; +} +}; +function _b(pp,_f){ +if(!pp.length||!_a(pp)){ +return; +} +var _10=pp.panel("options"); +pp.panel("resize",{width:_10.width,height:_8.height}); +var _11=pp.panel("panel").outerWidth(); +pp.panel("move",{left:(_f=="e"?cc.width()-_11:0),top:_8.top}); +_8.width-=_11; +if(_f=="w"){ +_8.left+=_11; +if(!_10.split&&_10.border){ +_8.left--; +} +} +if(!_10.split&&_10.border){ +_8.width++; +} +}; +}; +function _12(_13){ +var cc=$(_13); +cc.addClass("layout"); +function _14(el){ +var _15=$.fn.layout.parsePanelOptions(el); +if("north,south,east,west,center".indexOf(_15.region)>=0){ +_19(_13,_15,el); +} +}; +var _16=cc.layout("options"); +var _17=_16.onAdd; +_16.onAdd=function(){ +}; +cc.find(">div,>form>div").each(function(){ +_14(this); +}); +_16.onAdd=_17; +cc.append("
                                              "); +cc.bind("_resize",function(e,_18){ +if($(this).hasClass("easyui-fluid")||_18){ +_2(_13); +} +return false; +}); +}; +function _19(_1a,_1b,el){ +_1b.region=_1b.region||"center"; +var _1c=$.data(_1a,"layout").panels; +var cc=$(_1a); +var dir=_1b.region; +if(_1c[dir].length){ +return; +} +var pp=$(el); +if(!pp.length){ +pp=$("
                                              ").appendTo(cc); +} +var _1d=$.extend({},$.fn.layout.paneldefaults,{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),doSize:false,collapsible:true,onOpen:function(){ +var _1e=$(this).panel("header").children("div.panel-tool"); +_1e.children("a.panel-tool-collapse").hide(); +var _1f={north:"up",south:"down",east:"right",west:"left"}; +if(!_1f[dir]){ +return; +} +var _20="layout-button-"+_1f[dir]; +var t=_1e.children("a."+_20); +if(!t.length){ +t=$("").addClass(_20).appendTo(_1e); +t.bind("click",{dir:dir},function(e){ +_39(_1a,e.data.dir); +return false; +}); +} +$(this).panel("options").collapsible?t.show():t.hide(); +}},_1b,{cls:((_1b.cls||"")+" layout-panel layout-panel-"+dir),bodyCls:((_1b.bodyCls||"")+" layout-body")}); +pp.panel(_1d); +_1c[dir]=pp; +var _21={north:"s",south:"n",east:"w",west:"e"}; +var _22=pp.panel("panel"); +if(pp.panel("options").split){ +_22.addClass("layout-split-"+dir); +} +_22.resizable($.extend({},{handles:(_21[dir]||""),disabled:(!pp.panel("options").split),onStartResize:function(e){ +_1=true; +if(dir=="north"||dir=="south"){ +var _23=$(">div.layout-split-proxy-v",_1a); +}else{ +var _23=$(">div.layout-split-proxy-h",_1a); +} +var top=0,_24=0,_25=0,_26=0; +var pos={display:"block"}; +if(dir=="north"){ +pos.top=parseInt(_22.css("top"))+_22.outerHeight()-_23.height(); +pos.left=parseInt(_22.css("left")); +pos.width=_22.outerWidth(); +pos.height=_23.height(); +}else{ +if(dir=="south"){ +pos.top=parseInt(_22.css("top")); +pos.left=parseInt(_22.css("left")); +pos.width=_22.outerWidth(); +pos.height=_23.height(); +}else{ +if(dir=="east"){ +pos.top=parseInt(_22.css("top"))||0; +pos.left=parseInt(_22.css("left"))||0; +pos.width=_23.width(); +pos.height=_22.outerHeight(); +}else{ +if(dir=="west"){ +pos.top=parseInt(_22.css("top"))||0; +pos.left=_22.outerWidth()-_23.width(); +pos.width=_23.width(); +pos.height=_22.outerHeight(); +} +} +} +} +_23.css(pos); +$("
                                              ").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc); +},onResize:function(e){ +if(dir=="north"||dir=="south"){ +var _27=_28(this); +$(this).resizable("options").maxHeight=_27; +var _29=$(">div.layout-split-proxy-v",_1a); +var top=dir=="north"?e.data.height-_29.height():$(_1a).height()-e.data.height; +_29.css("top",top); +}else{ +var _2a=_28(this); +$(this).resizable("options").maxWidth=_2a; +var _29=$(">div.layout-split-proxy-h",_1a); +var _2b=dir=="west"?e.data.width-_29.width():$(_1a).width()-e.data.width; +_29.css("left",_2b); +} +return false; +},onStopResize:function(e){ +cc.children("div.layout-split-proxy-v,div.layout-split-proxy-h").hide(); +pp.panel("resize",e.data); +_2(_1a); +_1=false; +cc.find(">div.layout-mask").remove(); +}},_1b)); +cc.layout("options").onAdd.call(_1a,dir); +function _28(p){ +var _2c="expand"+dir.substring(0,1).toUpperCase()+dir.substring(1); +var _2d=_1c["center"]; +var _2e=(dir=="north"||dir=="south")?"minHeight":"minWidth"; +var _2f=(dir=="north"||dir=="south")?"maxHeight":"maxWidth"; +var _30=(dir=="north"||dir=="south")?"_outerHeight":"_outerWidth"; +var _31=$.parser.parseValue(_2f,_1c[dir].panel("options")[_2f],$(_1a)); +var _32=$.parser.parseValue(_2e,_2d.panel("options")[_2e],$(_1a)); +var _33=_2d.panel("panel")[_30]()-_32; +if(_a(_1c[_2c])){ +_33+=_1c[_2c][_30]()-1; +}else{ +_33+=$(p)[_30](); +} +if(_33>_31){ +_33=_31; +} +return _33; +}; +}; +function _34(_35,_36){ +var _37=$.data(_35,"layout").panels; +if(_37[_36].length){ +_37[_36].panel("destroy"); +_37[_36]=$(); +var _38="expand"+_36.substring(0,1).toUpperCase()+_36.substring(1); +if(_37[_38]){ +_37[_38].panel("destroy"); +_37[_38]=undefined; +} +$(_35).layout("options").onRemove.call(_35,_36); +} +}; +function _39(_3a,_3b,_3c){ +if(_3c==undefined){ +_3c="normal"; +} +var _3d=$.data(_3a,"layout").panels; +var p=_3d[_3b]; +var _3e=p.panel("options"); +if(_3e.onBeforeCollapse.call(p)==false){ +return; +} +var _3f="expand"+_3b.substring(0,1).toUpperCase()+_3b.substring(1); +if(!_3d[_3f]){ +_3d[_3f]=_40(_3b); +var ep=_3d[_3f].panel("panel"); +if(!_3e.expandMode){ +ep.css("cursor","default"); +}else{ +ep.bind("click",function(){ +if(_3e.expandMode=="dock"){ +_4f(_3a,_3b); +}else{ +p.panel("expand",false).panel("open"); +var _41=_42(); +p.panel("resize",_41.collapse); +p.panel("panel").unbind(".layout").bind("mouseleave.layout",{region:_3b},function(e){ +$(this).stop(true,true); +if(_1==true){ +return; +} +if($("body>div.combo-p>div.combo-panel:visible").length){ +return; +} +_39(_3a,e.data.region); +}); +p.panel("panel").animate(_41.expand,function(){ +$(_3a).layout("options").onExpand.call(_3a,_3b); +}); +} +return false; +}); +} +} +var _43=_42(); +if(!_a(_3d[_3f])){ +_3d.center.panel("resize",_43.resizeC); +} +p.panel("panel").animate(_43.collapse,_3c,function(){ +p.panel("collapse",false).panel("close"); +_3d[_3f].panel("open").panel("resize",_43.expandP); +$(this).unbind(".layout"); +$(_3a).layout("options").onCollapse.call(_3a,_3b); +}); +function _40(dir){ +var _44={"east":"left","west":"right","north":"down","south":"up"}; +var _45=(_3e.region=="north"||_3e.region=="south"); +var _46="layout-button-"+_44[dir]; +var p=$("
                                              ").appendTo(_3a); +p.panel($.extend({},$.fn.layout.paneldefaults,{cls:("layout-expand layout-expand-"+dir),title:" ",titleDirection:_3e.titleDirection,iconCls:(_3e.hideCollapsedContent?null:_3e.iconCls),closed:true,minWidth:0,minHeight:0,doSize:false,region:_3e.region,collapsedSize:_3e.collapsedSize,noheader:(!_45&&_3e.hideExpandTool),tools:((_45&&_3e.hideExpandTool)?null:[{iconCls:_46,handler:function(){ +_4f(_3a,_3b); +return false; +}}]),onResize:function(){ +var _47=$(this).children(".layout-expand-title"); +if(_47.length){ +_47._outerWidth($(this).height()); +var _48=($(this).width()-Math.min(_47._outerWidth(),_47._outerHeight()))/2; +var top=Math.max(_47._outerWidth(),_47._outerHeight()); +if(_47.hasClass("layout-expand-title-down")){ +_48+=Math.min(_47._outerWidth(),_47._outerHeight()); +top=0; +} +_47.css({left:(_48+"px"),top:(top+"px")}); +} +}})); +if(!_3e.hideCollapsedContent){ +var _49=typeof _3e.collapsedContent=="function"?_3e.collapsedContent.call(p[0],_3e.title):_3e.collapsedContent; +_45?p.panel("setTitle",_49):p.html(_49); +} +p.panel("panel").hover(function(){ +$(this).addClass("layout-expand-over"); +},function(){ +$(this).removeClass("layout-expand-over"); +}); +return p; +}; +function _42(){ +var cc=$(_3a); +var _4a=_3d.center.panel("options"); +var _4b=_3e.collapsedSize; +if(_3b=="east"){ +var _4c=p.panel("panel")._outerWidth(); +var _4d=_4a.width+_4c-_4b; +if(_3e.split||!_3e.border){ +_4d++; +} +return {resizeC:{width:_4d},expand:{left:cc.width()-_4c},expandP:{top:_4a.top,left:cc.width()-_4b,width:_4b,height:_4a.height},collapse:{left:cc.width(),top:_4a.top,height:_4a.height}}; +}else{ +if(_3b=="west"){ +var _4c=p.panel("panel")._outerWidth(); +var _4d=_4a.width+_4c-_4b; +if(_3e.split||!_3e.border){ +_4d++; +} +return {resizeC:{width:_4d,left:_4b-1},expand:{left:0},expandP:{left:0,top:_4a.top,width:_4b,height:_4a.height},collapse:{left:-_4c,top:_4a.top,height:_4a.height}}; +}else{ +if(_3b=="north"){ +var _4e=p.panel("panel")._outerHeight(); +var hh=_4a.height; +if(!_a(_3d.expandNorth)){ +hh+=_4e-_4b+((_3e.split||!_3e.border)?1:0); +} +_3d.east.add(_3d.west).add(_3d.expandEast).add(_3d.expandWest).panel("resize",{top:_4b-1,height:hh}); +return {resizeC:{top:_4b-1,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:_4b},collapse:{top:-_4e,width:cc.width()}}; +}else{ +if(_3b=="south"){ +var _4e=p.panel("panel")._outerHeight(); +var hh=_4a.height; +if(!_a(_3d.expandSouth)){ +hh+=_4e-_4b+((_3e.split||!_3e.border)?1:0); +} +_3d.east.add(_3d.west).add(_3d.expandEast).add(_3d.expandWest).panel("resize",{height:hh}); +return {resizeC:{height:hh},expand:{top:cc.height()-_4e},expandP:{top:cc.height()-_4b,left:0,width:cc.width(),height:_4b},collapse:{top:cc.height(),width:cc.width()}}; +} +} +} +} +}; +}; +function _4f(_50,_51){ +var _52=$.data(_50,"layout").panels; +var p=_52[_51]; +var _53=p.panel("options"); +if(_53.onBeforeExpand.call(p)==false){ +return; +} +var _54="expand"+_51.substring(0,1).toUpperCase()+_51.substring(1); +if(_52[_54]){ +_52[_54].panel("close"); +p.panel("panel").stop(true,true); +p.panel("expand",false).panel("open"); +var _55=_56(); +p.panel("resize",_55.collapse); +p.panel("panel").animate(_55.expand,function(){ +_2(_50); +$(_50).layout("options").onExpand.call(_50,_51); +}); +} +function _56(){ +var cc=$(_50); +var _57=_52.center.panel("options"); +if(_51=="east"&&_52.expandEast){ +return {collapse:{left:cc.width(),top:_57.top,height:_57.height},expand:{left:cc.width()-p.panel("panel")._outerWidth()}}; +}else{ +if(_51=="west"&&_52.expandWest){ +return {collapse:{left:-p.panel("panel")._outerWidth(),top:_57.top,height:_57.height},expand:{left:0}}; +}else{ +if(_51=="north"&&_52.expandNorth){ +return {collapse:{top:-p.panel("panel")._outerHeight(),width:cc.width()},expand:{top:0}}; +}else{ +if(_51=="south"&&_52.expandSouth){ +return {collapse:{top:cc.height(),width:cc.width()},expand:{top:cc.height()-p.panel("panel")._outerHeight()}}; +} +} +} +} +}; +}; +function _a(pp){ +if(!pp){ +return false; +} +if(pp.length){ +return pp.panel("panel").is(":visible"); +}else{ +return false; +} +}; +function _58(_59){ +var _5a=$.data(_59,"layout"); +var _5b=_5a.options; +var _5c=_5a.panels; +var _5d=_5b.onCollapse; +_5b.onCollapse=function(){ +}; +_5e("east"); +_5e("west"); +_5e("north"); +_5e("south"); +_5b.onCollapse=_5d; +function _5e(_5f){ +var p=_5c[_5f]; +if(p.length&&p.panel("options").collapsed){ +_39(_59,_5f,0); +} +}; +}; +function _60(_61,_62,_63){ +var p=$(_61).layout("panel",_62); +p.panel("options").split=_63; +var cls="layout-split-"+_62; +var _64=p.panel("panel").removeClass(cls); +if(_63){ +_64.addClass(cls); +} +_64.resizable({disabled:(!_63)}); +_2(_61); +}; +$.fn.layout=function(_65,_66){ +if(typeof _65=="string"){ +return $.fn.layout.methods[_65](this,_66); +} +_65=_65||{}; +return this.each(function(){ +var _67=$.data(this,"layout"); +if(_67){ +$.extend(_67.options,_65); +}else{ +var _68=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_65); +$.data(this,"layout",{options:_68,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}}); +_12(this); +} +_2(this); +_58(this); +}); +}; +$.fn.layout.methods={options:function(jq){ +return $.data(jq[0],"layout").options; +},resize:function(jq,_69){ +return jq.each(function(){ +_2(this,_69); +}); +},panel:function(jq,_6a){ +return $.data(jq[0],"layout").panels[_6a]; +},collapse:function(jq,_6b){ +return jq.each(function(){ +_39(this,_6b); +}); +},expand:function(jq,_6c){ +return jq.each(function(){ +_4f(this,_6c); +}); +},add:function(jq,_6d){ +return jq.each(function(){ +_19(this,_6d); +_2(this); +if($(this).layout("panel",_6d.region).panel("options").collapsed){ +_39(this,_6d.region,0); +} +}); +},remove:function(jq,_6e){ +return jq.each(function(){ +_34(this,_6e); +_2(this); +}); +},split:function(jq,_6f){ +return jq.each(function(){ +_60(this,_6f,true); +}); +},unsplit:function(jq,_70){ +return jq.each(function(){ +_60(this,_70,false); +}); +}}; +$.fn.layout.parseOptions=function(_71){ +return $.extend({},$.parser.parseOptions(_71,[{fit:"boolean"}])); +}; +$.fn.layout.defaults={fit:false,onExpand:function(_72){ +},onCollapse:function(_73){ +},onAdd:function(_74){ +},onRemove:function(_75){ +}}; +$.fn.layout.parsePanelOptions=function(_76){ +var t=$(_76); +return $.extend({},$.fn.panel.parseOptions(_76),$.parser.parseOptions(_76,["region",{split:"boolean",collpasedSize:"number",minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number"}])); +}; +$.fn.layout.paneldefaults=$.extend({},$.fn.panel.defaults,{region:null,split:false,collapsedSize:28,expandMode:"float",hideExpandTool:false,hideCollapsedContent:true,collapsedContent:function(_77){ +var p=$(this); +var _78=p.panel("options"); +if(_78.region=="north"||_78.region=="south"){ +return _77; +} +var cc=[]; +if(_78.iconCls){ +cc.push("
                                              "); +} +cc.push("
                                              "); +cc.push(_77); +cc.push("
                                              "); +return cc.join(""); +},minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.linkbutton.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.linkbutton.js new file mode 100755 index 000000000..65d6fb8b1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.linkbutton.js @@ -0,0 +1,184 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2,_3){ +var _4=$.data(_2,"linkbutton").options; +if(_3){ +$.extend(_4,_3); +} +if(_4.width||_4.height||_4.fit){ +var _5=$(_2); +var _6=_5.parent(); +var _7=_5.is(":visible"); +if(!_7){ +var _8=$("
                                              ").insertBefore(_2); +var _9={position:_5.css("position"),display:_5.css("display"),left:_5.css("left")}; +_5.appendTo("body"); +_5.css({position:"absolute",display:"inline-block",left:-20000}); +} +_5._size(_4,_6); +var _a=_5.find(".l-btn-left"); +_a.css("margin-top",0); +_a.css("margin-top",parseInt((_5.height()-_a.height())/2)+"px"); +if(!_7){ +_5.insertAfter(_8); +_5.css(_9); +_8.remove(); +} +} +}; +function _b(_c){ +var _d=$.data(_c,"linkbutton").options; +var t=$(_c).empty(); +t.addClass("l-btn").removeClass("l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline"); +t.removeClass("l-btn-small l-btn-medium l-btn-large").addClass("l-btn-"+_d.size); +if(_d.plain){ +t.addClass("l-btn-plain"); +} +if(_d.outline){ +t.addClass("l-btn-outline"); +} +if(_d.selected){ +t.addClass(_d.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); +} +t.attr("group",_d.group||""); +t.attr("id",_d.id||""); +var _e=$("").appendTo(t); +if(_d.text){ +$("").html(_d.text).appendTo(_e); +}else{ +$(" ").appendTo(_e); +} +if(_d.iconCls){ +$(" ").addClass(_d.iconCls).appendTo(_e); +_e.addClass("l-btn-icon-"+_d.iconAlign); +} +t.unbind(".linkbutton").bind("focus.linkbutton",function(){ +if(!_d.disabled){ +$(this).addClass("l-btn-focus"); +} +}).bind("blur.linkbutton",function(){ +$(this).removeClass("l-btn-focus"); +}).bind("click.linkbutton",function(){ +if(!_d.disabled){ +if(_d.toggle){ +if(_d.selected){ +$(this).linkbutton("unselect"); +}else{ +$(this).linkbutton("select"); +} +} +_d.onClick.call(this); +} +}); +_f(_c,_d.selected); +_10(_c,_d.disabled); +}; +function _f(_11,_12){ +var _13=$.data(_11,"linkbutton").options; +if(_12){ +if(_13.group){ +$("a.l-btn[group=\""+_13.group+"\"]").each(function(){ +var o=$(this).linkbutton("options"); +if(o.toggle){ +$(this).removeClass("l-btn-selected l-btn-plain-selected"); +o.selected=false; +} +}); +} +$(_11).addClass(_13.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); +_13.selected=true; +}else{ +if(!_13.group){ +$(_11).removeClass("l-btn-selected l-btn-plain-selected"); +_13.selected=false; +} +} +}; +function _10(_14,_15){ +var _16=$.data(_14,"linkbutton"); +var _17=_16.options; +$(_14).removeClass("l-btn-disabled l-btn-plain-disabled"); +if(_15){ +_17.disabled=true; +var _18=$(_14).attr("href"); +if(_18){ +_16.href=_18; +$(_14).attr("href","javascript:;"); +} +if(_14.onclick){ +_16.onclick=_14.onclick; +_14.onclick=null; +} +_17.plain?$(_14).addClass("l-btn-disabled l-btn-plain-disabled"):$(_14).addClass("l-btn-disabled"); +}else{ +_17.disabled=false; +if(_16.href){ +$(_14).attr("href",_16.href); +} +if(_16.onclick){ +_14.onclick=_16.onclick; +} +} +}; +$.fn.linkbutton=function(_19,_1a){ +if(typeof _19=="string"){ +return $.fn.linkbutton.methods[_19](this,_1a); +} +_19=_19||{}; +return this.each(function(){ +var _1b=$.data(this,"linkbutton"); +if(_1b){ +$.extend(_1b.options,_19); +}else{ +$.data(this,"linkbutton",{options:$.extend({},$.fn.linkbutton.defaults,$.fn.linkbutton.parseOptions(this),_19)}); +$(this)._propAttr("disabled",false); +$(this).bind("_resize",function(e,_1c){ +if($(this).hasClass("easyui-fluid")||_1c){ +_1(this); +} +return false; +}); +} +_b(this); +_1(this); +}); +}; +$.fn.linkbutton.methods={options:function(jq){ +return $.data(jq[0],"linkbutton").options; +},resize:function(jq,_1d){ +return jq.each(function(){ +_1(this,_1d); +}); +},enable:function(jq){ +return jq.each(function(){ +_10(this,false); +}); +},disable:function(jq){ +return jq.each(function(){ +_10(this,true); +}); +},select:function(jq){ +return jq.each(function(){ +_f(this,true); +}); +},unselect:function(jq){ +return jq.each(function(){ +_f(this,false); +}); +}}; +$.fn.linkbutton.parseOptions=function(_1e){ +var t=$(_1e); +return $.extend({},$.parser.parseOptions(_1e,["id","iconCls","iconAlign","group","size","text",{plain:"boolean",toggle:"boolean",selected:"boolean",outline:"boolean"}]),{disabled:(t.attr("disabled")?true:undefined),text:($.trim(t.html())||undefined),iconCls:(t.attr("icon")||t.attr("iconCls"))}); +}; +$.fn.linkbutton.defaults={id:null,disabled:false,toggle:false,selected:false,outline:false,group:null,plain:false,text:"",iconCls:null,iconAlign:"left",size:"small",onClick:function(){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.maskedbox.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.maskedbox.js new file mode 100644 index 000000000..268b285b7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.maskedbox.js @@ -0,0 +1,221 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$(_2).data("maskedbox"); +var _4=_3.options; +$(_2).textbox(_4); +$(_2).maskedbox("initValue",_4.value); +}; +function _5(_6,_7){ +var _8=$(_6).maskedbox("options"); +var tt=(_7||$(_6).maskedbox("getText")||"").split(""); +var vv=[]; +for(var i=0;i<_8.mask.length;i++){ +if(_8.masks[_8.mask[i]]){ +var t=tt[i]; +vv.push(t!=_8.promptChar?t:" "); +} +} +return vv.join(""); +}; +function _9(_a,_b){ +var _c=$(_a).maskedbox("options"); +var cc=_b.split(""); +var tt=[]; +for(var i=0;i<_c.mask.length;i++){ +var m=_c.mask[i]; +var r=_c.masks[m]; +if(r){ +var c=cc.shift(); +if(c!=undefined){ +var d=new RegExp(r,"i"); +if(d.test(c)){ +tt.push(c); +continue; +} +} +tt.push(_c.promptChar); +}else{ +tt.push(m); +} +} +return tt.join(""); +}; +function _d(_e,c){ +var _f=$(_e).maskedbox("options"); +var _10=$(_e).maskedbox("getSelectionRange"); +var _11=_12(_e,_10.start); +var end=_12(_e,_10.end); +if(_11!=-1){ +var r=new RegExp(_f.masks[_f.mask[_11]],"i"); +if(r.test(c)){ +var vv=_5(_e).split(""); +var _13=_11-_14(_e,_11); +var _15=end-_14(_e,end); +vv.splice(_13,_15-_13,c); +$(_e).maskedbox("setValue",_9(_e,vv.join(""))); +_11=_12(_e,++_11); +$(_e).maskedbox("setSelectionRange",{start:_11,end:_11}); +} +} +}; +function _16(_17,_18){ +var _19=$(_17).maskedbox("options"); +var vv=_5(_17).split(""); +var _1a=$(_17).maskedbox("getSelectionRange"); +if(_1a.start==_1a.end){ +if(_18){ +var _1b=_1c(_17,_1a.start); +}else{ +var _1b=_12(_17,_1a.start); +} +var _1d=_1b-_14(_17,_1b); +if(_1d>=0){ +vv.splice(_1d,1); +} +}else{ +var _1b=_12(_17,_1a.start); +var end=_1c(_17,_1a.end); +var _1d=_1b-_14(_17,_1b); +var _1e=end-_14(_17,end); +vv.splice(_1d,_1e-_1d+1); +} +$(_17).maskedbox("setValue",_9(_17,vv.join(""))); +$(_17).maskedbox("setSelectionRange",{start:_1b,end:_1b}); +}; +function _14(_1f,pos){ +var _20=$(_1f).maskedbox("options"); +var _21=0; +if(pos>=_20.mask.length){ +pos--; +} +for(var i=pos;i>=0;i--){ +if(_20.masks[_20.mask[i]]==undefined){ +_21++; +} +} +return _21; +}; +function _12(_22,pos){ +var _23=$(_22).maskedbox("options"); +var m=_23.mask[pos]; +var r=_23.masks[m]; +while(pos<_23.mask.length&&!r){ +pos++; +m=_23.mask[pos]; +r=_23.masks[m]; +} +return pos; +}; +function _1c(_24,pos){ +var _25=$(_24).maskedbox("options"); +var m=_25.mask[--pos]; +var r=_25.masks[m]; +while(pos>=0&&!r){ +pos--; +m=_25.mask[pos]; +r=_25.masks[m]; +} +return pos<0?0:pos; +}; +function _26(e){ +if(e.metaKey||e.ctrlKey){ +return; +} +var _27=e.data.target; +var _28=$(_27).maskedbox("options"); +var _29=[9,13,35,36,37,39]; +if($.inArray(e.keyCode,_29)!=-1){ +return true; +} +if(e.keyCode>=96&&e.keyCode<=105){ +e.keyCode-=48; +} +var c=String.fromCharCode(e.keyCode); +if(e.keyCode>=65&&e.keyCode<=90&&!e.shiftKey){ +c=c.toLowerCase(); +}else{ +if(e.keyCode==189){ +c="-"; +}else{ +if(e.keyCode==187){ +c="+"; +}else{ +if(e.keyCode==190){ +c="."; +} +} +} +} +if(e.keyCode==8){ +_16(_27,true); +}else{ +if(e.keyCode==46){ +_16(_27,false); +}else{ +_d(_27,c); +} +} +return false; +}; +$.extend($.fn.textbox.methods,{inputMask:function(jq,_2a){ +return jq.each(function(){ +var _2b=this; +var _2c=$.extend({},$.fn.maskedbox.defaults,_2a); +$.data(_2b,"maskedbox",{options:_2c}); +var _2d=$(_2b).textbox("textbox"); +_2d.unbind(".maskedbox"); +for(var _2e in _2c.inputEvents){ +_2d.bind(_2e+".maskedbox",{target:_2b},_2c.inputEvents[_2e]); +} +}); +}}); +$.fn.maskedbox=function(_2f,_30){ +if(typeof _2f=="string"){ +var _31=$.fn.maskedbox.methods[_2f]; +if(_31){ +return _31(this,_30); +}else{ +return this.textbox(_2f,_30); +} +} +_2f=_2f||{}; +return this.each(function(){ +var _32=$.data(this,"maskedbox"); +if(_32){ +$.extend(_32.options,_2f); +}else{ +$.data(this,"maskedbox",{options:$.extend({},$.fn.maskedbox.defaults,$.fn.maskedbox.parseOptions(this),_2f)}); +} +_1(this); +}); +}; +$.fn.maskedbox.methods={options:function(jq){ +var _33=jq.textbox("options"); +return $.extend($.data(jq[0],"maskedbox").options,{width:_33.width,value:_33.value,originalValue:_33.originalValue,disabled:_33.disabled,readonly:_33.readonly}); +},initValue:function(jq,_34){ +return jq.each(function(){ +_34=_9(this,_5(this,_34)); +$(this).textbox("initValue",_34); +}); +},setValue:function(jq,_35){ +return jq.each(function(){ +_35=_9(this,_5(this,_35)); +$(this).textbox("setValue",_35); +}); +}}; +$.fn.maskedbox.parseOptions=function(_36){ +var t=$(_36); +return $.extend({},$.fn.textbox.parseOptions(_36),$.parser.parseOptions(_36,["mask","promptChar"]),{}); +}; +$.fn.maskedbox.defaults=$.extend({},$.fn.textbox.defaults,{mask:"",promptChar:"_",masks:{"9":"[0-9]","a":"[a-zA-Z]","*":"[0-9a-zA-Z]"},inputEvents:{keydown:_26}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.menu.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.menu.js new file mode 100755 index 000000000..98fcf9b9c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.menu.js @@ -0,0 +1,502 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +$(function(){ +$(document).unbind(".menu").bind("mousedown.menu",function(e){ +var m=$(e.target).closest("div.menu,div.combo-p"); +if(m.length){ +return; +} +$("body>div.menu-top:visible").not(".menu-inline").menu("hide"); +_1($("body>div.menu:visible").not(".menu-inline")); +}); +}); +function _2(_3){ +var _4=$.data(_3,"menu").options; +$(_3).addClass("menu-top"); +_4.inline?$(_3).addClass("menu-inline"):$(_3).appendTo("body"); +$(_3).bind("_resize",function(e,_5){ +if($(this).hasClass("easyui-fluid")||_5){ +$(_3).menu("resize",_3); +} +return false; +}); +var _6=_7($(_3)); +for(var i=0;i<_6.length;i++){ +_b(_3,_6[i]); +} +function _7(_8){ +var _9=[]; +_8.addClass("menu"); +_9.push(_8); +if(!_8.hasClass("menu-content")){ +_8.children("div").each(function(){ +var _a=$(this).children("div"); +if(_a.length){ +_a.appendTo("body"); +this.submenu=_a; +var mm=_7(_a); +_9=_9.concat(mm); +} +}); +} +return _9; +}; +}; +function _b(_c,_d){ +var _e=$(_d).addClass("menu"); +if(!_e.data("menu")){ +_e.data("menu",{options:$.parser.parseOptions(_e[0],["width","height"])}); +} +if(!_e.hasClass("menu-content")){ +_e.children("div").each(function(){ +_f(_c,this); +}); +$("
                                              ").prependTo(_e); +} +_10(_c,_e); +if(!_e.hasClass("menu-inline")){ +_e.hide(); +} +_11(_c,_e); +}; +function _f(_12,div,_13){ +var _14=$(div); +var _15=$.extend({},$.parser.parseOptions(_14[0],["id","name","iconCls","href",{separator:"boolean"}]),{disabled:(_14.attr("disabled")?true:undefined),text:$.trim(_14.html()),onclick:_14[0].onclick},_13||{}); +_15.onclick=_15.onclick||_15.handler||null; +_14.data("menuitem",{options:_15}); +if(_15.separator){ +_14.addClass("menu-sep"); +} +if(!_14.hasClass("menu-sep")){ +_14.addClass("menu-item"); +_14.empty().append($("
                                              ").html(_15.text)); +if(_15.iconCls){ +$("
                                              ").addClass(_15.iconCls).appendTo(_14); +} +if(_15.id){ +_14.attr("id",_15.id); +} +if(_15.onclick){ +if(typeof _15.onclick=="string"){ +_14.attr("onclick",_15.onclick); +}else{ +_14[0].onclick=eval(_15.onclick); +} +} +if(_15.disabled){ +_16(_12,_14[0],true); +} +if(_14[0].submenu){ +$("
                                              ").appendTo(_14); +} +} +}; +function _10(_17,_18){ +var _19=$.data(_17,"menu").options; +var _1a=_18.attr("style")||""; +var _1b=_18.is(":visible"); +_18.css({display:"block",left:-10000,height:"auto",overflow:"hidden"}); +_18.find(".menu-item").each(function(){ +$(this)._outerHeight(_19.itemHeight); +$(this).find(".menu-text").css({height:(_19.itemHeight-2)+"px",lineHeight:(_19.itemHeight-2)+"px"}); +}); +_18.removeClass("menu-noline").addClass(_19.noline?"menu-noline":""); +var _1c=_18.data("menu").options; +var _1d=_1c.width; +var _1e=_1c.height; +if(isNaN(parseInt(_1d))){ +_1d=0; +_18.find("div.menu-text").each(function(){ +if(_1d<$(this).outerWidth()){ +_1d=$(this).outerWidth(); +} +}); +_1d=_1d?_1d+40:""; +} +var _1f=_18.outerHeight(); +if(isNaN(parseInt(_1e))){ +_1e=_1f; +if(_18.hasClass("menu-top")&&_19.alignTo){ +var at=$(_19.alignTo); +var h1=at.offset().top-$(document).scrollTop(); +var h2=$(window)._outerHeight()+$(document).scrollTop()-at.offset().top-at._outerHeight(); +_1e=Math.min(_1e,Math.max(h1,h2)); +}else{ +if(_1e>$(window)._outerHeight()){ +_1e=$(window).height(); +} +} +} +_18.attr("style",_1a); +_18.show(); +_18._size($.extend({},_1c,{width:_1d,height:_1e,minWidth:_1c.minWidth||_19.minWidth,maxWidth:_1c.maxWidth||_19.maxWidth})); +_18.find(".easyui-fluid").triggerHandler("_resize",[true]); +_18.css("overflow",_18.outerHeight()<_1f?"auto":"hidden"); +_18.children("div.menu-line")._outerHeight(_1f-2); +if(!_1b){ +_18.hide(); +} +}; +function _11(_20,_21){ +var _22=$.data(_20,"menu"); +var _23=_22.options; +_21.unbind(".menu"); +for(var _24 in _23.events){ +_21.bind(_24+".menu",{target:_20},_23.events[_24]); +} +}; +function _25(e){ +var _26=e.data.target; +var _27=$.data(_26,"menu"); +if(_27.timer){ +clearTimeout(_27.timer); +_27.timer=null; +} +}; +function _28(e){ +var _29=e.data.target; +var _2a=$.data(_29,"menu"); +if(_2a.options.hideOnUnhover){ +_2a.timer=setTimeout(function(){ +_2b(_29,$(_29).hasClass("menu-inline")); +},_2a.options.duration); +} +}; +function _2c(e){ +var _2d=e.data.target; +var _2e=$(e.target).closest(".menu-item"); +if(_2e.length){ +_2e.siblings().each(function(){ +if(this.submenu){ +_1(this.submenu); +} +$(this).removeClass("menu-active"); +}); +_2e.addClass("menu-active"); +if(_2e.hasClass("menu-item-disabled")){ +_2e.addClass("menu-active-disabled"); +return; +} +var _2f=_2e[0].submenu; +if(_2f){ +$(_2d).menu("show",{menu:_2f,parent:_2e}); +} +} +}; +function _30(e){ +var _31=$(e.target).closest(".menu-item"); +if(_31.length){ +_31.removeClass("menu-active menu-active-disabled"); +var _32=_31[0].submenu; +if(_32){ +if(e.pageX>=parseInt(_32.css("left"))){ +_31.addClass("menu-active"); +}else{ +_1(_32); +} +}else{ +_31.removeClass("menu-active"); +} +} +}; +function _33(e){ +var _34=e.data.target; +var _35=$(e.target).closest(".menu-item"); +if(_35.length){ +var _36=$(_34).data("menu").options; +var _37=_35.data("menuitem").options; +if(_37.disabled){ +return; +} +if(!_35[0].submenu){ +_2b(_34,_36.inline); +if(_37.href){ +location.href=_37.href; +} +} +_35.trigger("mouseenter"); +_36.onClick.call(_34,$(_34).menu("getItem",_35[0])); +} +}; +function _2b(_38,_39){ +var _3a=$.data(_38,"menu"); +if(_3a){ +if($(_38).is(":visible")){ +_1($(_38)); +if(_39){ +$(_38).show(); +}else{ +_3a.options.onHide.call(_38); +} +} +} +return false; +}; +function _3b(_3c,_3d){ +_3d=_3d||{}; +var _3e,top; +var _3f=$.data(_3c,"menu").options; +var _40=$(_3d.menu||_3c); +$(_3c).menu("resize",_40[0]); +if(_40.hasClass("menu-top")){ +$.extend(_3f,_3d); +_3e=_3f.left; +top=_3f.top; +if(_3f.alignTo){ +var at=$(_3f.alignTo); +_3e=at.offset().left; +top=at.offset().top+at._outerHeight(); +if(_3f.align=="right"){ +_3e+=at.outerWidth()-_40.outerWidth(); +} +} +if(_3e+_40.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ +_3e=$(window)._outerWidth()+$(document).scrollLeft()-_40.outerWidth()-5; +} +if(_3e<0){ +_3e=0; +} +top=_41(top,_3f.alignTo); +}else{ +var _42=_3d.parent; +_3e=_42.offset().left+_42.outerWidth()-2; +if(_3e+_40.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){ +_3e=_42.offset().left-_40.outerWidth()+2; +} +top=_41(_42.offset().top-3); +} +function _41(top,_43){ +if(top+_40.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ +if(_43){ +top=$(_43).offset().top-_40._outerHeight(); +}else{ +top=$(window)._outerHeight()+$(document).scrollTop()-_40.outerHeight(); +} +} +if(top<0){ +top=0; +} +return top; +}; +_40.css(_3f.position.call(_3c,_40[0],_3e,top)); +_40.show(0,function(){ +if(!_40[0].shadow){ +_40[0].shadow=$("
                                              ").insertAfter(_40); +} +_40[0].shadow.css({display:(_40.hasClass("menu-inline")?"none":"block"),zIndex:$.fn.menu.defaults.zIndex++,left:_40.css("left"),top:_40.css("top"),width:_40.outerWidth(),height:_40.outerHeight()}); +_40.css("z-index",$.fn.menu.defaults.zIndex++); +if(_40.hasClass("menu-top")){ +_3f.onShow.call(_3c); +} +}); +}; +function _1(_44){ +if(_44&&_44.length){ +_45(_44); +_44.find("div.menu-item").each(function(){ +if(this.submenu){ +_1(this.submenu); +} +$(this).removeClass("menu-active"); +}); +} +function _45(m){ +m.stop(true,true); +if(m[0].shadow){ +m[0].shadow.hide(); +} +m.hide(); +}; +}; +function _46(_47,_48){ +var _49=null; +var fn=$.isFunction(_48)?_48:function(_4a){ +for(var p in _48){ +if(_4a[p]!=_48[p]){ +return false; +} +} +return true; +}; +function _4b(_4c){ +_4c.children("div.menu-item").each(function(){ +var _4d=$(this).data("menuitem").options; +if(fn.call(_47,_4d)==true){ +_49=$(_47).menu("getItem",this); +}else{ +if(this.submenu&&!_49){ +_4b(this.submenu); +} +} +}); +}; +_4b($(_47)); +return _49; +}; +function _16(_4e,_4f,_50){ +var t=$(_4f); +if(t.hasClass("menu-item")){ +var _51=t.data("menuitem").options; +_51.disabled=_50; +if(_50){ +t.addClass("menu-item-disabled"); +t[0].onclick=null; +}else{ +t.removeClass("menu-item-disabled"); +t[0].onclick=_51.onclick; +} +} +}; +function _52(_53,_54){ +var _55=$.data(_53,"menu").options; +var _56=$(_53); +if(_54.parent){ +if(!_54.parent.submenu){ +var _57=$("
                                              ").appendTo("body"); +_54.parent.submenu=_57; +$("
                                              ").appendTo(_54.parent); +_b(_53,_57); +} +_56=_54.parent.submenu; +} +var div=$("
                                              ").appendTo(_56); +_f(_53,div,_54); +}; +function _58(_59,_5a){ +function _5b(el){ +if(el.submenu){ +el.submenu.children("div.menu-item").each(function(){ +_5b(this); +}); +var _5c=el.submenu[0].shadow; +if(_5c){ +_5c.remove(); +} +el.submenu.remove(); +} +$(el).remove(); +}; +_5b(_5a); +}; +function _5d(_5e,_5f,_60){ +var _61=$(_5f).parent(); +if(_60){ +$(_5f).show(); +}else{ +$(_5f).hide(); +} +_10(_5e,_61); +}; +function _62(_63){ +$(_63).children("div.menu-item").each(function(){ +_58(_63,this); +}); +if(_63.shadow){ +_63.shadow.remove(); +} +$(_63).remove(); +}; +$.fn.menu=function(_64,_65){ +if(typeof _64=="string"){ +return $.fn.menu.methods[_64](this,_65); +} +_64=_64||{}; +return this.each(function(){ +var _66=$.data(this,"menu"); +if(_66){ +$.extend(_66.options,_64); +}else{ +_66=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_64)}); +_2(this); +} +$(this).css({left:_66.options.left,top:_66.options.top}); +}); +}; +$.fn.menu.methods={options:function(jq){ +return $.data(jq[0],"menu").options; +},show:function(jq,pos){ +return jq.each(function(){ +_3b(this,pos); +}); +},hide:function(jq){ +return jq.each(function(){ +_2b(this); +}); +},destroy:function(jq){ +return jq.each(function(){ +_62(this); +}); +},setText:function(jq,_67){ +return jq.each(function(){ +var _68=$(_67.target).data("menuitem").options; +_68.text=_67.text; +$(_67.target).children("div.menu-text").html(_67.text); +}); +},setIcon:function(jq,_69){ +return jq.each(function(){ +var _6a=$(_69.target).data("menuitem").options; +_6a.iconCls=_69.iconCls; +$(_69.target).children("div.menu-icon").remove(); +if(_69.iconCls){ +$("
                                              ").addClass(_69.iconCls).appendTo(_69.target); +} +}); +},getItem:function(jq,_6b){ +var _6c=$(_6b).data("menuitem").options; +return $.extend({},_6c,{target:$(_6b)[0]}); +},findItem:function(jq,_6d){ +if(typeof _6d=="string"){ +return _46(jq[0],function(_6e){ +return $("
                                              "+_6e.text+"
                                              ").text()==_6d; +}); +}else{ +return _46(jq[0],_6d); +} +},appendItem:function(jq,_6f){ +return jq.each(function(){ +_52(this,_6f); +}); +},removeItem:function(jq,_70){ +return jq.each(function(){ +_58(this,_70); +}); +},enableItem:function(jq,_71){ +return jq.each(function(){ +_16(this,_71,false); +}); +},disableItem:function(jq,_72){ +return jq.each(function(){ +_16(this,_72,true); +}); +},showItem:function(jq,_73){ +return jq.each(function(){ +_5d(this,_73,true); +}); +},hideItem:function(jq,_74){ +return jq.each(function(){ +_5d(this,_74,false); +}); +},resize:function(jq,_75){ +return jq.each(function(){ +_10(this,_75?$(_75):$(this)); +}); +}}; +$.fn.menu.parseOptions=function(_76){ +return $.extend({},$.parser.parseOptions(_76,[{minWidth:"number",itemHeight:"number",duration:"number",hideOnUnhover:"boolean"},{fit:"boolean",inline:"boolean",noline:"boolean"}])); +}; +$.fn.menu.defaults={zIndex:110000,left:0,top:0,alignTo:null,align:"left",minWidth:150,itemHeight:32,duration:100,hideOnUnhover:true,inline:false,fit:false,noline:false,events:{mouseenter:_25,mouseleave:_28,mouseover:_2c,mouseout:_30,click:_33},position:function(_77,_78,top){ +return {left:_78,top:top}; +},onShow:function(){ +},onHide:function(){ +},onClick:function(_79){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.menubutton.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.menubutton.js new file mode 100755 index 000000000..6103f3684 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.menubutton.js @@ -0,0 +1,123 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"menubutton").options; +var _4=$(_2); +_4.linkbutton(_3); +if(_3.hasDownArrow){ +_4.removeClass(_3.cls.btn1+" "+_3.cls.btn2).addClass("m-btn"); +_4.removeClass("m-btn-small m-btn-medium m-btn-large").addClass("m-btn-"+_3.size); +var _5=_4.find(".l-btn-left"); +$("").addClass(_3.cls.arrow).appendTo(_5); +$("").addClass("m-btn-line").appendTo(_5); +} +$(_2).menubutton("resize"); +if(_3.menu){ +$(_3.menu).menu({duration:_3.duration}); +var _6=$(_3.menu).menu("options"); +var _7=_6.onShow; +var _8=_6.onHide; +$.extend(_6,{onShow:function(){ +var _9=$(this).menu("options"); +var _a=$(_9.alignTo); +var _b=_a.menubutton("options"); +_a.addClass((_b.plain==true)?_b.cls.btn2:_b.cls.btn1); +_7.call(this); +},onHide:function(){ +var _c=$(this).menu("options"); +var _d=$(_c.alignTo); +var _e=_d.menubutton("options"); +_d.removeClass((_e.plain==true)?_e.cls.btn2:_e.cls.btn1); +_8.call(this); +}}); +} +}; +function _f(_10){ +var _11=$.data(_10,"menubutton").options; +var btn=$(_10); +var t=btn.find("."+_11.cls.trigger); +if(!t.length){ +t=btn; +} +t.unbind(".menubutton"); +var _12=null; +t.bind(_11.showEvent+".menubutton",function(){ +if(!_13()){ +_12=setTimeout(function(){ +_14(_10); +},_11.duration); +return false; +} +}).bind(_11.hideEvent+".menubutton",function(){ +if(_12){ +clearTimeout(_12); +} +$(_11.menu).triggerHandler("mouseleave"); +}); +function _13(){ +return $(_10).linkbutton("options").disabled; +}; +}; +function _14(_15){ +var _16=$(_15).menubutton("options"); +if(_16.disabled||!_16.menu){ +return; +} +$("body>div.menu-top").menu("hide"); +var btn=$(_15); +var mm=$(_16.menu); +if(mm.length){ +mm.menu("options").alignTo=btn; +mm.menu("show",{alignTo:btn,align:_16.menuAlign}); +} +btn.blur(); +}; +$.fn.menubutton=function(_17,_18){ +if(typeof _17=="string"){ +var _19=$.fn.menubutton.methods[_17]; +if(_19){ +return _19(this,_18); +}else{ +return this.linkbutton(_17,_18); +} +} +_17=_17||{}; +return this.each(function(){ +var _1a=$.data(this,"menubutton"); +if(_1a){ +$.extend(_1a.options,_17); +}else{ +$.data(this,"menubutton",{options:$.extend({},$.fn.menubutton.defaults,$.fn.menubutton.parseOptions(this),_17)}); +$(this)._propAttr("disabled",false); +} +_1(this); +_f(this); +}); +}; +$.fn.menubutton.methods={options:function(jq){ +var _1b=jq.linkbutton("options"); +return $.extend($.data(jq[0],"menubutton").options,{toggle:_1b.toggle,selected:_1b.selected,disabled:_1b.disabled}); +},destroy:function(jq){ +return jq.each(function(){ +var _1c=$(this).menubutton("options"); +if(_1c.menu){ +$(_1c.menu).menu("destroy"); +} +$(this).remove(); +}); +}}; +$.fn.menubutton.parseOptions=function(_1d){ +var t=$(_1d); +return $.extend({},$.fn.linkbutton.parseOptions(_1d),$.parser.parseOptions(_1d,["menu",{plain:"boolean",hasDownArrow:"boolean",duration:"number"}])); +}; +$.fn.menubutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,hasDownArrow:true,menu:null,menuAlign:"left",duration:100,showEvent:"mouseenter",hideEvent:"mouseleave",cls:{btn1:"m-btn-active",btn2:"m-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn"}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.messager.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.messager.js new file mode 100755 index 000000000..60ea45909 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.messager.js @@ -0,0 +1,186 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(){ +$(document).unbind(".messager").bind("keydown.messager",function(e){ +if(e.keyCode==27){ +$("body").children("div.messager-window").children("div.messager-body").each(function(){ +$(this).dialog("close"); +}); +}else{ +if(e.keyCode==9){ +var _2=$("body").children("div.messager-window"); +if(!_2.length){ +return; +} +var _3=_2.find(".messager-input,.messager-button .l-btn"); +for(var i=0;i<_3.length;i++){ +if($(_3[i]).is(":focus")){ +$(_3[i>=_3.length-1?0:i+1]).focus(); +return false; +} +} +}else{ +if(e.keyCode==13){ +var _4=$(e.target).closest("input.messager-input"); +if(_4.length){ +var _5=_4.closest(".messager-body"); +_6(_5,_4.val()); +} +} +} +} +}); +}; +function _7(){ +$(document).unbind(".messager"); +}; +function _8(_9){ +var _a=$.extend({},$.messager.defaults,{modal:false,shadow:false,draggable:false,resizable:false,closed:true,style:{left:"",top:"",right:0,zIndex:$.fn.window.defaults.zIndex++,bottom:-document.body.scrollTop-document.documentElement.scrollTop},title:"",width:300,height:150,minHeight:0,showType:"slide",showSpeed:600,content:_9.msg,timeout:4000},_9); +var _b=$("
                                              ").appendTo("body"); +_b.dialog($.extend({},_a,{noheader:(_a.title?false:true),openAnimation:(_a.showType),closeAnimation:(_a.showType=="show"?"hide":_a.showType),openDuration:_a.showSpeed,closeDuration:_a.showSpeed,onOpen:function(){ +_b.dialog("dialog").hover(function(){ +if(_a.timer){ +clearTimeout(_a.timer); +} +},function(){ +_c(); +}); +_c(); +function _c(){ +if(_a.timeout>0){ +_a.timer=setTimeout(function(){ +if(_b.length&&_b.data("dialog")){ +_b.dialog("close"); +} +},_a.timeout); +} +}; +if(_9.onOpen){ +_9.onOpen.call(this); +}else{ +_a.onOpen.call(this); +} +},onClose:function(){ +if(_a.timer){ +clearTimeout(_a.timer); +} +if(_9.onClose){ +_9.onClose.call(this); +}else{ +_a.onClose.call(this); +} +_b.dialog("destroy"); +}})); +_b.dialog("dialog").css(_a.style); +_b.dialog("open"); +return _b; +}; +function _d(_e){ +_1(); +var _f=$("
                                              ").appendTo("body"); +_f.dialog($.extend({},_e,{noheader:(_e.title?false:true),onClose:function(){ +_7(); +if(_e.onClose){ +_e.onClose.call(this); +} +_f.dialog("destroy"); +}})); +var win=_f.dialog("dialog").addClass("messager-window"); +win.find(".dialog-button").addClass("messager-button").find("a:first").focus(); +return _f; +}; +function _6(dlg,_10){ +var _11=dlg.dialog("options"); +dlg.dialog("close"); +_11.fn(_10); +}; +$.messager={show:function(_12){ +return _8(_12); +},alert:function(_13,msg,_14,fn){ +var _15=typeof _13=="object"?_13:{title:_13,msg:msg,icon:_14,fn:fn}; +var cls=_15.icon?"messager-icon messager-"+_15.icon:""; +_15=$.extend({},$.messager.defaults,{content:"
                                              "+"
                                              "+_15.msg+"
                                              "+"
                                              "},_15); +if(!_15.buttons){ +_15.buttons=[{text:_15.ok,onClick:function(){ +_6(dlg); +}}]; +} +var dlg=_d(_15); +return dlg; +},confirm:function(_16,msg,fn){ +var _17=typeof _16=="object"?_16:{title:_16,msg:msg,fn:fn}; +_17=$.extend({},$.messager.defaults,{content:"
                                              "+"
                                              "+_17.msg+"
                                              "+"
                                              "},_17); +if(!_17.buttons){ +_17.buttons=[{text:_17.ok,onClick:function(){ +_6(dlg,true); +}},{text:_17.cancel,onClick:function(){ +_6(dlg,false); +}}]; +} +var dlg=_d(_17); +return dlg; +},prompt:function(_18,msg,fn){ +var _19=typeof _18=="object"?_18:{title:_18,msg:msg,fn:fn}; +_19=$.extend({},$.messager.defaults,{content:"
                                              "+"
                                              "+_19.msg+"
                                              "+"
                                              "+"
                                              "+"
                                              "},_19); +if(!_19.buttons){ +_19.buttons=[{text:_19.ok,onClick:function(){ +_6(dlg,dlg.find(".messager-input").val()); +}},{text:_19.cancel,onClick:function(){ +_6(dlg); +}}]; +} +var dlg=_d(_19); +dlg.find(".messager-input").focus(); +return dlg; +},progress:function(_1a){ +var _1b={bar:function(){ +return $("body>div.messager-window").find("div.messager-p-bar"); +},close:function(){ +var dlg=$("body>div.messager-window>div.messager-body:has(div.messager-progress)"); +if(dlg.length){ +dlg.dialog("close"); +} +}}; +if(typeof _1a=="string"){ +var _1c=_1b[_1a]; +return _1c(); +} +_1a=_1a||{}; +var _1d=$.extend({},{title:"",minHeight:0,content:undefined,msg:"",text:undefined,interval:300},_1a); +var dlg=_d($.extend({},$.messager.defaults,{content:"
                                              "+_1d.msg+"
                                              ",closable:false,doSize:false},_1d,{onClose:function(){ +if(this.timer){ +clearInterval(this.timer); +} +if(_1a.onClose){ +_1a.onClose.call(this); +}else{ +$.messager.defaults.onClose.call(this); +} +}})); +var bar=dlg.find("div.messager-p-bar"); +bar.progressbar({text:_1d.text}); +dlg.dialog("resize"); +if(_1d.interval){ +dlg[0].timer=setInterval(function(){ +var v=bar.progressbar("getValue"); +v+=10; +if(v>100){ +v=0; +} +bar.progressbar("setValue",v); +},_1d.interval); +} +return dlg; +}}; +$.messager.defaults=$.extend({},$.fn.dialog.defaults,{ok:"Ok",cancel:"Cancel",width:300,height:"auto",minHeight:150,modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,fn:function(){ +}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.mobile.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.mobile.js new file mode 100644 index 000000000..e76d4c028 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.mobile.js @@ -0,0 +1,141 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +$.fn.navpanel=function(_1,_2){ +if(typeof _1=="string"){ +var _3=$.fn.navpanel.methods[_1]; +return _3?_3(this,_2):this.panel(_1,_2); +}else{ +_1=_1||{}; +return this.each(function(){ +var _4=$.data(this,"navpanel"); +if(_4){ +$.extend(_4.options,_1); +}else{ +_4=$.data(this,"navpanel",{options:$.extend({},$.fn.navpanel.defaults,$.fn.navpanel.parseOptions(this),_1)}); +} +$(this).panel(_4.options); +}); +} +}; +$.fn.navpanel.methods={options:function(jq){ +return $.data(jq[0],"navpanel").options; +}}; +$.fn.navpanel.parseOptions=function(_5){ +return $.extend({},$.fn.panel.parseOptions(_5),$.parser.parseOptions(_5,[])); +}; +$.fn.navpanel.defaults=$.extend({},$.fn.panel.defaults,{fit:true,border:false,cls:"navpanel"}); +$.parser.plugins.push("navpanel"); +})(jQuery); +(function($){ +$(function(){ +$.mobile.init(); +}); +$.mobile={defaults:{animation:"slide",direction:"left",reverseDirections:{up:"down",down:"up",left:"right",right:"left"}},panels:[],init:function(_6){ +$.mobile.panels=[]; +var _7=$(_6||"body").children(".navpanel:visible"); +if(_7.length){ +_7.not(":first").children(".panel-body").navpanel("close"); +var p=_7.eq(0).children(".panel-body"); +$.mobile.panels.push({panel:p,animation:$.mobile.defaults.animation,direction:$.mobile.defaults.direction}); +} +$(document).unbind(".mobile").bind("click.mobile",function(e){ +var a=$(e.target).closest("a"); +if(a.length){ +var _8=$.parser.parseOptions(a[0],["animation","direction",{back:"boolean"}]); +if(_8.back){ +$.mobile.back(); +e.preventDefault(); +}else{ +var _9=$.trim(a.attr("href")); +if(/^#/.test(_9)){ +var to=$(_9); +if(to.length&&to.hasClass("panel-body")){ +$.mobile.go(to,_8.animation,_8.direction); +e.preventDefault(); +} +} +} +} +}); +$(window).unbind(".mobile").bind("hashchange.mobile",function(){ +var _a=$.mobile.panels.length; +if(_a>1){ +var _b=location.hash; +var p=$.mobile.panels[_a-2]; +if(!_b||_b=="#&"+p.panel.attr("id")){ +$.mobile._back(); +} +} +}); +},nav:function(_c,to,_d,_e){ +if(window.WebKitAnimationEvent){ +_d=_d!=undefined?_d:$.mobile.defaults.animation; +_e=_e!=undefined?_e:$.mobile.defaults.direction; +var _f="m-"+_d+(_e?"-"+_e:""); +var p1=$(_c).panel("open").panel("resize").panel("panel"); +var p2=$(to).panel("open").panel("resize").panel("panel"); +p1.add(p2).bind("webkitAnimationEnd",function(){ +$(this).unbind("webkitAnimationEnd"); +var p=$(this).children(".panel-body"); +if($(this).hasClass("m-in")){ +p.panel("open").panel("resize"); +}else{ +p.panel("close"); +} +$(this).removeClass(_f+" m-in m-out"); +}); +p2.addClass(_f+" m-in"); +p1.addClass(_f+" m-out"); +}else{ +$(to).panel("open").panel("resize"); +$(_c).panel("close"); +} +},_go:function(_10,_11,_12){ +_11=_11!=undefined?_11:$.mobile.defaults.animation; +_12=_12!=undefined?_12:$.mobile.defaults.direction; +var _13=$.mobile.panels[$.mobile.panels.length-1].panel; +var to=$(_10); +if(_13[0]!=to[0]){ +$.mobile.nav(_13,to,_11,_12); +$.mobile.panels.push({panel:to,animation:_11,direction:_12}); +} +},_back:function(){ +if($.mobile.panels.length<2){ +return; +} +var p1=$.mobile.panels.pop(); +var p2=$.mobile.panels[$.mobile.panels.length-1]; +var _14=p1.animation; +var _15=$.mobile.defaults.reverseDirections[p1.direction]||""; +$.mobile.nav(p1.panel,p2.panel,_14,_15); +},go:function(_16,_17,_18){ +_17=_17!=undefined?_17:$.mobile.defaults.animation; +_18=_18!=undefined?_18:$.mobile.defaults.direction; +location.hash="#&"+$(_16).attr("id"); +$.mobile._go(_16,_17,_18); +},back:function(){ +history.go(-1); +}}; +$.map(["validatebox","textbox","passwordbox","filebox","searchbox","combo","combobox","combogrid","combotree","combotreegrid","datebox","datetimebox","numberbox","spinner","numberspinner","timespinner","datetimespinner"],function(_19){ +if($.fn[_19]){ +$.extend($.fn[_19].defaults,{iconWidth:28,tipPosition:"bottom"}); +} +}); +$.map(["spinner","numberspinner","timespinner","datetimespinner"],function(_1a){ +if($.fn[_1a]){ +$.extend($.fn[_1a].defaults,{iconWidth:56,spinAlign:"horizontal"}); +} +}); +if($.fn.menu){ +$.extend($.fn.menu.defaults,{itemHeight:30,noline:true}); +} +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.numberbox.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.numberbox.js new file mode 100755 index 000000000..ecae9764a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.numberbox.js @@ -0,0 +1,184 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"numberbox"); +var _4=_3.options; +$(_2).addClass("numberbox-f").textbox(_4); +$(_2).textbox("textbox").css({imeMode:"disabled"}); +$(_2).attr("numberboxName",$(_2).attr("textboxName")); +_3.numberbox=$(_2).next(); +_3.numberbox.addClass("numberbox"); +var _5=_4.parser.call(_2,_4.value); +var _6=_4.formatter.call(_2,_5); +$(_2).numberbox("initValue",_5).numberbox("setText",_6); +}; +function _7(_8,_9){ +var _a=$.data(_8,"numberbox"); +var _b=_a.options; +_b.value=parseFloat(_9); +var _9=_b.parser.call(_8,_9); +var _c=_b.formatter.call(_8,_9); +_b.value=_9; +$(_8).textbox("setText",_c).textbox("setValue",_9); +_c=_b.formatter.call(_8,$(_8).textbox("getValue")); +$(_8).textbox("setText",_c); +}; +$.fn.numberbox=function(_d,_e){ +if(typeof _d=="string"){ +var _f=$.fn.numberbox.methods[_d]; +if(_f){ +return _f(this,_e); +}else{ +return this.textbox(_d,_e); +} +} +_d=_d||{}; +return this.each(function(){ +var _10=$.data(this,"numberbox"); +if(_10){ +$.extend(_10.options,_d); +}else{ +_10=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_d)}); +} +_1(this); +}); +}; +$.fn.numberbox.methods={options:function(jq){ +var _11=jq.data("textbox")?jq.textbox("options"):{}; +return $.extend($.data(jq[0],"numberbox").options,{width:_11.width,originalValue:_11.originalValue,disabled:_11.disabled,readonly:_11.readonly}); +},cloneFrom:function(jq,_12){ +return jq.each(function(){ +$(this).textbox("cloneFrom",_12); +$.data(this,"numberbox",{options:$.extend(true,{},$(_12).numberbox("options"))}); +$(this).addClass("numberbox-f"); +}); +},fix:function(jq){ +return jq.each(function(){ +var _13=$(this).numberbox("options"); +_13.value=null; +var _14=_13.parser.call(this,$(this).numberbox("getText")); +$(this).numberbox("setValue",_14); +}); +},setValue:function(jq,_15){ +return jq.each(function(){ +_7(this,_15); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("clear"); +$(this).numberbox("options").value=""; +}); +},reset:function(jq){ +return jq.each(function(){ +$(this).textbox("reset"); +$(this).numberbox("setValue",$(this).numberbox("getValue")); +}); +}}; +$.fn.numberbox.parseOptions=function(_16){ +var t=$(_16); +return $.extend({},$.fn.textbox.parseOptions(_16),$.parser.parseOptions(_16,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined)}); +}; +$.fn.numberbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{keypress:function(e){ +var _17=e.data.target; +var _18=$(_17).numberbox("options"); +return _18.filter.call(_17,e); +},blur:function(e){ +$(e.data.target).numberbox("fix"); +},keydown:function(e){ +if(e.keyCode==13){ +$(e.data.target).numberbox("fix"); +} +}},min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",filter:function(e){ +var _19=$(this).numberbox("options"); +var s=$(this).numberbox("getText"); +if(e.metaKey||e.ctrlKey){ +return true; +} +if($.inArray(String(e.which),["46","8","13","0"])>=0){ +return true; +} +var tmp=$(""); +tmp.html(String.fromCharCode(e.which)); +var c=tmp.text(); +tmp.remove(); +if(!c){ +return true; +} +if(c=="-"||c==_19.decimalSeparator){ +return (s.indexOf(c)==-1)?true:false; +}else{ +if(c==_19.groupSeparator){ +return true; +}else{ +if("0123456789".indexOf(c)>=0){ +return true; +}else{ +return false; +} +} +} +},formatter:function(_1a){ +if(!_1a){ +return _1a; +} +_1a=_1a+""; +var _1b=$(this).numberbox("options"); +var s1=_1a,s2=""; +var _1c=_1a.indexOf("."); +if(_1c>=0){ +s1=_1a.substring(0,_1c); +s2=_1a.substring(_1c+1,_1a.length); +} +if(_1b.groupSeparator){ +var p=/(\d+)(\d{3})/; +while(p.test(s1)){ +s1=s1.replace(p,"$1"+_1b.groupSeparator+"$2"); +} +} +if(s2){ +return _1b.prefix+s1+_1b.decimalSeparator+s2+_1b.suffix; +}else{ +return _1b.prefix+s1+_1b.suffix; +} +},parser:function(s){ +s=s+""; +var _1d=$(this).numberbox("options"); +if(_1d.prefix){ +s=$.trim(s.replace(new RegExp("\\"+$.trim(_1d.prefix),"g"),"")); +} +if(_1d.suffix){ +s=$.trim(s.replace(new RegExp("\\"+$.trim(_1d.suffix),"g"),"")); +} +if(parseFloat(s)!=_1d.value){ +if(_1d.groupSeparator){ +s=$.trim(s.replace(new RegExp("\\"+_1d.groupSeparator,"g"),"")); +} +if(_1d.decimalSeparator){ +s=$.trim(s.replace(new RegExp("\\"+_1d.decimalSeparator,"g"),".")); +} +s=s.replace(/\s/g,""); +} +var val=parseFloat(s).toFixed(_1d.precision); +if(isNaN(val)){ +val=""; +}else{ +if(typeof (_1d.min)=="number"&&val<_1d.min){ +val=_1d.min.toFixed(_1d.precision); +}else{ +if(typeof (_1d.max)=="number"&&val>_1d.max){ +val=_1d.max.toFixed(_1d.precision); +} +} +} +return val; +}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.numberspinner.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.numberspinner.js new file mode 100755 index 000000000..f27138e47 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.numberspinner.js @@ -0,0 +1,58 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +$(_2).addClass("numberspinner-f"); +var _3=$.data(_2,"numberspinner").options; +$(_2).numberbox($.extend({},_3,{doSize:false})).spinner(_3); +$(_2).numberbox("setValue",_3.value); +}; +function _4(_5,_6){ +var _7=$.data(_5,"numberspinner").options; +var v=parseFloat($(_5).numberbox("getValue")||_7.value)||0; +if(_6){ +v-=_7.increment; +}else{ +v+=_7.increment; +} +$(_5).numberbox("setValue",v); +}; +$.fn.numberspinner=function(_8,_9){ +if(typeof _8=="string"){ +var _a=$.fn.numberspinner.methods[_8]; +if(_a){ +return _a(this,_9); +}else{ +return this.numberbox(_8,_9); +} +} +_8=_8||{}; +return this.each(function(){ +var _b=$.data(this,"numberspinner"); +if(_b){ +$.extend(_b.options,_8); +}else{ +$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_8)}); +} +_1(this); +}); +}; +$.fn.numberspinner.methods={options:function(jq){ +var _c=jq.numberbox("options"); +return $.extend($.data(jq[0],"numberspinner").options,{width:_c.width,value:_c.value,originalValue:_c.originalValue,disabled:_c.disabled,readonly:_c.readonly}); +}}; +$.fn.numberspinner.parseOptions=function(_d){ +return $.extend({},$.fn.spinner.parseOptions(_d),$.fn.numberbox.parseOptions(_d),{}); +}; +$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(_e){ +_4(this,_e); +}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.pagination.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.pagination.js new file mode 100755 index 000000000..822a613c6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.pagination.js @@ -0,0 +1,296 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"pagination"); +var _4=_3.options; +var bb=_3.bb={}; +var _5=$(_2).addClass("pagination").html("
                                              "); +var tr=_5.find("tr"); +var aa=$.extend([],_4.layout); +if(!_4.showPageList){ +_6(aa,"list"); +} +if(!_4.showPageInfo){ +_6(aa,"info"); +} +if(!_4.showRefresh){ +_6(aa,"refresh"); +} +if(aa[0]=="sep"){ +aa.shift(); +} +if(aa[aa.length-1]=="sep"){ +aa.pop(); +} +for(var _7=0;_7"); +ps.bind("change",function(){ +_4.pageSize=parseInt($(this).val()); +_4.onChangePageSize.call(_2,_4.pageSize); +_10(_2,_4.pageNumber); +}); +for(var i=0;i<_4.pageList.length;i++){ +$("").text(_4.pageList[i]).appendTo(ps); +} +$("").append(ps).appendTo(tr); +}else{ +if(_8=="sep"){ +$("
                                              ").appendTo(tr); +}else{ +if(_8=="first"){ +bb.first=_9("first"); +}else{ +if(_8=="prev"){ +bb.prev=_9("prev"); +}else{ +if(_8=="next"){ +bb.next=_9("next"); +}else{ +if(_8=="last"){ +bb.last=_9("last"); +}else{ +if(_8=="manual"){ +$("").html(_4.beforePageText).appendTo(tr).wrap(""); +bb.num=$("").appendTo(tr).wrap(""); +bb.num.unbind(".pagination").bind("keydown.pagination",function(e){ +if(e.keyCode==13){ +var _a=parseInt($(this).val())||1; +_10(_2,_a); +return false; +} +}); +bb.after=$("").appendTo(tr).wrap(""); +}else{ +if(_8=="refresh"){ +bb.refresh=_9("refresh"); +}else{ +if(_8=="links"){ +$("").appendTo(tr); +}else{ +if(_8=="info"){ +if(_7==aa.length-1){ +$("
                                              ").appendTo(_5); +}else{ +$("
                                              ").appendTo(tr); +} +} +} +} +} +} +} +} +} +} +} +} +if(_4.buttons){ +$("
                                              ").appendTo(tr); +if($.isArray(_4.buttons)){ +for(var i=0;i<_4.buttons.length;i++){ +var _b=_4.buttons[i]; +if(_b=="-"){ +$("
                                              ").appendTo(tr); +}else{ +var td=$("").appendTo(tr); +var a=$("").appendTo(td); +a[0].onclick=eval(_b.handler||function(){ +}); +a.linkbutton($.extend({},_b,{plain:true})); +} +} +}else{ +var td=$("").appendTo(tr); +$(_4.buttons).appendTo(td).show(); +} +} +$("
                                              ").appendTo(_5); +function _9(_c){ +var _d=_4.nav[_c]; +var a=$("").appendTo(tr); +a.wrap(""); +a.linkbutton({iconCls:_d.iconCls,plain:true}).unbind(".pagination").bind("click.pagination",function(){ +_d.handler.call(_2); +}); +return a; +}; +function _6(aa,_e){ +var _f=$.inArray(_e,aa); +if(_f>=0){ +aa.splice(_f,1); +} +return aa; +}; +}; +function _10(_11,_12){ +var _13=$.data(_11,"pagination").options; +_14(_11,{pageNumber:_12}); +_13.onSelectPage.call(_11,_13.pageNumber,_13.pageSize); +}; +function _14(_15,_16){ +var _17=$.data(_15,"pagination"); +var _18=_17.options; +var bb=_17.bb; +$.extend(_18,_16||{}); +var ps=$(_15).find("select.pagination-page-list"); +if(ps.length){ +ps.val(_18.pageSize+""); +_18.pageSize=parseInt(ps.val()); +} +var _19=Math.ceil(_18.total/_18.pageSize)||1; +if(_18.pageNumber<1){ +_18.pageNumber=1; +} +if(_18.pageNumber>_19){ +_18.pageNumber=_19; +} +if(_18.total==0){ +_18.pageNumber=0; +_19=0; +} +if(bb.num){ +bb.num.val(_18.pageNumber); +} +if(bb.after){ +bb.after.html(_18.afterPageText.replace(/{pages}/,_19)); +} +var td=$(_15).find("td.pagination-links"); +if(td.length){ +td.empty(); +var _1a=_18.pageNumber-Math.floor(_18.links/2); +if(_1a<1){ +_1a=1; +} +var _1b=_1a+_18.links-1; +if(_1b>_19){ +_1b=_19; +} +_1a=_1b-_18.links+1; +if(_1a<1){ +_1a=1; +} +for(var i=_1a;i<=_1b;i++){ +var a=$("").appendTo(td); +a.linkbutton({plain:true,text:i}); +if(i==_18.pageNumber){ +a.linkbutton("select"); +}else{ +a.unbind(".pagination").bind("click.pagination",{pageNumber:i},function(e){ +_10(_15,e.data.pageNumber); +}); +} +} +} +var _1c=_18.displayMsg; +_1c=_1c.replace(/{from}/,_18.total==0?0:_18.pageSize*(_18.pageNumber-1)+1); +_1c=_1c.replace(/{to}/,Math.min(_18.pageSize*(_18.pageNumber),_18.total)); +_1c=_1c.replace(/{total}/,_18.total); +$(_15).find("div.pagination-info").html(_1c); +if(bb.first){ +bb.first.linkbutton({disabled:((!_18.total)||_18.pageNumber==1)}); +} +if(bb.prev){ +bb.prev.linkbutton({disabled:((!_18.total)||_18.pageNumber==1)}); +} +if(bb.next){ +bb.next.linkbutton({disabled:(_18.pageNumber==_19)}); +} +if(bb.last){ +bb.last.linkbutton({disabled:(_18.pageNumber==_19)}); +} +_1d(_15,_18.loading); +}; +function _1d(_1e,_1f){ +var _20=$.data(_1e,"pagination"); +var _21=_20.options; +_21.loading=_1f; +if(_21.showRefresh&&_20.bb.refresh){ +_20.bb.refresh.linkbutton({iconCls:(_21.loading?"pagination-loading":"pagination-load")}); +} +}; +$.fn.pagination=function(_22,_23){ +if(typeof _22=="string"){ +return $.fn.pagination.methods[_22](this,_23); +} +_22=_22||{}; +return this.each(function(){ +var _24; +var _25=$.data(this,"pagination"); +if(_25){ +_24=$.extend(_25.options,_22); +}else{ +_24=$.extend({},$.fn.pagination.defaults,$.fn.pagination.parseOptions(this),_22); +$.data(this,"pagination",{options:_24}); +} +_1(this); +_14(this); +}); +}; +$.fn.pagination.methods={options:function(jq){ +return $.data(jq[0],"pagination").options; +},loading:function(jq){ +return jq.each(function(){ +_1d(this,true); +}); +},loaded:function(jq){ +return jq.each(function(){ +_1d(this,false); +}); +},refresh:function(jq,_26){ +return jq.each(function(){ +_14(this,_26); +}); +},select:function(jq,_27){ +return jq.each(function(){ +_10(this,_27); +}); +}}; +$.fn.pagination.parseOptions=function(_28){ +var t=$(_28); +return $.extend({},$.parser.parseOptions(_28,[{total:"number",pageSize:"number",pageNumber:"number",links:"number"},{loading:"boolean",showPageList:"boolean",showPageInfo:"boolean",showRefresh:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined)}); +}; +$.fn.pagination.defaults={total:1,pageSize:10,pageNumber:1,pageList:[10,20,30,50],loading:false,buttons:null,showPageList:true,showPageInfo:true,showRefresh:true,links:10,layout:["list","sep","first","prev","sep","manual","sep","next","last","sep","refresh","info"],onSelectPage:function(_29,_2a){ +},onBeforeRefresh:function(_2b,_2c){ +},onRefresh:function(_2d,_2e){ +},onChangePageSize:function(_2f){ +},beforePageText:"Page",afterPageText:"of {pages}",displayMsg:"Displaying {from} to {to} of {total} items",nav:{first:{iconCls:"pagination-first",handler:function(){ +var _30=$(this).pagination("options"); +if(_30.pageNumber>1){ +$(this).pagination("select",1); +} +}},prev:{iconCls:"pagination-prev",handler:function(){ +var _31=$(this).pagination("options"); +if(_31.pageNumber>1){ +$(this).pagination("select",_31.pageNumber-1); +} +}},next:{iconCls:"pagination-next",handler:function(){ +var _32=$(this).pagination("options"); +var _33=Math.ceil(_32.total/_32.pageSize); +if(_32.pageNumber<_33){ +$(this).pagination("select",_32.pageNumber+1); +} +}},last:{iconCls:"pagination-last",handler:function(){ +var _34=$(this).pagination("options"); +var _35=Math.ceil(_34.total/_34.pageSize); +if(_34.pageNumber<_35){ +$(this).pagination("select",_35); +} +}},refresh:{iconCls:"pagination-refresh",handler:function(){ +var _36=$(this).pagination("options"); +if(_36.onBeforeRefresh.call(this,_36.pageNumber,_36.pageSize)!=false){ +$(this).pagination("select",_36.pageNumber); +_36.onRefresh.call(this,_36.pageNumber,_36.pageSize); +} +}}}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.panel.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.panel.js new file mode 100755 index 000000000..74b25b1fd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.panel.js @@ -0,0 +1,691 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +$.fn._remove=function(){ +return this.each(function(){ +$(this).remove(); +try{ +this.outerHTML=""; +} +catch(err){ +} +}); +}; +function _1(_2){ +_2._remove(); +}; +function _3(_4,_5){ +var _6=$.data(_4,"panel"); +var _7=_6.options; +var _8=_6.panel; +var _9=_8.children(".panel-header"); +var _a=_8.children(".panel-body"); +var _b=_8.children(".panel-footer"); +var _c=(_7.halign=="left"||_7.halign=="right"); +if(_5){ +$.extend(_7,{width:_5.width,height:_5.height,minWidth:_5.minWidth,maxWidth:_5.maxWidth,minHeight:_5.minHeight,maxHeight:_5.maxHeight,left:_5.left,top:_5.top}); +_7.hasResized=false; +} +var _d=_8.outerWidth(); +var _e=_8.outerHeight(); +_8._size(_7); +var _f=_8.outerWidth(); +var _10=_8.outerHeight(); +if(_7.hasResized&&(_d==_f&&_e==_10)){ +return; +} +_7.hasResized=true; +if(!_c){ +_9._outerWidth(_8.width()); +} +_a._outerWidth(_8.width()); +if(!isNaN(parseInt(_7.height))){ +if(_c){ +if(_7.header){ +var _11=$(_7.header)._outerWidth(); +}else{ +_9.css("width",""); +var _11=_9._outerWidth(); +} +var _12=_9.find(".panel-title"); +_11+=Math.min(_12._outerWidth(),_12._outerHeight()); +var _13=_8.height(); +_9._outerWidth(_11)._outerHeight(_13); +_12._outerWidth(_9.height()); +_a._outerWidth(_8.width()-_11-_b._outerWidth())._outerHeight(_13); +_b._outerHeight(_13); +_a.css({left:"",right:""}).css(_7.halign,(_9.position()[_7.halign]+_11)+"px"); +_7.panelCssWidth=_8.css("width"); +if(_7.collapsed){ +_8._outerWidth(_11+_b._outerWidth()); +} +}else{ +_a._outerHeight(_8.height()-_9._outerHeight()-_b._outerHeight()); +} +}else{ +_a.css("height",""); +var min=$.parser.parseValue("minHeight",_7.minHeight,_8.parent()); +var max=$.parser.parseValue("maxHeight",_7.maxHeight,_8.parent()); +var _14=_9._outerHeight()+_b._outerHeight()+_8._outerHeight()-_8.height(); +_a._size("minHeight",min?(min-_14):""); +_a._size("maxHeight",max?(max-_14):""); +} +_8.css({height:(_c?undefined:""),minHeight:"",maxHeight:"",left:_7.left,top:_7.top}); +_7.onResize.apply(_4,[_7.width,_7.height]); +$(_4).panel("doLayout"); +}; +function _15(_16,_17){ +var _18=$.data(_16,"panel"); +var _19=_18.options; +var _1a=_18.panel; +if(_17){ +if(_17.left!=null){ +_19.left=_17.left; +} +if(_17.top!=null){ +_19.top=_17.top; +} +} +_1a.css({left:_19.left,top:_19.top}); +_1a.find(".tooltip-f").each(function(){ +$(this).tooltip("reposition"); +}); +_19.onMove.apply(_16,[_19.left,_19.top]); +}; +function _1b(_1c){ +$(_1c).addClass("panel-body")._size("clear"); +var _1d=$("
                                              ").insertBefore(_1c); +_1d[0].appendChild(_1c); +_1d.bind("_resize",function(e,_1e){ +if($(this).hasClass("easyui-fluid")||_1e){ +_3(_1c,{}); +} +return false; +}); +return _1d; +}; +function _1f(_20){ +var _21=$.data(_20,"panel"); +var _22=_21.options; +var _23=_21.panel; +_23.css(_22.style); +_23.addClass(_22.cls); +_23.removeClass("panel-hleft panel-hright").addClass("panel-h"+_22.halign); +_24(); +_25(); +var _26=$(_20).panel("header"); +var _27=$(_20).panel("body"); +var _28=$(_20).siblings(".panel-footer"); +if(_22.border){ +_26.removeClass("panel-header-noborder"); +_27.removeClass("panel-body-noborder"); +_28.removeClass("panel-footer-noborder"); +}else{ +_26.addClass("panel-header-noborder"); +_27.addClass("panel-body-noborder"); +_28.addClass("panel-footer-noborder"); +} +_26.addClass(_22.headerCls); +_27.addClass(_22.bodyCls); +$(_20).attr("id",_22.id||""); +if(_22.content){ +$(_20).panel("clear"); +$(_20).html(_22.content); +$.parser.parse($(_20)); +} +function _24(){ +if(_22.noheader||(!_22.title&&!_22.header)){ +_1(_23.children(".panel-header")); +_23.children(".panel-body").addClass("panel-body-noheader"); +}else{ +if(_22.header){ +$(_22.header).addClass("panel-header").prependTo(_23); +}else{ +var _29=_23.children(".panel-header"); +if(!_29.length){ +_29=$("
                                              ").prependTo(_23); +} +if(!$.isArray(_22.tools)){ +_29.find("div.panel-tool .panel-tool-a").appendTo(_22.tools); +} +_29.empty(); +var _2a=$("
                                              ").html(_22.title).appendTo(_29); +if(_22.iconCls){ +_2a.addClass("panel-with-icon"); +$("
                                              ").addClass(_22.iconCls).appendTo(_29); +} +if(_22.halign=="left"||_22.halign=="right"){ +_2a.addClass("panel-title-"+_22.titleDirection); +} +var _2b=$("
                                              ").appendTo(_29); +_2b.bind("click",function(e){ +e.stopPropagation(); +}); +if(_22.tools){ +if($.isArray(_22.tools)){ +$.map(_22.tools,function(t){ +_2c(_2b,t.iconCls,eval(t.handler)); +}); +}else{ +$(_22.tools).children().each(function(){ +$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(_2b); +}); +} +} +if(_22.collapsible){ +_2c(_2b,"panel-tool-collapse",function(){ +if(_22.collapsed==true){ +_57(_20,true); +}else{ +_43(_20,true); +} +}); +} +if(_22.minimizable){ +_2c(_2b,"panel-tool-min",function(){ +_62(_20); +}); +} +if(_22.maximizable){ +_2c(_2b,"panel-tool-max",function(){ +if(_22.maximized==true){ +_66(_20); +}else{ +_42(_20); +} +}); +} +if(_22.closable){ +_2c(_2b,"panel-tool-close",function(){ +_44(_20); +}); +} +} +_23.children("div.panel-body").removeClass("panel-body-noheader"); +} +}; +function _2c(c,_2d,_2e){ +var a=$("").addClass(_2d).appendTo(c); +a.bind("click",_2e); +}; +function _25(){ +if(_22.footer){ +$(_22.footer).addClass("panel-footer").appendTo(_23); +$(_20).addClass("panel-body-nobottom"); +}else{ +_23.children(".panel-footer").remove(); +$(_20).removeClass("panel-body-nobottom"); +} +}; +}; +function _2f(_30,_31){ +var _32=$.data(_30,"panel"); +var _33=_32.options; +if(_34){ +_33.queryParams=_31; +} +if(!_33.href){ +return; +} +if(!_32.isLoaded||!_33.cache){ +var _34=$.extend({},_33.queryParams); +if(_33.onBeforeLoad.call(_30,_34)==false){ +return; +} +_32.isLoaded=false; +if(_33.loadingMessage){ +$(_30).panel("clear"); +$(_30).html($("
                                              ").html(_33.loadingMessage)); +} +_33.loader.call(_30,_34,function(_35){ +var _36=_33.extractor.call(_30,_35); +$(_30).panel("clear"); +$(_30).html(_36); +$.parser.parse($(_30)); +_33.onLoad.apply(_30,arguments); +_32.isLoaded=true; +},function(){ +_33.onLoadError.apply(_30,arguments); +}); +} +}; +function _37(_38){ +var t=$(_38); +t.find(".combo-f").each(function(){ +$(this).combo("destroy"); +}); +t.find(".m-btn").each(function(){ +$(this).menubutton("destroy"); +}); +t.find(".s-btn").each(function(){ +$(this).splitbutton("destroy"); +}); +t.find(".tooltip-f").each(function(){ +$(this).tooltip("destroy"); +}); +t.children("div").each(function(){ +$(this)._size("unfit"); +}); +t.empty(); +}; +function _39(_3a){ +$(_3a).panel("doLayout",true); +}; +function _3b(_3c,_3d){ +var _3e=$.data(_3c,"panel"); +var _3f=_3e.options; +var _40=_3e.panel; +if(_3d!=true){ +if(_3f.onBeforeOpen.call(_3c)==false){ +return; +} +} +_40.stop(true,true); +if($.isFunction(_3f.openAnimation)){ +_3f.openAnimation.call(_3c,cb); +}else{ +switch(_3f.openAnimation){ +case "slide": +_40.slideDown(_3f.openDuration,cb); +break; +case "fade": +_40.fadeIn(_3f.openDuration,cb); +break; +case "show": +_40.show(_3f.openDuration,cb); +break; +default: +_40.show(); +cb(); +} +} +function cb(){ +_3f.closed=false; +_3f.minimized=false; +var _41=_40.children(".panel-header").find("a.panel-tool-restore"); +if(_41.length){ +_3f.maximized=true; +} +_3f.onOpen.call(_3c); +if(_3f.maximized==true){ +_3f.maximized=false; +_42(_3c); +} +if(_3f.collapsed==true){ +_3f.collapsed=false; +_43(_3c); +} +if(!_3f.collapsed){ +if(_3f.href&&(!_3e.isLoaded||!_3f.cache)){ +_2f(_3c); +_39(_3c); +_3f.doneLayout=true; +} +} +if(!_3f.doneLayout){ +_3f.doneLayout=true; +_39(_3c); +} +}; +}; +function _44(_45,_46){ +var _47=$.data(_45,"panel"); +var _48=_47.options; +var _49=_47.panel; +if(_46!=true){ +if(_48.onBeforeClose.call(_45)==false){ +return; +} +} +_49.find(".tooltip-f").each(function(){ +$(this).tooltip("hide"); +}); +_49.stop(true,true); +_49._size("unfit"); +if($.isFunction(_48.closeAnimation)){ +_48.closeAnimation.call(_45,cb); +}else{ +switch(_48.closeAnimation){ +case "slide": +_49.slideUp(_48.closeDuration,cb); +break; +case "fade": +_49.fadeOut(_48.closeDuration,cb); +break; +case "hide": +_49.hide(_48.closeDuration,cb); +break; +default: +_49.hide(); +cb(); +} +} +function cb(){ +_48.closed=true; +_48.onClose.call(_45); +}; +}; +function _4a(_4b,_4c){ +var _4d=$.data(_4b,"panel"); +var _4e=_4d.options; +var _4f=_4d.panel; +if(_4c!=true){ +if(_4e.onBeforeDestroy.call(_4b)==false){ +return; +} +} +$(_4b).panel("clear").panel("clear","footer"); +_1(_4f); +_4e.onDestroy.call(_4b); +}; +function _43(_50,_51){ +var _52=$.data(_50,"panel").options; +var _53=$.data(_50,"panel").panel; +var _54=_53.children(".panel-body"); +var _55=_53.children(".panel-header"); +var _56=_55.find("a.panel-tool-collapse"); +if(_52.collapsed==true){ +return; +} +_54.stop(true,true); +if(_52.onBeforeCollapse.call(_50)==false){ +return; +} +_56.addClass("panel-tool-expand"); +if(_51==true){ +if(_52.halign=="left"||_52.halign=="right"){ +_53.animate({width:_55._outerWidth()+_53.children(".panel-footer")._outerWidth()},function(){ +cb(); +}); +}else{ +_54.slideUp("normal",function(){ +cb(); +}); +} +}else{ +if(_52.halign=="left"||_52.halign=="right"){ +_53._outerWidth(_55._outerWidth()+_53.children(".panel-footer")._outerWidth()); +} +cb(); +} +function cb(){ +_54.hide(); +_52.collapsed=true; +_52.onCollapse.call(_50); +}; +}; +function _57(_58,_59){ +var _5a=$.data(_58,"panel").options; +var _5b=$.data(_58,"panel").panel; +var _5c=_5b.children(".panel-body"); +var _5d=_5b.children(".panel-header").find("a.panel-tool-collapse"); +if(_5a.collapsed==false){ +return; +} +_5c.stop(true,true); +if(_5a.onBeforeExpand.call(_58)==false){ +return; +} +_5d.removeClass("panel-tool-expand"); +if(_59==true){ +if(_5a.halign=="left"||_5a.halign=="right"){ +_5c.show(); +_5b.animate({width:_5a.panelCssWidth},function(){ +cb(); +}); +}else{ +_5c.slideDown("normal",function(){ +cb(); +}); +} +}else{ +if(_5a.halign=="left"||_5a.halign=="right"){ +_5b.css("width",_5a.panelCssWidth); +} +cb(); +} +function cb(){ +_5c.show(); +_5a.collapsed=false; +_5a.onExpand.call(_58); +_2f(_58); +_39(_58); +}; +}; +function _42(_5e){ +var _5f=$.data(_5e,"panel").options; +var _60=$.data(_5e,"panel").panel; +var _61=_60.children(".panel-header").find("a.panel-tool-max"); +if(_5f.maximized==true){ +return; +} +_61.addClass("panel-tool-restore"); +if(!$.data(_5e,"panel").original){ +$.data(_5e,"panel").original={width:_5f.width,height:_5f.height,left:_5f.left,top:_5f.top,fit:_5f.fit}; +} +_5f.left=0; +_5f.top=0; +_5f.fit=true; +_3(_5e); +_5f.minimized=false; +_5f.maximized=true; +_5f.onMaximize.call(_5e); +}; +function _62(_63){ +var _64=$.data(_63,"panel").options; +var _65=$.data(_63,"panel").panel; +_65._size("unfit"); +_65.hide(); +_64.minimized=true; +_64.maximized=false; +_64.onMinimize.call(_63); +}; +function _66(_67){ +var _68=$.data(_67,"panel").options; +var _69=$.data(_67,"panel").panel; +var _6a=_69.children(".panel-header").find("a.panel-tool-max"); +if(_68.maximized==false){ +return; +} +_69.show(); +_6a.removeClass("panel-tool-restore"); +$.extend(_68,$.data(_67,"panel").original); +_3(_67); +_68.minimized=false; +_68.maximized=false; +$.data(_67,"panel").original=null; +_68.onRestore.call(_67); +}; +function _6b(_6c,_6d){ +$.data(_6c,"panel").options.title=_6d; +$(_6c).panel("header").find("div.panel-title").html(_6d); +}; +var _6e=null; +$(window).unbind(".panel").bind("resize.panel",function(){ +if(_6e){ +clearTimeout(_6e); +} +_6e=setTimeout(function(){ +var _6f=$("body.layout"); +if(_6f.length){ +_6f.layout("resize"); +$("body").children(".easyui-fluid:visible").each(function(){ +$(this).triggerHandler("_resize"); +}); +}else{ +$("body").panel("doLayout"); +} +_6e=null; +},100); +}); +$.fn.panel=function(_70,_71){ +if(typeof _70=="string"){ +return $.fn.panel.methods[_70](this,_71); +} +_70=_70||{}; +return this.each(function(){ +var _72=$.data(this,"panel"); +var _73; +if(_72){ +_73=$.extend(_72.options,_70); +_72.isLoaded=false; +}else{ +_73=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_70); +$(this).attr("title",""); +_72=$.data(this,"panel",{options:_73,panel:_1b(this),isLoaded:false}); +} +_1f(this); +$(this).show(); +if(_73.doSize==true){ +_72.panel.css("display","block"); +_3(this); +} +if(_73.closed==true||_73.minimized==true){ +_72.panel.hide(); +}else{ +_3b(this); +} +}); +}; +$.fn.panel.methods={options:function(jq){ +return $.data(jq[0],"panel").options; +},panel:function(jq){ +return $.data(jq[0],"panel").panel; +},header:function(jq){ +return $.data(jq[0],"panel").panel.children(".panel-header"); +},footer:function(jq){ +return jq.panel("panel").children(".panel-footer"); +},body:function(jq){ +return $.data(jq[0],"panel").panel.children(".panel-body"); +},setTitle:function(jq,_74){ +return jq.each(function(){ +_6b(this,_74); +}); +},open:function(jq,_75){ +return jq.each(function(){ +_3b(this,_75); +}); +},close:function(jq,_76){ +return jq.each(function(){ +_44(this,_76); +}); +},destroy:function(jq,_77){ +return jq.each(function(){ +_4a(this,_77); +}); +},clear:function(jq,_78){ +return jq.each(function(){ +_37(_78=="footer"?$(this).panel("footer"):this); +}); +},refresh:function(jq,_79){ +return jq.each(function(){ +var _7a=$.data(this,"panel"); +_7a.isLoaded=false; +if(_79){ +if(typeof _79=="string"){ +_7a.options.href=_79; +}else{ +_7a.options.queryParams=_79; +} +} +_2f(this); +}); +},resize:function(jq,_7b){ +return jq.each(function(){ +_3(this,_7b||{}); +}); +},doLayout:function(jq,all){ +return jq.each(function(){ +_7c(this,"body"); +_7c($(this).siblings(".panel-footer")[0],"footer"); +function _7c(_7d,_7e){ +if(!_7d){ +return; +} +var _7f=_7d==$("body")[0]; +var s=$(_7d).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible,.easyui-fluid:visible").filter(function(_80,el){ +var p=$(el).parents(".panel-"+_7e+":first"); +return _7f?p.length==0:p[0]==_7d; +}); +s.each(function(){ +$(this).triggerHandler("_resize",[all||false]); +}); +}; +}); +},move:function(jq,_81){ +return jq.each(function(){ +_15(this,_81); +}); +},maximize:function(jq){ +return jq.each(function(){ +_42(this); +}); +},minimize:function(jq){ +return jq.each(function(){ +_62(this); +}); +},restore:function(jq){ +return jq.each(function(){ +_66(this); +}); +},collapse:function(jq,_82){ +return jq.each(function(){ +_43(this,_82); +}); +},expand:function(jq,_83){ +return jq.each(function(){ +_57(this,_83); +}); +}}; +$.fn.panel.parseOptions=function(_84){ +var t=$(_84); +var hh=t.children(".panel-header,header"); +var ff=t.children(".panel-footer,footer"); +return $.extend({},$.parser.parseOptions(_84,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href","method","header","footer","halign","titleDirection",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"},"openAnimation","closeAnimation",{openDuration:"number",closeDuration:"number"},]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined),header:(hh.length?hh.removeClass("panel-header"):undefined),footer:(ff.length?ff.removeClass("panel-footer"):undefined)}); +}; +$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,halign:"top",titleDirection:"down",collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,openAnimation:false,openDuration:400,closeAnimation:false,closeDuration:400,tools:null,footer:null,header:null,queryParams:{},method:"get",href:null,loadingMessage:"Loading...",loader:function(_85,_86,_87){ +var _88=$(this).panel("options"); +if(!_88.href){ +return false; +} +$.ajax({type:_88.method,url:_88.href,cache:false,data:_85,dataType:"html",success:function(_89){ +_86(_89); +},error:function(){ +_87.apply(this,arguments); +}}); +},extractor:function(_8a){ +var _8b=/]*>((.|[\n\r])*)<\/body>/im; +var _8c=_8b.exec(_8a); +if(_8c){ +return _8c[1]; +}else{ +return _8a; +} +},onBeforeLoad:function(_8d){ +},onLoad:function(){ +},onLoadError:function(){ +},onBeforeOpen:function(){ +},onOpen:function(){ +},onBeforeClose:function(){ +},onClose:function(){ +},onBeforeDestroy:function(){ +},onDestroy:function(){ +},onResize:function(_8e,_8f){ +},onMove:function(_90,top){ +},onMaximize:function(){ +},onRestore:function(){ +},onMinimize:function(){ +},onBeforeCollapse:function(){ +},onBeforeExpand:function(){ +},onCollapse:function(){ +},onExpand:function(){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.parser.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.parser.js new file mode 100755 index 000000000..2b121d415 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.parser.js @@ -0,0 +1,386 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +$.easyui={indexOfArray:function(a,o,id){ +for(var i=0,_1=a.length;i<_1;i++){ +if(id==undefined){ +if(a[i]==o){ +return i; +} +}else{ +if(a[i][o]==id){ +return i; +} +} +} +return -1; +},removeArrayItem:function(a,o,id){ +if(typeof o=="string"){ +for(var i=0,_2=a.length;i<_2;i++){ +if(a[i][o]==id){ +a.splice(i,1); +return; +} +} +}else{ +var _3=this.indexOfArray(a,o); +if(_3!=-1){ +a.splice(_3,1); +} +} +},addArrayItem:function(a,o,r){ +var _4=this.indexOfArray(a,o,r?r[o]:undefined); +if(_4==-1){ +a.push(r?r:o); +}else{ +a[_4]=r?r:o; +} +},getArrayItem:function(a,o,id){ +var _5=this.indexOfArray(a,o,id); +return _5==-1?null:a[_5]; +},forEach:function(_6,_7,_8){ +var _9=[]; +for(var i=0;i<_6.length;i++){ +_9.push(_6[i]); +} +while(_9.length){ +var _a=_9.shift(); +if(_8(_a)==false){ +return; +} +if(_7&&_a.children){ +for(var i=_a.children.length-1;i>=0;i--){ +_9.unshift(_a.children[i]); +} +} +} +}}; +$.parser={auto:true,onComplete:function(_b){ +},plugins:["draggable","droppable","resizable","pagination","tooltip","linkbutton","menu","sidemenu","menubutton","splitbutton","switchbutton","progressbar","tree","textbox","passwordbox","maskedbox","filebox","combo","combobox","combotree","combogrid","combotreegrid","tagbox","numberbox","validatebox","searchbox","spinner","numberspinner","timespinner","datetimespinner","calendar","datebox","datetimebox","slider","layout","panel","datagrid","propertygrid","treegrid","datalist","tabs","accordion","window","dialog","form"],parse:function(_c){ +var aa=[]; +for(var i=0;i<$.parser.plugins.length;i++){ +var _d=$.parser.plugins[i]; +var r=$(".easyui-"+_d,_c); +if(r.length){ +if(r[_d]){ +r.each(function(){ +$(this)[_d]($.data(this,"options")||{}); +}); +}else{ +aa.push({name:_d,jq:r}); +} +} +} +if(aa.length&&window.easyloader){ +var _e=[]; +for(var i=0;i=0){ +v=Math.floor((_12.width()-_13)*v/100); +}else{ +v=Math.floor((_12.height()-_13)*v/100); +} +}else{ +v=parseInt(v)||undefined; +} +return v; +},parseOptions:function(_15,_16){ +var t=$(_15); +var _17={}; +var s=$.trim(t.attr("data-options")); +if(s){ +if(s.substring(0,1)!="{"){ +s="{"+s+"}"; +} +_17=(new Function("return "+s))(); +} +$.map(["width","height","left","top","minWidth","maxWidth","minHeight","maxHeight"],function(p){ +var pv=$.trim(_15.style[p]||""); +if(pv){ +if(pv.indexOf("%")==-1){ +pv=parseInt(pv); +if(isNaN(pv)){ +pv=undefined; +} +} +_17[p]=pv; +} +}); +if(_16){ +var _18={}; +for(var i=0;i<_16.length;i++){ +var pp=_16[i]; +if(typeof pp=="string"){ +_18[pp]=t.attr(pp); +}else{ +for(var _19 in pp){ +var _1a=pp[_19]; +if(_1a=="boolean"){ +_18[_19]=t.attr(_19)?(t.attr(_19)=="true"):undefined; +}else{ +if(_1a=="number"){ +_18[_19]=t.attr(_19)=="0"?0:parseFloat(t.attr(_19))||undefined; +} +} +} +} +} +$.extend(_17,_18); +} +return _17; +}}; +$(function(){ +var d=$("
                                              ").appendTo("body"); +$._boxModel=d.outerWidth()!=100; +d.remove(); +d=$("
                                              ").appendTo("body"); +$._positionFixed=(d.css("position")=="fixed"); +d.remove(); +if(!window.easyloader&&$.parser.auto){ +$.parser.parse(); +} +}); +$.fn._outerWidth=function(_1b){ +if(_1b==undefined){ +if(this[0]==window){ +return this.width()||document.body.clientWidth; +} +return this.outerWidth()||0; +} +return this._size("width",_1b); +}; +$.fn._outerHeight=function(_1c){ +if(_1c==undefined){ +if(this[0]==window){ +return this.height()||document.body.clientHeight; +} +return this.outerHeight()||0; +} +return this._size("height",_1c); +}; +$.fn._scrollLeft=function(_1d){ +if(_1d==undefined){ +return this.scrollLeft(); +}else{ +return this.each(function(){ +$(this).scrollLeft(_1d); +}); +} +}; +$.fn._propAttr=$.fn.prop||$.fn.attr; +$.fn._size=function(_1e,_1f){ +if(typeof _1e=="string"){ +if(_1e=="clear"){ +return this.each(function(){ +$(this).css({width:"",minWidth:"",maxWidth:"",height:"",minHeight:"",maxHeight:""}); +}); +}else{ +if(_1e=="fit"){ +return this.each(function(){ +_20(this,this.tagName=="BODY"?$("body"):$(this).parent(),true); +}); +}else{ +if(_1e=="unfit"){ +return this.each(function(){ +_20(this,$(this).parent(),false); +}); +}else{ +if(_1f==undefined){ +return _21(this[0],_1e); +}else{ +return this.each(function(){ +_21(this,_1e,_1f); +}); +} +} +} +} +}else{ +return this.each(function(){ +_1f=_1f||$(this).parent(); +$.extend(_1e,_20(this,_1f,_1e.fit)||{}); +var r1=_22(this,"width",_1f,_1e); +var r2=_22(this,"height",_1f,_1e); +if(r1||r2){ +$(this).addClass("easyui-fluid"); +}else{ +$(this).removeClass("easyui-fluid"); +} +}); +} +function _20(_23,_24,fit){ +if(!_24.length){ +return false; +} +var t=$(_23)[0]; +var p=_24[0]; +var _25=p.fcount||0; +if(fit){ +if(!t.fitted){ +t.fitted=true; +p.fcount=_25+1; +$(p).addClass("panel-noscroll"); +if(p.tagName=="BODY"){ +$("html").addClass("panel-fit"); +} +} +return {width:($(p).width()||1),height:($(p).height()||1)}; +}else{ +if(t.fitted){ +t.fitted=false; +p.fcount=_25-1; +if(p.fcount==0){ +$(p).removeClass("panel-noscroll"); +if(p.tagName=="BODY"){ +$("html").removeClass("panel-fit"); +} +} +} +return false; +} +}; +function _22(_26,_27,_28,_29){ +var t=$(_26); +var p=_27; +var p1=p.substr(0,1).toUpperCase()+p.substr(1); +var min=$.parser.parseValue("min"+p1,_29["min"+p1],_28); +var max=$.parser.parseValue("max"+p1,_29["max"+p1],_28); +var val=$.parser.parseValue(p,_29[p],_28); +var _2a=(String(_29[p]||"").indexOf("%")>=0?true:false); +if(!isNaN(val)){ +var v=Math.min(Math.max(val,min||0),max||99999); +if(!_2a){ +_29[p]=v; +} +t._size("min"+p1,""); +t._size("max"+p1,""); +t._size(p,v); +}else{ +t._size(p,""); +t._size("min"+p1,min); +t._size("max"+p1,max); +} +return _2a||_29.fit; +}; +function _21(_2b,_2c,_2d){ +var t=$(_2b); +if(_2d==undefined){ +_2d=parseInt(_2b.style[_2c]); +if(isNaN(_2d)){ +return undefined; +} +if($._boxModel){ +_2d+=_2e(); +} +return _2d; +}else{ +if(_2d===""){ +t.css(_2c,""); +}else{ +if($._boxModel){ +_2d-=_2e(); +if(_2d<0){ +_2d=0; +} +} +t.css(_2c,_2d+"px"); +} +} +function _2e(){ +if(_2c.toLowerCase().indexOf("width")>=0){ +return t.outerWidth()-t.width(); +}else{ +return t.outerHeight()-t.height(); +} +}; +}; +}; +})(jQuery); +(function($){ +var _2f=null; +var _30=null; +var _31=false; +function _32(e){ +if(e.touches.length!=1){ +return; +} +if(!_31){ +_31=true; +dblClickTimer=setTimeout(function(){ +_31=false; +},500); +}else{ +clearTimeout(dblClickTimer); +_31=false; +_33(e,"dblclick"); +} +_2f=setTimeout(function(){ +_33(e,"contextmenu",3); +},1000); +_33(e,"mousedown"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _34(e){ +if(e.touches.length!=1){ +return; +} +if(_2f){ +clearTimeout(_2f); +} +_33(e,"mousemove"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _35(e){ +if(_2f){ +clearTimeout(_2f); +} +_33(e,"mouseup"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _33(e,_36,_37){ +var _38=new $.Event(_36); +_38.pageX=e.changedTouches[0].pageX; +_38.pageY=e.changedTouches[0].pageY; +_38.which=_37||1; +$(e.target).trigger(_38); +}; +if(document.addEventListener){ +document.addEventListener("touchstart",_32,true); +document.addEventListener("touchmove",_34,true); +document.addEventListener("touchend",_35,true); +} +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.passwordbox.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.passwordbox.js new file mode 100644 index 000000000..d28bb1018 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.passwordbox.js @@ -0,0 +1,156 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"passwordbox"); +var _4=_3.options; +var _5=$.extend(true,[],_4.icons); +if(_4.showEye){ +_5.push({iconCls:"passwordbox-open",handler:function(e){ +_4.revealed=!_4.revealed; +_6(_2); +}}); +} +$(_2).addClass("passwordbox-f").textbox($.extend({},_4,{icons:_5})); +_6(_2); +}; +function _7(_8,_9,_a){ +var t=$(_8); +var _b=t.passwordbox("options"); +if(_b.revealed){ +t.textbox("setValue",_9); +return; +} +var _c=unescape(_b.passwordChar); +var cc=_9.split(""); +var vv=t.passwordbox("getValue").split(""); +for(var i=0;i
                                              "); +$(_2).bind("_resize",function(e,_3){ +if($(this).hasClass("easyui-fluid")||_3){ +_4(_2); +} +return false; +}); +return $(_2); +}; +function _4(_5,_6){ +var _7=$.data(_5,"progressbar").options; +var _8=$.data(_5,"progressbar").bar; +if(_6){ +_7.width=_6; +} +_8._size(_7); +_8.find("div.progressbar-text").css("width",_8.width()); +_8.find("div.progressbar-text,div.progressbar-value").css({height:_8.height()+"px",lineHeight:_8.height()+"px"}); +}; +$.fn.progressbar=function(_9,_a){ +if(typeof _9=="string"){ +var _b=$.fn.progressbar.methods[_9]; +if(_b){ +return _b(this,_a); +} +} +_9=_9||{}; +return this.each(function(){ +var _c=$.data(this,"progressbar"); +if(_c){ +$.extend(_c.options,_9); +}else{ +_c=$.data(this,"progressbar",{options:$.extend({},$.fn.progressbar.defaults,$.fn.progressbar.parseOptions(this),_9),bar:_1(this)}); +} +$(this).progressbar("setValue",_c.options.value); +_4(this); +}); +}; +$.fn.progressbar.methods={options:function(jq){ +return $.data(jq[0],"progressbar").options; +},resize:function(jq,_d){ +return jq.each(function(){ +_4(this,_d); +}); +},getValue:function(jq){ +return $.data(jq[0],"progressbar").options.value; +},setValue:function(jq,_e){ +if(_e<0){ +_e=0; +} +if(_e>100){ +_e=100; +} +return jq.each(function(){ +var _f=$.data(this,"progressbar").options; +var _10=_f.text.replace(/{value}/,_e); +var _11=_f.value; +_f.value=_e; +$(this).find("div.progressbar-value").width(_e+"%"); +$(this).find("div.progressbar-text").html(_10); +if(_11!=_e){ +_f.onChange.call(this,_e,_11); +} +}); +}}; +$.fn.progressbar.parseOptions=function(_12){ +return $.extend({},$.parser.parseOptions(_12,["width","height","text",{value:"number"}])); +}; +$.fn.progressbar.defaults={width:"auto",height:22,value:0,text:"{value}%",onChange:function(_13,_14){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.propertygrid.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.propertygrid.js new file mode 100755 index 000000000..d8c47932a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.propertygrid.js @@ -0,0 +1,427 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +var _1; +$(document).unbind(".propertygrid").bind("mousedown.propertygrid",function(e){ +var p=$(e.target).closest("div.datagrid-view,div.combo-panel"); +if(p.length){ +return; +} +_2(_1); +_1=undefined; +}); +function _3(_4){ +var _5=$.data(_4,"propertygrid"); +var _6=$.data(_4,"propertygrid").options; +$(_4).datagrid($.extend({},_6,{cls:"propertygrid",view:(_6.showGroup?_6.groupView:_6.view),onBeforeEdit:function(_7,_8){ +if(_6.onBeforeEdit.call(_4,_7,_8)==false){ +return false; +} +var dg=$(this); +var _8=dg.datagrid("getRows")[_7]; +var _9=dg.datagrid("getColumnOption","value"); +_9.editor=_8.editor; +},onClickCell:function(_a,_b,_c){ +if(_1!=this){ +_2(_1); +_1=this; +} +if(_6.editIndex!=_a){ +_2(_1); +$(this).datagrid("beginEdit",_a); +var ed=$(this).datagrid("getEditor",{index:_a,field:_b}); +if(!ed){ +ed=$(this).datagrid("getEditor",{index:_a,field:"value"}); +} +if(ed){ +var t=$(ed.target); +var _d=t.data("textbox")?t.textbox("textbox"):t; +_d.focus(); +_6.editIndex=_a; +} +} +_6.onClickCell.call(_4,_a,_b,_c); +},loadFilter:function(_e){ +_2(this); +return _6.loadFilter.call(this,_e); +}})); +}; +function _2(_f){ +var t=$(_f); +if(!t.length){ +return; +} +var _10=$.data(_f,"propertygrid").options; +_10.finder.getTr(_f,null,"editing").each(function(){ +var _11=parseInt($(this).attr("datagrid-row-index")); +if(t.datagrid("validateRow",_11)){ +t.datagrid("endEdit",_11); +}else{ +t.datagrid("cancelEdit",_11); +} +}); +_10.editIndex=undefined; +}; +$.fn.propertygrid=function(_12,_13){ +if(typeof _12=="string"){ +var _14=$.fn.propertygrid.methods[_12]; +if(_14){ +return _14(this,_13); +}else{ +return this.datagrid(_12,_13); +} +} +_12=_12||{}; +return this.each(function(){ +var _15=$.data(this,"propertygrid"); +if(_15){ +$.extend(_15.options,_12); +}else{ +var _16=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_12); +_16.frozenColumns=$.extend(true,[],_16.frozenColumns); +_16.columns=$.extend(true,[],_16.columns); +$.data(this,"propertygrid",{options:_16}); +} +_3(this); +}); +}; +$.fn.propertygrid.methods={options:function(jq){ +return $.data(jq[0],"propertygrid").options; +}}; +$.fn.propertygrid.parseOptions=function(_17){ +return $.extend({},$.fn.datagrid.parseOptions(_17),$.parser.parseOptions(_17,[{showGroup:"boolean"}])); +}; +var _18=$.extend({},$.fn.datagrid.defaults.view,{render:function(_19,_1a,_1b){ +var _1c=[]; +var _1d=this.groups; +for(var i=0;i<_1d.length;i++){ +_1c.push(this.renderGroup.call(this,_19,i,_1d[i],_1b)); +} +$(_1a).html(_1c.join("")); +},renderGroup:function(_1e,_1f,_20,_21){ +var _22=$.data(_1e,"datagrid"); +var _23=_22.options; +var _24=$(_1e).datagrid("getColumnFields",_21); +var _25=_23.frozenColumns&&_23.frozenColumns.length; +if(_21){ +if(!(_23.rownumbers||_25)){ +return ""; +} +} +var _26=[]; +var css=_23.groupStyler.call(_1e,_20.value,_20.rows); +var cs=_27(css,"datagrid-group"); +_26.push("
                                              "); +if((_21&&(_23.rownumbers||_23.frozenColumns.length))||(!_21&&!(_23.rownumbers||_23.frozenColumns.length))){ +_26.push(""); +_26.push(" "); +_26.push(""); +} +if((_21&&_25)||(!_21)){ +_26.push(""); +_26.push(_23.groupFormatter.call(_1e,_20.value,_20.rows)); +_26.push(""); +} +_26.push("
                                              "); +_26.push(""); +var _28=_20.startIndex; +for(var j=0;j<_20.rows.length;j++){ +var css=_23.rowStyler?_23.rowStyler.call(_1e,_28,_20.rows[j]):""; +var _29=""; +var _2a=""; +if(typeof css=="string"){ +_2a=css; +}else{ +if(css){ +_29=css["class"]||""; +_2a=css["style"]||""; +} +} +var cls="class=\"datagrid-row "+(_28%2&&_23.striped?"datagrid-row-alt ":" ")+_29+"\""; +var _2b=_2a?"style=\""+_2a+"\"":""; +var _2c=_22.rowIdPrefix+"-"+(_21?1:2)+"-"+_28; +_26.push(""); +_26.push(this.renderRow.call(this,_1e,_24,_21,_28,_20.rows[j])); +_26.push(""); +_28++; +} +_26.push("
                                              "); +return _26.join(""); +function _27(css,cls){ +var _2d=""; +var _2e=""; +if(typeof css=="string"){ +_2e=css; +}else{ +if(css){ +_2d=css["class"]||""; +_2e=css["style"]||""; +} +} +return "class=\""+cls+(_2d?" "+_2d:"")+"\" "+"style=\""+_2e+"\""; +}; +},bindEvents:function(_2f){ +var _30=$.data(_2f,"datagrid"); +var dc=_30.dc; +var _31=dc.body1.add(dc.body2); +var _32=($.data(_31[0],"events")||$._data(_31[0],"events")).click[0].handler; +_31.unbind("click").bind("click",function(e){ +var tt=$(e.target); +var _33=tt.closest("span.datagrid-row-expander"); +if(_33.length){ +var _34=_33.closest("div.datagrid-group").attr("group-index"); +if(_33.hasClass("datagrid-row-collapse")){ +$(_2f).datagrid("collapseGroup",_34); +}else{ +$(_2f).datagrid("expandGroup",_34); +} +}else{ +_32(e); +} +e.stopPropagation(); +}); +},onBeforeRender:function(_35,_36){ +var _37=$.data(_35,"datagrid"); +var _38=_37.options; +_39(); +var _3a=[]; +for(var i=0;i<_36.length;i++){ +var row=_36[i]; +var _3b=_3c(row[_38.groupField]); +if(!_3b){ +_3b={value:row[_38.groupField],rows:[row]}; +_3a.push(_3b); +}else{ +_3b.rows.push(row); +} +} +var _3d=0; +var _3e=[]; +for(var i=0;i<_3a.length;i++){ +var _3b=_3a[i]; +_3b.startIndex=_3d; +_3d+=_3b.rows.length; +_3e=_3e.concat(_3b.rows); +} +_37.data.rows=_3e; +this.groups=_3a; +var _3f=this; +setTimeout(function(){ +_3f.bindEvents(_35); +},0); +function _3c(_40){ +for(var i=0;i<_3a.length;i++){ +var _41=_3a[i]; +if(_41.value==_40){ +return _41; +} +} +return null; +}; +function _39(){ +if(!$("#datagrid-group-style").length){ +$("head").append(""); +} +}; +},onAfterRender:function(_42){ +$.fn.datagrid.defaults.view.onAfterRender.call(this,_42); +var _43=this; +var _44=$.data(_42,"datagrid"); +var _45=_44.options; +if(!_44.onResizeColumn){ +_44.onResizeColumn=_45.onResizeColumn; +} +if(!_44.onResize){ +_44.onResize=_45.onResize; +} +_45.onResizeColumn=function(_46,_47){ +_43.resizeGroup(_42); +_44.onResizeColumn.call(_42,_46,_47); +}; +_45.onResize=function(_48,_49){ +_43.resizeGroup(_42); +_44.onResize.call($(_42).datagrid("getPanel")[0],_48,_49); +}; +_43.resizeGroup(_42); +}}); +$.extend($.fn.datagrid.methods,{groups:function(jq){ +return jq.datagrid("options").view.groups; +},expandGroup:function(jq,_4a){ +return jq.each(function(){ +var _4b=$(this).datagrid("options"); +var _4c=$.data(this,"datagrid").dc.view; +var _4d=_4c.find(_4a!=undefined?"div.datagrid-group[group-index=\""+_4a+"\"]":"div.datagrid-group"); +var _4e=_4d.find("span.datagrid-row-expander"); +if(_4e.hasClass("datagrid-row-expand")){ +_4e.removeClass("datagrid-row-expand").addClass("datagrid-row-collapse"); +_4d.next("table").show(); +} +$(this).datagrid("fixRowHeight"); +if(_4b.onExpandGroup){ +_4b.onExpandGroup.call(this,_4a); +} +}); +},collapseGroup:function(jq,_4f){ +return jq.each(function(){ +var _50=$(this).datagrid("options"); +var _51=$.data(this,"datagrid").dc.view; +var _52=_51.find(_4f!=undefined?"div.datagrid-group[group-index=\""+_4f+"\"]":"div.datagrid-group"); +var _53=_52.find("span.datagrid-row-expander"); +if(_53.hasClass("datagrid-row-collapse")){ +_53.removeClass("datagrid-row-collapse").addClass("datagrid-row-expand"); +_52.next("table").hide(); +} +$(this).datagrid("fixRowHeight"); +if(_50.onCollapseGroup){ +_50.onCollapseGroup.call(this,_4f); +} +}); +},scrollToGroup:function(jq,_54){ +return jq.each(function(){ +var _55=$.data(this,"datagrid"); +var dc=_55.dc; +var _56=dc.body2.children("div.datagrid-group[group-index=\""+_54+"\"]"); +if(_56.length){ +var _57=_56.outerHeight(); +var _58=dc.view2.children("div.datagrid-header")._outerHeight(); +var _59=dc.body2.outerHeight(true)-dc.body2.outerHeight(); +var top=_56.position().top-_58-_59; +if(top<0){ +dc.body2.scrollTop(dc.body2.scrollTop()+top); +}else{ +if(top+_57>dc.body2.height()-18){ +dc.body2.scrollTop(dc.body2.scrollTop()+top+_57-dc.body2.height()+18); +} +} +} +}); +}}); +$.extend(_18,{refreshGroupTitle:function(_5a,_5b){ +var _5c=$.data(_5a,"datagrid"); +var _5d=_5c.options; +var dc=_5c.dc; +var _5e=this.groups[_5b]; +var _5f=dc.body1.add(dc.body2).children("div.datagrid-group[group-index="+_5b+"]").find("span.datagrid-group-title"); +_5f.html(_5d.groupFormatter.call(_5a,_5e.value,_5e.rows)); +},resizeGroup:function(_60,_61){ +var _62=$.data(_60,"datagrid"); +var dc=_62.dc; +var ht=dc.header2.find("table"); +var fr=ht.find("tr.datagrid-filter-row").hide(); +var ww=ht.width(); +if(_61==undefined){ +var _63=dc.body2.children("div.datagrid-group"); +}else{ +var _63=dc.body2.children("div.datagrid-group[group-index="+_61+"]"); +} +_63._outerWidth(ww); +var _64=_62.options; +if(_64.frozenColumns&&_64.frozenColumns.length){ +var _65=dc.view1.width()-_64.expanderWidth; +var _66=dc.view1.css("direction").toLowerCase()=="rtl"; +_63.find(".datagrid-group-title").css(_66?"right":"left",-_65+"px"); +} +if(fr.length){ +if(_64.showFilterBar){ +fr.show(); +} +} +},insertRow:function(_67,_68,row){ +var _69=$.data(_67,"datagrid"); +var _6a=_69.options; +var dc=_69.dc; +var _6b=null; +var _6c; +if(!_69.data.rows.length){ +$(_67).datagrid("loadData",[row]); +return; +} +for(var i=0;i_6b.startIndex+_6b.rows.length){ +_68=_6b.startIndex+_6b.rows.length; +} +} +$.fn.datagrid.defaults.view.insertRow.call(this,_67,_68,row); +if(_68>=_6b.startIndex+_6b.rows.length){ +_6d(_68,true); +_6d(_68,false); +} +_6b.rows.splice(_68-_6b.startIndex,0,row); +}else{ +_6b={value:row[_6a.groupField],rows:[row],startIndex:_69.data.rows.length}; +_6c=this.groups.length; +dc.body1.append(this.renderGroup.call(this,_67,_6c,_6b,true)); +dc.body2.append(this.renderGroup.call(this,_67,_6c,_6b,false)); +this.groups.push(_6b); +_69.data.rows.push(row); +} +this.setGroupIndex(_67); +this.refreshGroupTitle(_67,_6c); +this.resizeGroup(_67); +function _6d(_6e,_6f){ +var _70=_6f?1:2; +var _71=_6a.finder.getTr(_67,_6e-1,"body",_70); +var tr=_6a.finder.getTr(_67,_6e,"body",_70); +tr.insertAfter(_71); +}; +},updateRow:function(_72,_73,row){ +var _74=$.data(_72,"datagrid").options; +$.fn.datagrid.defaults.view.updateRow.call(this,_72,_73,row); +var tb=_74.finder.getTr(_72,_73,"body",2).closest("table.datagrid-btable"); +var _75=parseInt(tb.prev().attr("group-index")); +this.refreshGroupTitle(_72,_75); +},deleteRow:function(_76,_77){ +var _78=$.data(_76,"datagrid"); +var _79=_78.options; +var dc=_78.dc; +var _7a=dc.body1.add(dc.body2); +var tb=_79.finder.getTr(_76,_77,"body",2).closest("table.datagrid-btable"); +var _7b=parseInt(tb.prev().attr("group-index")); +$.fn.datagrid.defaults.view.deleteRow.call(this,_76,_77); +var _7c=this.groups[_7b]; +if(_7c.rows.length>1){ +_7c.rows.splice(_77-_7c.startIndex,1); +this.refreshGroupTitle(_76,_7b); +}else{ +_7a.children("div.datagrid-group[group-index="+_7b+"]").remove(); +for(var i=_7b+1;i_e.top&&e.pageY<_e.top+_11){ +_d+="n"; +}else{ +if(e.pageY<_e.top+_10&&e.pageY>_e.top+_10-_11){ +_d+="s"; +} +} +if(e.pageX>_e.left&&e.pageX<_e.left+_11){ +_d+="w"; +}else{ +if(e.pageX<_e.left+_f&&e.pageX>_e.left+_f-_11){ +_d+="e"; +} +} +var _12=_c.handles.split(","); +_12=$.map(_12,function(h){ +return $.trim(h).toLowerCase(); +}); +if($.inArray("all",_12)>=0||$.inArray(_d,_12)>=0){ +return _d; +} +for(var i=0;i<_d.length;i++){ +var _13=$.inArray(_d.substr(i,1),_12); +if(_13>=0){ +return _12[_13]; +} +} +return ""; +}; +$.fn.resizable=function(_14,_15){ +if(typeof _14=="string"){ +return $.fn.resizable.methods[_14](this,_15); +} +return this.each(function(){ +var _16=null; +var _17=$.data(this,"resizable"); +if(_17){ +$(this).unbind(".resizable"); +_16=$.extend(_17.options,_14||{}); +}else{ +_16=$.extend({},$.fn.resizable.defaults,$.fn.resizable.parseOptions(this),_14||{}); +$.data(this,"resizable",{options:_16}); +} +if(_16.disabled==true){ +return; +} +$(this).bind("mousemove.resizable",{target:this},function(e){ +if($.fn.resizable.isResizing){ +return; +} +var dir=_b(e); +$(e.data.target).css("cursor",dir?dir+"-resize":""); +}).bind("mouseleave.resizable",{target:this},function(e){ +$(e.data.target).css("cursor",""); +}).bind("mousedown.resizable",{target:this},function(e){ +var dir=_b(e); +if(dir==""){ +return; +} +function _18(css){ +var val=parseInt($(e.data.target).css(css)); +if(isNaN(val)){ +return 0; +}else{ +return val; +} +}; +var _19={target:e.data.target,dir:dir,startLeft:_18("left"),startTop:_18("top"),left:_18("left"),top:_18("top"),startX:e.pageX,startY:e.pageY,startWidth:$(e.data.target).outerWidth(),startHeight:$(e.data.target).outerHeight(),width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),deltaWidth:$(e.data.target).outerWidth()-$(e.data.target).width(),deltaHeight:$(e.data.target).outerHeight()-$(e.data.target).height()}; +$(document).bind("mousedown.resizable",_19,_8); +$(document).bind("mousemove.resizable",_19,_9); +$(document).bind("mouseup.resizable",_19,_a); +$("body").css("cursor",dir+"-resize"); +}); +}); +}; +$.fn.resizable.methods={options:function(jq){ +return $.data(jq[0],"resizable").options; +},enable:function(jq){ +return jq.each(function(){ +$(this).resizable({disabled:false}); +}); +},disable:function(jq){ +return jq.each(function(){ +$(this).resizable({disabled:true}); +}); +}}; +$.fn.resizable.parseOptions=function(_1a){ +var t=$(_1a); +return $.extend({},$.parser.parseOptions(_1a,["handles",{minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number",edge:"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); +}; +$.fn.resizable.defaults={disabled:false,handles:"n, e, s, w, ne, se, sw, nw, all",minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000,edge:5,onStartResize:function(e){ +},onResize:function(e){ +},onStopResize:function(e){ +}}; +$.fn.resizable.isResizing=false; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.searchbox.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.searchbox.js new file mode 100755 index 000000000..ba2966ea7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.searchbox.js @@ -0,0 +1,132 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"searchbox"); +var _4=_3.options; +var _5=$.extend(true,[],_4.icons); +_5.push({iconCls:"searchbox-button",handler:function(e){ +var t=$(e.data.target); +var _6=t.searchbox("options"); +_6.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); +}}); +_7(); +var _8=_9(); +$(_2).addClass("searchbox-f").textbox($.extend({},_4,{icons:_5,buttonText:(_8?_8.text:"")})); +$(_2).attr("searchboxName",$(_2).attr("textboxName")); +_3.searchbox=$(_2).next(); +_3.searchbox.addClass("searchbox"); +_a(_8); +function _7(){ +if(_4.menu){ +_3.menu=$(_4.menu).menu(); +var _b=_3.menu.menu("options"); +var _c=_b.onClick; +_b.onClick=function(_d){ +_a(_d); +_c.call(this,_d); +}; +}else{ +if(_3.menu){ +_3.menu.menu("destroy"); +} +_3.menu=null; +} +}; +function _9(){ +if(_3.menu){ +var _e=_3.menu.children("div.menu-item:first"); +_3.menu.children("div.menu-item").each(function(){ +var _f=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); +if(_f.selected){ +_e=$(this); +return false; +} +}); +return _3.menu.menu("getItem",_e[0]); +}else{ +return null; +} +}; +function _a(_10){ +if(!_10){ +return; +} +$(_2).textbox("button").menubutton({text:_10.text,iconCls:(_10.iconCls||null),menu:_3.menu,menuAlign:_4.buttonAlign,plain:false}); +_3.searchbox.find("input.textbox-value").attr("name",_10.name||_10.text); +$(_2).searchbox("resize"); +}; +}; +$.fn.searchbox=function(_11,_12){ +if(typeof _11=="string"){ +var _13=$.fn.searchbox.methods[_11]; +if(_13){ +return _13(this,_12); +}else{ +return this.textbox(_11,_12); +} +} +_11=_11||{}; +return this.each(function(){ +var _14=$.data(this,"searchbox"); +if(_14){ +$.extend(_14.options,_11); +}else{ +$.data(this,"searchbox",{options:$.extend({},$.fn.searchbox.defaults,$.fn.searchbox.parseOptions(this),_11)}); +} +_1(this); +}); +}; +$.fn.searchbox.methods={options:function(jq){ +var _15=jq.textbox("options"); +return $.extend($.data(jq[0],"searchbox").options,{width:_15.width,value:_15.value,originalValue:_15.originalValue,disabled:_15.disabled,readonly:_15.readonly}); +},menu:function(jq){ +return $.data(jq[0],"searchbox").menu; +},getName:function(jq){ +return $.data(jq[0],"searchbox").searchbox.find("input.textbox-value").attr("name"); +},selectName:function(jq,_16){ +return jq.each(function(){ +var _17=$.data(this,"searchbox").menu; +if(_17){ +_17.children("div.menu-item").each(function(){ +var _18=_17.menu("getItem",this); +if(_18.name==_16){ +$(this).trigger("click"); +return false; +} +}); +} +}); +},destroy:function(jq){ +return jq.each(function(){ +var _19=$(this).searchbox("menu"); +if(_19){ +_19.menu("destroy"); +} +$(this).textbox("destroy"); +}); +}}; +$.fn.searchbox.parseOptions=function(_1a){ +var t=$(_1a); +return $.extend({},$.fn.textbox.parseOptions(_1a),$.parser.parseOptions(_1a,["menu"]),{searcher:(t.attr("searcher")?eval(t.attr("searcher")):undefined)}); +}; +$.fn.searchbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:$.extend({},$.fn.textbox.defaults.inputEvents,{keydown:function(e){ +if(e.keyCode==13){ +e.preventDefault(); +var t=$(e.data.target); +var _1b=t.searchbox("options"); +t.searchbox("setValue",$(this).val()); +_1b.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); +return false; +} +}}),buttonAlign:"left",menu:null,searcher:function(_1c,_1d){ +}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.sidemenu.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.sidemenu.js new file mode 100644 index 000000000..2a446874f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.sidemenu.js @@ -0,0 +1,226 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +var _1=1; +function _2(_3){ +$(_3).addClass("sidemenu"); +}; +function _4(_5,_6){ +var _7=$(_5).sidemenu("options"); +if(_6){ +$.extend(_7,{width:_6.width,height:_6.height}); +} +$(_5)._size(_7); +$(_5).find(".accordion").accordion("resize"); +}; +function _8(_9,_a,_b){ +var _c=$(_9).sidemenu("options"); +var tt=$("
                                                ").appendTo(_a); +tt.tree({data:_b,animate:_c.animate,onBeforeSelect:function(_d){ +if(_d.children){ +return false; +} +},onSelect:function(_e){ +_12(_9,_e.id); +},onExpand:function(_f){ +_22(_9,_f); +},onCollapse:function(_10){ +_22(_9,_10); +},onClick:function(_11){ +if(_11.children){ +if(_11.state=="open"){ +$(_11.target).addClass("tree-node-nonleaf-collapsed"); +}else{ +$(_11.target).removeClass("tree-node-nonleaf-collapsed"); +} +$(this).tree("toggle",_11.target); +} +}}); +tt.unbind(".sidemenu").bind("mouseleave.sidemenu",function(){ +$(_a).trigger("mouseleave"); +}); +_12(_9,_c.selectedItemId); +}; +function _13(_14,_15,_16){ +var _17=$(_14).sidemenu("options"); +$(_15).tooltip({content:$("
                                                "),position:_17.floatMenuPosition,valign:"top",data:_16,onUpdate:function(_18){ +var _19=$(this).tooltip("options"); +var _1a=_19.data; +_18.accordion({width:_17.floatMenuWidth,multiple:false}).accordion("add",{title:_1a.text,iconCls:_1a.iconCls,collapsed:false,collapsible:false}); +_8(_14,_18.accordion("panels")[0],_1a.children); +},onShow:function(){ +var t=$(this); +var tip=t.tooltip("tip").addClass("sidemenu-tooltip"); +tip.children(".tooltip-content").addClass("sidemenu"); +tip.find(".accordion").accordion("resize"); +tip.unbind().bind("mouseenter",function(){ +t.tooltip("show"); +}).bind("mouseleave",function(){ +t.tooltip("hide"); +}); +},onPosition:function(){ +if(!_17.collapsed){ +$(this).tooltip("tip").css({left:-999999}); +} +}}); +}; +function _1b(_1c,_1d){ +$(_1c).find(".sidemenu-tree").each(function(){ +_1d($(this)); +}); +$(_1c).find(".tooltip-f").each(function(){ +var tip=$(this).tooltip("tip"); +if(tip){ +tip.find(".sidemenu-tree").each(function(){ +_1d($(this)); +}); +} +}); +}; +function _12(_1e,_1f){ +var _20=$(_1e).sidemenu("options"); +_1b(_1e,function(t){ +t.find("div.tree-node-selected").removeClass("tree-node-selected"); +var _21=t.tree("find",_1f); +if(_21){ +$(_21.target).addClass("tree-node-selected"); +_20.selectedItemId=_21.id; +t.trigger("mouseleave"); +_20.onSelect.call(_1e,_21); +} +}); +}; +function _22(_23,_24){ +_1b(_23,function(t){ +var _25=t.tree("find",_24.id); +if(_25){ +t.tree(_24.state=="open"?"expand":"collapse",_25.target); +} +}); +}; +function _26(_27){ +var _28=$(_27).sidemenu("options"); +$(_27).empty(); +if(_28.data){ +$.easyui.forEach(_28.data,true,function(_29){ +if(!_29.id){ +_29.id="_easyui_sidemenu_"+(_1++); +} +if(!_29.iconCls){ +_29.iconCls="sidemenu-default-icon"; +} +if(_29.children){ +_29.nodeCls="tree-node-nonleaf"; +if(!_29.state){ +_29.state="closed"; +} +if(_29.state=="open"){ +_29.nodeCls="tree-node-nonleaf"; +}else{ +_29.nodeCls="tree-node-nonleaf tree-node-nonleaf-collapsed"; +} +} +}); +var acc=$("
                                                ").appendTo(_27); +acc.accordion({fit:_28.height=="auto"?false:true,border:_28.border,multiple:_28.multiple}); +for(var i=0;i"+"
                                                "+""+""+"
                                                "+"
                                                "+"
                                                "+"
                                                "+""+"").insertAfter(_2); +var t=$(_2); +t.addClass("slider-f").hide(); +var _4=t.attr("name"); +if(_4){ +_3.find("input.slider-value").attr("name",_4); +t.removeAttr("name").attr("sliderName",_4); +} +_3.bind("_resize",function(e,_5){ +if($(this).hasClass("easyui-fluid")||_5){ +_6(_2); +} +return false; +}); +return _3; +}; +function _6(_7,_8){ +var _9=$.data(_7,"slider"); +var _a=_9.options; +var _b=_9.slider; +if(_8){ +if(_8.width){ +_a.width=_8.width; +} +if(_8.height){ +_a.height=_8.height; +} +} +_b._size(_a); +if(_a.mode=="h"){ +_b.css("height",""); +_b.children("div").css("height",""); +}else{ +_b.css("width",""); +_b.children("div").css("width",""); +_b.children("div.slider-rule,div.slider-rulelabel,div.slider-inner")._outerHeight(_b._outerHeight()); +} +_c(_7); +}; +function _d(_e){ +var _f=$.data(_e,"slider"); +var _10=_f.options; +var _11=_f.slider; +var aa=_10.mode=="h"?_10.rule:_10.rule.slice(0).reverse(); +if(_10.reversed){ +aa=aa.slice(0).reverse(); +} +_12(aa); +function _12(aa){ +var _13=_11.find("div.slider-rule"); +var _14=_11.find("div.slider-rulelabel"); +_13.empty(); +_14.empty(); +for(var i=0;i").appendTo(_13); +_16.css((_10.mode=="h"?"left":"top"),_15); +if(aa[i]!="|"){ +_16=$("").appendTo(_14); +_16.html(aa[i]); +if(_10.mode=="h"){ +_16.css({left:_15,marginLeft:-Math.round(_16.outerWidth()/2)}); +}else{ +_16.css({top:_15,marginTop:-Math.round(_16.outerHeight()/2)}); +} +} +} +}; +}; +function _17(_18){ +var _19=$.data(_18,"slider"); +var _1a=_19.options; +var _1b=_19.slider; +_1b.removeClass("slider-h slider-v slider-disabled"); +_1b.addClass(_1a.mode=="h"?"slider-h":"slider-v"); +_1b.addClass(_1a.disabled?"slider-disabled":""); +var _1c=_1b.find(".slider-inner"); +_1c.html(""+""); +if(_1a.range){ +_1c.append(""+""); +} +_1b.find("a.slider-handle").draggable({axis:_1a.mode,cursor:"pointer",disabled:_1a.disabled,onDrag:function(e){ +var _1d=e.data.left; +var _1e=_1b.width(); +if(_1a.mode!="h"){ +_1d=e.data.top; +_1e=_1b.height(); +} +if(_1d<0||_1d>_1e){ +return false; +}else{ +_1f(_1d,this); +return false; +} +},onStartDrag:function(){ +_19.isDragging=true; +_1a.onSlideStart.call(_18,_1a.value); +},onStopDrag:function(e){ +_1f(_1a.mode=="h"?e.data.left:e.data.top,this); +_1a.onSlideEnd.call(_18,_1a.value); +_1a.onComplete.call(_18,_1a.value); +_19.isDragging=false; +}}); +_1b.find("div.slider-inner").unbind(".slider").bind("mousedown.slider",function(e){ +if(_19.isDragging||_1a.disabled){ +return; +} +var pos=$(this).offset(); +_1f(_1a.mode=="h"?(e.pageX-pos.left):(e.pageY-pos.top)); +_1a.onComplete.call(_18,_1a.value); +}); +function _20(_21){ +var dd=String(_1a.step).split("."); +var _22=dd.length>1?dd[1].length:0; +return parseFloat(_21.toFixed(_22)); +}; +function _1f(pos,_23){ +var _24=_25(_18,pos); +var s=Math.abs(_24%_1a.step); +if(s<_1a.step/2){ +_24-=s; +}else{ +_24=_24-s+_1a.step; +} +_24=_20(_24); +if(_1a.range){ +var v1=_1a.value[0]; +var v2=_1a.value[1]; +var m=parseFloat((v1+v2)/2); +if(_23){ +var _26=$(_23).nextAll(".slider-handle").length>0; +if(_24<=v2&&_26){ +v1=_24; +}else{ +if(_24>=v1&&(!_26)){ +v2=_24; +} +} +}else{ +if(_24v2){ +v2=_24; +}else{ +_24_2b.max){ +_30=_2b.max; +} +var _31=$("").appendTo(_2c); +_31.attr("name",_2f); +_31.val(_30); +_2e.push(_30); +var _32=_2c.find(".slider-handle:eq("+i+")"); +var tip=_32.next(); +var pos=_33(_28,_30); +if(_2b.showTip){ +tip.show(); +tip.html(_2b.tipFormatter.call(_28,_30)); +}else{ +tip.hide(); +} +if(_2b.mode=="h"){ +var _34="left:"+pos+"px;"; +_32.attr("style",_34); +tip.attr("style",_34+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px"); +}else{ +var _34="top:"+pos+"px;"; +_32.attr("style",_34); +tip.attr("style",_34+"margin-left:"+(-Math.round(tip.outerWidth()))+"px"); +} +} +_2b.value=_2b.range?_2e:_2e[0]; +$(_28).val(_2b.range?_2e.join(_2b.separator):_2e[0]); +if(_2d.join(",")!=_2e.join(",")){ +_2b.onChange.call(_28,_2b.value,(_2b.range?_2d:_2d[0])); +} +}; +function _c(_35){ +var _36=$.data(_35,"slider").options; +var fn=_36.onChange; +_36.onChange=function(){ +}; +_27(_35,_36.value); +_36.onChange=fn; +}; +function _33(_37,_38){ +var _39=$.data(_37,"slider"); +var _3a=_39.options; +var _3b=_39.slider; +var _3c=_3a.mode=="h"?_3b.width():_3b.height(); +var pos=_3a.converter.toPosition.call(_37,_38,_3c); +if(_3a.mode=="v"){ +pos=_3b.height()-pos; +} +if(_3a.reversed){ +pos=_3c-pos; +} +return pos; +}; +function _25(_3d,pos){ +var _3e=$.data(_3d,"slider"); +var _3f=_3e.options; +var _40=_3e.slider; +var _41=_3f.mode=="h"?_40.width():_40.height(); +var pos=_3f.mode=="h"?(_3f.reversed?(_41-pos):pos):(_3f.reversed?pos:(_41-pos)); +var _42=_3f.converter.toValue.call(_3d,pos,_41); +return _42; +}; +$.fn.slider=function(_43,_44){ +if(typeof _43=="string"){ +return $.fn.slider.methods[_43](this,_44); +} +_43=_43||{}; +return this.each(function(){ +var _45=$.data(this,"slider"); +if(_45){ +$.extend(_45.options,_43); +}else{ +_45=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_43),slider:_1(this)}); +$(this)._propAttr("disabled",false); +} +var _46=_45.options; +_46.min=parseFloat(_46.min); +_46.max=parseFloat(_46.max); +if(_46.range){ +if(!$.isArray(_46.value)){ +_46.value=$.map(String(_46.value).split(_46.separator),function(v){ +return parseFloat(v); +}); +} +if(_46.value.length<2){ +_46.value.push(_46.max); +} +}else{ +_46.value=parseFloat(_46.value); +} +_46.step=parseFloat(_46.step); +_46.originalValue=_46.value; +_17(this); +_d(this); +_6(this); +}); +}; +$.fn.slider.methods={options:function(jq){ +return $.data(jq[0],"slider").options; +},destroy:function(jq){ +return jq.each(function(){ +$.data(this,"slider").slider.remove(); +$(this).remove(); +}); +},resize:function(jq,_47){ +return jq.each(function(){ +_6(this,_47); +}); +},getValue:function(jq){ +return jq.slider("options").value; +},getValues:function(jq){ +return jq.slider("options").value; +},setValue:function(jq,_48){ +return jq.each(function(){ +_27(this,[_48]); +}); +},setValues:function(jq,_49){ +return jq.each(function(){ +_27(this,_49); +}); +},clear:function(jq){ +return jq.each(function(){ +var _4a=$(this).slider("options"); +_27(this,_4a.range?[_4a.min,_4a.max]:[_4a.min]); +}); +},reset:function(jq){ +return jq.each(function(){ +var _4b=$(this).slider("options"); +$(this).slider(_4b.range?"setValues":"setValue",_4b.originalValue); +}); +},enable:function(jq){ +return jq.each(function(){ +$.data(this,"slider").options.disabled=false; +_17(this); +}); +},disable:function(jq){ +return jq.each(function(){ +$.data(this,"slider").options.disabled=true; +_17(this); +}); +}}; +$.fn.slider.parseOptions=function(_4c){ +var t=$(_4c); +return $.extend({},$.parser.parseOptions(_4c,["width","height","mode",{reversed:"boolean",showTip:"boolean",range:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)}); +}; +$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,range:false,value:0,separator:",",min:0,max:100,step:1,rule:[],tipFormatter:function(_4d){ +return _4d; +},converter:{toPosition:function(_4e,_4f){ +var _50=$(this).slider("options"); +var p=(_4e-_50.min)/(_50.max-_50.min)*_4f; +return p; +},toValue:function(pos,_51){ +var _52=$(this).slider("options"); +var v=_52.min+(_52.max-_52.min)*(pos/_51); +return v; +}},onChange:function(_53,_54){ +},onSlideStart:function(_55){ +},onSlideEnd:function(_56){ +},onComplete:function(_57){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.spinner.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.spinner.js new file mode 100755 index 000000000..0bb82369c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.spinner.js @@ -0,0 +1,128 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"spinner"); +var _4=_3.options; +var _5=$.extend(true,[],_4.icons); +if(_4.spinAlign=="left"||_4.spinAlign=="right"){ +_4.spinArrow=true; +_4.iconAlign=_4.spinAlign; +var _6={iconCls:"spinner-button-updown",handler:function(e){ +var _7=$(e.target).closest(".spinner-arrow-up,.spinner-arrow-down"); +_13(e.data.target,_7.hasClass("spinner-arrow-down")); +}}; +if(_4.spinAlign=="left"){ +_5.unshift(_6); +}else{ +_5.push(_6); +} +}else{ +_4.spinArrow=false; +if(_4.spinAlign=="vertical"){ +if(_4.buttonAlign!="top"){ +_4.buttonAlign="bottom"; +} +_4.clsLeft="textbox-button-bottom"; +_4.clsRight="textbox-button-top"; +}else{ +_4.clsLeft="textbox-button-left"; +_4.clsRight="textbox-button-right"; +} +} +$(_2).addClass("spinner-f").textbox($.extend({},_4,{icons:_5,doSize:false,onResize:function(_8,_9){ +if(!_4.spinArrow){ +var _a=$(this).next(); +var _b=_a.find(".textbox-button:not(.spinner-button)"); +if(_b.length){ +var _c=_b.outerWidth(); +var _d=_b.outerHeight(); +var _e=_a.find(".spinner-button."+_4.clsLeft); +var _f=_a.find(".spinner-button."+_4.clsRight); +if(_4.buttonAlign=="right"){ +_f.css("marginRight",_c+"px"); +}else{ +if(_4.buttonAlign=="left"){ +_e.css("marginLeft",_c+"px"); +}else{ +if(_4.buttonAlign=="top"){ +_f.css("marginTop",_d+"px"); +}else{ +_e.css("marginBottom",_d+"px"); +} +} +} +} +} +_4.onResize.call(this,_8,_9); +}})); +$(_2).attr("spinnerName",$(_2).attr("textboxName")); +_3.spinner=$(_2).next(); +_3.spinner.addClass("spinner"); +if(_4.spinArrow){ +var _10=_3.spinner.find(".spinner-button-updown"); +_10.append(""+""+""+""+""+""); +}else{ +var _11=$("").addClass(_4.clsLeft).appendTo(_3.spinner); +var _12=$("").addClass(_4.clsRight).appendTo(_3.spinner); +_11.linkbutton({iconCls:_4.reversed?"spinner-button-up":"spinner-button-down",onClick:function(){ +_13(_2,!_4.reversed); +}}); +_12.linkbutton({iconCls:_4.reversed?"spinner-button-down":"spinner-button-up",onClick:function(){ +_13(_2,_4.reversed); +}}); +if(_4.disabled){ +$(_2).spinner("disable"); +} +if(_4.readonly){ +$(_2).spinner("readonly"); +} +} +$(_2).spinner("resize"); +}; +function _13(_14,_15){ +var _16=$(_14).spinner("options"); +_16.spin.call(_14,_15); +_16[_15?"onSpinDown":"onSpinUp"].call(_14); +$(_14).spinner("validate"); +}; +$.fn.spinner=function(_17,_18){ +if(typeof _17=="string"){ +var _19=$.fn.spinner.methods[_17]; +if(_19){ +return _19(this,_18); +}else{ +return this.textbox(_17,_18); +} +} +_17=_17||{}; +return this.each(function(){ +var _1a=$.data(this,"spinner"); +if(_1a){ +$.extend(_1a.options,_17); +}else{ +_1a=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_17)}); +} +_1(this); +}); +}; +$.fn.spinner.methods={options:function(jq){ +var _1b=jq.textbox("options"); +return $.extend($.data(jq[0],"spinner").options,{width:_1b.width,value:_1b.value,originalValue:_1b.originalValue,disabled:_1b.disabled,readonly:_1b.readonly}); +}}; +$.fn.spinner.parseOptions=function(_1c){ +return $.extend({},$.fn.textbox.parseOptions(_1c),$.parser.parseOptions(_1c,["min","max","spinAlign",{increment:"number",reversed:"boolean"}])); +}; +$.fn.spinner.defaults=$.extend({},$.fn.textbox.defaults,{min:null,max:null,increment:1,spinAlign:"right",reversed:false,spin:function(_1d){ +},onSpinUp:function(){ +},onSpinDown:function(){ +}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.splitbutton.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.splitbutton.js new file mode 100755 index 000000000..5bb4e55e6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.splitbutton.js @@ -0,0 +1,49 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"splitbutton").options; +$(_2).menubutton(_3); +$(_2).addClass("s-btn"); +}; +$.fn.splitbutton=function(_4,_5){ +if(typeof _4=="string"){ +var _6=$.fn.splitbutton.methods[_4]; +if(_6){ +return _6(this,_5); +}else{ +return this.menubutton(_4,_5); +} +} +_4=_4||{}; +return this.each(function(){ +var _7=$.data(this,"splitbutton"); +if(_7){ +$.extend(_7.options,_4); +}else{ +$.data(this,"splitbutton",{options:$.extend({},$.fn.splitbutton.defaults,$.fn.splitbutton.parseOptions(this),_4)}); +$(this)._propAttr("disabled",false); +} +_1(this); +}); +}; +$.fn.splitbutton.methods={options:function(jq){ +var _8=jq.menubutton("options"); +var _9=$.data(jq[0],"splitbutton").options; +$.extend(_9,{disabled:_8.disabled,toggle:_8.toggle,selected:_8.selected}); +return _9; +}}; +$.fn.splitbutton.parseOptions=function(_a){ +var t=$(_a); +return $.extend({},$.fn.linkbutton.parseOptions(_a),$.parser.parseOptions(_a,["menu",{plain:"boolean",duration:"number"}])); +}; +$.fn.splitbutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100,cls:{btn1:"m-btn-active s-btn-active",btn2:"m-btn-plain-active s-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn-line"}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.switchbutton.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.switchbutton.js new file mode 100644 index 000000000..8a752c44c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.switchbutton.js @@ -0,0 +1,193 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$(""+""+""+""+""+""+""+"").insertAfter(_2); +var t=$(_2); +t.addClass("switchbutton-f").hide(); +var _4=t.attr("name"); +if(_4){ +t.removeAttr("name").attr("switchbuttonName",_4); +_3.find(".switchbutton-value").attr("name",_4); +} +_3.bind("_resize",function(e,_5){ +if($(this).hasClass("easyui-fluid")||_5){ +_6(_2); +} +return false; +}); +return _3; +}; +function _6(_7,_8){ +var _9=$.data(_7,"switchbutton"); +var _a=_9.options; +var _b=_9.switchbutton; +if(_8){ +$.extend(_a,_8); +} +var _c=_b.is(":visible"); +if(!_c){ +_b.appendTo("body"); +} +_b._size(_a); +var w=_b.width(); +var h=_b.height(); +var w=_b.outerWidth(); +var h=_b.outerHeight(); +var _d=parseInt(_a.handleWidth)||_b.height(); +var _e=w*2-_d; +_b.find(".switchbutton-inner").css({width:_e+"px",height:h+"px",lineHeight:h+"px"}); +_b.find(".switchbutton-handle")._outerWidth(_d)._outerHeight(h).css({marginLeft:-_d/2+"px"}); +_b.find(".switchbutton-on").css({width:(w-_d/2)+"px",textIndent:(_a.reversed?"":"-")+_d/2+"px"}); +_b.find(".switchbutton-off").css({width:(w-_d/2)+"px",textIndent:(_a.reversed?"-":"")+_d/2+"px"}); +_a.marginWidth=w-_d; +_f(_7,_a.checked,false); +if(!_c){ +_b.insertAfter(_7); +} +}; +function _10(_11){ +var _12=$.data(_11,"switchbutton"); +var _13=_12.options; +var _14=_12.switchbutton; +var _15=_14.find(".switchbutton-inner"); +var on=_15.find(".switchbutton-on").html(_13.onText); +var off=_15.find(".switchbutton-off").html(_13.offText); +var _16=_15.find(".switchbutton-handle").html(_13.handleText); +if(_13.reversed){ +off.prependTo(_15); +on.insertAfter(_16); +}else{ +on.prependTo(_15); +off.insertAfter(_16); +} +_14.find(".switchbutton-value")._propAttr("checked",_13.checked); +_14.removeClass("switchbutton-disabled").addClass(_13.disabled?"switchbutton-disabled":""); +_14.removeClass("switchbutton-reversed").addClass(_13.reversed?"switchbutton-reversed":""); +_f(_11,_13.checked); +_17(_11,_13.readonly); +$(_11).switchbutton("setValue",_13.value); +}; +function _f(_18,_19,_1a){ +var _1b=$.data(_18,"switchbutton"); +var _1c=_1b.options; +_1c.checked=_19; +var _1d=_1b.switchbutton.find(".switchbutton-inner"); +var _1e=_1d.find(".switchbutton-on"); +var _1f=_1c.reversed?(_1c.checked?_1c.marginWidth:0):(_1c.checked?0:_1c.marginWidth); +var dir=_1e.css("float").toLowerCase(); +var css={}; +css["margin-"+dir]=-_1f+"px"; +_1a?_1d.animate(css,200):_1d.css(css); +var _20=_1d.find(".switchbutton-value"); +var ck=_20.is(":checked"); +$(_18).add(_20)._propAttr("checked",_1c.checked); +if(ck!=_1c.checked){ +_1c.onChange.call(_18,_1c.checked); +} +}; +function _21(_22,_23){ +var _24=$.data(_22,"switchbutton"); +var _25=_24.options; +var _26=_24.switchbutton; +var _27=_26.find(".switchbutton-value"); +if(_23){ +_25.disabled=true; +$(_22).add(_27)._propAttr("disabled",true); +_26.addClass("switchbutton-disabled"); +}else{ +_25.disabled=false; +$(_22).add(_27)._propAttr("disabled",false); +_26.removeClass("switchbutton-disabled"); +} +}; +function _17(_28,_29){ +var _2a=$.data(_28,"switchbutton"); +var _2b=_2a.options; +_2b.readonly=_29==undefined?true:_29; +_2a.switchbutton.removeClass("switchbutton-readonly").addClass(_2b.readonly?"switchbutton-readonly":""); +}; +function _2c(_2d){ +var _2e=$.data(_2d,"switchbutton"); +var _2f=_2e.options; +_2e.switchbutton.unbind(".switchbutton").bind("click.switchbutton",function(){ +if(!_2f.disabled&&!_2f.readonly){ +_f(_2d,_2f.checked?false:true,true); +} +}); +}; +$.fn.switchbutton=function(_30,_31){ +if(typeof _30=="string"){ +return $.fn.switchbutton.methods[_30](this,_31); +} +_30=_30||{}; +return this.each(function(){ +var _32=$.data(this,"switchbutton"); +if(_32){ +$.extend(_32.options,_30); +}else{ +_32=$.data(this,"switchbutton",{options:$.extend({},$.fn.switchbutton.defaults,$.fn.switchbutton.parseOptions(this),_30),switchbutton:_1(this)}); +} +_32.options.originalChecked=_32.options.checked; +_10(this); +_6(this); +_2c(this); +}); +}; +$.fn.switchbutton.methods={options:function(jq){ +var _33=jq.data("switchbutton"); +return $.extend(_33.options,{value:_33.switchbutton.find(".switchbutton-value").val()}); +},resize:function(jq,_34){ +return jq.each(function(){ +_6(this,_34); +}); +},enable:function(jq){ +return jq.each(function(){ +_21(this,false); +}); +},disable:function(jq){ +return jq.each(function(){ +_21(this,true); +}); +},readonly:function(jq,_35){ +return jq.each(function(){ +_17(this,_35); +}); +},check:function(jq){ +return jq.each(function(){ +_f(this,true); +}); +},uncheck:function(jq){ +return jq.each(function(){ +_f(this,false); +}); +},clear:function(jq){ +return jq.each(function(){ +_f(this,false); +}); +},reset:function(jq){ +return jq.each(function(){ +var _36=$(this).switchbutton("options"); +_f(this,_36.originalChecked); +}); +},setValue:function(jq,_37){ +return jq.each(function(){ +$(this).val(_37); +$.data(this,"switchbutton").switchbutton.find(".switchbutton-value").val(_37); +}); +}}; +$.fn.switchbutton.parseOptions=function(_38){ +var t=$(_38); +return $.extend({},$.parser.parseOptions(_38,["onText","offText","handleText",{handleWidth:"number",reversed:"boolean"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)}); +}; +$.fn.switchbutton.defaults={handleWidth:"auto",width:60,height:30,checked:false,disabled:false,readonly:false,reversed:false,onText:"ON",offText:"OFF",handleText:"",value:"on",onChange:function(_39){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tabs.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tabs.js new file mode 100755 index 000000000..4dc74d913 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tabs.js @@ -0,0 +1,716 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(c){ +var w=0; +$(c).children().each(function(){ +w+=$(this).outerWidth(true); +}); +return w; +}; +function _2(_3){ +var _4=$.data(_3,"tabs").options; +if(!_4.showHeader){ +return; +} +var _5=$(_3).children("div.tabs-header"); +var _6=_5.children("div.tabs-tool:not(.tabs-tool-hidden)"); +var _7=_5.children("div.tabs-scroller-left"); +var _8=_5.children("div.tabs-scroller-right"); +var _9=_5.children("div.tabs-wrap"); +if(_4.tabPosition=="left"||_4.tabPosition=="right"){ +if(!_6.length){ +return; +} +_6._outerWidth(_5.width()); +var _a={left:_4.tabPosition=="left"?"auto":0,right:_4.tabPosition=="left"?0:"auto",top:_4.toolPosition=="top"?0:"auto",bottom:_4.toolPosition=="top"?"auto":0}; +var _b={marginTop:_4.toolPosition=="top"?_6.outerHeight():0}; +_6.css(_a); +_9.css(_b); +return; +} +var _c=_5.outerHeight(); +if(_4.plain){ +_c-=_c-_5.height(); +} +_6._outerHeight(_c); +var _d=_1(_5.find("ul.tabs")); +var _e=_5.width()-_6._outerWidth(); +if(_d>_e){ +_7.add(_8).show()._outerHeight(_c); +if(_4.toolPosition=="left"){ +_6.css({left:_7.outerWidth(),right:""}); +_9.css({marginLeft:_7.outerWidth()+_6._outerWidth(),marginRight:_8._outerWidth(),width:_e-_7.outerWidth()-_8.outerWidth()}); +}else{ +_6.css({left:"",right:_8.outerWidth()}); +_9.css({marginLeft:_7.outerWidth(),marginRight:_8.outerWidth()+_6._outerWidth(),width:_e-_7.outerWidth()-_8.outerWidth()}); +} +}else{ +_7.add(_8).hide(); +if(_4.toolPosition=="left"){ +_6.css({left:0,right:""}); +_9.css({marginLeft:_6._outerWidth(),marginRight:0,width:_e}); +}else{ +_6.css({left:"",right:0}); +_9.css({marginLeft:0,marginRight:_6._outerWidth(),width:_e}); +} +} +}; +function _f(_10){ +var _11=$.data(_10,"tabs").options; +var _12=$(_10).children("div.tabs-header"); +if(_11.tools){ +if(typeof _11.tools=="string"){ +$(_11.tools).addClass("tabs-tool").appendTo(_12); +$(_11.tools).show(); +}else{ +_12.children("div.tabs-tool").remove(); +var _13=$("
                                                ").appendTo(_12); +var tr=_13.find("tr"); +for(var i=0;i<_11.tools.length;i++){ +var td=$("").appendTo(tr); +var _14=$("").appendTo(td); +_14[0].onclick=eval(_11.tools[i].handler||function(){ +}); +_14.linkbutton($.extend({},_11.tools[i],{plain:true})); +} +} +}else{ +_12.children("div.tabs-tool").remove(); +} +}; +function _15(_16,_17){ +var _18=$.data(_16,"tabs"); +var _19=_18.options; +var cc=$(_16); +if(!_19.doSize){ +return; +} +if(_17){ +$.extend(_19,{width:_17.width,height:_17.height}); +} +cc._size(_19); +var _1a=cc.children("div.tabs-header"); +var _1b=cc.children("div.tabs-panels"); +var _1c=_1a.find("div.tabs-wrap"); +var ul=_1c.find(".tabs"); +ul.children("li").removeClass("tabs-first tabs-last"); +ul.children("li:first").addClass("tabs-first"); +ul.children("li:last").addClass("tabs-last"); +if(_19.tabPosition=="left"||_19.tabPosition=="right"){ +_1a._outerWidth(_19.showHeader?_19.headerWidth:0); +_1b._outerWidth(cc.width()-_1a.outerWidth()); +_1a.add(_1b)._size("height",isNaN(parseInt(_19.height))?"":cc.height()); +_1c._outerWidth(_1a.width()); +ul._outerWidth(_1c.width()).css("height",""); +}else{ +_1a.children("div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)").css("display",_19.showHeader?"block":"none"); +_1a._outerWidth(cc.width()).css("height",""); +if(_19.showHeader){ +_1a.css("background-color",""); +_1c.css("height",""); +}else{ +_1a.css("background-color","transparent"); +_1a._outerHeight(0); +_1c._outerHeight(0); +} +ul._outerHeight(_19.tabHeight).css("width",""); +ul._outerHeight(ul.outerHeight()-ul.height()-1+_19.tabHeight).css("width",""); +_1b._size("height",isNaN(parseInt(_19.height))?"":(cc.height()-_1a.outerHeight())); +_1b._size("width",cc.width()); +} +if(_18.tabs.length){ +var d1=ul.outerWidth(true)-ul.width(); +var li=ul.children("li:first"); +var d2=li.outerWidth(true)-li.width(); +var _1d=_1a.width()-_1a.children(".tabs-tool:not(.tabs-tool-hidden)")._outerWidth(); +var _1e=Math.floor((_1d-d1-d2*_18.tabs.length)/_18.tabs.length); +$.map(_18.tabs,function(p){ +_1f(p,(_19.justified&&$.inArray(_19.tabPosition,["top","bottom"])>=0)?_1e:undefined); +}); +if(_19.justified&&$.inArray(_19.tabPosition,["top","bottom"])>=0){ +var _20=_1d-d1-_1(ul); +_1f(_18.tabs[_18.tabs.length-1],_1e+_20); +} +} +_2(_16); +function _1f(p,_21){ +var _22=p.panel("options"); +var p_t=_22.tab.find("a.tabs-inner"); +var _21=_21?_21:(parseInt(_22.tabWidth||_19.tabWidth||undefined)); +if(_21){ +p_t._outerWidth(_21); +}else{ +p_t.css("width",""); +} +p_t._outerHeight(_19.tabHeight); +p_t.css("lineHeight",p_t.height()+"px"); +p_t.find(".easyui-fluid:visible").triggerHandler("_resize"); +}; +}; +function _23(_24){ +var _25=$.data(_24,"tabs").options; +var tab=_26(_24); +if(tab){ +var _27=$(_24).children("div.tabs-panels"); +var _28=_25.width=="auto"?"auto":_27.width(); +var _29=_25.height=="auto"?"auto":_27.height(); +tab.panel("resize",{width:_28,height:_29}); +} +}; +function _2a(_2b){ +var _2c=$.data(_2b,"tabs").tabs; +var cc=$(_2b).addClass("tabs-container"); +var _2d=$("
                                                ").insertBefore(cc); +cc.children("div").each(function(){ +_2d[0].appendChild(this); +}); +cc[0].appendChild(_2d[0]); +$("
                                                "+"
                                                "+"
                                                "+"
                                                "+"
                                                  "+"
                                                  "+"
                                                  ").prependTo(_2b); +cc.children("div.tabs-panels").children("div").each(function(i){ +var _2e=$.extend({},$.parser.parseOptions(this),{disabled:($(this).attr("disabled")?true:undefined),selected:($(this).attr("selected")?true:undefined)}); +_3e(_2b,_2e,$(this)); +}); +cc.children("div.tabs-header").find(".tabs-scroller-left, .tabs-scroller-right").hover(function(){ +$(this).addClass("tabs-scroller-over"); +},function(){ +$(this).removeClass("tabs-scroller-over"); +}); +cc.bind("_resize",function(e,_2f){ +if($(this).hasClass("easyui-fluid")||_2f){ +_15(_2b); +_23(_2b); +} +return false; +}); +}; +function _30(_31){ +var _32=$.data(_31,"tabs"); +var _33=_32.options; +$(_31).children("div.tabs-header").unbind().bind("click",function(e){ +if($(e.target).hasClass("tabs-scroller-left")){ +$(_31).tabs("scrollBy",-_33.scrollIncrement); +}else{ +if($(e.target).hasClass("tabs-scroller-right")){ +$(_31).tabs("scrollBy",_33.scrollIncrement); +}else{ +var li=$(e.target).closest("li"); +if(li.hasClass("tabs-disabled")){ +return false; +} +var a=$(e.target).closest("a.tabs-close"); +if(a.length){ +_5d(_31,_34(li)); +}else{ +if(li.length){ +var _35=_34(li); +var _36=_32.tabs[_35].panel("options"); +if(_36.collapsible){ +_36.closed?_53(_31,_35):_7b(_31,_35); +}else{ +_53(_31,_35); +} +} +} +return false; +} +} +}).bind("contextmenu",function(e){ +var li=$(e.target).closest("li"); +if(li.hasClass("tabs-disabled")){ +return; +} +if(li.length){ +_33.onContextMenu.call(_31,e,li.find("span.tabs-title").html(),_34(li)); +} +}); +function _34(li){ +var _37=0; +li.parent().children("li").each(function(i){ +if(li[0]==this){ +_37=i; +return false; +} +}); +return _37; +}; +}; +function _38(_39){ +var _3a=$.data(_39,"tabs").options; +var _3b=$(_39).children("div.tabs-header"); +var _3c=$(_39).children("div.tabs-panels"); +_3b.removeClass("tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right"); +_3c.removeClass("tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right"); +if(_3a.tabPosition=="top"){ +_3b.insertBefore(_3c); +}else{ +if(_3a.tabPosition=="bottom"){ +_3b.insertAfter(_3c); +_3b.addClass("tabs-header-bottom"); +_3c.addClass("tabs-panels-top"); +}else{ +if(_3a.tabPosition=="left"){ +_3b.addClass("tabs-header-left"); +_3c.addClass("tabs-panels-right"); +}else{ +if(_3a.tabPosition=="right"){ +_3b.addClass("tabs-header-right"); +_3c.addClass("tabs-panels-left"); +} +} +} +} +if(_3a.plain==true){ +_3b.addClass("tabs-header-plain"); +}else{ +_3b.removeClass("tabs-header-plain"); +} +_3b.removeClass("tabs-header-narrow").addClass(_3a.narrow?"tabs-header-narrow":""); +var _3d=_3b.find(".tabs"); +_3d.removeClass("tabs-pill").addClass(_3a.pill?"tabs-pill":""); +_3d.removeClass("tabs-narrow").addClass(_3a.narrow?"tabs-narrow":""); +_3d.removeClass("tabs-justified").addClass(_3a.justified?"tabs-justified":""); +if(_3a.border==true){ +_3b.removeClass("tabs-header-noborder"); +_3c.removeClass("tabs-panels-noborder"); +}else{ +_3b.addClass("tabs-header-noborder"); +_3c.addClass("tabs-panels-noborder"); +} +_3a.doSize=true; +}; +function _3e(_3f,_40,pp){ +_40=_40||{}; +var _41=$.data(_3f,"tabs"); +var _42=_41.tabs; +if(_40.index==undefined||_40.index>_42.length){ +_40.index=_42.length; +} +if(_40.index<0){ +_40.index=0; +} +var ul=$(_3f).children("div.tabs-header").find("ul.tabs"); +var _43=$(_3f).children("div.tabs-panels"); +var tab=$("
                                                • "+""+""+""+""+"
                                                • "); +if(!pp){ +pp=$("
                                                  "); +} +if(_40.index>=_42.length){ +tab.appendTo(ul); +pp.appendTo(_43); +_42.push(pp); +}else{ +tab.insertBefore(ul.children("li:eq("+_40.index+")")); +pp.insertBefore(_43.children("div.panel:eq("+_40.index+")")); +_42.splice(_40.index,0,pp); +} +pp.panel($.extend({},_40,{tab:tab,border:false,noheader:true,closed:true,doSize:false,iconCls:(_40.icon?_40.icon:undefined),onLoad:function(){ +if(_40.onLoad){ +_40.onLoad.apply(this,arguments); +} +_41.options.onLoad.call(_3f,$(this)); +},onBeforeOpen:function(){ +if(_40.onBeforeOpen){ +if(_40.onBeforeOpen.call(this)==false){ +return false; +} +} +var p=$(_3f).tabs("getSelected"); +if(p){ +if(p[0]!=this){ +$(_3f).tabs("unselect",_4d(_3f,p)); +p=$(_3f).tabs("getSelected"); +if(p){ +return false; +} +}else{ +_23(_3f); +return false; +} +} +var _44=$(this).panel("options"); +_44.tab.addClass("tabs-selected"); +var _45=$(_3f).find(">div.tabs-header>div.tabs-wrap"); +var _46=_44.tab.position().left; +var _47=_46+_44.tab.outerWidth(); +if(_46<0||_47>_45.width()){ +var _48=_46-(_45.width()-_44.tab.width())/2; +$(_3f).tabs("scrollBy",_48); +}else{ +$(_3f).tabs("scrollBy",0); +} +var _49=$(this).panel("panel"); +_49.css("display","block"); +_23(_3f); +_49.css("display","none"); +},onOpen:function(){ +if(_40.onOpen){ +_40.onOpen.call(this); +} +var _4a=$(this).panel("options"); +var _4b=_4d(_3f,this); +_41.selectHis.push(_4b); +_41.options.onSelect.call(_3f,_4a.title,_4b); +},onBeforeClose:function(){ +if(_40.onBeforeClose){ +if(_40.onBeforeClose.call(this)==false){ +return false; +} +} +$(this).panel("options").tab.removeClass("tabs-selected"); +},onClose:function(){ +if(_40.onClose){ +_40.onClose.call(this); +} +var _4c=$(this).panel("options"); +_41.options.onUnselect.call(_3f,_4c.title,_4d(_3f,this)); +}})); +$(_3f).tabs("update",{tab:pp,options:pp.panel("options"),type:"header"}); +}; +function _4e(_4f,_50){ +var _51=$.data(_4f,"tabs"); +var _52=_51.options; +if(_50.selected==undefined){ +_50.selected=true; +} +_3e(_4f,_50); +_52.onAdd.call(_4f,_50.title,_50.index); +if(_50.selected){ +_53(_4f,_50.index); +} +}; +function _54(_55,_56){ +_56.type=_56.type||"all"; +var _57=$.data(_55,"tabs").selectHis; +var pp=_56.tab; +var _58=pp.panel("options"); +var _59=_58.title; +$.extend(_58,_56.options,{iconCls:(_56.options.icon?_56.options.icon:undefined)}); +if(_56.type=="all"||_56.type=="body"){ +pp.panel(); +} +if(_56.type=="all"||_56.type=="header"){ +var tab=_58.tab; +if(_58.header){ +tab.find(".tabs-inner").html($(_58.header)); +}else{ +var _5a=tab.find("span.tabs-title"); +var _5b=tab.find("span.tabs-icon"); +_5a.html(_58.title); +_5b.attr("class","tabs-icon"); +tab.find("a.tabs-close").remove(); +if(_58.closable){ +_5a.addClass("tabs-closable"); +$("").appendTo(tab); +}else{ +_5a.removeClass("tabs-closable"); +} +if(_58.iconCls){ +_5a.addClass("tabs-with-icon"); +_5b.addClass(_58.iconCls); +}else{ +_5a.removeClass("tabs-with-icon"); +} +if(_58.tools){ +var _5c=tab.find("span.tabs-p-tool"); +if(!_5c.length){ +var _5c=$("").insertAfter(tab.find("a.tabs-inner")); +} +if($.isArray(_58.tools)){ +_5c.empty(); +for(var i=0;i<_58.tools.length;i++){ +var t=$("").appendTo(_5c); +t.addClass(_58.tools[i].iconCls); +if(_58.tools[i].handler){ +t.bind("click",{handler:_58.tools[i].handler},function(e){ +if($(this).parents("li").hasClass("tabs-disabled")){ +return; +} +e.data.handler.call(this); +}); +} +} +}else{ +$(_58.tools).children().appendTo(_5c); +} +var pr=_5c.children().length*12; +if(_58.closable){ +pr+=8; +_5c.css("right",""); +}else{ +pr-=3; +_5c.css("right","5px"); +} +_5a.css("padding-right",pr+"px"); +}else{ +tab.find("span.tabs-p-tool").remove(); +_5a.css("padding-right",""); +} +} +} +if(_58.disabled){ +_58.tab.addClass("tabs-disabled"); +}else{ +_58.tab.removeClass("tabs-disabled"); +} +_15(_55); +$.data(_55,"tabs").options.onUpdate.call(_55,_58.title,_4d(_55,pp)); +}; +function _5d(_5e,_5f){ +var _60=$.data(_5e,"tabs"); +var _61=_60.options; +var _62=_60.tabs; +var _63=_60.selectHis; +if(!_64(_5e,_5f)){ +return; +} +var tab=_65(_5e,_5f); +var _66=tab.panel("options").title; +var _67=_4d(_5e,tab); +if(_61.onBeforeClose.call(_5e,_66,_67)==false){ +return; +} +var tab=_65(_5e,_5f,true); +tab.panel("options").tab.remove(); +tab.panel("destroy"); +_61.onClose.call(_5e,_66,_67); +_15(_5e); +var his=[]; +for(var i=0;i<_63.length;i++){ +var _68=_63[i]; +if(_68!=_67){ +his.push(_68>_67?_68-1:_68); +} +} +_60.selectHis=his; +var _69=$(_5e).tabs("getSelected"); +if(!_69&&his.length){ +_67=_60.selectHis.pop(); +$(_5e).tabs("select",_67); +} +}; +function _65(_6a,_6b,_6c){ +var _6d=$.data(_6a,"tabs").tabs; +var tab=null; +if(typeof _6b=="number"){ +if(_6b>=0&&_6b<_6d.length){ +tab=_6d[_6b]; +if(_6c){ +_6d.splice(_6b,1); +} +} +}else{ +var tmp=$(""); +for(var i=0;i<_6d.length;i++){ +var p=_6d[i]; +tmp.html(p.panel("options").title); +var _6e=tmp.text(); +tmp.html(_6b); +_6b=tmp.text(); +if(_6e==_6b){ +tab=p; +if(_6c){ +_6d.splice(i,1); +} +break; +} +} +tmp.remove(); +} +return tab; +}; +function _4d(_6f,tab){ +var _70=$.data(_6f,"tabs").tabs; +for(var i=0;i<_70.length;i++){ +if(_70[i][0]==$(tab)[0]){ +return i; +} +} +return -1; +}; +function _26(_71){ +var _72=$.data(_71,"tabs").tabs; +for(var i=0;i<_72.length;i++){ +var tab=_72[i]; +if(tab.panel("options").tab.hasClass("tabs-selected")){ +return tab; +} +} +return null; +}; +function _73(_74){ +var _75=$.data(_74,"tabs"); +var _76=_75.tabs; +for(var i=0;i<_76.length;i++){ +var _77=_76[i].panel("options"); +if(_77.selected&&!_77.disabled){ +_53(_74,i); +return; +} +} +_53(_74,_75.options.selected); +}; +function _53(_78,_79){ +var p=_65(_78,_79); +if(p&&!p.is(":visible")){ +_7a(_78); +if(!p.panel("options").disabled){ +p.panel("open"); +} +} +}; +function _7b(_7c,_7d){ +var p=_65(_7c,_7d); +if(p&&p.is(":visible")){ +_7a(_7c); +p.panel("close"); +} +}; +function _7a(_7e){ +$(_7e).children("div.tabs-panels").each(function(){ +$(this).stop(true,true); +}); +}; +function _64(_7f,_80){ +return _65(_7f,_80)!=null; +}; +function _81(_82,_83){ +var _84=$.data(_82,"tabs").options; +_84.showHeader=_83; +$(_82).tabs("resize"); +}; +function _85(_86,_87){ +var _88=$(_86).find(">.tabs-header>.tabs-tool"); +if(_87){ +_88.removeClass("tabs-tool-hidden").show(); +}else{ +_88.addClass("tabs-tool-hidden").hide(); +} +$(_86).tabs("resize").tabs("scrollBy",0); +}; +$.fn.tabs=function(_89,_8a){ +if(typeof _89=="string"){ +return $.fn.tabs.methods[_89](this,_8a); +} +_89=_89||{}; +return this.each(function(){ +var _8b=$.data(this,"tabs"); +if(_8b){ +$.extend(_8b.options,_89); +}else{ +$.data(this,"tabs",{options:$.extend({},$.fn.tabs.defaults,$.fn.tabs.parseOptions(this),_89),tabs:[],selectHis:[]}); +_2a(this); +} +_f(this); +_38(this); +_15(this); +_30(this); +_73(this); +}); +}; +$.fn.tabs.methods={options:function(jq){ +var cc=jq[0]; +var _8c=$.data(cc,"tabs").options; +var s=_26(cc); +_8c.selected=s?_4d(cc,s):-1; +return _8c; +},tabs:function(jq){ +return $.data(jq[0],"tabs").tabs; +},resize:function(jq,_8d){ +return jq.each(function(){ +_15(this,_8d); +_23(this); +}); +},add:function(jq,_8e){ +return jq.each(function(){ +_4e(this,_8e); +}); +},close:function(jq,_8f){ +return jq.each(function(){ +_5d(this,_8f); +}); +},getTab:function(jq,_90){ +return _65(jq[0],_90); +},getTabIndex:function(jq,tab){ +return _4d(jq[0],tab); +},getSelected:function(jq){ +return _26(jq[0]); +},select:function(jq,_91){ +return jq.each(function(){ +_53(this,_91); +}); +},unselect:function(jq,_92){ +return jq.each(function(){ +_7b(this,_92); +}); +},exists:function(jq,_93){ +return _64(jq[0],_93); +},update:function(jq,_94){ +return jq.each(function(){ +_54(this,_94); +}); +},enableTab:function(jq,_95){ +return jq.each(function(){ +var _96=$(this).tabs("getTab",_95).panel("options"); +_96.tab.removeClass("tabs-disabled"); +_96.disabled=false; +}); +},disableTab:function(jq,_97){ +return jq.each(function(){ +var _98=$(this).tabs("getTab",_97).panel("options"); +_98.tab.addClass("tabs-disabled"); +_98.disabled=true; +}); +},showHeader:function(jq){ +return jq.each(function(){ +_81(this,true); +}); +},hideHeader:function(jq){ +return jq.each(function(){ +_81(this,false); +}); +},showTool:function(jq){ +return jq.each(function(){ +_85(this,true); +}); +},hideTool:function(jq){ +return jq.each(function(){ +_85(this,false); +}); +},scrollBy:function(jq,_99){ +return jq.each(function(){ +var _9a=$(this).tabs("options"); +var _9b=$(this).find(">div.tabs-header>div.tabs-wrap"); +var pos=Math.min(_9b._scrollLeft()+_99,_9c()); +_9b.animate({scrollLeft:pos},_9a.scrollDuration); +function _9c(){ +var w=0; +var ul=_9b.children("ul"); +ul.children("li").each(function(){ +w+=$(this).outerWidth(true); +}); +return w-_9b.width()+(ul.outerWidth()-ul.width()); +}; +}); +}}; +$.fn.tabs.parseOptions=function(_9d){ +return $.extend({},$.parser.parseOptions(_9d,["tools","toolPosition","tabPosition",{fit:"boolean",border:"boolean",plain:"boolean"},{headerWidth:"number",tabWidth:"number",tabHeight:"number",selected:"number"},{showHeader:"boolean",justified:"boolean",narrow:"boolean",pill:"boolean"}])); +}; +$.fn.tabs.defaults={width:"auto",height:"auto",headerWidth:150,tabWidth:"auto",tabHeight:32,selected:0,showHeader:true,plain:false,fit:false,border:true,justified:false,narrow:false,pill:false,tools:null,toolPosition:"right",tabPosition:"top",scrollIncrement:100,scrollDuration:400,onLoad:function(_9e){ +},onSelect:function(_9f,_a0){ +},onUnselect:function(_a1,_a2){ +},onBeforeClose:function(_a3,_a4){ +},onClose:function(_a5,_a6){ +},onAdd:function(_a7,_a8){ +},onUpdate:function(_a9,_aa){ +},onContextMenu:function(e,_ab,_ac){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tagbox.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tagbox.js new file mode 100644 index 000000000..d08e02fe6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tagbox.js @@ -0,0 +1,223 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"tagbox"); +var _4=_3.options; +$(_2).addClass("tagbox-f").combobox($.extend({},_4,{cls:"tagbox",reversed:true,onChange:function(_5,_6){ +_7(); +$(this).combobox("hidePanel"); +_4.onChange.call(_2,_5,_6); +},onResizing:function(_8,_9){ +var _a=$(this).combobox("textbox"); +var tb=$(this).data("textbox").textbox; +var _b=tb.outerWidth(); +tb.css({height:"",paddingLeft:_a.css("marginLeft"),paddingRight:_a.css("marginRight")}); +_a.css("margin",0); +tb._outerWidth(_b); +_23(_2); +_12(this); +_4.onResizing.call(_2,_8,_9); +},onLoadSuccess:function(_c){ +_7(); +_4.onLoadSuccess.call(_2,_c); +}})); +_7(); +_23(_2); +function _7(){ +$(_2).next().find(".tagbox-label").remove(); +var _d=$(_2).tagbox("textbox"); +var ss=[]; +$.map($(_2).tagbox("getValues"),function(_e,_f){ +var row=_4.finder.getRow(_2,_e); +var _10=_4.tagFormatter.call(_2,_e,row); +var cs={}; +var css=_4.tagStyler.call(_2,_e,row)||""; +if(typeof css=="string"){ +cs={s:css}; +}else{ +cs={c:css["class"]||"",s:css["style"]||""}; +} +var _11=$("").insertBefore(_d).html(_10); +_11.attr("tagbox-index",_f); +_11.attr("style",cs.s).addClass(cs.c); +$("").appendTo(_11); +}); +_12(_2); +$(_2).combobox("setText",""); +}; +}; +function _12(_13,_14){ +var _15=$(_13).next(); +var _16=_14?$(_14):_15.find(".tagbox-label"); +if(_16.length){ +var _17=$(_13).tagbox("textbox"); +var _18=$(_16[0]); +var _19=_18.outerHeight(true)-_18.outerHeight(); +var _1a=_17.outerHeight()-_19*2; +_16.css({height:_1a+"px",lineHeight:_1a+"px"}); +var _1b=_15.find(".textbox-addon").css("height","100%"); +_1b.find(".textbox-icon").css("height","100%"); +_15.find(".textbox-button").linkbutton("resize",{height:"100%"}); +} +}; +function _1c(_1d){ +var _1e=$(_1d).next(); +_1e.unbind(".tagbox").bind("click.tagbox",function(e){ +var _1f=$(_1d).tagbox("options"); +if(_1f.disabled||_1f.readonly){ +return; +} +if($(e.target).hasClass("tagbox-remove")){ +var _20=parseInt($(e.target).parent().attr("tagbox-index")); +var _21=$(_1d).tagbox("getValues"); +if(_1f.onBeforeRemoveTag.call(_1d,_21[_20])==false){ +return; +} +_1f.onRemoveTag.call(_1d,_21[_20]); +_21.splice(_20,1); +$(_1d).tagbox("setValues",_21); +}else{ +var _22=$(e.target).closest(".tagbox-label"); +if(_22.length){ +var _20=parseInt(_22.attr("tagbox-index")); +var _21=$(_1d).tagbox("getValues"); +_1f.onClickTag.call(_1d,_21[_20]); +} +} +$(this).find(".textbox-text").focus(); +}).bind("keyup.tagbox",function(e){ +_23(_1d); +}).bind("mouseover.tagbox",function(e){ +if($(e.target).closest(".textbox-button,.textbox-addon,.tagbox-label").length){ +$(this).triggerHandler("mouseleave"); +}else{ +$(this).find(".textbox-text").triggerHandler("mouseenter"); +} +}).bind("mouseleave.tagbox",function(e){ +$(this).find(".textbox-text").triggerHandler("mouseleave"); +}); +}; +function _23(_24){ +var _25=$(_24).tagbox("options"); +var _26=$(_24).tagbox("textbox"); +var _27=$(_24).next(); +var tmp=$("").appendTo("body"); +tmp.attr("style",_26.attr("style")); +tmp.css({position:"absolute",top:-9999,left:-9999,width:"auto",fontFamily:_26.css("fontFamily"),fontSize:_26.css("fontSize"),fontWeight:_26.css("fontWeight"),whiteSpace:"nowrap"}); +var _28=_29(_26.val()); +var _2a=_29(_25.prompt||""); +tmp.remove(); +var _2b=Math.min(Math.max(_28,_2a)+20,_27.width()); +_26._outerWidth(_2b); +_27.find(".textbox-button").linkbutton("resize",{height:"100%"}); +function _29(val){ +var s=val.replace(/&/g,"&").replace(/\s/g," ").replace(//g,">"); +tmp.html(s); +return tmp.outerWidth(); +}; +}; +function _2c(_2d){ +var t=$(_2d); +var _2e=t.tagbox("options"); +if(_2e.limitToList){ +var _2f=t.tagbox("panel"); +var _30=_2f.children("div.combobox-item-hover"); +if(_30.length){ +_30.removeClass("combobox-item-hover"); +var row=_2e.finder.getRow(_2d,_30); +var _31=row[_2e.valueField]; +$(_2d).tagbox(_30.hasClass("combobox-item-selected")?"unselect":"select",_31); +} +$(_2d).tagbox("hidePanel"); +}else{ +var v=$.trim($(_2d).tagbox("getText")); +if(v!==""){ +var _32=$(_2d).tagbox("getValues"); +_32.push(v); +$(_2d).tagbox("setValues",_32); +} +} +}; +function _33(_34,_35){ +$(_34).combobox("setText",""); +_23(_34); +$(_34).combobox("setValues",_35); +$(_34).combobox("setText",""); +$(_34).tagbox("validate"); +}; +$.fn.tagbox=function(_36,_37){ +if(typeof _36=="string"){ +var _38=$.fn.tagbox.methods[_36]; +if(_38){ +return _38(this,_37); +}else{ +return this.combobox(_36,_37); +} +} +_36=_36||{}; +return this.each(function(){ +var _39=$.data(this,"tagbox"); +if(_39){ +$.extend(_39.options,_36); +}else{ +$.data(this,"tagbox",{options:$.extend({},$.fn.tagbox.defaults,$.fn.tagbox.parseOptions(this),_36)}); +} +_1(this); +_1c(this); +}); +}; +$.fn.tagbox.methods={options:function(jq){ +var _3a=jq.combobox("options"); +return $.extend($.data(jq[0],"tagbox").options,{width:_3a.width,height:_3a.height,originalValue:_3a.originalValue,disabled:_3a.disabled,readonly:_3a.readonly}); +},setValues:function(jq,_3b){ +return jq.each(function(){ +_33(this,_3b); +}); +},reset:function(jq){ +return jq.each(function(){ +$(this).combobox("reset").combobox("setText",""); +}); +}}; +$.fn.tagbox.parseOptions=function(_3c){ +return $.extend({},$.fn.combobox.parseOptions(_3c),$.parser.parseOptions(_3c,[])); +}; +$.fn.tagbox.defaults=$.extend({},$.fn.combobox.defaults,{hasDownArrow:false,multiple:true,reversed:true,selectOnNavigation:false,tipOptions:$.extend({},$.fn.textbox.defaults.tipOptions,{showDelay:200}),val:function(_3d){ +var vv=$(_3d).parent().prev().tagbox("getValues"); +if($(_3d).is(":focus")){ +vv.push($(_3d).val()); +} +return vv.join(","); +},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ +var _3e=e.data.target; +var _3f=$(_3e).tagbox("options"); +if(_3f.limitToList){ +_2c(_3e); +} +}}),keyHandler:$.extend({},$.fn.combobox.defaults.keyHandler,{enter:function(e){ +_2c(this); +},query:function(q,e){ +var _40=$(this).tagbox("options"); +if(_40.limitToList){ +$.fn.combobox.defaults.keyHandler.query.call(this,q,e); +}else{ +$(this).combobox("hidePanel"); +} +}}),tagFormatter:function(_41,row){ +var _42=$(this).tagbox("options"); +return row?row[_42.textField]:_41; +},tagStyler:function(_43,row){ +return ""; +},onClickTag:function(_44){ +},onBeforeRemoveTag:function(_45){ +},onRemoveTag:function(_46){ +}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.textbox.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.textbox.js new file mode 100644 index 000000000..c3a57164d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.textbox.js @@ -0,0 +1,566 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +var _1=0; +function _2(_3){ +$(_3).addClass("textbox-f").hide(); +var _4=$(""+""+""+"").insertAfter(_3); +var _5=$(_3).attr("name"); +if(_5){ +_4.find("input.textbox-value").attr("name",_5); +$(_3).removeAttr("name").attr("textboxName",_5); +} +return _4; +}; +function _6(_7){ +var _8=$.data(_7,"textbox"); +var _9=_8.options; +var tb=_8.textbox; +var _a="_easyui_textbox_input"+(++_1); +tb.addClass(_9.cls); +tb.find(".textbox-text").remove(); +if(_9.multiline){ +$("").prependTo(tb); +}else{ +$("").prependTo(tb); +} +$("#"+_a).attr("tabindex",$(_7).attr("tabindex")||"").css("text-align",_7.style.textAlign||""); +tb.find(".textbox-addon").remove(); +var bb=_9.icons?$.extend(true,[],_9.icons):[]; +if(_9.iconCls){ +bb.push({iconCls:_9.iconCls,disabled:true}); +} +if(bb.length){ +var bc=$("").prependTo(tb); +bc.addClass("textbox-addon-"+_9.iconAlign); +for(var i=0;i"); +} +} +tb.find(".textbox-button").remove(); +if(_9.buttonText||_9.buttonIcon){ +var _b=$("").prependTo(tb); +_b.addClass("textbox-button-"+_9.buttonAlign).linkbutton({text:_9.buttonText,iconCls:_9.buttonIcon,onClick:function(){ +var t=$(this).parent().prev(); +t.textbox("options").onClickButton.call(t[0]); +}}); +} +if(_9.label){ +if(typeof _9.label=="object"){ +_8.label=$(_9.label); +_8.label.attr("for",_a); +}else{ +$(_8.label).remove(); +_8.label=$("").html(_9.label); +_8.label.css("textAlign",_9.labelAlign).attr("for",_a); +if(_9.labelPosition=="after"){ +_8.label.insertAfter(tb); +}else{ +_8.label.insertBefore(_7); +} +_8.label.removeClass("textbox-label-left textbox-label-right textbox-label-top"); +_8.label.addClass("textbox-label-"+_9.labelPosition); +} +}else{ +$(_8.label).remove(); +} +_c(_7); +_d(_7,_9.disabled); +_e(_7,_9.readonly); +}; +function _f(_10){ +var _11=$.data(_10,"textbox"); +var tb=_11.textbox; +tb.find(".textbox-text").validatebox("destroy"); +tb.remove(); +$(_11.label).remove(); +$(_10).remove(); +}; +function _12(_13,_14){ +var _15=$.data(_13,"textbox"); +var _16=_15.options; +var tb=_15.textbox; +var _17=tb.parent(); +if(_14){ +if(typeof _14=="object"){ +$.extend(_16,_14); +}else{ +_16.width=_14; +} +} +if(isNaN(parseInt(_16.width))){ +var c=$(_13).clone(); +c.css("visibility","hidden"); +c.insertAfter(_13); +_16.width=c.outerWidth(); +c.remove(); +} +var _18=tb.is(":visible"); +if(!_18){ +tb.appendTo("body"); +} +var _19=tb.find(".textbox-text"); +var btn=tb.find(".textbox-button"); +var _1a=tb.find(".textbox-addon"); +var _1b=_1a.find(".textbox-icon"); +if(_16.height=="auto"){ +_19.css({margin:"",paddingTop:"",paddingBottom:"",height:"",lineHeight:""}); +} +tb._size(_16,_17); +if(_16.label&&_16.labelPosition){ +if(_16.labelPosition=="top"){ +_15.label._size({width:_16.labelWidth=="auto"?tb.outerWidth():_16.labelWidth},tb); +if(_16.height!="auto"){ +tb._size("height",tb.outerHeight()-_15.label.outerHeight()); +} +}else{ +_15.label._size({width:_16.labelWidth,height:tb.outerHeight()},tb); +if(!_16.multiline){ +_15.label.css("lineHeight",_15.label.height()+"px"); +} +tb._size("width",tb.outerWidth()-_15.label.outerWidth()); +} +} +if(_16.buttonAlign=="left"||_16.buttonAlign=="right"){ +btn.linkbutton("resize",{height:tb.height()}); +}else{ +btn.linkbutton("resize",{width:"100%"}); +} +var _1c=tb.width()-_1b.length*_16.iconWidth-_1d("left")-_1d("right"); +var _1e=_16.height=="auto"?_19.outerHeight():(tb.height()-_1d("top")-_1d("bottom")); +_1a.css(_16.iconAlign,_1d(_16.iconAlign)+"px"); +_1a.css("top",_1d("top")+"px"); +_1b.css({width:_16.iconWidth+"px",height:_1e+"px"}); +_19.css({paddingLeft:(_13.style.paddingLeft||""),paddingRight:(_13.style.paddingRight||""),marginLeft:_1f("left"),marginRight:_1f("right"),marginTop:_1d("top"),marginBottom:_1d("bottom")}); +if(_16.multiline){ +_19.css({paddingTop:(_13.style.paddingTop||""),paddingBottom:(_13.style.paddingBottom||"")}); +_19._outerHeight(_1e); +}else{ +_19.css({paddingTop:0,paddingBottom:0,height:_1e+"px",lineHeight:_1e+"px"}); +} +_19._outerWidth(_1c); +_16.onResizing.call(_13,_16.width,_16.height); +if(!_18){ +tb.insertAfter(_13); +} +_16.onResize.call(_13,_16.width,_16.height); +function _1f(_20){ +return (_16.iconAlign==_20?_1a._outerWidth():0)+_1d(_20); +}; +function _1d(_21){ +var w=0; +btn.filter(".textbox-button-"+_21).each(function(){ +if(_21=="left"||_21=="right"){ +w+=$(this).outerWidth(); +}else{ +w+=$(this).outerHeight(); +} +}); +return w; +}; +}; +function _c(_22){ +var _23=$(_22).textbox("options"); +var _24=$(_22).textbox("textbox"); +_24.validatebox($.extend({},_23,{deltaX:function(_25){ +return $(_22).textbox("getTipX",_25); +},deltaY:function(_26){ +return $(_22).textbox("getTipY",_26); +},onBeforeValidate:function(){ +_23.onBeforeValidate.call(_22); +var box=$(this); +if(!box.is(":focus")){ +if(box.val()!==_23.value){ +_23.oldInputValue=box.val(); +box.val(_23.value); +} +} +},onValidate:function(_27){ +var box=$(this); +if(_23.oldInputValue!=undefined){ +box.val(_23.oldInputValue); +_23.oldInputValue=undefined; +} +var tb=box.parent(); +if(_27){ +tb.removeClass("textbox-invalid"); +}else{ +tb.addClass("textbox-invalid"); +} +_23.onValidate.call(_22,_27); +}})); +}; +function _28(_29){ +var _2a=$.data(_29,"textbox"); +var _2b=_2a.options; +var tb=_2a.textbox; +var _2c=tb.find(".textbox-text"); +_2c.attr("placeholder",_2b.prompt); +_2c.unbind(".textbox"); +$(_2a.label).unbind(".textbox"); +if(!_2b.disabled&&!_2b.readonly){ +if(_2a.label){ +$(_2a.label).bind("click.textbox",function(e){ +if(!_2b.hasFocusMe){ +_2c.focus(); +$(_29).textbox("setSelectionRange",{start:0,end:_2c.val().length}); +} +}); +} +_2c.bind("blur.textbox",function(e){ +if(!tb.hasClass("textbox-focused")){ +return; +} +_2b.value=$(this).val(); +if(_2b.value==""){ +$(this).val(_2b.prompt).addClass("textbox-prompt"); +}else{ +$(this).removeClass("textbox-prompt"); +} +tb.removeClass("textbox-focused"); +tb.closest(".form-field").removeClass("form-field-focused"); +}).bind("focus.textbox",function(e){ +_2b.hasFocusMe=true; +if(tb.hasClass("textbox-focused")){ +return; +} +if($(this).val()!=_2b.value){ +$(this).val(_2b.value); +} +$(this).removeClass("textbox-prompt"); +tb.addClass("textbox-focused"); +tb.closest(".form-field").addClass("form-field-focused"); +}); +for(var _2d in _2b.inputEvents){ +_2c.bind(_2d+".textbox",{target:_29},_2b.inputEvents[_2d]); +} +} +var _2e=tb.find(".textbox-addon"); +_2e.unbind().bind("click",{target:_29},function(e){ +var _2f=$(e.target).closest("a.textbox-icon:not(.textbox-icon-disabled)"); +if(_2f.length){ +var _30=parseInt(_2f.attr("icon-index")); +var _31=_2b.icons[_30]; +if(_31&&_31.handler){ +_31.handler.call(_2f[0],e); +} +_2b.onClickIcon.call(_29,_30); +} +}); +_2e.find(".textbox-icon").each(function(_32){ +var _33=_2b.icons[_32]; +var _34=$(this); +if(!_33||_33.disabled||_2b.disabled||_2b.readonly){ +_34.addClass("textbox-icon-disabled"); +}else{ +_34.removeClass("textbox-icon-disabled"); +} +}); +var btn=tb.find(".textbox-button"); +btn.linkbutton((_2b.disabled||_2b.readonly)?"disable":"enable"); +tb.unbind(".textbox").bind("_resize.textbox",function(e,_35){ +if($(this).hasClass("easyui-fluid")||_35){ +_12(_29); +} +return false; +}); +}; +function _d(_36,_37){ +var _38=$.data(_36,"textbox"); +var _39=_38.options; +var tb=_38.textbox; +var _3a=tb.find(".textbox-text"); +var ss=$(_36).add(tb.find(".textbox-value")); +_39.disabled=_37; +if(_39.disabled){ +_3a.blur(); +_3a.validatebox("disable"); +tb.addClass("textbox-disabled"); +ss._propAttr("disabled",true); +$(_38.label).addClass("textbox-label-disabled"); +}else{ +_3a.validatebox("enable"); +tb.removeClass("textbox-disabled"); +ss._propAttr("disabled",false); +$(_38.label).removeClass("textbox-label-disabled"); +} +}; +function _e(_3b,_3c){ +var _3d=$.data(_3b,"textbox"); +var _3e=_3d.options; +var tb=_3d.textbox; +var _3f=tb.find(".textbox-text"); +_3e.readonly=_3c==undefined?true:_3c; +if(_3e.readonly){ +_3f.triggerHandler("blur.textbox"); +} +_3f.validatebox("readonly",_3e.readonly); +tb.removeClass("textbox-readonly").addClass(_3e.readonly?"textbox-readonly":""); +}; +$.fn.textbox=function(_40,_41){ +if(typeof _40=="string"){ +var _42=$.fn.textbox.methods[_40]; +if(_42){ +return _42(this,_41); +}else{ +return this.each(function(){ +var _43=$(this).textbox("textbox"); +_43.validatebox(_40,_41); +}); +} +} +_40=_40||{}; +return this.each(function(){ +var _44=$.data(this,"textbox"); +if(_44){ +$.extend(_44.options,_40); +if(_40.value!=undefined){ +_44.options.originalValue=_40.value; +} +}else{ +_44=$.data(this,"textbox",{options:$.extend({},$.fn.textbox.defaults,$.fn.textbox.parseOptions(this),_40),textbox:_2(this)}); +_44.options.originalValue=_44.options.value; +} +_6(this); +_28(this); +if(_44.options.doSize){ +_12(this); +} +var _45=_44.options.value; +_44.options.value=""; +$(this).textbox("initValue",_45); +}); +}; +$.fn.textbox.methods={options:function(jq){ +return $.data(jq[0],"textbox").options; +},cloneFrom:function(jq,_46){ +return jq.each(function(){ +var t=$(this); +if(t.data("textbox")){ +return; +} +if(!$(_46).data("textbox")){ +$(_46).textbox(); +} +var _47=$.extend(true,{},$(_46).textbox("options")); +var _48=t.attr("name")||""; +t.addClass("textbox-f").hide(); +t.removeAttr("name").attr("textboxName",_48); +var _49=$(_46).next().clone().insertAfter(t); +var _4a="_easyui_textbox_input"+(++_1); +_49.find(".textbox-value").attr("name",_48); +_49.find(".textbox-text").attr("id",_4a); +var _4b=$($(_46).textbox("label")).clone(); +if(_4b.length){ +_4b.attr("for",_4a); +if(_47.labelPosition=="after"){ +_4b.insertAfter(t.next()); +}else{ +_4b.insertBefore(t); +} +} +$.data(this,"textbox",{options:_47,textbox:_49,label:(_4b.length?_4b:undefined)}); +var _4c=$(_46).textbox("button"); +if(_4c.length){ +t.textbox("button").linkbutton($.extend(true,{},_4c.linkbutton("options"))); +} +_28(this); +_c(this); +}); +},textbox:function(jq){ +return $.data(jq[0],"textbox").textbox.find(".textbox-text"); +},button:function(jq){ +return $.data(jq[0],"textbox").textbox.find(".textbox-button"); +},label:function(jq){ +return $.data(jq[0],"textbox").label; +},destroy:function(jq){ +return jq.each(function(){ +_f(this); +}); +},resize:function(jq,_4d){ +return jq.each(function(){ +_12(this,_4d); +}); +},disable:function(jq){ +return jq.each(function(){ +_d(this,true); +_28(this); +}); +},enable:function(jq){ +return jq.each(function(){ +_d(this,false); +_28(this); +}); +},readonly:function(jq,_4e){ +return jq.each(function(){ +_e(this,_4e); +_28(this); +}); +},isValid:function(jq){ +return jq.textbox("textbox").validatebox("isValid"); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("setValue",""); +}); +},setText:function(jq,_4f){ +return jq.each(function(){ +var _50=$(this).textbox("options"); +var _51=$(this).textbox("textbox"); +_4f=_4f==undefined?"":String(_4f); +if($(this).textbox("getText")!=_4f){ +_51.val(_4f); +} +_50.value=_4f; +if(!_51.is(":focus")){ +if(_4f){ +_51.removeClass("textbox-prompt"); +}else{ +_51.val(_50.prompt).addClass("textbox-prompt"); +} +} +if(_50.value){ +$(this).closest(".form-field").removeClass("form-field-empty"); +}else{ +$(this).closest(".form-field").addClass("form-field-empty"); +} +$(this).textbox("validate"); +}); +},initValue:function(jq,_52){ +return jq.each(function(){ +var _53=$.data(this,"textbox"); +$(this).textbox("setText",_52); +_53.textbox.find(".textbox-value").val(_52); +$(this).val(_52); +}); +},setValue:function(jq,_54){ +return jq.each(function(){ +var _55=$.data(this,"textbox").options; +var _56=$(this).textbox("getValue"); +$(this).textbox("initValue",_54); +if(_56!=_54){ +_55.onChange.call(this,_54,_56); +$(this).closest("form").trigger("_change",[this]); +} +}); +},getText:function(jq){ +var _57=jq.textbox("textbox"); +if(_57.is(":focus")){ +return _57.val(); +}else{ +return jq.textbox("options").value; +} +},getValue:function(jq){ +return jq.data("textbox").textbox.find(".textbox-value").val(); +},reset:function(jq){ +return jq.each(function(){ +var _58=$(this).textbox("options"); +$(this).textbox("textbox").val(_58.originalValue); +$(this).textbox("setValue",_58.originalValue); +}); +},getIcon:function(jq,_59){ +return jq.data("textbox").textbox.find(".textbox-icon:eq("+_59+")"); +},getTipX:function(jq,_5a){ +var _5b=jq.data("textbox"); +var _5c=_5b.options; +var tb=_5b.textbox; +var _5d=tb.find(".textbox-text"); +var _5a=_5a||_5c.tipPosition; +var p1=tb.offset(); +var p2=_5d.offset(); +var w1=tb.outerWidth(); +var w2=_5d.outerWidth(); +if(_5a=="right"){ +return w1-w2-p2.left+p1.left; +}else{ +if(_5a=="left"){ +return p1.left-p2.left; +}else{ +return (w1-w2-p2.left+p1.left)/2-(p2.left-p1.left)/2; +} +} +},getTipY:function(jq,_5e){ +var _5f=jq.data("textbox"); +var _60=_5f.options; +var tb=_5f.textbox; +var _61=tb.find(".textbox-text"); +var _5e=_5e||_60.tipPosition; +var p1=tb.offset(); +var p2=_61.offset(); +var h1=tb.outerHeight(); +var h2=_61.outerHeight(); +if(_5e=="left"||_5e=="right"){ +return (h1-h2-p2.top+p1.top)/2-(p2.top-p1.top)/2; +}else{ +if(_5e=="bottom"){ +return (h1-h2-p2.top+p1.top); +}else{ +return (p1.top-p2.top); +} +} +},getSelectionStart:function(jq){ +return jq.textbox("getSelectionRange").start; +},getSelectionRange:function(jq){ +var _62=jq.textbox("textbox")[0]; +var _63=0; +var end=0; +if(typeof _62.selectionStart=="number"){ +_63=_62.selectionStart; +end=_62.selectionEnd; +}else{ +if(_62.createTextRange){ +var s=document.selection.createRange(); +var _64=_62.createTextRange(); +_64.setEndPoint("EndToStart",s); +_63=_64.text.length; +end=_63+s.text.length; +} +} +return {start:_63,end:end}; +},setSelectionRange:function(jq,_65){ +return jq.each(function(){ +var _66=$(this).textbox("textbox")[0]; +var _67=_65.start; +var end=_65.end; +if(_66.setSelectionRange){ +_66.setSelectionRange(_67,end); +}else{ +if(_66.createTextRange){ +var _68=_66.createTextRange(); +_68.collapse(); +_68.moveEnd("character",end); +_68.moveStart("character",_67); +_68.select(); +} +} +}); +}}; +$.fn.textbox.parseOptions=function(_69){ +var t=$(_69); +return $.extend({},$.fn.validatebox.parseOptions(_69),$.parser.parseOptions(_69,["prompt","iconCls","iconAlign","buttonText","buttonIcon","buttonAlign","label","labelPosition","labelAlign",{multiline:"boolean",iconWidth:"number",labelWidth:"number"}]),{value:(t.val()||undefined),type:(t.attr("type")?t.attr("type"):undefined)}); +}; +$.fn.textbox.defaults=$.extend({},$.fn.validatebox.defaults,{doSize:true,width:"auto",height:"auto",cls:null,prompt:"",value:"",type:"text",multiline:false,icons:[],iconCls:null,iconAlign:"right",iconWidth:26,buttonText:"",buttonIcon:null,buttonAlign:"right",label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",inputEvents:{blur:function(e){ +var t=$(e.data.target); +var _6a=t.textbox("options"); +if(t.textbox("getValue")!=_6a.value){ +t.textbox("setValue",_6a.value); +} +},keydown:function(e){ +if(e.keyCode==13){ +var t=$(e.data.target); +t.textbox("setValue",t.textbox("getText")); +} +}},onChange:function(_6b,_6c){ +},onResizing:function(_6d,_6e){ +},onResize:function(_6f,_70){ +},onClickButton:function(){ +},onClickIcon:function(_71){ +}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.timespinner.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.timespinner.js new file mode 100755 index 000000000..a956b446e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.timespinner.js @@ -0,0 +1,149 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"timespinner").options; +$(_2).addClass("timespinner-f").spinner(_3); +var _4=_3.formatter.call(_2,_3.parser.call(_2,_3.value)); +$(_2).timespinner("initValue",_4); +}; +function _5(e){ +var _6=e.data.target; +var _7=$.data(_6,"timespinner").options; +var _8=$(_6).timespinner("getSelectionStart"); +for(var i=0;i<_7.selections.length;i++){ +var _9=_7.selections[i]; +if(_8>=_9[0]&&_8<=_9[1]){ +_a(_6,i); +return; +} +} +}; +function _a(_b,_c){ +var _d=$.data(_b,"timespinner").options; +if(_c!=undefined){ +_d.highlight=_c; +} +var _e=_d.selections[_d.highlight]; +if(_e){ +var tb=$(_b).timespinner("textbox"); +$(_b).timespinner("setSelectionRange",{start:_e[0],end:_e[1]}); +tb.focus(); +} +}; +function _f(_10,_11){ +var _12=$.data(_10,"timespinner").options; +var _11=_12.parser.call(_10,_11); +var _13=_12.formatter.call(_10,_11); +$(_10).spinner("setValue",_13); +}; +function _14(_15,_16){ +var _17=$.data(_15,"timespinner").options; +var s=$(_15).timespinner("getValue"); +var _18=_17.selections[_17.highlight]; +var s1=s.substring(0,_18[0]); +var s2=s.substring(_18[0],_18[1]); +var s3=s.substring(_18[1]); +var v=s1+((parseInt(s2,10)||0)+_17.increment*(_16?-1:1))+s3; +$(_15).timespinner("setValue",v); +_a(_15); +}; +$.fn.timespinner=function(_19,_1a){ +if(typeof _19=="string"){ +var _1b=$.fn.timespinner.methods[_19]; +if(_1b){ +return _1b(this,_1a); +}else{ +return this.spinner(_19,_1a); +} +} +_19=_19||{}; +return this.each(function(){ +var _1c=$.data(this,"timespinner"); +if(_1c){ +$.extend(_1c.options,_19); +}else{ +$.data(this,"timespinner",{options:$.extend({},$.fn.timespinner.defaults,$.fn.timespinner.parseOptions(this),_19)}); +} +_1(this); +}); +}; +$.fn.timespinner.methods={options:function(jq){ +var _1d=jq.data("spinner")?jq.spinner("options"):{}; +return $.extend($.data(jq[0],"timespinner").options,{width:_1d.width,value:_1d.value,originalValue:_1d.originalValue,disabled:_1d.disabled,readonly:_1d.readonly}); +},setValue:function(jq,_1e){ +return jq.each(function(){ +_f(this,_1e); +}); +},getHours:function(jq){ +var _1f=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(_1f.separator); +return parseInt(vv[0],10); +},getMinutes:function(jq){ +var _20=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(_20.separator); +return parseInt(vv[1],10); +},getSeconds:function(jq){ +var _21=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(_21.separator); +return parseInt(vv[2],10)||0; +}}; +$.fn.timespinner.parseOptions=function(_22){ +return $.extend({},$.fn.spinner.parseOptions(_22),$.parser.parseOptions(_22,["separator",{showSeconds:"boolean",highlight:"number"}])); +}; +$.fn.timespinner.defaults=$.extend({},$.fn.spinner.defaults,{inputEvents:$.extend({},$.fn.spinner.defaults.inputEvents,{click:function(e){ +_5.call(this,e); +},blur:function(e){ +var t=$(e.data.target); +t.timespinner("setValue",t.timespinner("getText")); +},keydown:function(e){ +if(e.keyCode==13){ +var t=$(e.data.target); +t.timespinner("setValue",t.timespinner("getText")); +} +}}),formatter:function(_23){ +if(!_23){ +return ""; +} +var _24=$(this).timespinner("options"); +var tt=[_25(_23.getHours()),_25(_23.getMinutes())]; +if(_24.showSeconds){ +tt.push(_25(_23.getSeconds())); +} +return tt.join(_24.separator); +function _25(_26){ +return (_26<10?"0":"")+_26; +}; +},parser:function(s){ +var _27=$(this).timespinner("options"); +var _28=_29(s); +if(_28){ +var min=_29(_27.min); +var max=_29(_27.max); +if(min&&min>_28){ +_28=min; +} +if(max&&max<_28){ +_28=max; +} +} +return _28; +function _29(s){ +if(!s){ +return null; +} +var tt=s.split(_27.separator); +return new Date(1900,0,0,parseInt(tt[0],10)||0,parseInt(tt[1],10)||0,parseInt(tt[2],10)||0); +}; +},selections:[[0,2],[3,5],[6,8]],separator:":",showSeconds:false,highlight:0,spin:function(_2a){ +_14(this,_2a); +}}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tooltip.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tooltip.js new file mode 100755 index 000000000..c15686578 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tooltip.js @@ -0,0 +1,238 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +$(_2).addClass("tooltip-f"); +}; +function _3(_4){ +var _5=$.data(_4,"tooltip").options; +$(_4).unbind(".tooltip").bind(_5.showEvent+".tooltip",function(e){ +$(_4).tooltip("show",e); +}).bind(_5.hideEvent+".tooltip",function(e){ +$(_4).tooltip("hide",e); +}).bind("mousemove.tooltip",function(e){ +if(_5.trackMouse){ +_5.trackMouseX=e.pageX; +_5.trackMouseY=e.pageY; +$(_4).tooltip("reposition"); +} +}); +}; +function _6(_7){ +var _8=$.data(_7,"tooltip"); +if(_8.showTimer){ +clearTimeout(_8.showTimer); +_8.showTimer=null; +} +if(_8.hideTimer){ +clearTimeout(_8.hideTimer); +_8.hideTimer=null; +} +}; +function _9(_a){ +var _b=$.data(_a,"tooltip"); +if(!_b||!_b.tip){ +return; +} +var _c=_b.options; +var _d=_b.tip; +var _e={left:-100000,top:-100000}; +if($(_a).is(":visible")){ +_e=_f(_c.position); +if(_c.position=="top"&&_e.top<0){ +_e=_f("bottom"); +}else{ +if((_c.position=="bottom")&&(_e.top+_d._outerHeight()>$(window)._outerHeight()+$(document).scrollTop())){ +_e=_f("top"); +} +} +if(_e.left<0){ +if(_c.position=="left"){ +_e=_f("right"); +}else{ +$(_a).tooltip("arrow").css("left",_d._outerWidth()/2+_e.left); +_e.left=0; +} +}else{ +if(_e.left+_d._outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ +if(_c.position=="right"){ +_e=_f("left"); +}else{ +var _10=_e.left; +_e.left=$(window)._outerWidth()+$(document)._scrollLeft()-_d._outerWidth(); +$(_a).tooltip("arrow").css("left",_d._outerWidth()/2-(_e.left-_10)); +} +} +} +} +_d.css({left:_e.left,top:_e.top,zIndex:(_c.zIndex!=undefined?_c.zIndex:($.fn.window?$.fn.window.defaults.zIndex++:""))}); +_c.onPosition.call(_a,_e.left,_e.top); +function _f(_11){ +_c.position=_11||"bottom"; +_d.removeClass("tooltip-top tooltip-bottom tooltip-left tooltip-right").addClass("tooltip-"+_c.position); +var _12,top; +var _13=$.isFunction(_c.deltaX)?_c.deltaX.call(_a,_c.position):_c.deltaX; +var _14=$.isFunction(_c.deltaY)?_c.deltaY.call(_a,_c.position):_c.deltaY; +if(_c.trackMouse){ +t=$(); +_12=_c.trackMouseX+_13; +top=_c.trackMouseY+_14; +}else{ +var t=$(_a); +_12=t.offset().left+_13; +top=t.offset().top+_14; +} +switch(_c.position){ +case "right": +_12+=t._outerWidth()+12+(_c.trackMouse?12:0); +if(_c.valign=="middle"){ +top-=(_d._outerHeight()-t._outerHeight())/2; +} +break; +case "left": +_12-=_d._outerWidth()+12+(_c.trackMouse?12:0); +if(_c.valign=="middle"){ +top-=(_d._outerHeight()-t._outerHeight())/2; +} +break; +case "top": +_12-=(_d._outerWidth()-t._outerWidth())/2; +top-=_d._outerHeight()+12+(_c.trackMouse?12:0); +break; +case "bottom": +_12-=(_d._outerWidth()-t._outerWidth())/2; +top+=t._outerHeight()+12+(_c.trackMouse?12:0); +break; +} +return {left:_12,top:top}; +}; +}; +function _15(_16,e){ +var _17=$.data(_16,"tooltip"); +var _18=_17.options; +var tip=_17.tip; +if(!tip){ +tip=$("
                                                  "+"
                                                  "+"
                                                  "+"
                                                  "+"
                                                  ").appendTo("body"); +_17.tip=tip; +_19(_16); +} +_6(_16); +_17.showTimer=setTimeout(function(){ +$(_16).tooltip("reposition"); +tip.show(); +_18.onShow.call(_16,e); +var _1a=tip.children(".tooltip-arrow-outer"); +var _1b=tip.children(".tooltip-arrow"); +var bc="border-"+_18.position+"-color"; +_1a.add(_1b).css({borderTopColor:"",borderBottomColor:"",borderLeftColor:"",borderRightColor:""}); +_1a.css(bc,tip.css(bc)); +_1b.css(bc,tip.css("backgroundColor")); +},_18.showDelay); +}; +function _1c(_1d,e){ +var _1e=$.data(_1d,"tooltip"); +if(_1e&&_1e.tip){ +_6(_1d); +_1e.hideTimer=setTimeout(function(){ +_1e.tip.hide(); +_1e.options.onHide.call(_1d,e); +},_1e.options.hideDelay); +} +}; +function _19(_1f,_20){ +var _21=$.data(_1f,"tooltip"); +var _22=_21.options; +if(_20){ +_22.content=_20; +} +if(!_21.tip){ +return; +} +var cc=typeof _22.content=="function"?_22.content.call(_1f):_22.content; +_21.tip.children(".tooltip-content").html(cc); +_22.onUpdate.call(_1f,cc); +}; +function _23(_24){ +var _25=$.data(_24,"tooltip"); +if(_25){ +_6(_24); +var _26=_25.options; +if(_25.tip){ +_25.tip.remove(); +} +if(_26._title){ +$(_24).attr("title",_26._title); +} +$.removeData(_24,"tooltip"); +$(_24).unbind(".tooltip").removeClass("tooltip-f"); +_26.onDestroy.call(_24); +} +}; +$.fn.tooltip=function(_27,_28){ +if(typeof _27=="string"){ +return $.fn.tooltip.methods[_27](this,_28); +} +_27=_27||{}; +return this.each(function(){ +var _29=$.data(this,"tooltip"); +if(_29){ +$.extend(_29.options,_27); +}else{ +$.data(this,"tooltip",{options:$.extend({},$.fn.tooltip.defaults,$.fn.tooltip.parseOptions(this),_27)}); +_1(this); +} +_3(this); +_19(this); +}); +}; +$.fn.tooltip.methods={options:function(jq){ +return $.data(jq[0],"tooltip").options; +},tip:function(jq){ +return $.data(jq[0],"tooltip").tip; +},arrow:function(jq){ +return jq.tooltip("tip").children(".tooltip-arrow-outer,.tooltip-arrow"); +},show:function(jq,e){ +return jq.each(function(){ +_15(this,e); +}); +},hide:function(jq,e){ +return jq.each(function(){ +_1c(this,e); +}); +},update:function(jq,_2a){ +return jq.each(function(){ +_19(this,_2a); +}); +},reposition:function(jq){ +return jq.each(function(){ +_9(this); +}); +},destroy:function(jq){ +return jq.each(function(){ +_23(this); +}); +}}; +$.fn.tooltip.parseOptions=function(_2b){ +var t=$(_2b); +var _2c=$.extend({},$.parser.parseOptions(_2b,["position","showEvent","hideEvent","content",{trackMouse:"boolean",deltaX:"number",deltaY:"number",showDelay:"number",hideDelay:"number"}]),{_title:t.attr("title")}); +t.attr("title",""); +if(!_2c.content){ +_2c.content=_2c._title; +} +return _2c; +}; +$.fn.tooltip.defaults={position:"bottom",valign:"middle",content:null,trackMouse:false,deltaX:0,deltaY:0,showEvent:"mouseenter",hideEvent:"mouseleave",showDelay:200,hideDelay:100,onShow:function(e){ +},onHide:function(e){ +},onUpdate:function(_2d){ +},onPosition:function(_2e,top){ +},onDestroy:function(){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tree.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tree.js new file mode 100755 index 000000000..e6fcf1d26 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.tree.js @@ -0,0 +1,1247 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$(_2); +_3.addClass("tree"); +return _3; +}; +function _4(_5){ +var _6=$.data(_5,"tree").options; +$(_5).unbind().bind("mouseover",function(e){ +var tt=$(e.target); +var _7=tt.closest("div.tree-node"); +if(!_7.length){ +return; +} +_7.addClass("tree-node-hover"); +if(tt.hasClass("tree-hit")){ +if(tt.hasClass("tree-expanded")){ +tt.addClass("tree-expanded-hover"); +}else{ +tt.addClass("tree-collapsed-hover"); +} +} +e.stopPropagation(); +}).bind("mouseout",function(e){ +var tt=$(e.target); +var _8=tt.closest("div.tree-node"); +if(!_8.length){ +return; +} +_8.removeClass("tree-node-hover"); +if(tt.hasClass("tree-hit")){ +if(tt.hasClass("tree-expanded")){ +tt.removeClass("tree-expanded-hover"); +}else{ +tt.removeClass("tree-collapsed-hover"); +} +} +e.stopPropagation(); +}).bind("click",function(e){ +var tt=$(e.target); +var _9=tt.closest("div.tree-node"); +if(!_9.length){ +return; +} +if(tt.hasClass("tree-hit")){ +_85(_5,_9[0]); +return false; +}else{ +if(tt.hasClass("tree-checkbox")){ +_34(_5,_9[0]); +return false; +}else{ +_d9(_5,_9[0]); +_6.onClick.call(_5,_c(_5,_9[0])); +} +} +e.stopPropagation(); +}).bind("dblclick",function(e){ +var _a=$(e.target).closest("div.tree-node"); +if(!_a.length){ +return; +} +_d9(_5,_a[0]); +_6.onDblClick.call(_5,_c(_5,_a[0])); +e.stopPropagation(); +}).bind("contextmenu",function(e){ +var _b=$(e.target).closest("div.tree-node"); +if(!_b.length){ +return; +} +_6.onContextMenu.call(_5,e,_c(_5,_b[0])); +e.stopPropagation(); +}); +}; +function _d(_e){ +var _f=$.data(_e,"tree").options; +_f.dnd=false; +var _10=$(_e).find("div.tree-node"); +_10.draggable("disable"); +_10.css("cursor","pointer"); +}; +function _11(_12){ +var _13=$.data(_12,"tree"); +var _14=_13.options; +var _15=_13.tree; +_13.disabledNodes=[]; +_14.dnd=true; +_15.find("div.tree-node").draggable({disabled:false,revert:true,cursor:"pointer",proxy:function(_16){ +var p=$("
                                                  ").appendTo("body"); +p.html(" "+$(_16).find(".tree-title").html()); +p.hide(); +return p; +},deltaX:15,deltaY:15,onBeforeDrag:function(e){ +if(_14.onBeforeDrag.call(_12,_c(_12,this))==false){ +return false; +} +if($(e.target).hasClass("tree-hit")||$(e.target).hasClass("tree-checkbox")){ +return false; +} +if(e.which!=1){ +return false; +} +var _17=$(this).find("span.tree-indent"); +if(_17.length){ +e.data.offsetWidth-=_17.length*_17.width(); +} +},onStartDrag:function(e){ +$(this).next("ul").find("div.tree-node").each(function(){ +$(this).droppable("disable"); +_13.disabledNodes.push(this); +}); +$(this).draggable("proxy").css({left:-10000,top:-10000}); +_14.onStartDrag.call(_12,_c(_12,this)); +var _18=_c(_12,this); +if(_18.id==undefined){ +_18.id="easyui_tree_node_id_temp"; +_60(_12,_18); +} +_13.draggingNodeId=_18.id; +},onDrag:function(e){ +var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY; +var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); +if(d>3){ +$(this).draggable("proxy").show(); +} +this.pageY=e.pageY; +},onStopDrag:function(){ +for(var i=0;i<_13.disabledNodes.length;i++){ +$(_13.disabledNodes[i]).droppable("enable"); +} +_13.disabledNodes=[]; +var _19=_d0(_12,_13.draggingNodeId); +if(_19&&_19.id=="easyui_tree_node_id_temp"){ +_19.id=""; +_60(_12,_19); +} +_14.onStopDrag.call(_12,_19); +}}).droppable({accept:"div.tree-node",onDragEnter:function(e,_1a){ +if(_14.onDragEnter.call(_12,this,_1b(_1a))==false){ +_1c(_1a,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +$(this).droppable("disable"); +_13.disabledNodes.push(this); +} +},onDragOver:function(e,_1d){ +if($(this).droppable("options").disabled){ +return; +} +var _1e=_1d.pageY; +var top=$(this).offset().top; +var _1f=top+$(this).outerHeight(); +_1c(_1d,true); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +if(_1e>top+(_1f-top)/2){ +if(_1f-_1e<5){ +$(this).addClass("tree-node-bottom"); +}else{ +$(this).addClass("tree-node-append"); +} +}else{ +if(_1e-top<5){ +$(this).addClass("tree-node-top"); +}else{ +$(this).addClass("tree-node-append"); +} +} +if(_14.onDragOver.call(_12,this,_1b(_1d))==false){ +_1c(_1d,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +$(this).droppable("disable"); +_13.disabledNodes.push(this); +} +},onDragLeave:function(e,_20){ +_1c(_20,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +_14.onDragLeave.call(_12,this,_1b(_20)); +},onDrop:function(e,_21){ +var _22=this; +var _23,_24; +if($(this).hasClass("tree-node-append")){ +_23=_25; +_24="append"; +}else{ +_23=_26; +_24=$(this).hasClass("tree-node-top")?"top":"bottom"; +} +if(_14.onBeforeDrop.call(_12,_22,_1b(_21),_24)==false){ +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +return; +} +_23(_21,_22,_24); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +}}); +function _1b(_27,pop){ +return $(_27).closest("ul.tree").tree(pop?"pop":"getData",_27); +}; +function _1c(_28,_29){ +var _2a=$(_28).draggable("proxy").find("span.tree-dnd-icon"); +_2a.removeClass("tree-dnd-yes tree-dnd-no").addClass(_29?"tree-dnd-yes":"tree-dnd-no"); +}; +function _25(_2b,_2c){ +if(_c(_12,_2c).state=="closed"){ +_79(_12,_2c,function(){ +_2d(); +}); +}else{ +_2d(); +} +function _2d(){ +var _2e=_1b(_2b,true); +$(_12).tree("append",{parent:_2c,data:[_2e]}); +_14.onDrop.call(_12,_2c,_2e,"append"); +}; +}; +function _26(_2f,_30,_31){ +var _32={}; +if(_31=="top"){ +_32.before=_30; +}else{ +_32.after=_30; +} +var _33=_1b(_2f,true); +_32.data=_33; +$(_12).tree("insert",_32); +_14.onDrop.call(_12,_30,_33,_31); +}; +}; +function _34(_35,_36,_37,_38){ +var _39=$.data(_35,"tree"); +var _3a=_39.options; +if(!_3a.checkbox){ +return; +} +var _3b=_c(_35,_36); +if(!_3b.checkState){ +return; +} +var ck=$(_36).find(".tree-checkbox"); +if(_37==undefined){ +if(ck.hasClass("tree-checkbox1")){ +_37=false; +}else{ +if(ck.hasClass("tree-checkbox0")){ +_37=true; +}else{ +if(_3b._checked==undefined){ +_3b._checked=$(_36).find(".tree-checkbox").hasClass("tree-checkbox1"); +} +_37=!_3b._checked; +} +} +} +_3b._checked=_37; +if(_37){ +if(ck.hasClass("tree-checkbox1")){ +return; +} +}else{ +if(ck.hasClass("tree-checkbox0")){ +return; +} +} +if(!_38){ +if(_3a.onBeforeCheck.call(_35,_3b,_37)==false){ +return; +} +} +if(_3a.cascadeCheck){ +_3c(_35,_3b,_37); +_3d(_35,_3b); +}else{ +_3e(_35,_3b,_37?"1":"0"); +} +if(!_38){ +_3a.onCheck.call(_35,_3b,_37); +} +}; +function _3c(_3f,_40,_41){ +var _42=$.data(_3f,"tree").options; +var _43=_41?1:0; +_3e(_3f,_40,_43); +if(_42.deepCheck){ +$.easyui.forEach(_40.children||[],true,function(n){ +_3e(_3f,n,_43); +}); +}else{ +var _44=[]; +if(_40.children&&_40.children.length){ +_44.push(_40); +} +$.easyui.forEach(_40.children||[],true,function(n){ +if(!n.hidden){ +_3e(_3f,n,_43); +if(n.children&&n.children.length){ +_44.push(n); +} +} +}); +for(var i=_44.length-1;i>=0;i--){ +var _45=_44[i]; +_3e(_3f,_45,_46(_45)); +} +} +}; +function _3e(_47,_48,_49){ +var _4a=$.data(_47,"tree").options; +if(!_48.checkState||_49==undefined){ +return; +} +if(_48.hidden&&!_4a.deepCheck){ +return; +} +var ck=$("#"+_48.domId).find(".tree-checkbox"); +_48.checkState=["unchecked","checked","indeterminate"][_49]; +_48.checked=(_48.checkState=="checked"); +ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); +ck.addClass("tree-checkbox"+_49); +}; +function _3d(_4b,_4c){ +var pd=_4d(_4b,$("#"+_4c.domId)[0]); +if(pd){ +_3e(_4b,pd,_46(pd)); +_3d(_4b,pd); +} +}; +function _46(row){ +var c0=0; +var c1=0; +var len=0; +$.easyui.forEach(row.children||[],false,function(r){ +if(r.checkState){ +len++; +if(r.checkState=="checked"){ +c1++; +}else{ +if(r.checkState=="unchecked"){ +c0++; +} +} +} +}); +if(len==0){ +return undefined; +} +var _4e=0; +if(c0==len){ +_4e=0; +}else{ +if(c1==len){ +_4e=1; +}else{ +_4e=2; +} +} +return _4e; +}; +function _4f(_50,_51){ +var _52=$.data(_50,"tree").options; +if(!_52.checkbox){ +return; +} +var _53=$(_51); +var ck=_53.find(".tree-checkbox"); +var _54=_c(_50,_51); +if(_52.view.hasCheckbox(_50,_54)){ +if(!ck.length){ +_54.checkState=_54.checkState||"unchecked"; +$("").insertBefore(_53.find(".tree-title")); +} +if(_54.checkState=="checked"){ +_34(_50,_51,true,true); +}else{ +if(_54.checkState=="unchecked"){ +_34(_50,_51,false,true); +}else{ +var _55=_46(_54); +if(_55===0){ +_34(_50,_51,false,true); +}else{ +if(_55===1){ +_34(_50,_51,true,true); +} +} +} +} +}else{ +ck.remove(); +_54.checkState=undefined; +_54.checked=undefined; +_3d(_50,_54); +} +}; +function _56(_57,ul,_58,_59,_5a){ +var _5b=$.data(_57,"tree"); +var _5c=_5b.options; +var _5d=$(ul).prevAll("div.tree-node:first"); +_58=_5c.loadFilter.call(_57,_58,_5d[0]); +var _5e=_5f(_57,"domId",_5d.attr("id")); +if(!_59){ +_5e?_5e.children=_58:_5b.data=_58; +$(ul).empty(); +}else{ +if(_5e){ +_5e.children?_5e.children=_5e.children.concat(_58):_5e.children=_58; +}else{ +_5b.data=_5b.data.concat(_58); +} +} +_5c.view.render.call(_5c.view,_57,ul,_58); +if(_5c.dnd){ +_11(_57); +} +if(_5e){ +_60(_57,_5e); +} +for(var i=0;i<_5b.tmpIds.length;i++){ +_34(_57,$("#"+_5b.tmpIds[i])[0],true,true); +} +_5b.tmpIds=[]; +setTimeout(function(){ +_61(_57,_57); +},0); +if(!_5a){ +_5c.onLoadSuccess.call(_57,_5e,_58); +} +}; +function _61(_62,ul,_63){ +var _64=$.data(_62,"tree").options; +if(_64.lines){ +$(_62).addClass("tree-lines"); +}else{ +$(_62).removeClass("tree-lines"); +return; +} +if(!_63){ +_63=true; +$(_62).find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); +$(_62).find("div.tree-node").removeClass("tree-node-last tree-root-first tree-root-one"); +var _65=$(_62).tree("getRoots"); +if(_65.length>1){ +$(_65[0].target).addClass("tree-root-first"); +}else{ +if(_65.length==1){ +$(_65[0].target).addClass("tree-root-one"); +} +} +} +$(ul).children("li").each(function(){ +var _66=$(this).children("div.tree-node"); +var ul=_66.next("ul"); +if(ul.length){ +if($(this).next().length){ +_67(_66); +} +_61(_62,ul,_63); +}else{ +_68(_66); +} +}); +var _69=$(ul).children("li:last").children("div.tree-node").addClass("tree-node-last"); +_69.children("span.tree-join").removeClass("tree-join").addClass("tree-joinbottom"); +function _68(_6a,_6b){ +var _6c=_6a.find("span.tree-icon"); +_6c.prev("span.tree-indent").addClass("tree-join"); +}; +function _67(_6d){ +var _6e=_6d.find("span.tree-indent, span.tree-hit").length; +_6d.next().find("div.tree-node").each(function(){ +$(this).children("span:eq("+(_6e-1)+")").addClass("tree-line"); +}); +}; +}; +function _6f(_70,ul,_71,_72){ +var _73=$.data(_70,"tree").options; +_71=$.extend({},_73.queryParams,_71||{}); +var _74=null; +if(_70!=ul){ +var _75=$(ul).prev(); +_74=_c(_70,_75[0]); +} +if(_73.onBeforeLoad.call(_70,_74,_71)==false){ +return; +} +var _76=$(ul).prev().children("span.tree-folder"); +_76.addClass("tree-loading"); +var _77=_73.loader.call(_70,_71,function(_78){ +_76.removeClass("tree-loading"); +_56(_70,ul,_78); +if(_72){ +_72(); +} +},function(){ +_76.removeClass("tree-loading"); +_73.onLoadError.apply(_70,arguments); +if(_72){ +_72(); +} +}); +if(_77==false){ +_76.removeClass("tree-loading"); +} +}; +function _79(_7a,_7b,_7c){ +var _7d=$.data(_7a,"tree").options; +var hit=$(_7b).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +return; +} +var _7e=_c(_7a,_7b); +if(_7d.onBeforeExpand.call(_7a,_7e)==false){ +return; +} +hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); +hit.next().addClass("tree-folder-open"); +var ul=$(_7b).next(); +if(ul.length){ +if(_7d.animate){ +ul.slideDown("normal",function(){ +_7e.state="open"; +_7d.onExpand.call(_7a,_7e); +if(_7c){ +_7c(); +} +}); +}else{ +ul.css("display","block"); +_7e.state="open"; +_7d.onExpand.call(_7a,_7e); +if(_7c){ +_7c(); +} +} +}else{ +var _7f=$("
                                                    ").insertAfter(_7b); +_6f(_7a,_7f[0],{id:_7e.id},function(){ +if(_7f.is(":empty")){ +_7f.remove(); +} +if(_7d.animate){ +_7f.slideDown("normal",function(){ +_7e.state="open"; +_7d.onExpand.call(_7a,_7e); +if(_7c){ +_7c(); +} +}); +}else{ +_7f.css("display","block"); +_7e.state="open"; +_7d.onExpand.call(_7a,_7e); +if(_7c){ +_7c(); +} +} +}); +} +}; +function _80(_81,_82){ +var _83=$.data(_81,"tree").options; +var hit=$(_82).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-collapsed")){ +return; +} +var _84=_c(_81,_82); +if(_83.onBeforeCollapse.call(_81,_84)==false){ +return; +} +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +hit.next().removeClass("tree-folder-open"); +var ul=$(_82).next(); +if(_83.animate){ +ul.slideUp("normal",function(){ +_84.state="closed"; +_83.onCollapse.call(_81,_84); +}); +}else{ +ul.css("display","none"); +_84.state="closed"; +_83.onCollapse.call(_81,_84); +} +}; +function _85(_86,_87){ +var hit=$(_87).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +_80(_86,_87); +}else{ +_79(_86,_87); +} +}; +function _88(_89,_8a){ +var _8b=_8c(_89,_8a); +if(_8a){ +_8b.unshift(_c(_89,_8a)); +} +for(var i=0;i<_8b.length;i++){ +_79(_89,_8b[i].target); +} +}; +function _8d(_8e,_8f){ +var _90=[]; +var p=_4d(_8e,_8f); +while(p){ +_90.unshift(p); +p=_4d(_8e,p.target); +} +for(var i=0;i<_90.length;i++){ +_79(_8e,_90[i].target); +} +}; +function _91(_92,_93){ +var c=$(_92).parent(); +while(c[0].tagName!="BODY"&&c.css("overflow-y")!="auto"){ +c=c.parent(); +} +var n=$(_93); +var _94=n.offset().top; +if(c[0].tagName!="BODY"){ +var _95=c.offset().top; +if(_94<_95){ +c.scrollTop(c.scrollTop()+_94-_95); +}else{ +if(_94+n.outerHeight()>_95+c.outerHeight()-18){ +c.scrollTop(c.scrollTop()+_94+n.outerHeight()-_95-c.outerHeight()+18); +} +} +}else{ +c.scrollTop(_94); +} +}; +function _96(_97,_98){ +var _99=_8c(_97,_98); +if(_98){ +_99.unshift(_c(_97,_98)); +} +for(var i=0;i<_99.length;i++){ +_80(_97,_99[i].target); +} +}; +function _9a(_9b,_9c){ +var _9d=$(_9c.parent); +var _9e=_9c.data; +if(!_9e){ +return; +} +_9e=$.isArray(_9e)?_9e:[_9e]; +if(!_9e.length){ +return; +} +var ul; +if(_9d.length==0){ +ul=$(_9b); +}else{ +if(_9f(_9b,_9d[0])){ +var _a0=_9d.find("span.tree-icon"); +_a0.removeClass("tree-file").addClass("tree-folder tree-folder-open"); +var hit=$("").insertBefore(_a0); +if(hit.prev().length){ +hit.prev().remove(); +} +} +ul=_9d.next(); +if(!ul.length){ +ul=$("
                                                      ").insertAfter(_9d); +} +} +_56(_9b,ul[0],_9e,true,true); +}; +function _a1(_a2,_a3){ +var ref=_a3.before||_a3.after; +var _a4=_4d(_a2,ref); +var _a5=_a3.data; +if(!_a5){ +return; +} +_a5=$.isArray(_a5)?_a5:[_a5]; +if(!_a5.length){ +return; +} +_9a(_a2,{parent:(_a4?_a4.target:null),data:_a5}); +var _a6=_a4?_a4.children:$(_a2).tree("getRoots"); +for(var i=0;i<_a6.length;i++){ +if(_a6[i].domId==$(ref).attr("id")){ +for(var j=_a5.length-1;j>=0;j--){ +_a6.splice((_a3.before?i:(i+1)),0,_a5[j]); +} +_a6.splice(_a6.length-_a5.length,_a5.length); +break; +} +} +var li=$(); +for(var i=0;i<_a5.length;i++){ +li=li.add($("#"+_a5[i].domId).parent()); +} +if(_a3.before){ +li.insertBefore($(ref).parent()); +}else{ +li.insertAfter($(ref).parent()); +} +}; +function _a7(_a8,_a9){ +var _aa=del(_a9); +$(_a9).parent().remove(); +if(_aa){ +if(!_aa.children||!_aa.children.length){ +var _ab=$(_aa.target); +_ab.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); +_ab.find(".tree-hit").remove(); +$("").prependTo(_ab); +_ab.next().remove(); +} +_60(_a8,_aa); +} +_61(_a8,_a8); +function del(_ac){ +var id=$(_ac).attr("id"); +var _ad=_4d(_a8,_ac); +var cc=_ad?_ad.children:$.data(_a8,"tree").data; +for(var i=0;i").appendTo(nt); +_e6.val(_e4.text).focus(); +_e6.width(_e5+20); +_e6._outerHeight(_e3.editorHeight); +_e6.bind("click",function(e){ +return false; +}).bind("mousedown",function(e){ +e.stopPropagation(); +}).bind("mousemove",function(e){ +e.stopPropagation(); +}).bind("keydown",function(e){ +if(e.keyCode==13){ +_e7(_e1,_e2); +return false; +}else{ +if(e.keyCode==27){ +_ed(_e1,_e2); +return false; +} +} +}).bind("blur",function(e){ +e.stopPropagation(); +_e7(_e1,_e2); +}); +}; +function _e7(_e8,_e9){ +var _ea=$.data(_e8,"tree").options; +$(_e9).css("position",""); +var _eb=$(_e9).find("input.tree-editor"); +var val=_eb.val(); +_eb.remove(); +var _ec=_c(_e8,_e9); +_ec.text=val; +_60(_e8,_ec); +_ea.onAfterEdit.call(_e8,_ec); +}; +function _ed(_ee,_ef){ +var _f0=$.data(_ee,"tree").options; +$(_ef).css("position",""); +$(_ef).find("input.tree-editor").remove(); +var _f1=_c(_ee,_ef); +_60(_ee,_f1); +_f0.onCancelEdit.call(_ee,_f1); +}; +function _f2(_f3,q){ +var _f4=$.data(_f3,"tree"); +var _f5=_f4.options; +var ids={}; +$.easyui.forEach(_f4.data,true,function(_f6){ +if(_f5.filter.call(_f3,q,_f6)){ +$("#"+_f6.domId).removeClass("tree-node-hidden"); +ids[_f6.domId]=1; +_f6.hidden=false; +}else{ +$("#"+_f6.domId).addClass("tree-node-hidden"); +_f6.hidden=true; +} +}); +for(var id in ids){ +_f7(id); +} +function _f7(_f8){ +var p=$(_f3).tree("getParent",$("#"+_f8)[0]); +while(p){ +$(p.target).removeClass("tree-node-hidden"); +p.hidden=false; +p=$(_f3).tree("getParent",p.target); +} +}; +}; +$.fn.tree=function(_f9,_fa){ +if(typeof _f9=="string"){ +return $.fn.tree.methods[_f9](this,_fa); +} +var _f9=_f9||{}; +return this.each(function(){ +var _fb=$.data(this,"tree"); +var _fc; +if(_fb){ +_fc=$.extend(_fb.options,_f9); +_fb.options=_fc; +}else{ +_fc=$.extend({},$.fn.tree.defaults,$.fn.tree.parseOptions(this),_f9); +$.data(this,"tree",{options:_fc,tree:_1(this),data:[],tmpIds:[]}); +var _fd=$.fn.tree.parseData(this); +if(_fd.length){ +_56(this,this,_fd); +} +} +_4(this); +if(_fc.data){ +_56(this,this,$.extend(true,[],_fc.data)); +} +_6f(this,this); +}); +}; +$.fn.tree.methods={options:function(jq){ +return $.data(jq[0],"tree").options; +},loadData:function(jq,_fe){ +return jq.each(function(){ +_56(this,this,_fe); +}); +},getNode:function(jq,_ff){ +return _c(jq[0],_ff); +},getData:function(jq,_100){ +return _c9(jq[0],_100); +},reload:function(jq,_101){ +return jq.each(function(){ +if(_101){ +var node=$(_101); +var hit=node.children("span.tree-hit"); +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +node.next().remove(); +_79(this,_101); +}else{ +$(this).empty(); +_6f(this,this); +} +}); +},getRoot:function(jq,_102){ +return _b3(jq[0],_102); +},getRoots:function(jq){ +return _b7(jq[0]); +},getParent:function(jq,_103){ +return _4d(jq[0],_103); +},getChildren:function(jq,_104){ +return _8c(jq[0],_104); +},getChecked:function(jq,_105){ +return _c2(jq[0],_105); +},getSelected:function(jq){ +return _c6(jq[0]); +},isLeaf:function(jq,_106){ +return _9f(jq[0],_106); +},find:function(jq,id){ +return _d0(jq[0],id); +},select:function(jq,_107){ +return jq.each(function(){ +_d9(this,_107); +}); +},check:function(jq,_108){ +return jq.each(function(){ +_34(this,_108,true); +}); +},uncheck:function(jq,_109){ +return jq.each(function(){ +_34(this,_109,false); +}); +},collapse:function(jq,_10a){ +return jq.each(function(){ +_80(this,_10a); +}); +},expand:function(jq,_10b){ +return jq.each(function(){ +_79(this,_10b); +}); +},collapseAll:function(jq,_10c){ +return jq.each(function(){ +_96(this,_10c); +}); +},expandAll:function(jq,_10d){ +return jq.each(function(){ +_88(this,_10d); +}); +},expandTo:function(jq,_10e){ +return jq.each(function(){ +_8d(this,_10e); +}); +},scrollTo:function(jq,_10f){ +return jq.each(function(){ +_91(this,_10f); +}); +},toggle:function(jq,_110){ +return jq.each(function(){ +_85(this,_110); +}); +},append:function(jq,_111){ +return jq.each(function(){ +_9a(this,_111); +}); +},insert:function(jq,_112){ +return jq.each(function(){ +_a1(this,_112); +}); +},remove:function(jq,_113){ +return jq.each(function(){ +_a7(this,_113); +}); +},pop:function(jq,_114){ +var node=jq.tree("getData",_114); +jq.tree("remove",_114); +return node; +},update:function(jq,_115){ +return jq.each(function(){ +_60(this,$.extend({},_115,{checkState:_115.checked?"checked":(_115.checked===false?"unchecked":undefined)})); +}); +},enableDnd:function(jq){ +return jq.each(function(){ +_11(this); +}); +},disableDnd:function(jq){ +return jq.each(function(){ +_d(this); +}); +},beginEdit:function(jq,_116){ +return jq.each(function(){ +_e0(this,_116); +}); +},endEdit:function(jq,_117){ +return jq.each(function(){ +_e7(this,_117); +}); +},cancelEdit:function(jq,_118){ +return jq.each(function(){ +_ed(this,_118); +}); +},doFilter:function(jq,q){ +return jq.each(function(){ +_f2(this,q); +}); +}}; +$.fn.tree.parseOptions=function(_119){ +var t=$(_119); +return $.extend({},$.parser.parseOptions(_119,["url","method",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean",lines:"boolean",dnd:"boolean"}])); +}; +$.fn.tree.parseData=function(_11a){ +var data=[]; +_11b(data,$(_11a)); +return data; +function _11b(aa,tree){ +tree.children("li").each(function(){ +var node=$(this); +var item=$.extend({},$.parser.parseOptions(this,["id","iconCls","state"]),{checked:(node.attr("checked")?true:undefined)}); +item.text=node.children("span").html(); +if(!item.text){ +item.text=node.html(); +} +var _11c=node.children("ul"); +if(_11c.length){ +item.children=[]; +_11b(item.children,_11c); +} +aa.push(item); +}); +}; +}; +var _11d=1; +var _11e={render:function(_11f,ul,data){ +var _120=$.data(_11f,"tree"); +var opts=_120.options; +var _121=$(ul).prev(".tree-node"); +var _122=_121.length?$(_11f).tree("getNode",_121[0]):null; +var _123=_121.find("span.tree-indent, span.tree-hit").length; +var cc=_124.call(this,_123,data); +$(ul).append(cc.join("")); +function _124(_125,_126){ +var cc=[]; +for(var i=0;i<_126.length;i++){ +var item=_126[i]; +if(item.state!="open"&&item.state!="closed"){ +item.state="open"; +} +item.domId="_easyui_tree_"+_11d++; +cc.push("
                                                    • "); +cc.push("
                                                      "); +for(var j=0;j<_125;j++){ +cc.push(""); +} +if(item.state=="closed"){ +cc.push(""); +cc.push(""); +}else{ +if(item.children&&item.children.length){ +cc.push(""); +cc.push(""); +}else{ +cc.push(""); +cc.push(""); +} +} +if(this.hasCheckbox(_11f,item)){ +var flag=0; +if(_122&&_122.checkState=="checked"&&opts.cascadeCheck){ +flag=1; +item.checked=true; +}else{ +if(item.checked){ +$.easyui.addArrayItem(_120.tmpIds,item.domId); +} +} +item.checkState=flag?"checked":"unchecked"; +cc.push(""); +}else{ +item.checkState=undefined; +item.checked=undefined; +} +cc.push(""+opts.formatter.call(_11f,item)+""); +cc.push("
                                                      "); +if(item.children&&item.children.length){ +var tmp=_124.call(this,_125+1,item.children); +cc.push("
                                                        "); +cc=cc.concat(tmp); +cc.push("
                                                      "); +} +cc.push("
                                                    • "); +} +return cc; +}; +},hasCheckbox:function(_127,item){ +var _128=$.data(_127,"tree"); +var opts=_128.options; +if(opts.checkbox){ +if($.isFunction(opts.checkbox)){ +if(opts.checkbox.call(_127,item)){ +return true; +}else{ +return false; +} +}else{ +if(opts.onlyLeafCheck){ +if(item.state=="open"&&!(item.children&&item.children.length)){ +return true; +} +}else{ +return true; +} +} +} +return false; +}}; +$.fn.tree.defaults={url:null,method:"post",animate:false,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,dnd:false,editorHeight:26,data:null,queryParams:{},formatter:function(node){ +return node.text; +},filter:function(q,node){ +var qq=[]; +$.map($.isArray(q)?q:[q],function(q){ +q=$.trim(q); +if(q){ +qq.push(q); +} +}); +for(var i=0;i=0){ +return true; +} +} +return !qq.length; +},loader:function(_12a,_12b,_12c){ +var opts=$(this).tree("options"); +if(!opts.url){ +return false; +} +$.ajax({type:opts.method,url:opts.url,data:_12a,dataType:"json",success:function(data){ +_12b(data); +},error:function(){ +_12c.apply(this,arguments); +}}); +},loadFilter:function(data,_12d){ +return data; +},view:_11e,onBeforeLoad:function(node,_12e){ +},onLoadSuccess:function(node,data){ +},onLoadError:function(){ +},onClick:function(node){ +},onDblClick:function(node){ +},onBeforeExpand:function(node){ +},onExpand:function(node){ +},onBeforeCollapse:function(node){ +},onCollapse:function(node){ +},onBeforeCheck:function(node,_12f){ +},onCheck:function(node,_130){ +},onBeforeSelect:function(node){ +},onSelect:function(node){ +},onContextMenu:function(e,node){ +},onBeforeDrag:function(node){ +},onStartDrag:function(node){ +},onStopDrag:function(node){ +},onDragEnter:function(_131,_132){ +},onDragOver:function(_133,_134){ +},onDragLeave:function(_135,_136){ +},onBeforeDrop:function(_137,_138,_139){ +},onDrop:function(_13a,_13b,_13c){ +},onBeforeEdit:function(node){ +},onAfterEdit:function(node){ +},onCancelEdit:function(node){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.treegrid.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.treegrid.js new file mode 100755 index 000000000..1f0bb30a2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.treegrid.js @@ -0,0 +1,1353 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"treegrid"); +var _4=_3.options; +$(_2).datagrid($.extend({},_4,{url:null,data:null,loader:function(){ +return false; +},onBeforeLoad:function(){ +return false; +},onLoadSuccess:function(){ +},onResizeColumn:function(_5,_6){ +_16(_2); +_4.onResizeColumn.call(_2,_5,_6); +},onBeforeSortColumn:function(_7,_8){ +if(_4.onBeforeSortColumn.call(_2,_7,_8)==false){ +return false; +} +},onSortColumn:function(_9,_a){ +_4.sortName=_9; +_4.sortOrder=_a; +if(_4.remoteSort){ +_15(_2); +}else{ +var _b=$(_2).treegrid("getData"); +_56(_2,null,_b); +} +_4.onSortColumn.call(_2,_9,_a); +},onClickCell:function(_c,_d){ +_4.onClickCell.call(_2,_d,_37(_2,_c)); +},onDblClickCell:function(_e,_f){ +_4.onDblClickCell.call(_2,_f,_37(_2,_e)); +},onRowContextMenu:function(e,_10){ +_4.onContextMenu.call(_2,e,_37(_2,_10)); +}})); +var _11=$.data(_2,"datagrid").options; +_4.columns=_11.columns; +_4.frozenColumns=_11.frozenColumns; +_3.dc=$.data(_2,"datagrid").dc; +if(_4.pagination){ +var _12=$(_2).datagrid("getPager"); +_12.pagination({pageNumber:_4.pageNumber,pageSize:_4.pageSize,pageList:_4.pageList,onSelectPage:function(_13,_14){ +_4.pageNumber=_13; +_4.pageSize=_14; +_15(_2); +}}); +_4.pageSize=_12.pagination("options").pageSize; +} +}; +function _16(_17,_18){ +var _19=$.data(_17,"datagrid").options; +var dc=$.data(_17,"datagrid").dc; +if(!dc.body1.is(":empty")&&(!_19.nowrap||_19.autoRowHeight)){ +if(_18!=undefined){ +var _1a=_1b(_17,_18); +for(var i=0;i<_1a.length;i++){ +_1c(_1a[i][_19.idField]); +} +} +} +$(_17).datagrid("fixRowHeight",_18); +function _1c(_1d){ +var tr1=_19.finder.getTr(_17,_1d,"body",1); +var tr2=_19.finder.getTr(_17,_1d,"body",2); +tr1.css("height",""); +tr2.css("height",""); +var _1e=Math.max(tr1.height(),tr2.height()); +tr1.css("height",_1e); +tr2.css("height",_1e); +}; +}; +function _1f(_20){ +var dc=$.data(_20,"datagrid").dc; +var _21=$.data(_20,"treegrid").options; +if(!_21.rownumbers){ +return; +} +dc.body1.find("div.datagrid-cell-rownumber").each(function(i){ +$(this).html(i+1); +}); +}; +function _22(_23){ +return function(e){ +$.fn.datagrid.defaults.rowEvents[_23?"mouseover":"mouseout"](e); +var tt=$(e.target); +var fn=_23?"addClass":"removeClass"; +if(tt.hasClass("tree-hit")){ +tt.hasClass("tree-expanded")?tt[fn]("tree-expanded-hover"):tt[fn]("tree-collapsed-hover"); +} +}; +}; +function _24(e){ +var tt=$(e.target); +var tr=tt.closest("tr.datagrid-row"); +if(!tr.length||!tr.parent().length){ +return; +} +var _25=tr.attr("node-id"); +var _26=_27(tr); +if(tt.hasClass("tree-hit")){ +_28(_26,_25); +}else{ +if(tt.hasClass("tree-checkbox")){ +_29(_26,_25); +}else{ +var _2a=$(_26).datagrid("options"); +if(!tt.parent().hasClass("datagrid-cell-check")&&!_2a.singleSelect&&e.shiftKey){ +var _2b=$(_26).treegrid("getChildren"); +var _2c=$.easyui.indexOfArray(_2b,_2a.idField,_2a.lastSelectedIndex); +var _2d=$.easyui.indexOfArray(_2b,_2a.idField,_25); +var _2e=Math.min(Math.max(_2c,0),_2d); +var to=Math.max(_2c,_2d); +var row=_2b[_2d]; +var td=tt.closest("td[field]",tr); +if(td.length){ +var _2f=td.attr("field"); +_2a.onClickCell.call(_26,_25,_2f,row[_2f]); +} +$(_26).treegrid("clearSelections"); +for(var i=_2e;i<=to;i++){ +$(_26).treegrid("selectRow",_2b[i][_2a.idField]); +} +_2a.onClickRow.call(_26,row); +}else{ +$.fn.datagrid.defaults.rowEvents.click(e); +} +} +} +}; +function _27(t){ +return $(t).closest("div.datagrid-view").children(".datagrid-f")[0]; +}; +function _29(_30,_31,_32,_33){ +var _34=$.data(_30,"treegrid"); +var _35=_34.checkedRows; +var _36=_34.options; +if(!_36.checkbox){ +return; +} +var row=_37(_30,_31); +if(!row.checkState){ +return; +} +var tr=_36.finder.getTr(_30,_31); +var ck=tr.find(".tree-checkbox"); +if(_32==undefined){ +if(ck.hasClass("tree-checkbox1")){ +_32=false; +}else{ +if(ck.hasClass("tree-checkbox0")){ +_32=true; +}else{ +if(row._checked==undefined){ +row._checked=ck.hasClass("tree-checkbox1"); +} +_32=!row._checked; +} +} +} +row._checked=_32; +if(_32){ +if(ck.hasClass("tree-checkbox1")){ +return; +} +}else{ +if(ck.hasClass("tree-checkbox0")){ +return; +} +} +if(!_33){ +if(_36.onBeforeCheckNode.call(_30,row,_32)==false){ +return; +} +} +if(_36.cascadeCheck){ +_38(_30,row,_32); +_39(_30,row); +}else{ +_3a(_30,row,_32?"1":"0"); +} +if(!_33){ +_36.onCheckNode.call(_30,row,_32); +} +}; +function _3a(_3b,row,_3c){ +var _3d=$.data(_3b,"treegrid"); +var _3e=_3d.checkedRows; +var _3f=_3d.options; +if(!row.checkState||_3c==undefined){ +return; +} +var tr=_3f.finder.getTr(_3b,row[_3f.idField]); +var ck=tr.find(".tree-checkbox"); +if(!ck.length){ +return; +} +row.checkState=["unchecked","checked","indeterminate"][_3c]; +row.checked=(row.checkState=="checked"); +ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); +ck.addClass("tree-checkbox"+_3c); +if(_3c==0){ +$.easyui.removeArrayItem(_3e,_3f.idField,row[_3f.idField]); +}else{ +$.easyui.addArrayItem(_3e,_3f.idField,row); +} +}; +function _38(_40,row,_41){ +var _42=_41?1:0; +_3a(_40,row,_42); +$.easyui.forEach(row.children||[],true,function(r){ +_3a(_40,r,_42); +}); +}; +function _39(_43,row){ +var _44=$.data(_43,"treegrid").options; +var _45=_46(_43,row[_44.idField]); +if(_45){ +_3a(_43,_45,_47(_45)); +_39(_43,_45); +} +}; +function _47(row){ +var len=0; +var c0=0; +var c1=0; +$.easyui.forEach(row.children||[],false,function(r){ +if(r.checkState){ +len++; +if(r.checkState=="checked"){ +c1++; +}else{ +if(r.checkState=="unchecked"){ +c0++; +} +} +} +}); +if(len==0){ +return undefined; +} +var _48=0; +if(c0==len){ +_48=0; +}else{ +if(c1==len){ +_48=1; +}else{ +_48=2; +} +} +return _48; +}; +function _49(_4a,_4b){ +var _4c=$.data(_4a,"treegrid").options; +if(!_4c.checkbox){ +return; +} +var row=_37(_4a,_4b); +var tr=_4c.finder.getTr(_4a,_4b); +var ck=tr.find(".tree-checkbox"); +if(_4c.view.hasCheckbox(_4a,row)){ +if(!ck.length){ +row.checkState=row.checkState||"unchecked"; +$("").insertBefore(tr.find(".tree-title")); +} +if(row.checkState=="checked"){ +_29(_4a,_4b,true,true); +}else{ +if(row.checkState=="unchecked"){ +_29(_4a,_4b,false,true); +}else{ +var _4d=_47(row); +if(_4d===0){ +_29(_4a,_4b,false,true); +}else{ +if(_4d===1){ +_29(_4a,_4b,true,true); +} +} +} +} +}else{ +ck.remove(); +row.checkState=undefined; +row.checked=undefined; +_39(_4a,row); +} +}; +function _4e(_4f,_50){ +var _51=$.data(_4f,"treegrid").options; +var tr1=_51.finder.getTr(_4f,_50,"body",1); +var tr2=_51.finder.getTr(_4f,_50,"body",2); +var _52=$(_4f).datagrid("getColumnFields",true).length+(_51.rownumbers?1:0); +var _53=$(_4f).datagrid("getColumnFields",false).length; +_54(tr1,_52); +_54(tr2,_53); +function _54(tr,_55){ +$(""+""+"
                                                      "+""+"").insertAfter(tr); +}; +}; +function _56(_57,_58,_59,_5a,_5b){ +var _5c=$.data(_57,"treegrid"); +var _5d=_5c.options; +var dc=_5c.dc; +_59=_5d.loadFilter.call(_57,_59,_58); +var _5e=_37(_57,_58); +if(_5e){ +var _5f=_5d.finder.getTr(_57,_58,"body",1); +var _60=_5d.finder.getTr(_57,_58,"body",2); +var cc1=_5f.next("tr.treegrid-tr-tree").children("td").children("div"); +var cc2=_60.next("tr.treegrid-tr-tree").children("td").children("div"); +if(!_5a){ +_5e.children=[]; +} +}else{ +var cc1=dc.body1; +var cc2=dc.body2; +if(!_5a){ +_5c.data=[]; +} +} +if(!_5a){ +cc1.empty(); +cc2.empty(); +} +if(_5d.view.onBeforeRender){ +_5d.view.onBeforeRender.call(_5d.view,_57,_58,_59); +} +_5d.view.render.call(_5d.view,_57,cc1,true); +_5d.view.render.call(_5d.view,_57,cc2,false); +if(_5d.showFooter){ +_5d.view.renderFooter.call(_5d.view,_57,dc.footer1,true); +_5d.view.renderFooter.call(_5d.view,_57,dc.footer2,false); +} +if(_5d.view.onAfterRender){ +_5d.view.onAfterRender.call(_5d.view,_57); +} +if(!_58&&_5d.pagination){ +var _61=$.data(_57,"treegrid").total; +var _62=$(_57).datagrid("getPager"); +if(_62.pagination("options").total!=_61){ +_62.pagination({total:_61}); +} +} +_16(_57); +_1f(_57); +$(_57).treegrid("showLines"); +$(_57).treegrid("setSelectionState"); +$(_57).treegrid("autoSizeColumn"); +if(!_5b){ +_5d.onLoadSuccess.call(_57,_5e,_59); +} +}; +function _15(_63,_64,_65,_66,_67){ +var _68=$.data(_63,"treegrid").options; +var _69=$(_63).datagrid("getPanel").find("div.datagrid-body"); +if(_64==undefined&&_68.queryParams){ +_68.queryParams.id=undefined; +} +if(_65){ +_68.queryParams=_65; +} +var _6a=$.extend({},_68.queryParams); +if(_68.pagination){ +$.extend(_6a,{page:_68.pageNumber,rows:_68.pageSize}); +} +if(_68.sortName){ +$.extend(_6a,{sort:_68.sortName,order:_68.sortOrder}); +} +var row=_37(_63,_64); +if(_68.onBeforeLoad.call(_63,row,_6a)==false){ +return; +} +var _6b=_69.find("tr[node-id=\""+_64+"\"] span.tree-folder"); +_6b.addClass("tree-loading"); +$(_63).treegrid("loading"); +var _6c=_68.loader.call(_63,_6a,function(_6d){ +_6b.removeClass("tree-loading"); +$(_63).treegrid("loaded"); +_56(_63,_64,_6d,_66); +if(_67){ +_67(); +} +},function(){ +_6b.removeClass("tree-loading"); +$(_63).treegrid("loaded"); +_68.onLoadError.apply(_63,arguments); +if(_67){ +_67(); +} +}); +if(_6c==false){ +_6b.removeClass("tree-loading"); +$(_63).treegrid("loaded"); +} +}; +function _6e(_6f){ +var _70=_71(_6f); +return _70.length?_70[0]:null; +}; +function _71(_72){ +return $.data(_72,"treegrid").data; +}; +function _46(_73,_74){ +var row=_37(_73,_74); +if(row._parentId){ +return _37(_73,row._parentId); +}else{ +return null; +} +}; +function _1b(_75,_76){ +var _77=$.data(_75,"treegrid").data; +if(_76){ +var _78=_37(_75,_76); +_77=_78?(_78.children||[]):[]; +} +var _79=[]; +$.easyui.forEach(_77,true,function(_7a){ +_79.push(_7a); +}); +return _79; +}; +function _7b(_7c,_7d){ +var _7e=$.data(_7c,"treegrid").options; +var tr=_7e.finder.getTr(_7c,_7d); +var _7f=tr.children("td[field=\""+_7e.treeField+"\"]"); +return _7f.find("span.tree-indent,span.tree-hit").length; +}; +function _37(_80,_81){ +var _82=$.data(_80,"treegrid"); +var _83=_82.options; +var _84=null; +$.easyui.forEach(_82.data,true,function(_85){ +if(_85[_83.idField]==_81){ +_84=_85; +return false; +} +}); +return _84; +}; +function _86(_87,_88){ +var _89=$.data(_87,"treegrid").options; +var row=_37(_87,_88); +var tr=_89.finder.getTr(_87,_88); +var hit=tr.find("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-collapsed")){ +return; +} +if(_89.onBeforeCollapse.call(_87,row)==false){ +return; +} +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +hit.next().removeClass("tree-folder-open"); +row.state="closed"; +tr=tr.next("tr.treegrid-tr-tree"); +var cc=tr.children("td").children("div"); +if(_89.animate){ +cc.slideUp("normal",function(){ +$(_87).treegrid("autoSizeColumn"); +_16(_87,_88); +_89.onCollapse.call(_87,row); +}); +}else{ +cc.hide(); +$(_87).treegrid("autoSizeColumn"); +_16(_87,_88); +_89.onCollapse.call(_87,row); +} +}; +function _8a(_8b,_8c){ +var _8d=$.data(_8b,"treegrid").options; +var tr=_8d.finder.getTr(_8b,_8c); +var hit=tr.find("span.tree-hit"); +var row=_37(_8b,_8c); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +return; +} +if(_8d.onBeforeExpand.call(_8b,row)==false){ +return; +} +hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); +hit.next().addClass("tree-folder-open"); +var _8e=tr.next("tr.treegrid-tr-tree"); +if(_8e.length){ +var cc=_8e.children("td").children("div"); +_8f(cc); +}else{ +_4e(_8b,row[_8d.idField]); +var _8e=tr.next("tr.treegrid-tr-tree"); +var cc=_8e.children("td").children("div"); +cc.hide(); +var _90=$.extend({},_8d.queryParams||{}); +_90.id=row[_8d.idField]; +_15(_8b,row[_8d.idField],_90,true,function(){ +if(cc.is(":empty")){ +_8e.remove(); +}else{ +_8f(cc); +} +}); +} +function _8f(cc){ +row.state="open"; +if(_8d.animate){ +cc.slideDown("normal",function(){ +$(_8b).treegrid("autoSizeColumn"); +_16(_8b,_8c); +_8d.onExpand.call(_8b,row); +}); +}else{ +cc.show(); +$(_8b).treegrid("autoSizeColumn"); +_16(_8b,_8c); +_8d.onExpand.call(_8b,row); +} +}; +}; +function _28(_91,_92){ +var _93=$.data(_91,"treegrid").options; +var tr=_93.finder.getTr(_91,_92); +var hit=tr.find("span.tree-hit"); +if(hit.hasClass("tree-expanded")){ +_86(_91,_92); +}else{ +_8a(_91,_92); +} +}; +function _94(_95,_96){ +var _97=$.data(_95,"treegrid").options; +var _98=_1b(_95,_96); +if(_96){ +_98.unshift(_37(_95,_96)); +} +for(var i=0;i<_98.length;i++){ +_86(_95,_98[i][_97.idField]); +} +}; +function _99(_9a,_9b){ +var _9c=$.data(_9a,"treegrid").options; +var _9d=_1b(_9a,_9b); +if(_9b){ +_9d.unshift(_37(_9a,_9b)); +} +for(var i=0;i<_9d.length;i++){ +_8a(_9a,_9d[i][_9c.idField]); +} +}; +function _9e(_9f,_a0){ +var _a1=$.data(_9f,"treegrid").options; +var ids=[]; +var p=_46(_9f,_a0); +while(p){ +var id=p[_a1.idField]; +ids.unshift(id); +p=_46(_9f,id); +} +for(var i=0;i").insertBefore(_a8); +if(hit.prev().length){ +hit.prev().remove(); +} +} +} +_56(_a3,_a4.parent,_a4.data,_a5.data.length>0,true); +}; +function _a9(_aa,_ab){ +var ref=_ab.before||_ab.after; +var _ac=$.data(_aa,"treegrid").options; +var _ad=_46(_aa,ref); +_a2(_aa,{parent:(_ad?_ad[_ac.idField]:null),data:[_ab.data]}); +var _ae=_ad?_ad.children:$(_aa).treegrid("getRoots"); +for(var i=0;i<_ae.length;i++){ +if(_ae[i][_ac.idField]==ref){ +var _af=_ae[_ae.length-1]; +_ae.splice(_ab.before?i:(i+1),0,_af); +_ae.splice(_ae.length-1,1); +break; +} +} +_b0(true); +_b0(false); +_1f(_aa); +$(_aa).treegrid("showLines"); +function _b0(_b1){ +var _b2=_b1?1:2; +var tr=_ac.finder.getTr(_aa,_ab.data[_ac.idField],"body",_b2); +var _b3=tr.closest("table.datagrid-btable"); +tr=tr.parent().children(); +var _b4=_ac.finder.getTr(_aa,ref,"body",_b2); +if(_ab.before){ +tr.insertBefore(_b4); +}else{ +var sub=_b4.next("tr.treegrid-tr-tree"); +tr.insertAfter(sub.length?sub:_b4); +} +_b3.remove(); +}; +}; +function _b5(_b6,_b7){ +var _b8=$.data(_b6,"treegrid"); +var _b9=_b8.options; +var _ba=_46(_b6,_b7); +$(_b6).datagrid("deleteRow",_b7); +$.easyui.removeArrayItem(_b8.checkedRows,_b9.idField,_b7); +_1f(_b6); +if(_ba){ +_49(_b6,_ba[_b9.idField]); +} +_b8.total-=1; +$(_b6).datagrid("getPager").pagination("refresh",{total:_b8.total}); +$(_b6).treegrid("showLines"); +}; +function _bb(_bc){ +var t=$(_bc); +var _bd=t.treegrid("options"); +if(_bd.lines){ +t.treegrid("getPanel").addClass("tree-lines"); +}else{ +t.treegrid("getPanel").removeClass("tree-lines"); +return; +} +t.treegrid("getPanel").find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); +t.treegrid("getPanel").find("div.datagrid-cell").removeClass("tree-node-last tree-root-first tree-root-one"); +var _be=t.treegrid("getRoots"); +if(_be.length>1){ +_bf(_be[0]).addClass("tree-root-first"); +}else{ +if(_be.length==1){ +_bf(_be[0]).addClass("tree-root-one"); +} +} +_c0(_be); +_c1(_be); +function _c0(_c2){ +$.map(_c2,function(_c3){ +if(_c3.children&&_c3.children.length){ +_c0(_c3.children); +}else{ +var _c4=_bf(_c3); +_c4.find(".tree-icon").prev().addClass("tree-join"); +} +}); +if(_c2.length){ +var _c5=_bf(_c2[_c2.length-1]); +_c5.addClass("tree-node-last"); +_c5.find(".tree-join").removeClass("tree-join").addClass("tree-joinbottom"); +} +}; +function _c1(_c6){ +$.map(_c6,function(_c7){ +if(_c7.children&&_c7.children.length){ +_c1(_c7.children); +} +}); +for(var i=0;i<_c6.length-1;i++){ +var _c8=_c6[i]; +var _c9=t.treegrid("getLevel",_c8[_bd.idField]); +var tr=_bd.finder.getTr(_bc,_c8[_bd.idField]); +var cc=tr.next().find("tr.datagrid-row td[field=\""+_bd.treeField+"\"] div.datagrid-cell"); +cc.find("span:eq("+(_c9-1)+")").addClass("tree-line"); +} +}; +function _bf(_ca){ +var tr=_bd.finder.getTr(_bc,_ca[_bd.idField]); +var _cb=tr.find("td[field=\""+_bd.treeField+"\"] div.datagrid-cell"); +return _cb; +}; +}; +$.fn.treegrid=function(_cc,_cd){ +if(typeof _cc=="string"){ +var _ce=$.fn.treegrid.methods[_cc]; +if(_ce){ +return _ce(this,_cd); +}else{ +return this.datagrid(_cc,_cd); +} +} +_cc=_cc||{}; +return this.each(function(){ +var _cf=$.data(this,"treegrid"); +if(_cf){ +$.extend(_cf.options,_cc); +}else{ +_cf=$.data(this,"treegrid",{options:$.extend({},$.fn.treegrid.defaults,$.fn.treegrid.parseOptions(this),_cc),data:[],checkedRows:[],tmpIds:[]}); +} +_1(this); +if(_cf.options.data){ +$(this).treegrid("loadData",_cf.options.data); +} +_15(this); +}); +}; +$.fn.treegrid.methods={options:function(jq){ +return $.data(jq[0],"treegrid").options; +},resize:function(jq,_d0){ +return jq.each(function(){ +$(this).datagrid("resize",_d0); +}); +},fixRowHeight:function(jq,_d1){ +return jq.each(function(){ +_16(this,_d1); +}); +},loadData:function(jq,_d2){ +return jq.each(function(){ +_56(this,_d2.parent,_d2); +}); +},load:function(jq,_d3){ +return jq.each(function(){ +$(this).treegrid("options").pageNumber=1; +$(this).treegrid("getPager").pagination({pageNumber:1}); +$(this).treegrid("reload",_d3); +}); +},reload:function(jq,id){ +return jq.each(function(){ +var _d4=$(this).treegrid("options"); +var _d5={}; +if(typeof id=="object"){ +_d5=id; +}else{ +_d5=$.extend({},_d4.queryParams); +_d5.id=id; +} +if(_d5.id){ +var _d6=$(this).treegrid("find",_d5.id); +if(_d6.children){ +_d6.children.splice(0,_d6.children.length); +} +_d4.queryParams=_d5; +var tr=_d4.finder.getTr(this,_d5.id); +tr.next("tr.treegrid-tr-tree").remove(); +tr.find("span.tree-hit").removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +_8a(this,_d5.id); +}else{ +_15(this,null,_d5); +} +}); +},reloadFooter:function(jq,_d7){ +return jq.each(function(){ +var _d8=$.data(this,"treegrid").options; +var dc=$.data(this,"datagrid").dc; +if(_d7){ +$.data(this,"treegrid").footer=_d7; +} +if(_d8.showFooter){ +_d8.view.renderFooter.call(_d8.view,this,dc.footer1,true); +_d8.view.renderFooter.call(_d8.view,this,dc.footer2,false); +if(_d8.view.onAfterRender){ +_d8.view.onAfterRender.call(_d8.view,this); +} +$(this).treegrid("fixRowHeight"); +} +}); +},getData:function(jq){ +return $.data(jq[0],"treegrid").data; +},getFooterRows:function(jq){ +return $.data(jq[0],"treegrid").footer; +},getRoot:function(jq){ +return _6e(jq[0]); +},getRoots:function(jq){ +return _71(jq[0]); +},getParent:function(jq,id){ +return _46(jq[0],id); +},getChildren:function(jq,id){ +return _1b(jq[0],id); +},getLevel:function(jq,id){ +return _7b(jq[0],id); +},find:function(jq,id){ +return _37(jq[0],id); +},isLeaf:function(jq,id){ +var _d9=$.data(jq[0],"treegrid").options; +var tr=_d9.finder.getTr(jq[0],id); +var hit=tr.find("span.tree-hit"); +return hit.length==0; +},select:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("selectRow",id); +}); +},unselect:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("unselectRow",id); +}); +},collapse:function(jq,id){ +return jq.each(function(){ +_86(this,id); +}); +},expand:function(jq,id){ +return jq.each(function(){ +_8a(this,id); +}); +},toggle:function(jq,id){ +return jq.each(function(){ +_28(this,id); +}); +},collapseAll:function(jq,id){ +return jq.each(function(){ +_94(this,id); +}); +},expandAll:function(jq,id){ +return jq.each(function(){ +_99(this,id); +}); +},expandTo:function(jq,id){ +return jq.each(function(){ +_9e(this,id); +}); +},append:function(jq,_da){ +return jq.each(function(){ +_a2(this,_da); +}); +},insert:function(jq,_db){ +return jq.each(function(){ +_a9(this,_db); +}); +},remove:function(jq,id){ +return jq.each(function(){ +_b5(this,id); +}); +},pop:function(jq,id){ +var row=jq.treegrid("find",id); +jq.treegrid("remove",id); +return row; +},refresh:function(jq,id){ +return jq.each(function(){ +var _dc=$.data(this,"treegrid").options; +_dc.view.refreshRow.call(_dc.view,this,id); +}); +},update:function(jq,_dd){ +return jq.each(function(){ +var _de=$.data(this,"treegrid").options; +var row=_dd.row; +_de.view.updateRow.call(_de.view,this,_dd.id,row); +if(row.checked!=undefined){ +row=_37(this,_dd.id); +$.extend(row,{checkState:row.checked?"checked":(row.checked===false?"unchecked":undefined)}); +_49(this,_dd.id); +} +}); +},beginEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("beginEdit",id); +$(this).treegrid("fixRowHeight",id); +}); +},endEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("endEdit",id); +}); +},cancelEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("cancelEdit",id); +}); +},showLines:function(jq){ +return jq.each(function(){ +_bb(this); +}); +},setSelectionState:function(jq){ +return jq.each(function(){ +$(this).datagrid("setSelectionState"); +var _df=$(this).data("treegrid"); +for(var i=0;i<_df.tmpIds.length;i++){ +_29(this,_df.tmpIds[i],true,true); +} +_df.tmpIds=[]; +}); +},getCheckedNodes:function(jq,_e0){ +_e0=_e0||"checked"; +var _e1=[]; +$.easyui.forEach(jq.data("treegrid").checkedRows,false,function(row){ +if(row.checkState==_e0){ +_e1.push(row); +} +}); +return _e1; +},checkNode:function(jq,id){ +return jq.each(function(){ +_29(this,id,true); +}); +},uncheckNode:function(jq,id){ +return jq.each(function(){ +_29(this,id,false); +}); +},clearChecked:function(jq){ +return jq.each(function(){ +var _e2=this; +var _e3=$(_e2).treegrid("options"); +$(_e2).datagrid("clearChecked"); +$.map($(_e2).treegrid("getCheckedNodes"),function(row){ +_29(_e2,row[_e3.idField],false,true); +}); +}); +}}; +$.fn.treegrid.parseOptions=function(_e4){ +return $.extend({},$.fn.datagrid.parseOptions(_e4),$.parser.parseOptions(_e4,["treeField",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean"}])); +}; +var _e5=$.extend({},$.fn.datagrid.defaults.view,{render:function(_e6,_e7,_e8){ +var _e9=$.data(_e6,"treegrid").options; +var _ea=$(_e6).datagrid("getColumnFields",_e8); +var _eb=$.data(_e6,"datagrid").rowIdPrefix; +if(_e8){ +if(!(_e9.rownumbers||(_e9.frozenColumns&&_e9.frozenColumns.length))){ +return; +} +} +var _ec=this; +if(this.treeNodes&&this.treeNodes.length){ +var _ed=_ee.call(this,_e8,this.treeLevel,this.treeNodes); +$(_e7).append(_ed.join("")); +} +function _ee(_ef,_f0,_f1){ +var _f2=$(_e6).treegrid("getParent",_f1[0][_e9.idField]); +var _f3=(_f2?_f2.children.length:$(_e6).treegrid("getRoots").length)-_f1.length; +var _f4=[""]; +for(var i=0;i<_f1.length;i++){ +var row=_f1[i]; +if(row.state!="open"&&row.state!="closed"){ +row.state="open"; +} +var css=_e9.rowStyler?_e9.rowStyler.call(_e6,row):""; +var cs=this.getStyleValue(css); +var cls="class=\"datagrid-row "+(_f3++%2&&_e9.striped?"datagrid-row-alt ":" ")+cs.c+"\""; +var _f5=cs.s?"style=\""+cs.s+"\"":""; +var _f6=_eb+"-"+(_ef?1:2)+"-"+row[_e9.idField]; +_f4.push(""); +_f4=_f4.concat(_ec.renderRow.call(_ec,_e6,_ea,_ef,_f0,row)); +_f4.push(""); +if(row.children&&row.children.length){ +var tt=_ee.call(this,_ef,_f0+1,row.children); +var v=row.state=="closed"?"none":"block"; +_f4.push(""); +} +} +_f4.push("
                                                      "); +_f4=_f4.concat(tt); +_f4.push("
                                                      "); +return _f4; +}; +},renderFooter:function(_f7,_f8,_f9){ +var _fa=$.data(_f7,"treegrid").options; +var _fb=$.data(_f7,"treegrid").footer||[]; +var _fc=$(_f7).datagrid("getColumnFields",_f9); +var _fd=[""]; +for(var i=0;i<_fb.length;i++){ +var row=_fb[i]; +row[_fa.idField]=row[_fa.idField]||("foot-row-id"+i); +_fd.push(""); +_fd.push(this.renderRow.call(this,_f7,_fc,_f9,0,row)); +_fd.push(""); +} +_fd.push("
                                                      "); +$(_f8).html(_fd.join("")); +},renderRow:function(_fe,_ff,_100,_101,row){ +var _102=$.data(_fe,"treegrid"); +var opts=_102.options; +var cc=[]; +if(_100&&opts.rownumbers){ +cc.push("
                                                      0
                                                      "); +} +for(var i=0;i<_ff.length;i++){ +var _103=_ff[i]; +var col=$(_fe).datagrid("getColumnOption",_103); +if(col){ +var css=col.styler?(col.styler(row[_103],row)||""):""; +var cs=this.getStyleValue(css); +var cls=cs.c?"class=\""+cs.c+"\"":""; +var _104=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); +cc.push(""); +var _104=""; +if(!col.checkbox){ +if(col.align){ +_104+="text-align:"+col.align+";"; +} +if(!opts.nowrap){ +_104+="white-space:normal;height:auto;"; +}else{ +if(opts.autoRowHeight){ +_104+="height:auto;"; +} +} +} +cc.push("
                                                      "); +if(col.checkbox){ +if(row.checked){ +cc.push(""); +}else{ +var val=null; +if(col.formatter){ +val=col.formatter(row[_103],row); +}else{ +val=row[_103]; +} +if(_103==opts.treeField){ +for(var j=0;j<_101;j++){ +cc.push(""); +} +if(row.state=="closed"){ +cc.push(""); +cc.push(""); +}else{ +if(row.children&&row.children.length){ +cc.push(""); +cc.push(""); +}else{ +cc.push(""); +cc.push(""); +} +} +if(this.hasCheckbox(_fe,row)){ +var flag=0; +var crow=$.easyui.getArrayItem(_102.checkedRows,opts.idField,row[opts.idField]); +if(crow){ +flag=crow.checkState=="checked"?1:2; +row.checkState=crow.checkState; +row.checked=crow.checked; +$.easyui.addArrayItem(_102.checkedRows,opts.idField,row); +}else{ +var prow=$.easyui.getArrayItem(_102.checkedRows,opts.idField,row._parentId); +if(prow&&prow.checkState=="checked"&&opts.cascadeCheck){ +flag=1; +row.checked=true; +$.easyui.addArrayItem(_102.checkedRows,opts.idField,row); +}else{ +if(row.checked){ +$.easyui.addArrayItem(_102.tmpIds,row[opts.idField]); +} +} +row.checkState=flag?"checked":"unchecked"; +} +cc.push(""); +}else{ +row.checkState=undefined; +row.checked=undefined; +} +cc.push(""+val+""); +}else{ +cc.push(val); +} +} +cc.push("
                                                      "); +cc.push(""); +} +} +return cc.join(""); +},hasCheckbox:function(_105,row){ +var opts=$.data(_105,"treegrid").options; +if(opts.checkbox){ +if($.isFunction(opts.checkbox)){ +if(opts.checkbox.call(_105,row)){ +return true; +}else{ +return false; +} +}else{ +if(opts.onlyLeafCheck){ +if(row.state=="open"&&!(row.children&&row.children.length)){ +return true; +} +}else{ +return true; +} +} +} +return false; +},refreshRow:function(_106,id){ +this.updateRow.call(this,_106,id,{}); +},updateRow:function(_107,id,row){ +var opts=$.data(_107,"treegrid").options; +var _108=$(_107).treegrid("find",id); +$.extend(_108,row); +var _109=$(_107).treegrid("getLevel",id)-1; +var _10a=opts.rowStyler?opts.rowStyler.call(_107,_108):""; +var _10b=$.data(_107,"datagrid").rowIdPrefix; +var _10c=_108[opts.idField]; +function _10d(_10e){ +var _10f=$(_107).treegrid("getColumnFields",_10e); +var tr=opts.finder.getTr(_107,id,"body",(_10e?1:2)); +var _110=tr.find("div.datagrid-cell-rownumber").html(); +var _111=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); +tr.html(this.renderRow(_107,_10f,_10e,_109,_108)); +tr.attr("style",_10a||""); +tr.find("div.datagrid-cell-rownumber").html(_110); +if(_111){ +tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); +} +if(_10c!=id){ +tr.attr("id",_10b+"-"+(_10e?1:2)+"-"+_10c); +tr.attr("node-id",_10c); +} +}; +_10d.call(this,true); +_10d.call(this,false); +$(_107).treegrid("fixRowHeight",id); +},deleteRow:function(_112,id){ +var opts=$.data(_112,"treegrid").options; +var tr=opts.finder.getTr(_112,id); +tr.next("tr.treegrid-tr-tree").remove(); +tr.remove(); +var _113=del(id); +if(_113){ +if(_113.children.length==0){ +tr=opts.finder.getTr(_112,_113[opts.idField]); +tr.next("tr.treegrid-tr-tree").remove(); +var cell=tr.children("td[field=\""+opts.treeField+"\"]").children("div.datagrid-cell"); +cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); +cell.find(".tree-hit").remove(); +$("").prependTo(cell); +} +} +this.setEmptyMsg(_112); +function del(id){ +var cc; +var _114=$(_112).treegrid("getParent",id); +if(_114){ +cc=_114.children; +}else{ +cc=$(_112).treegrid("getData"); +} +for(var i=0;ib?1:-1); +}; +r=_11f(r1[sn],r2[sn])*(so=="asc"?1:-1); +if(r!=0){ +return r; +} +} +return r; +}); +for(var i=0;i=_45[0]&&len<=_45[1]; +},message:"Please enter a value between {0} and {1}."},remote:{validator:function(_46,_47){ +var _48={}; +_48[_47[1]]=_46; +var _49=$.ajax({url:_47[0],dataType:"json",data:_48,async:false,cache:false,type:"post"}).responseText; +return _49=="true"; +},message:"Please fix this field."}},onBeforeValidate:function(){ +},onValidate:function(_4a){ +}}; +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/plugins/jquery.window.js b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.window.js new file mode 100755 index 000000000..09e7cde1f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/plugins/jquery.window.js @@ -0,0 +1,311 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2,_3){ +var _4=$.data(_2,"window"); +if(_3){ +if(_3.left!=null){ +_4.options.left=_3.left; +} +if(_3.top!=null){ +_4.options.top=_3.top; +} +} +$(_2).panel("move",_4.options); +if(_4.shadow){ +_4.shadow.css({left:_4.options.left,top:_4.options.top}); +} +}; +function _5(_6,_7){ +var _8=$.data(_6,"window").options; +var pp=$(_6).window("panel"); +var _9=pp._outerWidth(); +if(_8.inline){ +var _a=pp.parent(); +_8.left=Math.ceil((_a.width()-_9)/2+_a.scrollLeft()); +}else{ +_8.left=Math.ceil(($(window)._outerWidth()-_9)/2+$(document).scrollLeft()); +} +if(_7){ +_1(_6); +} +}; +function _b(_c,_d){ +var _e=$.data(_c,"window").options; +var pp=$(_c).window("panel"); +var _f=pp._outerHeight(); +if(_e.inline){ +var _10=pp.parent(); +_e.top=Math.ceil((_10.height()-_f)/2+_10.scrollTop()); +}else{ +_e.top=Math.ceil(($(window)._outerHeight()-_f)/2+$(document).scrollTop()); +} +if(_d){ +_1(_c); +} +}; +function _11(_12){ +var _13=$.data(_12,"window"); +var _14=_13.options; +var win=$(_12).panel($.extend({},_13.options,{border:false,doSize:true,closed:true,cls:"window "+(!_14.border?"window-thinborder window-noborder ":(_14.border=="thin"?"window-thinborder ":""))+(_14.cls||""),headerCls:"window-header "+(_14.headerCls||""),bodyCls:"window-body "+(_14.noheader?"window-body-noheader ":" ")+(_14.bodyCls||""),onBeforeDestroy:function(){ +if(_14.onBeforeDestroy.call(_12)==false){ +return false; +} +if(_13.shadow){ +_13.shadow.remove(); +} +if(_13.mask){ +_13.mask.remove(); +} +},onClose:function(){ +if(_13.shadow){ +_13.shadow.hide(); +} +if(_13.mask){ +_13.mask.hide(); +} +_14.onClose.call(_12); +},onOpen:function(){ +if(_13.mask){ +_13.mask.css($.extend({display:"block",zIndex:$.fn.window.defaults.zIndex++},$.fn.window.getMaskSize(_12))); +} +if(_13.shadow){ +_13.shadow.css({display:"block",zIndex:$.fn.window.defaults.zIndex++,left:_14.left,top:_14.top,width:_13.window._outerWidth(),height:_13.window._outerHeight()}); +} +_13.window.css("z-index",$.fn.window.defaults.zIndex++); +_14.onOpen.call(_12); +},onResize:function(_15,_16){ +var _17=$(this).panel("options"); +$.extend(_14,{width:_17.width,height:_17.height,left:_17.left,top:_17.top}); +if(_13.shadow){ +_13.shadow.css({left:_14.left,top:_14.top,width:_13.window._outerWidth(),height:_13.window._outerHeight()}); +} +_14.onResize.call(_12,_15,_16); +},onMinimize:function(){ +if(_13.shadow){ +_13.shadow.hide(); +} +if(_13.mask){ +_13.mask.hide(); +} +_13.options.onMinimize.call(_12); +},onBeforeCollapse:function(){ +if(_14.onBeforeCollapse.call(_12)==false){ +return false; +} +if(_13.shadow){ +_13.shadow.hide(); +} +},onExpand:function(){ +if(_13.shadow){ +_13.shadow.show(); +} +_14.onExpand.call(_12); +}})); +_13.window=win.panel("panel"); +if(_13.mask){ +_13.mask.remove(); +} +if(_14.modal){ +_13.mask=$("
                                                      ").insertAfter(_13.window); +} +if(_13.shadow){ +_13.shadow.remove(); +} +if(_14.shadow){ +_13.shadow=$("
                                                      ").insertAfter(_13.window); +} +var _18=_14.closed; +if(_14.left==null){ +_5(_12); +} +if(_14.top==null){ +_b(_12); +} +_1(_12); +if(!_18){ +win.window("open"); +} +}; +function _19(_1a,top,_1b,_1c){ +var _1d=this; +var _1e=$.data(_1d,"window"); +var _1f=_1e.options; +if(!_1f.constrain){ +return {}; +} +if($.isFunction(_1f.constrain)){ +return _1f.constrain.call(_1d,_1a,top,_1b,_1c); +} +var win=$(_1d).window("window"); +var _20=_1f.inline?win.parent():$(window); +if(_1a<0){ +_1a=0; +} +if(top<_20.scrollTop()){ +top=_20.scrollTop(); +} +if(_1a+_1b>_20.width()){ +if(_1b==win.outerWidth()){ +_1a=_20.width()-_1b; +}else{ +_1b=_20.width()-_1a; +} +} +if(top-_20.scrollTop()+_1c>_20.height()){ +if(_1c==win.outerHeight()){ +top=_20.height()-_1c+_20.scrollTop(); +}else{ +_1c=_20.height()-top+_20.scrollTop(); +} +} +return {left:_1a,top:top,width:_1b,height:_1c}; +}; +function _21(_22){ +var _23=$.data(_22,"window"); +_23.window.draggable({handle:">div.panel-header>div.panel-title",disabled:_23.options.draggable==false,onBeforeDrag:function(e){ +if(_23.mask){ +_23.mask.css("z-index",$.fn.window.defaults.zIndex++); +} +if(_23.shadow){ +_23.shadow.css("z-index",$.fn.window.defaults.zIndex++); +} +_23.window.css("z-index",$.fn.window.defaults.zIndex++); +},onStartDrag:function(e){ +_24(e); +},onDrag:function(e){ +_25(e); +return false; +},onStopDrag:function(e){ +_26(e,"move"); +}}); +_23.window.resizable({disabled:_23.options.resizable==false,onStartResize:function(e){ +_24(e); +},onResize:function(e){ +_25(e); +return false; +},onStopResize:function(e){ +_26(e,"resize"); +}}); +function _24(e){ +if(_23.pmask){ +_23.pmask.remove(); +} +_23.pmask=$("
                                                      ").insertAfter(_23.window); +_23.pmask.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top,width:_23.window._outerWidth(),height:_23.window._outerHeight()}); +if(_23.proxy){ +_23.proxy.remove(); +} +_23.proxy=$("
                                                      ").insertAfter(_23.window); +_23.proxy.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top}); +_23.proxy._outerWidth(e.data.width)._outerHeight(e.data.height); +_23.proxy.hide(); +setTimeout(function(){ +if(_23.pmask){ +_23.pmask.show(); +} +if(_23.proxy){ +_23.proxy.show(); +} +},500); +}; +function _25(e){ +$.extend(e.data,_19.call(_22,e.data.left,e.data.top,e.data.width,e.data.height)); +_23.pmask.show(); +_23.proxy.css({display:"block",left:e.data.left,top:e.data.top}); +_23.proxy._outerWidth(e.data.width); +_23.proxy._outerHeight(e.data.height); +}; +function _26(e,_27){ +$.extend(e.data,_19.call(_22,e.data.left,e.data.top,e.data.width+0.1,e.data.height+0.1)); +$(_22).window(_27,e.data); +_23.pmask.remove(); +_23.pmask=null; +_23.proxy.remove(); +_23.proxy=null; +}; +}; +$(function(){ +if(!$._positionFixed){ +$(window).resize(function(){ +$("body>div.window-mask:visible").css({width:"",height:""}); +setTimeout(function(){ +$("body>div.window-mask:visible").css($.fn.window.getMaskSize()); +},50); +}); +} +}); +$.fn.window=function(_28,_29){ +if(typeof _28=="string"){ +var _2a=$.fn.window.methods[_28]; +if(_2a){ +return _2a(this,_29); +}else{ +return this.panel(_28,_29); +} +} +_28=_28||{}; +return this.each(function(){ +var _2b=$.data(this,"window"); +if(_2b){ +$.extend(_2b.options,_28); +}else{ +_2b=$.data(this,"window",{options:$.extend({},$.fn.window.defaults,$.fn.window.parseOptions(this),_28)}); +if(!_2b.options.inline){ +document.body.appendChild(this); +} +} +_11(this); +_21(this); +}); +}; +$.fn.window.methods={options:function(jq){ +var _2c=jq.panel("options"); +var _2d=$.data(jq[0],"window").options; +return $.extend(_2d,{closed:_2c.closed,collapsed:_2c.collapsed,minimized:_2c.minimized,maximized:_2c.maximized}); +},window:function(jq){ +return $.data(jq[0],"window").window; +},move:function(jq,_2e){ +return jq.each(function(){ +_1(this,_2e); +}); +},hcenter:function(jq){ +return jq.each(function(){ +_5(this,true); +}); +},vcenter:function(jq){ +return jq.each(function(){ +_b(this,true); +}); +},center:function(jq){ +return jq.each(function(){ +_5(this); +_b(this); +_1(this); +}); +}}; +$.fn.window.getMaskSize=function(_2f){ +var _30=$(_2f).data("window"); +if(_30&&_30.options.inline){ +return {}; +}else{ +if($._positionFixed){ +return {position:"fixed"}; +}else{ +return {width:$(document).width(),height:$(document).height()}; +} +} +}; +$.fn.window.parseOptions=function(_31){ +return $.extend({},$.fn.panel.parseOptions(_31),$.parser.parseOptions(_31,[{draggable:"boolean",resizable:"boolean",shadow:"boolean",modal:"boolean",inline:"boolean"}])); +}; +$.fn.window.defaults=$.extend({},$.fn.panel.defaults,{zIndex:9000,draggable:true,resizable:true,shadow:true,modal:false,border:true,inline:false,title:"New Window",collapsible:true,minimizable:true,maximizable:true,closable:true,closed:false,constrain:false}); +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/readme.txt b/testapps/GHIssues/src/main/resources/asset/readme.txt new file mode 100755 index 000000000..2088b75c4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/readme.txt @@ -0,0 +1,4 @@ +Current Version: 1.5.5.5 +======================== +This software is allowed to use under freeware license or you need to buy commercial license for better support or other purpose. +Please contact us at info@jeasyui.com diff --git a/testapps/GHIssues/src/main/resources/asset/src/easyloader.js b/testapps/GHIssues/src/main/resources/asset/src/easyloader.js new file mode 100644 index 000000000..38d53844c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/easyloader.js @@ -0,0 +1,439 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * easyloader - EasyUI for jQuery + * + */ +(function(){ + var modules = { + draggable:{ + js:'jquery.draggable.js' + }, + droppable:{ + js:'jquery.droppable.js' + }, + resizable:{ + js:'jquery.resizable.js' + }, + linkbutton:{ + js:'jquery.linkbutton.js', + css:'linkbutton.css' + }, + progressbar:{ + js:'jquery.progressbar.js', + css:'progressbar.css' + }, + tooltip:{ + js:'jquery.tooltip.js', + css:'tooltip.css' + }, + pagination:{ + js:'jquery.pagination.js', + css:'pagination.css', + dependencies:['linkbutton'] + }, + datagrid:{ + js:'jquery.datagrid.js', + css:'datagrid.css', + dependencies:['panel','resizable','linkbutton','pagination'] + }, + treegrid:{ + js:'jquery.treegrid.js', + css:'tree.css', + dependencies:['datagrid'] + }, + propertygrid:{ + js:'jquery.propertygrid.js', + css:'propertygrid.css', + dependencies:['datagrid'] + }, + datalist:{ + js:'jquery.datalist.js', + css:'datalist.css', + dependencies:['datagrid'] + }, + panel: { + js:'jquery.panel.js', + css:'panel.css' + }, + window:{ + js:'jquery.window.js', + css:'window.css', + dependencies:['resizable','draggable','panel'] + }, + dialog:{ + js:'jquery.dialog.js', + css:'dialog.css', + dependencies:['linkbutton','window'] + }, + messager:{ + js:'jquery.messager.js', + css:'messager.css', + dependencies:['linkbutton','dialog','progressbar'] + }, + layout:{ + js:'jquery.layout.js', + css:'layout.css', + dependencies:['resizable','panel'] + }, + form:{ + js:'jquery.form.js' + }, + menu:{ + js:'jquery.menu.js', + css:'menu.css' + }, + tabs:{ + js:'jquery.tabs.js', + css:'tabs.css', + dependencies:['panel','linkbutton'] + }, + menubutton:{ + js:'jquery.menubutton.js', + css:'menubutton.css', + dependencies:['linkbutton','menu'] + }, + splitbutton:{ + js:'jquery.splitbutton.js', + css:'splitbutton.css', + dependencies:['menubutton'] + }, + switchbutton:{ + js:'jquery.switchbutton.js', + css:'switchbutton.css' + }, + accordion:{ + js:'jquery.accordion.js', + css:'accordion.css', + dependencies:['panel'] + }, + calendar:{ + js:'jquery.calendar.js', + css:'calendar.css' + }, + textbox:{ + js:'jquery.textbox.js', + css:'textbox.css', + dependencies:['validatebox','linkbutton'] + }, + passwordbox:{ + js:'jquery.passwordbox.js', + css:'passwordbox.css', + dependencies:['textbox'] + }, + filebox:{ + js:'jquery.filebox.js', + css:'filebox.css', + dependencies:['textbox'] + }, + combo:{ + js:'jquery.combo.js', + css:'combo.css', + dependencies:['panel','textbox'] + }, + combobox:{ + js:'jquery.combobox.js', + css:'combobox.css', + dependencies:['combo'] + }, + combotree:{ + js:'jquery.combotree.js', + dependencies:['combo','tree'] + }, + combogrid:{ + js:'jquery.combogrid.js', + dependencies:['combo','datagrid'] + }, + combotreegrid:{ + js:'jquery.combotreegrid.js', + dependencies:['combo','treegrid'] + }, + tagbox:{ + js:'jquery.tagbox.js', + dependencies:['combobox'] + }, + validatebox:{ + js:'jquery.validatebox.js', + css:'validatebox.css', + dependencies:['tooltip'] + }, + numberbox:{ + js:'jquery.numberbox.js', + dependencies:['textbox'] + }, + searchbox:{ + js:'jquery.searchbox.js', + css:'searchbox.css', + dependencies:['menubutton','textbox'] + }, + spinner:{ + js:'jquery.spinner.js', + css:'spinner.css', + dependencies:['textbox'] + }, + numberspinner:{ + js:'jquery.numberspinner.js', + dependencies:['spinner','numberbox'] + }, + timespinner:{ + js:'jquery.timespinner.js', + dependencies:['spinner'] + }, + tree:{ + js:'jquery.tree.js', + css:'tree.css', + dependencies:['draggable','droppable'] + }, + datebox:{ + js:'jquery.datebox.js', + css:'datebox.css', + dependencies:['calendar','combo'] + }, + datetimebox:{ + js:'jquery.datetimebox.js', + dependencies:['datebox','timespinner'] + }, + slider:{ + js:'jquery.slider.js', + dependencies:['draggable'] + }, + parser:{ + js:'jquery.parser.js' + }, + mobile:{ + js:'jquery.mobile.js' + } + }; + + var locales = { + 'af':'easyui-lang-af.js', + 'ar':'easyui-lang-ar.js', + 'bg':'easyui-lang-bg.js', + 'ca':'easyui-lang-ca.js', + 'cs':'easyui-lang-cs.js', + 'cz':'easyui-lang-cz.js', + 'da':'easyui-lang-da.js', + 'de':'easyui-lang-de.js', + 'el':'easyui-lang-el.js', + 'en':'easyui-lang-en.js', + 'es':'easyui-lang-es.js', + 'fr':'easyui-lang-fr.js', + 'it':'easyui-lang-it.js', + 'jp':'easyui-lang-jp.js', + 'nl':'easyui-lang-nl.js', + 'pl':'easyui-lang-pl.js', + 'pt_BR':'easyui-lang-pt_BR.js', + 'ru':'easyui-lang-ru.js', + 'sv_SE':'easyui-lang-sv_SE.js', + 'tr':'easyui-lang-tr.js', + 'zh_CN':'easyui-lang-zh_CN.js', + 'zh_TW':'easyui-lang-zh_TW.js' + }; + + var queues = {}; + + function loadJs(url, callback){ + var done = false; + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.language = 'javascript'; + script.src = url; + script.onload = script.onreadystatechange = function(){ + if (!done && (!script.readyState || script.readyState == 'loaded' || script.readyState == 'complete')){ + done = true; + script.onload = script.onreadystatechange = null; + if (callback){ + callback.call(script); + } + } + } + document.getElementsByTagName("head")[0].appendChild(script); + } + + function runJs(url, callback){ + loadJs(url, function(){ + document.getElementsByTagName("head")[0].removeChild(this); + if (callback){ + callback(); + } + }); + } + + function loadCss(url, callback){ + var link = document.createElement('link'); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.media = 'screen'; + link.href = url; + document.getElementsByTagName('head')[0].appendChild(link); + if (callback){ + callback.call(link); + } + } + + function loadSingle(name, callback){ + queues[name] = 'loading'; + + var module = modules[name]; + var jsStatus = 'loading'; + var cssStatus = (easyloader.css && module['css']) ? 'loading' : 'loaded'; + + if (easyloader.css && module['css']){ + if (/^http/i.test(module['css'])){ + var url = module['css']; + } else { + var url = easyloader.base + 'themes/' + easyloader.theme + '/' + module['css']; + } + loadCss(url, function(){ + cssStatus = 'loaded'; + if (jsStatus == 'loaded' && cssStatus == 'loaded'){ + finish(); + } + }); + } + + if (/^http/i.test(module['js'])){ + var url = module['js']; + } else { + var url = easyloader.base + 'plugins/' + module['js']; + } + loadJs(url, function(){ + jsStatus = 'loaded'; + if (jsStatus == 'loaded' && cssStatus == 'loaded'){ + finish(); + } + }); + + function finish(){ + queues[name] = 'loaded'; + easyloader.onProgress(name); + if (callback){ + callback(); + } + } + } + + function loadModule(name, callback){ + var mm = []; + var doLoad = false; + + if (typeof name == 'string'){ + add(name); + } else { + for(var i=0; i.panel>.accordion-header'); + // if (headers.length){ + // headerHeight = $(headers[0]).css('height', '')._outerHeight(); + // } + // if (!isNaN(parseInt(opts.height))){ + // bodyHeight = cc.height() - headerHeight*headers.length; + // } + + // _resize(true, bodyHeight - _resize(false) + 1); + + // function _resize(collapsible, height){ + // var totalHeight = 0; + // for(var i=0; i.panel>.accordion-header'); + if (headers.length){ + if (isHorizontal){ + $(panels[0]).panel('resize', {width:cc.width(),height:cc.height()}); + headerHeight = $(headers[0])._outerWidth(); + } else { + headerHeight = $(headers[0]).css('height', '')._outerHeight(); + } + } + if (!isNaN(parseInt(opts.height))){ + if (isHorizontal){ + bodyHeight = cc.width() - headerHeight*headers.length; + } else { + bodyHeight = cc.height() - headerHeight*headers.length; + } + } + + // _resize(true, bodyHeight - _resize(false) + 1); + _resize(true, bodyHeight - _resize(false)); + + function _resize(collapsible, height){ + var totalHeight = 0; + for(var i=0; i= panels.length){ + return null; + } else { + return panels[which]; + } + } + return findBy(container, 'title', which); + } + + function setProperties(container){ + var opts = $.data(container, 'accordion').options; + var cc = $(container); + if (opts.border){ + cc.removeClass('accordion-noborder'); + } else { + cc.addClass('accordion-noborder'); + } + } + + function init(container){ + var state = $.data(container, 'accordion'); + var cc = $(container); + cc.addClass('accordion'); + + state.panels = []; + cc.children('div').each(function(){ + var opts = $.extend({}, $.parser.parseOptions(this), { + selected: ($(this).attr('selected') ? true : undefined) + }); + var pp = $(this); + state.panels.push(pp); + createPanel(container, pp, opts); + }); + + cc.bind('_resize', function(e,force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(container); + } + return false; + }); + } + + function createPanel(container, pp, options){ + var opts = $.data(container, 'accordion').options; + pp.panel($.extend({}, { + collapsible: true, + minimizable: false, + maximizable: false, + closable: false, + doSize: false, + collapsed: true, + headerCls: 'accordion-header', + bodyCls: 'accordion-body', + halign: opts.halign + }, options, { + onBeforeExpand: function(){ + if (options.onBeforeExpand){ + if (options.onBeforeExpand.call(this) == false){return false} + } + if (!opts.multiple){ + // get all selected panel + var all = $.grep(getSelections(container), function(p){ + return p.panel('options').collapsible; + }); + for(var i=0; i.panel-last>.accordion-header').removeClass('accordion-header-border'); + if (options.onExpand){options.onExpand.call(this)} + opts.onSelect.call(container, $(this).panel('options').title, getPanelIndex(container, this)); + }, + onBeforeCollapse: function(){ + if (options.onBeforeCollapse){ + if (options.onBeforeCollapse.call(this) == false){return false} + } + $(container).find('>.panel-last>.accordion-header').addClass('accordion-header-border'); + var header = $(this).panel('header'); + header.removeClass('accordion-header-selected'); + header.find('.accordion-collapse').addClass('accordion-expand'); + }, + onCollapse: function(){ + if (isNaN(parseInt(opts.height))){ + $(container).find('>.panel-last>.accordion-header').removeClass('accordion-header-border'); + } + if (options.onCollapse){options.onCollapse.call(this)} + opts.onUnselect.call(container, $(this).panel('options').title, getPanelIndex(container, this)); + } + })); + + var header = pp.panel('header'); + var tool = header.children('div.panel-tool'); + tool.children('a.panel-tool-collapse').hide(); // hide the old collapse button + var t = $('').addClass('accordion-collapse accordion-expand').appendTo(tool); + t.bind('click', function(){ + togglePanel(pp); + return false; + }); + pp.panel('options').collapsible ? t.show() : t.hide(); + if (opts.halign=='left' || opts.halign=='right'){ + t.hide(); + } + + header.click(function(){ + togglePanel(pp); + return false; + }); + + function togglePanel(p){ + var popts = p.panel('options'); + if (popts.collapsible){ + var index = getPanelIndex(container, p); + if (popts.collapsed){ + select(container, index); + } else { + unselect(container, index); + } + } + } + } + + /** + * select and set the specified panel active + */ + function select(container, which){ + var p = getPanel(container, which); + if (!p){return} + stopAnimate(container); + var opts = $.data(container, 'accordion').options; + p.panel('expand', opts.animate); + } + + function unselect(container, which){ + var p = getPanel(container, which); + if (!p){return} + stopAnimate(container); + var opts = $.data(container, 'accordion').options; + p.panel('collapse', opts.animate); + } + + function doFirstSelect(container){ + var opts = $.data(container, 'accordion').options; + $(container).find('>.panel-last>.accordion-header').addClass('accordion-header-border'); + + var p = findBy(container, 'selected', true); + if (p){ + _select(getPanelIndex(container, p)); + } else { + _select(opts.selected); + } + + function _select(index){ + var animate = opts.animate; + opts.animate = false; + select(container, index); + opts.animate = animate; + } + } + + /** + * stop the animation of all panels + */ + function stopAnimate(container){ + var panels = $.data(container, 'accordion').panels; + for(var i=0; i').appendTo(container); + panels.push(pp); + createPanel(container, pp, options); + setSize(container); + + opts.onAdd.call(container, options.title, panels.length-1); + + if (options.selected){ + select(container, panels.length-1); + } + } + + function remove(container, which){ + var state = $.data(container, 'accordion'); + var opts = state.options; + var panels = state.panels; + + stopAnimate(container); + + var panel = getPanel(container, which); + var title = panel.panel('options').title; + var index = getPanelIndex(container, panel); + + if (!panel){return} + if (opts.onBeforeRemove.call(container, title, index) == false){return} + + panels.splice(index, 1); + panel.panel('destroy'); + if (panels.length){ + setSize(container); + var curr = getSelected(container); + if (!curr){ + select(container, 0); + } + } + + opts.onRemove.call(container, title, index); + } + + $.fn.accordion = function(options, param){ + if (typeof options == 'string'){ + return $.fn.accordion.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'accordion'); + if (state){ + $.extend(state.options, options); + } else { + $.data(this, 'accordion', { + options: $.extend({}, $.fn.accordion.defaults, $.fn.accordion.parseOptions(this), options), + accordion: $(this).addClass('accordion'), + panels: [] + }); + init(this); + } + + setProperties(this); + setSize(this); + doFirstSelect(this); + }); + }; + + $.fn.accordion.methods = { + options: function(jq){ + return $.data(jq[0], 'accordion').options; + }, + panels: function(jq){ + return $.data(jq[0], 'accordion').panels; + }, + resize: function(jq, param){ + return jq.each(function(){ + setSize(this, param); + }); + }, + getSelections: function(jq){ + return getSelections(jq[0]); + }, + getSelected: function(jq){ + return getSelected(jq[0]); + }, + getPanel: function(jq, which){ + return getPanel(jq[0], which); + }, + getPanelIndex: function(jq, panel){ + return getPanelIndex(jq[0], panel); + }, + select: function(jq, which){ + return jq.each(function(){ + select(this, which); + }); + }, + unselect: function(jq, which){ + return jq.each(function(){ + unselect(this, which); + }); + }, + add: function(jq, options){ + return jq.each(function(){ + add(this, options); + }); + }, + remove: function(jq, which){ + return jq.each(function(){ + remove(this, which); + }); + } + }; + + $.fn.accordion.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, [ + 'width','height','halign', + {fit:'boolean',border:'boolean',animate:'boolean',multiple:'boolean',selected:'number'} + ])); + }; + + $.fn.accordion.defaults = { + width: 'auto', + height: 'auto', + fit: false, + border: true, + animate: true, + multiple: false, + selected: 0, + halign: 'top', // the header alignment: 'top','left','right' + + onSelect: function(title, index){}, + onUnselect: function(title, index){}, + onAdd: function(title, index){}, + onBeforeRemove: function(title, index){}, + onRemove: function(title, index){} + }; +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.calendar.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.calendar.js new file mode 100644 index 000000000..ab40eaa49 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.calendar.js @@ -0,0 +1,455 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * calendar - EasyUI for jQuery + * + */ +(function($){ + + function setSize(target, param){ + var opts = $.data(target, 'calendar').options; + var t = $(target); + if (param){ + $.extend(opts, { + width: param.width, + height: param.height + }); + } + t._size(opts, t.parent()); + t.find('.calendar-body')._outerHeight(t.height() - t.find('.calendar-header')._outerHeight()); + if (t.find('.calendar-menu').is(':visible')){ + showSelectMenus(target); + } + } + + function init(target){ + $(target).addClass('calendar').html( + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '' + + '' + + '' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + ); + + + $(target).bind('_resize', function(e,force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(target); + } + return false; + }); + } + + function bindEvents(target){ + var opts = $.data(target, 'calendar').options; + var menu = $(target).find('.calendar-menu'); + menu.find('.calendar-menu-year').unbind('.calendar').bind('keypress.calendar', function(e){ + if (e.keyCode == 13){ + setDate(true); + } + }); + $(target).unbind('.calendar').bind('mouseover.calendar', function(e){ + var t = toTarget(e.target); + if (t.hasClass('calendar-nav') || t.hasClass('calendar-text') || (t.hasClass('calendar-day') && !t.hasClass('calendar-disabled'))){ + t.addClass('calendar-nav-hover'); + } + }).bind('mouseout.calendar', function(e){ + var t = toTarget(e.target); + if (t.hasClass('calendar-nav') || t.hasClass('calendar-text') || (t.hasClass('calendar-day') && !t.hasClass('calendar-disabled'))){ + t.removeClass('calendar-nav-hover'); + } + }).bind('click.calendar', function(e){ + var t = toTarget(e.target); + if (t.hasClass('calendar-menu-next') || t.hasClass('calendar-nextyear')){ + showYear(1); + } else if (t.hasClass('calendar-menu-prev') || t.hasClass('calendar-prevyear')){ + showYear(-1); + } else if (t.hasClass('calendar-menu-month')){ + menu.find('.calendar-selected').removeClass('calendar-selected'); + t.addClass('calendar-selected'); + setDate(true); + } else if (t.hasClass('calendar-prevmonth')){ + showMonth(-1); + } else if (t.hasClass('calendar-nextmonth')){ + showMonth(1); + } else if (t.hasClass('calendar-text')){ + if (menu.is(':visible')){ + menu.hide(); + } else { + showSelectMenus(target); + } + } else if (t.hasClass('calendar-day')){ + if (t.hasClass('calendar-disabled')){return} + var oldValue = opts.current; + t.closest('div.calendar-body').find('.calendar-selected').removeClass('calendar-selected'); + t.addClass('calendar-selected'); + var parts = t.attr('abbr').split(','); + var y = parseInt(parts[0]); + var m = parseInt(parts[1]); + var d = parseInt(parts[2]); + opts.current = new Date(y, m-1, d); + opts.onSelect.call(target, opts.current); + if (!oldValue || oldValue.getTime() != opts.current.getTime()){ + opts.onChange.call(target, opts.current, oldValue); + } + if (opts.year != y || opts.month != m){ + opts.year = y; + opts.month = m; + show(target); + } + } + }); + function toTarget(t){ + var day = $(t).closest('.calendar-day'); + if (day.length){ + return day; + } else { + return $(t); + } + } + function setDate(hideMenu){ + var menu = $(target).find('.calendar-menu'); + var year = menu.find('.calendar-menu-year').val(); + var month = menu.find('.calendar-selected').attr('abbr'); + if (!isNaN(year)){ + opts.year = parseInt(year); + opts.month = parseInt(month); + show(target); + } + if (hideMenu){menu.hide()} + } + function showYear(delta){ + opts.year += delta; + show(target); + menu.find('.calendar-menu-year').val(opts.year); + } + function showMonth(delta){ + opts.month += delta; + if (opts.month > 12){ + opts.year++; + opts.month = 1; + } else if (opts.month < 1){ + opts.year--; + opts.month = 12; + } + show(target); + + menu.find('td.calendar-selected').removeClass('calendar-selected'); + menu.find('td:eq(' + (opts.month-1) + ')').addClass('calendar-selected'); + } + } + + /** + * show the select menu that can change year or month, if the menu is not be created then create it. + */ + function showSelectMenus(target){ + var opts = $.data(target, 'calendar').options; + $(target).find('.calendar-menu').show(); + + if ($(target).find('.calendar-menu-month-inner').is(':empty')){ + $(target).find('.calendar-menu-month-inner').empty(); + var t = $('
                                                      ').appendTo($(target).find('.calendar-menu-month-inner')); + var idx = 0; + for(var i=0; i<3; i++){ + var tr = $('').appendTo(t); + for(var j=0; j<4; j++){ + $('').html(opts.months[idx++]).attr('abbr',idx).appendTo(tr); + } + } + } + + var body = $(target).find('.calendar-body'); + var sele = $(target).find('.calendar-menu'); + var seleYear = sele.find('.calendar-menu-year-inner'); + var seleMonth = sele.find('.calendar-menu-month-inner'); + + seleYear.find('input').val(opts.year).focus(); + seleMonth.find('td.calendar-selected').removeClass('calendar-selected'); + seleMonth.find('td:eq('+(opts.month-1)+')').addClass('calendar-selected'); + + sele._outerWidth(body._outerWidth()); + sele._outerHeight(body._outerHeight()); + seleMonth._outerHeight(sele.height() - seleYear._outerHeight()); + } + + /** + * get weeks data. + */ + function getWeeks(target, year, month){ + var opts = $.data(target, 'calendar').options; + var dates = []; + var lastDay = new Date(year, month, 0).getDate(); + for(var i=1; i<=lastDay; i++) dates.push([year,month,i]); + + // group date by week + var weeks = [], week = []; + var memoDay = -1; + while(dates.length > 0){ + var date = dates.shift(); + week.push(date); + var day = new Date(date[0],date[1]-1,date[2]).getDay(); + if (memoDay == day){ + day = 0; + } else if (day == (opts.firstDay==0 ? 7 : opts.firstDay) - 1){ + weeks.push(week); + week = []; + } + memoDay = day; + } + if (week.length){ + weeks.push(week); + } + + var firstWeek = weeks[0]; + if (firstWeek.length < 7){ + while(firstWeek.length < 7){ + var firstDate = firstWeek[0]; + var date = new Date(firstDate[0],firstDate[1]-1,firstDate[2]-1) + firstWeek.unshift([date.getFullYear(), date.getMonth()+1, date.getDate()]); + } + } else { + var firstDate = firstWeek[0]; + var week = []; + for(var i=1; i<=7; i++){ + var date = new Date(firstDate[0], firstDate[1]-1, firstDate[2]-i); + week.unshift([date.getFullYear(), date.getMonth()+1, date.getDate()]); + } + weeks.unshift(week); + } + + var lastWeek = weeks[weeks.length-1]; + while(lastWeek.length < 7){ + var lastDate = lastWeek[lastWeek.length-1]; + var date = new Date(lastDate[0], lastDate[1]-1, lastDate[2]+1); + lastWeek.push([date.getFullYear(), date.getMonth()+1, date.getDate()]); + } + if (weeks.length < 6){ + var lastDate = lastWeek[lastWeek.length-1]; + var week = []; + for(var i=1; i<=7; i++){ + var date = new Date(lastDate[0], lastDate[1]-1, lastDate[2]+i); + week.push([date.getFullYear(), date.getMonth()+1, date.getDate()]); + } + weeks.push(week); + } + + return weeks; + } + + /** + * show the calendar day. + */ + function show(target){ + var opts = $.data(target, 'calendar').options; + if (opts.current && !opts.validator.call(target, opts.current)){ + opts.current = null; + } + + var now = new Date(); + var todayInfo = now.getFullYear()+','+(now.getMonth()+1)+','+now.getDate(); + var currentInfo = opts.current ? (opts.current.getFullYear()+','+(opts.current.getMonth()+1)+','+opts.current.getDate()) : ''; + // calulate the saturday and sunday index + var saIndex = 6 - opts.firstDay; + var suIndex = saIndex + 1; + if (saIndex >= 7) saIndex -= 7; + if (suIndex >= 7) suIndex -= 7; + + $(target).find('.calendar-title span').html(opts.months[opts.month-1] + ' ' + opts.year); + + var body = $(target).find('div.calendar-body'); + body.children('table').remove(); + + var data = ['']; + data.push(''); + if (opts.showWeek){ + data.push(''); + } + for(var i=opts.firstDay; i'+opts.weeks[i]+''); + } + for(var i=0; i'+opts.weeks[i]+''); + } + data.push(''); + + data.push(''); + var weeks = getWeeks(target, opts.year, opts.month); + for(var i=0; i'); + if (opts.showWeek){ + var weekNumber = opts.getWeekNumber(new Date(week[0][0], parseInt(week[0][1])-1, week[0][2])); + data.push(''); + } + for(var j=0; j' + d + ''); + } + data.push(''); + } + data.push(''); + data.push('
                                                      '+opts.weekNumberHeader+'
                                                      '+weekNumber+'
                                                      '); + + body.append(data.join('')); + body.children('table.calendar-dtable').prependTo(body); + + opts.onNavigate.call(target, opts.year, opts.month); + } + + $.fn.calendar = function(options, param){ + if (typeof options == 'string'){ + return $.fn.calendar.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'calendar'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'calendar', { + options:$.extend({}, $.fn.calendar.defaults, $.fn.calendar.parseOptions(this), options) + }); + init(this); + } + if (state.options.border == false){ + $(this).addClass('calendar-noborder'); + } + setSize(this); + bindEvents(this); + show(this); + $(this).find('div.calendar-menu').hide(); // hide the calendar menu + }); + }; + + $.fn.calendar.methods = { + options: function(jq){ + return $.data(jq[0], 'calendar').options; + }, + resize: function(jq, param){ + return jq.each(function(){ + setSize(this, param); + }); + }, + moveTo: function(jq, date){ + return jq.each(function(){ + if (!date){ + var now = new Date(); + $(this).calendar({ + year: now.getFullYear(), + month: now.getMonth()+1, + current: date + }); + return; + } + var opts = $(this).calendar('options'); + if (opts.validator.call(this, date)){ + var oldValue = opts.current; + $(this).calendar({ + year: date.getFullYear(), + month: date.getMonth()+1, + current: date + }); + if (!oldValue || oldValue.getTime() != date.getTime()){ + opts.onChange.call(this, opts.current, oldValue); + } + } + }); + } + }; + + $.fn.calendar.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, [ + 'weekNumberHeader',{firstDay:'number',fit:'boolean',border:'boolean',showWeek:'boolean'} + ])); + }; + + $.fn.calendar.defaults = { + width:180, + height:180, + fit:false, + border:true, + showWeek:false, + firstDay:0, + weeks:['S','M','T','W','T','F','S'], + months:['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + year:new Date().getFullYear(), + month:new Date().getMonth()+1, + current:(function(){ + var d = new Date(); + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + })(), + weekNumberHeader:'', + getWeekNumber: function(date){ + var checkDate = new Date(date.getTime()); + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + var time = checkDate.getTime(); + checkDate.setMonth(0); + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + formatter:function(date){return date.getDate()}, + styler:function(date){return ''}, + validator:function(date){return true}, + + onSelect: function(date){}, + onChange: function(newDate, oldDate){}, + onNavigate: function(year, month){} + }; +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.combobox.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.combobox.js new file mode 100644 index 000000000..fda617698 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.combobox.js @@ -0,0 +1,742 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * combobox - EasyUI for jQuery + * + * Dependencies: + * combo + * + */ +(function($){ + function getRowIndex(target, value){ + var state = $.data(target, 'combobox'); + return $.easyui.indexOfArray(state.data, state.options.valueField, value); + } + + /** + * scroll panel to display the specified item + */ + function scrollTo(target, value){ + var opts = $.data(target, 'combobox').options; + var panel = $(target).combo('panel'); + var item = opts.finder.getEl(target, value); + if (item.length){ + if (item.position().top <= 0){ + var h = panel.scrollTop() + item.position().top; + panel.scrollTop(h); + } else if (item.position().top + item.outerHeight() > panel.height()){ + var h = panel.scrollTop() + item.position().top + item.outerHeight() - panel.height(); + panel.scrollTop(h); + } + } + panel.triggerHandler('scroll'); // trigger the group sticking + } + + function nav(target, dir){ + var opts = $.data(target, 'combobox').options; + var panel = $(target).combobox('panel'); + var item = panel.children('div.combobox-item-hover'); + if (!item.length){ + item = panel.children('div.combobox-item-selected'); + } + item.removeClass('combobox-item-hover'); + var firstSelector = 'div.combobox-item:visible:not(.combobox-item-disabled):first'; + var lastSelector = 'div.combobox-item:visible:not(.combobox-item-disabled):last'; + if (!item.length){ + item = panel.children(dir=='next' ? firstSelector : lastSelector); + } else { + if (dir == 'next'){ + item = item.nextAll(firstSelector); + if (!item.length){ + item = panel.children(firstSelector); + } + } else { + item = item.prevAll(firstSelector); + if (!item.length){ + item = panel.children(lastSelector); + } + } + } + if (item.length){ + item.addClass('combobox-item-hover'); + var row = opts.finder.getRow(target, item); + if (row){ + $(target).combobox('scrollTo', row[opts.valueField]); + if (opts.selectOnNavigation){ + select(target, row[opts.valueField]); + } + } + } + } + + /** + * select the specified value + */ + function select(target, value, remainText){ + var opts = $.data(target, 'combobox').options; + var values = $(target).combo('getValues'); + if ($.inArray(value+'', values) == -1){ + if (opts.multiple){ + values.push(value); + } else { + values = [value]; + } + setValues(target, values, remainText); + } + } + + /** + * unselect the specified value + */ + function unselect(target, value){ + var opts = $.data(target, 'combobox').options; + var values = $(target).combo('getValues'); + var index = $.inArray(value+'', values); + if (index >= 0){ + values.splice(index, 1); + setValues(target, values); + } + } + + /** + * set values + */ + function setValues(target, values, remainText){ + var opts = $.data(target, 'combobox').options; + var panel = $(target).combo('panel'); + + if (!$.isArray(values)){ + values = values.split(opts.separator); + } + if (!opts.multiple){ + values = values.length ? [values[0]] : ['']; + } + + // unselect the old rows + var oldValues = $(target).combo('getValues'); + if (panel.is(':visible')){ + panel.find('.combobox-item-selected').each(function(){ + var row = opts.finder.getRow(target, $(this)); + if (row){ + if ($.easyui.indexOfArray(oldValues, row[opts.valueField]) == -1){ + $(this).removeClass('combobox-item-selected'); + } + } + }); + } + $.map(oldValues, function(v){ + if ($.easyui.indexOfArray(values, v) == -1){ + var el = opts.finder.getEl(target, v); + if (el.hasClass('combobox-item-selected')){ + el.removeClass('combobox-item-selected'); + opts.onUnselect.call(target, opts.finder.getRow(target, v)); + } + } + }); + + var theRow = null; + var vv = [], ss = []; + for(var i=0; i= 0){ + vv.push(v); + } + }); + t.combobox('setValues', vv); + if (!opts.multiple){ + t.combobox('hidePanel'); + } + } + + /** + * create the component + */ + function create(target){ + var state = $.data(target, 'combobox'); + var opts = state.options; + + $(target).addClass('combobox-f'); + $(target).combo($.extend({}, opts, { + onShowPanel: function(){ + $(this).combo('panel').find('div.combobox-item:hidden,div.combobox-group:hidden').show(); + setValues(this, $(this).combobox('getValues'), true); + $(this).combobox('scrollTo', $(this).combobox('getValue')); + opts.onShowPanel.call(this); + } + })); + + // var p = $(target).combo('panel'); + // p.unbind('.combobox'); + // for(var event in opts.panelEvents){ + // p.bind(event+'.combobox', {target:target}, opts.panelEvents[event]); + // } + } + + function mouseoverHandler(e){ + $(this).children('div.combobox-item-hover').removeClass('combobox-item-hover'); + var item = $(e.target).closest('div.combobox-item'); + if (!item.hasClass('combobox-item-disabled')){ + item.addClass('combobox-item-hover'); + } + e.stopPropagation(); + } + function mouseoutHandler(e){ + $(e.target).closest('div.combobox-item').removeClass('combobox-item-hover'); + e.stopPropagation(); + } + function clickHandler(e){ + var target = $(this).panel('options').comboTarget; + if (!target){return;} + var opts = $(target).combobox('options'); + var item = $(e.target).closest('div.combobox-item'); + if (!item.length || item.hasClass('combobox-item-disabled')){return} + var row = opts.finder.getRow(target, item); + if (!row){return;} + if (opts.blurTimer){ + clearTimeout(opts.blurTimer); + opts.blurTimer = null; + } + opts.onClick.call(target, row); + var value = row[opts.valueField]; + if (opts.multiple){ + if (item.hasClass('combobox-item-selected')){ + unselect(target, value); + } else { + select(target, value); + } + } else { + $(target).combobox('setValue', value).combobox('hidePanel'); + } + e.stopPropagation(); + } + function scrollHandler(e){ + var target = $(this).panel('options').comboTarget; + if (!target){return;} + var opts = $(target).combobox('options'); + if (opts.groupPosition == 'sticky'){ + var stick = $(this).children('.combobox-stick'); + if (!stick.length){ + stick = $('
                                                      ').appendTo(this); + } + stick.hide(); + var state = $(target).data('combobox'); + $(this).children('.combobox-group:visible').each(function(){ + var g = $(this); + var groupData = opts.finder.getGroup(target, g); + var rowData = state.data[groupData.startIndex + groupData.count - 1]; + var last = opts.finder.getEl(target, rowData[opts.valueField]); + if (g.position().top < 0 && last.position().top > 0){ + stick.show().html(g.html()); + return false; + } + }); + } + } + + $.fn.combobox = function(options, param){ + if (typeof options == 'string'){ + var method = $.fn.combobox.methods[options]; + if (method){ + return method(this, param); + } else { + return this.combo(options, param); + } + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'combobox'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'combobox', { + options: $.extend({}, $.fn.combobox.defaults, $.fn.combobox.parseOptions(this), options), + data: [] + }); + } + create(this); + if (state.options.data){ + loadData(this, state.options.data); + } else { + var data = $.fn.combobox.parseData(this); + if (data.length){ + loadData(this, data); + } + } + request(this); + }); + }; + + + $.fn.combobox.methods = { + options: function(jq){ + var copts = jq.combo('options'); + return $.extend($.data(jq[0], 'combobox').options, { + width: copts.width, + height: copts.height, + originalValue: copts.originalValue, + disabled: copts.disabled, + readonly: copts.readonly + }); + }, + cloneFrom: function(jq, from){ + return jq.each(function(){ + $(this).combo('cloneFrom', from); + $.data(this, 'combobox', $(from).data('combobox')); + $(this).addClass('combobox-f').attr('comboboxName', $(this).attr('textboxName')); + }); + }, + getData: function(jq){ + return $.data(jq[0], 'combobox').data; + }, + setValues: function(jq, values){ + return jq.each(function(){ + var opts = $(this).combobox('options'); + if ($.isArray(values)){ + values = $.map(values, function(value){ + if (value && typeof value == 'object'){ + $.easyui.addArrayItem(opts.mappingRows, opts.valueField, value); + return value[opts.valueField]; + } else { + return value; + } + }); + } + setValues(this, values); + }); + }, + setValue: function(jq, value){ + return jq.each(function(){ + $(this).combobox('setValues', $.isArray(value)?value:[value]); + }); + }, + clear: function(jq){ + return jq.each(function(){ + setValues(this, []); + }); + }, + reset: function(jq){ + return jq.each(function(){ + var opts = $(this).combobox('options'); + if (opts.multiple){ + $(this).combobox('setValues', opts.originalValue); + } else { + $(this).combobox('setValue', opts.originalValue); + } + }); + }, + loadData: function(jq, data){ + return jq.each(function(){ + loadData(this, data); + }); + }, + reload: function(jq, url){ + return jq.each(function(){ + if (typeof url == 'string'){ + request(this, url); + } else { + if (url){ + var opts = $(this).combobox('options'); + opts.queryParams = url; + } + request(this); + } + }); + }, + select: function(jq, value){ + return jq.each(function(){ + select(this, value); + }); + }, + unselect: function(jq, value){ + return jq.each(function(){ + unselect(this, value); + }); + }, + scrollTo: function(jq, value){ + return jq.each(function(){ + scrollTo(this, value); + }); + } + }; + + $.fn.combobox.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.fn.combo.parseOptions(target), $.parser.parseOptions(target,[ + 'valueField','textField','groupField','groupPosition','mode','method','url', + {showItemIcon:'boolean',limitToList:'boolean'} + ])); + }; + + $.fn.combobox.parseData = function(target){ + var data = []; + var opts = $(target).combobox('options'); + $(target).children().each(function(){ + if (this.tagName.toLowerCase() == 'optgroup'){ + var group = $(this).attr('label'); + $(this).children().each(function(){ + _parseItem(this, group); + }); + } else { + _parseItem(this); + } + }); + return data; + + function _parseItem(el, group){ + var t = $(el); + var row = {}; + row[opts.valueField] = t.attr('value')!=undefined ? t.attr('value') : t.text(); + row[opts.textField] = t.text(); + row['iconCls'] = $.parser.parseOptions(el, ['iconCls']).iconCls; + row['selected'] = t.is(':selected'); + row['disabled'] = t.is(':disabled'); + if (group){ + opts.groupField = opts.groupField || 'group'; + row[opts.groupField] = group; + } + data.push(row); + } + }; + + var COMBOBOX_SERNO = 0; + var defaultView = { + render: function(target, container, data){ + var state = $.data(target, 'combobox'); + var opts = state.options; + + COMBOBOX_SERNO++; + state.itemIdPrefix = '_easyui_combobox_i' + COMBOBOX_SERNO; + state.groupIdPrefix = '_easyui_combobox_g' + COMBOBOX_SERNO; + state.groups = []; + + var dd = []; + var group = undefined; + for(var i=0; i'); + dd.push(opts.groupFormatter ? opts.groupFormatter.call(target, g) : g); + dd.push(''); + } else { + state.groups[state.groups.length-1].count++; + } + } else { + group = undefined; + } + + var cls = 'combobox-item' + (row.disabled ? ' combobox-item-disabled' : '') + (g ? ' combobox-gitem' : ''); + dd.push('
                                                      '); + if (opts.showItemIcon && row.iconCls){ + dd.push(''); + } + dd.push(opts.formatter ? opts.formatter.call(target, row) : s); + dd.push('
                                                      '); + } + $(container).html(dd.join('')); + } + }; + + $.fn.combobox.defaults = $.extend({}, $.fn.combo.defaults, { + valueField: 'value', + textField: 'text', + groupPosition: 'static', // or 'sticky' + groupField: null, + groupFormatter: function(group){return group;}, + mode: 'local', // or 'remote' + method: 'post', + url: null, + data: null, + queryParams: {}, + showItemIcon: false, + limitToList: false, // limit the inputed values to the listed items + unselectedValues: [], + mappingRows: [], + view: defaultView, + + keyHandler: { + up: function(e){nav(this,'prev');e.preventDefault()}, + down: function(e){nav(this,'next');e.preventDefault()}, + left: function(e){}, + right: function(e){}, + enter: function(e){doEnter(this)}, + query: function(q,e){doQuery(this, q)} + }, + inputEvents: $.extend({}, $.fn.combo.defaults.inputEvents, { + blur: function(e){ + $.fn.combo.defaults.inputEvents.blur(e); + var target = e.data.target; + var opts = $(target).combobox('options'); + if (opts.reversed || opts.limitToList){ + if (opts.blurTimer){ + clearTimeout(opts.blurTimer); + } + opts.blurTimer = setTimeout(function(){ + var existing = $(target).parent().length; + if (existing){ + if (opts.reversed){ + $(target).combobox('setValues', $(target).combobox('getValues')); + } else if (opts.limitToList){ + //doEnter(target); + var vv = []; + $.map($(target).combobox('getValues'), function(v){ + var index = $.easyui.indexOfArray($(target).combobox('getData'), opts.valueField, v); + if (index >= 0){ + vv.push(v); + } + }); + $(target).combobox('setValues', vv); + } + opts.blurTimer = null; + } + },50); + } + } + }), + panelEvents: { + mouseover: mouseoverHandler, + mouseout: mouseoutHandler, + mousedown: function(e){ + e.preventDefault(); + e.stopPropagation(); + }, + click: clickHandler, + scroll: scrollHandler + }, + filter: function(q, row){ + var opts = $(this).combobox('options'); + return row[opts.textField].toLowerCase().indexOf(q.toLowerCase()) >= 0; + }, + formatter: function(row){ + var opts = $(this).combobox('options'); + return row[opts.textField]; + }, + loader: function(param, success, error){ + var opts = $(this).combobox('options'); + if (!opts.url) return false; + $.ajax({ + type: opts.method, + url: opts.url, + data: param, + dataType: 'json', + success: function(data){ + success(data); + }, + error: function(){ + error.apply(this, arguments); + } + }); + }, + loadFilter: function(data){ + return data; + }, + finder:{ + getEl:function(target, value){ + var index = getRowIndex(target, value); + var id = $.data(target, 'combobox').itemIdPrefix + '_' + index; + return $('#'+id); + }, + getGroupEl:function(target, gvalue){ + var state = $.data(target, 'combobox'); + var index = $.easyui.indexOfArray(state.groups, 'value', gvalue); + var id = state.groupIdPrefix + '_' + index; + return $('#'+id); + }, + getGroup:function(target, p){ + var state = $.data(target, 'combobox'); + var index = p.attr('id').substr(state.groupIdPrefix.length+1); + return state.groups[parseInt(index)]; + }, + getRow:function(target, p){ + var state = $.data(target, 'combobox'); + var index = (p instanceof $) ? p.attr('id').substr(state.itemIdPrefix.length+1) : getRowIndex(target, p); + return state.data[parseInt(index)]; + } + }, + + onBeforeLoad: function(param){}, + onLoadSuccess: function(data){}, + onLoadError: function(){}, + onSelect: function(record){}, + onUnselect: function(record){}, + onClick: function(record){} + }); +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.datebox.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.datebox.js new file mode 100644 index 000000000..6ab1741ef --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.datebox.js @@ -0,0 +1,288 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * datebox - EasyUI for jQuery + * + * Dependencies: + * calendar + * combo + * + */ +(function($){ + /** + * create date box + */ + function createBox(target){ + var state = $.data(target, 'datebox'); + var opts = state.options; + + $(target).addClass('datebox-f').combo($.extend({}, opts, { + onShowPanel:function(){ + bindEvents(this); + setButtons(this); + setCalendar(this); + setValue(this, $(this).datebox('getText'), true); + opts.onShowPanel.call(this); + } + })); + + /** + * if the calendar isn't created, create it. + */ + if (!state.calendar){ + var panel = $(target).combo('panel').css('overflow','hidden'); + panel.panel('options').onBeforeDestroy = function(){ + var c = $(this).find('.calendar-shared'); + if (c.length){ + c.insertBefore(c[0].pholder); + } + }; + var cc = $('
                                                      ').prependTo(panel); + if (opts.sharedCalendar){ + var c = $(opts.sharedCalendar); + if (!c[0].pholder){ + c[0].pholder = $('').insertAfter(c); + } + c.addClass('calendar-shared').appendTo(cc); + if (!c.hasClass('calendar')){ + c.calendar(); + } + state.calendar = c; + } else { + state.calendar = $('
                                                      ').appendTo(cc).calendar(); + } + + $.extend(state.calendar.calendar('options'), { + fit:true, + border:false, + onSelect:function(date){ + var target = this.target; + var opts = $(target).datebox('options'); + opts.onSelect.call(target, date); + setValue(target, opts.formatter.call(target, date)); + $(target).combo('hidePanel'); + } + }); + } + + $(target).combo('textbox').parent().addClass('datebox'); + $(target).datebox('initValue', opts.value); + + function bindEvents(target){ + var opts = $(target).datebox('options'); + var panel = $(target).combo('panel'); + panel.unbind('.datebox').bind('click.datebox', function(e){ + if ($(e.target).hasClass('datebox-button-a')){ + var index = parseInt($(e.target).attr('datebox-button-index')); + opts.buttons[index].handler.call(e.target, target); + } + }); + } + function setButtons(target){ + var panel = $(target).combo('panel'); + if (panel.children('div.datebox-button').length){return} + var button = $('
                                                      ').appendTo(panel); + var tr = button.find('tr'); + for(var i=0; i').appendTo(tr); + var btn = opts.buttons[i]; + var t = $('').html($.isFunction(btn.text) ? btn.text(target) : btn.text).appendTo(td); + t.attr('datebox-button-index', i); + } + tr.find('td').css('width', (100/opts.buttons.length)+'%'); + } + function setCalendar(target){ + var panel = $(target).combo('panel'); + var cc = panel.children('div.datebox-calendar-inner'); + panel.children()._outerWidth(panel.width()); + state.calendar.appendTo(cc); + state.calendar[0].target = target; + if (opts.panelHeight != 'auto'){ + var height = panel.height(); + panel.children().not(cc).each(function(){ + height -= $(this).outerHeight(); + }); + cc._outerHeight(height); + } + state.calendar.calendar('resize'); + } + } + + /** + * called when user inputs some value in text box + */ + function doQuery(target, q){ + setValue(target, q, true); + } + + /** + * called when user press enter key + */ + function doEnter(target){ + var state = $.data(target, 'datebox'); + var opts = state.options; + var current = state.calendar.calendar('options').current; + if (current){ + setValue(target, opts.formatter.call(target, current)); + $(target).combo('hidePanel'); + } + } + + function setValue(target, value, remainText){ + var state = $.data(target, 'datebox'); + var opts = state.options; + var calendar = state.calendar; + calendar.calendar('moveTo', opts.parser.call(target, value)); + if (remainText){ + $(target).combo('setValue', value); + } else { + if (value){ + value = opts.formatter.call(target, calendar.calendar('options').current); + } + $(target).combo('setText', value).combo('setValue', value); + } + } + + $.fn.datebox = function(options, param){ + if (typeof options == 'string'){ + var method = $.fn.datebox.methods[options]; + if (method){ + return method(this, param); + } else { + return this.combo(options, param); + } + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'datebox'); + if (state){ + $.extend(state.options, options); + } else { + $.data(this, 'datebox', { + options: $.extend({}, $.fn.datebox.defaults, $.fn.datebox.parseOptions(this), options) + }); + } + createBox(this); + }); + }; + + $.fn.datebox.methods = { + options: function(jq){ + var copts = jq.combo('options'); + return $.extend($.data(jq[0], 'datebox').options, { + width: copts.width, + height: copts.height, + originalValue: copts.originalValue, + disabled: copts.disabled, + readonly: copts.readonly + }); + }, + cloneFrom: function(jq, from){ + return jq.each(function(){ + $(this).combo('cloneFrom', from); + $.data(this, 'datebox', { + options: $.extend(true, {}, $(from).datebox('options')), + calendar: $(from).datebox('calendar') + }); + $(this).addClass('datebox-f'); + }); + }, + calendar: function(jq){ // get the calendar object + return $.data(jq[0], 'datebox').calendar; + }, + initValue: function(jq, value){ + return jq.each(function(){ + var opts = $(this).datebox('options'); + var value = opts.value; + if (value){ + value = opts.formatter.call(this, opts.parser.call(this, value)); + } + $(this).combo('initValue', value).combo('setText', value); + }); + }, + setValue: function(jq, value){ + return jq.each(function(){ + setValue(this, value); + }); + }, + reset: function(jq){ + return jq.each(function(){ + var opts = $(this).datebox('options'); + $(this).datebox('setValue', opts.originalValue); + }); + } + }; + + $.fn.datebox.parseOptions = function(target){ + return $.extend({}, $.fn.combo.parseOptions(target), $.parser.parseOptions(target, ['sharedCalendar'])); + }; + + $.fn.datebox.defaults = $.extend({}, $.fn.combo.defaults, { + panelWidth:250, + panelHeight:'auto', + sharedCalendar:null, + + keyHandler: { + up:function(e){}, + down:function(e){}, + left: function(e){}, + right: function(e){}, + enter:function(e){doEnter(this)}, + query:function(q,e){doQuery(this, q)} + }, + + currentText:'Today', + closeText:'Close', + okText:'Ok', + + buttons:[{ + text: function(target){return $(target).datebox('options').currentText;}, + handler: function(target){ + var opts = $(target).datebox('options'); + var now = new Date(); + var current = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + $(target).datebox('calendar').calendar({ + year:current.getFullYear(), + month:current.getMonth()+1, + current:current + }); + opts.onSelect.call(target, current); + doEnter(target); + } + },{ + text: function(target){return $(target).datebox('options').closeText;}, + handler: function(target){ + $(this).closest('div.combo-panel').panel('close'); + } + }], + + formatter:function(date){ + var y = date.getFullYear(); + var m = date.getMonth()+1; + var d = date.getDate(); + return (m<10?('0'+m):m)+'/'+(d<10?('0'+d):d)+'/'+y; + }, + parser:function(s){ + if (!s) return new Date(); + var ss = s.split('/'); + var m = parseInt(ss[0],10); + var d = parseInt(ss[1],10); + var y = parseInt(ss[2],10); + if (!isNaN(y) && !isNaN(m) && !isNaN(d)){ + return new Date(y,m-1,d); + } else { + return new Date(); + } + }, + + onSelect:function(date){} + }); +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.draggable.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.draggable.js new file mode 100644 index 000000000..8187c8c80 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.draggable.js @@ -0,0 +1,399 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * draggable - EasyUI for jQuery + * + */ +(function($){ + function drag(e){ + var state = $.data(e.data.target, 'draggable'); + var opts = state.options; + var proxy = state.proxy; + + var dragData = e.data; + var left = dragData.startLeft + e.pageX - dragData.startX; + var top = dragData.startTop + e.pageY - dragData.startY; + + if (proxy){ + if (proxy.parent()[0] == document.body){ + if (opts.deltaX != null && opts.deltaX != undefined){ + left = e.pageX + opts.deltaX; + } else { + left = e.pageX - e.data.offsetWidth; + } + if (opts.deltaY != null && opts.deltaY != undefined){ + top = e.pageY + opts.deltaY; + } else { + top = e.pageY - e.data.offsetHeight; + } + } else { + if (opts.deltaX != null && opts.deltaX != undefined){ + left += e.data.offsetWidth + opts.deltaX; + } + if (opts.deltaY != null && opts.deltaY != undefined){ + top += e.data.offsetHeight + opts.deltaY; + } + } + } + + if (e.data.parent != document.body) { + left += $(e.data.parent).scrollLeft(); + top += $(e.data.parent).scrollTop(); + } + + if (opts.axis == 'h') { + dragData.left = left; + } else if (opts.axis == 'v') { + dragData.top = top; + } else { + dragData.left = left; + dragData.top = top; + } + } + + function applyDrag(e){ + var state = $.data(e.data.target, 'draggable'); + var opts = state.options; + var proxy = state.proxy; + if (!proxy){ + proxy = $(e.data.target); + } + proxy.css({ + left:e.data.left, + top:e.data.top + }); + $('body').css('cursor', opts.cursor); + } + + function doDown(e){ + if (!$.fn.draggable.isDragging){return false;} + + var state = $.data(e.data.target, 'draggable'); + var opts = state.options; + + var droppables = $('.droppable:visible').filter(function(){ + return e.data.target != this; + }).filter(function(){ + var accept = $.data(this, 'droppable').options.accept; + if (accept){ + return $(accept).filter(function(){ + return this == e.data.target; + }).length > 0; + } else { + return true; + } + }); + state.droppables = droppables; + + var proxy = state.proxy; + if (!proxy){ + if (opts.proxy){ + if (opts.proxy == 'clone'){ + proxy = $(e.data.target).clone().insertAfter(e.data.target); + } else { + proxy = opts.proxy.call(e.data.target, e.data.target); + } + state.proxy = proxy; + } else { + proxy = $(e.data.target); + } + } + + proxy.css('position', 'absolute'); + drag(e); + applyDrag(e); + + opts.onStartDrag.call(e.data.target, e); + return false; + } + + function doMove(e){ + if (!$.fn.draggable.isDragging){return false;} + + var state = $.data(e.data.target, 'draggable'); + drag(e); + if (state.options.onDrag.call(e.data.target, e) != false){ + applyDrag(e); + } + + var source = e.data.target; + state.droppables.each(function(){ + var dropObj = $(this); + if (dropObj.droppable('options').disabled){return;} + + var p2 = dropObj.offset(); + if (e.pageX > p2.left && e.pageX < p2.left + dropObj.outerWidth() + && e.pageY > p2.top && e.pageY < p2.top + dropObj.outerHeight()){ + if (!this.entered){ + $(this).trigger('_dragenter', [source]); + this.entered = true; + } + $(this).trigger('_dragover', [source]); + } else { + if (this.entered){ + $(this).trigger('_dragleave', [source]); + this.entered = false; + } + } + }); + + return false; + } + + function doUp(e){ + if (!$.fn.draggable.isDragging){ + clearDragging(); + return false; + } + + doMove(e); + + var state = $.data(e.data.target, 'draggable'); + var proxy = state.proxy; + var opts = state.options; + opts.onEndDrag.call(e.data.target, e); + if (opts.revert){ + if (checkDrop() == true){ + $(e.data.target).css({ + position:e.data.startPosition, + left:e.data.startLeft, + top:e.data.startTop + }); + } else { + if (proxy){ + var left, top; + if (proxy.parent()[0] == document.body){ + left = e.data.startX - e.data.offsetWidth; + top = e.data.startY - e.data.offsetHeight; + } else { + left = e.data.startLeft; + top = e.data.startTop; + } + proxy.animate({ + left: left, + top: top + }, function(){ + removeProxy(); + }); + } else { + $(e.data.target).animate({ + left:e.data.startLeft, + top:e.data.startTop + }, function(){ + $(e.data.target).css('position', e.data.startPosition); + }); + } + } + } else { + $(e.data.target).css({ + position:'absolute', + left:e.data.left, + top:e.data.top + }); + checkDrop(); + } + + opts.onStopDrag.call(e.data.target, e); + + clearDragging(); + + function removeProxy(){ + if (proxy){ + proxy.remove(); + } + state.proxy = null; + } + + function checkDrop(){ + var dropped = false; + state.droppables.each(function(){ + var dropObj = $(this); + if (dropObj.droppable('options').disabled){return;} + + var p2 = dropObj.offset(); + if (e.pageX > p2.left && e.pageX < p2.left + dropObj.outerWidth() + && e.pageY > p2.top && e.pageY < p2.top + dropObj.outerHeight()){ + if (opts.revert){ + $(e.data.target).css({ + position:e.data.startPosition, + left:e.data.startLeft, + top:e.data.startTop + }); + } + $(this).triggerHandler('_drop', [e.data.target]); + removeProxy(); + dropped = true; + this.entered = false; + return false; + } + }); + if (!dropped && !opts.revert){ + removeProxy(); + } + return dropped; + } + + return false; + } + + function clearDragging(){ + if ($.fn.draggable.timer){ + clearTimeout($.fn.draggable.timer); + $.fn.draggable.timer = undefined; + } + $(document).unbind('.draggable'); + $.fn.draggable.isDragging = false; + setTimeout(function(){ + $('body').css('cursor',''); + },100); + } + + $.fn.draggable = function(options, param){ + if (typeof options == 'string'){ + return $.fn.draggable.methods[options](this, param); + } + + return this.each(function(){ + var opts; + var state = $.data(this, 'draggable'); + if (state) { + state.handle.unbind('.draggable'); + opts = $.extend(state.options, options); + } else { + opts = $.extend({}, $.fn.draggable.defaults, $.fn.draggable.parseOptions(this), options || {}); + } + var handle = opts.handle ? (typeof opts.handle=='string' ? $(opts.handle, this) : opts.handle) : $(this); + + $.data(this, 'draggable', { + options: opts, + handle: handle + }); + + if (opts.disabled) { + $(this).css('cursor', ''); + return; + } + + handle.unbind('.draggable').bind('mousemove.draggable', {target:this}, function(e){ + if ($.fn.draggable.isDragging){return} + var opts = $.data(e.data.target, 'draggable').options; + if (checkArea(e)){ + $(this).css('cursor', opts.cursor); + } else { + $(this).css('cursor', ''); + } + }).bind('mouseleave.draggable', {target:this}, function(e){ + $(this).css('cursor', ''); + }).bind('mousedown.draggable', {target:this}, function(e){ + if (checkArea(e) == false) return; + $(this).css('cursor', ''); + + var position = $(e.data.target).position(); + var offset = $(e.data.target).offset(); + var data = { + startPosition: $(e.data.target).css('position'), + startLeft: position.left, + startTop: position.top, + left: position.left, + top: position.top, + startX: e.pageX, + startY: e.pageY, + width: $(e.data.target).outerWidth(), + height: $(e.data.target).outerHeight(), + offsetWidth: (e.pageX - offset.left), + offsetHeight: (e.pageY - offset.top), + target: e.data.target, + parent: $(e.data.target).parent()[0] + }; + + $.extend(e.data, data); + var opts = $.data(e.data.target, 'draggable').options; + if (opts.onBeforeDrag.call(e.data.target, e) == false) return; + + $(document).bind('mousedown.draggable', e.data, doDown); + $(document).bind('mousemove.draggable', e.data, doMove); + $(document).bind('mouseup.draggable', e.data, doUp); + + $.fn.draggable.timer = setTimeout(function(){ + $.fn.draggable.isDragging = true; + doDown(e); + }, opts.delay); + return false; + }); + + // check if the handle can be dragged + function checkArea(e) { + var state = $.data(e.data.target, 'draggable'); + var handle = state.handle; + var offset = $(handle).offset(); + var width = $(handle).outerWidth(); + var height = $(handle).outerHeight(); + var t = e.pageY - offset.top; + var r = offset.left + width - e.pageX; + var b = offset.top + height - e.pageY; + var l = e.pageX - offset.left; + + return Math.min(t,r,b,l) > state.options.edge; + } + + }); + }; + + $.fn.draggable.methods = { + options: function(jq){ + return $.data(jq[0], 'draggable').options; + }, + proxy: function(jq){ + return $.data(jq[0], 'draggable').proxy; + }, + enable: function(jq){ + return jq.each(function(){ + $(this).draggable({disabled:false}); + }); + }, + disable: function(jq){ + return jq.each(function(){ + $(this).draggable({disabled:true}); + }); + } + }; + + $.fn.draggable.parseOptions = function(target){ + var t = $(target); + return $.extend({}, + $.parser.parseOptions(target, ['cursor','handle','axis', + {'revert':'boolean','deltaX':'number','deltaY':'number','edge':'number','delay':'number'}]), { + disabled: (t.attr('disabled') ? true : undefined) + }); + }; + + $.fn.draggable.defaults = { + proxy:null, // 'clone' or a function that will create the proxy object, + // the function has the source parameter that indicate the source object dragged. + revert:false, + cursor:'move', + deltaX:null, + deltaY:null, + handle: null, + disabled: false, + edge:0, + axis:null, // v or h + delay:100, + + onBeforeDrag: function(e){}, + onStartDrag: function(e){}, + onDrag: function(e){}, + onEndDrag: function(e){}, + onStopDrag: function(e){} + }; + + $.fn.draggable.isDragging = false; + +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.droppable.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.droppable.js new file mode 100644 index 000000000..33ce6301c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.droppable.js @@ -0,0 +1,81 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * droppable - EasyUI for jQuery + * + */ +(function($){ + function init(target){ + $(target).addClass('droppable'); + $(target).bind('_dragenter', function(e, source){ + $.data(target, 'droppable').options.onDragEnter.apply(target, [e, source]); + }); + $(target).bind('_dragleave', function(e, source){ + $.data(target, 'droppable').options.onDragLeave.apply(target, [e, source]); + }); + $(target).bind('_dragover', function(e, source){ + $.data(target, 'droppable').options.onDragOver.apply(target, [e, source]); + }); + $(target).bind('_drop', function(e, source){ + $.data(target, 'droppable').options.onDrop.apply(target, [e, source]); + }); + } + + $.fn.droppable = function(options, param){ + if (typeof options == 'string'){ + return $.fn.droppable.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'droppable'); + if (state){ + $.extend(state.options, options); + } else { + init(this); + $.data(this, 'droppable', { + options: $.extend({}, $.fn.droppable.defaults, $.fn.droppable.parseOptions(this), options) + }); + } + }); + }; + + $.fn.droppable.methods = { + options: function(jq){ + return $.data(jq[0], 'droppable').options; + }, + enable: function(jq){ + return jq.each(function(){ + $(this).droppable({disabled:false}); + }); + }, + disable: function(jq){ + return jq.each(function(){ + $(this).droppable({disabled:true}); + }); + } + }; + + $.fn.droppable.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, ['accept']), { + disabled: (t.attr('disabled') ? true : undefined) + }); + }; + + $.fn.droppable.defaults = { + accept:null, + disabled:false, + onDragEnter:function(e, source){}, + onDragOver:function(e, source){}, + onDragLeave:function(e, source){}, + onDrop:function(e, source){} + }; +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.form.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.form.js new file mode 100644 index 000000000..7a2b3fae1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.form.js @@ -0,0 +1,492 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * form - EasyUI for jQuery + * + */ +(function($){ + /** + * submit the form + */ + function ajaxSubmit(target, options){ + var opts = $.data(target, 'form').options; + $.extend(opts, options||{}); + + var param = $.extend({}, opts.queryParams); + if (opts.onSubmit.call(target, param) == false){return;} + + // $(target).find('.textbox-text:focus').blur(); + var input = $(target).find('.textbox-text:focus'); + input.triggerHandler('blur'); + input.focus(); + + var disabledFields = null; // the fields to be disabled + if (opts.dirty){ + var ff = []; // all the dirty fields + $.map(opts.dirtyFields, function(f){ + if ($(f).hasClass('textbox-f')){ + $(f).next().find('.textbox-value').each(function(){ + ff.push(this); + }); + } else { + ff.push(f); + } + }); + disabledFields = $(target).find('input[name]:enabled,textarea[name]:enabled,select[name]:enabled').filter(function(){ + return $.inArray(this, ff) == -1; + }); + // disabledFields.attr('disabled', 'disabled'); + disabledFields._propAttr('disabled', true); + } + + if (opts.ajax){ + if (opts.iframe){ + submitIframe(target, param); + } else { + if (window.FormData !== undefined){ + submitXhr(target, param); + } else { + submitIframe(target, param); + } + } + } else { + $(target).submit(); + } + + if (opts.dirty){ + // disabledFields.removeAttr('disabled'); + disabledFields._propAttr('disabled', false); + } + } + + function submitIframe(target, param){ + var opts = $.data(target, 'form').options; + var frameId = 'easyui_frame_' + (new Date().getTime()); + var frame = $('').appendTo('body') + frame.attr('src', window.ActiveXObject ? 'javascript:false' : 'about:blank'); + frame.css({ + position:'absolute', + top:-1000, + left:-1000 + }); + frame.bind('load', cb); + + submit(param); + + function submit(param){ + var form = $(target); + if (opts.url){ + form.attr('action', opts.url); + } + var t = form.attr('target'), a = form.attr('action'); + form.attr('target', frameId); + var paramFields = $(); + try { + for(var n in param){ + var field = $('').val(param[n]).appendTo(form); + paramFields = paramFields.add(field); + } + checkState(); + form[0].submit(); + } finally { + form.attr('action', a); + t ? form.attr('target', t) : form.removeAttr('target'); + paramFields.remove(); + } + } + + function checkState(){ + var f = $('#'+frameId); + if (!f.length){return} + try{ + var s = f.contents()[0].readyState; + if (s && s.toLowerCase() == 'uninitialized'){ + setTimeout(checkState, 100); + } + } catch(e){ + cb(); + } + } + + var checkCount = 10; + function cb(){ + var f = $('#'+frameId); + if (!f.length){return} + f.unbind(); + var data = ''; + try{ + var body = f.contents().find('body'); + data = body.html(); + if (data == ''){ + if (--checkCount){ + setTimeout(cb, 100); + return; + } + } + var ta = body.find('>textarea'); + if (ta.length){ + data = ta.val(); + } else { + var pre = body.find('>pre'); + if (pre.length){ + data = pre.html(); + } + } + } catch(e){ + } + opts.success.call(target, data); + setTimeout(function(){ + f.unbind(); + f.remove(); + }, 100); + } + } + + function submitXhr(target, param){ + var opts = $.data(target, 'form').options; + var formData = new FormData($(target)[0]); + for(var name in param){ + formData.append(name, param[name]); + } + $.ajax({ + url: opts.url, + type: 'post', + xhr: function(){ + var xhr = $.ajaxSettings.xhr(); + if (xhr.upload) { + xhr.upload.addEventListener('progress', function(e){ + if (e.lengthComputable) { + var total = e.total; + var position = e.loaded || e.position; + var percent = Math.ceil(position * 100 / total); + opts.onProgress.call(target, percent); + } + }, false); + } + return xhr; + }, + data: formData, + dataType: 'html', + cache: false, + contentType: false, + processData: false, + complete: function(res){ + opts.success.call(target, res.responseText); + } + }); + } + + + /** + * load form data + * if data is a URL string type load from remote site, + * otherwise load from local data object. + */ + function load(target, data){ + var opts = $.data(target, 'form').options; + + if (typeof data == 'string'){ + var param = {}; + if (opts.onBeforeLoad.call(target, param) == false) return; + + $.ajax({ + url: data, + data: param, + dataType: 'json', + success: function(data){ + _load(data); + }, + error: function(){ + opts.onLoadError.apply(target, arguments); + } + }); + } else { + _load(data); + } + + function _load(data){ + var form = $(target); + for(var name in data){ + var val = data[name]; + if (!_checkField(name, val)){ + if (!_loadBox(name, val)){ + form.find('input[name="'+name+'"]').val(val); + form.find('textarea[name="'+name+'"]').val(val); + form.find('select[name="'+name+'"]').val(val); + } + } + } + opts.onLoadSuccess.call(target, data); + form.form('validate'); + } + + /** + * check the checkbox and radio fields + */ + function _checkField(name, val){ + var cc = $(target).find('[switchbuttonName="'+name+'"]'); + if (cc.length){ + cc.switchbutton('uncheck'); + cc.each(function(){ + if (_isChecked($(this).switchbutton('options').value, val)){ + $(this).switchbutton('check'); + } + }); + return true; + } + cc = $(target).find('input[name="'+name+'"][type=radio], input[name="'+name+'"][type=checkbox]'); + if (cc.length){ + cc._propAttr('checked', false); + cc.each(function(){ + if (_isChecked($(this).val(), val)){ + $(this)._propAttr('checked', true); + } + }); + return true; + } + return false; + } + function _isChecked(v, val){ + if (v == String(val) || $.inArray(v, $.isArray(val)?val:[val]) >= 0){ + return true; + } else { + return false; + } + } + + function _loadBox(name, val){ + var field = $(target).find('[textboxName="'+name+'"],[sliderName="'+name+'"]'); + if (field.length){ + for(var i=0; i=0; i--){ + var type = opts.fieldTypes[i]; + var field = form.find('.'+type+'-f'); + if (field.length && field[type]){ + field[type]('reset'); + } + } + form.form('validate'); + } + + /** + * set the form to make it can submit with ajax. + */ + function setForm(target){ + var options = $.data(target, 'form').options; + $(target).unbind('.form'); + if (options.ajax){ + $(target).bind('submit.form', function(){ + setTimeout(function(){ + ajaxSubmit(target, options); + }, 0); + return false; + }); + } + $(target).bind('_change.form', function(e, t){ + if ($.inArray(t, options.dirtyFields) == -1){ + options.dirtyFields.push(t); + } + options.onChange.call(this, t); + }).bind('change.form', function(e){ + var t = e.target; + if (!$(t).hasClass('textbox-text')){ + if ($.inArray(t, options.dirtyFields) == -1){ + options.dirtyFields.push(t); + } + options.onChange.call(this, t); + } + }); + setValidation(target, options.novalidate); + } + + function initForm(target, options){ + options = options || {}; + var state = $.data(target, 'form'); + if (state){ + $.extend(state.options, options); + } else { + $.data(target, 'form', { + options: $.extend({}, $.fn.form.defaults, $.fn.form.parseOptions(target), options) + }); + } + } + + function validate(target){ + if ($.fn.validatebox){ + var t = $(target); + t.find('.validatebox-text:not(:disabled)').validatebox('validate'); + var invalidbox = t.find('.validatebox-invalid'); + invalidbox.filter(':not(:disabled):first').focus(); + return invalidbox.length == 0; + } + return true; + } + + function setValidation(target, novalidate){ + var opts = $.data(target, 'form').options; + opts.novalidate = novalidate; + $(target).find('.validatebox-text:not(:disabled)').validatebox(novalidate ? 'disableValidation' : 'enableValidation'); + } + + $.fn.form = function(options, param){ + if (typeof options == 'string'){ + this.each(function(){ + initForm(this); + }); + return $.fn.form.methods[options](this, param); + } + + return this.each(function(){ + initForm(this, options); + setForm(this); + }); + }; + + $.fn.form.methods = { + options: function(jq){ + return $.data(jq[0], 'form').options; + }, + submit: function(jq, options){ + return jq.each(function(){ + ajaxSubmit(this, options); + }); + }, + load: function(jq, data){ + return jq.each(function(){ + load(this, data); + }); + }, + clear: function(jq){ + return jq.each(function(){ + clear(this); + }); + }, + reset: function(jq){ + return jq.each(function(){ + reset(this); + }); + }, + validate: function(jq){ + return validate(jq[0]); + }, + disableValidation: function(jq){ + return jq.each(function(){ + setValidation(this, true); + }); + }, + enableValidation: function(jq){ + return jq.each(function(){ + setValidation(this, false); + }); + }, + resetValidation: function(jq){ + return jq.each(function(){ + $(this).find('.validatebox-text:not(:disabled)').validatebox('resetValidation'); + }); + }, + resetDirty: function(jq){ + return jq.each(function(){ + $(this).form('options').dirtyFields = []; + }); + } + }; + + $.fn.form.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, [ + {ajax:'boolean',dirty:'boolean'} + ]), { + url: (t.attr('action') ? t.attr('action') : undefined) + }); + }; + + $.fn.form.defaults = { + fieldTypes: ['tagbox','combobox','combotree','combogrid','combotreegrid','datetimebox','datebox','combo', + 'datetimespinner','timespinner','numberspinner','spinner', + 'slider','searchbox','numberbox','passwordbox','filebox','textbox','switchbutton'], + novalidate: false, + ajax: true, + iframe: true, + dirty: false, + dirtyFields: [], + url: null, + queryParams: {}, + onSubmit: function(param){return $(this).form('validate');}, + onProgress: function(percent){}, + success: function(data){}, + onBeforeLoad: function(param){}, + onLoadSuccess: function(data){}, + onLoadError: function(){}, + onChange: function(target){} + }; +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.linkbutton.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.linkbutton.js new file mode 100644 index 000000000..471751561 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.linkbutton.js @@ -0,0 +1,243 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * linkbutton - EasyUI for jQuery + * + */ +(function($){ + function setSize(target, param){ + var opts = $.data(target, 'linkbutton').options; + if (param){ + $.extend(opts, param); + } + if (opts.width || opts.height || opts.fit){ + var btn = $(target); + var parent = btn.parent(); + var isVisible = btn.is(':visible'); + if (!isVisible){ + var spacer = $('
                                                      ').insertBefore(target); + var style = { + position: btn.css('position'), + display: btn.css('display'), + left: btn.css('left') + }; + btn.appendTo('body'); + btn.css({ + position: 'absolute', + display: 'inline-block', + left: -20000 + }); + } + btn._size(opts, parent); + var left = btn.find('.l-btn-left'); + left.css('margin-top', 0); + left.css('margin-top', parseInt((btn.height()-left.height())/2)+'px'); + if (!isVisible){ + btn.insertAfter(spacer); + btn.css(style); + spacer.remove(); + } + } + } + + function createButton(target) { + var opts = $.data(target, 'linkbutton').options; + var t = $(target).empty(); + + t.addClass('l-btn').removeClass('l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline'); + t.removeClass('l-btn-small l-btn-medium l-btn-large').addClass('l-btn-'+opts.size); + if (opts.plain){t.addClass('l-btn-plain')} + if (opts.outline){t.addClass('l-btn-outline')} + if (opts.selected){ + t.addClass(opts.plain ? 'l-btn-selected l-btn-plain-selected' : 'l-btn-selected'); + } + t.attr('group', opts.group || ''); + t.attr('id', opts.id || ''); + + var inner = $('').appendTo(t); + if (opts.text){ + $('').html(opts.text).appendTo(inner); + } else { + $(' ').appendTo(inner); + } + if (opts.iconCls){ + $(' ').addClass(opts.iconCls).appendTo(inner); + inner.addClass('l-btn-icon-'+opts.iconAlign); + } + + t.unbind('.linkbutton').bind('focus.linkbutton',function(){ + if (!opts.disabled){ + $(this).addClass('l-btn-focus'); + } + }).bind('blur.linkbutton',function(){ + $(this).removeClass('l-btn-focus'); + }).bind('click.linkbutton',function(){ + if (!opts.disabled){ + if (opts.toggle){ + if (opts.selected){ + $(this).linkbutton('unselect'); + } else { + $(this).linkbutton('select'); + } + } + opts.onClick.call(this); + } +// return false; + }); +// if (opts.toggle && !opts.disabled){ +// t.bind('click.linkbutton', function(){ +// if (opts.selected){ +// $(this).linkbutton('unselect'); +// } else { +// $(this).linkbutton('select'); +// } +// }); +// } + + setSelected(target, opts.selected) + setDisabled(target, opts.disabled); + } + + function setSelected(target, selected){ + var opts = $.data(target, 'linkbutton').options; + if (selected){ + if (opts.group){ + $('a.l-btn[group="'+opts.group+'"]').each(function(){ + var o = $(this).linkbutton('options'); + if (o.toggle){ + $(this).removeClass('l-btn-selected l-btn-plain-selected'); + o.selected = false; + } + }); + } + $(target).addClass(opts.plain ? 'l-btn-selected l-btn-plain-selected' : 'l-btn-selected'); + opts.selected = true; + } else { + if (!opts.group){ + $(target).removeClass('l-btn-selected l-btn-plain-selected'); + opts.selected = false; + } + } + } + + function setDisabled(target, disabled){ + var state = $.data(target, 'linkbutton'); + var opts = state.options; + $(target).removeClass('l-btn-disabled l-btn-plain-disabled'); + if (disabled){ + opts.disabled = true; + var href = $(target).attr('href'); + if (href){ + state.href = href; + $(target).attr('href', 'javascript:;'); + } + if (target.onclick){ + state.onclick = target.onclick; + target.onclick = null; + } + opts.plain ? $(target).addClass('l-btn-disabled l-btn-plain-disabled') : $(target).addClass('l-btn-disabled'); + } else { + opts.disabled = false; + if (state.href) { + $(target).attr('href', state.href); + } + if (state.onclick) { + target.onclick = state.onclick; + } + } + } + + $.fn.linkbutton = function(options, param){ + if (typeof options == 'string'){ + return $.fn.linkbutton.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'linkbutton'); + if (state){ + $.extend(state.options, options); + } else { + $.data(this, 'linkbutton', { + options: $.extend({}, $.fn.linkbutton.defaults, $.fn.linkbutton.parseOptions(this), options) + }); + // $(this).removeAttr('disabled'); + $(this)._propAttr('disabled', false); + $(this).bind('_resize', function(e, force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(this); + } + return false; + }); + } + + createButton(this); + setSize(this); + }); + }; + + $.fn.linkbutton.methods = { + options: function(jq){ + return $.data(jq[0], 'linkbutton').options; + }, + resize: function(jq, param){ + return jq.each(function(){ + setSize(this, param); + }); + }, + enable: function(jq){ + return jq.each(function(){ + setDisabled(this, false); + }); + }, + disable: function(jq){ + return jq.each(function(){ + setDisabled(this, true); + }); + }, + select: function(jq){ + return jq.each(function(){ + setSelected(this, true); + }); + }, + unselect: function(jq){ + return jq.each(function(){ + setSelected(this, false); + }); + } + }; + + $.fn.linkbutton.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, + ['id','iconCls','iconAlign','group','size','text',{plain:'boolean',toggle:'boolean',selected:'boolean',outline:'boolean'}] + ), { + disabled: (t.attr('disabled') ? true : undefined), + text: ($.trim(t.html()) || undefined), + iconCls: (t.attr('icon') || t.attr('iconCls')) + }); + }; + + $.fn.linkbutton.defaults = { + id: null, + disabled: false, + toggle: false, + selected: false, + outline: false, + group: null, + plain: false, + text: '', + iconCls: null, + iconAlign: 'left', + size: 'small', // small,large + onClick: function(){} + }; + +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.menu.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.menu.js new file mode 100644 index 000000000..76f083a05 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.menu.js @@ -0,0 +1,648 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * menu - EasyUI for jQuery + * + */ +(function($){ + $(function(){ + $(document).unbind('.menu').bind('mousedown.menu', function(e){ + var m = $(e.target).closest('div.menu,div.combo-p'); + if (m.length){return} + $('body>div.menu-top:visible').not('.menu-inline').menu('hide'); + hideMenu($('body>div.menu:visible').not('.menu-inline')); + }); + }); + + /** + * initialize the target menu, the function can be invoked only once + */ + function init(target){ + var opts = $.data(target, 'menu').options; + $(target).addClass('menu-top'); // the top menu + opts.inline ? $(target).addClass('menu-inline') : $(target).appendTo('body'); + $(target).bind('_resize', function(e, force){ + if ($(this).hasClass('easyui-fluid') || force){ + $(target).menu('resize', target); + } + return false; + }); + + var menus = splitMenu($(target)); + for(var i=0; i').prependTo(menu); + } + setMenuSize(target, menu); + if (!menu.hasClass('menu-inline')){ + menu.hide(); + } + bindMenuEvent(target, menu); + } + + /** + * create the menu item + */ + function createItem(target, div, options){ + var item = $(div); + var itemOpts = $.extend({}, $.parser.parseOptions(item[0], ['id','name','iconCls','href',{separator:'boolean'}]), { + disabled: (item.attr('disabled') ? true : undefined), + text: $.trim(item.html()), + onclick: item[0].onclick + }, options||{}); + itemOpts.onclick = itemOpts.onclick || itemOpts.handler || null; + item.data('menuitem', { + options: itemOpts + }); + if (itemOpts.separator){ + item.addClass('menu-sep'); + } + if (!item.hasClass('menu-sep')){ + item.addClass('menu-item'); + item.empty().append($('').html(itemOpts.text)); + if (itemOpts.iconCls){ + $('').addClass(itemOpts.iconCls).appendTo(item); + } + if (itemOpts.id){ + item.attr('id', itemOpts.id); + } + if (itemOpts.onclick){ + if (typeof itemOpts.onclick == 'string'){ + item.attr('onclick', itemOpts.onclick); + } else { + item[0].onclick = eval(itemOpts.onclick); + } + } + if (itemOpts.disabled){ + setDisabled(target, item[0], true); + } + if (item[0].submenu){ + $('').appendTo(item); // has sub menu + } + } + } + + function setMenuSize(target, menu){ + var opts = $.data(target, 'menu').options; + var style = menu.attr('style') || ''; + var isVisible = menu.is(':visible'); + menu.css({ + display: 'block', + left: -10000, + height: 'auto', + overflow: 'hidden' + }); + menu.find('.menu-item').each(function(){ + $(this)._outerHeight(opts.itemHeight); + $(this).find('.menu-text').css({ + height: (opts.itemHeight-2)+'px', + lineHeight: (opts.itemHeight-2)+'px' + }); + }); + menu.removeClass('menu-noline').addClass(opts.noline?'menu-noline':''); + + var mopts = menu.data('menu').options; + var width = mopts.width; + var height = mopts.height; + if (isNaN(parseInt(width))){ + width = 0; + menu.find('div.menu-text').each(function(){ + if (width < $(this).outerWidth()){ + width = $(this).outerWidth(); + } + }); + // width += 40; + width = width ? width+40 : ''; + } + var autoHeight = menu.outerHeight(); + if (isNaN(parseInt(height))){ + height = autoHeight; + if (menu.hasClass('menu-top') && opts.alignTo){ + var at = $(opts.alignTo); + var h1 = at.offset().top - $(document).scrollTop(); + var h2 = $(window)._outerHeight() + $(document).scrollTop() - at.offset().top - at._outerHeight(); + height = Math.min(height, Math.max(h1, h2)); + } else if (height > $(window)._outerHeight()){ + height = $(window).height(); + } + } + + menu.attr('style', style); // restore the original style + menu.show(); + menu._size($.extend({}, mopts, { + width: width, + height: height, + minWidth: mopts.minWidth || opts.minWidth, + maxWidth: mopts.maxWidth || opts.maxWidth + })); + menu.find('.easyui-fluid').triggerHandler('_resize', [true]); + menu.css('overflow', menu.outerHeight() < autoHeight ? 'auto' : 'hidden'); + menu.children('div.menu-line')._outerHeight(autoHeight-2); + if (!isVisible){ + menu.hide(); + } + } + + /** + * bind menu event + */ + function bindMenuEvent(target, menu){ + var state = $.data(target, 'menu'); + var opts = state.options; + menu.unbind('.menu'); + for(var event in opts.events){ + menu.bind(event+'.menu', {target:target}, opts.events[event]); + } + } + function mouseenterHandler(e){ + var target = e.data.target; + var state = $.data(target, 'menu'); + if (state.timer){ + clearTimeout(state.timer); + state.timer = null; + } + } + function mouseleaveHandler(e){ + var target = e.data.target; + var state = $.data(target, 'menu'); + if (state.options.hideOnUnhover){ + state.timer = setTimeout(function(){ + hideAll(target, $(target).hasClass('menu-inline')); + }, state.options.duration); + } + } + function mouseoverHandler(e){ + var target = e.data.target; + var item = $(e.target).closest('.menu-item'); + if (item.length){ + item.siblings().each(function(){ + if (this.submenu){ + hideMenu(this.submenu); + } + $(this).removeClass('menu-active'); + }); + // show this menu + item.addClass('menu-active'); + + if (item.hasClass('menu-item-disabled')){ + item.addClass('menu-active-disabled'); + return; + } + + var submenu = item[0].submenu; + if (submenu){ + $(target).menu('show', { + menu: submenu, + parent: item + }); + } + } + } + function mouseoutHandler(e){ + var item = $(e.target).closest('.menu-item'); + if (item.length){ + item.removeClass('menu-active menu-active-disabled'); + var submenu = item[0].submenu; + if (submenu){ + if (e.pageX>=parseInt(submenu.css('left'))){ + item.addClass('menu-active'); + } else { + hideMenu(submenu); + } + } else { + item.removeClass('menu-active'); + } + } + } + function clickHandler(e){ + var target = e.data.target; + var item = $(e.target).closest('.menu-item'); + if (item.length){ + var opts = $(target).data('menu').options; + var itemOpts = item.data('menuitem').options; + if (itemOpts.disabled){return;} + if (!item[0].submenu){ + hideAll(target, opts.inline); + if (itemOpts.href){ + location.href = itemOpts.href; + } + } + item.trigger('mouseenter'); + opts.onClick.call(target, $(target).menu('getItem', item[0])); + } + } + + /** + * hide top menu and it's all sub menus + */ + function hideAll(target, inline){ + var state = $.data(target, 'menu'); + if (state){ + if ($(target).is(':visible')){ + hideMenu($(target)); + if (inline){ + $(target).show(); + } else { + state.options.onHide.call(target); + } + } + } + return false; + } + + /** + * show the menu, the 'param' object has one or more properties: + * left: the left position to display + * top: the top position to display + * menu: the menu to display, if not defined, the 'target menu' is used + * parent: the parent menu item to align to + * alignTo: the element object to align to + */ + function showMenu(target, param){ + param = param || {}; + var left,top; + var opts = $.data(target, 'menu').options; + var menu = $(param.menu || target); + $(target).menu('resize', menu[0]); + if (menu.hasClass('menu-top')){ + $.extend(opts, param); + left = opts.left; + top = opts.top; + if (opts.alignTo){ + var at = $(opts.alignTo); + left = at.offset().left; + top = at.offset().top + at._outerHeight(); + if (opts.align == 'right'){ + left += at.outerWidth() - menu.outerWidth(); + } + } + if (left + menu.outerWidth() > $(window)._outerWidth() + $(document)._scrollLeft()){ + left = $(window)._outerWidth() + $(document).scrollLeft() - menu.outerWidth() - 5; + } + if (left < 0){left = 0;} + top = _fixTop(top, opts.alignTo); + } else { + var parent = param.parent; // the parent menu item + left = parent.offset().left + parent.outerWidth() - 2; + if (left + menu.outerWidth() + 5 > $(window)._outerWidth() + $(document).scrollLeft()){ + left = parent.offset().left - menu.outerWidth() + 2; + } + top = _fixTop(parent.offset().top - 3); + } + + function _fixTop(top, alignTo){ + if (top + menu.outerHeight() > $(window)._outerHeight() + $(document).scrollTop()){ + if (alignTo){ + top = $(alignTo).offset().top - menu._outerHeight(); + } else { + top = $(window)._outerHeight() + $(document).scrollTop() - menu.outerHeight(); + } + } + if (top < 0){top = 0;} + return top; + } + + menu.css(opts.position.call(target, menu[0], left, top)); + menu.show(0, function(){ + if (!menu[0].shadow){ + menu[0].shadow = $('').insertAfter(menu); + } + menu[0].shadow.css({ + display:(menu.hasClass('menu-inline')?'none':'block'), + zIndex:$.fn.menu.defaults.zIndex++, + left:menu.css('left'), + top:menu.css('top'), + width:menu.outerWidth(), + height:menu.outerHeight() + }); + menu.css('z-index', $.fn.menu.defaults.zIndex++); + if (menu.hasClass('menu-top')){ + opts.onShow.call(target); + } + }); + } + + function hideMenu(menu){ + if (menu && menu.length){ + hideit(menu); + menu.find('div.menu-item').each(function(){ + if (this.submenu){ + hideMenu(this.submenu); + } + $(this).removeClass('menu-active'); + }); + } + + function hideit(m){ + m.stop(true,true); + if (m[0].shadow){ + m[0].shadow.hide(); + } + m.hide(); + } + } + + function findItem(target, param){ + var result = null; + var fn = $.isFunction(param) ? param : function(item){ + for(var p in param){ + if (item[p] != param[p]){ + return false;; + } + } + return true; + } + function find(menu){ + menu.children('div.menu-item').each(function(){ + var opts = $(this).data('menuitem').options; + if (fn.call(target, opts) == true){ + result = $(target).menu('getItem', this); + } else if (this.submenu && !result){ + find(this.submenu); + } + }); + } + find($(target)); + return result; + } + + function setDisabled(target, itemEl, disabled){ + var t = $(itemEl); + if (t.hasClass('menu-item')){ + var opts = t.data('menuitem').options; + opts.disabled = disabled; + if (disabled){ + t.addClass('menu-item-disabled'); + t[0].onclick = null; + } else { + t.removeClass('menu-item-disabled'); + t[0].onclick = opts.onclick; + } + } + } + + function appendItem(target, param){ + var opts = $.data(target, 'menu').options; + var menu = $(target); + if (param.parent){ + if (!param.parent.submenu){ + var submenu = $('
                                                      ').appendTo('body'); + param.parent.submenu = submenu; + $('').appendTo(param.parent); + createMenu(target, submenu); + } + menu = param.parent.submenu; + } + var div = $('
                                                      ').appendTo(menu); + createItem(target, div, param); + } + + function removeItem(target, itemEl){ + function removeit(el){ + if (el.submenu){ + el.submenu.children('div.menu-item').each(function(){ + removeit(this); + }); + var shadow = el.submenu[0].shadow; + if (shadow) shadow.remove(); + el.submenu.remove(); + } + $(el).remove(); + } + removeit(itemEl); + } + + function setVisible(target, itemEl, visible){ + var menu = $(itemEl).parent(); + if (visible){ + $(itemEl).show(); + } else { + $(itemEl).hide(); + } + setMenuSize(target, menu); + } + + function destroyMenu(target){ + $(target).children('div.menu-item').each(function(){ + removeItem(target, this); + }); + if (target.shadow) target.shadow.remove(); + $(target).remove(); + } + + $.fn.menu = function(options, param){ + if (typeof options == 'string'){ + return $.fn.menu.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'menu'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'menu', { + options: $.extend({}, $.fn.menu.defaults, $.fn.menu.parseOptions(this), options) + }); + init(this); + } + $(this).css({ + left: state.options.left, + top: state.options.top + }); + }); + }; + + $.fn.menu.methods = { + options: function(jq){ + return $.data(jq[0], 'menu').options; + }, + show: function(jq, pos){ + return jq.each(function(){ + showMenu(this, pos); + }); + }, + hide: function(jq){ + return jq.each(function(){ + hideAll(this); + }); + }, + destroy: function(jq){ + return jq.each(function(){ + destroyMenu(this); + }); + }, + /** + * set the menu item text + * param: { + * target: DOM object, indicate the menu item + * text: string, the new text + * } + */ + setText: function(jq, param){ + return jq.each(function(){ + var item = $(param.target).data('menuitem').options; + item.text = param.text; + $(param.target).children('div.menu-text').html(param.text); + }); + }, + /** + * set the menu icon class + * param: { + * target: DOM object, indicate the menu item + * iconCls: the menu item icon class + * } + */ + setIcon: function(jq, param){ + return jq.each(function(){ + var item = $(param.target).data('menuitem').options; + item.iconCls = param.iconCls; + $(param.target).children('div.menu-icon').remove(); + if (param.iconCls){ + $('').addClass(param.iconCls).appendTo(param.target); + } + }); + }, + /** + * get the menu item data that contains the following property: + * { + * target: DOM object, the menu item + * id: the menu id + * text: the menu item text + * iconCls: the icon class + * href: a remote address to redirect to + * onclick: a function to be called when the item is clicked + * } + */ + getItem: function(jq, itemEl){ + var item = $(itemEl).data('menuitem').options; + return $.extend({}, item, { + target: $(itemEl)[0] + }); + }, + findItem: function(jq, text){ + if (typeof text == 'string'){ + return findItem(jq[0], function(item){ + return $('
                                                      '+item.text+'
                                                      ').text() == text; + }); + } else { + return findItem(jq[0], text); + } + }, + /** + * append menu item, the param contains following properties: + * parent,id,text,iconCls,href,onclick + * when parent property is assigned, append menu item to it + */ + appendItem: function(jq, param){ + return jq.each(function(){ + appendItem(this, param); + }); + }, + removeItem: function(jq, itemEl){ + return jq.each(function(){ + removeItem(this, itemEl); + }); + }, + enableItem: function(jq, itemEl){ + return jq.each(function(){ + setDisabled(this, itemEl, false); + }); + }, + disableItem: function(jq, itemEl){ + return jq.each(function(){ + setDisabled(this, itemEl, true); + }); + }, + showItem: function(jq, itemEl){ + return jq.each(function(){ + setVisible(this, itemEl, true); + }); + }, + hideItem: function(jq, itemEl){ + return jq.each(function(){ + setVisible(this, itemEl, false); + }); + }, + resize: function(jq, menuEl){ + return jq.each(function(){ + setMenuSize(this, menuEl ? $(menuEl) : $(this)); + }); + } + }; + + $.fn.menu.parseOptions = function(target){ + return $.extend({}, $.parser.parseOptions(target, [ + {minWidth:'number',itemHeight:'number',duration:'number',hideOnUnhover:'boolean'}, + {fit:'boolean',inline:'boolean',noline:'boolean'} + ])); + }; + + $.fn.menu.defaults = { + zIndex:110000, + left: 0, + top: 0, + alignTo: null, + align: 'left', + minWidth: 150, + // itemHeight: 22, + itemHeight: 32, + duration: 100, // Defines duration time in milliseconds to hide when the mouse leaves the menu. + hideOnUnhover: true, // Automatically hides the menu when mouse exits it + inline: false, // true to stay inside its parent, false to go on top of all elements + fit: false, + noline: false, + events: { + mouseenter: mouseenterHandler, + mouseleave: mouseleaveHandler, + mouseover: mouseoverHandler, + mouseout: mouseoutHandler, + click: clickHandler + }, + position: function(target, left, top){ + return {left:left,top:top} + }, + onShow: function(){}, + onHide: function(){}, + onClick: function(item){} + }; +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.parser.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.parser.js new file mode 100644 index 000000000..a15646346 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.parser.js @@ -0,0 +1,431 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * parser - EasyUI for jQuery + * + */ + +(function($){ + $.easyui = { + /** + * Get the index of array item, return -1 when the item is not found. + */ + indexOfArray: function(a, o, id){ + for(var i=0,len=a.length; i=0; i--){ + nodes.unshift(node.children[i]); + } + } + } + } + }; + + $.parser = { + auto: true, + onComplete: function(context){}, + plugins:['draggable','droppable','resizable','pagination','tooltip', + 'linkbutton','menu','sidemenu','menubutton','splitbutton','switchbutton','progressbar', + 'tree','textbox','passwordbox','maskedbox','filebox','combo','combobox','combotree','combogrid','combotreegrid','tagbox','numberbox','validatebox','searchbox', + 'spinner','numberspinner','timespinner','datetimespinner','calendar','datebox','datetimebox','slider', + 'layout','panel','datagrid','propertygrid','treegrid','datalist','tabs','accordion','window','dialog','form' + ], + parse: function(context){ + var aa = []; + for(var i=0; i<$.parser.plugins.length; i++){ + var name = $.parser.plugins[i]; + var r = $('.easyui-' + name, context); + if (r.length){ + if (r[name]){ + r.each(function(){ + $(this)[name]($.data(this, 'options')||{}); + }); + } else { + aa.push({name:name,jq:r}); + } + } + } + if (aa.length && window.easyloader){ + var names = []; + for(var i=0; i= 0){ + v = Math.floor((parent.width()-delta) * v / 100.0); + } else { + v = Math.floor((parent.height()-delta) * v / 100.0); + } + } else { + v = parseInt(v) || undefined; + } + return v; + }, + + /** + * parse options, including standard 'data-options' attribute. + * + * calling examples: + * $.parser.parseOptions(target); + * $.parser.parseOptions(target, ['id','title','width',{fit:'boolean',border:'boolean'},{min:'number'}]); + */ + parseOptions: function(target, properties){ + var t = $(target); + var options = {}; + + var s = $.trim(t.attr('data-options')); + if (s){ + if (s.substring(0, 1) != '{'){ + s = '{' + s + '}'; + } + options = (new Function('return ' + s))(); + } + $.map(['width','height','left','top','minWidth','maxWidth','minHeight','maxHeight'], function(p){ + var pv = $.trim(target.style[p] || ''); + if (pv){ + if (pv.indexOf('%') == -1){ + pv = parseInt(pv); + if (isNaN(pv)){ + pv = undefined; + } + } + options[p] = pv; + } + }); + + if (properties){ + var opts = {}; + for(var i=0; i').appendTo('body'); + $._boxModel = d.outerWidth()!=100; + d.remove(); + d = $('
                                                      ').appendTo('body'); + $._positionFixed = (d.css('position') == 'fixed'); + d.remove(); + + if (!window.easyloader && $.parser.auto){ + $.parser.parse(); + } + }); + + /** + * extend plugin to set box model width + */ + $.fn._outerWidth = function(width){ + if (width == undefined){ + if (this[0] == window){ + return this.width() || document.body.clientWidth; + } + return this.outerWidth()||0; + } + return this._size('width', width); + }; + + /** + * extend plugin to set box model height + */ + $.fn._outerHeight = function(height){ + if (height == undefined){ + if (this[0] == window){ + return this.height() || document.body.clientHeight; + } + return this.outerHeight()||0; + } + return this._size('height', height); + }; + + $.fn._scrollLeft = function(left){ + if (left == undefined){ + return this.scrollLeft(); + } else { + return this.each(function(){$(this).scrollLeft(left)}); + } + }; + + $.fn._propAttr = $.fn.prop || $.fn.attr; + + $.fn._size = function(options, parent){ + if (typeof options == 'string'){ + if (options == 'clear'){ + return this.each(function(){ + $(this).css({width:'',minWidth:'',maxWidth:'',height:'',minHeight:'',maxHeight:''}); + }); + } else if (options == 'fit'){ + return this.each(function(){ + _fit(this, this.tagName=='BODY' ? $('body') : $(this).parent(), true); + }); + } else if (options == 'unfit'){ + return this.each(function(){ + _fit(this, $(this).parent(), false); + }); + } else { + if (parent == undefined){ + return _css(this[0], options); + } else { + return this.each(function(){ + _css(this, options, parent); + }); + } + } + } else { + return this.each(function(){ + parent = parent || $(this).parent(); + $.extend(options, _fit(this, parent, options.fit)||{}); + var r1 = _setSize(this, 'width', parent, options); + var r2 = _setSize(this, 'height', parent, options); + if (r1 || r2){ + $(this).addClass('easyui-fluid'); + } else { + $(this).removeClass('easyui-fluid'); + } + }); + } + + function _fit(target, parent, fit){ + if (!parent.length){return false;} + var t = $(target)[0]; + var p = parent[0]; + var fcount = p.fcount || 0; + if (fit){ + if (!t.fitted){ + t.fitted = true; + p.fcount = fcount + 1; + $(p).addClass('panel-noscroll'); + if (p.tagName == 'BODY'){ + $('html').addClass('panel-fit'); + } + } + return { + width: ($(p).width()||1), + height: ($(p).height()||1) + }; + } else { + if (t.fitted){ + t.fitted = false; + p.fcount = fcount - 1; + if (p.fcount == 0){ + $(p).removeClass('panel-noscroll'); + if (p.tagName == 'BODY'){ + $('html').removeClass('panel-fit'); + } + } + } + return false; + } + } + function _setSize(target, property, parent, options){ + var t = $(target); + var p = property; + var p1 = p.substr(0,1).toUpperCase() + p.substr(1); + var min = $.parser.parseValue('min'+p1, options['min'+p1], parent);// || 0; + var max = $.parser.parseValue('max'+p1, options['max'+p1], parent);// || 99999; + var val = $.parser.parseValue(p, options[p], parent); + var fluid = (String(options[p]||'').indexOf('%') >= 0 ? true : false); + + if (!isNaN(val)){ + var v = Math.min(Math.max(val, min||0), max||99999); + if (!fluid){ + options[p] = v; + } + t._size('min'+p1, ''); + t._size('max'+p1, ''); + t._size(p, v); + } else { + t._size(p, ''); + t._size('min'+p1, min); + t._size('max'+p1, max); + } + return fluid || options.fit; + } + function _css(target, property, value){ + var t = $(target); + if (value == undefined){ + value = parseInt(target.style[property]); + if (isNaN(value)){return undefined;} + if ($._boxModel){ + value += getDeltaSize(); + } + return value; + } else if (value === ''){ + t.css(property, ''); + } else { + if ($._boxModel){ + value -= getDeltaSize(); + if (value < 0){value = 0;} + } + t.css(property, value+'px'); + } + function getDeltaSize(){ + if (property.toLowerCase().indexOf('width') >= 0){ + return t.outerWidth() - t.width(); + } else { + return t.outerHeight() - t.height(); + } + } + } + }; + +})(jQuery); + +/** + * support for mobile devices + */ +(function($){ + var longTouchTimer = null; + var dblTouchTimer = null; + var isDblClick = false; + + function onTouchStart(e){ + if (e.touches.length != 1){return} + if (!isDblClick){ + isDblClick = true; + dblClickTimer = setTimeout(function(){ + isDblClick = false; + }, 500); + } else { + clearTimeout(dblClickTimer); + isDblClick = false; + fire(e, 'dblclick'); +// e.preventDefault(); + } + longTouchTimer = setTimeout(function(){ + fire(e, 'contextmenu', 3); + }, 1000); + fire(e, 'mousedown'); + if ($.fn.draggable.isDragging || $.fn.resizable.isResizing){ + e.preventDefault(); + } + } + function onTouchMove(e){ + if (e.touches.length != 1){return} + if (longTouchTimer){ + clearTimeout(longTouchTimer); + } + fire(e, 'mousemove'); + if ($.fn.draggable.isDragging || $.fn.resizable.isResizing){ + e.preventDefault(); + } + } + function onTouchEnd(e){ +// if (e.touches.length > 0){return} + if (longTouchTimer){ + clearTimeout(longTouchTimer); + } + fire(e, 'mouseup'); + if ($.fn.draggable.isDragging || $.fn.resizable.isResizing){ + e.preventDefault(); + } + } + + function fire(e, name, which){ + var event = new $.Event(name); + event.pageX = e.changedTouches[0].pageX; + event.pageY = e.changedTouches[0].pageY; + event.which = which || 1; + $(e.target).trigger(event); + } + + if (document.addEventListener){ + document.addEventListener("touchstart", onTouchStart, true); + document.addEventListener("touchmove", onTouchMove, true); + document.addEventListener("touchend", onTouchEnd, true); + } +})(jQuery); + diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.progressbar.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.progressbar.js new file mode 100644 index 000000000..d9e644cab --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.progressbar.js @@ -0,0 +1,107 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * progressbar - EasyUI for jQuery + * + * Dependencies: + * none + * + */ +(function($){ + function init(target){ + $(target).addClass('progressbar'); + $(target).html('
                                                      '); + $(target).bind('_resize', function(e,force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(target); + } + return false; + }); + return $(target); + } + + function setSize(target,width){ + var opts = $.data(target, 'progressbar').options; + var bar = $.data(target, 'progressbar').bar; + if (width) opts.width = width; + bar._size(opts); + + bar.find('div.progressbar-text').css('width', bar.width()); + bar.find('div.progressbar-text,div.progressbar-value').css({ + height: bar.height()+'px', + lineHeight: bar.height()+'px' + }); + } + + $.fn.progressbar = function(options, param){ + if (typeof options == 'string'){ + var method = $.fn.progressbar.methods[options]; + if (method){ + return method(this, param); + } + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'progressbar'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'progressbar', { + options: $.extend({}, $.fn.progressbar.defaults, $.fn.progressbar.parseOptions(this), options), + bar: init(this) + }); + } + $(this).progressbar('setValue', state.options.value); + setSize(this); + }); + }; + + $.fn.progressbar.methods = { + options: function(jq){ + return $.data(jq[0], 'progressbar').options; + }, + resize: function(jq, width){ + return jq.each(function(){ + setSize(this, width); + }); + }, + getValue: function(jq){ + return $.data(jq[0], 'progressbar').options.value; + }, + setValue: function(jq, value){ + if (value < 0) value = 0; + if (value > 100) value = 100; + return jq.each(function(){ + var opts = $.data(this, 'progressbar').options; + var text = opts.text.replace(/{value}/, value); + var oldValue = opts.value; + opts.value = value; + $(this).find('div.progressbar-value').width(value+'%'); + $(this).find('div.progressbar-text').html(text); + if (oldValue != value){ + opts.onChange.call(this, value, oldValue); + } + }); + } + }; + + $.fn.progressbar.parseOptions = function(target){ + return $.extend({}, $.parser.parseOptions(target, ['width','height','text',{value:'number'}])); + }; + + $.fn.progressbar.defaults = { + width: 'auto', + height: 22, + value: 0, // percentage value + text: '{value}%', + onChange:function(newValue,oldValue){} + }; +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.propertygrid.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.propertygrid.js new file mode 100644 index 000000000..508a223ce --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.propertygrid.js @@ -0,0 +1,525 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * propertygrid - EasyUI for jQuery + * + * Dependencies: + * datagrid + * + */ +(function($){ + var currTarget; + $(document).unbind('.propertygrid').bind('mousedown.propertygrid', function(e){ + var p = $(e.target).closest('div.datagrid-view,div.combo-panel'); + if (p.length){return;} + stopEditing(currTarget); + currTarget = undefined; + }); + + function buildGrid(target){ + var state = $.data(target, 'propertygrid'); + var opts = $.data(target, 'propertygrid').options; + $(target).datagrid($.extend({}, opts, { + cls:'propertygrid', + view:(opts.showGroup ? opts.groupView : opts.view), + onBeforeEdit:function(index, row){ + if (opts.onBeforeEdit.call(target, index, row) == false){return false;} + var dg = $(this); + var row = dg.datagrid('getRows')[index]; + var col = dg.datagrid('getColumnOption', 'value'); + col.editor = row.editor; + }, + onClickCell:function(index, field, value){ + if (currTarget != this){ + stopEditing(currTarget); + currTarget = this; + } + if (opts.editIndex != index){ + stopEditing(currTarget); + $(this).datagrid('beginEdit', index); + var ed = $(this).datagrid('getEditor', {index:index,field:field}); + if (!ed){ + ed = $(this).datagrid('getEditor', {index:index,field:'value'}); + } + if (ed){ + var t = $(ed.target); + var input = t.data('textbox') ? t.textbox('textbox') : t; + input.focus(); + opts.editIndex = index; + } + } + opts.onClickCell.call(target, index, field, value); + }, + loadFilter:function(data){ + stopEditing(this); + return opts.loadFilter.call(this, data); + } + })); + } + + function stopEditing(target){ + var t = $(target); + if (!t.length){return} + var opts = $.data(target, 'propertygrid').options; + opts.finder.getTr(target, null, 'editing').each(function(){ + var index = parseInt($(this).attr('datagrid-row-index')); + if (t.datagrid('validateRow', index)){ + t.datagrid('endEdit', index); + } else { + t.datagrid('cancelEdit', index); + } + }); + opts.editIndex = undefined; + } + + $.fn.propertygrid = function(options, param){ + if (typeof options == 'string'){ + var method = $.fn.propertygrid.methods[options]; + if (method){ + return method(this, param); + } else { + return this.datagrid(options, param); + } + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'propertygrid'); + if (state){ + $.extend(state.options, options); + } else { + var opts = $.extend({}, $.fn.propertygrid.defaults, $.fn.propertygrid.parseOptions(this), options); + opts.frozenColumns = $.extend(true, [], opts.frozenColumns); + opts.columns = $.extend(true, [], opts.columns); + $.data(this, 'propertygrid', { + options: opts + }); + } + buildGrid(this); + }); + } + + $.fn.propertygrid.methods = { + options: function(jq){ + return $.data(jq[0], 'propertygrid').options; + } + }; + + $.fn.propertygrid.parseOptions = function(target){ + return $.extend({}, $.fn.datagrid.parseOptions(target), $.parser.parseOptions(target,[{showGroup:'boolean'}])); + }; + + // the group view definition + var groupview = $.extend({}, $.fn.datagrid.defaults.view, { + render: function(target, container, frozen){ + var table = []; + var groups = this.groups; + for(var i=0; i'); + if ((frozen && (opts.rownumbers || opts.frozenColumns.length)) || + (!frozen && !(opts.rownumbers || opts.frozenColumns.length))){ + table.push(''); + table.push(' '); + table.push(''); + } + if ((frozen && hasFrozen) || (!frozen)){ + table.push(''); + table.push(opts.groupFormatter.call(target, group.value, group.rows)); + table.push(''); + } + table.push(''); + + table.push(''); + var index = group.startIndex; + for(var j=0; j'); + table.push(this.renderRow.call(this, target, fields, frozen, index, group.rows[j])); + table.push(''); + index++; + } + table.push('
                                                      '); + return table.join(''); + + function parseCss(css, cls){ + var classValue = ''; + var styleValue = ''; + if (typeof css == 'string'){ + styleValue = css; + } else if (css){ + classValue = css['class'] || ''; + styleValue = css['style'] || ''; + } + return 'class="' + cls + (classValue ? ' '+classValue : '') + '" ' + + 'style="' + styleValue + '"'; + } + }, + + bindEvents: function(target){ + var state = $.data(target, 'datagrid'); + var dc = state.dc; + var body = dc.body1.add(dc.body2); + var clickHandler = ($.data(body[0],'events')||$._data(body[0],'events')).click[0].handler; + body.unbind('click').bind('click', function(e){ + var tt = $(e.target); + var expander = tt.closest('span.datagrid-row-expander'); + if (expander.length){ + var gindex = expander.closest('div.datagrid-group').attr('group-index'); + if (expander.hasClass('datagrid-row-collapse')){ + $(target).datagrid('collapseGroup', gindex); + } else { + $(target).datagrid('expandGroup', gindex); + } + } else { + clickHandler(e); + } + e.stopPropagation(); + }); + }, + + onBeforeRender: function(target, rows){ + var state = $.data(target, 'datagrid'); + var opts = state.options; + + initCss(); + + var groups = []; + for(var i=0; i' + + '.datagrid-group{height:'+opts.groupHeight+'px;overflow:hidden;font-weight:bold;border-bottom:1px solid #ccc;white-space:nowrap;word-break:normal;}' + + '.datagrid-group-title,.datagrid-group-expander{display:inline-block;vertical-align:bottom;height:100%;line-height:'+opts.groupHeight+'px;padding:0 4px;}' + + '.datagrid-group-title{position:relative;}' + + '.datagrid-group-expander{width:'+opts.expanderWidth+'px;text-align:center;padding:0}' + + '.datagrid-row-expander{margin:'+Math.floor((opts.groupHeight-16)/2)+'px 0;display:inline-block;width:16px;height:16px;cursor:pointer}' + + '' + ); + } + } + }, + onAfterRender: function(target){ + $.fn.datagrid.defaults.view.onAfterRender.call(this, target); + + var view = this; + var state = $.data(target, 'datagrid'); + var opts = state.options; + if (!state.onResizeColumn){ + state.onResizeColumn = opts.onResizeColumn; + } + if (!state.onResize){ + state.onResize = opts.onResize; + } + opts.onResizeColumn = function(field, width){ + view.resizeGroup(target); + state.onResizeColumn.call(target, field, width); + } + opts.onResize = function(width, height){ + view.resizeGroup(target); + state.onResize.call($(target).datagrid('getPanel')[0], width, height); + } + view.resizeGroup(target); + } + }); + + $.extend($.fn.datagrid.methods, { + groups:function(jq){ + return jq.datagrid('options').view.groups; + }, + expandGroup:function(jq, groupIndex){ + return jq.each(function(){ + var opts = $(this).datagrid('options'); + var view = $.data(this, 'datagrid').dc.view; + var group = view.find(groupIndex!=undefined ? 'div.datagrid-group[group-index="'+groupIndex+'"]' : 'div.datagrid-group'); + var expander = group.find('span.datagrid-row-expander'); + if (expander.hasClass('datagrid-row-expand')){ + expander.removeClass('datagrid-row-expand').addClass('datagrid-row-collapse'); + group.next('table').show(); + } + $(this).datagrid('fixRowHeight'); + if (opts.onExpandGroup){ + opts.onExpandGroup.call(this, groupIndex); + } + }); + }, + collapseGroup:function(jq, groupIndex){ + return jq.each(function(){ + var opts = $(this).datagrid('options'); + var view = $.data(this, 'datagrid').dc.view; + var group = view.find(groupIndex!=undefined ? 'div.datagrid-group[group-index="'+groupIndex+'"]' : 'div.datagrid-group'); + var expander = group.find('span.datagrid-row-expander'); + if (expander.hasClass('datagrid-row-collapse')){ + expander.removeClass('datagrid-row-collapse').addClass('datagrid-row-expand'); + group.next('table').hide(); + } + $(this).datagrid('fixRowHeight'); + if (opts.onCollapseGroup){ + opts.onCollapseGroup.call(this, groupIndex); + } + }); + }, + scrollToGroup: function(jq, groupIndex){ + return jq.each(function(){ + var state = $.data(this, 'datagrid'); + var dc = state.dc; + var grow = dc.body2.children('div.datagrid-group[group-index="'+groupIndex+'"]'); + if (grow.length){ + var groupHeight = grow.outerHeight(); + var headerHeight = dc.view2.children('div.datagrid-header')._outerHeight(); + var frozenHeight = dc.body2.outerHeight(true) - dc.body2.outerHeight(); + var top = grow.position().top - headerHeight - frozenHeight; + if (top < 0){ + dc.body2.scrollTop(dc.body2.scrollTop() + top); + } else if (top + groupHeight > dc.body2.height() - 18){ + dc.body2.scrollTop(dc.body2.scrollTop() + top + groupHeight - dc.body2.height() + 18); + } + } + }); + } + }); + + $.extend(groupview, { + refreshGroupTitle: function(target, groupIndex){ + var state = $.data(target, 'datagrid'); + var opts = state.options; + var dc = state.dc; + var group = this.groups[groupIndex]; + var span = dc.body1.add(dc.body2).children('div.datagrid-group[group-index=' + groupIndex + ']').find('span.datagrid-group-title'); + span.html(opts.groupFormatter.call(target, group.value, group.rows)); + }, + resizeGroup: function(target, groupIndex){ + var state = $.data(target, 'datagrid'); + var dc = state.dc; + var ht = dc.header2.find('table'); + var fr = ht.find('tr.datagrid-filter-row').hide(); + var ww = ht.width(); + if (groupIndex == undefined){ + var groupHeader = dc.body2.children('div.datagrid-group'); + } else { + var groupHeader = dc.body2.children('div.datagrid-group[group-index=' + groupIndex + ']'); + } + groupHeader._outerWidth(ww); + var opts = state.options; + if (opts.frozenColumns && opts.frozenColumns.length){ + var width = dc.view1.width() - opts.expanderWidth; + var isRtl = dc.view1.css('direction').toLowerCase()=='rtl'; + groupHeader.find('.datagrid-group-title').css(isRtl?'right':'left', -width+'px'); + } + if (fr.length){ + if (opts.showFilterBar){ + fr.show(); + } + } + // fr.show(); + }, + + insertRow: function(target, index, row){ + var state = $.data(target, 'datagrid'); + var opts = state.options; + var dc = state.dc; + var group = null; + var groupIndex; + + if (!state.data.rows.length){ + $(target).datagrid('loadData', [row]); + return; + } + + for(var i=0; i group.startIndex + group.rows.length){ + index = group.startIndex + group.rows.length; + } + $.fn.datagrid.defaults.view.insertRow.call(this, target, index, row); + + if (index >= group.startIndex + group.rows.length){ + _moveTr(index, true); + _moveTr(index, false); + } + group.rows.splice(index - group.startIndex, 0, row); + } else { + group = { + value: row[opts.groupField], + rows: [row], + startIndex: state.data.rows.length + } + groupIndex = this.groups.length; + dc.body1.append(this.renderGroup.call(this, target, groupIndex, group, true)); + dc.body2.append(this.renderGroup.call(this, target, groupIndex, group, false)); + this.groups.push(group); + state.data.rows.push(row); + } + + this.setGroupIndex(target); + this.refreshGroupTitle(target, groupIndex); + this.resizeGroup(target); + + function _moveTr(index,frozen){ + var serno = frozen?1:2; + var prevTr = opts.finder.getTr(target, index-1, 'body', serno); + var tr = opts.finder.getTr(target, index, 'body', serno); + tr.insertAfter(prevTr); + } + }, + + updateRow: function(target, index, row){ + var opts = $.data(target, 'datagrid').options; + $.fn.datagrid.defaults.view.updateRow.call(this, target, index, row); + var tb = opts.finder.getTr(target, index, 'body', 2).closest('table.datagrid-btable'); + var groupIndex = parseInt(tb.prev().attr('group-index')); + this.refreshGroupTitle(target, groupIndex); + }, + + deleteRow: function(target, index){ + var state = $.data(target, 'datagrid'); + var opts = state.options; + var dc = state.dc; + var body = dc.body1.add(dc.body2); + + var tb = opts.finder.getTr(target, index, 'body', 2).closest('table.datagrid-btable'); + var groupIndex = parseInt(tb.prev().attr('group-index')); + + $.fn.datagrid.defaults.view.deleteRow.call(this, target, index); + + var group = this.groups[groupIndex]; + if (group.rows.length > 1){ + group.rows.splice(index-group.startIndex, 1); + this.refreshGroupTitle(target, groupIndex); + } else { + body.children('div.datagrid-group[group-index='+groupIndex+']').remove(); + for(var i=groupIndex+1; i offset.top && e.pageY < offset.top + edge) { + dir += 'n'; + } else if (e.pageY < offset.top + height && e.pageY > offset.top + height - edge) { + dir += 's'; + } + if (e.pageX > offset.left && e.pageX < offset.left + edge) { + dir += 'w'; + } else if (e.pageX < offset.left + width && e.pageX > offset.left + width - edge) { + dir += 'e'; + } + + var handles = opts.handles.split(','); + handles = $.map(handles, function(h){return $.trim(h).toLowerCase();}); + if ($.inArray('all', handles) >= 0 || $.inArray(dir, handles) >= 0){ + return dir; + } + for(var i=0; i= 0){ + return handles[index]; + } + } + return ''; + } + + $.fn.resizable = function(options, param){ + if (typeof options == 'string'){ + return $.fn.resizable.methods[options](this, param); + } + + return this.each(function(){ + var opts = null; + var state = $.data(this, 'resizable'); + if (state) { + $(this).unbind('.resizable'); + opts = $.extend(state.options, options || {}); + } else { + opts = $.extend({}, $.fn.resizable.defaults, $.fn.resizable.parseOptions(this), options || {}); + $.data(this, 'resizable', { + options:opts + }); + } + + if (opts.disabled == true) { + return; + } + $(this).bind('mousemove.resizable', {target:this}, function(e){ + if ($.fn.resizable.isResizing){return} + var dir = getDirection(e); + $(e.data.target).css('cursor', dir ? dir+'-resize' : ''); + }).bind('mouseleave.resizable', {target:this}, function(e){ + $(e.data.target).css('cursor', ''); + }).bind('mousedown.resizable', {target:this}, function(e){ + var dir = getDirection(e); + if (dir == ''){return;} + + function getCssValue(css) { + var val = parseInt($(e.data.target).css(css)); + if (isNaN(val)) { + return 0; + } else { + return val; + } + } + + var data = { + target: e.data.target, + dir: dir, + startLeft: getCssValue('left'), + startTop: getCssValue('top'), + left: getCssValue('left'), + top: getCssValue('top'), + startX: e.pageX, + startY: e.pageY, + startWidth: $(e.data.target).outerWidth(), + startHeight: $(e.data.target).outerHeight(), + width: $(e.data.target).outerWidth(), + height: $(e.data.target).outerHeight(), + deltaWidth: $(e.data.target).outerWidth() - $(e.data.target).width(), + deltaHeight: $(e.data.target).outerHeight() - $(e.data.target).height() + }; + $(document).bind('mousedown.resizable', data, doDown); + $(document).bind('mousemove.resizable', data, doMove); + $(document).bind('mouseup.resizable', data, doUp); + $('body').css('cursor', dir+'-resize'); + }); + }); + }; + + $.fn.resizable.methods = { + options: function(jq){ + return $.data(jq[0], 'resizable').options; + }, + enable: function(jq){ + return jq.each(function(){ + $(this).resizable({disabled:false}); + }); + }, + disable: function(jq){ + return jq.each(function(){ + $(this).resizable({disabled:true}); + }); + } + }; + + $.fn.resizable.parseOptions = function(target){ + var t = $(target); + return $.extend({}, + $.parser.parseOptions(target, [ + 'handles',{minWidth:'number',minHeight:'number',maxWidth:'number',maxHeight:'number',edge:'number'} + ]), { + disabled: (t.attr('disabled') ? true : undefined) + }) + }; + + $.fn.resizable.defaults = { + disabled:false, + handles:'n, e, s, w, ne, se, sw, nw, all', + minWidth: 10, + minHeight: 10, + maxWidth: 10000,//$(document).width(), + maxHeight: 10000,//$(document).height(), + edge:5, + onStartResize: function(e){}, + onResize: function(e){}, + onStopResize: function(e){} + }; + + $.fn.resizable.isResizing = false; + +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.slider.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.slider.js new file mode 100644 index 000000000..dc9b8142e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.slider.js @@ -0,0 +1,455 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * slider - EasyUI for jQuery + * + * Dependencies: + * draggable + * + */ +(function($){ + function init(target){ + var slider = $('
                                                      ' + + '
                                                      ' + + '' + + '' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '' + + '
                                                      ').insertAfter(target); + var t = $(target); + t.addClass('slider-f').hide(); + var name = t.attr('name'); + if (name){ + slider.find('input.slider-value').attr('name', name); + t.removeAttr('name').attr('sliderName', name); + } + slider.bind('_resize', function(e,force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(target); + } + return false; + }); + return slider; + } + + /** + * set the slider size, for vertical slider, the height property is required + */ + function setSize(target, param){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + + if (param){ + if (param.width) opts.width = param.width; + if (param.height) opts.height = param.height; + } + slider._size(opts); + if (opts.mode == 'h'){ + slider.css('height', ''); + slider.children('div').css('height', ''); + } else { + slider.css('width', ''); + slider.children('div').css('width', ''); + slider.children('div.slider-rule,div.slider-rulelabel,div.slider-inner')._outerHeight(slider._outerHeight()); + } + initValue(target); + } + + /** + * show slider rule if needed + */ + function showRule(target){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + + var aa = opts.mode == 'h' ? opts.rule : opts.rule.slice(0).reverse(); + if (opts.reversed){ + aa = aa.slice(0).reverse(); + } + _build(aa); + + function _build(aa){ + var rule = slider.find('div.slider-rule'); + var label = slider.find('div.slider-rulelabel'); + rule.empty(); + label.empty(); + for(var i=0; i').appendTo(rule); + span.css((opts.mode=='h'?'left':'top'), distance); + + // show the labels + if (aa[i] != '|'){ + span = $('').appendTo(label); + span.html(aa[i]); + if (opts.mode == 'h'){ + span.css({ + left: distance, + marginLeft: -Math.round(span.outerWidth()/2) + }); + } else { + span.css({ + top: distance, + marginTop: -Math.round(span.outerHeight()/2) + }); + } + } + } + } + } + + /** + * build the slider and set some properties + */ + function buildSlider(target){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + + slider.removeClass('slider-h slider-v slider-disabled'); + slider.addClass(opts.mode == 'h' ? 'slider-h' : 'slider-v'); + slider.addClass(opts.disabled ? 'slider-disabled' : ''); + + var inner = slider.find('.slider-inner'); + inner.html( + '' + + '' + ); + if (opts.range){ + inner.append( + '' + + '' + ); + } + + slider.find('a.slider-handle').draggable({ + axis:opts.mode, + cursor:'pointer', + disabled: opts.disabled, + onDrag:function(e){ + var left = e.data.left; + var width = slider.width(); + if (opts.mode!='h'){ + left = e.data.top; + width = slider.height(); + } + if (left < 0 || left > width) { + return false; + } else { + setPos(left, this); + return false; + } + }, + onStartDrag:function(){ + state.isDragging = true; + opts.onSlideStart.call(target, opts.value); + }, + onStopDrag:function(e){ + setPos(opts.mode=='h'?e.data.left:e.data.top, this); + opts.onSlideEnd.call(target, opts.value); + opts.onComplete.call(target, opts.value); + state.isDragging = false; + } + }); + slider.find('div.slider-inner').unbind('.slider').bind('mousedown.slider', function(e){ + if (state.isDragging || opts.disabled){return} + var pos = $(this).offset(); + setPos(opts.mode=='h'?(e.pageX-pos.left):(e.pageY-pos.top)); + opts.onComplete.call(target, opts.value); + }); + + function fixVal(value){ + var dd = String(opts.step).split('.'); + var dlen = dd.length>1 ? dd[1].length : 0; + return parseFloat(value.toFixed(dlen)); + } + + function setPos(pos, handle){ + var value = pos2value(target, pos); + var s = Math.abs(value % opts.step); + if (s < opts.step/2){ + value -= s; + } else { + value = value - s + opts.step; + } + value = fixVal(value); + if (opts.range){ + var v1 = opts.value[0]; + var v2 = opts.value[1]; + var m = parseFloat((v1+v2)/2); + if (handle){ + var isLeft = $(handle).nextAll('.slider-handle').length > 0; + if (value <= v2 && isLeft){ + v1 = value; + } else if (value >= v1 && (!isLeft)){ + v2 = value; + } + } else { + if (value < v1){ + v1 = value; + } else if (value > v2){ + v2 = value; + } else { + value < m ? v1 = value : v2 = value; + } + } + $(target).slider('setValues', [v1,v2]); + } else { + $(target).slider('setValue', value); + } + } + } + + /** + * set a specified value to slider + */ + function setValues(target, values){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + var oldValues = $.isArray(opts.value) ? opts.value : [opts.value]; + var newValues = []; + + if (!$.isArray(values)){ + values = $.map(String(values).split(opts.separator), function(v){ + return parseFloat(v); + }); + } + + slider.find('.slider-value').remove(); + var name = $(target).attr('sliderName') || ''; + for(var i=0; i opts.max) value = opts.max; + + var input = $('').appendTo(slider); + input.attr('name', name); + input.val(value); + newValues.push(value); + + var handle = slider.find('.slider-handle:eq('+i+')'); + var tip = handle.next(); + var pos = value2pos(target, value); + if (opts.showTip){ + tip.show(); + tip.html(opts.tipFormatter.call(target, value)); + } else { + tip.hide(); + } + + if (opts.mode == 'h'){ + var style = 'left:'+pos+'px;'; + handle.attr('style', style); + tip.attr('style', style + 'margin-left:' + (-Math.round(tip.outerWidth()/2)) + 'px'); + } else { + var style = 'top:' + pos + 'px;'; + handle.attr('style', style); + tip.attr('style', style + 'margin-left:' + (-Math.round(tip.outerWidth())) + 'px'); + } + } + opts.value = opts.range ? newValues : newValues[0]; + $(target).val(opts.range ? newValues.join(opts.separator) : newValues[0]); + + if (oldValues.join(',') != newValues.join(',')){ + opts.onChange.call(target, opts.value, (opts.range?oldValues:oldValues[0])); + } + } + + function initValue(target){ + var opts = $.data(target, 'slider').options; + var fn = opts.onChange; + opts.onChange = function(){}; + setValues(target, opts.value); + opts.onChange = fn; + } + + /** + * translate value to slider position + */ + function value2pos(target, value){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + var size = opts.mode == 'h' ? slider.width() : slider.height(); + var pos = opts.converter.toPosition.call(target, value, size); + if (opts.mode == 'v'){ + pos = slider.height() - pos; + } + if (opts.reversed){ + pos = size - pos; + } + return pos; + // return pos.toFixed(0); + } + + /** + * translate slider position to value + */ + function pos2value(target, pos){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + var size = opts.mode == 'h' ? slider.width() : slider.height(); + var pos = opts.mode=='h' ? (opts.reversed?(size-pos):pos) : (opts.reversed?pos:(size-pos)); + var value = opts.converter.toValue.call(target, pos, size); + return value; + // return value.toFixed(0); + } + + $.fn.slider = function(options, param){ + if (typeof options == 'string'){ + return $.fn.slider.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'slider'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'slider', { + options: $.extend({}, $.fn.slider.defaults, $.fn.slider.parseOptions(this), options), + slider: init(this) + }); + // $(this).removeAttr('disabled'); + $(this)._propAttr('disabled', false); + } + + var opts = state.options; + opts.min = parseFloat(opts.min); + opts.max = parseFloat(opts.max); + if (opts.range){ + if (!$.isArray(opts.value)){ + opts.value = $.map(String(opts.value).split(opts.separator), function(v){ + return parseFloat(v); + }); + } + if (opts.value.length < 2){ + opts.value.push(opts.max); + } + } else { + opts.value = parseFloat(opts.value); + } + opts.step = parseFloat(opts.step); + opts.originalValue = opts.value; + + buildSlider(this); + showRule(this); + setSize(this); + }); + }; + + $.fn.slider.methods = { + options: function(jq){ + return $.data(jq[0], 'slider').options; + }, + destroy: function(jq){ + return jq.each(function(){ + $.data(this, 'slider').slider.remove(); + $(this).remove(); + }); + }, + resize: function(jq, param){ + return jq.each(function(){ + setSize(this, param); + }); + }, + getValue: function(jq){ + return jq.slider('options').value; + }, + getValues: function(jq){ + return jq.slider('options').value; + }, + setValue: function(jq, value){ + return jq.each(function(){ + setValues(this, [value]); + }); + }, + setValues: function(jq, values){ + return jq.each(function(){ + setValues(this, values); + }); + }, + clear: function(jq){ + return jq.each(function(){ + var opts = $(this).slider('options'); + setValues(this, opts.range?[opts.min,opts.max]:[opts.min]); + }); + }, + reset: function(jq){ + return jq.each(function(){ + var opts = $(this).slider('options'); + $(this).slider(opts.range?'setValues':'setValue', opts.originalValue); + }); + }, + enable: function(jq){ + return jq.each(function(){ + $.data(this, 'slider').options.disabled = false; + buildSlider(this); + }); + }, + disable: function(jq){ + return jq.each(function(){ + $.data(this, 'slider').options.disabled = true; + buildSlider(this); + }); + } + }; + + $.fn.slider.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, [ + 'width','height','mode',{reversed:'boolean',showTip:'boolean',range:'boolean',min:'number',max:'number',step:'number'} + ]), { + value: (t.val() || undefined), + disabled: (t.attr('disabled') ? true : undefined), + rule: (t.attr('rule') ? eval(t.attr('rule')) : undefined) + }); + }; + + $.fn.slider.defaults = { + width: 'auto', + height: 'auto', + mode: 'h', // 'h'(horizontal) or 'v'(vertical) + reversed: false, + showTip: false, + disabled: false, + range: false, + value: 0, + separator: ',', + min: 0, + max: 100, + step: 1, + rule: [], // [0,'|',100] + tipFormatter: function(value){return value}, + converter:{ + toPosition:function(value, size){ + var opts = $(this).slider('options'); + var p = (value-opts.min)/(opts.max-opts.min)*size; + return p; + }, + toValue:function(pos, size){ + var opts = $(this).slider('options'); + var v = opts.min + (opts.max-opts.min)*(pos/size); + return v; + } + }, + onChange: function(value, oldValue){}, + onSlideStart: function(value){}, + onSlideEnd: function(value){}, + onComplete: function(value){} + }; +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.tabs.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.tabs.js new file mode 100644 index 000000000..1037a23fb --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.tabs.js @@ -0,0 +1,927 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * tabs - EasyUI for jQuery + * + * Dependencies: + * panel + * linkbutton + * + */ +(function($){ + function getContentWidth(c){ + var w = 0; + $(c).children().each(function(){ + w += $(this).outerWidth(true); + }); + return w; + } + /** + * set the tabs scrollers to show or not, + * dependent on the tabs count and width + */ + function setScrollers(container) { + var opts = $.data(container, 'tabs').options; + if (!opts.showHeader){return} + + var header = $(container).children('div.tabs-header'); + var tool = header.children('div.tabs-tool:not(.tabs-tool-hidden)'); + var sLeft = header.children('div.tabs-scroller-left'); + var sRight = header.children('div.tabs-scroller-right'); + var wrap = header.children('div.tabs-wrap'); + + if (opts.tabPosition == 'left' || opts.tabPosition == 'right'){ + if (!tool.length){return} + tool._outerWidth(header.width()); + var toolCss = { + left: opts.tabPosition == 'left' ? 'auto':0, + right: opts.tabPosition == 'left' ? 0 : 'auto', + top: opts.toolPosition == 'top' ? 0 : 'auto', + bottom: opts.toolPosition == 'top' ? 'auto' : 0 + }; + var wrapCss = { + marginTop: opts.toolPosition == 'top' ? tool.outerHeight() : 0 + }; + tool.css(toolCss); + wrap.css(wrapCss); + return; + } + + // set the tool height + var tHeight = header.outerHeight(); + if (opts.plain){ + tHeight -= tHeight - header.height(); + } + tool._outerHeight(tHeight); + + var tabsWidth = getContentWidth(header.find('ul.tabs')); + var cWidth = header.width() - tool._outerWidth(); + + if (tabsWidth > cWidth) { + sLeft.add(sRight).show()._outerHeight(tHeight); + if (opts.toolPosition == 'left'){ + tool.css({ + left: sLeft.outerWidth(), + right: '' + }); + wrap.css({ + marginLeft: sLeft.outerWidth() + tool._outerWidth(), + marginRight: sRight._outerWidth(), + width: cWidth - sLeft.outerWidth() - sRight.outerWidth() + }); + } else { + tool.css({ + left: '', + right: sRight.outerWidth() + }); + wrap.css({ + marginLeft: sLeft.outerWidth(), + marginRight: sRight.outerWidth() + tool._outerWidth(), + width: cWidth - sLeft.outerWidth() - sRight.outerWidth() + }); + } + } else { + sLeft.add(sRight).hide(); + if (opts.toolPosition == 'left'){ + tool.css({ + left: 0, + right: '' + }); + wrap.css({ + marginLeft: tool._outerWidth(), + marginRight: 0, + width: cWidth + }); + } else { + tool.css({ + left: '', + right: 0 + }); + wrap.css({ + marginLeft: 0, + marginRight: tool._outerWidth(), + width: cWidth + }); + } + } + } + + function addTools(container){ + var opts = $.data(container, 'tabs').options; + var header = $(container).children('div.tabs-header'); + if (opts.tools) { + if (typeof opts.tools == 'string'){ + $(opts.tools).addClass('tabs-tool').appendTo(header); + $(opts.tools).show(); + } else { + header.children('div.tabs-tool').remove(); + var tools = $('
                                                      ').appendTo(header); + var tr = tools.find('tr'); + for(var i=0; i').appendTo(tr); + var tool = $('').appendTo(td); + tool[0].onclick = eval(opts.tools[i].handler || function(){}); + tool.linkbutton($.extend({}, opts.tools[i], { + plain: true + })); + } + } + } else { + header.children('div.tabs-tool').remove(); + } + } + + function setSize(container, param) { + var state = $.data(container, 'tabs'); + var opts = state.options; + var cc = $(container); + + if (!opts.doSize){return} + if (param){ + $.extend(opts, { + width: param.width, + height: param.height + }); + } + cc._size(opts); + + var header = cc.children('div.tabs-header'); + var panels = cc.children('div.tabs-panels'); + var wrap = header.find('div.tabs-wrap'); + var ul = wrap.find('.tabs'); + ul.children('li').removeClass('tabs-first tabs-last'); + ul.children('li:first').addClass('tabs-first'); + ul.children('li:last').addClass('tabs-last'); + + if (opts.tabPosition == 'left' || opts.tabPosition == 'right'){ + header._outerWidth(opts.showHeader ? opts.headerWidth : 0); + panels._outerWidth(cc.width() - header.outerWidth()); + header.add(panels)._size('height', isNaN(parseInt(opts.height)) ? '' : cc.height()); + wrap._outerWidth(header.width()); + ul._outerWidth(wrap.width()).css('height',''); + } else { + header.children('div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)').css('display', opts.showHeader?'block':'none'); + header._outerWidth(cc.width()).css('height',''); + if (opts.showHeader){ + header.css('background-color',''); + wrap.css('height',''); + } else { + header.css('background-color','transparent'); + header._outerHeight(0); + wrap._outerHeight(0); + } + ul._outerHeight(opts.tabHeight).css('width',''); + ul._outerHeight(ul.outerHeight()-ul.height()-1+opts.tabHeight).css('width',''); + + panels._size('height', isNaN(parseInt(opts.height)) ? '' : (cc.height()-header.outerHeight())); + panels._size('width', cc.width()); + } + + if (state.tabs.length){ + var d1 = ul.outerWidth(true) - ul.width(); + var li = ul.children('li:first'); + var d2 = li.outerWidth(true) - li.width(); + var hwidth = header.width() - header.children('.tabs-tool:not(.tabs-tool-hidden)')._outerWidth(); + var justifiedWidth = Math.floor((hwidth-d1-d2*state.tabs.length)/state.tabs.length); + + $.map(state.tabs, function(p){ + setTabSize(p, (opts.justified && $.inArray(opts.tabPosition,['top','bottom'])>=0) ? justifiedWidth : undefined); + }); + if (opts.justified && $.inArray(opts.tabPosition,['top','bottom'])>=0){ + var deltaWidth = hwidth - d1 - getContentWidth(ul); + setTabSize(state.tabs[state.tabs.length-1], justifiedWidth+deltaWidth); + } + } + setScrollers(container); + + function setTabSize(p, width){ + var p_opts = p.panel('options'); + var p_t = p_opts.tab.find('a.tabs-inner'); + var width = width ? width : (parseInt(p_opts.tabWidth||opts.tabWidth||undefined)); + if (width){ + p_t._outerWidth(width); + } else { + p_t.css('width', ''); + } + p_t._outerHeight(opts.tabHeight); + p_t.css('lineHeight', p_t.height()+'px'); + p_t.find('.easyui-fluid:visible').triggerHandler('_resize'); + } + } + + /** + * set selected tab panel size + */ + function setSelectedSize(container){ + var opts = $.data(container, 'tabs').options; + var tab = getSelectedTab(container); + if (tab){ + var panels = $(container).children('div.tabs-panels'); + var width = opts.width=='auto' ? 'auto' : panels.width(); + var height = opts.height=='auto' ? 'auto' : panels.height(); + tab.panel('resize', { + width: width, + height: height + }); + } + } + + /** + * wrap the tabs header and body + */ + function wrapTabs(container) { + var tabs = $.data(container, 'tabs').tabs; + var cc = $(container).addClass('tabs-container'); + var panels = $('
                                                      ').insertBefore(cc); + cc.children('div').each(function(){ + panels[0].appendChild(this); + }); + cc[0].appendChild(panels[0]); + $('
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '
                                                      ' + + '
                                                        ' + + '
                                                        ' + + '
                                                        ').prependTo(container); + + cc.children('div.tabs-panels').children('div').each(function(i){ + var opts = $.extend({}, $.parser.parseOptions(this), { + disabled: ($(this).attr('disabled') ? true : undefined), + selected: ($(this).attr('selected') ? true : undefined) + }); + createTab(container, opts, $(this)); + }); + + cc.children('div.tabs-header').find('.tabs-scroller-left, .tabs-scroller-right').hover( + function(){$(this).addClass('tabs-scroller-over');}, + function(){$(this).removeClass('tabs-scroller-over');} + ); + cc.bind('_resize', function(e,force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(container); + setSelectedSize(container); + } + return false; + }); + } + + function bindEvents(container){ + var state = $.data(container, 'tabs') + var opts = state.options; + $(container).children('div.tabs-header').unbind().bind('click', function(e){ + if ($(e.target).hasClass('tabs-scroller-left')){ + $(container).tabs('scrollBy', -opts.scrollIncrement); + } else if ($(e.target).hasClass('tabs-scroller-right')){ + $(container).tabs('scrollBy', opts.scrollIncrement); + } else { + var li = $(e.target).closest('li'); + if (li.hasClass('tabs-disabled')){return false;} + var a = $(e.target).closest('a.tabs-close'); + if (a.length){ + closeTab(container, getLiIndex(li)); + } else if (li.length){ +// selectTab(container, getLiIndex(li)); + var index = getLiIndex(li); + var popts = state.tabs[index].panel('options'); + if (popts.collapsible){ + popts.closed ? selectTab(container, index) : unselectTab(container, index); + } else { + selectTab(container, index); + } + } + return false; + } + }).bind('contextmenu', function(e){ + var li = $(e.target).closest('li'); + if (li.hasClass('tabs-disabled')){return;} + if (li.length){ + opts.onContextMenu.call(container, e, li.find('span.tabs-title').html(), getLiIndex(li)); + } + }); + + function getLiIndex(li){ + var index = 0; + li.parent().children('li').each(function(i){ + if (li[0] == this){ + index = i; + return false; + } + }); + return index; + } + } + + function setProperties(container){ + var opts = $.data(container, 'tabs').options; + var header = $(container).children('div.tabs-header'); + var panels = $(container).children('div.tabs-panels'); + + header.removeClass('tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right'); + panels.removeClass('tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right'); + if (opts.tabPosition == 'top'){ + header.insertBefore(panels); + } else if (opts.tabPosition == 'bottom'){ + header.insertAfter(panels); + header.addClass('tabs-header-bottom'); + panels.addClass('tabs-panels-top'); + } else if (opts.tabPosition == 'left'){ + header.addClass('tabs-header-left'); + panels.addClass('tabs-panels-right'); + } else if (opts.tabPosition == 'right'){ + header.addClass('tabs-header-right'); + panels.addClass('tabs-panels-left'); + } + + if (opts.plain == true) { + header.addClass('tabs-header-plain'); + } else { + header.removeClass('tabs-header-plain'); + } + header.removeClass('tabs-header-narrow').addClass(opts.narrow?'tabs-header-narrow':''); + var tabs = header.find('.tabs'); + tabs.removeClass('tabs-pill').addClass(opts.pill?'tabs-pill':''); + tabs.removeClass('tabs-narrow').addClass(opts.narrow?'tabs-narrow':''); + tabs.removeClass('tabs-justified').addClass(opts.justified?'tabs-justified':''); + if (opts.border == true){ + header.removeClass('tabs-header-noborder'); + panels.removeClass('tabs-panels-noborder'); + } else { + header.addClass('tabs-header-noborder'); + panels.addClass('tabs-panels-noborder'); + } + opts.doSize = true; + } + + function createTab(container, options, pp) { + options = options || {}; + var state = $.data(container, 'tabs'); + var tabs = state.tabs; + if (options.index == undefined || options.index > tabs.length){options.index = tabs.length} + if (options.index < 0){options.index = 0} + + var ul = $(container).children('div.tabs-header').find('ul.tabs'); + var panels = $(container).children('div.tabs-panels'); + var tab = $( + '
                                                      • ' + + '' + + '' + + '' + + '' + + '
                                                      • '); + if (!pp){pp = $('
                                                        ');} + if (options.index >= tabs.length){ + tab.appendTo(ul); + pp.appendTo(panels); + tabs.push(pp); + } else { + tab.insertBefore(ul.children('li:eq('+options.index+')')); + pp.insertBefore(panels.children('div.panel:eq('+options.index+')')); + tabs.splice(options.index, 0, pp); + } + + // create panel + pp.panel($.extend({}, options, { + tab: tab, + border: false, + noheader: true, + closed: true, + doSize: false, + iconCls: (options.icon ? options.icon : undefined), + onLoad: function(){ + if (options.onLoad){ + options.onLoad.apply(this, arguments); + } + state.options.onLoad.call(container, $(this)); + }, + onBeforeOpen: function(){ + if (options.onBeforeOpen){ + if (options.onBeforeOpen.call(this) == false){return false;} + } + var p = $(container).tabs('getSelected'); + if (p){ + if (p[0] != this){ + $(container).tabs('unselect', getTabIndex(container, p)); + p = $(container).tabs('getSelected'); + if (p){ + return false; + } + } else { + setSelectedSize(container); + return false; + } + } + + var popts = $(this).panel('options'); + popts.tab.addClass('tabs-selected'); + // scroll the tab to center position if required. + var wrap = $(container).find('>div.tabs-header>div.tabs-wrap'); + var left = popts.tab.position().left; + var right = left + popts.tab.outerWidth(); + if (left < 0 || right > wrap.width()){ + var deltaX = left - (wrap.width()-popts.tab.width()) / 2; + $(container).tabs('scrollBy', deltaX); + } else { + $(container).tabs('scrollBy', 0); + } + + var panel = $(this).panel('panel'); + panel.css('display','block'); + setSelectedSize(container); + panel.css('display','none'); + }, + onOpen: function(){ + if (options.onOpen){ + options.onOpen.call(this); + } + var popts = $(this).panel('options'); + var index = getTabIndex(container, this); + // state.selectHis.push(popts.title); + state.selectHis.push(index); + state.options.onSelect.call(container, popts.title, index); + }, + onBeforeClose: function(){ + if (options.onBeforeClose){ + if (options.onBeforeClose.call(this) == false){return false;} + } + $(this).panel('options').tab.removeClass('tabs-selected'); + }, + onClose: function(){ + if (options.onClose){ + options.onClose.call(this); + } + var popts = $(this).panel('options'); + state.options.onUnselect.call(container, popts.title, getTabIndex(container, this)); + } + })); + + // only update the tab header + $(container).tabs('update', { + tab: pp, + options: pp.panel('options'), + type: 'header' + }); + } + + function addTab(container, options) { + var state = $.data(container, 'tabs'); + var opts = state.options; + if (options.selected == undefined) options.selected = true; + + createTab(container, options); + opts.onAdd.call(container, options.title, options.index); + if (options.selected){ + selectTab(container, options.index); // select the added tab panel + } + } + + /** + * update tab panel, param has following properties: + * tab: the tab panel to be updated + * options: the tab panel options + * type: the update type, possible values are: 'header','body','all' + */ + function updateTab(container, param){ + param.type = param.type || 'all'; + var selectHis = $.data(container, 'tabs').selectHis; + var pp = param.tab; // the tab panel + var opts = pp.panel('options'); // get the tab panel options + var oldTitle = opts.title; + $.extend(opts, param.options, { + iconCls: (param.options.icon ? param.options.icon : undefined) + }); + + if (param.type == 'all' || param.type == 'body'){ + pp.panel(); + } + if (param.type == 'all' || param.type == 'header'){ + var tab = opts.tab; + + if (opts.header){ + tab.find('.tabs-inner').html($(opts.header)); + } else { + var s_title = tab.find('span.tabs-title'); + var s_icon = tab.find('span.tabs-icon'); + s_title.html(opts.title); + s_icon.attr('class', 'tabs-icon'); + + tab.find('a.tabs-close').remove(); + if (opts.closable){ + s_title.addClass('tabs-closable'); + $('').appendTo(tab); + } else{ + s_title.removeClass('tabs-closable'); + } + if (opts.iconCls){ + s_title.addClass('tabs-with-icon'); + s_icon.addClass(opts.iconCls); + } else { + s_title.removeClass('tabs-with-icon'); + } + if (opts.tools){ + var p_tool = tab.find('span.tabs-p-tool'); + if (!p_tool.length){ + var p_tool = $('').insertAfter(tab.find('a.tabs-inner')); + } + if ($.isArray(opts.tools)){ + p_tool.empty(); + for(var i=0; i').appendTo(p_tool); + t.addClass(opts.tools[i].iconCls); + if (opts.tools[i].handler){ + t.bind('click', {handler:opts.tools[i].handler}, function(e){ + if ($(this).parents('li').hasClass('tabs-disabled')){return;} + e.data.handler.call(this); + }); + } + } + } else { + $(opts.tools).children().appendTo(p_tool); + } + var pr = p_tool.children().length * 12; + if (opts.closable) { + pr += 8; + p_tool.css('right', ''); + } else { + pr -= 3; + p_tool.css('right','5px'); + } + s_title.css('padding-right', pr+'px'); + } else { + tab.find('span.tabs-p-tool').remove(); + s_title.css('padding-right', ''); + } + } + // if (oldTitle != opts.title){ + // for(var i=0; i index ? tindex-1 : tindex); + } + } + state.selectHis = his; + var selected = $(container).tabs('getSelected'); + if (!selected && his.length){ + index = state.selectHis.pop(); + $(container).tabs('select', index); + } + + // for(var i=0; i=0 && which < tabs.length){ + tab = tabs[which]; + if (removeit){ + tabs.splice(which, 1); + } + } + } else { + var tmp = $(''); + for(var i=0; i.tabs-header>.tabs-tool'); + if (visible){ + tool.removeClass('tabs-tool-hidden').show(); + } else { + tool.addClass('tabs-tool-hidden').hide(); + } + $(container).tabs('resize').tabs('scrollBy', 0); + } + + + $.fn.tabs = function(options, param){ + if (typeof options == 'string') { + return $.fn.tabs.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'tabs'); + if (state) { + $.extend(state.options, options); + } else { + $.data(this, 'tabs', { + options: $.extend({},$.fn.tabs.defaults, $.fn.tabs.parseOptions(this), options), + tabs: [], + selectHis: [] + }); + wrapTabs(this); + } + + addTools(this); + setProperties(this); + setSize(this); + bindEvents(this); + + doFirstSelect(this); + }); + }; + + $.fn.tabs.methods = { + options: function(jq){ + var cc = jq[0]; + var opts = $.data(cc, 'tabs').options; + var s = getSelectedTab(cc); + opts.selected = s ? getTabIndex(cc, s) : -1; + return opts; + }, + tabs: function(jq){ + return $.data(jq[0], 'tabs').tabs; + }, + resize: function(jq, param){ + return jq.each(function(){ + setSize(this, param); + setSelectedSize(this); + }); + }, + add: function(jq, options){ + return jq.each(function(){ + addTab(this, options); + }); + }, + close: function(jq, which){ + return jq.each(function(){ + closeTab(this, which); + }); + }, + getTab: function(jq, which){ + return getTab(jq[0], which); + }, + getTabIndex: function(jq, tab){ + return getTabIndex(jq[0], tab); + }, + getSelected: function(jq){ + return getSelectedTab(jq[0]); + }, + select: function(jq, which){ + return jq.each(function(){ + selectTab(this, which); + }); + }, + unselect: function(jq, which){ + return jq.each(function(){ + unselectTab(this, which); + }); + }, + exists: function(jq, which){ + return exists(jq[0], which); + }, + update: function(jq, options){ + return jq.each(function(){ + updateTab(this, options); + }); + }, + enableTab: function(jq, which){ + return jq.each(function(){ + var opts = $(this).tabs('getTab', which).panel('options'); + opts.tab.removeClass('tabs-disabled'); + opts.disabled = false; + }); + }, + disableTab: function(jq, which){ + return jq.each(function(){ + var opts = $(this).tabs('getTab', which).panel('options'); + opts.tab.addClass('tabs-disabled'); + opts.disabled = true; + }); + }, + showHeader: function(jq){ + return jq.each(function(){ + showHeader(this, true); + }); + }, + hideHeader: function(jq){ + return jq.each(function(){ + showHeader(this, false); + }); + }, + showTool: function(jq){ + return jq.each(function(){ + showTool(this, true); + }); + }, + hideTool: function(jq){ + return jq.each(function(){ + showTool(this, false); + }); + }, + scrollBy: function(jq, deltaX){ // scroll the tab header by the specified amount of pixels + return jq.each(function(){ + var opts = $(this).tabs('options'); + var wrap = $(this).find('>div.tabs-header>div.tabs-wrap'); + var pos = Math.min(wrap._scrollLeft() + deltaX, getMaxScrollWidth()); + wrap.animate({scrollLeft: pos}, opts.scrollDuration); + + function getMaxScrollWidth(){ + var w = 0; + var ul = wrap.children('ul'); + ul.children('li').each(function(){ + w += $(this).outerWidth(true); + }); + return w - wrap.width() + (ul.outerWidth() - ul.width()); + } + }); + } + }; + + $.fn.tabs.parseOptions = function(target){ + return $.extend({}, $.parser.parseOptions(target, [ + 'tools','toolPosition','tabPosition', + {fit:'boolean',border:'boolean',plain:'boolean'}, + {headerWidth:'number',tabWidth:'number',tabHeight:'number',selected:'number'}, + {showHeader:'boolean',justified:'boolean',narrow:'boolean',pill:'boolean'} + ])); + }; + + $.fn.tabs.defaults = { + width: 'auto', + height: 'auto', + headerWidth: 150, // the tab header width, it is valid only when tabPosition set to 'left' or 'right' + tabWidth: 'auto', // the tab width + // tabHeight: 27, // the tab height + tabHeight: 32, // the tab height + selected: 0, // the initialized selected tab index + showHeader: true, + plain: false, + fit: false, + border: true, + justified: false, + narrow: false, + pill: false, + tools: null, + toolPosition: 'right', // left,right,top,bottom + tabPosition: 'top', // possible values: top,bottom + scrollIncrement: 100, + scrollDuration: 400, + onLoad: function(panel){}, + onSelect: function(title, index){}, + onUnselect: function(title, index){}, + onBeforeClose: function(title, index){}, + onClose: function(title, index){}, + onAdd: function(title, index){}, + onUpdate: function(title, index){}, + onContextMenu: function(e, title, index){} + }; +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/src/jquery.window.js b/testapps/GHIssues/src/main/resources/asset/src/jquery.window.js new file mode 100644 index 000000000..fb9bbf8d8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/src/jquery.window.js @@ -0,0 +1,417 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * window - EasyUI for jQuery + * + * Dependencies: + * panel + * draggable + * resizable + * + */ +(function($){ + function moveWindow(target, param){ + var state = $.data(target, 'window'); + if (param){ + if (param.left != null) state.options.left = param.left; + if (param.top != null) state.options.top = param.top; + } + $(target).panel('move', state.options); + if (state.shadow){ + state.shadow.css({ + left: state.options.left, + top: state.options.top + }); + } + } + + /** + * center the window only horizontally + */ + function hcenter(target, tomove){ + var opts = $.data(target, 'window').options; + var pp = $(target).window('panel'); + var width = pp._outerWidth(); + if (opts.inline){ + var parent = pp.parent(); + opts.left = Math.ceil((parent.width() - width) / 2 + parent.scrollLeft()); + } else { + opts.left = Math.ceil(($(window)._outerWidth() - width) / 2 + $(document).scrollLeft()); + } + if (tomove){moveWindow(target);} + } + + /** + * center the window only vertically + */ + function vcenter(target, tomove){ + var opts = $.data(target, 'window').options; + var pp = $(target).window('panel'); + var height = pp._outerHeight(); + if (opts.inline){ + var parent = pp.parent(); + opts.top = Math.ceil((parent.height() - height) / 2 + parent.scrollTop()); + } else { + opts.top = Math.ceil(($(window)._outerHeight() - height) / 2 + $(document).scrollTop()); + } + if (tomove){moveWindow(target);} + } + + function create(target){ + var state = $.data(target, 'window'); + var opts = state.options; + var win = $(target).panel($.extend({}, state.options, { + border: false, + doSize: true, // size the panel, the property undefined in window component + closed: true, // close the panel + cls: 'window ' + (!opts.border?'window-thinborder window-noborder ':(opts.border=='thin'?'window-thinborder ':'')) + (opts.cls || ''), + headerCls: 'window-header ' + (opts.headerCls || ''), + bodyCls: 'window-body ' + (opts.noheader ? 'window-body-noheader ' : ' ') + (opts.bodyCls||''), + + onBeforeDestroy: function(){ + if (opts.onBeforeDestroy.call(target) == false){return false;} + if (state.shadow){state.shadow.remove();} + if (state.mask){state.mask.remove();} + }, + onClose: function(){ + if (state.shadow){state.shadow.hide();} + if (state.mask){state.mask.hide();} + opts.onClose.call(target); + }, + onOpen: function(){ + if (state.mask){ + state.mask.css($.extend({ + display:'block', + zIndex: $.fn.window.defaults.zIndex++ + }, $.fn.window.getMaskSize(target))); + } + if (state.shadow){ + state.shadow.css({ + display:'block', + zIndex: $.fn.window.defaults.zIndex++, + left: opts.left, + top: opts.top, + width: state.window._outerWidth(), + height: state.window._outerHeight() + }); + } + state.window.css('z-index', $.fn.window.defaults.zIndex++); + + opts.onOpen.call(target); + }, + onResize: function(width, height){ + var popts = $(this).panel('options'); + $.extend(opts, { + width: popts.width, + height: popts.height, + left: popts.left, + top: popts.top + }); + if (state.shadow){ + state.shadow.css({ + left: opts.left, + top: opts.top, + width: state.window._outerWidth(), + height: state.window._outerHeight() + }); + } + opts.onResize.call(target, width, height); + }, + onMinimize: function(){ + if (state.shadow){state.shadow.hide();} + if (state.mask){state.mask.hide();} + state.options.onMinimize.call(target); + }, + onBeforeCollapse: function(){ + if (opts.onBeforeCollapse.call(target) == false){return false;} + if (state.shadow){state.shadow.hide();} + }, + onExpand: function(){ + if (state.shadow){state.shadow.show();} + opts.onExpand.call(target); + } + })); + + state.window = win.panel('panel'); + + // create mask + if (state.mask){state.mask.remove();} + if (opts.modal){ + state.mask = $('').insertAfter(state.window); + } + + // create shadow + if (state.shadow){state.shadow.remove();} + if (opts.shadow){ + state.shadow = $('').insertAfter(state.window); + } + + // center and open the window + var closed = opts.closed; + if (opts.left == null){hcenter(target);} + if (opts.top == null){vcenter(target);} + moveWindow(target); + if (!closed){win.window('open');} + } + + function constrain(left, top, width, height){ + var target = this; + var state = $.data(target, 'window'); + var opts = state.options; + if (!opts.constrain){return {};} + if ($.isFunction(opts.constrain)){ + return opts.constrain.call(target, left, top, width, height); + } + var win = $(target).window('window'); + var parent = opts.inline ? win.parent() : $(window); + if (left < 0){left = 0;} + if (top < parent.scrollTop()){top = parent.scrollTop();} + if (left + width > parent.width()){ + if (width == win.outerWidth()){ // moving + left = parent.width() - width; + } else { // resizing + width = parent.width() - left; + } + } + if (top - parent.scrollTop() + height > parent.height()){ + if (height == win.outerHeight()){ // moving + top = parent.height() - height + parent.scrollTop(); + } else { // resizing + height = parent.height() - top + parent.scrollTop(); + } + } + + return { + left:left, + top:top, + width:width, + height:height + }; + } + + + /** + * set window drag and resize property + */ + function setProperties(target){ + var state = $.data(target, 'window'); + + state.window.draggable({ + handle: '>div.panel-header>div.panel-title', + disabled: state.options.draggable == false, + onBeforeDrag: function(e){ + if (state.mask) state.mask.css('z-index', $.fn.window.defaults.zIndex++); + if (state.shadow) state.shadow.css('z-index', $.fn.window.defaults.zIndex++); + state.window.css('z-index', $.fn.window.defaults.zIndex++); + }, + onStartDrag: function(e){ + start1(e); + }, + onDrag: function(e){ + proc1(e); + return false; + }, + onStopDrag: function(e){ + stop1(e, 'move'); + } + }); + + state.window.resizable({ + disabled: state.options.resizable == false, + onStartResize:function(e){ + start1(e); + }, + onResize: function(e){ + proc1(e); + return false; + }, + onStopResize: function(e){ + stop1(e, 'resize'); + } + }); + + function start1(e){ + if (state.pmask){state.pmask.remove();} + state.pmask = $('
                                                        ').insertAfter(state.window); + state.pmask.css({ + display: 'none', + zIndex: $.fn.window.defaults.zIndex++, + left: e.data.left, + top: e.data.top, + width: state.window._outerWidth(), + height: state.window._outerHeight() + }); + if (state.proxy){state.proxy.remove();} + state.proxy = $('
                                                        ').insertAfter(state.window); + state.proxy.css({ + display: 'none', + zIndex: $.fn.window.defaults.zIndex++, + left: e.data.left, + top: e.data.top + }); + state.proxy._outerWidth(e.data.width)._outerHeight(e.data.height); + state.proxy.hide(); + setTimeout(function(){ + if (state.pmask){state.pmask.show();} + if (state.proxy){state.proxy.show();} + }, 500); + } + function proc1(e){ + $.extend(e.data, constrain.call(target, e.data.left, e.data.top, e.data.width, e.data.height)); + state.pmask.show(); + state.proxy.css({ + display: 'block', + left: e.data.left, + top: e.data.top + }); + state.proxy._outerWidth(e.data.width); + state.proxy._outerHeight(e.data.height); + } + function stop1(e, method){ + $.extend(e.data, constrain.call(target, e.data.left, e.data.top, e.data.width+0.1, e.data.height+0.1)); + $(target).window(method, e.data); + state.pmask.remove(); + state.pmask = null; + state.proxy.remove(); + state.proxy = null; + } + } + + // when window resize, reset the width and height of the window's mask + $(function(){ + if (!$._positionFixed){ + $(window).resize(function(){ + $('body>div.window-mask:visible').css({ + width: '', + height: '' + }); + setTimeout(function(){ + $('body>div.window-mask:visible').css($.fn.window.getMaskSize()); + }, 50); + }); + } + }); + + $.fn.window = function(options, param){ + if (typeof options == 'string'){ + var method = $.fn.window.methods[options]; + if (method){ + return method(this, param); + } else { + return this.panel(options, param); + } + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'window'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'window', { + options: $.extend({}, $.fn.window.defaults, $.fn.window.parseOptions(this), options) + }); + if (!state.options.inline){ + document.body.appendChild(this); + } + } + create(this); + setProperties(this); + }); + }; + + $.fn.window.methods = { + options: function(jq){ + var popts = jq.panel('options'); + var wopts = $.data(jq[0], 'window').options; + return $.extend(wopts, { + closed: popts.closed, + collapsed: popts.collapsed, + minimized: popts.minimized, + maximized: popts.maximized + }); + }, + window: function(jq){ + return $.data(jq[0], 'window').window; + }, + move: function(jq, param){ + return jq.each(function(){ + moveWindow(this, param); + }); + }, + hcenter: function(jq){ + return jq.each(function(){ + hcenter(this, true); + }); + }, + vcenter: function(jq){ + return jq.each(function(){ + vcenter(this, true); + }); + }, + center: function(jq){ + return jq.each(function(){ + hcenter(this); + vcenter(this); + moveWindow(this); + }); + } + }; + + $.fn.window.getMaskSize = function(target){ + var state = $(target).data('window'); + if (state && state.options.inline){ + return {}; + } else if ($._positionFixed){ + return {position: 'fixed'}; + } else { + return { + width: $(document).width(), + height: $(document).height() + }; + } + }; + + $.fn.window.parseOptions = function(target){ + return $.extend({}, $.fn.panel.parseOptions(target), $.parser.parseOptions(target, [ + {draggable:'boolean',resizable:'boolean',shadow:'boolean',modal:'boolean',inline:'boolean'} + ])); + }; + + // Inherited from $.fn.panel.defaults + $.fn.window.defaults = $.extend({}, $.fn.panel.defaults, { + zIndex: 9000, + draggable: true, + resizable: true, + shadow: true, + modal: false, + border: true, // possible values are: true,false,'thin','thick' + inline: false, // true to stay inside its parent, false to go on top of all elements + + // window's property which difference from panel + title: 'New Window', + collapsible: true, + minimizable: true, + maximizable: true, + closable: true, + closed: false, + constrain: false + /* + constrain: function(left,top,width,height){ + return { + left:left, + top:top, + width:width, + height:height + }; + } + */ + }); +})(jQuery); diff --git a/testapps/GHIssues/src/main/resources/asset/themes/angular.css b/testapps/GHIssues/src/main/resources/asset/themes/angular.css new file mode 100644 index 000000000..b2ea7d48a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/angular.css @@ -0,0 +1,639 @@ +*{ + box-sizing: border-box; +} +.f-block{ + display: block; + position: relative; +} +.f-row{ + display: -webkit-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + position: relative; +} +.f-column{ + display: -webkit-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: vertical; + -webkit-flex-direction: column; + -moz-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + position: relative; +} +.f-inline-row{ + white-space: nowrap; + display: -webkit-inline-box; + display: -ms-inline-box; + display: inline-flex; + vertical-align: middle; + position: relative; + align-items: stretch; + -webkit-tap-highlight-color: transparent; +} +.f-content-center{ + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; +} +.f-full{ + -webkit-box-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} +.f-hide{ + display: none; +} +.f-order0{ + order: 0; +} +.f-order1{ + order: 1; +} +.f-order2{ + order: 2; +} +.f-order3{ + order: 3; +} +.f-order4{ + order: 4; +} +.f-order5{ + order: 5; +} +.f-order6{ + order: 6; +} +.f-order7{ + order: 7; +} +.f-order8{ + order: 8; +} +.f-noshrink{ + -webkit-flex-shrink: 0; + -moz-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.f-animate{ + transition: all .3s; +} + +.scroll-body{ + overflow: auto; + position: relative; +} + +.textbox .textbox-text{ + width: 100%; + height: auto; + overflow: hidden; +} +.textbox-addon{ + align-items: center; +} +.textbox-disabled>.textbox-addon .textbox-icon, +.textbox-readonly>.textbox-addon .textbox-icon{ + cursor: default; +} +.textbox-disabled>.textbox-addon .textbox-icon:hover, +.textbox-readonly>.textbox-addon .textbox-icon:hover{ + opacity: 0.6; + cursor: default; +} +.textbox-addon .textbox-icon{ + width: 26px; + height: 18px; +} + +.spinner .textbox-text{ + height: auto; +} +.spinner-button-left,.spinner-button-right{ + width: 26px; +} +.spinner-button-updown{ + width: 26px; +} +.spinner-button-top,.spinner-button-bottom{ + position: absolute; + width: 100%; + height: 26px; +} +.spinner-button-top{ + top: 0; +} +.spinner-button-bottom{ + top: auto; + bottom: 0; +} +.spinner-button{ + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.spinner-arrow{ + cursor: pointer; + opacity: 0.6; +} + +.textbox-disabled .spinner-arrow:hover, +.textbox-readonly .spinner-arrow:hover +{ + opacity: 0.6; + cursor: default; +} +.textbox-readonly .spinner-arrow .spinner-arrow-up:hover, +.textbox-disabled .spinner-arrow .spinner-arrow-up:hover, +.textbox-readonly .spinner-arrow .spinner-arrow-down:hover, +.textbox-disabled .spinner-arrow .spinner-arrow-down:hover +{ + cursor: default; +} + +.l-btn{ + width: 100%; +} +.l-btn-empty{ + height: 28px; +} +.l-btn-large .l-btn-empty{ + height: 44px; +} +.l-btn-left{ + overflow: visible; +} +.m-btn .l-btn-left .m-btn-line{ + top: -100px; + width: 36px; + right: -20px; +} +eui-button-group eui-linkbutton.f-inline-row{ + margin-left: -1px; +} +eui-button-group .l-btn:hover{ + z-index: 99; +} +eui-button-group eui-linkbutton:not(:first-child):not(:last-child) .l-btn{ + border-radius: 0; +} +eui-button-group eui-linkbutton:first-child .l-btn{ + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +eui-button-group eui-linkbutton:last-child .l-btn{ + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.switchbutton-on,.switchbutton-off{ + position: absolute; + left: 0; + width: calc(100% - 15px); + height: 100%; +} +.switchbutton-on span,.switchbutton-off span,.switchbutton-handle span{ + height: 100%; +} +.switchbutton-on span{ + text-indent: -15px; +} +.switchbutton-off span{ + text-indent: 15px; +} +.switchbutton-off{ + left: calc(100% - 15px); +} +.switchbutton-handle{ + width: 30px; + left: auto; + right: 0; + z-index: 9; +} +.switchbutton-inner{ + transition: all 200ms ease-out; + overflow: visible; + position: absolute; + width: 100%; + top: -1px; + bottom: -1px; + left: calc(-100% + 30px); + right: auto; +} +.switchbutton-checked .switchbutton-inner{ + left: 0; +} +.draggable-reverting{ + transition: all 200ms ease-out; +} +.slider-h .slider-tip{ + transform: translateX(-50%); +} +.slider-h .slider-rulelabel span{ + transform: translateX(-50%); +} +.slider-v .slider-tip{ + margin-top: 0; + transform: translate(-100%,-50%); +} +.slider-v .slider-rulelabel span{ + transform: translateY(-50%); +} +.slider-v .slider-inner{ + height: auto; +} + + +.panel{ + position:relative; +} +.panel-title{ + height: 20px; + line-height: 20px; +} +.panel-footer-fixed{ + position:absolute; + width:100%; + bottom:0; +} +.window{ + position: absolute; +} +.window-mask{ + position: fixed; +} +.window .window-footer{ + top: 0; +} +.dialog-toolbar{ + border-width: 0 0 1px 0; +} +.dialog-button{ + border-width: 1px 0 0 0; + top: 0; +} + +.tabs{ + width: 100%; + height: auto; +} +.tabs-scrollable{ + transition: left 400ms, right 400ms; + position: absolute; + width: auto; + height: 100%; + left: 0; + top: 0; +} +.tabs li{ + display: inherit; +} +.tabs li a.tabs-inner{ + height: auto; + line-height: normal; + display: inherit; + overflow: hidden; +} +.tabs-title{ + display: inherit; + align-items: center; + line-height: normal; +} +.tabs-close{ + outline: none; +} +.tabs-scroller-left,.tabs-scroller-right{ + position: relative; + display: block; + width: 21px; + height: 100%; +} +.tabs-header-left .tabs li{ + right: -1px; +} +.tabs-header-left .tabs li,.tabs-header-right .tabs li, +.tabs-header-left .tabs li a.tabs-inner, +.tabs-header-right .tabs li a.tabs-inner{ + display: inherit; +} + +.combo-panel{ + position: absolute; + height: 200px; + z-index: 9999; +} +.combo-panel eui-virtual-scroll, +.combo-panel eui-datagrid, +.combo-panel eui-treegrid{ + width: 100%; + height: 100%; +} +.combobox-item{ + padding: 6px 4px; + line-height: 20px; +} +.tagbox-labels{ + padding-bottom: 4px; +} +.tagbox-label{ + height: 20px; + line-height: 20px; +} +.tagbox .textbox-text{ + width: 50px; + max-width: 100%; + margin-top: 4px; + padding-top: 0; + padding-bottom: 0; + height: 20px; + line-height: 20px; +} + +.datagrid,eui-datagrid, +eui-datagrid-view,eui-datagrid-body, +eui-treegrid-view,eui-treegrid-body{ + overflow: hidden; +} +.datagrid-view,.datagrid-view1,.datagrid-view2{ + position: relative; +} +.datagrid-vbody{ + overflow: hidden; +} +.datagrid-view3{ + margin-left: -1px; +} +.datagrid-view3 .datagrid-body{ + overflow: hidden; +} +.datagrid-view3 .datagrid-body-inner{ + padding-bottom: 20px; +} +.datagrid-view3 .datagrid-header td, +.datagrid-view3 .datagrid-body td, +.datagrid-view3 .datagrid-footer td { + border-width: 0 0 1px 1px; +} +.datagrid-htable,.datagrid-btable,.datagrid-ftable{ + table-layout: fixed; + width: 100%; +} +.datagrid-htable{ + height: 100%; +} +.datagrid-header .datagrid-header, +.datagrid-footer .datagrid-header{ + border-width: 0 0 0 1px; +} +.datagrid-header-inner,.datagrid-footer-inner{ + overflow: hidden; +} +.datagrid-header-row, .datagrid-row{ + height: 32px; +} +.datagrid-cell{ + text-align: left; + height: auto; + font-size: inherit; +} +.datagrid-cell-group{ + text-align: center; +} +.datagrid .datagrid-pager{ + padding: 2px 4px; + display: inherit; +} +.datagrid-loading{ + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + justify-content: center; + align-items: center; +} +.datagrid-mask{ + display: block; +} +.datagrid-mask-msg{ + display: block; + position: static; + line-height: 36px; + height: 40px; + margin: 0; + padding: 0 5px 0 30px; + z-index: 9; +} +.datagrid-body .datagrid-td-group{ + border-left-color: transparent; + border-right-color: transparent; +} +.datagrid-group-expander{ + cursor: pointer; +} +.datagrid-row-expander{ + display: inline-block; + width: 16px; + height: 18px; + cursor: pointer; +} +.datagrid-group-title{ + align-self: center; + padding: 0 4px; + white-space: nowrap; + word-break: normal; + position: relative; +} +.datagrid-editable> .f-field, +.datagrid-editable> *{ + width: 100%; + height: 31px; +} +.datagrid-editable .textbox, .datagrid-editable .textbox-text{ + border-radius: 0; +} +.datagrid-filter-row .textbox{ + border-radius: 0; +} +.datagrid-filter-c{ + padding: 4px; + height: 38px; +} +.datagrid-filter-c> .f-field, +.datagrid-filter-c> *{ + height: 30px; +} +.datagrid-filter-c .datagrid-editable-input{ + width: 100%; +} +.datagrid-filter-btn{ + width: 30px; +} +.datagrid-filter-btn .textbox-icon{ + width: 28px; +} +.datagrid-filter-btn .textbox{ + background-color: transparent; +} +.datagrid-filter-btn-left{ + margin-right: 4px; +} +.datagrid-filter-btn-right{ + margin-left: 4px; +} + +eui-menu.menu-inline{ + position: relative; + display: inline; + margin: 0; + padding: 0; +} +eui-menu> .menu-container{ + position: relative; +} +.menu-container{ + position: absolute; + left: 0; + top: 0; + min-width: 200px; +} +.menu{ + overflow: visible; +} +.menu-shadow{ + width: 100%; + height: 100%; + left: 0; + top: 0; +} +.menu-item{ + overflow: visible; +} +.menu-text{ + height: 32px; + line-height: 32px; + float: none; +} +.menu-line{ + z-index: 9999999; + height: 100%; +} +.menu-active{ + z-index: 99999999; +} + +.progressbar-value{ + overflow: visible; +} + +.searchbox .textbox-button, +.searchbox .textbox-button:hover{ + position: inherit; +} + +.calendar-content{ + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; +} +.calendar-menu{ + position: absolute; + width: 100%; + height: 100%; +} +.calendar-menu-month-inner{ + position: relative; +} + +.f-field{ + width: 12em; + height: 30px; +} +eui-tagbox{ + width: 12em; + height: auto; + min-height: 30px; +} +eui-switchbutton{ + width: 70px; + height: 30px; +} +eui-radiobutton{ + width: 20px; + height: 20px; +} +eui-checkbox{ + width: 20px; + height: 20px; +} +eui-progressbar{ + height: 24px; +} +eui-pagination{ + height: 34px; + padding: 2px; +} +eui-layout{ + display: block; +} +.layout{ + height: 100%; +} +.layout-animate{ + transition: transform 400ms; +} +.layout-panel-north,.layout-panel-south{ + position: absolute; + width: 100%; + left: 0; + top: 0; +} +.layout-panel-south{ + top: auto; + bottom: 0; +} +.layout-panel-west,.layout-panel-east{ + position: absolute; + left: 0; + top: 0; + bottom: 0; +} +.layout-panel-east{ + left: auto; + right: 0; +} +.layout-panel-west.layout-collapsed{ + transform: translate3d(-100%, 0, 0); +} +.layout-panel-east.layout-collapsed{ + transform: translate3d(100%, 0, 0) +} +.layout-panel-north.layout-collapsed{ + transform: translate3d(0, -100%, 0) +} +.layout-panel-south.layout-collapsed{ + transform: translate3d(0, 100%, 0) +} + diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/accordion.css b/testapps/GHIssues/src/main/resources/asset/themes/black/accordion.css new file mode 100644 index 000000000..b2dba5200 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #666; + border-color: #000; +} +.accordion .accordion-header { + background: #3d3d3d; + filter: none; +} +.accordion .accordion-header-selected { + background: #0052A3; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #3d3d3d; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #666; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #000; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #3d3d3d; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #666; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #000; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #3d3d3d; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #666; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/calendar.css b/testapps/GHIssues/src/main/resources/asset/themes/black/calendar.css new file mode 100644 index 000000000..eed5a4b4b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #ffffff; +} +.calendar-day { + color: #fff; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #000; +} +.calendar { + border-color: #000; +} +.calendar-header { + background: #3d3d3d; +} +.calendar-body, +.calendar-menu { + background: #666; +} +.calendar-body th { + background: #555; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #777; + color: #fff; +} +.calendar-hover { + border: 1px solid #555; + padding: 0; +} +.calendar-selected { + background-color: #0052A3; + color: #fff; + border: 1px solid #00458a; + padding: 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/checkbox.css b/testapps/GHIssues/src/main/resources/asset/themes/black/checkbox.css new file mode 100644 index 000000000..e84e80dd9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #00458a; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #00458a; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/combo.css b/testapps/GHIssues/src/main/resources/asset/themes/black/combo.css new file mode 100644 index 000000000..0798ce198 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #666; +} +.combo-arrow { + background-color: #3d3d3d; +} +.combo-arrow-hover { + background-color: #777; +} +.combo-arrow:hover { + background-color: #777; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/combobox.css b/testapps/GHIssues/src/main/resources/asset/themes/black/combobox.css new file mode 100644 index 000000000..6415d08a0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #777; + color: #fff; +} +.combobox-item-selected { + background-color: #0052A3; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/datagrid.css b/testapps/GHIssues/src/main/resources/asset/themes/black/datagrid.css new file mode 100644 index 000000000..376206d83 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/datagrid.css @@ -0,0 +1,291 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #444; + border-right: 1px solid #777; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #000; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #666 url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #444; + background: -webkit-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: -moz-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: -o-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: linear-gradient(to bottom,#4c4c4c 0,#3f3f3f 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4c4c4c,endColorstr=#3f3f3f,GradientType=0); +} +.datagrid-cell-rownumber { + color: #fff; +} +.datagrid-resize-proxy { + background: #cccccc; +} +.datagrid-mask { + background: #000; +} +.datagrid-mask-msg { + border-color: #000; +} +.datagrid-toolbar, +.datagrid-pager { + background: #555; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #222; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #222; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #fff; + border-collapse: separate; +} +.datagrid-row-alt { + background: #555; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #777; + color: #fff; + cursor: default; +} +.datagrid-row-selected { + background: #0052A3; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/datalist.css b/testapps/GHIssues/src/main/resources/asset/themes/black/datalist.css new file mode 100644 index 000000000..94dd67e5f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #444; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #222; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #fff; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #222; +} +.m-list li>a:hover { + background: #777; + color: #fff; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/datebox.css b/testapps/GHIssues/src/main/resources/asset/themes/black/datebox.css new file mode 100644 index 000000000..ae25037df --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #555; +} +.datebox-button a { + color: #fff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/dialog.css b/testapps/GHIssues/src/main/resources/asset/themes/black/dialog.css new file mode 100644 index 000000000..4a6f36eb2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #444; + border-right: 1px solid #777; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #555; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #000 #000 #222 #000; +} +.dialog-button { + border-color: #222 #000 #000 #000; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #555; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/easyui.css b/testapps/GHIssues/src/main/resources/asset/themes/black/easyui.css new file mode 100644 index 000000000..2e1d4ccd7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/easyui.css @@ -0,0 +1,3427 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #777; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #000; +} +.panel-header { + background-color: #3d3d3d; + background: -webkit-linear-gradient(top,#454545 0,#383838 100%); + background: -moz-linear-gradient(top,#454545 0,#383838 100%); + background: -o-linear-gradient(top,#454545 0,#383838 100%); + background: linear-gradient(to bottom,#454545 0,#383838 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); +} +.panel-body { + background-color: #666; + color: #fff; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #fff; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #000; + overflow: hidden; + background: #555; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #666; + border-color: #000; +} +.accordion .accordion-header { + background: #3d3d3d; + filter: none; +} +.accordion .accordion-header-selected { + background: #0052A3; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #3d3d3d; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #666; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #000; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #3d3d3d; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #666; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #000; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #3d3d3d; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #666; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #000; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #777; + -moz-box-shadow: 2px 2px 3px #787878; + -webkit-box-shadow: 2px 2px 3px #787878; + box-shadow: 2px 2px 3px #787878; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #000; +} +.window { + background-color: #3d3d3d; + background: -webkit-linear-gradient(top,#454545 0,#383838 20%); + background: -moz-linear-gradient(top,#454545 0,#383838 20%); + background: -o-linear-gradient(top,#454545 0,#383838 20%); + background: linear-gradient(to bottom,#454545 0,#383838 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); +} +.window-proxy { + border: 1px dashed #000; +} +.window-proxy-mask, +.window-mask { + background: #000; +} +.window .panel-footer { + border: 1px solid #000; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #444; + border-right: 1px solid #777; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #555; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #000 #000 #222 #000; +} +.dialog-button { + border-color: #222 #000 #000 #000; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #555; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #fff; + background: #777; + background-repeat: repeat-x; + border: 1px solid #555; + background: -webkit-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: -moz-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: -o-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: linear-gradient(to bottom,#919191 0,#6a6a6a 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#919191,endColorstr=#6a6a6a,GradientType=0); + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn:hover { + background: #777; + color: #fff; + border: 1px solid #555; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #555; + padding: 0; +} +.l-btn-plain:hover { + background: #777; + color: #fff; + border: 1px solid #555; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #777; + color: #fff; + background: -webkit-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: -moz-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: -o-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: linear-gradient(to bottom,#919191 0,#6a6a6a 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#919191,endColorstr=#6a6a6a,GradientType=0); +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #000; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #000; +} +.textbox { + position: relative; + border: 1px solid #000; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #000000; + -moz-box-shadow: 0 0 3px 0 #000; + -webkit-box-shadow: 0 0 3px 0 #000; + box-shadow: 0 0 3px 0 #000; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #666; +} +.combo-arrow { + background-color: #3d3d3d; +} +.combo-arrow-hover { + background-color: #777; +} +.combo-arrow:hover { + background-color: #777; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #777; + color: #fff; +} +.combobox-item-selected { + background-color: #0052A3; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #777; + color: #fff; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #cccccc; +} +.layout-split-north { + border-bottom: 5px solid #444; +} +.layout-split-south { + border-top: 5px solid #444; +} +.layout-split-east { + border-left: 5px solid #444; +} +.layout-split-west { + border-right: 5px solid #444; +} +.layout-expand { + background-color: #3d3d3d; +} +.layout-expand-over { + background-color: #3d3d3d; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #3d3d3d url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #3d3d3d url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #777; + color: #fff; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #666; + color: #fff; + background: -webkit-linear-gradient(top,#454545 0,#666 100%); + background: -moz-linear-gradient(top,#454545 0,#666 100%); + background: -o-linear-gradient(top,#454545 0,#666 100%); + background: linear-gradient(to bottom,#454545 0,#666 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#666 0,#454545 100%); + background: -moz-linear-gradient(top,#666 0,#454545 100%); + background: -o-linear-gradient(top,#666 0,#454545 100%); + background: linear-gradient(to bottom,#666 0,#454545 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#454545 0,#666 100%); + background: -moz-linear-gradient(left,#454545 0,#666 100%); + background: -o-linear-gradient(left,#454545 0,#666 100%); + background: linear-gradient(to right,#454545 0,#666 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#666 0,#454545 100%); + background: -moz-linear-gradient(left,#666 0,#454545 100%); + background: -o-linear-gradient(left,#666 0,#454545 100%); + background: linear-gradient(to right,#666 0,#454545 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=1); +} +.tabs li a.tabs-inner { + color: #fff; + background-color: #3d3d3d; + background: -webkit-linear-gradient(top,#454545 0,#383838 100%); + background: -moz-linear-gradient(top,#454545 0,#383838 100%); + background: -o-linear-gradient(top,#454545 0,#383838 100%); + background: linear-gradient(to bottom,#454545 0,#383838 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #3d3d3d; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #000; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #777; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #666; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #666; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #666; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #666; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0052A3; + color: #fff; + filter: none; + border-color: #000; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #444; + border-right: 1px solid #777; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #000; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #666 url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #444; + background: -webkit-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: -moz-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: -o-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: linear-gradient(to bottom,#4c4c4c 0,#3f3f3f 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4c4c4c,endColorstr=#3f3f3f,GradientType=0); +} +.datagrid-cell-rownumber { + color: #fff; +} +.datagrid-resize-proxy { + background: #cccccc; +} +.datagrid-mask { + background: #000; +} +.datagrid-mask-msg { + border-color: #000; +} +.datagrid-toolbar, +.datagrid-pager { + background: #555; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #222; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #222; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #fff; + border-collapse: separate; +} +.datagrid-row-alt { + background: #555; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #777; + color: #fff; + cursor: default; +} +.datagrid-row-selected { + background: #0052A3; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #222; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #3d3d3d; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #222; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #3d3d3d; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #444; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #222; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #fff; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #222; +} +.m-list li>a:hover { + background: #777; + color: #fff; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #444; + border-right: 1px solid #777; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #000; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #ffffff; +} +.calendar-day { + color: #fff; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #000; +} +.calendar { + border-color: #000; +} +.calendar-header { + background: #3d3d3d; +} +.calendar-body, +.calendar-menu { + background: #666; +} +.calendar-body th { + background: #555; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #777; + color: #fff; +} +.calendar-hover { + border: 1px solid #555; + padding: 0; +} +.calendar-selected { + background-color: #0052A3; + color: #fff; + border: 1px solid #00458a; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #555; +} +.datebox-button a { + color: #fff; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #3d3d3d; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #fff; + outline-style: none; + background-color: #3d3d3d; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #777; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #777; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #3d3d3d; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #3d3d3d; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #3d3d3d; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #000; +} +.progressbar-text { + color: #fff; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0052A3; + color: #fff; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #3d3d3d; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #000; + background: #3d3d3d; +} +.slider-rule span { + border-color: #000; +} +.slider-rulelabel span { + color: #fff; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #777; + -moz-box-shadow: 2px 2px 3px #787878; + -webkit-box-shadow: 2px 2px 3px #787878; + box-shadow: 2px 2px 3px #787878; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #444; + border-right: 1px solid #777; +} +.menu-sep { + border-top: 1px solid #444; + border-bottom: 1px solid #777; +} +.menu { + background-color: #666; + border-color: #444; + color: #fff; +} +.menu-content { + background: #666; +} +.menu-item { + border-color: transparent; + _border-color: #666; +} +.menu-active { + border-color: #555; + color: #fff; + background: #777; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #fff; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #777; + color: #fff; + border: 1px solid #555; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #cccccc; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #555; + background-color: #777; + color: #fff; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #cccccc; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #000; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #000; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #666; + color: #fff; + border-color: #000; +} +.tree-node-hover { + background: #777; + color: #fff; +} +.tree-node-selected { + background: #0052A3; + color: #fff; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #666; + border-color: #000; + color: #fff; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #000; +} +.tooltip-right .tooltip-arrow { + border-right-color: #666; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #000; +} +.tooltip-left .tooltip-arrow { + border-left-color: #666; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #000; +} +.tooltip-top .tooltip-arrow { + border-top-color: #666; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #000; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #666; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #555; + border: 1px solid #555; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0052A3; + color: #fff; +} +.switchbutton-off { + background-color: #666; + color: #fff; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #666; + color: #fff; + border: 1px solid #555; + -moz-box-shadow: 0 0 3px 0 #555; + -webkit-box-shadow: 0 0 3px 0 #555; + box-shadow: 0 0 3px 0 #555; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #00458a; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #00458a; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #00458a; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #00458a; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #fff; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #fff; +} +.sidemenu .accordion-header:hover { + background: #777; + color: #fff; +} +.sidemenu .tree-node-hover { + background: #777; + color: #fff; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #00458a; + color: #fff; + background: #0052A3; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/filebox.css b/testapps/GHIssues/src/main/resources/asset/themes/black/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/accordion_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..45fd44aa30476e107428feeea74273a354d3b003 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel%uDMV@SoVN1z5L3B> xDW~hhNx=}0EonJY9@lzK3(R79rLjPWf#H~1{zPk!fAK(V44$rjF6*2Ung9evL?JRtAPgomjiGH|9{f$n(B`$j zEeb&pg!EKZW!#K$4@xNm$yT6c41rc&wh}>_*7}p71!8&8673tn-QQiFh646*YwHT+ z)EV#dB}QIviTL0tB!=YS+5%Rf3nh>uG`~OIR&I9Pb&1#X>AvnQFNH)(9OKtKv|Z?jXgA8=g#}$o8PwWf~s)v4TOWbIh-FayvCIQ*!i4(A|Z*a`pRGU y`z_2`-mf|ief_$wXW7b|3Y(^xL#4%pFkRlNzMe3nx0Htf00005OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$f3kcwMx!yWk;1b9CG_kXOx zmzFK*Ssi^NN-27((w?4M8@u`^_qP=9nfy4m{lwb6;U^wS@qDtp9?C45@HGEwayQ3S z%Ua=ZSB3W+c`gDw6;3c4*f@AGFEUxQKH4x2D*a5)78&qol`;+03qN((f|Me literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/linkbutton_bg.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/linkbutton_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..fc66bd2cd24047b8377342365a1df3846327ecde GIT binary patch literal 1274 zcmVc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/loading.gif b/testapps/GHIssues/src/main/resources/asset/themes/black/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/menu_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..2a984941d6590c78d67ee68d2087d8cc88efbac6 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQof!pjv*Dd-d;V(%b>u);`l3H z>g53sy@tf+`c*Dhco^6|8Eg#8WENqsU-wu%RB=*I5D$X7F_Nb6Mw<&;$S;RV&B< literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/messager_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000P2Jv3>80t+5#NSCz>DdY1?+6=lRq-0N)F#H;wIQi`C_sJ!SVT`Wft}8_wH~Q%XA*9t9fT|c lGy-mR literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/panel_tools.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/panel_tools.png new file mode 100755 index 0000000000000000000000000000000000000000..f97761eb393def3b5f61774142413e740fe8fe8b GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^20*O9!3HEluKbn(QuUrLjv*Dd-p+93Yfuni{`r6T z$48CLf{EOzXU|M@xy0GMavBpu(5ti8zb3QZ+Tfp^siO37?WI*8%sM?7u5w1XttgAw z*Z5axHOr-aZj1~Mw;UHx3vIVCg!0FXpSG5`Po literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/passwordbox_close.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/passwordbox_close.png new file mode 100644 index 0000000000000000000000000000000000000000..276b57974284d1449250e362644dd7416632d92c GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/passwordbox_open.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..0f25d535e05b22b406fd72647611aace9cfa6249 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/searchbox_button.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/spinner_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..349d7d9d1dd5757fe673c74779ca4397b3ac9880 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQo)`sjv*Dd-cGgTVld!f`TKvl zx$i261Imkz%njSa<|ydo5x!wz!%F5U-;Ot$9v8}1XAs{bw8eCRinje8hmeGw4b#=% p?40+0pF;`bK1VJIy@m-jV#fsL6&$#pdj@DcgQu&X%Q~loCIE{>Fhc+U literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/tabs_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..732b1237a14cf6c525dee8646f322d5603664866 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2O2978H@B_~L*E^a7$U@!3C zaj-Z4S(*MEORM>}ezCPaUb%ArQw1m64&Nzopr0N{TzyZ`_I literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/tagbox_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..faddd10cab63488000e766ca3cb10a4a21671c10 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoV($fFg z6O)c!JXo)x5GJ#nd4ld?HMbLtC#EF|E8h}a647_oX_D^oryN0xCn=p~zr)BZ#mYR7 hgWX2DuSt-dVWQ=IMMbkYnLu+HJYD@<);T3K0RXNJC2Rly literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/tree_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..2b4fd2025c7588c84df27d89466b470e273f5c06 GIT binary patch literal 3086 zcmV+p4Ds`cP)~TesqeqN>v{0t!Gi}6eg)$W;^97jYuB!YrL@_X1+wAp+no|T zcDh$_O7P%eqeu&X29&AWo<{PPpCRe9F=#J60RjkzE?U3Z3?eJo?8kQd7R}F@guc7` zUhkAAqN4FO%Cs%*PXFraYFJ9He{gzxb|BR7?~fB=#%+2M*65p>Z;2^ae-9wWQ(T@F zZaqY%vR>>jE}y>~JsP`eXW;4mkGHVp>~)jt(@xyDaic>lTycF1-p_49Lgg*AH$eFE zj$3Ze&Lbx(M9AM5$q=0S$KyD$&JR&*2I1S)190S{e)xKo4_d<`!brlRUWo%SbRteO zom2t_`k39pxnAR4*7f;5=sSNzH_gT5Z^wcKvw3DU5(x_n3vF`Jqobq6&y%xm{>>Kj zkJn;UvKH#nW}AHfS7l8I$ZkYwo$1dr{DB*8Z+kbepW64^s{^4fhtfE-(i_>?*|=XH zVJ2Ja&!0aJV-Ca+7RKC&r1RZ4sNQ?spiK6fS3e`W=E&ad9q7AxaQ)`ecaYUGA5)Hw z2m6!DDvJk&HuC!Q>*B_0G#c0f9&!P4`Nk~~Apg1Agi%Ra>}?}N_7yjZpGSG+CI^VU z0K{H`#w&Djf z0_%Bqr)Ccx*8RPK2Pa29i~m*!A)_T2(~dunu7LwK$~q|0kEf!dLfnMP%1X2a9y4al zkPVQFcL0)J*^I9UB7zf1tg@~MNRGi!Ht0)U&-vq9$5%ux$@vHGzdJn%P78(}5M7B9fKZf| zmqT(S*1|&(Kx*y*B&(_!N6K}LKkJ6Ffz^F_@Q?sfP|F<%cObTngil848mDXr5ssbj zIo$<_Jogfg%V&ag>t9?W>Wu?LnFD#`Rn-$C)<3IFY}$gLn0IbF&mU4eYW>){Ems1O zqTPfubt^F^b}HQGJsHKkz1?LWl(sq$LwG0w$fY|Dgy8XYSu;ip4kSsT1EDbweRxO! zDdJt2pA10SYYc>DO2o!lwO(Ed>;5~aduxDL=(cF9*Nf}7d><_8ZQ($K=;kqN)b_Bn zKx8)Tz|z#;Vt4U!oU8d1N2^z2;kjR<*Zgr=%zt!$MF+2~V<4smkK|}`YjprQBEW;X zFZ-`59|NHQQ)%2oN_wxXUOqthay|2cG59Ot>ZbYDi2oTcWg@{G)sFA!= zg~B5*iF&IXh>@w>o>L~gI&Q;rw~th;!`Yh6I9mR99RBfr1gE@?KJ#DDF#icdn6&_~ z)hvvXD6G@X!i-MR;=onw22g3Xg$7J%%!9fu|2B0O>b=n%7ga-Yl3N_dLcf zo7$*)?u}Wz1@Pd}jzK`6Zi$@Khldmd1nQQ^Nqu-o08x_0wtw{G>1#*Ke5+~rb8o-T z&n6GMx`OlV=fQ&q4<0=DRjl*uKd%YGg9i^DJh%hl4utC;)(B;6_(4Cvw6g(ovBT5z z+sTZ1NXuSf%ypBS+u^8y0DLxL#Kl0y#&I(6;9sSot@S$Hy(BGVW#u(7 zNn=cZVCc~E)t3Z#M67{!SZ}nPJcN?ebbR9Fb!xqf%Qu?1v#5;ZdAF?usn#Ms$_ImDpe_KFM#mn9k<+`9f+L9UsrciY{0b4)_OVcsIRYU zrH`NU2ee$x6X4MU)xHeZ20KCyx8)2 zq~~CiJOpPLq@$;DtvxAJjf@_qqvv9%N|_QZJqtq*&(Tx4Z2<^>B9~VslM4_zjbE#+ zhqSIzz3K}U8XB|~^m%w}_fQN}`(el)Kk?OX&k!*Q9uh$G^*elhkCzB8gPg~;!H=L+ zfQY8ABdWeRgzKlH1bDb2*_9#IxeJPSY{!-Kbc78WlxX&V&=a`&Pvlw)5NjbqRmi9s z8C4}CfKZh(C3Vj~9*e5{j$$`j$M`L4y8334vha7;AR<%bZfE|)#9q!{3TatMm4M)F3z5tKQUJTiToN<1j8&cc^cnI#J@bj%G7P>lN zDpl%K;VVrZ466M>LA5}P{fLwRM5+U#1R_*@jGPBmBcq~11c8eR0YXpV>Q^FDn}CR6 zbt$D)z1pfb)xg?I-_iTu)~aJ|br81terl9*;9;x*8|n!Z#^6C|PA_#^BnLtuA%IAK zlh%~}7mT@o+@r?{&DnTVMSdy3!wne%L{dB%;=Q^FgYtdpZW!Pke*SfgVVCRDeehhSNQrpgFJ?IZ4S_ z=HU_TEx^X?!LYRhQ3?^NK1Nl@s2UkTgc|=Pg$|_XX0y?XWR}K6I6!z+GHb^`J~RyBVNNd%nCf?32q01y#+07i2Tj!$#Kr3dOnqFDEOcAqdph8ZXLlU$#t_-v z0l9m2BR3-hON8!@ztHVzw=ocFs*+I^GU~=qRWfS$RHaPGcT@2oQ&q|MEC`>4c@Pdn z4m`{Oz+AUQj$WE=(RUtFH-_FbrQg)E*WtXACvoFU6teob>c%{r88ka01n032k&X^H zEHvl6j*hsbRwFwu4#9o9CqmsB8WW*`RdfF@ zjPwKN_i^y5WY#zkIq)zC0DV0TmKuYHIlcZ=tu$aNM;{e12Tj7?8Qva9e1rx}yP_~6 z9QlIVxSW`XoV{x7b8x^;0V3hux}ivTUmX%6@3?mKeIQhojP3)WDrJlZk524B)&TBElF4`cdm!-wZo=4(*!!4kx}yPbN~PV07*qoM6N<$fk literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/images/validatebox_warning.png b/testapps/GHIssues/src/main/resources/asset/themes/black/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/passwordbox.css b/testapps/GHIssues/src/main/resources/asset/themes/black/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/progressbar.css b/testapps/GHIssues/src/main/resources/asset/themes/black/progressbar.css new file mode 100644 index 000000000..e89cb3a35 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #000; +} +.progressbar-text { + color: #fff; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0052A3; + color: #fff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/propertygrid.css b/testapps/GHIssues/src/main/resources/asset/themes/black/propertygrid.css new file mode 100644 index 000000000..871c585e5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #222; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #3d3d3d; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #222; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #3d3d3d; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/radiobutton.css b/testapps/GHIssues/src/main/resources/asset/themes/black/radiobutton.css new file mode 100644 index 000000000..a31bc36e5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #00458a; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #00458a; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/searchbox.css b/testapps/GHIssues/src/main/resources/asset/themes/black/searchbox.css new file mode 100644 index 000000000..01f669742 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #3d3d3d; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/sidemenu.css b/testapps/GHIssues/src/main/resources/asset/themes/black/sidemenu.css new file mode 100644 index 000000000..396db6350 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #fff; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #fff; +} +.sidemenu .accordion-header:hover { + background: #777; + color: #fff; +} +.sidemenu .tree-node-hover { + background: #777; + color: #fff; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #00458a; + color: #fff; + background: #0052A3; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/slider.css b/testapps/GHIssues/src/main/resources/asset/themes/black/slider.css new file mode 100644 index 000000000..22d97447c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #000; + background: #3d3d3d; +} +.slider-rule span { + border-color: #000; +} +.slider-rulelabel span { + color: #fff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/spinner.css b/testapps/GHIssues/src/main/resources/asset/themes/black/spinner.css new file mode 100644 index 000000000..9d8010293 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #3d3d3d; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #fff; + outline-style: none; + background-color: #3d3d3d; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #777; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #777; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #3d3d3d; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #3d3d3d; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #3d3d3d; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/splitbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/black/splitbutton.css new file mode 100644 index 000000000..b42e3963f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #cccccc; + border-width: 0 0 0 1px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/switchbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/black/switchbutton.css new file mode 100644 index 000000000..0e78b569b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #555; + border: 1px solid #555; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0052A3; + color: #fff; +} +.switchbutton-off { + background-color: #666; + color: #fff; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #666; + color: #fff; + border: 1px solid #555; + -moz-box-shadow: 0 0 3px 0 #555; + -webkit-box-shadow: 0 0 3px 0 #555; + box-shadow: 0 0 3px 0 #555; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/tabs.css b/testapps/GHIssues/src/main/resources/asset/themes/black/tabs.css new file mode 100644 index 000000000..65a465c13 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/tabs.css @@ -0,0 +1,413 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #3d3d3d url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #3d3d3d url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #777; + color: #fff; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #666; + color: #fff; + background: -webkit-linear-gradient(top,#454545 0,#666 100%); + background: -moz-linear-gradient(top,#454545 0,#666 100%); + background: -o-linear-gradient(top,#454545 0,#666 100%); + background: linear-gradient(to bottom,#454545 0,#666 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#666 0,#454545 100%); + background: -moz-linear-gradient(top,#666 0,#454545 100%); + background: -o-linear-gradient(top,#666 0,#454545 100%); + background: linear-gradient(to bottom,#666 0,#454545 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#454545 0,#666 100%); + background: -moz-linear-gradient(left,#454545 0,#666 100%); + background: -o-linear-gradient(left,#454545 0,#666 100%); + background: linear-gradient(to right,#454545 0,#666 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#666 0,#454545 100%); + background: -moz-linear-gradient(left,#666 0,#454545 100%); + background: -o-linear-gradient(left,#666 0,#454545 100%); + background: linear-gradient(to right,#666 0,#454545 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=1); +} +.tabs li a.tabs-inner { + color: #fff; + background-color: #3d3d3d; + background: -webkit-linear-gradient(top,#454545 0,#383838 100%); + background: -moz-linear-gradient(top,#454545 0,#383838 100%); + background: -o-linear-gradient(top,#454545 0,#383838 100%); + background: linear-gradient(to bottom,#454545 0,#383838 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #3d3d3d; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #000; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #777; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #666; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #666; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #666; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #666; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0052A3; + color: #fff; + filter: none; + border-color: #000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/tagbox.css b/testapps/GHIssues/src/main/resources/asset/themes/black/tagbox.css new file mode 100644 index 000000000..e08ec87b4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #777; + color: #fff; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/textbox.css b/testapps/GHIssues/src/main/resources/asset/themes/black/textbox.css new file mode 100644 index 000000000..1d18ad9fe --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #000; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #000000; + -moz-box-shadow: 0 0 3px 0 #000; + -webkit-box-shadow: 0 0 3px 0 #000; + box-shadow: 0 0 3px 0 #000; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/tooltip.css b/testapps/GHIssues/src/main/resources/asset/themes/black/tooltip.css new file mode 100644 index 000000000..13e310d06 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #666; + border-color: #000; + color: #fff; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #000; +} +.tooltip-right .tooltip-arrow { + border-right-color: #666; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #000; +} +.tooltip-left .tooltip-arrow { + border-left-color: #666; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #000; +} +.tooltip-top .tooltip-arrow { + border-top-color: #666; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #000; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #666; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/tree.css b/testapps/GHIssues/src/main/resources/asset/themes/black/tree.css new file mode 100644 index 000000000..08e484951 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #000; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #666; + color: #fff; + border-color: #000; +} +.tree-node-hover { + background: #777; + color: #fff; +} +.tree-node-selected { + background: #0052A3; + color: #fff; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/validatebox.css b/testapps/GHIssues/src/main/resources/asset/themes/black/validatebox.css new file mode 100644 index 000000000..1fc3ad64e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/black/window.css b/testapps/GHIssues/src/main/resources/asset/themes/black/window.css new file mode 100644 index 000000000..03695899d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/black/window.css @@ -0,0 +1,188 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #777; + -moz-box-shadow: 2px 2px 3px #787878; + -webkit-box-shadow: 2px 2px 3px #787878; + box-shadow: 2px 2px 3px #787878; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #000; +} +.window { + background-color: #3d3d3d; + background: -webkit-linear-gradient(top,#454545 0,#383838 20%); + background: -moz-linear-gradient(top,#454545 0,#383838 20%); + background: -o-linear-gradient(top,#454545 0,#383838 20%); + background: linear-gradient(to bottom,#454545 0,#383838 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); +} +.window-proxy { + border: 1px dashed #000; +} +.window-proxy-mask, +.window-mask { + background: #000; +} +.window .panel-footer { + border: 1px solid #000; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/accordion.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/accordion.css new file mode 100644 index 000000000..9d268c023 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #D4D4D4; +} +.accordion .accordion-header { + background: #F2F2F2; + filter: none; +} +.accordion .accordion-header-selected { + background: #0081c2; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #F2F2F2; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #D4D4D4; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #F2F2F2; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #D4D4D4; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #F2F2F2; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #D4D4D4; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/calendar.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/calendar.css new file mode 100644 index 000000000..b3c749516 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 12px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 12px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 12px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 12px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 12px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #808080; +} +.calendar-day { + color: #333; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #D4D4D4; +} +.calendar { + border-color: #D4D4D4; +} +.calendar-header { + background: #F2F2F2; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #F5F5F5; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #e6e6e6; + color: #00438a; +} +.calendar-hover { + border: 1px solid #ddd; + padding: 0; +} +.calendar-selected { + background-color: #0081c2; + color: #fff; + border: 1px solid #0070a9; + padding: 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/checkbox.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/checkbox.css new file mode 100644 index 000000000..0edec673f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #0070a9; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #0070a9; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/combo.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/combo.css new file mode 100644 index 000000000..fc9030d8b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #F2F2F2; +} +.combo-arrow-hover { + background-color: #e6e6e6; +} +.combo-arrow:hover { + background-color: #e6e6e6; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/combobox.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/combobox.css new file mode 100644 index 000000000..f490811a4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 12px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #e6e6e6; + color: #00438a; +} +.combobox-item-selected { + background-color: #0081c2; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datagrid.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datagrid.css new file mode 100644 index 000000000..8c67b1735 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datagrid.css @@ -0,0 +1,291 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 12px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 12px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #D4D4D4; + font-size: 12px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.datagrid-cell-rownumber { + color: #333; +} +.datagrid-resize-proxy { + background: #bbb; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #D4D4D4; +} +.datagrid-toolbar, +.datagrid-pager { + background: #F5F5F5; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #e6e6e6; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #333; + border-collapse: separate; +} +.datagrid-row-alt { + background: #F5F5F5; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #e6e6e6; + color: #00438a; + cursor: default; +} +.datagrid-row-selected { + background: #0081c2; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datalist.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datalist.css new file mode 100644 index 000000000..68e8df6f4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #F2F2F2; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #333; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #e6e6e6; + color: #00438a; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datebox.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datebox.css new file mode 100644 index 000000000..34e376f2e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 12px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #F5F5F5; +} +.datebox-button a { + color: #444; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/dialog.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/dialog.css new file mode 100644 index 000000000..b44497f82 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #F5F5F5; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #D4D4D4 #D4D4D4 #e6e6e6 #D4D4D4; +} +.dialog-button { + border-color: #e6e6e6 #D4D4D4 #D4D4D4 #D4D4D4; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #F5F5F5; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/easyui.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/easyui.css new file mode 100644 index 000000000..4f57b93f6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/easyui.css @@ -0,0 +1,3446 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #e6e6e6; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #D4D4D4; +} +.panel-header { + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.panel-body { + background-color: #ffffff; + color: #333; + font-size: 12px; +} +.panel-title { + font-size: 12px; + font-weight: bold; + color: #777; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #D4D4D4; + overflow: hidden; + background: #F5F5F5; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #D4D4D4; +} +.accordion .accordion-header { + background: #F2F2F2; + filter: none; +} +.accordion .accordion-header-selected { + background: #0081c2; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #F2F2F2; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #D4D4D4; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #F2F2F2; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #D4D4D4; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #F2F2F2; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #D4D4D4; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #D4D4D4; +} +.window { + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.window-proxy { + border: 1px dashed #D4D4D4; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #D4D4D4; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #F5F5F5; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #D4D4D4 #D4D4D4 #e6e6e6 #D4D4D4; +} +.dialog-button { + border-color: #e6e6e6 #D4D4D4 #D4D4D4 #D4D4D4; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #F5F5F5; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 12px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #444; + background: #f5f5f5; + background-repeat: repeat-x; + border: 1px solid #bbb; + background: -webkit-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: -moz-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: -o-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: linear-gradient(to bottom,#ffffff 0,#e6e6e6 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0); + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn:hover { + background: #e6e6e6; + color: #00438a; + border: 1px solid #ddd; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #ddd; + padding: 0; +} +.l-btn-plain:hover { + background: #e6e6e6; + color: #00438a; + border: 1px solid #ddd; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #f5f5f5; + color: #444; + background: -webkit-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: -moz-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: -o-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: linear-gradient(to bottom,#ffffff 0,#e6e6e6 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0); +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #ddd; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #ddd; +} +.textbox { + position: relative; + border: 1px solid #D4D4D4; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 12px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 12px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #bbbbbb; + -moz-box-shadow: 0 0 3px 0 #D4D4D4; + -webkit-box-shadow: 0 0 3px 0 #D4D4D4; + box-shadow: 0 0 3px 0 #D4D4D4; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #F2F2F2; +} +.combo-arrow-hover { + background-color: #e6e6e6; +} +.combo-arrow:hover { + background-color: #e6e6e6; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 12px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #e6e6e6; + color: #00438a; +} +.combobox-item-selected { + background-color: #0081c2; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #e6e6e6; + color: #00438a; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #bbb; +} +.layout-split-north { + border-bottom: 5px solid #eee; +} +.layout-split-south { + border-top: 5px solid #eee; +} +.layout-split-east { + border-left: 5px solid #eee; +} +.layout-split-west { + border-right: 5px solid #eee; +} +.layout-expand { + background-color: #F2F2F2; +} +.layout-expand-over { + background-color: #F2F2F2; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 12px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #F2F2F2 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #F2F2F2 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #e6e6e6; + color: #00438a; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #777; + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: linear-gradient(to right,#ffffff 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: linear-gradient(to right,#ffffff 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); +} +.tabs li a.tabs-inner { + color: #777; + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #F2F2F2; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #D4D4D4; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #e6e6e6; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0081c2; + color: #fff; + filter: none; + border-color: #D4D4D4; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 12px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 12px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #D4D4D4; + font-size: 12px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.datagrid-cell-rownumber { + color: #333; +} +.datagrid-resize-proxy { + background: #bbb; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #D4D4D4; +} +.datagrid-toolbar, +.datagrid-pager { + background: #F5F5F5; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #e6e6e6; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #333; + border-collapse: separate; +} +.datagrid-row-alt { + background: #F5F5F5; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #e6e6e6; + color: #00438a; + cursor: default; +} +.datagrid-row-selected { + background: #0081c2; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #e6e6e6; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #F2F2F2; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #e6e6e6; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #F2F2F2; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #F2F2F2; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #333; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #e6e6e6; + color: #00438a; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 12px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 12px; +} +.pagination span { + font-size: 12px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #D4D4D4; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 12px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 12px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 12px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 12px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 12px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #808080; +} +.calendar-day { + color: #333; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #D4D4D4; +} +.calendar { + border-color: #D4D4D4; +} +.calendar-header { + background: #F2F2F2; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #F5F5F5; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #e6e6e6; + color: #00438a; +} +.calendar-hover { + border: 1px solid #ddd; + padding: 0; +} +.calendar-selected { + background-color: #0081c2; + color: #fff; + border: 1px solid #0070a9; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 12px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #F5F5F5; +} +.datebox-button a { + color: #444; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #F2F2F2; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #F2F2F2; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #e6e6e6; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #e6e6e6; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #F2F2F2; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #F2F2F2; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #F2F2F2; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #D4D4D4; +} +.progressbar-text { + color: #333; + font-size: 12px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0081c2; + color: #fff; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #F2F2F2; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 12px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 12px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #D4D4D4; + background: #F2F2F2; +} +.slider-rule span { + border-color: #D4D4D4; +} +.slider-rulelabel span { + color: #333; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 12px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #ccc; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #ccc; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #fff; + border-color: #e6e6e6; + color: #333; +} +.menu-content { + background: #ffffff; +} +.menu-item { + border-color: transparent; + _border-color: #fff; +} +.menu-active { + border-color: #ddd; + color: #00438a; + background: #e6e6e6; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #333; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #e6e6e6; + color: #00438a; + border: 1px solid #ddd; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #bbb; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #ddd; + background-color: #e6e6e6; + color: #00438a; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #bbb; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #D4D4D4; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 12px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 12px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #D4D4D4; + font-size: 12px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #333; + border-color: #D4D4D4; +} +.tree-node-hover { + background: #e6e6e6; + color: #00438a; +} +.tree-node-selected { + background: #0081c2; + color: #fff; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 12px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #D4D4D4; + color: #333; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #D4D4D4; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #D4D4D4; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #D4D4D4; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #D4D4D4; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 12px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0081c2; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #333; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #333; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #0070a9; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #0070a9; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #0070a9; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #0070a9; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #777; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #777; +} +.sidemenu .accordion-header:hover { + background: #e6e6e6; + color: #777; +} +.sidemenu .tree-node-hover { + background: #e6e6e6; + color: #777; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #0070a9; + color: #fff; + background: #0081c2; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} +.tabs-panels { + border-color: transparent; +} +.tabs li a.tabs-inner { + border-color: transparent; + background: transparent; + filter: none; + color: #0088CC; +} +.menu-active { + background-color: #0081C2; + border-color: #0081C2; + color: #fff; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #333; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/filebox.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/accordion_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..720835f69c96c17ec32a20b03ac9753aa59b7f4f GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYeRK2H*V@SoVUT_Y-nKxaI`{RC0WjSLJ&w^R(C-|JQTojLXc1&{d*_z{$ jW+oTMdQ(F|jDg|L>K${_)^zO#I)%a0)z4*}Q$iB}_fAN- literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/blank.gif b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/blank.gif new file mode 100755 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/calendar_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/calendar_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..430c4ad685b8c0068ecb7e3cbef74f493a84ad0d GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQYD@)jv*Dd-cCEn)nLHm{QbZE z+q@uWwandfr?Jb4eDYYmB3UAt=OO2Vt+MMT&+KD%&6hZDt!FBpej;sEpMN69^tKl% zp6y<4_lG^P z=;=eQ4Vs74-2)Ua&f1tcVdk$#{GPKe@&?ZMHmT&SMw?IV&w7)}ixLbB3d$Zg{&KGb P8OPx1>gTe~DWM4fp>5!O@Gl{c zHXr?)EMpjkiI0?0nVI4ps;W|uWCd!b5UAxPD-onMP4mgv0vV&Ul|KA@T-G#0QTd(IpSp7SIAsd;)#A=FjzgW9D>i*LbaNyX|0kF(mrr z;o92b6Zp@36nqs7kw}pT2qBaieQ3N+owvm{e=N(DufonR5DseQ_ISSW8dV0M=To{w zToOt35OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fRl}UZ@-Co%Cq`k{wEj}Dr>ShP9AQ|IKKA30{ejJboVoF`C-z@6mZMY&%Wiz%6S}#zb4u?o?9Mi=ECopVxzz+sNviAA!DK)mm8xe zgY9ZT9jlddc^&y2^u9XqDeU4{8s^AS#8C7TXsxEJW@uLu(3Whc35-X6v}jEgEb{G` z!{)$uKzw<~%0A6PhNHYfSuTvOzD8LpPF>PVr=&QqGC936QlPgc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/loading.gif b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/menu_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/messager_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000zI<5nO~0)=fnxErNrCA`WgM*1^R=&_zX)CMr1T;-rJKi{RhT zwTRWWFSbznW6?ZwYBk2xccxEVa`0%4(Yva@;pbF0^9S2uAKfle(?qtbyxJ(2%kiF>CHXa` zwdcneqDH8s8`O=^Z;G*FoH3bGkRlewXgRMPCtCR>olp$6SSk2LaLtdk735GTeS6JrtWdjq}ZZs34}bF$p9qsdLBnIC+J1{xF!;M>5@n5YI? z&4z;cHjvE$_V&)MtT*$6579tEVTAaOu<<1(%cR!^622ph;K0g-9AQF(O3vhYiNJ*b z7Xuat7f#qV!aOb!Q6;pKF~UjxbnQ*DOwWIpHq-OqgFQe0fa`fz9oUMD0Z9VV1d9Q= z5#TIiB5HxD12dV7Jd)hJ_=qt$xd^NA4nEk!Bp@qUu0k4c(cRlRc0Y)25Z^q7^m|=T zEPSa{>fbuK*p?QKGWOF9-+|Bne}*tPWtM~)t<`EXu;7__@_h5{U+e{vTT29oHFe~Ze6XJ(Q>Kb zHH)*`i>&-o-mMNlRLeM*)b=tl9I*eiXO{b+PdrTgTX%D4@ZRav{vE&cqCShv#9g;J tE!>t@mbeRM^gTGoKdYo(nL%h1<2#QP_cRaf4g@-i!PC{xWt~$(697v`TRe8 z#G%R{$NfX%tci2`Gda4n1O70V3HltacN37lc`VT21_Oig(wY*}T!mDijSQZyelF{r G5}E*M5;#5p literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/passwordbox_open.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d328891f6a18ea703fd25a47b228df9cb13b4744 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fh6C~y}*jFF6I{2&m zf8fW~lSf{d9=Ouc<(SoRr6$ox=6dW5rxOB`TRe8 z#G%R{$Nj@Z)5m5kM@2RMITi_;Npmte=_#;rBych_7F`xqKKy}=f%DM}Q4`(M(}DIf Nc)I$ztaD0e0su|qH(3Ax literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/searchbox_button.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/spinner_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..7c2df483dbb30dfb3a51332c03fe6f0c229c0547 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4Dgeh3R zJz6gy$J;RRRRiNz`7}$-z5~nWg=}UsVYp!HpQ#{_&8An~S<1fjm*zKyrHmF27#+^4 x`1rk&EZfSkR8C?on>%wt3;O{L3Dzy_3@=Og7TEqO`UJFx!PC{xWt~$(69D$UE$jdQ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/tabs_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..4d29966d7154338a9e2e358821a5f72655eba43e GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq+&f?978H@B_~L*E^a7uNPG49 z|BoM6E;$_tDnm{r-UW|t3f!- literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/tagbox_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..bd02e2d817c6b7c4e2a105919e9a89cc0a1d577f GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel&`0YV@SoV>_0CQASS literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/tree_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/validatebox_warning.png b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/passwordbox.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/progressbar.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/progressbar.css new file mode 100644 index 000000000..73f0de06e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #D4D4D4; +} +.progressbar-text { + color: #333; + font-size: 12px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0081c2; + color: #fff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/propertygrid.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/propertygrid.css new file mode 100644 index 000000000..4b37fa61c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #e6e6e6; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #F2F2F2; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #e6e6e6; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #F2F2F2; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/radiobutton.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/radiobutton.css new file mode 100644 index 000000000..341e570fd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #0070a9; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #0070a9; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/searchbox.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/searchbox.css new file mode 100644 index 000000000..bf615de03 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #F2F2F2; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/sidemenu.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/sidemenu.css new file mode 100644 index 000000000..e9460591d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #777; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #777; +} +.sidemenu .accordion-header:hover { + background: #e6e6e6; + color: #777; +} +.sidemenu .tree-node-hover { + background: #e6e6e6; + color: #777; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #0070a9; + color: #fff; + background: #0081c2; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/slider.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/slider.css new file mode 100644 index 000000000..b58d8de55 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 12px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 12px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #D4D4D4; + background: #F2F2F2; +} +.slider-rule span { + border-color: #D4D4D4; +} +.slider-rulelabel span { + color: #333; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/spinner.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/spinner.css new file mode 100644 index 000000000..6a6e6fca5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #F2F2F2; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #F2F2F2; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #e6e6e6; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #e6e6e6; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #F2F2F2; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #F2F2F2; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #F2F2F2; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/splitbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/splitbutton.css new file mode 100644 index 000000000..bf8645332 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #bbb; + border-width: 0 0 0 1px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/switchbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/switchbutton.css new file mode 100644 index 000000000..38803aa0d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 12px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0081c2; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #333; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #333; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tabs.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tabs.css new file mode 100644 index 000000000..c06a4aab4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tabs.css @@ -0,0 +1,413 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 12px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #F2F2F2 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #F2F2F2 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #e6e6e6; + color: #00438a; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #777; + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: linear-gradient(to right,#ffffff 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: linear-gradient(to right,#ffffff 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); +} +.tabs li a.tabs-inner { + color: #777; + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #F2F2F2; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #D4D4D4; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #e6e6e6; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0081c2; + color: #fff; + filter: none; + border-color: #D4D4D4; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tagbox.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tagbox.css new file mode 100644 index 000000000..7e98a0a31 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #e6e6e6; + color: #00438a; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/textbox.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/textbox.css new file mode 100644 index 000000000..a708ce34f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #D4D4D4; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 12px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 12px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #bbbbbb; + -moz-box-shadow: 0 0 3px 0 #D4D4D4; + -webkit-box-shadow: 0 0 3px 0 #D4D4D4; + box-shadow: 0 0 3px 0 #D4D4D4; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tooltip.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tooltip.css new file mode 100644 index 000000000..ed9fe1c25 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 12px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #D4D4D4; + color: #333; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #D4D4D4; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #D4D4D4; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #D4D4D4; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #D4D4D4; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tree.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tree.css new file mode 100644 index 000000000..87d2474cb --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 12px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 12px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #D4D4D4; + font-size: 12px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #333; + border-color: #D4D4D4; +} +.tree-node-hover { + background: #e6e6e6; + color: #00438a; +} +.tree-node-selected { + background: #0081c2; + color: #fff; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/validatebox.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/validatebox.css new file mode 100644 index 000000000..1fc3ad64e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/window.css b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/window.css new file mode 100644 index 000000000..a544a4e81 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/bootstrap/window.css @@ -0,0 +1,188 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #D4D4D4; +} +.window { + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.window-proxy { + border: 1px dashed #D4D4D4; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #D4D4D4; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/color.css b/testapps/GHIssues/src/main/resources/asset/themes/color.css new file mode 100755 index 000000000..2985680f3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/color.css @@ -0,0 +1,210 @@ +.c1,.c1:hover,.c1>.panel-header{ + color: #fff; + border-color: #3c8b3c; + background: #4cae4c; + background: -webkit-linear-gradient(top,#4cae4c 0,#449d44 100%); + background: -moz-linear-gradient(top,#4cae4c 0,#449d44 100%); + background: -o-linear-gradient(top,#4cae4c 0,#449d44 100%); + background: linear-gradient(to bottom,#4cae4c 0,#449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4cae4c,endColorstr=#449d44,GradientType=0); +} +a.c1:hover{ + background: #449d44; + filter: none; +} +.c1>.panel-body{ + border-color: #3c8b3c; +} +.c1>.dialog-toolbar,.c1>.dialog-button{ + border-left-color: #3c8b3c; + border-right-color: #3c8b3c; +} +.c1>.dialog-button{ + border-bottom-color: #3c8b3c; +} +.c2,.c2:hover,.c2>.panel-header{ + color: #fff; + border-color: #5f5f5f; + background: #747474; + background: -webkit-linear-gradient(top,#747474 0,#676767 100%); + background: -moz-linear-gradient(top,#747474 0,#676767 100%); + background: -o-linear-gradient(top,#747474 0,#676767 100%); + background: linear-gradient(to bottom,#747474 0,#676767 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#747474,endColorstr=#676767,GradientType=0); +} +a.c2:hover{ + background: #676767; + filter: none; +} +.c2>.panel-body{ + border-color: #5f5f5f; +} +.c2>.dialog-toolbar,.c2>.dialog-button{ + border-left-color: #5f5f5f; + border-right-color: #5f5f5f; +} +.c2>.dialog-button{ + border-bottom-color: #5f5f5f; +} +.c3,.c3:hover,.c3>.panel-header{ + color: #333; + border-color: #ff8080; + background: #ffb3b3; + background: -webkit-linear-gradient(top,#ffb3b3 0,#ff9999 100%); + background: -moz-linear-gradient(top,#ffb3b3 0,#ff9999 100%); + background: -o-linear-gradient(top,#ffb3b3 0,#ff9999 100%); + background: linear-gradient(to bottom,#ffb3b3 0,#ff9999 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffb3b3,endColorstr=#ff9999,GradientType=0); +} +a.c3:hover{ + background: #ff9999; + filter: none; +} +.c3>.panel-body{ + border-color: #ff8080; +} +.c3>.dialog-toolbar,.c3>.dialog-button{ + border-left-color: #ff8080; + border-right-color: #ff8080; +} +.c3>.dialog-button{ + border-bottom-color: #ff8080; +} +.c4,.c4:hover,.c4>.panel-header{ + color: #333; + border-color: #52d689; + background: #b8eecf; + background: -webkit-linear-gradient(top,#b8eecf 0,#a4e9c1 100%); + background: -moz-linear-gradient(top,#b8eecf 0,#a4e9c1 100%); + background: -o-linear-gradient(top,#b8eecf 0,#a4e9c1 100%); + background: linear-gradient(to bottom,#b8eecf 0,#a4e9c1 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#b8eecf,endColorstr=#a4e9c1,GradientType=0); +} +a.c4:hover{ + background: #a4e9c1; + filter: none; +} +.c4>.panel-body{ + border-color: #52d689; +} +.c4>.dialog-toolbar,.c4>.dialog-button{ + border-left-color: #52d689; + border-right-color: #52d689; +} +.c4>.dialog-button{ + border-bottom-color: #52d689; +} +.c5,.c5:hover,.c5>.panel-header{ + color: #fff; + border-color: #b52b27; + background: #d84f4b; + background: -webkit-linear-gradient(top,#d84f4b 0,#c9302c 100%); + background: -moz-linear-gradient(top,#d84f4b 0,#c9302c 100%); + background: -o-linear-gradient(top,#d84f4b 0,#c9302c 100%); + background: linear-gradient(to bottom,#d84f4b 0,#c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#d84f4b,endColorstr=#c9302c,GradientType=0); +} +a.c5:hover{ + background: #c9302c; + filter: none; +} +.c5>.panel-body{ + border-color: #b52b27; +} +.c5>.dialog-toolbar,.c5>.dialog-button{ + border-left-color: #b52b27; + border-right-color: #b52b27; +} +.c5>.dialog-button{ + border-bottom-color: #b52b27; +} +.c6,.c6:hover,.c6>.panel-header{ + color: #fff; + border-color: #1f637b; + background: #2984a4; + background: -webkit-linear-gradient(top,#2984a4 0,#24748f 100%); + background: -moz-linear-gradient(top,#2984a4 0,#24748f 100%); + background: -o-linear-gradient(top,#2984a4 0,#24748f 100%); + background: linear-gradient(to bottom,#2984a4 0,#24748f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#2984a4,endColorstr=#24748f,GradientType=0); +} +a.c6:hover{ + background: #24748f; + filter: none; +} +.c6>.panel-body{ + border-color: #1f637b; +} +.c6>.dialog-toolbar,.c6>.dialog-button{ + border-left-color: #1f637b; + border-right-color: #1f637b; +} +.c6>.dialog-button{ + border-bottom-color: #1f637b; +} +.c7,.c7:hover,.c7>.panel-header{ + color: #333; + border-color: #e68900; + background: #ffab2e; + background: -webkit-linear-gradient(top,#ffab2e 0,#ff9900 100%); + background: -moz-linear-gradient(top,#ffab2e 0,#ff9900 100%); + background: -o-linear-gradient(top,#ffab2e 0,#ff9900 100%); + background: linear-gradient(to bottom,#ffab2e 0,#ff9900 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffab2e,endColorstr=#ff9900,GradientType=0); +} +a.c7:hover{ + background: #ff9900; + filter: none; +} +.c7>.panel-body{ + border-color: #e68900; +} +.c7>.dialog-toolbar,.c7>.dialog-button{ + border-left-color: #e68900; + border-right-color: #e68900; +} +.c7>.dialog-button{ + border-bottom-color: #e68900; +} +.c8,.c8:hover,.c8>.panel-header{ + color: #fff; + border-color: #4b72a4; + background: #698cba; + background: -webkit-linear-gradient(top,#698cba 0,#577eb2 100%); + background: -moz-linear-gradient(top,#698cba 0,#577eb2 100%); + background: -o-linear-gradient(top,#698cba 0,#577eb2 100%); + background: linear-gradient(to bottom,#698cba 0,#577eb2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#698cba,endColorstr=#577eb2,GradientType=0); +} +a.c8:hover{ + background: #577eb2; + filter: none; +} +.c8>.panel-body{ + border-color: #4b72a4; +} +.c8>.dialog-toolbar,.c8>.dialog-button{ + border-left-color: #4b72a4; + border-right-color: #4b72a4; +} +.c8>.dialog-button{ + border-bottom-color: #4b72a4; +} +.c1>.panel-header>.panel-title,.c2>.panel-header>.panel-title, +.c5>.panel-header>.panel-title,.c6>.panel-header>.panel-title,.c8>.panel-header>.panel-title{ + color: #fff; +} +.c-plain{ + border-color: #fff; + background: #fff; +} +.c-plain>.panel-header, +.c-plain>.panel-body, +.c-plain>.dialog-button, +.c-plain>.dialog-toolbar{ + border-color: transparent; + background: transparent; +} +.c-raised{ + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/accordion.css b/testapps/GHIssues/src/main/resources/asset/themes/default/accordion.css new file mode 100644 index 000000000..9d60531f6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #95B8E7; +} +.accordion .accordion-header { + background: #E0ECFF; + filter: none; +} +.accordion .accordion-header-selected { + background: #ffe48d; +} +.accordion .accordion-header-selected .panel-title { + color: #000000; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #E0ECFF; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #95B8E7; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #E0ECFF; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #95B8E7; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #E0ECFF; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #95B8E7; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/calendar.css b/testapps/GHIssues/src/main/resources/asset/themes/default/calendar.css new file mode 100644 index 000000000..f25a45849 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #4d4d4d; +} +.calendar-day { + color: #000000; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #95B8E7; +} +.calendar { + border-color: #95B8E7; +} +.calendar-header { + background: #E0ECFF; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #F4F4F4; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eaf2ff; + color: #000000; +} +.calendar-hover { + border: 1px solid #b7d2ff; + padding: 0; +} +.calendar-selected { + background-color: #ffe48d; + color: #000000; + border: 1px solid #ffab3f; + padding: 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/checkbox.css b/testapps/GHIssues/src/main/resources/asset/themes/default/checkbox.css new file mode 100644 index 000000000..61c5351b9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #ffab3f; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #ffab3f; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/combo.css b/testapps/GHIssues/src/main/resources/asset/themes/default/combo.css new file mode 100644 index 000000000..a51638652 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #E0ECFF; +} +.combo-arrow-hover { + background-color: #eaf2ff; +} +.combo-arrow:hover { + background-color: #eaf2ff; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/combobox.css b/testapps/GHIssues/src/main/resources/asset/themes/default/combobox.css new file mode 100644 index 000000000..c315199e5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eaf2ff; + color: #000000; +} +.combobox-item-selected { + background-color: #ffe48d; + color: #000000; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/datagrid.css b/testapps/GHIssues/src/main/resources/asset/themes/default/datagrid.css new file mode 100644 index 000000000..f86aa1484 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/datagrid.css @@ -0,0 +1,291 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #95B8E7; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #efefef; + background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: -moz-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: -o-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: linear-gradient(to bottom,#F9F9F9 0,#efefef 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F9F9F9,endColorstr=#efefef,GradientType=0); +} +.datagrid-cell-rownumber { + color: #000000; +} +.datagrid-resize-proxy { + background: #aac5e7; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #95B8E7; +} +.datagrid-toolbar, +.datagrid-pager { + background: #F4F4F4; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #dddddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #000000; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eaf2ff; + color: #000000; + cursor: default; +} +.datagrid-row-selected { + background: #ffe48d; + color: #000000; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/datalist.css b/testapps/GHIssues/src/main/resources/asset/themes/default/datalist.css new file mode 100644 index 000000000..eedd25bc0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #efefef; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #000000; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #eaf2ff; + color: #000000; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/datebox.css b/testapps/GHIssues/src/main/resources/asset/themes/default/datebox.css new file mode 100644 index 000000000..61093f08f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #F4F4F4; +} +.datebox-button a { + color: #444; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/dialog.css b/testapps/GHIssues/src/main/resources/asset/themes/default/dialog.css new file mode 100644 index 000000000..ff5538774 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #F4F4F4; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #95B8E7 #95B8E7 #dddddd #95B8E7; +} +.dialog-button { + border-color: #dddddd #95B8E7 #95B8E7 #95B8E7; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #F4F4F4; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/easyui.css b/testapps/GHIssues/src/main/resources/asset/themes/default/easyui.css new file mode 100644 index 000000000..fabb4be5f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/easyui.css @@ -0,0 +1,3427 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #eaf2ff; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #95B8E7; +} +.panel-header { + background-color: #E0ECFF; + background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); +} +.panel-body { + background-color: #ffffff; + color: #000000; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #0E2D5F; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #95B8E7; + overflow: hidden; + background: #F4F4F4; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #95B8E7; +} +.accordion .accordion-header { + background: #E0ECFF; + filter: none; +} +.accordion .accordion-header-selected { + background: #ffe48d; +} +.accordion .accordion-header-selected .panel-title { + color: #000000; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #E0ECFF; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #95B8E7; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #E0ECFF; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #95B8E7; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #E0ECFF; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #95B8E7; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #95B8E7; +} +.window { + background-color: #E0ECFF; + background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); +} +.window-proxy { + border: 1px dashed #95B8E7; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #95B8E7; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #F4F4F4; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #95B8E7 #95B8E7 #dddddd #95B8E7; +} +.dialog-button { + border-color: #dddddd #95B8E7 #95B8E7 #95B8E7; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #F4F4F4; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #444; + background: #fafafa; + background-repeat: repeat-x; + border: 1px solid #bbb; + background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn:hover { + background: #eaf2ff; + color: #000000; + border: 1px solid #b7d2ff; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #b7d2ff; + padding: 0; +} +.l-btn-plain:hover { + background: #eaf2ff; + color: #000000; + border: 1px solid #b7d2ff; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #fafafa; + color: #444; + background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #ddd; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #ddd; +} +.textbox { + position: relative; + border: 1px solid #95B8E7; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #6b9cde; + -moz-box-shadow: 0 0 3px 0 #95B8E7; + -webkit-box-shadow: 0 0 3px 0 #95B8E7; + box-shadow: 0 0 3px 0 #95B8E7; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #E0ECFF; +} +.combo-arrow-hover { + background-color: #eaf2ff; +} +.combo-arrow:hover { + background-color: #eaf2ff; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eaf2ff; + color: #000000; +} +.combobox-item-selected { + background-color: #ffe48d; + color: #000000; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #eaf2ff; + color: #000000; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #aac5e7; +} +.layout-split-north { + border-bottom: 5px solid #E6EEF8; +} +.layout-split-south { + border-top: 5px solid #E6EEF8; +} +.layout-split-east { + border-left: 5px solid #E6EEF8; +} +.layout-split-west { + border-right: 5px solid #E6EEF8; +} +.layout-expand { + background-color: #E0ECFF; +} +.layout-expand-over { + background-color: #E0ECFF; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #E0ECFF url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #E0ECFF url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eaf2ff; + color: #000000; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #0E2D5F; + background: -webkit-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: -moz-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: -o-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: linear-gradient(to bottom,#EFF5FF 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: -moz-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: -o-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: linear-gradient(to bottom,#ffffff 0,#EFF5FF 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: -moz-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: -o-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: linear-gradient(to right,#EFF5FF 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: -moz-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: -o-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: linear-gradient(to right,#ffffff 0,#EFF5FF 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=1); +} +.tabs li a.tabs-inner { + color: #0E2D5F; + background-color: #E0ECFF; + background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #E0ECFF; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #95B8E7; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eaf2ff; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #ffe48d; + color: #000000; + filter: none; + border-color: #95B8E7; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #95B8E7; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #efefef; + background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: -moz-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: -o-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: linear-gradient(to bottom,#F9F9F9 0,#efefef 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F9F9F9,endColorstr=#efefef,GradientType=0); +} +.datagrid-cell-rownumber { + color: #000000; +} +.datagrid-resize-proxy { + background: #aac5e7; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #95B8E7; +} +.datagrid-toolbar, +.datagrid-pager { + background: #F4F4F4; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #dddddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #000000; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eaf2ff; + color: #000000; + cursor: default; +} +.datagrid-row-selected { + background: #ffe48d; + color: #000000; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #dddddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #E0ECFF; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #dddddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #E0ECFF; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #efefef; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #000000; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #eaf2ff; + color: #000000; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #95B8E7; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #4d4d4d; +} +.calendar-day { + color: #000000; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #95B8E7; +} +.calendar { + border-color: #95B8E7; +} +.calendar-header { + background: #E0ECFF; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #F4F4F4; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eaf2ff; + color: #000000; +} +.calendar-hover { + border: 1px solid #b7d2ff; + padding: 0; +} +.calendar-selected { + background-color: #ffe48d; + color: #000000; + border: 1px solid #ffab3f; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #F4F4F4; +} +.datebox-button a { + color: #444; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #E0ECFF; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #E0ECFF; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eaf2ff; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eaf2ff; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #E0ECFF; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #E0ECFF; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #E0ECFF; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #95B8E7; +} +.progressbar-text { + color: #000000; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #ffe48d; + color: #000000; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #E0ECFF; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #95B8E7; + background: #E0ECFF; +} +.slider-rule span { + border-color: #95B8E7; +} +.slider-rulelabel span { + color: #000000; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #ccc; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #ccc; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #fafafa; + border-color: #ddd; + color: #444; +} +.menu-content { + background: #ffffff; +} +.menu-item { + border-color: transparent; + _border-color: #fafafa; +} +.menu-active { + border-color: #b7d2ff; + color: #000000; + background: #eaf2ff; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #444; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #eaf2ff; + color: #000000; + border: 1px solid #b7d2ff; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #aac5e7; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #b7d2ff; + background-color: #eaf2ff; + color: #000000; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #aac5e7; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #95B8E7; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #95B8E7; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #000000; + border-color: #95B8E7; +} +.tree-node-hover { + background: #eaf2ff; + color: #000000; +} +.tree-node-selected { + background: #ffe48d; + color: #000000; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #95B8E7; + color: #000000; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #95B8E7; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #95B8E7; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #95B8E7; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #95B8E7; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #ffe48d; + color: #000000; +} +.switchbutton-off { + background-color: #ffffff; + color: #000000; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #000000; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #ffab3f; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #ffab3f; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #ffab3f; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #ffab3f; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #0E2D5F; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #0E2D5F; +} +.sidemenu .accordion-header:hover { + background: #eaf2ff; + color: #0E2D5F; +} +.sidemenu .tree-node-hover { + background: #eaf2ff; + color: #0E2D5F; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #ffab3f; + color: #000000; + background: #ffe48d; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/filebox.css b/testapps/GHIssues/src/main/resources/asset/themes/default/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/accordion_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..720835f69c96c17ec32a20b03ac9753aa59b7f4f GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYeRK2H*V@SoVUT_Y-nKxaI`{RC0WjSLJ&w^R(C-|JQTojLXc1&{d*_z{$ jW+oTMdQ(F|jDg|L>K${_)^zO#I)%a0)z4*}Q$iB}_fAN- literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/blank.gif b/testapps/GHIssues/src/main/resources/asset/themes/default/images/blank.gif new file mode 100755 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/calendar_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/calendar_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..430c4ad685b8c0068ecb7e3cbef74f493a84ad0d GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQYD@)jv*Dd-cCEn)nLHm{QbZE z+q@uWwandfr?Jb4eDYYmB3UAt=OO2Vt+MMT&+KD%&6hZDt!FBpej;sEpMN69^tKl% zp6y<4_lG^P z=;=eQ4Vs74-2)Ua&f1tcVdk$#{GPKe@&?ZMHmT&SMw?IV&w7)}ixLbB3d$Zg{&KGb P8OPx1>gTe~DWM4fp>5!O@Gl{c zHXr?)EMpjkiI0?0nVI4ps;W|uWCd!b5UAxPD-onMP4mgv0vV&Ul|KA@T-G#0QTd(IpSp7SIAsd;)#A=FjzgW9D>i*LbaNyX|0kF(mrr z;o92b6Zp@36nqs7kw}pT2qBaieQ3N+owvm{e=N(DufonR5DseQ_ISSW8dV0M=To{w zToOt35OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fRl}UZ@-Co%Cq`k{wEj}Dr>ShP9AQ|IKKA30{ejJboVoF`C-z@6mZMY&%Wiz%6S}#zb4u?o?9Mi=ECopVxzz+sNviAA!DK)mm8xe zgY9ZT9jlddc^&y2^u9XqDeU4{8s^AS#8C7TXsxEJW@uLu(3Whc35-X6v}jEgEb{G` z!{)$uKzw<~%0A6PhNHYfSuTvOzD8LpPF>PVr=&QqGC936QlPgc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/loading.gif b/testapps/GHIssues/src/main/resources/asset/themes/default/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/menu_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/messager_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000zI<5nO~0)=fnxErNrCA`WgM*1^R=&_zX)CMr1T;-rJKi{RhT zwTRWWFSbznW6?ZwYBk2xccxEVa`0%4(Yva@;pbF0^9S2uAKfle(?qtbyxJ(2%kiF>CHXa` zwdcneqDH8s8`O=^Z;G*FoH3bGkRlewXgRMPCtCR>olp$6SSk2LaLtdk735GTeS6JrtWdjq}ZZs34}bF$p9qsdLBnIC+J1{xF!;M>5@n5YI? z&4z;cHjvE$_V&)MtT*$6579tEVTAaOu<<1(%cR!^622ph;K0g-9AQF(O3vhYiNJ*b z7Xuat7f#qV!aOb!Q6;pKF~UjxbnQ*DOwWIpHq-OqgFQe0fa`fz9oUMD0Z9VV1d9Q= z5#TIiB5HxD12dV7Jd)hJ_=qt$xd^NA4nEk!Bp@qUu0k4c(cRlRc0Y)25Z^q7^m|=T zEPSa{>fbuK*p?QKGWOF9-+|Bne}*tPWtM~)t<`EXu;7__@_h5{U+e{v=r+F-NMp}oB#0F&Ath1Z0fB%h<+sXzP;6TCwIF) z=XWKASa=$lA2eqle32Vdi_T3x4Qu>yxA*?om5;I#SWP5^#D2B6W$V>}P2w$`U+8H@ z0Ci?&Wu5GGc(Ia9{_CO5k{E>dTE6S>md@Y8z9L=77KeNpc;t7B)#8uV-B0>e^*5VwvF24Q#~Lh^WJDN!=N)I%V_ z3gc!>Fya-lLcclypp#1paq!SzI)AUI+cGqr6pX%dy3^@MQaM7bubeKKUmk$ssBS+{ z+D{bs1Nc(Z?FVcB@Meu!ev3HfXH1NcL_ z+>=<>Hi(2XX;)F{S;fEtv9G)w*hwlY~kM zCZMZPpFad1^A}a4J^;=P&LDat|`y57>Sp=A%yET$ajG`}@`p^xNM^J>GAB eBlUQ{{Qm&YJg{HE_Fe7(0000`TRe8 z#G%R{$NfX%tci2`Gda4n1O70V3HltacN37lc`VT21_Oig(wY*}T!mDijSQZyelF{r G5}E*M5;#5p literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/passwordbox_open.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d328891f6a18ea703fd25a47b228df9cb13b4744 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fh6C~y}*jFF6I{2&m zf8fW~lSf{d9=Ouc<(SoRr6$ox=6dW5rxOB`TRe8 z#G%R{$Nj@Z)5m5kM@2RMITi_;Npmte=_#;rBych_7F`xqKKy}=f%DM}Q4`(M(}DIf Nc)I$ztaD0e0su|qH(3Ax literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/searchbox_button.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/spinner_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..7c2df483dbb30dfb3a51332c03fe6f0c229c0547 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4Dgeh3R zJz6gy$J;RRRRiNz`7}$-z5~nWg=}UsVYp!HpQ#{_&8An~S<1fjm*zKyrHmF27#+^4 x`1rk&EZfSkR8C?on>%wt3;O{L3Dzy_3@=Og7TEqO`UJFx!PC{xWt~$(69D$UE$jdQ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/tabs_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..4d29966d7154338a9e2e358821a5f72655eba43e GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq+&f?978H@B_~L*E^a7uNPG49 z|BoM6E;$_tDnm{r-UW|t3f!- literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/tagbox_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..bd02e2d817c6b7c4e2a105919e9a89cc0a1d577f GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel&`0YV@SoV>_0CQASS literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/tree_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/images/validatebox_warning.png b/testapps/GHIssues/src/main/resources/asset/themes/default/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/passwordbox.css b/testapps/GHIssues/src/main/resources/asset/themes/default/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/progressbar.css b/testapps/GHIssues/src/main/resources/asset/themes/default/progressbar.css new file mode 100644 index 000000000..9fbcb3a20 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #95B8E7; +} +.progressbar-text { + color: #000000; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #ffe48d; + color: #000000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/propertygrid.css b/testapps/GHIssues/src/main/resources/asset/themes/default/propertygrid.css new file mode 100644 index 000000000..3b6f419e3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #dddddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #E0ECFF; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #dddddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #E0ECFF; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/radiobutton.css b/testapps/GHIssues/src/main/resources/asset/themes/default/radiobutton.css new file mode 100644 index 000000000..82533c8b5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #ffab3f; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #ffab3f; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/searchbox.css b/testapps/GHIssues/src/main/resources/asset/themes/default/searchbox.css new file mode 100644 index 000000000..ada5ce39a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #E0ECFF; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/sidemenu.css b/testapps/GHIssues/src/main/resources/asset/themes/default/sidemenu.css new file mode 100644 index 000000000..2111e5b8d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #0E2D5F; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #0E2D5F; +} +.sidemenu .accordion-header:hover { + background: #eaf2ff; + color: #0E2D5F; +} +.sidemenu .tree-node-hover { + background: #eaf2ff; + color: #0E2D5F; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #ffab3f; + color: #000000; + background: #ffe48d; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/slider.css b/testapps/GHIssues/src/main/resources/asset/themes/default/slider.css new file mode 100644 index 000000000..8721832cf --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #95B8E7; + background: #E0ECFF; +} +.slider-rule span { + border-color: #95B8E7; +} +.slider-rulelabel span { + color: #000000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/spinner.css b/testapps/GHIssues/src/main/resources/asset/themes/default/spinner.css new file mode 100644 index 000000000..9e163f9e7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #E0ECFF; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #E0ECFF; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eaf2ff; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eaf2ff; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #E0ECFF; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #E0ECFF; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #E0ECFF; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/splitbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/default/splitbutton.css new file mode 100644 index 000000000..86d6da58e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #aac5e7; + border-width: 0 0 0 1px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/switchbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/default/switchbutton.css new file mode 100644 index 000000000..4b5d4ad71 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #ffe48d; + color: #000000; +} +.switchbutton-off { + background-color: #ffffff; + color: #000000; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #000000; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/tabs.css b/testapps/GHIssues/src/main/resources/asset/themes/default/tabs.css new file mode 100644 index 000000000..e3e97c78b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/tabs.css @@ -0,0 +1,413 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #E0ECFF url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #E0ECFF url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eaf2ff; + color: #000000; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #0E2D5F; + background: -webkit-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: -moz-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: -o-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: linear-gradient(to bottom,#EFF5FF 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: -moz-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: -o-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: linear-gradient(to bottom,#ffffff 0,#EFF5FF 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: -moz-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: -o-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: linear-gradient(to right,#EFF5FF 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: -moz-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: -o-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: linear-gradient(to right,#ffffff 0,#EFF5FF 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=1); +} +.tabs li a.tabs-inner { + color: #0E2D5F; + background-color: #E0ECFF; + background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #E0ECFF; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #95B8E7; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eaf2ff; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #ffe48d; + color: #000000; + filter: none; + border-color: #95B8E7; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/tagbox.css b/testapps/GHIssues/src/main/resources/asset/themes/default/tagbox.css new file mode 100644 index 000000000..67d51a367 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #eaf2ff; + color: #000000; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/textbox.css b/testapps/GHIssues/src/main/resources/asset/themes/default/textbox.css new file mode 100644 index 000000000..71b154aa0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #95B8E7; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #6b9cde; + -moz-box-shadow: 0 0 3px 0 #95B8E7; + -webkit-box-shadow: 0 0 3px 0 #95B8E7; + box-shadow: 0 0 3px 0 #95B8E7; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/tooltip.css b/testapps/GHIssues/src/main/resources/asset/themes/default/tooltip.css new file mode 100644 index 000000000..8ce21b40e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #95B8E7; + color: #000000; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #95B8E7; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #95B8E7; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #95B8E7; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #95B8E7; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/tree.css b/testapps/GHIssues/src/main/resources/asset/themes/default/tree.css new file mode 100644 index 000000000..4a1bce0a0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #95B8E7; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #000000; + border-color: #95B8E7; +} +.tree-node-hover { + background: #eaf2ff; + color: #000000; +} +.tree-node-selected { + background: #ffe48d; + color: #000000; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/validatebox.css b/testapps/GHIssues/src/main/resources/asset/themes/default/validatebox.css new file mode 100644 index 000000000..1fc3ad64e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/default/window.css b/testapps/GHIssues/src/main/resources/asset/themes/default/window.css new file mode 100644 index 000000000..25a4bee98 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/default/window.css @@ -0,0 +1,188 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #95B8E7; +} +.window { + background-color: #E0ECFF; + background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); +} +.window-proxy { + border: 1px dashed #95B8E7; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #95B8E7; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/accordion.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/accordion.css new file mode 100644 index 000000000..3226cb381 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #D3D3D3; +} +.accordion .accordion-header { + background: #f3f3f3; + filter: none; +} +.accordion .accordion-header-selected { + background: #0092DC; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #f3f3f3; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #D3D3D3; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #f3f3f3; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #D3D3D3; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #f3f3f3; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #D3D3D3; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/calendar.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/calendar.css new file mode 100644 index 000000000..c647dcd31 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #4d4d4d; +} +.calendar-day { + color: #000000; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #D3D3D3; +} +.calendar { + border-color: #D3D3D3; +} +.calendar-header { + background: #f3f3f3; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #e2e2e2; + color: #000000; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #0092DC; + color: #fff; + border: 1px solid #0070a9; + padding: 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/checkbox.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/checkbox.css new file mode 100644 index 000000000..0edec673f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #0070a9; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #0070a9; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/combo.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/combo.css new file mode 100644 index 000000000..6ebdf5ee7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #f3f3f3; +} +.combo-arrow-hover { + background-color: #e2e2e2; +} +.combo-arrow:hover { + background-color: #e2e2e2; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/combobox.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/combobox.css new file mode 100644 index 000000000..06613c144 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #e2e2e2; + color: #000000; +} +.combobox-item-selected { + background-color: #0092DC; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/datagrid.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/datagrid.css new file mode 100644 index 000000000..f5e39b43a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/datagrid.css @@ -0,0 +1,291 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #D3D3D3; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fafafa; + background: -webkit-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: -moz-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: -o-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: linear-gradient(to bottom,#fdfdfd 0,#f5f5f5 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#fdfdfd,endColorstr=#f5f5f5,GradientType=0); +} +.datagrid-cell-rownumber { + color: #000000; +} +.datagrid-resize-proxy { + background: #bfbfbf; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #D3D3D3; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #ddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #000000; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #e2e2e2; + color: #000000; + cursor: default; +} +.datagrid-row-selected { + background: #0092DC; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/datalist.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/datalist.css new file mode 100644 index 000000000..de149ef05 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fafafa; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #000000; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #e2e2e2; + color: #000000; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/datebox.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/datebox.css new file mode 100644 index 000000000..36281af1b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #444; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/dialog.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/dialog.css new file mode 100644 index 000000000..2850ca1dc --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #D3D3D3 #D3D3D3 #ddd #D3D3D3; +} +.dialog-button { + border-color: #ddd #D3D3D3 #D3D3D3 #D3D3D3; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/easyui.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/easyui.css new file mode 100644 index 000000000..43bc780b8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/easyui.css @@ -0,0 +1,3427 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #e2e2e2; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #D3D3D3; +} +.panel-header { + background-color: #f3f3f3; + background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); +} +.panel-body { + background-color: #ffffff; + color: #000000; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #575765; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #D3D3D3; + overflow: hidden; + background: #fafafa; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #D3D3D3; +} +.accordion .accordion-header { + background: #f3f3f3; + filter: none; +} +.accordion .accordion-header-selected { + background: #0092DC; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #f3f3f3; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #D3D3D3; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #f3f3f3; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #D3D3D3; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #f3f3f3; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #D3D3D3; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #D3D3D3; +} +.window { + background-color: #f3f3f3; + background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); +} +.window-proxy { + border: 1px dashed #D3D3D3; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #D3D3D3; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #D3D3D3 #D3D3D3 #ddd #D3D3D3; +} +.dialog-button { + border-color: #ddd #D3D3D3 #D3D3D3 #D3D3D3; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #444; + background: #fafafa; + background-repeat: repeat-x; + border: 1px solid #bbb; + background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn:hover { + background: #e2e2e2; + color: #000000; + border: 1px solid #ccc; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #ccc; + padding: 0; +} +.l-btn-plain:hover { + background: #e2e2e2; + color: #000000; + border: 1px solid #ccc; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #fafafa; + color: #444; + background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #ddd; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #ddd; +} +.textbox { + position: relative; + border: 1px solid #D3D3D3; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #bababa; + -moz-box-shadow: 0 0 3px 0 #D3D3D3; + -webkit-box-shadow: 0 0 3px 0 #D3D3D3; + box-shadow: 0 0 3px 0 #D3D3D3; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #f3f3f3; +} +.combo-arrow-hover { + background-color: #e2e2e2; +} +.combo-arrow:hover { + background-color: #e2e2e2; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #e2e2e2; + color: #000000; +} +.combobox-item-selected { + background-color: #0092DC; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #e2e2e2; + color: #000000; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #bfbfbf; +} +.layout-split-north { + border-bottom: 5px solid #efefef; +} +.layout-split-south { + border-top: 5px solid #efefef; +} +.layout-split-east { + border-left: 5px solid #efefef; +} +.layout-split-west { + border-right: 5px solid #efefef; +} +.layout-expand { + background-color: #f3f3f3; +} +.layout-expand-over { + background-color: #f3f3f3; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #f3f3f3 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #f3f3f3 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #e2e2e2; + color: #000000; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #575765; + background: -webkit-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: -moz-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: -o-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: linear-gradient(to bottom,#F8F8F8 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: -o-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: linear-gradient(to bottom,#ffffff 0,#F8F8F8 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: -moz-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: -o-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: linear-gradient(to right,#F8F8F8 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: -moz-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: -o-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: linear-gradient(to right,#ffffff 0,#F8F8F8 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=1); +} +.tabs li a.tabs-inner { + color: #575765; + background-color: #f3f3f3; + background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #f3f3f3; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #D3D3D3; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #e2e2e2; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0092DC; + color: #fff; + filter: none; + border-color: #D3D3D3; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #D3D3D3; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fafafa; + background: -webkit-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: -moz-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: -o-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: linear-gradient(to bottom,#fdfdfd 0,#f5f5f5 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#fdfdfd,endColorstr=#f5f5f5,GradientType=0); +} +.datagrid-cell-rownumber { + color: #000000; +} +.datagrid-resize-proxy { + background: #bfbfbf; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #D3D3D3; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #ddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #000000; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #e2e2e2; + color: #000000; + cursor: default; +} +.datagrid-row-selected { + background: #0092DC; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #ddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #f3f3f3; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #ddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #f3f3f3; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fafafa; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #000000; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #e2e2e2; + color: #000000; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #D3D3D3; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #4d4d4d; +} +.calendar-day { + color: #000000; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #D3D3D3; +} +.calendar { + border-color: #D3D3D3; +} +.calendar-header { + background: #f3f3f3; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #e2e2e2; + color: #000000; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #0092DC; + color: #fff; + border: 1px solid #0070a9; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #444; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #f3f3f3; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #f3f3f3; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #e2e2e2; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #e2e2e2; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #f3f3f3; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #f3f3f3; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #f3f3f3; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #D3D3D3; +} +.progressbar-text { + color: #000000; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0092DC; + color: #fff; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #f3f3f3; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #D3D3D3; + background: #f3f3f3; +} +.slider-rule span { + border-color: #D3D3D3; +} +.slider-rulelabel span { + color: #000000; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #ccc; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #ccc; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #f3f3f3; + border-color: #D3D3D3; + color: #444; +} +.menu-content { + background: #ffffff; +} +.menu-item { + border-color: transparent; + _border-color: #f3f3f3; +} +.menu-active { + border-color: #ccc; + color: #000000; + background: #e2e2e2; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #444; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #e2e2e2; + color: #000000; + border: 1px solid #ccc; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #bfbfbf; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #ccc; + background-color: #e2e2e2; + color: #000000; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #bfbfbf; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #D3D3D3; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #D3D3D3; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #000000; + border-color: #D3D3D3; +} +.tree-node-hover { + background: #e2e2e2; + color: #000000; +} +.tree-node-selected { + background: #0092DC; + color: #fff; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #D3D3D3; + color: #000000; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #D3D3D3; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #D3D3D3; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #D3D3D3; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #D3D3D3; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0092DC; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #000000; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #000000; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #0070a9; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #0070a9; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #0070a9; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #0070a9; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #575765; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #575765; +} +.sidemenu .accordion-header:hover { + background: #e2e2e2; + color: #575765; +} +.sidemenu .tree-node-hover { + background: #e2e2e2; + color: #575765; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #0070a9; + color: #fff; + background: #0092DC; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/filebox.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/accordion_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..a0b8769cc5091d81760c7ed555ac3c3453febbfd GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#8c}V@SoVHq8x z8Mn?6aTf^k-V*tOYvn_ZO}fk5lvg|}E|PI9vs&aPwII@?XO4*juRBlIrj#un@>dub Yl7)&6CQe}74m6L!)78&qol`;+0Id=veEh?7!oT zn93bYIb9!43Wj)WNz0M)xYl!8U>3_OjRiss3@1j_Zvlb#iD~jUnsR3em#t_3WtUHqj%c^0} zFSrhZpjU$)YHUS-lsMx)nN8pghWK6h!524#*oXjC@NjHF9H1y2K%G?c=lr%4eY%ue zT+7R9Pld<2<$C}OAU0HZIJPqD0RA&Sip042zF(tA4uaUhZ>jL`*HN0POocjDIidNRbTZ#@zvW7@I c5>Ct23v;ttA1D3-v;Y7A07*qoM6N<$f&+eyE&u=k literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/datebox_arrow.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/datebox_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135 GIT binary patch literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fWs*_M~|PZK4f_B}P-f8$r|z#h zE+)9D_?OzcE{A)9cRCb`94D|RR5VOsbIEjx-=1{JpsQ;^Px3ZX?(@vc^nEOU2KU{_ gJ$cDa*@;a`BkgHpqSBTGpgR~mUHx3vIVCg!07Oqo9{>OV literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/linkbutton_bg.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/linkbutton_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..fc66bd2cd24047b8377342365a1df3846327ecde GIT binary patch literal 1274 zcmVc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/loading.gif b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/menu_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/messager_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000_$JYFBpo`sqZyU339@ZwM6gi$;Pr>w&6M&T1N3Q$b?ahk3>@EL9`+1-BwzvH4 z=V<*uH!1ee(Sv*K$aVm^9zxbfZU9nZC#eDGVQ*&XXK(qpy{>x2j~_q0QX@ky?B2S$ z`TO_pb_Ho^lHPWf$3SXG3P5TF!a(UIB>)3m?2n~HhFtml`Lhm)4-7>2Cr_RTgV@`) zZDWrM_B#twLv#R=>k(}FC=EbL>?Sq<16=LCHdYi*!X*!q1F0DeKpY^*)!|!SNr;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/passwordbox_open.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..0f25d535e05b22b406fd72647611aace9cfa6249 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/searchbox_button.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/spinner_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b1773c24b20b30318e38c4b84690e3d0010c9c43 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4DgeBzU z{E=^QXHHmRmEiEUJ<_jB`NK-}t7{l}8A{FvOK}{T)p$BC>8|6-x-MIXOa{IRh5%#E x$&;(vVs#x>vb(K5c#%QkA)^788{=C>2L8QE5AM%P*8@KmF984m literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/tabs_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..dfa10f7d78b3dc6965ef86957a0e4345ec000bc6 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2O2978H@B_~L*E^a70aO1`g zdpoacw*Y(&nwsF2UyID`n8m&$nZ<^krzppre_*0C6=+@buQ_y%c^L~IL^<_ t&+}8oM91jk1`W4%S64GGH^xE+hOnLmClB8dn+LRl!PC{xWt~$(69Df$H1z-g literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/tagbox_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec64360884b3fdb81255ad6074bc08ed183232c GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoVtb9vwNkrdSr%AfUpK=5(o}_e|{SG6u6f5&Q g4t5*qz9vC-hN^}472i&@1{u%b>FVdQ&MBb@08Zm4@c;k- literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/tree_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/images/validatebox_warning.png b/testapps/GHIssues/src/main/resources/asset/themes/gray/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/passwordbox.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/progressbar.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/progressbar.css new file mode 100644 index 000000000..ca49e9404 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #D3D3D3; +} +.progressbar-text { + color: #000000; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0092DC; + color: #fff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/propertygrid.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/propertygrid.css new file mode 100644 index 000000000..e9f98ee57 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #ddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #f3f3f3; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #ddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #f3f3f3; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/radiobutton.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/radiobutton.css new file mode 100644 index 000000000..341e570fd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #0070a9; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #0070a9; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/searchbox.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/searchbox.css new file mode 100644 index 000000000..7b15815d2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #f3f3f3; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/sidemenu.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/sidemenu.css new file mode 100644 index 000000000..43e137260 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #575765; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #575765; +} +.sidemenu .accordion-header:hover { + background: #e2e2e2; + color: #575765; +} +.sidemenu .tree-node-hover { + background: #e2e2e2; + color: #575765; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #0070a9; + color: #fff; + background: #0092DC; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/slider.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/slider.css new file mode 100644 index 000000000..11c8b2682 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #D3D3D3; + background: #f3f3f3; +} +.slider-rule span { + border-color: #D3D3D3; +} +.slider-rulelabel span { + color: #000000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/spinner.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/spinner.css new file mode 100644 index 000000000..391f22780 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #f3f3f3; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #f3f3f3; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #e2e2e2; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #e2e2e2; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #f3f3f3; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #f3f3f3; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #f3f3f3; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/splitbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/splitbutton.css new file mode 100644 index 000000000..bb2b6daaf --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #bfbfbf; + border-width: 0 0 0 1px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/switchbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/switchbutton.css new file mode 100644 index 000000000..a5bf61f75 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0092DC; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #000000; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #000000; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/tabs.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/tabs.css new file mode 100644 index 000000000..2767fc0da --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/tabs.css @@ -0,0 +1,413 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #f3f3f3 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #f3f3f3 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #e2e2e2; + color: #000000; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #575765; + background: -webkit-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: -moz-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: -o-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: linear-gradient(to bottom,#F8F8F8 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: -o-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: linear-gradient(to bottom,#ffffff 0,#F8F8F8 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: -moz-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: -o-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: linear-gradient(to right,#F8F8F8 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: -moz-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: -o-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: linear-gradient(to right,#ffffff 0,#F8F8F8 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=1); +} +.tabs li a.tabs-inner { + color: #575765; + background-color: #f3f3f3; + background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #f3f3f3; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #D3D3D3; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #e2e2e2; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0092DC; + color: #fff; + filter: none; + border-color: #D3D3D3; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/tagbox.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/tagbox.css new file mode 100644 index 000000000..46cbd333d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #e2e2e2; + color: #000000; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/textbox.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/textbox.css new file mode 100644 index 000000000..2705ebcf9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #D3D3D3; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #bababa; + -moz-box-shadow: 0 0 3px 0 #D3D3D3; + -webkit-box-shadow: 0 0 3px 0 #D3D3D3; + box-shadow: 0 0 3px 0 #D3D3D3; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/tooltip.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/tooltip.css new file mode 100644 index 000000000..fee263f7f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #D3D3D3; + color: #000000; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #D3D3D3; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #D3D3D3; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #D3D3D3; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #D3D3D3; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/tree.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/tree.css new file mode 100644 index 000000000..1cc4f2d3a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #D3D3D3; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #000000; + border-color: #D3D3D3; +} +.tree-node-hover { + background: #e2e2e2; + color: #000000; +} +.tree-node-selected { + background: #0092DC; + color: #fff; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/validatebox.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/validatebox.css new file mode 100644 index 000000000..1fc3ad64e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/gray/window.css b/testapps/GHIssues/src/main/resources/asset/themes/gray/window.css new file mode 100644 index 000000000..0e522cd88 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/gray/window.css @@ -0,0 +1,188 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #D3D3D3; +} +.window { + background-color: #f3f3f3; + background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); +} +.window-proxy { + border: 1px dashed #D3D3D3; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #D3D3D3; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icon.css b/testapps/GHIssues/src/main/resources/asset/themes/icon.css new file mode 100755 index 000000000..50d4f1b65 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/icon.css @@ -0,0 +1,96 @@ +.icon-blank{ + background:url('icons/blank.gif') no-repeat center center; +} +.icon-add{ + background:url('icons/edit_add.png') no-repeat center center; +} +.icon-edit{ + background:url('icons/pencil.png') no-repeat center center; +} +.icon-clear{ + background:url('icons/clear.png') no-repeat center center; +} +.icon-remove{ + background:url('icons/edit_remove.png') no-repeat center center; +} +.icon-save{ + background:url('icons/filesave.png') no-repeat center center; +} +.icon-cut{ + background:url('icons/cut.png') no-repeat center center; +} +.icon-ok{ + background:url('icons/ok.png') no-repeat center center; +} +.icon-no{ + background:url('icons/no.png') no-repeat center center; +} +.icon-cancel{ + background:url('icons/cancel.png') no-repeat center center; +} +.icon-reload{ + background:url('icons/reload.png') no-repeat center center; +} +.icon-search{ + background:url('icons/search.png') no-repeat center center; +} +.icon-print{ + background:url('icons/print.png') no-repeat center center; +} +.icon-help{ + background:url('icons/help.png') no-repeat center center; +} +.icon-undo{ + background:url('icons/undo.png') no-repeat center center; +} +.icon-redo{ + background:url('icons/redo.png') no-repeat center center; +} +.icon-back{ + background:url('icons/back.png') no-repeat center center; +} +.icon-sum{ + background:url('icons/sum.png') no-repeat center center; +} +.icon-tip{ + background:url('icons/tip.png') no-repeat center center; +} +.icon-filter{ + background:url('icons/filter.png') no-repeat center center; +} +.icon-man{ + background:url('icons/man.png') no-repeat center center; +} +.icon-lock{ + background:url('icons/lock.png') no-repeat center center; +} +.icon-more{ + background:url('icons/more.png') no-repeat center center; +} + + +.icon-mini-add{ + background:url('icons/mini_add.png') no-repeat center center; +} +.icon-mini-edit{ + background:url('icons/mini_edit.png') no-repeat center center; +} +.icon-mini-refresh{ + background:url('icons/mini_refresh.png') no-repeat center center; +} + +.icon-large-picture{ + background:url('icons/large_picture.png') no-repeat center center; +} +.icon-large-clipart{ + background:url('icons/large_clipart.png') no-repeat center center; +} +.icon-large-shapes{ + background:url('icons/large_shapes.png') no-repeat center center; +} +.icon-large-smartart{ + background:url('icons/large_smartart.png') no-repeat center center; +} +.icon-large-chart{ + background:url('icons/large_chart.png') no-repeat center center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/back.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/back.png new file mode 100755 index 0000000000000000000000000000000000000000..3fe8b178ec9eb9fdbfefe0f2c81c8d4acf0dc275 GIT binary patch literal 912 zcmV;B18@9^P)DPbufGfoO#dy!l?7(~R{rJuB|Ic3( zr2qlMf}#2UUndb!-U*#ucDjkNIt+}=Obow%{r$o4^UqfXE*6k;foc%S0Rjlgfd4?5 zf5px&s!cN{J9F|ViZCp>{+}U8Tk|V?U_iPMphZz_IS$;9h@%hJaXH%3`;KjXZQ*9FFVV3hN%aCGjMUR1HHn+ z@a^MI26o0j4AJ(Y49b$+;J^R~Ag}?Z#!~g|?RE?+ZZR?}IQyT0vRH6Gfp6#Aq|XXnD!yol{GeUeEH15z{&iNK}>*+ff=Ho0U&_D2K@WS)Y#U3 zL<*QjlG@v>7^K*LF;uO1$H33~kD)O@mf_`_pA4@*{$OBc;sM6se}=oyzcD<1{hb-4 z7a)M3fynfS;s3w1j*cU*?%aD#}SqhQ+&{GkpB3~WDG86SXj0t66JI$#2Z>i^0$tFE0td*)?Zf4{AAccL7__n-e5zW@IF`Rlho zISk)^-(&#U%K~&i4@4_K0AWeW%&YF-``{WFx_xe1-VuhUFTXRebF#1lJi_@W|M}sAhw_srY>W~TKsPfouoxLJNIief_Uq!sAfaEsA{^Y@xOjmE zgETUH_`vZ0)G3BDOP2h+bm&kaKmak@u(Mx&^y$-mrq{2%AP9OrSt~`cWMBe}Df@WdXVtAb^-{fqrKM zhBm{WKbK$p{CV}~>(@b&Z{ISrfec|{VqpC9hvEOnj||^|n$Pav|M&czJ4yfk{hPxK ziXor@00G3p|Me>aP=MhdQ1O2@wh#Zfxc+?xI`hkm7YtzU0Ks3N8c+cLWnuXTwCn>L zPz;1Y=>#Bvm|a;}8UBK7;o$HwmX%#&_3Ev z8Du=HOuX z4|L&Apeyv`#@8bfBxE!U^>5?3)J&j7~IN0z^T7prh^aQ_9m=nqi-_p@gVCMG7_z;K%h5I{^nzkYr61?WsB zppBr|;1UpEcqk91j^EtPTT1|U8QuVY?eYHqKSSK zP3o7x#7F%IgmygBVw*mDl7H^Z{OA78x#wJf^N>g+(A}*)`QG z5RTB`_EMce+Rq7v1K^?@u()CXf6xoz7!8!yDW$`H4viiQVXJBa++G(roc6hNHhJa` zc)tgNK1C=T#LYg4#zR25R*jil>eLtT{GdaAuGwmA2T&d-c>V5!!d9NyEp9Qmxe|`j ziex$g4vI7tOS{$FMw-cFlc$u|)oH@xv;lB4TdF3p9zS6L`{g|*5)D-xF1xRMSgLOC z7MSARP8Hv+kyxnx2--m{*z6VvMS>8Zy#!`G*)JEFkDm^i! z57&EQSe~y>rx{P4Jq8WqI_>n@dK|C^u()ifPp27dDGN*U z^*)3m0U({Lwv9rzno6%R=}dwtY~>hiY=vzs3$T+mn9{vzjZvdfBXyxZ39Q1lxt*_O za!Cf)+FBy^2Uli$r+^So1&^UvC9Uv!asn@3M*|?0O5yp7r!a4LH=D=I>FhdY&DZp^ zI_lx02LqV>=f-B1VTE_&n|?;e8M}28xLj@nAnp)D|3JTRN;i4Tjw+i=)$ZND8$(OU zO0JNPx!jIl*?fw5pNO9Is(T6ipVtD2MW9ltL~^<8_V~oBFC(MFPBbrJi4vhmDCP_J z3YkoHXME!2*U=lJE*_6}vFCCRm&4&S04zz3eYkpUkW2Ite1g#M`uYfvc1r7BSCpMy$Yx?I literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/cut.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/cut.png new file mode 100755 index 0000000000000000000000000000000000000000..21fdb4dc3c8ee79a0ce59a981c336538bb334442 GIT binary patch literal 1024 zcmV+b1poVqP)KUssI7R0t_;S-$0W-{rMx#%*eo)+e?%RfoV-A` z?ccwj;n}liPhDMIlit34>!qu!Yo(>7CAn+YuBQM2#PSp96fq8t;>8MTUb14+5!+ zh1}fS`vC%oB~w|slAW3PZ_cGlj@4{z(`tBmEnEc!mA;smFnr?YXSj9d48xmOul_%M z{`}=lpp}mwKc2(K$G039!2g(mVFeICEJ7?SLUQ8b%?bbpD{3O`OVC%+UevppX=w(zf+GMz2w2fBr5aagUt~(wq2b6{=H%aCSg#% z;Q+?Mw_m@&E&&K2CXiWwfX;daOnK_U!VcEb(%ehWpTE%h^=r=l|Nr0dGcxisGXPUK z$TlG61Zw>H_%XwOp!#1x0|5dEoRGc&4FEao?Uyf)o&i%`p`f6d>(i&31V4QeYY`CW z`^e6IpfT9{;&=|5oFFCgx5C zCdU5^zkvGwFf#xI5F^9@Mj&PZ>i;XIDz1EIW7#HNO(``7Wbpj`D~6DkIEG`Fj~g>E zv7BT0%MMh}%m5HTKwUu1|AE&0`w6t2L0CglgBzr|=0G*WndfI1m|2+_WcXznrnpXK zFxRwXICk!k9K(Oca|}%X!CCZghWKjC@{mZ}K|9&$aet3l8(A`4} z3_y#NM3or6{{6!6{l|9(hVS2X7}(iA0KNK@fra@tKmf4-8BwZIYO@XHj5z=N`2F8h z!HkKOiG_iOjfa7mgPDPijg5hqofqgzMg|KtBZgP5QB79zkL@az9?F#YcPyZ^3>T>rDQvi#@l=KQZeU;qEDcej8t|Nj34Vi0)x=H-9m zRJUIM0mPyts?4V;rOD8+yMbZvjlB#koIpo0{bjiO@h$^58#ge#m>6Dvd(DusJA;9f zos;1k5E_WURn1feKaiAuu1|BaZK*xijMU?6_J&-MoG9!s-C zzdQA+U}|%2STXXENpkw6Jq=WB#30h**Zqx80G7xg2LKoZVN&=1FEccT3xQkve43;n zjZvX^?*P{BPNoA(9dqA2RbK$HFf%bTgA}R?sWRwG>M<~LvjC&_AH(x+&l!FKqZXu* zgNcJdK|q0lm5r6*+rMuN%KXYeyO>(c-8{PO?x|MdU-|N8&%^z#2WXiNJ7h~@6v zdzJqE0h7#>E!qD3`omx(tIv?@mCeAx!U6Ut*b6}K$qC3ZY&&|8VcW@F4D1|S3|H@7 z|9AS=o?ccaRt6&pBZl99|1dDI zGBU^m{m;e1#lXV}Oi-MhCxK>dW&i~p&}9Gt!~zOUV9)~%0Wtr6y!+zLuZM3QbN0IR zG5i5SP>3@F;m5C^8P4814U9_G7Yt0G+{*~gyZ`~j$dJs4lARg<{>{>s*6r4l)n@}` z=l}m08CV!u816i~$8h@Qg}#6P7^{HU`5(hCMsRip2rvLwO?vxoke4F>0000k-9#K@4yU?IRNuvAG{MT+4+!{7h^fL{8`$iM*d**|6= z4P^fVVJ0wUWME=o`p?At@cFZEuRncB1qdJpzI47ba}Uk?|Kr!s|G$3!`TyhRum9hF zK=JqAK>Q1Wzk%@Y|3AL{`Tz6B-~ZcB?f)+or2iBkfLOGob+i+#;~6f!yu|SE{X+(J z7B&V3CZLTV1o9vwBM<>GNC3$H3xvX)LJS_J4h&{mrV;=F#KOtK@sEj#iJ^O6H^aK~ z>lj$LSr{0AW-tI<&&a~az|73dz{Cu6HVXuQ`~Qu>M#h?9tM@hrPBzZJ00F2XV-x^j z7z9cv`TuhRA=;X)qu}73hnoGd)hHEGiI`W8Wd+4gnzL6}5;?d6hzTh;Al{IJA|HldbA>qGJ3W z(Akj0gy6FuMFMs&||L0%d|AW9UApQ!(pZ@&+|Lq@y|Mx!xy!-m`f6?aW|CJIi zgSZR;0Vo`U6o5e(2o6=NC;k67TPnoF(0CnomdWR}+}Y*TYj=gwum!e34a6bEszh3= z!9Qg_5-j;~e*pwG;QznB|Ns7DWME)o1UvLUBgD}l>Nil}H_*V}Ob~(JKmlGpK?W`k zuzm)B0AgW)14af$paG0PMQqGK9!Q=Us_72{I7~pU0)`4Wj6lu@0e}Dk8vxV?mSALJ zf(SB0Y-eDC7z8r(H&F8*sH6WgGBGeRL#zb|Ah-*dfU4M-L8kr%^O=DPIDxwV0X6*r zc?B39|Nnu!_Y-I?Cj%2yA3y*>0ujjj`kRsA*aK#UKmY##Z39LlQ0L#je}VLWhQA;$ z03i$WUxq(F{xf{~!^yw`jbDHO0vo{2@}J?wcLs(tS6LbUeES7<^Pj&!!+?SC_b(&` z`~X_;?h`WuhX6AJJ3lZ+SRe)f1Q6H&W}qLx0b`K!=QoB7%dZUL;!F%*zcDiW`~?XM z77j*++Yf#-Kmb7k5$NBaKxeYD{AG|5`NuGK?Oz55Qziy; zeKv;gK$mfHGBNIfE{W8Kmb9!05tU%&_vdFGjGd1eqWv00a=k1&oZ$Yy|!NK66*5ZHhV+bRpY|MBzx zeXpJ~@NlyNT?C9qXd+?)M%h=O&F_E~aC~8Ako(8TcyI5es|*dw3;+Sd2uqUW0)PMm Y07EoBQ)jr0B>(^b07*qoM6N<$g57L=!vFvP literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/filter.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/filter.png new file mode 100755 index 0000000000000000000000000000000000000000..1fedf7ae66f9512c8991a91f606e33926210dfd1 GIT binary patch literal 305 zcmV-10nYx3P)i;JxOiC&m|MyN^@V~Zu%6~m0)Bj`zY(-tqe_OBM|76EZZDa3$M~@)# z4XCPX|L^4POMwARE&rW8d?@fjbNzpNXSe?h!y5nqPb`Zh>Gjmx00000NkvXXu0mjf D9Yd^C literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/help.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/help.png new file mode 100755 index 0000000000000000000000000000000000000000..28a0f9e5e6a24fe2cc3d842d0708e70512dbf84b GIT binary patch literal 1187 zcmXX`YfMuI6h6Hzx2+Ut1EjYq1A-3cSfq4{Is$g`oXj!QjiG^7TiBdhXGlOZxm1@9 zS*DOla3bRT0cHN_rJ;^5DgN)q2ZN z|EAt&1z&5w`m%mvX&4t+@c4Ki)zj^n9Qtq}u-Kkgm|S+sG2Fc6RK?X36?YJhP0dA}?VOU?JP&>G6klO2uGz08Gy=gKR?}h(b{K&aenodIzi% z2f@MJp01+RY|(6BJziiDpcm1+C)f4BSg6zCdpJmKRiimi){G4(q} z1^PxxRYp%IvSXi?q6Z{WU1=c||G9fvjNOV8M5eGC9+9=$-Km*DQ5AV*WII_(dnpARZKp%77uh;KZ$z~72R!)*N`!~x=0M8DAMel@xO((;7NkGYln^j z>m@53+D`)q@q?T2z|AfKr0Wq7@&V%3vEWE%IJj2*@I~|AQ1|l-SXw1vg>V7oa|8I- z0PP3HCDVWP3>La6dZtL>>2W$NTXeTeE3}I*#OEs`#HLvXE;&}!k}!JOU8}8G*^*;= zPjSv0_%M5yo+6j0Lw14m9`2dn-mf1NjIPg)Vw7)%a0o9zj^>|q#+Vv13MJSTT;}7h z4Zfq*P7G=k-K=j!InVUNj9wh!)4I~ern6^GUXtfu4!SZ`QB}@5t|WV`n%8=*ErSn) zGjYM$*~Vxc9q@=I`#Q~!`<=w&Se+$ud=Pk1O*Brwau1*M?WFKRth>8iTZJdIQgn~v zCzI($b7!BT>3&ZqyhH4&mz1-ow|8KFVjY;l(ti5lghhYge-hacl;-uimIqemZ0Qjj zBEs2%Kv-FHfq7&Jo><&)%Bjgdi{^SdvbB+` z{s9&)87BY$ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/large_chart.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/large_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..527608ee94683724de57fac1ed7593714ac41be4 GIT binary patch literal 1669 zcmV;027394P)OoL=dNpfT{jDe$P=9Ivhqz^iKm@S3IrUXvM(0iptmQ@N;^Xr`2l z>4!e;MtyMJ3@@+P z*cta0P;qWNgQ5t%kIIj;1wLh)>WhuhRMihnmHnENfO~VPJZBe!rXUHBxK2!dnjp`y z(`>y!X!;Ed4J}m4t$ZUqDz_on(tKFP<=Z=Rs60EC!Cg-WdZizNtwDlZX0M^Vz;da) zRk?SP0@rg5(0I-o4d?oDoM&fiyuRg4U;@stq2@8HW2l!$}hO{43f| zkRR=*CN3~#OC`C|Iv#~EN98>g3S3CjgZzXU!JJQyrc1M^d~XB;xx@+$vxiXb(Hu;2 zFkVG15abzF9mEABn@ce}UQW15nZ?ctSFs`YA(b2XNb$S02Wm1+P?Kd!R)b`wDdkb6 zCzU6LGN^U6z@3>6xI=D6HtT0{`DdiBAW!S7q=4(sCGh;Unj`KKp_&pQYoKyNuN0h3 z>4uAkjZtyfh~o%1H-B;Tyx`6PO>T7N03V` zRm26HLyu!xbTQ#9Pcfzv)@CTEytl`8oQ&&CR-qS4QuImc^K&oUE}l;1F@X$9N9*IV zt0kqDPnO3&c?t4VOC>Ad6r2G`;c zZL$jAAUCcD$!6rIrcrt1d7v}p0A*tdPKG=NXjthX$oHBn*@BUalQ2H`5S$6` z=j!BAD(~+66VldeLAJFU$F}YQwYk%%Jlu!D>47@<&9NuWwLl;BLGFS)*|eRw!0-ie za0*Js*mo@Da%Dm>mFtdK4rzo2jz;S?v#Be|uBeu|QF-WW1}FM!qG)(`6n)FmjZ1QT zD{!hH-)-`>xWHha&2U__1EVQB;porJD|X~jx$a1R>xdQ@kmMRh^?hR)nfvf`+O z%7Z-_$ZXV*Kcq8G59xyZ!8~ME1WXp>iN;C_IDEeWBj(2tw(!JIf?{P<-f74@B!zT< zbe#^N6Q4RbKqyO}MCB`HFgRwVijxkV$WJf1UsxQp=`3I5BFGbr+K3C-O%KIT?T?T-@#dA#9Q z;sUmAt1xJ0IEN>jVHikqadaA$YuV30+)`ES3DG2Ik=5Xmr9?W3%2^JXwn3&%2M%i% zH8QK=vahos-)X311*~0{V8FCs!YV!q?!oZixSz_^ZQSt75)~w@)IcI3VHJxeJuXgl z5elRlllOu?D&(=NLi0!;Rg$Wxo;OaAr}+IKF3`u>4|bBJu$#P;roAMHWDxu!_E7ma z?={#K&<>Oq`+Z|wn+bg3ZL(&JZbVMWEEBYkyTWk)Z(So z!f8HiUHo|hg!B!M$GACb=$E$mwIkcmQAGak2~^IWlW0V?!K{sl3*KXpx^l@oc}8YI z#pD*RYzcN>l)?XzF!)U82=c!Hwib{lHNGh0 P00000NkvXXu0mjf#2YXZ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/large_clipart.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/large_clipart.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9c44002b6f76fcddea75aad020f5f58e91d10f GIT binary patch literal 1727 zcmV;w20;0VP)x*u^o!J%G8Go5#Sw4Cl=Gy7nFjGX+6p^{qM5 z(mrROv)2Cizt&#=dFY|fu88YsK_y|UCd*MlMq#B`Ia$u|+!1FrnT0iE+ROFxIagbZ z*u&b#QAI{Ujm(#m>8uF*IBWF1ilh9FIxj@|tpboCFB!ZBvjgBC6C1_SV?ero`zVd409F^ZnVytEzj z+IIM8J67)xU|=f@Jq7(+nHr4d z0U&f+D!PDBi@zS9KwR8w?BBni`1p8IQ&aKJ&TEz;{no63;7Qqi@sn8RHxaD=A$0u$ zx_>0Qm$~8Z5R`FZD2KgiCqD_K@~Rk6R3AE&#=d>~Nli(^mYhgcRTcU9c}(4##uOGJ z{no4j|JzS6SFnZ2(_3iT`#2pLKOxYv4WnZ#!T!z6k3PZp$XmQ}a3xSyVU=b;Hpr{5 zyv$3xcH?$mr=__Sm#dM4ghVDMd<2cfD8E$z6qSMe&G;RgxoiJ6P4Sy>$34zq;ZK=u zeHQ=7_nDgf6(d8Hyqxm(3IkGvAr^JvH8ft~#a(--tGmei^|cf@3VFkph|lN4FpMa_ zHBwN`Oxm}Y%l#(Csc%5_*P-zdEcYhNq2~w=KZkELmb*Rg@~5QZQ7KS4P%JE(2JNja z#O>a}fxR!1{fDP1%R7wk{v->A73H@k0Pk-erEA9{4DI;+?@~A?bnf;fzNL4t^Nn0~#vfY&ASrkdzf}NKdsJ;weekJlsii)s z-&z13RxcE~Ph-oX@}Pcev|^=bqJ%=J8dYb^5(QL^M$vraRJop0->Gpqkosm>^^~3{ zZBRWW+ff~kuiWVroYEkX6=#icGj;%1T3}S9!12t5+O=>M!0#K?! zD6@G=H6ybV?=Uyv&;b5h4bMpm%EkWKDBb%Oc<-2ahhWTS=!It%1WaH9HOwif2rt@F zrm61iI;C^2c7EgExsu3gsfk*q#@>8L>*7}-+H@GPvZhS1(%f@PWMW~-1b70MvV)`!#h+IbRoX|`pxyy9^705_c zQ_LN!GRdh7ka>QAjC1pxcZ0i6F%aT27~oqPO8>F_$_6ol(Q+4B2H zRa1@Y&3FAAE}fyUF`R!-4_xaB;qHd!?(lPq*t%+{s8pvwQLPr48_(4D`e-iA+ggNy z>;H;UHN`+qr9pK&T=9x^T71|6m(|#XwoBfS9@kYv)jl6Y)l|#PXAXGiP${ng8#1mU}|Zo%=uhJ*(?ORjUPT&oV7T@4iq1#kIXS z>pwEh!}dHSP*~HAq;&3nO#JJFPUWA*kVU3>ISzyYsesrOhcfc zvI7a}3{qggjZq)|mazaZE|~}dlRLnSPelvA4FU`uTiT#!;BH$smhNLmGU3GsO(z7pa&TA zLbbzQT|(cA3CSb{WF_A3Brq=kjWbv9s2_g zHe9csPs=!tXKj}-$Rg7a$b3?#7H)Gd22$I06FGEDdVeIrD&H7H_40VmpCR8OQOg?F_{fi%dh{ zR$i6bJ!j|y#f|UKyatsPN$Ywl?VBl)PJL?zct9m@yh#BhFupA?UtGzsDY zTIBPPetZ7*Af>@JgVkW15N}yLAbfHPa{?SVrqcYDGGA z5p_@nGN22w?bo-fM?X)mC9F*bS!5al=~*W1Nv9)ljQrYhR4>Cw$z%lg%ZK6Ljbc3% zMenE+&j(h}>`b8f)H!+0Ga|`tU%^jVX51*Xqh{emiMC0aWgA(W46?{H1TNouh7eyK z|1lm_TTvw!+Y3q2_yPVfS+V9jL?o7kSMK@nNfLKzW>GSM3~ z4LUL7ioxoPA^n*RCH51wg$)wcCW9<84S}@GB6WSt`;L(N!h%YH=UYO!S7w1L7)3;& z>%kZ*`h6(v+Lrg(t0YXeeblYUHmxLZC4Ug6&Mj<36PQ}lVCo5@VLXaUMOKu~#!xG= ztW5@4WEuh&Za;)54$}IzO)@hAe=xrn#BH50__uFnB+1jmh~)>Xi%dh{hieZZmlf=ukGNmb{aHf> zS!5al-=#l*Tv+%ZugF=1EHVv&Z?9yjZ}4^bE;x&jMW!L}_2v6;^FJc_XW=YD7MX^? zS7~?Q(tj76MaUx45IBD^Q+1wY$TS4LypVzaB8C8erSgX&JI*x1{1Z}+=L?a2m%RW0 N002ovPDHLkV1luY1RVeX literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/large_shapes.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/large_shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..90a0dcacd8d8b851262102fbbd9f99e23404da11 GIT binary patch literal 1318 zcmV+>1=;$EP)9s!&kf1?`{(nr_nL4ijp z@Q59_AEy-e%+o#ZJ=sso=F5O#0npiiBF!K&3p5uYxXhffFJlfWXEo!=YI0RFHj|7W z&H(1NBtX7zVpRehUIYfo{O?&edZ&-@i=qNGe+_v<@V;`X*;FshvcF;T88V-8p>5(AZNn>gl#-9;-jVL6Zqt{a0Jynq z=d$e|UqepKAj-6p7_e+%Y4Zq2$EP^I+-^6v4_uhEA3$qbL2-*2*?;t+e{vhTc{lps zyU|0LcUUCzma!wWo44>?RMtg+^*yP4@*ZZC^RgtE6sv5dFQ1Brbbj=2NJS70%oFl<4p8eh$siTIRu^T?<{w4o zO=R3)cB1v26SpHX{{@gzDCU}*i#0~06P{d1)GpdTw`eE^IVH2hW2ryhkXf6>4UOp# zRk|J0HfjvJl%W&1!qN%;80}=O&W=zzH!cA1_^~mI4a1TO(K6ve z?<_6=*!%$084n2hL;y(UQs(uhebgHEQKjF7vU&gsFDiWikiolUNjzeqNd@?G()}L* zxB$S=w?dza%-LLHI-ttz3G;^GJw&FyhN`l|8z3UNK#ZSRo^4V{Vt@eSC-^$#iIh2& zy_QVXdIx>(Kz4Z_VxN`K88EW#bq<6luOHzqnF*auL*&S>Jxa^#HoxuSGW$xFUS7_o(5!A3KNgoUV^#B8C2JFaD4^28?_+<%y_grD6z~>!07Bw^NBr{&sH!?HH|NF8(A;BIaA(R2wgPNQaZIAy zso^etBH|Aig2zHuumB$OaE=wwGvPG=oXvS4>p?=k_etpRK8oMk&H$u2_nv~F0q)1= z`33l#F$@~uhhJ49*yRA;Q^42P2Jmx6849&?=&_ywoSa@>fm-^tE9siYou3rJ190ai zDb^faoa~#vtuJo{>G47$b(*}il2nl)ZxD%s9IQ=WSaMlM1aFb`3 z193JPDm9|h@^P24;|Gp!!_sg!T7jrk71ETISDX8*K*;AqW8dg)8OE1{Dc=+5++PL8 cmjX5Y2jT&te&o4V^Z)<=07*qoM6N<$f=jV;pa1{> literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/large_smartart.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/large_smartart.png new file mode 100644 index 0000000000000000000000000000000000000000..b47da08fa7ff9b56f6abb2517cb6c2177029faf8 GIT binary patch literal 1336 zcmV-81;_e{P)pBh)O^%3AYgtAK>fS=bS`B3ob2ygd+n1+_U!rp`nRtOoyGX4 z=(KTP5eZuwP_)XRw^g9SUyshotLT2$geTLtU<+8$8*JY(&u4BU|8g?AY}~;uO)!@y z>wkj2Plaovm1yv2ah0#c4PJ+vZatdah8=NjxDqu^B~rEDZ*79zU=O5Q_QT*TLmht} zwVWEYLlv+Ll%uADk^-pOgQdid1!+XCm|3L0E>AWS|%q`)HvTg}BgDAjS}svlza|@=dV0YH3{6 zlZT?;5|LSXFg_DGEyrMdDaVDrLR8!HQDr-gs^@uODs6dD`NlaRe|~z?Tn_SS-8^HO zU}CG+Gl3mS)#Gevp5;KhOEeN}tbCY(<8&VG+4;sTzoc?ne#H5wCtc4@QF? z8cVQTnB(CM;}OWMQX}i!QL5g(8gmDdE#IO1!7org&JZwKo8epZkf0|V$L4v74MG7o zJcM^+9+U|181awbSYB>Oyz{eXAknlJC0$8SK1!oriRi62Nth>L9^(s4)GaU?ieYgV zJaaBVj2Fgk@RYj=*9-@zyBDWaMz-}_mz__EdJB@w-=eVNXR1C0G$ibX+|Vviq-%pr(~4|WBhpIhalD`wM{`U#l%)eVbHj>odMUZ zi>l_pO^={|bO3{14*t0nOwO%F8_?aWhOCXmyOUAvI0e&iVHD<$R!ppni;K(T>4rEm0?aX^j%&w4$RTOCJA`P6-9ma{O zACRd&6cbHd132F>F(fcNK7^q$k-^bdR3Sz0t1tr|#vu9$-@C17zr@~VMVO#}j;dx*^?pe_mVpFjf=$HYdWRi><#o(0 zeIOGbkS;e7227I?h2al@VqH55G;KIp(Ta?c8%Qp!$FbZ?IGk-HQ)>bff`R(azXe-e z*V}s$T>gl_(nm6}PA1l+U0B1rAR!4%(oQg@NXRcSF}o`CpNa3nfIYT>`7av?@4)O1 z4P0$!E%+$5V3EWb)Qai(55f*ig$Nm$TNA~Jx2$>+enXM5GXr;DKyA4#e3((VOSWww uo;PJ%&{}NG?HKsto3b6^`p5L2x&8(W8B7jWgRVFL0000P$7bO0Bg$#2^g^4GL=P|t$hNq6Wo3a*(T;p z0vQVx+}+~^FZg$7F5mpj8TfC>dxjeSoPQ1VOMaA_u^ZnVr5#t%}HrnH>ScvMk452cyww4>){z4m<+~ zz$VYjod;A^<#YL=rT|^%{p!C3c<0*i002ov JPDHLkV1n}aiueEk literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/man.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/man.png new file mode 100644 index 0000000000000000000000000000000000000000..a8cafcb9a1bc9fafbc429093084aa2e5b37103b6 GIT binary patch literal 244 zcmVC_BI~?$baTUM>r&7#gjkN^eHIi#o0SqI#KDxPp zw@9vyR-*q#A1*f^_CI2jYYrM;0TvR|rdBA|{&P?5Vul}=KM*D;@QW`DQsz%=+`fM~ u3QS{w?+kN@RWQ}B0CTJ}SKVj!J=PhX&@(3LQ}*Qm0000>$j+3?x7IEPn{3BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%xd!-zxLTAQhakJ^Q+73{+?&sPG@tVTk}cBH8-FbMA2gTIwZ$R1rnqZ!{LQN5dZW*_A98)a hcb&}1B^+S+>+nau>-9y|=gz9{lr;}c=wVN)Q*o7; z#1rt#{)*L{NuLvUInMbWz@F$~q+t2X*32`7HA0n}1B^+RR-Z*1Eqt_euNB=!4?3hCYmYkCBcssH5 zPdnEk2K$~yJ;tQ}=`B*K3`ckaI0gPP&VH(3X7A9z$Z+9+&@?^iN_(Jb44$rjF6*2U FngA=BGHCz+ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/more.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/more.png new file mode 100755 index 0000000000000000000000000000000000000000..94922a2c86cb6b1cd2a7085e055073226ad591ed GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar-fh6Atj!H2mNcuy5Mr z$>!hq!(QaR^6>_B54Jn1#~Jije3o~(=`7H5>`;cz1${9F%W##sAI~(r1scHM>FVdQ I&MBb@08~pNrT_o{ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/no.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/no.png new file mode 100755 index 0000000000000000000000000000000000000000..37a7c7497782dadcf14a765051a62dd5616200c5 GIT binary patch literal 922 zcmV;L17-Y)P)~H)FpGiVA+maa075~P;^Ost z%FF+My>{*Y{|_Jj|9|)H|Nl2{{{Mgd`v2FHC;#tBN%>zXAW)C22Oxl$VT=}a_4z4N zrW6=>dNQ#7{ma1c;R6H1`}YhCZ{IR7ym`aG`ujJ7l8z38nu>}8%kkq1$A10V2+{`- zKwtwZB_!%oy1NTx6%`p6K7NE?kmh&qz?vCezh+=~@q&Tj`Ev$7py4W#k_H^-&M_Qi zU^oa6K+Hft^Ls=_t}xct=3w~ph2g@XLkuqj1Q@RF*ukL03^f1MD~7#5#lI~rfyxgu zaNW7Xz<&Nb!`D}@41jje0SF)#Adz5aXehvN>=*+B8yf?swKapfn;XM72M30|Sy>DW zKpQP*⪼M8hY&JO$LjiB8ETz{xN7UFbD`TFvI`^5R0b1z5^G~7O=A!85y{?ZDaUm zW(L+^Ic*v^d_e5S7cMYxwYD<+1#12S6ypJ6X$A&ofB<6R;@}Wqc=-|@XtF@Rz6ILy z4af&+glT^3?aiPM6a#4n;om^~pMgONAb^+{fF?40{tPhyif@4oL;}JJ3Jh;0B^mw# zW8x=}{|jLN13&;Vy?*uT0mILqkWdF|-uwSQgXPktaGPN+vD~wV;i$eo!w;Y)5C$0p zwDt}_05Ls!`0&8vU%%kCa{`?TcealY!&?szxFJjd0dNCeK=2WO00KL4xwZBE|LW@h z|4T~#eCJ-NHV0gBdfguHGz&s%LFGwFi05M|8lxzVE3}(QD5+KCD wpazO6V0O9-%njRjGcW*?E5jFL#Q*^Y0M({d4SP?a6aWAK07*qoM6N<$f&>VU5C8xG literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/ok.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/ok.png new file mode 100755 index 0000000000000000000000000000000000000000..5b0f6a6174f67879d89b8c970d88734cd6f9f844 GIT binary patch literal 883 zcmV-(1C0EMP)wF51aIxG|t0o~WeTux?(*f!J?S`!vJrWM3^ z)v?u>(g^>@;xO#mkNlu=e*%b!BkO=S9U%&s|{QUTj4;ur+Qxv`b{1=&{q{_{@=tdkKKPJjPv{N-R+ z=H{q0b!wOgrI|?`QkZ(!{_7i9LV-VtRJx`%DQ2F^23wD{DqBhIRk` zF);r5{m+$GoMl&Put7+Jt2=`@4-Z4{!AlI=w!d7({+qd+0V(7F0suh(zW)OTFd63V z^!sFSNlF9<4gMd;*WzU&Dh*+FS2`3*A~OK^{__Bz$W0R(*Uum z?9l=80a*nF0_+3*1ONs71^@>82>=H93IGBCK>)u00}wAF|NZm@`|<(rTQ4UU0WcOM z00aL60Pp?k0KeVV0IsF+;Q#FbO$G-6;062!00#UB00{XE00{OE015OE00M|vNJE=} z^$*A6FQ5Ne@vDAS;$dfD`1Jo3!|5mY7`86`{^s{nmH;M>-&g)K|ATm%5g73x%=8b8 z0Ro7L;}<&v=RdZejL-PCo<9Aa;W^_ShKsN6GwfXY>&vg(Trted45#rWFn|DJV*bm{ z0Ky#q*cZJ%!~O8Y?dJ?fS26$kepw(JsCg%$6bcYP%o1uwz$j&AU}9wa&h(8#?9FW+ ziyzl{>lm2-O#9FFhv6UdZ-)OYzzhWT0wab200G2EX?6w(FaS`kAv2YZ@FM^K002ov JPDHLkV1n^7jC=q9 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/pencil.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/pencil.png new file mode 100755 index 0000000000000000000000000000000000000000..5b8cc893d0e50c0e15cf10fbbb08706f81ec224a GIT binary patch literal 713 zcmV;)0yh1LP)R)!_m*FeI9eJ0Gxq#H zf0_XxfS9lv%LmkKB8}kx16siJFV!*nd7pOS69ERhSDg(18DcA(#PsQ(DfoWDDC{a=@>nto>xWzb;o zP$*;Aa%nq5TlT(fKhM4o2P*mk(g_ei5CcqsHvff2=RY9k`aMC~Kn&o76a{330bLQrJ&U26`M=Sy3)uqGxWf%F0d5QMO1 v>|l^)2n34pz-1YUGXNlf7%9!p009O71V-RMzjpE=00000NkvXXu0mjfxvf2L literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/print.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/print.png new file mode 100755 index 0000000000000000000000000000000000000000..fdf67a1e2771c1481d4fdf3c3bb219904cdde434 GIT binary patch literal 1057 zcmV++1m63JP)z1G?hxZ;&`ED+>cNGYingzZn1m zi0SLs4-79~-etIOVGqOe=l2>Z%BAk7f^KhW_13_pMU`pwSH#-O94%^)f& z3N-K^13&;VLHzfh;p^8g3^#9{H2wblqZrJ9KS1%{Kv(?!`4i~P{|ua*91=XdJgT6; z`St4;*p&bQ!~(?P!otFnEG?~V1q1{|M1_S}KY#tr@b%YUh9AFvGyDPKzd*%*zcVld z`Ugr`TiaZI_Ty@A>nW=<)yo#7xKlEh(vj1xwlt7#MgWzP$bT0%*uZWO;x9 z!fSwov9Uh~14Beagrk7ItviRhqIkg9=T8*)ge4C=e*XL?NDV*$F=Er`Vr(4mXr?g1 z)x}1@)Y^!FfsqM{nHgR`f5y<=G55mJn=cZMojrRIAb>Coh_o}9pPyizU~Z|yz`(=; z#6U+fLTM=f>$l$wi{@|tuwv(>V1NKZ@j|4%et%nvY=(}S5Cg-n4-5>yKLTkW{__dQ z{tTo)gT>g`J~N1_^Ko3f_)G{OfLLIf9gU6cqmAAaD6jz)zkJHTz{3~O8o!7fdBvhJL&&7 zEzS8KWN)@fPg66=+sNqB{}Vy~Up;L5Ul8klLse1H6FK$(0tk$}jE(!hOym0h|8~m% zDNRwIbd{B3fWmAbIX`3L{U`QU{to~eC?zhgj2`F!0R%=(K`Q6}?=tznbY|Lr4LLb~ zWE+4{s&A&Qo(5!cV$%x{Kwva8UiSa1o0b3Vw6&)alRA+BKmf4-{V&fa#mul`<-^an zUcH*g01htV0YCr&lNW=6vZVpTfxUMQymyyFg$$D!0_P3$1SAV4gvrH q1Tx^k^5vIKzWDHAF9R6>Aiw}@kj85RTB}e10000VP)p|3y6O+Fnsy(*G|dGwA8_{sE@0VD?kY)l*s511}8@N@DpuwT|nH_3V>hx1ODQ%gn&~@8_@IOt#8aVhL_V%$IK8 zWk{S+eg652N7)Q)9AE25ELv$HybnO!M{I#uKD}#=M;vYf7lrQFmo`l@cj9I@ZL*+0D=T!0-G4a z_us4x|CxR%P+4O z%=m19E(1m6KcMkUz;yA2;myD24DM`^3=_Jyz22~IyVL&*H?9B#5X1$4SsA{6|NY{@ z(^>zp*f|F>^Eg`1=E%Jp>r!82Fy*Fx0GG_T{`ts%Hw-;|-9sl#=*HT~_cnLQ6 zZwyY1jNAqP|1re_1K>S4TZ6MV5dUL@_zCI)fB*vkslXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32dEcNn4H`bJ0C+qr9t=q z3IB5(AiS{sSlm!hKmUK){R9C#j!Zc}`+sBs9tE)p5$}U$;ZzVK5OzQCHlA<@UGIO! zvj@U9`H!I>IKl6{$7vAD0_aTr_h<@&41C_Zzj3U$sW?P)s`^}rT?-9$gz_!>OcE=Nf062l+NnAOE%LIKMeUciG zG5@4$#o>#0(^REaszX( z@Br;Y1jl>uI&DD}m2Idxq%!Gwkr0;PT_BnCf*VQmb@KBW^WVSl?z4#ixOz4Ke!ssk zy+~qx3HN1Lmf_*JwldghDRx~#Huv5AzuyA9NNmE;P!yvrh(>!r*9CAQI{gJZ77+*H z@%Rxtk;~ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/icons/undo.png b/testapps/GHIssues/src/main/resources/asset/themes/icons/undo.png new file mode 100755 index 0000000000000000000000000000000000000000..6129fa0c77eb1d2100ed1c99b5643ab8990a9566 GIT binary patch literal 707 zcmV;!0zCbRP)gx00G1Zv_aomR`x(qRh0l2FE0bbpFa!?fB$08 zkFQ)|s9L!2z&&2xfMaLReuNnS5I{^UzkfRf$Hoe9fp{-pGBCV;4WVDWU|@Lm41ym& zW{~CPX6X0xb5MHuav8D<00M~l)~8P=@1HyOnT?gzU0Y6$f#K#&28Oq985rKZgBbSe z6~w?NPZ+p>wDzArsy8?}Ki_-*{y4}0fB<3!5w|~mI{y0k^X(5GJqk7R^5S3xY54Gg z;V@9{y|_37pRO(g>+jzT438c$h_JFUeEIar>Y2FstQW6ee+LL4W|&hReEj(I13UYi znbkhd^K)@A%v-naX4mP{i91)X{{CA+!pI;bgn{AeRR)QlKiRi``0yC0=M+Ey zVT~0JdHJSom6iV+{r%6t#LV>djcY9}FMXXe=l_3O+y7ZoQhPw+00D#(*(oWx*+@tv zp{LLZetz%&x3v79qNw;ED8va6Kn$b;P{O)4dGi0A+S>nhH8gAh0*IMZ1Ma+ke^KiH z{{%~Qb%Axyo~;K6ASMPf!11eBC%hFCV_^OEO$;D_$THxanAm~S7cMXefB&up5J1f2 p81VS{^OpjgoMw-I|K0`=U;x^&`B18C?@a&z002ovPDHLkV1f|(PF(;1 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/accordion.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/accordion.css new file mode 100644 index 000000000..5f104a441 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #dfdfdf; +} +.accordion .accordion-header { + background: #fafafa; + filter: none; +} +.accordion .accordion-header-selected { + background: #eee; +} +.accordion .accordion-header-selected .panel-title { + color: #39c; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #fafafa; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #dfdfdf; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #fafafa; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #dfdfdf; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #fafafa; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #dfdfdf; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/calendar.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/calendar.css new file mode 100644 index 000000000..194f6f65f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-body th, +.calendar-menu-month { + color: #8d8d8d; +} +.calendar-day { + color: #404040; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #dfdfdf; +} +.calendar { + border-color: #dfdfdf; +} +.calendar-header { + background: #fafafa; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eee; + color: #404040; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #eee; + color: #39c; + border: 1px solid #39c; + padding: 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/checkbox.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/checkbox.css new file mode 100644 index 000000000..8cd106b60 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #39c; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.checkbox-checked { + border: 0; + background: #39c; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/combo.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/combo.css new file mode 100644 index 000000000..cbe460bfa --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #fafafa; +} +.combo-arrow-hover { + background-color: #eee; +} +.combo-arrow:hover { + background-color: #eee; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/combobox.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/combobox.css new file mode 100644 index 000000000..bacfda06a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eee; + color: #404040; +} +.combobox-item-selected { + background-color: #eee; + color: #39c; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/datagrid.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/datagrid.css new file mode 100644 index 000000000..5f73ebe79 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/datagrid.css @@ -0,0 +1,285 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #dfdfdf; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fff; +} +.datagrid-cell-rownumber { + color: #404040; +} +.datagrid-resize-proxy { + background: #ccc; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #dfdfdf; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #dfdfdf; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #dfdfdf; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #404040; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eee; + color: #404040; + cursor: default; +} +.datagrid-row-selected { + background: #eee; + color: #39c; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/datalist.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/datalist.css new file mode 100644 index 000000000..308548293 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fff; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #dfdfdf; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #404040; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #dfdfdf; +} +.m-list li>a:hover { + background: #eee; + color: #404040; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/datebox.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/datebox.css new file mode 100644 index 000000000..392b779d3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #404040; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/dialog.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/dialog.css new file mode 100644 index 000000000..c962c42a9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; +} +.dialog-button { + border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/easyui.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/easyui.css new file mode 100644 index 000000000..420e8f55e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/easyui.css @@ -0,0 +1,3549 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #eee; + -moz-border-radius: 2px 2px 2px 2px; + -webkit-border-radius: 2px 2px 2px 2px; + border-radius: 2px 2px 2px 2px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #dfdfdf; +} +.panel-header { + background-color: #fafafa; +} +.panel-body { + background-color: #ffffff; + color: #404040; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #404040; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #dfdfdf; + overflow: hidden; + background: #fafafa; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #dfdfdf; +} +.accordion .accordion-header { + background: #fafafa; + filter: none; +} +.accordion .accordion-header-selected { + background: #eee; +} +.accordion .accordion-header-selected .panel-title { + color: #39c; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #fafafa; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #dfdfdf; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #fafafa; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #dfdfdf; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #fafafa; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #dfdfdf; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #dfdfdf; +} +.window { + background-color: #fafafa; +} +.window-proxy { + border: 1px dashed #dfdfdf; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #dfdfdf; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; +} +.dialog-button { + border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #404040; + background: #fafafa; + background-repeat: repeat-x; + border: 1px solid #dfdfdf; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.l-btn:hover { + background: #eee; + color: #404040; + border: 1px solid #ccc; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #ccc; + padding: 0; +} +.l-btn-plain:hover { + background: #eee; + color: #404040; + border: 1px solid #ccc; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #fafafa; + color: #404040; +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #39c; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #39c; +} +.textbox { + position: relative; + border: 1px solid #dfdfdf; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c6c6c6; + -moz-box-shadow: 0 0 3px 0 #dfdfdf; + -webkit-box-shadow: 0 0 3px 0 #dfdfdf; + box-shadow: 0 0 3px 0 #dfdfdf; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #fafafa; +} +.combo-arrow-hover { + background-color: #eee; +} +.combo-arrow:hover { + background-color: #eee; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eee; + color: #404040; +} +.combobox-item-selected { + background-color: #eee; + color: #39c; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #eee; + color: #404040; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #ccc; +} +.layout-split-north { + border-bottom: 5px solid #ffffff; +} +.layout-split-south { + border-top: 5px solid #ffffff; +} +.layout-split-east { + border-left: 5px solid #ffffff; +} +.layout-split-west { + border-right: 5px solid #ffffff; +} +.layout-expand { + background-color: #fafafa; +} +.layout-expand-over { + background-color: #fafafa; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 0 0; + -webkit-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 4px 4px; + -webkit-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #fafafa url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #fafafa url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eee; + color: #404040; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #404040; +} +.tabs li a.tabs-inner { + color: #404040; + background-color: #fafafa; +} +.tabs-header, +.tabs-tool { + background-color: #fafafa; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #dfdfdf; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eee; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #eee; + color: #39c; + filter: none; + border-color: #dfdfdf; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #dfdfdf; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fff; +} +.datagrid-cell-rownumber { + color: #404040; +} +.datagrid-resize-proxy { + background: #ccc; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #dfdfdf; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #dfdfdf; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #dfdfdf; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #404040; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eee; + color: #404040; + cursor: default; +} +.datagrid-row-selected { + background: #eee; + color: #39c; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #dfdfdf; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #fafafa; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #dfdfdf; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #fafafa; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fff; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #dfdfdf; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #404040; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #dfdfdf; +} +.m-list li>a:hover { + background: #eee; + color: #404040; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #dfdfdf; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-body th, +.calendar-menu-month { + color: #8d8d8d; +} +.calendar-day { + color: #404040; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #dfdfdf; +} +.calendar { + border-color: #dfdfdf; +} +.calendar-header { + background: #fafafa; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eee; + color: #404040; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #eee; + color: #39c; + border: 1px solid #39c; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #404040; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #fafafa; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #404040; + outline-style: none; + background-color: #fafafa; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eee; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eee; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #fafafa; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #fafafa; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #fafafa; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.progressbar { + border-color: #dfdfdf; +} +.progressbar-text { + color: #404040; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #eee; + color: #39c; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #fafafa; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 4px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #dfdfdf; + background: #fafafa; +} +.slider-rule span { + border-color: #dfdfdf; +} +.slider-rulelabel span { + color: #404040; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #dfdfdf; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #fff; + border-color: #eee; + color: #404040; +} +.menu-content { + background: #ffffff; +} +.menu-item { + border-color: transparent; + _border-color: #fff; +} +.menu-active { + border-color: #ccc; + color: #404040; + background: #eee; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #404040; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #eee; + color: #404040; + border: 1px solid #ccc; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #ccc; + background-color: #eee; + color: #404040; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #dfdfdf; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #dfdfdf; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #404040; + border-color: #dfdfdf; +} +.tree-node-hover { + background: #eee; + color: #404040; +} +.tree-node-selected { + background: #eee; + color: #39c; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff; + color: #404040; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #dfdfdf; + color: #404040; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #dfdfdf; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #dfdfdf; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #dfdfdf; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #dfdfdf; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #dfdfdf; + border: 1px solid #dfdfdf; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-on { + background: #eee; + color: #39c; +} +.switchbutton-off { + background-color: #ffffff; + color: #404040; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #404040; + border: 1px solid #dfdfdf; + -moz-box-shadow: 0 0 3px 0 #dfdfdf; + -webkit-box-shadow: 0 0 3px 0 #dfdfdf; + box-shadow: 0 0 3px 0 #dfdfdf; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #39c; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #39c; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #39c; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.checkbox-checked { + border: 0; + background: #39c; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #404040; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #404040; +} +.sidemenu .accordion-header:hover { + background: #eee; + color: #404040; +} +.sidemenu .tree-node-hover { + background: #eee; + color: #404040; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #39c; + color: #39c; + background: #eee; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} +.textbox { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent; +} +.textbox-focused { + border-color: #39c; + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent; + -moz-box-shadow: 0 0 3px 0 transparent; + -webkit-box-shadow: 0 0 3px 0 transparent; + box-shadow: 0 0 3px 0 transparent; +} +.textbox .textbox-button { + background-color: transparent; +} +.textbox .textbox-button-left, +.textbox .textbox-button-right, +.textbox .textbox-button-top, +.textbox .textbox-button-bottom { + border-color: transparent; +} +.combo-arrow, +.combo-arrow:hover, +.spinner-arrow-up, +.spinner-arrow-up:hover, +.spinner-arrow-down, +.spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom { + background-color: transparent; +} +.datagrid-header .datagrid-cell, +.datagrid-cell-group { + color: #a6a6a6; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; +} +.datagrid-row-alt .datagrid-td-rownumber { + background-color: #fafafa; +} +.datagrid-row-over .datagrid-td-rownumber { + background-color: #eee; +} +.datagrid-row-selected .datagrid-td-rownumber { + background-color: #eee; +} +.datagrid-row-selected .datagrid-cell-rownumber { + color: #39c; +} +.datagrid-filter-row .textbox, +.datagrid-editable .textbox { + border: 1px solid #dfdfdf; +} +.tree-node { + border-left: 2px solid transparent; +} +.tree-node-selected { + border-left: 2px solid #39c; +} +.calendar-header, +.calendar-body th { + background: transparent; +} +.calendar-selected { + background: #39c; + color: #fff; + border-color: transparent; +} +.calendar-selected.calendar-saturday { + background: #00ee00; +} +.calendar-selected.calendar-sunday { + background: #CC2222; +} +.tabs-header, +.tabs-tool { + padding-top: 0; +} +.tabs li { + margin-bottom: 0; +} +.tabs li a.tabs-inner, +.tabs li a:hover.tabs-inner { + color: #404040; + background: transparent; + border-color: transparent; + border-left-width: 0; + border-right-width: 0; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tabs li.tabs-selected a.tabs-inner { + background: transparent; + border-color: transparent; + color: #39c; + border-bottom: 2px solid #39c; + border-radius: 0; + font-weight: normal; +} +.tabs-header-bottom .tabs li a.tabs-inner { + border-top: 2px solid transparent; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 2px solid #39c; + border-bottom: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + border-right: 2px solid transparent; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 2px solid #39c; + border-top-color: transparent; + border-bottom-color: transparent; +} +.tabs-header-right .tabs li a.tabs-inner { + border-left: 2px solid transparent; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 2px solid #39c; + border-top-color: transparent; + border-bottom-color: transparent; +} +.l-btn-selected, +.l-btn-selected:hover { + color: #fff; +} +.slider-handle { + background: #39c; + -moz-border-radius: 50% 50% 50% 50%; + -webkit-border-radius: 50% 50% 50% 50%; + border-radius: 50% 50% 50% 50%; +} +.menu-shadow, +.combo-p { + -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + filter: none; +} +.menu { + padding: 3px 0; + border: 0; +} +.menu-icon { + left: 4px; +} +.menu-active { + border-color: transparent; + color: #39c; + background: #eee; + border-radius: 0; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #404040; +} +.window { + background-color: #fff; +} +.window-proxy { + border-color: #ccc; +} +.window-shadow { + -moz-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + -webkit-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + filter: none; +} +.window-mask { + background: #000; +} +.sidemenu .tree-node-selected { + border-right: 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/filebox.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/Thumbs.db b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/Thumbs.db new file mode 100755 index 0000000000000000000000000000000000000000..5f257a2a49959543d36e2641d352572547e40e63 GIT binary patch literal 35328 zcmeI52|QI>`}ns^Wu7Hd10{saWN1RTQWRxO2$?d=bTp}qsi+Xi6q1?D^PJ3N4ozl9 zhLhp=KfB?*b>Dm6Pw&0&@Avz6-xlAqj&s&p&t7}4^{i*D{p_W=iS}i5`lcb|H$e^| zMDS}H5R$JxCxG`T9|H}7tb;d10Df(4?bC+{0&jnYALtCM!m+N0i%0+YS`tHyUUO1l z0|1v9Ap^((3V;%z0;mC6U=u(GFaX;DMt})m1~vjL04u-^umS7<2fztz2DSiOfo%X6 zumji)NCG^-PJkES1NebmfB+x}2m!)?3?KrC0%CwTAOT1LXxo&Acn=`^`ENOh<$=Ax zK43p^06^3Jw*?Kv7JeMzS|}hk5Zfc?;Y@sgU_yxh(dW_j@~=X(mahm#t)74o679A9 zloGwxej=KSX5U*@DtZtQ4j@KQYa_%8&Vt#ekN&M!8qk9Ou6(rb_@W&R0@{B6 zNJd~Ad{6&J+YfpUzx02!yf6J9)gh=3_|pGTJ%Q?g zKkEMn;X5?HBE(9-AwU^W0aSrs05#w+pbnsEk3y^gXadK8*a7x{1KYG71WEGIDZCDmofUDq1RXavCNYT6zXXMn(#1=8a4Y8|fGr8PGxq z2q6y<@djez4GfgzlnnoNSSv+n*TcATijZI{vW}L3kd|Pr5*60Rd6M2{L$d&2h!5iK#@mfibE=#LtaZna|&z7QO}e%t=^GDeM- z87`62_7^vhF)?ps*~Gnl2hUDkQ894|Nh#?A2Ne{R4k@c>9y_k3ed45!v5Dy!Gjofx z4vtRFF0SX@E?vIjbM@MF-h%hDTn#e)IO-=oohP{oMS*BJRTyS}y{G@Kd$^QM2FFix%p&j);hm zh!m|C!8#X!kd}ye%We|7eMd=+?C7@&Us%tuKR7zQY{NDYjTy$%_AO*gT%tqVShQ*% zYxaE=yZEPS_K%AFTCX02f{*|%9w99Zz^e>Tu}-0Pc686Px|>haoL0}Wrl`q#`$#UE zb7e=5;G*anvOLO1H?8b5@aAAq_$vSI_sVtL1rb3yeiNH8D+`>94VWv4Bj-$%c}ZW} z8ZsRlgQuTlUJk>o&V@9sUQ%B}A}jD8Y-eKrCdn~t-Cx@HKVllN)L7uJQ=dU~-p8K6 zV>ckrUr%rvG>IW-7$?vUj-WMc;4cTz97ga?0KT*MsBJ#!P;?wX4wg*(Q9h$@a-h~0 z;Xm|8*$<*Wgb=!)`s1Ts{PFdN_!@GVwL-s8K8|pVe}weIam%7jw$wX%=7e8w+Y{f$ zvA?ChXr=I0`i$`IvUf^S6!^i#m}Sg>w}iEr`=0SbHb!{?5AQJ@+*8A=sPz6}v2_P) zC3WI}Sm+v(elMcTf25($8GrYo_nv*jo*Olf{8p#dY3;BeVt-0=qpL(OaQ!gW9u{$b% z;O@)C@i1h8Rc-6@>Q+{B>zEVK3IQZ#_q&(2_z1BLdnCKzcR z!iJK})kpZIh2*H2;CD*#=?S;q3EYT!t6664Fs#V5q$6`~cV+(N;E+RI#m|E72U(qy zzE!=R^p<`QO-g%t8>X8u?J7(4vz3x~p47NWQNKN`hpeM>0#09H5@jVNBO#rA=q>*{ z+67ez|2llJ9|~b;{SoX3Flv7G|F8N#YB&Ft@Mq>nfv==m>qsU(gsC*cDKCV}Q znfzVzA9Ri28JYG`F@mJ-OKmq7n?R)Eg1k#p#uK$m0KPqKs zVRJTLa*J%`tjVq(ryIcrFi zYsvHl&6fX(&lQ|ZZ9?0G%VK6 zt5x{pVhF=gg>PV_e7oYNjvvABhD8^yAwkM(NT2QNy~I%~Zu{_11^74 zm=Dv;s|!5q&hm2R^sXUIaCy^}zAF9KGx2K~zGG7)+4r=}>v;AOT$MRO`lp7zkKOjm z_*eSV{{13quE|5t(HtHEvz9$h)vJg1((hn zeH9L@3c~!?Tmp~z2fbDB=uMKiW~f>0$ao}tX-C*sN>V`3uB)V#u z-t1Afu_}9(qmgH7I-M!i1Lp7C^nc3ywft!Qp8f;#w?Bw>7nr}#mNz@k+C^A3H7uR> zUD9bgl$oC8)5B`s$#c|rU)s3`r!c%cgnv#4eChu;U_Ad3>|a)d;HUljmHqo8+dr!B zSKmFxZ_xGM z$j~*!to>9@AeMw{dEb#|?vZYn#*eNc<(?1M5C>SoExws%Op`?FVFZWb$zbC&_{2FKP?`7HP#WJ z_h->|@V)g9gtRw5%m3fLf5-LH{`h=f^2gWTr1<9?mu4U4%Vz}5@}#=-X1>Kg36Rf> z+NWSRtHAi`ePqoRS%#x0*#Fh^`iuT*g8uj;*w34h&3`NV`2y$y)W6^o#Fv39fDdpL zxCUGYd;vee9|!=@^g$5c0D^&=z%Af55CVh(cYwP9nl=pLa3BJ>4@3e{zylx}cnHJ* zXxcc4Wg;3& zk#YmU)?#J_!K)q)(fhJi!0hqrYJ?VK;l zx3&%baEGhs?c2oyOZU~zk|wMahR|HZtJ!5!++@|lJ?vK~9F<700k7;g4MHd)jKWnp3XapGuJSX$^Xo(a81-S-r`AaXGtO zA{!-B3lFoA6!nGR_PJehHT$x|YqXiBja}U14?kWiFw)v-aveG0yV-iy%%<;FHtlgt zU~vlZ;RVczlEsqnHAH0%sXLD;#8|Alz3?-T*UTAsJG;7aXAQ~CD|zbPTrREK|n1{*&dx3lbbZjR#f!hW6l3Z2zUa04 zU`{VadyhKFXg;P&UtXnsUTrI-;mMLfz7%ckyk@FoUY0F_c^9L%s0Qt#p-Fmx2xW6t zS`!||X(wQ8Tumo-iTO!R#rsUvRMaTvWk;?bzQITG;l93^etm`I&dokVzHbWYu?#C5 zZPOmRhQ;%m=fmwRZS5#@$}PHRvo>s<=UE=X2niX@rjeE2u#hntsgn~O(6f*hdzIfA zhp}9ZO0cj@Bp+q;CugzpCnid`w=Lv2Tc{*UwC1C9=8`Fm*-WkF$yCS3*9&C>vYm9_ z=esPINI3tVuL`Piej6y@15iUq1K6WK!uY=)A^%&A|Nq7Me_6wjz=DG`SQJCkk9)6O zeD{N!?CU%JVi%VxP6cl`>YT_}?|t%phPZ;o?T1`-M9ItijY&b-gDYydfEfM8_i|AW zU5l}kyH@EWo(gVzd5Zb81Y6pnvh{Hc1mCyx_OUB`Y5zVyNc(5{Ie+`x%-?=lKJ+k6 zKFhO;fuQk2)9MJ^PX1R@wco1lZ`$wA`yW51|M2er!1@y-v;-yqrYRq%6~Eh1zWVSU zy#M0=BK#kaPY&hL0^ch?7Si^CzD0w`e?UGnl(P}|UioQ|)|CWaAc+14aDna zjEz-E`e!?xXNw+BQ}~GACOPu%07anW*8HWR;vHiPOqs5_>XEbSZBxaP4_I5x5^(i$ zX?Z5MPqIZg#^(|$;TZ>Dfk-}o5l=l`f}7v5!q+H>$2d)|a1LUyW21HP^m_BWvlG?9 z^(&IXN|sM_iW(cAX@zCY?C)}+mhs!zvwzzD#K?|Bv92!aneh{CQ)0FoEz$=}AHt*;iw;g~10{_OLhD zY%bU`-cFYHGU%GK8{=C)(dBWA;H%f26q%0(ynHiST0cLucQi7j+QSPgkms~LSpJd~ zH!VErVO2zjR9!2SaqG^dOiCrt0kKRKP)Y^|W0Y_Tgf*^R@-_%^hIFvfbny z7S~8y5!(IXxVtCkuxv}E0TY(cJ)C9lN^NTUNaw74(nH(U+)@8bd!dK;ZmVT3w_y`W&Di1uYk;!VQR{7@_vKy z^8Ch@wlkTX0tQ1Vrl$rDrWM}1vD4(m@w*q<4^>OeV!E%0O;eoZ*e16-GfF8la)6#( zKREA|md(10x{}5{MM{+e!fn~I2P!(XnBJ@C8n!m|aOq#Lb7wjy9VxuWDfQWVe+nVV z`loIhn*Pof@%LNZQ$$~^itMb?s(v}zmCB(kIu*HCR3i8+!c``S9oJKLgGB!q!w2{| zZQ5j?rSpEmtH-*o)-3N?Ig0J7Ox-9NDcmWuCwd=mohiwECwlMH`^i}mg7tYdhIie% zdZpKpi*vSgdP)wMGX`U#yHlRg6$)Q|?mQh3a;-`7xrm;Ux9!B7ASF>~jc!gsL8NNl zaFj}M*g<};L*37;PQ)6~OUXM97aBN^7ii1Q(NT+&6uZp|9< zMLZv_a@E9p4Vmbe*BjWJbt~5G(HioUdvOh6Nzy#4H9Mz&1k*>gyoUI<8pOyQy0d`6 zMGdL5xyrc=fWv<-)&@Vo{?`bcl+ou~kHfrFySq?Lv}$Mt0>_i-TXrpB}JBe~v#tpFjQG z2W$U_{AcNL3!*3$ius<^(Lc9wRm3jD&4 zOdX9b#&SHksL1!;zPzgvlU6fH?-Vzh-Z$uKsL|MX|3(9)Rw?b>Tb)zAk_NNeJ7hAf z%To+Z+Avg24Y{@RX_A7e)p645i;4PzZ&Zg>m+Q{nITkk1waWXj*e!e^B)mpi!6$l% z#j&4!e|yZJ>Em&KuBQbo)u%GGHArJr-Z`ugIlT|!^w?iAGf{g7&yUqgPkL6+xlxS3 zcq2=-N^cS|8=L1yjaT;D$MuX@yM~!#uXQq)g|yvloqLo8QVIm(>B^-=Id;&C9VUMq zHSh8&TkhGzV%{0j>Ol^Ruq$0J1g6E>voF}hwumK%JbgdRb#Y7Hi&VA*$jtcT`Iz@2N3Cs|T#2q+n1tZvj&ZIWQWcW86aQG<)gXXk}NP7i6_&wDuO=_(Q9EMC^E&Z|xDOjH?^o z{FKWq=q?rCkZXx>^{Gc~ahC!<^oLIb#nz5ii^&#E3{Tyk=*Umqv(SZ=Bc6G4$u8A3 zWv(|qt7STJdBUyZ{;))dnTOZwO4YzEd2=uM6LRl9@H~EgW~3sF`6B;mtZ1DBm7kT% zSeM4eFfkUcDbg)UrH5&&;%rvufRr?X@1YHh5C!k(J(3 z)t+HR$$LU3bnIrg=pFZNt}K_yq9!}+^yLTG!Anj7>xQ*22u}7eM#`6v&nq*p#+`aB zTbdf^wG9_DjHwc&d*LD4lI1r@F+R0pq;d94!+X!UY)=zo4DA8+NJjdXfn3@i^za0N&p;ez# zy(3OSn5o~st*?sTFY?|of6fPwsW*CX<1EaESyS09rAeYV;t0d*oHjIApLF&%?Y6<7MUruH4Plib9hTKlm8ZvXr%+#?ICZmCba|9D85C^{T z)@|h}Jwk#!E+N55D9c|KHw!hzsNkf0i%#ACON6^Hh>9W1~vjLz$SndU<23z4gmHy zK{f+hfUN*3XE(&$z;<8AfNy!0!qLkKp9X0(0so@tOgtg)PW;VVB z5pV*W0T;j(I1ji1?tlm233ve*z#I54zW=|fnYs-dG-))GS?aa5xOqN`u7M-Yct?l> z`;(CK&cVvwDlA*Bw4I~K(|cuNLRPk#T4F(t>0TZh31^A6WgNSP9c_`LzVX0gQJ|

                                                        NA+ZcC>&vv>@9CR4VtY9M(_F}@-1%;|KR!4iA9GaQ>eBDX}J`#J5%ao~~20i!d=uaWnN2JTaCZc`4~#{=ltA0#Q#aZrz(q zm2=*?xv736TAM|Kl=3M&Bw@D{zAUxk)aE6-BAe5h;+@@bY7J3ppPMZ$$}S~5x2U-o zQjkbmI-tbu1yQUt@EkZA~%UI zDZD8leyDP5!{b&)XQ9#uFDH9gW$d3%xV`jLCJ9x3F0V2d)ngzpp)j-GseibEU`g3< zw}%EUZ+MWvwLm-Q7ya#T)zZw{CR~~&&pg|?W$Qs3suK&ceD9y{sA%;Opo@4M*1u@g znZR5@5PCE*P%q8zm0o(U;?z=6wp(T+e$R@;(;1Fz%BlMdZ+|I1y-SO}lFDmEUy{9g z52kCkf!%6wO6Kj{)_KL<5&Jc^my)u))<)PCMw=Fy$?)Oz3))h2DG<`)a!XVo!GVvb4v6F8sz76QAYsC7a~r9%a{jt!y*OGU7Jj4X z(9=811A`MM28COelk{3Li>H^EEZF?%V6sKoc z$$2S~5*L?H6m`8&-ZV+E;%exYBK1c$50<-9BTR0;Hwh2-4~cS$#zjhB7Gc|3)?u?# z&ZKj+rzassXEGtN$?Lg}?F&4$>rRysInFfp-D?OxUHC&B{m>dxs=L$niP(v`Yb@-P zoq0*t3R+w4@;I-TB788Zcf4sLbJ&xk)O>&zS2P?&?P|MOAo9$~Fd{Z0Uo*|Ef@xM{ zK@}xwS1TG+=i65f^#u9PTfI&dD@b^1@AX*CjbWzaxPi4`=Ae=-PNp|hD%!Rs_`jbA(=v(l-y%-aTAId{wnS->smC-as|g_-m8iYF5Wyx}LxR_Nz03 zJ?v~@?>WPddrf`XS5W|Vo3i=5x1umuDMSF$-N7s%gzirD^}bX_A9t!U`(~G^y^xp~ z%@HN4w`L zny3<+N2lRPO+d<*T_O!(w?1?yEk}@szW#G=QOLa>Kq6_qS0#U&8{LP?7LMHEo0`f% z@(pO7XL?R?;%FZ0kL5c-`Jc`zT1z9SpFQMu`6jP8WFtfK9w)rU4`=D?yy!6+LH(?t zG?Q=64SF?D--$2h_Ul}~e>Tyxg3j2G6`#s>v2W$r!x=JztAL)5-#^NOkdYG2Z9uk( z?>9$@o=b<1dCx#O=&_!IdZJg>@tb4b57|+F2ZUtM_K(XjgSrtTfN6-J)Z3)eZ`dJ_?D@j?u)DxiX`^)@Q4ea?JVf~s0q4|0L z^zU*1bg5v3BzuJV${^j!zG2H0L)|tC7H}k)t#&+yc6{dHq`^nGF=%S6suv5)R&xZ=w;qF ztRy%*-py=vj%lM2(fM+db0=P3dw!UTZ#v!8DnC^7a6GT&IGwNEkuFt>rrt)k?p^A) zq77Lzg(7$qmKg>`Lc<0P4Dg26zaC%E9`}dgH1ux6kDB6>?)h5t{MzS*AV2CMhMb7w zIIZ-l=YGohrT=dKLHaNGPyh43i~sFX>acn>;gG&YJ#kudw#Bq)vU@>8-C3CX*!;)R1mi=YZGeN)Y zn8q+x+d>~iN6KG!6GiPGbX5xJ3$K}0`MSUT)*AWJ|9%wz;mtq&-~TTCZ&iF*fie6| zlpA0Bf*JGfd)MWQ*O2>+4)qW7^PYWB|7}Z0oAW=1FYWi}4>ErI*8Y?F53E1KlH?ld zPL0O@e1`t{6Ioby)Q9th2BE*W13v73@KG)*8x5aI{nxLmAV2uC|M%|y1NmAY|H{Wn zExPYAIt%;r;m_3H8ssy5md^?9&p-E1{~`BJU!EQwoFt9)kh(dpl6ELNh;F~{Y_Ci? zt1e9i@1nzvgM0mHyhVe8v)4;;7|&Q5U|p)@uWzEho|1jv@_5TGv!}O?w-?s&XPq1o zpH*Vaj(akpnxmyHEWYqT>fE`QLfrJS01h+4@3P6C?ml_tRLrUzcRyvz@t%io_%CcH zLF}#`K`1X=dS#dycmeA$L|v64UnZS%$Jv9Kx9M#YgPL3v4eg#9F5wF~!q1c94);yH zcJN8fFC9t~v(L}0XoUGm-pL$!u#>IrRkC!-ga}TQSg^YJ7f0Mc zWVG5}Xq-maTAbB|XL4m-n43|^^;=0>N$Vzta$5=`h?|-q*+A*o{>izW!H0V z96$byUEPfPS&m>)OAbLwdhXSEY2oV2MD{m zjXKE_TQ2IzBpvXKlyV^V59HW(`;=$RYeN%!V^r2aIJUL?t$INqyGT_ip@i1%^w~Fu zTPtoJ9z4z!B3rvT>Kg#u0NO_$arONx5{BjEk#B4Vw--;$spzxt(mJU^fg2CQ5R+S*mHfowhnHb%I1^_ z-bCnMC*Hcgw)P;YR8>#9;~61{m>anf3# zA^mN03Q-4sg&1Y`_VA3``6^4|h1t2GxvT4NN5z>sfi>j2?2JFM(7)(!vL94`Ux2v)>QizF;>+l~1n>c_0@r}+fG^+& z_yYkzAP@xH0D^&=z%Af55CWj(-GTTna1RIr!hs0jJ`f2+0S|y^;2{tL!~$_ZJdgl9 z0uq5F04?(|#3{fNAQeah(t!*h6UYLx0W@tc#7}`dARj0I3IX)HpW)Xt@N@q6AH?@VW)C8=k4+SU=9=WROuEwe9?yh?+j!tCH!;nvoGyk6SNx`&#fe;3+=Qtugt+4b`@0Qz_DXN( zbSt*;Ue~g$RGJ=hodQDcHyZWt2@XC<4h>kg-E2d=mqNlw+k$aqFjMe)Hl^i)Jo6P zWKpwl9}%jhB02W*eWRuKGvlifreaBMa#6y&C3hZEE1Pb9iDy2$C{H9uXCb!{>(qIh zYi2bq$7ia1G)yX*<<#u70&Uv!^~4vd?L{t>;D<&iY_??EM`qPBsCS#r_FBdesxRMkWjb4=R=8e%s%v#*pY^*PKY z_DQTmYI6I$*k?LJhS;~WizudDQfnL97&y=`p46o%&%W{b(Tg49USSKuWkakgv4aiG z|IUE=W&ErJw~(Lnpa1>mzeN5I)*mmzINbcv4G7);;(verGZf_S`n>)r_J1Hh8RUQQ zzy2e;^56OV*U|j@*1x|l`@eYpySm$2OW$V6(p~wW^N|}Iu62EtPRIhwNZ`|P-`OT# zOcu3|7d>vIB9bV*#SAMLP`E#3S7-=PTB%HW0VP*!M$!~dnG*N4ZH%orPMwn;66B;5 z&uSb9JD*1RdC|>?Wxw~(>ME28i@GMWEuqfI!ZEI}G;Qi01J7pqr#T}10q!S$5oK4H z)UTyMx7hxk@ARgirxO}D!etGZEZ-^YbWCO!IWm*$n`L8@HM#G&sRDIc{-Mhk z8LO%HZ(wsU$d1Dmk0@Z-q^YuZ+*^prsh{yC7vdc2Z4a)M{g4_`Vj|exiMg`qGDusf z;A~ih=gF~n!aq_IVxHOXHm!E7n^!i?({*kz$Y6&WU&TV#vUfqYqdB$xa&^awI%8W< z+0g_ol}m*hE7mDdmUoA+4mb6dGt?RT20fUuGUG06H(k#x?O#~jY--H4S}jY!dF9+1 z!cnL@9L3}z64^B5Twt4k3)8*3FI1V9i)p#Ub(?^=&uCYU-E+S2eqE)EE-RCa_Fcw> z**A=aL+s-V4J$DjSAE#I^P7o!OvkpE8!4aIZZa^ z%gxm@t|BT?lOhHg>~}O$`wq?@m$}s(LD7+lcu7mh9>3qu#30y@g2gy5_;0X=(=+DcHH4GWx2uVjWWA#CQ5wk z7Ws8A`{Vat#=k8;%>0q_r~laB!+#9+-=MG5>AO?B_2%=PD!Sc|xM8D#2F=T~LwX+LnXo=$#qqL7p96d&*L^utqX+2&Q^p<&C7x`#Wv zBO~de_)V|f%r}f$A)KxvR19K79@>;Dg zDi{@-lSW#`N>aBq$Z?G~JjVI%;+5z(i^ngFkow#XWS$|N7kkN>_5A(=+?}#82DvR* zrl6sxLs*U|cgE^W410tFud3g*ko(?eEL|e3*xfiN&#ow7C%ei^=m#vq@ZpK-P7d4j zQaa-AJ2)_mDOYUR7I0z7Y+I4X8iE~bD2>XJ8DO|o>Fl-L+tqFCrK($CK z4Z+*%n?moJo@#h5CB=E6foGVa%XcK)SZMxT+uQsIi^CqlK@}#U1zeLwy>dmWYa_m*xmxZ$29_qb#ex1u@^RN`cQ?ne)AygWSYv;_kb1mvXMrSe8;Ik%|A+3|5 z3AbM-w3>4DMl9~8nUN?wwa7T+W?PfOtkgE~*jhBeZr8-izyTUZ-QoRPujobXc!DHJ zD^=~nR1RjTduOY!!)a@mwC|eC-k7cYB&*j?SJRS9_vViCjP@R{lsK+#!v(kxY6Y%%dYhXeg8nww^h5XRu4PXhrR`QT+2#)Av3em{YO-^d^B;cyG14#k z^QZsNkGcQgkG%gJ;jHYV6vK?8V7?t4nPtToFNkWD1WzisM!uNKqyD~G@UK3q=#vWQ zQ>+M;KY8|N@A6MRs;D>o8SsPuecx6A$bvroi7>hy@KOHOpB?qfJNJzbJ1Pa;uMy#i zpt*9Wo&fc6cYq%w@ZLk8oiP0Piaue0K1cDZM<4ox0lLTIALm1T_0K@QuXCZ#3!u9r z{&6llcmm{;=f4Hy{q}#7qfbPj`zro%ZkLbe#OC930^dHrfzB$?=aP}Q%W~g(AR56F T0gjLZeOBaa?|wA#e_!~27*z{8 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/accordion_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b6368d636e2ff36501ff9c6b14f7ce09997f3743 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel!K>>V@SoV?_1tQrr|vg#{&FxgXS!5MW?fq8aJ< T>6BX`&@2W|S3j3^P6h?7!oT zn93bYIb9!43Wj)WNz0M)xYl!8U>3_OjRiss3@1j_Zvlb#iD~jUnsR3em#t_3WtUHqj%c^0} zFSrhZpjU$)YHUS-lsMx)nN8pghWK6h!524#*oXjC@NjHF9H1y2K%G?c=lr%4eY%ue zT+7R9Pld<2<$C}OAU0HZIJPqD0RA&Sip042zF(tA4uaUhZ>jL`*HN0POocjDIidNRbTZ#@zvW7@I c5>Ct23v;ttA1D3-v;Y7A07*qoM6N<$f&+eyE&u=k literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/datebox_arrow.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/datebox_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135 GIT binary patch literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$f|L1?c z_O8;7?=$$OZE)N^=kf)!wu_8{hTkWuP3Lf!{Qqt%*U6B7qRbydZ`F0T{#^CG?%493 zHc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/loading.gif b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/menu_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/messager_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000_$JYFBpo`sqZyU339@ZwM6gi$;Pr>w&6M&T1N3Q$b?ahk3>@EL9`+1-BwzvH4 z=V<*uH!1ee(Sv*K$aVm^9zxbfZU9nZC#eDGVQ*&XXK(qpy{>x2j~_q0QX@ky?B2S$ z`TO_pb_Ho^lHPWf$3SXG3P5TF!a(UIB>)3m?2n~HhFtml`Lhm)4-7>2Cr_RTgV@`) zZDWrM_B#twLv#R=>k(}FC=EbL>?Sq<16=LCHdYi*!X*!q1F0DeKpY^*)!|!SNr;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/passwordbox_open.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..0f25d535e05b22b406fd72647611aace9cfa6249 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/searchbox_button.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/spinner_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b1773c24b20b30318e38c4b84690e3d0010c9c43 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4DgeBzU z{E=^QXHHmRmEiEUJ<_jB`NK-}t7{l}8A{FvOK}{T)p$BC>8|6-x-MIXOa{IRh5%#E x$&;(vVs#x>vb(K5c#%QkA)^788{=C>2L8QE5AM%P*8@KmF984m literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/tabs_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..4dbacce18ec1310d22dc4de8ff895f597b0d61eb GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2L1978H@B_~L*E^hdC;Kq#~ z_8gbJY-45o``Fp;2v4zS5!xHXwo~JmL(T+=yD|FVdQ&MBb@0IQ}mHUIzs literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/tagbox_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec64360884b3fdb81255ad6074bc08ed183232c GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoVtb9vwNkrdSr%AfUpK=5(o}_e|{SG6u6f5&Q g4t5*qz9vC-hN^}472i&@1{u%b>FVdQ&MBb@08Zm4@c;k- literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/tree_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/validatebox_warning.png b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/passwordbox.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/progressbar.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/progressbar.css new file mode 100644 index 000000000..1acc690b8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.progressbar { + border-color: #dfdfdf; +} +.progressbar-text { + color: #404040; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #eee; + color: #39c; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/propertygrid.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/propertygrid.css new file mode 100644 index 000000000..03e222b40 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #dfdfdf; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #fafafa; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #dfdfdf; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #fafafa; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/radiobutton.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/radiobutton.css new file mode 100644 index 000000000..8e439eeae --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #39c; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #39c; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/searchbox.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/searchbox.css new file mode 100644 index 000000000..fc3cb1043 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #fafafa; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/sidemenu.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/sidemenu.css new file mode 100644 index 000000000..3bcfe92d0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #404040; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #404040; +} +.sidemenu .accordion-header:hover { + background: #eee; + color: #404040; +} +.sidemenu .tree-node-hover { + background: #eee; + color: #404040; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #39c; + color: #39c; + background: #eee; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/slider.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/slider.css new file mode 100644 index 000000000..7e4a91c35 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 4px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #dfdfdf; + background: #fafafa; +} +.slider-rule span { + border-color: #dfdfdf; +} +.slider-rulelabel span { + color: #404040; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/spinner.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/spinner.css new file mode 100644 index 000000000..f81643cfe --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #fafafa; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #404040; + outline-style: none; + background-color: #fafafa; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eee; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eee; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #fafafa; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #fafafa; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #fafafa; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/splitbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/splitbutton.css new file mode 100644 index 000000000..2ad86f774 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/switchbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/switchbutton.css new file mode 100644 index 000000000..701657ab2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #dfdfdf; + border: 1px solid #dfdfdf; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-on { + background: #eee; + color: #39c; +} +.switchbutton-off { + background-color: #ffffff; + color: #404040; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #404040; + border: 1px solid #dfdfdf; + -moz-box-shadow: 0 0 3px 0 #dfdfdf; + -webkit-box-shadow: 0 0 3px 0 #dfdfdf; + box-shadow: 0 0 3px 0 #dfdfdf; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tabs.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tabs.css new file mode 100644 index 000000000..e438b0b05 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tabs.css @@ -0,0 +1,377 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 0 0; + -webkit-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 4px 4px; + -webkit-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #fafafa url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #fafafa url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eee; + color: #404040; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #404040; +} +.tabs li a.tabs-inner { + color: #404040; + background-color: #fafafa; +} +.tabs-header, +.tabs-tool { + background-color: #fafafa; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #dfdfdf; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eee; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #eee; + color: #39c; + filter: none; + border-color: #dfdfdf; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tagbox.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tagbox.css new file mode 100644 index 000000000..16ff41475 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #eee; + color: #404040; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/textbox.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/textbox.css new file mode 100644 index 000000000..60f5ce29a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #dfdfdf; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c6c6c6; + -moz-box-shadow: 0 0 3px 0 #dfdfdf; + -webkit-box-shadow: 0 0 3px 0 #dfdfdf; + box-shadow: 0 0 3px 0 #dfdfdf; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tooltip.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tooltip.css new file mode 100644 index 000000000..8f1055d64 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #dfdfdf; + color: #404040; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #dfdfdf; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #dfdfdf; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #dfdfdf; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #dfdfdf; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tree.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tree.css new file mode 100644 index 000000000..51d1ee069 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #dfdfdf; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #404040; + border-color: #dfdfdf; +} +.tree-node-hover { + background: #eee; + color: #404040; +} +.tree-node-selected { + background: #eee; + color: #39c; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/validatebox.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/validatebox.css new file mode 100644 index 000000000..5911752fe --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff; + color: #404040; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material-teal/window.css b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/window.css new file mode 100644 index 000000000..542f0710f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material-teal/window.css @@ -0,0 +1,182 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #dfdfdf; +} +.window { + background-color: #fafafa; +} +.window-proxy { + border: 1px dashed #dfdfdf; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #dfdfdf; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/accordion.css b/testapps/GHIssues/src/main/resources/asset/themes/material/accordion.css new file mode 100644 index 000000000..51d0c7010 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #ddd; +} +.accordion .accordion-header { + background: #f5f5f5; + filter: none; +} +.accordion .accordion-header-selected { + background: #00bbee; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #f5f5f5; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #ddd; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #f5f5f5; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #ddd; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #f5f5f5; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #ddd; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/calendar.css b/testapps/GHIssues/src/main/resources/asset/themes/material/calendar.css new file mode 100644 index 000000000..cd206276f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-body th, +.calendar-menu-month { + color: #8d8d8d; +} +.calendar-day { + color: #404040; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #ddd; +} +.calendar { + border-color: #ddd; +} +.calendar-header { + background: #f5f5f5; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eee; + color: #404040; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #00bbee; + color: #fff; + border: 1px solid #00bbee; + padding: 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/checkbox.css b/testapps/GHIssues/src/main/resources/asset/themes/material/checkbox.css new file mode 100644 index 000000000..5180d4305 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #00bbee; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.checkbox-checked { + border: 0; + background: #00bbee; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/combo.css b/testapps/GHIssues/src/main/resources/asset/themes/material/combo.css new file mode 100644 index 000000000..622d7c2db --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #f5f5f5; +} +.combo-arrow-hover { + background-color: #eee; +} +.combo-arrow:hover { + background-color: #eee; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/combobox.css b/testapps/GHIssues/src/main/resources/asset/themes/material/combobox.css new file mode 100644 index 000000000..619efd43e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eee; + color: #404040; +} +.combobox-item-selected { + background-color: #00bbee; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/datagrid.css b/testapps/GHIssues/src/main/resources/asset/themes/material/datagrid.css new file mode 100644 index 000000000..bbc719af3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/datagrid.css @@ -0,0 +1,285 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #ddd; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fafafa; +} +.datagrid-cell-rownumber { + color: #404040; +} +.datagrid-resize-proxy { + background: #ccc; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #ddd; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #eee; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ebebeb; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #404040; + border-collapse: separate; +} +.datagrid-row-alt { + background: #f9f9f9; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eee; + color: #404040; + cursor: default; +} +.datagrid-row-selected { + background: #00bbee; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/datalist.css b/testapps/GHIssues/src/main/resources/asset/themes/material/datalist.css new file mode 100644 index 000000000..27617f0b5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fafafa; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ebebeb; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #404040; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ebebeb; +} +.m-list li>a:hover { + background: #eee; + color: #404040; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/datebox.css b/testapps/GHIssues/src/main/resources/asset/themes/material/datebox.css new file mode 100644 index 000000000..392b779d3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #404040; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/dialog.css b/testapps/GHIssues/src/main/resources/asset/themes/material/dialog.css new file mode 100644 index 000000000..82a1bb881 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #ddd #ddd #eee #ddd; +} +.dialog-button { + border-color: #eee #ddd #ddd #ddd; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/easyui.css b/testapps/GHIssues/src/main/resources/asset/themes/material/easyui.css new file mode 100644 index 000000000..6bccaaee2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/easyui.css @@ -0,0 +1,3436 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #eee; + -moz-border-radius: 2px 2px 2px 2px; + -webkit-border-radius: 2px 2px 2px 2px; + border-radius: 2px 2px 2px 2px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #ddd; +} +.panel-header { + background-color: #f5f5f5; +} +.panel-body { + background-color: #ffffff; + color: #404040; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #000000; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #ddd; + overflow: hidden; + background: #fafafa; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #ddd; +} +.accordion .accordion-header { + background: #f5f5f5; + filter: none; +} +.accordion .accordion-header-selected { + background: #00bbee; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #f5f5f5; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #ddd; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #f5f5f5; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #ddd; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #f5f5f5; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #ddd; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.window-shadow { + background: #fafafa; + -moz-box-shadow: 2px 2px 3px #fafafa; + -webkit-box-shadow: 2px 2px 3px #fafafa; + box-shadow: 2px 2px 3px #fafafa; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #ddd; +} +.window { + background-color: #f5f5f5; +} +.window-proxy { + border: 1px dashed #ddd; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #ddd; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #ddd #ddd #eee #ddd; +} +.dialog-button { + border-color: #eee #ddd #ddd #ddd; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #404040; + background: #fafafa; + background-repeat: repeat-x; + border: 1px solid #d9d9d9; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.l-btn:hover { + background: #eee; + color: #404040; + border: 1px solid #ccc; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #ccc; + padding: 0; +} +.l-btn-plain:hover { + background: #eee; + color: #404040; + border: 1px solid #ccc; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #fafafa; + color: #404040; +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #00bbee; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #00bbee; +} +.textbox { + position: relative; + border: 1px solid #ddd; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c4c4c4; + -moz-box-shadow: 0 0 3px 0 #ddd; + -webkit-box-shadow: 0 0 3px 0 #ddd; + box-shadow: 0 0 3px 0 #ddd; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #f5f5f5; +} +.combo-arrow-hover { + background-color: #eee; +} +.combo-arrow:hover { + background-color: #eee; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eee; + color: #404040; +} +.combobox-item-selected { + background-color: #00bbee; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #eee; + color: #404040; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #ccc; +} +.layout-split-north { + border-bottom: 5px solid #ffffff; +} +.layout-split-south { + border-top: 5px solid #ffffff; +} +.layout-split-east { + border-left: 5px solid #ffffff; +} +.layout-split-west { + border-right: 5px solid #ffffff; +} +.layout-expand { + background-color: #f5f5f5; +} +.layout-expand-over { + background-color: #f5f5f5; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 0 0; + -webkit-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 4px 4px; + -webkit-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #f5f5f5 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #f5f5f5 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eee; + color: #404040; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #000000; +} +.tabs li a.tabs-inner { + color: #000000; + background-color: #f5f5f5; +} +.tabs-header, +.tabs-tool { + background-color: #f5f5f5; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #ddd; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eee; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #00bbee; + color: #fff; + filter: none; + border-color: #ddd; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #ddd; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fafafa; +} +.datagrid-cell-rownumber { + color: #404040; +} +.datagrid-resize-proxy { + background: #ccc; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #ddd; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #eee; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ebebeb; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #404040; + border-collapse: separate; +} +.datagrid-row-alt { + background: #f9f9f9; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eee; + color: #404040; + cursor: default; +} +.datagrid-row-selected { + background: #00bbee; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #eee; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #f5f5f5; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #eee; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #f5f5f5; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fafafa; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ebebeb; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #404040; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ebebeb; +} +.m-list li>a:hover { + background: #eee; + color: #404040; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #ddd; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-body th, +.calendar-menu-month { + color: #8d8d8d; +} +.calendar-day { + color: #404040; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #ddd; +} +.calendar { + border-color: #ddd; +} +.calendar-header { + background: #f5f5f5; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eee; + color: #404040; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #00bbee; + color: #fff; + border: 1px solid #00bbee; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #404040; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #f5f5f5; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #404040; + outline-style: none; + background-color: #f5f5f5; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eee; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eee; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #f5f5f5; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #f5f5f5; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #f5f5f5; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.progressbar { + border-color: #ddd; +} +.progressbar-text { + color: #404040; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #00bbee; + color: #fff; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #f5f5f5; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 4px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #ddd; + background: #f5f5f5; +} +.slider-rule span { + border-color: #ddd; +} +.slider-rulelabel span { + color: #404040; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #fafafa; + -moz-box-shadow: 2px 2px 3px #fafafa; + -webkit-box-shadow: 2px 2px 3px #fafafa; + box-shadow: 2px 2px 3px #fafafa; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #ddd; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #ddd; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #fff; + border-color: #eee; + color: #404040; +} +.menu-content { + background: #ffffff; +} +.menu-item { + border-color: transparent; + _border-color: #fff; +} +.menu-active { + border-color: #ccc; + color: #404040; + background: #eee; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #404040; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #eee; + color: #404040; + border: 1px solid #ccc; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #ccc; + background-color: #eee; + color: #404040; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #ddd; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #ddd; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #404040; + border-color: #ddd; +} +.tree-node-hover { + background: #eee; + color: #404040; +} +.tree-node-selected { + background: #00bbee; + color: #fff; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff; + color: #404040; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #ddd; + color: #404040; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #ddd; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #ddd; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #ddd; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #ddd; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #d9d9d9; + border: 1px solid #d9d9d9; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-on { + background: #00bbee; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #404040; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #404040; + border: 1px solid #d9d9d9; + -moz-box-shadow: 0 0 3px 0 #d9d9d9; + -webkit-box-shadow: 0 0 3px 0 #d9d9d9; + box-shadow: 0 0 3px 0 #d9d9d9; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #00bbee; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #00bbee; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #00bbee; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.checkbox-checked { + border: 0; + background: #00bbee; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #000000; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #000000; +} +.sidemenu .accordion-header:hover { + background: #eee; + color: #000000; +} +.sidemenu .tree-node-hover { + background: #eee; + color: #000000; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #00bbee; + color: #fff; + background: #00bbee; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} +.l-btn { + box-shadow: 0 1px 2px rgba(0,0,0,0.2), 0 1px 1px rgba(0,0,0,0.05); +} +.l-btn:active { + box-shadow: 0 6px 17px 0 rgba(235,235,235,0.3); +} +.l-btn-selected { + box-shadow: 0 1px 2px rgba(89,205,226,0.2), 0 1px 1px rgba(89,205,226,0.05); +} +.l-btn-plain, +.l-btn-disabled, +.l-btn-disabled:active, +.textbox-button { + box-shadow: none; +} +.l-btn-selected, +.l-btn-selected:hover { + background: #00bbee; + color: #fff; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #00bbee; +} +.m-btn-active, +.m-btn-plain-active, +.s-btn-active, +.s-btn-plain-active { + background: #00bbee; + color: #fff; +} +.menu-shadow, +.combo-p { + -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + filter: none; +} +.menu-active { + border-color: transparent; + color: #fff; + background: #00bbee; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #404040; +} +.window { + background-color: #fff; +} +.window-proxy { + border-color: #ccc; +} +.window-shadow { + -moz-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + -webkit-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + filter: none; +} +.window-mask { + background: #000; +} +.datagrid-header .datagrid-cell, +.datagrid-header .datagrid-cell-group { + color: #666; + font-weight: bold; + filter: alpha(opacity=80); + opacity: 0.80; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-style: solid; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/filebox.css b/testapps/GHIssues/src/main/resources/asset/themes/material/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/Thumbs.db b/testapps/GHIssues/src/main/resources/asset/themes/material/images/Thumbs.db new file mode 100755 index 0000000000000000000000000000000000000000..5f257a2a49959543d36e2641d352572547e40e63 GIT binary patch literal 35328 zcmeI52|QI>`}ns^Wu7Hd10{saWN1RTQWRxO2$?d=bTp}qsi+Xi6q1?D^PJ3N4ozl9 zhLhp=KfB?*b>Dm6Pw&0&@Avz6-xlAqj&s&p&t7}4^{i*D{p_W=iS}i5`lcb|H$e^| zMDS}H5R$JxCxG`T9|H}7tb;d10Df(4?bC+{0&jnYALtCM!m+N0i%0+YS`tHyUUO1l z0|1v9Ap^((3V;%z0;mC6U=u(GFaX;DMt})m1~vjL04u-^umS7<2fztz2DSiOfo%X6 zumji)NCG^-PJkES1NebmfB+x}2m!)?3?KrC0%CwTAOT1LXxo&Acn=`^`ENOh<$=Ax zK43p^06^3Jw*?Kv7JeMzS|}hk5Zfc?;Y@sgU_yxh(dW_j@~=X(mahm#t)74o679A9 zloGwxej=KSX5U*@DtZtQ4j@KQYa_%8&Vt#ekN&M!8qk9Ou6(rb_@W&R0@{B6 zNJd~Ad{6&J+YfpUzx02!yf6J9)gh=3_|pGTJ%Q?g zKkEMn;X5?HBE(9-AwU^W0aSrs05#w+pbnsEk3y^gXadK8*a7x{1KYG71WEGIDZCDmofUDq1RXavCNYT6zXXMn(#1=8a4Y8|fGr8PGxq z2q6y<@djez4GfgzlnnoNSSv+n*TcATijZI{vW}L3kd|Pr5*60Rd6M2{L$d&2h!5iK#@mfibE=#LtaZna|&z7QO}e%t=^GDeM- z87`62_7^vhF)?ps*~Gnl2hUDkQ894|Nh#?A2Ne{R4k@c>9y_k3ed45!v5Dy!Gjofx z4vtRFF0SX@E?vIjbM@MF-h%hDTn#e)IO-=oohP{oMS*BJRTyS}y{G@Kd$^QM2FFix%p&j);hm zh!m|C!8#X!kd}ye%We|7eMd=+?C7@&Us%tuKR7zQY{NDYjTy$%_AO*gT%tqVShQ*% zYxaE=yZEPS_K%AFTCX02f{*|%9w99Zz^e>Tu}-0Pc686Px|>haoL0}Wrl`q#`$#UE zb7e=5;G*anvOLO1H?8b5@aAAq_$vSI_sVtL1rb3yeiNH8D+`>94VWv4Bj-$%c}ZW} z8ZsRlgQuTlUJk>o&V@9sUQ%B}A}jD8Y-eKrCdn~t-Cx@HKVllN)L7uJQ=dU~-p8K6 zV>ckrUr%rvG>IW-7$?vUj-WMc;4cTz97ga?0KT*MsBJ#!P;?wX4wg*(Q9h$@a-h~0 z;Xm|8*$<*Wgb=!)`s1Ts{PFdN_!@GVwL-s8K8|pVe}weIam%7jw$wX%=7e8w+Y{f$ zvA?ChXr=I0`i$`IvUf^S6!^i#m}Sg>w}iEr`=0SbHb!{?5AQJ@+*8A=sPz6}v2_P) zC3WI}Sm+v(elMcTf25($8GrYo_nv*jo*Olf{8p#dY3;BeVt-0=qpL(OaQ!gW9u{$b% z;O@)C@i1h8Rc-6@>Q+{B>zEVK3IQZ#_q&(2_z1BLdnCKzcR z!iJK})kpZIh2*H2;CD*#=?S;q3EYT!t6664Fs#V5q$6`~cV+(N;E+RI#m|E72U(qy zzE!=R^p<`QO-g%t8>X8u?J7(4vz3x~p47NWQNKN`hpeM>0#09H5@jVNBO#rA=q>*{ z+67ez|2llJ9|~b;{SoX3Flv7G|F8N#YB&Ft@Mq>nfv==m>qsU(gsC*cDKCV}Q znfzVzA9Ri28JYG`F@mJ-OKmq7n?R)Eg1k#p#uK$m0KPqKs zVRJTLa*J%`tjVq(ryIcrFi zYsvHl&6fX(&lQ|ZZ9?0G%VK6 zt5x{pVhF=gg>PV_e7oYNjvvABhD8^yAwkM(NT2QNy~I%~Zu{_11^74 zm=Dv;s|!5q&hm2R^sXUIaCy^}zAF9KGx2K~zGG7)+4r=}>v;AOT$MRO`lp7zkKOjm z_*eSV{{13quE|5t(HtHEvz9$h)vJg1((hn zeH9L@3c~!?Tmp~z2fbDB=uMKiW~f>0$ao}tX-C*sN>V`3uB)V#u z-t1Afu_}9(qmgH7I-M!i1Lp7C^nc3ywft!Qp8f;#w?Bw>7nr}#mNz@k+C^A3H7uR> zUD9bgl$oC8)5B`s$#c|rU)s3`r!c%cgnv#4eChu;U_Ad3>|a)d;HUljmHqo8+dr!B zSKmFxZ_xGM z$j~*!to>9@AeMw{dEb#|?vZYn#*eNc<(?1M5C>SoExws%Op`?FVFZWb$zbC&_{2FKP?`7HP#WJ z_h->|@V)g9gtRw5%m3fLf5-LH{`h=f^2gWTr1<9?mu4U4%Vz}5@}#=-X1>Kg36Rf> z+NWSRtHAi`ePqoRS%#x0*#Fh^`iuT*g8uj;*w34h&3`NV`2y$y)W6^o#Fv39fDdpL zxCUGYd;vee9|!=@^g$5c0D^&=z%Af55CVh(cYwP9nl=pLa3BJ>4@3e{zylx}cnHJ* zXxcc4Wg;3& zk#YmU)?#J_!K)q)(fhJi!0hqrYJ?VK;l zx3&%baEGhs?c2oyOZU~zk|wMahR|HZtJ!5!++@|lJ?vK~9F<700k7;g4MHd)jKWnp3XapGuJSX$^Xo(a81-S-r`AaXGtO zA{!-B3lFoA6!nGR_PJehHT$x|YqXiBja}U14?kWiFw)v-aveG0yV-iy%%<;FHtlgt zU~vlZ;RVczlEsqnHAH0%sXLD;#8|Alz3?-T*UTAsJG;7aXAQ~CD|zbPTrREK|n1{*&dx3lbbZjR#f!hW6l3Z2zUa04 zU`{VadyhKFXg;P&UtXnsUTrI-;mMLfz7%ckyk@FoUY0F_c^9L%s0Qt#p-Fmx2xW6t zS`!||X(wQ8Tumo-iTO!R#rsUvRMaTvWk;?bzQITG;l93^etm`I&dokVzHbWYu?#C5 zZPOmRhQ;%m=fmwRZS5#@$}PHRvo>s<=UE=X2niX@rjeE2u#hntsgn~O(6f*hdzIfA zhp}9ZO0cj@Bp+q;CugzpCnid`w=Lv2Tc{*UwC1C9=8`Fm*-WkF$yCS3*9&C>vYm9_ z=esPINI3tVuL`Piej6y@15iUq1K6WK!uY=)A^%&A|Nq7Me_6wjz=DG`SQJCkk9)6O zeD{N!?CU%JVi%VxP6cl`>YT_}?|t%phPZ;o?T1`-M9ItijY&b-gDYydfEfM8_i|AW zU5l}kyH@EWo(gVzd5Zb81Y6pnvh{Hc1mCyx_OUB`Y5zVyNc(5{Ie+`x%-?=lKJ+k6 zKFhO;fuQk2)9MJ^PX1R@wco1lZ`$wA`yW51|M2er!1@y-v;-yqrYRq%6~Eh1zWVSU zy#M0=BK#kaPY&hL0^ch?7Si^CzD0w`e?UGnl(P}|UioQ|)|CWaAc+14aDna zjEz-E`e!?xXNw+BQ}~GACOPu%07anW*8HWR;vHiPOqs5_>XEbSZBxaP4_I5x5^(i$ zX?Z5MPqIZg#^(|$;TZ>Dfk-}o5l=l`f}7v5!q+H>$2d)|a1LUyW21HP^m_BWvlG?9 z^(&IXN|sM_iW(cAX@zCY?C)}+mhs!zvwzzD#K?|Bv92!aneh{CQ)0FoEz$=}AHt*;iw;g~10{_OLhD zY%bU`-cFYHGU%GK8{=C)(dBWA;H%f26q%0(ynHiST0cLucQi7j+QSPgkms~LSpJd~ zH!VErVO2zjR9!2SaqG^dOiCrt0kKRKP)Y^|W0Y_Tgf*^R@-_%^hIFvfbny z7S~8y5!(IXxVtCkuxv}E0TY(cJ)C9lN^NTUNaw74(nH(U+)@8bd!dK;ZmVT3w_y`W&Di1uYk;!VQR{7@_vKy z^8Ch@wlkTX0tQ1Vrl$rDrWM}1vD4(m@w*q<4^>OeV!E%0O;eoZ*e16-GfF8la)6#( zKREA|md(10x{}5{MM{+e!fn~I2P!(XnBJ@C8n!m|aOq#Lb7wjy9VxuWDfQWVe+nVV z`loIhn*Pof@%LNZQ$$~^itMb?s(v}zmCB(kIu*HCR3i8+!c``S9oJKLgGB!q!w2{| zZQ5j?rSpEmtH-*o)-3N?Ig0J7Ox-9NDcmWuCwd=mohiwECwlMH`^i}mg7tYdhIie% zdZpKpi*vSgdP)wMGX`U#yHlRg6$)Q|?mQh3a;-`7xrm;Ux9!B7ASF>~jc!gsL8NNl zaFj}M*g<};L*37;PQ)6~OUXM97aBN^7ii1Q(NT+&6uZp|9< zMLZv_a@E9p4Vmbe*BjWJbt~5G(HioUdvOh6Nzy#4H9Mz&1k*>gyoUI<8pOyQy0d`6 zMGdL5xyrc=fWv<-)&@Vo{?`bcl+ou~kHfrFySq?Lv}$Mt0>_i-TXrpB}JBe~v#tpFjQG z2W$U_{AcNL3!*3$ius<^(Lc9wRm3jD&4 zOdX9b#&SHksL1!;zPzgvlU6fH?-Vzh-Z$uKsL|MX|3(9)Rw?b>Tb)zAk_NNeJ7hAf z%To+Z+Avg24Y{@RX_A7e)p645i;4PzZ&Zg>m+Q{nITkk1waWXj*e!e^B)mpi!6$l% z#j&4!e|yZJ>Em&KuBQbo)u%GGHArJr-Z`ugIlT|!^w?iAGf{g7&yUqgPkL6+xlxS3 zcq2=-N^cS|8=L1yjaT;D$MuX@yM~!#uXQq)g|yvloqLo8QVIm(>B^-=Id;&C9VUMq zHSh8&TkhGzV%{0j>Ol^Ruq$0J1g6E>voF}hwumK%JbgdRb#Y7Hi&VA*$jtcT`Iz@2N3Cs|T#2q+n1tZvj&ZIWQWcW86aQG<)gXXk}NP7i6_&wDuO=_(Q9EMC^E&Z|xDOjH?^o z{FKWq=q?rCkZXx>^{Gc~ahC!<^oLIb#nz5ii^&#E3{Tyk=*Umqv(SZ=Bc6G4$u8A3 zWv(|qt7STJdBUyZ{;))dnTOZwO4YzEd2=uM6LRl9@H~EgW~3sF`6B;mtZ1DBm7kT% zSeM4eFfkUcDbg)UrH5&&;%rvufRr?X@1YHh5C!k(J(3 z)t+HR$$LU3bnIrg=pFZNt}K_yq9!}+^yLTG!Anj7>xQ*22u}7eM#`6v&nq*p#+`aB zTbdf^wG9_DjHwc&d*LD4lI1r@F+R0pq;d94!+X!UY)=zo4DA8+NJjdXfn3@i^za0N&p;ez# zy(3OSn5o~st*?sTFY?|of6fPwsW*CX<1EaESyS09rAeYV;t0d*oHjIApLF&%?Y6<7MUruH4Plib9hTKlm8ZvXr%+#?ICZmCba|9D85C^{T z)@|h}Jwk#!E+N55D9c|KHw!hzsNkf0i%#ACON6^Hh>9W1~vjLz$SndU<23z4gmHy zK{f+hfUN*3XE(&$z;<8AfNy!0!qLkKp9X0(0so@tOgtg)PW;VVB z5pV*W0T;j(I1ji1?tlm233ve*z#I54zW=|fnYs-dG-))GS?aa5xOqN`u7M-Yct?l> z`;(CK&cVvwDlA*Bw4I~K(|cuNLRPk#T4F(t>0TZh31^A6WgNSP9c_`LzVX0gQJ|

                                                        NA+ZcC>&vv>@9CR4VtY9M(_F}@-1%;|KR!4iA9GaQ>eBDX}J`#J5%ao~~20i!d=uaWnN2JTaCZc`4~#{=ltA0#Q#aZrz(q zm2=*?xv736TAM|Kl=3M&Bw@D{zAUxk)aE6-BAe5h;+@@bY7J3ppPMZ$$}S~5x2U-o zQjkbmI-tbu1yQUt@EkZA~%UI zDZD8leyDP5!{b&)XQ9#uFDH9gW$d3%xV`jLCJ9x3F0V2d)ngzpp)j-GseibEU`g3< zw}%EUZ+MWvwLm-Q7ya#T)zZw{CR~~&&pg|?W$Qs3suK&ceD9y{sA%;Opo@4M*1u@g znZR5@5PCE*P%q8zm0o(U;?z=6wp(T+e$R@;(;1Fz%BlMdZ+|I1y-SO}lFDmEUy{9g z52kCkf!%6wO6Kj{)_KL<5&Jc^my)u))<)PCMw=Fy$?)Oz3))h2DG<`)a!XVo!GVvb4v6F8sz76QAYsC7a~r9%a{jt!y*OGU7Jj4X z(9=811A`MM28COelk{3Li>H^EEZF?%V6sKoc z$$2S~5*L?H6m`8&-ZV+E;%exYBK1c$50<-9BTR0;Hwh2-4~cS$#zjhB7Gc|3)?u?# z&ZKj+rzassXEGtN$?Lg}?F&4$>rRysInFfp-D?OxUHC&B{m>dxs=L$niP(v`Yb@-P zoq0*t3R+w4@;I-TB788Zcf4sLbJ&xk)O>&zS2P?&?P|MOAo9$~Fd{Z0Uo*|Ef@xM{ zK@}xwS1TG+=i65f^#u9PTfI&dD@b^1@AX*CjbWzaxPi4`=Ae=-PNp|hD%!Rs_`jbA(=v(l-y%-aTAId{wnS->smC-as|g_-m8iYF5Wyx}LxR_Nz03 zJ?v~@?>WPddrf`XS5W|Vo3i=5x1umuDMSF$-N7s%gzirD^}bX_A9t!U`(~G^y^xp~ z%@HN4w`L zny3<+N2lRPO+d<*T_O!(w?1?yEk}@szW#G=QOLa>Kq6_qS0#U&8{LP?7LMHEo0`f% z@(pO7XL?R?;%FZ0kL5c-`Jc`zT1z9SpFQMu`6jP8WFtfK9w)rU4`=D?yy!6+LH(?t zG?Q=64SF?D--$2h_Ul}~e>Tyxg3j2G6`#s>v2W$r!x=JztAL)5-#^NOkdYG2Z9uk( z?>9$@o=b<1dCx#O=&_!IdZJg>@tb4b57|+F2ZUtM_K(XjgSrtTfN6-J)Z3)eZ`dJ_?D@j?u)DxiX`^)@Q4ea?JVf~s0q4|0L z^zU*1bg5v3BzuJV${^j!zG2H0L)|tC7H}k)t#&+yc6{dHq`^nGF=%S6suv5)R&xZ=w;qF ztRy%*-py=vj%lM2(fM+db0=P3dw!UTZ#v!8DnC^7a6GT&IGwNEkuFt>rrt)k?p^A) zq77Lzg(7$qmKg>`Lc<0P4Dg26zaC%E9`}dgH1ux6kDB6>?)h5t{MzS*AV2CMhMb7w zIIZ-l=YGohrT=dKLHaNGPyh43i~sFX>acn>;gG&YJ#kudw#Bq)vU@>8-C3CX*!;)R1mi=YZGeN)Y zn8q+x+d>~iN6KG!6GiPGbX5xJ3$K}0`MSUT)*AWJ|9%wz;mtq&-~TTCZ&iF*fie6| zlpA0Bf*JGfd)MWQ*O2>+4)qW7^PYWB|7}Z0oAW=1FYWi}4>ErI*8Y?F53E1KlH?ld zPL0O@e1`t{6Ioby)Q9th2BE*W13v73@KG)*8x5aI{nxLmAV2uC|M%|y1NmAY|H{Wn zExPYAIt%;r;m_3H8ssy5md^?9&p-E1{~`BJU!EQwoFt9)kh(dpl6ELNh;F~{Y_Ci? zt1e9i@1nzvgM0mHyhVe8v)4;;7|&Q5U|p)@uWzEho|1jv@_5TGv!}O?w-?s&XPq1o zpH*Vaj(akpnxmyHEWYqT>fE`QLfrJS01h+4@3P6C?ml_tRLrUzcRyvz@t%io_%CcH zLF}#`K`1X=dS#dycmeA$L|v64UnZS%$Jv9Kx9M#YgPL3v4eg#9F5wF~!q1c94);yH zcJN8fFC9t~v(L}0XoUGm-pL$!u#>IrRkC!-ga}TQSg^YJ7f0Mc zWVG5}Xq-maTAbB|XL4m-n43|^^;=0>N$Vzta$5=`h?|-q*+A*o{>izW!H0V z96$byUEPfPS&m>)OAbLwdhXSEY2oV2MD{m zjXKE_TQ2IzBpvXKlyV^V59HW(`;=$RYeN%!V^r2aIJUL?t$INqyGT_ip@i1%^w~Fu zTPtoJ9z4z!B3rvT>Kg#u0NO_$arONx5{BjEk#B4Vw--;$spzxt(mJU^fg2CQ5R+S*mHfowhnHb%I1^_ z-bCnMC*Hcgw)P;YR8>#9;~61{m>anf3# zA^mN03Q-4sg&1Y`_VA3``6^4|h1t2GxvT4NN5z>sfi>j2?2JFM(7)(!vL94`Ux2v)>QizF;>+l~1n>c_0@r}+fG^+& z_yYkzAP@xH0D^&=z%Af55CWj(-GTTna1RIr!hs0jJ`f2+0S|y^;2{tL!~$_ZJdgl9 z0uq5F04?(|#3{fNAQeah(t!*h6UYLx0W@tc#7}`dARj0I3IX)HpW)Xt@N@q6AH?@VW)C8=k4+SU=9=WROuEwe9?yh?+j!tCH!;nvoGyk6SNx`&#fe;3+=Qtugt+4b`@0Qz_DXN( zbSt*;Ue~g$RGJ=hodQDcHyZWt2@XC<4h>kg-E2d=mqNlw+k$aqFjMe)Hl^i)Jo6P zWKpwl9}%jhB02W*eWRuKGvlifreaBMa#6y&C3hZEE1Pb9iDy2$C{H9uXCb!{>(qIh zYi2bq$7ia1G)yX*<<#u70&Uv!^~4vd?L{t>;D<&iY_??EM`qPBsCS#r_FBdesxRMkWjb4=R=8e%s%v#*pY^*PKY z_DQTmYI6I$*k?LJhS;~WizudDQfnL97&y=`p46o%&%W{b(Tg49USSKuWkakgv4aiG z|IUE=W&ErJw~(Lnpa1>mzeN5I)*mmzINbcv4G7);;(verGZf_S`n>)r_J1Hh8RUQQ zzy2e;^56OV*U|j@*1x|l`@eYpySm$2OW$V6(p~wW^N|}Iu62EtPRIhwNZ`|P-`OT# zOcu3|7d>vIB9bV*#SAMLP`E#3S7-=PTB%HW0VP*!M$!~dnG*N4ZH%orPMwn;66B;5 z&uSb9JD*1RdC|>?Wxw~(>ME28i@GMWEuqfI!ZEI}G;Qi01J7pqr#T}10q!S$5oK4H z)UTyMx7hxk@ARgirxO}D!etGZEZ-^YbWCO!IWm*$n`L8@HM#G&sRDIc{-Mhk z8LO%HZ(wsU$d1Dmk0@Z-q^YuZ+*^prsh{yC7vdc2Z4a)M{g4_`Vj|exiMg`qGDusf z;A~ih=gF~n!aq_IVxHOXHm!E7n^!i?({*kz$Y6&WU&TV#vUfqYqdB$xa&^awI%8W< z+0g_ol}m*hE7mDdmUoA+4mb6dGt?RT20fUuGUG06H(k#x?O#~jY--H4S}jY!dF9+1 z!cnL@9L3}z64^B5Twt4k3)8*3FI1V9i)p#Ub(?^=&uCYU-E+S2eqE)EE-RCa_Fcw> z**A=aL+s-V4J$DjSAE#I^P7o!OvkpE8!4aIZZa^ z%gxm@t|BT?lOhHg>~}O$`wq?@m$}s(LD7+lcu7mh9>3qu#30y@g2gy5_;0X=(=+DcHH4GWx2uVjWWA#CQ5wk z7Ws8A`{Vat#=k8;%>0q_r~laB!+#9+-=MG5>AO?B_2%=PD!Sc|xM8D#2F=T~LwX+LnXo=$#qqL7p96d&*L^utqX+2&Q^p<&C7x`#Wv zBO~de_)V|f%r}f$A)KxvR19K79@>;Dg zDi{@-lSW#`N>aBq$Z?G~JjVI%;+5z(i^ngFkow#XWS$|N7kkN>_5A(=+?}#82DvR* zrl6sxLs*U|cgE^W410tFud3g*ko(?eEL|e3*xfiN&#ow7C%ei^=m#vq@ZpK-P7d4j zQaa-AJ2)_mDOYUR7I0z7Y+I4X8iE~bD2>XJ8DO|o>Fl-L+tqFCrK($CK z4Z+*%n?moJo@#h5CB=E6foGVa%XcK)SZMxT+uQsIi^CqlK@}#U1zeLwy>dmWYa_m*xmxZ$29_qb#ex1u@^RN`cQ?ne)AygWSYv;_kb1mvXMrSe8;Ik%|A+3|5 z3AbM-w3>4DMl9~8nUN?wwa7T+W?PfOtkgE~*jhBeZr8-izyTUZ-QoRPujobXc!DHJ zD^=~nR1RjTduOY!!)a@mwC|eC-k7cYB&*j?SJRS9_vViCjP@R{lsK+#!v(kxY6Y%%dYhXeg8nww^h5XRu4PXhrR`QT+2#)Av3em{YO-^d^B;cyG14#k z^QZsNkGcQgkG%gJ;jHYV6vK?8V7?t4nPtToFNkWD1WzisM!uNKqyD~G@UK3q=#vWQ zQ>+M;KY8|N@A6MRs;D>o8SsPuecx6A$bvroi7>hy@KOHOpB?qfJNJzbJ1Pa;uMy#i zpt*9Wo&fc6cYq%w@ZLk8oiP0Piaue0K1cDZM<4ox0lLTIALm1T_0K@QuXCZ#3!u9r z{&6llcmm{;=f4Hy{q}#7qfbPj`zro%ZkLbe#OC930^dHrfzB$?=aP}Q%W~g(AR56F T0gjLZeOBaa?|wA#e_!~27*z{8 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/accordion_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b6368d636e2ff36501ff9c6b14f7ce09997f3743 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel!K>>V@SoV?_1tQrr|vg#{&FxgXS!5MW?fq8aJ< T>6BX`&@2W|S3j3^P6h?7!oT zn93bYIb9!43Wj)WNz0M)xYl!8U>3_OjRiss3@1j_Zvlb#iD~jUnsR3em#t_3WtUHqj%c^0} zFSrhZpjU$)YHUS-lsMx)nN8pghWK6h!524#*oXjC@NjHF9H1y2K%G?c=lr%4eY%ue zT+7R9Pld<2<$C}OAU0HZIJPqD0RA&Sip042zF(tA4uaUhZ>jL`*HN0POocjDIidNRbTZ#@zvW7@I c5>Ct23v;ttA1D3-v;Y7A07*qoM6N<$f&+eyE&u=k literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/datebox_arrow.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/datebox_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135 GIT binary patch literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$f|L1?c z_O8;7?=$$OZE)N^=kf)!wu_8{hTkWuP3Lf!{Qqt%*U6B7qRbydZ`F0T{#^CG?%493 zHc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/loading.gif b/testapps/GHIssues/src/main/resources/asset/themes/material/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/menu_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/messager_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000_$JYFBpo`sqZyU339@ZwM6gi$;Pr>w&6M&T1N3Q$b?ahk3>@EL9`+1-BwzvH4 z=V<*uH!1ee(Sv*K$aVm^9zxbfZU9nZC#eDGVQ*&XXK(qpy{>x2j~_q0QX@ky?B2S$ z`TO_pb_Ho^lHPWf$3SXG3P5TF!a(UIB>)3m?2n~HhFtml`Lhm)4-7>2Cr_RTgV@`) zZDWrM_B#twLv#R=>k(}FC=EbL>?Sq<16=LCHdYi*!X*!q1F0DeKpY^*)!|!SNr;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/passwordbox_open.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..0f25d535e05b22b406fd72647611aace9cfa6249 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/searchbox_button.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/spinner_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b1773c24b20b30318e38c4b84690e3d0010c9c43 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4DgeBzU z{E=^QXHHmRmEiEUJ<_jB`NK-}t7{l}8A{FvOK}{T)p$BC>8|6-x-MIXOa{IRh5%#E x$&;(vVs#x>vb(K5c#%QkA)^788{=C>2L8QE5AM%P*8@KmF984m literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/tabs_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..4dbacce18ec1310d22dc4de8ff895f597b0d61eb GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2L1978H@B_~L*E^hdC;Kq#~ z_8gbJY-45o``Fp;2v4zS5!xHXwo~JmL(T+=yD|FVdQ&MBb@0IQ}mHUIzs literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/tagbox_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec64360884b3fdb81255ad6074bc08ed183232c GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoVtb9vwNkrdSr%AfUpK=5(o}_e|{SG6u6f5&Q g4t5*qz9vC-hN^}472i&@1{u%b>FVdQ&MBb@08Zm4@c;k- literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/tree_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/images/validatebox_warning.png b/testapps/GHIssues/src/main/resources/asset/themes/material/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/passwordbox.css b/testapps/GHIssues/src/main/resources/asset/themes/material/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/progressbar.css b/testapps/GHIssues/src/main/resources/asset/themes/material/progressbar.css new file mode 100644 index 000000000..3eb2e0bc4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.progressbar { + border-color: #ddd; +} +.progressbar-text { + color: #404040; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #00bbee; + color: #fff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/propertygrid.css b/testapps/GHIssues/src/main/resources/asset/themes/material/propertygrid.css new file mode 100644 index 000000000..1d7a39211 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #eee; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #f5f5f5; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #eee; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #f5f5f5; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/radiobutton.css b/testapps/GHIssues/src/main/resources/asset/themes/material/radiobutton.css new file mode 100644 index 000000000..8dda45fd3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #00bbee; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #00bbee; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/searchbox.css b/testapps/GHIssues/src/main/resources/asset/themes/material/searchbox.css new file mode 100644 index 000000000..54ad88517 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #f5f5f5; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/sidemenu.css b/testapps/GHIssues/src/main/resources/asset/themes/material/sidemenu.css new file mode 100644 index 000000000..cc1a99b61 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #000000; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #000000; +} +.sidemenu .accordion-header:hover { + background: #eee; + color: #000000; +} +.sidemenu .tree-node-hover { + background: #eee; + color: #000000; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #00bbee; + color: #fff; + background: #00bbee; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/slider.css b/testapps/GHIssues/src/main/resources/asset/themes/material/slider.css new file mode 100644 index 000000000..43658ddbe --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 4px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #ddd; + background: #f5f5f5; +} +.slider-rule span { + border-color: #ddd; +} +.slider-rulelabel span { + color: #404040; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/spinner.css b/testapps/GHIssues/src/main/resources/asset/themes/material/spinner.css new file mode 100644 index 000000000..55580b341 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #f5f5f5; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #404040; + outline-style: none; + background-color: #f5f5f5; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eee; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eee; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #f5f5f5; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #f5f5f5; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #f5f5f5; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/splitbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/material/splitbutton.css new file mode 100644 index 000000000..2ad86f774 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/switchbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/material/switchbutton.css new file mode 100644 index 000000000..4c628cf40 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #d9d9d9; + border: 1px solid #d9d9d9; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-on { + background: #00bbee; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #404040; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #404040; + border: 1px solid #d9d9d9; + -moz-box-shadow: 0 0 3px 0 #d9d9d9; + -webkit-box-shadow: 0 0 3px 0 #d9d9d9; + box-shadow: 0 0 3px 0 #d9d9d9; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/tabs.css b/testapps/GHIssues/src/main/resources/asset/themes/material/tabs.css new file mode 100644 index 000000000..a44d914c7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/tabs.css @@ -0,0 +1,377 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 0 0; + -webkit-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 4px 4px; + -webkit-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #f5f5f5 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #f5f5f5 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eee; + color: #404040; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #000000; +} +.tabs li a.tabs-inner { + color: #000000; + background-color: #f5f5f5; +} +.tabs-header, +.tabs-tool { + background-color: #f5f5f5; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #ddd; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eee; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #00bbee; + color: #fff; + filter: none; + border-color: #ddd; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/tagbox.css b/testapps/GHIssues/src/main/resources/asset/themes/material/tagbox.css new file mode 100644 index 000000000..16ff41475 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #eee; + color: #404040; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/textbox.css b/testapps/GHIssues/src/main/resources/asset/themes/material/textbox.css new file mode 100644 index 000000000..488e6b7d2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #ddd; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c4c4c4; + -moz-box-shadow: 0 0 3px 0 #ddd; + -webkit-box-shadow: 0 0 3px 0 #ddd; + box-shadow: 0 0 3px 0 #ddd; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/tooltip.css b/testapps/GHIssues/src/main/resources/asset/themes/material/tooltip.css new file mode 100644 index 000000000..a00004879 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #ddd; + color: #404040; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #ddd; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #ddd; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #ddd; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #ddd; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/tree.css b/testapps/GHIssues/src/main/resources/asset/themes/material/tree.css new file mode 100644 index 000000000..ccb900b96 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #ddd; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #404040; + border-color: #ddd; +} +.tree-node-hover { + background: #eee; + color: #404040; +} +.tree-node-selected { + background: #00bbee; + color: #fff; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/validatebox.css b/testapps/GHIssues/src/main/resources/asset/themes/material/validatebox.css new file mode 100644 index 000000000..5911752fe --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff; + color: #404040; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/material/window.css b/testapps/GHIssues/src/main/resources/asset/themes/material/window.css new file mode 100644 index 000000000..8f1851ec7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/material/window.css @@ -0,0 +1,182 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.window-shadow { + background: #fafafa; + -moz-box-shadow: 2px 2px 3px #fafafa; + -webkit-box-shadow: 2px 2px 3px #fafafa; + box-shadow: 2px 2px 3px #fafafa; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #ddd; +} +.window { + background-color: #f5f5f5; +} +.window-proxy { + border: 1px dashed #ddd; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #ddd; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/accordion.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/accordion.css new file mode 100644 index 000000000..fb9f85e46 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #fff; + border-color: #ddd; +} +.accordion .accordion-header { + background: #ffffff; + filter: none; +} +.accordion .accordion-header-selected { + background: #CCE6FF; +} +.accordion .accordion-header-selected .panel-title { + color: #000; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #fff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #ddd; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #fff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #ddd; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #fff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #ddd; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/calendar.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/calendar.css new file mode 100644 index 000000000..3f32d30b6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-body th, +.calendar-menu-month { + color: #919191; +} +.calendar-day { + color: #444; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #ddd; +} +.calendar { + border-color: #ddd; +} +.calendar-header { + background: #ffffff; +} +.calendar-body, +.calendar-menu { + background: #fff; +} +.calendar-body th { + background: #fff; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #E6E6E6; + color: #444; +} +.calendar-hover { + border: 1px solid #ddd; + padding: 0; +} +.calendar-selected { + background-color: #CCE6FF; + color: #000; + border: 1px solid #99cdff; + padding: 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/checkbox.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/checkbox.css new file mode 100644 index 000000000..5c8ebdd41 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #99cdff; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.checkbox-checked { + border: 0; + background: #99cdff; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/combo.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/combo.css new file mode 100644 index 000000000..2e8907183 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #fff; +} +.combo-arrow { + background-color: #ffffff; +} +.combo-arrow-hover { + background-color: #E6E6E6; +} +.combo-arrow:hover { + background-color: #E6E6E6; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/combobox.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/combobox.css new file mode 100644 index 000000000..115192c0e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #E6E6E6; + color: #444; +} +.combobox-item-selected { + background-color: #CCE6FF; + color: #000; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/datagrid.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/datagrid.css new file mode 100644 index 000000000..220e6a97a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/datagrid.css @@ -0,0 +1,285 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #ddd; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #fff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #ffffff; +} +.datagrid-cell-rownumber { + color: #444; +} +.datagrid-resize-proxy { + background: #b3b3b3; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #ddd; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fff; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #ddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ddd; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #444; + border-collapse: separate; +} +.datagrid-row-alt { + background: #f5f5f5; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #E6E6E6; + color: #444; + cursor: default; +} +.datagrid-row-selected { + background: #CCE6FF; + color: #000; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/datalist.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/datalist.css new file mode 100644 index 000000000..8a7f94989 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #ffffff; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ddd; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #444; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ddd; +} +.m-list li>a:hover { + background: #E6E6E6; + color: #444; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/datebox.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/datebox.css new file mode 100644 index 000000000..931b825e1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fff; +} +.datebox-button a { + color: #777; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/dialog.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/dialog.css new file mode 100644 index 000000000..373747925 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fff; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #ddd #ddd #ddd #ddd; +} +.dialog-button { + border-color: #ddd #ddd #ddd #ddd; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fff; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/easyui.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/easyui.css new file mode 100644 index 000000000..7deea709f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/easyui.css @@ -0,0 +1,3373 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #E6E6E6; + -moz-border-radius: -2px -2px -2px -2px; + -webkit-border-radius: -2px -2px -2px -2px; + border-radius: -2px -2px -2px -2px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #ddd; +} +.panel-header { + background-color: #ffffff; +} +.panel-body { + background-color: #fff; + color: #444; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #777; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #ddd; + overflow: hidden; + background: #fff; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #fff; + border-color: #ddd; +} +.accordion .accordion-header { + background: #ffffff; + filter: none; +} +.accordion .accordion-header-selected { + background: #CCE6FF; +} +.accordion .accordion-header-selected .panel-title { + color: #000; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #fff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #ddd; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #fff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #ddd; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #fff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #ddd; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.window-shadow { + background: #eee; + -moz-box-shadow: 2px 2px 3px #ededed; + -webkit-box-shadow: 2px 2px 3px #ededed; + box-shadow: 2px 2px 3px #ededed; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #ddd; +} +.window { + background-color: #ffffff; +} +.window-proxy { + border: 1px dashed #ddd; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #ddd; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fff; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #ddd #ddd #ddd #ddd; +} +.dialog-button { + border-color: #ddd #ddd #ddd #ddd; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fff; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #777; + background: #ffffff; + background-repeat: repeat-x; + border: 1px solid #dddddd; + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.l-btn:hover { + background: #E6E6E6; + color: #444; + border: 1px solid #ddd; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #ddd; + padding: 0; +} +.l-btn-plain:hover { + background: #E6E6E6; + color: #444; + border: 1px solid #ddd; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #ffffff; + color: #777; + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #ddd; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #ddd; +} +.textbox { + position: relative; + border: 1px solid #ddd; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c4c4c4; + -moz-box-shadow: 0 0 3px 0 #ddd; + -webkit-box-shadow: 0 0 3px 0 #ddd; + box-shadow: 0 0 3px 0 #ddd; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #fff; +} +.combo-arrow { + background-color: #ffffff; +} +.combo-arrow-hover { + background-color: #E6E6E6; +} +.combo-arrow:hover { + background-color: #E6E6E6; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #E6E6E6; + color: #444; +} +.combobox-item-selected { + background-color: #CCE6FF; + color: #000; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + background: #E6E6E6; + color: #444; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #b3b3b3; +} +.layout-split-north { + border-bottom: 5px solid #fff; +} +.layout-split-south { + border-top: 5px solid #fff; +} +.layout-split-east { + border-left: 5px solid #fff; +} +.layout-split-west { + border-right: 5px solid #fff; +} +.layout-expand { + background-color: #ffffff; +} +.layout-expand-over { + background-color: #ffffff; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 0px 0px 0 0; + -webkit-border-radius: 0px 0px 0 0; + border-radius: 0px 0px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 0px 0px; + -webkit-border-radius: 0 0 0px 0px; + border-radius: 0 0 0px 0px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 0px 0px 0; + -webkit-border-radius: 0 0px 0px 0; + border-radius: 0 0px 0px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #ffffff url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #ffffff url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #E6E6E6; + color: #444; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #fff; + color: #777; +} +.tabs li a.tabs-inner { + color: #777; + background-color: #ffffff; +} +.tabs-header, +.tabs-tool { + background-color: #ffffff; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #ddd; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #E6E6E6; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #fff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #fff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #fff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #fff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #CCE6FF; + color: #000; + filter: none; + border-color: #ddd; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #ddd; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #fff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #ffffff; +} +.datagrid-cell-rownumber { + color: #444; +} +.datagrid-resize-proxy { + background: #b3b3b3; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #ddd; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fff; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #ddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ddd; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #444; + border-collapse: separate; +} +.datagrid-row-alt { + background: #f5f5f5; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #E6E6E6; + color: #444; + cursor: default; +} +.datagrid-row-selected { + background: #CCE6FF; + color: #000; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #ddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #ffffff; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #ddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #ffffff; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #ffffff; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ddd; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #444; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ddd; +} +.m-list li>a:hover { + background: #E6E6E6; + color: #444; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #ddd; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-body th, +.calendar-menu-month { + color: #919191; +} +.calendar-day { + color: #444; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #ddd; +} +.calendar { + border-color: #ddd; +} +.calendar-header { + background: #ffffff; +} +.calendar-body, +.calendar-menu { + background: #fff; +} +.calendar-body th { + background: #fff; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #E6E6E6; + color: #444; +} +.calendar-hover { + border: 1px solid #ddd; + padding: 0; +} +.calendar-selected { + background-color: #CCE6FF; + color: #000; + border: 1px solid #99cdff; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fff; +} +.datebox-button a { + color: #777; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #ffffff; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #777; + outline-style: none; + background-color: #ffffff; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #E6E6E6; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #E6E6E6; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #ffffff; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #ffffff; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #ffffff; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.progressbar { + border-color: #ddd; +} +.progressbar-text { + color: #444; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #CCE6FF; + color: #000; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #ffffff; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 0px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #ddd; + background: #ffffff; +} +.slider-rule span { + border-color: #ddd; +} +.slider-rulelabel span { + color: #444; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + background: #eee; + -moz-box-shadow: 2px 2px 3px #ededed; + -webkit-box-shadow: 2px 2px 3px #ededed; + box-shadow: 2px 2px 3px #ededed; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #ddd; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #ddd; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #ffffff; + border-color: #ddd; + color: #444; +} +.menu-content { + background: #fff; +} +.menu-item { + border-color: transparent; + _border-color: #ffffff; +} +.menu-active { + border-color: #ddd; + color: #444; + background: #E6E6E6; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #444; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #E6E6E6; + color: #444; + border: 1px solid #ddd; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #b3b3b3; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #ddd; + background-color: #E6E6E6; + color: #444; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #b3b3b3; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #ddd; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #ddd; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #fff; + color: #444; + border-color: #ddd; +} +.tree-node-hover { + background: #E6E6E6; + color: #444; +} +.tree-node-selected { + background: #CCE6FF; + color: #000; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #fff; + border-color: #ddd; + color: #444; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #ddd; +} +.tooltip-right .tooltip-arrow { + border-right-color: #fff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #ddd; +} +.tooltip-left .tooltip-arrow { + border-left-color: #fff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #ddd; +} +.tooltip-top .tooltip-arrow { + border-top-color: #fff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #ddd; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #fff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #dddddd; + border: 1px solid #dddddd; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.switchbutton-on { + background: #CCE6FF; + color: #000; +} +.switchbutton-off { + background-color: #fff; + color: #444; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 0px 0px 0; + -webkit-border-radius: 0 0px 0px 0; + border-radius: 0 0px 0px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #fff; + color: #444; + border: 1px solid #dddddd; + -moz-box-shadow: 0 0 3px 0 #dddddd; + -webkit-box-shadow: 0 0 3px 0 #dddddd; + box-shadow: 0 0 3px 0 #dddddd; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #99cdff; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #99cdff; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #99cdff; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.checkbox-checked { + border: 0; + background: #99cdff; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #777; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #777; +} +.sidemenu .accordion-header:hover { + background: #E6E6E6; + color: #777; +} +.sidemenu .tree-node-hover { + background: #E6E6E6; + color: #777; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #99cdff; + color: #000; + background: #CCE6FF; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/filebox.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/accordion_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..720835f69c96c17ec32a20b03ac9753aa59b7f4f GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYeRK2H*V@SoVUT_Y-nKxaI`{RC0WjSLJ&w^R(C-|JQTojLXc1&{d*_z{$ jW+oTMdQ(F|jDg|L>K${_)^zO#I)%a0)z4*}Q$iB}_fAN- literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/blank.gif b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/blank.gif new file mode 100755 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/calendar_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/calendar_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..430c4ad685b8c0068ecb7e3cbef74f493a84ad0d GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQYD@)jv*Dd-cCEn)nLHm{QbZE z+q@uWwandfr?Jb4eDYYmB3UAt=OO2Vt+MMT&+KD%&6hZDt!FBpej;sEpMN69^tKl% zp6y<4_lG^P z=;=eQ4Vs74-2)Ua&f1tcVdk$#{GPKe@&?ZMHmT&SMw?IV&w7)}ixLbB3d$Zg{&KGb P8OPx1>gTe~DWM4fp>5!O@Gl{c zHXr?)EMpjkiI0?0nVI4ps;W|uWCd!b5UAxPD-onMP4mgv0vV&Ul|KA@T-G#0QTd(IpSp7SIAsd;)#A=FjzgW9D>i*LbaNyX|0kF(mrr z;o92b6Zp@36nqs7kw}pT2qBaieQ3N+owvm{e=N(DufonR5DseQ_ISSW8dV0M=To{w zToOt35OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fRl}UZ@-Co%Cq`k{wEj}Dr>ShP9AQ|IKKA30{ejJboVoF`C-z@6mZMY&%Wiz%6S}#zb4u?o?9Mi=ECopVxzz+sNviAA!DK)mm8xe zgY9ZT9jlddc^&y2^u9XqDeU4{8s^AS#8C7TXsxEJW@uLu(3Whc35-X6v}jEgEb{G` z!{)$uKzw<~%0A6PhNHYfSuTvOzD8LpPF>PVr=&QqGC936QlPgc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/loading.gif b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/menu_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/messager_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000zI<5nO~0)=fnxErNrCA`WgM*1^R=&_zX)CMr1T;-rJKi{RhT zwTRWWFSbznW6?ZwYBk2xccxEVa`0%4(Yva@;pbF0^9S2uAKfle(?qtbyxJ(2%kiF>CHXa` zwdcneqDH8s8`O=^Z;G*FoH3bGkRlewXgRMPCtCR>olp$6SSk2LaLtdk735GTeS6JrtWdjq}ZZs34}bF$p9qsdLBnIC+J1{xF!;M>5@n5YI? z&4z;cHjvE$_V&)MtT*$6579tEVTAaOu<<1(%cR!^622ph;K0g-9AQF(O3vhYiNJ*b z7Xuat7f#qV!aOb!Q6;pKF~UjxbnQ*DOwWIpHq-OqgFQe0fa`fz9oUMD0Z9VV1d9Q= z5#TIiB5HxD12dV7Jd)hJ_=qt$xd^NA4nEk!Bp@qUu0k4c(cRlRc0Y)25Z^q7^m|=T zEPSa{>fbuK*p?QKGWOF9-+|Bne}*tPWtM~)t<`EXu;7__@_h5{U+e{vTT29oHFe~Ze6XJ(Q>Kb zHH)*`i>&-o-mMNlRLeM*)b=tl9I*eiXO{b+PdrTgTX%D4@ZRav{vE&cqCShv#9g;J tE!>t@mbeRM^gTGoKdYo(nL%h1<2#QP_cRaf4g@-i!PC{xWt~$(697v`TRe8 z#G%R{$NfX%tci2`Gda4n1O70V3HltacN37lc`VT21_Oig(wY*}T!mDijSQZyelF{r G5}E*M5;#5p literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/passwordbox_open.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d328891f6a18ea703fd25a47b228df9cb13b4744 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fh6C~y}*jFF6I{2&m zf8fW~lSf{d9=Ouc<(SoRr6$ox=6dW5rxOB`TRe8 z#G%R{$Nj@Z)5m5kM@2RMITi_;Npmte=_#;rBych_7F`xqKKy}=f%DM}Q4`(M(}DIf Nc)I$ztaD0e0su|qH(3Ax literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/searchbox_button.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/spinner_arrows.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..7c2df483dbb30dfb3a51332c03fe6f0c229c0547 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4Dgeh3R zJz6gy$J;RRRRiNz`7}$-z5~nWg=}UsVYp!HpQ#{_&8An~S<1fjm*zKyrHmF27#+^4 x`1rk&EZfSkR8C?on>%wt3;O{L3Dzy_3@=Og7TEqO`UJFx!PC{xWt~$(69D$UE$jdQ literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/tabs_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..4d29966d7154338a9e2e358821a5f72655eba43e GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq+&f?978H@B_~L*E^a7uNPG49 z|BoM6E;$_tDnm{r-UW|t3f!- literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/tagbox_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..bd02e2d817c6b7c4e2a105919e9a89cc0a1d577f GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel&`0YV@SoV>_0CQASS literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/tree_icons.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/images/validatebox_warning.png b/testapps/GHIssues/src/main/resources/asset/themes/metro/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/passwordbox.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/progressbar.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/progressbar.css new file mode 100644 index 000000000..77512af86 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.progressbar { + border-color: #ddd; +} +.progressbar-text { + color: #444; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #CCE6FF; + color: #000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/propertygrid.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/propertygrid.css new file mode 100644 index 000000000..9c859b192 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #ddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #ffffff; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #ddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #ffffff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/radiobutton.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/radiobutton.css new file mode 100644 index 000000000..d1b61ce44 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #99cdff; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #99cdff; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/searchbox.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/searchbox.css new file mode 100644 index 000000000..2d3af1c15 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #ffffff; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/sidemenu.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/sidemenu.css new file mode 100644 index 000000000..4165e46d0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #777; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #777; +} +.sidemenu .accordion-header:hover { + background: #E6E6E6; + color: #777; +} +.sidemenu .tree-node-hover { + background: #E6E6E6; + color: #777; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #99cdff; + color: #000; + background: #CCE6FF; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/slider.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/slider.css new file mode 100644 index 000000000..7f841034e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 0px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #ddd; + background: #ffffff; +} +.slider-rule span { + border-color: #ddd; +} +.slider-rulelabel span { + color: #444; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/spinner.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/spinner.css new file mode 100644 index 000000000..cbc7e591a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #ffffff; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #777; + outline-style: none; + background-color: #ffffff; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #E6E6E6; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #E6E6E6; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #ffffff; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #ffffff; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #ffffff; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/splitbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/splitbutton.css new file mode 100644 index 000000000..3451138c7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #b3b3b3; + border-width: 0 0 0 1px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/switchbutton.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/switchbutton.css new file mode 100644 index 000000000..057bf5587 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #dddddd; + border: 1px solid #dddddd; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.switchbutton-on { + background: #CCE6FF; + color: #000; +} +.switchbutton-off { + background-color: #fff; + color: #444; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 0px 0px 0; + -webkit-border-radius: 0 0px 0px 0; + border-radius: 0 0px 0px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #fff; + color: #444; + border: 1px solid #dddddd; + -moz-box-shadow: 0 0 3px 0 #dddddd; + -webkit-box-shadow: 0 0 3px 0 #dddddd; + box-shadow: 0 0 3px 0 #dddddd; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/tabs.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/tabs.css new file mode 100644 index 000000000..cc1500ea9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/tabs.css @@ -0,0 +1,377 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 0px 0px 0 0; + -webkit-border-radius: 0px 0px 0 0; + border-radius: 0px 0px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 0px 0px; + -webkit-border-radius: 0 0 0px 0px; + border-radius: 0 0 0px 0px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 0px 0px 0; + -webkit-border-radius: 0 0px 0px 0; + border-radius: 0 0px 0px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #ffffff url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #ffffff url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #E6E6E6; + color: #444; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #fff; + color: #777; +} +.tabs li a.tabs-inner { + color: #777; + background-color: #ffffff; +} +.tabs-header, +.tabs-tool { + background-color: #ffffff; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #ddd; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #E6E6E6; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #fff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #fff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #fff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #fff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #CCE6FF; + color: #000; + filter: none; + border-color: #ddd; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/tagbox.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/tagbox.css new file mode 100644 index 000000000..7c6fd15f8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + background: #E6E6E6; + color: #444; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/textbox.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/textbox.css new file mode 100644 index 000000000..55dc50348 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #ddd; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c4c4c4; + -moz-box-shadow: 0 0 3px 0 #ddd; + -webkit-box-shadow: 0 0 3px 0 #ddd; + box-shadow: 0 0 3px 0 #ddd; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/tooltip.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/tooltip.css new file mode 100644 index 000000000..21ae21180 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #fff; + border-color: #ddd; + color: #444; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #ddd; +} +.tooltip-right .tooltip-arrow { + border-right-color: #fff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #ddd; +} +.tooltip-left .tooltip-arrow { + border-left-color: #fff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #ddd; +} +.tooltip-top .tooltip-arrow { + border-top-color: #fff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #ddd; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #fff; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/tree.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/tree.css new file mode 100644 index 000000000..ab4efa62c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #ddd; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #fff; + color: #444; + border-color: #ddd; +} +.tree-node-hover { + background: #E6E6E6; + color: #444; +} +.tree-node-selected { + background: #CCE6FF; + color: #000; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/validatebox.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/validatebox.css new file mode 100644 index 000000000..1fc3ad64e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/metro/window.css b/testapps/GHIssues/src/main/resources/asset/themes/metro/window.css new file mode 100644 index 000000000..9602f67d1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/metro/window.css @@ -0,0 +1,182 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.window-shadow { + background: #eee; + -moz-box-shadow: 2px 2px 3px #ededed; + -webkit-box-shadow: 2px 2px 3px #ededed; + box-shadow: 2px 2px 3px #ededed; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #ddd; +} +.window { + background-color: #ffffff; +} +.window-proxy { + border: 1px dashed #ddd; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #ddd; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/GHIssues/src/main/resources/asset/themes/mobile.css b/testapps/GHIssues/src/main/resources/asset/themes/mobile.css new file mode 100644 index 000000000..ff5724521 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/mobile.css @@ -0,0 +1,355 @@ +*{ + box-sizing: border-box; +} +.m-toolbar{ + position: relative; + text-align: center; + min-height: 34px; +} +.m-toolbar .m-title{ + line-height: 34px; + font-size: 16px; + font-weight: bold; + text-align: center; +} +.m-left{ + position: absolute; + height: 100%; + vertical-align: middle; + top:0; + left:0; + z-index: 1; +} +.m-right{ + position: absolute; + height: 100%; + vertical-align: middle; + top:0; + right:0; + z-index: 1; +} +.m-left>.l-btn,.m-right>.l-btn, +.m-left>.switchbutton,.m-right>.switchbutton{ + position: relative; + vertical-align: top; + top: 50%; + margin-top: -15px; +} +.m-back::before,.m-next::after{ + display: inline-block; + box-sizing: border-box; + vertical-align: top; + border-style: solid; + -webkit-transform:rotate(45deg); + transform:rotate(45deg); + width: 12px; + height: 12px; + content: ''; + position: absolute; + top: 50%; + margin-top: -6px; +} +.m-back::before{ + border-width: 0 0 1px 1px; + left: 8px; +} +.m-next::after{ + border-width: 1px 1px 0 0; + right: 8px; +} +.m-back .l-btn-text{ + padding-left: 12px; +} +.m-next .l-btn-text{ + padding-right: 12px; +} +.m-buttongroup{ + display: inline-block; + margin: 0; + padding: 0; + overflow: hidden; + vertical-align: middle; +} +.m-buttongroup .l-btn{ + float: left; + margin-left: -1px; +} +.m-buttongroup .l-btn:last-child::after{ + content: ''; + clear: both; +} +.m-buttongroup .l-btn:not(:first-child):not(:last-child){ + border-radius: 0; +} +.m-buttongroup .l-btn:first-child{ + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-left: 0; +} +.m-buttongroup .l-btn:last-child{ + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.m-buttongroup-justified{ + display: table; + table-layout: fixed; +} +.m-buttongroup-justified .l-btn{ + float: none; + display: table-cell; +} +.m-badge:not(.l-btn), +.l-btn.m-badge::after{ + display: inline-block; + min-width: 10px; + line-height: 1; + font-size: 12px; + text-align: center; + white-space: nowrap; + border-radius: 10px; + padding: 2px 4px; + border-style: solid; + border-width: 0px; + background-color: #d9534f; + color: #fff; + z-index: 99999; +} +.l-btn.m-badge::after, +.l-btn .m-badge{ + position: absolute; + top: -10px; + right: -10px; +} +.tabs-inner .m-badge{ + position: absolute; + top: 1px; + right: -10px; +} +.tabs-inner>.tabs-title>.m-badge{ + top: 0; + right: 0; +} +.tabs-header-bottom .tabs-inner>.tabs-title>.m-badge{ + top: auto; + bottom: 0; + right: 0; +} +.panel-footer .l-btn .l-btn-icon-top .m-badge, +.panel-footer .l-btn .l-btn-icon-bottom .m-badge{ + top: 0; + right: -10px; +} +.l-btn.m-badge::after{ + content: attr(data-badge); +} +.l-btn,.l-btn-left{ + overflow: visible; + position: relative; +} + +.m-in{ + -webkit-animation-timing-function: ease-out; + -webkit-animation-duration: 250ms; +} +.m-out{ + -webkit-animation-timing-function: ease-in; + -webkit-animation-duration: 250ms; +} +.m-slide-left.m-in{ + -webkit-animation-name: slideLeftIn; +} +.m-slide-left.m-out{ + -webkit-animation-name: slideLeftOut; +} +.m-slide-right.m-in{ + -webkit-animation-name: slideRightIn; +} +.m-slide-right.m-out{ + -webkit-animation-name: slideRightOut; +} +.m-slide-up.m-in{ + -webkit-animation-name: slideUpIn; +} +.m-slide-up.m-out{ + -webkit-animation-name: slideUpOut; +} +.m-slide-down.m-in{ + -webkit-animation-name: slideDownIn; +} +.m-slide-down.m-out{ + -webkit-animation-name: slideDownOut; +} + +@-webkit-keyframes slideLeftIn{ + from {-webkit-transform: translateX(100%);} + to {-webkit-transform: translateX(0);} +} +@-webkit-keyframes slideLeftOut{ + from {-webkit-transform: translateX(0);} + to {-webkit-transform: translateX(-100%);} +} +@-webkit-keyframes slideRightIn{ + from {-webkit-transform: translateX(-100%);} + to {-webkit-transform: translateX(0);} +} +@-webkit-keyframes slideRightOut{ + from {-webkit-transform: translateX(0);} + to {-webkit-transform: translateX(100%);} +} +@-webkit-keyframes slideUpIn{ + from {-webkit-transform: translateY(100%);} + to {-webkit-transform: translateY(0);} +} +@-webkit-keyframes slideUpOut{ + from {-webkit-transform: translateY(0);} + to {-webkit-transform: translateY(-100%);} +} +@-webkit-keyframes slideDownIn{ + from {-webkit-transform: translateY(-100%);} + to {-webkit-transform: translateY(0);} +} +@-webkit-keyframes slideDownOut{ + from {-webkit-transform: translateY(0);} + to {-webkit-transform: translateY(100%);} +} + +.m-fade.m-in{ + -webkit-animation-name: fadeIn; +} +.m-fade.m-out{ + -webkit-animation-name: fadeOut; +} + +@-webkit-keyframes fadeIn{ + from {opacity: 0;} + to {opacity: 1} +} +@-webkit-keyframes fadeOut{ + from {opacity: 1;} + to {opacity: 0;} +} + +.m-pop.m-in{ + -webkit-animation-name: popIn; +} +.m-pop.m-out{ + -webkit-animation-name: popOut; +} +@-webkit-keyframes popIn{ + from { + opacity: 0; + -webkit-transform: scale(.2); + } + to { + opacity: 1; + -webkit-transform: scale(1); + } +} +@-webkit-keyframes popOut{ + from { + opacity: 1; + -webkit-transform: scale(1); + } + to { + opacity: 0; + -webkit-transform: scale(0); + } +} + +.navpanel{ + position: absolute; +} +.textbox .textbox-text{ + padding: 0 4px; + height: 30px; + line-height: 30px; +} +.calendar-header,.calendar-title{ + height: 30px; +} +.calendar-title span{ + height: 30px; + line-height: 30px +} +.datebox-button{ + height: 24px; +} +.datebox-button a{ + line-height: 24px; +} +.tree-node{ + box-sizing: border-box; + height: 32px; + padding: 3px 0; +} + +.panel-title{ + height: 26px; + line-height: 26px; +} +.window{ + padding: 5px 0 0 0; +} +.window-shadow{ + -moz-box-shadow: 0 0 30px 0 #D3D3D3; + -webkit-box-shadow: 0 0 30px 0 #D3D3D3; + box-shadow: 0 0 30px 0 #D3D3D3; +} +.window-header .panel-title{ + height: 26px; + line-height: 26px; + text-align: center; +} +.window-header .panel-tool{ + display: none; +} +.window .window-body{ + border: 0; +} +.dialog-button{ + border-color: transparent; + overflow: hidden; +} +.dialog-button .l-btn{ + margin: 0; +} + +.tabs-justified, +.tabs-justified .l-btn, +.tabs-justified li a.tabs-inner, +.tabs-justified li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs-justified li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs-justified li a.tabs-inner{ + -moz-border-radius:0; + -webkit-border-radius:0; + border-radius:0; +} + +.datagrid-row,.datagrid-header-row{ + height: 32px; +} +.datalist .datagrid-group-title, +.m-list .m-list-group{ + padding: 0 10px; +} +.datalist .datagrid-cell, +.m-list li{ + padding: 10px; +} +.m-list li .m-right{ + right: 10px; +} +.datalist .datalist-link, +.m-list li>a{ + margin: -10px; + padding: 10px; + padding-right: 24px; +} +.m-list li>a .m-right{ + right: 24px; +} +.datalist .datalist-link::after, +.m-list li>a::after{ + right: 12px; +} + diff --git a/testapps/GHIssues/src/main/resources/asset/themes/vue.css b/testapps/GHIssues/src/main/resources/asset/themes/vue.css new file mode 100644 index 000000000..da5e52cea --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/themes/vue.css @@ -0,0 +1,650 @@ +*{ + box-sizing: border-box; +} +.f-block{ + display: block; + position: relative; +} +.f-row{ + display: -webkit-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + position: relative; +} +.f-column{ + display: -webkit-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: vertical; + -webkit-flex-direction: column; + -moz-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + position: relative; +} +.f-inline-row{ + white-space: nowrap; + display: -webkit-inline-box; + display: -ms-inline-box; + display: inline-flex; + vertical-align: middle; + position: relative; + align-items: stretch; + -webkit-tap-highlight-color: transparent; +} +.f-content-center{ + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; +} +.f-full{ + -webkit-box-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} +.f-hide{ + display: none; +} +.f-order0{ + order: 0; +} +.f-order1{ + order: 1; +} +.f-order2{ + order: 2; +} +.f-order3{ + order: 3; +} +.f-order4{ + order: 4; +} +.f-order5{ + order: 5; +} +.f-order6{ + order: 6; +} +.f-order7{ + order: 7; +} +.f-order8{ + order: 8; +} +.f-noshrink{ + -webkit-flex-shrink: 0; + -moz-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.f-animate{ + transition: all .3s; +} +.f-field{ + width: 12em; + height: 30px; +} + +.scroll-body{ + overflow: auto; + position: relative; +} + +.textbox .textbox-text{ + width: 100%; + height: auto; + overflow: hidden; +} +.textbox-addon{ + align-items: center; +} +.textbox textarea.textbox-text{ + height: auto; + overflow: auto; +} +.textbox-disabled>.textbox-addon .textbox-icon, +.textbox-readonly>.textbox-addon .textbox-icon{ + cursor: default; +} +.textbox-disabled>.textbox-addon .textbox-icon:hover, +.textbox-readonly>.textbox-addon .textbox-icon:hover{ + opacity: 0.6; + cursor: default; +} +.textbox-addon .textbox-icon{ + width: 26px; + height: 18px; +} + +.spinner .textbox-text{ + height: auto; +} +.spinner-button-left,.spinner-button-right{ + width: 26px; +} +.spinner-button-updown{ + width: 26px; +} +.spinner-button-top,.spinner-button-bottom{ + position: absolute; + width: 100%; + height: 26px; +} +.spinner-button-top{ + top: 0; +} +.spinner-button-bottom{ + top: auto; + bottom: 0; +} +.spinner-button{ + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.spinner-arrow{ + cursor: pointer; + opacity: 0.6; +} + +.textbox-disabled .spinner-arrow:hover, +.textbox-readonly .spinner-arrow:hover +{ + opacity: 0.6; + cursor: default; +} +.textbox-readonly .spinner-arrow .spinner-arrow-up:hover, +.textbox-disabled .spinner-arrow .spinner-arrow-up:hover, +.textbox-readonly .spinner-arrow .spinner-arrow-down:hover, +.textbox-disabled .spinner-arrow .spinner-arrow-down:hover +{ + cursor: default; +} + +.l-btn{ + width1: 100%; +} +.l-btn-empty{ + height: 28px; +} +.l-btn-large .l-btn-empty{ + height: 44px; +} +.l-btn-left{ + overflow: visible; +} +.m-btn .l-btn-left .m-btn-line{ + top: -100px; + width: 36px; + right: -20px; +} +.button-group .l-btn.f-inline-row{ + margin-left: -1px; +} +.button-group .l-btn:hover{ + z-index: 99; +} +.button-group .l-btn:not(:first-child):not(:last-child){ + border-radius: 0; +} +.button-group .l-btn:first-child{ + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.button-group .l-btn:last-child{ + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.switchbutton{ + width: 70px; + height: 30px; +} +.switchbutton-on,.switchbutton-off{ + position: absolute; + left: 0; + width: calc(100% - 15px); + height: 100%; +} +.switchbutton-on span,.switchbutton-off span,.switchbutton-handle span{ + height: 100%; +} +.switchbutton-on span{ + text-indent: -15px; +} +.switchbutton-off span{ + text-indent: 15px; +} +.switchbutton-off{ + left: calc(100% - 15px); +} +.switchbutton-handle{ + width: 30px; + left: auto; + right: 0; + z-index: 9; +} +.switchbutton-inner{ + transition: all 200ms ease-out; + overflow: visible; + position: absolute; + width: 100%; + top: -1px; + bottom: -1px; + left: calc(-100% + 30px); + right: auto; +} +.switchbutton-checked .switchbutton-inner{ + left: 0; +} +.draggable-reverting{ + transition: all 200ms ease-out; +} +.slider-h .slider-tip{ + transform: translateX(-50%); +} +.slider-h .slider-rulelabel span{ + transform: translateX(-50%); +} +.slider-v .slider-tip{ + margin-top: 0; + transform: translate(-100%,-50%); +} +.slider-v .slider-rulelabel span{ + transform: translateY(-50%); +} +.slider-v .slider-inner{ + height: auto; +} + + +.panel{ + position:relative; +} +.panel-title{ + height: 20px; + line-height: 20px; +} +.panel-footer-fixed{ + position:absolute; + width:100%; + bottom:0; +} +.window{ + position: absolute; +} +.window-mask{ + position: fixed; +} +.window .window-footer{ + top: 0; +} +.dialog-toolbar{ + border-width: 0 0 1px 0; +} +.dialog-button{ + border-width: 1px 0 0 0; + top: 0; +} + +.tabs{ + width: 100%; + height: auto; +} +.tabs-scrollable{ + transition: left 400ms, right 400ms; + position: absolute; + width: auto; + height: 100%; + left: 0; + top: 0; +} +.tabs li{ + display: inherit; +} +.tabs li a.tabs-inner{ + height: auto; + line-height: normal; + display: inherit; + overflow: hidden; +} +.tabs-title{ + display: inherit; + align-items: center; + line-height: normal; +} +.tabs-close{ + outline: none; +} +.tabs-scroller-left,.tabs-scroller-right{ + position: relative; + display: block; + width: 21px; + height: 100%; +} +.tabs-header-left .tabs li{ + right: -1px; +} +.tabs-header-left .tabs li,.tabs-header-right .tabs li, +.tabs-header-left .tabs li a.tabs-inner, +.tabs-header-right .tabs li a.tabs-inner{ + display: inherit; +} + +.combo-panel{ + position: absolute; + height: 200px; + z-index: 9999; +} +.combo-panel eui-virtual-scroll, +.combo-panel eui-datagrid, +.combo-panel eui-treegrid{ + width: 100%; + height: 100%; +} +.combobox-item{ + padding: 6px 4px; + line-height: 20px; +} +.tagbox-labels{ + padding-bottom: 4px; +} +.tagbox-label{ + height: 20px; + line-height: 20px; +} +.tagbox .textbox-text{ + width: 50px; + max-width: 100%; + margin-top: 4px; + padding-top: 0; + padding-bottom: 0; + height: 20px; + line-height: 20px; +} + +.datagrid,eui-datagrid, +eui-datagrid-view,eui-datagrid-body, +eui-treegrid-view,eui-treegrid-body{ + overflow: hidden; +} +.datagrid-view,.datagrid-view1,.datagrid-view2{ + position: relative; +} +.datagrid-vbody{ + overflow: hidden; +} +.datagrid-view3{ + margin-left: -1px; +} +.datagrid-view3 .datagrid-body{ + overflow: hidden; +} +.datagrid-view3 .datagrid-body-inner{ + padding-bottom: 20px; +} +.datagrid-view3 .datagrid-header td, +.datagrid-view3 .datagrid-body td, +.datagrid-view3 .datagrid-footer td { + border-width: 0 0 1px 1px; +} +.datagrid-htable,.datagrid-btable,.datagrid-ftable{ + table-layout: fixed; + width: 100%; +} +.datagrid-htable{ + height: 100%; +} +.datagrid-header .datagrid-header, +.datagrid-footer .datagrid-header{ + border-width: 0 0 0 1px; +} +.datagrid-header-inner,.datagrid-footer-inner{ + overflow: hidden; +} +.datagrid-header-row, .datagrid-row{ + height: 32px; +} +.datagrid-header td.datagrid-field-td{ + border-bottom: 0; +} +.datagrid-cell{ + text-align: left; + height: auto; + font-size: inherit; +} +.datagrid-cell-group{ + text-align: center; +} +.datagrid .datagrid-pager{ + padding: 2px 4px; + display: inherit; +} +.datagrid-loading{ + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + justify-content: center; + align-items: center; +} +.datagrid-mask{ + display: block; +} +.datagrid-mask-msg{ + display: block; + position: static; + line-height: 36px; + height: 40px; + margin: 0; + padding: 0 5px 0 30px; + z-index: 9; +} +.datagrid-body .datagrid-td-group{ + border-left-color: transparent; + border-right-color: transparent; +} +.datagrid-group-expander{ + cursor: pointer; +} +.datagrid-row-expander{ + display: inline-block; + width: 16px; + height: 18px; + cursor: pointer; +} +.datagrid-group-title{ + align-self: center; + padding: 0 4px; + white-space: nowrap; + word-break: normal; + position: relative; +} +.datagrid-editable> .f-field, +.datagrid-editable> *{ + width: 100%; + height: 31px; +} +.datagrid-editable .textbox, .datagrid-editable .textbox-text{ + border-radius: 0; +} +.datagrid-filter-row .textbox{ + border-radius: 0; +} +.datagrid-filter-c{ + padding: 4px; + height: 38px; +} +.datagrid-filter-c> .f-field, +.datagrid-filter-c> *{ + height: 30px; +} +.datagrid-filter-c .datagrid-editable-input{ + width: 100%; +} +.datagrid-filter-btn{ + width: 30px; +} +.datagrid-filter-btn .textbox-icon{ + width: 28px; +} +.datagrid-filter-btn .textbox{ + background-color: transparent; +} +.datagrid-filter-btn-left{ + margin-right: 4px; +} +.datagrid-filter-btn-right{ + margin-left: 4px; +} + +.menu-inline{ + position: relative; + display: inline; + margin: 0; + padding: 0; +} +.menu-inline> .menu-container{ + position: relative; +} +.menu-container{ + position: absolute; + left: 0; + top: 0; + min-width: 200px; +} +.menu{ + overflow: visible; +} +.menu-shadow{ + width: 100%; + height: 100%; + left: 0; + top: 0; +} +.menu-item{ + overflow: visible; +} +.menu-text{ + height: 32px; + line-height: 32px; + float: none; +} +.menu-line{ + z-index: 9999999; + height: 100%; +} +.menu-active{ + z-index: 99999999; +} + +.progressbar-value{ + overflow: visible; +} + +.searchbox .textbox-button, +.searchbox .textbox-button:hover{ + position: inherit; +} + +.calendar-content{ + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; +} +.calendar-menu{ + position: absolute; + width: 100%; + height: 100%; +} +.calendar-menu-month-inner{ + position: relative; +} + +eui-tagbox{ + width: 12em; + height: auto; + min-height: 30px; +} +eui-switchbutton{ + width: 70px; + height: 30px; +} +.radiobutton{ + width: 20px; + height: 20px; +} +.checkbox{ + width: 20px; + height: 20px; +} +.progressbar{ + height: 24px; +} +.pagination1{ + height: 34px; + padding: 2px; +} +eui-layout{ + display: block; +} +.layout{ + height: 100%; +} +.layout-animate{ + transition: transform 400ms; +} +.layout-panel-north,.layout-panel-south{ + position: absolute; + width: 100%; + left: 0; + top: 0; +} +.layout-panel-south{ + top: auto; + bottom: 0; +} +.layout-panel-west,.layout-panel-east{ + position: absolute; + left: 0; + top: 0; + bottom: 0; +} +.layout-panel-east{ + left: auto; + right: 0; +} +.layout-panel-west.layout-collapsed{ + transform: translate3d(-100%, 0, 0); +} +.layout-panel-east.layout-collapsed{ + transform: translate3d(100%, 0, 0) +} +.layout-panel-north.layout-collapsed{ + transform: translate3d(0, -100%, 0) +} +.layout-panel-south.layout-collapsed{ + transform: translate3d(0, 100%, 0) +} + diff --git a/testapps/GHIssues/src/main/resources/com/mycom/helloworld/.version b/testapps/GHIssues/src/main/resources/com/mycom/helloworld/.version new file mode 100644 index 000000000..ea0c26126 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/com/mycom/helloworld/.version @@ -0,0 +1,3 @@ +artifact=${project.artifactId} +version=${project.version} +build=${buildNumber} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/conf/app.properties b/testapps/GHIssues/src/main/resources/conf/app.properties new file mode 100644 index 000000000..7612bb6a7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/conf/app.properties @@ -0,0 +1,800 @@ +############################################## +# Application configuration +# act-1.8.8-RC12-SNAPSHOT +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy年MM月dd日 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy年MM月dd日 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=xcgXKMICkvZ3k3uLj2AIiarXjLt2Lr6nHzvkBs9o1a9eKyspfvSd1eKYYSYNAhu8 + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GHIssues/src/main/resources/conf/prod/app.properties b/testapps/GHIssues/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..5f0017b9a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC12-SNAPSHOT +############################################## +act.secret=clypiSZ9qOFMZ8JgAdutcvPctiPYRhC4HFkjcvwhf9j3YQrAUxAx9cUL0FzmnlRB \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/conf/uat/app.properties b/testapps/GHIssues/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..844739167 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC12-SNAPSHOT +############################################## +act.secret=AkrRnS5yuyq98LmEBRwoQom9nCIj8oLlXEKRUjXiBlbjPc0phCf7VL3yJOJqjjbC \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios.yml new file mode 100644 index 000000000..896de2635 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/e2e/scenarios.yml @@ -0,0 +1,16 @@ +Scenario: + interactions: + - description: GH784 + request: + get: 784 + response: + json: + result: + - gt: -2147483648 + - description: GH785 + request: + get: 785 + response: + json: + result: + - neq: 0 \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/logback.xml b/testapps/GHIssues/src/main/resources/logback.xml new file mode 100644 index 000000000..6b65d6b02 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GHIssues/src/main/resources/rythm/com/mycom/helloworld/AppEntry/home.html b/testapps/GHIssues/src/main/resources/rythm/com/mycom/helloworld/AppEntry/home.html new file mode 100644 index 000000000..52a6b6e83 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/rythm/com/mycom/helloworld/AppEntry/home.html @@ -0,0 +1,13 @@ + + +@args String who + + Hello World - ActFramework + + +

                                                        Hi @who

                                                        +

                                                        + Powered by ActFramework @act.Act.VERSION.getVersion() +

                                                        + + From 69be314c0988e475d982ed57d6ff17de393449a9 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 14 Aug 2018 11:49:38 +1000 Subject: [PATCH 055/730] fix #786 --- CHANGELOG.md | 1 + .../java/act/util/ClassInfoRepository.java | 8 ++++ .../java/act/util/DataObjectEnhancer.java | 24 ++++++++-- .../src/main/java/ghissues/Gh785.java | 21 --------- .../src/main/java/ghissues/Gh786.java | 47 +++++++++++++++++++ .../src/main/resources/e2e/scenarios.yml | 13 +++-- 6 files changed, 85 insertions(+), 29 deletions(-) delete mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh785.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh786.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 00a62e527..98ba5ec5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `@Data` enhancement shall call super by default for Map/AdaptiveMap types #786 * Add `notEqual` e2e verifier #785 * Add `attachmentName()` method to `ActionContext` #783 * Extend View framework to support direct rendering of non-text content without template #782 diff --git a/src/main/java/act/util/ClassInfoRepository.java b/src/main/java/act/util/ClassInfoRepository.java index a7c67bf19..2641eda07 100644 --- a/src/main/java/act/util/ClassInfoRepository.java +++ b/src/main/java/act/util/ClassInfoRepository.java @@ -75,6 +75,14 @@ public ClassNode node(String name, String canonicalName) { return node; } + public ClassNode findNode(Class type) { + return classes.get(canonicalName(type.getName())); + } + + public ClassNode findNode(String typeName) { + return classes.get(canonicalName(typeName)); + } + public boolean isEmpty() { return classes.isEmpty(); } diff --git a/src/main/java/act/util/DataObjectEnhancer.java b/src/main/java/act/util/DataObjectEnhancer.java index 6e41dbb37..2a82c5161 100644 --- a/src/main/java/act/util/DataObjectEnhancer.java +++ b/src/main/java/act/util/DataObjectEnhancer.java @@ -20,13 +20,14 @@ * #L% */ +import act.Act; import act.asm.*; import act.data.annotation.Data; import org.osgl.$; -import org.osgl.util.FastStr; -import org.osgl.util.S; +import org.osgl.util.*; import java.util.List; +import java.util.Map; /** * A tool to enhance a object by generating common {@link Object} @@ -158,7 +159,7 @@ private void generateEqualsMethod() { mv.visitTypeInsn(CHECKCAST, hostInternalName); mv.visitVarInsn(ASTORE, 2); // store cast object to that // should we check super result? - if (metaInfo.shouldCallSuper()) { + if (shouldCallSuper()) { mv.visitVarInsn(ALOAD, 0); // load this mv.visitVarInsn(ALOAD, 2); // load that mv.visitMethodInsn(INVOKESPECIAL, metaInfo.superType().getInternalName(), "equals", "(Ljava/lang/Object;)Z", false); @@ -200,7 +201,7 @@ private void generateHashCodeMethod() { cnt++; } } - if (metaInfo.shouldCallSuper()) { + if (shouldCallSuper()) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, metaInfo.superType().getInternalName(), "hashCode", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); @@ -222,7 +223,7 @@ private void generateHashCodeMethod() { mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z", true); mv.visitInsn(POP); } - if (metaInfo.shouldCallSuper()) { + if (shouldCallSuper()) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, metaInfo.superType().getInternalName(), "hashCode", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); @@ -235,6 +236,19 @@ private void generateHashCodeMethod() { } } + private boolean shouldCallSuper() { + if (metaInfo.shouldCallSuper()) { + return true; + } + try { + ClassNode myNode = Act.app().classLoader().classInfoRepository().findNode(metaInfo.type().getClassName()); + return myNode.hasInterface(Map.class.getName()) || myNode.hasInterface(AdaptiveMap.class.getName()); + } catch (NullPointerException e) { + // ignore the error in unit test + return false; + } + } + static MethodVisitor equalsMethodBegin(ClassVisitor cw) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null); mv.visitCode(); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh785.java b/testapps/GHIssues/src/main/java/ghissues/Gh785.java deleted file mode 100644 index 0328c77bb..000000000 --- a/testapps/GHIssues/src/main/java/ghissues/Gh785.java +++ /dev/null @@ -1,21 +0,0 @@ -package ghissues; - -import act.data.annotation.Data; -import act.util.AdaptiveBean; -import org.osgl.mvc.annotation.GetAction; - -public class Gh785 { - - @Data - public static class Foo extends AdaptiveBean {} - - @GetAction("785") - public int test() { - Foo f1 = new Foo(); - f1.putValue("id", 123); - Foo f2 = new Foo(); - f2.putValue("id", 246); - return f1.hashCode() - f2.hashCode(); - } - -} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh786.java b/testapps/GHIssues/src/main/java/ghissues/Gh786.java new file mode 100644 index 000000000..ec5ebe588 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh786.java @@ -0,0 +1,47 @@ +package ghissues; + +import act.data.annotation.Data; +import act.util.AdaptiveBean; +import act.util.LogSupport; +import org.osgl.mvc.annotation.GetAction; + +public class Gh786 extends LogSupport { + + @Data + public static class FooBase { + public int n = 10; + } + + @Data + public static class BarBase { + public int n = -9; + } + + @Data(callSuper = true) + public static class Foo extends FooBase { + } + + @Data(callSuper = true) + public static class Bar extends BarBase { + } + + @GetAction("786/a") + public int testA() { + Foo foo = new Foo(); + Bar bar = new Bar(); + return foo.hashCode() - bar.hashCode(); + } + + @Data + public static class MyRecord extends AdaptiveBean {} + + @GetAction("786/b") + public int testB() { + MyRecord r1 = new MyRecord(); + r1.putValue("foo", 1); + MyRecord r2 = new MyRecord(); + r2.putValue("foo", 2); + return r1.hashCode() - r2.hashCode(); + } + +} diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios.yml index 896de2635..b11bb581b 100644 --- a/testapps/GHIssues/src/main/resources/e2e/scenarios.yml +++ b/testapps/GHIssues/src/main/resources/e2e/scenarios.yml @@ -7,10 +7,17 @@ Scenario: json: result: - gt: -2147483648 - - description: GH785 + - description: GH786 - test case A - app shall specify call super request: - get: 785 + get: 786/a response: json: result: - - neq: 0 \ No newline at end of file + - neq: 0 + - description: GH786 - test case B - app shall not be forced to specify call super + request: + get: 786/b + response: + json: + result: + - neq: 0 \ No newline at end of file From 7d3682e33f39a235a13b68abd51817572fe27040 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 14 Aug 2018 12:01:06 +1000 Subject: [PATCH 056/730] update GH verification app --- .../GHIssues/src/main/java/ghissues/Gh786.java | 8 ++++---- .../src/main/resources/e2e/scenarios.yml | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh786.java b/testapps/GHIssues/src/main/java/ghissues/Gh786.java index ec5ebe588..1230be8f7 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh786.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh786.java @@ -26,22 +26,22 @@ public static class Bar extends BarBase { } @GetAction("786/a") - public int testA() { + public boolean testA() { Foo foo = new Foo(); Bar bar = new Bar(); - return foo.hashCode() - bar.hashCode(); + return foo.hashCode() == bar.hashCode(); } @Data public static class MyRecord extends AdaptiveBean {} @GetAction("786/b") - public int testB() { + public boolean testB() { MyRecord r1 = new MyRecord(); r1.putValue("foo", 1); MyRecord r2 = new MyRecord(); r2.putValue("foo", 2); - return r1.hashCode() - r2.hashCode(); + return r1.hashCode() == r2.hashCode(); } } diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios.yml index b11bb581b..03d55eca2 100644 --- a/testapps/GHIssues/src/main/resources/e2e/scenarios.yml +++ b/testapps/GHIssues/src/main/resources/e2e/scenarios.yml @@ -1,23 +1,23 @@ -Scenario: +Scenario(GH784): interactions: - - description: GH784 + - description: test request: get: 784 response: json: result: - - gt: -2147483648 - - description: GH786 - test case A - app shall specify call super + - ne: 0 +Scenario(GH786): + interactions: + - description: test case A - app shall specify call super request: get: 786/a response: json: - result: - - neq: 0 - - description: GH786 - test case B - app shall not be forced to specify call super + result: false + - description: test case B - app shall not be forced to specify call super request: get: 786/b response: json: - result: - - neq: 0 \ No newline at end of file + result: false \ No newline at end of file From 82915836a9f2df29c04cfd4b9365908a94b2d753 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 14 Aug 2018 20:22:35 +1000 Subject: [PATCH 057/730] fix #788, #787 --- CHANGELOG.md | 5 +++- src/main/java/act/e2e/Scenario.java | 22 +++++++++++------- src/main/java/act/e2e/util/YamlLoader.java | 6 +++++ .../src/main/resources/e2e/scenarios.yml | 23 ------------------- .../src/main/resources/e2e/scenarios/784.yml | 9 ++++++++ .../src/main/resources/e2e/scenarios/786.yml | 14 +++++++++++ .../e2e/scenarios/787-left-as-blank.yml | 0 7 files changed, 47 insertions(+), 32 deletions(-) delete mode 100644 testapps/GHIssues/src/main/resources/e2e/scenarios.yml create mode 100644 testapps/GHIssues/src/main/resources/e2e/scenarios/784.yml create mode 100644 testapps/GHIssues/src/main/resources/e2e/scenarios/786.yml create mode 100644 testapps/GHIssues/src/main/resources/e2e/scenarios/787-left-as-blank.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 98ba5ec5e..064292e00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,11 @@ # ActFramework Change Log **1.8.8** -* `@Data` enhancement shall call super by default for Map/AdaptiveMap types #786 +* e2e - support embed function in string for constant definition #788 +* Empty `scenario.yml` file caused `NullPointerException` #787 +* `@Data` enhancement shall call super by defau lt for Map/AdaptiveMap types #786 * Add `notEqual` e2e verifier #785 +* `@Data` enhancement error when Model class has no fields #784 * Add `attachmentName()` method to `ActionContext` #783 * Extend View framework to support direct rendering of non-text content without template #782 * `java.util.NoSuchElementException: null` issue when force respond `csv` type #781 diff --git a/src/main/java/act/e2e/Scenario.java b/src/main/java/act/e2e/Scenario.java index ff9ffd68b..3a22423cb 100644 --- a/src/main/java/act/e2e/Scenario.java +++ b/src/main/java/act/e2e/Scenario.java @@ -300,6 +300,8 @@ private void processConstants() { if (sVal.startsWith("${")) { String expr = S.strip(sVal).of("${", "}"); value = eval(expr); + } else if (sVal.contains("${")) { + value = processStringSubstitution(sVal); } String key = entry.getKey(); constants.remove(key); @@ -846,14 +848,18 @@ private String processStringSubstitution(String s) { a = n; E.illegalArgumentIf(n < -1, "Invalid string: " + s); String part = s.substring(z + 2, a); - String key = part; - String payload = ""; - if (part.contains(":")) { - S.Binary binary = S.binarySplit(part, ':'); - key = binary.first(); - payload = binary.second(); - } - buf.append(getVal(key, payload)); + if (part.contains("(") && part.endsWith(")")) { + buf.append(evalFunc(part)); + } else { + String key = part; + String payload = ""; + if (part.contains(":")) { + S.Binary binary = S.binarySplit(part, ':'); + key = binary.first(); + payload = binary.second(); + } + buf.append(getVal(key, payload)); + } n = s.indexOf("${", a); if (n < 0) { buf.append(s.substring(a + 1)); diff --git a/src/main/java/act/e2e/util/YamlLoader.java b/src/main/java/act/e2e/util/YamlLoader.java index 7300abae9..fe03a4f7b 100644 --- a/src/main/java/act/e2e/util/YamlLoader.java +++ b/src/main/java/act/e2e/util/YamlLoader.java @@ -129,7 +129,13 @@ public Map loadFixture(String fixtureName, DaoLocator daoLocator * @return the loaded data mapped to name */ public Map parse(String yaml, DaoLocator daoLocator) { + if (S.blank(yaml)) { + return C.Map(); + } Object o = new Yaml().load(yaml); + if (null == o) { + return C.Map(); + } Map> objects = $.cast(o); resolveConstants(objects); Map> mapCache = C.newMap(); diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios.yml deleted file mode 100644 index 03d55eca2..000000000 --- a/testapps/GHIssues/src/main/resources/e2e/scenarios.yml +++ /dev/null @@ -1,23 +0,0 @@ -Scenario(GH784): - interactions: - - description: test - request: - get: 784 - response: - json: - result: - - ne: 0 -Scenario(GH786): - interactions: - - description: test case A - app shall specify call super - request: - get: 786/a - response: - json: - result: false - - description: test case B - app shall not be forced to specify call super - request: - get: 786/b - response: - json: - result: false \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/784.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios/784.yml new file mode 100644 index 000000000..5485f24e4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/e2e/scenarios/784.yml @@ -0,0 +1,9 @@ +Scenario(GH784): + interactions: + - description: test + request: + get: 784 + response: + json: + result: + - ne: 0 diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/786.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios/786.yml new file mode 100644 index 000000000..ca2058c93 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/e2e/scenarios/786.yml @@ -0,0 +1,14 @@ +Scenario(GH786): + interactions: + - description: test case A - app shall specify call super + request: + get: 786/a + response: + json: + result: false + - description: test case B - app shall not be forced to specify call super + request: + get: 786/b + response: + json: + result: false \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/787-left-as-blank.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios/787-left-as-blank.yml new file mode 100644 index 000000000..e69de29bb From 10c8616c19a2ce138be179e22780a9eab4788f33 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 15 Aug 2018 08:32:29 +1000 Subject: [PATCH 058/730] fix #789 --- CHANGELOG.md | 1 + src/main/java/act/e2e/E2E.java | 2 + src/main/java/act/e2e/Interaction.java | 30 ++++-- src/main/java/act/e2e/RequestSpec.java | 7 ++ src/main/java/act/e2e/Scenario.java | 31 +++++- src/main/java/act/e2e/func/Func.java | 74 +++++++++++++- .../java/act/e2e/inbox/ImapInboxReader.java | 97 +++++++++++++++++++ src/main/java/act/e2e/inbox/Inbox.java | 62 ++++++++++++ src/main/resources/act.scan.list | 1 + 9 files changed, 287 insertions(+), 18 deletions(-) create mode 100644 src/main/java/act/e2e/inbox/ImapInboxReader.java create mode 100644 src/main/java/act/e2e/inbox/Inbox.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 064292e00..2c866a371 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* e2e - support email content verification #789 * e2e - support embed function in string for constant definition #788 * Empty `scenario.yml` file caused `NullPointerException` #787 * `@Data` enhancement shall call super by defau lt for Map/AdaptiveMap types #786 diff --git a/src/main/java/act/e2e/E2E.java b/src/main/java/act/e2e/E2E.java index 9afe9d1b2..5023cb429 100644 --- a/src/main/java/act/e2e/E2E.java +++ b/src/main/java/act/e2e/E2E.java @@ -23,6 +23,7 @@ import act.Act; import act.app.App; import act.app.DbServiceManager; +import act.app.conf.AutoConfig; import act.db.Dao; import act.db.DbService; import act.e2e.func.Func; @@ -49,6 +50,7 @@ @Env.RequireMode(Act.Mode.DEV) public class E2E extends LogSupport { + static final Logger LOGGER = LogManager.get(E2E.class); private static final AtomicBoolean STARTED = new AtomicBoolean(false); diff --git a/src/main/java/act/e2e/Interaction.java b/src/main/java/act/e2e/Interaction.java index c7be6b2f6..72525eafa 100644 --- a/src/main/java/act/e2e/Interaction.java +++ b/src/main/java/act/e2e/Interaction.java @@ -23,18 +23,15 @@ import static act.e2e.E2EStatus.PENDING; import static act.e2e.util.ErrorMessage.error; +import act.Act; +import act.e2e.inbox.Inbox; import act.e2e.macro.Macro; import okhttp3.Response; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; -import org.osgl.util.E; -import org.osgl.util.IO; -import org.osgl.util.S; +import org.osgl.util.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class Interaction implements ScenarioPart { public List preActions = new ArrayList<>(); @@ -42,7 +39,7 @@ public class Interaction implements ScenarioPart { public RequestSpec request; public ResponseSpec response; public List postActions = new ArrayList<>(); - public Map cache = new HashMap<>(); + public Map cache = new LinkedHashMap<>(); public String errorMessage; public Throwable cause; public E2EStatus status = PENDING; @@ -70,6 +67,7 @@ public boolean run() { status = E2EStatus.of(pass); return pass; } + public String causeStackTrace() { return null == cause ? null: E.stackTrace(cause); } @@ -82,8 +80,12 @@ private void reset() { private boolean verify() { Response resp = null; try { - resp = Scenario.get().sendRequest(request); - doVerify(resp); + if (S.notBlank(request.email)) { + doVerifyEmail(request.email); + } else { + resp = Scenario.get().sendRequest(request); + doVerify(resp); + } return true; } catch (Exception e) { errorMessage = e.getMessage(); @@ -103,6 +105,14 @@ private void doVerify(Response resp) throws Exception { verifyBody(resp); } + private void doVerifyEmail(String email) throws Exception { + email = Scenario.get().processStringSubstitution(email); + Inbox inbox = Act.getInstance(Inbox.class); + Inbox.Reader reader = inbox.getReader(); + String content = reader.readLatest(email); + Scenario.get().verifyBody(content, response); + } + private boolean run(List macros) { for (Macro macro : macros) { boolean okay = run(macro); diff --git a/src/main/java/act/e2e/RequestSpec.java b/src/main/java/act/e2e/RequestSpec.java index ce9790a5e..1e2894d8c 100644 --- a/src/main/java/act/e2e/RequestSpec.java +++ b/src/main/java/act/e2e/RequestSpec.java @@ -49,6 +49,10 @@ public class RequestSpec implements InteractionPart { public String put; // shortcut for (DELETE, url) pair public String delete; + + // specify the email for inbox verification + public String email; + public String accept; public Boolean ajax; public List modifiers = new ArrayList<>(); @@ -85,6 +89,9 @@ public void resolveParent(RequestTemplateManager manager) { @Override public void validate(Interaction interaction) throws UnexpectedException { + if (S.notBlank(email)) { + return; + } if (S.notBlank(get)) { method = H.Method.GET; url = get; diff --git a/src/main/java/act/e2e/Scenario.java b/src/main/java/act/e2e/Scenario.java index 3a22423cb..09fb36dbf 100644 --- a/src/main/java/act/e2e/Scenario.java +++ b/src/main/java/act/e2e/Scenario.java @@ -330,7 +330,7 @@ private Object evalFunc(String funcExpr) { if (S.notBlank(paramStr)) { vals = C.newList(S.fastSplit(paramStr, ",")); for (int i = 0; i < vals.size(); ++i) { - String val = vals.get(i).trim(); + String val = S.ensure(vals.get(i).trim()).strippedOff(S.DOUBLE_QUOTES); val = processStringSubstitution(val); vals.set(i, val); } @@ -479,7 +479,7 @@ private boolean run(Interaction interaction) { for (Map.Entry entry : interaction.cache.entrySet()) { String ref = entry.getValue(); - Object value = getLastVal(ref); + Object value = ref.contains("${") ? processStringSubstitution(ref) : getLastVal(ref); if (null != value) { cache.put(entry.getKey(), value); } @@ -807,7 +807,25 @@ private Verifier tryLoadVerifier(String name) { private Object getVal(String key, String ref) { Object stuff = getVal(key); - return S.blank(ref) ? stuff : JSONTraverser.traverse(stuff, ref); + if (S.blank(ref) || null == stuff) { + return stuff; + } + if (stuff instanceof String) { + String str = $.cast(stuff); + if (str.contains("<") && str.contains(">")) { + // try get html element + try { + Document doc = Jsoup.parse(str, S.concat("http://localhost:", port, "/")); + Elements elements = doc.select(ref); + if (elements.size() != 0) { + return elements.get(0).text(); + } + } catch (Exception e) { + // just ignore + } + } + } + return JSONTraverser.traverse(stuff, ref); } private Object getVal(String key) { @@ -834,11 +852,16 @@ private Object getVal(String key) { } } - private String processStringSubstitution(String s) { + String processStringSubstitution(String s) { int n = s.indexOf("${"); if (n < 0) { return s; } + if (n == 0 && s.endsWith(")}")) { + s = s.substring(2); + s = s.substring(0, s.length() - 1); + return S.string(evalFunc(s)); + } int a = 0; int z = n; S.Buffer buf = S.buffer(); diff --git a/src/main/java/act/e2e/func/Func.java b/src/main/java/act/e2e/func/Func.java index ac4b20792..1753101f4 100644 --- a/src/main/java/act/e2e/func/Func.java +++ b/src/main/java/act/e2e/func/Func.java @@ -20,12 +20,11 @@ * #L% */ +import act.Act; +import act.e2e.inbox.Inbox; import act.e2e.util.NamedLogic; import org.osgl.$; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.N; -import org.osgl.util.S; +import org.osgl.util.*; import org.osgl.util.converter.TypeConverterRegistry; import java.util.List; @@ -39,6 +38,73 @@ protected Class type() { public abstract Object apply(); + public static class VerifiableEmail extends Func { + @Override + public Object apply() { + String email = Act.getInstance(Inbox.class).account; + S.Pair pair = S.binarySplit(email, '@'); + String username = pair.left(); + return S.concat(username, "+", S.random(N.randInt(5) + 2), "@", pair.right()); + } + + @Override + protected List aliases() { + return C.list("checkableEmail"); + } + } + + + public static class AfterLast extends Func { + + private String retVal; + + @Override + public void init(Object param) { + E.illegalArgumentIfNot(param instanceof List, "2 parameters expected for afterLast function"); + List list = (List) param; + E.illegalArgumentIfNot(list.size() == 2, "2 parameters expected for afterLast function"); + String targetStr = list.get(0); + String search = list.get(1); + retVal = S.cut(targetStr).afterLast(search); + } + + @Override + public Object apply() { + return retVal; + } + + @Override + protected List aliases() { + return C.list("after"); + } + } + + public static class BeforeFirst extends Func { + + private String retVal; + + @Override + public void init(Object param) { + E.illegalArgumentIfNot(param instanceof List, "2 parameters expected for beforeFirst function"); + List list = (List) param; + E.illegalArgumentIfNot(list.size() == 2, "2 parameters expected for beforeFirst function"); + String targetStr = list.get(0); + String search = list.get(1); + retVal = S.cut(targetStr).beforeFirst(search); + } + + @Override + public Object apply() { + return retVal; + } + + @Override + protected List aliases() { + return C.list("before"); + } + } + + /** * Apply subString function to given string. * diff --git a/src/main/java/act/e2e/inbox/ImapInboxReader.java b/src/main/java/act/e2e/inbox/ImapInboxReader.java new file mode 100644 index 000000000..fe9d0db74 --- /dev/null +++ b/src/main/java/act/e2e/inbox/ImapInboxReader.java @@ -0,0 +1,97 @@ +package act.e2e.inbox; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import org.osgl.util.*; + +import java.io.IOException; +import java.util.*; +import javax.mail.*; +import javax.mail.search.FlagTerm; + +public class ImapInboxReader implements Inbox.Reader { + + private static final Set candidateFolderNames = C.set("inbox", "junk", "spam"); + + @Override + public String readLatest(String email) throws MessagingException, IOException { + final Inbox inbox = Act.getInstance(Inbox.class); + String protocol="imaps"; + Properties props = new Properties(); + props.setProperty("mail.store.protocol", protocol); + + props.setProperty("mail.imaps.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + props.setProperty("mail.imaps.socketFactory.fallback", "false"); + props.setProperty("mail.imaps.port", S.string(inbox.port)); + props.setProperty("mail.imaps.socketFactory.port", S.string(inbox.port)); + + Session session = Session.getDefaultInstance(props, null); + Store store = session.getStore(protocol); + store.connect(inbox.host, inbox.account, inbox.password); + Folder root = store.getDefaultFolder(); + Folder[] firstLevel = root.list(); + for (Folder f : firstLevel) { + String fname = f.getName().toLowerCase(); + if (candidateFolderNames.contains(fname)) { + String content = tryReadIn(f, email); + if (null != content) { + return content; + } + } + } + return ""; + } + + private String tryReadIn(Folder folder, String email) throws MessagingException, IOException { + folder.open(Folder.READ_WRITE); + try { + Flags seen = new Flags(Flags.Flag.SEEN); + FlagTerm unseenFlagTerm = new FlagTerm(seen, false); + Message messages[] = folder.search(unseenFlagTerm); + if (0 == messages.length) { + return null; + } + for (Message message : messages) { + if (message.isExpunged()) { + continue; + } + Address[] addresses = message.getAllRecipients(); + for (Address address : addresses) { + if (address.toString().contains(email)) { + String type = message.getContentType(); + if (type.startsWith("text")) { + String s = message.getContent().toString(); + message.setFlag(Flags.Flag.SEEN, true); + return s; + } else { + E.unsupport("Unsupported content type: " + type); + } + } + } + } + return null; + } finally { + folder.close(false); + } + } + +} diff --git a/src/main/java/act/e2e/inbox/Inbox.java b/src/main/java/act/e2e/inbox/Inbox.java new file mode 100644 index 000000000..e5b2f933e --- /dev/null +++ b/src/main/java/act/e2e/inbox/Inbox.java @@ -0,0 +1,62 @@ +package act.e2e.inbox; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.inject.annotation.Configuration; +import org.osgl.util.E; + +import java.io.IOException; +import javax.inject.Singleton; +import javax.mail.MessagingException; + +@Singleton +public class Inbox { + + @Configuration("e2e.inbox.account") + public String account; + + @Configuration("e2e.inbox.password") + String password; + + @Configuration("e2e.inbox.protocol") + String protocol; + + @Configuration("e2e.inbox.host") + String host; + + @Configuration("e2e.inbox.port") + int port; + + public interface Reader { + String readLatest(String email) throws MessagingException, IOException; + } + + private Inbox.Reader reader; + + public synchronized Inbox.Reader getReader() { + E.unsupportedIfNot("imaps".equalsIgnoreCase(protocol), "Protocol not supported:" + protocol); + if (null == reader) { + reader = new ImapInboxReader(); + } + return reader; + } + +} diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 41a5c6e77..87ee166f5 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -8,6 +8,7 @@ act.controller.builtin.CliOverHttp act.controller.captcha.CaptchaService act.db.DbBind act.e2e.E2E +act.e2e.inbox.Inbox act.e2e.ScenarioDebugHelper act.e2e.ScenarioDebugHelper$LoadFixtures act.e2e.ScenarioDebugHelper$ClearFixtures From 0a8d122630d2202ad2514bb622c851c84490ef69 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 15 Aug 2018 20:09:09 +1000 Subject: [PATCH 059/730] fix #790; fix framework automate testing issues --- .../java/act/inject/util/ResourceLoader.java | 10 ++++ .../java/act/util/DataObjectEnhancer.java | 23 ++++++++-- .../java/act/util/ReflectedInvokerHelper.java | 5 +- src/main/java/act/view/ViewManager.java | 43 ++++++++++++++++++ .../java/testapp/endpoint/ghissues/GH636.java | 3 -- .../java/testapp/endpoint/GHIssue310.java | 15 ++++-- testapps/GHIssues/pom.xml | 5 +- .../src/main/java/ghissues/Gh790.java | 33 ++++++++++++++ .../src/main/java/ghissues/gh790/Student.java | 11 +++++ .../src/main/resources/e2e/scenarios/790.yml | 17 +++++++ .../GHIssues/src/main/resources/students.xls | Bin 0 -> 16896 bytes 11 files changed, 153 insertions(+), 12 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh790.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh790/Student.java create mode 100644 testapps/GHIssues/src/main/resources/e2e/scenarios/790.yml create mode 100644 testapps/GHIssues/src/main/resources/students.xls diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index f0efea5f6..1590f27ce 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -217,7 +217,17 @@ private static Object _load(URL url, BeanSpec spec) { } } return map; + } // eof isDir + + try { + return IO.read(url).to(spec); + } catch (Exception e) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(e, "error read URL[%s] to [%s] via IO.read call", url, spec); + } + // ignore } + Class rawType = spec.rawType(); if (URL.class == rawType) { return url; diff --git a/src/main/java/act/util/DataObjectEnhancer.java b/src/main/java/act/util/DataObjectEnhancer.java index 2a82c5161..cc51ca568 100644 --- a/src/main/java/act/util/DataObjectEnhancer.java +++ b/src/main/java/act/util/DataObjectEnhancer.java @@ -159,7 +159,7 @@ private void generateEqualsMethod() { mv.visitTypeInsn(CHECKCAST, hostInternalName); mv.visitVarInsn(ASTORE, 2); // store cast object to that // should we check super result? - if (shouldCallSuper()) { + if (shouldCallSuperForEquals()) { mv.visitVarInsn(ALOAD, 0); // load this mv.visitVarInsn(ALOAD, 2); // load that mv.visitMethodInsn(INVOKESPECIAL, metaInfo.superType().getInternalName(), "equals", "(Ljava/lang/Object;)Z", false); @@ -201,7 +201,7 @@ private void generateHashCodeMethod() { cnt++; } } - if (shouldCallSuper()) { + if (shouldCallSuper(fieldCount)) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, metaInfo.superType().getInternalName(), "hashCode", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); @@ -223,7 +223,7 @@ private void generateHashCodeMethod() { mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z", true); mv.visitInsn(POP); } - if (shouldCallSuper()) { + if (shouldCallSuper(fieldCount)) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, metaInfo.superType().getInternalName(), "hashCode", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); @@ -236,7 +236,22 @@ private void generateHashCodeMethod() { } } - private boolean shouldCallSuper() { + private boolean shouldCallSuperForEquals() { + if (null == metaInfo.superType()) { + return false; + } + List fields = metaInfo.fields(); + int fieldCount = fieldCount(fields); + return shouldCallSuper(fieldCount); + } + + private boolean shouldCallSuper(int fieldCount) { + if (null == metaInfo.superType()) { + return false; + } + if (0 == fieldCount) { + return true; + } if (metaInfo.shouldCallSuper()) { return true; } diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 228af88ae..37daab4ce 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -89,10 +89,13 @@ private static boolean _isGlobalOrStateless(Class type, Set circularRefer } private static boolean isGlobalOrStateless(Field field, Set circularReferenceDetector) { + Class fieldType = field.getType(); + if ($.isSimpleType(fieldType)) { + return false; + } if (_hasGlobalOrStatelessAnnotations(field)) { return true; } - Class fieldType = field.getType(); return isGlobalOrStateless(fieldType, circularReferenceDetector); } diff --git a/src/main/java/act/view/ViewManager.java b/src/main/java/act/view/ViewManager.java index 06fea0768..03080ffb4 100644 --- a/src/main/java/act/view/ViewManager.java +++ b/src/main/java/act/view/ViewManager.java @@ -179,6 +179,49 @@ public Template load(ActContext context) { return template; } + /** + * // created for GH352 + * Returns a Template instance by given path + * @param path + * the path to the template + * @return + * A template found by path or null if not found + */ + @SuppressWarnings("unused") + public Template getTemplate(String path) { + ActContext.Base ctx = ActContext.Base.currentContext(); + if (null != ctx) { + String curPath = ctx.templatePath(); + ctx.templateLiteral(path); + try { + return load(ctx); + } finally { + ctx.templatePath(curPath); + } + } + final String templatePath = S.ensureStartsWith(path, '/'); + Template template = null; + + View defView = Act.appConfig().defaultView(); + + if (null != defView) { + template = !isTemplatePath(path) ? defView.loadInlineTemplate(path) : defView.loadTemplate(templatePath); + } + if (null == template && multiViews) { + for (View view : viewList) { + if (view == defView) continue; + template = view.loadTemplate(templatePath); + if (null != template) { + break; + } + } + } + if (null != template) { + templateCache.put(path, template); + } + return template; + } + private Template getInlineTemplate(ActContext context, AppConfig config, String content) { View defView = config.defaultView(); if (null != defView && defView.appliedTo(context)) { diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH636.java b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH636.java index 1f3581b3e..39b8fcc08 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH636.java +++ b/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH636.java @@ -4,9 +4,6 @@ import org.osgl.inject.annotation.Configuration; import org.osgl.mvc.annotation.GetAction; -/** - * Test `@With` on action methods - */ @UrlContext("636") public class GH636 extends GithubIssueBase { diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue310.java b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue310.java index 506f37fbf..5a5062966 100644 --- a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue310.java +++ b/testapp-legacy/src/test/java/testapp/endpoint/GHIssue310.java @@ -3,7 +3,10 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import org.junit.Test; -import org.osgl.util.S; +import org.osgl.$; +import org.osgl.util.C; + +import java.util.List; public class GHIssue310 extends EndpointTester { @@ -11,9 +14,9 @@ public class GHIssue310 extends EndpointTester { public void test() throws Exception { drop(); System.out.println(1); - create(S.random()); + create(random()); System.out.println(2); - create(S.random()); + create(random()); System.out.println(3); create("foo"); System.out.println(4); @@ -42,4 +45,10 @@ private void create(String name) throws Exception { setup(); } + private static List nameList = C.list("tom1", "betty2", "zama3"); + + private String random() { + return $.random(nameList); + } + } diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 45575de79..58f1d5cda 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -4,7 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - org.actframework act-ghissues 1.8.8.8-SNAPSHOT @@ -24,6 +23,10 @@ + + org.actframework + act-excel + diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh790.java b/testapps/GHIssues/src/main/java/ghissues/Gh790.java new file mode 100644 index 000000000..f08b77b0b --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh790.java @@ -0,0 +1,33 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import act.util.JsonView; +import act.util.LogSupport; +import ghissues.gh790.Student; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; +import java.util.Map; + +@UrlContext("790") +@JsonView +public class Gh790 extends LogSupport { + + @LoadResource("students.xls") + public List students; + + @LoadResource("students.xls") + public Map> studentByClass; + + @GetAction("students") + public List all() { + return students; + } + + @GetAction("info/classNumber") + public int classNumber() { + return studentByClass.keySet().size(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh790/Student.java b/testapps/GHIssues/src/main/java/ghissues/gh790/Student.java new file mode 100644 index 000000000..712909e54 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh790/Student.java @@ -0,0 +1,11 @@ +package ghissues.gh790; + +import act.data.annotation.Data; +import act.util.SimpleBean; + +@Data +public class Student implements SimpleBean { + public String firstName; + public String lastName; + public String grade; +} diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/790.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios/790.yml new file mode 100644 index 000000000..ab8e01a94 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/e2e/scenarios/790.yml @@ -0,0 +1,17 @@ +Scenario(GH790): + interactions: + - description: retreive all students + request: + get: 790/students + response: + json: + size: 100 + : + firstName: Vernetta + lastName: Bogard + - description: retrieve class number + request: + get: 790/info/classNumber + response: + json: + result: 2 \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/students.xls b/testapps/GHIssues/src/main/resources/students.xls new file mode 100644 index 0000000000000000000000000000000000000000..6efa6385e06a1d5153cfa5d0ae329b990112539f GIT binary patch literal 16896 zcmeHOd5~O3dH-g$r_R-7+>$I0maSXzu2&~UXm@q3j@7lYgl!r8cK7Y>vu0=HIb^L( z@EUL+fWg9GSmFen*f<0S%wwARY>xONh+zNlBx)bREjFhr-J(N!cy}d_Q-FoZIoeS${$Y*#^9KC+g%0-LXR=2e+tZ$L0Xg35e>cim) z`R{5Ljm6LDEajYgE&u7I$vI!O%3ny%T5FYm{mP%foMt&Z`^59S!py_jw0zkGA zUw#33OHFwL%t!a9$F^JFHiPTlcma9SdGe=q`Q}*Od~W|+E+~J}w99*oe#|_yz*2R8 z&XYfNp8SzI81T4M`QAD{Nx#n=Z`ALz#_RR_?C~c3K4-k4`VlxxIAr`w|ZtmI)VH zC&)U$h2T!@L?47BzMc0#tmKwlP%3p%@?_SNbbnClWfT5ApJ_%CIrLCQ{sYbxw6nLd zpfsM%@(pXsD=7Cc6MX_xobQk+XL-&1V-#$b2Qs*pHlK!*m*!4c_+wr~aWQSif;Qvg z+5A7aoBmw-nm>suUVsi4)~BEMkzy`SLU4_B^4Qi4_Q3i9Y1n%V)j zF3_G7=tmYktPG-JG;vEQ%#{oIL_YxGj$kZ@^8&fv5Sc-55(ZJ<=ork{;uC0ZR|wNZ z+ac=i>JPnU??I>cM)@JOdIW_M-brY>a#1Nn>)qH?zA=t*h*6;*^TfWPKSj@0?uBeO zMz4q0i>(cl_U5UJ0}RHvo41w9VG$koI@AsF_8^D#g1$Szd=2L!Zf)x>wjhfoL%(vI zNw|#BeokvrVk?aQwgS7orC2Eyyt=oc}5A+cm$IZj-f+GMxt_<4+gwR-h*m)1*Op_kCJ;inqywIz0mF-sTA_VtUn69 zn)jmoHct8=%>_;kW;~kA-ad|{QpSElrms-R`P}`OIqYFQ_U_<#Il}rS)C25N;Y6f& z>z-i5x6-J?m5bIS*|kYF@zzn|{G-GNM~OT0>>;AxG^P;^B-zAGczY}wN(#`QS=vaF zO}0&RS0YVjJxX?^H)m0@Yof%?qvJ^pcPH7zzj@0YCFUE^#B9$_B-wkC?8zjXSa5W2 zBJE1D-AR@k$JVl90 z{0q#7x5t6zxk$*^htV%SbqtxAkJhc{e6*g58_ghYKl~^&83ybRgr2HZO{xY0cT&GYrkHDiT-eU~m9huq$+W$)3ii@_h#&%bV7;^mjRdjD@jDg^^jDg{_jDg~`jDh2{j9)sW zWeaM^7-&wHG=4EYN$ChkB@szp{&uh==NwAEZKq;nU6MNL>_H{I?kQaUtt-<_PG8Ak(YId zyf<3JSyu3prsNde-Xe#{yWSzcpWN3d=K?GBL_uOH7Bg|ADDg)G#(I~*eKZ4UW7`XD85x4LUJ z?@ouv3ml4hyeDNLO`m7nn`s$6S6W8@m6p+qrDgP9X&HT3T1HQnmeGTyW%Ofd8NFFr zMq5kE=-JXT`nR-Oq|7BYp1r?H8wUfThO zxVD21acy}flE-ya5<0{^J>(F1!w!)b?@g|?k`b%BPPZ31MBZHv`8?W#l4Dl4Nb_PeqkSs5$Lf}7-bshZ8*|7XA8lC4y;iqW^X_wqymvT6Uc3&pbA``Grk~3+ z@0|{jcfUh^Ke-o_j9cAu&3nKh^4{f;-yYjl@@}hJp?U9dh`a|KB9Hb(JL8^G@~aMU z9p38@dGB+`?{!bllxc6hpp~L z&3o7(@=iJA^SH;Ae8lS7H183I$or^6}#gXNUgo z$bL>1e8&DyoXhx3ezpgC#3atLUl}AgG{`5NcbvClQE&wSX(zyOhJ9LCo+40FW~!Xx}i1L0((E0GivX}J-Y&j1 zz#+j){+87-raDjJ)3IKEl8aBrdeoZm=*5)$w&j^f$^nPi-a&_A@5-Lh=_&j!!Su6H zw-PJ-h3Pt_@!7oT$6*GhiZ@=PQpzV$Jtp4|GTY93EH_Jwnx#xg}#dOIbY8w zJ&-|uKY1=F`2(vnk(BtBxj^$i?R4bD`+@IDzF~DHlCseu_VY~+`TgYiqU1TNGm(_N z4w1LdA-|tIgOvQC)tN}jfJ5XBIu!TwN+iX6bH@FjKGW$1(y|+C$l7Yi+H1&esv+yB zAzPD@(IT^uDfuJ38bn|IPKUU*_dCS3jn6pxAcbF!8QvSUFJJ5sc}pDfZSXqHJ8g9) zlES{Sb^fGyzOa`Dkr(ex`X?pNTb+rd^f*M`PKU^geKI|nl5bj_iKIN_5P2VR$nWP3 zn)fGGcY_|^dmSS0eGd6N&ViCYwK@|?p&#Rj7VGiRI~hb??8`Y@O8(61Oe7`e5ZfDd z$RFQQ&HI+snMleZhse9dA-|tI2bKJ})tN{N_c?pEO!qVE5P9)B@WfR5=i4l4A}Nz? zNq&=_e0#S1oI3;00wsTGOPWZ^oeq%~IONaEN=TLbmDR1(>u`rdANJRq`FHGm(^a4w1LsA)m)RuH>(+ z&O}luef$@i?zL{c7hh`dt{kr%H! z_o$M;u{sk;xy>Q+Zg+^h_^je?R{F>A9D|9ZblZ|^^!TXBz-#7%gop)r5udHv2n1}ltU z9KwOsYHM>HRvZBq{VLmeS?rAliiJ{PDE{^I#`UWX1^xK3YN$Wsc1J@)8%*(6_6qwm zjlMEEdQaOwzY5y*iw}P4CqLUa()zhm&9Y+2mw!lSMVHu!L_Is+g4Bt`gMn^#3esDV zrXumGI1P#Ji7ov5OXlxinO}?4i6k$4bNYcePmHINFVEaj{)ZoaE5m%pKhIlr-Ob44`@wg9@Yw44t&e;h{a^XB&u@jSAtgHs84qn%&eV!TF8j*Rqbu7+gG=(Ub}8R{qvRQ zH9iBc=HGv6`%C$dTGO)t!cH0 z@HzfDwqOH(R#CzDM{%j;-~R5zSGhxaO(-ejZy*c$%iRmryVSPNd&8xUpY!#!Ykwcg7MS;pSJD48gG|7|Nh_K{(raszjEbcvH$=8 literal 0 HcmV?d00001 From 901f554e32f7bf8b07ca9eb0ca5d4d2f43b13306 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 15 Aug 2018 22:00:16 +1000 Subject: [PATCH 060/730] fix #792 --- CHANGELOG.md | 2 ++ src/main/java/act/app/ActionContext.java | 10 ++++++++++ src/main/java/act/controller/Controller.java | 2 ++ src/main/java/act/util/ActContext.java | 3 ++- src/main/java/act/util/PropertySpec.java | 6 +++--- testapps/GHIssues/src/main/java/ghissues/Gh790.java | 12 +++++++++--- .../src/main/java/ghissues/gh790/Student.java | 11 ----------- 7 files changed, 28 insertions(+), 18 deletions(-) delete mode 100644 testapps/GHIssues/src/main/java/ghissues/gh790/Student.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c866a371..c6d105c96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Attach `PropertySpec` info to `ActionContext` #792 +* Resource loader - allow loading from excel file #790 * e2e - support email content verification #789 * e2e - support embed function in string for constant definition #788 * Empty `scenario.yml` file caused `NullPointerException` #787 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 546e4eb8f..b010101ce 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -112,6 +112,7 @@ public class ActionContext extends ActContext.Base implements Des private boolean consumed; private boolean readyForDestroy; private int resultHash = Integer.MIN_VALUE; + private PropertySpec.MetaInfo propSpec; // see https://github.com/actframework/actframework/issues/492 public String encodedSessionToken; @@ -346,6 +347,15 @@ public void applyResultHashToEtag() { } } + public ActionContext propertySpec(PropertySpec.MetaInfo spec) { + this.propSpec = spec; + return this; + } + + public PropertySpec.MetaInfo propertySpec() { + return this.propSpec; + } + public MissingAuthenticationHandler missingAuthenticationHandler() { if (null != forceMissingAuthenticationHandler) { return forceMissingAuthenticationHandler; diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index c03cbec9f..524f53b3b 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1743,6 +1743,8 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon return RenderCSV.of(status, v, propertySpec, context); } else { boolean isArray = vCls.isArray(); + PropertySpec.MetaInfo propertySpec = PropertySpec.MetaInfo.withCurrent(meta, context); + context.propertySpec(propertySpec); return inferPrimitiveResult(v, context, false, requireXML, isArray, isDateTimeType); } } diff --git a/src/main/java/act/util/ActContext.java b/src/main/java/act/util/ActContext.java index 4c48b1331..46c342ba2 100644 --- a/src/main/java/act/util/ActContext.java +++ b/src/main/java/act/util/ActContext.java @@ -380,7 +380,8 @@ public CTX dateFormatPattern(String pattern) { } public String dateFormatPattern() { - return this.dateFormatPattern; + String ptn = this.dateFormatPattern; + return null == ptn ? config().datePattern() : ptn; } @Override diff --git a/src/main/java/act/util/PropertySpec.java b/src/main/java/act/util/PropertySpec.java index 861e9ec3d..1c16453af 100644 --- a/src/main/java/act/util/PropertySpec.java +++ b/src/main/java/act/util/PropertySpec.java @@ -138,7 +138,7 @@ /** * Capture the {@code PropertySpec} annotation meta info in bytecode scanning phase */ - class MetaInfo { + public class MetaInfo { // split "fn as firstName" into "fn" and "firstName" private static Pattern p = Pattern.compile("\\s+as\\s+", Pattern.CASE_INSENSITIVE); @@ -247,12 +247,12 @@ public Map labelMapping(ActContext context) { public Set excludedFields(ActContext context) { Spec spec = spec(context); - return null == spec ? C.set() : C.set(spec.excluded()); + return null == spec ? C.Set() : C.Set(spec.excluded()); } public Set excludeFieldsForHttp() { Spec spec = httpSpec(); - return null == spec ? C.set() : C.set(spec.excluded()); + return null == spec ? C.Set() : C.Set(spec.excluded()); } public String label(String field, ActContext context) { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh790.java b/testapps/GHIssues/src/main/java/ghissues/Gh790.java index f08b77b0b..a09914f6e 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh790.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh790.java @@ -1,10 +1,9 @@ package ghissues; import act.controller.annotation.UrlContext; +import act.data.annotation.Data; import act.inject.util.LoadResource; -import act.util.JsonView; -import act.util.LogSupport; -import ghissues.gh790.Student; +import act.util.*; import org.osgl.mvc.annotation.GetAction; import java.util.List; @@ -14,6 +13,13 @@ @JsonView public class Gh790 extends LogSupport { + @Data + public static class Student implements SimpleBean { + public String firstName; + public String lastName; + public String grade; + } + @LoadResource("students.xls") public List students; diff --git a/testapps/GHIssues/src/main/java/ghissues/gh790/Student.java b/testapps/GHIssues/src/main/java/ghissues/gh790/Student.java deleted file mode 100644 index 712909e54..000000000 --- a/testapps/GHIssues/src/main/java/ghissues/gh790/Student.java +++ /dev/null @@ -1,11 +0,0 @@ -package ghissues.gh790; - -import act.data.annotation.Data; -import act.util.SimpleBean; - -@Data -public class Student implements SimpleBean { - public String firstName; - public String lastName; - public String grade; -} From 3fb04c70dcedef55a23e51f38ba8cd45b597773d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 16 Aug 2018 06:02:50 +1000 Subject: [PATCH 061/730] fix #793 --- CHANGELOG.md | 1 + src/main/java/act/controller/Controller.java | 41 + .../mycom/helloworld => ghissues}/.version | 0 testapps/ResourceLoaderTest/.gitignore | 19 + testapps/ResourceLoaderTest/pom.xml | 32 + testapps/ResourceLoaderTest/run_dev | 3 + testapps/ResourceLoaderTest/run_dev.bat | 2 + testapps/ResourceLoaderTest/run_e2e | 3 + testapps/ResourceLoaderTest/run_e2e.bat | 2 + testapps/ResourceLoaderTest/run_prod | 10 + .../main/java/resourceloader/AppEntry.java | 12 + .../src/main/resources/asset/changelog.txt | 630 + .../asset/demo-mobile/accordion/_content.html | 18 + .../asset/demo-mobile/accordion/basic.html | 1 + .../asset/demo-mobile/accordion/header.html | 1 + .../asset/demo-mobile/animation/basic.html | 1 + .../asset/demo-mobile/animation/fade.html | 1 + .../asset/demo-mobile/animation/pop.html | 1 + .../asset/demo-mobile/animation/slide.html | 1 + .../asset/demo-mobile/badge/basic.html | 1 + .../asset/demo-mobile/badge/button.html | 1 + .../asset/demo-mobile/badge/list.html | 1 + .../asset/demo-mobile/badge/tabs.html | 1 + .../asset/demo-mobile/button/basic.html | 1 + .../asset/demo-mobile/button/group.html | 1 + .../asset/demo-mobile/button/style.html | 1 + .../asset/demo-mobile/button/switch.html | 1 + .../asset/demo-mobile/datagrid/basic.html | 1 + .../demo-mobile/datagrid/rowediting.html | 104 + .../asset/demo-mobile/datalist/basic.html | 1 + .../asset/demo-mobile/datalist/group.html | 1 + .../asset/demo-mobile/datalist/selection.html | 1 + .../asset/demo-mobile/dialog/basic.html | 46 + .../asset/demo-mobile/dialog/message.html | 41 + .../asset/demo-mobile/form/basic.html | 44 + .../asset/demo-mobile/images/login1.jpg | Bin 0 -> 25789 bytes .../asset/demo-mobile/images/modem.png | Bin 0 -> 1633 bytes .../asset/demo-mobile/images/more.png | Bin 0 -> 110 bytes .../asset/demo-mobile/images/pda.png | Bin 0 -> 1787 bytes .../asset/demo-mobile/images/scanner.png | Bin 0 -> 2600 bytes .../asset/demo-mobile/images/tablet.png | Bin 0 -> 2505 bytes .../demo-mobile/input/numberspinner.html | 1 + .../asset/demo-mobile/input/textbox.html | 1 + .../asset/demo-mobile/layout/basic.html | 32 + .../asset/demo-mobile/menu/basic.html | 39 + .../asset/demo-mobile/menu/menubar.html | 45 + .../asset/demo-mobile/panel/_content.html | 18 + .../asset/demo-mobile/panel/ajax.html | 1 + .../asset/demo-mobile/panel/basic.html | 1 + .../asset/demo-mobile/panel/nav.html | 39 + .../asset/demo-mobile/simplelist/basic.html | 1 + .../asset/demo-mobile/simplelist/button.html | 1 + .../asset/demo-mobile/simplelist/group.html | 1 + .../asset/demo-mobile/simplelist/image.html | 1 + .../asset/demo-mobile/simplelist/link.html | 1 + .../asset/demo-mobile/tabs/basic.html | 1 + .../resources/asset/demo-mobile/tabs/nav.html | 1 + .../asset/demo-mobile/tabs/pill.html | 1 + .../asset/demo-mobile/toolbar/basic.html | 63 + .../asset/demo-mobile/toolbar/button.html | 45 + .../asset/demo-mobile/toolbar/menu.html | 76 + .../asset/demo-mobile/tree/basic.html | 56 + .../resources/asset/demo-mobile/tree/dnd.html | 56 + .../asset/demo/accordion/_content.html | 18 + .../asset/demo/accordion/actions.html | 51 + .../resources/asset/demo/accordion/ajax.html | 28 + .../resources/asset/demo/accordion/basic.html | 52 + .../asset/demo/accordion/datagrid_data1.json | 12 + .../asset/demo/accordion/expandable.html | 33 + .../resources/asset/demo/accordion/fluid.html | 33 + .../asset/demo/accordion/horizontal.html | 52 + .../asset/demo/accordion/multiple.html | 34 + .../resources/asset/demo/accordion/tools.html | 48 + .../resources/asset/demo/calendar/basic.html | 19 + .../resources/asset/demo/calendar/custom.html | 46 + .../asset/demo/calendar/disabledate.html | 28 + .../asset/demo/calendar/firstday.html | 30 + .../resources/asset/demo/calendar/fluid.html | 23 + .../asset/demo/calendar/weeknumber.html | 19 + .../resources/asset/demo/combo/animation.html | 41 + .../resources/asset/demo/combo/basic.html | 48 + .../asset/demo/combobox/actions.html | 88 + .../resources/asset/demo/combobox/basic.html | 73 + .../asset/demo/combobox/combobox_data1.json | 22 + .../asset/demo/combobox/combobox_data2.json | 47 + .../asset/demo/combobox/customformat.html | 39 + .../asset/demo/combobox/dynamicdata.html | 31 + .../resources/asset/demo/combobox/fluid.html | 43 + .../resources/asset/demo/combobox/group.html | 33 + .../resources/asset/demo/combobox/icons.html | 36 + .../asset/demo/combobox/itemicon.html | 35 + .../asset/demo/combobox/multiline.html | 75 + .../asset/demo/combobox/multiple.html | 32 + .../asset/demo/combobox/navigation.html | 77 + .../asset/demo/combobox/remotedata.html | 30 + .../asset/demo/combobox/remotejsonp.html | 54 + .../asset/demo/combogrid/actions.html | 60 + .../resources/asset/demo/combogrid/basic.html | 40 + .../asset/demo/combogrid/datagrid_data1.json | 12 + .../resources/asset/demo/combogrid/fluid.html | 63 + .../asset/demo/combogrid/initvalue.html | 41 + .../asset/demo/combogrid/multiple.html | 42 + .../asset/demo/combogrid/navigation.html | 43 + .../asset/demo/combogrid/setvalue.html | 59 + .../asset/demo/combotree/actions.html | 43 + .../resources/asset/demo/combotree/basic.html | 22 + .../resources/asset/demo/combotree/fluid.html | 25 + .../asset/demo/combotree/initvalue.html | 22 + .../asset/demo/combotree/multiple.html | 26 + .../asset/demo/combotree/tree_data1.json | 49 + .../asset/demo/combotreegrid/basic.html | 34 + .../asset/demo/combotreegrid/multiple.html | 36 + .../demo/combotreegrid/treegrid_data1.json | 73 + .../asset/demo/datagrid/aligncolumns.html | 32 + .../resources/asset/demo/datagrid/basic.html | 32 + .../asset/demo/datagrid/cacheeditor.html | 149 + .../asset/demo/datagrid/cellediting.html | 94 + .../asset/demo/datagrid/cellstyle.html | 42 + .../asset/demo/datagrid/checkbox.html | 42 + .../asset/demo/datagrid/clientpagination.html | 160 + .../asset/demo/datagrid/columngroup.html | 34 + .../asset/demo/datagrid/complextoolbar.html | 50 + .../asset/demo/datagrid/contextmenu.html | 89 + .../asset/demo/datagrid/custompager.html | 53 + .../asset/demo/datagrid/datagrid_data1.json | 12 + .../asset/demo/datagrid/datagrid_data2.json | 15 + .../resources/asset/demo/datagrid/fluid.html | 32 + .../resources/asset/demo/datagrid/footer.html | 38 + .../asset/demo/datagrid/formatcolumns.html | 39 + .../asset/demo/datagrid/frozencolumns.html | 35 + .../asset/demo/datagrid/frozenrows.html | 44 + .../asset/demo/datagrid/mergecells.html | 58 + .../asset/demo/datagrid/multisorting.html | 37 + .../asset/demo/datagrid/products.json | 9 + .../asset/demo/datagrid/rowborder.html | 60 + .../asset/demo/datagrid/rowediting.html | 125 + .../asset/demo/datagrid/rowstyle.html | 41 + .../asset/demo/datagrid/selection.html | 57 + .../asset/demo/datagrid/simpletoolbar.html | 45 + .../asset/demo/datagrid/transform.html | 46 + .../resources/asset/demo/datalist/basic.html | 69 + .../asset/demo/datalist/checkbox.html | 25 + .../asset/demo/datalist/datalist_data1.json | 18 + .../resources/asset/demo/datalist/group.html | 23 + .../asset/demo/datalist/multiselect.html | 23 + .../asset/demo/datalist/remotedata.html | 22 + .../resources/asset/demo/datebox/basic.html | 25 + .../resources/asset/demo/datebox/buttons.html | 34 + .../resources/asset/demo/datebox/clone.html | 31 + .../asset/demo/datebox/dateformat.html | 45 + .../resources/asset/demo/datebox/events.html | 31 + .../resources/asset/demo/datebox/fluid.html | 25 + .../asset/demo/datebox/restrict.html | 34 + .../asset/demo/datebox/sharedcalendar.html | 26 + .../asset/demo/datebox/validate.html | 37 + .../asset/demo/datetimebox/basic.html | 25 + .../asset/demo/datetimebox/fluid.html | 25 + .../asset/demo/datetimebox/initvalue.html | 22 + .../asset/demo/datetimebox/showseconds.html | 25 + .../asset/demo/datetimespinner/basic.html | 25 + .../asset/demo/datetimespinner/clearicon.html | 33 + .../asset/demo/datetimespinner/fluid.html | 25 + .../asset/demo/datetimespinner/format.html | 55 + .../src/main/resources/asset/demo/demo.css | 24 + .../resources/asset/demo/dialog/basic.html | 23 + .../asset/demo/dialog/complextoolbar.html | 46 + .../resources/asset/demo/dialog/fluid.html | 24 + .../asset/demo/dialog/toolbarbuttons.html | 52 + .../resources/asset/demo/draggable/basic.html | 21 + .../asset/demo/draggable/constrain.html | 35 + .../resources/asset/demo/draggable/snap.html | 37 + .../asset/demo/droppable/accept.html | 78 + .../resources/asset/demo/droppable/basic.html | 77 + .../resources/asset/demo/droppable/sort.html | 71 + .../asset/demo/easyloader/basic.html | 75 + .../resources/asset/demo/filebox/basic.html | 31 + .../asset/demo/filebox/buttonalign.html | 32 + .../resources/asset/demo/filebox/fluid.html | 25 + .../main/resources/asset/demo/form/basic.html | 48 + .../resources/asset/demo/form/form_data1.json | 8 + .../main/resources/asset/demo/form/load.html | 62 + .../asset/demo/form/validateonsubmit.html | 52 + .../resources/asset/demo/layout/_content.html | 18 + .../asset/demo/layout/addremove.html | 53 + .../asset/demo/layout/autoheight.html | 59 + .../resources/asset/demo/layout/basic.html | 39 + .../asset/demo/layout/collapsetitle.html | 39 + .../resources/asset/demo/layout/complex.html | 57 + .../demo/layout/customcollapsetitle.html | 51 + .../asset/demo/layout/datagrid_data1.json | 12 + .../resources/asset/demo/layout/fluid.html | 24 + .../resources/asset/demo/layout/full.html | 19 + .../asset/demo/layout/nestedlayout.html | 31 + .../asset/demo/layout/nocollapsible.html | 34 + .../asset/demo/layout/propertygrid_data1.json | 20 + .../asset/demo/layout/tree_data1.json | 49 + .../asset/demo/linkbutton/basic.html | 33 + .../asset/demo/linkbutton/fluid.html | 33 + .../asset/demo/linkbutton/group.html | 33 + .../asset/demo/linkbutton/iconalign.html | 32 + .../asset/demo/linkbutton/plain.html | 28 + .../resources/asset/demo/linkbutton/size.html | 34 + .../asset/demo/linkbutton/style.html | 31 + .../asset/demo/linkbutton/toggle.html | 25 + .../resources/asset/demo/maskedbox/basic.html | 30 + .../main/resources/asset/demo/menu/basic.html | 68 + .../resources/asset/demo/menu/customitem.html | 50 + .../resources/asset/demo/menu/events.html | 40 + .../resources/asset/demo/menu/inline.html | 59 + .../main/resources/asset/demo/menu/nav.html | 146 + .../asset/demo/menubutton/actions.html | 58 + .../asset/demo/menubutton/alignment.html | 69 + .../asset/demo/menubutton/basic.html | 54 + .../resources/asset/demo/menubutton/nav.html | 166 + .../resources/asset/demo/messager/alert.html | 40 + .../resources/asset/demo/messager/basic.html | 56 + .../asset/demo/messager/interactive.html | 36 + .../asset/demo/messager/position.html | 140 + .../resources/asset/demo/numberbox/basic.html | 29 + .../resources/asset/demo/numberbox/fluid.html | 26 + .../asset/demo/numberbox/format.html | 34 + .../resources/asset/demo/numberbox/range.html | 28 + .../asset/demo/numberspinner/align.html | 31 + .../asset/demo/numberspinner/basic.html | 27 + .../asset/demo/numberspinner/fluid.html | 25 + .../asset/demo/numberspinner/increment.html | 28 + .../asset/demo/numberspinner/range.html | 25 + .../asset/demo/pagination/attaching.html | 32 + .../asset/demo/pagination/basic.html | 20 + .../asset/demo/pagination/custombuttons.html | 38 + .../asset/demo/pagination/layout.html | 62 + .../asset/demo/pagination/links.html | 23 + .../asset/demo/pagination/simple.html | 25 + .../resources/asset/demo/panel/_content.html | 18 + .../resources/asset/demo/panel/basic.html | 31 + .../asset/demo/panel/customtools.html | 35 + .../resources/asset/demo/panel/fluid.html | 21 + .../resources/asset/demo/panel/footer.html | 22 + .../resources/asset/demo/panel/halign.html | 26 + .../asset/demo/panel/loadcontent.html | 27 + .../asset/demo/panel/nestedpanel.html | 30 + .../asset/demo/panel/paneltools.html | 37 + .../asset/demo/passwordbox/basic.html | 25 + .../asset/demo/passwordbox/flash.html | 48 + .../demo/passwordbox/validatepassword.html | 40 + .../asset/demo/progressbar/basic.html | 30 + .../asset/demo/progressbar/fluid.html | 21 + .../asset/demo/propertygrid/basic.html | 61 + .../demo/propertygrid/customcolumns.html | 31 + .../asset/demo/propertygrid/groupformat.html | 30 + .../demo/propertygrid/propertygrid_data1.json | 20 + .../resources/asset/demo/resizable/basic.html | 24 + .../resources/asset/demo/searchbox/basic.html | 25 + .../asset/demo/searchbox/category.html | 30 + .../resources/asset/demo/searchbox/fluid.html | 29 + .../resources/asset/demo/sidemenu/basic.html | 58 + .../resources/asset/demo/sidemenu/style.css | 63 + .../resources/asset/demo/sidemenu/style.html | 70 + .../resources/asset/demo/slider/basic.html | 18 + .../resources/asset/demo/slider/fluid.html | 21 + .../asset/demo/slider/formattip.html | 28 + .../asset/demo/slider/nonlinear.html | 58 + .../resources/asset/demo/slider/range.html | 23 + .../resources/asset/demo/slider/rule.html | 21 + .../resources/asset/demo/slider/vertical.html | 25 + .../asset/demo/splitbutton/actions.html | 64 + .../asset/demo/splitbutton/basic.html | 61 + .../asset/demo/switchbutton/action.html | 24 + .../asset/demo/switchbutton/basic.html | 32 + .../resources/asset/demo/tabs/_content.html | 18 + .../resources/asset/demo/tabs/autoheight.html | 36 + .../main/resources/asset/demo/tabs/basic.html | 36 + .../resources/asset/demo/tabs/dropdown.html | 55 + .../resources/asset/demo/tabs/fixedwidth.html | 37 + .../main/resources/asset/demo/tabs/fluid.html | 24 + .../main/resources/asset/demo/tabs/hover.html | 46 + .../asset/demo/tabs/images/modem.png | Bin 0 -> 1633 bytes .../resources/asset/demo/tabs/images/pda.png | Bin 0 -> 1787 bytes .../asset/demo/tabs/images/scanner.png | Bin 0 -> 2600 bytes .../asset/demo/tabs/images/tablet.png | Bin 0 -> 2505 bytes .../resources/asset/demo/tabs/nestedtabs.html | 54 + .../resources/asset/demo/tabs/striptools.html | 39 + .../main/resources/asset/demo/tabs/style.html | 51 + .../resources/asset/demo/tabs/tabimage.html | 41 + .../asset/demo/tabs/tabposition.html | 45 + .../resources/asset/demo/tabs/tabstools.html | 41 + .../resources/asset/demo/tabs/tree_data1.json | 49 + .../asset/demo/tagbox/autocomplete.html | 29 + .../resources/asset/demo/tagbox/basic.html | 20 + .../resources/asset/demo/tagbox/button.html | 25 + .../resources/asset/demo/tagbox/format.html | 24 + .../resources/asset/demo/tagbox/style.html | 35 + .../asset/demo/tagbox/tagbox_data1.json | 21 + .../resources/asset/demo/tagbox/validate.html | 34 + .../resources/asset/demo/textbox/basic.html | 35 + .../resources/asset/demo/textbox/button.html | 25 + .../asset/demo/textbox/clearicon.html | 68 + .../resources/asset/demo/textbox/custom.html | 34 + .../resources/asset/demo/textbox/fluid.html | 25 + .../resources/asset/demo/textbox/icons.html | 51 + .../asset/demo/textbox/multiline.html | 25 + .../resources/asset/demo/textbox/size.html | 31 + .../asset/demo/timespinner/actions.html | 42 + .../asset/demo/timespinner/basic.html | 25 + .../asset/demo/timespinner/fluid.html | 25 + .../asset/demo/timespinner/range.html | 24 + .../asset/demo/tooltip/_content.html | 18 + .../resources/asset/demo/tooltip/_dialog.html | 23 + .../resources/asset/demo/tooltip/ajax.html | 32 + .../resources/asset/demo/tooltip/basic.html | 20 + .../asset/demo/tooltip/customcontent.html | 32 + .../asset/demo/tooltip/customstyle.html | 52 + .../asset/demo/tooltip/position.html | 34 + .../resources/asset/demo/tooltip/toolbar.html | 40 + .../asset/demo/tooltip/tooltipdialog.html | 44 + .../resources/asset/demo/tree/actions.html | 47 + .../resources/asset/demo/tree/animation.html | 20 + .../main/resources/asset/demo/tree/basic.html | 53 + .../resources/asset/demo/tree/checkbox.html | 37 + .../asset/demo/tree/contextmenu.html | 65 + .../asset/demo/tree/customcheckbox.html | 29 + .../main/resources/asset/demo/tree/dnd.html | 20 + .../resources/asset/demo/tree/editable.html | 27 + .../resources/asset/demo/tree/formatting.html | 32 + .../main/resources/asset/demo/tree/icons.html | 20 + .../resources/asset/demo/tree/lazyload.html | 82 + .../main/resources/asset/demo/tree/lines.html | 20 + .../resources/asset/demo/tree/tree_data1.json | 49 + .../resources/asset/demo/tree/tree_data2.json | 61 + .../asset/demo/treegrid/actions.html | 64 + .../resources/asset/demo/treegrid/basic.html | 34 + .../asset/demo/treegrid/checkbox.html | 35 + .../asset/demo/treegrid/clientpagination.html | 189 + .../asset/demo/treegrid/contextmenu.html | 106 + .../asset/demo/treegrid/customcheckbox.html | 40 + .../asset/demo/treegrid/editable.html | 93 + .../resources/asset/demo/treegrid/fluid.html | 33 + .../resources/asset/demo/treegrid/footer.html | 55 + .../resources/asset/demo/treegrid/lines.html | 35 + .../asset/demo/treegrid/reports.html | 49 + .../asset/demo/treegrid/treegrid_data1.json | 73 + .../asset/demo/treegrid/treegrid_data2.json | 11 + .../asset/demo/treegrid/treegrid_data3.json | 13 + .../asset/demo/validatebox/basic.html | 45 + .../asset/demo/validatebox/customtooltip.html | 56 + .../demo/validatebox/errorplacement.html | 62 + .../demo/validatebox/validateonblur.html | 45 + .../resources/asset/demo/window/basic.html | 23 + .../asset/demo/window/borderstyle.html | 53 + .../asset/demo/window/customtools.html | 30 + .../resources/asset/demo/window/fluid.html | 24 + .../resources/asset/demo/window/footer.html | 24 + .../asset/demo/window/inlinewindow.html | 26 + .../asset/demo/window/modalwindow.html | 24 + .../asset/demo/window/windowlayout.html | 33 + .../src/main/resources/asset/easyloader.js | 190 + .../main/resources/asset/jquery.easyui.min.js | 16776 ++++++++++++++++ .../resources/asset/jquery.easyui.mobile.js | 141 + .../src/main/resources/asset/jquery.min.js | 5 + .../main/resources/asset/license_freeware.txt | 14 + .../resources/asset/locale/easyui-lang-af.js | 44 + .../resources/asset/locale/easyui-lang-am.js | 46 + .../resources/asset/locale/easyui-lang-ar.js | 45 + .../resources/asset/locale/easyui-lang-bg.js | 44 + .../resources/asset/locale/easyui-lang-ca.js | 44 + .../resources/asset/locale/easyui-lang-cs.js | 44 + .../resources/asset/locale/easyui-lang-cz.js | 44 + .../resources/asset/locale/easyui-lang-da.js | 44 + .../resources/asset/locale/easyui-lang-de.js | 63 + .../resources/asset/locale/easyui-lang-el.js | 45 + .../resources/asset/locale/easyui-lang-en.js | 45 + .../resources/asset/locale/easyui-lang-es.js | 45 + .../resources/asset/locale/easyui-lang-fa.js | 45 + .../resources/asset/locale/easyui-lang-fr.js | 62 + .../resources/asset/locale/easyui-lang-it.js | 64 + .../resources/asset/locale/easyui-lang-jp.js | 45 + .../resources/asset/locale/easyui-lang-ko.js | 45 + .../resources/asset/locale/easyui-lang-nl.js | 44 + .../resources/asset/locale/easyui-lang-pl.js | 45 + .../asset/locale/easyui-lang-pt_BR.js | 45 + .../resources/asset/locale/easyui-lang-ru.js | 46 + .../asset/locale/easyui-lang-sv_SE.js | 45 + .../resources/asset/locale/easyui-lang-tr.js | 59 + .../resources/asset/locale/easyui-lang-ua.js | 46 + .../asset/locale/easyui-lang-zh_CN.js | 66 + .../asset/locale/easyui-lang-zh_TW.js | 48 + .../asset/plugins/jquery.accordion.js | 350 + .../asset/plugins/jquery.calendar.js | 403 + .../resources/asset/plugins/jquery.combo.js | 404 + .../asset/plugins/jquery.combobox.js | 611 + .../asset/plugins/jquery.combogrid.js | 351 + .../asset/plugins/jquery.combotree.js | 237 + .../asset/plugins/jquery.combotreegrid.js | 317 + .../asset/plugins/jquery.datagrid.js | 2580 +++ .../asset/plugins/jquery.datalist.js | 136 + .../resources/asset/plugins/jquery.datebox.js | 215 + .../asset/plugins/jquery.datetimebox.js | 179 + .../asset/plugins/jquery.datetimespinner.js | 61 + .../resources/asset/plugins/jquery.dialog.js | 136 + .../asset/plugins/jquery.draggable.js | 306 + .../asset/plugins/jquery.droppable.js | 62 + .../resources/asset/plugins/jquery.filebox.js | 100 + .../resources/asset/plugins/jquery.form.js | 410 + .../resources/asset/plugins/jquery.layout.js | 519 + .../asset/plugins/jquery.linkbutton.js | 184 + .../asset/plugins/jquery.maskedbox.js | 221 + .../resources/asset/plugins/jquery.menu.js | 502 + .../asset/plugins/jquery.menubutton.js | 123 + .../asset/plugins/jquery.messager.js | 186 + .../resources/asset/plugins/jquery.mobile.js | 141 + .../asset/plugins/jquery.numberbox.js | 184 + .../asset/plugins/jquery.numberspinner.js | 58 + .../asset/plugins/jquery.pagination.js | 296 + .../resources/asset/plugins/jquery.panel.js | 691 + .../resources/asset/plugins/jquery.parser.js | 386 + .../asset/plugins/jquery.passwordbox.js | 156 + .../asset/plugins/jquery.progressbar.js | 84 + .../asset/plugins/jquery.propertygrid.js | 427 + .../asset/plugins/jquery.resizable.js | 173 + .../asset/plugins/jquery.searchbox.js | 132 + .../asset/plugins/jquery.sidemenu.js | 226 + .../resources/asset/plugins/jquery.slider.js | 347 + .../resources/asset/plugins/jquery.spinner.js | 128 + .../asset/plugins/jquery.splitbutton.js | 49 + .../asset/plugins/jquery.switchbutton.js | 193 + .../resources/asset/plugins/jquery.tabs.js | 716 + .../resources/asset/plugins/jquery.tagbox.js | 223 + .../resources/asset/plugins/jquery.textbox.js | 566 + .../asset/plugins/jquery.timespinner.js | 149 + .../resources/asset/plugins/jquery.tooltip.js | 238 + .../resources/asset/plugins/jquery.tree.js | 1247 ++ .../asset/plugins/jquery.treegrid.js | 1353 ++ .../asset/plugins/jquery.validatebox.js | 310 + .../resources/asset/plugins/jquery.window.js | 311 + .../src/main/resources/asset/readme.txt | 4 + .../main/resources/asset/src/easyloader.js | 439 + .../resources/asset/src/jquery.accordion.js | 493 + .../resources/asset/src/jquery.calendar.js | 455 + .../resources/asset/src/jquery.combobox.js | 742 + .../resources/asset/src/jquery.datebox.js | 288 + .../resources/asset/src/jquery.draggable.js | 399 + .../resources/asset/src/jquery.droppable.js | 81 + .../main/resources/asset/src/jquery.form.js | 492 + .../resources/asset/src/jquery.linkbutton.js | 243 + .../main/resources/asset/src/jquery.menu.js | 648 + .../main/resources/asset/src/jquery.parser.js | 431 + .../resources/asset/src/jquery.progressbar.js | 107 + .../asset/src/jquery.propertygrid.js | 525 + .../resources/asset/src/jquery.resizable.js | 228 + .../main/resources/asset/src/jquery.slider.js | 455 + .../main/resources/asset/src/jquery.tabs.js | 927 + .../main/resources/asset/src/jquery.window.js | 417 + .../main/resources/asset/themes/angular.css | 639 + .../asset/themes/black/accordion.css | 89 + .../resources/asset/themes/black/calendar.css | 203 + .../resources/asset/themes/black/checkbox.css | 31 + .../resources/asset/themes/black/combo.css | 35 + .../resources/asset/themes/black/combobox.css | 40 + .../resources/asset/themes/black/datagrid.css | 291 + .../resources/asset/themes/black/datalist.css | 95 + .../resources/asset/themes/black/datebox.css | 36 + .../resources/asset/themes/black/dialog.css | 47 + .../resources/asset/themes/black/easyui.css | 3427 ++++ .../resources/asset/themes/black/filebox.css | 20 + .../themes/black/images/accordion_arrows.png | Bin 0 -> 122 bytes .../asset/themes/black/images/blank.gif | Bin 0 -> 43 bytes .../themes/black/images/calendar_arrows.png | Bin 0 -> 173 bytes .../asset/themes/black/images/combo_arrow.png | Bin 0 -> 100 bytes .../themes/black/images/datagrid_icons.png | Bin 0 -> 300 bytes .../themes/black/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/black/images/layout_arrows.png | Bin 0 -> 179 bytes .../themes/black/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/black/images/loading.gif | Bin 0 -> 1737 bytes .../asset/themes/black/images/menu_arrows.png | Bin 0 -> 134 bytes .../themes/black/images/messager_icons.png | Bin 0 -> 6116 bytes .../themes/black/images/pagination_icons.png | Bin 0 -> 339 bytes .../asset/themes/black/images/panel_tools.png | Bin 0 -> 184 bytes .../themes/black/images/passwordbox_close.png | Bin 0 -> 149 bytes .../themes/black/images/passwordbox_open.png | Bin 0 -> 160 bytes .../themes/black/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/black/images/slider_handle.png | Bin 0 -> 863 bytes .../themes/black/images/spinner_arrows.png | Bin 0 -> 140 bytes .../asset/themes/black/images/tabs_icons.png | Bin 0 -> 144 bytes .../themes/black/images/tagbox_icons.png | Bin 0 -> 133 bytes .../asset/themes/black/images/tree_icons.png | Bin 0 -> 3086 bytes .../black/images/validatebox_warning.png | Bin 0 -> 921 bytes .../resources/asset/themes/black/layout.css | 150 + .../asset/themes/black/linkbutton.css | 203 + .../resources/asset/themes/black/menu.css | 119 + .../asset/themes/black/menubutton.css | 94 + .../resources/asset/themes/black/messager.css | 44 + .../asset/themes/black/numberbox.css | 0 .../asset/themes/black/pagination.css | 77 + .../resources/asset/themes/black/panel.css | 267 + .../asset/themes/black/passwordbox.css | 6 + .../asset/themes/black/progressbar.css | 33 + .../asset/themes/black/propertygrid.css | 27 + .../asset/themes/black/radiobutton.css | 25 + .../asset/themes/black/searchbox.css | 61 + .../resources/asset/themes/black/sidemenu.css | 69 + .../resources/asset/themes/black/slider.css | 101 + .../resources/asset/themes/black/spinner.css | 114 + .../asset/themes/black/splitbutton.css | 12 + .../asset/themes/black/switchbutton.css | 77 + .../resources/asset/themes/black/tabs.css | 413 + .../resources/asset/themes/black/tagbox.css | 44 + .../resources/asset/themes/black/textbox.css | 144 + .../resources/asset/themes/black/tooltip.css | 103 + .../resources/asset/themes/black/tree.css | 164 + .../asset/themes/black/validatebox.css | 5 + .../resources/asset/themes/black/window.css | 188 + .../asset/themes/bootstrap/accordion.css | 89 + .../asset/themes/bootstrap/calendar.css | 203 + .../asset/themes/bootstrap/checkbox.css | 31 + .../asset/themes/bootstrap/combo.css | 35 + .../asset/themes/bootstrap/combobox.css | 40 + .../asset/themes/bootstrap/datagrid.css | 291 + .../asset/themes/bootstrap/datalist.css | 95 + .../asset/themes/bootstrap/datebox.css | 36 + .../asset/themes/bootstrap/dialog.css | 47 + .../asset/themes/bootstrap/easyui.css | 3446 ++++ .../asset/themes/bootstrap/filebox.css | 20 + .../bootstrap/images/accordion_arrows.png | Bin 0 -> 184 bytes .../asset/themes/bootstrap/images/blank.gif | Bin 0 -> 43 bytes .../bootstrap/images/calendar_arrows.png | Bin 0 -> 173 bytes .../themes/bootstrap/images/combo_arrow.png | Bin 0 -> 117 bytes .../bootstrap/images/datagrid_icons.png | Bin 0 -> 307 bytes .../themes/bootstrap/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/bootstrap/images/layout_arrows.png | Bin 0 -> 319 bytes .../themes/bootstrap/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/bootstrap/images/loading.gif | Bin 0 -> 1737 bytes .../themes/bootstrap/images/menu_arrows.png | Bin 0 -> 160 bytes .../bootstrap/images/messager_icons.png | Bin 0 -> 6116 bytes .../bootstrap/images/pagination_icons.png | Bin 0 -> 628 bytes .../themes/bootstrap/images/panel_tools.png | Bin 0 -> 194 bytes .../bootstrap/images/passwordbox_close.png | Bin 0 -> 159 bytes .../bootstrap/images/passwordbox_open.png | Bin 0 -> 165 bytes .../bootstrap/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/bootstrap/images/slider_handle.png | Bin 0 -> 863 bytes .../bootstrap/images/spinner_arrows.png | Bin 0 -> 149 bytes .../themes/bootstrap/images/tabs_icons.png | Bin 0 -> 150 bytes .../themes/bootstrap/images/tagbox_icons.png | Bin 0 -> 134 bytes .../themes/bootstrap/images/tree_icons.png | Bin 0 -> 3115 bytes .../bootstrap/images/validatebox_warning.png | Bin 0 -> 921 bytes .../asset/themes/bootstrap/layout.css | 150 + .../asset/themes/bootstrap/linkbutton.css | 203 + .../resources/asset/themes/bootstrap/menu.css | 119 + .../asset/themes/bootstrap/menubutton.css | 94 + .../asset/themes/bootstrap/messager.css | 44 + .../asset/themes/bootstrap/numberbox.css | 0 .../asset/themes/bootstrap/pagination.css | 77 + .../asset/themes/bootstrap/panel.css | 267 + .../asset/themes/bootstrap/passwordbox.css | 6 + .../asset/themes/bootstrap/progressbar.css | 33 + .../asset/themes/bootstrap/propertygrid.css | 27 + .../asset/themes/bootstrap/radiobutton.css | 25 + .../asset/themes/bootstrap/searchbox.css | 61 + .../asset/themes/bootstrap/sidemenu.css | 69 + .../asset/themes/bootstrap/slider.css | 101 + .../asset/themes/bootstrap/spinner.css | 114 + .../asset/themes/bootstrap/splitbutton.css | 12 + .../asset/themes/bootstrap/switchbutton.css | 77 + .../resources/asset/themes/bootstrap/tabs.css | 413 + .../asset/themes/bootstrap/tagbox.css | 44 + .../asset/themes/bootstrap/textbox.css | 144 + .../asset/themes/bootstrap/tooltip.css | 103 + .../resources/asset/themes/bootstrap/tree.css | 164 + .../asset/themes/bootstrap/validatebox.css | 5 + .../asset/themes/bootstrap/window.css | 188 + .../src/main/resources/asset/themes/color.css | 210 + .../asset/themes/default/accordion.css | 89 + .../asset/themes/default/calendar.css | 203 + .../asset/themes/default/checkbox.css | 31 + .../resources/asset/themes/default/combo.css | 35 + .../asset/themes/default/combobox.css | 40 + .../asset/themes/default/datagrid.css | 291 + .../asset/themes/default/datalist.css | 95 + .../asset/themes/default/datebox.css | 36 + .../resources/asset/themes/default/dialog.css | 47 + .../resources/asset/themes/default/easyui.css | 3427 ++++ .../asset/themes/default/filebox.css | 20 + .../default/images/accordion_arrows.png | Bin 0 -> 184 bytes .../asset/themes/default/images/blank.gif | Bin 0 -> 43 bytes .../themes/default/images/calendar_arrows.png | Bin 0 -> 173 bytes .../themes/default/images/combo_arrow.png | Bin 0 -> 117 bytes .../themes/default/images/datagrid_icons.png | Bin 0 -> 307 bytes .../themes/default/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/default/images/layout_arrows.png | Bin 0 -> 319 bytes .../themes/default/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/default/images/loading.gif | Bin 0 -> 1737 bytes .../themes/default/images/menu_arrows.png | Bin 0 -> 160 bytes .../themes/default/images/messager_icons.png | Bin 0 -> 6116 bytes .../default/images/pagination_icons.png | Bin 0 -> 628 bytes .../themes/default/images/panel_tools.png | Bin 0 -> 852 bytes .../default/images/passwordbox_close.png | Bin 0 -> 159 bytes .../default/images/passwordbox_open.png | Bin 0 -> 165 bytes .../default/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/default/images/slider_handle.png | Bin 0 -> 863 bytes .../themes/default/images/spinner_arrows.png | Bin 0 -> 149 bytes .../themes/default/images/tabs_icons.png | Bin 0 -> 150 bytes .../themes/default/images/tagbox_icons.png | Bin 0 -> 134 bytes .../themes/default/images/tree_icons.png | Bin 0 -> 3115 bytes .../default/images/validatebox_warning.png | Bin 0 -> 921 bytes .../resources/asset/themes/default/layout.css | 150 + .../asset/themes/default/linkbutton.css | 203 + .../resources/asset/themes/default/menu.css | 119 + .../asset/themes/default/menubutton.css | 94 + .../asset/themes/default/messager.css | 44 + .../asset/themes/default/numberbox.css | 0 .../asset/themes/default/pagination.css | 77 + .../resources/asset/themes/default/panel.css | 267 + .../asset/themes/default/passwordbox.css | 6 + .../asset/themes/default/progressbar.css | 33 + .../asset/themes/default/propertygrid.css | 27 + .../asset/themes/default/radiobutton.css | 25 + .../asset/themes/default/searchbox.css | 61 + .../asset/themes/default/sidemenu.css | 69 + .../resources/asset/themes/default/slider.css | 101 + .../asset/themes/default/spinner.css | 114 + .../asset/themes/default/splitbutton.css | 12 + .../asset/themes/default/switchbutton.css | 77 + .../resources/asset/themes/default/tabs.css | 413 + .../resources/asset/themes/default/tagbox.css | 44 + .../asset/themes/default/textbox.css | 144 + .../asset/themes/default/tooltip.css | 103 + .../resources/asset/themes/default/tree.css | 164 + .../asset/themes/default/validatebox.css | 5 + .../resources/asset/themes/default/window.css | 188 + .../resources/asset/themes/gray/accordion.css | 89 + .../resources/asset/themes/gray/calendar.css | 203 + .../resources/asset/themes/gray/checkbox.css | 31 + .../resources/asset/themes/gray/combo.css | 35 + .../resources/asset/themes/gray/combobox.css | 40 + .../resources/asset/themes/gray/datagrid.css | 291 + .../resources/asset/themes/gray/datalist.css | 95 + .../resources/asset/themes/gray/datebox.css | 36 + .../resources/asset/themes/gray/dialog.css | 47 + .../resources/asset/themes/gray/easyui.css | 3427 ++++ .../resources/asset/themes/gray/filebox.css | 20 + .../themes/gray/images/accordion_arrows.png | Bin 0 -> 125 bytes .../asset/themes/gray/images/blank.gif | Bin 0 -> 43 bytes .../themes/gray/images/calendar_arrows.png | Bin 0 -> 173 bytes .../asset/themes/gray/images/combo_arrow.png | Bin 0 -> 103 bytes .../themes/gray/images/datagrid_icons.png | Bin 0 -> 330 bytes .../themes/gray/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/gray/images/layout_arrows.png | Bin 0 -> 181 bytes .../themes/gray/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/gray/images/loading.gif | Bin 0 -> 1737 bytes .../asset/themes/gray/images/menu_arrows.png | Bin 0 -> 160 bytes .../themes/gray/images/messager_icons.png | Bin 0 -> 6116 bytes .../themes/gray/images/pagination_icons.png | Bin 0 -> 466 bytes .../asset/themes/gray/images/panel_tools.png | Bin 0 -> 191 bytes .../themes/gray/images/passwordbox_close.png | Bin 0 -> 149 bytes .../themes/gray/images/passwordbox_open.png | Bin 0 -> 160 bytes .../themes/gray/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/gray/images/slider_handle.png | Bin 0 -> 863 bytes .../themes/gray/images/spinner_arrows.png | Bin 0 -> 149 bytes .../asset/themes/gray/images/tabs_icons.png | Bin 0 -> 144 bytes .../asset/themes/gray/images/tagbox_icons.png | Bin 0 -> 133 bytes .../asset/themes/gray/images/tree_icons.png | Bin 0 -> 3115 bytes .../gray/images/validatebox_warning.png | Bin 0 -> 921 bytes .../resources/asset/themes/gray/layout.css | 150 + .../asset/themes/gray/linkbutton.css | 203 + .../main/resources/asset/themes/gray/menu.css | 119 + .../asset/themes/gray/menubutton.css | 94 + .../resources/asset/themes/gray/messager.css | 44 + .../resources/asset/themes/gray/numberbox.css | 0 .../asset/themes/gray/pagination.css | 77 + .../resources/asset/themes/gray/panel.css | 267 + .../asset/themes/gray/passwordbox.css | 6 + .../asset/themes/gray/progressbar.css | 33 + .../asset/themes/gray/propertygrid.css | 27 + .../asset/themes/gray/radiobutton.css | 25 + .../resources/asset/themes/gray/searchbox.css | 61 + .../resources/asset/themes/gray/sidemenu.css | 69 + .../resources/asset/themes/gray/slider.css | 101 + .../resources/asset/themes/gray/spinner.css | 114 + .../asset/themes/gray/splitbutton.css | 12 + .../asset/themes/gray/switchbutton.css | 77 + .../main/resources/asset/themes/gray/tabs.css | 413 + .../resources/asset/themes/gray/tagbox.css | 44 + .../resources/asset/themes/gray/textbox.css | 144 + .../resources/asset/themes/gray/tooltip.css | 103 + .../main/resources/asset/themes/gray/tree.css | 164 + .../asset/themes/gray/validatebox.css | 5 + .../resources/asset/themes/gray/window.css | 188 + .../src/main/resources/asset/themes/icon.css | 96 + .../resources/asset/themes/icons/back.png | Bin 0 -> 912 bytes .../resources/asset/themes/icons/blank.gif | Bin 0 -> 43 bytes .../resources/asset/themes/icons/cancel.png | Bin 0 -> 1133 bytes .../resources/asset/themes/icons/clear.png | Bin 0 -> 779 bytes .../main/resources/asset/themes/icons/cut.png | Bin 0 -> 1024 bytes .../resources/asset/themes/icons/edit_add.png | Bin 0 -> 1088 bytes .../asset/themes/icons/edit_remove.png | Bin 0 -> 625 bytes .../resources/asset/themes/icons/filesave.png | Bin 0 -> 898 bytes .../resources/asset/themes/icons/filter.png | Bin 0 -> 305 bytes .../resources/asset/themes/icons/help.png | Bin 0 -> 1187 bytes .../asset/themes/icons/large_chart.png | Bin 0 -> 1669 bytes .../asset/themes/icons/large_clipart.png | Bin 0 -> 1727 bytes .../asset/themes/icons/large_picture.png | Bin 0 -> 1667 bytes .../asset/themes/icons/large_shapes.png | Bin 0 -> 1318 bytes .../asset/themes/icons/large_smartart.png | Bin 0 -> 1336 bytes .../resources/asset/themes/icons/lock.png | Bin 0 -> 311 bytes .../main/resources/asset/themes/icons/man.png | Bin 0 -> 244 bytes .../resources/asset/themes/icons/mini_add.png | Bin 0 -> 244 bytes .../asset/themes/icons/mini_edit.png | Bin 0 -> 161 bytes .../asset/themes/icons/mini_refresh.png | Bin 0 -> 160 bytes .../resources/asset/themes/icons/more.png | Bin 0 -> 110 bytes .../main/resources/asset/themes/icons/no.png | Bin 0 -> 922 bytes .../main/resources/asset/themes/icons/ok.png | Bin 0 -> 883 bytes .../resources/asset/themes/icons/pencil.png | Bin 0 -> 713 bytes .../resources/asset/themes/icons/print.png | Bin 0 -> 1057 bytes .../resources/asset/themes/icons/redo.png | Bin 0 -> 708 bytes .../resources/asset/themes/icons/reload.png | Bin 0 -> 1045 bytes .../resources/asset/themes/icons/search.png | Bin 0 -> 813 bytes .../main/resources/asset/themes/icons/sum.png | Bin 0 -> 289 bytes .../main/resources/asset/themes/icons/tip.png | Bin 0 -> 743 bytes .../resources/asset/themes/icons/undo.png | Bin 0 -> 707 bytes .../asset/themes/material-teal/accordion.css | 89 + .../asset/themes/material-teal/calendar.css | 203 + .../asset/themes/material-teal/checkbox.css | 31 + .../asset/themes/material-teal/combo.css | 35 + .../asset/themes/material-teal/combobox.css | 40 + .../asset/themes/material-teal/datagrid.css | 285 + .../asset/themes/material-teal/datalist.css | 95 + .../asset/themes/material-teal/datebox.css | 36 + .../asset/themes/material-teal/dialog.css | 47 + .../asset/themes/material-teal/easyui.css | 3549 ++++ .../asset/themes/material-teal/filebox.css | 20 + .../themes/material-teal/images/Thumbs.db | Bin 0 -> 35328 bytes .../material-teal/images/accordion_arrows.png | Bin 0 -> 121 bytes .../themes/material-teal/images/blank.gif | Bin 0 -> 43 bytes .../material-teal/images/calendar_arrows.png | Bin 0 -> 173 bytes .../material-teal/images/combo_arrow.png | Bin 0 -> 103 bytes .../material-teal/images/datagrid_icons.png | Bin 0 -> 330 bytes .../material-teal/images/datebox_arrow.png | Bin 0 -> 626 bytes .../material-teal/images/layout_arrows.png | Bin 0 -> 170 bytes .../material-teal/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../themes/material-teal/images/loading.gif | Bin 0 -> 1737 bytes .../material-teal/images/menu_arrows.png | Bin 0 -> 160 bytes .../material-teal/images/messager_icons.png | Bin 0 -> 6116 bytes .../material-teal/images/pagination_icons.png | Bin 0 -> 466 bytes .../material-teal/images/panel_tools.png | Bin 0 -> 191 bytes .../images/passwordbox_close.png | Bin 0 -> 149 bytes .../material-teal/images/passwordbox_open.png | Bin 0 -> 160 bytes .../material-teal/images/searchbox_button.png | Bin 0 -> 813 bytes .../material-teal/images/slider_handle.png | Bin 0 -> 863 bytes .../material-teal/images/spinner_arrows.png | Bin 0 -> 149 bytes .../material-teal/images/tabs_icons.png | Bin 0 -> 143 bytes .../material-teal/images/tagbox_icons.png | Bin 0 -> 133 bytes .../material-teal/images/tree_icons.png | Bin 0 -> 3115 bytes .../images/validatebox_warning.png | Bin 0 -> 921 bytes .../asset/themes/material-teal/layout.css | 150 + .../asset/themes/material-teal/linkbutton.css | 191 + .../asset/themes/material-teal/menu.css | 119 + .../asset/themes/material-teal/menubutton.css | 94 + .../asset/themes/material-teal/messager.css | 44 + .../asset/themes/material-teal/numberbox.css | 0 .../asset/themes/material-teal/pagination.css | 77 + .../asset/themes/material-teal/panel.css | 261 + .../themes/material-teal/passwordbox.css | 6 + .../themes/material-teal/progressbar.css | 33 + .../themes/material-teal/propertygrid.css | 27 + .../themes/material-teal/radiobutton.css | 25 + .../asset/themes/material-teal/searchbox.css | 61 + .../asset/themes/material-teal/sidemenu.css | 69 + .../asset/themes/material-teal/slider.css | 101 + .../asset/themes/material-teal/spinner.css | 114 + .../themes/material-teal/splitbutton.css | 12 + .../themes/material-teal/switchbutton.css | 77 + .../asset/themes/material-teal/tabs.css | 377 + .../asset/themes/material-teal/tagbox.css | 44 + .../asset/themes/material-teal/textbox.css | 144 + .../asset/themes/material-teal/tooltip.css | 103 + .../asset/themes/material-teal/tree.css | 164 + .../themes/material-teal/validatebox.css | 5 + .../asset/themes/material-teal/window.css | 182 + .../asset/themes/material/accordion.css | 89 + .../asset/themes/material/calendar.css | 203 + .../asset/themes/material/checkbox.css | 31 + .../resources/asset/themes/material/combo.css | 35 + .../asset/themes/material/combobox.css | 40 + .../asset/themes/material/datagrid.css | 285 + .../asset/themes/material/datalist.css | 95 + .../asset/themes/material/datebox.css | 36 + .../asset/themes/material/dialog.css | 47 + .../asset/themes/material/easyui.css | 3436 ++++ .../asset/themes/material/filebox.css | 20 + .../asset/themes/material/images/Thumbs.db | Bin 0 -> 35328 bytes .../material/images/accordion_arrows.png | Bin 0 -> 121 bytes .../asset/themes/material/images/blank.gif | Bin 0 -> 43 bytes .../material/images/calendar_arrows.png | Bin 0 -> 173 bytes .../themes/material/images/combo_arrow.png | Bin 0 -> 103 bytes .../themes/material/images/datagrid_icons.png | Bin 0 -> 330 bytes .../themes/material/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/material/images/layout_arrows.png | Bin 0 -> 170 bytes .../themes/material/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/material/images/loading.gif | Bin 0 -> 1737 bytes .../themes/material/images/menu_arrows.png | Bin 0 -> 160 bytes .../themes/material/images/messager_icons.png | Bin 0 -> 6116 bytes .../material/images/pagination_icons.png | Bin 0 -> 466 bytes .../themes/material/images/panel_tools.png | Bin 0 -> 191 bytes .../material/images/passwordbox_close.png | Bin 0 -> 149 bytes .../material/images/passwordbox_open.png | Bin 0 -> 160 bytes .../material/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/material/images/slider_handle.png | Bin 0 -> 863 bytes .../themes/material/images/spinner_arrows.png | Bin 0 -> 149 bytes .../themes/material/images/tabs_icons.png | Bin 0 -> 143 bytes .../themes/material/images/tagbox_icons.png | Bin 0 -> 133 bytes .../themes/material/images/tree_icons.png | Bin 0 -> 3115 bytes .../material/images/validatebox_warning.png | Bin 0 -> 921 bytes .../asset/themes/material/layout.css | 150 + .../asset/themes/material/linkbutton.css | 191 + .../resources/asset/themes/material/menu.css | 119 + .../asset/themes/material/menubutton.css | 94 + .../asset/themes/material/messager.css | 44 + .../asset/themes/material/numberbox.css | 0 .../asset/themes/material/pagination.css | 77 + .../resources/asset/themes/material/panel.css | 261 + .../asset/themes/material/passwordbox.css | 6 + .../asset/themes/material/progressbar.css | 33 + .../asset/themes/material/propertygrid.css | 27 + .../asset/themes/material/radiobutton.css | 25 + .../asset/themes/material/searchbox.css | 61 + .../asset/themes/material/sidemenu.css | 69 + .../asset/themes/material/slider.css | 101 + .../asset/themes/material/spinner.css | 114 + .../asset/themes/material/splitbutton.css | 12 + .../asset/themes/material/switchbutton.css | 77 + .../resources/asset/themes/material/tabs.css | 377 + .../asset/themes/material/tagbox.css | 44 + .../asset/themes/material/textbox.css | 144 + .../asset/themes/material/tooltip.css | 103 + .../resources/asset/themes/material/tree.css | 164 + .../asset/themes/material/validatebox.css | 5 + .../asset/themes/material/window.css | 182 + .../asset/themes/metro/accordion.css | 89 + .../resources/asset/themes/metro/calendar.css | 203 + .../resources/asset/themes/metro/checkbox.css | 31 + .../resources/asset/themes/metro/combo.css | 35 + .../resources/asset/themes/metro/combobox.css | 40 + .../resources/asset/themes/metro/datagrid.css | 285 + .../resources/asset/themes/metro/datalist.css | 95 + .../resources/asset/themes/metro/datebox.css | 36 + .../resources/asset/themes/metro/dialog.css | 47 + .../resources/asset/themes/metro/easyui.css | 3373 ++++ .../resources/asset/themes/metro/filebox.css | 20 + .../themes/metro/images/accordion_arrows.png | Bin 0 -> 184 bytes .../asset/themes/metro/images/blank.gif | Bin 0 -> 43 bytes .../themes/metro/images/calendar_arrows.png | Bin 0 -> 173 bytes .../asset/themes/metro/images/combo_arrow.png | Bin 0 -> 117 bytes .../themes/metro/images/datagrid_icons.png | Bin 0 -> 307 bytes .../themes/metro/images/datebox_arrow.png | Bin 0 -> 626 bytes .../themes/metro/images/layout_arrows.png | Bin 0 -> 319 bytes .../themes/metro/images/linkbutton_bg.png | Bin 0 -> 1274 bytes .../asset/themes/metro/images/loading.gif | Bin 0 -> 1737 bytes .../asset/themes/metro/images/menu_arrows.png | Bin 0 -> 160 bytes .../themes/metro/images/messager_icons.png | Bin 0 -> 6116 bytes .../themes/metro/images/pagination_icons.png | Bin 0 -> 628 bytes .../asset/themes/metro/images/panel_tools.png | Bin 0 -> 194 bytes .../themes/metro/images/passwordbox_close.png | Bin 0 -> 159 bytes .../themes/metro/images/passwordbox_open.png | Bin 0 -> 165 bytes .../themes/metro/images/searchbox_button.png | Bin 0 -> 813 bytes .../themes/metro/images/slider_handle.png | Bin 0 -> 863 bytes .../themes/metro/images/spinner_arrows.png | Bin 0 -> 149 bytes .../asset/themes/metro/images/tabs_icons.png | Bin 0 -> 150 bytes .../themes/metro/images/tagbox_icons.png | Bin 0 -> 134 bytes .../asset/themes/metro/images/tree_icons.png | Bin 0 -> 3115 bytes .../metro/images/validatebox_warning.png | Bin 0 -> 921 bytes .../resources/asset/themes/metro/layout.css | 150 + .../asset/themes/metro/linkbutton.css | 203 + .../resources/asset/themes/metro/menu.css | 119 + .../asset/themes/metro/menubutton.css | 94 + .../resources/asset/themes/metro/messager.css | 44 + .../asset/themes/metro/numberbox.css | 0 .../asset/themes/metro/pagination.css | 77 + .../resources/asset/themes/metro/panel.css | 261 + .../asset/themes/metro/passwordbox.css | 6 + .../asset/themes/metro/progressbar.css | 33 + .../asset/themes/metro/propertygrid.css | 27 + .../asset/themes/metro/radiobutton.css | 25 + .../asset/themes/metro/searchbox.css | 61 + .../resources/asset/themes/metro/sidemenu.css | 69 + .../resources/asset/themes/metro/slider.css | 101 + .../resources/asset/themes/metro/spinner.css | 114 + .../asset/themes/metro/splitbutton.css | 12 + .../asset/themes/metro/switchbutton.css | 77 + .../resources/asset/themes/metro/tabs.css | 377 + .../resources/asset/themes/metro/tagbox.css | 44 + .../resources/asset/themes/metro/textbox.css | 144 + .../resources/asset/themes/metro/tooltip.css | 103 + .../resources/asset/themes/metro/tree.css | 164 + .../asset/themes/metro/validatebox.css | 5 + .../resources/asset/themes/metro/window.css | 182 + .../main/resources/asset/themes/mobile.css | 355 + .../src/main/resources/asset/themes/vue.css | 650 + .../src/main/resources/conf/app.properties | 800 + .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + .../src/main/resources/logback.xml | 115 + .../main/resources/resourceloader/.version | 3 + .../com/mycom/helloworld/AppEntry/home.html | 13 + .../src/main/resources/students.xls | Bin 0 -> 16896 bytes 903 files changed, 107183 insertions(+) rename testapps/GHIssues/src/main/resources/{com/mycom/helloworld => ghissues}/.version (100%) create mode 100644 testapps/ResourceLoaderTest/.gitignore create mode 100644 testapps/ResourceLoaderTest/pom.xml create mode 100755 testapps/ResourceLoaderTest/run_dev create mode 100755 testapps/ResourceLoaderTest/run_dev.bat create mode 100755 testapps/ResourceLoaderTest/run_e2e create mode 100755 testapps/ResourceLoaderTest/run_e2e.bat create mode 100755 testapps/ResourceLoaderTest/run_prod create mode 100644 testapps/ResourceLoaderTest/src/main/java/resourceloader/AppEntry.java create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/changelog.txt create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/_content.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/header.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/fade.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/pop.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/slide.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/button.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/list.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/tabs.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/group.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/style.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/switch.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/rowediting.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/group.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/selection.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/message.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/form/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/login1.jpg create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/modem.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/more.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/pda.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/scanner.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/tablet.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/input/numberspinner.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/input/textbox.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/layout/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/menubar.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/_content.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/ajax.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/nav.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/button.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/group.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/image.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/link.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/nav.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/pill.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/button.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/menu.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/dnd.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/_content.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/actions.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/ajax.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/datagrid_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/expandable.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/horizontal.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/multiple.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/tools.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/custom.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/disabledate.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/firstday.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/weeknumber.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/animation.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/actions.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data2.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/customformat.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/dynamicdata.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/group.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/icons.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/itemicon.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiline.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiple.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/navigation.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotedata.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotejsonp.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/actions.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/datagrid_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/initvalue.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/multiple.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/navigation.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/setvalue.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/actions.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/initvalue.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/multiple.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/tree_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/multiple.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/aligncolumns.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cacheeditor.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellediting.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellstyle.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/checkbox.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/clientpagination.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/columngroup.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/complextoolbar.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/contextmenu.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/custompager.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data2.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/footer.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/formatcolumns.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozencolumns.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozenrows.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/mergecells.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/multisorting.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/products.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowborder.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowediting.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowstyle.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/selection.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/simpletoolbar.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/transform.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/basic.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/checkbox.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/datalist_data1.json create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/group.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/multiselect.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/remotedata.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/buttons.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/clone.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/dateformat.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/events.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/restrict.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/sharedcalendar.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/validate.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/initvalue.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/showseconds.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/basic.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/clearicon.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/fluid.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/format.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/demo.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/complextoolbar.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/toolbarbuttons.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/constrain.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/snap.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/accept.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/sort.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/easyloader/basic.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/basic.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/buttonalign.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/form_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/load.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/validateonsubmit.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/_content.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/addremove.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/autoheight.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/collapsetitle.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/complex.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/customcollapsetitle.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/datagrid_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/full.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nestedlayout.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nocollapsible.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/propertygrid_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/tree_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/group.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/iconalign.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/plain.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/size.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/style.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/toggle.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/maskedbox/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/customitem.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/events.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/inline.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/nav.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/actions.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/alignment.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/nav.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/alert.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/interactive.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/position.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/format.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/range.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/align.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/increment.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/range.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/attaching.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/custombuttons.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/layout.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/links.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/simple.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/_content.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/customtools.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/footer.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/halign.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/loadcontent.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/nestedpanel.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/paneltools.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/basic.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/flash.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/validatepassword.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/customcolumns.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/groupformat.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/resizable/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/category.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/basic.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/formattip.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/nonlinear.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/range.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/rule.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/vertical.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/actions.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/basic.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/action.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/_content.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/autoheight.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/dropdown.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fixedwidth.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/hover.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/modem.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/pda.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/scanner.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/tablet.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/nestedtabs.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/striptools.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/style.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabimage.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabposition.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabstools.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tree_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/autocomplete.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/button.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/format.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/style.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/tagbox_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/validate.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/basic.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/button.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/clearicon.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/custom.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/fluid.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/icons.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/multiline.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/size.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/actions.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/range.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_content.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_dialog.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/ajax.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customcontent.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customstyle.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/position.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/toolbar.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/tooltipdialog.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/actions.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/animation.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/checkbox.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/contextmenu.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/customcheckbox.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/dnd.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/editable.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/formatting.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/icons.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lazyload.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lines.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data2.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/actions.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/checkbox.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/clientpagination.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/contextmenu.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/customcheckbox.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/editable.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/footer.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/lines.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/reports.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data1.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data2.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data3.json create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/customtooltip.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/errorplacement.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/validateonblur.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/basic.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/borderstyle.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/customtools.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/fluid.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/footer.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/inlinewindow.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/modalwindow.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/windowlayout.html create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/easyloader.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/jquery.easyui.min.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/jquery.easyui.mobile.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/jquery.min.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/license_freeware.txt create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-af.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-am.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-ar.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-bg.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-ca.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-cs.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-cz.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-da.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-de.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-el.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-en.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-es.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-fa.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-fr.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-it.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-jp.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-ko.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-nl.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-pl.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-pt_BR.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-ru.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-sv_SE.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-tr.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-ua.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-zh_CN.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-zh_TW.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.accordion.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.calendar.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.combo.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.combobox.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.combogrid.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.combotree.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.combotreegrid.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.datagrid.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.datalist.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.datebox.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.datetimebox.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.datetimespinner.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.dialog.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.draggable.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.droppable.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.filebox.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.form.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.layout.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.linkbutton.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.maskedbox.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menu.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menubutton.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.messager.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.mobile.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberbox.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberspinner.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.pagination.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.panel.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.parser.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.passwordbox.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.progressbar.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.propertygrid.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.resizable.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.searchbox.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.sidemenu.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.slider.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.spinner.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.splitbutton.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.switchbutton.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tabs.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tagbox.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.textbox.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.timespinner.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tooltip.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tree.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.treegrid.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.validatebox.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.window.js create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/readme.txt create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/easyloader.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.accordion.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.calendar.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.combobox.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.datebox.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.draggable.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.droppable.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.form.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.linkbutton.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.menu.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.parser.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.progressbar.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.propertygrid.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.resizable.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.slider.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.tabs.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.window.js create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/angular.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/accordion.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/calendar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/checkbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combo.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combobox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datagrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datalist.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/dialog.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/easyui.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/filebox.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/accordion_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/blank.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/calendar_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/combo_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/datagrid_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/datebox_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/layout_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/linkbutton_bg.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/loading.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/menu_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/messager_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/pagination_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/panel_tools.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_close.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_open.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/searchbox_button.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/slider_handle.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/spinner_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tabs_icons.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tagbox_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tree_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/validatebox_warning.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/layout.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/linkbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/menu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/menubutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/messager.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/numberbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/pagination.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/panel.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/passwordbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/progressbar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/propertygrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/radiobutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/searchbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/sidemenu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/slider.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/spinner.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/splitbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/switchbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tabs.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tagbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/textbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tooltip.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tree.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/validatebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/window.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/accordion.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/calendar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/checkbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combo.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combobox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datagrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datalist.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/dialog.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/easyui.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/filebox.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/accordion_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/blank.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/calendar_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/combo_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/datagrid_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/datebox_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/layout_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/linkbutton_bg.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/loading.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/menu_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/messager_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/pagination_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/panel_tools.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/passwordbox_close.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/passwordbox_open.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/searchbox_button.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/slider_handle.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/spinner_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tabs_icons.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tagbox_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tree_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/validatebox_warning.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/layout.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/linkbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/menu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/menubutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/messager.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/numberbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/pagination.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/panel.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/passwordbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/progressbar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/propertygrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/radiobutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/searchbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/sidemenu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/slider.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/spinner.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/splitbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/switchbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tabs.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tagbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/textbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tooltip.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tree.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/validatebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/window.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/color.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/accordion.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/calendar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/checkbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combo.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combobox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datagrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datalist.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/dialog.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/easyui.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/filebox.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/accordion_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/blank.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/calendar_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/combo_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/datagrid_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/datebox_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/layout_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/linkbutton_bg.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/loading.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/menu_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/messager_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/pagination_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/panel_tools.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/passwordbox_close.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/passwordbox_open.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/searchbox_button.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/slider_handle.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/spinner_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tabs_icons.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tagbox_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tree_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/validatebox_warning.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/layout.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/linkbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/menu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/menubutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/messager.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/numberbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/pagination.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/panel.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/passwordbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/progressbar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/propertygrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/radiobutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/searchbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/sidemenu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/slider.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/spinner.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/splitbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/switchbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tabs.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tagbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/textbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tooltip.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tree.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/validatebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/window.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/accordion.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/calendar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/checkbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combo.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combobox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datagrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datalist.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/dialog.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/easyui.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/filebox.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/accordion_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/blank.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/calendar_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/combo_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/datagrid_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/datebox_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/layout_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/linkbutton_bg.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/loading.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/menu_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/messager_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/pagination_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/panel_tools.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/passwordbox_close.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/passwordbox_open.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/searchbox_button.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/slider_handle.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/spinner_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tabs_icons.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tagbox_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tree_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/validatebox_warning.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/layout.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/linkbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/menu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/menubutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/messager.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/numberbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/pagination.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/panel.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/passwordbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/progressbar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/propertygrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/radiobutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/searchbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/sidemenu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/slider.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/spinner.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/splitbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/switchbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tabs.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tagbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/textbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tooltip.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tree.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/validatebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/window.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icon.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/back.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/blank.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/cancel.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/clear.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/cut.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/edit_add.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/edit_remove.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/filesave.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/filter.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/help.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_chart.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_clipart.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_picture.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_shapes.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_smartart.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/lock.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/man.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/mini_add.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/mini_edit.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/mini_refresh.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/more.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/no.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/ok.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/pencil.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/print.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/redo.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/reload.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/search.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/sum.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/tip.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/undo.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/accordion.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/calendar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/checkbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combo.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combobox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datagrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datalist.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/dialog.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/easyui.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/filebox.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/Thumbs.db create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/accordion_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/blank.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/calendar_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/combo_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/datagrid_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/datebox_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/layout_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/linkbutton_bg.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/loading.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/menu_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/messager_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/pagination_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/panel_tools.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/passwordbox_close.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/passwordbox_open.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/searchbox_button.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/slider_handle.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/spinner_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tabs_icons.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tagbox_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tree_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/validatebox_warning.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/layout.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/linkbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/menu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/menubutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/messager.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/numberbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/pagination.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/panel.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/passwordbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/progressbar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/propertygrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/radiobutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/searchbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/sidemenu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/slider.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/spinner.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/splitbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/switchbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tabs.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tagbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/textbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tooltip.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tree.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/validatebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/window.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/accordion.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/calendar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/checkbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combo.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combobox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datagrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datalist.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/dialog.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/easyui.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/filebox.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/Thumbs.db create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/accordion_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/blank.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/calendar_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/combo_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/datagrid_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/datebox_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/layout_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/linkbutton_bg.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/loading.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/menu_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/messager_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/pagination_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/panel_tools.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/passwordbox_close.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/passwordbox_open.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/searchbox_button.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/slider_handle.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/spinner_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tabs_icons.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tagbox_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tree_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/validatebox_warning.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/layout.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/linkbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/menu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/menubutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/messager.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/numberbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/pagination.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/panel.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/passwordbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/progressbar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/propertygrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/radiobutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/searchbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/sidemenu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/slider.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/spinner.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/splitbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/switchbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tabs.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tagbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/textbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tooltip.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tree.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/validatebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/window.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/accordion.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/calendar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/checkbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combo.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combobox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datagrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datalist.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/dialog.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/easyui.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/filebox.css create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/accordion_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/blank.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/calendar_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/combo_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/datagrid_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/datebox_arrow.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/layout_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/linkbutton_bg.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/loading.gif create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/menu_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/messager_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/pagination_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/panel_tools.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/passwordbox_close.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/passwordbox_open.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/searchbox_button.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/slider_handle.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/spinner_arrows.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tabs_icons.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tagbox_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tree_icons.png create mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/validatebox_warning.png create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/layout.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/linkbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/menu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/menubutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/messager.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/numberbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/pagination.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/panel.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/passwordbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/progressbar.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/propertygrid.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/radiobutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/searchbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/sidemenu.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/slider.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/spinner.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/splitbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/switchbutton.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tabs.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tagbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/textbox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tooltip.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tree.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/validatebox.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/window.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/mobile.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/vue.css create mode 100644 testapps/ResourceLoaderTest/src/main/resources/conf/app.properties create mode 100644 testapps/ResourceLoaderTest/src/main/resources/conf/prod/app.properties create mode 100644 testapps/ResourceLoaderTest/src/main/resources/conf/uat/app.properties create mode 100644 testapps/ResourceLoaderTest/src/main/resources/logback.xml create mode 100644 testapps/ResourceLoaderTest/src/main/resources/resourceloader/.version create mode 100644 testapps/ResourceLoaderTest/src/main/resources/rythm/com/mycom/helloworld/AppEntry/home.html create mode 100644 testapps/ResourceLoaderTest/src/main/resources/students.xls diff --git a/CHANGELOG.md b/CHANGELOG.md index c6d105c96..4b445fcf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Add `renderBinary(byte[])` and `renderBinary(byte[], String)` method to `Controller.Util` #793 * Attach `PropertySpec` info to `ActionContext` #792 * Resource loader - allow loading from excel file #790 * e2e - support email content verification #789 diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 524f53b3b..07fa3d9bd 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1341,6 +1341,47 @@ public static RenderBinary renderBinary($.Visitor outputStreamWriter) { return binary(outputStreamWriter); } + /** + * Returns a {@link RenderBinary} result with byte array. + * The result will render the binary using "inline" content disposition. + * + * @param blob + * the body of byte array + * @return the result + */ + public static RenderBinary binary(byte[] blob) { + return new RenderBinary(blob); + } + + /** + * Alias of {@link #binary(byte[])} + */ + public static RenderBinary renderBinary(byte[] blob) { + return binary(blob); + } + + /** + * Returns a {@link RenderBinary} result with byte array and an `attachmentName`. + * + * The result will render the binary using "inline" content disposition + * if the `attachmentName` is empty string or "attachment" if the `attachementName` + * is non empty string. + * + * @param blob + * the body of byte array + * @return the result + */ + public static RenderBinary binary(byte[] blob, String attachmentName) { + return new RenderBinary(blob, attachmentName); + } + + /** + * Alias of {@link #binary(byte[], String)} + */ + public static RenderBinary renderBinary(byte[] blob, String attachmentName) { + return binary(blob, attachmentName); + } + /** * Returns a {@link RenderBinary} result with a URL. The result will render * the binary using "attachment" content disposition. diff --git a/testapps/GHIssues/src/main/resources/com/mycom/helloworld/.version b/testapps/GHIssues/src/main/resources/ghissues/.version similarity index 100% rename from testapps/GHIssues/src/main/resources/com/mycom/helloworld/.version rename to testapps/GHIssues/src/main/resources/ghissues/.version diff --git a/testapps/ResourceLoaderTest/.gitignore b/testapps/ResourceLoaderTest/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/ResourceLoaderTest/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/ResourceLoaderTest/pom.xml b/testapps/ResourceLoaderTest/pom.xml new file mode 100644 index 000000000..d251beee8 --- /dev/null +++ b/testapps/ResourceLoaderTest/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + act-resourceloader-test + 1.8.8.8-SNAPSHOT + + ActFramework ResourceLoader Test App + + + org.actframework + act-starter-parent + 1.8.8.7-SNAPSHOT + + + + + 1.8 + resourceloader.AppEntry + + + + + + org.actframework + act-excel + + + + diff --git a/testapps/ResourceLoaderTest/run_dev b/testapps/ResourceLoaderTest/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/ResourceLoaderTest/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/run_dev.bat b/testapps/ResourceLoaderTest/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/ResourceLoaderTest/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/run_e2e b/testapps/ResourceLoaderTest/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/ResourceLoaderTest/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/run_e2e.bat b/testapps/ResourceLoaderTest/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/ResourceLoaderTest/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/run_prod b/testapps/ResourceLoaderTest/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/ResourceLoaderTest/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/java/resourceloader/AppEntry.java b/testapps/ResourceLoaderTest/src/main/java/resourceloader/AppEntry.java new file mode 100644 index 000000000..0598796cc --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/java/resourceloader/AppEntry.java @@ -0,0 +1,12 @@ +package resourceloader; + +import act.Act; + +@SuppressWarnings("unused") +public class AppEntry { + + public static void main(String[] args) throws Exception { + Act.start(); + } + +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/changelog.txt b/testapps/ResourceLoaderTest/src/main/resources/asset/changelog.txt new file mode 100755 index 000000000..d06e2fba7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/changelog.txt @@ -0,0 +1,630 @@ +Version 1.5.5.x +--------------- +* Bug + * maskedbox: The component does not accept numeric keypad. fixed. + * combogrid: When selecting multiple records, the datagrid will scroll to the last checked record. fixed. +* Improvement + * Compatible with jQuery 3.x. + * tabs: The 'toolPosition' property can accept 'top' and 'bottom' values. + * textbox: The textbox label has the animating feature when focus or blur on it. + * tooltip: Add 'valign' property. + * tree: The node class can be initialized by setting the 'nodeCls' in the data. + +Version 1.5.5 +------------- +* Bug + * tabs: The selecting history has wrong order when the title contains complex elements. fixed. + * combo: The drop-down panel may not be hidden if a bigger 'delay' value is set. fixed. + * layout: The expanding panel does not collapse when move mouse quickly away from it. fixed. + * tagbox: The tagbox and the label don't stay in the same line. fixed. +* Improvement + * combo: The 'blur' event handler is attached to the 'inputEvents' property. + * numberbox: The 'cloneFrom' method is available. + * slider: The 'step' property can be set with a floating number. + * menu: The 'findItem' method allows the user to find menu item by any parameters. + * menubutton: Add 'showEvent' and 'hideEvent' properties. +* New Plugins + * maskedbox: The maskedbox enforces its structure as the user types. + +Version 1.5.4 +------------- +* Bug + * combotreegrid: The 'onChange' event does not fire when entering values on the inputing box. fixed. + * combobox: Clicking on the drop-down panel will jump to the bottom of body on win10 IE11. fixed. + * datebox: Clicking on the 'Today' button doesn't trigger the 'onSelect' event. fixed. + * propertygrid: The 'getChanges' method doesn't work after editing the only one row. fixed. +* Improvement + * combo: Add the 'panelEvents' property. + * combo: Attach the default 'mousedown' event handler. + * combobox: The 'setValues' method can be called to initialize the displaying text. + * combotreegrid: Press ENTER key to select the highlighted rows. + * panel: Improve the resizing performance. + * filebox: The 'files' method allows the user to get the selected file list. + * searchbox: Improvent the 'selectName' method. + +Version 1.5.3 +------------- +* Bug + * combobox: The 'iconCls' property can not be parsed from the
                                                        markup to display a different page. + * tree: The tree node can use markup to act as a tree menu. + * pagination: Add some event on refresh button and page list. + * datagrid: Add a 'param' parameter for reload method, with which users can pass query parameter when reload data. + * numberbox: Add required validation support, the usage is same as validatebox plugin. + * combobox: Add required validation support. + * combotree: Add required validation support. + * layout: Add some method that can get a region panel and attach event handlers. +* New Plugins + * droppable: A droppable plugin that supports drag drop operation. + * calendar: A calendar plugin that can either be embedded within a page or popup. + * datebox: Combines a textbox with a calendar that let users to select date. + * easyloader: A JavaScript loader that allows you to load plugin and their dependencies into your page. + +Version 1.0.5 +* Bug + * panel: The fit property of panel performs incorrectly. fixed. +* Improvement + * menu: Add a href attribute for menu item, with which user can display a different page in the current browser window. + * form: Add a validate method to do validation for validatebox component. + * dialog: The dialog can read collapsible,minimizable,maximizable and resizable attribute from markup. +* New Plugins + * validatebox: A validation plugin that checks to make sure the user's input value is valid. + +Version 1.0.4 +------------- +* Bug + * panel: When panel is invisible, it is abnormal when resized. fixed. + * panel: Memory leak in method 'destroy'. fixed. + * messager: Memory leak when messager box is closed. fixed. + * dialog: No onLoad event occurs when loading remote data. fixed. +* Improvement + * panel: Add method 'setTitle'. + * window: Add method 'setTitle'. + * dialog: Add method 'setTitle'. + * combotree: Add method 'getValue'. + * combobox: Add method 'getValue'. + * form: The 'load' method can load data and fill combobox and combotree field correctly. + +Version 1.0.3 +------------- +* Bug + * menu: When menu is show in a DIV container, it will be cropped. fixed. + * layout: If you collpase a region panel and then expand it immediately, the region panel will not show normally. fixed. + * accordion: If no panel selected then the first one will become selected and the first panel's body height will not set correctly. fixed. +* Improvement + * tree: Add some methods to support CRUD operation. + * datagrid: Toolbar can accept a new property named 'disabled' to disable the specified tool button. +* New Plugins + * combobox: Combines a textbox with a list of options that users are able to choose from. + * combotree: Combines combobox with drop-down tree component. + * numberbox: Make input element can only enter number char. + * dialog: rewrite the dialog plugin, dialog can contains toolbar and buttons. diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

                                                        Here is the content loaded via AJAX.

                                                        +
                                                          +
                                                        • easyui is a collection of user-interface plugin based on jQuery.
                                                        • +
                                                        • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                        • +
                                                        • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                        • +
                                                        • complete framework for HTML5 web page.
                                                        • +
                                                        • easyui save your time and scales while developing your products.
                                                        • +
                                                        • easyui is very easy but powerful.
                                                        • +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/basic.html new file mode 100755 index 000000000..36eece52a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/basic.html @@ -0,0 +1 @@ + Basic Accordion - jQuery EasyUI Mobile Demo
                                                        Basic Accordion
                                                        • WLAN
                                                        • Memory
                                                        • Screen
                                                        • More...
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/header.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/header.html new file mode 100755 index 000000000..6ea6250b4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/header.html @@ -0,0 +1 @@ + Custom Accordion Header - jQuery EasyUI Mobile Demo
                                                        Custom Accordion Header
                                                        List 26/51
                                                        • WLAN
                                                        • Memory
                                                        • Screen
                                                        • More...
                                                        Ajax Loading via ajax 23
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/basic.html new file mode 100755 index 000000000..995b0f932 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/basic.html @@ -0,0 +1 @@ + Basic Animation - jQuery EasyUI Mobile Demo
                                                        Panel2
                                                        Panel3

                                                        Panel3 Content.

                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/fade.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/fade.html new file mode 100755 index 000000000..b85c7846b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/fade.html @@ -0,0 +1 @@ + Fade Animation - jQuery EasyUI Mobile Demo
                                                        Fade Animation
                                                        Panel2

                                                        Panel2 Content.

                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/pop.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/pop.html new file mode 100755 index 000000000..6bcebccd1 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/pop.html @@ -0,0 +1 @@ + Pop Animation - jQuery EasyUI Mobile Demo
                                                        Pop Animation
                                                        Panel2

                                                        Panel2 Content.

                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/slide.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/slide.html new file mode 100755 index 000000000..4528d68c8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/slide.html @@ -0,0 +1 @@ + Slide Animation - jQuery EasyUI Mobile Demo
                                                        Panel2

                                                        Panel2 Content.

                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/basic.html new file mode 100755 index 000000000..6f9cdc6a9 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/basic.html @@ -0,0 +1 @@ + Basic Badge - jQuery EasyUI Mobile Demo \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/button.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/button.html new file mode 100755 index 000000000..db5d5310f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/button.html @@ -0,0 +1 @@ + Button Badge - jQuery EasyUI Mobile Demo \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/list.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/list.html new file mode 100755 index 000000000..c06f18b3c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/list.html @@ -0,0 +1 @@ + List Badge - jQuery EasyUI Mobile Demo
                                                        List Badge
                                                        • Large
                                                          234
                                                        • Spotted Adult Female
                                                          215
                                                        • Venomless
                                                          12
                                                        • Rattleless
                                                          6
                                                        • Green Adult
                                                        • Tailless
                                                        • With tail
                                                        • Adult Female
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/tabs.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/tabs.html new file mode 100755 index 000000000..51cd85977 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/tabs.html @@ -0,0 +1 @@ + Tabs Badge - jQuery EasyUI Mobile Demo
                                                        Tabs Badge

                                                        Modem

                                                        A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.


                                                        Scanner

                                                        In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.


                                                        Pda 23

                                                        A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.


                                                        Pda 13

                                                        A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/basic.html new file mode 100755 index 000000000..e500fbe7d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/basic.html @@ -0,0 +1 @@ + Basic LinkButton - jQuery EasyUI Mobile Demo
                                                        Login to System
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/group.html new file mode 100755 index 000000000..8bd165da9 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/group.html @@ -0,0 +1 @@ + Group LinkButton - jQuery EasyUI Mobile Demo
                                                        Button Group

                                                        A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.

                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/style.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/style.html new file mode 100755 index 000000000..66620940a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/style.html @@ -0,0 +1 @@ + Button Style - jQuery EasyUI Mobile Demo \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/switch.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/switch.html new file mode 100755 index 000000000..f2e128e34 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/switch.html @@ -0,0 +1 @@ + Switch Button - jQuery EasyUI Mobile Demo
                                                        Switch Button
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/basic.html new file mode 100755 index 000000000..d81c652de --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/basic.html @@ -0,0 +1 @@ + Basic DataGrid - jQuery EasyUI Mobile Demo
                                                        Item ID Product List Price Unit Cost
                                                        Basic DataGrid
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/rowediting.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/rowediting.html new file mode 100755 index 000000000..8c425e862 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/rowediting.html @@ -0,0 +1,104 @@ + + + + + + Row Editing DataGrid - jQuery EasyUI Mobile Demo + + + + + + + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit Cost
                                                        +
                                                        +
                                                        +
                                                        Row Editing
                                                        +
                                                        + + + +
                                                        +
                                                        +
                                                        + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/basic.html new file mode 100755 index 000000000..33f5e5bc5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/basic.html @@ -0,0 +1 @@ + Basic DataList - jQuery EasyUI Mobile Demo
                                                        Basic DataList
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/group.html new file mode 100755 index 000000000..d9e644352 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/group.html @@ -0,0 +1 @@ + Group DataList - jQuery EasyUI Mobile Demo
                                                        Group DataList
                                                        Detail
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/selection.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/selection.html new file mode 100755 index 000000000..06b262303 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/selection.html @@ -0,0 +1 @@ + DataList Selection - jQuery EasyUI Mobile Demo
                                                        DataList Selection
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/basic.html new file mode 100755 index 000000000..d02c84d96 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/basic.html @@ -0,0 +1,46 @@ + + + + + + Basic Dialog - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Basic Dialog
                                                        +
                                                        +
                                                        + +
                                                        + Login +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + Sign in +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/message.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/message.html new file mode 100755 index 000000000..0254dbe49 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/message.html @@ -0,0 +1,41 @@ + + + + + + Message Dialog - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Message Dialog
                                                        +
                                                        +
                                                        + +
                                                        + Click me +
                                                        + +
                                                        +

                                                        This is a message dialog.

                                                        +
                                                        + OK +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/form/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/form/basic.html new file mode 100755 index 000000000..3d0860d7c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/form/basic.html @@ -0,0 +1,44 @@ + + + + + + Basic Form - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Basic Form
                                                        +
                                                        + Reset +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/login1.jpg b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/login1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e9faa80895abbf60d56eb871bd1e8a2b49d4a1e7 GIT binary patch literal 25789 zcmeFXWmFwsvnPBAn&83R4iMbkCAho0yK8{pc8~+X-67%N9Gu`5Bsd)0gS(St_&@iV zJG17~++jOvO#qgHjJym04h{}r_PPQ7ZUGcN`q|q6 z0Lsb$MgRbS0)U4j1|YstaIZTj9Layuf^Z)I@c+912EhAz1_ZWpSc?w2P-=pKv>Mr&D_$_+KbY{+ScAhg#NtaJ3Xbn zl?c5qk21Tmo0PSkyVMnf>+8$v%f;&IVavuLARxfT&dJ8f$@0p< z;_2_=W$wq~;z{#w0n*lZ1cw{Z3L5~23?wzm?rF}LBdu(IM|u`uVd zV&UMhGG{Tj;^JVj;^MO6HyYjZDGkN>b=)7t(2oBdAqqAIQ)Hm**Nl)Cm#R!;Ud)|6Tv-kx5vnC*YJ;a^Pun-BiY{p!|N>OVW-^-aqEAKHH_`7b&7zuooU?)ooz z;J?KDe~hmGHIZApyw2XfuhaD36@U}~5gq{n0Uq)7fQX2Qgp7uQ{Ms;4QQx9rW4?cn zjfstogHK9;gG-EujZH{JNK8gXK|z5-KnqXxXehJ(k3`#S)jcnxTXuVL?>$oKCC_XZx})k>7N?@(VEny~uG_ZqPOXZsIe{|7GYS6pviy9ELHA6#&6d|!8XYy?Cq z4y5-I>d5BqIMke>D7cc~qWa#qG+Y`NcorVh@9=@#TeO$|K>HW6|2tq||4+#N6WIU4 z1p}bL!@YJMJT^cKP_%`Kv7~=2IC#B2YKvDB=^jYi2Beld+&c%{po3@Q;`{MEj@1r{ zg?c(pOKok4gd_l#qPJyb4k+nQ$0iaEhn05LSRUg8<9O7Re*uk&Tt9V9H=XG)(H{bg zO}039gAc`feMA5g9tu8fOYNLaq0{J;B6%WG zr|jeF7W7@_r*m;c=IKdp%zRjuo+we$Badr6Lnf><$|sP4eat%#W?&XaXNfZq2Nn>Bbu$N2lBqd zUqF9I{jXre1#h5k%04h!rRC#R{AjQ6{m@P}ZQWe8*E(^oLpM)H&Q!iU{@SwibY%jr zZCICn{aO-v8WJSvz&-;fI(aoyT`K9zN1P9Au*^6(yK&+nwKR%8lg@lwVhJeM&PRDe;VTjl^W_lI|jIm+_# zoX(8sQW|j1r=xM6&l5)~yPA198H7ejnV0!_T*m3?)HynS>SZbN+6S%Oa#Gacpp%aP ztS&yUoi~*aoOee%#?3#An)$(L5n+C1MuiQiDzrF?ApO>?#@Dv8%!IN5?-a0!}79h zKd)*GFh;wC05jkQn>ZumEMQl!9U#l+Hl z0tTCyW?Ma|$AzVcvU%v!7Z)S|X~*W}q@V{!Tva*k;6ho6K}T0aHN^9P8m_KQ$k6V2 zNj(fxZQ|G%@%Ma(efna675?3{s~uvd@i)|DR2kB%ii97zVby|W3%W=4j_IAq2tEa_ z?cZAnW>$nyqA6OBVw=1DZ0XC0qj*E$n8H!MZ0G03=^>;c-0vA$j5a@}}Lk>4llO zUgkEvj8uFTOqN_L50ByXMz5S!7Ox+uwzD9$70F-h?1kypMif$u`4w?fQ93RD&S=w( zf*Hw}nU)Vz zLI|&I*v!soyWNAR)Jux@o%y5ASxLE({`f-Jq-1g%`twf-8W1=?!qdp6@@}6b6I6uu zjgnfxqbT}a&?A|MV`=B2v(5Ke))Sa);@LV;&5~>+TOE@26m4tIX|`e@b^c(lrMufD zOct%i+Czg*K*pkNC28wm7Ji|@TWs|Qsg8$~Loc5{qHNX3lycVv*CNE#{%Npu!POZ( z_adlj>@8hT*^-;YK{_c`07jsWO|uIc?;*=byWWVN#`+SNr1BY(ny^uH581suAn2%~R%8?R{=4l}JVw@$Bvb;qsL~sqXELE^Y&>~&v>cOm4z6n; z(n!pQ@Z}qZG4fo|)|v>;z|Vdwk46||ncN4T{e_=s^MjLnKBv1ud+vtAdp$v=DbsV}Z#ceH@S_CPj zEIfNfi713AE6Hackladlgl~$3jNcYs;2ix0tdM`0vn8skq)P!Ge@!k6km5`RxDR>?k}hWZf|`dD_a~p6IZ^WD z*P1)Wahk69=-g8T1|3W`k~2|064 zNe=d8XhCBw*Muhc5!WR8_|g1G-P-t%!<4;3oG(t-AWc4MISsT}qv4=~?ww>Q_&M8J zmsLnY6Yp&4eKzg<();8Mhw-mO8R3Z$*EfgqwJQ%bSS&0Sb6k7L&Q4rJu^a_?N$(0n zbInpujTJ5NYy5p9I(a<*0^WWSv|ih6v(`#?BJ1%*O-8P-DcEuHJZ^E_>Ut9x3u*SfMvw7=2kH;B2Mz7&el4;+vHw8zm1r?)osu%?& z21k!uwOnEapRJ3%y9{Q`_~m=j{K5V#Jvqcd{~=%BrcGBoI>Zuv4V-95%Yq{_T^%zHw;blyPY(>%c0u61Pb!sTId2(dve#fpm;`q#6*AmHB z43of25AW5F-1)(~%(Pl8BZnie!`$ac(eOK>ogiIKAiNS?%H0X>BN&<{(Omy~+jBOq z|1yGl;p&WsBw^rZN)PFGg!}Ue7r#=_UtFy~$?m=Z$K%EYg z-M4g}CY~UV7f1G1>Ij4rv5y*Fwm`x;Qg1F!oNmBxJzL*eRO2Zb)Gp=zwfmbZ+ zg?EPUr4b@w<9m2}rfVY5EW5Y@JM=J_Z7sHEqwJu`2A%@! zf%Ic{*K$K4m|j1LnOu*HuN(6CFu?NXb|Vi{RP*$ra^pM?!_Bjv??>o5o{SIS)Y>R= z;iPI8%Vao4`qRgRz9YnG1N}3NlSpPQd~NlCYt24yeNC{-ddwJjX}5O ziELbvFCS5uAoNTreOaEG_zPI5VlAHr>&zXV*!XQ(J&R7WZmzzJvm?WYA8VtNkXDZ; z*cvs4G)a`@U3Nxlvz!{kbgd~EMcI+jQ!tgbGn89rOst!k+;^kj8`~@>SBHd&=DNK- z2sfNw9^Gqu)^E03rqlIaue)+yxzn1r53c7`tdE8;m)WFDM<|TEq!Xb`fEa}9O}CKO>nThxmg-W}ovV#WuE1+B z#`ifHxh1*IU<`f3R$5hqi~(5WUGvvR-G+ES6MrINnN?{IK!;>_3nA*6=afR3n{(5n z$@=VQCwM+0>X_o!;m_nwfCoR(LAHIo#d!?#d2R3%9^@d;n$+eBW=P$$hObr@4tIqJ zZ?BnxA%Qn}_;fqc8LgT<*Y9puI?U45g6JN)PkB)8Z_+l&t=XdRYbIDBwx{)pKBN`XV?6FQ;xiVSO|Q+5QRfm z2}RvnStjQmIZHGoOiJQt6Oh6L5FN)rIIuXI$Q`FbU?pEw z7%KovqWT6J$wqZC8Qhn;W(@DPDgDRMj5_>YoT7h3;N^(DinLKF!xKL?vLAPc-0)4I zWf8pFgciHJOF3bR0L_O6JVIJuxE~lj7eR+l4*ll5l@Nr_#Y58|S0#K6_|4x7$hA&t zd80P@9SI)|e)Y&_Zv?1}>wTwfxty(7X!Lq^T$55uoC#d$^l3p^N#;v0MV3LXGDAfp z-;8T>4YAiP*4po)`n}=uSdWn^p&F97@GX7e-P7#JeIC3rAID^Q-<2Z1-`uAN z=w9y$``U4tsQ*Rp3>#13ubd^IkRnI2E1lGR%tkL+%(=c!-Rqi$8A6){Hiv!}!pxka z4nET+LzW>$+isd}Hm5uJxw3MY{bylrkQ5ef{I#^>bAtL@LP;a()8!=Gv4IbEzk48h z!tW*@)%yO-)keYHJ?+q*qagR}=I!rjtIPIK;?qvl5B9o$4AA;kLeV>j7~w3#XY=R7 zoe^hEQEE-6nD##s4~bvp`IAIf4I_|}-c;yZ{LEZFGI#LR4e)_l)qg0Kai@v6ek<0u z}* z6DDQ`;cp+p?O7!gX@@vKZsG?;HQ@tEM2rl z*G(J5o@uJK%F7JKmZpwM!>T#O1)M$$9?%!!sVcP3vUO738M_cgu5~Ip?k4x(y>tJJ z;d?i1BEuDKPWPhGxG3OcX32GsdF3DN>&;IUBI?(66SU`_V1_c*|G?{!&9LtBLp#aYANdHQ| z^rOjz8U8JNwU4wbkR^TWDKy=>Ui53MkTfr>BWLvX314Jv=eg~ER^qYh9^KB zmcZPdGWVy%3`g3DJxE@heMYjN>7lBd9Ouvga-4dLZ~C}^$}+OB&JcLpkVR8BUbVY1 zki~@CJ43GZlatNxWbJf68(eP>G9eO_dPp>UYG6E&!aDUw(7+~xtIBSY!g;6qS6TPVcRMnm;^88DuAw->dLKXE_wJ{m zNtPy-g(K5`-ab>rXB|qN{fuAx^EpPy({`qPR!{Q}WJ`jg{9U*e^B7qij>r<;$-f`4 zaULjGXI~{X<3m#=B0{Pw>+B4P(J*opG?TZ|c{D?de4q(lm|R>-SW7awo%i#gO`p`G z)N0GJ9k^$eqKZC?(whQ4bL=#GuG7w+?kuJnN6F@Yz%6S^O$LH9ko{qzXR`45{55gl zy*OP`YkvZ7r6Ys&FqVZQ-N59(0GnjGO#pybH$0czZxe&*>t)k~GbB3o1m?B)Op~H3 zX`E`mLJS|;lIZ5CcUmoB>rZwXF<8{)1#Psq7>J2R+WI_v-%xm4)lKJ!okY0W4;)~= zo91u%#I2DAdc&?dwgbZJ4+_vxh7A}T(D>Sl93&OZ6lWQe`(@J*t;@pGRGlx~RCapu zmef8>X*4#5o>GTx4czeO|0Qro;lhprgEw-5nm+0 zsUu7fKMFD|B+Yh>z`G4{*{2UBQR|quc1(-C2MUb@W4eP_Ro(1|^^KD(OD_nbS-AO6 zn!nXMyP~DWZ0bJGC=7fWH%xIK6&o?r3Ks6{h}%(b>X>IcOD8JD>IhnYAS5N#Roo#H z)9$#`$%Lk#;zyU^g@Qo!LnrKdpXD}E+;8wQc1}g%zplk(>Cj?QyQGq2#R}|H9fI8B z(jUutnkO|CXXy%zrcYQs77lPYQ-?E9R)+}>!N-p}Wv4Hx0;yi{!iyeeCzFFdt7`#1 zdG9K#ZB*+fsryh?J~;xB3&x1{nl;HGrz-1ZX2*F7x4jrLHw?LR$$&J+ zlB%BzR}?YCAzz}VcUx>D*P@0&yG%HL0g1T_7Ds}S>(KNK`(-GB{`)oYtMBatq2L!; zfo~?r*^1|cAHC5sh*PC1CR!WAuh9oSi}%&Yb~9yOEG@8V$SYq<(GFC6f>yr$IIKJz z767+`yW?W^%UffuIV~LW!=N*RI2ObV`qZ4r(PV~`&OA(+n-cVu3h#vX4wherEm*Ik z=ub}=w;JX-OA{i|b3A1*ak1({@E2g)HBV<~JrgUNrs;LhDL^X@|L_?(bvR(QqdW1U z^m2LZS0ipq5-Odfa(%x)SDAX-f4djh!+2L)Oq!C;eB{u1BA8(acZQ#F}Py^~VwEBSP(MAIXZ6*q8 zZx9^%>M~k9v-D+_q-+s+^a4gk$vZ+=Z}g#K`*L41?sz>!(`-L9r_q26(}`%aWU0g% zQAn+JpDZB18V{kwKpnn-h$@22A*T4~jXQ=|YsR&4Clxs&n4Ebp56CMA*zMXhX~kH1 z`2$HlIZd;drW})gX+bs4qAUH%jwXab?;AcNJh#>7!hobjh=|6V^6Ker0*CqZUQ1e^ z>DFmBo)YKYPXb_~3=%Rw&2=?BhyB&M%#eLkQnFxb+w=&`MA*$Raj6Us-hhnnCkYcqtU{?dX`nqI139n z+fGTiCHYkDQ`E+)aaf*saH^h6yoRwnw~2=FR&>3Du);q5!~ONz@1|AByFk=(y!y7Z z=&#_@^J?kuWdNm{TaVctk2WNNoO602wcm?APR>AX z&bd{xBb>CLYl&gcJ&xr^5oSB11BaoWX+L+Ob^LhZ+rH04Bm#+2OI0qv!*ParOm$kX zxdRE$^2NYSz}Cos#19ySMa#n-(U zpf4~#_{)T-pVwai_Adg#KrRJ@W>q=eW}LPho)1*JS<^vb}E3WM-Js1>a@&R$-2YcHL{Z?>H@NjOyU4h{!}HOux6KZy%_987V%~{R_}f z{<;^10^b64pcpKiF4;1S;R*W4Mwfs3NsI-g{?XekLhyq}8DRzWM-5-wWEByn_=iAO z#HhB~)n%dzTe=+u`GRpNioCk?gG!?-|6U&2YJ-d@nX+vbB(n}fmy!zM%tW<~>+z(H z4=Z`Y=bFl$KM!H1al%6G2ZuU3yUnmjQvsrt30)SlauwMtHAQH&c~h%;0kb0ztZu>F4iEI8l3+ds+EM;F z8WJb$IUWiM>ZDg{6D59_FJGJR+Fn0H2n)<2RZ1OX{9=o6*|M+M^n0CY`INP`iAbd& zB(Ss#QfEP>=o6)U6zp7z&z9f0-EKE_SZ=9~+{;OO1dv!t8W!A~R%Wy=8bR9R zfYyV4xu>;LHB5<-g;#Hmp4-jQ;N@Wzwl8m{ORn#BkucIVI*NHd1u?Tz!HiDpUb6hy zj-oZ3Jp9~xJU3|)@(}o}WBq-$={a5wQd9D2kbg`LNe(8+gn4dzT^*m%+%(Nn z%z`GcuCJG{600UZq=G`~yHjS*+cizw_Fc$SvD!{&+m%aEE6$L)hK%zwKYbN#-Lh!Y zMgkvi(oUYj!UExbDt1htS?s&wl<~k1X91}_U)4igH`eW8qIngxUE}IN2A*rIvUmby z+jSb`3IIs^#~Ok5Y{mRvK$FYI-{)d>bJB*vvmY4Wu-!{00&XgscS&9|QG!lQ)4cT@ zil+v9Aa$kD$T-$$id7;p%|u6u<~*7{w^g?2ZGBe*8P2uSm9EQ4u_a^*rTG;RN7%8c*>DH; zFsZIUAZcnJ6kiu>MOJj}9+A|)b;y4gAgkhLKiH)gPb>nNZ+cQ_QinZWDZ9JLZ8lbJ zKEow48P{wjsdu)4ztAKx%$uHlF4>2taJym`6CCYse#_s%$^0ROor&a3%Lu)I;}0D? z5YwdDD1>K_gwUIu#RY{SiajTZFS7-&8A%A{8ro(QPkj>J=T zBdn-aa)Zz?l0pR1q#6bReFu&B)Srj+bJ5FI-|-K*7kMv@2z*BpIZ&7gMd~D+e0fIf zJ)0XHbX5V4u{H5Dr|Z*5fQHD|Bq~J#8RKbZ3vyq(u$w#(lP))XFqu?Id)b%c1Q&Ct zq@^AI>2z;w1!g2qxVAq^I8e@Q{F@_}=>WOztA9~_ZtBVu@B>r{Ux|rx z^Aw(DLo8BEm&1@J)mW~c$p~=vl?1u*l=LECrzYsD2(gg%eDg<$& zxigVA?JppPAEA~e!?=z9qSEV!kfUOzl}&5B?A%Vmt#rhnJ^e;fJ__+3mmy9Jbnjq} zS@S3|9YhItT%|D@S+QT2F})*}b5|;FcT*6}q^eNQQGf=YeC{m*r5m$-Y(KI)_1c&i zx(f`GzD^k2sdmvc`HSB0n9-+Aza`yxFfrFfA{J(bqw@JgWQ5R5z_WWakbnsMsclSb zB4@k<`8V}o3QwGR`FE;o8o`$$gZ_MRUR?%92vL{xNdv@MjQ8;a1$Ol-nKdN#TXW{5 zq*%PG;Veh#dN!M+eb`l32=*0=q6T>qaK?-wQaFb7gL{L zM7om80Xm8}1b@31)5tUR_O^!LE@Po^x|`GpMq9EHR9^^9DEd?=V=?Y?M=1U#f4>V; zseO?$MGk!^rxNt%ArvUdl^e9JB7aLCy2!Iv(2V;X_UC;|Q**tcmtu^ur9FWQirb3m zS#JI?!cN?g$8?saYL?OEuk|zgPEIu=MW$#lni4`zk#XihC339@|8|R0=ZI5z+zbb! zHETq-`U-IiW$w+9>}|CxrYh}y9Hc3bpV$tv{?K<>|EMFg7M}RkJv_;My*&i|2)nmJ ze+oBlItapjTxsR}tv(iBq&|Gu9NIawlD07HTrz6grl>frtL2y=xUY|0g4XMN)os>m z;Ts~@xXFUCaIIVCsHoRHXo2roApvgU6B<2O$?v>_tT>9uYF{Qi^;orpAz!h%WCF09 zht+%Op+dwz=8PT!mD?}wqggf1{sIiUtXr-o-yy&%PYel_%Njfrmfz$kJiWC`aOT{y zeE4SR@6D|O$;qPC{JhdeFLv@7Hy{$ZOVQDc<#xi=wA+iK7cmv}4$&gRiSLd3@;_6hFlTyGZQED#*?(nClz8GfuuyWilV}t5z*bl)U zxG9m^Mw@WCpqrhms`9+~q0_N(h{_DfkJ6|iq-W>B0X0aEw=0*!`(ZM1B4ipOo{sG` z;yzR|Oy$;&)DupbRG=K;V+lQ{GnpY{aIP-zIeAXyL%8m&MJ(}x7&R^vHrf-U;I|BqBwQGRf$Th{LY#LY@A%bwksY-_5j%i&*LMxuDUu-cf-2ESYEakgEXm z%L9>BYr7_4x*AcG%t?U}fMY$cMu|!>L{Qgn+#bD3$42i0UX*K6o|4a1g)!B~$(g3I z4f?FxmjGARrr((pAC(AO2S{F~Sp;whqurP)-If)v`~_Isr~9^`OsfWxtab>O@iG7z z^P^dkMs!-@!LwVK5lv;u^f0YtrF2B;h0gZ>hi*=8}dI zYqn(h!`ngt;mP};Za?)|=i|kR54&NAt+;dlic$mq^&CYOJldzFDP)QSy~LT>XIhs9 zDNdejffR;BiEFp&ABo{4Dk4b`?dnkvOKu2Oi1n&*wWc8Ki|-dXPPjdznqc$%?s>K_ z7uM6;Q5ZXep~dn!)bP zSmgnCBQM9OdeN$Jd_Uh`$h`)(F>psgj#Z?!4B&tOo35wa+W<57e#fzgpuO?%#eFat+j!5kai&L}`kx1k(%mNZDL`^_KPwnIZvo<_S) zopTG@Fh$2QC{*99$CSBJ{X}NlO}v~ZZI$n}nCG4owX%j4;rzpqJ9^JlFkG-BAAVX~ z{LlSDpAcL~b7m&KZaVsjs18T+q~PwBD%rPyeKAp#8*e4p`jW^u&W zdpfJK!e*rJ1Z0Vb!xh6Eh4k_-6OLiPg~dz7ec3kgx6GKD1! zc#q}es_Dn?W`@btEeb5#vEGg*WN~))ez|IH-mIdJ?|mYzV^5)ItScutl$qiA>85u(~nqQ#0tU}Ql zasIS#odbJMLz0&fk0$J0YVIu$=gF`Sl=;_Xlb~tT?zItnn3*{}Y8%kgrZjJ`!Bx}ZfdTZDqF zl8i40^?RZBcrd^0XLaaIQy#f1BkYK2)|&i8$t9da=i0q5at9cmFBEr;iEWg?XBfrA ze%Wt#v0(r`Z@aEa5l-w(UA+}yn)^ffNDxflILBO!u!__jIwLOnXPS~c(!(=#Qnk#; zYL?4UQ`E<>0Nv5GB6i`9iu)tE>AF~Yj?u?n)>03D1i1CD4>Wz3M+O)L_T^LT(la!z z?Q)qF`9$}e-~IwnLF8hcNTQe354IU97k4GT&RnQDhX=8|bv6++FDa}W?F0x&@T9*T zYcDcl*qWvghq--pDzq~^CWNrQno=@@i+7!^5YWt!)@FG=ZJ>{)FVbEPMHkkjT7Uf{ zEN`*km6gu$a?hLV8fli^q zPg;n)Jt`$1YBF!X#3%qhr6o+I;jAL$n62P)u@kACsrVLj2DuHx^Tcl^2wqD+l)V0O zNTE$wD00PUiuuaN@I#g}Q4mjnrp)P1DdH?it**sU@AS{CNT<$LCQ2;x+1CK@i~b!U z`R!ovEEs0u$GaB3!o@O9Zomlo-1|tl=|v{uzu!gDPizeWH7Ewr_9pT=Ryc;eCHzBO zh%+RrCQhMgV*jkef&)XRnrm+JnIytg(U5* ze(geug;`bkhrGO^{8*G`PFN%eaV;-xOy56)f4zr+wZ3W-utP7lMtH2Rd;jOdW#nJL zaO-M0`DG>Vz4#x@7iYQ|~cP-xBT4vFa-ZrC>*jV^V^`@Q^h;7upCna}*agBUL1d+F5iT_d9avOY`vmv&AuO9BV;b#WVI;>UCO1-N5uZF zJWSW7w8RsysB9^JA(Fz&bpF`N=Vq9T^iUVqwiTU`K`CQ5rL8&}vipsvVi$Y5fe zHA0c^n0*OcXb%CsrgxmIo6~fLr|g|uWz&*(!6|$=i=?*MhcDQq?WUir35UDRYJeTd zkw;)E7x~i;yaefOm__`)dU2$u3SXJYW<+sx^XKim+5(b5~}nEao3Hk8u&jD&1bYH zJ2E->{vmBzEYl)@4a`g-V5Lw&ff05krZt?Z^Z+l2vsEU&*JK%|^$n z6`Hdar7fADOAmQ-%Z~r7+JoZeec}iG-4w<5XCCZEE=Esg?}NWgkvm|~#UiCSP0OMu z!K$HS+g`Ql}xc)Sz^l$v4+KKjoX+ny^Zp?y(>Yp%g2B@iD&3r!_5AlMb9p^ z5PLV2o$u|b&nm-|-xytcweH72p~pI%I(N{;KL`tFbgoURwTkX;;P(nl&Tp^DSIL7s zwSy^+4&6oLxA7tm+J5T5WUQaJv7YJHexHN;Ndt7E6P#~OHTyl{C2Nt=Ao?&V$|(kx z9ee>&=YBNe)-`G3xvuT#?BPL(MGY+h-+3hiKbr8eCCnovI(4xMsiCRTw)Ik_t!8y# zFtJS}TZm4r8XS~Ezbd-nG?z~k7IKLK{zV`rhIF&Imn@W}!DbuX$UhoXWVv)S*@E0>!)03K*5k}4bO*Ob4}m3Ge32+pzd zY$iI%zUn)_6o(joZ+6T!DRRhI z)G>gjGOZY_GC8NnAw=S9?4&mSHe{G0bPX7~U!CWsjhupco#IHffgz{2r~)vUCAp4J zs@tQgIVS)qBo-M$Im^9*iN5j{K||5ENJd*Sm&Si3OYA)Bt-xW^lQyccb+c;Z*)!1b z^bJ?J5yM}ALHvGHm}cUUBHB}Jm&>YO+@jI!&4i79gePku3oBSWFkMz z;3o@YoFcBWrRr{lg;j`fQ%NO)2_YfoG1|LVyXQPRzW@H%AM)U;)zP7jn2>j}2qz)U z3eIJlyZr2F*glXgy@A;&%W@NWb^tRYaU(%1+`T15!z}Z!jbewU%5x1_hRs}2wKWJ2 zOEe_~1mRFQOvyaxnr}_e^un98Lo?LpYY?VY8iWv|nZQ_6q_(2F`;Eakeqqy15d4KB z20WJiz_;41pso0i!#V<#w#6x2DlOSO7xV4Ezj29I6C(>#`St*BesN7f%>8(W$W;3Y zC=Qu$lRUX&bm(Y_45|7tTagh89J+l@t!zImlV_OOD(2+ywt@~d$9_8bM^wM0tZ2E9 z@B=RZJO{PgOwSv!(3b3oW0!Uo5X`GZMqH^_eXj?z{!w;c+2z+lJbGRyjMIOSpdUvD z$x8Kn6H{hYgugmZwg0VmwcoL7CrUsWuE^N2Ay;IL{)MahAQ*<5T*Y|+H@M8BJZYd z`dWDJ@SD0%9L!S{6Xh#RkJ(YZxFO!#7;rW$8vv`+Bc`;D(!^2--Q;~=fL41(tj#4_ zI+V>9B??t&i7YuMT60Kr>uQl%g&)SqMqtu)yO8xerE!X^PM>nUr;#yA^3QGy@GqcQ zx6>XXv4x4;19LK;;^j4OMc^YKfPe1U{XpGT#Jmtd5lz&&WaFo9X-V+X;4j%mU!;Tl z)2nLVMZWmdZaFi%u(809gPZPbUkbgUIEfJmyw3a1b-4k`Z$2TXO`KJk-<}C8bvLk^ zUa66Lcdev4BJjLK`tB+TZ6(C+lTu?MNt7?&IWXViOh9KPH^1^VvU+JU0mcGpal>MQ%Z-M=4-oU!=+DGFEu-gt(r zy7}*y%~{XipcBY+MtMp3e`A>2XL}y8wnld?FyjoaAWw5pSio!M2_XOOeD8kbR=4(rzvgmsuhc0tT7LN13lbW&EkZ%>+d@B@>WB zfL6cY-CqEkX=llj?}U3d@q%T;EO#t0vKBMT6K8+~gS5Dw_WRoT(z|tNdy-N&zFOVu z*RHK$PS|N3!L?QzO+5^m?3;nNh67L`XU{_fXV_v~|1evKc09q{g8T|A2Of#^%Do`R z{dmaJgsITDNtEVYz7zJUDo_K7DhKUdq~&Tt&%t+t8;Y3hv(O5^_WdLN{l5T(I>{L0 zvDoli8Uf10@L!I@-Vn9XZIa{G%o2qGD1{wHKckz-bKtzL{fcIO-mI-RSevE$Q94@$YU3TDHiJv*;l;U}KqhsKudv)YY9a#@ZYNj2O#9roT@tue2A8P3p@=A2+qLq#ddk zPC?%NbRtfFIklyFN!NmwZ5nr40riPP_2L-dCxKTG4E$6AzutOGVE=-YNQ*MPwo#iO z?Q=RkO!;KRLGkD7r$do<^@oBl7ltn^7t#!j{xDDLP!rS~jUM+6h|Z!DE02CBo4*iD zm|d9l7X|I7bc>UNdJA2M=O5wh$shgMblKKI`*U>QInwVOol@{W(a1#@oy7(ytf#&B zapfNC+MzZh-u}kea|J{pZZqCjAL={7mW(mqI zkhBy_@DRLBXdaHd#ex74a8a+evV_asL@St1XVTa?`F5eH<`MLMd%n|p72jtDCt>qW&RNg`j?LN`h zNRgE`MDA(T!6q?0ff|))ff${02D_TSHeRdk8p~#OqGr|FB*DdWG;LvOzR7~&#Nf~) zCa%6ZnB&#PLx@2tehYyrPoWO1$_p#Q^iDc9w&-%Ux9`oUp2g0ikh;l~MRoYWUohti#R=mEgp--)1as z*?_quMlA?C{5b7cm*6Z*G+i)apq@nadONg zSKpavo5IP z41FwPubF<4uH5y47Z?udi(k=_?%Qg1SCg%n2P zB!B~80NZiTO2_cc&EfdD;`Fs;j%`NDd6X((7E&JodyT{2HJRbvTI>E6^Ii*IImN4> zjs*aWp;PoDH0o6MU5kqMjNPiHTe3rlltkwS{6AQPHh!OG<4_n1d`;k|B>dvOkFYkpewhyBnQWJu5`K zXf745^*DvSyAV_@tV@#EAKqh%W%I9TI6oO&qa z{uS7G(@r;D4~tW?pD@}))|U*Q!?Ok^$Dtsv;47Kabbsts)wNM8%OsJ>90AZMU{Dzu zS2-a;+7GEUXH(a%G;bo-8+E$0)U9tU?-kz*kinvFVhXVyxFW5!vKKGAc2f9W(nYUo zTHJtzv9yv#B=lej>-9A66WbLUU8TmSaXit5GWn!`qcqW$MO<_nl$@TXpWrKIm%)0f zu6JrzP}?&D*`yi$0i)t2jkcetU)&3MATqkyd0_IB!0Pcg(c@#!wPk?^SH>B-LK}DW=-++}qqJO#HjD7~`S)qp!VP z`i(1YE}oO?-wyQa-I1Awtu?t+=^R%KuD?KCU-Pd=_&YzB&IhyyTB{*0g_XX_8eqavv?lD(!=7S*+$~x0$^R>?$7R5=Ffbb zx8qKu&>~6U%{?>^26(>VWGL77w>o5Gf*oQ7i?%wF0T`;D5r^y_2s}rqM!+1@#@dX_sp<3FqsG(N#==!3WU`m?^(!mXBw+5zjQ)UEF8ZJROEDvE5VICL zvz2_SAIy)+rJnKbQ0nU=JEPddJK{wSO&n6sAWyxs&1`;P zAIR2$u{N)5VG*6y*7_3*tK-c_AfZv*?Qhb!tBY&xM*BySWxJXyWRf=#KwJb8u*m3t zjQiH#!*93Uc%x0x=3w(_dX2KjF_R=9-L!MtZv)brXe{hp@dddaJ@E#a46N;Or?tdr z!v_#ayBPH;zmIA)n~`s&+^jDo#lFohPa|X7j1O)XZ{b&UTbQoCBPG;DVG>^5M6Aj4 zqRD8)sXp)0xaclsdtE}>;s*^L*wAMuVvL?T5~PfF`A@Aa)ymlz*7}q--w*F}_lT>D z#Rf&|wWL6JrA6!(%nqp=?(ke1p{(<{fd zdJ(;f@56ef{1C-&6z^lMMHm?n+{17nxlTF&NF&&a@ox`m?KSm}oo)$<=8y#77ni9X zn6BsH(Y(2rQt{2x>RPijg42}hd~qd=dasD|dxm9)?Pf$M zyHCjO4(xRtgI-7B+sQQDS4`FlIF1R2ngQet;E%);itRorT)dt&x>)XGD|aKg-f&qR z5x^vR6ZzK>5`(9k02DdqQ<6Sm_dxB(8T!+;wk2w{J1u%yBfr%myEuw#hh>@9JCLYo zn0pX0&wAbPx%*zPaSXD-7u(>uWMmjd*kc?h>Bz^{xasv6F8nj6&pZzI32Q7<^ONRA z$`qe$8jr(z&Ao;0jehZ|2{UgQI7BP~B>EB8+*G|$jGMXW5zldXq1ah7$Sw#~KqUEB zZdBxc9cwql!4t!tcy`}q+qW{&nl9?`U+lMVGF zJAf5_ePSEEKI+nAB$o0;EG`jId2HoD#zxe($lB`BImLU zGY*B%wPwC6olU2p-x6!mN8*=QWx4*&v$SYTV`(XFamg6MyJsisil4@}b{D!wn{0~0 z+fkA$c@cP#0%v}E^4R=MWq7)H;L!#WA^4k&m89DC>)rX|XfJYQ)UIb?ZK*-_TbtP30{p7%x$BL@e8hAgTEOtviNVy4v3G%b z5L#U!Br9%Bo4_25vZ**D2Cv*|8fLSv>DHwPePxlaaK{N6uyU$BmU8>qW{{We4Pdlxp zk7*h2h5+WXp0FHC-YL8nUMsiK1T7@7dCoR~cC!vxl6VI{UYM+JjQ2Lsd_%FYXF(r^ z^f-}F@)lW+?Z@Bl*6oxwY4NvPn^KY}<5_K@+|9;JVTd011me8^0K`*Es`#Jcj=qKo zr!tFcG%fOt&H@m7ZB;*wLf26uDJ?H_>wmK8bGTS?u>e30}evZAR3^cm^sDJ=B}q>2-9Wg)l-p~CGUn{Ow!JJspsvS`)vfzAm;QsX$!-cygt zqVh*%AsZt;Y4yv51l&&<$Xu8ZHap;&&6*urWy@UZEO`VpQAQ3s=M|-OC8&I@#Bm+D z++rki{Lj{)7nW-$nJwFpG8hPc@jVY-G1jR$b_qr%Mv0<}9d6fJn%#j_VRIakVOZ_P zROf+{o}H%vW%=U&nMa<3c$h~ zsO|=O5<31>P;2nOr|gMz*$T!eo5@xBmBxRaUF6oL5~l^RmoJ3uqtd2W?KL-zpkyz< zP#~FisEaTvnBPHlGd5A`@jJTz#e~H=YDuO##=t4HH7vWmA1ON#7XvBrTLHV)T5kWvGmA2Ye3(<)u)=I#crP}u#JkS z9fmo_(zi6ND_g#U?CB^zbYP@XvUzf=bQpHeKHVsbkz9!9YN4rmTG(H+ zbM~7;?2dYXrGO`BAQOR;(y-G>o?Ttzy3xW|sUkl*9lO|j<28K9hf3Os6WWN3aZ4L2 zjKv4Z8kF-y@ReF9W@~>U^oeRyYPWo16kWD0{ zC(L|_g4{$#Jv_-59kE_(tJq&(y4z1PGw|ygC(HHxDx&PgQYysuULk;Ze(K-Lm2N!6 z%OPE?#Qp4^nO+DTNC(!7Ws3S6OE|${62?wO0La|L%i-g*jFE==$h61e`b<40yQqBn;QpGFnH^Z zojX@atJ=vF_I@GrWk;PEHy8RJjBF%${HZkAmR2L8r#T;h&1HB)TZc#S?vt-Itj(v1 zTGv$#jjwGm*(PuY_p|AdU7y1JF+4Z%w_fm7^vKX(THV=2C_gNTBxlND^#oID@ib9! z(8t%jQ*Yv*h=1EZ+cJfYWrp6|*}AGCNH`35$>fvkSl5=aYCb2{o-I-zmh$3PxSl2e zpER=o2;}qw*0HVaVYk*Tt?pu-4a}j+9vGqExMSCm)Ow22OSOq+nIf7n@~g{*AL};o zr|3vEpTd#VV%@;Ig8nPnB!+QvRz2QpG_B@z4Z!1rz~Z%jCzg)?07-T{C4Pt56O@FHC7MB|%g(irZbNpX7IQHb?x@&in#6K8Knq92cu)4(QuFf)cB`V(RBSL9UoAgR_4b^TZ?G$Pnk2n3xU+_1oPPDxp{uqp?F>! z3@_X7-}^%2a2zlEvs2D`TPg+EZE1Kzl8cUIH& zU1IN7y+@Ks^DJiI&HP5 z*`&7?SBW*^eX)Q-G3B@b6Z|J`@0ZZmPc_#mo2Kt_oratx@yOO09RXP3jQ|cs%SW|v zaz5`F^y9g!I!3;p0r9=9{OZkRBQ=JnImgBa21h|Zu0F2}~EzpzsQoHIFv(W4OX>+OH>;5gd zvW!otL3LxPLH2TGNzx?9Iqa^ZKD^XgGHQBmnW^e`+HKIe*6t#>5yGn52F>iiF&O}` zTzgj^@YBUp*-H{V*%z8rFKq@;4>H}ua9hh#yJ%ot@W0pZ1UP_F*I`^+Z?vQka+ayartpk$+|n4BQi%8%;U|2%K@lN&(wC%?DjN+N=5 z&E8d~oc{pp3O|>D^~nd1YK8Qenk6D;M10`xRv->|KEGbIak3^_m2Y&*6_~0dZVy5w zQ;&SsMb4Wv4IGyC$k73`v%2yRV~&TK+?z*&Lb4*x%z4^~rv3@AT7C; zG4iiwQ=V#@*)qPxXry?Q1qhhj0msaG@!G7lx}a7uJGlAcUBO8JeZ!6hYc|t0P*0&s zJ#%H*p6(g^wIps$ibqaPc){!MS8e=5r3pN_w7KQ;0p0$dRJd+<+PEBNo=-|uv$lpW zHtfVpwj%`#uLG4Qr&2!}%bMFr6RgQRu&m9sjB$ljBLFh>^zG|HlITRK$!vETcZ;o~ zX%@%9`an~)ciqVMF00V7EI`LjgB)VAZ7;OBHCZ)Vy%Nh*pUnBAxGWGH;1Hno9ftr` zL|3t^F_L+sgsF~ix_77@1_vX**P5OQtfQIQJLy$O#B6Q?hETl^9er-0z*Irwe`z)(z8z5Ck)gnf~BOoe}248$SFAH+@w>%~Q-+G%=XC8FGqC^=!~ zt4fL(bGf>=IODb|bh^`RWmzOx1c`$hyr(LpjQRpk3XP*@oV}n|lH{&!%grI@P3dyr#z5<8a+7$q%nN z+737)wL^8QSTQ$q+Nu>H6=Sw|%7St_@#)vK9M78mQ%J*nHcJ5}o>JM`ZeT`N? zyy8NkhkWzbKhCM&+|Lt6*A~!$w1h%ghTIX7bN4|%rYcCT-Ww_H;n5OB4VdJS3b4;4 zk)M8^l@FOTflL;6vP|F|@e5v`$yU1GYOfdwE@713BU+(pHrX0 zv+jHys|%=xbhhCArTvF2_l!-d#`QsjaS+=C_JZCM9w{P|KVt z1LYt&$sU5M>V{A3@nvqlU}=TTw6UFp#@Pos>$l}N`u3R|%zR7Yi#1e|!UX8OT4SR`4v6 zeW7M9%^;cZ?spym=O?{mCgmv?YepwiEYl>B-0B+47GWeaJ)0kzUzf@SiuGI*^7TD( zD=$xjQRWeFRH4vJU|O_ zq#0bR5I$milb%mgT-Bw`z`K$^K2nP77*fQIyK{_vYgb3Sx)+hj=f31DUtANE3SbeeZQFAU z_CHQ))S9lLcXK;jT$u{Ih%%sIayaQ)8h8`xvWb9@M`&bC!#i7W8T_fO$!kN8(>y06 z7oXZ`rQKRfXo@Z^i?CUjINU{-t^JyA|{k83sD`6seklVuGh~xwf!S?*? zj1QZfk7}c@OEYOQ%4eH;L`t79@z2(@CbouaSdvuSvA`KdaVr^6jmWFFf(qk~Ip@C>XTp9k)b;IdBc@NKSm|-IK^w^$w7_TYIAU;c z2mp4+HN@*E6(C^FeAIp5xghNvaCqXmp90&&HA5cLwdF$DVtEX3eT`a*vuw@F-cde- z)g_6q9y@&^)?LuxT?qD*&jW8hp8WAy0_MtDpx+dbd9rNs(TORHoM3WE>%~QVES8ID zb!_G-lHGQ)@r}fW{Od;PQfoAs<4-XlSrwH+klV45kEL@ZsoBt_becm>lFJsN@fZI9 zS}n38CmS4+M^Vwa>NCwY6tKd`nuMU0*y||r-8$eNdH3(0oK~Kd8eLdJ_JQX4bF!}E zoCQ!o`ec)jde7IbEu)pTK!f+=sL%1I_?l>!p-@L1&Je|PWOIP=;|$}V+BwPf>BUr@ z&Fva9E};HGw*lPlYz(nndL9p`=}~JIuqTOxamVGULQcX|=jP`loYM*{66rSakKM{x zIB%Gc6rQIfb6Q%&r*dniv`;GHN4QVjsRcJPM))~9alj-TW3kU_Wt!>oIFT*<)h~}N z)T84a*RdJSSJZk`w)QsH4|5c##S&*l0oZUO+&Uh{qKy;ncE}U}_VG;E;Fmec&)_LE zkxOwdAhZyw2=4sQrb$66b_E1_edEB!PDt%hX;9c3LnyU(SCa`ZmVQzPM^@;$n6E0MVE0kASa+%UKUIHOjcQQ})jOYe?!R*_r= z1mivWatBI|S?2!GR5CLr-W85O`IvAIN+m0zBLy2?cJ0p2`7>O>5Ona z>a@CyrqwLlPd_|+VRry-#~`8PV?Md9OQ>Uy!yjpl1adBR?DkUrvodIEZnTCsDgM?Hf>4W{IZ zB?t>MZerOdX&*Ki{{SP}q|^%=>ln+wmn=$MHyxzsu;@Atl_|A?-&48r6U!OK6^I{k zo2S>BTZX9Q{Bv&%mfBL^T-w^lb9oZUBOy$wWnIiiOl5{gPW9DmGFw~f7nX~rM*daA zmgyOvDyWUM4gmu@Kp>vEt~=tSF+<^~k|YYaSuy_6bQ!Nj)!>M-xm=gH!*Y2A0XeJt zDUiN4bJmh8mSv2P%e!gLbJT?gI43v*9Q4SiTic<%ge3CKDZ`lJW<|>N$sBJVmMD_? z>N_1cEP$DABo5A@nYcYk8SFnQU3C)LTWO$0NBd+ja0WJPA1*p#mn$9DQBjVa9Magv z(|M8*?YM$u86-A2Bmzcz@mbNy=RkwcxeNiDan2APIw;A{PDLfm^CgtdlS-}%uHff5 zOnSO4r$e7@K`x^`Rf!>;kle*BCPm=i{jx8~6kyJD)&a8HC>(qBW3F%bt zp_%oREB&CisEUsSv$@`bCjB6eO~CS4HwQg)SsHGiX?b~i Vw=tPSLox1l`AKeZ%~vTW|JfiVbr}Ev literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/modem.png b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/modem.png new file mode 100755 index 0000000000000000000000000000000000000000..be5a2eb2fc48a8f16681b591f4ef74888ee09c33 GIT binary patch literal 1633 zcmV-n2A=teP)DSXo(n z6%-WGq@<)6*xA{^2Ei8OFVPRn@pc;RG z0K(}2kU_v;uacIQE|igxVPIil0lOU8LJ$V2gBcFvgF+DKL$KN}U%tQ{3j&`%e`fgj z@gvL=d;kH2(*Zz33V;^3sH&=hEe8c1aykKFkQgk@fP4zVAcH}^2L(OIK_D>@4RRES ze)sMj*gUAC{s9CKRtErm69G(cJz`>Fj2}LHfCnwe5SVX(p#$bKGczNn7qEqVe0*Tb zKx$wP1gU%b_AT5|K=waih<*VGAQtps2Pz2H)YP1#tEdz1LA-G{v90jAo(|M-Y{Iec=5@nPoJ&=1Q2>IaFvsjn`>!l$t@@-2(}dD z0GK0?EkXud!iJNWd(GMH9%!pb!uh6=itz=n=!YbLZ{?6XRZ>k+%Q> zhy`Q`&;nIpmRY8(tSkWx7KUffo-s&DO2QK#$WmB3Ko0?!SPXU#m1Z4_<00M=8Jg|USYhq#|2XZmU!j~^!g0l-ZH#ay%!+e4s0^qV7 zCl zzk}l%xnx6*cces$;#;tKkUTJDgZV%`;9LP^gB$_!J;-ce!utdC{SlxvDE_~K)Byw# z3oyP-K}9Sx5VA6|Gca)cV_^9Y%36#J|Cs)QM1f48BN)Nn1tk_xApwc!e}BRC+4mpc z86F%z4whpB71y9L1E@wA=qY;#2Zjsh&of-Ue3{|QnKSo*QNADMdk_E!AQqr6xn4eh z#qi+MGlt6_&NBGR1u$ z0{{Yu<Cx%1A~kt11BpmeSi!CrWZyY9!TmJ7G?m2;TK>OdVJl%92G$?!48NGZF}SmPF>w9nW%&C26N4Xf z00ZYQUWPA1Um5-f1~UBq_k)2IR52MCGQ4~95>y1jif%}W2lO#BFiL>+E&~^z05CCs zVmN;M_>U(~p6rME{s*!H00M|*&z?PPz=SkSTvS{D7-$Skj7;G4z`*hXOoI&m$Mlkc znS+yo>HT}K&zO058JK{<%mPXaz!VNj<)Add07`g3`se1&48M$w7?`+u!SR3g?Afcp z#0yIKkI;*KfB*tHn;DoBY=PJr$mRzc!~(>uKtn+^3nLRF3ou86#ef(n%*@Kf$jA&< z2T=p$g5`mpXJG*;`2Fr3Gnc3+Gb50H=l1Ql4<9~U4~&|{K=YrVI{+Yn7?GN0TtLhY zauAfygvLh4gw(;r{y;5$3@UKZ9RLtOj04>>0tlc1Z!hq!(QaR^6>_B54Jn1#~Jije3o~(=`7H5>`;cz1${9F%W##sAI~(r1scHM>FVdQ I&MBb@08~pNrT_o{ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/pda.png b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/pda.png new file mode 100755 index 0000000000000000000000000000000000000000..1458d9bfa4ef7d27c2434177c8d54294ba9f4028 GIT binary patch literal 1787 zcmW+%X;f1O7JkXg1|$%KLIPM`gi_jp0ZbGHH7_i($k1pRHgO1$ut<9(fPf0VEH;5s zA=Dyxuq9L0899Q>XtfG21Qdk=RTSi)EQ1{_6i^UCwl}dq?)Kwu=icw$3Vv(^&DzBp z003H4WY{5#gx(W{WZ?xTPp(-6A&d7n9sqO>1QNe~ZLyh!;faNxAImH(PRkboJmIl) z5ft@hT9)XLC{1`m{6Mq^07z$}!gz5dlj%kb<7#2N1V~S32mm?^E&&!@<5jOx&3q{o za+2cX&tua)2r{taVogmAuD$W)qm~2Jb-st=OE#9C%TaGk*+GINT|sbi^6jAAyQ69v z8kDn-+d5(SDD|F*MUq!Y8 zc(PIdZebZiFlP5@(-6e!MAaf;@5+D2xe6|d8cfdKc6~j+K7)-5c4y4Sx{BFnKaWtq z>5TRFH=1ZgLzdQf!x{T;+PrT8Xs^e8w-+;+?n9TsNf?}i%e{^x&~3>;nZbF>Wk~-xi=)I9adQP-N!XQOOPah0O(QZ>2owWjyN~2)5!9nUX;qfIGvsHp@IVxcl=2QSj-aDrbsm+71?S} z(P`Ip&yPj&*46_(_|&4!Hz=_a?i71#2Li$LLi<)nVL z!{}WfIN}P&}jcP#>G?Gb4@Dg8Slpya_Y>1sq)VLm%q6alT7GG9ciH z=o`?VqJQAg0KhTaeay7TgYio%ePJb?E);6I?M9S?xW$@CT%}tOf{H0q7 zl`i}Cu}DQlJM)s>yd2C@xO01?p`g&-I~j%}`IIk6Y_>=2dpr+&3oX_Q8)ei(kFHYPxu*ps zYp-_l-RgrA8RDn!$Lm2bgGYu5Mdd0wSFTWOo4`S!NZ7|18*^m7=q?+~d$Wx!S3~ad z+qd`d_qu8q#;X~go_&(vYbA?;RKI^rk(F-U-T(#aumx`5F2EK1)KvG2^wc{g_+chg z$@@b)Sm!5c3i<3aJ0E2Ax4)~wB=r2XF8_c%C3(*EJ1#I%Qc@Vr&3)3U6U3N=3DN{@*z34hoRim^Arg_jcG>cCncl_cW}jS2nCa`kchCB!qvQ7I z=uc6;itt-`r&{6r(~xd+mFyq3twZh~O*rUVb*%k2+a5q+M`OXKY6x!|)7R8~b} zRQte@Xl8~+psdw=Kq)?VK}7sJE0SkH5r z2LOO|aL}fmrbzs@EHI}1#M!gcreGEyuq^-pDqDQe*`ua2K4o)M%1?=LDW{poV}XE} z#OPRJ@KI)b?9Nzb%$elYSU&);tP9>05W)H1iWnwxi( z35bh~vl9bllm9;Bm|~5OTm-YU69c^q@(A*Cv!8l93qnHH5jc8{4qtAxavOpx)su3t zmNn(O!v?S*3Q-NI+Vr2lbQX(pkjT`>3dQHP@o`xjqaih3qnq&vH|)yjEDq3ENj~*X zHu!OjW0JD%1loDs^o+wRE&(SBPF;+pu?5j!9T3>*lVMBnrwD~YZ{KzQkk_w2SMZ=J zIZE+guB(d+&c)T$a-Fj2l1G_{6W`s{-5owOJPc~IUwufI!6p&g5H~n7!W>j8mF%zY zFMYYQ<@79aQSRyzgqfW~RX>{FM*E8)BA;%`zTE52*1u5AsTqPkuL_*w27&a?l9IN; z_wVB>%gb-tu1a$%d}5MpQ%I3vYUrh5^%3U}6K~I`B$W(~xC9!omvc*|iW^^r7c}#oKM-NxzD*T(-)|KN1dXb}#%=YvteLUV5fj?QWh?F#CY?Buwoy4L z=R{FRcUdeJ4u{8YHp$&Oqnr8qj_$^m$dKPUCU^0(=R~(VZA6bUq)go=uBAqky{lu% zKBp0-hnxjVXxt1HYRIW5*NEKu6jf1CANS=;c1UPw=wN#0$^fI$kcs%UORLpFBlDg% zUiZi=N;T@IJY_@(K&}VXpRdyydb2uQOiLmrGV&DW)TvV#cXwwntDO4rBcJ+lY!6vj zRYeU7UIsO>O^I_aE?;VX@?`UmQmHf@Z`|lPXI-Nw@G&>C!DM&$HJGrlH7^q7?89;q zXYQkj!zt!21nlUZeQ6rgjo>$6Uy#9Quo@>_;g^(HlSqyJJ0rTI4SFpv|5_TZ;C8*E zc3D89fkJ-s&M*}KsBvH2-$)o&e` zeQZ5Jk_XdpQME?zdYwK`@frob;-GYTS2q-mYQ^*Qa^U$AtayNjD=$k-!<_t?DR8UB zAA9RNX`3QGZ1R;Q36%0ky~Hx~5dMwxZ-2ab6L?MC5Ja8+eF$V3Gr8QodJk0dg18KZ zoR7!#@wqmLYCIpuHpa(jR3l!JujVwIf4!~)NcnMNaGE3UV%2;}W*!Z9!;|>|>Eea8 zqq7zPA%671(%VaWl*3>`+Yc2|;n3m*l99>;EN2rAZ^i+v?s$poGHzbw+Nba4L#rH6 zq+MiGe?o-}D~G1MR<^zfzq+(@km=Q-(zW}5CylOrwh4>Vb%z8_K1v z{}MwZw_Q@a*%FqqwK59Fw(zE8C3}B&C? zVuA%ti8StfH{XZc2D8U_J|AyH{NhfILtZi<_ZTM@xbX@teKzjklX>M9=8`#Ed1Jrk z`Gv38>mF)aL&|8kP52^nQ#%GVws*XEG5;VahotE%ja@!`-&8RZhC-_mDh+X z=UGQpR`C`B!&I*F7JfdG22&_W)fCFGR!FUNO{VG(#$axsU>vlzfI0g2&z!Q*(e=i$ zp6es@6#)$*^JItW*m3o4-rEJ#L9 z*=8N2x83C0Xso1i*qhR#qLO0@sT3UP1j_21GkA#Notip#m8q2W%RhAdUiaZ;f%+xn zK4GR*3$K_M2~m(W_C`&j2-->mlPx`~d~q7cUxC`=j;vVIpx3_?Pt6e|1)Vuq4x5{b zPFZAERh{-X!c9^ml40Giad7jeVKOO5Mb;ZTWn!D0;=MJC$qygRJR7J@)^-%rL@UvI zl5kl&T-?98E1c60o$b2I)!8x#^2ut6A*9!6Isf^KKJv)K7Y%>4YSykdhIk% zG3y$bafGoO=g*Eumo9S0Y=2UTz4{vsI?HNo>_F$-kz{s~yL)T=)}^wV_XwIHzG9Uf zyrDDs82Z;OeZGFzLA43QCeL`1*}N`1?pHA_%fC;wv@OD4F+%=u9u zt-<>(M_a6z@xfr+c7ypZJpinAWK!d!Ghh8dYNbMFnq_p$qt8!?WC$6CA`S#_9<50R>^sn!rDR{DTdpKSy zZnNCkjFc6LaB=N>W^3-<8=3AZQ#+&DD znap!$rDu-T1i*cbI2HlTBPDG_Nil0PGBd4YM!nW`BSW6UxbA+Ea8~^pO{zMIezf1h zX$C-~-(vtWbL>jHE0^Cf%t?YrO9MI9##yQY#miw?pxwq6g9^*n`9 zsG$Q$SFfL-v2nrJMU08YC1iBZ160*gviuODFfn)e^088ae|`Mg)1O-qhoYaF{TULJ z4A6nAW5Dp6RUV{vfKm>dkEQ#6*K^zsupk2q+Ea4=oYE*vUp*jrbJ(W)8^E;x12P5j A&;S4c literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/tablet.png b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/tablet.png new file mode 100755 index 0000000000000000000000000000000000000000..fa871f54035fcd0bb0f7f2068d2b2ed4e5e0e0cf GIT binary patch literal 2505 zcmW+&Yh02C7k>ank;hAE24+c9(=C@5nzmOHNV6i*EwWAy0MbXsy0K#HV?N8$W`pv6QT zjiNmD$4~(?B4QR`0#=CzfSwt;NKvh#!WIdB z%YB|dcjx@oo`(`bd`9z^!A(QY1iPF%6?1cRBpWIN`RzH8N~L-O;@a)6gcQs3YyzKw zS8F8Q3ey0*t9pI8N+#*A02%I+ZZ5pG(swWbrgxqRY_5pm-6ONBQaTL##bG};rs z&qhw~Rdm&{2#oiLSHT~s%W05S|HMj#%*G5_Q`N~l#tE|oK9qIHDCueJIiqjoqJ=wO z6)(8utZ6E4$g|H1?q;%R#Ct)#J#a%@GeQfg7RTQWmfVkW;@u1Y&%)-}AgKBB(WfWU zMkk(IE3Q~3d{#80MM@-ZWnYeq(Pk^lAvkxY6adTrme$>nUA@}@IHZ-*dA*#|*s z==2flXx~Gi>+WTGOz&Jfl3-vyh50 zz08MfbZ+=dFZfWOL<32pD7ipvfmfEHE?|m}55gxR!ge>D!C1>p=^xoLm$yh!(Idwi zgfB;FH=L4ZIgiApTPB@R*tXbfad!eL+$<+1CaK}0k>TOwv4{w>@Th3Bk6MY~RfkB> z(Ivu(#3IFtr>)~HAf=nZCIk?*1X^+Sf!44H<>Ea2J_3LjZLols2`mbb8JN@v^pelH zL(|XyR%Q%nUBB-kEP4+FvI&0&T$1<2_#yqM;fUgtWEXr6V#gAJ*lkiqP6$3|lCgT7 zB{O%Ke}K3p8?*IebNE`9-4>hTHEHM1ZR}NtxRe5L!&>x!o}F1JIiGcfGJ_tk(j23B zd9^gAh>x-3oVBh$4p^biJYFxBuYZ<+M*BeUCcF#`$|FQRUi|EhaNdF_Fmvd&jz+R2 zd<@1L7`L(bbFLkRxKdNex-xH5z%xV_wBO@wLfDq>x*r6C8(PCB`ewPmqIUTC+3wu` z%X@kBKEEIe6dpUUR3eiGB_T6uNcJ3M&dqn=uxkdU)P=XEzAo$M6Tl%S9w>$O?UQ+2 z)GnKb|6@RPR09h&tc?%Hut^QVq%eoKxFO_{<9%g2LQNj+VH=OVEJH8o8a++W=3 zBH|;?Qe*Ks1|_bDBaj+Vy%bu5Y0uMia(751xVUYjurf@BqYfhjFosrrVO&b=UaBJ* zRVN78NkBo!#fmE0cTcT_jX@G@AWtc#%DLj^v8gTWtqy10)QAq%X6{P@Q|Um~Nce`J z6C6{`db6PK_*$qBhHKT~6^QX= z`2pm`0;Xk>TfmW!Xr*QzEBvF%8Jp_Vg0=jd*PS>&;faj4v=c)(nbhpBxpufuO(|-M z#Q-P#lEIs7?HOWR6zM!d&uouzVwZgTrZGW@?`cWH&GeCx|9B=m+Ud-^A%LZd9FWLN z>X>TjvxiUr!YMF_{{Zg@H-9PVG{wBNO=Z=i(R;M4C*?Bd-670aa(Iqu0NPqGG(WLS zL2jo-vyV>)sfXWhyYyP2lJEQfURv$sY*5OL*_76my7x&_Gb2Gn1na~#8Q$eMq%}qT zL;!yW?cbaP%Rj|~O$kHMk5d+1g}K~m;yVXNy*yGbH0`{bq`eR+UKKnPJb(Q{G4_#x z%+Ah@K95C{cN^*wT3Hcr`U$&c!dhcBEqw6M7sMV4lO%$71xuO5(|tjH$WuP9NQ0Ip za5k6+=H&B03ge6XZIP~yM{tlF32eoRgP9~mYfNC`e9z9wMj+I=s;>H4oxLV^& z(hzt0iAT`jb*aE?)L;i^uGhlkP@h%y% z4F*xWY>D>oAR7q#t9>=b_W~AcLW!YfXg_Sl-xlb$eXWTSnjPVo7p_S5=0F|=B^c3B zBr=%nm;*@^^UG-VoV49d;qU0yoQ%fjXiSP5I22rawBFTM;`KU~c{Q$`q3#qQoPN3T zp&B#r1cUvjRxN2x{M5nc+r+o)J)E#50W0)M@Q6w6p{N zZ6g%Axx1*dc;Md~b;UWI27CD17uycnas}P0v1hRWU)K4fR1O z_GBXjE!MHHv6fqU4|87?aSAtB;K2$ODqVa6cZM+vRg51?!1GSGqHbs5$>`hH=Z$g9 zP=yCQ&n4$SZBbp%Z^6#?ct4Nl%rat>>dn=|dwj9g3_R@ck)rziA#RRI{NOwgckukd z@=SR5BNa0^UYdPf_WoIY6K3}7Jaue7@z%) zyF|hvcM#Y?q7EGb(K5dgQ+A^PC*V}dKZ6eh`6Jux$~3_-b>1`oEkSLng_yMZ$A NumberSpinner - jQuery EasyUI Mobile Demo
                                                        NumberSpinner
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/input/textbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/input/textbox.html new file mode 100755 index 000000000..a03bf1e76 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/input/textbox.html @@ -0,0 +1 @@ + TextBox - jQuery EasyUI Mobile Demo
                                                        TextBox
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/layout/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/layout/basic.html new file mode 100755 index 000000000..c1ecaffb5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/layout/basic.html @@ -0,0 +1,32 @@ + + + + + + Basic Layout - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Layout
                                                        +
                                                        + Back +
                                                        +
                                                        + Search +
                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/basic.html new file mode 100755 index 000000000..fb9709615 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/basic.html @@ -0,0 +1,39 @@ + + + + + + Basic Menu - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Menu
                                                        +
                                                        + + +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        Undo
                                                        +
                                                        Redo
                                                        + +
                                                        Cut
                                                        +
                                                        Copy
                                                        +
                                                        Paste
                                                        + +
                                                        Toolbar
                                                        +
                                                        Delete
                                                        +
                                                        Select All
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/menubar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/menubar.html new file mode 100755 index 000000000..5ef8eef8f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/menubar.html @@ -0,0 +1,45 @@ + + + + + + Menubar - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        + Home + Edit + Help + About +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        Undo
                                                        +
                                                        Redo
                                                        + +
                                                        Cut
                                                        +
                                                        Copy
                                                        +
                                                        Paste
                                                        + +
                                                        Toolbar
                                                        +
                                                        Delete
                                                        +
                                                        Select All
                                                        +
                                                        +
                                                        +
                                                        Help
                                                        +
                                                        Update
                                                        +
                                                        About
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

                                                        Here is the content loaded via AJAX.

                                                        +
                                                          +
                                                        • easyui is a collection of user-interface plugin based on jQuery.
                                                        • +
                                                        • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                        • +
                                                        • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                        • +
                                                        • complete framework for HTML5 web page.
                                                        • +
                                                        • easyui save your time and scales while developing your products.
                                                        • +
                                                        • easyui is very easy but powerful.
                                                        • +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/ajax.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/ajax.html new file mode 100755 index 000000000..e4b4f2de3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/ajax.html @@ -0,0 +1 @@ + Ajax Panel - jQuery EasyUI Mobile Demo
                                                        Ajax Panel
                                                        Panel Footer
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/basic.html new file mode 100755 index 000000000..407a2f32c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/basic.html @@ -0,0 +1 @@ + Basic Panel - jQuery EasyUI Mobile Demo
                                                        Panel Header
                                                        Panel Footer
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/nav.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/nav.html new file mode 100755 index 000000000..0362890b0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/nav.html @@ -0,0 +1,39 @@ + + + + + + Navigation Panel - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Navigation
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        Panel2
                                                        +
                                                        + Back +
                                                        +
                                                        +
                                                        +
                                                        + Go Back +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/basic.html new file mode 100755 index 000000000..906d94261 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/basic.html @@ -0,0 +1 @@ + Simple List - jQuery EasyUI Mobile Demo
                                                        Simple List
                                                        • Large
                                                        • Spotted Adult Female
                                                        • Venomless
                                                        • Rattleless
                                                        • Green Adult
                                                        • Tailless
                                                        • With tail
                                                        • Adult Female
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/button.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/button.html new file mode 100755 index 000000000..f326ba970 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/button.html @@ -0,0 +1 @@ + Button on List - jQuery EasyUI Mobile Demo
                                                        Button on List
                                                        • HP Deskjet 1000 Printer
                                                          Add
                                                        • Epson WorkForce 845
                                                          Add
                                                        • Logitech Keyboard K120
                                                          Add
                                                        • Nikon COOLPIX L26 16.1 MP
                                                          Add
                                                        • SanDisk Sansa Clip Zip 4GB
                                                          Add
                                                        • BLUE MP3 Metal Mini Clip Player
                                                          Add
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/group.html new file mode 100755 index 000000000..e64c2e4aa --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/group.html @@ -0,0 +1 @@ + Group List - jQuery EasyUI Mobile Demo
                                                        Detail
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/image.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/image.html new file mode 100755 index 000000000..ddf79e592 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/image.html @@ -0,0 +1 @@ + List with Image - jQuery EasyUI Mobile Demo
                                                        List with Image
                                                        • modem
                                                          modulates an analog carrier signal to encode digital information.
                                                        • scanner
                                                          scans images, printed text, handwriting, or an object.
                                                        • pda
                                                          A personal digital assistant.
                                                        • tablet
                                                          one-piece mobile computer.
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/link.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/link.html new file mode 100755 index 000000000..c630576da --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/link.html @@ -0,0 +1 @@ + Link List - jQuery EasyUI Mobile Demo
                                                        Detail
                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/basic.html new file mode 100755 index 000000000..4654e1256 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/basic.html @@ -0,0 +1 @@ + Basic Tabs - jQuery EasyUI Mobile Demo

                                                        Java is a general-purpose, concurrent, class-based, object-oriented computer programming language that is specifically designed to have as few implementation dependencies as possible.

                                                        Java applications are typically compiled to bytecode (class file) that can run on any Java virtual machine (JVM) regardless of computer architecture.

                                                        Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing. Originally developed by IBM at their campus in south San Jose, California[1] in the 1950s for scientific and engineering applications.

                                                        Perl is a family of high-level, general-purpose, interpreted, dynamic programming languages. The languages in this family include Perl 5 and Perl 6.

                                                        Though Perl is not officially an acronym, there are various backronyms in use, such as: Practical Extraction and Reporting Language. Perl was originally developed by Larry Wall in 1987 as a general-purpose Unix scripting language to make report processing easier. Since then, it has undergone many changes and revisions.

                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/nav.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/nav.html new file mode 100755 index 000000000..061218f35 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/nav.html @@ -0,0 +1 @@ + Navigation Tabs - jQuery EasyUI Mobile Demo
                                                        Devices

                                                        Modem

                                                        A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.


                                                        Scanner

                                                        In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.


                                                        Pda

                                                        A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.


                                                        Pda

                                                        A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/pill.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/pill.html new file mode 100755 index 000000000..ead286386 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/pill.html @@ -0,0 +1 @@ + Pill Tabs - jQuery EasyUI Mobile Demo

                                                        Java is a general-purpose, concurrent, class-based, object-oriented computer programming language that is specifically designed to have as few implementation dependencies as possible.

                                                        Java applications are typically compiled to bytecode (class file) that can run on any Java virtual machine (JVM) regardless of computer architecture.

                                                        Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing. Originally developed by IBM at their campus in south San Jose, California[1] in the 1950s for scientific and engineering applications.

                                                        Perl is a family of high-level, general-purpose, interpreted, dynamic programming languages. The languages in this family include Perl 5 and Perl 6.

                                                        Though Perl is not officially an acronym, there are various backronyms in use, such as: Practical Extraction and Reporting Language. Perl was originally developed by Larry Wall in 1987 as a general-purpose Unix scripting language to make report processing easier. Since then, it has undergone many changes and revisions.

                                                        \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/basic.html new file mode 100755 index 000000000..9bed8acb6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/basic.html @@ -0,0 +1,63 @@ + + + + + + Basic Toolbar - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Basic Toolbar
                                                        +
                                                        + Back +
                                                        +
                                                        + Next +
                                                        +
                                                        +
                                                        +
                                                          +
                                                        • Large
                                                        • +
                                                        • Spotted Adult Female
                                                        • +
                                                        • Venomless
                                                        • +
                                                        • Rattleless
                                                        • +
                                                        • Green Adult
                                                        • +
                                                        • Tailless
                                                        • +
                                                        • With tail
                                                        • +
                                                        • Adult Female
                                                        • +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + Detail +
                                                        + Back +
                                                        +
                                                        +
                                                        +
                                                        + Go Back +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/button.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/button.html new file mode 100755 index 000000000..3db342ad0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/button.html @@ -0,0 +1,45 @@ + + + + + + Toolbar Button - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Toolbar Button
                                                        +
                                                        +
                                                        + +
                                                          +
                                                        • Large
                                                        • +
                                                        • Spotted Adult Female
                                                        • +
                                                        • Venomless
                                                        • +
                                                        • Rattleless
                                                        • +
                                                        • Green Adult
                                                        • +
                                                        • Tailless
                                                        • +
                                                        • With tail
                                                        • +
                                                        • Adult Female
                                                        • +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/menu.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/menu.html new file mode 100755 index 000000000..356747beb --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/menu.html @@ -0,0 +1,76 @@ + + + + + + Menu on Toolbar - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Menu on Toolbar
                                                        +
                                                        + +
                                                        +
                                                        + + +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        Undo
                                                        +
                                                        Redo
                                                        + +
                                                        Cut
                                                        +
                                                        Copy
                                                        +
                                                        Paste
                                                        + +
                                                        Toolbar
                                                        +
                                                        Delete
                                                        +
                                                        Select All
                                                        +
                                                        +
                                                          +
                                                        • Large
                                                        • +
                                                        • Spotted Adult Female
                                                        • +
                                                        • Venomless
                                                        • +
                                                        • Rattleless
                                                        • +
                                                        • Green Adult
                                                        • +
                                                        • Tailless
                                                        • +
                                                        • With tail
                                                        • +
                                                        • Adult Female
                                                        • +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + Detail +
                                                        + Back +
                                                        +
                                                        +
                                                        +
                                                        + Go Back +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/basic.html new file mode 100755 index 000000000..9284505d2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/basic.html @@ -0,0 +1,56 @@ + + + + + + Basic Tree - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Basic Tree
                                                        +
                                                        +
                                                        +
                                                          +
                                                        • + My Documents +
                                                            +
                                                          • + Photos +
                                                              +
                                                            • + Friend +
                                                            • +
                                                            • + Wife +
                                                            • +
                                                            • + Company +
                                                            • +
                                                            +
                                                          • +
                                                          • + Program Files +
                                                              +
                                                            • Intel
                                                            • +
                                                            • Java
                                                            • +
                                                            • Microsoft Office
                                                            • +
                                                            • Games
                                                            • +
                                                            +
                                                          • +
                                                          • index.html
                                                          • +
                                                          • about.html
                                                          • +
                                                          • welcome.html
                                                          • +
                                                          +
                                                        • +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/dnd.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/dnd.html new file mode 100755 index 000000000..ecb8e3131 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/dnd.html @@ -0,0 +1,56 @@ + + + + + + Drag Drop Tree Nodes - jQuery EasyUI Mobile Demo + + + + + + + + +
                                                        +
                                                        +
                                                        +
                                                        Drag Drop Tree Nodes
                                                        +
                                                        +
                                                        +
                                                          +
                                                        • + My Documents +
                                                            +
                                                          • + Photos +
                                                              +
                                                            • + Friend +
                                                            • +
                                                            • + Wife +
                                                            • +
                                                            • + Company +
                                                            • +
                                                            +
                                                          • +
                                                          • + Program Files +
                                                              +
                                                            • Intel
                                                            • +
                                                            • Java
                                                            • +
                                                            • Microsoft Office
                                                            • +
                                                            • Games
                                                            • +
                                                            +
                                                          • +
                                                          • index.html
                                                          • +
                                                          • about.html
                                                          • +
                                                          • welcome.html
                                                          • +
                                                          +
                                                        • +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

                                                        Here is the content loaded via AJAX.

                                                        +
                                                          +
                                                        • easyui is a collection of user-interface plugin based on jQuery.
                                                        • +
                                                        • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                        • +
                                                        • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                        • +
                                                        • complete framework for HTML5 web page.
                                                        • +
                                                        • easyui save your time and scales while developing your products.
                                                        • +
                                                        • easyui is very easy but powerful.
                                                        • +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/actions.html new file mode 100755 index 000000000..f895ebb01 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/actions.html @@ -0,0 +1,51 @@ + + + + + Accordion Actions - jQuery EasyUI Demo + + + + + + + +

                                                        Accordion Actions

                                                        +

                                                        Click the buttons below to add or remove accordion items.

                                                        +
                                                        + Select + Add + Remove +
                                                        +
                                                        +
                                                        +

                                                        Accordion for jQuery

                                                        +

                                                        Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/ajax.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/ajax.html new file mode 100755 index 000000000..e5c77f330 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/ajax.html @@ -0,0 +1,28 @@ + + + + + Loading Accordion Content with AJAX - jQuery EasyUI Demo + + + + + + + +

                                                        Loading Accordion Content with AJAX

                                                        +

                                                        Click AJAX panel header to load content via AJAX.

                                                        +
                                                        +
                                                        +
                                                        +

                                                        Accordion for jQuery

                                                        +

                                                        Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                        +
                                                        +
                                                        +

                                                        The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

                                                        +
                                                        +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/basic.html new file mode 100755 index 000000000..b643f5b53 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/basic.html @@ -0,0 +1,52 @@ + + + + + Basic Accordion - jQuery EasyUI Demo + + + + + + + +

                                                        Basic Accordion

                                                        +

                                                        Click on panel header to show its content.

                                                        +
                                                        +
                                                        +
                                                        +

                                                        Accordion for jQuery

                                                        +

                                                        Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                        +
                                                        +
                                                        +

                                                        The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

                                                        +
                                                        +
                                                        +
                                                          +
                                                        • + Foods +
                                                            +
                                                          • + Fruits +
                                                              +
                                                            • apple
                                                            • +
                                                            • orange
                                                            • +
                                                            +
                                                          • +
                                                          • + Vegetables +
                                                              +
                                                            • tomato
                                                            • +
                                                            • carrot
                                                            • +
                                                            • cabbage
                                                            • +
                                                            • potato
                                                            • +
                                                            • lettuce
                                                            • +
                                                            +
                                                          • +
                                                          +
                                                        • +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/datagrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/datagrid_data1.json new file mode 100755 index 000000000..63d647358 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/datagrid_data1.json @@ -0,0 +1,12 @@ +{"total":28,"rows":[ + {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, + {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, + {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, + {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} +]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/expandable.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/expandable.html new file mode 100755 index 000000000..5353ca51a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/expandable.html @@ -0,0 +1,33 @@ + + + + + Keep Expandable Panel in Accordion - jQuery EasyUI Demo + + + + + + + +

                                                        Keep Expandable Panel in Accordion

                                                        +

                                                        Keep a expandable panel and prevent it from collapsing.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        +

                                                        Accordion for jQuery

                                                        +

                                                        Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                        +
                                                        +
                                                        +

                                                        Content1

                                                        +
                                                        +
                                                        +

                                                        Content2

                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/fluid.html new file mode 100755 index 000000000..184880266 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/fluid.html @@ -0,0 +1,33 @@ + + + + + Fluid Accordion - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid Accordion

                                                        +

                                                        This example shows how to set the width of accordion to a percentage of its parent container.

                                                        +
                                                        +
                                                        +
                                                        +

                                                        width: 100%

                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        +

                                                        width: 50%

                                                        +
                                                        +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/horizontal.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/horizontal.html new file mode 100755 index 000000000..c52d25f0b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/horizontal.html @@ -0,0 +1,52 @@ + + + + + Horizontal Accordion - jQuery EasyUI Demo + + + + + + + +

                                                        Horizontal Accordion

                                                        +

                                                        You can easily set the 'halign' property to create a horizontal accordion.

                                                        +
                                                        +
                                                        +
                                                        +

                                                        Accordion for jQuery

                                                        +

                                                        Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                        +
                                                        +
                                                        +

                                                        The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

                                                        +
                                                        +
                                                        +
                                                          +
                                                        • + Foods +
                                                            +
                                                          • + Fruits +
                                                              +
                                                            • apple
                                                            • +
                                                            • orange
                                                            • +
                                                            +
                                                          • +
                                                          • + Vegetables +
                                                              +
                                                            • tomato
                                                            • +
                                                            • carrot
                                                            • +
                                                            • cabbage
                                                            • +
                                                            • potato
                                                            • +
                                                            • lettuce
                                                            • +
                                                            +
                                                          • +
                                                          +
                                                        • +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/multiple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/multiple.html new file mode 100755 index 000000000..12b90a83c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/multiple.html @@ -0,0 +1,34 @@ + + + + + Multiple Accordion Panels - jQuery EasyUI Demo + + + + + + + +

                                                        Multiple Accordion Panels

                                                        +

                                                        Enable 'multiple' mode to expand multiple panels at one time.

                                                        +
                                                        +
                                                        +
                                                        +

                                                        A programming language is a formal language designed to communicate instructions to a machine, particularly a computer. Programming languages can be used to create programs that control the behavior of a machine and/or to express algorithms precisely.

                                                        +
                                                        +
                                                        +

                                                        Java (Indonesian: Jawa) is an island of Indonesia. With a population of 135 million (excluding the 3.6 million on the island of Madura which is administered as part of the provinces of Java), Java is the world's most populous island, and one of the most densely populated places in the world.

                                                        +
                                                        +
                                                        +

                                                        C# is a multi-paradigm programming language encompassing strong typing, imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.

                                                        +
                                                        +
                                                        +

                                                        A dynamic, reflective, general-purpose object-oriented programming language.

                                                        +
                                                        +
                                                        +

                                                        Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing.

                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/tools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/tools.html new file mode 100755 index 000000000..271694b46 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/tools.html @@ -0,0 +1,48 @@ + + + + + Accordion Tools - jQuery EasyUI Demo + + + + + + + +

                                                        Accordion Tools

                                                        +

                                                        Click the tools on top right of panel to perform actions.

                                                        +
                                                        +
                                                        +
                                                        +

                                                        Accordion for jQuery

                                                        +

                                                        Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                        +
                                                        +
                                                        +

                                                        The accordion allows you to provide multiple panels and display one ore more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

                                                        +
                                                        +
                                                        + + + + + + + + + + + +
                                                        Item IDProduct IDList PriceUnit CostAttributeStatus
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/basic.html new file mode 100755 index 000000000..64f37fe84 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/basic.html @@ -0,0 +1,19 @@ + + + + + Basic Calendar - jQuery EasyUI Demo + + + + + + + +

                                                        Basic Calendar

                                                        +

                                                        Click to select date.

                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/custom.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/custom.html new file mode 100755 index 000000000..f3fea452c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/custom.html @@ -0,0 +1,46 @@ + + + + + Custom Calendar - jQuery EasyUI Demo + + + + + + + +

                                                        Custom Calendar

                                                        +

                                                        This example shows how to custom the calendar date by using 'formatter' function.

                                                        +
                                                        + +
                                                        + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/disabledate.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/disabledate.html new file mode 100755 index 000000000..ef2c7ea59 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/disabledate.html @@ -0,0 +1,28 @@ + + + + + Disable Calendar Date - jQuery EasyUI Demo + + + + + + + +

                                                        Disable Calendar Date

                                                        +

                                                        This example shows how to disable specified dates, only allows the user to select Mondays.

                                                        +
                                                        + +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/firstday.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/firstday.html new file mode 100755 index 000000000..c636a0700 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/firstday.html @@ -0,0 +1,30 @@ + + + + + First Day of Week - jQuery EasyUI Demo + + + + + + + +

                                                        First Day of Week

                                                        +

                                                        Choose the first day of the week.

                                                        + +
                                                        + +
                                                        + +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/fluid.html new file mode 100755 index 000000000..e5e707024 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/fluid.html @@ -0,0 +1,23 @@ + + + + + Fluid Calendar - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid Calendar

                                                        +

                                                        This example shows how to set the width of calendar to a percentage of its parent container.

                                                        +
                                                        +
                                                        +

                                                        width: 50%, height: 250px

                                                        +
                                                        +

                                                        width: 30%, height: 40%

                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/weeknumber.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/weeknumber.html new file mode 100755 index 000000000..37d38b243 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/weeknumber.html @@ -0,0 +1,19 @@ + + + + + Week Number on Calendar - jQuery EasyUI Demo + + + + + + + +

                                                        Week Number on Calendar

                                                        +

                                                        This example shows how to display the week number on calendar.

                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/animation.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/animation.html new file mode 100755 index 000000000..4f1d4af90 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/animation.html @@ -0,0 +1,41 @@ + + + + + Combo Animation - jQuery EasyUI Demo + + + + + + + +

                                                        Combo Animation

                                                        +

                                                        Change the animation type when open & close the drop-down panel.

                                                        +
                                                        + Animation Type: + +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/basic.html new file mode 100755 index 000000000..cd966241a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/basic.html @@ -0,0 +1,48 @@ + + + + + Basic Combo - jQuery EasyUI Demo + + + + + + + +

                                                        Basic Combo

                                                        +

                                                        Click the right arrow button to show drop down panel that can be filled with any content.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        +
                                                        +
                                                        Select a language
                                                        +
                                                        + Java
                                                        + C#
                                                        + Ruby
                                                        + Basic
                                                        + Fortran +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/actions.html new file mode 100755 index 000000000..a883e174d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/actions.html @@ -0,0 +1,88 @@ + + + + + ComboBox Actions - jQuery EasyUI Demo + + + + + + + +

                                                        ComboBox

                                                        +

                                                        Click the buttons below to perform actions.

                                                        + + +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/basic.html new file mode 100755 index 000000000..1f268ea57 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/basic.html @@ -0,0 +1,73 @@ + + + + + Basic ComboBox - jQuery EasyUI Demo + + + + + + + +

                                                        Basic ComboBox

                                                        +

                                                        Type in ComboBox to try auto complete.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data1.json new file mode 100755 index 000000000..9c8f7f5b1 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data1.json @@ -0,0 +1,22 @@ +[{ + "id":1, + "text":"Java", + "desc":"Write once, run anywhere" +},{ + "id":2, + "text":"C#", + "desc":"One of the programming languages designed for the Common Language Infrastructure" +},{ + "id":3, + "text":"Ruby", + "selected":true, + "desc":"A dynamic, reflective, general-purpose object-oriented programming language" +},{ + "id":4, + "text":"Perl", + "desc":"A high-level, general-purpose, interpreted, dynamic programming language" +},{ + "id":5, + "text":"Basic", + "desc":"A family of general-purpose, high-level programming languages" +}] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data2.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data2.json new file mode 100755 index 000000000..c3baf77dc --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data2.json @@ -0,0 +1,47 @@ +[{ + "value":"f20", + "text":"Firefox 2.0 or higher", + "group":"Firefox" +},{ + "value":"f15", + "text":"Firefox 1.5.x", + "group":"Firefox" +},{ + "value":"f10", + "text":"Firefox 1.0.x", + "group":"Firefox" +},{ + "value":"ie7", + "text":"Microsoft Internet Explorer 7.0 or higher", + "group":"Microsoft Internet Explorer" +},{ + "value":"ie6", + "text":"Microsoft Internet Explorer 6.x", + "group":"Microsoft Internet Explorer" +},{ + "value":"ie5", + "text":"Microsoft Internet Explorer 5.x", + "group":"Microsoft Internet Explorer" +},{ + "value":"ie4", + "text":"Microsoft Internet Explorer 4.x", + "group":"Microsoft Internet Explorer" +},{ + "value":"op9", + "text":"Opera 9.0 or higher", + "group":"Opera" +},{ + "value":"op8", + "text":"Opera 8.x", + "group":"Opera" +},{ + "value":"op7", + "text":"Opera 7.x", + "group":"Opera" +},{ + "value":"Safari", + "text":"Safari" +},{ + "value":"Other", + "text":"Other" +}] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/customformat.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/customformat.html new file mode 100755 index 000000000..4ccadfe86 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/customformat.html @@ -0,0 +1,39 @@ + + + + + Custom Format in ComboBox - jQuery EasyUI Demo + + + + + + + +

                                                        Custom Format in ComboBox

                                                        +

                                                        This sample shows how to custom the format of list item.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/dynamicdata.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/dynamicdata.html new file mode 100755 index 000000000..ce151461a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/dynamicdata.html @@ -0,0 +1,31 @@ + + + + + Load Dynamic ComboBox Data - jQuery EasyUI Demo + + + + + + + +

                                                        Load Dynamic ComboBox Data

                                                        +

                                                        Click the button below to load data.

                                                        + +
                                                        + LoadData +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/fluid.html new file mode 100755 index 000000000..0f5cd2596 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/fluid.html @@ -0,0 +1,43 @@ + + + + + Fluid ComboBox - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid ComboBox

                                                        +

                                                        This example shows how to set the width of combobox to a percentage of its parent container.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/group.html new file mode 100755 index 000000000..8bc3ad87c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/group.html @@ -0,0 +1,33 @@ + + + + + Group ComboBox - jQuery EasyUI Demo + + + + + + + +

                                                        Group ComboBox

                                                        +

                                                        This example shows how to display combobox items in groups.

                                                        +
                                                        + + Sticky Group +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/icons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/icons.html new file mode 100755 index 000000000..0c30cc1fa --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/icons.html @@ -0,0 +1,36 @@ + + + + + ComboBox with Extra Icons- jQuery EasyUI Demo + + + + + + + +

                                                        ComboBox with Extra Icons

                                                        +

                                                        The user can attach extra icons to the ComboBox.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/itemicon.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/itemicon.html new file mode 100644 index 000000000..6a818197c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/itemicon.html @@ -0,0 +1,35 @@ + + + + + Show Item Icon in ComboBox - jQuery EasyUI Demo + + + + + + + +

                                                        Show Item Icon in ComboBox

                                                        +

                                                        This example shows how to display item icon in ComboBox.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiline.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiline.html new file mode 100755 index 000000000..133221f3a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiline.html @@ -0,0 +1,75 @@ + + + + + Multiline ComboBox - jQuery EasyUI Demo + + + + + + + +

                                                        Multiline ComboBox

                                                        +

                                                        This example shows how to create a multiline ComboBox.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiple.html new file mode 100755 index 000000000..9fd2a114b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiple.html @@ -0,0 +1,32 @@ + + + + + Multiple Select - jQuery EasyUI Demo + + + + + + + +

                                                        Load Dynamic ComboBox Data

                                                        +

                                                        Drop down the panel and select multiple items.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/navigation.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/navigation.html new file mode 100755 index 000000000..691bc7c07 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/navigation.html @@ -0,0 +1,77 @@ + + + + + Navigate ComboBox - jQuery EasyUI Demo + + + + + + + +

                                                        Navigate ComboBox

                                                        +

                                                        Navigate through combobox items width keyboard to select an item.

                                                        +
                                                        + + SelectOnNavigation +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotedata.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotedata.html new file mode 100755 index 000000000..8277d27d6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotedata.html @@ -0,0 +1,30 @@ + + + + + Binding to Remote Data - jQuery EasyUI Demo + + + + + + + +

                                                        Binding to Remote Data

                                                        +

                                                        The ComboBox is bound to a remote data.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotejsonp.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotejsonp.html new file mode 100755 index 000000000..1fbc04fdb --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotejsonp.html @@ -0,0 +1,54 @@ + + + + + Remote JSONP - jQuery EasyUI Demo + + + + + + + +

                                                        Remote JSONP

                                                        +

                                                        This sample shows how to use JSONP to retrieve data from a remote site.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/actions.html new file mode 100755 index 000000000..64443e5fe --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/actions.html @@ -0,0 +1,60 @@ + + + + + ComboGrid Actions - jQuery EasyUI Demo + + + + + + + +

                                                        ComboGrid Actions

                                                        +

                                                        Click the buttons below to perform actions.

                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/basic.html new file mode 100755 index 000000000..3edc31ee2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/basic.html @@ -0,0 +1,40 @@ + + + + + Basic ComboGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Basic ComboGrid

                                                        +

                                                        Click the right arrow button to show the DataGrid.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/datagrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/datagrid_data1.json new file mode 100755 index 000000000..c74fa230d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/datagrid_data1.json @@ -0,0 +1,12 @@ +{"total":28,"rows":[ + {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, + {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, + {"selected":true,"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, + {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} +]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/fluid.html new file mode 100755 index 000000000..52b0ac75e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/fluid.html @@ -0,0 +1,63 @@ + + + + + Fluid ComboGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid ComboGrid

                                                        +

                                                        This example shows how to set the width of ComboGrid to a percentage of its parent container.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/initvalue.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/initvalue.html new file mode 100755 index 000000000..be122a091 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/initvalue.html @@ -0,0 +1,41 @@ + + + + + Initialize Value for ComboGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Initialize Value for ComboGrid

                                                        +

                                                        Initialize value when ComboGrid is created.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/multiple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/multiple.html new file mode 100755 index 000000000..c357d7be8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/multiple.html @@ -0,0 +1,42 @@ + + + + + Multiple ComboGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Multiple ComboGrid

                                                        +

                                                        Click the right arrow button to show the DataGrid and select items.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/navigation.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/navigation.html new file mode 100755 index 000000000..793c74e1a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/navigation.html @@ -0,0 +1,43 @@ + + + + + Navigate ComboGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Navigate ComboGrid

                                                        +

                                                        Navigate through grid items with keyboard to select an item.

                                                        +
                                                        + + SelectOnNavigation +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/setvalue.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/setvalue.html new file mode 100755 index 000000000..df86ba4e2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/setvalue.html @@ -0,0 +1,59 @@ + + + + + Set Value for ComboGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Set Value for ComboGrid

                                                        +

                                                        Click the buttons below to perform actions.

                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/actions.html new file mode 100755 index 000000000..1d4660af2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/actions.html @@ -0,0 +1,43 @@ + + + + + ComboTree Actions - jQuery EasyUI Demo + + + + + + + +

                                                        ComboTree Actions

                                                        +

                                                        Click the buttons below to perform actions

                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/basic.html new file mode 100755 index 000000000..687207cbf --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/basic.html @@ -0,0 +1,22 @@ + + + + + Basic ComboTree - jQuery EasyUI Demo + + + + + + + +

                                                        Basic ComboTree

                                                        +

                                                        Click the right arrow button to show the tree panel.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/fluid.html new file mode 100755 index 000000000..bc77d9e6a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid ComboTree - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid ComboTree

                                                        +

                                                        This example shows how to set the width of ComboTree to a percentage of its parent container.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/initvalue.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/initvalue.html new file mode 100755 index 000000000..92af22ddc --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/initvalue.html @@ -0,0 +1,22 @@ + + + + + Initialize Value for ComboTree - jQuery EasyUI Demo + + + + + + + +

                                                        Initialize Value for ComboTree

                                                        +

                                                        Initialize Value when ComboTree is created.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/multiple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/multiple.html new file mode 100755 index 000000000..7ae86eab3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/multiple.html @@ -0,0 +1,26 @@ + + + + + Multiple ComboTree - jQuery EasyUI Demo + + + + + + + +

                                                        Multiple ComboTree

                                                        +

                                                        Click the right arrow button to show the tree panel and select multiple nodes.

                                                        +
                                                        + Cascade Check: + +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/tree_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/tree_data1.json new file mode 100755 index 000000000..e0c619226 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/tree_data1.json @@ -0,0 +1,49 @@ +[{ + "id":1, + "text":"My Documents", + "children":[{ + "id":11, + "text":"Photos", + "state":"closed", + "children":[{ + "id":111, + "text":"Friend" + },{ + "id":112, + "text":"Wife" + },{ + "id":113, + "text":"Company" + }] + },{ + "id":12, + "text":"Program Files", + "children":[{ + "id":121, + "text":"Intel" + },{ + "id":122, + "text":"Java", + "attributes":{ + "p1":"Custom Attribute1", + "p2":"Custom Attribute2" + } + },{ + "id":123, + "text":"Microsoft Office" + },{ + "id":124, + "text":"Games", + "checked":true + }] + },{ + "id":13, + "text":"index.html" + },{ + "id":14, + "text":"about.html" + },{ + "id":15, + "text":"welcome.html" + }] +}] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/basic.html new file mode 100755 index 000000000..f4fac4bfb --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/basic.html @@ -0,0 +1,34 @@ + + + + + Basic ComboTreeGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Basic ComboTreeGrid

                                                        +

                                                        Click the right arrow button to show the TreeGrid.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/multiple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/multiple.html new file mode 100755 index 000000000..91d35299c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/multiple.html @@ -0,0 +1,36 @@ + + + + + Multiple ComboTreeGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Multiple ComboTreeGrid

                                                        +

                                                        Click the right arrow button to show the TreeGrid and select items.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json new file mode 100755 index 000000000..6cc109739 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json @@ -0,0 +1,73 @@ +[{ + "id":1, + "name":"C", + "size":"", + "date":"02/19/2010", + "children":[{ + "id":2, + "name":"Program Files", + "size":"120 MB", + "date":"03/20/2010", + "children":[{ + "id":21, + "name":"Java", + "size":"", + "date":"01/13/2010", + "state":"closed", + "children":[{ + "id":211, + "name":"java.exe", + "size":"142 KB", + "date":"01/13/2010" + },{ + "id":212, + "name":"jawt.dll", + "size":"5 KB", + "date":"01/13/2010" + }] + },{ + "id":22, + "name":"MySQL", + "size":"", + "date":"01/13/2010", + "state":"closed", + "children":[{ + "id":221, + "name":"my.ini", + "size":"10 KB", + "date":"02/26/2009" + },{ + "id":222, + "name":"my-huge.ini", + "size":"5 KB", + "date":"02/26/2009" + },{ + "id":223, + "name":"my-large.ini", + "size":"5 KB", + "date":"02/26/2009" + }] + }] + },{ + "id":3, + "name":"eclipse", + "size":"", + "date":"01/20/2010", + "children":[{ + "id":31, + "name":"eclipse.exe", + "size":"56 KB", + "date":"05/19/2009" + },{ + "id":32, + "name":"eclipse.ini", + "size":"1 KB", + "date":"04/20/2010" + },{ + "id":33, + "name":"notice.html", + "size":"7 KB", + "date":"03/17/2005" + }] + }] +}] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/aligncolumns.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/aligncolumns.html new file mode 100755 index 000000000..602196211 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/aligncolumns.html @@ -0,0 +1,32 @@ + + + + + Aligning Columns in DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Aligning Columns in DataGrid

                                                        +

                                                        Use align and halign properties to set the alignment of the columns and their header.

                                                        +
                                                        + + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/basic.html new file mode 100755 index 000000000..6870ac217 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/basic.html @@ -0,0 +1,32 @@ + + + + + Basic DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Basic DataGrid

                                                        +

                                                        The DataGrid is created from markup, no JavaScript code needed.

                                                        +
                                                        + + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cacheeditor.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cacheeditor.html new file mode 100755 index 000000000..df55e30f6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cacheeditor.html @@ -0,0 +1,149 @@ + + + + + Cache Editor for DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Cache Editor for DataGrid

                                                        +

                                                        This example shows how to cache the editors for datagrid to improve the editing speed.

                                                        +
                                                        + + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellediting.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellediting.html new file mode 100755 index 000000000..385b2d4d8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellediting.html @@ -0,0 +1,94 @@ + + + + + Cell Editing in DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Cell Editing in DataGrid

                                                        +

                                                        Click a cell to start editing.

                                                        +
                                                        + + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellstyle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellstyle.html new file mode 100755 index 000000000..9230ac214 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellstyle.html @@ -0,0 +1,42 @@ + + + + + DataGrid Cell Style - jQuery EasyUI Demo + + + + + + + +

                                                        DataGrid Cell Style

                                                        +

                                                        The cells which listprice value is less than 30 are highlighted.

                                                        +
                                                        + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/checkbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/checkbox.html new file mode 100755 index 000000000..ca1c81c2e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/checkbox.html @@ -0,0 +1,42 @@ + + + + + CheckBox Selection on DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        CheckBox Selection on DataGrid

                                                        +

                                                        Click the checkbox on header to select or unselect all selections.

                                                        +
                                                        + + + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        +
                                                        + Selection Mode: +
                                                        + SelectOnCheck:
                                                        + CheckOnSelect: +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/clientpagination.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/clientpagination.html new file mode 100755 index 000000000..3bec54cd8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/clientpagination.html @@ -0,0 +1,160 @@ + + + + + Client Side Pagination in DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Client Side Pagination in DataGrid

                                                        +

                                                        This sample shows how to implement client side pagination in DataGrid.

                                                        +
                                                        + + + + + + + + + + + + + +
                                                        Inv NoDateNameAmountPriceCostNote
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/columngroup.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/columngroup.html new file mode 100755 index 000000000..9c3340e11 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/columngroup.html @@ -0,0 +1,34 @@ + + + + + Column Group - jQuery EasyUI Demo + + + + + + + +

                                                        Column Group

                                                        +

                                                        The header cells can be merged. Useful to group columns under a category.

                                                        +
                                                        + + + + + + + + + + + + + + +
                                                        Item IDProductItem Details
                                                        List PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/complextoolbar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/complextoolbar.html new file mode 100755 index 000000000..35c9ba186 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/complextoolbar.html @@ -0,0 +1,50 @@ + + + + + DataGrid Complex Toolbar - jQuery EasyUI Demo + + + + + + + +

                                                        DataGrid Complex Toolbar

                                                        +

                                                        The DataGrid toolbar can be defined from a <div> markup, so you can define the layout of toolbar easily.

                                                        +
                                                        + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        +
                                                        + Date From: + To: + Language: + + Search +
                                                        +
                                                        + + + + + +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/contextmenu.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/contextmenu.html new file mode 100755 index 000000000..4da2f842d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/contextmenu.html @@ -0,0 +1,89 @@ + + + + + Context Menu on DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Context Menu on DataGrid

                                                        +

                                                        Right click on the header of DataGrid to display context menu.

                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/custompager.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/custompager.html new file mode 100755 index 000000000..c4c62d707 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/custompager.html @@ -0,0 +1,53 @@ + + + + + Custom DataGrid Pager - jQuery EasyUI Demo + + + + + + + +

                                                        Custom DataGrid Pager

                                                        +

                                                        You can append some buttons to the standard datagrid pager bar.

                                                        +
                                                        + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data1.json new file mode 100755 index 000000000..63d647358 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data1.json @@ -0,0 +1,12 @@ +{"total":28,"rows":[ + {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, + {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, + {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, + {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} +]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data2.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data2.json new file mode 100755 index 000000000..ce91babf0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data2.json @@ -0,0 +1,15 @@ +{"total":28,"rows":[ + {"productid":"FI-SW-01","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, + {"productid":"K9-DL-01","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, + {"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":28.50,"attr1":"Venomless","itemid":"EST-11"}, + {"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, + {"productid":"RP-LI-02","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, + {"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, + {"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, + {"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":63.50,"attr1":"Adult Female","itemid":"EST-16"}, + {"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, + {"productid":"AV-CB-01","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} +],"footer":[ + {"unitcost":19.80,"listprice":60.40,"productid":"Average:"}, + {"unitcost":198.00,"listprice":604.00,"productid":"Total:"} +]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/fluid.html new file mode 100755 index 000000000..463f570c5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/fluid.html @@ -0,0 +1,32 @@ + + + + + Fluid DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid DataGrid

                                                        +

                                                        This example shows how to assign percentage width to a column in DataGrid.

                                                        +
                                                        + + + + + + + + + + + + +
                                                        Item ID(15%)Product(15%)List Price(15%)Unit Cost(15%)Attribute(25%)Status(15%)
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/footer.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/footer.html new file mode 100755 index 000000000..ccb8885fa --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/footer.html @@ -0,0 +1,38 @@ + + + + + Footer Rows in DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Footer Rows in DataGrid

                                                        +

                                                        The summary informations can be displayed in footer rows.

                                                        +
                                                        + + + + + + + + + + + +
                                                        Item IDProduct IDList PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/formatcolumns.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/formatcolumns.html new file mode 100755 index 000000000..e5a2e0252 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/formatcolumns.html @@ -0,0 +1,39 @@ + + + + + Format DataGrid Columns - jQuery EasyUI Demo + + + + + + + +

                                                        Format DataGrid Columns

                                                        +

                                                        The list price value will show red color when less than 30.

                                                        +
                                                        + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozencolumns.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozencolumns.html new file mode 100755 index 000000000..3542017b4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozencolumns.html @@ -0,0 +1,35 @@ + + + + + Frozen Columns in DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Frozen Columns in DataGrid

                                                        +

                                                        You can freeze some columns that can't scroll out of view.

                                                        +
                                                        + + + + + + + + + + + + + + + +
                                                        Item IDProduct
                                                        List PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozenrows.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozenrows.html new file mode 100755 index 000000000..be27afd83 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozenrows.html @@ -0,0 +1,44 @@ + + + + + Frozen Rows in DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Frozen Rows in DataGrid

                                                        +

                                                        This sample shows how to freeze some rows that will always be displayed at the top when the datagrid is scrolled down.

                                                        +
                                                        + + + + + + + + + + + + + + + +
                                                        Item IDProduct
                                                        List PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/mergecells.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/mergecells.html new file mode 100755 index 000000000..3d0ff75e8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/mergecells.html @@ -0,0 +1,58 @@ + + + + + Merge Cells for DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Merge Cells for DataGrid

                                                        +

                                                        Cells in DataGrid body can be merged.

                                                        +
                                                        + + + + + + + + + + + +
                                                        ProductItem IDList PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/multisorting.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/multisorting.html new file mode 100755 index 000000000..d7337f3d8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/multisorting.html @@ -0,0 +1,37 @@ + + + + + Multiple Sorting - jQuery EasyUI Demo + + + + + + + +

                                                        Multiple Sorting

                                                        +

                                                        Set 'multiSort' property to true to enable multiple column sorting.

                                                        +
                                                        + + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/products.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/products.json new file mode 100755 index 000000000..b0b6a936e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/products.json @@ -0,0 +1,9 @@ +[ +{"productid":"FI-SW-01","productname":"Koi"}, +{"productid":"K9-DL-01","productname":"Dalmation"}, +{"productid":"RP-SN-01","productname":"Rattlesnake"}, +{"productid":"RP-LI-02","productname":"Iguana"}, +{"productid":"FL-DSH-01","productname":"Manx"}, +{"productid":"FL-DLH-02","productname":"Persian"}, +{"productid":"AV-CB-01","productname":"Amazon Parrot"} +] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowborder.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowborder.html new file mode 100755 index 000000000..21843f451 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowborder.html @@ -0,0 +1,60 @@ + + + + + Row Border in DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Row Border in DataGrid

                                                        +

                                                        This sample shows how to change the row border style of datagrid.

                                                        +
                                                        + Border: + + Striped: + +
                                                        + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowediting.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowediting.html new file mode 100755 index 000000000..c9dd52683 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowediting.html @@ -0,0 +1,125 @@ + + + + + Row Editing in DataGrid - jQuery EasyUI Demo + + + + + + + +

                                                        Row Editing in DataGrid

                                                        +

                                                        Click the row to start editing.

                                                        +
                                                        + + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowstyle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowstyle.html new file mode 100755 index 000000000..d4e36a877 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowstyle.html @@ -0,0 +1,41 @@ + + + + + DataGrid Row Style - jQuery EasyUI Demo + + + + + + + +

                                                        DataGrid Row Style

                                                        +

                                                        The rows which listprice value is less than 30 are highlighted.

                                                        +
                                                        + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/selection.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/selection.html new file mode 100755 index 000000000..d6b4047bc --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/selection.html @@ -0,0 +1,57 @@ + + + + + DataGrid Selection - jQuery EasyUI Demo + + + + + + + +

                                                        DataGrid Selection

                                                        +

                                                        Choose a selection mode and select one or more rows.

                                                        + + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        +
                                                        + Selection Mode: + +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/simpletoolbar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/simpletoolbar.html new file mode 100755 index 000000000..4c67f56e7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/simpletoolbar.html @@ -0,0 +1,45 @@ + + + + + DataGrid with Toolbar - jQuery EasyUI Demo + + + + + + + +

                                                        DataGrid with Toolbar

                                                        +

                                                        Put buttons on top toolbar of DataGrid.

                                                        +
                                                        + + + + + + + + + + + +
                                                        Item IDProductList PriceUnit CostAttributeStatus
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/transform.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/transform.html new file mode 100755 index 000000000..9379832ae --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/transform.html @@ -0,0 +1,46 @@ + + + + + Transform DataGrid from Table - jQuery EasyUI Demo + + + + + + + +

                                                        Transform DataGrid from Table

                                                        +

                                                        Transform DataGrid from an existing, unformatted html table.

                                                        +
                                                        + Transform +
                                                        + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                        Item IDProductList PriceAttribute
                                                        EST-1FI-SW-0136.50Large
                                                        EST-10K9-DL-0118.50Spotted Adult Female
                                                        EST-11RP-SN-0128.50Venomless
                                                        EST-12RP-SN-0126.50Rattleless
                                                        EST-13RP-LI-0235.50Green Adult
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/basic.html new file mode 100644 index 000000000..491021908 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/basic.html @@ -0,0 +1,69 @@ + + + + + Basic DataList - jQuery EasyUI Demo + + + + + + + +

                                                        Basic DataList

                                                        +

                                                        The DataList can be created from the <ul> element.

                                                        +
                                                        +
                                                          +
                                                        • Alabama
                                                        • +
                                                        • Alaska
                                                        • +
                                                        • Arizona
                                                        • +
                                                        • Arkansas
                                                        • +
                                                        • California
                                                        • +
                                                        • Colorado
                                                        • +
                                                        • Connecticut
                                                        • +
                                                        • Delaware
                                                        • +
                                                        • Florida
                                                        • +
                                                        • Georgia
                                                        • +
                                                        • Hawaii
                                                        • +
                                                        • Idaho
                                                        • +
                                                        • Illinois
                                                        • +
                                                        • Indiana
                                                        • +
                                                        • Iowa
                                                        • +
                                                        • Kansas
                                                        • +
                                                        • Kentucky
                                                        • +
                                                        • Louisiana
                                                        • +
                                                        • Maine
                                                        • +
                                                        • Maryland
                                                        • +
                                                        • Massachusetts
                                                        • +
                                                        • Michigan
                                                        • +
                                                        • Minnesota
                                                        • +
                                                        • Mississippi
                                                        • +
                                                        • Missouri
                                                        • +
                                                        • Montana
                                                        • +
                                                        • Nebraska
                                                        • +
                                                        • Nevada
                                                        • +
                                                        • New Hampshire
                                                        • +
                                                        • New Jersey
                                                        • +
                                                        • New Mexico
                                                        • +
                                                        • New York
                                                        • +
                                                        • North Carolina
                                                        • +
                                                        • North Dakota
                                                        • +
                                                        • Ohio
                                                        • +
                                                        • Oklahoma
                                                        • +
                                                        • Oregon
                                                        • +
                                                        • Pennsylvania
                                                        • +
                                                        • Rhode Island
                                                        • +
                                                        • South Carolina
                                                        • +
                                                        • South Dakota
                                                        • +
                                                        • Tennessee
                                                        • +
                                                        • Texas
                                                        • +
                                                        • Utah
                                                        • +
                                                        • Vermont
                                                        • +
                                                        • Virginia
                                                        • +
                                                        • Washington
                                                        • +
                                                        • West Virginia
                                                        • +
                                                        • Wisconsin
                                                        • +
                                                        • Wyoming
                                                        • +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/checkbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/checkbox.html new file mode 100644 index 000000000..dd18f5b1c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/checkbox.html @@ -0,0 +1,25 @@ + + + + + Checkbox in DataList - jQuery EasyUI Demo + + + + + + + +

                                                        Checkbox in DataList

                                                        +

                                                        Each item in the DataList has a checkbox.

                                                        +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/datalist_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/datalist_data1.json new file mode 100644 index 000000000..d53cf62a0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/datalist_data1.json @@ -0,0 +1,18 @@ +[ +{"text":"Epson WorkForce 845","group":"Printer"}, +{"text":"Canon PIXMA MG5320","group":"Printer"}, +{"text":"HP Deskjet 1000 Printer","group":"Printer"}, +{"text":"Cisco RV110W-A-NA-K9","group":"Firewall"}, +{"text":"ZyXEL ZyWALL USG50","group":"Firewall"}, +{"text":"NETGEAR FVS318","group":"Firewall"}, +{"text":"Logitech Keyboard K120","group":"Keyboard"}, +{"text":"Microsoft Natural Ergonomic Keyboard 4000","group":"Keyboard"}, +{"text":"Logitech Wireless Touch Keyboard K400","group":"Keyboard"}, +{"text":"Logitech Gaming Keyboard G110","group":"Keyboard"}, +{"text":"Nikon COOLPIX L26 16.1 MP","group":"Camera"}, +{"text":"Canon PowerShot A1300","group":"Camera"}, +{"text":"Canon PowerShot A2300","group":"Camera"} + + + +] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/group.html new file mode 100644 index 000000000..bf22b6f03 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/group.html @@ -0,0 +1,23 @@ + + + + + Group DataList - jQuery EasyUI Demo + + + + + + + +

                                                        Group DataList

                                                        +

                                                        This example shows how to display items in groups.

                                                        +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/multiselect.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/multiselect.html new file mode 100644 index 000000000..704924c6a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/multiselect.html @@ -0,0 +1,23 @@ + + + + + Multiple Selection DataList - jQuery EasyUI Demo + + + + + + + +

                                                        Multiple Selection DataList

                                                        +

                                                        The multiple selection allows the user to select multiple items in a datalist.

                                                        +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/remotedata.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/remotedata.html new file mode 100644 index 000000000..0c71604aa --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/remotedata.html @@ -0,0 +1,22 @@ + + + + + Binding to Remote Data - jQuery EasyUI Demo + + + + + + + +

                                                        Binding to Remote Data

                                                        +

                                                        The DataList is bound to a remote data.

                                                        +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/basic.html new file mode 100755 index 000000000..ccbde6f3d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/basic.html @@ -0,0 +1,25 @@ + + + + + Basic DateBox - jQuery EasyUI Demo + + + + + + + +

                                                        Basic DateBox

                                                        +

                                                        Click the calendar image on the right side.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/buttons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/buttons.html new file mode 100755 index 000000000..10b566a58 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/buttons.html @@ -0,0 +1,34 @@ + + + + + DateBox Buttons - jQuery EasyUI Demo + + + + + + + +

                                                        DateBox Buttons

                                                        +

                                                        This example shows how to customize the datebox buttons underneath the calendar.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/clone.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/clone.html new file mode 100755 index 000000000..be975ecc7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/clone.html @@ -0,0 +1,31 @@ + + + + + Clone DateBox - jQuery EasyUI Demo + + + + + + + +

                                                        Clone DateBox

                                                        +

                                                        Click the 'Clone' button to clone datebox components from the exiting datebox.

                                                        +
                                                        + Clone +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/dateformat.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/dateformat.html new file mode 100755 index 000000000..3fa8b3b62 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/dateformat.html @@ -0,0 +1,45 @@ + + + + + Date Format - jQuery EasyUI Demo + + + + + + + +

                                                        Date Format

                                                        +

                                                        Different date formats are applied to different DateBox components.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/events.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/events.html new file mode 100755 index 000000000..3d75faefd --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/events.html @@ -0,0 +1,31 @@ + + + + + DateBox Events - jQuery EasyUI Demo + + + + + + + +

                                                        DateBox Events

                                                        +

                                                        Click the calendar image on the right side.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + Selected Date: + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/fluid.html new file mode 100755 index 000000000..3bf3dd400 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid DateBox - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid DateBox

                                                        +

                                                        This example shows how to set the width of DateBox to a percentage of its parent container.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/restrict.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/restrict.html new file mode 100755 index 000000000..0622efe49 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/restrict.html @@ -0,0 +1,34 @@ + + + + + Restrict Date Range in DateBox - jQuery EasyUI Demo + + + + + + + +

                                                        Restrict Date Range in DateBox

                                                        +

                                                        This example shows how to restrict the user to select only ten days from now.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/sharedcalendar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/sharedcalendar.html new file mode 100644 index 000000000..ca06eb82a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/sharedcalendar.html @@ -0,0 +1,26 @@ + + + + + Shared Calendar in DateBox - jQuery EasyUI Demo + + + + + + + +

                                                        Shared Calendar in DateBox

                                                        +

                                                        Multiple datebox components can share a calendar and use it to pick dates.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/validate.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/validate.html new file mode 100755 index 000000000..067582dba --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/validate.html @@ -0,0 +1,37 @@ + + + + + Validate DateBox - jQuery EasyUI Demo + + + + + + + +

                                                        Validate DateBox

                                                        +

                                                        When the selected date is greater than specified date. The field validator will raise an error.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/basic.html new file mode 100755 index 000000000..f1521d02c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/basic.html @@ -0,0 +1,25 @@ + + + + + Basic DateTimeBox - jQuery EasyUI Demo + + + + + + + +

                                                        Basic DateTimeBox

                                                        +

                                                        Click the calendar image on the right side.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/fluid.html new file mode 100755 index 000000000..827a1b2a0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid DateTimeBox - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid DateTimeBox

                                                        +

                                                        This example shows how to set the width of DateTimeBox to a percentage of its parent container.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/initvalue.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/initvalue.html new file mode 100755 index 000000000..59079f556 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/initvalue.html @@ -0,0 +1,22 @@ + + + + + Initialize Value for DateTime - jQuery EasyUI Demo + + + + + + + +

                                                        Initialize Value for DateTime

                                                        +

                                                        The value is initialized when DateTimeBox has been created.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/showseconds.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/showseconds.html new file mode 100755 index 000000000..508ac19ff --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/showseconds.html @@ -0,0 +1,25 @@ + + + + + Display Seconds - jQuery EasyUI Demo + + + + + + + +

                                                        Display Seconds

                                                        +

                                                        The user can decide to display seconds part or not.

                                                        +
                                                        + Show Seconds: + +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/basic.html new file mode 100644 index 000000000..8a00c41a2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/basic.html @@ -0,0 +1,25 @@ + + + + + Basic DateTimeSpinner - jQuery EasyUI Demo + + + + + + + +

                                                        Basic DateTimeSpinner

                                                        +

                                                        Click spin button to adjust date and time.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/clearicon.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/clearicon.html new file mode 100644 index 000000000..74e2795d0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/clearicon.html @@ -0,0 +1,33 @@ + + + + + DateTimeSpinner with Clear Icon - jQuery EasyUI Demo + + + + + + + +

                                                        DateTimeSpinner with Clear Icon

                                                        +

                                                        A clear icon can be attached to the datetimespinner. Click it to clear the entered value.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/fluid.html new file mode 100644 index 000000000..e5e3f1fe9 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid DateTimeSpinner - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid DateTimeSpinner

                                                        +

                                                        The width of datetimespinner is set in percentages.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/format.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/format.html new file mode 100644 index 000000000..f470c715b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/format.html @@ -0,0 +1,55 @@ + + + + + Format DateTimeSpinner - jQuery EasyUI Demo + + + + + + + +

                                                        Format DateTimeSpinner

                                                        +

                                                        The DataTimeSpinner value can be formatted by specifying the 'formatter' and 'parser' functions.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/demo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/demo.css new file mode 100755 index 000000000..fe8b3c70a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/demo.css @@ -0,0 +1,24 @@ +body { + font-family:verdana,helvetica,arial,sans-serif; + padding:20px; + font-size:12px; + margin:0; +} +h2 { + font-size:18px; + font-weight:bold; + margin:0; + margin-bottom:15px; +} +.demo-info{ + padding:0 0 12px 0; +} +.demo-tip{ + display:none; +} +.label-top{ + display: block; + height: 22px; + line-height: 22px; + vertical-align: middle; +} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/basic.html new file mode 100755 index 000000000..37ca83059 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/basic.html @@ -0,0 +1,23 @@ + + + + + Basic Dialog - jQuery EasyUI Demo + + + + + + + +

                                                        Basic Dialog

                                                        +

                                                        Click below button to open or close dialog.

                                                        +
                                                        + Open + Close +
                                                        +
                                                        + The dialog content. +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/complextoolbar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/complextoolbar.html new file mode 100755 index 000000000..adaa97b7b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/complextoolbar.html @@ -0,0 +1,46 @@ + + + + + Complex Toolbar on Dialog - jQuery EasyUI Demo + + + + + + + +

                                                        Complex Toolbar on Dialog

                                                        +

                                                        This sample shows how to create complex toolbar on dialog.

                                                        +
                                                        + Open + Close +
                                                        +
                                                        + The dialog content. +
                                                        +
                                                        + + + + + +
                                                        + Edit + Help + + +
                                                        +
                                                        +
                                                        + Save + Close +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/fluid.html new file mode 100755 index 000000000..f64f72e0d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/fluid.html @@ -0,0 +1,24 @@ + + + + + Fluid Dialog - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid Dialog

                                                        +

                                                        This example shows how to set the width of Dialog to a percentage of its parent container.

                                                        +
                                                        +
                                                        +

                                                        width: 80%; height: 200px

                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/toolbarbuttons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/toolbarbuttons.html new file mode 100755 index 000000000..12e230758 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/toolbarbuttons.html @@ -0,0 +1,52 @@ + + + + + Toolbar and Buttons - jQuery EasyUI Demo + + + + + + + +

                                                        Toolbar and Buttons

                                                        +

                                                        The toolbar and buttons can be added to dialog.

                                                        +
                                                        + Open + Close +
                                                        +
                                                        + The dialog content. +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/basic.html new file mode 100755 index 000000000..3a73cf230 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/basic.html @@ -0,0 +1,21 @@ + + + + + Basic Draggable - jQuery EasyUI Demo + + + + + + + +

                                                        Basic Draggable

                                                        +

                                                        Move the boxes below by clicking on it with mouse.

                                                        +
                                                        +
                                                        +
                                                        +
                                                        Title
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/constrain.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/constrain.html new file mode 100755 index 000000000..b72e3ff44 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/constrain.html @@ -0,0 +1,35 @@ + + + + + Constrain Draggable - jQuery EasyUI Demo + + + + + + + +

                                                        Constrain Draggable

                                                        +

                                                        The draggable object can only be moved within its parent container.

                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/snap.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/snap.html new file mode 100755 index 000000000..c3ddd0584 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/snap.html @@ -0,0 +1,37 @@ + + + + + Snap Draggable - jQuery EasyUI Demo + + + + + + + +

                                                        Snap Draggable

                                                        +

                                                        This sample shows how to snap a draggable object to a 20x20 grid.

                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/accept.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/accept.html new file mode 100755 index 000000000..8da0d42cd --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/accept.html @@ -0,0 +1,78 @@ + + + + + Accept a Drop - jQuery EasyUI Demo + + + + + + + +

                                                        Accept a Drop

                                                        +

                                                        Some draggable object can not be accepted.

                                                        +
                                                        +
                                                        + drag me! +
                                                        Drag 1
                                                        +
                                                        Drag 2
                                                        +
                                                        Drag 3
                                                        +
                                                        +
                                                        + drop here! +
                                                        +
                                                        + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/basic.html new file mode 100755 index 000000000..7738c0688 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/basic.html @@ -0,0 +1,77 @@ + + + + + Basic Droppable - jQuery EasyUI Demo + + + + + + + +

                                                        Basic Droppable

                                                        +

                                                        Drag the boxed on left to the target area on right.

                                                        +
                                                        +
                                                        +
                                                        Source
                                                        +
                                                        +
                                                        Apple
                                                        +
                                                        Peach
                                                        +
                                                        Orange
                                                        +
                                                        +
                                                        +
                                                        +
                                                        Target
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/sort.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/sort.html new file mode 100755 index 000000000..1d99cd822 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/sort.html @@ -0,0 +1,71 @@ + + + + + Change Items Order - jQuery EasyUI Demo + + + + + + + +

                                                        Change Items Order

                                                        +

                                                        Drag the list items to change their order.

                                                        +
                                                        +
                                                          +
                                                        • Drag 1
                                                        • +
                                                        • Drag 2
                                                        • +
                                                        • Drag 3
                                                        • +
                                                        • Drag 4
                                                        • +
                                                        • Drag 5
                                                        • +
                                                        • Drag 6
                                                        • +
                                                        + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/easyloader/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/easyloader/basic.html new file mode 100755 index 000000000..0d7ba7b12 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/easyloader/basic.html @@ -0,0 +1,75 @@ + + + + + Basic EasyLoader - jQuery EasyUI Demo + + + + + + + +

                                                        Basic EasyLoader

                                                        +
                                                        +
                                                        +
                                                        Click the buttons below to load components dynamically.
                                                        +
                                                        + +
                                                        +
                                                        +
                                                        + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/basic.html new file mode 100644 index 000000000..394dcf983 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/basic.html @@ -0,0 +1,31 @@ + + + + + Basic FileBox - jQuery EasyUI Demo + + + + + + + +

                                                        Basic FileBox

                                                        +

                                                        The filebox component represents a file field of the forms.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + Upload +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/buttonalign.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/buttonalign.html new file mode 100644 index 000000000..072a4067c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/buttonalign.html @@ -0,0 +1,32 @@ + + + + + Button Align on FileBox - jQuery EasyUI Demo + + + + + + + +

                                                        Button Align on FileBox

                                                        +

                                                        Change the button align to the left or right of filebox.

                                                        +
                                                        + Select Button Align: + +
                                                        +
                                                        + +
                                                        + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/fluid.html new file mode 100644 index 000000000..67eaf1dfa --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid FileBox - jQuery EasyUI Demo + + + + + + + +

                                                        Fluid FileBox

                                                        +

                                                        This example shows how to set the width of FileBox to a percentage of its parent container.

                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/basic.html new file mode 100755 index 000000000..7df82aa02 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/basic.html @@ -0,0 +1,48 @@ + + + + + Basic Form - jQuery EasyUI Demo + + + + + + + +

                                                        Basic Form

                                                        +

                                                        Fill the form and submit it.

                                                        +
                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        +
                                                        + Submit + Clear +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/form_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/form_data1.json new file mode 100755 index 000000000..4ac269bfc --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/form_data1.json @@ -0,0 +1,8 @@ +{ + "name":"easyui", + "email":"easyui@gmail.com", + "subject":"Subject Title", + "message":"Message Content", + "language":"de", + "accept":"true" +} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/load.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/load.html new file mode 100755 index 000000000..c699b6ece --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/load.html @@ -0,0 +1,62 @@ + + + + + Load Form Data - jQuery EasyUI Demo + + + + + + + +

                                                        Load Form Data

                                                        +

                                                        Click the buttons below to load form data.

                                                        + +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + +
                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/validateonsubmit.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/validateonsubmit.html new file mode 100755 index 000000000..2c0c349fd --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/validateonsubmit.html @@ -0,0 +1,52 @@ + + + + + Validate Form on Submit - jQuery EasyUI Demo + + + + + + + +

                                                        Validate Form on Submit

                                                        +

                                                        The form does not perform validation before being submitted.

                                                        +
                                                        +
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        +
                                                        + Submit + Clear +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/_content.html new file mode 100755 index 000000000..76f2506a6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

                                                        jQuery EasyUI framework help you build your web page easily.

                                                        +
                                                          +
                                                        • easyui is a collection of user-interface plugin based on jQuery.
                                                        • +
                                                        • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                        • +
                                                        • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                        • +
                                                        • complete framework for HTML5 web page.
                                                        • +
                                                        • easyui save your time and scales while developing your products.
                                                        • +
                                                        • easyui is very easy but powerful.
                                                        • +
                                                        + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/addremove.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/addremove.html new file mode 100755 index 000000000..ede288918 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/addremove.html @@ -0,0 +1,53 @@ + + + + + Add and Remove Layout - jQuery EasyUI Demo + + + + + + + +

                                                        Add and Remove Layout

                                                        +

                                                        Click the buttons below to add or remove region panel of layout.

                                                        +
                                                        + Select Region Panel: + + Add + Remove +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/autoheight.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/autoheight.html new file mode 100755 index 000000000..b9ccc7e3d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/autoheight.html @@ -0,0 +1,59 @@ + + + + + Auto Height for Layout - jQuery EasyUI Demo + + + + + + + +

                                                        Auto Height for Layout

                                                        +

                                                        This example shows how to auto adjust layout height after dynamically adding items.

                                                        + +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +

                                                        Panel Content.

                                                        +

                                                        Panel Content.

                                                        +

                                                        Panel Content.

                                                        +

                                                        Panel Content.

                                                        +

                                                        Panel Content.

                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/basic.html new file mode 100755 index 000000000..f428724fe --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/basic.html @@ -0,0 +1,39 @@ + + + + + Basic Layout - jQuery EasyUI Demo + + + + + + + +

                                                        Basic Layout

                                                        +

                                                        The layout contains north,south,west,east and center regions.

                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + + + + + + + + + + + +
                                                        Item IDProduct IDList PriceUnit CostAttributeStatus
                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/collapsetitle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/collapsetitle.html new file mode 100755 index 000000000..0d103e65f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/collapsetitle.html @@ -0,0 +1,39 @@ + + + + + Collapse Title in Layout - jQuery EasyUI Demo + + + + + + + +

                                                        Collapse Title in Layout

                                                        +

                                                        The title bar will display while collapse a region panel.

                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + + + + + + + + + + + +
                                                        Item IDProduct IDList PriceUnit CostAttributeStatus
                                                        +
                                                        +
                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/complex.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/complex.html new file mode 100755 index 000000000..9d1ab66a0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/complex.html @@ -0,0 +1,57 @@ + + + + + Complex Layout - jQuery EasyUI Demo + + + + + + + +

                                                        Complex Layout

                                                        +

                                                        This sample shows how to create a complex layout.

                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + content1 +
                                                          +
                                                          + content2 +
                                                          +
                                                          + content3 +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + + + + + + + + + + +
                                                          Item IDProduct IDList PriceUnit CostAttributeStatus
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/customcollapsetitle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/customcollapsetitle.html new file mode 100755 index 000000000..945b6afaa --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/customcollapsetitle.html @@ -0,0 +1,51 @@ + + + + + Custom Collapse Title in Layout - jQuery EasyUI Demo + + + + + + + +

                                                          Custom Collapse Title in Layout

                                                          +

                                                          Any components can display on the title bar of a collapsed panel.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + + + + + + + + + + +
                                                          Item IDProduct IDList PriceUnit CostAttributeStatus
                                                          +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/datagrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/datagrid_data1.json new file mode 100755 index 000000000..63d647358 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/datagrid_data1.json @@ -0,0 +1,12 @@ +{"total":28,"rows":[ + {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, + {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, + {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, + {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, + {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, + {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, + {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} +]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/fluid.html new file mode 100755 index 000000000..8ddd50fc4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/fluid.html @@ -0,0 +1,24 @@ + + + + + Fluid Layout - jQuery EasyUI Demo + + + + + + + +

                                                          Fluid Layout

                                                          +

                                                          Percentage width of region panel in a layout.

                                                          +
                                                          +
                                                          +
                                                          +

                                                          width: 30%

                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/full.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/full.html new file mode 100755 index 000000000..13eb94ade --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/full.html @@ -0,0 +1,19 @@ + + + + + Full Layout - jQuery EasyUI Demo + + + + + + + +
                                                          north region
                                                          +
                                                          west content
                                                          +
                                                          east region
                                                          +
                                                          south region
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nestedlayout.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nestedlayout.html new file mode 100755 index 000000000..b0e1b2c18 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nestedlayout.html @@ -0,0 +1,31 @@ + + + + + Nested Layout - jQuery EasyUI Demo + + + + + + + +

                                                          Nested Layout

                                                          +

                                                          The layout region panel contains another layout or other components.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nocollapsible.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nocollapsible.html new file mode 100755 index 000000000..5854b2d0b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nocollapsible.html @@ -0,0 +1,34 @@ + + + + + No collapsible button in Layout - jQuery EasyUI Demo + + + + + + + +

                                                          No collapsible button in Layout

                                                          +

                                                          The layout region panel has no collapsible button.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/propertygrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/propertygrid_data1.json new file mode 100755 index 000000000..a458d83fc --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/propertygrid_data1.json @@ -0,0 +1,20 @@ +{"total":7,"rows":[ + {"name":"Name","value":"Bill Smith","group":"ID Settings","editor":"text"}, + {"name":"Address","value":"","group":"ID Settings","editor":"text"}, + {"name":"Age","value":"40","group":"ID Settings","editor":"numberbox"}, + {"name":"Birthday","value":"01/02/2012","group":"ID Settings","editor":"datebox"}, + {"name":"SSN","value":"123-456-7890","group":"ID Settings","editor":"text"}, + {"name":"Email","value":"bill@gmail.com","group":"Marketing Settings","editor":{ + "type":"validatebox", + "options":{ + "validType":"email" + } + }}, + {"name":"FrequentBuyer","value":"false","group":"Marketing Settings","editor":{ + "type":"checkbox", + "options":{ + "on":true, + "off":false + } + }} +]} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/tree_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/tree_data1.json new file mode 100755 index 000000000..e0c619226 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/tree_data1.json @@ -0,0 +1,49 @@ +[{ + "id":1, + "text":"My Documents", + "children":[{ + "id":11, + "text":"Photos", + "state":"closed", + "children":[{ + "id":111, + "text":"Friend" + },{ + "id":112, + "text":"Wife" + },{ + "id":113, + "text":"Company" + }] + },{ + "id":12, + "text":"Program Files", + "children":[{ + "id":121, + "text":"Intel" + },{ + "id":122, + "text":"Java", + "attributes":{ + "p1":"Custom Attribute1", + "p2":"Custom Attribute2" + } + },{ + "id":123, + "text":"Microsoft Office" + },{ + "id":124, + "text":"Games", + "checked":true + }] + },{ + "id":13, + "text":"index.html" + },{ + "id":14, + "text":"about.html" + },{ + "id":15, + "text":"welcome.html" + }] +}] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/basic.html new file mode 100755 index 000000000..d46c47f63 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/basic.html @@ -0,0 +1,33 @@ + + + + + Basic LinkButton - jQuery EasyUI Demo + + + + + + + +

                                                          Basic LinkButton

                                                          +

                                                          Buttons can be created from <a> or <button> elements.

                                                          +
                                                          +

                                                          Basic Buttons

                                                          +
                                                          + Add + Remove + Save + Cut + Text Button +
                                                          +

                                                          Fixed Width Buttons

                                                          +
                                                          + Search + Print + Reload + Help +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/fluid.html new file mode 100755 index 000000000..cb033e774 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/fluid.html @@ -0,0 +1,33 @@ + + + + + Fluid LinkButton - jQuery EasyUI Demo + + + + + + + +

                                                          Fluid LinkButton

                                                          +

                                                          This example shows how to set the width of LinkButton to a percentage of its parent container.

                                                          +
                                                          +

                                                          width: 15%

                                                          +
                                                          + Add + Remove + Save + Cut + Text Button +
                                                          +

                                                          width: 20%

                                                          +
                                                          + Search + Print + Reload + Help +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/group.html new file mode 100755 index 000000000..4c1293d9b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/group.html @@ -0,0 +1,33 @@ + + + + + Button Group - jQuery EasyUI Demo + + + + + + + +

                                                          Button Group

                                                          +

                                                          In a button group only one button can be selected.

                                                          +
                                                          + +
                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/iconalign.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/iconalign.html new file mode 100755 index 000000000..21835f089 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/iconalign.html @@ -0,0 +1,32 @@ + + + + + Icon Align on LinkButton - jQuery EasyUI Demo + + + + + + + +

                                                          Icon Align on LinkButton

                                                          +

                                                          Change the icon align to place icon on left, right, top or bottom of button.

                                                          +
                                                          +
                                                          + Select Icon Align: + +
                                                          +
                                                          + Add + Remove + Save + Cut +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/plain.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/plain.html new file mode 100755 index 000000000..71c89cd65 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/plain.html @@ -0,0 +1,28 @@ + + + + + Plain LinkButton - jQuery EasyUI Demo + + + + + + + +

                                                          Plain LinkButton

                                                          +

                                                          The buttons with plain style have transparent background.

                                                          +
                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/size.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/size.html new file mode 100755 index 000000000..3e121bb4c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/size.html @@ -0,0 +1,34 @@ + + + + + LinkButton Size - jQuery EasyUI Demo + + + + + + + +

                                                          LinkButton Size

                                                          +

                                                          This sample shows how to display small buttons and large buttons.

                                                          +
                                                          +

                                                          Small Buttons

                                                          +
                                                          + Add + Remove + Save + Cut + Text Button +
                                                          +

                                                          Large Buttons

                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/style.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/style.html new file mode 100755 index 000000000..fe61dd927 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/style.html @@ -0,0 +1,31 @@ + + + + + Style LinkButton - jQuery EasyUI Demo + + + + + + + +

                                                          Style LinkButton

                                                          +

                                                          This example shows how to style a linkbutton.

                                                          +
                                                          + + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/toggle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/toggle.html new file mode 100755 index 000000000..352001a3e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/toggle.html @@ -0,0 +1,25 @@ + + + + + Toggle Button - jQuery EasyUI Demo + + + + + + + +

                                                          Toggle Button

                                                          +

                                                          Click the button below to switch its selected state.

                                                          +
                                                          +
                                                          + Add + Remove + Save + Cut + Text Button +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/maskedbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/maskedbox/basic.html new file mode 100755 index 000000000..780f987af --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/maskedbox/basic.html @@ -0,0 +1,30 @@ + + + + + Basic MaskedBox - jQuery EasyUI Demo + + + + + + + +

                                                          Basic MaskedBox

                                                          +

                                                          The maskedbox enforces its structure as the user types.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/basic.html new file mode 100755 index 000000000..c1bf0d35e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/basic.html @@ -0,0 +1,68 @@ + + + + + Basic Menu - jQuery EasyUI Demo + + + + + + + +

                                                          Basic Menu

                                                          +

                                                          Right click on page to display menu.

                                                          +
                                                          + +
                                                          +
                                                          New
                                                          +
                                                          + Open +
                                                          +
                                                          Word
                                                          +
                                                          Excel
                                                          +
                                                          PowerPoint
                                                          +
                                                          + M1 +
                                                          +
                                                          sub1
                                                          +
                                                          sub2
                                                          +
                                                          + Sub +
                                                          +
                                                          sub21
                                                          +
                                                          sub22
                                                          +
                                                          sub23
                                                          +
                                                          +
                                                          +
                                                          sub3
                                                          +
                                                          +
                                                          +
                                                          + Window Demos +
                                                          +
                                                          Window
                                                          +
                                                          Dialog
                                                          + +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          Save
                                                          +
                                                          Print
                                                          + +
                                                          Exit
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/customitem.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/customitem.html new file mode 100755 index 000000000..43b35e999 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/customitem.html @@ -0,0 +1,50 @@ + + + + + Custom Menu Item - jQuery EasyUI Demo + + + + + + + +

                                                          Custom Menu Item

                                                          +

                                                          Right click on page to display menu, move to the 'Open' item to display its custom sub content.

                                                          +
                                                          +
                                                          +
                                                          New
                                                          +
                                                          + Open + +
                                                          +
                                                          Save
                                                          +
                                                          Print
                                                          + +
                                                          Exit
                                                          +
                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/events.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/events.html new file mode 100755 index 000000000..c26b060d5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/events.html @@ -0,0 +1,40 @@ + + + + + Menu Events - jQuery EasyUI Demo + + + + + + + +

                                                          Menu Events

                                                          +

                                                          Right click on page to display menu and click an item.

                                                          +
                                                          +
                                                          +
                                                          New
                                                          +
                                                          Save
                                                          +
                                                          Print
                                                          + +
                                                          Exit
                                                          +
                                                          +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/inline.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/inline.html new file mode 100755 index 000000000..e23e3ae75 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/inline.html @@ -0,0 +1,59 @@ + + + + + Inline Menu - jQuery EasyUI Demo + + + + + + + +

                                                          Inline Menu

                                                          +

                                                          The inline menu stays inside its parent container.

                                                          +
                                                          + +
                                                          +
                                                          +
                                                          New
                                                          +
                                                          + Open +
                                                          +
                                                          Word
                                                          +
                                                          Excel
                                                          +
                                                          PowerPoint
                                                          +
                                                          + M1 +
                                                          +
                                                          sub1
                                                          +
                                                          sub2
                                                          +
                                                          + Sub +
                                                          +
                                                          sub21
                                                          +
                                                          sub22
                                                          +
                                                          sub23
                                                          +
                                                          +
                                                          +
                                                          sub3
                                                          +
                                                          +
                                                          +
                                                          + Window Demos +
                                                          +
                                                          Window
                                                          +
                                                          Dialog
                                                          + +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          Save
                                                          +
                                                          Print
                                                          + +
                                                          Exit
                                                          +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/nav.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/nav.html new file mode 100755 index 000000000..bc419df1c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/nav.html @@ -0,0 +1,146 @@ + + + + + Keyboard Navigation in Menu - jQuery EasyUI Demo + + + + + + + +

                                                          Keyboard Navigation in Menu

                                                          +

                                                          Press Alt+W to focus the menu. Once the menu get focus, you will be able to navigate menu using keyboard keys.

                                                          +
                                                          + +
                                                          +
                                                          +
                                                          New
                                                          +
                                                          + Open +
                                                          +
                                                          Word
                                                          +
                                                          Excel
                                                          +
                                                          PowerPoint
                                                          +
                                                          + M1 +
                                                          +
                                                          sub1
                                                          +
                                                          sub2
                                                          +
                                                          + Sub +
                                                          +
                                                          sub21
                                                          +
                                                          sub22
                                                          +
                                                          sub23
                                                          +
                                                          +
                                                          +
                                                          sub3
                                                          +
                                                          +
                                                          +
                                                          + Window Demos +
                                                          +
                                                          Window
                                                          +
                                                          Dialog
                                                          +
                                                          EasyUI
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          Save
                                                          +
                                                          Print
                                                          + +
                                                          Exit
                                                          +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/actions.html new file mode 100755 index 000000000..5d447fe98 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/actions.html @@ -0,0 +1,58 @@ + + + + + MenuButton Actions - jQuery EasyUI Demo + + + + + + + +

                                                          MenuButton Actions

                                                          +

                                                          Click the buttons below to perform actions.

                                                          + +
                                                          + Home + Edit + Help + About +
                                                          +
                                                          +
                                                          Undo
                                                          +
                                                          Redo
                                                          + +
                                                          Cut
                                                          +
                                                          Copy
                                                          +
                                                          Paste
                                                          + +
                                                          + Toolbar +
                                                          +
                                                          Address
                                                          +
                                                          Link
                                                          +
                                                          Navigation Toolbar
                                                          +
                                                          Bookmark Toolbar
                                                          + +
                                                          New Toolbar...
                                                          +
                                                          +
                                                          +
                                                          Delete
                                                          +
                                                          Select All
                                                          +
                                                          +
                                                          +
                                                          Help
                                                          +
                                                          Update
                                                          +
                                                          About
                                                          +
                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/alignment.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/alignment.html new file mode 100755 index 000000000..f34f89a03 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/alignment.html @@ -0,0 +1,69 @@ + + + + + Menu Alignment on MenuButton - jQuery EasyUI Demo + + + + + + + +

                                                          Menu Alignment on MenuButton

                                                          +

                                                          This example shows how to change the alignment of the top level menu.

                                                          +
                                                          + Change Alignment: + +
                                                          +
                                                          + Home + Edit + Help + About + +
                                                          +
                                                          +
                                                          Undo
                                                          +
                                                          Redo
                                                          + +
                                                          Cut
                                                          +
                                                          Copy
                                                          +
                                                          Paste
                                                          + +
                                                          + Toolbar +
                                                          +
                                                          Address
                                                          +
                                                          Link
                                                          +
                                                          Navigation Toolbar
                                                          +
                                                          Bookmark Toolbar
                                                          + +
                                                          New Toolbar...
                                                          +
                                                          +
                                                          +
                                                          Delete
                                                          +
                                                          Select All
                                                          +
                                                          +
                                                          +
                                                          Help
                                                          +
                                                          Update
                                                          +
                                                          About
                                                          +
                                                          +
                                                          +
                                                          History
                                                          +
                                                          Faq
                                                          +
                                                          Our Team
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/basic.html new file mode 100755 index 000000000..932309b76 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/basic.html @@ -0,0 +1,54 @@ + + + + + Basic MenuButton - jQuery EasyUI Demo + + + + + + + +

                                                          Basic MenuButton

                                                          +

                                                          Move mouse over the button to drop down menu.

                                                          +
                                                          +
                                                          + Home + Edit + Help + About +
                                                          +
                                                          +
                                                          Undo
                                                          +
                                                          Redo
                                                          + +
                                                          Cut
                                                          +
                                                          Copy
                                                          +
                                                          Paste
                                                          + +
                                                          + Toolbar +
                                                          +
                                                          Address
                                                          +
                                                          Link
                                                          +
                                                          Navigation Toolbar
                                                          +
                                                          Bookmark Toolbar
                                                          + +
                                                          New Toolbar...
                                                          +
                                                          +
                                                          +
                                                          Delete
                                                          +
                                                          Select All
                                                          +
                                                          +
                                                          +
                                                          Help
                                                          +
                                                          Update
                                                          +
                                                          About
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/nav.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/nav.html new file mode 100755 index 000000000..7c34b3d47 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/nav.html @@ -0,0 +1,166 @@ + + + + + Keyboard Navigation in MenuButton - jQuery EasyUI Demo + + + + + + + +

                                                          Keyboard Navigation in MenuButton

                                                          +

                                                          Press Alt+W to focus the menubutton. Once the menubutton get focus, you will be able to navigate menubutton using keyboard keys.

                                                          +
                                                          +
                                                          + Home + Edit + Help + About +
                                                          +
                                                          +
                                                          Undo
                                                          +
                                                          Redo
                                                          + +
                                                          Cut
                                                          +
                                                          Copy
                                                          +
                                                          Paste
                                                          + +
                                                          + Toolbar +
                                                          +
                                                          Address
                                                          +
                                                          Link
                                                          +
                                                          Navigation Toolbar
                                                          +
                                                          Bookmark Toolbar
                                                          + +
                                                          New Toolbar...
                                                          +
                                                          +
                                                          +
                                                          Delete
                                                          +
                                                          Select All
                                                          +
                                                          +
                                                          +
                                                          Help
                                                          +
                                                          Update
                                                          +
                                                          About
                                                          +
                                                          + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/alert.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/alert.html new file mode 100755 index 000000000..a69c16603 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/alert.html @@ -0,0 +1,40 @@ + + + + + Alert Messager - jQuery EasyUI Demo + + + + + + + +

                                                          Alert Messager

                                                          +

                                                          Click on each button to display different alert message box.

                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/basic.html new file mode 100755 index 000000000..65026efc4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/basic.html @@ -0,0 +1,56 @@ + + + + + Basic Messager - jQuery EasyUI Demo + + + + + + + +

                                                          Basic Messager

                                                          +

                                                          Click on each button to see a distinct message box.

                                                          +
                                                          + Show + Slide + Fade + Progress +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/interactive.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/interactive.html new file mode 100755 index 000000000..e71224312 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/interactive.html @@ -0,0 +1,36 @@ + + + + + Interactive Messager - jQuery EasyUI Demo + + + + + + + +

                                                          Interactive Messager

                                                          +

                                                          Click on each button to display interactive message box.

                                                          +
                                                          + Confirm + Prompt +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/position.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/position.html new file mode 100755 index 000000000..6a6273e96 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/position.html @@ -0,0 +1,140 @@ + + + + + Message Box Position - jQuery EasyUI Demo + + + + + + + +

                                                          Message Box Position

                                                          +

                                                          Click the buttons below to display message box on different position.

                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/basic.html new file mode 100755 index 000000000..3b1a68416 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/basic.html @@ -0,0 +1,29 @@ + + + + + Basic NumberBox - jQuery EasyUI Demo + + + + + + + +

                                                          Basic NumberBox

                                                          +

                                                          The NumberBox can only accept inputing numbers.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/fluid.html new file mode 100755 index 000000000..4b5981e97 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/fluid.html @@ -0,0 +1,26 @@ + + + + + Fluid NumberBox - jQuery EasyUI Demo + + + + + + + +

                                                          Fluid NumberBox

                                                          +

                                                          This example shows how to set the width of NumberBox to a percentage of its parent container.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/format.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/format.html new file mode 100755 index 000000000..8fcb82239 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/format.html @@ -0,0 +1,34 @@ + + + + + Format NumberBox - jQuery EasyUI Demo + + + + + + + +

                                                          Format NumberBox

                                                          +

                                                          Number formatting is the ability to control how a number is displayed.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/range.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/range.html new file mode 100755 index 000000000..fee11e961 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/range.html @@ -0,0 +1,28 @@ + + + + + Number Range - jQuery EasyUI Demo + + + + + + + +

                                                          Number Range

                                                          +

                                                          The value is constrained to a specified range.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/align.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/align.html new file mode 100755 index 000000000..f36a681f3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/align.html @@ -0,0 +1,31 @@ + + + + + Number Spin Alignment - jQuery EasyUI Demo + + + + + + + +

                                                          Number Spin Alignment

                                                          +

                                                          This example shows how to set different spin alignments on numberspinner.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/basic.html new file mode 100755 index 000000000..b04560d7f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/basic.html @@ -0,0 +1,27 @@ + + + + + Basic NumberSpinner - jQuery EasyUI Demo + + + + + + + +

                                                          Basic NumberSpinner

                                                          +

                                                          Click spinner button to change value.

                                                          +
                                                          +
                                                          + +
                                                          + Value: +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/fluid.html new file mode 100755 index 000000000..69c94f5c9 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid NumberSpinner - jQuery EasyUI Demo + + + + + + + +

                                                          Fluid NumberSpinner

                                                          +

                                                          This example shows how to set the width of NumberSpinner to a percentage of its parent container.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/increment.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/increment.html new file mode 100755 index 000000000..76eab5845 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/increment.html @@ -0,0 +1,28 @@ + + + + + Increment Number - jQuery EasyUI Demo + + + + + + + +

                                                          Increment Number

                                                          +

                                                          The sample shows how to set the increment step.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/range.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/range.html new file mode 100755 index 000000000..a0a037278 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/range.html @@ -0,0 +1,25 @@ + + + + + Number Range - jQuery EasyUI Demo + + + + + + + +

                                                          Number Range

                                                          +

                                                          The value is constrained to a range between 10 and 100.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/attaching.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/attaching.html new file mode 100755 index 000000000..0e56bb35e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/attaching.html @@ -0,0 +1,32 @@ + + + + + Attaching Other Components - jQuery EasyUI Demo + + + + + + + +

                                                          Attaching Other Components

                                                          +

                                                          Any other components can be attached to page bar.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + + + + +
                                                          + + + +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/basic.html new file mode 100755 index 000000000..bcdba63df --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/basic.html @@ -0,0 +1,20 @@ + + + + + Basic Pagination - jQuery EasyUI Demo + + + + + + + +

                                                          Basic Pagination

                                                          +

                                                          The user can change page number and page size on page bar.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/custombuttons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/custombuttons.html new file mode 100755 index 000000000..113e92116 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/custombuttons.html @@ -0,0 +1,38 @@ + + + + + Custom Pagination Buttons - jQuery EasyUI Demo + + + + + + + +

                                                          Custom Pagination Buttons

                                                          +

                                                          The customized buttons can be appended to page bar.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/layout.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/layout.html new file mode 100755 index 000000000..1992f4ecb --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/layout.html @@ -0,0 +1,62 @@ + + + + + Pagination Layout - jQuery EasyUI Demo + + + + + + + +

                                                          Pagination Layout

                                                          +

                                                          The pagination layout supports various types of pages which you can choose.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/links.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/links.html new file mode 100755 index 000000000..dafab34b7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/links.html @@ -0,0 +1,23 @@ + + + + + Pagination Links - jQuery EasyUI Demo + + + + + + + +

                                                          Pagination Links

                                                          +

                                                          The example shows how to customize numbered pagination links.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/simple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/simple.html new file mode 100755 index 000000000..23a0eee08 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/simple.html @@ -0,0 +1,25 @@ + + + + + Simplify Pagination - jQuery EasyUI Demo + + + + + + + +

                                                          Simplify Pagination

                                                          +

                                                          The sample shows how to simplify pagination.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

                                                          Here is the content loaded via AJAX.

                                                          +
                                                            +
                                                          • easyui is a collection of user-interface plugin based on jQuery.
                                                          • +
                                                          • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                          • +
                                                          • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                          • +
                                                          • complete framework for HTML5 web page.
                                                          • +
                                                          • easyui save your time and scales while developing your products.
                                                          • +
                                                          • easyui is very easy but powerful.
                                                          • +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/basic.html new file mode 100755 index 000000000..ec0e535d9 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/basic.html @@ -0,0 +1,31 @@ + + + + + Basic Panel - jQuery EasyUI Demo + + + + + + + +

                                                          Basic Panel

                                                          +

                                                          The panel is a container for other components or elements.

                                                          +
                                                          + Open + Close +
                                                          +
                                                          +

                                                          jQuery EasyUI framework helps you build your web pages easily.

                                                          +
                                                            +
                                                          • easyui is a collection of user-interface plugin based on jQuery.
                                                          • +
                                                          • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                          • +
                                                          • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                          • +
                                                          • complete framework for HTML5 web page.
                                                          • +
                                                          • easyui save your time and scales while developing your products.
                                                          • +
                                                          • easyui is very easy but powerful.
                                                          • +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/customtools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/customtools.html new file mode 100755 index 000000000..670001e9b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/customtools.html @@ -0,0 +1,35 @@ + + + + + Custom Panel Tools - jQuery EasyUI Demo + + + + + + + +

                                                          Custom Panel Tools

                                                          +

                                                          Click the right top buttons to perform actions with panel.

                                                          +
                                                          +
                                                          +

                                                          jQuery EasyUI framework helps you build your web pages easily.

                                                          +
                                                            +
                                                          • easyui is a collection of user-interface plugin based on jQuery.
                                                          • +
                                                          • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                          • +
                                                          • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                          • +
                                                          • complete framework for HTML5 web page.
                                                          • +
                                                          • easyui save your time and scales while developing your products.
                                                          • +
                                                          • easyui is very easy but powerful.
                                                          • +
                                                          +
                                                          +
                                                          + + + + +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/fluid.html new file mode 100755 index 000000000..72510f23d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/fluid.html @@ -0,0 +1,21 @@ + + + + + Fluid Panel - jQuery EasyUI Demo + + + + + + + +

                                                          Fluid Panel

                                                          +

                                                          This example shows how to set the width of Panel to a percentage of its parent container.

                                                          +
                                                          +
                                                          +
                                                          +

                                                          The panel has a width of 100%.

                                                          +

                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/footer.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/footer.html new file mode 100755 index 000000000..31e6385c2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/footer.html @@ -0,0 +1,22 @@ + + + + + Panel Footer - jQuery EasyUI Demo + + + + + + + +

                                                          Panel Footer

                                                          +

                                                          The panel footer is displayed at the bottom of the panel and can consist of any other components.

                                                          +
                                                          +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/halign.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/halign.html new file mode 100755 index 000000000..77ae7b499 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/halign.html @@ -0,0 +1,26 @@ + + + + + Panel Header Alignment - jQuery EasyUI Demo + + + + + + + +

                                                          Panel Header Alignment

                                                          +

                                                          The panel header can be aligned horizontally or vertically.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/loadcontent.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/loadcontent.html new file mode 100755 index 000000000..6db638d39 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/loadcontent.html @@ -0,0 +1,27 @@ + + + + + Load Panel Content - jQuery EasyUI Demo + + + + + + + +

                                                          Load Panel Content

                                                          +

                                                          Click the refresh button on top right of panel to load content.

                                                          +
                                                          +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/nestedpanel.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/nestedpanel.html new file mode 100755 index 000000000..28f51703d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/nestedpanel.html @@ -0,0 +1,30 @@ + + + + + Nested Panel - jQuery EasyUI Demo + + + + + + + +

                                                          Nested Panel

                                                          +

                                                          The panel can be placed inside containers and can contain other components.

                                                          +
                                                          +
                                                          +
                                                          +
                                                          + Left Content +
                                                          +
                                                          + Right Content +
                                                          +
                                                          + Center Content +
                                                          +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/paneltools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/paneltools.html new file mode 100755 index 000000000..47efc11f7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/paneltools.html @@ -0,0 +1,37 @@ + + + + + Panel Tools - jQuery EasyUI Demo + + + + + + + +

                                                          Panel Tools

                                                          +

                                                          Click the right top buttons to perform actions with panel.

                                                          + +
                                                          +
                                                          +

                                                          jQuery EasyUI framework helps you build your web pages easily.

                                                          +
                                                            +
                                                          • easyui is a collection of user-interface plugin based on jQuery.
                                                          • +
                                                          • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                          • +
                                                          • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                          • +
                                                          • complete framework for HTML5 web page.
                                                          • +
                                                          • easyui save your time and scales while developing your products.
                                                          • +
                                                          • easyui is very easy but powerful.
                                                          • +
                                                          +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/basic.html new file mode 100644 index 000000000..f725bc087 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/basic.html @@ -0,0 +1,25 @@ + + + + + Basic PasswordBox - jQuery EasyUI Demo + + + + + + + +

                                                          Basic PasswordBox

                                                          +

                                                          The passwordbox allows a user to enter passwords.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/flash.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/flash.html new file mode 100644 index 000000000..391a09cda --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/flash.html @@ -0,0 +1,48 @@ + + + + + Flash PasswordBox Letters - jQuery EasyUI Demo + + + + + + + +

                                                          Flash PasswordBox Letters

                                                          +

                                                          This example shows how to flash the entered password letter by letter.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          +
                                                          + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/validatepassword.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/validatepassword.html new file mode 100644 index 000000000..630dbc7a1 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/validatepassword.html @@ -0,0 +1,40 @@ + + + + + Validate Password - jQuery EasyUI Demo + + + + + + + +

                                                          Validate Password

                                                          +

                                                          This example shows how to validate whether a user enters the same password.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/basic.html new file mode 100755 index 000000000..966d5560f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/basic.html @@ -0,0 +1,30 @@ + + + + + Basic ProgressBar - jQuery EasyUI Demo + + + + + + + +

                                                          Basic ProgressBar

                                                          +

                                                          Click the button below to show progress information.

                                                          +
                                                          + Start +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/fluid.html new file mode 100755 index 000000000..613e180f1 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/fluid.html @@ -0,0 +1,21 @@ + + + + + Fluid ProgressBar - jQuery EasyUI Demo + + + + + + + +

                                                          Fluid ProgressBar

                                                          +

                                                          This example shows how to set the width of ProgressBar to a percentage of its parent container.

                                                          +
                                                          +

                                                          width: 50%

                                                          +
                                                          +

                                                          width: 30%

                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/basic.html new file mode 100755 index 000000000..8f7743c4e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/basic.html @@ -0,0 +1,61 @@ + + + + + Basic PropertyGrid - jQuery EasyUI Demo + + + + + + + +

                                                          Basic PropertyGrid

                                                          +

                                                          Click on row to change each property value.

                                                          + + +
                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/customcolumns.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/customcolumns.html new file mode 100755 index 000000000..0a683ef3e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/customcolumns.html @@ -0,0 +1,31 @@ + + + + + Customize Columns of PropertyGrid - jQuery EasyUI Demo + + + + + + + +

                                                          Customize Columns of PropertyGrid

                                                          +

                                                          The columns of PropertyGrid can be changed.

                                                          +
                                                          + +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/groupformat.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/groupformat.html new file mode 100755 index 000000000..d4eb883ce --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/groupformat.html @@ -0,0 +1,30 @@ + + + + + Group Format - jQuery EasyUI Demo + + + + + + + +

                                                          Group Format

                                                          +

                                                          The user can change the group information.

                                                          +
                                                          + +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json new file mode 100755 index 000000000..a458d83fc --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json @@ -0,0 +1,20 @@ +{"total":7,"rows":[ + {"name":"Name","value":"Bill Smith","group":"ID Settings","editor":"text"}, + {"name":"Address","value":"","group":"ID Settings","editor":"text"}, + {"name":"Age","value":"40","group":"ID Settings","editor":"numberbox"}, + {"name":"Birthday","value":"01/02/2012","group":"ID Settings","editor":"datebox"}, + {"name":"SSN","value":"123-456-7890","group":"ID Settings","editor":"text"}, + {"name":"Email","value":"bill@gmail.com","group":"Marketing Settings","editor":{ + "type":"validatebox", + "options":{ + "validType":"email" + } + }}, + {"name":"FrequentBuyer","value":"false","group":"Marketing Settings","editor":{ + "type":"checkbox", + "options":{ + "on":true, + "off":false + } + }} +]} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/resizable/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/resizable/basic.html new file mode 100755 index 000000000..7b9e74773 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/resizable/basic.html @@ -0,0 +1,24 @@ + + + + + Basic Resizable - jQuery EasyUI Demo + + + + + + + +

                                                          Basic Resizable

                                                          +

                                                          Click on the edge of box and move the edge to resize the box.

                                                          +
                                                          +
                                                          +
                                                          Resize Me
                                                          +
                                                          +
                                                          +
                                                          Title
                                                          +
                                                          Drag and Resize Me
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/basic.html new file mode 100755 index 000000000..a152113fa --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/basic.html @@ -0,0 +1,25 @@ + + + + + Basic SearchBox - jQuery EasyUI Demo + + + + + + + +

                                                          Basic SearchBox

                                                          +

                                                          Click search button or press enter key in input box to do searching.

                                                          +
                                                          +
                                                          + +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/category.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/category.html new file mode 100755 index 000000000..ca3029f04 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/category.html @@ -0,0 +1,30 @@ + + + + + Search Category - jQuery EasyUI Demo + + + + + + + +

                                                          Search Category

                                                          +

                                                          Select a category and click search button or press enter key in input box to do searching.

                                                          +
                                                          +
                                                          + +
                                                          +
                                                          +
                                                          All News
                                                          +
                                                          Sports News
                                                          +
                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/fluid.html new file mode 100755 index 000000000..c48096f1c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/fluid.html @@ -0,0 +1,29 @@ + + + + + Fluid SearchBox - jQuery EasyUI Demo + + + + + + + +

                                                          Fluid SearchBox

                                                          +

                                                          This example shows how to set the width of SearchBox to a percentage of its parent container.

                                                          +
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          +
                                                          +
                                                          All News
                                                          +
                                                          Sports News
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/basic.html new file mode 100755 index 000000000..5096d28b0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/basic.html @@ -0,0 +1,58 @@ + + + + + Basic SideMenu - jQuery EasyUI Demo + + + + + + + + +

                                                          Basic SideMenu

                                                          +

                                                          Collapse the side menu to display the main icon.

                                                          +
                                                          + Toggle +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.css b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.css new file mode 100644 index 000000000..6ae84e1e8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.css @@ -0,0 +1,63 @@ +@import 'http://netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'; + +.sidemenu .accordion .panel-title{ + color: #b8c7ce; +} +.sidemenu .accordion .accordion-header{ + background: #222d32; + color: #b8c7ce; +} +.sidemenu .accordion .accordion-body{ + background: #2c3b41; + color: #8aa4af; +} +.sidemenu .accordion .accordion-header-selected{ + background: #1e282c; +} +.sidemenu .accordion .accordion-collapse{ + background: transparent; +} +.sidemenu .tree-node-hover{ + background: #2c3b41; + color: #fff; +} +.sidemenu .tree-node-selected{ + background: #2c3b41; + color: #fff; +} +.sidemenu .accordion-header .panel-icon{ + font-size: 16px; +} +.sidemenu .accordion-header .panel-tool{ + display: none; +} +.sidemenu .accordion-header::after, +.sidemenu .tree-node-nonleaf::after{ + display: inline-block; + vertical-align: top; + border-style: solid; + transform:rotate(45deg); + width: 4px; + height: 4px; + content: ''; + position: absolute; + right: 10px; + top: 50%; + margin-top: -3px; + border-width: 0 1px 1px 0; +} +.sidemenu .accordion-header-selected::after{ + transform:rotate(-135deg); +} +.sidemenu .tree-node-nonleaf::after{ + transform:rotate(-135deg); +} +.sidemenu .tree-node-nonleaf-collapsed::after{ + transform:rotate(45deg); +} +.sidemenu-collapsed .accordion-header::after{ + display: none; +} +.sidemenu-tooltip .accordion{ + border-color: #1e282c; +} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.html new file mode 100644 index 000000000..332e74f34 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.html @@ -0,0 +1,70 @@ + + + + + Basic SideMenu - jQuery EasyUI Demo + + + + + + + + + +

                                                          Basic SideMenu

                                                          +

                                                          Collapse the side menu to display the main icon.

                                                          +
                                                          + Toggle +
                                                          +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/basic.html new file mode 100755 index 000000000..a71f0e4c3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/basic.html @@ -0,0 +1,18 @@ + + + + + Basic Slider - jQuery EasyUI Demo + + + + + + + +

                                                          Basic Slider

                                                          +

                                                          Drag the slider to change value.

                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/fluid.html new file mode 100755 index 000000000..745927687 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/fluid.html @@ -0,0 +1,21 @@ + + + + + Fluid Slider - jQuery EasyUI Demo + + + + + + + +

                                                          Fluid Slider

                                                          +

                                                          This example shows how to set the width of Slider to a percentage of its parent container.

                                                          +
                                                          +

                                                          width: 50%

                                                          + +

                                                          width: 30%

                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/formattip.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/formattip.html new file mode 100755 index 000000000..6b5c39835 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/formattip.html @@ -0,0 +1,28 @@ + + + + + Format Tip Information - jQuery EasyUI Demo + + + + + + + +

                                                          Format Tip Information

                                                          +

                                                          This sample shows how to format tip information.

                                                          +
                                                          + +
                                                          jQuery EasyUI
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/nonlinear.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/nonlinear.html new file mode 100755 index 000000000..b07c61bd5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/nonlinear.html @@ -0,0 +1,58 @@ + + + + + Non Linear Slider - jQuery EasyUI Demo + + + + + + + +

                                                          Non Linear Slider

                                                          +

                                                          This example shows how to create a slider with a non-linear scale.

                                                          +
                                                          +
                                                          + +
                                                          +
                                                          +
                                                          +
                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/range.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/range.html new file mode 100755 index 000000000..c7e6cf533 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/range.html @@ -0,0 +1,23 @@ + + + + + Range Slider - jQuery EasyUI Demo + + + + + + + +

                                                          Range Slider

                                                          +

                                                          This sample shows how to define a range slider.

                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/rule.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/rule.html new file mode 100755 index 000000000..652b4e52b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/rule.html @@ -0,0 +1,21 @@ + + + + + Slider Rule - jQuery EasyUI Demo + + + + + + + +

                                                          Slider Rule

                                                          +

                                                          This sample shows how to define slider rule.

                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/vertical.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/vertical.html new file mode 100755 index 000000000..59d3b4994 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/vertical.html @@ -0,0 +1,25 @@ + + + + + Vertical Slider - jQuery EasyUI Demo + + + + + + + +

                                                          Vertical Slider

                                                          +

                                                          This sample shows how to create a vertical slider.

                                                          +
                                                          +
                                                          + +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/actions.html new file mode 100755 index 000000000..311048468 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/actions.html @@ -0,0 +1,64 @@ + + + + + SplitButton Actions - jQuery EasyUI Demo + + + + + + + +

                                                          SplitButton Actions

                                                          +

                                                          Click the buttons below to perform actions.

                                                          + +
                                                          + Home + Edit + Ok + Help +
                                                          +
                                                          +
                                                          Undo
                                                          +
                                                          Redo
                                                          + +
                                                          Cut
                                                          +
                                                          Copy
                                                          +
                                                          Paste
                                                          + +
                                                          + Toolbar +
                                                          +
                                                          Address
                                                          +
                                                          Link
                                                          +
                                                          Navigation Toolbar
                                                          +
                                                          Bookmark Toolbar
                                                          + +
                                                          New Toolbar...
                                                          +
                                                          +
                                                          +
                                                          Delete
                                                          +
                                                          Select All
                                                          +
                                                          +
                                                          +
                                                          Ok
                                                          +
                                                          Cancel
                                                          +
                                                          +
                                                          +
                                                          Help
                                                          +
                                                          Update
                                                          +
                                                          + About + +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/basic.html new file mode 100755 index 000000000..795d526e8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/basic.html @@ -0,0 +1,61 @@ + + + + + Basic SplitButton - jQuery EasyUI Demo + + + + + + + +

                                                          Basic SplitButton

                                                          +

                                                          Move mouse over the arrow area of button to drop down menu.

                                                          +
                                                          +
                                                          + Home + Edit + Ok + Help +
                                                          +
                                                          +
                                                          Undo
                                                          +
                                                          Redo
                                                          + +
                                                          Cut
                                                          +
                                                          Copy
                                                          +
                                                          Paste
                                                          + +
                                                          + Toolbar +
                                                          +
                                                          Address
                                                          +
                                                          Link
                                                          +
                                                          Navigation Toolbar
                                                          +
                                                          Bookmark Toolbar
                                                          + +
                                                          New Toolbar...
                                                          +
                                                          +
                                                          +
                                                          Delete
                                                          +
                                                          Select All
                                                          +
                                                          +
                                                          +
                                                          Ok
                                                          +
                                                          Cancel
                                                          +
                                                          +
                                                          +
                                                          Help
                                                          +
                                                          Update
                                                          +
                                                          + About + +
                                                          +
                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/action.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/action.html new file mode 100644 index 000000000..0a6e197d8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/action.html @@ -0,0 +1,24 @@ + + + + + SwitchButton Actions - jQuery EasyUI Demo + + + + + + + +

                                                          SwitchButton Actions

                                                          +

                                                          Click the buttons below to perform actions.

                                                          +
                                                          + +
                                                          + Disable + Enable +
                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/basic.html new file mode 100644 index 000000000..56a09b586 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/basic.html @@ -0,0 +1,32 @@ + + + + + Basic SwitchButton - jQuery EasyUI Demo + + + + + + + +

                                                          Basic SwitchButton

                                                          +

                                                          Click the switchbutton to change its state.

                                                          +
                                                          + + + + + + + + + + + + + + +
                                                          Receive mail:
                                                          Shared network:
                                                          Subscribed:
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

                                                          Here is the content loaded via AJAX.

                                                          +
                                                            +
                                                          • easyui is a collection of user-interface plugin based on jQuery.
                                                          • +
                                                          • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                          • +
                                                          • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                          • +
                                                          • complete framework for HTML5 web page.
                                                          • +
                                                          • easyui save your time and scales while developing your products.
                                                          • +
                                                          • easyui is very easy but powerful.
                                                          • +
                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/autoheight.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/autoheight.html new file mode 100755 index 000000000..8fd287ad6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/autoheight.html @@ -0,0 +1,36 @@ + + + + + Auto Height for Tabs - jQuery EasyUI Demo + + + + + + + +

                                                          Auto Height for Tabs

                                                          +

                                                          The tabs height is auto adjusted according to tab panel content.

                                                          +
                                                          +
                                                          +
                                                          +

                                                          jQuery EasyUI framework helps you build your web pages easily.

                                                          +
                                                            +
                                                          • easyui is a collection of user-interface plugin based on jQuery.
                                                          • +
                                                          • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                          • +
                                                          • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                          • +
                                                          • complete framework for HTML5 web page.
                                                          • +
                                                          • easyui save your time and scales while developing your products.
                                                          • +
                                                          • easyui is very easy but powerful.
                                                          • +
                                                          +
                                                          +
                                                          +
                                                            +
                                                            +
                                                            + This is the help content. +
                                                            +
                                                            + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/basic.html new file mode 100755 index 000000000..c5a7ce675 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/basic.html @@ -0,0 +1,36 @@ + + + + + Basic Tabs - jQuery EasyUI Demo + + + + + + + +

                                                            Basic Tabs

                                                            +

                                                            Click tab strip to swap tab panel content.

                                                            +
                                                            +
                                                            +
                                                            +

                                                            jQuery EasyUI framework helps you build your web pages easily.

                                                            +
                                                              +
                                                            • easyui is a collection of user-interface plugin based on jQuery.
                                                            • +
                                                            • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                            • +
                                                            • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                            • +
                                                            • complete framework for HTML5 web page.
                                                            • +
                                                            • easyui save your time and scales while developing your products.
                                                            • +
                                                            • easyui is very easy but powerful.
                                                            • +
                                                            +
                                                            +
                                                            +
                                                              +
                                                              +
                                                              + This is the help content. +
                                                              +
                                                              + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/dropdown.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/dropdown.html new file mode 100755 index 000000000..e13426c39 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/dropdown.html @@ -0,0 +1,55 @@ + + + + + Tabs with DropDown - jQuery EasyUI Demo + + + + + + + +

                                                              Tabs with DropDown

                                                              +

                                                              This sample shows how to add a dropdown menu over a tab strip.

                                                              +
                                                              +
                                                              +
                                                              +

                                                              jQuery EasyUI framework helps you build your web pages easily.

                                                              +
                                                                +
                                                              • easyui is a collection of user-interface plugin based on jQuery.
                                                              • +
                                                              • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                              • +
                                                              • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                              • +
                                                              • complete framework for HTML5 web page.
                                                              • +
                                                              • easyui save your time and scales while developing your products.
                                                              • +
                                                              • easyui is very easy but powerful.
                                                              • +
                                                              +
                                                              +
                                                              +
                                                                +
                                                                +
                                                                + This is the help content. +
                                                                +
                                                                +
                                                                +
                                                                Welcome
                                                                +
                                                                Help Contents
                                                                +
                                                                Search
                                                                +
                                                                Dynamic Help
                                                                +
                                                                + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fixedwidth.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fixedwidth.html new file mode 100755 index 000000000..18030664a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fixedwidth.html @@ -0,0 +1,37 @@ + + + + + Fixed Tab Width - jQuery EasyUI Demo + + + + + + + +

                                                                Fixed Tab Width

                                                                +

                                                                The tab strips have fixed width and height.

                                                                +
                                                                +
                                                                +
                                                                +

                                                                Home Content.

                                                                +
                                                                +
                                                                +

                                                                Maps Content.

                                                                +
                                                                +
                                                                +

                                                                Journal Content.

                                                                +
                                                                +
                                                                +

                                                                History Content.

                                                                +
                                                                +
                                                                +

                                                                References Content.

                                                                +
                                                                +
                                                                +

                                                                Contact Content.

                                                                +
                                                                +
                                                                + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fluid.html new file mode 100755 index 000000000..42cf7fc36 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fluid.html @@ -0,0 +1,24 @@ + + + + + Fluid Tabs - jQuery EasyUI Demo + + + + + + + +

                                                                Fluid Tabs

                                                                +

                                                                This example shows how to set the width of Tabs to a percentage of its parent container.

                                                                +
                                                                +
                                                                +
                                                                +

                                                                The tabs has a width of 100%.

                                                                +
                                                                +
                                                                +
                                                                +
                                                                + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/hover.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/hover.html new file mode 100755 index 000000000..04419c852 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/hover.html @@ -0,0 +1,46 @@ + + + + + Hover Tabs - jQuery EasyUI Demo + + + + + + + +

                                                                Hover Tabs

                                                                +

                                                                Move mouse over the tab strip to open the tab panel.

                                                                +
                                                                +
                                                                +
                                                                +

                                                                jQuery EasyUI framework helps you build your web pages easily.

                                                                +
                                                                  +
                                                                • easyui is a collection of user-interface plugin based on jQuery.
                                                                • +
                                                                • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                • +
                                                                • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                • +
                                                                • complete framework for HTML5 web page.
                                                                • +
                                                                • easyui save your time and scales while developing your products.
                                                                • +
                                                                • easyui is very easy but powerful.
                                                                • +
                                                                +
                                                                +
                                                                +
                                                                  +
                                                                  +
                                                                  + This is the help content. +
                                                                  +
                                                                  + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/modem.png b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/modem.png new file mode 100755 index 0000000000000000000000000000000000000000..be5a2eb2fc48a8f16681b591f4ef74888ee09c33 GIT binary patch literal 1633 zcmV-n2A=teP)DSXo(n z6%-WGq@<)6*xA{^2Ei8OFVPRn@pc;RG z0K(}2kU_v;uacIQE|igxVPIil0lOU8LJ$V2gBcFvgF+DKL$KN}U%tQ{3j&`%e`fgj z@gvL=d;kH2(*Zz33V;^3sH&=hEe8c1aykKFkQgk@fP4zVAcH}^2L(OIK_D>@4RRES ze)sMj*gUAC{s9CKRtErm69G(cJz`>Fj2}LHfCnwe5SVX(p#$bKGczNn7qEqVe0*Tb zKx$wP1gU%b_AT5|K=waih<*VGAQtps2Pz2H)YP1#tEdz1LA-G{v90jAo(|M-Y{Iec=5@nPoJ&=1Q2>IaFvsjn`>!l$t@@-2(}dD z0GK0?EkXud!iJNWd(GMH9%!pb!uh6=itz=n=!YbLZ{?6XRZ>k+%Q> zhy`Q`&;nIpmRY8(tSkWx7KUffo-s&DO2QK#$WmB3Ko0?!SPXU#m1Z4_<00M=8Jg|USYhq#|2XZmU!j~^!g0l-ZH#ay%!+e4s0^qV7 zCl zzk}l%xnx6*cces$;#;tKkUTJDgZV%`;9LP^gB$_!J;-ce!utdC{SlxvDE_~K)Byw# z3oyP-K}9Sx5VA6|Gca)cV_^9Y%36#J|Cs)QM1f48BN)Nn1tk_xApwc!e}BRC+4mpc z86F%z4whpB71y9L1E@wA=qY;#2Zjsh&of-Ue3{|QnKSo*QNADMdk_E!AQqr6xn4eh z#qi+MGlt6_&NBGR1u$ z0{{Yu<Cx%1A~kt11BpmeSi!CrWZyY9!TmJ7G?m2;TK>OdVJl%92G$?!48NGZF}SmPF>w9nW%&C26N4Xf z00ZYQUWPA1Um5-f1~UBq_k)2IR52MCGQ4~95>y1jif%}W2lO#BFiL>+E&~^z05CCs zVmN;M_>U(~p6rME{s*!H00M|*&z?PPz=SkSTvS{D7-$Skj7;G4z`*hXOoI&m$Mlkc znS+yo>HT}K&zO058JK{<%mPXaz!VNj<)Add07`g3`se1&48M$w7?`+u!SR3g?Afcp z#0yIKkI;*KfB*tHn;DoBY=PJr$mRzc!~(>uKtn+^3nLRF3ou86#ef(n%*@Kf$jA&< z2T=p$g5`mpXJG*;`2Fr3Gnc3+Gb50H=l1Ql4<9~U4~&|{K=YrVI{+Yn7?GN0TtLhY zauAfygvLh4gw(;r{y;5$3@UKZ9RLtOj04>>0tlc1ZXtfG21Qdk=RTSi)EQ1{_6i^UCwl}dq?)Kwu=icw$3Vv(^&DzBp z003H4WY{5#gx(W{WZ?xTPp(-6A&d7n9sqO>1QNe~ZLyh!;faNxAImH(PRkboJmIl) z5ft@hT9)XLC{1`m{6Mq^07z$}!gz5dlj%kb<7#2N1V~S32mm?^E&&!@<5jOx&3q{o za+2cX&tua)2r{taVogmAuD$W)qm~2Jb-st=OE#9C%TaGk*+GINT|sbi^6jAAyQ69v z8kDn-+d5(SDD|F*MUq!Y8 zc(PIdZebZiFlP5@(-6e!MAaf;@5+D2xe6|d8cfdKc6~j+K7)-5c4y4Sx{BFnKaWtq z>5TRFH=1ZgLzdQf!x{T;+PrT8Xs^e8w-+;+?n9TsNf?}i%e{^x&~3>;nZbF>Wk~-xi=)I9adQP-N!XQOOPah0O(QZ>2owWjyN~2)5!9nUX;qfIGvsHp@IVxcl=2QSj-aDrbsm+71?S} z(P`Ip&yPj&*46_(_|&4!Hz=_a?i71#2Li$LLi<)nVL z!{}WfIN}P&}jcP#>G?Gb4@Dg8Slpya_Y>1sq)VLm%q6alT7GG9ciH z=o`?VqJQAg0KhTaeay7TgYio%ePJb?E);6I?M9S?xW$@CT%}tOf{H0q7 zl`i}Cu}DQlJM)s>yd2C@xO01?p`g&-I~j%}`IIk6Y_>=2dpr+&3oX_Q8)ei(kFHYPxu*ps zYp-_l-RgrA8RDn!$Lm2bgGYu5Mdd0wSFTWOo4`S!NZ7|18*^m7=q?+~d$Wx!S3~ad z+qd`d_qu8q#;X~go_&(vYbA?;RKI^rk(F-U-T(#aumx`5F2EK1)KvG2^wc{g_+chg z$@@b)Sm!5c3i<3aJ0E2Ax4)~wB=r2XF8_c%C3(*EJ1#I%Qc@Vr&3)3U6U3N=3DN{@*z34hoRim^Arg_jcG>cCncl_cW}jS2nCa`kchCB!qvQ7I z=uc6;itt-`r&{6r(~xd+mFyq3twZh~O*rUVb*%k2+a5q+M`OXKY6x!|)7R8~b} zRQte@Xl8~+psdw=Kq)?VK}7sJE0SkH5r z2LOO|aL}fmrbzs@EHI}1#M!gcreGEyuq^-pDqDQe*`ua2K4o)M%1?=LDW{poV}XE} z#OPRJ@KI)b?9Nzb%$elYSU&);tP9>05W)H1iWnwxi( z35bh~vl9bllm9;Bm|~5OTm-YU69c^q@(A*Cv!8l93qnHH5jc8{4qtAxavOpx)su3t zmNn(O!v?S*3Q-NI+Vr2lbQX(pkjT`>3dQHP@o`xjqaih3qnq&vH|)yjEDq3ENj~*X zHu!OjW0JD%1loDs^o+wRE&(SBPF;+pu?5j!9T3>*lVMBnrwD~YZ{KzQkk_w2SMZ=J zIZE+guB(d+&c)T$a-Fj2l1G_{6W`s{-5owOJPc~IUwufI!6p&g5H~n7!W>j8mF%zY zFMYYQ<@79aQSRyzgqfW~RX>{FM*E8)BA;%`zTE52*1u5AsTqPkuL_*w27&a?l9IN; z_wVB>%gb-tu1a$%d}5MpQ%I3vYUrh5^%3U}6K~I`B$W(~xC9!omvc*|iW^^r7c}#oKM-NxzD*T(-)|KN1dXb}#%=YvteLUV5fj?QWh?F#CY?Buwoy4L z=R{FRcUdeJ4u{8YHp$&Oqnr8qj_$^m$dKPUCU^0(=R~(VZA6bUq)go=uBAqky{lu% zKBp0-hnxjVXxt1HYRIW5*NEKu6jf1CANS=;c1UPw=wN#0$^fI$kcs%UORLpFBlDg% zUiZi=N;T@IJY_@(K&}VXpRdyydb2uQOiLmrGV&DW)TvV#cXwwntDO4rBcJ+lY!6vj zRYeU7UIsO>O^I_aE?;VX@?`UmQmHf@Z`|lPXI-Nw@G&>C!DM&$HJGrlH7^q7?89;q zXYQkj!zt!21nlUZeQ6rgjo>$6Uy#9Quo@>_;g^(HlSqyJJ0rTI4SFpv|5_TZ;C8*E zc3D89fkJ-s&M*}KsBvH2-$)o&e` zeQZ5Jk_XdpQME?zdYwK`@frob;-GYTS2q-mYQ^*Qa^U$AtayNjD=$k-!<_t?DR8UB zAA9RNX`3QGZ1R;Q36%0ky~Hx~5dMwxZ-2ab6L?MC5Ja8+eF$V3Gr8QodJk0dg18KZ zoR7!#@wqmLYCIpuHpa(jR3l!JujVwIf4!~)NcnMNaGE3UV%2;}W*!Z9!;|>|>Eea8 zqq7zPA%671(%VaWl*3>`+Yc2|;n3m*l99>;EN2rAZ^i+v?s$poGHzbw+Nba4L#rH6 zq+MiGe?o-}D~G1MR<^zfzq+(@km=Q-(zW}5CylOrwh4>Vb%z8_K1v z{}MwZw_Q@a*%FqqwK59Fw(zE8C3}B&C? zVuA%ti8StfH{XZc2D8U_J|AyH{NhfILtZi<_ZTM@xbX@teKzjklX>M9=8`#Ed1Jrk z`Gv38>mF)aL&|8kP52^nQ#%GVws*XEG5;VahotE%ja@!`-&8RZhC-_mDh+X z=UGQpR`C`B!&I*F7JfdG22&_W)fCFGR!FUNO{VG(#$axsU>vlzfI0g2&z!Q*(e=i$ zp6es@6#)$*^JItW*m3o4-rEJ#L9 z*=8N2x83C0Xso1i*qhR#qLO0@sT3UP1j_21GkA#Notip#m8q2W%RhAdUiaZ;f%+xn zK4GR*3$K_M2~m(W_C`&j2-->mlPx`~d~q7cUxC`=j;vVIpx3_?Pt6e|1)Vuq4x5{b zPFZAERh{-X!c9^ml40Giad7jeVKOO5Mb;ZTWn!D0;=MJC$qygRJR7J@)^-%rL@UvI zl5kl&T-?98E1c60o$b2I)!8x#^2ut6A*9!6Isf^KKJv)K7Y%>4YSykdhIk% zG3y$bafGoO=g*Eumo9S0Y=2UTz4{vsI?HNo>_F$-kz{s~yL)T=)}^wV_XwIHzG9Uf zyrDDs82Z;OeZGFzLA43QCeL`1*}N`1?pHA_%fC;wv@OD4F+%=u9u zt-<>(M_a6z@xfr+c7ypZJpinAWK!d!Ghh8dYNbMFnq_p$qt8!?WC$6CA`S#_9<50R>^sn!rDR{DTdpKSy zZnNCkjFc6LaB=N>W^3-<8=3AZQ#+&DD znap!$rDu-T1i*cbI2HlTBPDG_Nil0PGBd4YM!nW`BSW6UxbA+Ea8~^pO{zMIezf1h zX$C-~-(vtWbL>jHE0^Cf%t?YrO9MI9##yQY#miw?pxwq6g9^*n`9 zsG$Q$SFfL-v2nrJMU08YC1iBZ160*gviuODFfn)e^088ae|`Mg)1O-qhoYaF{TULJ z4A6nAW5Dp6RUV{vfKm>dkEQ#6*K^zsupk2q+Ea4=oYE*vUp*jrbJ(W)8^E;x12P5j A&;S4c literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/tablet.png b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/tablet.png new file mode 100755 index 0000000000000000000000000000000000000000..fa871f54035fcd0bb0f7f2068d2b2ed4e5e0e0cf GIT binary patch literal 2505 zcmW+&Yh02C7k>ank;hAE24+c9(=C@5nzmOHNV6i*EwWAy0MbXsy0K#HV?N8$W`pv6QT zjiNmD$4~(?B4QR`0#=CzfSwt;NKvh#!WIdB z%YB|dcjx@oo`(`bd`9z^!A(QY1iPF%6?1cRBpWIN`RzH8N~L-O;@a)6gcQs3YyzKw zS8F8Q3ey0*t9pI8N+#*A02%I+ZZ5pG(swWbrgxqRY_5pm-6ONBQaTL##bG};rs z&qhw~Rdm&{2#oiLSHT~s%W05S|HMj#%*G5_Q`N~l#tE|oK9qIHDCueJIiqjoqJ=wO z6)(8utZ6E4$g|H1?q;%R#Ct)#J#a%@GeQfg7RTQWmfVkW;@u1Y&%)-}AgKBB(WfWU zMkk(IE3Q~3d{#80MM@-ZWnYeq(Pk^lAvkxY6adTrme$>nUA@}@IHZ-*dA*#|*s z==2flXx~Gi>+WTGOz&Jfl3-vyh50 zz08MfbZ+=dFZfWOL<32pD7ipvfmfEHE?|m}55gxR!ge>D!C1>p=^xoLm$yh!(Idwi zgfB;FH=L4ZIgiApTPB@R*tXbfad!eL+$<+1CaK}0k>TOwv4{w>@Th3Bk6MY~RfkB> z(Ivu(#3IFtr>)~HAf=nZCIk?*1X^+Sf!44H<>Ea2J_3LjZLols2`mbb8JN@v^pelH zL(|XyR%Q%nUBB-kEP4+FvI&0&T$1<2_#yqM;fUgtWEXr6V#gAJ*lkiqP6$3|lCgT7 zB{O%Ke}K3p8?*IebNE`9-4>hTHEHM1ZR}NtxRe5L!&>x!o}F1JIiGcfGJ_tk(j23B zd9^gAh>x-3oVBh$4p^biJYFxBuYZ<+M*BeUCcF#`$|FQRUi|EhaNdF_Fmvd&jz+R2 zd<@1L7`L(bbFLkRxKdNex-xH5z%xV_wBO@wLfDq>x*r6C8(PCB`ewPmqIUTC+3wu` z%X@kBKEEIe6dpUUR3eiGB_T6uNcJ3M&dqn=uxkdU)P=XEzAo$M6Tl%S9w>$O?UQ+2 z)GnKb|6@RPR09h&tc?%Hut^QVq%eoKxFO_{<9%g2LQNj+VH=OVEJH8o8a++W=3 zBH|;?Qe*Ks1|_bDBaj+Vy%bu5Y0uMia(751xVUYjurf@BqYfhjFosrrVO&b=UaBJ* zRVN78NkBo!#fmE0cTcT_jX@G@AWtc#%DLj^v8gTWtqy10)QAq%X6{P@Q|Um~Nce`J z6C6{`db6PK_*$qBhHKT~6^QX= z`2pm`0;Xk>TfmW!Xr*QzEBvF%8Jp_Vg0=jd*PS>&;faj4v=c)(nbhpBxpufuO(|-M z#Q-P#lEIs7?HOWR6zM!d&uouzVwZgTrZGW@?`cWH&GeCx|9B=m+Ud-^A%LZd9FWLN z>X>TjvxiUr!YMF_{{Zg@H-9PVG{wBNO=Z=i(R;M4C*?Bd-670aa(Iqu0NPqGG(WLS zL2jo-vyV>)sfXWhyYyP2lJEQfURv$sY*5OL*_76my7x&_Gb2Gn1na~#8Q$eMq%}qT zL;!yW?cbaP%Rj|~O$kHMk5d+1g}K~m;yVXNy*yGbH0`{bq`eR+UKKnPJb(Q{G4_#x z%+Ah@K95C{cN^*wT3Hcr`U$&c!dhcBEqw6M7sMV4lO%$71xuO5(|tjH$WuP9NQ0Ip za5k6+=H&B03ge6XZIP~yM{tlF32eoRgP9~mYfNC`e9z9wMj+I=s;>H4oxLV^& z(hzt0iAT`jb*aE?)L;i^uGhlkP@h%y% z4F*xWY>D>oAR7q#t9>=b_W~AcLW!YfXg_Sl-xlb$eXWTSnjPVo7p_S5=0F|=B^c3B zBr=%nm;*@^^UG-VoV49d;qU0yoQ%fjXiSP5I22rawBFTM;`KU~c{Q$`q3#qQoPN3T zp&B#r1cUvjRxN2x{M5nc+r+o)J)E#50W0)M@Q6w6p{N zZ6g%Axx1*dc;Md~b;UWI27CD17uycnas}P0v1hRWU)K4fR1O z_GBXjE!MHHv6fqU4|87?aSAtB;K2$ODqVa6cZM+vRg51?!1GSGqHbs5$>`hH=Z$g9 zP=yCQ&n4$SZBbp%Z^6#?ct4Nl%rat>>dn=|dwj9g3_R@ck)rziA#RRI{NOwgckukd z@=SR5BNa0^UYdPf_WoIY6K3}7Jaue7@z%) zyF|hvcM#Y?q7EGb(K5dgQ+A^PC*V}dKZ6eh`6Jux$~3_-b>1`oEkSLng_yMZ$A + + + + Nested Tabs - jQuery EasyUI Demo + + + + + + + +

                                                                  Nested Tabs

                                                                  +

                                                                  The tab panel can contain sub tabs or other components.

                                                                  +
                                                                  +
                                                                  +
                                                                  +
                                                                  +
                                                                  Content 1
                                                                  +
                                                                  Content 2
                                                                  +
                                                                  Content 3
                                                                  +
                                                                  +
                                                                  +
                                                                  +
                                                                  + +
                                                                  +
                                                                  + + + + + + + + + + + + + + + + + + + + +
                                                                  Title1Title2Title3
                                                                  d11d12d13
                                                                  d21d22d23
                                                                  +
                                                                  +
                                                                  + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/striptools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/striptools.html new file mode 100755 index 000000000..13ca5b458 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/striptools.html @@ -0,0 +1,39 @@ + + + + + Tabs Strip Tools - jQuery EasyUI Demo + + + + + + + +

                                                                  Tabs Strip Tools

                                                                  +

                                                                  Click the mini-buttons on the tab strip to perform actions.

                                                                  +
                                                                  +
                                                                  +
                                                                  +

                                                                  jQuery EasyUI framework helps you build your web pages easily.

                                                                  +
                                                                    +
                                                                  • easyui is a collection of user-interface plugin based on jQuery.
                                                                  • +
                                                                  • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                  • +
                                                                  • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                  • +
                                                                  • complete framework for HTML5 web page.
                                                                  • +
                                                                  • easyui save your time and scales while developing your products.
                                                                  • +
                                                                  • easyui is very easy but powerful.
                                                                  • +
                                                                  +
                                                                  +
                                                                  + This is the help content. +
                                                                  +
                                                                  +
                                                                  + + + +
                                                                  + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/style.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/style.html new file mode 100755 index 000000000..adcb50771 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/style.html @@ -0,0 +1,51 @@ + + + + + Tabs Style - jQuery EasyUI Demo + + + + + + + +

                                                                  Tabs Style

                                                                  +

                                                                  Click the options below to change the tabs style.

                                                                  +
                                                                  + plain
                                                                  + narrow
                                                                  + pill
                                                                  + justified +
                                                                  +
                                                                  +
                                                                  +

                                                                  jQuery EasyUI framework helps you build your web pages easily.

                                                                  +
                                                                    +
                                                                  • easyui is a collection of user-interface plugin based on jQuery.
                                                                  • +
                                                                  • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                  • +
                                                                  • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                  • +
                                                                  • complete framework for HTML5 web page.
                                                                  • +
                                                                  • easyui save your time and scales while developing your products.
                                                                  • +
                                                                  • easyui is very easy but powerful.
                                                                  • +
                                                                  +
                                                                  +
                                                                  +
                                                                    +
                                                                    +
                                                                    + This is the help content. +
                                                                    +
                                                                    + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabimage.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabimage.html new file mode 100755 index 000000000..415cbef86 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabimage.html @@ -0,0 +1,41 @@ + + + + + Tabs with Images - jQuery EasyUI Demo + + + + + + + +

                                                                    Tabs with Images

                                                                    +

                                                                    The tab strip can display big images.

                                                                    +
                                                                    +
                                                                    +
                                                                    +

                                                                    A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.

                                                                    +
                                                                    +
                                                                    +

                                                                    In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.

                                                                    +
                                                                    +
                                                                    +

                                                                    A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.

                                                                    +
                                                                    +
                                                                    +

                                                                    A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

                                                                    +
                                                                    +
                                                                    + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabposition.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabposition.html new file mode 100755 index 000000000..43547367c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabposition.html @@ -0,0 +1,45 @@ + + + + + Tab Position - jQuery EasyUI Demo + + + + + + + +

                                                                    Tab Position

                                                                    +

                                                                    Click the 'position' drop-down list and select an item to change the tab position.

                                                                    +
                                                                    + Position: + +
                                                                    +
                                                                    +
                                                                    +

                                                                    jQuery EasyUI framework helps you build your web pages easily.

                                                                    +
                                                                      +
                                                                    • easyui is a collection of user-interface plugin based on jQuery.
                                                                    • +
                                                                    • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                    • +
                                                                    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                    • +
                                                                    • complete framework for HTML5 web page.
                                                                    • +
                                                                    • easyui save your time and scales while developing your products.
                                                                    • +
                                                                    • easyui is very easy but powerful.
                                                                    • +
                                                                    +
                                                                    +
                                                                    +
                                                                      +
                                                                      +
                                                                      + This is the help content. +
                                                                      +
                                                                      + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabstools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabstools.html new file mode 100755 index 000000000..9c8fa1012 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabstools.html @@ -0,0 +1,41 @@ + + + + + Tabs Tools - jQuery EasyUI Demo + + + + + + + +

                                                                      Tabs Tools

                                                                      +

                                                                      Click the buttons on the top right of tabs header to add or remove tab panel.

                                                                      +
                                                                      +
                                                                      +
                                                                      +
                                                                      + + +
                                                                      + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tree_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tree_data1.json new file mode 100755 index 000000000..e0c619226 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tree_data1.json @@ -0,0 +1,49 @@ +[{ + "id":1, + "text":"My Documents", + "children":[{ + "id":11, + "text":"Photos", + "state":"closed", + "children":[{ + "id":111, + "text":"Friend" + },{ + "id":112, + "text":"Wife" + },{ + "id":113, + "text":"Company" + }] + },{ + "id":12, + "text":"Program Files", + "children":[{ + "id":121, + "text":"Intel" + },{ + "id":122, + "text":"Java", + "attributes":{ + "p1":"Custom Attribute1", + "p2":"Custom Attribute2" + } + },{ + "id":123, + "text":"Microsoft Office" + },{ + "id":124, + "text":"Games", + "checked":true + }] + },{ + "id":13, + "text":"index.html" + },{ + "id":14, + "text":"about.html" + },{ + "id":15, + "text":"welcome.html" + }] +}] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/autocomplete.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/autocomplete.html new file mode 100755 index 000000000..f192f3e87 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/autocomplete.html @@ -0,0 +1,29 @@ + + + + + TagBox with Autocomplete - jQuery EasyUI Demo + + + + + + + +

                                                                      TagBox with Autocomplete

                                                                      +

                                                                      The autocomplete is the built-in feature that allows the user to select a value from the drop-down list.

                                                                      +
                                                                      +
                                                                      + +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/basic.html new file mode 100755 index 000000000..256bb931f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/basic.html @@ -0,0 +1,20 @@ + + + + + Basic TagBox - jQuery EasyUI Demo + + + + + + + +

                                                                      Basic TagBox

                                                                      +

                                                                      The TagBox is created from a simple input element.

                                                                      +
                                                                      +
                                                                      + +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/button.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/button.html new file mode 100755 index 000000000..b16ac1cea --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/button.html @@ -0,0 +1,25 @@ + + + + + TagBox with Button - jQuery EasyUI Demo + + + + + + + +

                                                                      TagBox with Button

                                                                      +

                                                                      The button can be attached to a tagbox.

                                                                      +
                                                                      +
                                                                      + +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/format.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/format.html new file mode 100644 index 000000000..0a441bd94 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/format.html @@ -0,0 +1,24 @@ + + + + + Format TagBox - jQuery EasyUI Demo + + + + + + + +

                                                                      Format TagBox

                                                                      +

                                                                      This example shows how to format the tagbox values.

                                                                      +
                                                                      +
                                                                      + +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/style.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/style.html new file mode 100755 index 000000000..26cb95e15 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/style.html @@ -0,0 +1,35 @@ + + + + + Custom TagBox Style - jQuery EasyUI Demo + + + + + + + +

                                                                      Custom TagBox Style

                                                                      +

                                                                      This example shows how to apply different CSS styles to different tags.

                                                                      +
                                                                      +
                                                                      + +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/tagbox_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/tagbox_data1.json new file mode 100755 index 000000000..4e4f03c3c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/tagbox_data1.json @@ -0,0 +1,21 @@ +[{ + "id":"1", + "text":"Java", + "desc":"Write once, run anywhere" +},{ + "id":"2", + "text":"C#", + "desc":"One of the programming languages designed for the Common Language Infrastructure" +},{ + "id":"3", + "text":"Ruby", + "desc":"A dynamic, reflective, general-purpose object-oriented programming language" +},{ + "id":"4", + "text":"Perl", + "desc":"A high-level, general-purpose, interpreted, dynamic programming language" +},{ + "id":"5", + "text":"Basic", + "desc":"A family of general-purpose, high-level programming languages" +}] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/validate.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/validate.html new file mode 100755 index 000000000..86e57b38e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/validate.html @@ -0,0 +1,34 @@ + + + + + Validate TagBox - jQuery EasyUI Demo + + + + + + + +

                                                                      Validate TagBox

                                                                      +

                                                                      This example shows how to validate the tagbox values.

                                                                      +
                                                                      +
                                                                      + +
                                                                      + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/basic.html new file mode 100644 index 000000000..d7f93327f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/basic.html @@ -0,0 +1,35 @@ + + + + + Basic TextBox - jQuery EasyUI Demo + + + + + + + +

                                                                      Basic TextBox

                                                                      +

                                                                      The textbox allows a user to enter information.

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      + +
                                                                      + Register +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/button.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/button.html new file mode 100644 index 000000000..bc78b1f1a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/button.html @@ -0,0 +1,25 @@ + + + + + TextBox with Button - jQuery EasyUI Demo + + + + + + + +

                                                                      TextBox with Button

                                                                      +

                                                                      The button can be attached to a textbox.

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/clearicon.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/clearicon.html new file mode 100644 index 000000000..94a0ee1b7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/clearicon.html @@ -0,0 +1,68 @@ + + + + + TextBox with Clear Icon - jQuery EasyUI Demo + + + + + + + +

                                                                      TextBox with Clear Icon

                                                                      +

                                                                      This example shows how to create an textbox with an icon to clear the input element itself.

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/custom.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/custom.html new file mode 100644 index 000000000..b4cf18237 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/custom.html @@ -0,0 +1,34 @@ + + + + + Custom TextBox - jQuery EasyUI Demo + + + + + + + +

                                                                      Custom TextBox

                                                                      +

                                                                      This example shows how to custom a login form.

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + Remember me +
                                                                      + +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/fluid.html new file mode 100644 index 000000000..1c62dc232 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid TextBox - jQuery EasyUI Demo + + + + + + + +

                                                                      Fluid TextBox

                                                                      +

                                                                      This example shows how to set the width of TextBox to a percentage of its parent container.

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/icons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/icons.html new file mode 100644 index 000000000..10a9653ea --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/icons.html @@ -0,0 +1,51 @@ + + + + + TextBox with Icons - jQuery EasyUI Demo + + + + + + + +

                                                                      TextBox with Icons

                                                                      +

                                                                      Click the icons on textbox to perform actions.

                                                                      +
                                                                      +
                                                                      + Select Icon Align: + +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/multiline.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/multiline.html new file mode 100644 index 000000000..f56b4e5e6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/multiline.html @@ -0,0 +1,25 @@ + + + + + Multiline TextBox - jQuery EasyUI Demo + + + + + + + +

                                                                      Multiline TextBox

                                                                      +

                                                                      This example shows how to define a textbox for the user to enter multi-line text input.

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/size.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/size.html new file mode 100644 index 000000000..12e17dcaa --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/size.html @@ -0,0 +1,31 @@ + + + + + TextBox Size - jQuery EasyUI Demo + + + + + + + +

                                                                      TextBox Size

                                                                      +

                                                                      The textbox can vary in size.

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/actions.html new file mode 100755 index 000000000..2480f8a17 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/actions.html @@ -0,0 +1,42 @@ + + + + + TimeSpinner Actions - jQuery EasyUI Demo + + + + + + + +

                                                                      TimeSpinner Actions

                                                                      +

                                                                      Click the buttons below to perform actions.

                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/basic.html new file mode 100755 index 000000000..9a30add42 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/basic.html @@ -0,0 +1,25 @@ + + + + + Basic TimeSpinner - jQuery EasyUI Demo + + + + + + + +

                                                                      Basic TimeSpinner

                                                                      +

                                                                      Click spin button to adjust time.

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/fluid.html new file mode 100755 index 000000000..403ead1bd --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/fluid.html @@ -0,0 +1,25 @@ + + + + + Fluid TimeSpinner - jQuery EasyUI Demo + + + + + + + +

                                                                      Fluid TimeSpinner

                                                                      +

                                                                      This example shows how to set the width of TimeSpinner to a percentage of its parent container.

                                                                      +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/range.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/range.html new file mode 100755 index 000000000..042c26ae1 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/range.html @@ -0,0 +1,24 @@ + + + + + Time Range - jQuery EasyUI Demo + + + + + + + +

                                                                      Time Range

                                                                      +

                                                                      The time value is constrained in specified range.

                                                                      +
                                                                      + From 08:30 to 18:00 +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_content.html new file mode 100755 index 000000000..996740274 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_content.html @@ -0,0 +1,18 @@ + + + + + AJAX Content + + +

                                                                      Here is the content loaded via AJAX.

                                                                      +
                                                                        +
                                                                      • easyui is a collection of user-interface plugin based on jQuery.
                                                                      • +
                                                                      • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                                      • +
                                                                      • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                      • +
                                                                      • complete framework for HTML5 web page.
                                                                      • +
                                                                      • easyui save your time and scales while developing your products.
                                                                      • +
                                                                      • easyui is very easy but powerful.
                                                                      • +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_dialog.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_dialog.html new file mode 100755 index 000000000..ddcdc074c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_dialog.html @@ -0,0 +1,23 @@ + + + + + Dialog Content + + +
                                                                      +
                                                                      +
                                                                      User Name:
                                                                      + +
                                                                      +
                                                                      +
                                                                      Password:
                                                                      + +
                                                                      +
                                                                      + Login + Cancel +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/ajax.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/ajax.html new file mode 100755 index 000000000..c0095fa2b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/ajax.html @@ -0,0 +1,32 @@ + + + + + Ajax Tooltip - jQuery EasyUI Demo + + + + + + + +

                                                                      Ajax Tooltip

                                                                      +

                                                                      The tooltip content can be loaded via AJAX.

                                                                      +
                                                                      + Hove me to display tooltip content via AJAX. + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/basic.html new file mode 100755 index 000000000..3fb13625b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/basic.html @@ -0,0 +1,20 @@ + + + + + Basic Tooltip - jQuery EasyUI Demo + + + + + + + +

                                                                      Basic Tooltip

                                                                      +

                                                                      Hover the links to display tooltip message.

                                                                      +
                                                                      +

                                                                      The tooltip can use each elements title attribute. + Hover me to display tooltip. +

                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customcontent.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customcontent.html new file mode 100755 index 000000000..68ce13c20 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customcontent.html @@ -0,0 +1,32 @@ + + + + + Custom Tooltip Content - jQuery EasyUI Demo + + + + + + + +

                                                                      Custom Tooltip Content

                                                                      +

                                                                      Access to each elements attribute to get the tooltip content.

                                                                      +
                                                                      +
                                                                      +
                                                                      +
                                                                      + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customstyle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customstyle.html new file mode 100755 index 000000000..13f10ac59 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customstyle.html @@ -0,0 +1,52 @@ + + + + + Custom Tooltip Style - jQuery EasyUI Demo + + + + + + + +

                                                                      Custom Tooltip Style

                                                                      +

                                                                      This sample shows how to change the tooltip style.

                                                                      +
                                                                      +
                                                                      +
                                                                      Hover Me
                                                                      +
                                                                      +
                                                                      +
                                                                      Hover Me
                                                                      +
                                                                      + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/position.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/position.html new file mode 100755 index 000000000..8707b2557 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/position.html @@ -0,0 +1,34 @@ + + + + + Tooltip Position - jQuery EasyUI Demo + + + + + + + +

                                                                      Tooltip Position

                                                                      +

                                                                      Click the drop-down list below to change where the tooltip appears.

                                                                      +
                                                                      + Select position: + +
                                                                      +
                                                                      Hover Me
                                                                      +
                                                                      + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/toolbar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/toolbar.html new file mode 100755 index 000000000..c376ea2cd --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/toolbar.html @@ -0,0 +1,40 @@ + + + + + Tooltip as Toolbar - jQuery EasyUI Demo + + + + + + + +

                                                                      Tooltip as Toolbar

                                                                      +

                                                                      This sample shows how to create a tooltip style toolbar.

                                                                      +
                                                                      +
                                                                      +

                                                                      Hover me to display toolbar.

                                                                      +
                                                                      +
                                                                      +
                                                                      + + + + + +
                                                                      +
                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/tooltipdialog.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/tooltipdialog.html new file mode 100755 index 000000000..a22bcac0b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/tooltipdialog.html @@ -0,0 +1,44 @@ + + + + + Tooltip Dialog - jQuery EasyUI Demo + + + + + + + +

                                                                      Tooltip Dialog

                                                                      +

                                                                      This sample shows how to create a tooltip dialog.

                                                                      +
                                                                      +
                                                                      +

                                                                      Click here to see the tooltip dialog. +

                                                                      + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/actions.html new file mode 100755 index 000000000..4b194e724 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/actions.html @@ -0,0 +1,47 @@ + + + + + Tree Actions - jQuery EasyUI Demo + + + + + + + +

                                                                      Tree Actions

                                                                      +

                                                                      Click the buttons below to perform actions.

                                                                      + +
                                                                      +
                                                                        +
                                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/animation.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/animation.html new file mode 100755 index 000000000..83fb263fe --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/animation.html @@ -0,0 +1,20 @@ + + + + + Animation Tree - jQuery EasyUI Demo + + + + + + + +

                                                                        Animation Tree

                                                                        +

                                                                        Apply 'animate' property to true to enable animation effect.

                                                                        +
                                                                        +
                                                                        +
                                                                          +
                                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/basic.html new file mode 100755 index 000000000..96f4396ec --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/basic.html @@ -0,0 +1,53 @@ + + + + + Basic Tree - jQuery EasyUI Demo + + + + + + + +

                                                                          Basic Tree

                                                                          +

                                                                          Click the arrow on the left to expand or collapse nodes.

                                                                          +
                                                                          +
                                                                          +
                                                                            +
                                                                          • + My Documents +
                                                                              +
                                                                            • + Photos +
                                                                                +
                                                                              • + Friend +
                                                                              • +
                                                                              • + Wife +
                                                                              • +
                                                                              • + Company +
                                                                              • +
                                                                              +
                                                                            • +
                                                                            • + Program Files +
                                                                                +
                                                                              • Intel
                                                                              • +
                                                                              • Java
                                                                              • +
                                                                              • Microsoft Office
                                                                              • +
                                                                              • Games
                                                                              • +
                                                                              +
                                                                            • +
                                                                            • index.html
                                                                            • +
                                                                            • about.html
                                                                            • +
                                                                            • welcome.html
                                                                            • +
                                                                            +
                                                                          • +
                                                                          +
                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/checkbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/checkbox.html new file mode 100755 index 000000000..2d1f8d564 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/checkbox.html @@ -0,0 +1,37 @@ + + + + + CheckBox Tree - jQuery EasyUI Demo + + + + + + + +

                                                                          CheckBox Tree

                                                                          +

                                                                          Tree nodes with check boxes.

                                                                          + +
                                                                          + CascadeCheck + OnlyLeafCheck +
                                                                          +
                                                                          +
                                                                            +
                                                                            + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/contextmenu.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/contextmenu.html new file mode 100755 index 000000000..342fcf3ee --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/contextmenu.html @@ -0,0 +1,65 @@ + + + + + Tree Context Menu - jQuery EasyUI Demo + + + + + + + +

                                                                            Tree Context Menu

                                                                            +

                                                                            Right click on a node to display context menu.

                                                                            +
                                                                            +
                                                                            +
                                                                              +
                                                                              +
                                                                              +
                                                                              Append
                                                                              +
                                                                              Remove
                                                                              + +
                                                                              Expand
                                                                              +
                                                                              Collapse
                                                                              +
                                                                              + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/customcheckbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/customcheckbox.html new file mode 100755 index 000000000..366639abd --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/customcheckbox.html @@ -0,0 +1,29 @@ + + + + + Custom CheckBox Tree - jQuery EasyUI Demo + + + + + + + +

                                                                              Custom CheckBox Tree

                                                                              +

                                                                              Tree nodes with customized check boxes.

                                                                              +
                                                                              +
                                                                              +
                                                                                +
                                                                                + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/dnd.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/dnd.html new file mode 100755 index 000000000..4be5bbd45 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/dnd.html @@ -0,0 +1,20 @@ + + + + + Drag Drop Tree Nodes - jQuery EasyUI Demo + + + + + + + +

                                                                                Drag Drop Tree Nodes

                                                                                +

                                                                                Press mouse down and drag a node to another position.

                                                                                +
                                                                                +
                                                                                +
                                                                                  +
                                                                                  + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/editable.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/editable.html new file mode 100755 index 000000000..9d3b62c80 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/editable.html @@ -0,0 +1,27 @@ + + + + + Editable Tree - jQuery EasyUI Demo + + + + + + + +

                                                                                  Editable Tree

                                                                                  +

                                                                                  Click the node to begin edit, press enter key to stop edit or esc key to cancel edit.

                                                                                  +
                                                                                  +
                                                                                  +
                                                                                    +
                                                                                    + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/formatting.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/formatting.html new file mode 100755 index 000000000..187f58869 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/formatting.html @@ -0,0 +1,32 @@ + + + + + Formatting Tree Nodes - jQuery EasyUI Demo + + + + + + + +

                                                                                    Formatting Tree Nodes

                                                                                    +

                                                                                    This example shows how to display extra information on nodes.

                                                                                    +
                                                                                    +
                                                                                    +
                                                                                      +
                                                                                    +
                                                                                    + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/icons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/icons.html new file mode 100755 index 000000000..c4cecb84d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/icons.html @@ -0,0 +1,20 @@ + + + + + Tree Node Icons - jQuery EasyUI Demo + + + + + + + +

                                                                                    Tree Node Icons

                                                                                    +

                                                                                    This sample illustrates how to add icons to tree node.

                                                                                    +
                                                                                    +
                                                                                    +
                                                                                      +
                                                                                      + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lazyload.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lazyload.html new file mode 100755 index 000000000..865cee614 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lazyload.html @@ -0,0 +1,82 @@ + + + + + Lazy Load Tree Nodes - jQuery EasyUI Demo + + + + + + + +

                                                                                      Lazy Load Tree Nodes

                                                                                      +

                                                                                      Get full hierarchical tree data but lazy load nodes level by level.

                                                                                      +
                                                                                      +
                                                                                      +
                                                                                        +
                                                                                        + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lines.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lines.html new file mode 100755 index 000000000..681a16b4a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lines.html @@ -0,0 +1,20 @@ + + + + + Tree Lines - jQuery EasyUI Demo + + + + + + + +

                                                                                        Tree Lines

                                                                                        +

                                                                                        This sample shows how to show tree lines.

                                                                                        +
                                                                                        +
                                                                                        +
                                                                                          +
                                                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data1.json new file mode 100755 index 000000000..e0c619226 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data1.json @@ -0,0 +1,49 @@ +[{ + "id":1, + "text":"My Documents", + "children":[{ + "id":11, + "text":"Photos", + "state":"closed", + "children":[{ + "id":111, + "text":"Friend" + },{ + "id":112, + "text":"Wife" + },{ + "id":113, + "text":"Company" + }] + },{ + "id":12, + "text":"Program Files", + "children":[{ + "id":121, + "text":"Intel" + },{ + "id":122, + "text":"Java", + "attributes":{ + "p1":"Custom Attribute1", + "p2":"Custom Attribute2" + } + },{ + "id":123, + "text":"Microsoft Office" + },{ + "id":124, + "text":"Games", + "checked":true + }] + },{ + "id":13, + "text":"index.html" + },{ + "id":14, + "text":"about.html" + },{ + "id":15, + "text":"welcome.html" + }] +}] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data2.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data2.json new file mode 100755 index 000000000..a6e225177 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data2.json @@ -0,0 +1,61 @@ +[{ + "id":1, + "text":"My Documents", + "children":[{ + "id":11, + "text":"Photos", + "state":"closed", + "children":[{ + "id":111, + "text":"Friend" + },{ + "id":112, + "text":"Wife" + },{ + "id":113, + "text":"Company" + }] + },{ + "id":12, + "text":"Program Files", + "state":"closed", + "children":[{ + "id":121, + "text":"Intel" + },{ + "id":122, + "text":"Java" + },{ + "id":123, + "text":"Microsoft Office" + },{ + "id":124, + "text":"Games" + }] + },{ + "id":16, + "text":"Actions", + "children":[{ + "text":"Add", + "iconCls":"icon-add" + },{ + "text":"Remove", + "iconCls":"icon-remove" + },{ + "text":"Save", + "iconCls":"icon-save" + },{ + "text":"Search", + "iconCls":"icon-search" + }] + },{ + "id":13, + "text":"index.html" + },{ + "id":14, + "text":"about.html" + },{ + "id":15, + "text":"welcome.html" + }] +}] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/actions.html new file mode 100755 index 000000000..6249a9eed --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/actions.html @@ -0,0 +1,64 @@ + + + + + TreeGrid Actions - jQuery EasyUI Demo + + + + + + + +

                                                                                          TreeGrid Actions

                                                                                          +

                                                                                          Click the buttons below to perform actions.

                                                                                          + + + + + + + + + + + +
                                                                                          Task NamePersonsBegin DateEnd DateProgress
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/basic.html new file mode 100755 index 000000000..3b5076bb2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/basic.html @@ -0,0 +1,34 @@ + + + + + Basic TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                                                                          Basic TreeGrid

                                                                                          +

                                                                                          TreeGrid allows you to expand or collapse group rows.

                                                                                          +
                                                                                          + + + + + + + + +
                                                                                          NameSizeModified Date
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/checkbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/checkbox.html new file mode 100755 index 000000000..bbf6f8309 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/checkbox.html @@ -0,0 +1,35 @@ + + + + + Cascade CheckBox in TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                                                                          Cascade CheckBox in TreeGrid

                                                                                          +

                                                                                          TreeGrid nodes with cascade check boxes.

                                                                                          +
                                                                                          + + + + + + + + +
                                                                                          NameSizeModified Date
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/clientpagination.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/clientpagination.html new file mode 100755 index 000000000..03f8bf3a5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/clientpagination.html @@ -0,0 +1,189 @@ + + + + + Client Side Pagination in TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                                                                          Client Side Pagination in TreeGrid

                                                                                          +

                                                                                          This sample shows how to implement client side pagination in TreeGrid.

                                                                                          +
                                                                                          + + + + + + + + + + +
                                                                                          Task NamePersonsBegin DateEnd DateProgress
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/contextmenu.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/contextmenu.html new file mode 100755 index 000000000..3394ea15d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/contextmenu.html @@ -0,0 +1,106 @@ + + + + + TreeGrid ContextMenu - jQuery EasyUI Demo + + + + + + + +

                                                                                          TreeGrid ContextMenu

                                                                                          +

                                                                                          Right click to display the context menu.

                                                                                          +
                                                                                          + + + + + + + + + + +
                                                                                          Task NamePersonsBegin DateEnd DateProgress
                                                                                          +
                                                                                          +
                                                                                          Append
                                                                                          +
                                                                                          Remove
                                                                                          + +
                                                                                          Collapse
                                                                                          +
                                                                                          Expand
                                                                                          +
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/customcheckbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/customcheckbox.html new file mode 100755 index 000000000..40a34c02d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/customcheckbox.html @@ -0,0 +1,40 @@ + + + + + Custom CheckBox in TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                                                                          Custom CheckBox in TreeGrid

                                                                                          +

                                                                                          TreeGrid nodes with customized check boxes.

                                                                                          +
                                                                                          + + + + + + + + +
                                                                                          NameSizeModified Date
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/editable.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/editable.html new file mode 100755 index 000000000..0b79d39d4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/editable.html @@ -0,0 +1,93 @@ + + + + + Editable TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                                                                          Editable TreeGrid

                                                                                          +

                                                                                          Select one node and click edit button to perform editing.

                                                                                          +
                                                                                          + Edit + Save + Cancel +
                                                                                          + + + + + + + + + + +
                                                                                          Task NamePersonsBegin DateEnd DateProgress
                                                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/fluid.html new file mode 100755 index 000000000..1fd82f674 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/fluid.html @@ -0,0 +1,33 @@ + + + + + Fluid TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                                                                          Fluid TreeGrid

                                                                                          +

                                                                                          This example shows how to assign percentage width to a column in TreeGrid.

                                                                                          +
                                                                                          + + + + + + + + +
                                                                                          Name(50%)Size(20%)Modified Date(30%)
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/footer.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/footer.html new file mode 100755 index 000000000..d03e7563f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/footer.html @@ -0,0 +1,55 @@ + + + + + TreeGrid with Footer - jQuery EasyUI Demo + + + + + + + +

                                                                                          TreeGrid with Footer

                                                                                          +

                                                                                          Show summary information on TreeGrid footer.

                                                                                          +
                                                                                          +
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/lines.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/lines.html new file mode 100755 index 000000000..935f862a3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/lines.html @@ -0,0 +1,35 @@ + + + + + TreeGrid Lines - jQuery EasyUI Demo + + + + + + + +

                                                                                          TreeGrid Lines

                                                                                          +

                                                                                          This example shows how to show treegrid lines.

                                                                                          +
                                                                                          + + + + + + + + +
                                                                                          NameSizeModified Date
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/reports.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/reports.html new file mode 100755 index 000000000..062e6c87b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/reports.html @@ -0,0 +1,49 @@ + + + + + Reports using TreeGrid - jQuery EasyUI Demo + + + + + + + +

                                                                                          Reports using TreeGrid

                                                                                          +

                                                                                          Using TreeGrid to show complex reports.

                                                                                          +
                                                                                          + + + + + + + + + + + + + + + + + + + + + + +
                                                                                          Region
                                                                                          20092010
                                                                                          1st qrt.2st qrt.3st qrt.4st qrt.1st qrt.2st qrt.3st qrt.4st qrt.
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data1.json new file mode 100755 index 000000000..6cc109739 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data1.json @@ -0,0 +1,73 @@ +[{ + "id":1, + "name":"C", + "size":"", + "date":"02/19/2010", + "children":[{ + "id":2, + "name":"Program Files", + "size":"120 MB", + "date":"03/20/2010", + "children":[{ + "id":21, + "name":"Java", + "size":"", + "date":"01/13/2010", + "state":"closed", + "children":[{ + "id":211, + "name":"java.exe", + "size":"142 KB", + "date":"01/13/2010" + },{ + "id":212, + "name":"jawt.dll", + "size":"5 KB", + "date":"01/13/2010" + }] + },{ + "id":22, + "name":"MySQL", + "size":"", + "date":"01/13/2010", + "state":"closed", + "children":[{ + "id":221, + "name":"my.ini", + "size":"10 KB", + "date":"02/26/2009" + },{ + "id":222, + "name":"my-huge.ini", + "size":"5 KB", + "date":"02/26/2009" + },{ + "id":223, + "name":"my-large.ini", + "size":"5 KB", + "date":"02/26/2009" + }] + }] + },{ + "id":3, + "name":"eclipse", + "size":"", + "date":"01/20/2010", + "children":[{ + "id":31, + "name":"eclipse.exe", + "size":"56 KB", + "date":"05/19/2009" + },{ + "id":32, + "name":"eclipse.ini", + "size":"1 KB", + "date":"04/20/2010" + },{ + "id":33, + "name":"notice.html", + "size":"7 KB", + "date":"03/17/2005" + }] + }] +}] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data2.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data2.json new file mode 100755 index 000000000..52c2c0527 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data2.json @@ -0,0 +1,11 @@ +{"total":7,"rows":[ + {"id":1,"name":"All Tasks","begin":"3/4/2010","end":"3/20/2010","progress":60,"iconCls":"icon-ok"}, + {"id":2,"name":"Designing","begin":"3/4/2010","end":"3/10/2010","progress":100,"_parentId":1,"state":"closed"}, + {"id":21,"name":"Database","persons":2,"begin":"3/4/2010","end":"3/6/2010","progress":100,"_parentId":2}, + {"id":22,"name":"UML","persons":1,"begin":"3/7/2010","end":"3/8/2010","progress":100,"_parentId":2}, + {"id":23,"name":"Export Document","persons":1,"begin":"3/9/2010","end":"3/10/2010","progress":100,"_parentId":2}, + {"id":3,"name":"Coding","persons":2,"begin":"3/11/2010","end":"3/18/2010","progress":80}, + {"id":4,"name":"Testing","persons":1,"begin":"3/19/2010","end":"3/20/2010","progress":20} +],"footer":[ + {"name":"Total Persons:","persons":7,"iconCls":"icon-sum"} +]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data3.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data3.json new file mode 100755 index 000000000..7015d317b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data3.json @@ -0,0 +1,13 @@ +{"total":9,"rows":[ + {"id":1,"region":"Wyoming"}, + {"id":11,"region":"Albin","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, + {"id":12,"region":"Canon","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, + {"id":13,"region":"Egbert","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, + {"id":2,"region":"Washington"}, + {"id":21,"region":"Bellingham","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, + {"id":22,"region":"Chehalis","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, + {"id":23,"region":"Ellensburg","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, + {"id":24,"region":"Monroe","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2} +],"footer":[ + {"region":"Total","f1":14000,"f2":12600,"f3":13321,"f4":15281,"f5":14931,"f6":13461,"f7":14126,"f8":12866} +]} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/basic.html new file mode 100755 index 000000000..41bd5097c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/basic.html @@ -0,0 +1,45 @@ + + + + + Basic ValidateBox - jQuery EasyUI Demo + + + + + + + +

                                                                                          Basic ValidateBox

                                                                                          +

                                                                                          It's easy to add validate logic to a input box.

                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/customtooltip.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/customtooltip.html new file mode 100755 index 000000000..a5adf6a5b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/customtooltip.html @@ -0,0 +1,56 @@ + + + + + Custom ValidateBox Tooltip - jQuery EasyUI Demo + + + + + + + +

                                                                                          Custom ValidateBox Tooltip

                                                                                          +

                                                                                          This sample shows how to display another tooltip message on a valid textbox.

                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/errorplacement.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/errorplacement.html new file mode 100755 index 000000000..7bc164886 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/errorplacement.html @@ -0,0 +1,62 @@ + + + + + Error Placement in ValidateBox - jQuery EasyUI Demo + + + + + + + +

                                                                                          Error Placement in ValidateBox

                                                                                          +

                                                                                          This example shows how to display the error message below the field.

                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/validateonblur.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/validateonblur.html new file mode 100755 index 000000000..372cff452 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/validateonblur.html @@ -0,0 +1,45 @@ + + + + + Validate On Blur - jQuery EasyUI Demo + + + + + + + +

                                                                                          Validate On Blur

                                                                                          +

                                                                                          Active validation on first blur event.

                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + +
                                                                                          +
                                                                                          + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/basic.html new file mode 100755 index 000000000..fb402468b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/basic.html @@ -0,0 +1,23 @@ + + + + + Basic Window - jQuery EasyUI Demo + + + + + + + +

                                                                                          Basic Window

                                                                                          +

                                                                                          Window can be dragged freely on screen.

                                                                                          +
                                                                                          + Open + Close +
                                                                                          +
                                                                                          + The window content. +
                                                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/borderstyle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/borderstyle.html new file mode 100755 index 000000000..fd7a8f495 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/borderstyle.html @@ -0,0 +1,53 @@ + + + + + Window Border Style - jQuery EasyUI Demo + + + + + + + + +

                                                                                          Window Border Style

                                                                                          +

                                                                                          This example shows how to set the different border style.

                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          +

                                                                                          Window content

                                                                                          +
                                                                                          +
                                                                                          +

                                                                                          Window content

                                                                                          +
                                                                                          +
                                                                                          +

                                                                                          Window content

                                                                                          +
                                                                                          +
                                                                                          +

                                                                                          Window content

                                                                                          +
                                                                                          +
                                                                                          +

                                                                                          Window content

                                                                                          +
                                                                                          +
                                                                                          +

                                                                                          Window content

                                                                                          +
                                                                                          +
                                                                                          + + + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/customtools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/customtools.html new file mode 100755 index 000000000..4a0e2c45d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/customtools.html @@ -0,0 +1,30 @@ + + + + + Custom Window Tools - jQuery EasyUI Demo + + + + + + + +

                                                                                          Custom Window Tools

                                                                                          +

                                                                                          Click the right top buttons to perform actions.

                                                                                          +
                                                                                          + Open + Close +
                                                                                          +
                                                                                          + The window content. +
                                                                                          +
                                                                                          + + + + +
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/fluid.html new file mode 100755 index 000000000..13406fa19 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/fluid.html @@ -0,0 +1,24 @@ + + + + + Fluid Window - jQuery EasyUI Demo + + + + + + + +

                                                                                          Fluid Window

                                                                                          +

                                                                                          This example shows how to set the width of Window to a percentage of its parent container.

                                                                                          +
                                                                                          +
                                                                                          +

                                                                                          The window has a width of 80%.

                                                                                          +
                                                                                          + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/footer.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/footer.html new file mode 100755 index 000000000..60e8b9aeb --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/footer.html @@ -0,0 +1,24 @@ + + + + + Window with a Footer - jQuery EasyUI Demo + + + + + + + +

                                                                                          Window with a Footer

                                                                                          +

                                                                                          This example shows how to attach a footer bar to the window.

                                                                                          +
                                                                                          + Open + Close +
                                                                                          +
                                                                                          + The window content. +
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/inlinewindow.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/inlinewindow.html new file mode 100755 index 000000000..f272bb167 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/inlinewindow.html @@ -0,0 +1,26 @@ + + + + + Inline Window - jQuery EasyUI Demo + + + + + + + +

                                                                                          Inline Window

                                                                                          +

                                                                                          The inline window stay inside its parent.

                                                                                          +
                                                                                          + Open + Close +
                                                                                          +
                                                                                          +
                                                                                          + This window stay inside its parent +
                                                                                          +
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/modalwindow.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/modalwindow.html new file mode 100755 index 000000000..ee273ec91 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/modalwindow.html @@ -0,0 +1,24 @@ + + + + + Modal Window - jQuery EasyUI Demo + + + + + + + +

                                                                                          Modal Window

                                                                                          +

                                                                                          Click the open button below to open the modal window.

                                                                                          +
                                                                                          + Open + Close +
                                                                                          +
                                                                                          + The window content. +
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/windowlayout.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/windowlayout.html new file mode 100755 index 000000000..d79927213 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/windowlayout.html @@ -0,0 +1,33 @@ + + + + + Window Layout - jQuery EasyUI Demo + + + + + + + +

                                                                                          Window Layout

                                                                                          +

                                                                                          Using layout on window.

                                                                                          +
                                                                                          + Open + Close +
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + jQuery EasyUI framework help you build your web page easily. +
                                                                                          +
                                                                                          + Ok + Cancel +
                                                                                          +
                                                                                          +
                                                                                          + + + \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/easyloader.js b/testapps/ResourceLoaderTest/src/main/resources/asset/easyloader.js new file mode 100755 index 000000000..d082ad2bd --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/easyloader.js @@ -0,0 +1,190 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function(){ +var _1={draggable:{js:"jquery.draggable.js"},droppable:{js:"jquery.droppable.js"},resizable:{js:"jquery.resizable.js"},linkbutton:{js:"jquery.linkbutton.js",css:"linkbutton.css"},progressbar:{js:"jquery.progressbar.js",css:"progressbar.css"},tooltip:{js:"jquery.tooltip.js",css:"tooltip.css"},pagination:{js:"jquery.pagination.js",css:"pagination.css",dependencies:["linkbutton"]},datagrid:{js:"jquery.datagrid.js",css:"datagrid.css",dependencies:["panel","resizable","linkbutton","pagination"]},treegrid:{js:"jquery.treegrid.js",css:"tree.css",dependencies:["datagrid"]},propertygrid:{js:"jquery.propertygrid.js",css:"propertygrid.css",dependencies:["datagrid"]},datalist:{js:"jquery.datalist.js",css:"datalist.css",dependencies:["datagrid"]},panel:{js:"jquery.panel.js",css:"panel.css"},window:{js:"jquery.window.js",css:"window.css",dependencies:["resizable","draggable","panel"]},dialog:{js:"jquery.dialog.js",css:"dialog.css",dependencies:["linkbutton","window"]},messager:{js:"jquery.messager.js",css:"messager.css",dependencies:["linkbutton","dialog","progressbar"]},layout:{js:"jquery.layout.js",css:"layout.css",dependencies:["resizable","panel"]},form:{js:"jquery.form.js"},menu:{js:"jquery.menu.js",css:"menu.css"},tabs:{js:"jquery.tabs.js",css:"tabs.css",dependencies:["panel","linkbutton"]},menubutton:{js:"jquery.menubutton.js",css:"menubutton.css",dependencies:["linkbutton","menu"]},splitbutton:{js:"jquery.splitbutton.js",css:"splitbutton.css",dependencies:["menubutton"]},switchbutton:{js:"jquery.switchbutton.js",css:"switchbutton.css"},accordion:{js:"jquery.accordion.js",css:"accordion.css",dependencies:["panel"]},calendar:{js:"jquery.calendar.js",css:"calendar.css"},textbox:{js:"jquery.textbox.js",css:"textbox.css",dependencies:["validatebox","linkbutton"]},passwordbox:{js:"jquery.passwordbox.js",css:"passwordbox.css",dependencies:["textbox"]},filebox:{js:"jquery.filebox.js",css:"filebox.css",dependencies:["textbox"]},combo:{js:"jquery.combo.js",css:"combo.css",dependencies:["panel","textbox"]},combobox:{js:"jquery.combobox.js",css:"combobox.css",dependencies:["combo"]},combotree:{js:"jquery.combotree.js",dependencies:["combo","tree"]},combogrid:{js:"jquery.combogrid.js",dependencies:["combo","datagrid"]},combotreegrid:{js:"jquery.combotreegrid.js",dependencies:["combo","treegrid"]},tagbox:{js:"jquery.tagbox.js",dependencies:["combobox"]},validatebox:{js:"jquery.validatebox.js",css:"validatebox.css",dependencies:["tooltip"]},numberbox:{js:"jquery.numberbox.js",dependencies:["textbox"]},searchbox:{js:"jquery.searchbox.js",css:"searchbox.css",dependencies:["menubutton","textbox"]},spinner:{js:"jquery.spinner.js",css:"spinner.css",dependencies:["textbox"]},numberspinner:{js:"jquery.numberspinner.js",dependencies:["spinner","numberbox"]},timespinner:{js:"jquery.timespinner.js",dependencies:["spinner"]},tree:{js:"jquery.tree.js",css:"tree.css",dependencies:["draggable","droppable"]},datebox:{js:"jquery.datebox.js",css:"datebox.css",dependencies:["calendar","combo"]},datetimebox:{js:"jquery.datetimebox.js",dependencies:["datebox","timespinner"]},slider:{js:"jquery.slider.js",dependencies:["draggable"]},parser:{js:"jquery.parser.js"},mobile:{js:"jquery.mobile.js"}}; +var _2={"af":"easyui-lang-af.js","ar":"easyui-lang-ar.js","bg":"easyui-lang-bg.js","ca":"easyui-lang-ca.js","cs":"easyui-lang-cs.js","cz":"easyui-lang-cz.js","da":"easyui-lang-da.js","de":"easyui-lang-de.js","el":"easyui-lang-el.js","en":"easyui-lang-en.js","es":"easyui-lang-es.js","fr":"easyui-lang-fr.js","it":"easyui-lang-it.js","jp":"easyui-lang-jp.js","nl":"easyui-lang-nl.js","pl":"easyui-lang-pl.js","pt_BR":"easyui-lang-pt_BR.js","ru":"easyui-lang-ru.js","sv_SE":"easyui-lang-sv_SE.js","tr":"easyui-lang-tr.js","zh_CN":"easyui-lang-zh_CN.js","zh_TW":"easyui-lang-zh_TW.js"}; +var _3={}; +function _4(_5,_6){ +var _7=false; +var _8=document.createElement("script"); +_8.type="text/javascript"; +_8.language="javascript"; +_8.src=_5; +_8.onload=_8.onreadystatechange=function(){ +if(!_7&&(!_8.readyState||_8.readyState=="loaded"||_8.readyState=="complete")){ +_7=true; +_8.onload=_8.onreadystatechange=null; +if(_6){ +_6.call(_8); +} +} +}; +document.getElementsByTagName("head")[0].appendChild(_8); +}; +function _9(_a,_b){ +_4(_a,function(){ +document.getElementsByTagName("head")[0].removeChild(this); +if(_b){ +_b(); +} +}); +}; +function _c(_d,_e){ +var _f=document.createElement("link"); +_f.rel="stylesheet"; +_f.type="text/css"; +_f.media="screen"; +_f.href=_d; +document.getElementsByTagName("head")[0].appendChild(_f); +if(_e){ +_e.call(_f); +} +}; +function _10(_11,_12){ +_3[_11]="loading"; +var _13=_1[_11]; +var _14="loading"; +var _15=(easyloader.css&&_13["css"])?"loading":"loaded"; +if(easyloader.css&&_13["css"]){ +if(/^http/i.test(_13["css"])){ +var url=_13["css"]; +}else{ +var url=easyloader.base+"themes/"+easyloader.theme+"/"+_13["css"]; +} +_c(url,function(){ +_15="loaded"; +if(_14=="loaded"&&_15=="loaded"){ +_16(); +} +}); +} +if(/^http/i.test(_13["js"])){ +var url=_13["js"]; +}else{ +var url=easyloader.base+"plugins/"+_13["js"]; +} +_4(url,function(){ +_14="loaded"; +if(_14=="loaded"&&_15=="loaded"){ +_16(); +} +}); +function _16(){ +_3[_11]="loaded"; +easyloader.onProgress(_11); +if(_12){ +_12(); +} +}; +}; +function _17(_18,_19){ +var mm=[]; +var _1a=false; +if(typeof _18=="string"){ +add(_18); +}else{ +for(var i=0;i<_18.length;i++){ +add(_18[i]); +} +} +function add(_1b){ +if(!_1[_1b]){ +return; +} +var d=_1[_1b]["dependencies"]; +if(d){ +for(var i=0;i=0;i--){ +_9.unshift(_a.children[i]); +} +} +} +}}; +$.parser={auto:true,onComplete:function(_b){ +},plugins:["draggable","droppable","resizable","pagination","tooltip","linkbutton","menu","sidemenu","menubutton","splitbutton","switchbutton","progressbar","tree","textbox","passwordbox","maskedbox","filebox","combo","combobox","combotree","combogrid","combotreegrid","tagbox","numberbox","validatebox","searchbox","spinner","numberspinner","timespinner","datetimespinner","calendar","datebox","datetimebox","slider","layout","panel","datagrid","propertygrid","treegrid","datalist","tabs","accordion","window","dialog","form"],parse:function(_c){ +var aa=[]; +for(var i=0;i<$.parser.plugins.length;i++){ +var _d=$.parser.plugins[i]; +var r=$(".easyui-"+_d,_c); +if(r.length){ +if(r[_d]){ +r.each(function(){ +$(this)[_d]($.data(this,"options")||{}); +}); +}else{ +aa.push({name:_d,jq:r}); +} +} +} +if(aa.length&&window.easyloader){ +var _e=[]; +for(var i=0;i=0){ +v=Math.floor((_12.width()-_13)*v/100); +}else{ +v=Math.floor((_12.height()-_13)*v/100); +} +}else{ +v=parseInt(v)||undefined; +} +return v; +},parseOptions:function(_15,_16){ +var t=$(_15); +var _17={}; +var s=$.trim(t.attr("data-options")); +if(s){ +if(s.substring(0,1)!="{"){ +s="{"+s+"}"; +} +_17=(new Function("return "+s))(); +} +$.map(["width","height","left","top","minWidth","maxWidth","minHeight","maxHeight"],function(p){ +var pv=$.trim(_15.style[p]||""); +if(pv){ +if(pv.indexOf("%")==-1){ +pv=parseInt(pv); +if(isNaN(pv)){ +pv=undefined; +} +} +_17[p]=pv; +} +}); +if(_16){ +var _18={}; +for(var i=0;i<_16.length;i++){ +var pp=_16[i]; +if(typeof pp=="string"){ +_18[pp]=t.attr(pp); +}else{ +for(var _19 in pp){ +var _1a=pp[_19]; +if(_1a=="boolean"){ +_18[_19]=t.attr(_19)?(t.attr(_19)=="true"):undefined; +}else{ +if(_1a=="number"){ +_18[_19]=t.attr(_19)=="0"?0:parseFloat(t.attr(_19))||undefined; +} +} +} +} +} +$.extend(_17,_18); +} +return _17; +}}; +$(function(){ +var d=$("
                                                                                          ").appendTo("body"); +$._boxModel=d.outerWidth()!=100; +d.remove(); +d=$("
                                                                                          ").appendTo("body"); +$._positionFixed=(d.css("position")=="fixed"); +d.remove(); +if(!window.easyloader&&$.parser.auto){ +$.parser.parse(); +} +}); +$.fn._outerWidth=function(_1b){ +if(_1b==undefined){ +if(this[0]==window){ +return this.width()||document.body.clientWidth; +} +return this.outerWidth()||0; +} +return this._size("width",_1b); +}; +$.fn._outerHeight=function(_1c){ +if(_1c==undefined){ +if(this[0]==window){ +return this.height()||document.body.clientHeight; +} +return this.outerHeight()||0; +} +return this._size("height",_1c); +}; +$.fn._scrollLeft=function(_1d){ +if(_1d==undefined){ +return this.scrollLeft(); +}else{ +return this.each(function(){ +$(this).scrollLeft(_1d); +}); +} +}; +$.fn._propAttr=$.fn.prop||$.fn.attr; +$.fn._size=function(_1e,_1f){ +if(typeof _1e=="string"){ +if(_1e=="clear"){ +return this.each(function(){ +$(this).css({width:"",minWidth:"",maxWidth:"",height:"",minHeight:"",maxHeight:""}); +}); +}else{ +if(_1e=="fit"){ +return this.each(function(){ +_20(this,this.tagName=="BODY"?$("body"):$(this).parent(),true); +}); +}else{ +if(_1e=="unfit"){ +return this.each(function(){ +_20(this,$(this).parent(),false); +}); +}else{ +if(_1f==undefined){ +return _21(this[0],_1e); +}else{ +return this.each(function(){ +_21(this,_1e,_1f); +}); +} +} +} +} +}else{ +return this.each(function(){ +_1f=_1f||$(this).parent(); +$.extend(_1e,_20(this,_1f,_1e.fit)||{}); +var r1=_22(this,"width",_1f,_1e); +var r2=_22(this,"height",_1f,_1e); +if(r1||r2){ +$(this).addClass("easyui-fluid"); +}else{ +$(this).removeClass("easyui-fluid"); +} +}); +} +function _20(_23,_24,fit){ +if(!_24.length){ +return false; +} +var t=$(_23)[0]; +var p=_24[0]; +var _25=p.fcount||0; +if(fit){ +if(!t.fitted){ +t.fitted=true; +p.fcount=_25+1; +$(p).addClass("panel-noscroll"); +if(p.tagName=="BODY"){ +$("html").addClass("panel-fit"); +} +} +return {width:($(p).width()||1),height:($(p).height()||1)}; +}else{ +if(t.fitted){ +t.fitted=false; +p.fcount=_25-1; +if(p.fcount==0){ +$(p).removeClass("panel-noscroll"); +if(p.tagName=="BODY"){ +$("html").removeClass("panel-fit"); +} +} +} +return false; +} +}; +function _22(_26,_27,_28,_29){ +var t=$(_26); +var p=_27; +var p1=p.substr(0,1).toUpperCase()+p.substr(1); +var min=$.parser.parseValue("min"+p1,_29["min"+p1],_28); +var max=$.parser.parseValue("max"+p1,_29["max"+p1],_28); +var val=$.parser.parseValue(p,_29[p],_28); +var _2a=(String(_29[p]||"").indexOf("%")>=0?true:false); +if(!isNaN(val)){ +var v=Math.min(Math.max(val,min||0),max||99999); +if(!_2a){ +_29[p]=v; +} +t._size("min"+p1,""); +t._size("max"+p1,""); +t._size(p,v); +}else{ +t._size(p,""); +t._size("min"+p1,min); +t._size("max"+p1,max); +} +return _2a||_29.fit; +}; +function _21(_2b,_2c,_2d){ +var t=$(_2b); +if(_2d==undefined){ +_2d=parseInt(_2b.style[_2c]); +if(isNaN(_2d)){ +return undefined; +} +if($._boxModel){ +_2d+=_2e(); +} +return _2d; +}else{ +if(_2d===""){ +t.css(_2c,""); +}else{ +if($._boxModel){ +_2d-=_2e(); +if(_2d<0){ +_2d=0; +} +} +t.css(_2c,_2d+"px"); +} +} +function _2e(){ +if(_2c.toLowerCase().indexOf("width")>=0){ +return t.outerWidth()-t.width(); +}else{ +return t.outerHeight()-t.height(); +} +}; +}; +}; +})(jQuery); +(function($){ +var _2f=null; +var _30=null; +var _31=false; +function _32(e){ +if(e.touches.length!=1){ +return; +} +if(!_31){ +_31=true; +dblClickTimer=setTimeout(function(){ +_31=false; +},500); +}else{ +clearTimeout(dblClickTimer); +_31=false; +_33(e,"dblclick"); +} +_2f=setTimeout(function(){ +_33(e,"contextmenu",3); +},1000); +_33(e,"mousedown"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _34(e){ +if(e.touches.length!=1){ +return; +} +if(_2f){ +clearTimeout(_2f); +} +_33(e,"mousemove"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _35(e){ +if(_2f){ +clearTimeout(_2f); +} +_33(e,"mouseup"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _33(e,_36,_37){ +var _38=new $.Event(_36); +_38.pageX=e.changedTouches[0].pageX; +_38.pageY=e.changedTouches[0].pageY; +_38.which=_37||1; +$(e.target).trigger(_38); +}; +if(document.addEventListener){ +document.addEventListener("touchstart",_32,true); +document.addEventListener("touchmove",_34,true); +document.addEventListener("touchend",_35,true); +} +})(jQuery); +(function($){ +function _39(e){ +var _3a=$.data(e.data.target,"draggable"); +var _3b=_3a.options; +var _3c=_3a.proxy; +var _3d=e.data; +var _3e=_3d.startLeft+e.pageX-_3d.startX; +var top=_3d.startTop+e.pageY-_3d.startY; +if(_3c){ +if(_3c.parent()[0]==document.body){ +if(_3b.deltaX!=null&&_3b.deltaX!=undefined){ +_3e=e.pageX+_3b.deltaX; +}else{ +_3e=e.pageX-e.data.offsetWidth; +} +if(_3b.deltaY!=null&&_3b.deltaY!=undefined){ +top=e.pageY+_3b.deltaY; +}else{ +top=e.pageY-e.data.offsetHeight; +} +}else{ +if(_3b.deltaX!=null&&_3b.deltaX!=undefined){ +_3e+=e.data.offsetWidth+_3b.deltaX; +} +if(_3b.deltaY!=null&&_3b.deltaY!=undefined){ +top+=e.data.offsetHeight+_3b.deltaY; +} +} +} +if(e.data.parent!=document.body){ +_3e+=$(e.data.parent).scrollLeft(); +top+=$(e.data.parent).scrollTop(); +} +if(_3b.axis=="h"){ +_3d.left=_3e; +}else{ +if(_3b.axis=="v"){ +_3d.top=top; +}else{ +_3d.left=_3e; +_3d.top=top; +} +} +}; +function _3f(e){ +var _40=$.data(e.data.target,"draggable"); +var _41=_40.options; +var _42=_40.proxy; +if(!_42){ +_42=$(e.data.target); +} +_42.css({left:e.data.left,top:e.data.top}); +$("body").css("cursor",_41.cursor); +}; +function _43(e){ +if(!$.fn.draggable.isDragging){ +return false; +} +var _44=$.data(e.data.target,"draggable"); +var _45=_44.options; +var _46=$(".droppable:visible").filter(function(){ +return e.data.target!=this; +}).filter(function(){ +var _47=$.data(this,"droppable").options.accept; +if(_47){ +return $(_47).filter(function(){ +return this==e.data.target; +}).length>0; +}else{ +return true; +} +}); +_44.droppables=_46; +var _48=_44.proxy; +if(!_48){ +if(_45.proxy){ +if(_45.proxy=="clone"){ +_48=$(e.data.target).clone().insertAfter(e.data.target); +}else{ +_48=_45.proxy.call(e.data.target,e.data.target); +} +_44.proxy=_48; +}else{ +_48=$(e.data.target); +} +} +_48.css("position","absolute"); +_39(e); +_3f(e); +_45.onStartDrag.call(e.data.target,e); +return false; +}; +function _49(e){ +if(!$.fn.draggable.isDragging){ +return false; +} +var _4a=$.data(e.data.target,"draggable"); +_39(e); +if(_4a.options.onDrag.call(e.data.target,e)!=false){ +_3f(e); +} +var _4b=e.data.target; +_4a.droppables.each(function(){ +var _4c=$(this); +if(_4c.droppable("options").disabled){ +return; +} +var p2=_4c.offset(); +if(e.pageX>p2.left&&e.pageXp2.top&&e.pageYp2.left&&e.pageXp2.top&&e.pageY_62.options.edge; +}; +}); +}; +$.fn.draggable.methods={options:function(jq){ +return $.data(jq[0],"draggable").options; +},proxy:function(jq){ +return $.data(jq[0],"draggable").proxy; +},enable:function(jq){ +return jq.each(function(){ +$(this).draggable({disabled:false}); +}); +},disable:function(jq){ +return jq.each(function(){ +$(this).draggable({disabled:true}); +}); +}}; +$.fn.draggable.parseOptions=function(_67){ +var t=$(_67); +return $.extend({},$.parser.parseOptions(_67,["cursor","handle","axis",{"revert":"boolean","deltaX":"number","deltaY":"number","edge":"number","delay":"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); +}; +$.fn.draggable.defaults={proxy:null,revert:false,cursor:"move",deltaX:null,deltaY:null,handle:null,disabled:false,edge:0,axis:null,delay:100,onBeforeDrag:function(e){ +},onStartDrag:function(e){ +},onDrag:function(e){ +},onEndDrag:function(e){ +},onStopDrag:function(e){ +}}; +$.fn.draggable.isDragging=false; +})(jQuery); +(function($){ +function _68(_69){ +$(_69).addClass("droppable"); +$(_69).bind("_dragenter",function(e,_6a){ +$.data(_69,"droppable").options.onDragEnter.apply(_69,[e,_6a]); +}); +$(_69).bind("_dragleave",function(e,_6b){ +$.data(_69,"droppable").options.onDragLeave.apply(_69,[e,_6b]); +}); +$(_69).bind("_dragover",function(e,_6c){ +$.data(_69,"droppable").options.onDragOver.apply(_69,[e,_6c]); +}); +$(_69).bind("_drop",function(e,_6d){ +$.data(_69,"droppable").options.onDrop.apply(_69,[e,_6d]); +}); +}; +$.fn.droppable=function(_6e,_6f){ +if(typeof _6e=="string"){ +return $.fn.droppable.methods[_6e](this,_6f); +} +_6e=_6e||{}; +return this.each(function(){ +var _70=$.data(this,"droppable"); +if(_70){ +$.extend(_70.options,_6e); +}else{ +_68(this); +$.data(this,"droppable",{options:$.extend({},$.fn.droppable.defaults,$.fn.droppable.parseOptions(this),_6e)}); +} +}); +}; +$.fn.droppable.methods={options:function(jq){ +return $.data(jq[0],"droppable").options; +},enable:function(jq){ +return jq.each(function(){ +$(this).droppable({disabled:false}); +}); +},disable:function(jq){ +return jq.each(function(){ +$(this).droppable({disabled:true}); +}); +}}; +$.fn.droppable.parseOptions=function(_71){ +var t=$(_71); +return $.extend({},$.parser.parseOptions(_71,["accept"]),{disabled:(t.attr("disabled")?true:undefined)}); +}; +$.fn.droppable.defaults={accept:null,disabled:false,onDragEnter:function(e,_72){ +},onDragOver:function(e,_73){ +},onDragLeave:function(e,_74){ +},onDrop:function(e,_75){ +}}; +})(jQuery); +(function($){ +function _76(e){ +var _77=e.data; +var _78=$.data(_77.target,"resizable").options; +if(_77.dir.indexOf("e")!=-1){ +var _79=_77.startWidth+e.pageX-_77.startX; +_79=Math.min(Math.max(_79,_78.minWidth),_78.maxWidth); +_77.width=_79; +} +if(_77.dir.indexOf("s")!=-1){ +var _7a=_77.startHeight+e.pageY-_77.startY; +_7a=Math.min(Math.max(_7a,_78.minHeight),_78.maxHeight); +_77.height=_7a; +} +if(_77.dir.indexOf("w")!=-1){ +var _79=_77.startWidth-e.pageX+_77.startX; +_79=Math.min(Math.max(_79,_78.minWidth),_78.maxWidth); +_77.width=_79; +_77.left=_77.startLeft+_77.startWidth-_77.width; +} +if(_77.dir.indexOf("n")!=-1){ +var _7a=_77.startHeight-e.pageY+_77.startY; +_7a=Math.min(Math.max(_7a,_78.minHeight),_78.maxHeight); +_77.height=_7a; +_77.top=_77.startTop+_77.startHeight-_77.height; +} +}; +function _7b(e){ +var _7c=e.data; +var t=$(_7c.target); +t.css({left:_7c.left,top:_7c.top}); +if(t.outerWidth()!=_7c.width){ +t._outerWidth(_7c.width); +} +if(t.outerHeight()!=_7c.height){ +t._outerHeight(_7c.height); +} +}; +function _7d(e){ +$.fn.resizable.isResizing=true; +$.data(e.data.target,"resizable").options.onStartResize.call(e.data.target,e); +return false; +}; +function _7e(e){ +_76(e); +if($.data(e.data.target,"resizable").options.onResize.call(e.data.target,e)!=false){ +_7b(e); +} +return false; +}; +function _7f(e){ +$.fn.resizable.isResizing=false; +_76(e,true); +_7b(e); +$.data(e.data.target,"resizable").options.onStopResize.call(e.data.target,e); +$(document).unbind(".resizable"); +$("body").css("cursor",""); +return false; +}; +function _80(e){ +var _81=$(e.data.target).resizable("options"); +var tt=$(e.data.target); +var dir=""; +var _82=tt.offset(); +var _83=tt.outerWidth(); +var _84=tt.outerHeight(); +var _85=_81.edge; +if(e.pageY>_82.top&&e.pageY<_82.top+_85){ +dir+="n"; +}else{ +if(e.pageY<_82.top+_84&&e.pageY>_82.top+_84-_85){ +dir+="s"; +} +} +if(e.pageX>_82.left&&e.pageX<_82.left+_85){ +dir+="w"; +}else{ +if(e.pageX<_82.left+_83&&e.pageX>_82.left+_83-_85){ +dir+="e"; +} +} +var _86=_81.handles.split(","); +_86=$.map(_86,function(h){ +return $.trim(h).toLowerCase(); +}); +if($.inArray("all",_86)>=0||$.inArray(dir,_86)>=0){ +return dir; +} +for(var i=0;i=0){ +return _86[_87]; +} +} +return ""; +}; +$.fn.resizable=function(_88,_89){ +if(typeof _88=="string"){ +return $.fn.resizable.methods[_88](this,_89); +} +return this.each(function(){ +var _8a=null; +var _8b=$.data(this,"resizable"); +if(_8b){ +$(this).unbind(".resizable"); +_8a=$.extend(_8b.options,_88||{}); +}else{ +_8a=$.extend({},$.fn.resizable.defaults,$.fn.resizable.parseOptions(this),_88||{}); +$.data(this,"resizable",{options:_8a}); +} +if(_8a.disabled==true){ +return; +} +$(this).bind("mousemove.resizable",{target:this},function(e){ +if($.fn.resizable.isResizing){ +return; +} +var dir=_80(e); +$(e.data.target).css("cursor",dir?dir+"-resize":""); +}).bind("mouseleave.resizable",{target:this},function(e){ +$(e.data.target).css("cursor",""); +}).bind("mousedown.resizable",{target:this},function(e){ +var dir=_80(e); +if(dir==""){ +return; +} +function _8c(css){ +var val=parseInt($(e.data.target).css(css)); +if(isNaN(val)){ +return 0; +}else{ +return val; +} +}; +var _8d={target:e.data.target,dir:dir,startLeft:_8c("left"),startTop:_8c("top"),left:_8c("left"),top:_8c("top"),startX:e.pageX,startY:e.pageY,startWidth:$(e.data.target).outerWidth(),startHeight:$(e.data.target).outerHeight(),width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),deltaWidth:$(e.data.target).outerWidth()-$(e.data.target).width(),deltaHeight:$(e.data.target).outerHeight()-$(e.data.target).height()}; +$(document).bind("mousedown.resizable",_8d,_7d); +$(document).bind("mousemove.resizable",_8d,_7e); +$(document).bind("mouseup.resizable",_8d,_7f); +$("body").css("cursor",dir+"-resize"); +}); +}); +}; +$.fn.resizable.methods={options:function(jq){ +return $.data(jq[0],"resizable").options; +},enable:function(jq){ +return jq.each(function(){ +$(this).resizable({disabled:false}); +}); +},disable:function(jq){ +return jq.each(function(){ +$(this).resizable({disabled:true}); +}); +}}; +$.fn.resizable.parseOptions=function(_8e){ +var t=$(_8e); +return $.extend({},$.parser.parseOptions(_8e,["handles",{minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number",edge:"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); +}; +$.fn.resizable.defaults={disabled:false,handles:"n, e, s, w, ne, se, sw, nw, all",minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000,edge:5,onStartResize:function(e){ +},onResize:function(e){ +},onStopResize:function(e){ +}}; +$.fn.resizable.isResizing=false; +})(jQuery); +(function($){ +function _8f(_90,_91){ +var _92=$.data(_90,"linkbutton").options; +if(_91){ +$.extend(_92,_91); +} +if(_92.width||_92.height||_92.fit){ +var btn=$(_90); +var _93=btn.parent(); +var _94=btn.is(":visible"); +if(!_94){ +var _95=$("
                                                                                          ").insertBefore(_90); +var _96={position:btn.css("position"),display:btn.css("display"),left:btn.css("left")}; +btn.appendTo("body"); +btn.css({position:"absolute",display:"inline-block",left:-20000}); +} +btn._size(_92,_93); +var _97=btn.find(".l-btn-left"); +_97.css("margin-top",0); +_97.css("margin-top",parseInt((btn.height()-_97.height())/2)+"px"); +if(!_94){ +btn.insertAfter(_95); +btn.css(_96); +_95.remove(); +} +} +}; +function _98(_99){ +var _9a=$.data(_99,"linkbutton").options; +var t=$(_99).empty(); +t.addClass("l-btn").removeClass("l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline"); +t.removeClass("l-btn-small l-btn-medium l-btn-large").addClass("l-btn-"+_9a.size); +if(_9a.plain){ +t.addClass("l-btn-plain"); +} +if(_9a.outline){ +t.addClass("l-btn-outline"); +} +if(_9a.selected){ +t.addClass(_9a.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); +} +t.attr("group",_9a.group||""); +t.attr("id",_9a.id||""); +var _9b=$("").appendTo(t); +if(_9a.text){ +$("").html(_9a.text).appendTo(_9b); +}else{ +$(" ").appendTo(_9b); +} +if(_9a.iconCls){ +$(" ").addClass(_9a.iconCls).appendTo(_9b); +_9b.addClass("l-btn-icon-"+_9a.iconAlign); +} +t.unbind(".linkbutton").bind("focus.linkbutton",function(){ +if(!_9a.disabled){ +$(this).addClass("l-btn-focus"); +} +}).bind("blur.linkbutton",function(){ +$(this).removeClass("l-btn-focus"); +}).bind("click.linkbutton",function(){ +if(!_9a.disabled){ +if(_9a.toggle){ +if(_9a.selected){ +$(this).linkbutton("unselect"); +}else{ +$(this).linkbutton("select"); +} +} +_9a.onClick.call(this); +} +}); +_9c(_99,_9a.selected); +_9d(_99,_9a.disabled); +}; +function _9c(_9e,_9f){ +var _a0=$.data(_9e,"linkbutton").options; +if(_9f){ +if(_a0.group){ +$("a.l-btn[group=\""+_a0.group+"\"]").each(function(){ +var o=$(this).linkbutton("options"); +if(o.toggle){ +$(this).removeClass("l-btn-selected l-btn-plain-selected"); +o.selected=false; +} +}); +} +$(_9e).addClass(_a0.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); +_a0.selected=true; +}else{ +if(!_a0.group){ +$(_9e).removeClass("l-btn-selected l-btn-plain-selected"); +_a0.selected=false; +} +} +}; +function _9d(_a1,_a2){ +var _a3=$.data(_a1,"linkbutton"); +var _a4=_a3.options; +$(_a1).removeClass("l-btn-disabled l-btn-plain-disabled"); +if(_a2){ +_a4.disabled=true; +var _a5=$(_a1).attr("href"); +if(_a5){ +_a3.href=_a5; +$(_a1).attr("href","javascript:;"); +} +if(_a1.onclick){ +_a3.onclick=_a1.onclick; +_a1.onclick=null; +} +_a4.plain?$(_a1).addClass("l-btn-disabled l-btn-plain-disabled"):$(_a1).addClass("l-btn-disabled"); +}else{ +_a4.disabled=false; +if(_a3.href){ +$(_a1).attr("href",_a3.href); +} +if(_a3.onclick){ +_a1.onclick=_a3.onclick; +} +} +}; +$.fn.linkbutton=function(_a6,_a7){ +if(typeof _a6=="string"){ +return $.fn.linkbutton.methods[_a6](this,_a7); +} +_a6=_a6||{}; +return this.each(function(){ +var _a8=$.data(this,"linkbutton"); +if(_a8){ +$.extend(_a8.options,_a6); +}else{ +$.data(this,"linkbutton",{options:$.extend({},$.fn.linkbutton.defaults,$.fn.linkbutton.parseOptions(this),_a6)}); +$(this)._propAttr("disabled",false); +$(this).bind("_resize",function(e,_a9){ +if($(this).hasClass("easyui-fluid")||_a9){ +_8f(this); +} +return false; +}); +} +_98(this); +_8f(this); +}); +}; +$.fn.linkbutton.methods={options:function(jq){ +return $.data(jq[0],"linkbutton").options; +},resize:function(jq,_aa){ +return jq.each(function(){ +_8f(this,_aa); +}); +},enable:function(jq){ +return jq.each(function(){ +_9d(this,false); +}); +},disable:function(jq){ +return jq.each(function(){ +_9d(this,true); +}); +},select:function(jq){ +return jq.each(function(){ +_9c(this,true); +}); +},unselect:function(jq){ +return jq.each(function(){ +_9c(this,false); +}); +}}; +$.fn.linkbutton.parseOptions=function(_ab){ +var t=$(_ab); +return $.extend({},$.parser.parseOptions(_ab,["id","iconCls","iconAlign","group","size","text",{plain:"boolean",toggle:"boolean",selected:"boolean",outline:"boolean"}]),{disabled:(t.attr("disabled")?true:undefined),text:($.trim(t.html())||undefined),iconCls:(t.attr("icon")||t.attr("iconCls"))}); +}; +$.fn.linkbutton.defaults={id:null,disabled:false,toggle:false,selected:false,outline:false,group:null,plain:false,text:"",iconCls:null,iconAlign:"left",size:"small",onClick:function(){ +}}; +})(jQuery); +(function($){ +function _ac(_ad){ +var _ae=$.data(_ad,"pagination"); +var _af=_ae.options; +var bb=_ae.bb={}; +var _b0=$(_ad).addClass("pagination").html("
                                                                                          "); +var tr=_b0.find("tr"); +var aa=$.extend([],_af.layout); +if(!_af.showPageList){ +_b1(aa,"list"); +} +if(!_af.showPageInfo){ +_b1(aa,"info"); +} +if(!_af.showRefresh){ +_b1(aa,"refresh"); +} +if(aa[0]=="sep"){ +aa.shift(); +} +if(aa[aa.length-1]=="sep"){ +aa.pop(); +} +for(var _b2=0;_b2"); +ps.bind("change",function(){ +_af.pageSize=parseInt($(this).val()); +_af.onChangePageSize.call(_ad,_af.pageSize); +_b9(_ad,_af.pageNumber); +}); +for(var i=0;i<_af.pageList.length;i++){ +$("").text(_af.pageList[i]).appendTo(ps); +} +$("").append(ps).appendTo(tr); +}else{ +if(_b3=="sep"){ +$("
                                                                                          ").appendTo(tr); +}else{ +if(_b3=="first"){ +bb.first=_b4("first"); +}else{ +if(_b3=="prev"){ +bb.prev=_b4("prev"); +}else{ +if(_b3=="next"){ +bb.next=_b4("next"); +}else{ +if(_b3=="last"){ +bb.last=_b4("last"); +}else{ +if(_b3=="manual"){ +$("").html(_af.beforePageText).appendTo(tr).wrap(""); +bb.num=$("").appendTo(tr).wrap(""); +bb.num.unbind(".pagination").bind("keydown.pagination",function(e){ +if(e.keyCode==13){ +var _b5=parseInt($(this).val())||1; +_b9(_ad,_b5); +return false; +} +}); +bb.after=$("").appendTo(tr).wrap(""); +}else{ +if(_b3=="refresh"){ +bb.refresh=_b4("refresh"); +}else{ +if(_b3=="links"){ +$("").appendTo(tr); +}else{ +if(_b3=="info"){ +if(_b2==aa.length-1){ +$("
                                                                                          ").appendTo(_b0); +}else{ +$("
                                                                                          ").appendTo(tr); +} +} +} +} +} +} +} +} +} +} +} +} +if(_af.buttons){ +$("
                                                                                          ").appendTo(tr); +if($.isArray(_af.buttons)){ +for(var i=0;i<_af.buttons.length;i++){ +var btn=_af.buttons[i]; +if(btn=="-"){ +$("
                                                                                          ").appendTo(tr); +}else{ +var td=$("").appendTo(tr); +var a=$("").appendTo(td); +a[0].onclick=eval(btn.handler||function(){ +}); +a.linkbutton($.extend({},btn,{plain:true})); +} +} +}else{ +var td=$("").appendTo(tr); +$(_af.buttons).appendTo(td).show(); +} +} +$("
                                                                                          ").appendTo(_b0); +function _b4(_b6){ +var btn=_af.nav[_b6]; +var a=$("").appendTo(tr); +a.wrap(""); +a.linkbutton({iconCls:btn.iconCls,plain:true}).unbind(".pagination").bind("click.pagination",function(){ +btn.handler.call(_ad); +}); +return a; +}; +function _b1(aa,_b7){ +var _b8=$.inArray(_b7,aa); +if(_b8>=0){ +aa.splice(_b8,1); +} +return aa; +}; +}; +function _b9(_ba,_bb){ +var _bc=$.data(_ba,"pagination").options; +_bd(_ba,{pageNumber:_bb}); +_bc.onSelectPage.call(_ba,_bc.pageNumber,_bc.pageSize); +}; +function _bd(_be,_bf){ +var _c0=$.data(_be,"pagination"); +var _c1=_c0.options; +var bb=_c0.bb; +$.extend(_c1,_bf||{}); +var ps=$(_be).find("select.pagination-page-list"); +if(ps.length){ +ps.val(_c1.pageSize+""); +_c1.pageSize=parseInt(ps.val()); +} +var _c2=Math.ceil(_c1.total/_c1.pageSize)||1; +if(_c1.pageNumber<1){ +_c1.pageNumber=1; +} +if(_c1.pageNumber>_c2){ +_c1.pageNumber=_c2; +} +if(_c1.total==0){ +_c1.pageNumber=0; +_c2=0; +} +if(bb.num){ +bb.num.val(_c1.pageNumber); +} +if(bb.after){ +bb.after.html(_c1.afterPageText.replace(/{pages}/,_c2)); +} +var td=$(_be).find("td.pagination-links"); +if(td.length){ +td.empty(); +var _c3=_c1.pageNumber-Math.floor(_c1.links/2); +if(_c3<1){ +_c3=1; +} +var _c4=_c3+_c1.links-1; +if(_c4>_c2){ +_c4=_c2; +} +_c3=_c4-_c1.links+1; +if(_c3<1){ +_c3=1; +} +for(var i=_c3;i<=_c4;i++){ +var a=$("").appendTo(td); +a.linkbutton({plain:true,text:i}); +if(i==_c1.pageNumber){ +a.linkbutton("select"); +}else{ +a.unbind(".pagination").bind("click.pagination",{pageNumber:i},function(e){ +_b9(_be,e.data.pageNumber); +}); +} +} +} +var _c5=_c1.displayMsg; +_c5=_c5.replace(/{from}/,_c1.total==0?0:_c1.pageSize*(_c1.pageNumber-1)+1); +_c5=_c5.replace(/{to}/,Math.min(_c1.pageSize*(_c1.pageNumber),_c1.total)); +_c5=_c5.replace(/{total}/,_c1.total); +$(_be).find("div.pagination-info").html(_c5); +if(bb.first){ +bb.first.linkbutton({disabled:((!_c1.total)||_c1.pageNumber==1)}); +} +if(bb.prev){ +bb.prev.linkbutton({disabled:((!_c1.total)||_c1.pageNumber==1)}); +} +if(bb.next){ +bb.next.linkbutton({disabled:(_c1.pageNumber==_c2)}); +} +if(bb.last){ +bb.last.linkbutton({disabled:(_c1.pageNumber==_c2)}); +} +_c6(_be,_c1.loading); +}; +function _c6(_c7,_c8){ +var _c9=$.data(_c7,"pagination"); +var _ca=_c9.options; +_ca.loading=_c8; +if(_ca.showRefresh&&_c9.bb.refresh){ +_c9.bb.refresh.linkbutton({iconCls:(_ca.loading?"pagination-loading":"pagination-load")}); +} +}; +$.fn.pagination=function(_cb,_cc){ +if(typeof _cb=="string"){ +return $.fn.pagination.methods[_cb](this,_cc); +} +_cb=_cb||{}; +return this.each(function(){ +var _cd; +var _ce=$.data(this,"pagination"); +if(_ce){ +_cd=$.extend(_ce.options,_cb); +}else{ +_cd=$.extend({},$.fn.pagination.defaults,$.fn.pagination.parseOptions(this),_cb); +$.data(this,"pagination",{options:_cd}); +} +_ac(this); +_bd(this); +}); +}; +$.fn.pagination.methods={options:function(jq){ +return $.data(jq[0],"pagination").options; +},loading:function(jq){ +return jq.each(function(){ +_c6(this,true); +}); +},loaded:function(jq){ +return jq.each(function(){ +_c6(this,false); +}); +},refresh:function(jq,_cf){ +return jq.each(function(){ +_bd(this,_cf); +}); +},select:function(jq,_d0){ +return jq.each(function(){ +_b9(this,_d0); +}); +}}; +$.fn.pagination.parseOptions=function(_d1){ +var t=$(_d1); +return $.extend({},$.parser.parseOptions(_d1,[{total:"number",pageSize:"number",pageNumber:"number",links:"number"},{loading:"boolean",showPageList:"boolean",showPageInfo:"boolean",showRefresh:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined)}); +}; +$.fn.pagination.defaults={total:1,pageSize:10,pageNumber:1,pageList:[10,20,30,50],loading:false,buttons:null,showPageList:true,showPageInfo:true,showRefresh:true,links:10,layout:["list","sep","first","prev","sep","manual","sep","next","last","sep","refresh","info"],onSelectPage:function(_d2,_d3){ +},onBeforeRefresh:function(_d4,_d5){ +},onRefresh:function(_d6,_d7){ +},onChangePageSize:function(_d8){ +},beforePageText:"Page",afterPageText:"of {pages}",displayMsg:"Displaying {from} to {to} of {total} items",nav:{first:{iconCls:"pagination-first",handler:function(){ +var _d9=$(this).pagination("options"); +if(_d9.pageNumber>1){ +$(this).pagination("select",1); +} +}},prev:{iconCls:"pagination-prev",handler:function(){ +var _da=$(this).pagination("options"); +if(_da.pageNumber>1){ +$(this).pagination("select",_da.pageNumber-1); +} +}},next:{iconCls:"pagination-next",handler:function(){ +var _db=$(this).pagination("options"); +var _dc=Math.ceil(_db.total/_db.pageSize); +if(_db.pageNumber<_dc){ +$(this).pagination("select",_db.pageNumber+1); +} +}},last:{iconCls:"pagination-last",handler:function(){ +var _dd=$(this).pagination("options"); +var _de=Math.ceil(_dd.total/_dd.pageSize); +if(_dd.pageNumber<_de){ +$(this).pagination("select",_de); +} +}},refresh:{iconCls:"pagination-refresh",handler:function(){ +var _df=$(this).pagination("options"); +if(_df.onBeforeRefresh.call(this,_df.pageNumber,_df.pageSize)!=false){ +$(this).pagination("select",_df.pageNumber); +_df.onRefresh.call(this,_df.pageNumber,_df.pageSize); +} +}}}}; +})(jQuery); +(function($){ +function _e0(_e1){ +var _e2=$(_e1); +_e2.addClass("tree"); +return _e2; +}; +function _e3(_e4){ +var _e5=$.data(_e4,"tree").options; +$(_e4).unbind().bind("mouseover",function(e){ +var tt=$(e.target); +var _e6=tt.closest("div.tree-node"); +if(!_e6.length){ +return; +} +_e6.addClass("tree-node-hover"); +if(tt.hasClass("tree-hit")){ +if(tt.hasClass("tree-expanded")){ +tt.addClass("tree-expanded-hover"); +}else{ +tt.addClass("tree-collapsed-hover"); +} +} +e.stopPropagation(); +}).bind("mouseout",function(e){ +var tt=$(e.target); +var _e7=tt.closest("div.tree-node"); +if(!_e7.length){ +return; +} +_e7.removeClass("tree-node-hover"); +if(tt.hasClass("tree-hit")){ +if(tt.hasClass("tree-expanded")){ +tt.removeClass("tree-expanded-hover"); +}else{ +tt.removeClass("tree-collapsed-hover"); +} +} +e.stopPropagation(); +}).bind("click",function(e){ +var tt=$(e.target); +var _e8=tt.closest("div.tree-node"); +if(!_e8.length){ +return; +} +if(tt.hasClass("tree-hit")){ +_146(_e4,_e8[0]); +return false; +}else{ +if(tt.hasClass("tree-checkbox")){ +_10d(_e4,_e8[0]); +return false; +}else{ +_189(_e4,_e8[0]); +_e5.onClick.call(_e4,_eb(_e4,_e8[0])); +} +} +e.stopPropagation(); +}).bind("dblclick",function(e){ +var _e9=$(e.target).closest("div.tree-node"); +if(!_e9.length){ +return; +} +_189(_e4,_e9[0]); +_e5.onDblClick.call(_e4,_eb(_e4,_e9[0])); +e.stopPropagation(); +}).bind("contextmenu",function(e){ +var _ea=$(e.target).closest("div.tree-node"); +if(!_ea.length){ +return; +} +_e5.onContextMenu.call(_e4,e,_eb(_e4,_ea[0])); +e.stopPropagation(); +}); +}; +function _ec(_ed){ +var _ee=$.data(_ed,"tree").options; +_ee.dnd=false; +var _ef=$(_ed).find("div.tree-node"); +_ef.draggable("disable"); +_ef.css("cursor","pointer"); +}; +function _f0(_f1){ +var _f2=$.data(_f1,"tree"); +var _f3=_f2.options; +var _f4=_f2.tree; +_f2.disabledNodes=[]; +_f3.dnd=true; +_f4.find("div.tree-node").draggable({disabled:false,revert:true,cursor:"pointer",proxy:function(_f5){ +var p=$("
                                                                                          ").appendTo("body"); +p.html(" "+$(_f5).find(".tree-title").html()); +p.hide(); +return p; +},deltaX:15,deltaY:15,onBeforeDrag:function(e){ +if(_f3.onBeforeDrag.call(_f1,_eb(_f1,this))==false){ +return false; +} +if($(e.target).hasClass("tree-hit")||$(e.target).hasClass("tree-checkbox")){ +return false; +} +if(e.which!=1){ +return false; +} +var _f6=$(this).find("span.tree-indent"); +if(_f6.length){ +e.data.offsetWidth-=_f6.length*_f6.width(); +} +},onStartDrag:function(e){ +$(this).next("ul").find("div.tree-node").each(function(){ +$(this).droppable("disable"); +_f2.disabledNodes.push(this); +}); +$(this).draggable("proxy").css({left:-10000,top:-10000}); +_f3.onStartDrag.call(_f1,_eb(_f1,this)); +var _f7=_eb(_f1,this); +if(_f7.id==undefined){ +_f7.id="easyui_tree_node_id_temp"; +_12d(_f1,_f7); +} +_f2.draggingNodeId=_f7.id; +},onDrag:function(e){ +var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY; +var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); +if(d>3){ +$(this).draggable("proxy").show(); +} +this.pageY=e.pageY; +},onStopDrag:function(){ +for(var i=0;i<_f2.disabledNodes.length;i++){ +$(_f2.disabledNodes[i]).droppable("enable"); +} +_f2.disabledNodes=[]; +var _f8=_183(_f1,_f2.draggingNodeId); +if(_f8&&_f8.id=="easyui_tree_node_id_temp"){ +_f8.id=""; +_12d(_f1,_f8); +} +_f3.onStopDrag.call(_f1,_f8); +}}).droppable({accept:"div.tree-node",onDragEnter:function(e,_f9){ +if(_f3.onDragEnter.call(_f1,this,_fa(_f9))==false){ +_fb(_f9,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +$(this).droppable("disable"); +_f2.disabledNodes.push(this); +} +},onDragOver:function(e,_fc){ +if($(this).droppable("options").disabled){ +return; +} +var _fd=_fc.pageY; +var top=$(this).offset().top; +var _fe=top+$(this).outerHeight(); +_fb(_fc,true); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +if(_fd>top+(_fe-top)/2){ +if(_fe-_fd<5){ +$(this).addClass("tree-node-bottom"); +}else{ +$(this).addClass("tree-node-append"); +} +}else{ +if(_fd-top<5){ +$(this).addClass("tree-node-top"); +}else{ +$(this).addClass("tree-node-append"); +} +} +if(_f3.onDragOver.call(_f1,this,_fa(_fc))==false){ +_fb(_fc,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +$(this).droppable("disable"); +_f2.disabledNodes.push(this); +} +},onDragLeave:function(e,_ff){ +_fb(_ff,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +_f3.onDragLeave.call(_f1,this,_fa(_ff)); +},onDrop:function(e,_100){ +var dest=this; +var _101,_102; +if($(this).hasClass("tree-node-append")){ +_101=_103; +_102="append"; +}else{ +_101=_104; +_102=$(this).hasClass("tree-node-top")?"top":"bottom"; +} +if(_f3.onBeforeDrop.call(_f1,dest,_fa(_100),_102)==false){ +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +return; +} +_101(_100,dest,_102); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +}}); +function _fa(_105,pop){ +return $(_105).closest("ul.tree").tree(pop?"pop":"getData",_105); +}; +function _fb(_106,_107){ +var icon=$(_106).draggable("proxy").find("span.tree-dnd-icon"); +icon.removeClass("tree-dnd-yes tree-dnd-no").addClass(_107?"tree-dnd-yes":"tree-dnd-no"); +}; +function _103(_108,dest){ +if(_eb(_f1,dest).state=="closed"){ +_13e(_f1,dest,function(){ +_109(); +}); +}else{ +_109(); +} +function _109(){ +var node=_fa(_108,true); +$(_f1).tree("append",{parent:dest,data:[node]}); +_f3.onDrop.call(_f1,dest,node,"append"); +}; +}; +function _104(_10a,dest,_10b){ +var _10c={}; +if(_10b=="top"){ +_10c.before=dest; +}else{ +_10c.after=dest; +} +var node=_fa(_10a,true); +_10c.data=node; +$(_f1).tree("insert",_10c); +_f3.onDrop.call(_f1,dest,node,_10b); +}; +}; +function _10d(_10e,_10f,_110,_111){ +var _112=$.data(_10e,"tree"); +var opts=_112.options; +if(!opts.checkbox){ +return; +} +var _113=_eb(_10e,_10f); +if(!_113.checkState){ +return; +} +var ck=$(_10f).find(".tree-checkbox"); +if(_110==undefined){ +if(ck.hasClass("tree-checkbox1")){ +_110=false; +}else{ +if(ck.hasClass("tree-checkbox0")){ +_110=true; +}else{ +if(_113._checked==undefined){ +_113._checked=$(_10f).find(".tree-checkbox").hasClass("tree-checkbox1"); +} +_110=!_113._checked; +} +} +} +_113._checked=_110; +if(_110){ +if(ck.hasClass("tree-checkbox1")){ +return; +} +}else{ +if(ck.hasClass("tree-checkbox0")){ +return; +} +} +if(!_111){ +if(opts.onBeforeCheck.call(_10e,_113,_110)==false){ +return; +} +} +if(opts.cascadeCheck){ +_114(_10e,_113,_110); +_115(_10e,_113); +}else{ +_116(_10e,_113,_110?"1":"0"); +} +if(!_111){ +opts.onCheck.call(_10e,_113,_110); +} +}; +function _114(_117,_118,_119){ +var opts=$.data(_117,"tree").options; +var flag=_119?1:0; +_116(_117,_118,flag); +if(opts.deepCheck){ +$.easyui.forEach(_118.children||[],true,function(n){ +_116(_117,n,flag); +}); +}else{ +var _11a=[]; +if(_118.children&&_118.children.length){ +_11a.push(_118); +} +$.easyui.forEach(_118.children||[],true,function(n){ +if(!n.hidden){ +_116(_117,n,flag); +if(n.children&&n.children.length){ +_11a.push(n); +} +} +}); +for(var i=_11a.length-1;i>=0;i--){ +var node=_11a[i]; +_116(_117,node,_11b(node)); +} +} +}; +function _116(_11c,_11d,flag){ +var opts=$.data(_11c,"tree").options; +if(!_11d.checkState||flag==undefined){ +return; +} +if(_11d.hidden&&!opts.deepCheck){ +return; +} +var ck=$("#"+_11d.domId).find(".tree-checkbox"); +_11d.checkState=["unchecked","checked","indeterminate"][flag]; +_11d.checked=(_11d.checkState=="checked"); +ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); +ck.addClass("tree-checkbox"+flag); +}; +function _115(_11e,_11f){ +var pd=_120(_11e,$("#"+_11f.domId)[0]); +if(pd){ +_116(_11e,pd,_11b(pd)); +_115(_11e,pd); +} +}; +function _11b(row){ +var c0=0; +var c1=0; +var len=0; +$.easyui.forEach(row.children||[],false,function(r){ +if(r.checkState){ +len++; +if(r.checkState=="checked"){ +c1++; +}else{ +if(r.checkState=="unchecked"){ +c0++; +} +} +} +}); +if(len==0){ +return undefined; +} +var flag=0; +if(c0==len){ +flag=0; +}else{ +if(c1==len){ +flag=1; +}else{ +flag=2; +} +} +return flag; +}; +function _121(_122,_123){ +var opts=$.data(_122,"tree").options; +if(!opts.checkbox){ +return; +} +var node=$(_123); +var ck=node.find(".tree-checkbox"); +var _124=_eb(_122,_123); +if(opts.view.hasCheckbox(_122,_124)){ +if(!ck.length){ +_124.checkState=_124.checkState||"unchecked"; +$("").insertBefore(node.find(".tree-title")); +} +if(_124.checkState=="checked"){ +_10d(_122,_123,true,true); +}else{ +if(_124.checkState=="unchecked"){ +_10d(_122,_123,false,true); +}else{ +var flag=_11b(_124); +if(flag===0){ +_10d(_122,_123,false,true); +}else{ +if(flag===1){ +_10d(_122,_123,true,true); +} +} +} +} +}else{ +ck.remove(); +_124.checkState=undefined; +_124.checked=undefined; +_115(_122,_124); +} +}; +function _125(_126,ul,data,_127,_128){ +var _129=$.data(_126,"tree"); +var opts=_129.options; +var _12a=$(ul).prevAll("div.tree-node:first"); +data=opts.loadFilter.call(_126,data,_12a[0]); +var _12b=_12c(_126,"domId",_12a.attr("id")); +if(!_127){ +_12b?_12b.children=data:_129.data=data; +$(ul).empty(); +}else{ +if(_12b){ +_12b.children?_12b.children=_12b.children.concat(data):_12b.children=data; +}else{ +_129.data=_129.data.concat(data); +} +} +opts.view.render.call(opts.view,_126,ul,data); +if(opts.dnd){ +_f0(_126); +} +if(_12b){ +_12d(_126,_12b); +} +for(var i=0;i<_129.tmpIds.length;i++){ +_10d(_126,$("#"+_129.tmpIds[i])[0],true,true); +} +_129.tmpIds=[]; +setTimeout(function(){ +_12e(_126,_126); +},0); +if(!_128){ +opts.onLoadSuccess.call(_126,_12b,data); +} +}; +function _12e(_12f,ul,_130){ +var opts=$.data(_12f,"tree").options; +if(opts.lines){ +$(_12f).addClass("tree-lines"); +}else{ +$(_12f).removeClass("tree-lines"); +return; +} +if(!_130){ +_130=true; +$(_12f).find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); +$(_12f).find("div.tree-node").removeClass("tree-node-last tree-root-first tree-root-one"); +var _131=$(_12f).tree("getRoots"); +if(_131.length>1){ +$(_131[0].target).addClass("tree-root-first"); +}else{ +if(_131.length==1){ +$(_131[0].target).addClass("tree-root-one"); +} +} +} +$(ul).children("li").each(function(){ +var node=$(this).children("div.tree-node"); +var ul=node.next("ul"); +if(ul.length){ +if($(this).next().length){ +_132(node); +} +_12e(_12f,ul,_130); +}else{ +_133(node); +} +}); +var _134=$(ul).children("li:last").children("div.tree-node").addClass("tree-node-last"); +_134.children("span.tree-join").removeClass("tree-join").addClass("tree-joinbottom"); +function _133(node,_135){ +var icon=node.find("span.tree-icon"); +icon.prev("span.tree-indent").addClass("tree-join"); +}; +function _132(node){ +var _136=node.find("span.tree-indent, span.tree-hit").length; +node.next().find("div.tree-node").each(function(){ +$(this).children("span:eq("+(_136-1)+")").addClass("tree-line"); +}); +}; +}; +function _137(_138,ul,_139,_13a){ +var opts=$.data(_138,"tree").options; +_139=$.extend({},opts.queryParams,_139||{}); +var _13b=null; +if(_138!=ul){ +var node=$(ul).prev(); +_13b=_eb(_138,node[0]); +} +if(opts.onBeforeLoad.call(_138,_13b,_139)==false){ +return; +} +var _13c=$(ul).prev().children("span.tree-folder"); +_13c.addClass("tree-loading"); +var _13d=opts.loader.call(_138,_139,function(data){ +_13c.removeClass("tree-loading"); +_125(_138,ul,data); +if(_13a){ +_13a(); +} +},function(){ +_13c.removeClass("tree-loading"); +opts.onLoadError.apply(_138,arguments); +if(_13a){ +_13a(); +} +}); +if(_13d==false){ +_13c.removeClass("tree-loading"); +} +}; +function _13e(_13f,_140,_141){ +var opts=$.data(_13f,"tree").options; +var hit=$(_140).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +return; +} +var node=_eb(_13f,_140); +if(opts.onBeforeExpand.call(_13f,node)==false){ +return; +} +hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); +hit.next().addClass("tree-folder-open"); +var ul=$(_140).next(); +if(ul.length){ +if(opts.animate){ +ul.slideDown("normal",function(){ +node.state="open"; +opts.onExpand.call(_13f,node); +if(_141){ +_141(); +} +}); +}else{ +ul.css("display","block"); +node.state="open"; +opts.onExpand.call(_13f,node); +if(_141){ +_141(); +} +} +}else{ +var _142=$("
                                                                                            ").insertAfter(_140); +_137(_13f,_142[0],{id:node.id},function(){ +if(_142.is(":empty")){ +_142.remove(); +} +if(opts.animate){ +_142.slideDown("normal",function(){ +node.state="open"; +opts.onExpand.call(_13f,node); +if(_141){ +_141(); +} +}); +}else{ +_142.css("display","block"); +node.state="open"; +opts.onExpand.call(_13f,node); +if(_141){ +_141(); +} +} +}); +} +}; +function _143(_144,_145){ +var opts=$.data(_144,"tree").options; +var hit=$(_145).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-collapsed")){ +return; +} +var node=_eb(_144,_145); +if(opts.onBeforeCollapse.call(_144,node)==false){ +return; +} +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +hit.next().removeClass("tree-folder-open"); +var ul=$(_145).next(); +if(opts.animate){ +ul.slideUp("normal",function(){ +node.state="closed"; +opts.onCollapse.call(_144,node); +}); +}else{ +ul.css("display","none"); +node.state="closed"; +opts.onCollapse.call(_144,node); +} +}; +function _146(_147,_148){ +var hit=$(_148).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +_143(_147,_148); +}else{ +_13e(_147,_148); +} +}; +function _149(_14a,_14b){ +var _14c=_14d(_14a,_14b); +if(_14b){ +_14c.unshift(_eb(_14a,_14b)); +} +for(var i=0;i<_14c.length;i++){ +_13e(_14a,_14c[i].target); +} +}; +function _14e(_14f,_150){ +var _151=[]; +var p=_120(_14f,_150); +while(p){ +_151.unshift(p); +p=_120(_14f,p.target); +} +for(var i=0;i<_151.length;i++){ +_13e(_14f,_151[i].target); +} +}; +function _152(_153,_154){ +var c=$(_153).parent(); +while(c[0].tagName!="BODY"&&c.css("overflow-y")!="auto"){ +c=c.parent(); +} +var n=$(_154); +var ntop=n.offset().top; +if(c[0].tagName!="BODY"){ +var ctop=c.offset().top; +if(ntopctop+c.outerHeight()-18){ +c.scrollTop(c.scrollTop()+ntop+n.outerHeight()-ctop-c.outerHeight()+18); +} +} +}else{ +c.scrollTop(ntop); +} +}; +function _155(_156,_157){ +var _158=_14d(_156,_157); +if(_157){ +_158.unshift(_eb(_156,_157)); +} +for(var i=0;i<_158.length;i++){ +_143(_156,_158[i].target); +} +}; +function _159(_15a,_15b){ +var node=$(_15b.parent); +var data=_15b.data; +if(!data){ +return; +} +data=$.isArray(data)?data:[data]; +if(!data.length){ +return; +} +var ul; +if(node.length==0){ +ul=$(_15a); +}else{ +if(_15c(_15a,node[0])){ +var _15d=node.find("span.tree-icon"); +_15d.removeClass("tree-file").addClass("tree-folder tree-folder-open"); +var hit=$("").insertBefore(_15d); +if(hit.prev().length){ +hit.prev().remove(); +} +} +ul=node.next(); +if(!ul.length){ +ul=$("
                                                                                              ").insertAfter(node); +} +} +_125(_15a,ul[0],data,true,true); +}; +function _15e(_15f,_160){ +var ref=_160.before||_160.after; +var _161=_120(_15f,ref); +var data=_160.data; +if(!data){ +return; +} +data=$.isArray(data)?data:[data]; +if(!data.length){ +return; +} +_159(_15f,{parent:(_161?_161.target:null),data:data}); +var _162=_161?_161.children:$(_15f).tree("getRoots"); +for(var i=0;i<_162.length;i++){ +if(_162[i].domId==$(ref).attr("id")){ +for(var j=data.length-1;j>=0;j--){ +_162.splice((_160.before?i:(i+1)),0,data[j]); +} +_162.splice(_162.length-data.length,data.length); +break; +} +} +var li=$(); +for(var i=0;i").prependTo(node); +node.next().remove(); +} +_12d(_164,_166); +} +_12e(_164,_164); +function del(_167){ +var id=$(_167).attr("id"); +var _168=_120(_164,_167); +var cc=_168?_168.children:$.data(_164,"tree").data; +for(var i=0;i").appendTo(nt); +_192.val(node.text).focus(); +_192.width(_191+20); +_192._outerHeight(opts.editorHeight); +_192.bind("click",function(e){ +return false; +}).bind("mousedown",function(e){ +e.stopPropagation(); +}).bind("mousemove",function(e){ +e.stopPropagation(); +}).bind("keydown",function(e){ +if(e.keyCode==13){ +_193(_18f,_190); +return false; +}else{ +if(e.keyCode==27){ +_197(_18f,_190); +return false; +} +} +}).bind("blur",function(e){ +e.stopPropagation(); +_193(_18f,_190); +}); +}; +function _193(_194,_195){ +var opts=$.data(_194,"tree").options; +$(_195).css("position",""); +var _196=$(_195).find("input.tree-editor"); +var val=_196.val(); +_196.remove(); +var node=_eb(_194,_195); +node.text=val; +_12d(_194,node); +opts.onAfterEdit.call(_194,node); +}; +function _197(_198,_199){ +var opts=$.data(_198,"tree").options; +$(_199).css("position",""); +$(_199).find("input.tree-editor").remove(); +var node=_eb(_198,_199); +_12d(_198,node); +opts.onCancelEdit.call(_198,node); +}; +function _19a(_19b,q){ +var _19c=$.data(_19b,"tree"); +var opts=_19c.options; +var ids={}; +$.easyui.forEach(_19c.data,true,function(node){ +if(opts.filter.call(_19b,q,node)){ +$("#"+node.domId).removeClass("tree-node-hidden"); +ids[node.domId]=1; +node.hidden=false; +}else{ +$("#"+node.domId).addClass("tree-node-hidden"); +node.hidden=true; +} +}); +for(var id in ids){ +_19d(id); +} +function _19d(_19e){ +var p=$(_19b).tree("getParent",$("#"+_19e)[0]); +while(p){ +$(p.target).removeClass("tree-node-hidden"); +p.hidden=false; +p=$(_19b).tree("getParent",p.target); +} +}; +}; +$.fn.tree=function(_19f,_1a0){ +if(typeof _19f=="string"){ +return $.fn.tree.methods[_19f](this,_1a0); +} +var _19f=_19f||{}; +return this.each(function(){ +var _1a1=$.data(this,"tree"); +var opts; +if(_1a1){ +opts=$.extend(_1a1.options,_19f); +_1a1.options=opts; +}else{ +opts=$.extend({},$.fn.tree.defaults,$.fn.tree.parseOptions(this),_19f); +$.data(this,"tree",{options:opts,tree:_e0(this),data:[],tmpIds:[]}); +var data=$.fn.tree.parseData(this); +if(data.length){ +_125(this,this,data); +} +} +_e3(this); +if(opts.data){ +_125(this,this,$.extend(true,[],opts.data)); +} +_137(this,this); +}); +}; +$.fn.tree.methods={options:function(jq){ +return $.data(jq[0],"tree").options; +},loadData:function(jq,data){ +return jq.each(function(){ +_125(this,this,data); +}); +},getNode:function(jq,_1a2){ +return _eb(jq[0],_1a2); +},getData:function(jq,_1a3){ +return _17e(jq[0],_1a3); +},reload:function(jq,_1a4){ +return jq.each(function(){ +if(_1a4){ +var node=$(_1a4); +var hit=node.children("span.tree-hit"); +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +node.next().remove(); +_13e(this,_1a4); +}else{ +$(this).empty(); +_137(this,this); +} +}); +},getRoot:function(jq,_1a5){ +return _16b(jq[0],_1a5); +},getRoots:function(jq){ +return _16f(jq[0]); +},getParent:function(jq,_1a6){ +return _120(jq[0],_1a6); +},getChildren:function(jq,_1a7){ +return _14d(jq[0],_1a7); +},getChecked:function(jq,_1a8){ +return _178(jq[0],_1a8); +},getSelected:function(jq){ +return _17c(jq[0]); +},isLeaf:function(jq,_1a9){ +return _15c(jq[0],_1a9); +},find:function(jq,id){ +return _183(jq[0],id); +},select:function(jq,_1aa){ +return jq.each(function(){ +_189(this,_1aa); +}); +},check:function(jq,_1ab){ +return jq.each(function(){ +_10d(this,_1ab,true); +}); +},uncheck:function(jq,_1ac){ +return jq.each(function(){ +_10d(this,_1ac,false); +}); +},collapse:function(jq,_1ad){ +return jq.each(function(){ +_143(this,_1ad); +}); +},expand:function(jq,_1ae){ +return jq.each(function(){ +_13e(this,_1ae); +}); +},collapseAll:function(jq,_1af){ +return jq.each(function(){ +_155(this,_1af); +}); +},expandAll:function(jq,_1b0){ +return jq.each(function(){ +_149(this,_1b0); +}); +},expandTo:function(jq,_1b1){ +return jq.each(function(){ +_14e(this,_1b1); +}); +},scrollTo:function(jq,_1b2){ +return jq.each(function(){ +_152(this,_1b2); +}); +},toggle:function(jq,_1b3){ +return jq.each(function(){ +_146(this,_1b3); +}); +},append:function(jq,_1b4){ +return jq.each(function(){ +_159(this,_1b4); +}); +},insert:function(jq,_1b5){ +return jq.each(function(){ +_15e(this,_1b5); +}); +},remove:function(jq,_1b6){ +return jq.each(function(){ +_163(this,_1b6); +}); +},pop:function(jq,_1b7){ +var node=jq.tree("getData",_1b7); +jq.tree("remove",_1b7); +return node; +},update:function(jq,_1b8){ +return jq.each(function(){ +_12d(this,$.extend({},_1b8,{checkState:_1b8.checked?"checked":(_1b8.checked===false?"unchecked":undefined)})); +}); +},enableDnd:function(jq){ +return jq.each(function(){ +_f0(this); +}); +},disableDnd:function(jq){ +return jq.each(function(){ +_ec(this); +}); +},beginEdit:function(jq,_1b9){ +return jq.each(function(){ +_18e(this,_1b9); +}); +},endEdit:function(jq,_1ba){ +return jq.each(function(){ +_193(this,_1ba); +}); +},cancelEdit:function(jq,_1bb){ +return jq.each(function(){ +_197(this,_1bb); +}); +},doFilter:function(jq,q){ +return jq.each(function(){ +_19a(this,q); +}); +}}; +$.fn.tree.parseOptions=function(_1bc){ +var t=$(_1bc); +return $.extend({},$.parser.parseOptions(_1bc,["url","method",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean",lines:"boolean",dnd:"boolean"}])); +}; +$.fn.tree.parseData=function(_1bd){ +var data=[]; +_1be(data,$(_1bd)); +return data; +function _1be(aa,tree){ +tree.children("li").each(function(){ +var node=$(this); +var item=$.extend({},$.parser.parseOptions(this,["id","iconCls","state"]),{checked:(node.attr("checked")?true:undefined)}); +item.text=node.children("span").html(); +if(!item.text){ +item.text=node.html(); +} +var _1bf=node.children("ul"); +if(_1bf.length){ +item.children=[]; +_1be(item.children,_1bf); +} +aa.push(item); +}); +}; +}; +var _1c0=1; +var _1c1={render:function(_1c2,ul,data){ +var _1c3=$.data(_1c2,"tree"); +var opts=_1c3.options; +var _1c4=$(ul).prev(".tree-node"); +var _1c5=_1c4.length?$(_1c2).tree("getNode",_1c4[0]):null; +var _1c6=_1c4.find("span.tree-indent, span.tree-hit").length; +var cc=_1c7.call(this,_1c6,data); +$(ul).append(cc.join("")); +function _1c7(_1c8,_1c9){ +var cc=[]; +for(var i=0;i<_1c9.length;i++){ +var item=_1c9[i]; +if(item.state!="open"&&item.state!="closed"){ +item.state="open"; +} +item.domId="_easyui_tree_"+_1c0++; +cc.push("
                                                                                            • "); +cc.push("
                                                                                              "); +for(var j=0;j<_1c8;j++){ +cc.push(""); +} +if(item.state=="closed"){ +cc.push(""); +cc.push(""); +}else{ +if(item.children&&item.children.length){ +cc.push(""); +cc.push(""); +}else{ +cc.push(""); +cc.push(""); +} +} +if(this.hasCheckbox(_1c2,item)){ +var flag=0; +if(_1c5&&_1c5.checkState=="checked"&&opts.cascadeCheck){ +flag=1; +item.checked=true; +}else{ +if(item.checked){ +$.easyui.addArrayItem(_1c3.tmpIds,item.domId); +} +} +item.checkState=flag?"checked":"unchecked"; +cc.push(""); +}else{ +item.checkState=undefined; +item.checked=undefined; +} +cc.push(""+opts.formatter.call(_1c2,item)+""); +cc.push("
                                                                                              "); +if(item.children&&item.children.length){ +var tmp=_1c7.call(this,_1c8+1,item.children); +cc.push("
                                                                                                "); +cc=cc.concat(tmp); +cc.push("
                                                                                              "); +} +cc.push("
                                                                                            • "); +} +return cc; +}; +},hasCheckbox:function(_1ca,item){ +var _1cb=$.data(_1ca,"tree"); +var opts=_1cb.options; +if(opts.checkbox){ +if($.isFunction(opts.checkbox)){ +if(opts.checkbox.call(_1ca,item)){ +return true; +}else{ +return false; +} +}else{ +if(opts.onlyLeafCheck){ +if(item.state=="open"&&!(item.children&&item.children.length)){ +return true; +} +}else{ +return true; +} +} +} +return false; +}}; +$.fn.tree.defaults={url:null,method:"post",animate:false,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,dnd:false,editorHeight:26,data:null,queryParams:{},formatter:function(node){ +return node.text; +},filter:function(q,node){ +var qq=[]; +$.map($.isArray(q)?q:[q],function(q){ +q=$.trim(q); +if(q){ +qq.push(q); +} +}); +for(var i=0;i=0){ +return true; +} +} +return !qq.length; +},loader:function(_1cd,_1ce,_1cf){ +var opts=$(this).tree("options"); +if(!opts.url){ +return false; +} +$.ajax({type:opts.method,url:opts.url,data:_1cd,dataType:"json",success:function(data){ +_1ce(data); +},error:function(){ +_1cf.apply(this,arguments); +}}); +},loadFilter:function(data,_1d0){ +return data; +},view:_1c1,onBeforeLoad:function(node,_1d1){ +},onLoadSuccess:function(node,data){ +},onLoadError:function(){ +},onClick:function(node){ +},onDblClick:function(node){ +},onBeforeExpand:function(node){ +},onExpand:function(node){ +},onBeforeCollapse:function(node){ +},onCollapse:function(node){ +},onBeforeCheck:function(node,_1d2){ +},onCheck:function(node,_1d3){ +},onBeforeSelect:function(node){ +},onSelect:function(node){ +},onContextMenu:function(e,node){ +},onBeforeDrag:function(node){ +},onStartDrag:function(node){ +},onStopDrag:function(node){ +},onDragEnter:function(_1d4,_1d5){ +},onDragOver:function(_1d6,_1d7){ +},onDragLeave:function(_1d8,_1d9){ +},onBeforeDrop:function(_1da,_1db,_1dc){ +},onDrop:function(_1dd,_1de,_1df){ +},onBeforeEdit:function(node){ +},onAfterEdit:function(node){ +},onCancelEdit:function(node){ +}}; +})(jQuery); +(function($){ +function init(_1e0){ +$(_1e0).addClass("progressbar"); +$(_1e0).html("
                                                                                              "); +$(_1e0).bind("_resize",function(e,_1e1){ +if($(this).hasClass("easyui-fluid")||_1e1){ +_1e2(_1e0); +} +return false; +}); +return $(_1e0); +}; +function _1e2(_1e3,_1e4){ +var opts=$.data(_1e3,"progressbar").options; +var bar=$.data(_1e3,"progressbar").bar; +if(_1e4){ +opts.width=_1e4; +} +bar._size(opts); +bar.find("div.progressbar-text").css("width",bar.width()); +bar.find("div.progressbar-text,div.progressbar-value").css({height:bar.height()+"px",lineHeight:bar.height()+"px"}); +}; +$.fn.progressbar=function(_1e5,_1e6){ +if(typeof _1e5=="string"){ +var _1e7=$.fn.progressbar.methods[_1e5]; +if(_1e7){ +return _1e7(this,_1e6); +} +} +_1e5=_1e5||{}; +return this.each(function(){ +var _1e8=$.data(this,"progressbar"); +if(_1e8){ +$.extend(_1e8.options,_1e5); +}else{ +_1e8=$.data(this,"progressbar",{options:$.extend({},$.fn.progressbar.defaults,$.fn.progressbar.parseOptions(this),_1e5),bar:init(this)}); +} +$(this).progressbar("setValue",_1e8.options.value); +_1e2(this); +}); +}; +$.fn.progressbar.methods={options:function(jq){ +return $.data(jq[0],"progressbar").options; +},resize:function(jq,_1e9){ +return jq.each(function(){ +_1e2(this,_1e9); +}); +},getValue:function(jq){ +return $.data(jq[0],"progressbar").options.value; +},setValue:function(jq,_1ea){ +if(_1ea<0){ +_1ea=0; +} +if(_1ea>100){ +_1ea=100; +} +return jq.each(function(){ +var opts=$.data(this,"progressbar").options; +var text=opts.text.replace(/{value}/,_1ea); +var _1eb=opts.value; +opts.value=_1ea; +$(this).find("div.progressbar-value").width(_1ea+"%"); +$(this).find("div.progressbar-text").html(text); +if(_1eb!=_1ea){ +opts.onChange.call(this,_1ea,_1eb); +} +}); +}}; +$.fn.progressbar.parseOptions=function(_1ec){ +return $.extend({},$.parser.parseOptions(_1ec,["width","height","text",{value:"number"}])); +}; +$.fn.progressbar.defaults={width:"auto",height:22,value:0,text:"{value}%",onChange:function(_1ed,_1ee){ +}}; +})(jQuery); +(function($){ +function init(_1ef){ +$(_1ef).addClass("tooltip-f"); +}; +function _1f0(_1f1){ +var opts=$.data(_1f1,"tooltip").options; +$(_1f1).unbind(".tooltip").bind(opts.showEvent+".tooltip",function(e){ +$(_1f1).tooltip("show",e); +}).bind(opts.hideEvent+".tooltip",function(e){ +$(_1f1).tooltip("hide",e); +}).bind("mousemove.tooltip",function(e){ +if(opts.trackMouse){ +opts.trackMouseX=e.pageX; +opts.trackMouseY=e.pageY; +$(_1f1).tooltip("reposition"); +} +}); +}; +function _1f2(_1f3){ +var _1f4=$.data(_1f3,"tooltip"); +if(_1f4.showTimer){ +clearTimeout(_1f4.showTimer); +_1f4.showTimer=null; +} +if(_1f4.hideTimer){ +clearTimeout(_1f4.hideTimer); +_1f4.hideTimer=null; +} +}; +function _1f5(_1f6){ +var _1f7=$.data(_1f6,"tooltip"); +if(!_1f7||!_1f7.tip){ +return; +} +var opts=_1f7.options; +var tip=_1f7.tip; +var pos={left:-100000,top:-100000}; +if($(_1f6).is(":visible")){ +pos=_1f8(opts.position); +if(opts.position=="top"&&pos.top<0){ +pos=_1f8("bottom"); +}else{ +if((opts.position=="bottom")&&(pos.top+tip._outerHeight()>$(window)._outerHeight()+$(document).scrollTop())){ +pos=_1f8("top"); +} +} +if(pos.left<0){ +if(opts.position=="left"){ +pos=_1f8("right"); +}else{ +$(_1f6).tooltip("arrow").css("left",tip._outerWidth()/2+pos.left); +pos.left=0; +} +}else{ +if(pos.left+tip._outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ +if(opts.position=="right"){ +pos=_1f8("left"); +}else{ +var left=pos.left; +pos.left=$(window)._outerWidth()+$(document)._scrollLeft()-tip._outerWidth(); +$(_1f6).tooltip("arrow").css("left",tip._outerWidth()/2-(pos.left-left)); +} +} +} +} +tip.css({left:pos.left,top:pos.top,zIndex:(opts.zIndex!=undefined?opts.zIndex:($.fn.window?$.fn.window.defaults.zIndex++:""))}); +opts.onPosition.call(_1f6,pos.left,pos.top); +function _1f8(_1f9){ +opts.position=_1f9||"bottom"; +tip.removeClass("tooltip-top tooltip-bottom tooltip-left tooltip-right").addClass("tooltip-"+opts.position); +var left,top; +var _1fa=$.isFunction(opts.deltaX)?opts.deltaX.call(_1f6,opts.position):opts.deltaX; +var _1fb=$.isFunction(opts.deltaY)?opts.deltaY.call(_1f6,opts.position):opts.deltaY; +if(opts.trackMouse){ +t=$(); +left=opts.trackMouseX+_1fa; +top=opts.trackMouseY+_1fb; +}else{ +var t=$(_1f6); +left=t.offset().left+_1fa; +top=t.offset().top+_1fb; +} +switch(opts.position){ +case "right": +left+=t._outerWidth()+12+(opts.trackMouse?12:0); +if(opts.valign=="middle"){ +top-=(tip._outerHeight()-t._outerHeight())/2; +} +break; +case "left": +left-=tip._outerWidth()+12+(opts.trackMouse?12:0); +if(opts.valign=="middle"){ +top-=(tip._outerHeight()-t._outerHeight())/2; +} +break; +case "top": +left-=(tip._outerWidth()-t._outerWidth())/2; +top-=tip._outerHeight()+12+(opts.trackMouse?12:0); +break; +case "bottom": +left-=(tip._outerWidth()-t._outerWidth())/2; +top+=t._outerHeight()+12+(opts.trackMouse?12:0); +break; +} +return {left:left,top:top}; +}; +}; +function _1fc(_1fd,e){ +var _1fe=$.data(_1fd,"tooltip"); +var opts=_1fe.options; +var tip=_1fe.tip; +if(!tip){ +tip=$("
                                                                                              "+"
                                                                                              "+"
                                                                                              "+"
                                                                                              "+"
                                                                                              ").appendTo("body"); +_1fe.tip=tip; +_1ff(_1fd); +} +_1f2(_1fd); +_1fe.showTimer=setTimeout(function(){ +$(_1fd).tooltip("reposition"); +tip.show(); +opts.onShow.call(_1fd,e); +var _200=tip.children(".tooltip-arrow-outer"); +var _201=tip.children(".tooltip-arrow"); +var bc="border-"+opts.position+"-color"; +_200.add(_201).css({borderTopColor:"",borderBottomColor:"",borderLeftColor:"",borderRightColor:""}); +_200.css(bc,tip.css(bc)); +_201.css(bc,tip.css("backgroundColor")); +},opts.showDelay); +}; +function _202(_203,e){ +var _204=$.data(_203,"tooltip"); +if(_204&&_204.tip){ +_1f2(_203); +_204.hideTimer=setTimeout(function(){ +_204.tip.hide(); +_204.options.onHide.call(_203,e); +},_204.options.hideDelay); +} +}; +function _1ff(_205,_206){ +var _207=$.data(_205,"tooltip"); +var opts=_207.options; +if(_206){ +opts.content=_206; +} +if(!_207.tip){ +return; +} +var cc=typeof opts.content=="function"?opts.content.call(_205):opts.content; +_207.tip.children(".tooltip-content").html(cc); +opts.onUpdate.call(_205,cc); +}; +function _208(_209){ +var _20a=$.data(_209,"tooltip"); +if(_20a){ +_1f2(_209); +var opts=_20a.options; +if(_20a.tip){ +_20a.tip.remove(); +} +if(opts._title){ +$(_209).attr("title",opts._title); +} +$.removeData(_209,"tooltip"); +$(_209).unbind(".tooltip").removeClass("tooltip-f"); +opts.onDestroy.call(_209); +} +}; +$.fn.tooltip=function(_20b,_20c){ +if(typeof _20b=="string"){ +return $.fn.tooltip.methods[_20b](this,_20c); +} +_20b=_20b||{}; +return this.each(function(){ +var _20d=$.data(this,"tooltip"); +if(_20d){ +$.extend(_20d.options,_20b); +}else{ +$.data(this,"tooltip",{options:$.extend({},$.fn.tooltip.defaults,$.fn.tooltip.parseOptions(this),_20b)}); +init(this); +} +_1f0(this); +_1ff(this); +}); +}; +$.fn.tooltip.methods={options:function(jq){ +return $.data(jq[0],"tooltip").options; +},tip:function(jq){ +return $.data(jq[0],"tooltip").tip; +},arrow:function(jq){ +return jq.tooltip("tip").children(".tooltip-arrow-outer,.tooltip-arrow"); +},show:function(jq,e){ +return jq.each(function(){ +_1fc(this,e); +}); +},hide:function(jq,e){ +return jq.each(function(){ +_202(this,e); +}); +},update:function(jq,_20e){ +return jq.each(function(){ +_1ff(this,_20e); +}); +},reposition:function(jq){ +return jq.each(function(){ +_1f5(this); +}); +},destroy:function(jq){ +return jq.each(function(){ +_208(this); +}); +}}; +$.fn.tooltip.parseOptions=function(_20f){ +var t=$(_20f); +var opts=$.extend({},$.parser.parseOptions(_20f,["position","showEvent","hideEvent","content",{trackMouse:"boolean",deltaX:"number",deltaY:"number",showDelay:"number",hideDelay:"number"}]),{_title:t.attr("title")}); +t.attr("title",""); +if(!opts.content){ +opts.content=opts._title; +} +return opts; +}; +$.fn.tooltip.defaults={position:"bottom",valign:"middle",content:null,trackMouse:false,deltaX:0,deltaY:0,showEvent:"mouseenter",hideEvent:"mouseleave",showDelay:200,hideDelay:100,onShow:function(e){ +},onHide:function(e){ +},onUpdate:function(_210){ +},onPosition:function(left,top){ +},onDestroy:function(){ +}}; +})(jQuery); +(function($){ +$.fn._remove=function(){ +return this.each(function(){ +$(this).remove(); +try{ +this.outerHTML=""; +} +catch(err){ +} +}); +}; +function _211(node){ +node._remove(); +}; +function _212(_213,_214){ +var _215=$.data(_213,"panel"); +var opts=_215.options; +var _216=_215.panel; +var _217=_216.children(".panel-header"); +var _218=_216.children(".panel-body"); +var _219=_216.children(".panel-footer"); +var _21a=(opts.halign=="left"||opts.halign=="right"); +if(_214){ +$.extend(opts,{width:_214.width,height:_214.height,minWidth:_214.minWidth,maxWidth:_214.maxWidth,minHeight:_214.minHeight,maxHeight:_214.maxHeight,left:_214.left,top:_214.top}); +opts.hasResized=false; +} +var _21b=_216.outerWidth(); +var _21c=_216.outerHeight(); +_216._size(opts); +var _21d=_216.outerWidth(); +var _21e=_216.outerHeight(); +if(opts.hasResized&&(_21b==_21d&&_21c==_21e)){ +return; +} +opts.hasResized=true; +if(!_21a){ +_217._outerWidth(_216.width()); +} +_218._outerWidth(_216.width()); +if(!isNaN(parseInt(opts.height))){ +if(_21a){ +if(opts.header){ +var _21f=$(opts.header)._outerWidth(); +}else{ +_217.css("width",""); +var _21f=_217._outerWidth(); +} +var _220=_217.find(".panel-title"); +_21f+=Math.min(_220._outerWidth(),_220._outerHeight()); +var _221=_216.height(); +_217._outerWidth(_21f)._outerHeight(_221); +_220._outerWidth(_217.height()); +_218._outerWidth(_216.width()-_21f-_219._outerWidth())._outerHeight(_221); +_219._outerHeight(_221); +_218.css({left:"",right:""}).css(opts.halign,(_217.position()[opts.halign]+_21f)+"px"); +opts.panelCssWidth=_216.css("width"); +if(opts.collapsed){ +_216._outerWidth(_21f+_219._outerWidth()); +} +}else{ +_218._outerHeight(_216.height()-_217._outerHeight()-_219._outerHeight()); +} +}else{ +_218.css("height",""); +var min=$.parser.parseValue("minHeight",opts.minHeight,_216.parent()); +var max=$.parser.parseValue("maxHeight",opts.maxHeight,_216.parent()); +var _222=_217._outerHeight()+_219._outerHeight()+_216._outerHeight()-_216.height(); +_218._size("minHeight",min?(min-_222):""); +_218._size("maxHeight",max?(max-_222):""); +} +_216.css({height:(_21a?undefined:""),minHeight:"",maxHeight:"",left:opts.left,top:opts.top}); +opts.onResize.apply(_213,[opts.width,opts.height]); +$(_213).panel("doLayout"); +}; +function _223(_224,_225){ +var _226=$.data(_224,"panel"); +var opts=_226.options; +var _227=_226.panel; +if(_225){ +if(_225.left!=null){ +opts.left=_225.left; +} +if(_225.top!=null){ +opts.top=_225.top; +} +} +_227.css({left:opts.left,top:opts.top}); +_227.find(".tooltip-f").each(function(){ +$(this).tooltip("reposition"); +}); +opts.onMove.apply(_224,[opts.left,opts.top]); +}; +function _228(_229){ +$(_229).addClass("panel-body")._size("clear"); +var _22a=$("
                                                                                              ").insertBefore(_229); +_22a[0].appendChild(_229); +_22a.bind("_resize",function(e,_22b){ +if($(this).hasClass("easyui-fluid")||_22b){ +_212(_229,{}); +} +return false; +}); +return _22a; +}; +function _22c(_22d){ +var _22e=$.data(_22d,"panel"); +var opts=_22e.options; +var _22f=_22e.panel; +_22f.css(opts.style); +_22f.addClass(opts.cls); +_22f.removeClass("panel-hleft panel-hright").addClass("panel-h"+opts.halign); +_230(); +_231(); +var _232=$(_22d).panel("header"); +var body=$(_22d).panel("body"); +var _233=$(_22d).siblings(".panel-footer"); +if(opts.border){ +_232.removeClass("panel-header-noborder"); +body.removeClass("panel-body-noborder"); +_233.removeClass("panel-footer-noborder"); +}else{ +_232.addClass("panel-header-noborder"); +body.addClass("panel-body-noborder"); +_233.addClass("panel-footer-noborder"); +} +_232.addClass(opts.headerCls); +body.addClass(opts.bodyCls); +$(_22d).attr("id",opts.id||""); +if(opts.content){ +$(_22d).panel("clear"); +$(_22d).html(opts.content); +$.parser.parse($(_22d)); +} +function _230(){ +if(opts.noheader||(!opts.title&&!opts.header)){ +_211(_22f.children(".panel-header")); +_22f.children(".panel-body").addClass("panel-body-noheader"); +}else{ +if(opts.header){ +$(opts.header).addClass("panel-header").prependTo(_22f); +}else{ +var _234=_22f.children(".panel-header"); +if(!_234.length){ +_234=$("
                                                                                              ").prependTo(_22f); +} +if(!$.isArray(opts.tools)){ +_234.find("div.panel-tool .panel-tool-a").appendTo(opts.tools); +} +_234.empty(); +var _235=$("
                                                                                              ").html(opts.title).appendTo(_234); +if(opts.iconCls){ +_235.addClass("panel-with-icon"); +$("
                                                                                              ").addClass(opts.iconCls).appendTo(_234); +} +if(opts.halign=="left"||opts.halign=="right"){ +_235.addClass("panel-title-"+opts.titleDirection); +} +var tool=$("
                                                                                              ").appendTo(_234); +tool.bind("click",function(e){ +e.stopPropagation(); +}); +if(opts.tools){ +if($.isArray(opts.tools)){ +$.map(opts.tools,function(t){ +_236(tool,t.iconCls,eval(t.handler)); +}); +}else{ +$(opts.tools).children().each(function(){ +$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(tool); +}); +} +} +if(opts.collapsible){ +_236(tool,"panel-tool-collapse",function(){ +if(opts.collapsed==true){ +_257(_22d,true); +}else{ +_248(_22d,true); +} +}); +} +if(opts.minimizable){ +_236(tool,"panel-tool-min",function(){ +_25d(_22d); +}); +} +if(opts.maximizable){ +_236(tool,"panel-tool-max",function(){ +if(opts.maximized==true){ +_260(_22d); +}else{ +_247(_22d); +} +}); +} +if(opts.closable){ +_236(tool,"panel-tool-close",function(){ +_249(_22d); +}); +} +} +_22f.children("div.panel-body").removeClass("panel-body-noheader"); +} +}; +function _236(c,icon,_237){ +var a=$("").addClass(icon).appendTo(c); +a.bind("click",_237); +}; +function _231(){ +if(opts.footer){ +$(opts.footer).addClass("panel-footer").appendTo(_22f); +$(_22d).addClass("panel-body-nobottom"); +}else{ +_22f.children(".panel-footer").remove(); +$(_22d).removeClass("panel-body-nobottom"); +} +}; +}; +function _238(_239,_23a){ +var _23b=$.data(_239,"panel"); +var opts=_23b.options; +if(_23c){ +opts.queryParams=_23a; +} +if(!opts.href){ +return; +} +if(!_23b.isLoaded||!opts.cache){ +var _23c=$.extend({},opts.queryParams); +if(opts.onBeforeLoad.call(_239,_23c)==false){ +return; +} +_23b.isLoaded=false; +if(opts.loadingMessage){ +$(_239).panel("clear"); +$(_239).html($("
                                                                                              ").html(opts.loadingMessage)); +} +opts.loader.call(_239,_23c,function(data){ +var _23d=opts.extractor.call(_239,data); +$(_239).panel("clear"); +$(_239).html(_23d); +$.parser.parse($(_239)); +opts.onLoad.apply(_239,arguments); +_23b.isLoaded=true; +},function(){ +opts.onLoadError.apply(_239,arguments); +}); +} +}; +function _23e(_23f){ +var t=$(_23f); +t.find(".combo-f").each(function(){ +$(this).combo("destroy"); +}); +t.find(".m-btn").each(function(){ +$(this).menubutton("destroy"); +}); +t.find(".s-btn").each(function(){ +$(this).splitbutton("destroy"); +}); +t.find(".tooltip-f").each(function(){ +$(this).tooltip("destroy"); +}); +t.children("div").each(function(){ +$(this)._size("unfit"); +}); +t.empty(); +}; +function _240(_241){ +$(_241).panel("doLayout",true); +}; +function _242(_243,_244){ +var _245=$.data(_243,"panel"); +var opts=_245.options; +var _246=_245.panel; +if(_244!=true){ +if(opts.onBeforeOpen.call(_243)==false){ +return; +} +} +_246.stop(true,true); +if($.isFunction(opts.openAnimation)){ +opts.openAnimation.call(_243,cb); +}else{ +switch(opts.openAnimation){ +case "slide": +_246.slideDown(opts.openDuration,cb); +break; +case "fade": +_246.fadeIn(opts.openDuration,cb); +break; +case "show": +_246.show(opts.openDuration,cb); +break; +default: +_246.show(); +cb(); +} +} +function cb(){ +opts.closed=false; +opts.minimized=false; +var tool=_246.children(".panel-header").find("a.panel-tool-restore"); +if(tool.length){ +opts.maximized=true; +} +opts.onOpen.call(_243); +if(opts.maximized==true){ +opts.maximized=false; +_247(_243); +} +if(opts.collapsed==true){ +opts.collapsed=false; +_248(_243); +} +if(!opts.collapsed){ +if(opts.href&&(!_245.isLoaded||!opts.cache)){ +_238(_243); +_240(_243); +opts.doneLayout=true; +} +} +if(!opts.doneLayout){ +opts.doneLayout=true; +_240(_243); +} +}; +}; +function _249(_24a,_24b){ +var _24c=$.data(_24a,"panel"); +var opts=_24c.options; +var _24d=_24c.panel; +if(_24b!=true){ +if(opts.onBeforeClose.call(_24a)==false){ +return; +} +} +_24d.find(".tooltip-f").each(function(){ +$(this).tooltip("hide"); +}); +_24d.stop(true,true); +_24d._size("unfit"); +if($.isFunction(opts.closeAnimation)){ +opts.closeAnimation.call(_24a,cb); +}else{ +switch(opts.closeAnimation){ +case "slide": +_24d.slideUp(opts.closeDuration,cb); +break; +case "fade": +_24d.fadeOut(opts.closeDuration,cb); +break; +case "hide": +_24d.hide(opts.closeDuration,cb); +break; +default: +_24d.hide(); +cb(); +} +} +function cb(){ +opts.closed=true; +opts.onClose.call(_24a); +}; +}; +function _24e(_24f,_250){ +var _251=$.data(_24f,"panel"); +var opts=_251.options; +var _252=_251.panel; +if(_250!=true){ +if(opts.onBeforeDestroy.call(_24f)==false){ +return; +} +} +$(_24f).panel("clear").panel("clear","footer"); +_211(_252); +opts.onDestroy.call(_24f); +}; +function _248(_253,_254){ +var opts=$.data(_253,"panel").options; +var _255=$.data(_253,"panel").panel; +var body=_255.children(".panel-body"); +var _256=_255.children(".panel-header"); +var tool=_256.find("a.panel-tool-collapse"); +if(opts.collapsed==true){ +return; +} +body.stop(true,true); +if(opts.onBeforeCollapse.call(_253)==false){ +return; +} +tool.addClass("panel-tool-expand"); +if(_254==true){ +if(opts.halign=="left"||opts.halign=="right"){ +_255.animate({width:_256._outerWidth()+_255.children(".panel-footer")._outerWidth()},function(){ +cb(); +}); +}else{ +body.slideUp("normal",function(){ +cb(); +}); +} +}else{ +if(opts.halign=="left"||opts.halign=="right"){ +_255._outerWidth(_256._outerWidth()+_255.children(".panel-footer")._outerWidth()); +} +cb(); +} +function cb(){ +body.hide(); +opts.collapsed=true; +opts.onCollapse.call(_253); +}; +}; +function _257(_258,_259){ +var opts=$.data(_258,"panel").options; +var _25a=$.data(_258,"panel").panel; +var body=_25a.children(".panel-body"); +var tool=_25a.children(".panel-header").find("a.panel-tool-collapse"); +if(opts.collapsed==false){ +return; +} +body.stop(true,true); +if(opts.onBeforeExpand.call(_258)==false){ +return; +} +tool.removeClass("panel-tool-expand"); +if(_259==true){ +if(opts.halign=="left"||opts.halign=="right"){ +body.show(); +_25a.animate({width:opts.panelCssWidth},function(){ +cb(); +}); +}else{ +body.slideDown("normal",function(){ +cb(); +}); +} +}else{ +if(opts.halign=="left"||opts.halign=="right"){ +_25a.css("width",opts.panelCssWidth); +} +cb(); +} +function cb(){ +body.show(); +opts.collapsed=false; +opts.onExpand.call(_258); +_238(_258); +_240(_258); +}; +}; +function _247(_25b){ +var opts=$.data(_25b,"panel").options; +var _25c=$.data(_25b,"panel").panel; +var tool=_25c.children(".panel-header").find("a.panel-tool-max"); +if(opts.maximized==true){ +return; +} +tool.addClass("panel-tool-restore"); +if(!$.data(_25b,"panel").original){ +$.data(_25b,"panel").original={width:opts.width,height:opts.height,left:opts.left,top:opts.top,fit:opts.fit}; +} +opts.left=0; +opts.top=0; +opts.fit=true; +_212(_25b); +opts.minimized=false; +opts.maximized=true; +opts.onMaximize.call(_25b); +}; +function _25d(_25e){ +var opts=$.data(_25e,"panel").options; +var _25f=$.data(_25e,"panel").panel; +_25f._size("unfit"); +_25f.hide(); +opts.minimized=true; +opts.maximized=false; +opts.onMinimize.call(_25e); +}; +function _260(_261){ +var opts=$.data(_261,"panel").options; +var _262=$.data(_261,"panel").panel; +var tool=_262.children(".panel-header").find("a.panel-tool-max"); +if(opts.maximized==false){ +return; +} +_262.show(); +tool.removeClass("panel-tool-restore"); +$.extend(opts,$.data(_261,"panel").original); +_212(_261); +opts.minimized=false; +opts.maximized=false; +$.data(_261,"panel").original=null; +opts.onRestore.call(_261); +}; +function _263(_264,_265){ +$.data(_264,"panel").options.title=_265; +$(_264).panel("header").find("div.panel-title").html(_265); +}; +var _266=null; +$(window).unbind(".panel").bind("resize.panel",function(){ +if(_266){ +clearTimeout(_266); +} +_266=setTimeout(function(){ +var _267=$("body.layout"); +if(_267.length){ +_267.layout("resize"); +$("body").children(".easyui-fluid:visible").each(function(){ +$(this).triggerHandler("_resize"); +}); +}else{ +$("body").panel("doLayout"); +} +_266=null; +},100); +}); +$.fn.panel=function(_268,_269){ +if(typeof _268=="string"){ +return $.fn.panel.methods[_268](this,_269); +} +_268=_268||{}; +return this.each(function(){ +var _26a=$.data(this,"panel"); +var opts; +if(_26a){ +opts=$.extend(_26a.options,_268); +_26a.isLoaded=false; +}else{ +opts=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_268); +$(this).attr("title",""); +_26a=$.data(this,"panel",{options:opts,panel:_228(this),isLoaded:false}); +} +_22c(this); +$(this).show(); +if(opts.doSize==true){ +_26a.panel.css("display","block"); +_212(this); +} +if(opts.closed==true||opts.minimized==true){ +_26a.panel.hide(); +}else{ +_242(this); +} +}); +}; +$.fn.panel.methods={options:function(jq){ +return $.data(jq[0],"panel").options; +},panel:function(jq){ +return $.data(jq[0],"panel").panel; +},header:function(jq){ +return $.data(jq[0],"panel").panel.children(".panel-header"); +},footer:function(jq){ +return jq.panel("panel").children(".panel-footer"); +},body:function(jq){ +return $.data(jq[0],"panel").panel.children(".panel-body"); +},setTitle:function(jq,_26b){ +return jq.each(function(){ +_263(this,_26b); +}); +},open:function(jq,_26c){ +return jq.each(function(){ +_242(this,_26c); +}); +},close:function(jq,_26d){ +return jq.each(function(){ +_249(this,_26d); +}); +},destroy:function(jq,_26e){ +return jq.each(function(){ +_24e(this,_26e); +}); +},clear:function(jq,type){ +return jq.each(function(){ +_23e(type=="footer"?$(this).panel("footer"):this); +}); +},refresh:function(jq,href){ +return jq.each(function(){ +var _26f=$.data(this,"panel"); +_26f.isLoaded=false; +if(href){ +if(typeof href=="string"){ +_26f.options.href=href; +}else{ +_26f.options.queryParams=href; +} +} +_238(this); +}); +},resize:function(jq,_270){ +return jq.each(function(){ +_212(this,_270||{}); +}); +},doLayout:function(jq,all){ +return jq.each(function(){ +_271(this,"body"); +_271($(this).siblings(".panel-footer")[0],"footer"); +function _271(_272,type){ +if(!_272){ +return; +} +var _273=_272==$("body")[0]; +var s=$(_272).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible,.easyui-fluid:visible").filter(function(_274,el){ +var p=$(el).parents(".panel-"+type+":first"); +return _273?p.length==0:p[0]==_272; +}); +s.each(function(){ +$(this).triggerHandler("_resize",[all||false]); +}); +}; +}); +},move:function(jq,_275){ +return jq.each(function(){ +_223(this,_275); +}); +},maximize:function(jq){ +return jq.each(function(){ +_247(this); +}); +},minimize:function(jq){ +return jq.each(function(){ +_25d(this); +}); +},restore:function(jq){ +return jq.each(function(){ +_260(this); +}); +},collapse:function(jq,_276){ +return jq.each(function(){ +_248(this,_276); +}); +},expand:function(jq,_277){ +return jq.each(function(){ +_257(this,_277); +}); +}}; +$.fn.panel.parseOptions=function(_278){ +var t=$(_278); +var hh=t.children(".panel-header,header"); +var ff=t.children(".panel-footer,footer"); +return $.extend({},$.parser.parseOptions(_278,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href","method","header","footer","halign","titleDirection",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"},"openAnimation","closeAnimation",{openDuration:"number",closeDuration:"number"},]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined),header:(hh.length?hh.removeClass("panel-header"):undefined),footer:(ff.length?ff.removeClass("panel-footer"):undefined)}); +}; +$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,halign:"top",titleDirection:"down",collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,openAnimation:false,openDuration:400,closeAnimation:false,closeDuration:400,tools:null,footer:null,header:null,queryParams:{},method:"get",href:null,loadingMessage:"Loading...",loader:function(_279,_27a,_27b){ +var opts=$(this).panel("options"); +if(!opts.href){ +return false; +} +$.ajax({type:opts.method,url:opts.href,cache:false,data:_279,dataType:"html",success:function(data){ +_27a(data); +},error:function(){ +_27b.apply(this,arguments); +}}); +},extractor:function(data){ +var _27c=/]*>((.|[\n\r])*)<\/body>/im; +var _27d=_27c.exec(data); +if(_27d){ +return _27d[1]; +}else{ +return data; +} +},onBeforeLoad:function(_27e){ +},onLoad:function(){ +},onLoadError:function(){ +},onBeforeOpen:function(){ +},onOpen:function(){ +},onBeforeClose:function(){ +},onClose:function(){ +},onBeforeDestroy:function(){ +},onDestroy:function(){ +},onResize:function(_27f,_280){ +},onMove:function(left,top){ +},onMaximize:function(){ +},onRestore:function(){ +},onMinimize:function(){ +},onBeforeCollapse:function(){ +},onBeforeExpand:function(){ +},onCollapse:function(){ +},onExpand:function(){ +}}; +})(jQuery); +(function($){ +function _281(_282,_283){ +var _284=$.data(_282,"window"); +if(_283){ +if(_283.left!=null){ +_284.options.left=_283.left; +} +if(_283.top!=null){ +_284.options.top=_283.top; +} +} +$(_282).panel("move",_284.options); +if(_284.shadow){ +_284.shadow.css({left:_284.options.left,top:_284.options.top}); +} +}; +function _285(_286,_287){ +var opts=$.data(_286,"window").options; +var pp=$(_286).window("panel"); +var _288=pp._outerWidth(); +if(opts.inline){ +var _289=pp.parent(); +opts.left=Math.ceil((_289.width()-_288)/2+_289.scrollLeft()); +}else{ +opts.left=Math.ceil(($(window)._outerWidth()-_288)/2+$(document).scrollLeft()); +} +if(_287){ +_281(_286); +} +}; +function _28a(_28b,_28c){ +var opts=$.data(_28b,"window").options; +var pp=$(_28b).window("panel"); +var _28d=pp._outerHeight(); +if(opts.inline){ +var _28e=pp.parent(); +opts.top=Math.ceil((_28e.height()-_28d)/2+_28e.scrollTop()); +}else{ +opts.top=Math.ceil(($(window)._outerHeight()-_28d)/2+$(document).scrollTop()); +} +if(_28c){ +_281(_28b); +} +}; +function _28f(_290){ +var _291=$.data(_290,"window"); +var opts=_291.options; +var win=$(_290).panel($.extend({},_291.options,{border:false,doSize:true,closed:true,cls:"window "+(!opts.border?"window-thinborder window-noborder ":(opts.border=="thin"?"window-thinborder ":""))+(opts.cls||""),headerCls:"window-header "+(opts.headerCls||""),bodyCls:"window-body "+(opts.noheader?"window-body-noheader ":" ")+(opts.bodyCls||""),onBeforeDestroy:function(){ +if(opts.onBeforeDestroy.call(_290)==false){ +return false; +} +if(_291.shadow){ +_291.shadow.remove(); +} +if(_291.mask){ +_291.mask.remove(); +} +},onClose:function(){ +if(_291.shadow){ +_291.shadow.hide(); +} +if(_291.mask){ +_291.mask.hide(); +} +opts.onClose.call(_290); +},onOpen:function(){ +if(_291.mask){ +_291.mask.css($.extend({display:"block",zIndex:$.fn.window.defaults.zIndex++},$.fn.window.getMaskSize(_290))); +} +if(_291.shadow){ +_291.shadow.css({display:"block",zIndex:$.fn.window.defaults.zIndex++,left:opts.left,top:opts.top,width:_291.window._outerWidth(),height:_291.window._outerHeight()}); +} +_291.window.css("z-index",$.fn.window.defaults.zIndex++); +opts.onOpen.call(_290); +},onResize:function(_292,_293){ +var _294=$(this).panel("options"); +$.extend(opts,{width:_294.width,height:_294.height,left:_294.left,top:_294.top}); +if(_291.shadow){ +_291.shadow.css({left:opts.left,top:opts.top,width:_291.window._outerWidth(),height:_291.window._outerHeight()}); +} +opts.onResize.call(_290,_292,_293); +},onMinimize:function(){ +if(_291.shadow){ +_291.shadow.hide(); +} +if(_291.mask){ +_291.mask.hide(); +} +_291.options.onMinimize.call(_290); +},onBeforeCollapse:function(){ +if(opts.onBeforeCollapse.call(_290)==false){ +return false; +} +if(_291.shadow){ +_291.shadow.hide(); +} +},onExpand:function(){ +if(_291.shadow){ +_291.shadow.show(); +} +opts.onExpand.call(_290); +}})); +_291.window=win.panel("panel"); +if(_291.mask){ +_291.mask.remove(); +} +if(opts.modal){ +_291.mask=$("
                                                                                              ").insertAfter(_291.window); +} +if(_291.shadow){ +_291.shadow.remove(); +} +if(opts.shadow){ +_291.shadow=$("
                                                                                              ").insertAfter(_291.window); +} +var _295=opts.closed; +if(opts.left==null){ +_285(_290); +} +if(opts.top==null){ +_28a(_290); +} +_281(_290); +if(!_295){ +win.window("open"); +} +}; +function _296(left,top,_297,_298){ +var _299=this; +var _29a=$.data(_299,"window"); +var opts=_29a.options; +if(!opts.constrain){ +return {}; +} +if($.isFunction(opts.constrain)){ +return opts.constrain.call(_299,left,top,_297,_298); +} +var win=$(_299).window("window"); +var _29b=opts.inline?win.parent():$(window); +if(left<0){ +left=0; +} +if(top<_29b.scrollTop()){ +top=_29b.scrollTop(); +} +if(left+_297>_29b.width()){ +if(_297==win.outerWidth()){ +left=_29b.width()-_297; +}else{ +_297=_29b.width()-left; +} +} +if(top-_29b.scrollTop()+_298>_29b.height()){ +if(_298==win.outerHeight()){ +top=_29b.height()-_298+_29b.scrollTop(); +}else{ +_298=_29b.height()-top+_29b.scrollTop(); +} +} +return {left:left,top:top,width:_297,height:_298}; +}; +function _29c(_29d){ +var _29e=$.data(_29d,"window"); +_29e.window.draggable({handle:">div.panel-header>div.panel-title",disabled:_29e.options.draggable==false,onBeforeDrag:function(e){ +if(_29e.mask){ +_29e.mask.css("z-index",$.fn.window.defaults.zIndex++); +} +if(_29e.shadow){ +_29e.shadow.css("z-index",$.fn.window.defaults.zIndex++); +} +_29e.window.css("z-index",$.fn.window.defaults.zIndex++); +},onStartDrag:function(e){ +_29f(e); +},onDrag:function(e){ +_2a0(e); +return false; +},onStopDrag:function(e){ +_2a1(e,"move"); +}}); +_29e.window.resizable({disabled:_29e.options.resizable==false,onStartResize:function(e){ +_29f(e); +},onResize:function(e){ +_2a0(e); +return false; +},onStopResize:function(e){ +_2a1(e,"resize"); +}}); +function _29f(e){ +if(_29e.pmask){ +_29e.pmask.remove(); +} +_29e.pmask=$("
                                                                                              ").insertAfter(_29e.window); +_29e.pmask.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top,width:_29e.window._outerWidth(),height:_29e.window._outerHeight()}); +if(_29e.proxy){ +_29e.proxy.remove(); +} +_29e.proxy=$("
                                                                                              ").insertAfter(_29e.window); +_29e.proxy.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top}); +_29e.proxy._outerWidth(e.data.width)._outerHeight(e.data.height); +_29e.proxy.hide(); +setTimeout(function(){ +if(_29e.pmask){ +_29e.pmask.show(); +} +if(_29e.proxy){ +_29e.proxy.show(); +} +},500); +}; +function _2a0(e){ +$.extend(e.data,_296.call(_29d,e.data.left,e.data.top,e.data.width,e.data.height)); +_29e.pmask.show(); +_29e.proxy.css({display:"block",left:e.data.left,top:e.data.top}); +_29e.proxy._outerWidth(e.data.width); +_29e.proxy._outerHeight(e.data.height); +}; +function _2a1(e,_2a2){ +$.extend(e.data,_296.call(_29d,e.data.left,e.data.top,e.data.width+0.1,e.data.height+0.1)); +$(_29d).window(_2a2,e.data); +_29e.pmask.remove(); +_29e.pmask=null; +_29e.proxy.remove(); +_29e.proxy=null; +}; +}; +$(function(){ +if(!$._positionFixed){ +$(window).resize(function(){ +$("body>div.window-mask:visible").css({width:"",height:""}); +setTimeout(function(){ +$("body>div.window-mask:visible").css($.fn.window.getMaskSize()); +},50); +}); +} +}); +$.fn.window=function(_2a3,_2a4){ +if(typeof _2a3=="string"){ +var _2a5=$.fn.window.methods[_2a3]; +if(_2a5){ +return _2a5(this,_2a4); +}else{ +return this.panel(_2a3,_2a4); +} +} +_2a3=_2a3||{}; +return this.each(function(){ +var _2a6=$.data(this,"window"); +if(_2a6){ +$.extend(_2a6.options,_2a3); +}else{ +_2a6=$.data(this,"window",{options:$.extend({},$.fn.window.defaults,$.fn.window.parseOptions(this),_2a3)}); +if(!_2a6.options.inline){ +document.body.appendChild(this); +} +} +_28f(this); +_29c(this); +}); +}; +$.fn.window.methods={options:function(jq){ +var _2a7=jq.panel("options"); +var _2a8=$.data(jq[0],"window").options; +return $.extend(_2a8,{closed:_2a7.closed,collapsed:_2a7.collapsed,minimized:_2a7.minimized,maximized:_2a7.maximized}); +},window:function(jq){ +return $.data(jq[0],"window").window; +},move:function(jq,_2a9){ +return jq.each(function(){ +_281(this,_2a9); +}); +},hcenter:function(jq){ +return jq.each(function(){ +_285(this,true); +}); +},vcenter:function(jq){ +return jq.each(function(){ +_28a(this,true); +}); +},center:function(jq){ +return jq.each(function(){ +_285(this); +_28a(this); +_281(this); +}); +}}; +$.fn.window.getMaskSize=function(_2aa){ +var _2ab=$(_2aa).data("window"); +if(_2ab&&_2ab.options.inline){ +return {}; +}else{ +if($._positionFixed){ +return {position:"fixed"}; +}else{ +return {width:$(document).width(),height:$(document).height()}; +} +} +}; +$.fn.window.parseOptions=function(_2ac){ +return $.extend({},$.fn.panel.parseOptions(_2ac),$.parser.parseOptions(_2ac,[{draggable:"boolean",resizable:"boolean",shadow:"boolean",modal:"boolean",inline:"boolean"}])); +}; +$.fn.window.defaults=$.extend({},$.fn.panel.defaults,{zIndex:9000,draggable:true,resizable:true,shadow:true,modal:false,border:true,inline:false,title:"New Window",collapsible:true,minimizable:true,maximizable:true,closable:true,closed:false,constrain:false}); +})(jQuery); +(function($){ +function _2ad(_2ae){ +var opts=$.data(_2ae,"dialog").options; +opts.inited=false; +$(_2ae).window($.extend({},opts,{onResize:function(w,h){ +if(opts.inited){ +_2b3(this); +opts.onResize.call(this,w,h); +} +}})); +var win=$(_2ae).window("window"); +if(opts.toolbar){ +if($.isArray(opts.toolbar)){ +$(_2ae).siblings("div.dialog-toolbar").remove(); +var _2af=$("
                                                                                              ").appendTo(win); +var tr=_2af.find("tr"); +for(var i=0;i
                                                                                              ").appendTo(tr); +}else{ +var td=$("").appendTo(tr); +var tool=$("").appendTo(td); +tool[0].onclick=eval(btn.handler||function(){ +}); +tool.linkbutton($.extend({},btn,{plain:true})); +} +} +}else{ +$(opts.toolbar).addClass("dialog-toolbar").appendTo(win); +$(opts.toolbar).show(); +} +}else{ +$(_2ae).siblings("div.dialog-toolbar").remove(); +} +if(opts.buttons){ +if($.isArray(opts.buttons)){ +$(_2ae).siblings("div.dialog-button").remove(); +var _2b0=$("
                                                                                              ").appendTo(win); +for(var i=0;i").appendTo(_2b0); +if(p.handler){ +_2b1[0].onclick=p.handler; +} +_2b1.linkbutton(p); +} +}else{ +$(opts.buttons).addClass("dialog-button").appendTo(win); +$(opts.buttons).show(); +} +}else{ +$(_2ae).siblings("div.dialog-button").remove(); +} +opts.inited=true; +var _2b2=opts.closed; +win.show(); +$(_2ae).window("resize",{}); +if(_2b2){ +win.hide(); +} +}; +function _2b3(_2b4,_2b5){ +var t=$(_2b4); +var opts=t.dialog("options"); +var _2b6=opts.noheader; +var tb=t.siblings(".dialog-toolbar"); +var bb=t.siblings(".dialog-button"); +tb.insertBefore(_2b4).css({borderTopWidth:(_2b6?1:0),top:(_2b6?tb.length:0)}); +bb.insertAfter(_2b4); +tb.add(bb)._outerWidth(t._outerWidth()).find(".easyui-fluid:visible").each(function(){ +$(this).triggerHandler("_resize"); +}); +var _2b7=tb._outerHeight()+bb._outerHeight(); +if(!isNaN(parseInt(opts.height))){ +t._outerHeight(t._outerHeight()-_2b7); +}else{ +var _2b8=t._size("min-height"); +if(_2b8){ +t._size("min-height",_2b8-_2b7); +} +var _2b9=t._size("max-height"); +if(_2b9){ +t._size("max-height",_2b9-_2b7); +} +} +var _2ba=$.data(_2b4,"window").shadow; +if(_2ba){ +var cc=t.panel("panel"); +_2ba.css({width:cc._outerWidth(),height:cc._outerHeight()}); +} +}; +$.fn.dialog=function(_2bb,_2bc){ +if(typeof _2bb=="string"){ +var _2bd=$.fn.dialog.methods[_2bb]; +if(_2bd){ +return _2bd(this,_2bc); +}else{ +return this.window(_2bb,_2bc); +} +} +_2bb=_2bb||{}; +return this.each(function(){ +var _2be=$.data(this,"dialog"); +if(_2be){ +$.extend(_2be.options,_2bb); +}else{ +$.data(this,"dialog",{options:$.extend({},$.fn.dialog.defaults,$.fn.dialog.parseOptions(this),_2bb)}); +} +_2ad(this); +}); +}; +$.fn.dialog.methods={options:function(jq){ +var _2bf=$.data(jq[0],"dialog").options; +var _2c0=jq.panel("options"); +$.extend(_2bf,{width:_2c0.width,height:_2c0.height,left:_2c0.left,top:_2c0.top,closed:_2c0.closed,collapsed:_2c0.collapsed,minimized:_2c0.minimized,maximized:_2c0.maximized}); +return _2bf; +},dialog:function(jq){ +return jq.window("window"); +}}; +$.fn.dialog.parseOptions=function(_2c1){ +var t=$(_2c1); +return $.extend({},$.fn.window.parseOptions(_2c1),$.parser.parseOptions(_2c1,["toolbar","buttons"]),{toolbar:(t.children(".dialog-toolbar").length?t.children(".dialog-toolbar").removeClass("dialog-toolbar"):undefined),buttons:(t.children(".dialog-button").length?t.children(".dialog-button").removeClass("dialog-button"):undefined)}); +}; +$.fn.dialog.defaults=$.extend({},$.fn.window.defaults,{title:"New Dialog",collapsible:false,minimizable:false,maximizable:false,resizable:false,toolbar:null,buttons:null}); +})(jQuery); +(function($){ +function _2c2(){ +$(document).unbind(".messager").bind("keydown.messager",function(e){ +if(e.keyCode==27){ +$("body").children("div.messager-window").children("div.messager-body").each(function(){ +$(this).dialog("close"); +}); +}else{ +if(e.keyCode==9){ +var win=$("body").children("div.messager-window"); +if(!win.length){ +return; +} +var _2c3=win.find(".messager-input,.messager-button .l-btn"); +for(var i=0;i<_2c3.length;i++){ +if($(_2c3[i]).is(":focus")){ +$(_2c3[i>=_2c3.length-1?0:i+1]).focus(); +return false; +} +} +}else{ +if(e.keyCode==13){ +var _2c4=$(e.target).closest("input.messager-input"); +if(_2c4.length){ +var dlg=_2c4.closest(".messager-body"); +_2c5(dlg,_2c4.val()); +} +} +} +} +}); +}; +function _2c6(){ +$(document).unbind(".messager"); +}; +function _2c7(_2c8){ +var opts=$.extend({},$.messager.defaults,{modal:false,shadow:false,draggable:false,resizable:false,closed:true,style:{left:"",top:"",right:0,zIndex:$.fn.window.defaults.zIndex++,bottom:-document.body.scrollTop-document.documentElement.scrollTop},title:"",width:300,height:150,minHeight:0,showType:"slide",showSpeed:600,content:_2c8.msg,timeout:4000},_2c8); +var dlg=$("
                                                                                              ").appendTo("body"); +dlg.dialog($.extend({},opts,{noheader:(opts.title?false:true),openAnimation:(opts.showType),closeAnimation:(opts.showType=="show"?"hide":opts.showType),openDuration:opts.showSpeed,closeDuration:opts.showSpeed,onOpen:function(){ +dlg.dialog("dialog").hover(function(){ +if(opts.timer){ +clearTimeout(opts.timer); +} +},function(){ +_2c9(); +}); +_2c9(); +function _2c9(){ +if(opts.timeout>0){ +opts.timer=setTimeout(function(){ +if(dlg.length&&dlg.data("dialog")){ +dlg.dialog("close"); +} +},opts.timeout); +} +}; +if(_2c8.onOpen){ +_2c8.onOpen.call(this); +}else{ +opts.onOpen.call(this); +} +},onClose:function(){ +if(opts.timer){ +clearTimeout(opts.timer); +} +if(_2c8.onClose){ +_2c8.onClose.call(this); +}else{ +opts.onClose.call(this); +} +dlg.dialog("destroy"); +}})); +dlg.dialog("dialog").css(opts.style); +dlg.dialog("open"); +return dlg; +}; +function _2ca(_2cb){ +_2c2(); +var dlg=$("
                                                                                              ").appendTo("body"); +dlg.dialog($.extend({},_2cb,{noheader:(_2cb.title?false:true),onClose:function(){ +_2c6(); +if(_2cb.onClose){ +_2cb.onClose.call(this); +} +dlg.dialog("destroy"); +}})); +var win=dlg.dialog("dialog").addClass("messager-window"); +win.find(".dialog-button").addClass("messager-button").find("a:first").focus(); +return dlg; +}; +function _2c5(dlg,_2cc){ +var opts=dlg.dialog("options"); +dlg.dialog("close"); +opts.fn(_2cc); +}; +$.messager={show:function(_2cd){ +return _2c7(_2cd); +},alert:function(_2ce,msg,icon,fn){ +var opts=typeof _2ce=="object"?_2ce:{title:_2ce,msg:msg,icon:icon,fn:fn}; +var cls=opts.icon?"messager-icon messager-"+opts.icon:""; +opts=$.extend({},$.messager.defaults,{content:"
                                                                                              "+"
                                                                                              "+opts.msg+"
                                                                                              "+"
                                                                                              "},opts); +if(!opts.buttons){ +opts.buttons=[{text:opts.ok,onClick:function(){ +_2c5(dlg); +}}]; +} +var dlg=_2ca(opts); +return dlg; +},confirm:function(_2cf,msg,fn){ +var opts=typeof _2cf=="object"?_2cf:{title:_2cf,msg:msg,fn:fn}; +opts=$.extend({},$.messager.defaults,{content:"
                                                                                              "+"
                                                                                              "+opts.msg+"
                                                                                              "+"
                                                                                              "},opts); +if(!opts.buttons){ +opts.buttons=[{text:opts.ok,onClick:function(){ +_2c5(dlg,true); +}},{text:opts.cancel,onClick:function(){ +_2c5(dlg,false); +}}]; +} +var dlg=_2ca(opts); +return dlg; +},prompt:function(_2d0,msg,fn){ +var opts=typeof _2d0=="object"?_2d0:{title:_2d0,msg:msg,fn:fn}; +opts=$.extend({},$.messager.defaults,{content:"
                                                                                              "+"
                                                                                              "+opts.msg+"
                                                                                              "+"
                                                                                              "+"
                                                                                              "+"
                                                                                              "},opts); +if(!opts.buttons){ +opts.buttons=[{text:opts.ok,onClick:function(){ +_2c5(dlg,dlg.find(".messager-input").val()); +}},{text:opts.cancel,onClick:function(){ +_2c5(dlg); +}}]; +} +var dlg=_2ca(opts); +dlg.find(".messager-input").focus(); +return dlg; +},progress:function(_2d1){ +var _2d2={bar:function(){ +return $("body>div.messager-window").find("div.messager-p-bar"); +},close:function(){ +var dlg=$("body>div.messager-window>div.messager-body:has(div.messager-progress)"); +if(dlg.length){ +dlg.dialog("close"); +} +}}; +if(typeof _2d1=="string"){ +var _2d3=_2d2[_2d1]; +return _2d3(); +} +_2d1=_2d1||{}; +var opts=$.extend({},{title:"",minHeight:0,content:undefined,msg:"",text:undefined,interval:300},_2d1); +var dlg=_2ca($.extend({},$.messager.defaults,{content:"
                                                                                              "+opts.msg+"
                                                                                              ",closable:false,doSize:false},opts,{onClose:function(){ +if(this.timer){ +clearInterval(this.timer); +} +if(_2d1.onClose){ +_2d1.onClose.call(this); +}else{ +$.messager.defaults.onClose.call(this); +} +}})); +var bar=dlg.find("div.messager-p-bar"); +bar.progressbar({text:opts.text}); +dlg.dialog("resize"); +if(opts.interval){ +dlg[0].timer=setInterval(function(){ +var v=bar.progressbar("getValue"); +v+=10; +if(v>100){ +v=0; +} +bar.progressbar("setValue",v); +},opts.interval); +} +return dlg; +}}; +$.messager.defaults=$.extend({},$.fn.dialog.defaults,{ok:"Ok",cancel:"Cancel",width:300,height:"auto",minHeight:150,modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,fn:function(){ +}}); +})(jQuery); +(function($){ +function _2d4(_2d5,_2d6){ +var _2d7=$.data(_2d5,"accordion"); +var opts=_2d7.options; +var _2d8=_2d7.panels; +var cc=$(_2d5); +var _2d9=(opts.halign=="left"||opts.halign=="right"); +cc.children(".panel-last").removeClass("panel-last"); +cc.children(".panel:last").addClass("panel-last"); +if(_2d6){ +$.extend(opts,{width:_2d6.width,height:_2d6.height}); +} +cc._size(opts); +var _2da=0; +var _2db="auto"; +var _2dc=cc.find(">.panel>.accordion-header"); +if(_2dc.length){ +if(_2d9){ +$(_2d8[0]).panel("resize",{width:cc.width(),height:cc.height()}); +_2da=$(_2dc[0])._outerWidth(); +}else{ +_2da=$(_2dc[0]).css("height","")._outerHeight(); +} +} +if(!isNaN(parseInt(opts.height))){ +if(_2d9){ +_2db=cc.width()-_2da*_2dc.length; +}else{ +_2db=cc.height()-_2da*_2dc.length; +} +} +_2dd(true,_2db-_2dd(false)); +function _2dd(_2de,_2df){ +var _2e0=0; +for(var i=0;i<_2d8.length;i++){ +var p=_2d8[i]; +if(_2d9){ +var h=p.panel("header")._outerWidth(_2da); +}else{ +var h=p.panel("header")._outerHeight(_2da); +} +if(p.panel("options").collapsible==_2de){ +var _2e1=isNaN(_2df)?undefined:(_2df+_2da*h.length); +if(_2d9){ +p.panel("resize",{height:cc.height(),width:(_2de?_2e1:undefined)}); +_2e0+=p.panel("panel")._outerWidth()-_2da*h.length; +}else{ +p.panel("resize",{width:cc.width(),height:(_2de?_2e1:undefined)}); +_2e0+=p.panel("panel").outerHeight()-_2da*h.length; +} +} +} +return _2e0; +}; +}; +function _2e2(_2e3,_2e4,_2e5,all){ +var _2e6=$.data(_2e3,"accordion").panels; +var pp=[]; +for(var i=0;i<_2e6.length;i++){ +var p=_2e6[i]; +if(_2e4){ +if(p.panel("options")[_2e4]==_2e5){ +pp.push(p); +} +}else{ +if(p[0]==$(_2e5)[0]){ +return i; +} +} +} +if(_2e4){ +return all?pp:(pp.length?pp[0]:null); +}else{ +return -1; +} +}; +function _2e7(_2e8){ +return _2e2(_2e8,"collapsed",false,true); +}; +function _2e9(_2ea){ +var pp=_2e7(_2ea); +return pp.length?pp[0]:null; +}; +function _2eb(_2ec,_2ed){ +return _2e2(_2ec,null,_2ed); +}; +function _2ee(_2ef,_2f0){ +var _2f1=$.data(_2ef,"accordion").panels; +if(typeof _2f0=="number"){ +if(_2f0<0||_2f0>=_2f1.length){ +return null; +}else{ +return _2f1[_2f0]; +} +} +return _2e2(_2ef,"title",_2f0); +}; +function _2f2(_2f3){ +var opts=$.data(_2f3,"accordion").options; +var cc=$(_2f3); +if(opts.border){ +cc.removeClass("accordion-noborder"); +}else{ +cc.addClass("accordion-noborder"); +} +}; +function init(_2f4){ +var _2f5=$.data(_2f4,"accordion"); +var cc=$(_2f4); +cc.addClass("accordion"); +_2f5.panels=[]; +cc.children("div").each(function(){ +var opts=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); +var pp=$(this); +_2f5.panels.push(pp); +_2f7(_2f4,pp,opts); +}); +cc.bind("_resize",function(e,_2f6){ +if($(this).hasClass("easyui-fluid")||_2f6){ +_2d4(_2f4); +} +return false; +}); +}; +function _2f7(_2f8,pp,_2f9){ +var opts=$.data(_2f8,"accordion").options; +pp.panel($.extend({},{collapsible:true,minimizable:false,maximizable:false,closable:false,doSize:false,collapsed:true,headerCls:"accordion-header",bodyCls:"accordion-body",halign:opts.halign},_2f9,{onBeforeExpand:function(){ +if(_2f9.onBeforeExpand){ +if(_2f9.onBeforeExpand.call(this)==false){ +return false; +} +} +if(!opts.multiple){ +var all=$.grep(_2e7(_2f8),function(p){ +return p.panel("options").collapsible; +}); +for(var i=0;i.panel-last>.accordion-header").removeClass("accordion-header-border"); +if(_2f9.onExpand){ +_2f9.onExpand.call(this); +} +opts.onSelect.call(_2f8,$(this).panel("options").title,_2eb(_2f8,this)); +},onBeforeCollapse:function(){ +if(_2f9.onBeforeCollapse){ +if(_2f9.onBeforeCollapse.call(this)==false){ +return false; +} +} +$(_2f8).find(">.panel-last>.accordion-header").addClass("accordion-header-border"); +var _2fb=$(this).panel("header"); +_2fb.removeClass("accordion-header-selected"); +_2fb.find(".accordion-collapse").addClass("accordion-expand"); +},onCollapse:function(){ +if(isNaN(parseInt(opts.height))){ +$(_2f8).find(">.panel-last>.accordion-header").removeClass("accordion-header-border"); +} +if(_2f9.onCollapse){ +_2f9.onCollapse.call(this); +} +opts.onUnselect.call(_2f8,$(this).panel("options").title,_2eb(_2f8,this)); +}})); +var _2fc=pp.panel("header"); +var tool=_2fc.children("div.panel-tool"); +tool.children("a.panel-tool-collapse").hide(); +var t=$("").addClass("accordion-collapse accordion-expand").appendTo(tool); +t.bind("click",function(){ +_2fd(pp); +return false; +}); +pp.panel("options").collapsible?t.show():t.hide(); +if(opts.halign=="left"||opts.halign=="right"){ +t.hide(); +} +_2fc.click(function(){ +_2fd(pp); +return false; +}); +function _2fd(p){ +var _2fe=p.panel("options"); +if(_2fe.collapsible){ +var _2ff=_2eb(_2f8,p); +if(_2fe.collapsed){ +_300(_2f8,_2ff); +}else{ +_301(_2f8,_2ff); +} +} +}; +}; +function _300(_302,_303){ +var p=_2ee(_302,_303); +if(!p){ +return; +} +_304(_302); +var opts=$.data(_302,"accordion").options; +p.panel("expand",opts.animate); +}; +function _301(_305,_306){ +var p=_2ee(_305,_306); +if(!p){ +return; +} +_304(_305); +var opts=$.data(_305,"accordion").options; +p.panel("collapse",opts.animate); +}; +function _307(_308){ +var opts=$.data(_308,"accordion").options; +$(_308).find(">.panel-last>.accordion-header").addClass("accordion-header-border"); +var p=_2e2(_308,"selected",true); +if(p){ +_309(_2eb(_308,p)); +}else{ +_309(opts.selected); +} +function _309(_30a){ +var _30b=opts.animate; +opts.animate=false; +_300(_308,_30a); +opts.animate=_30b; +}; +}; +function _304(_30c){ +var _30d=$.data(_30c,"accordion").panels; +for(var i=0;i<_30d.length;i++){ +_30d[i].stop(true,true); +} +}; +function add(_30e,_30f){ +var _310=$.data(_30e,"accordion"); +var opts=_310.options; +var _311=_310.panels; +if(_30f.selected==undefined){ +_30f.selected=true; +} +_304(_30e); +var pp=$("
                                                                                              ").appendTo(_30e); +_311.push(pp); +_2f7(_30e,pp,_30f); +_2d4(_30e); +opts.onAdd.call(_30e,_30f.title,_311.length-1); +if(_30f.selected){ +_300(_30e,_311.length-1); +} +}; +function _312(_313,_314){ +var _315=$.data(_313,"accordion"); +var opts=_315.options; +var _316=_315.panels; +_304(_313); +var _317=_2ee(_313,_314); +var _318=_317.panel("options").title; +var _319=_2eb(_313,_317); +if(!_317){ +return; +} +if(opts.onBeforeRemove.call(_313,_318,_319)==false){ +return; +} +_316.splice(_319,1); +_317.panel("destroy"); +if(_316.length){ +_2d4(_313); +var curr=_2e9(_313); +if(!curr){ +_300(_313,0); +} +} +opts.onRemove.call(_313,_318,_319); +}; +$.fn.accordion=function(_31a,_31b){ +if(typeof _31a=="string"){ +return $.fn.accordion.methods[_31a](this,_31b); +} +_31a=_31a||{}; +return this.each(function(){ +var _31c=$.data(this,"accordion"); +if(_31c){ +$.extend(_31c.options,_31a); +}else{ +$.data(this,"accordion",{options:$.extend({},$.fn.accordion.defaults,$.fn.accordion.parseOptions(this),_31a),accordion:$(this).addClass("accordion"),panels:[]}); +init(this); +} +_2f2(this); +_2d4(this); +_307(this); +}); +}; +$.fn.accordion.methods={options:function(jq){ +return $.data(jq[0],"accordion").options; +},panels:function(jq){ +return $.data(jq[0],"accordion").panels; +},resize:function(jq,_31d){ +return jq.each(function(){ +_2d4(this,_31d); +}); +},getSelections:function(jq){ +return _2e7(jq[0]); +},getSelected:function(jq){ +return _2e9(jq[0]); +},getPanel:function(jq,_31e){ +return _2ee(jq[0],_31e); +},getPanelIndex:function(jq,_31f){ +return _2eb(jq[0],_31f); +},select:function(jq,_320){ +return jq.each(function(){ +_300(this,_320); +}); +},unselect:function(jq,_321){ +return jq.each(function(){ +_301(this,_321); +}); +},add:function(jq,_322){ +return jq.each(function(){ +add(this,_322); +}); +},remove:function(jq,_323){ +return jq.each(function(){ +_312(this,_323); +}); +}}; +$.fn.accordion.parseOptions=function(_324){ +var t=$(_324); +return $.extend({},$.parser.parseOptions(_324,["width","height","halign",{fit:"boolean",border:"boolean",animate:"boolean",multiple:"boolean",selected:"number"}])); +}; +$.fn.accordion.defaults={width:"auto",height:"auto",fit:false,border:true,animate:true,multiple:false,selected:0,halign:"top",onSelect:function(_325,_326){ +},onUnselect:function(_327,_328){ +},onAdd:function(_329,_32a){ +},onBeforeRemove:function(_32b,_32c){ +},onRemove:function(_32d,_32e){ +}}; +})(jQuery); +(function($){ +function _32f(c){ +var w=0; +$(c).children().each(function(){ +w+=$(this).outerWidth(true); +}); +return w; +}; +function _330(_331){ +var opts=$.data(_331,"tabs").options; +if(!opts.showHeader){ +return; +} +var _332=$(_331).children("div.tabs-header"); +var tool=_332.children("div.tabs-tool:not(.tabs-tool-hidden)"); +var _333=_332.children("div.tabs-scroller-left"); +var _334=_332.children("div.tabs-scroller-right"); +var wrap=_332.children("div.tabs-wrap"); +if(opts.tabPosition=="left"||opts.tabPosition=="right"){ +if(!tool.length){ +return; +} +tool._outerWidth(_332.width()); +var _335={left:opts.tabPosition=="left"?"auto":0,right:opts.tabPosition=="left"?0:"auto",top:opts.toolPosition=="top"?0:"auto",bottom:opts.toolPosition=="top"?"auto":0}; +var _336={marginTop:opts.toolPosition=="top"?tool.outerHeight():0}; +tool.css(_335); +wrap.css(_336); +return; +} +var _337=_332.outerHeight(); +if(opts.plain){ +_337-=_337-_332.height(); +} +tool._outerHeight(_337); +var _338=_32f(_332.find("ul.tabs")); +var _339=_332.width()-tool._outerWidth(); +if(_338>_339){ +_333.add(_334).show()._outerHeight(_337); +if(opts.toolPosition=="left"){ +tool.css({left:_333.outerWidth(),right:""}); +wrap.css({marginLeft:_333.outerWidth()+tool._outerWidth(),marginRight:_334._outerWidth(),width:_339-_333.outerWidth()-_334.outerWidth()}); +}else{ +tool.css({left:"",right:_334.outerWidth()}); +wrap.css({marginLeft:_333.outerWidth(),marginRight:_334.outerWidth()+tool._outerWidth(),width:_339-_333.outerWidth()-_334.outerWidth()}); +} +}else{ +_333.add(_334).hide(); +if(opts.toolPosition=="left"){ +tool.css({left:0,right:""}); +wrap.css({marginLeft:tool._outerWidth(),marginRight:0,width:_339}); +}else{ +tool.css({left:"",right:0}); +wrap.css({marginLeft:0,marginRight:tool._outerWidth(),width:_339}); +} +} +}; +function _33a(_33b){ +var opts=$.data(_33b,"tabs").options; +var _33c=$(_33b).children("div.tabs-header"); +if(opts.tools){ +if(typeof opts.tools=="string"){ +$(opts.tools).addClass("tabs-tool").appendTo(_33c); +$(opts.tools).show(); +}else{ +_33c.children("div.tabs-tool").remove(); +var _33d=$("
                                                                                              ").appendTo(_33c); +var tr=_33d.find("tr"); +for(var i=0;i").appendTo(tr); +var tool=$("").appendTo(td); +tool[0].onclick=eval(opts.tools[i].handler||function(){ +}); +tool.linkbutton($.extend({},opts.tools[i],{plain:true})); +} +} +}else{ +_33c.children("div.tabs-tool").remove(); +} +}; +function _33e(_33f,_340){ +var _341=$.data(_33f,"tabs"); +var opts=_341.options; +var cc=$(_33f); +if(!opts.doSize){ +return; +} +if(_340){ +$.extend(opts,{width:_340.width,height:_340.height}); +} +cc._size(opts); +var _342=cc.children("div.tabs-header"); +var _343=cc.children("div.tabs-panels"); +var wrap=_342.find("div.tabs-wrap"); +var ul=wrap.find(".tabs"); +ul.children("li").removeClass("tabs-first tabs-last"); +ul.children("li:first").addClass("tabs-first"); +ul.children("li:last").addClass("tabs-last"); +if(opts.tabPosition=="left"||opts.tabPosition=="right"){ +_342._outerWidth(opts.showHeader?opts.headerWidth:0); +_343._outerWidth(cc.width()-_342.outerWidth()); +_342.add(_343)._size("height",isNaN(parseInt(opts.height))?"":cc.height()); +wrap._outerWidth(_342.width()); +ul._outerWidth(wrap.width()).css("height",""); +}else{ +_342.children("div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)").css("display",opts.showHeader?"block":"none"); +_342._outerWidth(cc.width()).css("height",""); +if(opts.showHeader){ +_342.css("background-color",""); +wrap.css("height",""); +}else{ +_342.css("background-color","transparent"); +_342._outerHeight(0); +wrap._outerHeight(0); +} +ul._outerHeight(opts.tabHeight).css("width",""); +ul._outerHeight(ul.outerHeight()-ul.height()-1+opts.tabHeight).css("width",""); +_343._size("height",isNaN(parseInt(opts.height))?"":(cc.height()-_342.outerHeight())); +_343._size("width",cc.width()); +} +if(_341.tabs.length){ +var d1=ul.outerWidth(true)-ul.width(); +var li=ul.children("li:first"); +var d2=li.outerWidth(true)-li.width(); +var _344=_342.width()-_342.children(".tabs-tool:not(.tabs-tool-hidden)")._outerWidth(); +var _345=Math.floor((_344-d1-d2*_341.tabs.length)/_341.tabs.length); +$.map(_341.tabs,function(p){ +_346(p,(opts.justified&&$.inArray(opts.tabPosition,["top","bottom"])>=0)?_345:undefined); +}); +if(opts.justified&&$.inArray(opts.tabPosition,["top","bottom"])>=0){ +var _347=_344-d1-_32f(ul); +_346(_341.tabs[_341.tabs.length-1],_345+_347); +} +} +_330(_33f); +function _346(p,_348){ +var _349=p.panel("options"); +var p_t=_349.tab.find("a.tabs-inner"); +var _348=_348?_348:(parseInt(_349.tabWidth||opts.tabWidth||undefined)); +if(_348){ +p_t._outerWidth(_348); +}else{ +p_t.css("width",""); +} +p_t._outerHeight(opts.tabHeight); +p_t.css("lineHeight",p_t.height()+"px"); +p_t.find(".easyui-fluid:visible").triggerHandler("_resize"); +}; +}; +function _34a(_34b){ +var opts=$.data(_34b,"tabs").options; +var tab=_34c(_34b); +if(tab){ +var _34d=$(_34b).children("div.tabs-panels"); +var _34e=opts.width=="auto"?"auto":_34d.width(); +var _34f=opts.height=="auto"?"auto":_34d.height(); +tab.panel("resize",{width:_34e,height:_34f}); +} +}; +function _350(_351){ +var tabs=$.data(_351,"tabs").tabs; +var cc=$(_351).addClass("tabs-container"); +var _352=$("
                                                                                              ").insertBefore(cc); +cc.children("div").each(function(){ +_352[0].appendChild(this); +}); +cc[0].appendChild(_352[0]); +$("
                                                                                              "+"
                                                                                              "+"
                                                                                              "+"
                                                                                              "+"
                                                                                                "+"
                                                                                                "+"
                                                                                                ").prependTo(_351); +cc.children("div.tabs-panels").children("div").each(function(i){ +var opts=$.extend({},$.parser.parseOptions(this),{disabled:($(this).attr("disabled")?true:undefined),selected:($(this).attr("selected")?true:undefined)}); +_35f(_351,opts,$(this)); +}); +cc.children("div.tabs-header").find(".tabs-scroller-left, .tabs-scroller-right").hover(function(){ +$(this).addClass("tabs-scroller-over"); +},function(){ +$(this).removeClass("tabs-scroller-over"); +}); +cc.bind("_resize",function(e,_353){ +if($(this).hasClass("easyui-fluid")||_353){ +_33e(_351); +_34a(_351); +} +return false; +}); +}; +function _354(_355){ +var _356=$.data(_355,"tabs"); +var opts=_356.options; +$(_355).children("div.tabs-header").unbind().bind("click",function(e){ +if($(e.target).hasClass("tabs-scroller-left")){ +$(_355).tabs("scrollBy",-opts.scrollIncrement); +}else{ +if($(e.target).hasClass("tabs-scroller-right")){ +$(_355).tabs("scrollBy",opts.scrollIncrement); +}else{ +var li=$(e.target).closest("li"); +if(li.hasClass("tabs-disabled")){ +return false; +} +var a=$(e.target).closest("a.tabs-close"); +if(a.length){ +_379(_355,_357(li)); +}else{ +if(li.length){ +var _358=_357(li); +var _359=_356.tabs[_358].panel("options"); +if(_359.collapsible){ +_359.closed?_370(_355,_358):_390(_355,_358); +}else{ +_370(_355,_358); +} +} +} +return false; +} +} +}).bind("contextmenu",function(e){ +var li=$(e.target).closest("li"); +if(li.hasClass("tabs-disabled")){ +return; +} +if(li.length){ +opts.onContextMenu.call(_355,e,li.find("span.tabs-title").html(),_357(li)); +} +}); +function _357(li){ +var _35a=0; +li.parent().children("li").each(function(i){ +if(li[0]==this){ +_35a=i; +return false; +} +}); +return _35a; +}; +}; +function _35b(_35c){ +var opts=$.data(_35c,"tabs").options; +var _35d=$(_35c).children("div.tabs-header"); +var _35e=$(_35c).children("div.tabs-panels"); +_35d.removeClass("tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right"); +_35e.removeClass("tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right"); +if(opts.tabPosition=="top"){ +_35d.insertBefore(_35e); +}else{ +if(opts.tabPosition=="bottom"){ +_35d.insertAfter(_35e); +_35d.addClass("tabs-header-bottom"); +_35e.addClass("tabs-panels-top"); +}else{ +if(opts.tabPosition=="left"){ +_35d.addClass("tabs-header-left"); +_35e.addClass("tabs-panels-right"); +}else{ +if(opts.tabPosition=="right"){ +_35d.addClass("tabs-header-right"); +_35e.addClass("tabs-panels-left"); +} +} +} +} +if(opts.plain==true){ +_35d.addClass("tabs-header-plain"); +}else{ +_35d.removeClass("tabs-header-plain"); +} +_35d.removeClass("tabs-header-narrow").addClass(opts.narrow?"tabs-header-narrow":""); +var tabs=_35d.find(".tabs"); +tabs.removeClass("tabs-pill").addClass(opts.pill?"tabs-pill":""); +tabs.removeClass("tabs-narrow").addClass(opts.narrow?"tabs-narrow":""); +tabs.removeClass("tabs-justified").addClass(opts.justified?"tabs-justified":""); +if(opts.border==true){ +_35d.removeClass("tabs-header-noborder"); +_35e.removeClass("tabs-panels-noborder"); +}else{ +_35d.addClass("tabs-header-noborder"); +_35e.addClass("tabs-panels-noborder"); +} +opts.doSize=true; +}; +function _35f(_360,_361,pp){ +_361=_361||{}; +var _362=$.data(_360,"tabs"); +var tabs=_362.tabs; +if(_361.index==undefined||_361.index>tabs.length){ +_361.index=tabs.length; +} +if(_361.index<0){ +_361.index=0; +} +var ul=$(_360).children("div.tabs-header").find("ul.tabs"); +var _363=$(_360).children("div.tabs-panels"); +var tab=$("
                                                                                              • "+""+""+""+""+"
                                                                                              • "); +if(!pp){ +pp=$("
                                                                                                "); +} +if(_361.index>=tabs.length){ +tab.appendTo(ul); +pp.appendTo(_363); +tabs.push(pp); +}else{ +tab.insertBefore(ul.children("li:eq("+_361.index+")")); +pp.insertBefore(_363.children("div.panel:eq("+_361.index+")")); +tabs.splice(_361.index,0,pp); +} +pp.panel($.extend({},_361,{tab:tab,border:false,noheader:true,closed:true,doSize:false,iconCls:(_361.icon?_361.icon:undefined),onLoad:function(){ +if(_361.onLoad){ +_361.onLoad.apply(this,arguments); +} +_362.options.onLoad.call(_360,$(this)); +},onBeforeOpen:function(){ +if(_361.onBeforeOpen){ +if(_361.onBeforeOpen.call(this)==false){ +return false; +} +} +var p=$(_360).tabs("getSelected"); +if(p){ +if(p[0]!=this){ +$(_360).tabs("unselect",_36b(_360,p)); +p=$(_360).tabs("getSelected"); +if(p){ +return false; +} +}else{ +_34a(_360); +return false; +} +} +var _364=$(this).panel("options"); +_364.tab.addClass("tabs-selected"); +var wrap=$(_360).find(">div.tabs-header>div.tabs-wrap"); +var left=_364.tab.position().left; +var _365=left+_364.tab.outerWidth(); +if(left<0||_365>wrap.width()){ +var _366=left-(wrap.width()-_364.tab.width())/2; +$(_360).tabs("scrollBy",_366); +}else{ +$(_360).tabs("scrollBy",0); +} +var _367=$(this).panel("panel"); +_367.css("display","block"); +_34a(_360); +_367.css("display","none"); +},onOpen:function(){ +if(_361.onOpen){ +_361.onOpen.call(this); +} +var _368=$(this).panel("options"); +var _369=_36b(_360,this); +_362.selectHis.push(_369); +_362.options.onSelect.call(_360,_368.title,_369); +},onBeforeClose:function(){ +if(_361.onBeforeClose){ +if(_361.onBeforeClose.call(this)==false){ +return false; +} +} +$(this).panel("options").tab.removeClass("tabs-selected"); +},onClose:function(){ +if(_361.onClose){ +_361.onClose.call(this); +} +var _36a=$(this).panel("options"); +_362.options.onUnselect.call(_360,_36a.title,_36b(_360,this)); +}})); +$(_360).tabs("update",{tab:pp,options:pp.panel("options"),type:"header"}); +}; +function _36c(_36d,_36e){ +var _36f=$.data(_36d,"tabs"); +var opts=_36f.options; +if(_36e.selected==undefined){ +_36e.selected=true; +} +_35f(_36d,_36e); +opts.onAdd.call(_36d,_36e.title,_36e.index); +if(_36e.selected){ +_370(_36d,_36e.index); +} +}; +function _371(_372,_373){ +_373.type=_373.type||"all"; +var _374=$.data(_372,"tabs").selectHis; +var pp=_373.tab; +var opts=pp.panel("options"); +var _375=opts.title; +$.extend(opts,_373.options,{iconCls:(_373.options.icon?_373.options.icon:undefined)}); +if(_373.type=="all"||_373.type=="body"){ +pp.panel(); +} +if(_373.type=="all"||_373.type=="header"){ +var tab=opts.tab; +if(opts.header){ +tab.find(".tabs-inner").html($(opts.header)); +}else{ +var _376=tab.find("span.tabs-title"); +var _377=tab.find("span.tabs-icon"); +_376.html(opts.title); +_377.attr("class","tabs-icon"); +tab.find("a.tabs-close").remove(); +if(opts.closable){ +_376.addClass("tabs-closable"); +$("").appendTo(tab); +}else{ +_376.removeClass("tabs-closable"); +} +if(opts.iconCls){ +_376.addClass("tabs-with-icon"); +_377.addClass(opts.iconCls); +}else{ +_376.removeClass("tabs-with-icon"); +} +if(opts.tools){ +var _378=tab.find("span.tabs-p-tool"); +if(!_378.length){ +var _378=$("").insertAfter(tab.find("a.tabs-inner")); +} +if($.isArray(opts.tools)){ +_378.empty(); +for(var i=0;i").appendTo(_378); +t.addClass(opts.tools[i].iconCls); +if(opts.tools[i].handler){ +t.bind("click",{handler:opts.tools[i].handler},function(e){ +if($(this).parents("li").hasClass("tabs-disabled")){ +return; +} +e.data.handler.call(this); +}); +} +} +}else{ +$(opts.tools).children().appendTo(_378); +} +var pr=_378.children().length*12; +if(opts.closable){ +pr+=8; +_378.css("right",""); +}else{ +pr-=3; +_378.css("right","5px"); +} +_376.css("padding-right",pr+"px"); +}else{ +tab.find("span.tabs-p-tool").remove(); +_376.css("padding-right",""); +} +} +} +if(opts.disabled){ +opts.tab.addClass("tabs-disabled"); +}else{ +opts.tab.removeClass("tabs-disabled"); +} +_33e(_372); +$.data(_372,"tabs").options.onUpdate.call(_372,opts.title,_36b(_372,pp)); +}; +function _379(_37a,_37b){ +var _37c=$.data(_37a,"tabs"); +var opts=_37c.options; +var tabs=_37c.tabs; +var _37d=_37c.selectHis; +if(!_37e(_37a,_37b)){ +return; +} +var tab=_37f(_37a,_37b); +var _380=tab.panel("options").title; +var _381=_36b(_37a,tab); +if(opts.onBeforeClose.call(_37a,_380,_381)==false){ +return; +} +var tab=_37f(_37a,_37b,true); +tab.panel("options").tab.remove(); +tab.panel("destroy"); +opts.onClose.call(_37a,_380,_381); +_33e(_37a); +var his=[]; +for(var i=0;i<_37d.length;i++){ +var _382=_37d[i]; +if(_382!=_381){ +his.push(_382>_381?_382-1:_382); +} +} +_37c.selectHis=his; +var _383=$(_37a).tabs("getSelected"); +if(!_383&&his.length){ +_381=_37c.selectHis.pop(); +$(_37a).tabs("select",_381); +} +}; +function _37f(_384,_385,_386){ +var tabs=$.data(_384,"tabs").tabs; +var tab=null; +if(typeof _385=="number"){ +if(_385>=0&&_385"); +for(var i=0;i.tabs-header>.tabs-tool"); +if(_39b){ +tool.removeClass("tabs-tool-hidden").show(); +}else{ +tool.addClass("tabs-tool-hidden").hide(); +} +$(_39a).tabs("resize").tabs("scrollBy",0); +}; +$.fn.tabs=function(_39c,_39d){ +if(typeof _39c=="string"){ +return $.fn.tabs.methods[_39c](this,_39d); +} +_39c=_39c||{}; +return this.each(function(){ +var _39e=$.data(this,"tabs"); +if(_39e){ +$.extend(_39e.options,_39c); +}else{ +$.data(this,"tabs",{options:$.extend({},$.fn.tabs.defaults,$.fn.tabs.parseOptions(this),_39c),tabs:[],selectHis:[]}); +_350(this); +} +_33a(this); +_35b(this); +_33e(this); +_354(this); +_38a(this); +}); +}; +$.fn.tabs.methods={options:function(jq){ +var cc=jq[0]; +var opts=$.data(cc,"tabs").options; +var s=_34c(cc); +opts.selected=s?_36b(cc,s):-1; +return opts; +},tabs:function(jq){ +return $.data(jq[0],"tabs").tabs; +},resize:function(jq,_39f){ +return jq.each(function(){ +_33e(this,_39f); +_34a(this); +}); +},add:function(jq,_3a0){ +return jq.each(function(){ +_36c(this,_3a0); +}); +},close:function(jq,_3a1){ +return jq.each(function(){ +_379(this,_3a1); +}); +},getTab:function(jq,_3a2){ +return _37f(jq[0],_3a2); +},getTabIndex:function(jq,tab){ +return _36b(jq[0],tab); +},getSelected:function(jq){ +return _34c(jq[0]); +},select:function(jq,_3a3){ +return jq.each(function(){ +_370(this,_3a3); +}); +},unselect:function(jq,_3a4){ +return jq.each(function(){ +_390(this,_3a4); +}); +},exists:function(jq,_3a5){ +return _37e(jq[0],_3a5); +},update:function(jq,_3a6){ +return jq.each(function(){ +_371(this,_3a6); +}); +},enableTab:function(jq,_3a7){ +return jq.each(function(){ +var opts=$(this).tabs("getTab",_3a7).panel("options"); +opts.tab.removeClass("tabs-disabled"); +opts.disabled=false; +}); +},disableTab:function(jq,_3a8){ +return jq.each(function(){ +var opts=$(this).tabs("getTab",_3a8).panel("options"); +opts.tab.addClass("tabs-disabled"); +opts.disabled=true; +}); +},showHeader:function(jq){ +return jq.each(function(){ +_396(this,true); +}); +},hideHeader:function(jq){ +return jq.each(function(){ +_396(this,false); +}); +},showTool:function(jq){ +return jq.each(function(){ +_399(this,true); +}); +},hideTool:function(jq){ +return jq.each(function(){ +_399(this,false); +}); +},scrollBy:function(jq,_3a9){ +return jq.each(function(){ +var opts=$(this).tabs("options"); +var wrap=$(this).find(">div.tabs-header>div.tabs-wrap"); +var pos=Math.min(wrap._scrollLeft()+_3a9,_3aa()); +wrap.animate({scrollLeft:pos},opts.scrollDuration); +function _3aa(){ +var w=0; +var ul=wrap.children("ul"); +ul.children("li").each(function(){ +w+=$(this).outerWidth(true); +}); +return w-wrap.width()+(ul.outerWidth()-ul.width()); +}; +}); +}}; +$.fn.tabs.parseOptions=function(_3ab){ +return $.extend({},$.parser.parseOptions(_3ab,["tools","toolPosition","tabPosition",{fit:"boolean",border:"boolean",plain:"boolean"},{headerWidth:"number",tabWidth:"number",tabHeight:"number",selected:"number"},{showHeader:"boolean",justified:"boolean",narrow:"boolean",pill:"boolean"}])); +}; +$.fn.tabs.defaults={width:"auto",height:"auto",headerWidth:150,tabWidth:"auto",tabHeight:32,selected:0,showHeader:true,plain:false,fit:false,border:true,justified:false,narrow:false,pill:false,tools:null,toolPosition:"right",tabPosition:"top",scrollIncrement:100,scrollDuration:400,onLoad:function(_3ac){ +},onSelect:function(_3ad,_3ae){ +},onUnselect:function(_3af,_3b0){ +},onBeforeClose:function(_3b1,_3b2){ +},onClose:function(_3b3,_3b4){ +},onAdd:function(_3b5,_3b6){ +},onUpdate:function(_3b7,_3b8){ +},onContextMenu:function(e,_3b9,_3ba){ +}}; +})(jQuery); +(function($){ +var _3bb=false; +function _3bc(_3bd,_3be){ +var _3bf=$.data(_3bd,"layout"); +var opts=_3bf.options; +var _3c0=_3bf.panels; +var cc=$(_3bd); +if(_3be){ +$.extend(opts,{width:_3be.width,height:_3be.height}); +} +if(_3bd.tagName.toLowerCase()=="body"){ +cc._size("fit"); +}else{ +cc._size(opts); +} +var cpos={top:0,left:0,width:cc.width(),height:cc.height()}; +_3c1(_3c2(_3c0.expandNorth)?_3c0.expandNorth:_3c0.north,"n"); +_3c1(_3c2(_3c0.expandSouth)?_3c0.expandSouth:_3c0.south,"s"); +_3c3(_3c2(_3c0.expandEast)?_3c0.expandEast:_3c0.east,"e"); +_3c3(_3c2(_3c0.expandWest)?_3c0.expandWest:_3c0.west,"w"); +_3c0.center.panel("resize",cpos); +function _3c1(pp,type){ +if(!pp.length||!_3c2(pp)){ +return; +} +var opts=pp.panel("options"); +pp.panel("resize",{width:cc.width(),height:opts.height}); +var _3c4=pp.panel("panel").outerHeight(); +pp.panel("move",{left:0,top:(type=="n"?0:cc.height()-_3c4)}); +cpos.height-=_3c4; +if(type=="n"){ +cpos.top+=_3c4; +if(!opts.split&&opts.border){ +cpos.top--; +} +} +if(!opts.split&&opts.border){ +cpos.height++; +} +}; +function _3c3(pp,type){ +if(!pp.length||!_3c2(pp)){ +return; +} +var opts=pp.panel("options"); +pp.panel("resize",{width:opts.width,height:cpos.height}); +var _3c5=pp.panel("panel").outerWidth(); +pp.panel("move",{left:(type=="e"?cc.width()-_3c5:0),top:cpos.top}); +cpos.width-=_3c5; +if(type=="w"){ +cpos.left+=_3c5; +if(!opts.split&&opts.border){ +cpos.left--; +} +} +if(!opts.split&&opts.border){ +cpos.width++; +} +}; +}; +function init(_3c6){ +var cc=$(_3c6); +cc.addClass("layout"); +function _3c7(el){ +var _3c8=$.fn.layout.parsePanelOptions(el); +if("north,south,east,west,center".indexOf(_3c8.region)>=0){ +_3cb(_3c6,_3c8,el); +} +}; +var opts=cc.layout("options"); +var _3c9=opts.onAdd; +opts.onAdd=function(){ +}; +cc.find(">div,>form>div").each(function(){ +_3c7(this); +}); +opts.onAdd=_3c9; +cc.append("
                                                                                                "); +cc.bind("_resize",function(e,_3ca){ +if($(this).hasClass("easyui-fluid")||_3ca){ +_3bc(_3c6); +} +return false; +}); +}; +function _3cb(_3cc,_3cd,el){ +_3cd.region=_3cd.region||"center"; +var _3ce=$.data(_3cc,"layout").panels; +var cc=$(_3cc); +var dir=_3cd.region; +if(_3ce[dir].length){ +return; +} +var pp=$(el); +if(!pp.length){ +pp=$("
                                                                                                ").appendTo(cc); +} +var _3cf=$.extend({},$.fn.layout.paneldefaults,{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),doSize:false,collapsible:true,onOpen:function(){ +var tool=$(this).panel("header").children("div.panel-tool"); +tool.children("a.panel-tool-collapse").hide(); +var _3d0={north:"up",south:"down",east:"right",west:"left"}; +if(!_3d0[dir]){ +return; +} +var _3d1="layout-button-"+_3d0[dir]; +var t=tool.children("a."+_3d1); +if(!t.length){ +t=$("").addClass(_3d1).appendTo(tool); +t.bind("click",{dir:dir},function(e){ +_3e8(_3cc,e.data.dir); +return false; +}); +} +$(this).panel("options").collapsible?t.show():t.hide(); +}},_3cd,{cls:((_3cd.cls||"")+" layout-panel layout-panel-"+dir),bodyCls:((_3cd.bodyCls||"")+" layout-body")}); +pp.panel(_3cf); +_3ce[dir]=pp; +var _3d2={north:"s",south:"n",east:"w",west:"e"}; +var _3d3=pp.panel("panel"); +if(pp.panel("options").split){ +_3d3.addClass("layout-split-"+dir); +} +_3d3.resizable($.extend({},{handles:(_3d2[dir]||""),disabled:(!pp.panel("options").split),onStartResize:function(e){ +_3bb=true; +if(dir=="north"||dir=="south"){ +var _3d4=$(">div.layout-split-proxy-v",_3cc); +}else{ +var _3d4=$(">div.layout-split-proxy-h",_3cc); +} +var top=0,left=0,_3d5=0,_3d6=0; +var pos={display:"block"}; +if(dir=="north"){ +pos.top=parseInt(_3d3.css("top"))+_3d3.outerHeight()-_3d4.height(); +pos.left=parseInt(_3d3.css("left")); +pos.width=_3d3.outerWidth(); +pos.height=_3d4.height(); +}else{ +if(dir=="south"){ +pos.top=parseInt(_3d3.css("top")); +pos.left=parseInt(_3d3.css("left")); +pos.width=_3d3.outerWidth(); +pos.height=_3d4.height(); +}else{ +if(dir=="east"){ +pos.top=parseInt(_3d3.css("top"))||0; +pos.left=parseInt(_3d3.css("left"))||0; +pos.width=_3d4.width(); +pos.height=_3d3.outerHeight(); +}else{ +if(dir=="west"){ +pos.top=parseInt(_3d3.css("top"))||0; +pos.left=_3d3.outerWidth()-_3d4.width(); +pos.width=_3d4.width(); +pos.height=_3d3.outerHeight(); +} +} +} +} +_3d4.css(pos); +$("
                                                                                                ").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc); +},onResize:function(e){ +if(dir=="north"||dir=="south"){ +var _3d7=_3d8(this); +$(this).resizable("options").maxHeight=_3d7; +var _3d9=$(">div.layout-split-proxy-v",_3cc); +var top=dir=="north"?e.data.height-_3d9.height():$(_3cc).height()-e.data.height; +_3d9.css("top",top); +}else{ +var _3da=_3d8(this); +$(this).resizable("options").maxWidth=_3da; +var _3d9=$(">div.layout-split-proxy-h",_3cc); +var left=dir=="west"?e.data.width-_3d9.width():$(_3cc).width()-e.data.width; +_3d9.css("left",left); +} +return false; +},onStopResize:function(e){ +cc.children("div.layout-split-proxy-v,div.layout-split-proxy-h").hide(); +pp.panel("resize",e.data); +_3bc(_3cc); +_3bb=false; +cc.find(">div.layout-mask").remove(); +}},_3cd)); +cc.layout("options").onAdd.call(_3cc,dir); +function _3d8(p){ +var _3db="expand"+dir.substring(0,1).toUpperCase()+dir.substring(1); +var _3dc=_3ce["center"]; +var _3dd=(dir=="north"||dir=="south")?"minHeight":"minWidth"; +var _3de=(dir=="north"||dir=="south")?"maxHeight":"maxWidth"; +var _3df=(dir=="north"||dir=="south")?"_outerHeight":"_outerWidth"; +var _3e0=$.parser.parseValue(_3de,_3ce[dir].panel("options")[_3de],$(_3cc)); +var _3e1=$.parser.parseValue(_3dd,_3dc.panel("options")[_3dd],$(_3cc)); +var _3e2=_3dc.panel("panel")[_3df]()-_3e1; +if(_3c2(_3ce[_3db])){ +_3e2+=_3ce[_3db][_3df]()-1; +}else{ +_3e2+=$(p)[_3df](); +} +if(_3e2>_3e0){ +_3e2=_3e0; +} +return _3e2; +}; +}; +function _3e3(_3e4,_3e5){ +var _3e6=$.data(_3e4,"layout").panels; +if(_3e6[_3e5].length){ +_3e6[_3e5].panel("destroy"); +_3e6[_3e5]=$(); +var _3e7="expand"+_3e5.substring(0,1).toUpperCase()+_3e5.substring(1); +if(_3e6[_3e7]){ +_3e6[_3e7].panel("destroy"); +_3e6[_3e7]=undefined; +} +$(_3e4).layout("options").onRemove.call(_3e4,_3e5); +} +}; +function _3e8(_3e9,_3ea,_3eb){ +if(_3eb==undefined){ +_3eb="normal"; +} +var _3ec=$.data(_3e9,"layout").panels; +var p=_3ec[_3ea]; +var _3ed=p.panel("options"); +if(_3ed.onBeforeCollapse.call(p)==false){ +return; +} +var _3ee="expand"+_3ea.substring(0,1).toUpperCase()+_3ea.substring(1); +if(!_3ec[_3ee]){ +_3ec[_3ee]=_3ef(_3ea); +var ep=_3ec[_3ee].panel("panel"); +if(!_3ed.expandMode){ +ep.css("cursor","default"); +}else{ +ep.bind("click",function(){ +if(_3ed.expandMode=="dock"){ +_3fb(_3e9,_3ea); +}else{ +p.panel("expand",false).panel("open"); +var _3f0=_3f1(); +p.panel("resize",_3f0.collapse); +p.panel("panel").unbind(".layout").bind("mouseleave.layout",{region:_3ea},function(e){ +$(this).stop(true,true); +if(_3bb==true){ +return; +} +if($("body>div.combo-p>div.combo-panel:visible").length){ +return; +} +_3e8(_3e9,e.data.region); +}); +p.panel("panel").animate(_3f0.expand,function(){ +$(_3e9).layout("options").onExpand.call(_3e9,_3ea); +}); +} +return false; +}); +} +} +var _3f2=_3f1(); +if(!_3c2(_3ec[_3ee])){ +_3ec.center.panel("resize",_3f2.resizeC); +} +p.panel("panel").animate(_3f2.collapse,_3eb,function(){ +p.panel("collapse",false).panel("close"); +_3ec[_3ee].panel("open").panel("resize",_3f2.expandP); +$(this).unbind(".layout"); +$(_3e9).layout("options").onCollapse.call(_3e9,_3ea); +}); +function _3ef(dir){ +var _3f3={"east":"left","west":"right","north":"down","south":"up"}; +var isns=(_3ed.region=="north"||_3ed.region=="south"); +var icon="layout-button-"+_3f3[dir]; +var p=$("
                                                                                                ").appendTo(_3e9); +p.panel($.extend({},$.fn.layout.paneldefaults,{cls:("layout-expand layout-expand-"+dir),title:" ",titleDirection:_3ed.titleDirection,iconCls:(_3ed.hideCollapsedContent?null:_3ed.iconCls),closed:true,minWidth:0,minHeight:0,doSize:false,region:_3ed.region,collapsedSize:_3ed.collapsedSize,noheader:(!isns&&_3ed.hideExpandTool),tools:((isns&&_3ed.hideExpandTool)?null:[{iconCls:icon,handler:function(){ +_3fb(_3e9,_3ea); +return false; +}}]),onResize:function(){ +var _3f4=$(this).children(".layout-expand-title"); +if(_3f4.length){ +_3f4._outerWidth($(this).height()); +var left=($(this).width()-Math.min(_3f4._outerWidth(),_3f4._outerHeight()))/2; +var top=Math.max(_3f4._outerWidth(),_3f4._outerHeight()); +if(_3f4.hasClass("layout-expand-title-down")){ +left+=Math.min(_3f4._outerWidth(),_3f4._outerHeight()); +top=0; +} +_3f4.css({left:(left+"px"),top:(top+"px")}); +} +}})); +if(!_3ed.hideCollapsedContent){ +var _3f5=typeof _3ed.collapsedContent=="function"?_3ed.collapsedContent.call(p[0],_3ed.title):_3ed.collapsedContent; +isns?p.panel("setTitle",_3f5):p.html(_3f5); +} +p.panel("panel").hover(function(){ +$(this).addClass("layout-expand-over"); +},function(){ +$(this).removeClass("layout-expand-over"); +}); +return p; +}; +function _3f1(){ +var cc=$(_3e9); +var _3f6=_3ec.center.panel("options"); +var _3f7=_3ed.collapsedSize; +if(_3ea=="east"){ +var _3f8=p.panel("panel")._outerWidth(); +var _3f9=_3f6.width+_3f8-_3f7; +if(_3ed.split||!_3ed.border){ +_3f9++; +} +return {resizeC:{width:_3f9},expand:{left:cc.width()-_3f8},expandP:{top:_3f6.top,left:cc.width()-_3f7,width:_3f7,height:_3f6.height},collapse:{left:cc.width(),top:_3f6.top,height:_3f6.height}}; +}else{ +if(_3ea=="west"){ +var _3f8=p.panel("panel")._outerWidth(); +var _3f9=_3f6.width+_3f8-_3f7; +if(_3ed.split||!_3ed.border){ +_3f9++; +} +return {resizeC:{width:_3f9,left:_3f7-1},expand:{left:0},expandP:{left:0,top:_3f6.top,width:_3f7,height:_3f6.height},collapse:{left:-_3f8,top:_3f6.top,height:_3f6.height}}; +}else{ +if(_3ea=="north"){ +var _3fa=p.panel("panel")._outerHeight(); +var hh=_3f6.height; +if(!_3c2(_3ec.expandNorth)){ +hh+=_3fa-_3f7+((_3ed.split||!_3ed.border)?1:0); +} +_3ec.east.add(_3ec.west).add(_3ec.expandEast).add(_3ec.expandWest).panel("resize",{top:_3f7-1,height:hh}); +return {resizeC:{top:_3f7-1,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:_3f7},collapse:{top:-_3fa,width:cc.width()}}; +}else{ +if(_3ea=="south"){ +var _3fa=p.panel("panel")._outerHeight(); +var hh=_3f6.height; +if(!_3c2(_3ec.expandSouth)){ +hh+=_3fa-_3f7+((_3ed.split||!_3ed.border)?1:0); +} +_3ec.east.add(_3ec.west).add(_3ec.expandEast).add(_3ec.expandWest).panel("resize",{height:hh}); +return {resizeC:{height:hh},expand:{top:cc.height()-_3fa},expandP:{top:cc.height()-_3f7,left:0,width:cc.width(),height:_3f7},collapse:{top:cc.height(),width:cc.width()}}; +} +} +} +} +}; +}; +function _3fb(_3fc,_3fd){ +var _3fe=$.data(_3fc,"layout").panels; +var p=_3fe[_3fd]; +var _3ff=p.panel("options"); +if(_3ff.onBeforeExpand.call(p)==false){ +return; +} +var _400="expand"+_3fd.substring(0,1).toUpperCase()+_3fd.substring(1); +if(_3fe[_400]){ +_3fe[_400].panel("close"); +p.panel("panel").stop(true,true); +p.panel("expand",false).panel("open"); +var _401=_402(); +p.panel("resize",_401.collapse); +p.panel("panel").animate(_401.expand,function(){ +_3bc(_3fc); +$(_3fc).layout("options").onExpand.call(_3fc,_3fd); +}); +} +function _402(){ +var cc=$(_3fc); +var _403=_3fe.center.panel("options"); +if(_3fd=="east"&&_3fe.expandEast){ +return {collapse:{left:cc.width(),top:_403.top,height:_403.height},expand:{left:cc.width()-p.panel("panel")._outerWidth()}}; +}else{ +if(_3fd=="west"&&_3fe.expandWest){ +return {collapse:{left:-p.panel("panel")._outerWidth(),top:_403.top,height:_403.height},expand:{left:0}}; +}else{ +if(_3fd=="north"&&_3fe.expandNorth){ +return {collapse:{top:-p.panel("panel")._outerHeight(),width:cc.width()},expand:{top:0}}; +}else{ +if(_3fd=="south"&&_3fe.expandSouth){ +return {collapse:{top:cc.height(),width:cc.width()},expand:{top:cc.height()-p.panel("panel")._outerHeight()}}; +} +} +} +} +}; +}; +function _3c2(pp){ +if(!pp){ +return false; +} +if(pp.length){ +return pp.panel("panel").is(":visible"); +}else{ +return false; +} +}; +function _404(_405){ +var _406=$.data(_405,"layout"); +var opts=_406.options; +var _407=_406.panels; +var _408=opts.onCollapse; +opts.onCollapse=function(){ +}; +_409("east"); +_409("west"); +_409("north"); +_409("south"); +opts.onCollapse=_408; +function _409(_40a){ +var p=_407[_40a]; +if(p.length&&p.panel("options").collapsed){ +_3e8(_405,_40a,0); +} +}; +}; +function _40b(_40c,_40d,_40e){ +var p=$(_40c).layout("panel",_40d); +p.panel("options").split=_40e; +var cls="layout-split-"+_40d; +var _40f=p.panel("panel").removeClass(cls); +if(_40e){ +_40f.addClass(cls); +} +_40f.resizable({disabled:(!_40e)}); +_3bc(_40c); +}; +$.fn.layout=function(_410,_411){ +if(typeof _410=="string"){ +return $.fn.layout.methods[_410](this,_411); +} +_410=_410||{}; +return this.each(function(){ +var _412=$.data(this,"layout"); +if(_412){ +$.extend(_412.options,_410); +}else{ +var opts=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_410); +$.data(this,"layout",{options:opts,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}}); +init(this); +} +_3bc(this); +_404(this); +}); +}; +$.fn.layout.methods={options:function(jq){ +return $.data(jq[0],"layout").options; +},resize:function(jq,_413){ +return jq.each(function(){ +_3bc(this,_413); +}); +},panel:function(jq,_414){ +return $.data(jq[0],"layout").panels[_414]; +},collapse:function(jq,_415){ +return jq.each(function(){ +_3e8(this,_415); +}); +},expand:function(jq,_416){ +return jq.each(function(){ +_3fb(this,_416); +}); +},add:function(jq,_417){ +return jq.each(function(){ +_3cb(this,_417); +_3bc(this); +if($(this).layout("panel",_417.region).panel("options").collapsed){ +_3e8(this,_417.region,0); +} +}); +},remove:function(jq,_418){ +return jq.each(function(){ +_3e3(this,_418); +_3bc(this); +}); +},split:function(jq,_419){ +return jq.each(function(){ +_40b(this,_419,true); +}); +},unsplit:function(jq,_41a){ +return jq.each(function(){ +_40b(this,_41a,false); +}); +}}; +$.fn.layout.parseOptions=function(_41b){ +return $.extend({},$.parser.parseOptions(_41b,[{fit:"boolean"}])); +}; +$.fn.layout.defaults={fit:false,onExpand:function(_41c){ +},onCollapse:function(_41d){ +},onAdd:function(_41e){ +},onRemove:function(_41f){ +}}; +$.fn.layout.parsePanelOptions=function(_420){ +var t=$(_420); +return $.extend({},$.fn.panel.parseOptions(_420),$.parser.parseOptions(_420,["region",{split:"boolean",collpasedSize:"number",minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number"}])); +}; +$.fn.layout.paneldefaults=$.extend({},$.fn.panel.defaults,{region:null,split:false,collapsedSize:28,expandMode:"float",hideExpandTool:false,hideCollapsedContent:true,collapsedContent:function(_421){ +var p=$(this); +var opts=p.panel("options"); +if(opts.region=="north"||opts.region=="south"){ +return _421; +} +var cc=[]; +if(opts.iconCls){ +cc.push("
                                                                                                "); +} +cc.push("
                                                                                                "); +cc.push(_421); +cc.push("
                                                                                                "); +return cc.join(""); +},minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000}); +})(jQuery); +(function($){ +$(function(){ +$(document).unbind(".menu").bind("mousedown.menu",function(e){ +var m=$(e.target).closest("div.menu,div.combo-p"); +if(m.length){ +return; +} +$("body>div.menu-top:visible").not(".menu-inline").menu("hide"); +_422($("body>div.menu:visible").not(".menu-inline")); +}); +}); +function init(_423){ +var opts=$.data(_423,"menu").options; +$(_423).addClass("menu-top"); +opts.inline?$(_423).addClass("menu-inline"):$(_423).appendTo("body"); +$(_423).bind("_resize",function(e,_424){ +if($(this).hasClass("easyui-fluid")||_424){ +$(_423).menu("resize",_423); +} +return false; +}); +var _425=_426($(_423)); +for(var i=0;i<_425.length;i++){ +_429(_423,_425[i]); +} +function _426(menu){ +var _427=[]; +menu.addClass("menu"); +_427.push(menu); +if(!menu.hasClass("menu-content")){ +menu.children("div").each(function(){ +var _428=$(this).children("div"); +if(_428.length){ +_428.appendTo("body"); +this.submenu=_428; +var mm=_426(_428); +_427=_427.concat(mm); +} +}); +} +return _427; +}; +}; +function _429(_42a,div){ +var menu=$(div).addClass("menu"); +if(!menu.data("menu")){ +menu.data("menu",{options:$.parser.parseOptions(menu[0],["width","height"])}); +} +if(!menu.hasClass("menu-content")){ +menu.children("div").each(function(){ +_42b(_42a,this); +}); +$("
                                                                                                ").prependTo(menu); +} +_42c(_42a,menu); +if(!menu.hasClass("menu-inline")){ +menu.hide(); +} +_42d(_42a,menu); +}; +function _42b(_42e,div,_42f){ +var item=$(div); +var _430=$.extend({},$.parser.parseOptions(item[0],["id","name","iconCls","href",{separator:"boolean"}]),{disabled:(item.attr("disabled")?true:undefined),text:$.trim(item.html()),onclick:item[0].onclick},_42f||{}); +_430.onclick=_430.onclick||_430.handler||null; +item.data("menuitem",{options:_430}); +if(_430.separator){ +item.addClass("menu-sep"); +} +if(!item.hasClass("menu-sep")){ +item.addClass("menu-item"); +item.empty().append($("
                                                                                                ").html(_430.text)); +if(_430.iconCls){ +$("
                                                                                                ").addClass(_430.iconCls).appendTo(item); +} +if(_430.id){ +item.attr("id",_430.id); +} +if(_430.onclick){ +if(typeof _430.onclick=="string"){ +item.attr("onclick",_430.onclick); +}else{ +item[0].onclick=eval(_430.onclick); +} +} +if(_430.disabled){ +_431(_42e,item[0],true); +} +if(item[0].submenu){ +$("
                                                                                                ").appendTo(item); +} +} +}; +function _42c(_432,menu){ +var opts=$.data(_432,"menu").options; +var _433=menu.attr("style")||""; +var _434=menu.is(":visible"); +menu.css({display:"block",left:-10000,height:"auto",overflow:"hidden"}); +menu.find(".menu-item").each(function(){ +$(this)._outerHeight(opts.itemHeight); +$(this).find(".menu-text").css({height:(opts.itemHeight-2)+"px",lineHeight:(opts.itemHeight-2)+"px"}); +}); +menu.removeClass("menu-noline").addClass(opts.noline?"menu-noline":""); +var _435=menu.data("menu").options; +var _436=_435.width; +var _437=_435.height; +if(isNaN(parseInt(_436))){ +_436=0; +menu.find("div.menu-text").each(function(){ +if(_436<$(this).outerWidth()){ +_436=$(this).outerWidth(); +} +}); +_436=_436?_436+40:""; +} +var _438=menu.outerHeight(); +if(isNaN(parseInt(_437))){ +_437=_438; +if(menu.hasClass("menu-top")&&opts.alignTo){ +var at=$(opts.alignTo); +var h1=at.offset().top-$(document).scrollTop(); +var h2=$(window)._outerHeight()+$(document).scrollTop()-at.offset().top-at._outerHeight(); +_437=Math.min(_437,Math.max(h1,h2)); +}else{ +if(_437>$(window)._outerHeight()){ +_437=$(window).height(); +} +} +} +menu.attr("style",_433); +menu.show(); +menu._size($.extend({},_435,{width:_436,height:_437,minWidth:_435.minWidth||opts.minWidth,maxWidth:_435.maxWidth||opts.maxWidth})); +menu.find(".easyui-fluid").triggerHandler("_resize",[true]); +menu.css("overflow",menu.outerHeight()<_438?"auto":"hidden"); +menu.children("div.menu-line")._outerHeight(_438-2); +if(!_434){ +menu.hide(); +} +}; +function _42d(_439,menu){ +var _43a=$.data(_439,"menu"); +var opts=_43a.options; +menu.unbind(".menu"); +for(var _43b in opts.events){ +menu.bind(_43b+".menu",{target:_439},opts.events[_43b]); +} +}; +function _43c(e){ +var _43d=e.data.target; +var _43e=$.data(_43d,"menu"); +if(_43e.timer){ +clearTimeout(_43e.timer); +_43e.timer=null; +} +}; +function _43f(e){ +var _440=e.data.target; +var _441=$.data(_440,"menu"); +if(_441.options.hideOnUnhover){ +_441.timer=setTimeout(function(){ +_442(_440,$(_440).hasClass("menu-inline")); +},_441.options.duration); +} +}; +function _443(e){ +var _444=e.data.target; +var item=$(e.target).closest(".menu-item"); +if(item.length){ +item.siblings().each(function(){ +if(this.submenu){ +_422(this.submenu); +} +$(this).removeClass("menu-active"); +}); +item.addClass("menu-active"); +if(item.hasClass("menu-item-disabled")){ +item.addClass("menu-active-disabled"); +return; +} +var _445=item[0].submenu; +if(_445){ +$(_444).menu("show",{menu:_445,parent:item}); +} +} +}; +function _446(e){ +var item=$(e.target).closest(".menu-item"); +if(item.length){ +item.removeClass("menu-active menu-active-disabled"); +var _447=item[0].submenu; +if(_447){ +if(e.pageX>=parseInt(_447.css("left"))){ +item.addClass("menu-active"); +}else{ +_422(_447); +} +}else{ +item.removeClass("menu-active"); +} +} +}; +function _448(e){ +var _449=e.data.target; +var item=$(e.target).closest(".menu-item"); +if(item.length){ +var opts=$(_449).data("menu").options; +var _44a=item.data("menuitem").options; +if(_44a.disabled){ +return; +} +if(!item[0].submenu){ +_442(_449,opts.inline); +if(_44a.href){ +location.href=_44a.href; +} +} +item.trigger("mouseenter"); +opts.onClick.call(_449,$(_449).menu("getItem",item[0])); +} +}; +function _442(_44b,_44c){ +var _44d=$.data(_44b,"menu"); +if(_44d){ +if($(_44b).is(":visible")){ +_422($(_44b)); +if(_44c){ +$(_44b).show(); +}else{ +_44d.options.onHide.call(_44b); +} +} +} +return false; +}; +function _44e(_44f,_450){ +_450=_450||{}; +var left,top; +var opts=$.data(_44f,"menu").options; +var menu=$(_450.menu||_44f); +$(_44f).menu("resize",menu[0]); +if(menu.hasClass("menu-top")){ +$.extend(opts,_450); +left=opts.left; +top=opts.top; +if(opts.alignTo){ +var at=$(opts.alignTo); +left=at.offset().left; +top=at.offset().top+at._outerHeight(); +if(opts.align=="right"){ +left+=at.outerWidth()-menu.outerWidth(); +} +} +if(left+menu.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ +left=$(window)._outerWidth()+$(document).scrollLeft()-menu.outerWidth()-5; +} +if(left<0){ +left=0; +} +top=_451(top,opts.alignTo); +}else{ +var _452=_450.parent; +left=_452.offset().left+_452.outerWidth()-2; +if(left+menu.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){ +left=_452.offset().left-menu.outerWidth()+2; +} +top=_451(_452.offset().top-3); +} +function _451(top,_453){ +if(top+menu.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ +if(_453){ +top=$(_453).offset().top-menu._outerHeight(); +}else{ +top=$(window)._outerHeight()+$(document).scrollTop()-menu.outerHeight(); +} +} +if(top<0){ +top=0; +} +return top; +}; +menu.css(opts.position.call(_44f,menu[0],left,top)); +menu.show(0,function(){ +if(!menu[0].shadow){ +menu[0].shadow=$("
                                                                                                ").insertAfter(menu); +} +menu[0].shadow.css({display:(menu.hasClass("menu-inline")?"none":"block"),zIndex:$.fn.menu.defaults.zIndex++,left:menu.css("left"),top:menu.css("top"),width:menu.outerWidth(),height:menu.outerHeight()}); +menu.css("z-index",$.fn.menu.defaults.zIndex++); +if(menu.hasClass("menu-top")){ +opts.onShow.call(_44f); +} +}); +}; +function _422(menu){ +if(menu&&menu.length){ +_454(menu); +menu.find("div.menu-item").each(function(){ +if(this.submenu){ +_422(this.submenu); +} +$(this).removeClass("menu-active"); +}); +} +function _454(m){ +m.stop(true,true); +if(m[0].shadow){ +m[0].shadow.hide(); +} +m.hide(); +}; +}; +function _455(_456,_457){ +var _458=null; +var fn=$.isFunction(_457)?_457:function(item){ +for(var p in _457){ +if(item[p]!=_457[p]){ +return false; +} +} +return true; +}; +function find(menu){ +menu.children("div.menu-item").each(function(){ +var opts=$(this).data("menuitem").options; +if(fn.call(_456,opts)==true){ +_458=$(_456).menu("getItem",this); +}else{ +if(this.submenu&&!_458){ +find(this.submenu); +} +} +}); +}; +find($(_456)); +return _458; +}; +function _431(_459,_45a,_45b){ +var t=$(_45a); +if(t.hasClass("menu-item")){ +var opts=t.data("menuitem").options; +opts.disabled=_45b; +if(_45b){ +t.addClass("menu-item-disabled"); +t[0].onclick=null; +}else{ +t.removeClass("menu-item-disabled"); +t[0].onclick=opts.onclick; +} +} +}; +function _45c(_45d,_45e){ +var opts=$.data(_45d,"menu").options; +var menu=$(_45d); +if(_45e.parent){ +if(!_45e.parent.submenu){ +var _45f=$("
                                                                                                ").appendTo("body"); +_45e.parent.submenu=_45f; +$("
                                                                                                ").appendTo(_45e.parent); +_429(_45d,_45f); +} +menu=_45e.parent.submenu; +} +var div=$("
                                                                                                ").appendTo(menu); +_42b(_45d,div,_45e); +}; +function _460(_461,_462){ +function _463(el){ +if(el.submenu){ +el.submenu.children("div.menu-item").each(function(){ +_463(this); +}); +var _464=el.submenu[0].shadow; +if(_464){ +_464.remove(); +} +el.submenu.remove(); +} +$(el).remove(); +}; +_463(_462); +}; +function _465(_466,_467,_468){ +var menu=$(_467).parent(); +if(_468){ +$(_467).show(); +}else{ +$(_467).hide(); +} +_42c(_466,menu); +}; +function _469(_46a){ +$(_46a).children("div.menu-item").each(function(){ +_460(_46a,this); +}); +if(_46a.shadow){ +_46a.shadow.remove(); +} +$(_46a).remove(); +}; +$.fn.menu=function(_46b,_46c){ +if(typeof _46b=="string"){ +return $.fn.menu.methods[_46b](this,_46c); +} +_46b=_46b||{}; +return this.each(function(){ +var _46d=$.data(this,"menu"); +if(_46d){ +$.extend(_46d.options,_46b); +}else{ +_46d=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_46b)}); +init(this); +} +$(this).css({left:_46d.options.left,top:_46d.options.top}); +}); +}; +$.fn.menu.methods={options:function(jq){ +return $.data(jq[0],"menu").options; +},show:function(jq,pos){ +return jq.each(function(){ +_44e(this,pos); +}); +},hide:function(jq){ +return jq.each(function(){ +_442(this); +}); +},destroy:function(jq){ +return jq.each(function(){ +_469(this); +}); +},setText:function(jq,_46e){ +return jq.each(function(){ +var item=$(_46e.target).data("menuitem").options; +item.text=_46e.text; +$(_46e.target).children("div.menu-text").html(_46e.text); +}); +},setIcon:function(jq,_46f){ +return jq.each(function(){ +var item=$(_46f.target).data("menuitem").options; +item.iconCls=_46f.iconCls; +$(_46f.target).children("div.menu-icon").remove(); +if(_46f.iconCls){ +$("
                                                                                                ").addClass(_46f.iconCls).appendTo(_46f.target); +} +}); +},getItem:function(jq,_470){ +var item=$(_470).data("menuitem").options; +return $.extend({},item,{target:$(_470)[0]}); +},findItem:function(jq,text){ +if(typeof text=="string"){ +return _455(jq[0],function(item){ +return $("
                                                                                                "+item.text+"
                                                                                                ").text()==text; +}); +}else{ +return _455(jq[0],text); +} +},appendItem:function(jq,_471){ +return jq.each(function(){ +_45c(this,_471); +}); +},removeItem:function(jq,_472){ +return jq.each(function(){ +_460(this,_472); +}); +},enableItem:function(jq,_473){ +return jq.each(function(){ +_431(this,_473,false); +}); +},disableItem:function(jq,_474){ +return jq.each(function(){ +_431(this,_474,true); +}); +},showItem:function(jq,_475){ +return jq.each(function(){ +_465(this,_475,true); +}); +},hideItem:function(jq,_476){ +return jq.each(function(){ +_465(this,_476,false); +}); +},resize:function(jq,_477){ +return jq.each(function(){ +_42c(this,_477?$(_477):$(this)); +}); +}}; +$.fn.menu.parseOptions=function(_478){ +return $.extend({},$.parser.parseOptions(_478,[{minWidth:"number",itemHeight:"number",duration:"number",hideOnUnhover:"boolean"},{fit:"boolean",inline:"boolean",noline:"boolean"}])); +}; +$.fn.menu.defaults={zIndex:110000,left:0,top:0,alignTo:null,align:"left",minWidth:150,itemHeight:32,duration:100,hideOnUnhover:true,inline:false,fit:false,noline:false,events:{mouseenter:_43c,mouseleave:_43f,mouseover:_443,mouseout:_446,click:_448},position:function(_479,left,top){ +return {left:left,top:top}; +},onShow:function(){ +},onHide:function(){ +},onClick:function(item){ +}}; +})(jQuery); +(function($){ +var _47a=1; +function init(_47b){ +$(_47b).addClass("sidemenu"); +}; +function _47c(_47d,_47e){ +var opts=$(_47d).sidemenu("options"); +if(_47e){ +$.extend(opts,{width:_47e.width,height:_47e.height}); +} +$(_47d)._size(opts); +$(_47d).find(".accordion").accordion("resize"); +}; +function _47f(_480,_481,data){ +var opts=$(_480).sidemenu("options"); +var tt=$("
                                                                                                  ").appendTo(_481); +tt.tree({data:data,animate:opts.animate,onBeforeSelect:function(node){ +if(node.children){ +return false; +} +},onSelect:function(node){ +_482(_480,node.id); +},onExpand:function(node){ +_48d(_480,node); +},onCollapse:function(node){ +_48d(_480,node); +},onClick:function(node){ +if(node.children){ +if(node.state=="open"){ +$(node.target).addClass("tree-node-nonleaf-collapsed"); +}else{ +$(node.target).removeClass("tree-node-nonleaf-collapsed"); +} +$(this).tree("toggle",node.target); +} +}}); +tt.unbind(".sidemenu").bind("mouseleave.sidemenu",function(){ +$(_481).trigger("mouseleave"); +}); +_482(_480,opts.selectedItemId); +}; +function _483(_484,_485,data){ +var opts=$(_484).sidemenu("options"); +$(_485).tooltip({content:$("
                                                                                                  "),position:opts.floatMenuPosition,valign:"top",data:data,onUpdate:function(_486){ +var _487=$(this).tooltip("options"); +var data=_487.data; +_486.accordion({width:opts.floatMenuWidth,multiple:false}).accordion("add",{title:data.text,iconCls:data.iconCls,collapsed:false,collapsible:false}); +_47f(_484,_486.accordion("panels")[0],data.children); +},onShow:function(){ +var t=$(this); +var tip=t.tooltip("tip").addClass("sidemenu-tooltip"); +tip.children(".tooltip-content").addClass("sidemenu"); +tip.find(".accordion").accordion("resize"); +tip.unbind().bind("mouseenter",function(){ +t.tooltip("show"); +}).bind("mouseleave",function(){ +t.tooltip("hide"); +}); +},onPosition:function(){ +if(!opts.collapsed){ +$(this).tooltip("tip").css({left:-999999}); +} +}}); +}; +function _488(_489,_48a){ +$(_489).find(".sidemenu-tree").each(function(){ +_48a($(this)); +}); +$(_489).find(".tooltip-f").each(function(){ +var tip=$(this).tooltip("tip"); +if(tip){ +tip.find(".sidemenu-tree").each(function(){ +_48a($(this)); +}); +} +}); +}; +function _482(_48b,_48c){ +var opts=$(_48b).sidemenu("options"); +_488(_48b,function(t){ +t.find("div.tree-node-selected").removeClass("tree-node-selected"); +var node=t.tree("find",_48c); +if(node){ +$(node.target).addClass("tree-node-selected"); +opts.selectedItemId=node.id; +t.trigger("mouseleave"); +opts.onSelect.call(_48b,node); +} +}); +}; +function _48d(_48e,item){ +_488(_48e,function(t){ +var node=t.tree("find",item.id); +if(node){ +t.tree(item.state=="open"?"expand":"collapse",node.target); +} +}); +}; +function _48f(_490){ +var opts=$(_490).sidemenu("options"); +$(_490).empty(); +if(opts.data){ +$.easyui.forEach(opts.data,true,function(node){ +if(!node.id){ +node.id="_easyui_sidemenu_"+(_47a++); +} +if(!node.iconCls){ +node.iconCls="sidemenu-default-icon"; +} +if(node.children){ +node.nodeCls="tree-node-nonleaf"; +if(!node.state){ +node.state="closed"; +} +if(node.state=="open"){ +node.nodeCls="tree-node-nonleaf"; +}else{ +node.nodeCls="tree-node-nonleaf tree-node-nonleaf-collapsed"; +} +} +}); +var acc=$("
                                                                                                  ").appendTo(_490); +acc.accordion({fit:opts.height=="auto"?false:true,border:opts.border,multiple:opts.multiple}); +for(var i=0;i").addClass(opts.cls.arrow).appendTo(_4a0); +$("").addClass("m-btn-line").appendTo(_4a0); +} +$(_49f).menubutton("resize"); +if(opts.menu){ +$(opts.menu).menu({duration:opts.duration}); +var _4a1=$(opts.menu).menu("options"); +var _4a2=_4a1.onShow; +var _4a3=_4a1.onHide; +$.extend(_4a1,{onShow:function(){ +var _4a4=$(this).menu("options"); +var btn=$(_4a4.alignTo); +var opts=btn.menubutton("options"); +btn.addClass((opts.plain==true)?opts.cls.btn2:opts.cls.btn1); +_4a2.call(this); +},onHide:function(){ +var _4a5=$(this).menu("options"); +var btn=$(_4a5.alignTo); +var opts=btn.menubutton("options"); +btn.removeClass((opts.plain==true)?opts.cls.btn2:opts.cls.btn1); +_4a3.call(this); +}}); +} +}; +function _4a6(_4a7){ +var opts=$.data(_4a7,"menubutton").options; +var btn=$(_4a7); +var t=btn.find("."+opts.cls.trigger); +if(!t.length){ +t=btn; +} +t.unbind(".menubutton"); +var _4a8=null; +t.bind(opts.showEvent+".menubutton",function(){ +if(!_4a9()){ +_4a8=setTimeout(function(){ +_4aa(_4a7); +},opts.duration); +return false; +} +}).bind(opts.hideEvent+".menubutton",function(){ +if(_4a8){ +clearTimeout(_4a8); +} +$(opts.menu).triggerHandler("mouseleave"); +}); +function _4a9(){ +return $(_4a7).linkbutton("options").disabled; +}; +}; +function _4aa(_4ab){ +var opts=$(_4ab).menubutton("options"); +if(opts.disabled||!opts.menu){ +return; +} +$("body>div.menu-top").menu("hide"); +var btn=$(_4ab); +var mm=$(opts.menu); +if(mm.length){ +mm.menu("options").alignTo=btn; +mm.menu("show",{alignTo:btn,align:opts.menuAlign}); +} +btn.blur(); +}; +$.fn.menubutton=function(_4ac,_4ad){ +if(typeof _4ac=="string"){ +var _4ae=$.fn.menubutton.methods[_4ac]; +if(_4ae){ +return _4ae(this,_4ad); +}else{ +return this.linkbutton(_4ac,_4ad); +} +} +_4ac=_4ac||{}; +return this.each(function(){ +var _4af=$.data(this,"menubutton"); +if(_4af){ +$.extend(_4af.options,_4ac); +}else{ +$.data(this,"menubutton",{options:$.extend({},$.fn.menubutton.defaults,$.fn.menubutton.parseOptions(this),_4ac)}); +$(this)._propAttr("disabled",false); +} +init(this); +_4a6(this); +}); +}; +$.fn.menubutton.methods={options:function(jq){ +var _4b0=jq.linkbutton("options"); +return $.extend($.data(jq[0],"menubutton").options,{toggle:_4b0.toggle,selected:_4b0.selected,disabled:_4b0.disabled}); +},destroy:function(jq){ +return jq.each(function(){ +var opts=$(this).menubutton("options"); +if(opts.menu){ +$(opts.menu).menu("destroy"); +} +$(this).remove(); +}); +}}; +$.fn.menubutton.parseOptions=function(_4b1){ +var t=$(_4b1); +return $.extend({},$.fn.linkbutton.parseOptions(_4b1),$.parser.parseOptions(_4b1,["menu",{plain:"boolean",hasDownArrow:"boolean",duration:"number"}])); +}; +$.fn.menubutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,hasDownArrow:true,menu:null,menuAlign:"left",duration:100,showEvent:"mouseenter",hideEvent:"mouseleave",cls:{btn1:"m-btn-active",btn2:"m-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn"}}); +})(jQuery); +(function($){ +function init(_4b2){ +var opts=$.data(_4b2,"splitbutton").options; +$(_4b2).menubutton(opts); +$(_4b2).addClass("s-btn"); +}; +$.fn.splitbutton=function(_4b3,_4b4){ +if(typeof _4b3=="string"){ +var _4b5=$.fn.splitbutton.methods[_4b3]; +if(_4b5){ +return _4b5(this,_4b4); +}else{ +return this.menubutton(_4b3,_4b4); +} +} +_4b3=_4b3||{}; +return this.each(function(){ +var _4b6=$.data(this,"splitbutton"); +if(_4b6){ +$.extend(_4b6.options,_4b3); +}else{ +$.data(this,"splitbutton",{options:$.extend({},$.fn.splitbutton.defaults,$.fn.splitbutton.parseOptions(this),_4b3)}); +$(this)._propAttr("disabled",false); +} +init(this); +}); +}; +$.fn.splitbutton.methods={options:function(jq){ +var _4b7=jq.menubutton("options"); +var _4b8=$.data(jq[0],"splitbutton").options; +$.extend(_4b8,{disabled:_4b7.disabled,toggle:_4b7.toggle,selected:_4b7.selected}); +return _4b8; +}}; +$.fn.splitbutton.parseOptions=function(_4b9){ +var t=$(_4b9); +return $.extend({},$.fn.linkbutton.parseOptions(_4b9),$.parser.parseOptions(_4b9,["menu",{plain:"boolean",duration:"number"}])); +}; +$.fn.splitbutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100,cls:{btn1:"m-btn-active s-btn-active",btn2:"m-btn-plain-active s-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn-line"}}); +})(jQuery); +(function($){ +function init(_4ba){ +var _4bb=$(""+""+""+""+""+""+""+"").insertAfter(_4ba); +var t=$(_4ba); +t.addClass("switchbutton-f").hide(); +var name=t.attr("name"); +if(name){ +t.removeAttr("name").attr("switchbuttonName",name); +_4bb.find(".switchbutton-value").attr("name",name); +} +_4bb.bind("_resize",function(e,_4bc){ +if($(this).hasClass("easyui-fluid")||_4bc){ +_4bd(_4ba); +} +return false; +}); +return _4bb; +}; +function _4bd(_4be,_4bf){ +var _4c0=$.data(_4be,"switchbutton"); +var opts=_4c0.options; +var _4c1=_4c0.switchbutton; +if(_4bf){ +$.extend(opts,_4bf); +} +var _4c2=_4c1.is(":visible"); +if(!_4c2){ +_4c1.appendTo("body"); +} +_4c1._size(opts); +var w=_4c1.width(); +var h=_4c1.height(); +var w=_4c1.outerWidth(); +var h=_4c1.outerHeight(); +var _4c3=parseInt(opts.handleWidth)||_4c1.height(); +var _4c4=w*2-_4c3; +_4c1.find(".switchbutton-inner").css({width:_4c4+"px",height:h+"px",lineHeight:h+"px"}); +_4c1.find(".switchbutton-handle")._outerWidth(_4c3)._outerHeight(h).css({marginLeft:-_4c3/2+"px"}); +_4c1.find(".switchbutton-on").css({width:(w-_4c3/2)+"px",textIndent:(opts.reversed?"":"-")+_4c3/2+"px"}); +_4c1.find(".switchbutton-off").css({width:(w-_4c3/2)+"px",textIndent:(opts.reversed?"-":"")+_4c3/2+"px"}); +opts.marginWidth=w-_4c3; +_4c5(_4be,opts.checked,false); +if(!_4c2){ +_4c1.insertAfter(_4be); +} +}; +function _4c6(_4c7){ +var _4c8=$.data(_4c7,"switchbutton"); +var opts=_4c8.options; +var _4c9=_4c8.switchbutton; +var _4ca=_4c9.find(".switchbutton-inner"); +var on=_4ca.find(".switchbutton-on").html(opts.onText); +var off=_4ca.find(".switchbutton-off").html(opts.offText); +var _4cb=_4ca.find(".switchbutton-handle").html(opts.handleText); +if(opts.reversed){ +off.prependTo(_4ca); +on.insertAfter(_4cb); +}else{ +on.prependTo(_4ca); +off.insertAfter(_4cb); +} +_4c9.find(".switchbutton-value")._propAttr("checked",opts.checked); +_4c9.removeClass("switchbutton-disabled").addClass(opts.disabled?"switchbutton-disabled":""); +_4c9.removeClass("switchbutton-reversed").addClass(opts.reversed?"switchbutton-reversed":""); +_4c5(_4c7,opts.checked); +_4cc(_4c7,opts.readonly); +$(_4c7).switchbutton("setValue",opts.value); +}; +function _4c5(_4cd,_4ce,_4cf){ +var _4d0=$.data(_4cd,"switchbutton"); +var opts=_4d0.options; +opts.checked=_4ce; +var _4d1=_4d0.switchbutton.find(".switchbutton-inner"); +var _4d2=_4d1.find(".switchbutton-on"); +var _4d3=opts.reversed?(opts.checked?opts.marginWidth:0):(opts.checked?0:opts.marginWidth); +var dir=_4d2.css("float").toLowerCase(); +var css={}; +css["margin-"+dir]=-_4d3+"px"; +_4cf?_4d1.animate(css,200):_4d1.css(css); +var _4d4=_4d1.find(".switchbutton-value"); +var ck=_4d4.is(":checked"); +$(_4cd).add(_4d4)._propAttr("checked",opts.checked); +if(ck!=opts.checked){ +opts.onChange.call(_4cd,opts.checked); +} +}; +function _4d5(_4d6,_4d7){ +var _4d8=$.data(_4d6,"switchbutton"); +var opts=_4d8.options; +var _4d9=_4d8.switchbutton; +var _4da=_4d9.find(".switchbutton-value"); +if(_4d7){ +opts.disabled=true; +$(_4d6).add(_4da)._propAttr("disabled",true); +_4d9.addClass("switchbutton-disabled"); +}else{ +opts.disabled=false; +$(_4d6).add(_4da)._propAttr("disabled",false); +_4d9.removeClass("switchbutton-disabled"); +} +}; +function _4cc(_4db,mode){ +var _4dc=$.data(_4db,"switchbutton"); +var opts=_4dc.options; +opts.readonly=mode==undefined?true:mode; +_4dc.switchbutton.removeClass("switchbutton-readonly").addClass(opts.readonly?"switchbutton-readonly":""); +}; +function _4dd(_4de){ +var _4df=$.data(_4de,"switchbutton"); +var opts=_4df.options; +_4df.switchbutton.unbind(".switchbutton").bind("click.switchbutton",function(){ +if(!opts.disabled&&!opts.readonly){ +_4c5(_4de,opts.checked?false:true,true); +} +}); +}; +$.fn.switchbutton=function(_4e0,_4e1){ +if(typeof _4e0=="string"){ +return $.fn.switchbutton.methods[_4e0](this,_4e1); +} +_4e0=_4e0||{}; +return this.each(function(){ +var _4e2=$.data(this,"switchbutton"); +if(_4e2){ +$.extend(_4e2.options,_4e0); +}else{ +_4e2=$.data(this,"switchbutton",{options:$.extend({},$.fn.switchbutton.defaults,$.fn.switchbutton.parseOptions(this),_4e0),switchbutton:init(this)}); +} +_4e2.options.originalChecked=_4e2.options.checked; +_4c6(this); +_4bd(this); +_4dd(this); +}); +}; +$.fn.switchbutton.methods={options:function(jq){ +var _4e3=jq.data("switchbutton"); +return $.extend(_4e3.options,{value:_4e3.switchbutton.find(".switchbutton-value").val()}); +},resize:function(jq,_4e4){ +return jq.each(function(){ +_4bd(this,_4e4); +}); +},enable:function(jq){ +return jq.each(function(){ +_4d5(this,false); +}); +},disable:function(jq){ +return jq.each(function(){ +_4d5(this,true); +}); +},readonly:function(jq,mode){ +return jq.each(function(){ +_4cc(this,mode); +}); +},check:function(jq){ +return jq.each(function(){ +_4c5(this,true); +}); +},uncheck:function(jq){ +return jq.each(function(){ +_4c5(this,false); +}); +},clear:function(jq){ +return jq.each(function(){ +_4c5(this,false); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).switchbutton("options"); +_4c5(this,opts.originalChecked); +}); +},setValue:function(jq,_4e5){ +return jq.each(function(){ +$(this).val(_4e5); +$.data(this,"switchbutton").switchbutton.find(".switchbutton-value").val(_4e5); +}); +}}; +$.fn.switchbutton.parseOptions=function(_4e6){ +var t=$(_4e6); +return $.extend({},$.parser.parseOptions(_4e6,["onText","offText","handleText",{handleWidth:"number",reversed:"boolean"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)}); +}; +$.fn.switchbutton.defaults={handleWidth:"auto",width:60,height:30,checked:false,disabled:false,readonly:false,reversed:false,onText:"ON",offText:"OFF",handleText:"",value:"on",onChange:function(_4e7){ +}}; +})(jQuery); +(function($){ +function init(_4e8){ +$(_4e8).addClass("validatebox-text"); +}; +function _4e9(_4ea){ +var _4eb=$.data(_4ea,"validatebox"); +_4eb.validating=false; +if(_4eb.vtimer){ +clearTimeout(_4eb.vtimer); +} +if(_4eb.ftimer){ +clearTimeout(_4eb.ftimer); +} +$(_4ea).tooltip("destroy"); +$(_4ea).unbind(); +$(_4ea).remove(); +}; +function _4ec(_4ed){ +var opts=$.data(_4ed,"validatebox").options; +$(_4ed).unbind(".validatebox"); +if(opts.novalidate||opts.disabled){ +return; +} +for(var _4ee in opts.events){ +$(_4ed).bind(_4ee+".validatebox",{target:_4ed},opts.events[_4ee]); +} +}; +function _4ef(e){ +var _4f0=e.data.target; +var _4f1=$.data(_4f0,"validatebox"); +var opts=_4f1.options; +if($(_4f0).attr("readonly")){ +return; +} +_4f1.validating=true; +_4f1.value=opts.val(_4f0); +(function(){ +if(!$(_4f0).is(":visible")){ +_4f1.validating=false; +} +if(_4f1.validating){ +var _4f2=opts.val(_4f0); +if(_4f1.value!=_4f2){ +_4f1.value=_4f2; +if(_4f1.vtimer){ +clearTimeout(_4f1.vtimer); +} +_4f1.vtimer=setTimeout(function(){ +$(_4f0).validatebox("validate"); +},opts.delay); +}else{ +if(_4f1.message){ +opts.err(_4f0,_4f1.message); +} +} +_4f1.ftimer=setTimeout(arguments.callee,opts.interval); +} +})(); +}; +function _4f3(e){ +var _4f4=e.data.target; +var _4f5=$.data(_4f4,"validatebox"); +var opts=_4f5.options; +_4f5.validating=false; +if(_4f5.vtimer){ +clearTimeout(_4f5.vtimer); +_4f5.vtimer=undefined; +} +if(_4f5.ftimer){ +clearTimeout(_4f5.ftimer); +_4f5.ftimer=undefined; +} +if(opts.validateOnBlur){ +setTimeout(function(){ +$(_4f4).validatebox("validate"); +},0); +} +opts.err(_4f4,_4f5.message,"hide"); +}; +function _4f6(e){ +var _4f7=e.data.target; +var _4f8=$.data(_4f7,"validatebox"); +_4f8.options.err(_4f7,_4f8.message,"show"); +}; +function _4f9(e){ +var _4fa=e.data.target; +var _4fb=$.data(_4fa,"validatebox"); +if(!_4fb.validating){ +_4fb.options.err(_4fa,_4fb.message,"hide"); +} +}; +function _4fc(_4fd,_4fe,_4ff){ +var _500=$.data(_4fd,"validatebox"); +var opts=_500.options; +var t=$(_4fd); +if(_4ff=="hide"||!_4fe){ +t.tooltip("hide"); +}else{ +if((t.is(":focus")&&_500.validating)||_4ff=="show"){ +t.tooltip($.extend({},opts.tipOptions,{content:_4fe,position:opts.tipPosition,deltaX:opts.deltaX,deltaY:opts.deltaY})).tooltip("show"); +} +} +}; +function _501(_502){ +var _503=$.data(_502,"validatebox"); +var opts=_503.options; +var box=$(_502); +opts.onBeforeValidate.call(_502); +var _504=_505(); +_504?box.removeClass("validatebox-invalid"):box.addClass("validatebox-invalid"); +opts.err(_502,_503.message); +opts.onValidate.call(_502,_504); +return _504; +function _506(msg){ +_503.message=msg; +}; +function _507(_508,_509){ +var _50a=opts.val(_502); +var _50b=/([a-zA-Z_]+)(.*)/.exec(_508); +var rule=opts.rules[_50b[1]]; +if(rule&&_50a){ +var _50c=_509||opts.validParams||eval(_50b[2]); +if(!rule["validator"].call(_502,_50a,_50c)){ +var _50d=rule["message"]; +if(_50c){ +for(var i=0;i<_50c.length;i++){ +_50d=_50d.replace(new RegExp("\\{"+i+"\\}","g"),_50c[i]); +} +} +_506(opts.invalidMessage||_50d); +return false; +} +} +return true; +}; +function _505(){ +_506(""); +if(!opts._validateOnCreate){ +setTimeout(function(){ +opts._validateOnCreate=true; +},0); +return true; +} +if(opts.novalidate||opts.disabled){ +return true; +} +if(opts.required){ +if(opts.val(_502)==""){ +_506(opts.missingMessage); +return false; +} +} +if(opts.validType){ +if($.isArray(opts.validType)){ +for(var i=0;i=_520[0]&&len<=_520[1]; +},message:"Please enter a value between {0} and {1}."},remote:{validator:function(_521,_522){ +var data={}; +data[_522[1]]=_521; +var _523=$.ajax({url:_522[0],dataType:"json",data:data,async:false,cache:false,type:"post"}).responseText; +return _523=="true"; +},message:"Please fix this field."}},onBeforeValidate:function(){ +},onValidate:function(_524){ +}}; +})(jQuery); +(function($){ +var _525=0; +function init(_526){ +$(_526).addClass("textbox-f").hide(); +var span=$(""+""+""+"").insertAfter(_526); +var name=$(_526).attr("name"); +if(name){ +span.find("input.textbox-value").attr("name",name); +$(_526).removeAttr("name").attr("textboxName",name); +} +return span; +}; +function _527(_528){ +var _529=$.data(_528,"textbox"); +var opts=_529.options; +var tb=_529.textbox; +var _52a="_easyui_textbox_input"+(++_525); +tb.addClass(opts.cls); +tb.find(".textbox-text").remove(); +if(opts.multiline){ +$("").prependTo(tb); +}else{ +$("").prependTo(tb); +} +$("#"+_52a).attr("tabindex",$(_528).attr("tabindex")||"").css("text-align",_528.style.textAlign||""); +tb.find(".textbox-addon").remove(); +var bb=opts.icons?$.extend(true,[],opts.icons):[]; +if(opts.iconCls){ +bb.push({iconCls:opts.iconCls,disabled:true}); +} +if(bb.length){ +var bc=$("").prependTo(tb); +bc.addClass("textbox-addon-"+opts.iconAlign); +for(var i=0;i"); +} +} +tb.find(".textbox-button").remove(); +if(opts.buttonText||opts.buttonIcon){ +var btn=$("").prependTo(tb); +btn.addClass("textbox-button-"+opts.buttonAlign).linkbutton({text:opts.buttonText,iconCls:opts.buttonIcon,onClick:function(){ +var t=$(this).parent().prev(); +t.textbox("options").onClickButton.call(t[0]); +}}); +} +if(opts.label){ +if(typeof opts.label=="object"){ +_529.label=$(opts.label); +_529.label.attr("for",_52a); +}else{ +$(_529.label).remove(); +_529.label=$("").html(opts.label); +_529.label.css("textAlign",opts.labelAlign).attr("for",_52a); +if(opts.labelPosition=="after"){ +_529.label.insertAfter(tb); +}else{ +_529.label.insertBefore(_528); +} +_529.label.removeClass("textbox-label-left textbox-label-right textbox-label-top"); +_529.label.addClass("textbox-label-"+opts.labelPosition); +} +}else{ +$(_529.label).remove(); +} +_52b(_528); +_52c(_528,opts.disabled); +_52d(_528,opts.readonly); +}; +function _52e(_52f){ +var _530=$.data(_52f,"textbox"); +var tb=_530.textbox; +tb.find(".textbox-text").validatebox("destroy"); +tb.remove(); +$(_530.label).remove(); +$(_52f).remove(); +}; +function _531(_532,_533){ +var _534=$.data(_532,"textbox"); +var opts=_534.options; +var tb=_534.textbox; +var _535=tb.parent(); +if(_533){ +if(typeof _533=="object"){ +$.extend(opts,_533); +}else{ +opts.width=_533; +} +} +if(isNaN(parseInt(opts.width))){ +var c=$(_532).clone(); +c.css("visibility","hidden"); +c.insertAfter(_532); +opts.width=c.outerWidth(); +c.remove(); +} +var _536=tb.is(":visible"); +if(!_536){ +tb.appendTo("body"); +} +var _537=tb.find(".textbox-text"); +var btn=tb.find(".textbox-button"); +var _538=tb.find(".textbox-addon"); +var _539=_538.find(".textbox-icon"); +if(opts.height=="auto"){ +_537.css({margin:"",paddingTop:"",paddingBottom:"",height:"",lineHeight:""}); +} +tb._size(opts,_535); +if(opts.label&&opts.labelPosition){ +if(opts.labelPosition=="top"){ +_534.label._size({width:opts.labelWidth=="auto"?tb.outerWidth():opts.labelWidth},tb); +if(opts.height!="auto"){ +tb._size("height",tb.outerHeight()-_534.label.outerHeight()); +} +}else{ +_534.label._size({width:opts.labelWidth,height:tb.outerHeight()},tb); +if(!opts.multiline){ +_534.label.css("lineHeight",_534.label.height()+"px"); +} +tb._size("width",tb.outerWidth()-_534.label.outerWidth()); +} +} +if(opts.buttonAlign=="left"||opts.buttonAlign=="right"){ +btn.linkbutton("resize",{height:tb.height()}); +}else{ +btn.linkbutton("resize",{width:"100%"}); +} +var _53a=tb.width()-_539.length*opts.iconWidth-_53b("left")-_53b("right"); +var _53c=opts.height=="auto"?_537.outerHeight():(tb.height()-_53b("top")-_53b("bottom")); +_538.css(opts.iconAlign,_53b(opts.iconAlign)+"px"); +_538.css("top",_53b("top")+"px"); +_539.css({width:opts.iconWidth+"px",height:_53c+"px"}); +_537.css({paddingLeft:(_532.style.paddingLeft||""),paddingRight:(_532.style.paddingRight||""),marginLeft:_53d("left"),marginRight:_53d("right"),marginTop:_53b("top"),marginBottom:_53b("bottom")}); +if(opts.multiline){ +_537.css({paddingTop:(_532.style.paddingTop||""),paddingBottom:(_532.style.paddingBottom||"")}); +_537._outerHeight(_53c); +}else{ +_537.css({paddingTop:0,paddingBottom:0,height:_53c+"px",lineHeight:_53c+"px"}); +} +_537._outerWidth(_53a); +opts.onResizing.call(_532,opts.width,opts.height); +if(!_536){ +tb.insertAfter(_532); +} +opts.onResize.call(_532,opts.width,opts.height); +function _53d(_53e){ +return (opts.iconAlign==_53e?_538._outerWidth():0)+_53b(_53e); +}; +function _53b(_53f){ +var w=0; +btn.filter(".textbox-button-"+_53f).each(function(){ +if(_53f=="left"||_53f=="right"){ +w+=$(this).outerWidth(); +}else{ +w+=$(this).outerHeight(); +} +}); +return w; +}; +}; +function _52b(_540){ +var opts=$(_540).textbox("options"); +var _541=$(_540).textbox("textbox"); +_541.validatebox($.extend({},opts,{deltaX:function(_542){ +return $(_540).textbox("getTipX",_542); +},deltaY:function(_543){ +return $(_540).textbox("getTipY",_543); +},onBeforeValidate:function(){ +opts.onBeforeValidate.call(_540); +var box=$(this); +if(!box.is(":focus")){ +if(box.val()!==opts.value){ +opts.oldInputValue=box.val(); +box.val(opts.value); +} +} +},onValidate:function(_544){ +var box=$(this); +if(opts.oldInputValue!=undefined){ +box.val(opts.oldInputValue); +opts.oldInputValue=undefined; +} +var tb=box.parent(); +if(_544){ +tb.removeClass("textbox-invalid"); +}else{ +tb.addClass("textbox-invalid"); +} +opts.onValidate.call(_540,_544); +}})); +}; +function _545(_546){ +var _547=$.data(_546,"textbox"); +var opts=_547.options; +var tb=_547.textbox; +var _548=tb.find(".textbox-text"); +_548.attr("placeholder",opts.prompt); +_548.unbind(".textbox"); +$(_547.label).unbind(".textbox"); +if(!opts.disabled&&!opts.readonly){ +if(_547.label){ +$(_547.label).bind("click.textbox",function(e){ +if(!opts.hasFocusMe){ +_548.focus(); +$(_546).textbox("setSelectionRange",{start:0,end:_548.val().length}); +} +}); +} +_548.bind("blur.textbox",function(e){ +if(!tb.hasClass("textbox-focused")){ +return; +} +opts.value=$(this).val(); +if(opts.value==""){ +$(this).val(opts.prompt).addClass("textbox-prompt"); +}else{ +$(this).removeClass("textbox-prompt"); +} +tb.removeClass("textbox-focused"); +tb.closest(".form-field").removeClass("form-field-focused"); +}).bind("focus.textbox",function(e){ +opts.hasFocusMe=true; +if(tb.hasClass("textbox-focused")){ +return; +} +if($(this).val()!=opts.value){ +$(this).val(opts.value); +} +$(this).removeClass("textbox-prompt"); +tb.addClass("textbox-focused"); +tb.closest(".form-field").addClass("form-field-focused"); +}); +for(var _549 in opts.inputEvents){ +_548.bind(_549+".textbox",{target:_546},opts.inputEvents[_549]); +} +} +var _54a=tb.find(".textbox-addon"); +_54a.unbind().bind("click",{target:_546},function(e){ +var icon=$(e.target).closest("a.textbox-icon:not(.textbox-icon-disabled)"); +if(icon.length){ +var _54b=parseInt(icon.attr("icon-index")); +var conf=opts.icons[_54b]; +if(conf&&conf.handler){ +conf.handler.call(icon[0],e); +} +opts.onClickIcon.call(_546,_54b); +} +}); +_54a.find(".textbox-icon").each(function(_54c){ +var conf=opts.icons[_54c]; +var icon=$(this); +if(!conf||conf.disabled||opts.disabled||opts.readonly){ +icon.addClass("textbox-icon-disabled"); +}else{ +icon.removeClass("textbox-icon-disabled"); +} +}); +var btn=tb.find(".textbox-button"); +btn.linkbutton((opts.disabled||opts.readonly)?"disable":"enable"); +tb.unbind(".textbox").bind("_resize.textbox",function(e,_54d){ +if($(this).hasClass("easyui-fluid")||_54d){ +_531(_546); +} +return false; +}); +}; +function _52c(_54e,_54f){ +var _550=$.data(_54e,"textbox"); +var opts=_550.options; +var tb=_550.textbox; +var _551=tb.find(".textbox-text"); +var ss=$(_54e).add(tb.find(".textbox-value")); +opts.disabled=_54f; +if(opts.disabled){ +_551.blur(); +_551.validatebox("disable"); +tb.addClass("textbox-disabled"); +ss._propAttr("disabled",true); +$(_550.label).addClass("textbox-label-disabled"); +}else{ +_551.validatebox("enable"); +tb.removeClass("textbox-disabled"); +ss._propAttr("disabled",false); +$(_550.label).removeClass("textbox-label-disabled"); +} +}; +function _52d(_552,mode){ +var _553=$.data(_552,"textbox"); +var opts=_553.options; +var tb=_553.textbox; +var _554=tb.find(".textbox-text"); +opts.readonly=mode==undefined?true:mode; +if(opts.readonly){ +_554.triggerHandler("blur.textbox"); +} +_554.validatebox("readonly",opts.readonly); +tb.removeClass("textbox-readonly").addClass(opts.readonly?"textbox-readonly":""); +}; +$.fn.textbox=function(_555,_556){ +if(typeof _555=="string"){ +var _557=$.fn.textbox.methods[_555]; +if(_557){ +return _557(this,_556); +}else{ +return this.each(function(){ +var _558=$(this).textbox("textbox"); +_558.validatebox(_555,_556); +}); +} +} +_555=_555||{}; +return this.each(function(){ +var _559=$.data(this,"textbox"); +if(_559){ +$.extend(_559.options,_555); +if(_555.value!=undefined){ +_559.options.originalValue=_555.value; +} +}else{ +_559=$.data(this,"textbox",{options:$.extend({},$.fn.textbox.defaults,$.fn.textbox.parseOptions(this),_555),textbox:init(this)}); +_559.options.originalValue=_559.options.value; +} +_527(this); +_545(this); +if(_559.options.doSize){ +_531(this); +} +var _55a=_559.options.value; +_559.options.value=""; +$(this).textbox("initValue",_55a); +}); +}; +$.fn.textbox.methods={options:function(jq){ +return $.data(jq[0],"textbox").options; +},cloneFrom:function(jq,from){ +return jq.each(function(){ +var t=$(this); +if(t.data("textbox")){ +return; +} +if(!$(from).data("textbox")){ +$(from).textbox(); +} +var opts=$.extend(true,{},$(from).textbox("options")); +var name=t.attr("name")||""; +t.addClass("textbox-f").hide(); +t.removeAttr("name").attr("textboxName",name); +var span=$(from).next().clone().insertAfter(t); +var _55b="_easyui_textbox_input"+(++_525); +span.find(".textbox-value").attr("name",name); +span.find(".textbox-text").attr("id",_55b); +var _55c=$($(from).textbox("label")).clone(); +if(_55c.length){ +_55c.attr("for",_55b); +if(opts.labelPosition=="after"){ +_55c.insertAfter(t.next()); +}else{ +_55c.insertBefore(t); +} +} +$.data(this,"textbox",{options:opts,textbox:span,label:(_55c.length?_55c:undefined)}); +var _55d=$(from).textbox("button"); +if(_55d.length){ +t.textbox("button").linkbutton($.extend(true,{},_55d.linkbutton("options"))); +} +_545(this); +_52b(this); +}); +},textbox:function(jq){ +return $.data(jq[0],"textbox").textbox.find(".textbox-text"); +},button:function(jq){ +return $.data(jq[0],"textbox").textbox.find(".textbox-button"); +},label:function(jq){ +return $.data(jq[0],"textbox").label; +},destroy:function(jq){ +return jq.each(function(){ +_52e(this); +}); +},resize:function(jq,_55e){ +return jq.each(function(){ +_531(this,_55e); +}); +},disable:function(jq){ +return jq.each(function(){ +_52c(this,true); +_545(this); +}); +},enable:function(jq){ +return jq.each(function(){ +_52c(this,false); +_545(this); +}); +},readonly:function(jq,mode){ +return jq.each(function(){ +_52d(this,mode); +_545(this); +}); +},isValid:function(jq){ +return jq.textbox("textbox").validatebox("isValid"); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("setValue",""); +}); +},setText:function(jq,_55f){ +return jq.each(function(){ +var opts=$(this).textbox("options"); +var _560=$(this).textbox("textbox"); +_55f=_55f==undefined?"":String(_55f); +if($(this).textbox("getText")!=_55f){ +_560.val(_55f); +} +opts.value=_55f; +if(!_560.is(":focus")){ +if(_55f){ +_560.removeClass("textbox-prompt"); +}else{ +_560.val(opts.prompt).addClass("textbox-prompt"); +} +} +if(opts.value){ +$(this).closest(".form-field").removeClass("form-field-empty"); +}else{ +$(this).closest(".form-field").addClass("form-field-empty"); +} +$(this).textbox("validate"); +}); +},initValue:function(jq,_561){ +return jq.each(function(){ +var _562=$.data(this,"textbox"); +$(this).textbox("setText",_561); +_562.textbox.find(".textbox-value").val(_561); +$(this).val(_561); +}); +},setValue:function(jq,_563){ +return jq.each(function(){ +var opts=$.data(this,"textbox").options; +var _564=$(this).textbox("getValue"); +$(this).textbox("initValue",_563); +if(_564!=_563){ +opts.onChange.call(this,_563,_564); +$(this).closest("form").trigger("_change",[this]); +} +}); +},getText:function(jq){ +var _565=jq.textbox("textbox"); +if(_565.is(":focus")){ +return _565.val(); +}else{ +return jq.textbox("options").value; +} +},getValue:function(jq){ +return jq.data("textbox").textbox.find(".textbox-value").val(); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).textbox("options"); +$(this).textbox("textbox").val(opts.originalValue); +$(this).textbox("setValue",opts.originalValue); +}); +},getIcon:function(jq,_566){ +return jq.data("textbox").textbox.find(".textbox-icon:eq("+_566+")"); +},getTipX:function(jq,_567){ +var _568=jq.data("textbox"); +var opts=_568.options; +var tb=_568.textbox; +var _569=tb.find(".textbox-text"); +var _567=_567||opts.tipPosition; +var p1=tb.offset(); +var p2=_569.offset(); +var w1=tb.outerWidth(); +var w2=_569.outerWidth(); +if(_567=="right"){ +return w1-w2-p2.left+p1.left; +}else{ +if(_567=="left"){ +return p1.left-p2.left; +}else{ +return (w1-w2-p2.left+p1.left)/2-(p2.left-p1.left)/2; +} +} +},getTipY:function(jq,_56a){ +var _56b=jq.data("textbox"); +var opts=_56b.options; +var tb=_56b.textbox; +var _56c=tb.find(".textbox-text"); +var _56a=_56a||opts.tipPosition; +var p1=tb.offset(); +var p2=_56c.offset(); +var h1=tb.outerHeight(); +var h2=_56c.outerHeight(); +if(_56a=="left"||_56a=="right"){ +return (h1-h2-p2.top+p1.top)/2-(p2.top-p1.top)/2; +}else{ +if(_56a=="bottom"){ +return (h1-h2-p2.top+p1.top); +}else{ +return (p1.top-p2.top); +} +} +},getSelectionStart:function(jq){ +return jq.textbox("getSelectionRange").start; +},getSelectionRange:function(jq){ +var _56d=jq.textbox("textbox")[0]; +var _56e=0; +var end=0; +if(typeof _56d.selectionStart=="number"){ +_56e=_56d.selectionStart; +end=_56d.selectionEnd; +}else{ +if(_56d.createTextRange){ +var s=document.selection.createRange(); +var _56f=_56d.createTextRange(); +_56f.setEndPoint("EndToStart",s); +_56e=_56f.text.length; +end=_56e+s.text.length; +} +} +return {start:_56e,end:end}; +},setSelectionRange:function(jq,_570){ +return jq.each(function(){ +var _571=$(this).textbox("textbox")[0]; +var _572=_570.start; +var end=_570.end; +if(_571.setSelectionRange){ +_571.setSelectionRange(_572,end); +}else{ +if(_571.createTextRange){ +var _573=_571.createTextRange(); +_573.collapse(); +_573.moveEnd("character",end); +_573.moveStart("character",_572); +_573.select(); +} +} +}); +}}; +$.fn.textbox.parseOptions=function(_574){ +var t=$(_574); +return $.extend({},$.fn.validatebox.parseOptions(_574),$.parser.parseOptions(_574,["prompt","iconCls","iconAlign","buttonText","buttonIcon","buttonAlign","label","labelPosition","labelAlign",{multiline:"boolean",iconWidth:"number",labelWidth:"number"}]),{value:(t.val()||undefined),type:(t.attr("type")?t.attr("type"):undefined)}); +}; +$.fn.textbox.defaults=$.extend({},$.fn.validatebox.defaults,{doSize:true,width:"auto",height:"auto",cls:null,prompt:"",value:"",type:"text",multiline:false,icons:[],iconCls:null,iconAlign:"right",iconWidth:26,buttonText:"",buttonIcon:null,buttonAlign:"right",label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",inputEvents:{blur:function(e){ +var t=$(e.data.target); +var opts=t.textbox("options"); +if(t.textbox("getValue")!=opts.value){ +t.textbox("setValue",opts.value); +} +},keydown:function(e){ +if(e.keyCode==13){ +var t=$(e.data.target); +t.textbox("setValue",t.textbox("getText")); +} +}},onChange:function(_575,_576){ +},onResizing:function(_577,_578){ +},onResize:function(_579,_57a){ +},onClickButton:function(){ +},onClickIcon:function(_57b){ +}}); +})(jQuery); +(function($){ +function _57c(_57d){ +var _57e=$.data(_57d,"passwordbox"); +var opts=_57e.options; +var _57f=$.extend(true,[],opts.icons); +if(opts.showEye){ +_57f.push({iconCls:"passwordbox-open",handler:function(e){ +opts.revealed=!opts.revealed; +_580(_57d); +}}); +} +$(_57d).addClass("passwordbox-f").textbox($.extend({},opts,{icons:_57f})); +_580(_57d); +}; +function _581(_582,_583,all){ +var t=$(_582); +var opts=t.passwordbox("options"); +if(opts.revealed){ +t.textbox("setValue",_583); +return; +} +var _584=unescape(opts.passwordChar); +var cc=_583.split(""); +var vv=t.passwordbox("getValue").split(""); +for(var i=0;i=0){ +vv.splice(_5ad,1); +} +}else{ +var _5ab=_5a3(_5a8,_5aa.start); +var end=_5ac(_5a8,_5aa.end); +var _5ad=_5ab-_5a5(_5a8,_5ab); +var _5ae=end-_5a5(_5a8,end); +vv.splice(_5ad,_5ae-_5ad+1); +} +$(_5a8).maskedbox("setValue",_59c(_5a8,vv.join(""))); +$(_5a8).maskedbox("setSelectionRange",{start:_5ab,end:_5ab}); +}; +function _5a5(_5af,pos){ +var opts=$(_5af).maskedbox("options"); +var _5b0=0; +if(pos>=opts.mask.length){ +pos--; +} +for(var i=pos;i>=0;i--){ +if(opts.masks[opts.mask[i]]==undefined){ +_5b0++; +} +} +return _5b0; +}; +function _5a3(_5b1,pos){ +var opts=$(_5b1).maskedbox("options"); +var m=opts.mask[pos]; +var r=opts.masks[m]; +while(pos=0&&!r){ +pos--; +m=opts.mask[pos]; +r=opts.masks[m]; +} +return pos<0?0:pos; +}; +function _5b3(e){ +if(e.metaKey||e.ctrlKey){ +return; +} +var _5b4=e.data.target; +var opts=$(_5b4).maskedbox("options"); +var _5b5=[9,13,35,36,37,39]; +if($.inArray(e.keyCode,_5b5)!=-1){ +return true; +} +if(e.keyCode>=96&&e.keyCode<=105){ +e.keyCode-=48; +} +var c=String.fromCharCode(e.keyCode); +if(e.keyCode>=65&&e.keyCode<=90&&!e.shiftKey){ +c=c.toLowerCase(); +}else{ +if(e.keyCode==189){ +c="-"; +}else{ +if(e.keyCode==187){ +c="+"; +}else{ +if(e.keyCode==190){ +c="."; +} +} +} +} +if(e.keyCode==8){ +_5a7(_5b4,true); +}else{ +if(e.keyCode==46){ +_5a7(_5b4,false); +}else{ +_59f(_5b4,c); +} +} +return false; +}; +$.extend($.fn.textbox.methods,{inputMask:function(jq,_5b6){ +return jq.each(function(){ +var _5b7=this; +var opts=$.extend({},$.fn.maskedbox.defaults,_5b6); +$.data(_5b7,"maskedbox",{options:opts}); +var _5b8=$(_5b7).textbox("textbox"); +_5b8.unbind(".maskedbox"); +for(var _5b9 in opts.inputEvents){ +_5b8.bind(_5b9+".maskedbox",{target:_5b7},opts.inputEvents[_5b9]); +} +}); +}}); +$.fn.maskedbox=function(_5ba,_5bb){ +if(typeof _5ba=="string"){ +var _5bc=$.fn.maskedbox.methods[_5ba]; +if(_5bc){ +return _5bc(this,_5bb); +}else{ +return this.textbox(_5ba,_5bb); +} +} +_5ba=_5ba||{}; +return this.each(function(){ +var _5bd=$.data(this,"maskedbox"); +if(_5bd){ +$.extend(_5bd.options,_5ba); +}else{ +$.data(this,"maskedbox",{options:$.extend({},$.fn.maskedbox.defaults,$.fn.maskedbox.parseOptions(this),_5ba)}); +} +_596(this); +}); +}; +$.fn.maskedbox.methods={options:function(jq){ +var opts=jq.textbox("options"); +return $.extend($.data(jq[0],"maskedbox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +},initValue:function(jq,_5be){ +return jq.each(function(){ +_5be=_59c(this,_599(this,_5be)); +$(this).textbox("initValue",_5be); +}); +},setValue:function(jq,_5bf){ +return jq.each(function(){ +_5bf=_59c(this,_599(this,_5bf)); +$(this).textbox("setValue",_5bf); +}); +}}; +$.fn.maskedbox.parseOptions=function(_5c0){ +var t=$(_5c0); +return $.extend({},$.fn.textbox.parseOptions(_5c0),$.parser.parseOptions(_5c0,["mask","promptChar"]),{}); +}; +$.fn.maskedbox.defaults=$.extend({},$.fn.textbox.defaults,{mask:"",promptChar:"_",masks:{"9":"[0-9]","a":"[a-zA-Z]","*":"[0-9a-zA-Z]"},inputEvents:{keydown:_5b3}}); +})(jQuery); +(function($){ +var _5c1=0; +function _5c2(_5c3){ +var _5c4=$.data(_5c3,"filebox"); +var opts=_5c4.options; +opts.fileboxId="filebox_file_id_"+(++_5c1); +$(_5c3).addClass("filebox-f").textbox(opts); +$(_5c3).textbox("textbox").attr("readonly","readonly"); +_5c4.filebox=$(_5c3).next().addClass("filebox"); +var file=_5c5(_5c3); +var btn=$(_5c3).filebox("button"); +if(btn.length){ +$("").appendTo(btn); +if(btn.linkbutton("options").disabled){ +file._propAttr("disabled",true); +}else{ +file._propAttr("disabled",false); +} +} +}; +function _5c5(_5c6){ +var _5c7=$.data(_5c6,"filebox"); +var opts=_5c7.options; +_5c7.filebox.find(".textbox-value").remove(); +opts.oldValue=""; +var file=$("").appendTo(_5c7.filebox); +file.attr("id",opts.fileboxId).attr("name",$(_5c6).attr("textboxName")||""); +file.attr("accept",opts.accept); +file.attr("capture",opts.capture); +if(opts.multiple){ +file.attr("multiple","multiple"); +} +file.change(function(){ +var _5c8=this.value; +if(this.files){ +_5c8=$.map(this.files,function(file){ +return file.name; +}).join(opts.separator); +} +$(_5c6).filebox("setText",_5c8); +opts.onChange.call(_5c6,_5c8,opts.oldValue); +opts.oldValue=_5c8; +}); +return file; +}; +$.fn.filebox=function(_5c9,_5ca){ +if(typeof _5c9=="string"){ +var _5cb=$.fn.filebox.methods[_5c9]; +if(_5cb){ +return _5cb(this,_5ca); +}else{ +return this.textbox(_5c9,_5ca); +} +} +_5c9=_5c9||{}; +return this.each(function(){ +var _5cc=$.data(this,"filebox"); +if(_5cc){ +$.extend(_5cc.options,_5c9); +}else{ +$.data(this,"filebox",{options:$.extend({},$.fn.filebox.defaults,$.fn.filebox.parseOptions(this),_5c9)}); +} +_5c2(this); +}); +}; +$.fn.filebox.methods={options:function(jq){ +var opts=jq.textbox("options"); +return $.extend($.data(jq[0],"filebox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("clear"); +_5c5(this); +}); +},reset:function(jq){ +return jq.each(function(){ +$(this).filebox("clear"); +}); +},setValue:function(jq){ +return jq; +},setValues:function(jq){ +return jq; +},files:function(jq){ +return jq.next().find(".textbox-value")[0].files; +}}; +$.fn.filebox.parseOptions=function(_5cd){ +var t=$(_5cd); +return $.extend({},$.fn.textbox.parseOptions(_5cd),$.parser.parseOptions(_5cd,["accept","capture","separator"]),{multiple:(t.attr("multiple")?true:undefined)}); +}; +$.fn.filebox.defaults=$.extend({},$.fn.textbox.defaults,{buttonIcon:null,buttonText:"Choose File",buttonAlign:"right",inputEvents:{},accept:"",capture:"",separator:",",multiple:false}); +})(jQuery); +(function($){ +function _5ce(_5cf){ +var _5d0=$.data(_5cf,"searchbox"); +var opts=_5d0.options; +var _5d1=$.extend(true,[],opts.icons); +_5d1.push({iconCls:"searchbox-button",handler:function(e){ +var t=$(e.data.target); +var opts=t.searchbox("options"); +opts.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); +}}); +_5d2(); +var _5d3=_5d4(); +$(_5cf).addClass("searchbox-f").textbox($.extend({},opts,{icons:_5d1,buttonText:(_5d3?_5d3.text:"")})); +$(_5cf).attr("searchboxName",$(_5cf).attr("textboxName")); +_5d0.searchbox=$(_5cf).next(); +_5d0.searchbox.addClass("searchbox"); +_5d5(_5d3); +function _5d2(){ +if(opts.menu){ +_5d0.menu=$(opts.menu).menu(); +var _5d6=_5d0.menu.menu("options"); +var _5d7=_5d6.onClick; +_5d6.onClick=function(item){ +_5d5(item); +_5d7.call(this,item); +}; +}else{ +if(_5d0.menu){ +_5d0.menu.menu("destroy"); +} +_5d0.menu=null; +} +}; +function _5d4(){ +if(_5d0.menu){ +var item=_5d0.menu.children("div.menu-item:first"); +_5d0.menu.children("div.menu-item").each(function(){ +var _5d8=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); +if(_5d8.selected){ +item=$(this); +return false; +} +}); +return _5d0.menu.menu("getItem",item[0]); +}else{ +return null; +} +}; +function _5d5(item){ +if(!item){ +return; +} +$(_5cf).textbox("button").menubutton({text:item.text,iconCls:(item.iconCls||null),menu:_5d0.menu,menuAlign:opts.buttonAlign,plain:false}); +_5d0.searchbox.find("input.textbox-value").attr("name",item.name||item.text); +$(_5cf).searchbox("resize"); +}; +}; +$.fn.searchbox=function(_5d9,_5da){ +if(typeof _5d9=="string"){ +var _5db=$.fn.searchbox.methods[_5d9]; +if(_5db){ +return _5db(this,_5da); +}else{ +return this.textbox(_5d9,_5da); +} +} +_5d9=_5d9||{}; +return this.each(function(){ +var _5dc=$.data(this,"searchbox"); +if(_5dc){ +$.extend(_5dc.options,_5d9); +}else{ +$.data(this,"searchbox",{options:$.extend({},$.fn.searchbox.defaults,$.fn.searchbox.parseOptions(this),_5d9)}); +} +_5ce(this); +}); +}; +$.fn.searchbox.methods={options:function(jq){ +var opts=jq.textbox("options"); +return $.extend($.data(jq[0],"searchbox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +},menu:function(jq){ +return $.data(jq[0],"searchbox").menu; +},getName:function(jq){ +return $.data(jq[0],"searchbox").searchbox.find("input.textbox-value").attr("name"); +},selectName:function(jq,name){ +return jq.each(function(){ +var menu=$.data(this,"searchbox").menu; +if(menu){ +menu.children("div.menu-item").each(function(){ +var item=menu.menu("getItem",this); +if(item.name==name){ +$(this).trigger("click"); +return false; +} +}); +} +}); +},destroy:function(jq){ +return jq.each(function(){ +var menu=$(this).searchbox("menu"); +if(menu){ +menu.menu("destroy"); +} +$(this).textbox("destroy"); +}); +}}; +$.fn.searchbox.parseOptions=function(_5dd){ +var t=$(_5dd); +return $.extend({},$.fn.textbox.parseOptions(_5dd),$.parser.parseOptions(_5dd,["menu"]),{searcher:(t.attr("searcher")?eval(t.attr("searcher")):undefined)}); +}; +$.fn.searchbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:$.extend({},$.fn.textbox.defaults.inputEvents,{keydown:function(e){ +if(e.keyCode==13){ +e.preventDefault(); +var t=$(e.data.target); +var opts=t.searchbox("options"); +t.searchbox("setValue",$(this).val()); +opts.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); +return false; +} +}}),buttonAlign:"left",menu:null,searcher:function(_5de,name){ +}}); +})(jQuery); +(function($){ +function _5df(_5e0,_5e1){ +var opts=$.data(_5e0,"form").options; +$.extend(opts,_5e1||{}); +var _5e2=$.extend({},opts.queryParams); +if(opts.onSubmit.call(_5e0,_5e2)==false){ +return; +} +var _5e3=$(_5e0).find(".textbox-text:focus"); +_5e3.triggerHandler("blur"); +_5e3.focus(); +var _5e4=null; +if(opts.dirty){ +var ff=[]; +$.map(opts.dirtyFields,function(f){ +if($(f).hasClass("textbox-f")){ +$(f).next().find(".textbox-value").each(function(){ +ff.push(this); +}); +}else{ +ff.push(f); +} +}); +_5e4=$(_5e0).find("input[name]:enabled,textarea[name]:enabled,select[name]:enabled").filter(function(){ +return $.inArray(this,ff)==-1; +}); +_5e4._propAttr("disabled",true); +} +if(opts.ajax){ +if(opts.iframe){ +_5e5(_5e0,_5e2); +}else{ +if(window.FormData!==undefined){ +_5e6(_5e0,_5e2); +}else{ +_5e5(_5e0,_5e2); +} +} +}else{ +$(_5e0).submit(); +} +if(opts.dirty){ +_5e4._propAttr("disabled",false); +} +}; +function _5e5(_5e7,_5e8){ +var opts=$.data(_5e7,"form").options; +var _5e9="easyui_frame_"+(new Date().getTime()); +var _5ea=$("").appendTo("body"); +_5ea.attr("src",window.ActiveXObject?"javascript:false":"about:blank"); +_5ea.css({position:"absolute",top:-1000,left:-1000}); +_5ea.bind("load",cb); +_5eb(_5e8); +function _5eb(_5ec){ +var form=$(_5e7); +if(opts.url){ +form.attr("action",opts.url); +} +var t=form.attr("target"),a=form.attr("action"); +form.attr("target",_5e9); +var _5ed=$(); +try{ +for(var n in _5ec){ +var _5ee=$("").val(_5ec[n]).appendTo(form); +_5ed=_5ed.add(_5ee); +} +_5ef(); +form[0].submit(); +} +finally{ +form.attr("action",a); +t?form.attr("target",t):form.removeAttr("target"); +_5ed.remove(); +} +}; +function _5ef(){ +var f=$("#"+_5e9); +if(!f.length){ +return; +} +try{ +var s=f.contents()[0].readyState; +if(s&&s.toLowerCase()=="uninitialized"){ +setTimeout(_5ef,100); +} +} +catch(e){ +cb(); +} +}; +var _5f0=10; +function cb(){ +var f=$("#"+_5e9); +if(!f.length){ +return; +} +f.unbind(); +var data=""; +try{ +var body=f.contents().find("body"); +data=body.html(); +if(data==""){ +if(--_5f0){ +setTimeout(cb,100); +return; +} +} +var ta=body.find(">textarea"); +if(ta.length){ +data=ta.val(); +}else{ +var pre=body.find(">pre"); +if(pre.length){ +data=pre.html(); +} +} +} +catch(e){ +} +opts.success.call(_5e7,data); +setTimeout(function(){ +f.unbind(); +f.remove(); +},100); +}; +}; +function _5e6(_5f1,_5f2){ +var opts=$.data(_5f1,"form").options; +var _5f3=new FormData($(_5f1)[0]); +for(var name in _5f2){ +_5f3.append(name,_5f2[name]); +} +$.ajax({url:opts.url,type:"post",xhr:function(){ +var xhr=$.ajaxSettings.xhr(); +if(xhr.upload){ +xhr.upload.addEventListener("progress",function(e){ +if(e.lengthComputable){ +var _5f4=e.total; +var _5f5=e.loaded||e.position; +var _5f6=Math.ceil(_5f5*100/_5f4); +opts.onProgress.call(_5f1,_5f6); +} +},false); +} +return xhr; +},data:_5f3,dataType:"html",cache:false,contentType:false,processData:false,complete:function(res){ +opts.success.call(_5f1,res.responseText); +}}); +}; +function load(_5f7,data){ +var opts=$.data(_5f7,"form").options; +if(typeof data=="string"){ +var _5f8={}; +if(opts.onBeforeLoad.call(_5f7,_5f8)==false){ +return; +} +$.ajax({url:data,data:_5f8,dataType:"json",success:function(data){ +_5f9(data); +},error:function(){ +opts.onLoadError.apply(_5f7,arguments); +}}); +}else{ +_5f9(data); +} +function _5f9(data){ +var form=$(_5f7); +for(var name in data){ +var val=data[name]; +if(!_5fa(name,val)){ +if(!_5fb(name,val)){ +form.find("input[name=\""+name+"\"]").val(val); +form.find("textarea[name=\""+name+"\"]").val(val); +form.find("select[name=\""+name+"\"]").val(val); +} +} +} +opts.onLoadSuccess.call(_5f7,data); +form.form("validate"); +}; +function _5fa(name,val){ +var cc=$(_5f7).find("[switchbuttonName=\""+name+"\"]"); +if(cc.length){ +cc.switchbutton("uncheck"); +cc.each(function(){ +if(_5fc($(this).switchbutton("options").value,val)){ +$(this).switchbutton("check"); +} +}); +return true; +} +cc=$(_5f7).find("input[name=\""+name+"\"][type=radio], input[name=\""+name+"\"][type=checkbox]"); +if(cc.length){ +cc._propAttr("checked",false); +cc.each(function(){ +if(_5fc($(this).val(),val)){ +$(this)._propAttr("checked",true); +} +}); +return true; +} +return false; +}; +function _5fc(v,val){ +if(v==String(val)||$.inArray(v,$.isArray(val)?val:[val])>=0){ +return true; +}else{ +return false; +} +}; +function _5fb(name,val){ +var _5fd=$(_5f7).find("[textboxName=\""+name+"\"],[sliderName=\""+name+"\"]"); +if(_5fd.length){ +for(var i=0;i=0;i--){ +var type=opts.fieldTypes[i]; +var _605=form.find("."+type+"-f"); +if(_605.length&&_605[type]){ +_605[type]("reset"); +} +} +form.form("validate"); +}; +function _606(_607){ +var _608=$.data(_607,"form").options; +$(_607).unbind(".form"); +if(_608.ajax){ +$(_607).bind("submit.form",function(){ +setTimeout(function(){ +_5df(_607,_608); +},0); +return false; +}); +} +$(_607).bind("_change.form",function(e,t){ +if($.inArray(t,_608.dirtyFields)==-1){ +_608.dirtyFields.push(t); +} +_608.onChange.call(this,t); +}).bind("change.form",function(e){ +var t=e.target; +if(!$(t).hasClass("textbox-text")){ +if($.inArray(t,_608.dirtyFields)==-1){ +_608.dirtyFields.push(t); +} +_608.onChange.call(this,t); +} +}); +_609(_607,_608.novalidate); +}; +function _60a(_60b,_60c){ +_60c=_60c||{}; +var _60d=$.data(_60b,"form"); +if(_60d){ +$.extend(_60d.options,_60c); +}else{ +$.data(_60b,"form",{options:$.extend({},$.fn.form.defaults,$.fn.form.parseOptions(_60b),_60c)}); +} +}; +function _60e(_60f){ +if($.fn.validatebox){ +var t=$(_60f); +t.find(".validatebox-text:not(:disabled)").validatebox("validate"); +var _610=t.find(".validatebox-invalid"); +_610.filter(":not(:disabled):first").focus(); +return _610.length==0; +} +return true; +}; +function _609(_611,_612){ +var opts=$.data(_611,"form").options; +opts.novalidate=_612; +$(_611).find(".validatebox-text:not(:disabled)").validatebox(_612?"disableValidation":"enableValidation"); +}; +$.fn.form=function(_613,_614){ +if(typeof _613=="string"){ +this.each(function(){ +_60a(this); +}); +return $.fn.form.methods[_613](this,_614); +} +return this.each(function(){ +_60a(this,_613); +_606(this); +}); +}; +$.fn.form.methods={options:function(jq){ +return $.data(jq[0],"form").options; +},submit:function(jq,_615){ +return jq.each(function(){ +_5df(this,_615); +}); +},load:function(jq,data){ +return jq.each(function(){ +load(this,data); +}); +},clear:function(jq){ +return jq.each(function(){ +_5ff(this); +}); +},reset:function(jq){ +return jq.each(function(){ +_603(this); +}); +},validate:function(jq){ +return _60e(jq[0]); +},disableValidation:function(jq){ +return jq.each(function(){ +_609(this,true); +}); +},enableValidation:function(jq){ +return jq.each(function(){ +_609(this,false); +}); +},resetValidation:function(jq){ +return jq.each(function(){ +$(this).find(".validatebox-text:not(:disabled)").validatebox("resetValidation"); +}); +},resetDirty:function(jq){ +return jq.each(function(){ +$(this).form("options").dirtyFields=[]; +}); +}}; +$.fn.form.parseOptions=function(_616){ +var t=$(_616); +return $.extend({},$.parser.parseOptions(_616,[{ajax:"boolean",dirty:"boolean"}]),{url:(t.attr("action")?t.attr("action"):undefined)}); +}; +$.fn.form.defaults={fieldTypes:["tagbox","combobox","combotree","combogrid","combotreegrid","datetimebox","datebox","combo","datetimespinner","timespinner","numberspinner","spinner","slider","searchbox","numberbox","passwordbox","filebox","textbox","switchbutton"],novalidate:false,ajax:true,iframe:true,dirty:false,dirtyFields:[],url:null,queryParams:{},onSubmit:function(_617){ +return $(this).form("validate"); +},onProgress:function(_618){ +},success:function(data){ +},onBeforeLoad:function(_619){ +},onLoadSuccess:function(data){ +},onLoadError:function(){ +},onChange:function(_61a){ +}}; +})(jQuery); +(function($){ +function _61b(_61c){ +var _61d=$.data(_61c,"numberbox"); +var opts=_61d.options; +$(_61c).addClass("numberbox-f").textbox(opts); +$(_61c).textbox("textbox").css({imeMode:"disabled"}); +$(_61c).attr("numberboxName",$(_61c).attr("textboxName")); +_61d.numberbox=$(_61c).next(); +_61d.numberbox.addClass("numberbox"); +var _61e=opts.parser.call(_61c,opts.value); +var _61f=opts.formatter.call(_61c,_61e); +$(_61c).numberbox("initValue",_61e).numberbox("setText",_61f); +}; +function _620(_621,_622){ +var _623=$.data(_621,"numberbox"); +var opts=_623.options; +opts.value=parseFloat(_622); +var _622=opts.parser.call(_621,_622); +var text=opts.formatter.call(_621,_622); +opts.value=_622; +$(_621).textbox("setText",text).textbox("setValue",_622); +text=opts.formatter.call(_621,$(_621).textbox("getValue")); +$(_621).textbox("setText",text); +}; +$.fn.numberbox=function(_624,_625){ +if(typeof _624=="string"){ +var _626=$.fn.numberbox.methods[_624]; +if(_626){ +return _626(this,_625); +}else{ +return this.textbox(_624,_625); +} +} +_624=_624||{}; +return this.each(function(){ +var _627=$.data(this,"numberbox"); +if(_627){ +$.extend(_627.options,_624); +}else{ +_627=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_624)}); +} +_61b(this); +}); +}; +$.fn.numberbox.methods={options:function(jq){ +var opts=jq.data("textbox")?jq.textbox("options"):{}; +return $.extend($.data(jq[0],"numberbox").options,{width:opts.width,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).textbox("cloneFrom",from); +$.data(this,"numberbox",{options:$.extend(true,{},$(from).numberbox("options"))}); +$(this).addClass("numberbox-f"); +}); +},fix:function(jq){ +return jq.each(function(){ +var opts=$(this).numberbox("options"); +opts.value=null; +var _628=opts.parser.call(this,$(this).numberbox("getText")); +$(this).numberbox("setValue",_628); +}); +},setValue:function(jq,_629){ +return jq.each(function(){ +_620(this,_629); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("clear"); +$(this).numberbox("options").value=""; +}); +},reset:function(jq){ +return jq.each(function(){ +$(this).textbox("reset"); +$(this).numberbox("setValue",$(this).numberbox("getValue")); +}); +}}; +$.fn.numberbox.parseOptions=function(_62a){ +var t=$(_62a); +return $.extend({},$.fn.textbox.parseOptions(_62a),$.parser.parseOptions(_62a,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined)}); +}; +$.fn.numberbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{keypress:function(e){ +var _62b=e.data.target; +var opts=$(_62b).numberbox("options"); +return opts.filter.call(_62b,e); +},blur:function(e){ +$(e.data.target).numberbox("fix"); +},keydown:function(e){ +if(e.keyCode==13){ +$(e.data.target).numberbox("fix"); +} +}},min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",filter:function(e){ +var opts=$(this).numberbox("options"); +var s=$(this).numberbox("getText"); +if(e.metaKey||e.ctrlKey){ +return true; +} +if($.inArray(String(e.which),["46","8","13","0"])>=0){ +return true; +} +var tmp=$(""); +tmp.html(String.fromCharCode(e.which)); +var c=tmp.text(); +tmp.remove(); +if(!c){ +return true; +} +if(c=="-"||c==opts.decimalSeparator){ +return (s.indexOf(c)==-1)?true:false; +}else{ +if(c==opts.groupSeparator){ +return true; +}else{ +if("0123456789".indexOf(c)>=0){ +return true; +}else{ +return false; +} +} +} +},formatter:function(_62c){ +if(!_62c){ +return _62c; +} +_62c=_62c+""; +var opts=$(this).numberbox("options"); +var s1=_62c,s2=""; +var dpos=_62c.indexOf("."); +if(dpos>=0){ +s1=_62c.substring(0,dpos); +s2=_62c.substring(dpos+1,_62c.length); +} +if(opts.groupSeparator){ +var p=/(\d+)(\d{3})/; +while(p.test(s1)){ +s1=s1.replace(p,"$1"+opts.groupSeparator+"$2"); +} +} +if(s2){ +return opts.prefix+s1+opts.decimalSeparator+s2+opts.suffix; +}else{ +return opts.prefix+s1+opts.suffix; +} +},parser:function(s){ +s=s+""; +var opts=$(this).numberbox("options"); +if(opts.prefix){ +s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.prefix),"g"),"")); +} +if(opts.suffix){ +s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.suffix),"g"),"")); +} +if(parseFloat(s)!=opts.value){ +if(opts.groupSeparator){ +s=$.trim(s.replace(new RegExp("\\"+opts.groupSeparator,"g"),"")); +} +if(opts.decimalSeparator){ +s=$.trim(s.replace(new RegExp("\\"+opts.decimalSeparator,"g"),".")); +} +s=s.replace(/\s/g,""); +} +var val=parseFloat(s).toFixed(opts.precision); +if(isNaN(val)){ +val=""; +}else{ +if(typeof (opts.min)=="number"&&valopts.max){ +val=opts.max.toFixed(opts.precision); +} +} +} +return val; +}}); +})(jQuery); +(function($){ +function _62d(_62e,_62f){ +var opts=$.data(_62e,"calendar").options; +var t=$(_62e); +if(_62f){ +$.extend(opts,{width:_62f.width,height:_62f.height}); +} +t._size(opts,t.parent()); +t.find(".calendar-body")._outerHeight(t.height()-t.find(".calendar-header")._outerHeight()); +if(t.find(".calendar-menu").is(":visible")){ +_630(_62e); +} +}; +function init(_631){ +$(_631).addClass("calendar").html("
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+""+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+""+""+""+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "); +$(_631).bind("_resize",function(e,_632){ +if($(this).hasClass("easyui-fluid")||_632){ +_62d(_631); +} +return false; +}); +}; +function _633(_634){ +var opts=$.data(_634,"calendar").options; +var menu=$(_634).find(".calendar-menu"); +menu.find(".calendar-menu-year").unbind(".calendar").bind("keypress.calendar",function(e){ +if(e.keyCode==13){ +_635(true); +} +}); +$(_634).unbind(".calendar").bind("mouseover.calendar",function(e){ +var t=_636(e.target); +if(t.hasClass("calendar-nav")||t.hasClass("calendar-text")||(t.hasClass("calendar-day")&&!t.hasClass("calendar-disabled"))){ +t.addClass("calendar-nav-hover"); +} +}).bind("mouseout.calendar",function(e){ +var t=_636(e.target); +if(t.hasClass("calendar-nav")||t.hasClass("calendar-text")||(t.hasClass("calendar-day")&&!t.hasClass("calendar-disabled"))){ +t.removeClass("calendar-nav-hover"); +} +}).bind("click.calendar",function(e){ +var t=_636(e.target); +if(t.hasClass("calendar-menu-next")||t.hasClass("calendar-nextyear")){ +_637(1); +}else{ +if(t.hasClass("calendar-menu-prev")||t.hasClass("calendar-prevyear")){ +_637(-1); +}else{ +if(t.hasClass("calendar-menu-month")){ +menu.find(".calendar-selected").removeClass("calendar-selected"); +t.addClass("calendar-selected"); +_635(true); +}else{ +if(t.hasClass("calendar-prevmonth")){ +_638(-1); +}else{ +if(t.hasClass("calendar-nextmonth")){ +_638(1); +}else{ +if(t.hasClass("calendar-text")){ +if(menu.is(":visible")){ +menu.hide(); +}else{ +_630(_634); +} +}else{ +if(t.hasClass("calendar-day")){ +if(t.hasClass("calendar-disabled")){ +return; +} +var _639=opts.current; +t.closest("div.calendar-body").find(".calendar-selected").removeClass("calendar-selected"); +t.addClass("calendar-selected"); +var _63a=t.attr("abbr").split(","); +var y=parseInt(_63a[0]); +var m=parseInt(_63a[1]); +var d=parseInt(_63a[2]); +opts.current=new Date(y,m-1,d); +opts.onSelect.call(_634,opts.current); +if(!_639||_639.getTime()!=opts.current.getTime()){ +opts.onChange.call(_634,opts.current,_639); +} +if(opts.year!=y||opts.month!=m){ +opts.year=y; +opts.month=m; +show(_634); +} +} +} +} +} +} +} +} +}); +function _636(t){ +var day=$(t).closest(".calendar-day"); +if(day.length){ +return day; +}else{ +return $(t); +} +}; +function _635(_63b){ +var menu=$(_634).find(".calendar-menu"); +var year=menu.find(".calendar-menu-year").val(); +var _63c=menu.find(".calendar-selected").attr("abbr"); +if(!isNaN(year)){ +opts.year=parseInt(year); +opts.month=parseInt(_63c); +show(_634); +} +if(_63b){ +menu.hide(); +} +}; +function _637(_63d){ +opts.year+=_63d; +show(_634); +menu.find(".calendar-menu-year").val(opts.year); +}; +function _638(_63e){ +opts.month+=_63e; +if(opts.month>12){ +opts.year++; +opts.month=1; +}else{ +if(opts.month<1){ +opts.year--; +opts.month=12; +} +} +show(_634); +menu.find("td.calendar-selected").removeClass("calendar-selected"); +menu.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); +}; +}; +function _630(_63f){ +var opts=$.data(_63f,"calendar").options; +$(_63f).find(".calendar-menu").show(); +if($(_63f).find(".calendar-menu-month-inner").is(":empty")){ +$(_63f).find(".calendar-menu-month-inner").empty(); +var t=$("
                                                                                                  ").appendTo($(_63f).find(".calendar-menu-month-inner")); +var idx=0; +for(var i=0;i<3;i++){ +var tr=$("").appendTo(t); +for(var j=0;j<4;j++){ +$("").html(opts.months[idx++]).attr("abbr",idx).appendTo(tr); +} +} +} +var body=$(_63f).find(".calendar-body"); +var sele=$(_63f).find(".calendar-menu"); +var _640=sele.find(".calendar-menu-year-inner"); +var _641=sele.find(".calendar-menu-month-inner"); +_640.find("input").val(opts.year).focus(); +_641.find("td.calendar-selected").removeClass("calendar-selected"); +_641.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); +sele._outerWidth(body._outerWidth()); +sele._outerHeight(body._outerHeight()); +_641._outerHeight(sele.height()-_640._outerHeight()); +}; +function _642(_643,year,_644){ +var opts=$.data(_643,"calendar").options; +var _645=[]; +var _646=new Date(year,_644,0).getDate(); +for(var i=1;i<=_646;i++){ +_645.push([year,_644,i]); +} +var _647=[],week=[]; +var _648=-1; +while(_645.length>0){ +var date=_645.shift(); +week.push(date); +var day=new Date(date[0],date[1]-1,date[2]).getDay(); +if(_648==day){ +day=0; +}else{ +if(day==(opts.firstDay==0?7:opts.firstDay)-1){ +_647.push(week); +week=[]; +} +} +_648=day; +} +if(week.length){ +_647.push(week); +} +var _649=_647[0]; +if(_649.length<7){ +while(_649.length<7){ +var _64a=_649[0]; +var date=new Date(_64a[0],_64a[1]-1,_64a[2]-1); +_649.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); +} +}else{ +var _64a=_649[0]; +var week=[]; +for(var i=1;i<=7;i++){ +var date=new Date(_64a[0],_64a[1]-1,_64a[2]-i); +week.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); +} +_647.unshift(week); +} +var _64b=_647[_647.length-1]; +while(_64b.length<7){ +var _64c=_64b[_64b.length-1]; +var date=new Date(_64c[0],_64c[1]-1,_64c[2]+1); +_64b.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); +} +if(_647.length<6){ +var _64c=_64b[_64b.length-1]; +var week=[]; +for(var i=1;i<=7;i++){ +var date=new Date(_64c[0],_64c[1]-1,_64c[2]+i); +week.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); +} +_647.push(week); +} +return _647; +}; +function show(_64d){ +var opts=$.data(_64d,"calendar").options; +if(opts.current&&!opts.validator.call(_64d,opts.current)){ +opts.current=null; +} +var now=new Date(); +var _64e=now.getFullYear()+","+(now.getMonth()+1)+","+now.getDate(); +var _64f=opts.current?(opts.current.getFullYear()+","+(opts.current.getMonth()+1)+","+opts.current.getDate()):""; +var _650=6-opts.firstDay; +var _651=_650+1; +if(_650>=7){ +_650-=7; +} +if(_651>=7){ +_651-=7; +} +$(_64d).find(".calendar-title span").html(opts.months[opts.month-1]+" "+opts.year); +var body=$(_64d).find("div.calendar-body"); +body.children("table").remove(); +var data=[""]; +data.push(""); +if(opts.showWeek){ +data.push(""); +} +for(var i=opts.firstDay;i"+opts.weeks[i]+""); +} +for(var i=0;i"+opts.weeks[i]+""); +} +data.push(""); +data.push(""); +var _652=_642(_64d,opts.year,opts.month); +for(var i=0;i<_652.length;i++){ +var week=_652[i]; +var cls=""; +if(i==0){ +cls="calendar-first"; +}else{ +if(i==_652.length-1){ +cls="calendar-last"; +} +} +data.push(""); +if(opts.showWeek){ +var _653=opts.getWeekNumber(new Date(week[0][0],parseInt(week[0][1])-1,week[0][2])); +data.push(""); +} +for(var j=0;j"+d+""); +} +data.push(""); +} +data.push(""); +data.push("
                                                                                                  "+opts.weekNumberHeader+"
                                                                                                  "+_653+"
                                                                                                  "); +body.append(data.join("")); +body.children("table.calendar-dtable").prependTo(body); +opts.onNavigate.call(_64d,opts.year,opts.month); +}; +$.fn.calendar=function(_657,_658){ +if(typeof _657=="string"){ +return $.fn.calendar.methods[_657](this,_658); +} +_657=_657||{}; +return this.each(function(){ +var _659=$.data(this,"calendar"); +if(_659){ +$.extend(_659.options,_657); +}else{ +_659=$.data(this,"calendar",{options:$.extend({},$.fn.calendar.defaults,$.fn.calendar.parseOptions(this),_657)}); +init(this); +} +if(_659.options.border==false){ +$(this).addClass("calendar-noborder"); +} +_62d(this); +_633(this); +show(this); +$(this).find("div.calendar-menu").hide(); +}); +}; +$.fn.calendar.methods={options:function(jq){ +return $.data(jq[0],"calendar").options; +},resize:function(jq,_65a){ +return jq.each(function(){ +_62d(this,_65a); +}); +},moveTo:function(jq,date){ +return jq.each(function(){ +if(!date){ +var now=new Date(); +$(this).calendar({year:now.getFullYear(),month:now.getMonth()+1,current:date}); +return; +} +var opts=$(this).calendar("options"); +if(opts.validator.call(this,date)){ +var _65b=opts.current; +$(this).calendar({year:date.getFullYear(),month:date.getMonth()+1,current:date}); +if(!_65b||_65b.getTime()!=date.getTime()){ +opts.onChange.call(this,opts.current,_65b); +} +} +}); +}}; +$.fn.calendar.parseOptions=function(_65c){ +var t=$(_65c); +return $.extend({},$.parser.parseOptions(_65c,["weekNumberHeader",{firstDay:"number",fit:"boolean",border:"boolean",showWeek:"boolean"}])); +}; +$.fn.calendar.defaults={width:180,height:180,fit:false,border:true,showWeek:false,firstDay:0,weeks:["S","M","T","W","T","F","S"],months:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],year:new Date().getFullYear(),month:new Date().getMonth()+1,current:(function(){ +var d=new Date(); +return new Date(d.getFullYear(),d.getMonth(),d.getDate()); +})(),weekNumberHeader:"",getWeekNumber:function(date){ +var _65d=new Date(date.getTime()); +_65d.setDate(_65d.getDate()+4-(_65d.getDay()||7)); +var time=_65d.getTime(); +_65d.setMonth(0); +_65d.setDate(1); +return Math.floor(Math.round((time-_65d)/86400000)/7)+1; +},formatter:function(date){ +return date.getDate(); +},styler:function(date){ +return ""; +},validator:function(date){ +return true; +},onSelect:function(date){ +},onChange:function(_65e,_65f){ +},onNavigate:function(year,_660){ +}}; +})(jQuery); +(function($){ +function _661(_662){ +var _663=$.data(_662,"spinner"); +var opts=_663.options; +var _664=$.extend(true,[],opts.icons); +if(opts.spinAlign=="left"||opts.spinAlign=="right"){ +opts.spinArrow=true; +opts.iconAlign=opts.spinAlign; +var _665={iconCls:"spinner-button-updown",handler:function(e){ +var spin=$(e.target).closest(".spinner-arrow-up,.spinner-arrow-down"); +_66f(e.data.target,spin.hasClass("spinner-arrow-down")); +}}; +if(opts.spinAlign=="left"){ +_664.unshift(_665); +}else{ +_664.push(_665); +} +}else{ +opts.spinArrow=false; +if(opts.spinAlign=="vertical"){ +if(opts.buttonAlign!="top"){ +opts.buttonAlign="bottom"; +} +opts.clsLeft="textbox-button-bottom"; +opts.clsRight="textbox-button-top"; +}else{ +opts.clsLeft="textbox-button-left"; +opts.clsRight="textbox-button-right"; +} +} +$(_662).addClass("spinner-f").textbox($.extend({},opts,{icons:_664,doSize:false,onResize:function(_666,_667){ +if(!opts.spinArrow){ +var span=$(this).next(); +var btn=span.find(".textbox-button:not(.spinner-button)"); +if(btn.length){ +var _668=btn.outerWidth(); +var _669=btn.outerHeight(); +var _66a=span.find(".spinner-button."+opts.clsLeft); +var _66b=span.find(".spinner-button."+opts.clsRight); +if(opts.buttonAlign=="right"){ +_66b.css("marginRight",_668+"px"); +}else{ +if(opts.buttonAlign=="left"){ +_66a.css("marginLeft",_668+"px"); +}else{ +if(opts.buttonAlign=="top"){ +_66b.css("marginTop",_669+"px"); +}else{ +_66a.css("marginBottom",_669+"px"); +} +} +} +} +} +opts.onResize.call(this,_666,_667); +}})); +$(_662).attr("spinnerName",$(_662).attr("textboxName")); +_663.spinner=$(_662).next(); +_663.spinner.addClass("spinner"); +if(opts.spinArrow){ +var _66c=_663.spinner.find(".spinner-button-updown"); +_66c.append(""+""+""+""+""+""); +}else{ +var _66d=$("").addClass(opts.clsLeft).appendTo(_663.spinner); +var _66e=$("").addClass(opts.clsRight).appendTo(_663.spinner); +_66d.linkbutton({iconCls:opts.reversed?"spinner-button-up":"spinner-button-down",onClick:function(){ +_66f(_662,!opts.reversed); +}}); +_66e.linkbutton({iconCls:opts.reversed?"spinner-button-down":"spinner-button-up",onClick:function(){ +_66f(_662,opts.reversed); +}}); +if(opts.disabled){ +$(_662).spinner("disable"); +} +if(opts.readonly){ +$(_662).spinner("readonly"); +} +} +$(_662).spinner("resize"); +}; +function _66f(_670,down){ +var opts=$(_670).spinner("options"); +opts.spin.call(_670,down); +opts[down?"onSpinDown":"onSpinUp"].call(_670); +$(_670).spinner("validate"); +}; +$.fn.spinner=function(_671,_672){ +if(typeof _671=="string"){ +var _673=$.fn.spinner.methods[_671]; +if(_673){ +return _673(this,_672); +}else{ +return this.textbox(_671,_672); +} +} +_671=_671||{}; +return this.each(function(){ +var _674=$.data(this,"spinner"); +if(_674){ +$.extend(_674.options,_671); +}else{ +_674=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_671)}); +} +_661(this); +}); +}; +$.fn.spinner.methods={options:function(jq){ +var opts=jq.textbox("options"); +return $.extend($.data(jq[0],"spinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +}}; +$.fn.spinner.parseOptions=function(_675){ +return $.extend({},$.fn.textbox.parseOptions(_675),$.parser.parseOptions(_675,["min","max","spinAlign",{increment:"number",reversed:"boolean"}])); +}; +$.fn.spinner.defaults=$.extend({},$.fn.textbox.defaults,{min:null,max:null,increment:1,spinAlign:"right",reversed:false,spin:function(down){ +},onSpinUp:function(){ +},onSpinDown:function(){ +}}); +})(jQuery); +(function($){ +function _676(_677){ +$(_677).addClass("numberspinner-f"); +var opts=$.data(_677,"numberspinner").options; +$(_677).numberbox($.extend({},opts,{doSize:false})).spinner(opts); +$(_677).numberbox("setValue",opts.value); +}; +function _678(_679,down){ +var opts=$.data(_679,"numberspinner").options; +var v=parseFloat($(_679).numberbox("getValue")||opts.value)||0; +if(down){ +v-=opts.increment; +}else{ +v+=opts.increment; +} +$(_679).numberbox("setValue",v); +}; +$.fn.numberspinner=function(_67a,_67b){ +if(typeof _67a=="string"){ +var _67c=$.fn.numberspinner.methods[_67a]; +if(_67c){ +return _67c(this,_67b); +}else{ +return this.numberbox(_67a,_67b); +} +} +_67a=_67a||{}; +return this.each(function(){ +var _67d=$.data(this,"numberspinner"); +if(_67d){ +$.extend(_67d.options,_67a); +}else{ +$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_67a)}); +} +_676(this); +}); +}; +$.fn.numberspinner.methods={options:function(jq){ +var opts=jq.numberbox("options"); +return $.extend($.data(jq[0],"numberspinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +}}; +$.fn.numberspinner.parseOptions=function(_67e){ +return $.extend({},$.fn.spinner.parseOptions(_67e),$.fn.numberbox.parseOptions(_67e),{}); +}; +$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(down){ +_678(this,down); +}}); +})(jQuery); +(function($){ +function _67f(_680){ +var opts=$.data(_680,"timespinner").options; +$(_680).addClass("timespinner-f").spinner(opts); +var _681=opts.formatter.call(_680,opts.parser.call(_680,opts.value)); +$(_680).timespinner("initValue",_681); +}; +function _682(e){ +var _683=e.data.target; +var opts=$.data(_683,"timespinner").options; +var _684=$(_683).timespinner("getSelectionStart"); +for(var i=0;i=_685[0]&&_684<=_685[1]){ +_686(_683,i); +return; +} +} +}; +function _686(_687,_688){ +var opts=$.data(_687,"timespinner").options; +if(_688!=undefined){ +opts.highlight=_688; +} +var _689=opts.selections[opts.highlight]; +if(_689){ +var tb=$(_687).timespinner("textbox"); +$(_687).timespinner("setSelectionRange",{start:_689[0],end:_689[1]}); +tb.focus(); +} +}; +function _68a(_68b,_68c){ +var opts=$.data(_68b,"timespinner").options; +var _68c=opts.parser.call(_68b,_68c); +var text=opts.formatter.call(_68b,_68c); +$(_68b).spinner("setValue",text); +}; +function _68d(_68e,down){ +var opts=$.data(_68e,"timespinner").options; +var s=$(_68e).timespinner("getValue"); +var _68f=opts.selections[opts.highlight]; +var s1=s.substring(0,_68f[0]); +var s2=s.substring(_68f[0],_68f[1]); +var s3=s.substring(_68f[1]); +var v=s1+((parseInt(s2,10)||0)+opts.increment*(down?-1:1))+s3; +$(_68e).timespinner("setValue",v); +_686(_68e); +}; +$.fn.timespinner=function(_690,_691){ +if(typeof _690=="string"){ +var _692=$.fn.timespinner.methods[_690]; +if(_692){ +return _692(this,_691); +}else{ +return this.spinner(_690,_691); +} +} +_690=_690||{}; +return this.each(function(){ +var _693=$.data(this,"timespinner"); +if(_693){ +$.extend(_693.options,_690); +}else{ +$.data(this,"timespinner",{options:$.extend({},$.fn.timespinner.defaults,$.fn.timespinner.parseOptions(this),_690)}); +} +_67f(this); +}); +}; +$.fn.timespinner.methods={options:function(jq){ +var opts=jq.data("spinner")?jq.spinner("options"):{}; +return $.extend($.data(jq[0],"timespinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); +},setValue:function(jq,_694){ +return jq.each(function(){ +_68a(this,_694); +}); +},getHours:function(jq){ +var opts=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(opts.separator); +return parseInt(vv[0],10); +},getMinutes:function(jq){ +var opts=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(opts.separator); +return parseInt(vv[1],10); +},getSeconds:function(jq){ +var opts=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(opts.separator); +return parseInt(vv[2],10)||0; +}}; +$.fn.timespinner.parseOptions=function(_695){ +return $.extend({},$.fn.spinner.parseOptions(_695),$.parser.parseOptions(_695,["separator",{showSeconds:"boolean",highlight:"number"}])); +}; +$.fn.timespinner.defaults=$.extend({},$.fn.spinner.defaults,{inputEvents:$.extend({},$.fn.spinner.defaults.inputEvents,{click:function(e){ +_682.call(this,e); +},blur:function(e){ +var t=$(e.data.target); +t.timespinner("setValue",t.timespinner("getText")); +},keydown:function(e){ +if(e.keyCode==13){ +var t=$(e.data.target); +t.timespinner("setValue",t.timespinner("getText")); +} +}}),formatter:function(date){ +if(!date){ +return ""; +} +var opts=$(this).timespinner("options"); +var tt=[_696(date.getHours()),_696(date.getMinutes())]; +if(opts.showSeconds){ +tt.push(_696(date.getSeconds())); +} +return tt.join(opts.separator); +function _696(_697){ +return (_697<10?"0":"")+_697; +}; +},parser:function(s){ +var opts=$(this).timespinner("options"); +var date=_698(s); +if(date){ +var min=_698(opts.min); +var max=_698(opts.max); +if(min&&min>date){ +date=min; +} +if(max&&max"]; +for(var i=0;i<_6ad.length;i++){ +_6ac.cache[_6ad[i][0]]={width:_6ad[i][1]}; +} +var _6ae=0; +for(var s in _6ac.cache){ +var item=_6ac.cache[s]; +item.index=_6ae++; +ss.push(s+"{width:"+item.width+"}"); +} +ss.push(""); +$(ss.join("\n")).appendTo(cc); +cc.children("style[easyui]:not(:last)").remove(); +},getRule:function(_6af){ +var _6b0=cc.children("style[easyui]:last")[0]; +var _6b1=_6b0.styleSheet?_6b0.styleSheet:(_6b0.sheet||document.styleSheets[document.styleSheets.length-1]); +var _6b2=_6b1.cssRules||_6b1.rules; +return _6b2[_6af]; +},set:function(_6b3,_6b4){ +var item=_6ac.cache[_6b3]; +if(item){ +item.width=_6b4; +var rule=this.getRule(item.index); +if(rule){ +rule.style["width"]=_6b4; +} +} +},remove:function(_6b5){ +var tmp=[]; +for(var s in _6ac.cache){ +if(s.indexOf(_6b5)==-1){ +tmp.push([s,_6ac.cache[s].width]); +} +} +_6ac.cache={}; +this.add(tmp); +},dirty:function(_6b6){ +if(_6b6){ +_6ac.dirty.push(_6b6); +} +},clean:function(){ +for(var i=0;i<_6ac.dirty.length;i++){ +this.remove(_6ac.dirty[i]); +} +_6ac.dirty=[]; +}}; +}; +function _6b7(_6b8,_6b9){ +var _6ba=$.data(_6b8,"datagrid"); +var opts=_6ba.options; +var _6bb=_6ba.panel; +if(_6b9){ +$.extend(opts,_6b9); +} +if(opts.fit==true){ +var p=_6bb.panel("panel").parent(); +opts.width=p.width(); +opts.height=p.height(); +} +_6bb.panel("resize",opts); +}; +function _6bc(_6bd){ +var _6be=$.data(_6bd,"datagrid"); +var opts=_6be.options; +var dc=_6be.dc; +var wrap=_6be.panel; +var _6bf=wrap.width(); +var _6c0=wrap.height(); +var view=dc.view; +var _6c1=dc.view1; +var _6c2=dc.view2; +var _6c3=_6c1.children("div.datagrid-header"); +var _6c4=_6c2.children("div.datagrid-header"); +var _6c5=_6c3.find("table"); +var _6c6=_6c4.find("table"); +view.width(_6bf); +var _6c7=_6c3.children("div.datagrid-header-inner").show(); +_6c1.width(_6c7.find("table").width()); +if(!opts.showHeader){ +_6c7.hide(); +} +_6c2.width(_6bf-_6c1._outerWidth()); +_6c1.children()._outerWidth(_6c1.width()); +_6c2.children()._outerWidth(_6c2.width()); +var all=_6c3.add(_6c4).add(_6c5).add(_6c6); +all.css("height",""); +var hh=Math.max(_6c5.height(),_6c6.height()); +all._outerHeight(hh); +view.children(".datagrid-empty").css("top",hh+"px"); +dc.body1.add(dc.body2).children("table.datagrid-btable-frozen").css({position:"absolute",top:dc.header2._outerHeight()}); +var _6c8=dc.body2.children("table.datagrid-btable-frozen")._outerHeight(); +var _6c9=_6c8+_6c4._outerHeight()+_6c2.children(".datagrid-footer")._outerHeight(); +wrap.children(":not(.datagrid-view,.datagrid-mask,.datagrid-mask-msg)").each(function(){ +_6c9+=$(this)._outerHeight(); +}); +var _6ca=wrap.outerHeight()-wrap.height(); +var _6cb=wrap._size("minHeight")||""; +var _6cc=wrap._size("maxHeight")||""; +_6c1.add(_6c2).children("div.datagrid-body").css({marginTop:_6c8,height:(isNaN(parseInt(opts.height))?"":(_6c0-_6c9)),minHeight:(_6cb?_6cb-_6ca-_6c9:""),maxHeight:(_6cc?_6cc-_6ca-_6c9:"")}); +view.height(_6c2.height()); +}; +function _6cd(_6ce,_6cf,_6d0){ +var rows=$.data(_6ce,"datagrid").data.rows; +var opts=$.data(_6ce,"datagrid").options; +var dc=$.data(_6ce,"datagrid").dc; +if(!dc.body1.is(":empty")&&(!opts.nowrap||opts.autoRowHeight||_6d0)){ +if(_6cf!=undefined){ +var tr1=opts.finder.getTr(_6ce,_6cf,"body",1); +var tr2=opts.finder.getTr(_6ce,_6cf,"body",2); +_6d1(tr1,tr2); +}else{ +var tr1=opts.finder.getTr(_6ce,0,"allbody",1); +var tr2=opts.finder.getTr(_6ce,0,"allbody",2); +_6d1(tr1,tr2); +if(opts.showFooter){ +var tr1=opts.finder.getTr(_6ce,0,"allfooter",1); +var tr2=opts.finder.getTr(_6ce,0,"allfooter",2); +_6d1(tr1,tr2); +} +} +} +_6bc(_6ce); +if(opts.height=="auto"){ +var _6d2=dc.body1.parent(); +var _6d3=dc.body2; +var _6d4=_6d5(_6d3); +var _6d6=_6d4.height; +if(_6d4.width>_6d3.width()){ +_6d6+=18; +} +_6d6-=parseInt(_6d3.css("marginTop"))||0; +_6d2.height(_6d6); +_6d3.height(_6d6); +dc.view.height(dc.view2.height()); +} +dc.body2.triggerHandler("scroll"); +function _6d1(trs1,trs2){ +for(var i=0;i"); +} +_6de(true); +_6de(false); +_6bc(_6db); +function _6de(_6df){ +var _6e0=_6df?1:2; +var tr=opts.finder.getTr(_6db,_6dc,"body",_6e0); +(_6df?dc.body1:dc.body2).children("table.datagrid-btable-frozen").append(tr); +}; +}; +function _6e1(_6e2,_6e3){ +function _6e4(){ +var _6e5=[]; +var _6e6=[]; +$(_6e2).children("thead").each(function(){ +var opt=$.parser.parseOptions(this,[{frozen:"boolean"}]); +$(this).find("tr").each(function(){ +var cols=[]; +$(this).find("th").each(function(){ +var th=$(this); +var col=$.extend({},$.parser.parseOptions(this,["id","field","align","halign","order","width",{sortable:"boolean",checkbox:"boolean",resizable:"boolean",fixed:"boolean"},{rowspan:"number",colspan:"number"}]),{title:(th.html()||undefined),hidden:(th.attr("hidden")?true:undefined),formatter:(th.attr("formatter")?eval(th.attr("formatter")):undefined),styler:(th.attr("styler")?eval(th.attr("styler")):undefined),sorter:(th.attr("sorter")?eval(th.attr("sorter")):undefined)}); +if(col.width&&String(col.width).indexOf("%")==-1){ +col.width=parseInt(col.width); +} +if(th.attr("editor")){ +var s=$.trim(th.attr("editor")); +if(s.substr(0,1)=="{"){ +col.editor=eval("("+s+")"); +}else{ +col.editor=s; +} +} +cols.push(col); +}); +opt.frozen?_6e5.push(cols):_6e6.push(cols); +}); +}); +return [_6e5,_6e6]; +}; +var _6e7=$("
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+""+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+""+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  "+"
                                                                                                  ").insertAfter(_6e2); +_6e7.panel({doSize:false,cls:"datagrid"}); +$(_6e2).addClass("datagrid-f").hide().appendTo(_6e7.children("div.datagrid-view")); +var cc=_6e4(); +var view=_6e7.children("div.datagrid-view"); +var _6e8=view.children("div.datagrid-view1"); +var _6e9=view.children("div.datagrid-view2"); +return {panel:_6e7,frozenColumns:cc[0],columns:cc[1],dc:{view:view,view1:_6e8,view2:_6e9,header1:_6e8.children("div.datagrid-header").children("div.datagrid-header-inner"),header2:_6e9.children("div.datagrid-header").children("div.datagrid-header-inner"),body1:_6e8.children("div.datagrid-body").children("div.datagrid-body-inner"),body2:_6e9.children("div.datagrid-body"),footer1:_6e8.children("div.datagrid-footer").children("div.datagrid-footer-inner"),footer2:_6e9.children("div.datagrid-footer").children("div.datagrid-footer-inner")}}; +}; +function _6ea(_6eb){ +var _6ec=$.data(_6eb,"datagrid"); +var opts=_6ec.options; +var dc=_6ec.dc; +var _6ed=_6ec.panel; +_6ec.ss=$(_6eb).datagrid("createStyleSheet"); +_6ed.panel($.extend({},opts,{id:null,doSize:false,onResize:function(_6ee,_6ef){ +if($.data(_6eb,"datagrid")){ +_6bc(_6eb); +$(_6eb).datagrid("fitColumns"); +opts.onResize.call(_6ed,_6ee,_6ef); +} +},onExpand:function(){ +if($.data(_6eb,"datagrid")){ +$(_6eb).datagrid("fixRowHeight").datagrid("fitColumns"); +opts.onExpand.call(_6ed); +} +}})); +_6ec.rowIdPrefix="datagrid-row-r"+(++_6a2); +_6ec.cellClassPrefix="datagrid-cell-c"+_6a2; +_6f0(dc.header1,opts.frozenColumns,true); +_6f0(dc.header2,opts.columns,false); +_6f1(); +dc.header1.add(dc.header2).css("display",opts.showHeader?"block":"none"); +dc.footer1.add(dc.footer2).css("display",opts.showFooter?"block":"none"); +if(opts.toolbar){ +if($.isArray(opts.toolbar)){ +$("div.datagrid-toolbar",_6ed).remove(); +var tb=$("
                                                                                                  ").prependTo(_6ed); +var tr=tb.find("tr"); +for(var i=0;i
                                                                                                  ").appendTo(tr); +}else{ +var td=$("").appendTo(tr); +var tool=$("").appendTo(td); +tool[0].onclick=eval(btn.handler||function(){ +}); +tool.linkbutton($.extend({},btn,{plain:true})); +} +} +}else{ +$(opts.toolbar).addClass("datagrid-toolbar").prependTo(_6ed); +$(opts.toolbar).show(); +} +}else{ +$("div.datagrid-toolbar",_6ed).remove(); +} +$("div.datagrid-pager",_6ed).remove(); +if(opts.pagination){ +var _6f2=$("
                                                                                                  "); +if(opts.pagePosition=="bottom"){ +_6f2.appendTo(_6ed); +}else{ +if(opts.pagePosition=="top"){ +_6f2.addClass("datagrid-pager-top").prependTo(_6ed); +}else{ +var ptop=$("
                                                                                                  ").prependTo(_6ed); +_6f2.appendTo(_6ed); +_6f2=_6f2.add(ptop); +} +} +_6f2.pagination({total:0,pageNumber:opts.pageNumber,pageSize:opts.pageSize,pageList:opts.pageList,onSelectPage:function(_6f3,_6f4){ +opts.pageNumber=_6f3||1; +opts.pageSize=_6f4; +_6f2.pagination("refresh",{pageNumber:_6f3,pageSize:_6f4}); +_73c(_6eb); +}}); +opts.pageSize=_6f2.pagination("options").pageSize; +} +function _6f0(_6f5,_6f6,_6f7){ +if(!_6f6){ +return; +} +$(_6f5).show(); +$(_6f5).empty(); +var tmp=$("
                                                                                                  ").appendTo("body"); +tmp._outerWidth(99); +var _6f8=100-parseInt(tmp[0].style.width); +tmp.remove(); +var _6f9=[]; +var _6fa=[]; +var _6fb=[]; +if(opts.sortName){ +_6f9=opts.sortName.split(","); +_6fa=opts.sortOrder.split(","); +} +var t=$("
                                                                                                  ").appendTo(_6f5); +for(var i=0;i<_6f6.length;i++){ +var tr=$("").appendTo($("tbody",t)); +var cols=_6f6[i]; +for(var j=0;j").appendTo(tr); +if(col.checkbox){ +td.attr("field",col.field); +$("
                                                                                                  ").html("").appendTo(td); +}else{ +if(col.field){ +td.attr("field",col.field); +td.append("
                                                                                                  "); +td.find("span:first").html(col.title); +var cell=td.find("div.datagrid-cell"); +var pos=_6a3(_6f9,col.field); +if(pos>=0){ +cell.addClass("datagrid-sort-"+_6fa[pos]); +} +if(col.sortable){ +cell.addClass("datagrid-sort"); +} +if(col.resizable==false){ +cell.attr("resizable","false"); +} +if(col.width){ +var _6fc=$.parser.parseValue("width",col.width,dc.view,opts.scrollbarSize+(opts.rownumbers?opts.rownumberWidth:0)); +col.deltaWidth=_6f8; +col.boxWidth=_6fc-_6f8; +}else{ +col.auto=true; +} +cell.css("text-align",(col.halign||col.align||"")); +col.cellClass=_6ec.cellClassPrefix+"-"+col.field.replace(/[\.|\s]/g,"-"); +cell.addClass(col.cellClass); +}else{ +$("
                                                                                                  ").html(col.title).appendTo(td); +} +} +if(col.hidden){ +td.hide(); +_6fb.push(col.field); +} +} +} +if(_6f7&&opts.rownumbers){ +var td=$("
                                                                                                  "); +if($("tr",t).length==0){ +td.wrap("").parent().appendTo($("tbody",t)); +}else{ +td.prependTo($("tr:first",t)); +} +} +for(var i=0;i<_6fb.length;i++){ +_73e(_6eb,_6fb[i],-1); +} +}; +function _6f1(){ +var _6fd=[[".datagrid-header-rownumber",(opts.rownumberWidth-1)+"px"],[".datagrid-cell-rownumber",(opts.rownumberWidth-1)+"px"]]; +var _6fe=_6ff(_6eb,true).concat(_6ff(_6eb)); +for(var i=0;i<_6fe.length;i++){ +var col=_700(_6eb,_6fe[i]); +if(col&&!col.checkbox){ +_6fd.push(["."+col.cellClass,col.boxWidth?col.boxWidth+"px":"auto"]); +} +} +_6ec.ss.add(_6fd); +_6ec.ss.dirty(_6ec.cellSelectorPrefix); +_6ec.cellSelectorPrefix="."+_6ec.cellClassPrefix; +}; +}; +function _701(_702){ +var _703=$.data(_702,"datagrid"); +var _704=_703.panel; +var opts=_703.options; +var dc=_703.dc; +var _705=dc.header1.add(dc.header2); +_705.unbind(".datagrid"); +for(var _706 in opts.headerEvents){ +_705.bind(_706+".datagrid",opts.headerEvents[_706]); +} +var _707=_705.find("div.datagrid-cell"); +var _708=opts.resizeHandle=="right"?"e":(opts.resizeHandle=="left"?"w":"e,w"); +_707.each(function(){ +$(this).resizable({handles:_708,edge:opts.resizeEdge,disabled:($(this).attr("resizable")?$(this).attr("resizable")=="false":false),minWidth:25,onStartResize:function(e){ +_703.resizing=true; +_705.css("cursor",$("body").css("cursor")); +if(!_703.proxy){ +_703.proxy=$("
                                                                                                  ").appendTo(dc.view); +} +if(e.data.dir=="e"){ +e.data.deltaEdge=$(this)._outerWidth()-(e.pageX-$(this).offset().left); +}else{ +e.data.deltaEdge=$(this).offset().left-e.pageX-1; +} +_703.proxy.css({left:e.pageX-$(_704).offset().left-1+e.data.deltaEdge,display:"none"}); +setTimeout(function(){ +if(_703.proxy){ +_703.proxy.show(); +} +},500); +},onResize:function(e){ +_703.proxy.css({left:e.pageX-$(_704).offset().left-1+e.data.deltaEdge,display:"block"}); +return false; +},onStopResize:function(e){ +_705.css("cursor",""); +$(this).css("height",""); +var _709=$(this).parent().attr("field"); +var col=_700(_702,_709); +col.width=$(this)._outerWidth()+1; +col.boxWidth=col.width-col.deltaWidth; +col.auto=undefined; +$(this).css("width",""); +$(_702).datagrid("fixColumnSize",_709); +_703.proxy.remove(); +_703.proxy=null; +if($(this).parents("div:first.datagrid-header").parent().hasClass("datagrid-view1")){ +_6bc(_702); +} +$(_702).datagrid("fitColumns"); +opts.onResizeColumn.call(_702,_709,col.width); +setTimeout(function(){ +_703.resizing=false; +},0); +}}); +}); +var bb=dc.body1.add(dc.body2); +bb.unbind(); +for(var _706 in opts.rowEvents){ +bb.bind(_706,opts.rowEvents[_706]); +} +dc.body1.bind("mousewheel DOMMouseScroll",function(e){ +e.preventDefault(); +var e1=e.originalEvent||window.event; +var _70a=e1.wheelDelta||e1.detail*(-1); +if("deltaY" in e1){ +_70a=e1.deltaY*-1; +} +var dg=$(e.target).closest("div.datagrid-view").children(".datagrid-f"); +var dc=dg.data("datagrid").dc; +dc.body2.scrollTop(dc.body2.scrollTop()-_70a); +}); +dc.body2.bind("scroll",function(){ +var b1=dc.view1.children("div.datagrid-body"); +b1.scrollTop($(this).scrollTop()); +var c1=dc.body1.children(":first"); +var c2=dc.body2.children(":first"); +if(c1.length&&c2.length){ +var top1=c1.offset().top; +var top2=c2.offset().top; +if(top1!=top2){ +b1.scrollTop(b1.scrollTop()+top1-top2); +} +} +dc.view2.children("div.datagrid-header,div.datagrid-footer")._scrollLeft($(this)._scrollLeft()); +dc.body2.children("table.datagrid-btable-frozen").css("left",-$(this)._scrollLeft()); +}); +}; +function _70b(_70c){ +return function(e){ +var td=$(e.target).closest("td[field]"); +if(td.length){ +var _70d=_70e(td); +if(!$(_70d).data("datagrid").resizing&&_70c){ +td.addClass("datagrid-header-over"); +}else{ +td.removeClass("datagrid-header-over"); +} +} +}; +}; +function _70f(e){ +var _710=_70e(e.target); +var opts=$(_710).datagrid("options"); +var ck=$(e.target).closest("input[type=checkbox]"); +if(ck.length){ +if(opts.singleSelect&&opts.selectOnCheck){ +return false; +} +if(ck.is(":checked")){ +_711(_710); +}else{ +_712(_710); +} +e.stopPropagation(); +}else{ +var cell=$(e.target).closest(".datagrid-cell"); +if(cell.length){ +var p1=cell.offset().left+5; +var p2=cell.offset().left+cell._outerWidth()-5; +if(e.pageXp1){ +_713(_710,cell.parent().attr("field")); +} +} +} +}; +function _714(e){ +var _715=_70e(e.target); +var opts=$(_715).datagrid("options"); +var cell=$(e.target).closest(".datagrid-cell"); +if(cell.length){ +var p1=cell.offset().left+5; +var p2=cell.offset().left+cell._outerWidth()-5; +var cond=opts.resizeHandle=="right"?(e.pageX>p2):(opts.resizeHandle=="left"?(e.pageXp2)); +if(cond){ +var _716=cell.parent().attr("field"); +var col=_700(_715,_716); +if(col.resizable==false){ +return; +} +$(_715).datagrid("autoSizeColumn",_716); +col.auto=false; +} +} +}; +function _717(e){ +var _718=_70e(e.target); +var opts=$(_718).datagrid("options"); +var td=$(e.target).closest("td[field]"); +opts.onHeaderContextMenu.call(_718,e,td.attr("field")); +}; +function _719(_71a){ +return function(e){ +var tr=_71b(e.target); +if(!tr){ +return; +} +var _71c=_70e(tr); +if($.data(_71c,"datagrid").resizing){ +return; +} +var _71d=_71e(tr); +if(_71a){ +_71f(_71c,_71d); +}else{ +var opts=$.data(_71c,"datagrid").options; +opts.finder.getTr(_71c,_71d).removeClass("datagrid-row-over"); +} +}; +}; +function _720(e){ +var tr=_71b(e.target); +if(!tr){ +return; +} +var _721=_70e(tr); +var opts=$.data(_721,"datagrid").options; +var _722=_71e(tr); +var tt=$(e.target); +if(tt.parent().hasClass("datagrid-cell-check")){ +if(opts.singleSelect&&opts.selectOnCheck){ +tt._propAttr("checked",!tt.is(":checked")); +_723(_721,_722); +}else{ +if(tt.is(":checked")){ +tt._propAttr("checked",false); +_723(_721,_722); +}else{ +tt._propAttr("checked",true); +_724(_721,_722); +} +} +}else{ +var row=opts.finder.getRow(_721,_722); +var td=tt.closest("td[field]",tr); +if(td.length){ +var _725=td.attr("field"); +opts.onClickCell.call(_721,_722,_725,row[_725]); +} +if(opts.singleSelect==true){ +_726(_721,_722); +}else{ +if(opts.ctrlSelect){ +if(e.metaKey||e.ctrlKey){ +if(tr.hasClass("datagrid-row-selected")){ +_727(_721,_722); +}else{ +_726(_721,_722); +} +}else{ +if(e.shiftKey){ +$(_721).datagrid("clearSelections"); +var _728=Math.min(opts.lastSelectedIndex||0,_722); +var _729=Math.max(opts.lastSelectedIndex||0,_722); +for(var i=_728;i<=_729;i++){ +_726(_721,i); +} +}else{ +$(_721).datagrid("clearSelections"); +_726(_721,_722); +opts.lastSelectedIndex=_722; +} +} +}else{ +if(tr.hasClass("datagrid-row-selected")){ +_727(_721,_722); +}else{ +_726(_721,_722); +} +} +} +opts.onClickRow.apply(_721,_6a6(_721,[_722,row])); +} +}; +function _72a(e){ +var tr=_71b(e.target); +if(!tr){ +return; +} +var _72b=_70e(tr); +var opts=$.data(_72b,"datagrid").options; +var _72c=_71e(tr); +var row=opts.finder.getRow(_72b,_72c); +var td=$(e.target).closest("td[field]",tr); +if(td.length){ +var _72d=td.attr("field"); +opts.onDblClickCell.call(_72b,_72c,_72d,row[_72d]); +} +opts.onDblClickRow.apply(_72b,_6a6(_72b,[_72c,row])); +}; +function _72e(e){ +var tr=_71b(e.target); +if(tr){ +var _72f=_70e(tr); +var opts=$.data(_72f,"datagrid").options; +var _730=_71e(tr); +var row=opts.finder.getRow(_72f,_730); +opts.onRowContextMenu.call(_72f,e,_730,row); +}else{ +var body=_71b(e.target,".datagrid-body"); +if(body){ +var _72f=_70e(body); +var opts=$.data(_72f,"datagrid").options; +opts.onRowContextMenu.call(_72f,e,-1,null); +} +} +}; +function _70e(t){ +return $(t).closest("div.datagrid-view").children(".datagrid-f")[0]; +}; +function _71b(t,_731){ +var tr=$(t).closest(_731||"tr.datagrid-row"); +if(tr.length&&tr.parent().length){ +return tr; +}else{ +return undefined; +} +}; +function _71e(tr){ +if(tr.attr("datagrid-row-index")){ +return parseInt(tr.attr("datagrid-row-index")); +}else{ +return tr.attr("node-id"); +} +}; +function _713(_732,_733){ +var _734=$.data(_732,"datagrid"); +var opts=_734.options; +_733=_733||{}; +var _735={sortName:opts.sortName,sortOrder:opts.sortOrder}; +if(typeof _733=="object"){ +$.extend(_735,_733); +} +var _736=[]; +var _737=[]; +if(_735.sortName){ +_736=_735.sortName.split(","); +_737=_735.sortOrder.split(","); +} +if(typeof _733=="string"){ +var _738=_733; +var col=_700(_732,_738); +if(!col.sortable||_734.resizing){ +return; +} +var _739=col.order||"asc"; +var pos=_6a3(_736,_738); +if(pos>=0){ +var _73a=_737[pos]=="asc"?"desc":"asc"; +if(opts.multiSort&&_73a==_739){ +_736.splice(pos,1); +_737.splice(pos,1); +}else{ +_737[pos]=_73a; +} +}else{ +if(opts.multiSort){ +_736.push(_738); +_737.push(_739); +}else{ +_736=[_738]; +_737=[_739]; +} +} +_735.sortName=_736.join(","); +_735.sortOrder=_737.join(","); +} +if(opts.onBeforeSortColumn.call(_732,_735.sortName,_735.sortOrder)==false){ +return; +} +$.extend(opts,_735); +var dc=_734.dc; +var _73b=dc.header1.add(dc.header2); +_73b.find("div.datagrid-cell").removeClass("datagrid-sort-asc datagrid-sort-desc"); +for(var i=0;i<_736.length;i++){ +var col=_700(_732,_736[i]); +_73b.find("div."+col.cellClass).addClass("datagrid-sort-"+_737[i]); +} +if(opts.remoteSort){ +_73c(_732); +}else{ +_73d(_732,$(_732).datagrid("getData")); +} +opts.onSortColumn.call(_732,opts.sortName,opts.sortOrder); +}; +function _73e(_73f,_740,_741){ +_742(true); +_742(false); +function _742(_743){ +var aa=_744(_73f,_743); +if(aa.length){ +var _745=aa[aa.length-1]; +var _746=_6a3(_745,_740); +if(_746>=0){ +for(var _747=0;_747=_74c.find("table").width()){ +dc.body2.css("overflow-x","hidden"); +} +function _74f(){ +if(!opts.fitColumns){ +return; +} +if(!_74b.leftWidth){ +_74b.leftWidth=0; +} +var _750=0; +var cc=[]; +var _751=_6ff(_74a,false); +for(var i=0;i<_751.length;i++){ +var col=_700(_74a,_751[i]); +if(_752(col)){ +_750+=col.width; +cc.push({field:col.field,col:col,addingWidth:0}); +} +} +if(!_750){ +return; +} +cc[cc.length-1].addingWidth-=_74b.leftWidth; +var _753=_74c.children("div.datagrid-header-inner").show(); +var _754=_74c.width()-_74c.find("table").width()-opts.scrollbarSize+_74b.leftWidth; +var rate=_754/_750; +if(!opts.showHeader){ +_753.hide(); +} +for(var i=0;i0){ +c.col.boxWidth+=c.addingWidth; +c.col.width+=c.addingWidth; +} +} +_74b.leftWidth=_754; +$(_74a).datagrid("fixColumnSize"); +}; +function _74e(){ +var _756=false; +var _757=_6ff(_74a,true).concat(_6ff(_74a,false)); +$.map(_757,function(_758){ +var col=_700(_74a,_758); +if(String(col.width||"").indexOf("%")>=0){ +var _759=$.parser.parseValue("width",col.width,dc.view,opts.scrollbarSize+(opts.rownumbers?opts.rownumberWidth:0))-col.deltaWidth; +if(_759>0){ +col.boxWidth=_759; +_756=true; +} +} +}); +if(_756){ +$(_74a).datagrid("fixColumnSize"); +} +}; +function _74d(fit){ +var _75a=dc.header1.add(dc.header2).find(".datagrid-cell-group"); +if(_75a.length){ +_75a.each(function(){ +$(this)._outerWidth(fit?$(this).parent().width():10); +}); +if(fit){ +_6bc(_74a); +} +} +}; +function _752(col){ +if(String(col.width||"").indexOf("%")>=0){ +return false; +} +if(!col.hidden&&!col.checkbox&&!col.auto&&!col.fixed){ +return true; +} +}; +}; +function _75b(_75c,_75d){ +var _75e=$.data(_75c,"datagrid"); +var opts=_75e.options; +var dc=_75e.dc; +var tmp=$("
                                                                                                  ").appendTo("body"); +if(_75d){ +_6b7(_75d); +$(_75c).datagrid("fitColumns"); +}else{ +var _75f=false; +var _760=_6ff(_75c,true).concat(_6ff(_75c,false)); +for(var i=0;i<_760.length;i++){ +var _75d=_760[i]; +var col=_700(_75c,_75d); +if(col.auto){ +_6b7(_75d); +_75f=true; +} +} +if(_75f){ +$(_75c).datagrid("fitColumns"); +} +} +tmp.remove(); +function _6b7(_761){ +var _762=dc.view.find("div.datagrid-header td[field=\""+_761+"\"] div.datagrid-cell"); +_762.css("width",""); +var col=$(_75c).datagrid("getColumnOption",_761); +col.width=undefined; +col.boxWidth=undefined; +col.auto=true; +$(_75c).datagrid("fixColumnSize",_761); +var _763=Math.max(_764("header"),_764("allbody"),_764("allfooter"))+1; +_762._outerWidth(_763-1); +col.width=_763; +col.boxWidth=parseInt(_762[0].style.width); +col.deltaWidth=_763-col.boxWidth; +_762.css("width",""); +$(_75c).datagrid("fixColumnSize",_761); +opts.onResizeColumn.call(_75c,_761,col.width); +function _764(type){ +var _765=0; +if(type=="header"){ +_765=_766(_762); +}else{ +opts.finder.getTr(_75c,0,type).find("td[field=\""+_761+"\"] div.datagrid-cell").each(function(){ +var w=_766($(this)); +if(_7651){ +var col=_700(_76f,td.attr("field")); +var _771=col.boxWidth+col.deltaWidth-1; +for(var i=1;i<_770;i++){ +td=td.next(); +col=_700(_76f,td.attr("field")); +_771+=col.boxWidth+col.deltaWidth; +} +$(this).children("div.datagrid-cell")._outerWidth(_771); +} +}); +}; +function _76d(_772){ +var dc=$.data(_772,"datagrid").dc; +dc.view.find("div.datagrid-editable").each(function(){ +var cell=$(this); +var _773=cell.parent().attr("field"); +var col=$(_772).datagrid("getColumnOption",_773); +cell._outerWidth(col.boxWidth+col.deltaWidth-1); +var ed=$.data(this,"datagrid.editor"); +if(ed.actions.resize){ +ed.actions.resize(ed.target,cell.width()); +} +}); +}; +function _700(_774,_775){ +function find(_776){ +if(_776){ +for(var i=0;i<_776.length;i++){ +var cc=_776[i]; +for(var j=0;j=0){ +var _77f=col.field||col.id||""; +for(var c=0;c<(col.colspan||1);c++){ +for(var r=0;r<(col.rowspan||1);r++){ +aa[_77c+r][_77d]=_77f; +} +_77d++; +} +} +}); +} +return aa; +function _77b(){ +var _780=0; +$.map(_779[0]||[],function(col){ +_780+=col.colspan||1; +}); +return _780; +}; +function _77e(a){ +for(var i=0;ib?1:-1); +}; +r=_787(r1[sn],r2[sn])*(so=="asc"?1:-1); +if(r!=0){ +return r; +} +} +return r; +}); +} +if(opts.view.onBeforeRender){ +opts.view.onBeforeRender.call(opts.view,_783,data.rows); +} +opts.view.render.call(opts.view,_783,dc.body2,false); +opts.view.render.call(opts.view,_783,dc.body1,true); +if(opts.showFooter){ +opts.view.renderFooter.call(opts.view,_783,dc.footer2,false); +opts.view.renderFooter.call(opts.view,_783,dc.footer1,true); +} +if(opts.view.onAfterRender){ +opts.view.onAfterRender.call(opts.view,_783); +} +_784.ss.clean(); +var _788=$(_783).datagrid("getPager"); +if(_788.length){ +var _789=_788.pagination("options"); +if(_789.total!=data.total){ +_788.pagination("refresh",{pageNumber:opts.pageNumber,total:data.total}); +if(opts.pageNumber!=_789.pageNumber&&_789.pageNumber>0){ +opts.pageNumber=_789.pageNumber; +_73c(_783); +} +} +} +_6cd(_783); +dc.body2.triggerHandler("scroll"); +$(_783).datagrid("setSelectionState"); +$(_783).datagrid("autoSizeColumn"); +opts.onLoadSuccess.call(_783,data); +}; +function _78a(_78b){ +var _78c=$.data(_78b,"datagrid"); +var opts=_78c.options; +var dc=_78c.dc; +dc.header1.add(dc.header2).find("input[type=checkbox]")._propAttr("checked",false); +if(opts.idField){ +var _78d=$.data(_78b,"treegrid")?true:false; +var _78e=opts.onSelect; +var _78f=opts.onCheck; +opts.onSelect=opts.onCheck=function(){ +}; +var rows=opts.finder.getRows(_78b); +for(var i=0;i_7a0.height()-_7a1){ +_7a0.scrollTop(_7a0.scrollTop()+top+tr._outerHeight()-_7a0.height()+_7a1); +} +} +} +}; +function _71f(_7a3,_7a4){ +var _7a5=$.data(_7a3,"datagrid"); +var opts=_7a5.options; +opts.finder.getTr(_7a3,_7a5.highlightIndex).removeClass("datagrid-row-over"); +opts.finder.getTr(_7a3,_7a4).addClass("datagrid-row-over"); +_7a5.highlightIndex=_7a4; +}; +function _726(_7a6,_7a7,_7a8,_7a9){ +var _7aa=$.data(_7a6,"datagrid"); +var opts=_7aa.options; +var row=opts.finder.getRow(_7a6,_7a7); +if(!row){ +return; +} +if(opts.onBeforeSelect.apply(_7a6,_6a6(_7a6,[_7a7,row]))==false){ +return; +} +if(opts.singleSelect){ +_7ab(_7a6,true); +_7aa.selectedRows=[]; +} +if(!_7a8&&opts.checkOnSelect){ +_723(_7a6,_7a7,true); +} +if(opts.idField){ +_6a5(_7aa.selectedRows,opts.idField,row); +} +opts.finder.getTr(_7a6,_7a7).addClass("datagrid-row-selected"); +opts.onSelect.apply(_7a6,_6a6(_7a6,[_7a7,row])); +if(!_7a9&&opts.scrollOnSelect){ +_79b(_7a6,_7a7); +} +}; +function _727(_7ac,_7ad,_7ae){ +var _7af=$.data(_7ac,"datagrid"); +var dc=_7af.dc; +var opts=_7af.options; +var row=opts.finder.getRow(_7ac,_7ad); +if(!row){ +return; +} +if(opts.onBeforeUnselect.apply(_7ac,_6a6(_7ac,[_7ad,row]))==false){ +return; +} +if(!_7ae&&opts.checkOnSelect){ +_724(_7ac,_7ad,true); +} +opts.finder.getTr(_7ac,_7ad).removeClass("datagrid-row-selected"); +if(opts.idField){ +_6a4(_7af.selectedRows,opts.idField,row[opts.idField]); +} +opts.onUnselect.apply(_7ac,_6a6(_7ac,[_7ad,row])); +}; +function _7b0(_7b1,_7b2){ +var _7b3=$.data(_7b1,"datagrid"); +var opts=_7b3.options; +var rows=opts.finder.getRows(_7b1); +var _7b4=$.data(_7b1,"datagrid").selectedRows; +if(!_7b2&&opts.checkOnSelect){ +_711(_7b1,true); +} +opts.finder.getTr(_7b1,"","allbody").addClass("datagrid-row-selected"); +if(opts.idField){ +for(var _7b5=0;_7b5"); +cell.children("table").bind("click dblclick contextmenu",function(e){ +e.stopPropagation(); +}); +$.data(cell[0],"datagrid.editor",{actions:_7ea,target:_7ea.init(cell.find("td"),$.extend({height:opts.editorHeight},_7e9)),field:_7e7,type:_7e8,oldHtml:_7eb}); +} +} +}); +_6cd(_7e5,_7e6,true); +}; +function _7dc(_7ed,_7ee){ +var opts=$.data(_7ed,"datagrid").options; +var tr=opts.finder.getTr(_7ed,_7ee); +tr.children("td").each(function(){ +var cell=$(this).find("div.datagrid-editable"); +if(cell.length){ +var ed=$.data(cell[0],"datagrid.editor"); +if(ed.actions.destroy){ +ed.actions.destroy(ed.target); +} +cell.html(ed.oldHtml); +$.removeData(cell[0],"datagrid.editor"); +cell.removeClass("datagrid-editable"); +cell.css("width",""); +} +}); +}; +function _7cf(_7ef,_7f0){ +var tr=$.data(_7ef,"datagrid").options.finder.getTr(_7ef,_7f0); +if(!tr.hasClass("datagrid-row-editing")){ +return true; +} +var vbox=tr.find(".validatebox-text"); +vbox.validatebox("validate"); +vbox.trigger("mouseleave"); +var _7f1=tr.find(".validatebox-invalid"); +return _7f1.length==0; +}; +function _7f2(_7f3,_7f4){ +var _7f5=$.data(_7f3,"datagrid").insertedRows; +var _7f6=$.data(_7f3,"datagrid").deletedRows; +var _7f7=$.data(_7f3,"datagrid").updatedRows; +if(!_7f4){ +var rows=[]; +rows=rows.concat(_7f5); +rows=rows.concat(_7f6); +rows=rows.concat(_7f7); +return rows; +}else{ +if(_7f4=="inserted"){ +return _7f5; +}else{ +if(_7f4=="deleted"){ +return _7f6; +}else{ +if(_7f4=="updated"){ +return _7f7; +} +} +} +} +return []; +}; +function _7f8(_7f9,_7fa){ +var _7fb=$.data(_7f9,"datagrid"); +var opts=_7fb.options; +var data=_7fb.data; +var _7fc=_7fb.insertedRows; +var _7fd=_7fb.deletedRows; +$(_7f9).datagrid("cancelEdit",_7fa); +var row=opts.finder.getRow(_7f9,_7fa); +if(_6a3(_7fc,row)>=0){ +_6a4(_7fc,row); +}else{ +_7fd.push(row); +} +_6a4(_7fb.selectedRows,opts.idField,row[opts.idField]); +_6a4(_7fb.checkedRows,opts.idField,row[opts.idField]); +opts.view.deleteRow.call(opts.view,_7f9,_7fa); +if(opts.height=="auto"){ +_6cd(_7f9); +} +$(_7f9).datagrid("getPager").pagination("refresh",{total:data.total}); +}; +function _7fe(_7ff,_800){ +var data=$.data(_7ff,"datagrid").data; +var view=$.data(_7ff,"datagrid").options.view; +var _801=$.data(_7ff,"datagrid").insertedRows; +view.insertRow.call(view,_7ff,_800.index,_800.row); +_801.push(_800.row); +$(_7ff).datagrid("getPager").pagination("refresh",{total:data.total}); +}; +function _802(_803,row){ +var data=$.data(_803,"datagrid").data; +var view=$.data(_803,"datagrid").options.view; +var _804=$.data(_803,"datagrid").insertedRows; +view.insertRow.call(view,_803,null,row); +_804.push(row); +$(_803).datagrid("getPager").pagination("refresh",{total:data.total}); +}; +function _805(_806,_807){ +var _808=$.data(_806,"datagrid"); +var opts=_808.options; +var row=opts.finder.getRow(_806,_807.index); +var _809=false; +_807.row=_807.row||{}; +for(var _80a in _807.row){ +if(row[_80a]!==_807.row[_80a]){ +_809=true; +break; +} +} +if(_809){ +if(_6a3(_808.insertedRows,row)==-1){ +if(_6a3(_808.updatedRows,row)==-1){ +_808.updatedRows.push(row); +} +} +opts.view.updateRow.call(opts.view,_806,_807.index,_807.row); +} +}; +function _80b(_80c){ +var _80d=$.data(_80c,"datagrid"); +var data=_80d.data; +var rows=data.rows; +var _80e=[]; +for(var i=0;i=0){ +(_81b=="s"?_726:_723)(_812,_81c,true); +} +} +}; +for(var i=0;i0){ +$(this).datagrid("loadData",data); +}else{ +$(this).datagrid("autoSizeColumn"); +} +} +_73c(this); +}); +}; +function _82c(_82d){ +var _82e={}; +$.map(_82d,function(name){ +_82e[name]=_82f(name); +}); +return _82e; +function _82f(name){ +function isA(_830){ +return $.data($(_830)[0],name)!=undefined; +}; +return {init:function(_831,_832){ +var _833=$("").appendTo(_831); +if(_833[name]&&name!="text"){ +return _833[name](_832); +}else{ +return _833; +} +},destroy:function(_834){ +if(isA(_834,name)){ +$(_834)[name]("destroy"); +} +},getValue:function(_835){ +if(isA(_835,name)){ +var opts=$(_835)[name]("options"); +if(opts.multiple){ +return $(_835)[name]("getValues").join(opts.separator); +}else{ +return $(_835)[name]("getValue"); +} +}else{ +return $(_835).val(); +} +},setValue:function(_836,_837){ +if(isA(_836,name)){ +var opts=$(_836)[name]("options"); +if(opts.multiple){ +if(_837){ +$(_836)[name]("setValues",_837.split(opts.separator)); +}else{ +$(_836)[name]("clear"); +} +}else{ +$(_836)[name]("setValue",_837); +} +}else{ +$(_836).val(_837); +} +},resize:function(_838,_839){ +if(isA(_838,name)){ +$(_838)[name]("resize",_839); +}else{ +$(_838)._size({width:_839,height:$.fn.datagrid.defaults.editorHeight}); +} +}}; +}; +}; +var _83a=$.extend({},_82c(["text","textbox","passwordbox","filebox","numberbox","numberspinner","combobox","combotree","combogrid","combotreegrid","datebox","datetimebox","timespinner","datetimespinner"]),{textarea:{init:function(_83b,_83c){ +var _83d=$("").appendTo(_83b); +_83d.css("vertical-align","middle")._outerHeight(_83c.height); +return _83d; +},getValue:function(_83e){ +return $(_83e).val(); +},setValue:function(_83f,_840){ +$(_83f).val(_840); +},resize:function(_841,_842){ +$(_841)._outerWidth(_842); +}},checkbox:{init:function(_843,_844){ +var _845=$("").appendTo(_843); +_845.val(_844.on); +_845.attr("offval",_844.off); +return _845; +},getValue:function(_846){ +if($(_846).is(":checked")){ +return $(_846).val(); +}else{ +return $(_846).attr("offval"); +} +},setValue:function(_847,_848){ +var _849=false; +if($(_847).val()==_848){ +_849=true; +} +$(_847)._propAttr("checked",_849); +}},validatebox:{init:function(_84a,_84b){ +var _84c=$("").appendTo(_84a); +_84c.validatebox(_84b); +return _84c; +},destroy:function(_84d){ +$(_84d).validatebox("destroy"); +},getValue:function(_84e){ +return $(_84e).val(); +},setValue:function(_84f,_850){ +$(_84f).val(_850); +},resize:function(_851,_852){ +$(_851)._outerWidth(_852)._outerHeight($.fn.datagrid.defaults.editorHeight); +}}}); +$.fn.datagrid.methods={options:function(jq){ +var _853=$.data(jq[0],"datagrid").options; +var _854=$.data(jq[0],"datagrid").panel.panel("options"); +var opts=$.extend(_853,{width:_854.width,height:_854.height,closed:_854.closed,collapsed:_854.collapsed,minimized:_854.minimized,maximized:_854.maximized}); +return opts; +},setSelectionState:function(jq){ +return jq.each(function(){ +_78a(this); +}); +},createStyleSheet:function(jq){ +return _6a8(jq[0]); +},getPanel:function(jq){ +return $.data(jq[0],"datagrid").panel; +},getPager:function(jq){ +return $.data(jq[0],"datagrid").panel.children("div.datagrid-pager"); +},getColumnFields:function(jq,_855){ +return _6ff(jq[0],_855); +},getColumnOption:function(jq,_856){ +return _700(jq[0],_856); +},resize:function(jq,_857){ +return jq.each(function(){ +_6b7(this,_857); +}); +},load:function(jq,_858){ +return jq.each(function(){ +var opts=$(this).datagrid("options"); +if(typeof _858=="string"){ +opts.url=_858; +_858=null; +} +opts.pageNumber=1; +var _859=$(this).datagrid("getPager"); +_859.pagination("refresh",{pageNumber:1}); +_73c(this,_858); +}); +},reload:function(jq,_85a){ +return jq.each(function(){ +var opts=$(this).datagrid("options"); +if(typeof _85a=="string"){ +opts.url=_85a; +_85a=null; +} +_73c(this,_85a); +}); +},reloadFooter:function(jq,_85b){ +return jq.each(function(){ +var opts=$.data(this,"datagrid").options; +var dc=$.data(this,"datagrid").dc; +if(_85b){ +$.data(this,"datagrid").footer=_85b; +} +if(opts.showFooter){ +opts.view.renderFooter.call(opts.view,this,dc.footer2,false); +opts.view.renderFooter.call(opts.view,this,dc.footer1,true); +if(opts.view.onAfterRender){ +opts.view.onAfterRender.call(opts.view,this); +} +$(this).datagrid("fixRowHeight"); +} +}); +},loading:function(jq){ +return jq.each(function(){ +var opts=$.data(this,"datagrid").options; +$(this).datagrid("getPager").pagination("loading"); +if(opts.loadMsg){ +var _85c=$(this).datagrid("getPanel"); +if(!_85c.children("div.datagrid-mask").length){ +$("
                                                                                                  ").appendTo(_85c); +var msg=$("
                                                                                                  ").html(opts.loadMsg).appendTo(_85c); +msg._outerHeight(40); +msg.css({marginLeft:(-msg.outerWidth()/2),lineHeight:(msg.height()+"px")}); +} +} +}); +},loaded:function(jq){ +return jq.each(function(){ +$(this).datagrid("getPager").pagination("loaded"); +var _85d=$(this).datagrid("getPanel"); +_85d.children("div.datagrid-mask-msg").remove(); +_85d.children("div.datagrid-mask").remove(); +}); +},fitColumns:function(jq){ +return jq.each(function(){ +_749(this); +}); +},fixColumnSize:function(jq,_85e){ +return jq.each(function(){ +_767(this,_85e); +}); +},fixRowHeight:function(jq,_85f){ +return jq.each(function(){ +_6cd(this,_85f); +}); +},freezeRow:function(jq,_860){ +return jq.each(function(){ +_6da(this,_860); +}); +},autoSizeColumn:function(jq,_861){ +return jq.each(function(){ +_75b(this,_861); +}); +},loadData:function(jq,data){ +return jq.each(function(){ +_73d(this,data); +_80b(this); +}); +},getData:function(jq){ +return $.data(jq[0],"datagrid").data; +},getRows:function(jq){ +return $.data(jq[0],"datagrid").data.rows; +},getFooterRows:function(jq){ +return $.data(jq[0],"datagrid").footer; +},getRowIndex:function(jq,id){ +return _792(jq[0],id); +},getChecked:function(jq){ +return _798(jq[0]); +},getSelected:function(jq){ +var rows=_795(jq[0]); +return rows.length>0?rows[0]:null; +},getSelections:function(jq){ +return _795(jq[0]); +},clearSelections:function(jq){ +return jq.each(function(){ +var _862=$.data(this,"datagrid"); +var _863=_862.selectedRows; +var _864=_862.checkedRows; +_863.splice(0,_863.length); +_7ab(this); +if(_862.options.checkOnSelect){ +_864.splice(0,_864.length); +} +}); +},clearChecked:function(jq){ +return jq.each(function(){ +var _865=$.data(this,"datagrid"); +var _866=_865.selectedRows; +var _867=_865.checkedRows; +_867.splice(0,_867.length); +_712(this); +if(_865.options.selectOnCheck){ +_866.splice(0,_866.length); +} +}); +},scrollTo:function(jq,_868){ +return jq.each(function(){ +_79b(this,_868); +}); +},highlightRow:function(jq,_869){ +return jq.each(function(){ +_71f(this,_869); +_79b(this,_869); +}); +},selectAll:function(jq){ +return jq.each(function(){ +_7b0(this); +}); +},unselectAll:function(jq){ +return jq.each(function(){ +_7ab(this); +}); +},selectRow:function(jq,_86a){ +return jq.each(function(){ +_726(this,_86a); +}); +},selectRecord:function(jq,id){ +return jq.each(function(){ +var opts=$.data(this,"datagrid").options; +if(opts.idField){ +var _86b=_792(this,id); +if(_86b>=0){ +$(this).datagrid("selectRow",_86b); +} +} +}); +},unselectRow:function(jq,_86c){ +return jq.each(function(){ +_727(this,_86c); +}); +},checkRow:function(jq,_86d){ +return jq.each(function(){ +_723(this,_86d); +}); +},uncheckRow:function(jq,_86e){ +return jq.each(function(){ +_724(this,_86e); +}); +},checkAll:function(jq){ +return jq.each(function(){ +_711(this); +}); +},uncheckAll:function(jq){ +return jq.each(function(){ +_712(this); +}); +},beginEdit:function(jq,_86f){ +return jq.each(function(){ +_7ca(this,_86f); +}); +},endEdit:function(jq,_870){ +return jq.each(function(){ +_7d0(this,_870,false); +}); +},cancelEdit:function(jq,_871){ +return jq.each(function(){ +_7d0(this,_871,true); +}); +},getEditors:function(jq,_872){ +return _7dd(jq[0],_872); +},getEditor:function(jq,_873){ +return _7e1(jq[0],_873); +},refreshRow:function(jq,_874){ +return jq.each(function(){ +var opts=$.data(this,"datagrid").options; +opts.view.refreshRow.call(opts.view,this,_874); +}); +},validateRow:function(jq,_875){ +return _7cf(jq[0],_875); +},updateRow:function(jq,_876){ +return jq.each(function(){ +_805(this,_876); +}); +},appendRow:function(jq,row){ +return jq.each(function(){ +_802(this,row); +}); +},insertRow:function(jq,_877){ +return jq.each(function(){ +_7fe(this,_877); +}); +},deleteRow:function(jq,_878){ +return jq.each(function(){ +_7f8(this,_878); +}); +},getChanges:function(jq,_879){ +return _7f2(jq[0],_879); +},acceptChanges:function(jq){ +return jq.each(function(){ +_80f(this); +}); +},rejectChanges:function(jq){ +return jq.each(function(){ +_811(this); +}); +},mergeCells:function(jq,_87a){ +return jq.each(function(){ +_823(this,_87a); +}); +},showColumn:function(jq,_87b){ +return jq.each(function(){ +var col=$(this).datagrid("getColumnOption",_87b); +if(col.hidden){ +col.hidden=false; +$(this).datagrid("getPanel").find("td[field=\""+_87b+"\"]").show(); +_73e(this,_87b,1); +$(this).datagrid("fitColumns"); +} +}); +},hideColumn:function(jq,_87c){ +return jq.each(function(){ +var col=$(this).datagrid("getColumnOption",_87c); +if(!col.hidden){ +col.hidden=true; +$(this).datagrid("getPanel").find("td[field=\""+_87c+"\"]").hide(); +_73e(this,_87c,-1); +$(this).datagrid("fitColumns"); +} +}); +},sort:function(jq,_87d){ +return jq.each(function(){ +_713(this,_87d); +}); +},gotoPage:function(jq,_87e){ +return jq.each(function(){ +var _87f=this; +var page,cb; +if(typeof _87e=="object"){ +page=_87e.page; +cb=_87e.callback; +}else{ +page=_87e; +} +$(_87f).datagrid("options").pageNumber=page; +$(_87f).datagrid("getPager").pagination("refresh",{pageNumber:page}); +_73c(_87f,null,function(){ +if(cb){ +cb.call(_87f,page); +} +}); +}); +}}; +$.fn.datagrid.parseOptions=function(_880){ +var t=$(_880); +return $.extend({},$.fn.panel.parseOptions(_880),$.parser.parseOptions(_880,["url","toolbar","idField","sortName","sortOrder","pagePosition","resizeHandle",{sharedStyleSheet:"boolean",fitColumns:"boolean",autoRowHeight:"boolean",striped:"boolean",nowrap:"boolean"},{rownumbers:"boolean",singleSelect:"boolean",ctrlSelect:"boolean",checkOnSelect:"boolean",selectOnCheck:"boolean"},{pagination:"boolean",pageSize:"number",pageNumber:"number"},{multiSort:"boolean",remoteSort:"boolean",showHeader:"boolean",showFooter:"boolean"},{scrollbarSize:"number",scrollOnSelect:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined),loadMsg:(t.attr("loadMsg")!=undefined?t.attr("loadMsg"):undefined),rowStyler:(t.attr("rowStyler")?eval(t.attr("rowStyler")):undefined)}); +}; +$.fn.datagrid.parseData=function(_881){ +var t=$(_881); +var data={total:0,rows:[]}; +var _882=t.datagrid("getColumnFields",true).concat(t.datagrid("getColumnFields",false)); +t.find("tbody tr").each(function(){ +data.total++; +var row={}; +$.extend(row,$.parser.parseOptions(this,["iconCls","state"])); +for(var i=0;i<_882.length;i++){ +row[_882[i]]=$(this).find("td:eq("+i+")").html(); +} +data.rows.push(row); +}); +return data; +}; +var _883={render:function(_884,_885,_886){ +var rows=$(_884).datagrid("getRows"); +$(_885).empty().html(this.renderTable(_884,0,rows,_886)); +},renderFooter:function(_887,_888,_889){ +var opts=$.data(_887,"datagrid").options; +var rows=$.data(_887,"datagrid").footer||[]; +var _88a=$(_887).datagrid("getColumnFields",_889); +var _88b=[""]; +for(var i=0;i"); +_88b.push(this.renderRow.call(this,_887,_88a,_889,i,rows[i])); +_88b.push(""); +} +_88b.push("
                                                                                                  "); +$(_888).html(_88b.join("")); +},renderTable:function(_88c,_88d,rows,_88e){ +var _88f=$.data(_88c,"datagrid"); +var opts=_88f.options; +if(_88e){ +if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){ +return ""; +} +} +var _890=$(_88c).datagrid("getColumnFields",_88e); +var _891=[""]; +for(var i=0;i"); +_891.push(this.renderRow.call(this,_88c,_890,_88e,_88d,row)); +_891.push(""); +_88d++; +} +_891.push("
                                                                                                  "); +return _891.join(""); +},renderRow:function(_894,_895,_896,_897,_898){ +var opts=$.data(_894,"datagrid").options; +var cc=[]; +if(_896&&opts.rownumbers){ +var _899=_897+1; +if(opts.pagination){ +_899+=(opts.pageNumber-1)*opts.pageSize; +} +cc.push("
                                                                                                  "+_899+"
                                                                                                  "); +} +for(var i=0;i<_895.length;i++){ +var _89a=_895[i]; +var col=$(_894).datagrid("getColumnOption",_89a); +if(col){ +var _89b=_898[_89a]; +var css=col.styler?(col.styler.call(_894,_89b,_898,_897)||""):""; +var cs=this.getStyleValue(css); +var cls=cs.c?"class=\""+cs.c+"\"":""; +var _89c=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); +cc.push(""); +var _89c=""; +if(!col.checkbox){ +if(col.align){ +_89c+="text-align:"+col.align+";"; +} +if(!opts.nowrap){ +_89c+="white-space:normal;height:auto;"; +}else{ +if(opts.autoRowHeight){ +_89c+="height:auto;"; +} +} +} +cc.push("
                                                                                                  "); +if(col.checkbox){ +cc.push(""); +}else{ +if(col.formatter){ +cc.push(col.formatter(_89b,_898,_897)); +}else{ +cc.push(_89b); +} +} +cc.push("
                                                                                                  "); +cc.push(""); +} +} +return cc.join(""); +},getStyleValue:function(css){ +var _89d=""; +var _89e=""; +if(typeof css=="string"){ +_89e=css; +}else{ +if(css){ +_89d=css["class"]||""; +_89e=css["style"]||""; +} +} +return {c:_89d,s:_89e}; +},refreshRow:function(_89f,_8a0){ +this.updateRow.call(this,_89f,_8a0,{}); +},updateRow:function(_8a1,_8a2,row){ +var opts=$.data(_8a1,"datagrid").options; +var _8a3=opts.finder.getRow(_8a1,_8a2); +$.extend(_8a3,row); +var cs=_8a4.call(this,_8a2); +var _8a5=cs.s; +var cls="datagrid-row "+(_8a2%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c; +function _8a4(_8a6){ +var css=opts.rowStyler?opts.rowStyler.call(_8a1,_8a6,_8a3):""; +return this.getStyleValue(css); +}; +function _8a7(_8a8){ +var tr=opts.finder.getTr(_8a1,_8a2,"body",(_8a8?1:2)); +if(!tr.length){ +return; +} +var _8a9=$(_8a1).datagrid("getColumnFields",_8a8); +var _8aa=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); +tr.html(this.renderRow.call(this,_8a1,_8a9,_8a8,_8a2,_8a3)); +var _8ab=(tr.hasClass("datagrid-row-checked")?" datagrid-row-checked":"")+(tr.hasClass("datagrid-row-selected")?" datagrid-row-selected":""); +tr.attr("style",_8a5).attr("class",cls+_8ab); +if(_8aa){ +tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); +} +}; +_8a7.call(this,true); +_8a7.call(this,false); +$(_8a1).datagrid("fixRowHeight",_8a2); +},insertRow:function(_8ac,_8ad,row){ +var _8ae=$.data(_8ac,"datagrid"); +var opts=_8ae.options; +var dc=_8ae.dc; +var data=_8ae.data; +if(_8ad==undefined||_8ad==null){ +_8ad=data.rows.length; +} +if(_8ad>data.rows.length){ +_8ad=data.rows.length; +} +function _8af(_8b0){ +var _8b1=_8b0?1:2; +for(var i=data.rows.length-1;i>=_8ad;i--){ +var tr=opts.finder.getTr(_8ac,i,"body",_8b1); +tr.attr("datagrid-row-index",i+1); +tr.attr("id",_8ae.rowIdPrefix+"-"+_8b1+"-"+(i+1)); +if(_8b0&&opts.rownumbers){ +var _8b2=i+2; +if(opts.pagination){ +_8b2+=(opts.pageNumber-1)*opts.pageSize; +} +tr.find("div.datagrid-cell-rownumber").html(_8b2); +} +if(opts.striped){ +tr.removeClass("datagrid-row-alt").addClass((i+1)%2?"datagrid-row-alt":""); +} +} +}; +function _8b3(_8b4){ +var _8b5=_8b4?1:2; +var _8b6=$(_8ac).datagrid("getColumnFields",_8b4); +var _8b7=_8ae.rowIdPrefix+"-"+_8b5+"-"+_8ad; +var tr=""; +if(_8ad>=data.rows.length){ +if(data.rows.length){ +opts.finder.getTr(_8ac,"","last",_8b5).after(tr); +}else{ +var cc=_8b4?dc.body1:dc.body2; +cc.html(""+tr+"
                                                                                                  "); +} +}else{ +opts.finder.getTr(_8ac,_8ad+1,"body",_8b5).before(tr); +} +}; +_8af.call(this,true); +_8af.call(this,false); +_8b3.call(this,true); +_8b3.call(this,false); +data.total+=1; +data.rows.splice(_8ad,0,row); +this.setEmptyMsg(_8ac); +this.refreshRow.call(this,_8ac,_8ad); +},deleteRow:function(_8b8,_8b9){ +var _8ba=$.data(_8b8,"datagrid"); +var opts=_8ba.options; +var data=_8ba.data; +function _8bb(_8bc){ +var _8bd=_8bc?1:2; +for(var i=_8b9+1;i
                                                                                                  ").appendTo(_8c4.dc.view); +d.html(opts.emptyMsg).css("top",h+"px"); +} +} +},renderEmptyRow:function(_8c6){ +var cols=$.map($(_8c6).datagrid("getColumnFields"),function(_8c7){ +return $(_8c6).datagrid("getColumnOption",_8c7); +}); +$.map(cols,function(col){ +col.formatter1=col.formatter; +col.styler1=col.styler; +col.formatter=col.styler=undefined; +}); +var _8c8=$.data(_8c6,"datagrid").dc.body2; +_8c8.html(this.renderTable(_8c6,0,[{}],false)); +_8c8.find("tbody *").css({height:1,borderColor:"transparent",background:"transparent"}); +var tr=_8c8.find(".datagrid-row"); +tr.removeClass("datagrid-row").removeAttr("datagrid-row-index"); +tr.find(".datagrid-cell,.datagrid-cell-check").empty(); +$.map(cols,function(col){ +col.formatter=col.formatter1; +col.styler=col.styler1; +col.formatter1=col.styler1=undefined; +}); +}}; +$.fn.datagrid.defaults=$.extend({},$.fn.panel.defaults,{sharedStyleSheet:false,frozenColumns:undefined,columns:undefined,fitColumns:false,resizeHandle:"right",resizeEdge:5,autoRowHeight:true,toolbar:null,striped:false,method:"post",nowrap:true,idField:null,url:null,data:null,loadMsg:"Processing, please wait ...",emptyMsg:"",rownumbers:false,singleSelect:false,ctrlSelect:false,selectOnCheck:true,checkOnSelect:true,pagination:false,pagePosition:"bottom",pageNumber:1,pageSize:10,pageList:[10,20,30,40,50],queryParams:{},sortName:null,sortOrder:"asc",multiSort:false,remoteSort:true,showHeader:true,showFooter:false,scrollOnSelect:true,scrollbarSize:18,rownumberWidth:30,editorHeight:31,headerEvents:{mouseover:_70b(true),mouseout:_70b(false),click:_70f,dblclick:_714,contextmenu:_717},rowEvents:{mouseover:_719(true),mouseout:_719(false),click:_720,dblclick:_72a,contextmenu:_72e},rowStyler:function(_8c9,_8ca){ +},loader:function(_8cb,_8cc,_8cd){ +var opts=$(this).datagrid("options"); +if(!opts.url){ +return false; +} +$.ajax({type:opts.method,url:opts.url,data:_8cb,dataType:"json",success:function(data){ +_8cc(data); +},error:function(){ +_8cd.apply(this,arguments); +}}); +},loadFilter:function(data){ +return data; +},editors:_83a,finder:{getTr:function(_8ce,_8cf,type,_8d0){ +type=type||"body"; +_8d0=_8d0||0; +var _8d1=$.data(_8ce,"datagrid"); +var dc=_8d1.dc; +var opts=_8d1.options; +if(_8d0==0){ +var tr1=opts.finder.getTr(_8ce,_8cf,type,1); +var tr2=opts.finder.getTr(_8ce,_8cf,type,2); +return tr1.add(tr2); +}else{ +if(type=="body"){ +var tr=$("#"+_8d1.rowIdPrefix+"-"+_8d0+"-"+_8cf); +if(!tr.length){ +tr=(_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index="+_8cf+"]"); +} +return tr; +}else{ +if(type=="footer"){ +return (_8d0==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index="+_8cf+"]"); +}else{ +if(type=="selected"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-selected"); +}else{ +if(type=="highlight"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-over"); +}else{ +if(type=="checked"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-checked"); +}else{ +if(type=="editing"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-editing"); +}else{ +if(type=="last"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]:last"); +}else{ +if(type=="allbody"){ +return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]"); +}else{ +if(type=="allfooter"){ +return (_8d0==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index]"); +} +} +} +} +} +} +} +} +} +} +},getRow:function(_8d2,p){ +var _8d3=(typeof p=="object")?p.attr("datagrid-row-index"):p; +return $.data(_8d2,"datagrid").data.rows[parseInt(_8d3)]; +},getRows:function(_8d4){ +return $(_8d4).datagrid("getRows"); +}},view:_883,onBeforeLoad:function(_8d5){ +},onLoadSuccess:function(){ +},onLoadError:function(){ +},onClickRow:function(_8d6,_8d7){ +},onDblClickRow:function(_8d8,_8d9){ +},onClickCell:function(_8da,_8db,_8dc){ +},onDblClickCell:function(_8dd,_8de,_8df){ +},onBeforeSortColumn:function(sort,_8e0){ +},onSortColumn:function(sort,_8e1){ +},onResizeColumn:function(_8e2,_8e3){ +},onBeforeSelect:function(_8e4,_8e5){ +},onSelect:function(_8e6,_8e7){ +},onBeforeUnselect:function(_8e8,_8e9){ +},onUnselect:function(_8ea,_8eb){ +},onSelectAll:function(rows){ +},onUnselectAll:function(rows){ +},onBeforeCheck:function(_8ec,_8ed){ +},onCheck:function(_8ee,_8ef){ +},onBeforeUncheck:function(_8f0,_8f1){ +},onUncheck:function(_8f2,_8f3){ +},onCheckAll:function(rows){ +},onUncheckAll:function(rows){ +},onBeforeEdit:function(_8f4,_8f5){ +},onBeginEdit:function(_8f6,_8f7){ +},onEndEdit:function(_8f8,_8f9,_8fa){ +},onAfterEdit:function(_8fb,_8fc,_8fd){ +},onCancelEdit:function(_8fe,_8ff){ +},onHeaderContextMenu:function(e,_900){ +},onRowContextMenu:function(e,_901,_902){ +}}); +})(jQuery); +(function($){ +var _903; +$(document).unbind(".propertygrid").bind("mousedown.propertygrid",function(e){ +var p=$(e.target).closest("div.datagrid-view,div.combo-panel"); +if(p.length){ +return; +} +_904(_903); +_903=undefined; +}); +function _905(_906){ +var _907=$.data(_906,"propertygrid"); +var opts=$.data(_906,"propertygrid").options; +$(_906).datagrid($.extend({},opts,{cls:"propertygrid",view:(opts.showGroup?opts.groupView:opts.view),onBeforeEdit:function(_908,row){ +if(opts.onBeforeEdit.call(_906,_908,row)==false){ +return false; +} +var dg=$(this); +var row=dg.datagrid("getRows")[_908]; +var col=dg.datagrid("getColumnOption","value"); +col.editor=row.editor; +},onClickCell:function(_909,_90a,_90b){ +if(_903!=this){ +_904(_903); +_903=this; +} +if(opts.editIndex!=_909){ +_904(_903); +$(this).datagrid("beginEdit",_909); +var ed=$(this).datagrid("getEditor",{index:_909,field:_90a}); +if(!ed){ +ed=$(this).datagrid("getEditor",{index:_909,field:"value"}); +} +if(ed){ +var t=$(ed.target); +var _90c=t.data("textbox")?t.textbox("textbox"):t; +_90c.focus(); +opts.editIndex=_909; +} +} +opts.onClickCell.call(_906,_909,_90a,_90b); +},loadFilter:function(data){ +_904(this); +return opts.loadFilter.call(this,data); +}})); +}; +function _904(_90d){ +var t=$(_90d); +if(!t.length){ +return; +} +var opts=$.data(_90d,"propertygrid").options; +opts.finder.getTr(_90d,null,"editing").each(function(){ +var _90e=parseInt($(this).attr("datagrid-row-index")); +if(t.datagrid("validateRow",_90e)){ +t.datagrid("endEdit",_90e); +}else{ +t.datagrid("cancelEdit",_90e); +} +}); +opts.editIndex=undefined; +}; +$.fn.propertygrid=function(_90f,_910){ +if(typeof _90f=="string"){ +var _911=$.fn.propertygrid.methods[_90f]; +if(_911){ +return _911(this,_910); +}else{ +return this.datagrid(_90f,_910); +} +} +_90f=_90f||{}; +return this.each(function(){ +var _912=$.data(this,"propertygrid"); +if(_912){ +$.extend(_912.options,_90f); +}else{ +var opts=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_90f); +opts.frozenColumns=$.extend(true,[],opts.frozenColumns); +opts.columns=$.extend(true,[],opts.columns); +$.data(this,"propertygrid",{options:opts}); +} +_905(this); +}); +}; +$.fn.propertygrid.methods={options:function(jq){ +return $.data(jq[0],"propertygrid").options; +}}; +$.fn.propertygrid.parseOptions=function(_913){ +return $.extend({},$.fn.datagrid.parseOptions(_913),$.parser.parseOptions(_913,[{showGroup:"boolean"}])); +}; +var _914=$.extend({},$.fn.datagrid.defaults.view,{render:function(_915,_916,_917){ +var _918=[]; +var _919=this.groups; +for(var i=0;i<_919.length;i++){ +_918.push(this.renderGroup.call(this,_915,i,_919[i],_917)); +} +$(_916).html(_918.join("")); +},renderGroup:function(_91a,_91b,_91c,_91d){ +var _91e=$.data(_91a,"datagrid"); +var opts=_91e.options; +var _91f=$(_91a).datagrid("getColumnFields",_91d); +var _920=opts.frozenColumns&&opts.frozenColumns.length; +if(_91d){ +if(!(opts.rownumbers||_920)){ +return ""; +} +} +var _921=[]; +var css=opts.groupStyler.call(_91a,_91c.value,_91c.rows); +var cs=_922(css,"datagrid-group"); +_921.push("
                                                                                                  "); +if((_91d&&(opts.rownumbers||opts.frozenColumns.length))||(!_91d&&!(opts.rownumbers||opts.frozenColumns.length))){ +_921.push(""); +_921.push(" "); +_921.push(""); +} +if((_91d&&_920)||(!_91d)){ +_921.push(""); +_921.push(opts.groupFormatter.call(_91a,_91c.value,_91c.rows)); +_921.push(""); +} +_921.push("
                                                                                                  "); +_921.push(""); +var _923=_91c.startIndex; +for(var j=0;j<_91c.rows.length;j++){ +var css=opts.rowStyler?opts.rowStyler.call(_91a,_923,_91c.rows[j]):""; +var _924=""; +var _925=""; +if(typeof css=="string"){ +_925=css; +}else{ +if(css){ +_924=css["class"]||""; +_925=css["style"]||""; +} +} +var cls="class=\"datagrid-row "+(_923%2&&opts.striped?"datagrid-row-alt ":" ")+_924+"\""; +var _926=_925?"style=\""+_925+"\"":""; +var _927=_91e.rowIdPrefix+"-"+(_91d?1:2)+"-"+_923; +_921.push(""); +_921.push(this.renderRow.call(this,_91a,_91f,_91d,_923,_91c.rows[j])); +_921.push(""); +_923++; +} +_921.push("
                                                                                                  "); +return _921.join(""); +function _922(css,cls){ +var _928=""; +var _929=""; +if(typeof css=="string"){ +_929=css; +}else{ +if(css){ +_928=css["class"]||""; +_929=css["style"]||""; +} +} +return "class=\""+cls+(_928?" "+_928:"")+"\" "+"style=\""+_929+"\""; +}; +},bindEvents:function(_92a){ +var _92b=$.data(_92a,"datagrid"); +var dc=_92b.dc; +var body=dc.body1.add(dc.body2); +var _92c=($.data(body[0],"events")||$._data(body[0],"events")).click[0].handler; +body.unbind("click").bind("click",function(e){ +var tt=$(e.target); +var _92d=tt.closest("span.datagrid-row-expander"); +if(_92d.length){ +var _92e=_92d.closest("div.datagrid-group").attr("group-index"); +if(_92d.hasClass("datagrid-row-collapse")){ +$(_92a).datagrid("collapseGroup",_92e); +}else{ +$(_92a).datagrid("expandGroup",_92e); +} +}else{ +_92c(e); +} +e.stopPropagation(); +}); +},onBeforeRender:function(_92f,rows){ +var _930=$.data(_92f,"datagrid"); +var opts=_930.options; +_931(); +var _932=[]; +for(var i=0;i"+".datagrid-group{height:"+opts.groupHeight+"px;overflow:hidden;font-weight:bold;border-bottom:1px solid #ccc;white-space:nowrap;word-break:normal;}"+".datagrid-group-title,.datagrid-group-expander{display:inline-block;vertical-align:bottom;height:100%;line-height:"+opts.groupHeight+"px;padding:0 4px;}"+".datagrid-group-title{position:relative;}"+".datagrid-group-expander{width:"+opts.expanderWidth+"px;text-align:center;padding:0}"+".datagrid-row-expander{margin:"+Math.floor((opts.groupHeight-16)/2)+"px 0;display:inline-block;width:16px;height:16px;cursor:pointer}"+""); +} +}; +},onAfterRender:function(_939){ +$.fn.datagrid.defaults.view.onAfterRender.call(this,_939); +var view=this; +var _93a=$.data(_939,"datagrid"); +var opts=_93a.options; +if(!_93a.onResizeColumn){ +_93a.onResizeColumn=opts.onResizeColumn; +} +if(!_93a.onResize){ +_93a.onResize=opts.onResize; +} +opts.onResizeColumn=function(_93b,_93c){ +view.resizeGroup(_939); +_93a.onResizeColumn.call(_939,_93b,_93c); +}; +opts.onResize=function(_93d,_93e){ +view.resizeGroup(_939); +_93a.onResize.call($(_939).datagrid("getPanel")[0],_93d,_93e); +}; +view.resizeGroup(_939); +}}); +$.extend($.fn.datagrid.methods,{groups:function(jq){ +return jq.datagrid("options").view.groups; +},expandGroup:function(jq,_93f){ +return jq.each(function(){ +var opts=$(this).datagrid("options"); +var view=$.data(this,"datagrid").dc.view; +var _940=view.find(_93f!=undefined?"div.datagrid-group[group-index=\""+_93f+"\"]":"div.datagrid-group"); +var _941=_940.find("span.datagrid-row-expander"); +if(_941.hasClass("datagrid-row-expand")){ +_941.removeClass("datagrid-row-expand").addClass("datagrid-row-collapse"); +_940.next("table").show(); +} +$(this).datagrid("fixRowHeight"); +if(opts.onExpandGroup){ +opts.onExpandGroup.call(this,_93f); +} +}); +},collapseGroup:function(jq,_942){ +return jq.each(function(){ +var opts=$(this).datagrid("options"); +var view=$.data(this,"datagrid").dc.view; +var _943=view.find(_942!=undefined?"div.datagrid-group[group-index=\""+_942+"\"]":"div.datagrid-group"); +var _944=_943.find("span.datagrid-row-expander"); +if(_944.hasClass("datagrid-row-collapse")){ +_944.removeClass("datagrid-row-collapse").addClass("datagrid-row-expand"); +_943.next("table").hide(); +} +$(this).datagrid("fixRowHeight"); +if(opts.onCollapseGroup){ +opts.onCollapseGroup.call(this,_942); +} +}); +},scrollToGroup:function(jq,_945){ +return jq.each(function(){ +var _946=$.data(this,"datagrid"); +var dc=_946.dc; +var grow=dc.body2.children("div.datagrid-group[group-index=\""+_945+"\"]"); +if(grow.length){ +var _947=grow.outerHeight(); +var _948=dc.view2.children("div.datagrid-header")._outerHeight(); +var _949=dc.body2.outerHeight(true)-dc.body2.outerHeight(); +var top=grow.position().top-_948-_949; +if(top<0){ +dc.body2.scrollTop(dc.body2.scrollTop()+top); +}else{ +if(top+_947>dc.body2.height()-18){ +dc.body2.scrollTop(dc.body2.scrollTop()+top+_947-dc.body2.height()+18); +} +} +} +}); +}}); +$.extend(_914,{refreshGroupTitle:function(_94a,_94b){ +var _94c=$.data(_94a,"datagrid"); +var opts=_94c.options; +var dc=_94c.dc; +var _94d=this.groups[_94b]; +var span=dc.body1.add(dc.body2).children("div.datagrid-group[group-index="+_94b+"]").find("span.datagrid-group-title"); +span.html(opts.groupFormatter.call(_94a,_94d.value,_94d.rows)); +},resizeGroup:function(_94e,_94f){ +var _950=$.data(_94e,"datagrid"); +var dc=_950.dc; +var ht=dc.header2.find("table"); +var fr=ht.find("tr.datagrid-filter-row").hide(); +var ww=ht.width(); +if(_94f==undefined){ +var _951=dc.body2.children("div.datagrid-group"); +}else{ +var _951=dc.body2.children("div.datagrid-group[group-index="+_94f+"]"); +} +_951._outerWidth(ww); +var opts=_950.options; +if(opts.frozenColumns&&opts.frozenColumns.length){ +var _952=dc.view1.width()-opts.expanderWidth; +var _953=dc.view1.css("direction").toLowerCase()=="rtl"; +_951.find(".datagrid-group-title").css(_953?"right":"left",-_952+"px"); +} +if(fr.length){ +if(opts.showFilterBar){ +fr.show(); +} +} +},insertRow:function(_954,_955,row){ +var _956=$.data(_954,"datagrid"); +var opts=_956.options; +var dc=_956.dc; +var _957=null; +var _958; +if(!_956.data.rows.length){ +$(_954).datagrid("loadData",[row]); +return; +} +for(var i=0;i_957.startIndex+_957.rows.length){ +_955=_957.startIndex+_957.rows.length; +} +} +$.fn.datagrid.defaults.view.insertRow.call(this,_954,_955,row); +if(_955>=_957.startIndex+_957.rows.length){ +_959(_955,true); +_959(_955,false); +} +_957.rows.splice(_955-_957.startIndex,0,row); +}else{ +_957={value:row[opts.groupField],rows:[row],startIndex:_956.data.rows.length}; +_958=this.groups.length; +dc.body1.append(this.renderGroup.call(this,_954,_958,_957,true)); +dc.body2.append(this.renderGroup.call(this,_954,_958,_957,false)); +this.groups.push(_957); +_956.data.rows.push(row); +} +this.setGroupIndex(_954); +this.refreshGroupTitle(_954,_958); +this.resizeGroup(_954); +function _959(_95a,_95b){ +var _95c=_95b?1:2; +var _95d=opts.finder.getTr(_954,_95a-1,"body",_95c); +var tr=opts.finder.getTr(_954,_95a,"body",_95c); +tr.insertAfter(_95d); +}; +},updateRow:function(_95e,_95f,row){ +var opts=$.data(_95e,"datagrid").options; +$.fn.datagrid.defaults.view.updateRow.call(this,_95e,_95f,row); +var tb=opts.finder.getTr(_95e,_95f,"body",2).closest("table.datagrid-btable"); +var _960=parseInt(tb.prev().attr("group-index")); +this.refreshGroupTitle(_95e,_960); +},deleteRow:function(_961,_962){ +var _963=$.data(_961,"datagrid"); +var opts=_963.options; +var dc=_963.dc; +var body=dc.body1.add(dc.body2); +var tb=opts.finder.getTr(_961,_962,"body",2).closest("table.datagrid-btable"); +var _964=parseInt(tb.prev().attr("group-index")); +$.fn.datagrid.defaults.view.deleteRow.call(this,_961,_962); +var _965=this.groups[_964]; +if(_965.rows.length>1){ +_965.rows.splice(_962-_965.startIndex,1); +this.refreshGroupTitle(_961,_964); +}else{ +body.children("div.datagrid-group[group-index="+_964+"]").remove(); +for(var i=_964+1;i").insertBefore(tr.find(".tree-title")); +} +if(row.checkState=="checked"){ +_98d(_9a1,_9a2,true,true); +}else{ +if(row.checkState=="unchecked"){ +_98d(_9a1,_9a2,false,true); +}else{ +var flag=_99f(row); +if(flag===0){ +_98d(_9a1,_9a2,false,true); +}else{ +if(flag===1){ +_98d(_9a1,_9a2,true,true); +} +} +} +} +}else{ +ck.remove(); +row.checkState=undefined; +row.checked=undefined; +_996(_9a1,row); +} +}; +function _9a3(_9a4,_9a5){ +var opts=$.data(_9a4,"treegrid").options; +var tr1=opts.finder.getTr(_9a4,_9a5,"body",1); +var tr2=opts.finder.getTr(_9a4,_9a5,"body",2); +var _9a6=$(_9a4).datagrid("getColumnFields",true).length+(opts.rownumbers?1:0); +var _9a7=$(_9a4).datagrid("getColumnFields",false).length; +_9a8(tr1,_9a6); +_9a8(tr2,_9a7); +function _9a8(tr,_9a9){ +$(""+""+"
                                                                                                  "+""+"").insertAfter(tr); +}; +}; +function _9aa(_9ab,_9ac,data,_9ad,_9ae){ +var _9af=$.data(_9ab,"treegrid"); +var opts=_9af.options; +var dc=_9af.dc; +data=opts.loadFilter.call(_9ab,data,_9ac); +var node=find(_9ab,_9ac); +if(node){ +var _9b0=opts.finder.getTr(_9ab,_9ac,"body",1); +var _9b1=opts.finder.getTr(_9ab,_9ac,"body",2); +var cc1=_9b0.next("tr.treegrid-tr-tree").children("td").children("div"); +var cc2=_9b1.next("tr.treegrid-tr-tree").children("td").children("div"); +if(!_9ad){ +node.children=[]; +} +}else{ +var cc1=dc.body1; +var cc2=dc.body2; +if(!_9ad){ +_9af.data=[]; +} +} +if(!_9ad){ +cc1.empty(); +cc2.empty(); +} +if(opts.view.onBeforeRender){ +opts.view.onBeforeRender.call(opts.view,_9ab,_9ac,data); +} +opts.view.render.call(opts.view,_9ab,cc1,true); +opts.view.render.call(opts.view,_9ab,cc2,false); +if(opts.showFooter){ +opts.view.renderFooter.call(opts.view,_9ab,dc.footer1,true); +opts.view.renderFooter.call(opts.view,_9ab,dc.footer2,false); +} +if(opts.view.onAfterRender){ +opts.view.onAfterRender.call(opts.view,_9ab); +} +if(!_9ac&&opts.pagination){ +var _9b2=$.data(_9ab,"treegrid").total; +var _9b3=$(_9ab).datagrid("getPager"); +if(_9b3.pagination("options").total!=_9b2){ +_9b3.pagination({total:_9b2}); +} +} +_97c(_9ab); +_984(_9ab); +$(_9ab).treegrid("showLines"); +$(_9ab).treegrid("setSelectionState"); +$(_9ab).treegrid("autoSizeColumn"); +if(!_9ae){ +opts.onLoadSuccess.call(_9ab,node,data); +} +}; +function _97b(_9b4,_9b5,_9b6,_9b7,_9b8){ +var opts=$.data(_9b4,"treegrid").options; +var body=$(_9b4).datagrid("getPanel").find("div.datagrid-body"); +if(_9b5==undefined&&opts.queryParams){ +opts.queryParams.id=undefined; +} +if(_9b6){ +opts.queryParams=_9b6; +} +var _9b9=$.extend({},opts.queryParams); +if(opts.pagination){ +$.extend(_9b9,{page:opts.pageNumber,rows:opts.pageSize}); +} +if(opts.sortName){ +$.extend(_9b9,{sort:opts.sortName,order:opts.sortOrder}); +} +var row=find(_9b4,_9b5); +if(opts.onBeforeLoad.call(_9b4,row,_9b9)==false){ +return; +} +var _9ba=body.find("tr[node-id=\""+_9b5+"\"] span.tree-folder"); +_9ba.addClass("tree-loading"); +$(_9b4).treegrid("loading"); +var _9bb=opts.loader.call(_9b4,_9b9,function(data){ +_9ba.removeClass("tree-loading"); +$(_9b4).treegrid("loaded"); +_9aa(_9b4,_9b5,data,_9b7); +if(_9b8){ +_9b8(); +} +},function(){ +_9ba.removeClass("tree-loading"); +$(_9b4).treegrid("loaded"); +opts.onLoadError.apply(_9b4,arguments); +if(_9b8){ +_9b8(); +} +}); +if(_9bb==false){ +_9ba.removeClass("tree-loading"); +$(_9b4).treegrid("loaded"); +} +}; +function _9bc(_9bd){ +var _9be=_9bf(_9bd); +return _9be.length?_9be[0]:null; +}; +function _9bf(_9c0){ +return $.data(_9c0,"treegrid").data; +}; +function _99e(_9c1,_9c2){ +var row=find(_9c1,_9c2); +if(row._parentId){ +return find(_9c1,row._parentId); +}else{ +return null; +} +}; +function _980(_9c3,_9c4){ +var data=$.data(_9c3,"treegrid").data; +if(_9c4){ +var _9c5=find(_9c3,_9c4); +data=_9c5?(_9c5.children||[]):[]; +} +var _9c6=[]; +$.easyui.forEach(data,true,function(node){ +_9c6.push(node); +}); +return _9c6; +}; +function _9c7(_9c8,_9c9){ +var opts=$.data(_9c8,"treegrid").options; +var tr=opts.finder.getTr(_9c8,_9c9); +var node=tr.children("td[field=\""+opts.treeField+"\"]"); +return node.find("span.tree-indent,span.tree-hit").length; +}; +function find(_9ca,_9cb){ +var _9cc=$.data(_9ca,"treegrid"); +var opts=_9cc.options; +var _9cd=null; +$.easyui.forEach(_9cc.data,true,function(node){ +if(node[opts.idField]==_9cb){ +_9cd=node; +return false; +} +}); +return _9cd; +}; +function _9ce(_9cf,_9d0){ +var opts=$.data(_9cf,"treegrid").options; +var row=find(_9cf,_9d0); +var tr=opts.finder.getTr(_9cf,_9d0); +var hit=tr.find("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-collapsed")){ +return; +} +if(opts.onBeforeCollapse.call(_9cf,row)==false){ +return; +} +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +hit.next().removeClass("tree-folder-open"); +row.state="closed"; +tr=tr.next("tr.treegrid-tr-tree"); +var cc=tr.children("td").children("div"); +if(opts.animate){ +cc.slideUp("normal",function(){ +$(_9cf).treegrid("autoSizeColumn"); +_97c(_9cf,_9d0); +opts.onCollapse.call(_9cf,row); +}); +}else{ +cc.hide(); +$(_9cf).treegrid("autoSizeColumn"); +_97c(_9cf,_9d0); +opts.onCollapse.call(_9cf,row); +} +}; +function _9d1(_9d2,_9d3){ +var opts=$.data(_9d2,"treegrid").options; +var tr=opts.finder.getTr(_9d2,_9d3); +var hit=tr.find("span.tree-hit"); +var row=find(_9d2,_9d3); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +return; +} +if(opts.onBeforeExpand.call(_9d2,row)==false){ +return; +} +hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); +hit.next().addClass("tree-folder-open"); +var _9d4=tr.next("tr.treegrid-tr-tree"); +if(_9d4.length){ +var cc=_9d4.children("td").children("div"); +_9d5(cc); +}else{ +_9a3(_9d2,row[opts.idField]); +var _9d4=tr.next("tr.treegrid-tr-tree"); +var cc=_9d4.children("td").children("div"); +cc.hide(); +var _9d6=$.extend({},opts.queryParams||{}); +_9d6.id=row[opts.idField]; +_97b(_9d2,row[opts.idField],_9d6,true,function(){ +if(cc.is(":empty")){ +_9d4.remove(); +}else{ +_9d5(cc); +} +}); +} +function _9d5(cc){ +row.state="open"; +if(opts.animate){ +cc.slideDown("normal",function(){ +$(_9d2).treegrid("autoSizeColumn"); +_97c(_9d2,_9d3); +opts.onExpand.call(_9d2,row); +}); +}else{ +cc.show(); +$(_9d2).treegrid("autoSizeColumn"); +_97c(_9d2,_9d3); +opts.onExpand.call(_9d2,row); +} +}; +}; +function _98c(_9d7,_9d8){ +var opts=$.data(_9d7,"treegrid").options; +var tr=opts.finder.getTr(_9d7,_9d8); +var hit=tr.find("span.tree-hit"); +if(hit.hasClass("tree-expanded")){ +_9ce(_9d7,_9d8); +}else{ +_9d1(_9d7,_9d8); +} +}; +function _9d9(_9da,_9db){ +var opts=$.data(_9da,"treegrid").options; +var _9dc=_980(_9da,_9db); +if(_9db){ +_9dc.unshift(find(_9da,_9db)); +} +for(var i=0;i<_9dc.length;i++){ +_9ce(_9da,_9dc[i][opts.idField]); +} +}; +function _9dd(_9de,_9df){ +var opts=$.data(_9de,"treegrid").options; +var _9e0=_980(_9de,_9df); +if(_9df){ +_9e0.unshift(find(_9de,_9df)); +} +for(var i=0;i<_9e0.length;i++){ +_9d1(_9de,_9e0[i][opts.idField]); +} +}; +function _9e1(_9e2,_9e3){ +var opts=$.data(_9e2,"treegrid").options; +var ids=[]; +var p=_99e(_9e2,_9e3); +while(p){ +var id=p[opts.idField]; +ids.unshift(id); +p=_99e(_9e2,id); +} +for(var i=0;i").insertBefore(_9e8); +if(hit.prev().length){ +hit.prev().remove(); +} +} +} +_9aa(_9e5,_9e6.parent,_9e6.data,_9e7.data.length>0,true); +}; +function _9e9(_9ea,_9eb){ +var ref=_9eb.before||_9eb.after; +var opts=$.data(_9ea,"treegrid").options; +var _9ec=_99e(_9ea,ref); +_9e4(_9ea,{parent:(_9ec?_9ec[opts.idField]:null),data:[_9eb.data]}); +var _9ed=_9ec?_9ec.children:$(_9ea).treegrid("getRoots"); +for(var i=0;i<_9ed.length;i++){ +if(_9ed[i][opts.idField]==ref){ +var _9ee=_9ed[_9ed.length-1]; +_9ed.splice(_9eb.before?i:(i+1),0,_9ee); +_9ed.splice(_9ed.length-1,1); +break; +} +} +_9ef(true); +_9ef(false); +_984(_9ea); +$(_9ea).treegrid("showLines"); +function _9ef(_9f0){ +var _9f1=_9f0?1:2; +var tr=opts.finder.getTr(_9ea,_9eb.data[opts.idField],"body",_9f1); +var _9f2=tr.closest("table.datagrid-btable"); +tr=tr.parent().children(); +var dest=opts.finder.getTr(_9ea,ref,"body",_9f1); +if(_9eb.before){ +tr.insertBefore(dest); +}else{ +var sub=dest.next("tr.treegrid-tr-tree"); +tr.insertAfter(sub.length?sub:dest); +} +_9f2.remove(); +}; +}; +function _9f3(_9f4,_9f5){ +var _9f6=$.data(_9f4,"treegrid"); +var opts=_9f6.options; +var prow=_99e(_9f4,_9f5); +$(_9f4).datagrid("deleteRow",_9f5); +$.easyui.removeArrayItem(_9f6.checkedRows,opts.idField,_9f5); +_984(_9f4); +if(prow){ +_9a0(_9f4,prow[opts.idField]); +} +_9f6.total-=1; +$(_9f4).datagrid("getPager").pagination("refresh",{total:_9f6.total}); +$(_9f4).treegrid("showLines"); +}; +function _9f7(_9f8){ +var t=$(_9f8); +var opts=t.treegrid("options"); +if(opts.lines){ +t.treegrid("getPanel").addClass("tree-lines"); +}else{ +t.treegrid("getPanel").removeClass("tree-lines"); +return; +} +t.treegrid("getPanel").find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); +t.treegrid("getPanel").find("div.datagrid-cell").removeClass("tree-node-last tree-root-first tree-root-one"); +var _9f9=t.treegrid("getRoots"); +if(_9f9.length>1){ +_9fa(_9f9[0]).addClass("tree-root-first"); +}else{ +if(_9f9.length==1){ +_9fa(_9f9[0]).addClass("tree-root-one"); +} +} +_9fb(_9f9); +_9fc(_9f9); +function _9fb(_9fd){ +$.map(_9fd,function(node){ +if(node.children&&node.children.length){ +_9fb(node.children); +}else{ +var cell=_9fa(node); +cell.find(".tree-icon").prev().addClass("tree-join"); +} +}); +if(_9fd.length){ +var cell=_9fa(_9fd[_9fd.length-1]); +cell.addClass("tree-node-last"); +cell.find(".tree-join").removeClass("tree-join").addClass("tree-joinbottom"); +} +}; +function _9fc(_9fe){ +$.map(_9fe,function(node){ +if(node.children&&node.children.length){ +_9fc(node.children); +} +}); +for(var i=0;i<_9fe.length-1;i++){ +var node=_9fe[i]; +var _9ff=t.treegrid("getLevel",node[opts.idField]); +var tr=opts.finder.getTr(_9f8,node[opts.idField]); +var cc=tr.next().find("tr.datagrid-row td[field=\""+opts.treeField+"\"] div.datagrid-cell"); +cc.find("span:eq("+(_9ff-1)+")").addClass("tree-line"); +} +}; +function _9fa(node){ +var tr=opts.finder.getTr(_9f8,node[opts.idField]); +var cell=tr.find("td[field=\""+opts.treeField+"\"] div.datagrid-cell"); +return cell; +}; +}; +$.fn.treegrid=function(_a00,_a01){ +if(typeof _a00=="string"){ +var _a02=$.fn.treegrid.methods[_a00]; +if(_a02){ +return _a02(this,_a01); +}else{ +return this.datagrid(_a00,_a01); +} +} +_a00=_a00||{}; +return this.each(function(){ +var _a03=$.data(this,"treegrid"); +if(_a03){ +$.extend(_a03.options,_a00); +}else{ +_a03=$.data(this,"treegrid",{options:$.extend({},$.fn.treegrid.defaults,$.fn.treegrid.parseOptions(this),_a00),data:[],checkedRows:[],tmpIds:[]}); +} +_96b(this); +if(_a03.options.data){ +$(this).treegrid("loadData",_a03.options.data); +} +_97b(this); +}); +}; +$.fn.treegrid.methods={options:function(jq){ +return $.data(jq[0],"treegrid").options; +},resize:function(jq,_a04){ +return jq.each(function(){ +$(this).datagrid("resize",_a04); +}); +},fixRowHeight:function(jq,_a05){ +return jq.each(function(){ +_97c(this,_a05); +}); +},loadData:function(jq,data){ +return jq.each(function(){ +_9aa(this,data.parent,data); +}); +},load:function(jq,_a06){ +return jq.each(function(){ +$(this).treegrid("options").pageNumber=1; +$(this).treegrid("getPager").pagination({pageNumber:1}); +$(this).treegrid("reload",_a06); +}); +},reload:function(jq,id){ +return jq.each(function(){ +var opts=$(this).treegrid("options"); +var _a07={}; +if(typeof id=="object"){ +_a07=id; +}else{ +_a07=$.extend({},opts.queryParams); +_a07.id=id; +} +if(_a07.id){ +var node=$(this).treegrid("find",_a07.id); +if(node.children){ +node.children.splice(0,node.children.length); +} +opts.queryParams=_a07; +var tr=opts.finder.getTr(this,_a07.id); +tr.next("tr.treegrid-tr-tree").remove(); +tr.find("span.tree-hit").removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +_9d1(this,_a07.id); +}else{ +_97b(this,null,_a07); +} +}); +},reloadFooter:function(jq,_a08){ +return jq.each(function(){ +var opts=$.data(this,"treegrid").options; +var dc=$.data(this,"datagrid").dc; +if(_a08){ +$.data(this,"treegrid").footer=_a08; +} +if(opts.showFooter){ +opts.view.renderFooter.call(opts.view,this,dc.footer1,true); +opts.view.renderFooter.call(opts.view,this,dc.footer2,false); +if(opts.view.onAfterRender){ +opts.view.onAfterRender.call(opts.view,this); +} +$(this).treegrid("fixRowHeight"); +} +}); +},getData:function(jq){ +return $.data(jq[0],"treegrid").data; +},getFooterRows:function(jq){ +return $.data(jq[0],"treegrid").footer; +},getRoot:function(jq){ +return _9bc(jq[0]); +},getRoots:function(jq){ +return _9bf(jq[0]); +},getParent:function(jq,id){ +return _99e(jq[0],id); +},getChildren:function(jq,id){ +return _980(jq[0],id); +},getLevel:function(jq,id){ +return _9c7(jq[0],id); +},find:function(jq,id){ +return find(jq[0],id); +},isLeaf:function(jq,id){ +var opts=$.data(jq[0],"treegrid").options; +var tr=opts.finder.getTr(jq[0],id); +var hit=tr.find("span.tree-hit"); +return hit.length==0; +},select:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("selectRow",id); +}); +},unselect:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("unselectRow",id); +}); +},collapse:function(jq,id){ +return jq.each(function(){ +_9ce(this,id); +}); +},expand:function(jq,id){ +return jq.each(function(){ +_9d1(this,id); +}); +},toggle:function(jq,id){ +return jq.each(function(){ +_98c(this,id); +}); +},collapseAll:function(jq,id){ +return jq.each(function(){ +_9d9(this,id); +}); +},expandAll:function(jq,id){ +return jq.each(function(){ +_9dd(this,id); +}); +},expandTo:function(jq,id){ +return jq.each(function(){ +_9e1(this,id); +}); +},append:function(jq,_a09){ +return jq.each(function(){ +_9e4(this,_a09); +}); +},insert:function(jq,_a0a){ +return jq.each(function(){ +_9e9(this,_a0a); +}); +},remove:function(jq,id){ +return jq.each(function(){ +_9f3(this,id); +}); +},pop:function(jq,id){ +var row=jq.treegrid("find",id); +jq.treegrid("remove",id); +return row; +},refresh:function(jq,id){ +return jq.each(function(){ +var opts=$.data(this,"treegrid").options; +opts.view.refreshRow.call(opts.view,this,id); +}); +},update:function(jq,_a0b){ +return jq.each(function(){ +var opts=$.data(this,"treegrid").options; +var row=_a0b.row; +opts.view.updateRow.call(opts.view,this,_a0b.id,row); +if(row.checked!=undefined){ +row=find(this,_a0b.id); +$.extend(row,{checkState:row.checked?"checked":(row.checked===false?"unchecked":undefined)}); +_9a0(this,_a0b.id); +} +}); +},beginEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("beginEdit",id); +$(this).treegrid("fixRowHeight",id); +}); +},endEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("endEdit",id); +}); +},cancelEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("cancelEdit",id); +}); +},showLines:function(jq){ +return jq.each(function(){ +_9f7(this); +}); +},setSelectionState:function(jq){ +return jq.each(function(){ +$(this).datagrid("setSelectionState"); +var _a0c=$(this).data("treegrid"); +for(var i=0;i<_a0c.tmpIds.length;i++){ +_98d(this,_a0c.tmpIds[i],true,true); +} +_a0c.tmpIds=[]; +}); +},getCheckedNodes:function(jq,_a0d){ +_a0d=_a0d||"checked"; +var rows=[]; +$.easyui.forEach(jq.data("treegrid").checkedRows,false,function(row){ +if(row.checkState==_a0d){ +rows.push(row); +} +}); +return rows; +},checkNode:function(jq,id){ +return jq.each(function(){ +_98d(this,id,true); +}); +},uncheckNode:function(jq,id){ +return jq.each(function(){ +_98d(this,id,false); +}); +},clearChecked:function(jq){ +return jq.each(function(){ +var _a0e=this; +var opts=$(_a0e).treegrid("options"); +$(_a0e).datagrid("clearChecked"); +$.map($(_a0e).treegrid("getCheckedNodes"),function(row){ +_98d(_a0e,row[opts.idField],false,true); +}); +}); +}}; +$.fn.treegrid.parseOptions=function(_a0f){ +return $.extend({},$.fn.datagrid.parseOptions(_a0f),$.parser.parseOptions(_a0f,["treeField",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean"}])); +}; +var _a10=$.extend({},$.fn.datagrid.defaults.view,{render:function(_a11,_a12,_a13){ +var opts=$.data(_a11,"treegrid").options; +var _a14=$(_a11).datagrid("getColumnFields",_a13); +var _a15=$.data(_a11,"datagrid").rowIdPrefix; +if(_a13){ +if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){ +return; +} +} +var view=this; +if(this.treeNodes&&this.treeNodes.length){ +var _a16=_a17.call(this,_a13,this.treeLevel,this.treeNodes); +$(_a12).append(_a16.join("")); +} +function _a17(_a18,_a19,_a1a){ +var _a1b=$(_a11).treegrid("getParent",_a1a[0][opts.idField]); +var _a1c=(_a1b?_a1b.children.length:$(_a11).treegrid("getRoots").length)-_a1a.length; +var _a1d=[""]; +for(var i=0;i<_a1a.length;i++){ +var row=_a1a[i]; +if(row.state!="open"&&row.state!="closed"){ +row.state="open"; +} +var css=opts.rowStyler?opts.rowStyler.call(_a11,row):""; +var cs=this.getStyleValue(css); +var cls="class=\"datagrid-row "+(_a1c++%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c+"\""; +var _a1e=cs.s?"style=\""+cs.s+"\"":""; +var _a1f=_a15+"-"+(_a18?1:2)+"-"+row[opts.idField]; +_a1d.push(""); +_a1d=_a1d.concat(view.renderRow.call(view,_a11,_a14,_a18,_a19,row)); +_a1d.push(""); +if(row.children&&row.children.length){ +var tt=_a17.call(this,_a18,_a19+1,row.children); +var v=row.state=="closed"?"none":"block"; +_a1d.push(""); +} +} +_a1d.push("
                                                                                                  "); +_a1d=_a1d.concat(tt); +_a1d.push("
                                                                                                  "); +return _a1d; +}; +},renderFooter:function(_a20,_a21,_a22){ +var opts=$.data(_a20,"treegrid").options; +var rows=$.data(_a20,"treegrid").footer||[]; +var _a23=$(_a20).datagrid("getColumnFields",_a22); +var _a24=[""]; +for(var i=0;i"); +_a24.push(this.renderRow.call(this,_a20,_a23,_a22,0,row)); +_a24.push(""); +} +_a24.push("
                                                                                                  "); +$(_a21).html(_a24.join("")); +},renderRow:function(_a25,_a26,_a27,_a28,row){ +var _a29=$.data(_a25,"treegrid"); +var opts=_a29.options; +var cc=[]; +if(_a27&&opts.rownumbers){ +cc.push("
                                                                                                  0
                                                                                                  "); +} +for(var i=0;i<_a26.length;i++){ +var _a2a=_a26[i]; +var col=$(_a25).datagrid("getColumnOption",_a2a); +if(col){ +var css=col.styler?(col.styler(row[_a2a],row)||""):""; +var cs=this.getStyleValue(css); +var cls=cs.c?"class=\""+cs.c+"\"":""; +var _a2b=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); +cc.push(""); +var _a2b=""; +if(!col.checkbox){ +if(col.align){ +_a2b+="text-align:"+col.align+";"; +} +if(!opts.nowrap){ +_a2b+="white-space:normal;height:auto;"; +}else{ +if(opts.autoRowHeight){ +_a2b+="height:auto;"; +} +} +} +cc.push("
                                                                                                  "); +if(col.checkbox){ +if(row.checked){ +cc.push(""); +}else{ +var val=null; +if(col.formatter){ +val=col.formatter(row[_a2a],row); +}else{ +val=row[_a2a]; +} +if(_a2a==opts.treeField){ +for(var j=0;j<_a28;j++){ +cc.push(""); +} +if(row.state=="closed"){ +cc.push(""); +cc.push(""); +}else{ +if(row.children&&row.children.length){ +cc.push(""); +cc.push(""); +}else{ +cc.push(""); +cc.push(""); +} +} +if(this.hasCheckbox(_a25,row)){ +var flag=0; +var crow=$.easyui.getArrayItem(_a29.checkedRows,opts.idField,row[opts.idField]); +if(crow){ +flag=crow.checkState=="checked"?1:2; +row.checkState=crow.checkState; +row.checked=crow.checked; +$.easyui.addArrayItem(_a29.checkedRows,opts.idField,row); +}else{ +var prow=$.easyui.getArrayItem(_a29.checkedRows,opts.idField,row._parentId); +if(prow&&prow.checkState=="checked"&&opts.cascadeCheck){ +flag=1; +row.checked=true; +$.easyui.addArrayItem(_a29.checkedRows,opts.idField,row); +}else{ +if(row.checked){ +$.easyui.addArrayItem(_a29.tmpIds,row[opts.idField]); +} +} +row.checkState=flag?"checked":"unchecked"; +} +cc.push(""); +}else{ +row.checkState=undefined; +row.checked=undefined; +} +cc.push(""+val+""); +}else{ +cc.push(val); +} +} +cc.push("
                                                                                                  "); +cc.push(""); +} +} +return cc.join(""); +},hasCheckbox:function(_a2c,row){ +var opts=$.data(_a2c,"treegrid").options; +if(opts.checkbox){ +if($.isFunction(opts.checkbox)){ +if(opts.checkbox.call(_a2c,row)){ +return true; +}else{ +return false; +} +}else{ +if(opts.onlyLeafCheck){ +if(row.state=="open"&&!(row.children&&row.children.length)){ +return true; +} +}else{ +return true; +} +} +} +return false; +},refreshRow:function(_a2d,id){ +this.updateRow.call(this,_a2d,id,{}); +},updateRow:function(_a2e,id,row){ +var opts=$.data(_a2e,"treegrid").options; +var _a2f=$(_a2e).treegrid("find",id); +$.extend(_a2f,row); +var _a30=$(_a2e).treegrid("getLevel",id)-1; +var _a31=opts.rowStyler?opts.rowStyler.call(_a2e,_a2f):""; +var _a32=$.data(_a2e,"datagrid").rowIdPrefix; +var _a33=_a2f[opts.idField]; +function _a34(_a35){ +var _a36=$(_a2e).treegrid("getColumnFields",_a35); +var tr=opts.finder.getTr(_a2e,id,"body",(_a35?1:2)); +var _a37=tr.find("div.datagrid-cell-rownumber").html(); +var _a38=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); +tr.html(this.renderRow(_a2e,_a36,_a35,_a30,_a2f)); +tr.attr("style",_a31||""); +tr.find("div.datagrid-cell-rownumber").html(_a37); +if(_a38){ +tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); +} +if(_a33!=id){ +tr.attr("id",_a32+"-"+(_a35?1:2)+"-"+_a33); +tr.attr("node-id",_a33); +} +}; +_a34.call(this,true); +_a34.call(this,false); +$(_a2e).treegrid("fixRowHeight",id); +},deleteRow:function(_a39,id){ +var opts=$.data(_a39,"treegrid").options; +var tr=opts.finder.getTr(_a39,id); +tr.next("tr.treegrid-tr-tree").remove(); +tr.remove(); +var _a3a=del(id); +if(_a3a){ +if(_a3a.children.length==0){ +tr=opts.finder.getTr(_a39,_a3a[opts.idField]); +tr.next("tr.treegrid-tr-tree").remove(); +var cell=tr.children("td[field=\""+opts.treeField+"\"]").children("div.datagrid-cell"); +cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); +cell.find(".tree-hit").remove(); +$("").prependTo(cell); +} +} +this.setEmptyMsg(_a39); +function del(id){ +var cc; +var _a3b=$(_a39).treegrid("getParent",id); +if(_a3b){ +cc=_a3b.children; +}else{ +cc=$(_a39).treegrid("getData"); +} +for(var i=0;ib?1:-1); +}; +r=_a46(r1[sn],r2[sn])*(so=="asc"?1:-1); +if(r!=0){ +return r; +} +} +return r; +}); +for(var i=0;i"); +if(!_a69){ +_a6c.push(""); +_a6c.push(opts.groupFormatter.call(_a66,_a68.value,_a68.rows)); +_a6c.push(""); +} +_a6c.push("
                                                                                                  "); +_a6c.push(this.renderTable(_a66,_a68.startIndex,_a68.rows,_a69)); +return _a6c.join(""); +},groupRows:function(_a6d,rows){ +var _a6e=$.data(_a6d,"datagrid"); +var opts=_a6e.options; +var _a6f=[]; +for(var i=0;idiv.combo-p>div.combo-panel:visible").panel("close"); +}); +}); +function _a7f(_a80){ +var _a81=$.data(_a80,"combo"); +var opts=_a81.options; +if(!_a81.panel){ +_a81.panel=$("
                                                                                                  ").appendTo("body"); +_a81.panel.panel({minWidth:opts.panelMinWidth,maxWidth:opts.panelMaxWidth,minHeight:opts.panelMinHeight,maxHeight:opts.panelMaxHeight,doSize:false,closed:true,cls:"combo-p",style:{position:"absolute",zIndex:10},onOpen:function(){ +var _a82=$(this).panel("options").comboTarget; +var _a83=$.data(_a82,"combo"); +if(_a83){ +_a83.options.onShowPanel.call(_a82); +} +},onBeforeClose:function(){ +_a7e($(this).parent()); +},onClose:function(){ +var _a84=$(this).panel("options").comboTarget; +var _a85=$(_a84).data("combo"); +if(_a85){ +_a85.options.onHidePanel.call(_a84); +} +}}); +} +var _a86=$.extend(true,[],opts.icons); +if(opts.hasDownArrow){ +_a86.push({iconCls:"combo-arrow",handler:function(e){ +_a8b(e.data.target); +}}); +} +$(_a80).addClass("combo-f").textbox($.extend({},opts,{icons:_a86,onChange:function(){ +}})); +$(_a80).attr("comboName",$(_a80).attr("textboxName")); +_a81.combo=$(_a80).next(); +_a81.combo.addClass("combo"); +_a81.panel.unbind(".combo"); +for(var _a87 in opts.panelEvents){ +_a81.panel.bind(_a87+".combo",{target:_a80},opts.panelEvents[_a87]); +} +}; +function _a88(_a89){ +var _a8a=$.data(_a89,"combo"); +var opts=_a8a.options; +var p=_a8a.panel; +if(p.is(":visible")){ +p.panel("close"); +} +if(!opts.cloned){ +p.panel("destroy"); +} +$(_a89).textbox("destroy"); +}; +function _a8b(_a8c){ +var _a8d=$.data(_a8c,"combo").panel; +if(_a8d.is(":visible")){ +var _a8e=_a8d.combo("combo"); +_a8f(_a8e); +if(_a8e!=_a8c){ +$(_a8c).combo("showPanel"); +} +}else{ +var p=$(_a8c).closest("div.combo-p").children(".combo-panel"); +$("div.combo-panel:visible").not(_a8d).not(p).panel("close"); +$(_a8c).combo("showPanel"); +} +$(_a8c).combo("textbox").focus(); +}; +function _a7e(_a90){ +$(_a90).find(".combo-f").each(function(){ +var p=$(this).combo("panel"); +if(p.is(":visible")){ +p.panel("close"); +} +}); +}; +function _a91(e){ +var _a92=e.data.target; +var _a93=$.data(_a92,"combo"); +var opts=_a93.options; +if(!opts.editable){ +_a8b(_a92); +}else{ +var p=$(_a92).closest("div.combo-p").children(".combo-panel"); +$("div.combo-panel:visible").not(p).each(function(){ +var _a94=$(this).combo("combo"); +if(_a94!=_a92){ +_a8f(_a94); +} +}); +} +}; +function _a95(e){ +var _a96=e.data.target; +var t=$(_a96); +var _a97=t.data("combo"); +var opts=t.combo("options"); +_a97.panel.panel("options").comboTarget=_a96; +switch(e.keyCode){ +case 38: +opts.keyHandler.up.call(_a96,e); +break; +case 40: +opts.keyHandler.down.call(_a96,e); +break; +case 37: +opts.keyHandler.left.call(_a96,e); +break; +case 39: +opts.keyHandler.right.call(_a96,e); +break; +case 13: +e.preventDefault(); +opts.keyHandler.enter.call(_a96,e); +return false; +case 9: +case 27: +_a8f(_a96); +break; +default: +if(opts.editable){ +if(_a97.timer){ +clearTimeout(_a97.timer); +} +_a97.timer=setTimeout(function(){ +var q=t.combo("getText"); +if(_a97.previousText!=q){ +_a97.previousText=q; +t.combo("showPanel"); +opts.keyHandler.query.call(_a96,q,e); +t.combo("validate"); +} +},opts.delay); +} +} +}; +function _a98(e){ +var _a99=e.data.target; +var _a9a=$(_a99).data("combo"); +if(_a9a.timer){ +clearTimeout(_a9a.timer); +} +}; +function _a9b(_a9c){ +var _a9d=$.data(_a9c,"combo"); +var _a9e=_a9d.combo; +var _a9f=_a9d.panel; +var opts=$(_a9c).combo("options"); +var _aa0=_a9f.panel("options"); +_aa0.comboTarget=_a9c; +if(_aa0.closed){ +_a9f.panel("panel").show().css({zIndex:($.fn.menu?$.fn.menu.defaults.zIndex++:($.fn.window?$.fn.window.defaults.zIndex++:99)),left:-999999}); +_a9f.panel("resize",{width:(opts.panelWidth?opts.panelWidth:_a9e._outerWidth()),height:opts.panelHeight}); +_a9f.panel("panel").hide(); +_a9f.panel("open"); +} +(function(){ +if(_aa0.comboTarget==_a9c&&_a9f.is(":visible")){ +_a9f.panel("move",{left:_aa1(),top:_aa2()}); +setTimeout(arguments.callee,200); +} +})(); +function _aa1(){ +var left=_a9e.offset().left; +if(opts.panelAlign=="right"){ +left+=_a9e._outerWidth()-_a9f._outerWidth(); +} +if(left+_a9f._outerWidth()>$(window)._outerWidth()+$(document).scrollLeft()){ +left=$(window)._outerWidth()+$(document).scrollLeft()-_a9f._outerWidth(); +} +if(left<0){ +left=0; +} +return left; +}; +function _aa2(){ +var top=_a9e.offset().top+_a9e._outerHeight(); +if(top+_a9f._outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ +top=_a9e.offset().top-_a9f._outerHeight(); +} +if(top<$(document).scrollTop()){ +top=_a9e.offset().top+_a9e._outerHeight(); +} +return top; +}; +}; +function _a8f(_aa3){ +var _aa4=$.data(_aa3,"combo").panel; +_aa4.panel("close"); +}; +function _aa5(_aa6,text){ +var _aa7=$.data(_aa6,"combo"); +var _aa8=$(_aa6).textbox("getText"); +if(_aa8!=text){ +$(_aa6).textbox("setText",text); +} +_aa7.previousText=text; +}; +function _aa9(_aaa){ +var _aab=$.data(_aaa,"combo"); +var opts=_aab.options; +var _aac=$(_aaa).next(); +var _aad=[]; +_aac.find(".textbox-value").each(function(){ +_aad.push($(this).val()); +}); +if(opts.multivalue){ +return _aad; +}else{ +return _aad.length?_aad[0].split(opts.separator):_aad; +} +}; +function _aae(_aaf,_ab0){ +var _ab1=$.data(_aaf,"combo"); +var _ab2=_ab1.combo; +var opts=$(_aaf).combo("options"); +if(!$.isArray(_ab0)){ +_ab0=_ab0.split(opts.separator); +} +var _ab3=_aa9(_aaf); +_ab2.find(".textbox-value").remove(); +if(_ab0.length){ +if(opts.multivalue){ +for(var i=0;i<_ab0.length;i++){ +_ab4(_ab0[i]); +} +}else{ +_ab4(_ab0.join(opts.separator)); +} +} +function _ab4(_ab5){ +var name=$(_aaf).attr("textboxName")||""; +var _ab6=$("").appendTo(_ab2); +_ab6.attr("name",name); +if(opts.disabled){ +_ab6.attr("disabled","disabled"); +} +_ab6.val(_ab5); +}; +var _ab7=(function(){ +if(_ab3.length!=_ab0.length){ +return true; +} +for(var i=0;i<_ab0.length;i++){ +if(_ab0[i]!=_ab3[i]){ +return true; +} +} +return false; +})(); +if(_ab7){ +$(_aaf).val(_ab0.join(opts.separator)); +if(opts.multiple){ +opts.onChange.call(_aaf,_ab0,_ab3); +}else{ +opts.onChange.call(_aaf,_ab0[0],_ab3[0]); +} +$(_aaf).closest("form").trigger("_change",[_aaf]); +} +}; +function _ab8(_ab9){ +var _aba=_aa9(_ab9); +return _aba[0]; +}; +function _abb(_abc,_abd){ +_aae(_abc,[_abd]); +}; +function _abe(_abf){ +var opts=$.data(_abf,"combo").options; +var _ac0=opts.onChange; +opts.onChange=function(){ +}; +if(opts.multiple){ +_aae(_abf,opts.value?opts.value:[]); +}else{ +_abb(_abf,opts.value); +} +opts.onChange=_ac0; +}; +$.fn.combo=function(_ac1,_ac2){ +if(typeof _ac1=="string"){ +var _ac3=$.fn.combo.methods[_ac1]; +if(_ac3){ +return _ac3(this,_ac2); +}else{ +return this.textbox(_ac1,_ac2); +} +} +_ac1=_ac1||{}; +return this.each(function(){ +var _ac4=$.data(this,"combo"); +if(_ac4){ +$.extend(_ac4.options,_ac1); +if(_ac1.value!=undefined){ +_ac4.options.originalValue=_ac1.value; +} +}else{ +_ac4=$.data(this,"combo",{options:$.extend({},$.fn.combo.defaults,$.fn.combo.parseOptions(this),_ac1),previousText:""}); +if(_ac4.options.multiple&&_ac4.options.value==""){ +_ac4.options.originalValue=[]; +}else{ +_ac4.options.originalValue=_ac4.options.value; +} +} +_a7f(this); +_abe(this); +}); +}; +$.fn.combo.methods={options:function(jq){ +var opts=jq.textbox("options"); +return $.extend($.data(jq[0],"combo").options,{width:opts.width,height:opts.height,disabled:opts.disabled,readonly:opts.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).textbox("cloneFrom",from); +$.data(this,"combo",{options:$.extend(true,{cloned:true},$(from).combo("options")),combo:$(this).next(),panel:$(from).combo("panel")}); +$(this).addClass("combo-f").attr("comboName",$(this).attr("textboxName")); +}); +},combo:function(jq){ +return jq.closest(".combo-panel").panel("options").comboTarget; +},panel:function(jq){ +return $.data(jq[0],"combo").panel; +},destroy:function(jq){ +return jq.each(function(){ +_a88(this); +}); +},showPanel:function(jq){ +return jq.each(function(){ +_a9b(this); +}); +},hidePanel:function(jq){ +return jq.each(function(){ +_a8f(this); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("setText",""); +var opts=$.data(this,"combo").options; +if(opts.multiple){ +$(this).combo("setValues",[]); +}else{ +$(this).combo("setValue",""); +} +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$.data(this,"combo").options; +if(opts.multiple){ +$(this).combo("setValues",opts.originalValue); +}else{ +$(this).combo("setValue",opts.originalValue); +} +}); +},setText:function(jq,text){ +return jq.each(function(){ +_aa5(this,text); +}); +},getValues:function(jq){ +return _aa9(jq[0]); +},setValues:function(jq,_ac5){ +return jq.each(function(){ +_aae(this,_ac5); +}); +},getValue:function(jq){ +return _ab8(jq[0]); +},setValue:function(jq,_ac6){ +return jq.each(function(){ +_abb(this,_ac6); +}); +}}; +$.fn.combo.parseOptions=function(_ac7){ +var t=$(_ac7); +return $.extend({},$.fn.textbox.parseOptions(_ac7),$.parser.parseOptions(_ac7,["separator","panelAlign",{panelWidth:"number",hasDownArrow:"boolean",delay:"number",reversed:"boolean",multivalue:"boolean",selectOnNavigation:"boolean"},{panelMinWidth:"number",panelMaxWidth:"number",panelMinHeight:"number",panelMaxHeight:"number"}]),{panelHeight:(t.attr("panelHeight")=="auto"?"auto":parseInt(t.attr("panelHeight"))||undefined),multiple:(t.attr("multiple")?true:undefined)}); +}; +$.fn.combo.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{click:_a91,keydown:_a95,paste:_a95,drop:_a95,blur:_a98},panelEvents:{mousedown:function(e){ +e.preventDefault(); +e.stopPropagation(); +}},panelWidth:null,panelHeight:300,panelMinWidth:null,panelMaxWidth:null,panelMinHeight:null,panelMaxHeight:null,panelAlign:"left",reversed:false,multiple:false,multivalue:true,selectOnNavigation:true,separator:",",hasDownArrow:true,delay:200,keyHandler:{up:function(e){ +},down:function(e){ +},left:function(e){ +},right:function(e){ +},enter:function(e){ +},query:function(q,e){ +}},onShowPanel:function(){ +},onHidePanel:function(){ +},onChange:function(_ac8,_ac9){ +}}); +})(jQuery); +(function($){ +function _aca(_acb,_acc){ +var _acd=$.data(_acb,"combobox"); +return $.easyui.indexOfArray(_acd.data,_acd.options.valueField,_acc); +}; +function _ace(_acf,_ad0){ +var opts=$.data(_acf,"combobox").options; +var _ad1=$(_acf).combo("panel"); +var item=opts.finder.getEl(_acf,_ad0); +if(item.length){ +if(item.position().top<=0){ +var h=_ad1.scrollTop()+item.position().top; +_ad1.scrollTop(h); +}else{ +if(item.position().top+item.outerHeight()>_ad1.height()){ +var h=_ad1.scrollTop()+item.position().top+item.outerHeight()-_ad1.height(); +_ad1.scrollTop(h); +} +} +} +_ad1.triggerHandler("scroll"); +}; +function nav(_ad2,dir){ +var opts=$.data(_ad2,"combobox").options; +var _ad3=$(_ad2).combobox("panel"); +var item=_ad3.children("div.combobox-item-hover"); +if(!item.length){ +item=_ad3.children("div.combobox-item-selected"); +} +item.removeClass("combobox-item-hover"); +var _ad4="div.combobox-item:visible:not(.combobox-item-disabled):first"; +var _ad5="div.combobox-item:visible:not(.combobox-item-disabled):last"; +if(!item.length){ +item=_ad3.children(dir=="next"?_ad4:_ad5); +}else{ +if(dir=="next"){ +item=item.nextAll(_ad4); +if(!item.length){ +item=_ad3.children(_ad4); +} +}else{ +item=item.prevAll(_ad4); +if(!item.length){ +item=_ad3.children(_ad5); +} +} +} +if(item.length){ +item.addClass("combobox-item-hover"); +var row=opts.finder.getRow(_ad2,item); +if(row){ +$(_ad2).combobox("scrollTo",row[opts.valueField]); +if(opts.selectOnNavigation){ +_ad6(_ad2,row[opts.valueField]); +} +} +} +}; +function _ad6(_ad7,_ad8,_ad9){ +var opts=$.data(_ad7,"combobox").options; +var _ada=$(_ad7).combo("getValues"); +if($.inArray(_ad8+"",_ada)==-1){ +if(opts.multiple){ +_ada.push(_ad8); +}else{ +_ada=[_ad8]; +} +_adb(_ad7,_ada,_ad9); +} +}; +function _adc(_add,_ade){ +var opts=$.data(_add,"combobox").options; +var _adf=$(_add).combo("getValues"); +var _ae0=$.inArray(_ade+"",_adf); +if(_ae0>=0){ +_adf.splice(_ae0,1); +_adb(_add,_adf); +} +}; +function _adb(_ae1,_ae2,_ae3){ +var opts=$.data(_ae1,"combobox").options; +var _ae4=$(_ae1).combo("panel"); +if(!$.isArray(_ae2)){ +_ae2=_ae2.split(opts.separator); +} +if(!opts.multiple){ +_ae2=_ae2.length?[_ae2[0]]:[""]; +} +var _ae5=$(_ae1).combo("getValues"); +if(_ae4.is(":visible")){ +_ae4.find(".combobox-item-selected").each(function(){ +var row=opts.finder.getRow(_ae1,$(this)); +if(row){ +if($.easyui.indexOfArray(_ae5,row[opts.valueField])==-1){ +$(this).removeClass("combobox-item-selected"); +} +} +}); +} +$.map(_ae5,function(v){ +if($.easyui.indexOfArray(_ae2,v)==-1){ +var el=opts.finder.getEl(_ae1,v); +if(el.hasClass("combobox-item-selected")){ +el.removeClass("combobox-item-selected"); +opts.onUnselect.call(_ae1,opts.finder.getRow(_ae1,v)); +} +} +}); +var _ae6=null; +var vv=[],ss=[]; +for(var i=0;i<_ae2.length;i++){ +var v=_ae2[i]; +var s=v; +var row=opts.finder.getRow(_ae1,v); +if(row){ +s=row[opts.textField]; +_ae6=row; +var el=opts.finder.getEl(_ae1,v); +if(!el.hasClass("combobox-item-selected")){ +el.addClass("combobox-item-selected"); +opts.onSelect.call(_ae1,row); +} +}else{ +s=_ae7(v,opts.mappingRows)||v; +} +vv.push(v); +ss.push(s); +} +if(!_ae3){ +$(_ae1).combo("setText",ss.join(opts.separator)); +} +if(opts.showItemIcon){ +var tb=$(_ae1).combobox("textbox"); +tb.removeClass("textbox-bgicon "+opts.textboxIconCls); +if(_ae6&&_ae6.iconCls){ +tb.addClass("textbox-bgicon "+_ae6.iconCls); +opts.textboxIconCls=_ae6.iconCls; +} +} +$(_ae1).combo("setValues",vv); +_ae4.triggerHandler("scroll"); +function _ae7(_ae8,a){ +var item=$.easyui.getArrayItem(a,opts.valueField,_ae8); +return item?item[opts.textField]:undefined; +}; +}; +function _ae9(_aea,data,_aeb){ +var _aec=$.data(_aea,"combobox"); +var opts=_aec.options; +_aec.data=opts.loadFilter.call(_aea,data); +opts.view.render.call(opts.view,_aea,$(_aea).combo("panel"),_aec.data); +var vv=$(_aea).combobox("getValues"); +$.easyui.forEach(_aec.data,false,function(row){ +if(row["selected"]){ +$.easyui.addArrayItem(vv,row[opts.valueField]+""); +} +}); +if(opts.multiple){ +_adb(_aea,vv,_aeb); +}else{ +_adb(_aea,vv.length?[vv[vv.length-1]]:[],_aeb); +} +opts.onLoadSuccess.call(_aea,data); +}; +function _aed(_aee,url,_aef,_af0){ +var opts=$.data(_aee,"combobox").options; +if(url){ +opts.url=url; +} +_aef=$.extend({},opts.queryParams,_aef||{}); +if(opts.onBeforeLoad.call(_aee,_aef)==false){ +return; +} +opts.loader.call(_aee,_aef,function(data){ +_ae9(_aee,data,_af0); +},function(){ +opts.onLoadError.apply(this,arguments); +}); +}; +function _af1(_af2,q){ +var _af3=$.data(_af2,"combobox"); +var opts=_af3.options; +var _af4=$(); +var qq=opts.multiple?q.split(opts.separator):[q]; +if(opts.mode=="remote"){ +_af5(qq); +_aed(_af2,null,{q:q},true); +}else{ +var _af6=$(_af2).combo("panel"); +_af6.find(".combobox-item-hover").removeClass("combobox-item-hover"); +_af6.find(".combobox-item,.combobox-group").hide(); +var data=_af3.data; +var vv=[]; +$.map(qq,function(q){ +q=$.trim(q); +var _af7=q; +var _af8=undefined; +_af4=$(); +for(var i=0;i=0){ +vv.push(v); +} +}); +t.combobox("setValues",vv); +if(!opts.multiple){ +t.combobox("hidePanel"); +} +}; +function _afd(_afe){ +var _aff=$.data(_afe,"combobox"); +var opts=_aff.options; +$(_afe).addClass("combobox-f"); +$(_afe).combo($.extend({},opts,{onShowPanel:function(){ +$(this).combo("panel").find("div.combobox-item:hidden,div.combobox-group:hidden").show(); +_adb(this,$(this).combobox("getValues"),true); +$(this).combobox("scrollTo",$(this).combobox("getValue")); +opts.onShowPanel.call(this); +}})); +}; +function _b00(e){ +$(this).children("div.combobox-item-hover").removeClass("combobox-item-hover"); +var item=$(e.target).closest("div.combobox-item"); +if(!item.hasClass("combobox-item-disabled")){ +item.addClass("combobox-item-hover"); +} +e.stopPropagation(); +}; +function _b01(e){ +$(e.target).closest("div.combobox-item").removeClass("combobox-item-hover"); +e.stopPropagation(); +}; +function _b02(e){ +var _b03=$(this).panel("options").comboTarget; +if(!_b03){ +return; +} +var opts=$(_b03).combobox("options"); +var item=$(e.target).closest("div.combobox-item"); +if(!item.length||item.hasClass("combobox-item-disabled")){ +return; +} +var row=opts.finder.getRow(_b03,item); +if(!row){ +return; +} +if(opts.blurTimer){ +clearTimeout(opts.blurTimer); +opts.blurTimer=null; +} +opts.onClick.call(_b03,row); +var _b04=row[opts.valueField]; +if(opts.multiple){ +if(item.hasClass("combobox-item-selected")){ +_adc(_b03,_b04); +}else{ +_ad6(_b03,_b04); +} +}else{ +$(_b03).combobox("setValue",_b04).combobox("hidePanel"); +} +e.stopPropagation(); +}; +function _b05(e){ +var _b06=$(this).panel("options").comboTarget; +if(!_b06){ +return; +} +var opts=$(_b06).combobox("options"); +if(opts.groupPosition=="sticky"){ +var _b07=$(this).children(".combobox-stick"); +if(!_b07.length){ +_b07=$("
                                                                                                  ").appendTo(this); +} +_b07.hide(); +var _b08=$(_b06).data("combobox"); +$(this).children(".combobox-group:visible").each(function(){ +var g=$(this); +var _b09=opts.finder.getGroup(_b06,g); +var _b0a=_b08.data[_b09.startIndex+_b09.count-1]; +var last=opts.finder.getEl(_b06,_b0a[opts.valueField]); +if(g.position().top<0&&last.position().top>0){ +_b07.show().html(g.html()); +return false; +} +}); +} +}; +$.fn.combobox=function(_b0b,_b0c){ +if(typeof _b0b=="string"){ +var _b0d=$.fn.combobox.methods[_b0b]; +if(_b0d){ +return _b0d(this,_b0c); +}else{ +return this.combo(_b0b,_b0c); +} +} +_b0b=_b0b||{}; +return this.each(function(){ +var _b0e=$.data(this,"combobox"); +if(_b0e){ +$.extend(_b0e.options,_b0b); +}else{ +_b0e=$.data(this,"combobox",{options:$.extend({},$.fn.combobox.defaults,$.fn.combobox.parseOptions(this),_b0b),data:[]}); +} +_afd(this); +if(_b0e.options.data){ +_ae9(this,_b0e.options.data); +}else{ +var data=$.fn.combobox.parseData(this); +if(data.length){ +_ae9(this,data); +} +} +_aed(this); +}); +}; +$.fn.combobox.methods={options:function(jq){ +var _b0f=jq.combo("options"); +return $.extend($.data(jq[0],"combobox").options,{width:_b0f.width,height:_b0f.height,originalValue:_b0f.originalValue,disabled:_b0f.disabled,readonly:_b0f.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).combo("cloneFrom",from); +$.data(this,"combobox",$(from).data("combobox")); +$(this).addClass("combobox-f").attr("comboboxName",$(this).attr("textboxName")); +}); +},getData:function(jq){ +return $.data(jq[0],"combobox").data; +},setValues:function(jq,_b10){ +return jq.each(function(){ +var opts=$(this).combobox("options"); +if($.isArray(_b10)){ +_b10=$.map(_b10,function(_b11){ +if(_b11&&typeof _b11=="object"){ +$.easyui.addArrayItem(opts.mappingRows,opts.valueField,_b11); +return _b11[opts.valueField]; +}else{ +return _b11; +} +}); +} +_adb(this,_b10); +}); +},setValue:function(jq,_b12){ +return jq.each(function(){ +$(this).combobox("setValues",$.isArray(_b12)?_b12:[_b12]); +}); +},clear:function(jq){ +return jq.each(function(){ +_adb(this,[]); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).combobox("options"); +if(opts.multiple){ +$(this).combobox("setValues",opts.originalValue); +}else{ +$(this).combobox("setValue",opts.originalValue); +} +}); +},loadData:function(jq,data){ +return jq.each(function(){ +_ae9(this,data); +}); +},reload:function(jq,url){ +return jq.each(function(){ +if(typeof url=="string"){ +_aed(this,url); +}else{ +if(url){ +var opts=$(this).combobox("options"); +opts.queryParams=url; +} +_aed(this); +} +}); +},select:function(jq,_b13){ +return jq.each(function(){ +_ad6(this,_b13); +}); +},unselect:function(jq,_b14){ +return jq.each(function(){ +_adc(this,_b14); +}); +},scrollTo:function(jq,_b15){ +return jq.each(function(){ +_ace(this,_b15); +}); +}}; +$.fn.combobox.parseOptions=function(_b16){ +var t=$(_b16); +return $.extend({},$.fn.combo.parseOptions(_b16),$.parser.parseOptions(_b16,["valueField","textField","groupField","groupPosition","mode","method","url",{showItemIcon:"boolean",limitToList:"boolean"}])); +}; +$.fn.combobox.parseData=function(_b17){ +var data=[]; +var opts=$(_b17).combobox("options"); +$(_b17).children().each(function(){ +if(this.tagName.toLowerCase()=="optgroup"){ +var _b18=$(this).attr("label"); +$(this).children().each(function(){ +_b19(this,_b18); +}); +}else{ +_b19(this); +} +}); +return data; +function _b19(el,_b1a){ +var t=$(el); +var row={}; +row[opts.valueField]=t.attr("value")!=undefined?t.attr("value"):t.text(); +row[opts.textField]=t.text(); +row["iconCls"]=$.parser.parseOptions(el,["iconCls"]).iconCls; +row["selected"]=t.is(":selected"); +row["disabled"]=t.is(":disabled"); +if(_b1a){ +opts.groupField=opts.groupField||"group"; +row[opts.groupField]=_b1a; +} +data.push(row); +}; +}; +var _b1b=0; +var _b1c={render:function(_b1d,_b1e,data){ +var _b1f=$.data(_b1d,"combobox"); +var opts=_b1f.options; +_b1b++; +_b1f.itemIdPrefix="_easyui_combobox_i"+_b1b; +_b1f.groupIdPrefix="_easyui_combobox_g"+_b1b; +_b1f.groups=[]; +var dd=[]; +var _b20=undefined; +for(var i=0;i"); +dd.push(opts.groupFormatter?opts.groupFormatter.call(_b1d,g):g); +dd.push("
                                                                                                  "); +}else{ +_b1f.groups[_b1f.groups.length-1].count++; +} +}else{ +_b20=undefined; +} +var cls="combobox-item"+(row.disabled?" combobox-item-disabled":"")+(g?" combobox-gitem":""); +dd.push("
                                                                                                  "); +if(opts.showItemIcon&&row.iconCls){ +dd.push(""); +} +dd.push(opts.formatter?opts.formatter.call(_b1d,row):s); +dd.push("
                                                                                                  "); +} +$(_b1e).html(dd.join("")); +}}; +$.fn.combobox.defaults=$.extend({},$.fn.combo.defaults,{valueField:"value",textField:"text",groupPosition:"static",groupField:null,groupFormatter:function(_b21){ +return _b21; +},mode:"local",method:"post",url:null,data:null,queryParams:{},showItemIcon:false,limitToList:false,unselectedValues:[],mappingRows:[],view:_b1c,keyHandler:{up:function(e){ +nav(this,"prev"); +e.preventDefault(); +},down:function(e){ +nav(this,"next"); +e.preventDefault(); +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_af9(this); +},query:function(q,e){ +_af1(this,q); +}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ +$.fn.combo.defaults.inputEvents.blur(e); +var _b22=e.data.target; +var opts=$(_b22).combobox("options"); +if(opts.reversed||opts.limitToList){ +if(opts.blurTimer){ +clearTimeout(opts.blurTimer); +} +opts.blurTimer=setTimeout(function(){ +var _b23=$(_b22).parent().length; +if(_b23){ +if(opts.reversed){ +$(_b22).combobox("setValues",$(_b22).combobox("getValues")); +}else{ +if(opts.limitToList){ +var vv=[]; +$.map($(_b22).combobox("getValues"),function(v){ +var _b24=$.easyui.indexOfArray($(_b22).combobox("getData"),opts.valueField,v); +if(_b24>=0){ +vv.push(v); +} +}); +$(_b22).combobox("setValues",vv); +} +} +opts.blurTimer=null; +} +},50); +} +}}),panelEvents:{mouseover:_b00,mouseout:_b01,mousedown:function(e){ +e.preventDefault(); +e.stopPropagation(); +},click:_b02,scroll:_b05},filter:function(q,row){ +var opts=$(this).combobox("options"); +return row[opts.textField].toLowerCase().indexOf(q.toLowerCase())>=0; +},formatter:function(row){ +var opts=$(this).combobox("options"); +return row[opts.textField]; +},loader:function(_b25,_b26,_b27){ +var opts=$(this).combobox("options"); +if(!opts.url){ +return false; +} +$.ajax({type:opts.method,url:opts.url,data:_b25,dataType:"json",success:function(data){ +_b26(data); +},error:function(){ +_b27.apply(this,arguments); +}}); +},loadFilter:function(data){ +return data; +},finder:{getEl:function(_b28,_b29){ +var _b2a=_aca(_b28,_b29); +var id=$.data(_b28,"combobox").itemIdPrefix+"_"+_b2a; +return $("#"+id); +},getGroupEl:function(_b2b,_b2c){ +var _b2d=$.data(_b2b,"combobox"); +var _b2e=$.easyui.indexOfArray(_b2d.groups,"value",_b2c); +var id=_b2d.groupIdPrefix+"_"+_b2e; +return $("#"+id); +},getGroup:function(_b2f,p){ +var _b30=$.data(_b2f,"combobox"); +var _b31=p.attr("id").substr(_b30.groupIdPrefix.length+1); +return _b30.groups[parseInt(_b31)]; +},getRow:function(_b32,p){ +var _b33=$.data(_b32,"combobox"); +var _b34=(p instanceof $)?p.attr("id").substr(_b33.itemIdPrefix.length+1):_aca(_b32,p); +return _b33.data[parseInt(_b34)]; +}},onBeforeLoad:function(_b35){ +},onLoadSuccess:function(data){ +},onLoadError:function(){ +},onSelect:function(_b36){ +},onUnselect:function(_b37){ +},onClick:function(_b38){ +}}); +})(jQuery); +(function($){ +function _b39(_b3a){ +var _b3b=$.data(_b3a,"combotree"); +var opts=_b3b.options; +var tree=_b3b.tree; +$(_b3a).addClass("combotree-f"); +$(_b3a).combo($.extend({},opts,{onShowPanel:function(){ +if(opts.editable){ +tree.tree("doFilter",""); +} +opts.onShowPanel.call(this); +}})); +var _b3c=$(_b3a).combo("panel"); +if(!tree){ +tree=$("
                                                                                                    ").appendTo(_b3c); +_b3b.tree=tree; +} +tree.tree($.extend({},opts,{checkbox:opts.multiple,onLoadSuccess:function(node,data){ +var _b3d=$(_b3a).combotree("getValues"); +if(opts.multiple){ +$.map(tree.tree("getChecked"),function(node){ +$.easyui.addArrayItem(_b3d,node.id); +}); +} +_b42(_b3a,_b3d,_b3b.remainText); +opts.onLoadSuccess.call(this,node,data); +},onClick:function(node){ +if(opts.multiple){ +$(this).tree(node.checked?"uncheck":"check",node.target); +}else{ +$(_b3a).combo("hidePanel"); +} +_b3b.remainText=false; +_b3f(_b3a); +opts.onClick.call(this,node); +},onCheck:function(node,_b3e){ +_b3b.remainText=false; +_b3f(_b3a); +opts.onCheck.call(this,node,_b3e); +}})); +}; +function _b3f(_b40){ +var _b41=$.data(_b40,"combotree"); +var opts=_b41.options; +var tree=_b41.tree; +var vv=[]; +if(opts.multiple){ +vv=$.map(tree.tree("getChecked"),function(node){ +return node.id; +}); +}else{ +var node=tree.tree("getSelected"); +if(node){ +vv.push(node.id); +} +} +vv=vv.concat(opts.unselectedValues); +_b42(_b40,vv,_b41.remainText); +}; +function _b42(_b43,_b44,_b45){ +var _b46=$.data(_b43,"combotree"); +var opts=_b46.options; +var tree=_b46.tree; +var _b47=tree.tree("options"); +var _b48=_b47.onBeforeCheck; +var _b49=_b47.onCheck; +var _b4a=_b47.onSelect; +_b47.onBeforeCheck=_b47.onCheck=_b47.onSelect=function(){ +}; +if(!$.isArray(_b44)){ +_b44=_b44.split(opts.separator); +} +if(!opts.multiple){ +_b44=_b44.length?[_b44[0]]:[""]; +} +var vv=$.map(_b44,function(_b4b){ +return String(_b4b); +}); +tree.find("div.tree-node-selected").removeClass("tree-node-selected"); +$.map(tree.tree("getChecked"),function(node){ +if($.inArray(String(node.id),vv)==-1){ +tree.tree("uncheck",node.target); +} +}); +var ss=[]; +opts.unselectedValues=[]; +$.map(vv,function(v){ +var node=tree.tree("find",v); +if(node){ +tree.tree("check",node.target).tree("select",node.target); +ss.push(_b4c(node)); +}else{ +ss.push(_b4d(v,opts.mappingRows)||v); +opts.unselectedValues.push(v); +} +}); +if(opts.multiple){ +$.map(tree.tree("getChecked"),function(node){ +var id=String(node.id); +if($.inArray(id,vv)==-1){ +vv.push(id); +ss.push(_b4c(node)); +} +}); +} +_b47.onBeforeCheck=_b48; +_b47.onCheck=_b49; +_b47.onSelect=_b4a; +if(!_b45){ +var s=ss.join(opts.separator); +if($(_b43).combo("getText")!=s){ +$(_b43).combo("setText",s); +} +} +$(_b43).combo("setValues",vv); +function _b4d(_b4e,a){ +var item=$.easyui.getArrayItem(a,"id",_b4e); +return item?_b4c(item):undefined; +}; +function _b4c(node){ +return node[opts.textField||""]||node.text; +}; +}; +function _b4f(_b50,q){ +var _b51=$.data(_b50,"combotree"); +var opts=_b51.options; +var tree=_b51.tree; +_b51.remainText=true; +tree.tree("doFilter",opts.multiple?q.split(opts.separator):q); +}; +function _b52(_b53){ +var _b54=$.data(_b53,"combotree"); +_b54.remainText=false; +$(_b53).combotree("setValues",$(_b53).combotree("getValues")); +$(_b53).combotree("hidePanel"); +}; +$.fn.combotree=function(_b55,_b56){ +if(typeof _b55=="string"){ +var _b57=$.fn.combotree.methods[_b55]; +if(_b57){ +return _b57(this,_b56); +}else{ +return this.combo(_b55,_b56); +} +} +_b55=_b55||{}; +return this.each(function(){ +var _b58=$.data(this,"combotree"); +if(_b58){ +$.extend(_b58.options,_b55); +}else{ +$.data(this,"combotree",{options:$.extend({},$.fn.combotree.defaults,$.fn.combotree.parseOptions(this),_b55)}); +} +_b39(this); +}); +}; +$.fn.combotree.methods={options:function(jq){ +var _b59=jq.combo("options"); +return $.extend($.data(jq[0],"combotree").options,{width:_b59.width,height:_b59.height,originalValue:_b59.originalValue,disabled:_b59.disabled,readonly:_b59.readonly}); +},clone:function(jq,_b5a){ +var t=jq.combo("clone",_b5a); +t.data("combotree",{options:$.extend(true,{},jq.combotree("options")),tree:jq.combotree("tree")}); +return t; +},tree:function(jq){ +return $.data(jq[0],"combotree").tree; +},loadData:function(jq,data){ +return jq.each(function(){ +var opts=$.data(this,"combotree").options; +opts.data=data; +var tree=$.data(this,"combotree").tree; +tree.tree("loadData",data); +}); +},reload:function(jq,url){ +return jq.each(function(){ +var opts=$.data(this,"combotree").options; +var tree=$.data(this,"combotree").tree; +if(url){ +opts.url=url; +} +tree.tree({url:opts.url}); +}); +},setValues:function(jq,_b5b){ +return jq.each(function(){ +var opts=$(this).combotree("options"); +if($.isArray(_b5b)){ +_b5b=$.map(_b5b,function(_b5c){ +if(_b5c&&typeof _b5c=="object"){ +$.easyui.addArrayItem(opts.mappingRows,"id",_b5c); +return _b5c.id; +}else{ +return _b5c; +} +}); +} +_b42(this,_b5b); +}); +},setValue:function(jq,_b5d){ +return jq.each(function(){ +$(this).combotree("setValues",$.isArray(_b5d)?_b5d:[_b5d]); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).combotree("setValues",[]); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).combotree("options"); +if(opts.multiple){ +$(this).combotree("setValues",opts.originalValue); +}else{ +$(this).combotree("setValue",opts.originalValue); +} +}); +}}; +$.fn.combotree.parseOptions=function(_b5e){ +return $.extend({},$.fn.combo.parseOptions(_b5e),$.fn.tree.parseOptions(_b5e)); +}; +$.fn.combotree.defaults=$.extend({},$.fn.combo.defaults,$.fn.tree.defaults,{editable:false,textField:null,unselectedValues:[],mappingRows:[],keyHandler:{up:function(e){ +},down:function(e){ +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_b52(this); +},query:function(q,e){ +_b4f(this,q); +}}}); +})(jQuery); +(function($){ +function _b5f(_b60){ +var _b61=$.data(_b60,"combogrid"); +var opts=_b61.options; +var grid=_b61.grid; +$(_b60).addClass("combogrid-f").combo($.extend({},opts,{onShowPanel:function(){ +_b78(this,$(this).combogrid("getValues"),true); +var p=$(this).combogrid("panel"); +var _b62=p.outerHeight()-p.height(); +var _b63=p._size("minHeight"); +var _b64=p._size("maxHeight"); +var dg=$(this).combogrid("grid"); +dg.datagrid("resize",{width:"100%",height:(isNaN(parseInt(opts.panelHeight))?"auto":"100%"),minHeight:(_b63?_b63-_b62:""),maxHeight:(_b64?_b64-_b62:"")}); +var row=dg.datagrid("getSelected"); +if(row){ +dg.datagrid("scrollTo",dg.datagrid("getRowIndex",row)); +} +opts.onShowPanel.call(this); +}})); +var _b65=$(_b60).combo("panel"); +if(!grid){ +grid=$("
                                                                                                    ").appendTo(_b65); +_b61.grid=grid; +} +grid.datagrid($.extend({},opts,{border:false,singleSelect:(!opts.multiple),onLoadSuccess:_b66,onClickRow:_b67,onSelect:_b68("onSelect"),onUnselect:_b68("onUnselect"),onSelectAll:_b68("onSelectAll"),onUnselectAll:_b68("onUnselectAll")})); +function _b69(dg){ +return $(dg).closest(".combo-panel").panel("options").comboTarget||_b60; +}; +function _b66(data){ +var _b6a=_b69(this); +var _b6b=$(_b6a).data("combogrid"); +var opts=_b6b.options; +var _b6c=$(_b6a).combo("getValues"); +_b78(_b6a,_b6c,_b6b.remainText); +opts.onLoadSuccess.call(this,data); +}; +function _b67(_b6d,row){ +var _b6e=_b69(this); +var _b6f=$(_b6e).data("combogrid"); +var opts=_b6f.options; +_b6f.remainText=false; +_b70.call(this); +if(!opts.multiple){ +$(_b6e).combo("hidePanel"); +} +opts.onClickRow.call(this,_b6d,row); +}; +function _b68(_b71){ +return function(_b72,row){ +var _b73=_b69(this); +var opts=$(_b73).combogrid("options"); +if(_b71=="onUnselectAll"){ +if(opts.multiple){ +_b70.call(this); +} +}else{ +_b70.call(this); +} +opts[_b71].call(this,_b72,row); +}; +}; +function _b70(){ +var dg=$(this); +var _b74=_b69(dg); +var _b75=$(_b74).data("combogrid"); +var opts=_b75.options; +var vv=$.map(dg.datagrid("getSelections"),function(row){ +return row[opts.idField]; +}); +vv=vv.concat(opts.unselectedValues); +var _b76=dg.data("datagrid").dc.body2; +var _b77=_b76.scrollTop(); +_b78(_b74,vv,_b75.remainText); +_b76.scrollTop(_b77); +}; +}; +function nav(_b79,dir){ +var _b7a=$.data(_b79,"combogrid"); +var opts=_b7a.options; +var grid=_b7a.grid; +var _b7b=grid.datagrid("getRows").length; +if(!_b7b){ +return; +} +var tr=opts.finder.getTr(grid[0],null,"highlight"); +if(!tr.length){ +tr=opts.finder.getTr(grid[0],null,"selected"); +} +var _b7c; +if(!tr.length){ +_b7c=(dir=="next"?0:_b7b-1); +}else{ +var _b7c=parseInt(tr.attr("datagrid-row-index")); +_b7c+=(dir=="next"?1:-1); +if(_b7c<0){ +_b7c=_b7b-1; +} +if(_b7c>=_b7b){ +_b7c=0; +} +} +grid.datagrid("highlightRow",_b7c); +if(opts.selectOnNavigation){ +_b7a.remainText=false; +grid.datagrid("selectRow",_b7c); +} +}; +function _b78(_b7d,_b7e,_b7f){ +var _b80=$.data(_b7d,"combogrid"); +var opts=_b80.options; +var grid=_b80.grid; +var _b81=$(_b7d).combo("getValues"); +var _b82=$(_b7d).combo("options"); +var _b83=_b82.onChange; +_b82.onChange=function(){ +}; +var _b84=grid.datagrid("options"); +var _b85=_b84.onSelect; +var _b86=_b84.onUnselectAll; +_b84.onSelect=_b84.onUnselectAll=function(){ +}; +if(!$.isArray(_b7e)){ +_b7e=_b7e.split(opts.separator); +} +if(!opts.multiple){ +_b7e=_b7e.length?[_b7e[0]]:[""]; +} +var vv=$.map(_b7e,function(_b87){ +return String(_b87); +}); +vv=$.grep(vv,function(v,_b88){ +return _b88===$.inArray(v,vv); +}); +var _b89=$.grep(grid.datagrid("getSelections"),function(row,_b8a){ +return $.inArray(String(row[opts.idField]),vv)>=0; +}); +grid.datagrid("clearSelections"); +grid.data("datagrid").selectedRows=_b89; +var ss=[]; +opts.unselectedValues=[]; +$.map(vv,function(v){ +var _b8b=grid.datagrid("getRowIndex",v); +if(_b8b>=0){ +grid.datagrid("selectRow",_b8b); +}else{ +opts.unselectedValues.push(v); +} +ss.push(_b8c(v,grid.datagrid("getRows"))||_b8c(v,_b89)||_b8c(v,opts.mappingRows)||v); +}); +$(_b7d).combo("setValues",_b81); +_b82.onChange=_b83; +_b84.onSelect=_b85; +_b84.onUnselectAll=_b86; +if(!_b7f){ +var s=ss.join(opts.separator); +if($(_b7d).combo("getText")!=s){ +$(_b7d).combo("setText",s); +} +} +$(_b7d).combo("setValues",_b7e); +function _b8c(_b8d,a){ +var item=$.easyui.getArrayItem(a,opts.idField,_b8d); +return item?item[opts.textField]:undefined; +}; +}; +function _b8e(_b8f,q){ +var _b90=$.data(_b8f,"combogrid"); +var opts=_b90.options; +var grid=_b90.grid; +_b90.remainText=true; +var qq=opts.multiple?q.split(opts.separator):[q]; +qq=$.grep(qq,function(q){ +return $.trim(q)!=""; +}); +if(opts.mode=="remote"){ +_b91(qq); +grid.datagrid("load",$.extend({},opts.queryParams,{q:q})); +}else{ +grid.datagrid("highlightRow",-1); +var rows=grid.datagrid("getRows"); +var vv=[]; +$.map(qq,function(q){ +q=$.trim(q); +var _b92=q; +_b93(opts.mappingRows,q); +_b93(grid.datagrid("getSelections"),q); +var _b94=_b93(rows,q); +if(_b94>=0){ +if(opts.reversed){ +grid.datagrid("highlightRow",_b94); +} +}else{ +$.map(rows,function(row,i){ +if(opts.filter.call(_b8f,q,row)){ +grid.datagrid("highlightRow",i); +} +}); +} +}); +_b91(vv); +} +function _b93(rows,q){ +for(var i=0;i=0){ +$.easyui.addArrayItem(vv,v); +} +}); +$(_b96).combogrid("setValues",vv); +if(!opts.multiple){ +$(_b96).combogrid("hidePanel"); +} +}; +$.fn.combogrid=function(_b99,_b9a){ +if(typeof _b99=="string"){ +var _b9b=$.fn.combogrid.methods[_b99]; +if(_b9b){ +return _b9b(this,_b9a); +}else{ +return this.combo(_b99,_b9a); +} +} +_b99=_b99||{}; +return this.each(function(){ +var _b9c=$.data(this,"combogrid"); +if(_b9c){ +$.extend(_b9c.options,_b99); +}else{ +_b9c=$.data(this,"combogrid",{options:$.extend({},$.fn.combogrid.defaults,$.fn.combogrid.parseOptions(this),_b99)}); +} +_b5f(this); +}); +}; +$.fn.combogrid.methods={options:function(jq){ +var _b9d=jq.combo("options"); +return $.extend($.data(jq[0],"combogrid").options,{width:_b9d.width,height:_b9d.height,originalValue:_b9d.originalValue,disabled:_b9d.disabled,readonly:_b9d.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).combo("cloneFrom",from); +$.data(this,"combogrid",{options:$.extend(true,{cloned:true},$(from).combogrid("options")),combo:$(this).next(),panel:$(from).combo("panel"),grid:$(from).combogrid("grid")}); +}); +},grid:function(jq){ +return $.data(jq[0],"combogrid").grid; +},setValues:function(jq,_b9e){ +return jq.each(function(){ +var opts=$(this).combogrid("options"); +if($.isArray(_b9e)){ +_b9e=$.map(_b9e,function(_b9f){ +if(_b9f&&typeof _b9f=="object"){ +$.easyui.addArrayItem(opts.mappingRows,opts.idField,_b9f); +return _b9f[opts.idField]; +}else{ +return _b9f; +} +}); +} +_b78(this,_b9e); +}); +},setValue:function(jq,_ba0){ +return jq.each(function(){ +$(this).combogrid("setValues",$.isArray(_ba0)?_ba0:[_ba0]); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).combogrid("setValues",[]); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).combogrid("options"); +if(opts.multiple){ +$(this).combogrid("setValues",opts.originalValue); +}else{ +$(this).combogrid("setValue",opts.originalValue); +} +}); +}}; +$.fn.combogrid.parseOptions=function(_ba1){ +var t=$(_ba1); +return $.extend({},$.fn.combo.parseOptions(_ba1),$.fn.datagrid.parseOptions(_ba1),$.parser.parseOptions(_ba1,["idField","textField","mode"])); +}; +$.fn.combogrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.datagrid.defaults,{loadMsg:null,idField:null,textField:null,unselectedValues:[],mappingRows:[],mode:"local",keyHandler:{up:function(e){ +nav(this,"prev"); +e.preventDefault(); +},down:function(e){ +nav(this,"next"); +e.preventDefault(); +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_b95(this); +},query:function(q,e){ +_b8e(this,q); +}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ +$.fn.combo.defaults.inputEvents.blur(e); +var _ba2=e.data.target; +var opts=$(_ba2).combogrid("options"); +if(opts.reversed){ +$(_ba2).combogrid("setValues",$(_ba2).combogrid("getValues")); +} +}}),panelEvents:{mousedown:function(e){ +}},filter:function(q,row){ +var opts=$(this).combogrid("options"); +return (row[opts.textField]||"").toLowerCase().indexOf(q.toLowerCase())>=0; +}}); +})(jQuery); +(function($){ +function _ba3(_ba4){ +var _ba5=$.data(_ba4,"combotreegrid"); +var opts=_ba5.options; +$(_ba4).addClass("combotreegrid-f").combo($.extend({},opts,{onShowPanel:function(){ +var p=$(this).combotreegrid("panel"); +var _ba6=p.outerHeight()-p.height(); +var _ba7=p._size("minHeight"); +var _ba8=p._size("maxHeight"); +var dg=$(this).combotreegrid("grid"); +dg.treegrid("resize",{width:"100%",height:(isNaN(parseInt(opts.panelHeight))?"auto":"100%"),minHeight:(_ba7?_ba7-_ba6:""),maxHeight:(_ba8?_ba8-_ba6:"")}); +var row=dg.treegrid("getSelected"); +if(row){ +dg.treegrid("scrollTo",row[opts.idField]); +} +opts.onShowPanel.call(this); +}})); +if(!_ba5.grid){ +var _ba9=$(_ba4).combo("panel"); +_ba5.grid=$("
                                                                                                    ").appendTo(_ba9); +} +_ba5.grid.treegrid($.extend({},opts,{border:false,checkbox:opts.multiple,onLoadSuccess:function(row,data){ +var _baa=$(_ba4).combotreegrid("getValues"); +if(opts.multiple){ +$.map($(this).treegrid("getCheckedNodes"),function(row){ +$.easyui.addArrayItem(_baa,row[opts.idField]); +}); +} +_baf(_ba4,_baa); +opts.onLoadSuccess.call(this,row,data); +_ba5.remainText=false; +},onClickRow:function(row){ +if(opts.multiple){ +$(this).treegrid(row.checked?"uncheckNode":"checkNode",row[opts.idField]); +$(this).treegrid("unselect",row[opts.idField]); +}else{ +$(_ba4).combo("hidePanel"); +} +_bac(_ba4); +opts.onClickRow.call(this,row); +},onCheckNode:function(row,_bab){ +_bac(_ba4); +opts.onCheckNode.call(this,row,_bab); +}})); +}; +function _bac(_bad){ +var _bae=$.data(_bad,"combotreegrid"); +var opts=_bae.options; +var grid=_bae.grid; +var vv=[]; +if(opts.multiple){ +vv=$.map(grid.treegrid("getCheckedNodes"),function(row){ +return row[opts.idField]; +}); +}else{ +var row=grid.treegrid("getSelected"); +if(row){ +vv.push(row[opts.idField]); +} +} +vv=vv.concat(opts.unselectedValues); +_baf(_bad,vv); +}; +function _baf(_bb0,_bb1){ +var _bb2=$.data(_bb0,"combotreegrid"); +var opts=_bb2.options; +var grid=_bb2.grid; +if(!$.isArray(_bb1)){ +_bb1=_bb1.split(opts.separator); +} +if(!opts.multiple){ +_bb1=_bb1.length?[_bb1[0]]:[""]; +} +var vv=$.map(_bb1,function(_bb3){ +return String(_bb3); +}); +vv=$.grep(vv,function(v,_bb4){ +return _bb4===$.inArray(v,vv); +}); +var _bb5=grid.treegrid("getSelected"); +if(_bb5){ +grid.treegrid("unselect",_bb5[opts.idField]); +} +$.map(grid.treegrid("getCheckedNodes"),function(row){ +if($.inArray(String(row[opts.idField]),vv)==-1){ +grid.treegrid("uncheckNode",row[opts.idField]); +} +}); +var ss=[]; +opts.unselectedValues=[]; +$.map(vv,function(v){ +var row=grid.treegrid("find",v); +if(row){ +if(opts.multiple){ +grid.treegrid("checkNode",v); +}else{ +grid.treegrid("select",v); +} +ss.push(_bb6(row)); +}else{ +ss.push(_bb7(v,opts.mappingRows)||v); +opts.unselectedValues.push(v); +} +}); +if(opts.multiple){ +$.map(grid.treegrid("getCheckedNodes"),function(row){ +var id=String(row[opts.idField]); +if($.inArray(id,vv)==-1){ +vv.push(id); +ss.push(_bb6(row)); +} +}); +} +if(!_bb2.remainText){ +var s=ss.join(opts.separator); +if($(_bb0).combo("getText")!=s){ +$(_bb0).combo("setText",s); +} +} +$(_bb0).combo("setValues",vv); +function _bb7(_bb8,a){ +var item=$.easyui.getArrayItem(a,opts.idField,_bb8); +return item?_bb6(item):undefined; +}; +function _bb6(row){ +return row[opts.textField||""]||row[opts.treeField]; +}; +}; +function _bb9(_bba,q){ +var _bbb=$.data(_bba,"combotreegrid"); +var opts=_bbb.options; +var grid=_bbb.grid; +_bbb.remainText=true; +var qq=opts.multiple?q.split(opts.separator):[q]; +qq=$.grep(qq,function(q){ +return $.trim(q)!=""; +}); +grid.treegrid("clearSelections").treegrid("clearChecked").treegrid("highlightRow",-1); +if(opts.mode=="remote"){ +_bbc(qq); +grid.treegrid("load",$.extend({},opts.queryParams,{q:q})); +}else{ +if(q){ +var data=grid.treegrid("getData"); +var vv=[]; +$.map(qq,function(q){ +q=$.trim(q); +if(q){ +var v=undefined; +$.easyui.forEach(data,true,function(row){ +if(q.toLowerCase()==String(row[opts.treeField]).toLowerCase()){ +v=row[opts.idField]; +return false; +}else{ +if(opts.filter.call(_bba,q,row)){ +grid.treegrid("expandTo",row[opts.idField]); +grid.treegrid("highlightRow",row[opts.idField]); +return false; +} +} +}); +if(v==undefined){ +$.easyui.forEach(opts.mappingRows,false,function(row){ +if(q.toLowerCase()==String(row[opts.treeField])){ +v=row[opts.idField]; +return false; +} +}); +} +if(v!=undefined){ +vv.push(v); +}else{ +vv.push(q); +} +} +}); +_bbc(vv); +_bbb.remainText=false; +} +} +function _bbc(vv){ +if(!opts.reversed){ +$(_bba).combotreegrid("setValues",vv); +} +}; +}; +function _bbd(_bbe){ +var _bbf=$.data(_bbe,"combotreegrid"); +var opts=_bbf.options; +var grid=_bbf.grid; +var tr=opts.finder.getTr(grid[0],null,"highlight"); +_bbf.remainText=false; +if(tr.length){ +var id=tr.attr("node-id"); +if(opts.multiple){ +if(tr.hasClass("datagrid-row-selected")){ +grid.treegrid("uncheckNode",id); +}else{ +grid.treegrid("checkNode",id); +} +}else{ +grid.treegrid("selectRow",id); +} +} +var vv=[]; +if(opts.multiple){ +$.map(grid.treegrid("getCheckedNodes"),function(row){ +vv.push(row[opts.idField]); +}); +}else{ +var row=grid.treegrid("getSelected"); +if(row){ +vv.push(row[opts.idField]); +} +} +$.map(opts.unselectedValues,function(v){ +if($.easyui.indexOfArray(opts.mappingRows,opts.idField,v)>=0){ +$.easyui.addArrayItem(vv,v); +} +}); +$(_bbe).combotreegrid("setValues",vv); +if(!opts.multiple){ +$(_bbe).combotreegrid("hidePanel"); +} +}; +$.fn.combotreegrid=function(_bc0,_bc1){ +if(typeof _bc0=="string"){ +var _bc2=$.fn.combotreegrid.methods[_bc0]; +if(_bc2){ +return _bc2(this,_bc1); +}else{ +return this.combo(_bc0,_bc1); +} +} +_bc0=_bc0||{}; +return this.each(function(){ +var _bc3=$.data(this,"combotreegrid"); +if(_bc3){ +$.extend(_bc3.options,_bc0); +}else{ +_bc3=$.data(this,"combotreegrid",{options:$.extend({},$.fn.combotreegrid.defaults,$.fn.combotreegrid.parseOptions(this),_bc0)}); +} +_ba3(this); +}); +}; +$.fn.combotreegrid.methods={options:function(jq){ +var _bc4=jq.combo("options"); +return $.extend($.data(jq[0],"combotreegrid").options,{width:_bc4.width,height:_bc4.height,originalValue:_bc4.originalValue,disabled:_bc4.disabled,readonly:_bc4.readonly}); +},grid:function(jq){ +return $.data(jq[0],"combotreegrid").grid; +},setValues:function(jq,_bc5){ +return jq.each(function(){ +var opts=$(this).combotreegrid("options"); +if($.isArray(_bc5)){ +_bc5=$.map(_bc5,function(_bc6){ +if(_bc6&&typeof _bc6=="object"){ +$.easyui.addArrayItem(opts.mappingRows,opts.idField,_bc6); +return _bc6[opts.idField]; +}else{ +return _bc6; +} +}); +} +_baf(this,_bc5); +}); +},setValue:function(jq,_bc7){ +return jq.each(function(){ +$(this).combotreegrid("setValues",$.isArray(_bc7)?_bc7:[_bc7]); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).combotreegrid("setValues",[]); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).combotreegrid("options"); +if(opts.multiple){ +$(this).combotreegrid("setValues",opts.originalValue); +}else{ +$(this).combotreegrid("setValue",opts.originalValue); +} +}); +}}; +$.fn.combotreegrid.parseOptions=function(_bc8){ +var t=$(_bc8); +return $.extend({},$.fn.combo.parseOptions(_bc8),$.fn.treegrid.parseOptions(_bc8),$.parser.parseOptions(_bc8,["mode",{limitToGrid:"boolean"}])); +}; +$.fn.combotreegrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.treegrid.defaults,{editable:false,singleSelect:true,limitToGrid:false,unselectedValues:[],mappingRows:[],mode:"local",textField:null,keyHandler:{up:function(e){ +},down:function(e){ +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_bbd(this); +},query:function(q,e){ +_bb9(this,q); +}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ +$.fn.combo.defaults.inputEvents.blur(e); +var _bc9=e.data.target; +var opts=$(_bc9).combotreegrid("options"); +if(opts.limitToGrid){ +_bbd(_bc9); +} +}}),filter:function(q,row){ +var opts=$(this).combotreegrid("options"); +return (row[opts.treeField]||"").toLowerCase().indexOf(q.toLowerCase())>=0; +}}); +})(jQuery); +(function($){ +function _bca(_bcb){ +var _bcc=$.data(_bcb,"tagbox"); +var opts=_bcc.options; +$(_bcb).addClass("tagbox-f").combobox($.extend({},opts,{cls:"tagbox",reversed:true,onChange:function(_bcd,_bce){ +_bcf(); +$(this).combobox("hidePanel"); +opts.onChange.call(_bcb,_bcd,_bce); +},onResizing:function(_bd0,_bd1){ +var _bd2=$(this).combobox("textbox"); +var tb=$(this).data("textbox").textbox; +var _bd3=tb.outerWidth(); +tb.css({height:"",paddingLeft:_bd2.css("marginLeft"),paddingRight:_bd2.css("marginRight")}); +_bd2.css("margin",0); +tb._outerWidth(_bd3); +_be6(_bcb); +_bd8(this); +opts.onResizing.call(_bcb,_bd0,_bd1); +},onLoadSuccess:function(data){ +_bcf(); +opts.onLoadSuccess.call(_bcb,data); +}})); +_bcf(); +_be6(_bcb); +function _bcf(){ +$(_bcb).next().find(".tagbox-label").remove(); +var _bd4=$(_bcb).tagbox("textbox"); +var ss=[]; +$.map($(_bcb).tagbox("getValues"),function(_bd5,_bd6){ +var row=opts.finder.getRow(_bcb,_bd5); +var text=opts.tagFormatter.call(_bcb,_bd5,row); +var cs={}; +var css=opts.tagStyler.call(_bcb,_bd5,row)||""; +if(typeof css=="string"){ +cs={s:css}; +}else{ +cs={c:css["class"]||"",s:css["style"]||""}; +} +var _bd7=$("").insertBefore(_bd4).html(text); +_bd7.attr("tagbox-index",_bd6); +_bd7.attr("style",cs.s).addClass(cs.c); +$("").appendTo(_bd7); +}); +_bd8(_bcb); +$(_bcb).combobox("setText",""); +}; +}; +function _bd8(_bd9,_bda){ +var span=$(_bd9).next(); +var _bdb=_bda?$(_bda):span.find(".tagbox-label"); +if(_bdb.length){ +var _bdc=$(_bd9).tagbox("textbox"); +var _bdd=$(_bdb[0]); +var _bde=_bdd.outerHeight(true)-_bdd.outerHeight(); +var _bdf=_bdc.outerHeight()-_bde*2; +_bdb.css({height:_bdf+"px",lineHeight:_bdf+"px"}); +var _be0=span.find(".textbox-addon").css("height","100%"); +_be0.find(".textbox-icon").css("height","100%"); +span.find(".textbox-button").linkbutton("resize",{height:"100%"}); +} +}; +function _be1(_be2){ +var span=$(_be2).next(); +span.unbind(".tagbox").bind("click.tagbox",function(e){ +var opts=$(_be2).tagbox("options"); +if(opts.disabled||opts.readonly){ +return; +} +if($(e.target).hasClass("tagbox-remove")){ +var _be3=parseInt($(e.target).parent().attr("tagbox-index")); +var _be4=$(_be2).tagbox("getValues"); +if(opts.onBeforeRemoveTag.call(_be2,_be4[_be3])==false){ +return; +} +opts.onRemoveTag.call(_be2,_be4[_be3]); +_be4.splice(_be3,1); +$(_be2).tagbox("setValues",_be4); +}else{ +var _be5=$(e.target).closest(".tagbox-label"); +if(_be5.length){ +var _be3=parseInt(_be5.attr("tagbox-index")); +var _be4=$(_be2).tagbox("getValues"); +opts.onClickTag.call(_be2,_be4[_be3]); +} +} +$(this).find(".textbox-text").focus(); +}).bind("keyup.tagbox",function(e){ +_be6(_be2); +}).bind("mouseover.tagbox",function(e){ +if($(e.target).closest(".textbox-button,.textbox-addon,.tagbox-label").length){ +$(this).triggerHandler("mouseleave"); +}else{ +$(this).find(".textbox-text").triggerHandler("mouseenter"); +} +}).bind("mouseleave.tagbox",function(e){ +$(this).find(".textbox-text").triggerHandler("mouseleave"); +}); +}; +function _be6(_be7){ +var opts=$(_be7).tagbox("options"); +var _be8=$(_be7).tagbox("textbox"); +var span=$(_be7).next(); +var tmp=$("").appendTo("body"); +tmp.attr("style",_be8.attr("style")); +tmp.css({position:"absolute",top:-9999,left:-9999,width:"auto",fontFamily:_be8.css("fontFamily"),fontSize:_be8.css("fontSize"),fontWeight:_be8.css("fontWeight"),whiteSpace:"nowrap"}); +var _be9=_bea(_be8.val()); +var _beb=_bea(opts.prompt||""); +tmp.remove(); +var _bec=Math.min(Math.max(_be9,_beb)+20,span.width()); +_be8._outerWidth(_bec); +span.find(".textbox-button").linkbutton("resize",{height:"100%"}); +function _bea(val){ +var s=val.replace(/&/g,"&").replace(/\s/g," ").replace(//g,">"); +tmp.html(s); +return tmp.outerWidth(); +}; +}; +function _bed(_bee){ +var t=$(_bee); +var opts=t.tagbox("options"); +if(opts.limitToList){ +var _bef=t.tagbox("panel"); +var item=_bef.children("div.combobox-item-hover"); +if(item.length){ +item.removeClass("combobox-item-hover"); +var row=opts.finder.getRow(_bee,item); +var _bf0=row[opts.valueField]; +$(_bee).tagbox(item.hasClass("combobox-item-selected")?"unselect":"select",_bf0); +} +$(_bee).tagbox("hidePanel"); +}else{ +var v=$.trim($(_bee).tagbox("getText")); +if(v!==""){ +var _bf1=$(_bee).tagbox("getValues"); +_bf1.push(v); +$(_bee).tagbox("setValues",_bf1); +} +} +}; +function _bf2(_bf3,_bf4){ +$(_bf3).combobox("setText",""); +_be6(_bf3); +$(_bf3).combobox("setValues",_bf4); +$(_bf3).combobox("setText",""); +$(_bf3).tagbox("validate"); +}; +$.fn.tagbox=function(_bf5,_bf6){ +if(typeof _bf5=="string"){ +var _bf7=$.fn.tagbox.methods[_bf5]; +if(_bf7){ +return _bf7(this,_bf6); +}else{ +return this.combobox(_bf5,_bf6); +} +} +_bf5=_bf5||{}; +return this.each(function(){ +var _bf8=$.data(this,"tagbox"); +if(_bf8){ +$.extend(_bf8.options,_bf5); +}else{ +$.data(this,"tagbox",{options:$.extend({},$.fn.tagbox.defaults,$.fn.tagbox.parseOptions(this),_bf5)}); +} +_bca(this); +_be1(this); +}); +}; +$.fn.tagbox.methods={options:function(jq){ +var _bf9=jq.combobox("options"); +return $.extend($.data(jq[0],"tagbox").options,{width:_bf9.width,height:_bf9.height,originalValue:_bf9.originalValue,disabled:_bf9.disabled,readonly:_bf9.readonly}); +},setValues:function(jq,_bfa){ +return jq.each(function(){ +_bf2(this,_bfa); +}); +},reset:function(jq){ +return jq.each(function(){ +$(this).combobox("reset").combobox("setText",""); +}); +}}; +$.fn.tagbox.parseOptions=function(_bfb){ +return $.extend({},$.fn.combobox.parseOptions(_bfb),$.parser.parseOptions(_bfb,[])); +}; +$.fn.tagbox.defaults=$.extend({},$.fn.combobox.defaults,{hasDownArrow:false,multiple:true,reversed:true,selectOnNavigation:false,tipOptions:$.extend({},$.fn.textbox.defaults.tipOptions,{showDelay:200}),val:function(_bfc){ +var vv=$(_bfc).parent().prev().tagbox("getValues"); +if($(_bfc).is(":focus")){ +vv.push($(_bfc).val()); +} +return vv.join(","); +},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ +var _bfd=e.data.target; +var opts=$(_bfd).tagbox("options"); +if(opts.limitToList){ +_bed(_bfd); +} +}}),keyHandler:$.extend({},$.fn.combobox.defaults.keyHandler,{enter:function(e){ +_bed(this); +},query:function(q,e){ +var opts=$(this).tagbox("options"); +if(opts.limitToList){ +$.fn.combobox.defaults.keyHandler.query.call(this,q,e); +}else{ +$(this).combobox("hidePanel"); +} +}}),tagFormatter:function(_bfe,row){ +var opts=$(this).tagbox("options"); +return row?row[opts.textField]:_bfe; +},tagStyler:function(_bff,row){ +return ""; +},onClickTag:function(_c00){ +},onBeforeRemoveTag:function(_c01){ +},onRemoveTag:function(_c02){ +}}); +})(jQuery); +(function($){ +function _c03(_c04){ +var _c05=$.data(_c04,"datebox"); +var opts=_c05.options; +$(_c04).addClass("datebox-f").combo($.extend({},opts,{onShowPanel:function(){ +_c06(this); +_c07(this); +_c08(this); +_c16(this,$(this).datebox("getText"),true); +opts.onShowPanel.call(this); +}})); +if(!_c05.calendar){ +var _c09=$(_c04).combo("panel").css("overflow","hidden"); +_c09.panel("options").onBeforeDestroy=function(){ +var c=$(this).find(".calendar-shared"); +if(c.length){ +c.insertBefore(c[0].pholder); +} +}; +var cc=$("
                                                                                                    ").prependTo(_c09); +if(opts.sharedCalendar){ +var c=$(opts.sharedCalendar); +if(!c[0].pholder){ +c[0].pholder=$("
                                                                                                    ").insertAfter(c); +} +c.addClass("calendar-shared").appendTo(cc); +if(!c.hasClass("calendar")){ +c.calendar(); +} +_c05.calendar=c; +}else{ +_c05.calendar=$("
                                                                                                    ").appendTo(cc).calendar(); +} +$.extend(_c05.calendar.calendar("options"),{fit:true,border:false,onSelect:function(date){ +var _c0a=this.target; +var opts=$(_c0a).datebox("options"); +opts.onSelect.call(_c0a,date); +_c16(_c0a,opts.formatter.call(_c0a,date)); +$(_c0a).combo("hidePanel"); +}}); +} +$(_c04).combo("textbox").parent().addClass("datebox"); +$(_c04).datebox("initValue",opts.value); +function _c06(_c0b){ +var opts=$(_c0b).datebox("options"); +var _c0c=$(_c0b).combo("panel"); +_c0c.unbind(".datebox").bind("click.datebox",function(e){ +if($(e.target).hasClass("datebox-button-a")){ +var _c0d=parseInt($(e.target).attr("datebox-button-index")); +opts.buttons[_c0d].handler.call(e.target,_c0b); +} +}); +}; +function _c07(_c0e){ +var _c0f=$(_c0e).combo("panel"); +if(_c0f.children("div.datebox-button").length){ +return; +} +var _c10=$("
                                                                                                    ").appendTo(_c0f); +var tr=_c10.find("tr"); +for(var i=0;i").appendTo(tr); +var btn=opts.buttons[i]; +var t=$("").html($.isFunction(btn.text)?btn.text(_c0e):btn.text).appendTo(td); +t.attr("datebox-button-index",i); +} +tr.find("td").css("width",(100/opts.buttons.length)+"%"); +}; +function _c08(_c11){ +var _c12=$(_c11).combo("panel"); +var cc=_c12.children("div.datebox-calendar-inner"); +_c12.children()._outerWidth(_c12.width()); +_c05.calendar.appendTo(cc); +_c05.calendar[0].target=_c11; +if(opts.panelHeight!="auto"){ +var _c13=_c12.height(); +_c12.children().not(cc).each(function(){ +_c13-=$(this).outerHeight(); +}); +cc._outerHeight(_c13); +} +_c05.calendar.calendar("resize"); +}; +}; +function _c14(_c15,q){ +_c16(_c15,q,true); +}; +function _c17(_c18){ +var _c19=$.data(_c18,"datebox"); +var opts=_c19.options; +var _c1a=_c19.calendar.calendar("options").current; +if(_c1a){ +_c16(_c18,opts.formatter.call(_c18,_c1a)); +$(_c18).combo("hidePanel"); +} +}; +function _c16(_c1b,_c1c,_c1d){ +var _c1e=$.data(_c1b,"datebox"); +var opts=_c1e.options; +var _c1f=_c1e.calendar; +_c1f.calendar("moveTo",opts.parser.call(_c1b,_c1c)); +if(_c1d){ +$(_c1b).combo("setValue",_c1c); +}else{ +if(_c1c){ +_c1c=opts.formatter.call(_c1b,_c1f.calendar("options").current); +} +$(_c1b).combo("setText",_c1c).combo("setValue",_c1c); +} +}; +$.fn.datebox=function(_c20,_c21){ +if(typeof _c20=="string"){ +var _c22=$.fn.datebox.methods[_c20]; +if(_c22){ +return _c22(this,_c21); +}else{ +return this.combo(_c20,_c21); +} +} +_c20=_c20||{}; +return this.each(function(){ +var _c23=$.data(this,"datebox"); +if(_c23){ +$.extend(_c23.options,_c20); +}else{ +$.data(this,"datebox",{options:$.extend({},$.fn.datebox.defaults,$.fn.datebox.parseOptions(this),_c20)}); +} +_c03(this); +}); +}; +$.fn.datebox.methods={options:function(jq){ +var _c24=jq.combo("options"); +return $.extend($.data(jq[0],"datebox").options,{width:_c24.width,height:_c24.height,originalValue:_c24.originalValue,disabled:_c24.disabled,readonly:_c24.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).combo("cloneFrom",from); +$.data(this,"datebox",{options:$.extend(true,{},$(from).datebox("options")),calendar:$(from).datebox("calendar")}); +$(this).addClass("datebox-f"); +}); +},calendar:function(jq){ +return $.data(jq[0],"datebox").calendar; +},initValue:function(jq,_c25){ +return jq.each(function(){ +var opts=$(this).datebox("options"); +var _c26=opts.value; +if(_c26){ +_c26=opts.formatter.call(this,opts.parser.call(this,_c26)); +} +$(this).combo("initValue",_c26).combo("setText",_c26); +}); +},setValue:function(jq,_c27){ +return jq.each(function(){ +_c16(this,_c27); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).datebox("options"); +$(this).datebox("setValue",opts.originalValue); +}); +}}; +$.fn.datebox.parseOptions=function(_c28){ +return $.extend({},$.fn.combo.parseOptions(_c28),$.parser.parseOptions(_c28,["sharedCalendar"])); +}; +$.fn.datebox.defaults=$.extend({},$.fn.combo.defaults,{panelWidth:250,panelHeight:"auto",sharedCalendar:null,keyHandler:{up:function(e){ +},down:function(e){ +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_c17(this); +},query:function(q,e){ +_c14(this,q); +}},currentText:"Today",closeText:"Close",okText:"Ok",buttons:[{text:function(_c29){ +return $(_c29).datebox("options").currentText; +},handler:function(_c2a){ +var opts=$(_c2a).datebox("options"); +var now=new Date(); +var _c2b=new Date(now.getFullYear(),now.getMonth(),now.getDate()); +$(_c2a).datebox("calendar").calendar({year:_c2b.getFullYear(),month:_c2b.getMonth()+1,current:_c2b}); +opts.onSelect.call(_c2a,_c2b); +_c17(_c2a); +}},{text:function(_c2c){ +return $(_c2c).datebox("options").closeText; +},handler:function(_c2d){ +$(this).closest("div.combo-panel").panel("close"); +}}],formatter:function(date){ +var y=date.getFullYear(); +var m=date.getMonth()+1; +var d=date.getDate(); +return (m<10?("0"+m):m)+"/"+(d<10?("0"+d):d)+"/"+y; +},parser:function(s){ +if(!s){ +return new Date(); +} +var ss=s.split("/"); +var m=parseInt(ss[0],10); +var d=parseInt(ss[1],10); +var y=parseInt(ss[2],10); +if(!isNaN(y)&&!isNaN(m)&&!isNaN(d)){ +return new Date(y,m-1,d); +}else{ +return new Date(); +} +},onSelect:function(date){ +}}); +})(jQuery); +(function($){ +function _c2e(_c2f){ +var _c30=$.data(_c2f,"datetimebox"); +var opts=_c30.options; +$(_c2f).datebox($.extend({},opts,{onShowPanel:function(){ +var _c31=$(this).datetimebox("getValue"); +_c37(this,_c31,true); +opts.onShowPanel.call(this); +},formatter:$.fn.datebox.defaults.formatter,parser:$.fn.datebox.defaults.parser})); +$(_c2f).removeClass("datebox-f").addClass("datetimebox-f"); +$(_c2f).datebox("calendar").calendar({onSelect:function(date){ +opts.onSelect.call(this.target,date); +}}); +if(!_c30.spinner){ +var _c32=$(_c2f).datebox("panel"); +var p=$("
                                                                                                    ").insertAfter(_c32.children("div.datebox-calendar-inner")); +_c30.spinner=p.children("input"); +} +_c30.spinner.timespinner({width:opts.spinnerWidth,showSeconds:opts.showSeconds,separator:opts.timeSeparator}); +$(_c2f).datetimebox("initValue",opts.value); +}; +function _c33(_c34){ +var c=$(_c34).datetimebox("calendar"); +var t=$(_c34).datetimebox("spinner"); +var date=c.calendar("options").current; +return new Date(date.getFullYear(),date.getMonth(),date.getDate(),t.timespinner("getHours"),t.timespinner("getMinutes"),t.timespinner("getSeconds")); +}; +function _c35(_c36,q){ +_c37(_c36,q,true); +}; +function _c38(_c39){ +var opts=$.data(_c39,"datetimebox").options; +var date=_c33(_c39); +_c37(_c39,opts.formatter.call(_c39,date)); +$(_c39).combo("hidePanel"); +}; +function _c37(_c3a,_c3b,_c3c){ +var opts=$.data(_c3a,"datetimebox").options; +$(_c3a).combo("setValue",_c3b); +if(!_c3c){ +if(_c3b){ +var date=opts.parser.call(_c3a,_c3b); +$(_c3a).combo("setText",opts.formatter.call(_c3a,date)); +$(_c3a).combo("setValue",opts.formatter.call(_c3a,date)); +}else{ +$(_c3a).combo("setText",_c3b); +} +} +var date=opts.parser.call(_c3a,_c3b); +$(_c3a).datetimebox("calendar").calendar("moveTo",date); +$(_c3a).datetimebox("spinner").timespinner("setValue",_c3d(date)); +function _c3d(date){ +function _c3e(_c3f){ +return (_c3f<10?"0":"")+_c3f; +}; +var tt=[_c3e(date.getHours()),_c3e(date.getMinutes())]; +if(opts.showSeconds){ +tt.push(_c3e(date.getSeconds())); +} +return tt.join($(_c3a).datetimebox("spinner").timespinner("options").separator); +}; +}; +$.fn.datetimebox=function(_c40,_c41){ +if(typeof _c40=="string"){ +var _c42=$.fn.datetimebox.methods[_c40]; +if(_c42){ +return _c42(this,_c41); +}else{ +return this.datebox(_c40,_c41); +} +} +_c40=_c40||{}; +return this.each(function(){ +var _c43=$.data(this,"datetimebox"); +if(_c43){ +$.extend(_c43.options,_c40); +}else{ +$.data(this,"datetimebox",{options:$.extend({},$.fn.datetimebox.defaults,$.fn.datetimebox.parseOptions(this),_c40)}); +} +_c2e(this); +}); +}; +$.fn.datetimebox.methods={options:function(jq){ +var _c44=jq.datebox("options"); +return $.extend($.data(jq[0],"datetimebox").options,{originalValue:_c44.originalValue,disabled:_c44.disabled,readonly:_c44.readonly}); +},cloneFrom:function(jq,from){ +return jq.each(function(){ +$(this).datebox("cloneFrom",from); +$.data(this,"datetimebox",{options:$.extend(true,{},$(from).datetimebox("options")),spinner:$(from).datetimebox("spinner")}); +$(this).removeClass("datebox-f").addClass("datetimebox-f"); +}); +},spinner:function(jq){ +return $.data(jq[0],"datetimebox").spinner; +},initValue:function(jq,_c45){ +return jq.each(function(){ +var opts=$(this).datetimebox("options"); +var _c46=opts.value; +if(_c46){ +_c46=opts.formatter.call(this,opts.parser.call(this,_c46)); +} +$(this).combo("initValue",_c46).combo("setText",_c46); +}); +},setValue:function(jq,_c47){ +return jq.each(function(){ +_c37(this,_c47); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).datetimebox("options"); +$(this).datetimebox("setValue",opts.originalValue); +}); +}}; +$.fn.datetimebox.parseOptions=function(_c48){ +var t=$(_c48); +return $.extend({},$.fn.datebox.parseOptions(_c48),$.parser.parseOptions(_c48,["timeSeparator","spinnerWidth",{showSeconds:"boolean"}])); +}; +$.fn.datetimebox.defaults=$.extend({},$.fn.datebox.defaults,{spinnerWidth:"100%",showSeconds:true,timeSeparator:":",panelEvents:{mousedown:function(e){ +}},keyHandler:{up:function(e){ +},down:function(e){ +},left:function(e){ +},right:function(e){ +},enter:function(e){ +_c38(this); +},query:function(q,e){ +_c35(this,q); +}},buttons:[{text:function(_c49){ +return $(_c49).datetimebox("options").currentText; +},handler:function(_c4a){ +var opts=$(_c4a).datetimebox("options"); +_c37(_c4a,opts.formatter.call(_c4a,new Date())); +$(_c4a).datetimebox("hidePanel"); +}},{text:function(_c4b){ +return $(_c4b).datetimebox("options").okText; +},handler:function(_c4c){ +_c38(_c4c); +}},{text:function(_c4d){ +return $(_c4d).datetimebox("options").closeText; +},handler:function(_c4e){ +$(_c4e).datetimebox("hidePanel"); +}}],formatter:function(date){ +var h=date.getHours(); +var M=date.getMinutes(); +var s=date.getSeconds(); +function _c4f(_c50){ +return (_c50<10?"0":"")+_c50; +}; +var _c51=$(this).datetimebox("spinner").timespinner("options").separator; +var r=$.fn.datebox.defaults.formatter(date)+" "+_c4f(h)+_c51+_c4f(M); +if($(this).datetimebox("options").showSeconds){ +r+=_c51+_c4f(s); +} +return r; +},parser:function(s){ +if($.trim(s)==""){ +return new Date(); +} +var dt=s.split(" "); +var d=$.fn.datebox.defaults.parser(dt[0]); +if(dt.length<2){ +return d; +} +var _c52=$(this).datetimebox("spinner").timespinner("options").separator; +var tt=dt[1].split(_c52); +var hour=parseInt(tt[0],10)||0; +var _c53=parseInt(tt[1],10)||0; +var _c54=parseInt(tt[2],10)||0; +return new Date(d.getFullYear(),d.getMonth(),d.getDate(),hour,_c53,_c54); +}}); +})(jQuery); +(function($){ +function init(_c55){ +var _c56=$("
                                                                                                    "+"
                                                                                                    "+""+""+"
                                                                                                    "+"
                                                                                                    "+"
                                                                                                    "+"
                                                                                                    "+""+"
                                                                                                    ").insertAfter(_c55); +var t=$(_c55); +t.addClass("slider-f").hide(); +var name=t.attr("name"); +if(name){ +_c56.find("input.slider-value").attr("name",name); +t.removeAttr("name").attr("sliderName",name); +} +_c56.bind("_resize",function(e,_c57){ +if($(this).hasClass("easyui-fluid")||_c57){ +_c58(_c55); +} +return false; +}); +return _c56; +}; +function _c58(_c59,_c5a){ +var _c5b=$.data(_c59,"slider"); +var opts=_c5b.options; +var _c5c=_c5b.slider; +if(_c5a){ +if(_c5a.width){ +opts.width=_c5a.width; +} +if(_c5a.height){ +opts.height=_c5a.height; +} +} +_c5c._size(opts); +if(opts.mode=="h"){ +_c5c.css("height",""); +_c5c.children("div").css("height",""); +}else{ +_c5c.css("width",""); +_c5c.children("div").css("width",""); +_c5c.children("div.slider-rule,div.slider-rulelabel,div.slider-inner")._outerHeight(_c5c._outerHeight()); +} +_c5d(_c59); +}; +function _c5e(_c5f){ +var _c60=$.data(_c5f,"slider"); +var opts=_c60.options; +var _c61=_c60.slider; +var aa=opts.mode=="h"?opts.rule:opts.rule.slice(0).reverse(); +if(opts.reversed){ +aa=aa.slice(0).reverse(); +} +_c62(aa); +function _c62(aa){ +var rule=_c61.find("div.slider-rule"); +var _c63=_c61.find("div.slider-rulelabel"); +rule.empty(); +_c63.empty(); +for(var i=0;i").appendTo(rule); +span.css((opts.mode=="h"?"left":"top"),_c64); +if(aa[i]!="|"){ +span=$("").appendTo(_c63); +span.html(aa[i]); +if(opts.mode=="h"){ +span.css({left:_c64,marginLeft:-Math.round(span.outerWidth()/2)}); +}else{ +span.css({top:_c64,marginTop:-Math.round(span.outerHeight()/2)}); +} +} +} +}; +}; +function _c65(_c66){ +var _c67=$.data(_c66,"slider"); +var opts=_c67.options; +var _c68=_c67.slider; +_c68.removeClass("slider-h slider-v slider-disabled"); +_c68.addClass(opts.mode=="h"?"slider-h":"slider-v"); +_c68.addClass(opts.disabled?"slider-disabled":""); +var _c69=_c68.find(".slider-inner"); +_c69.html(""+""); +if(opts.range){ +_c69.append(""+""); +} +_c68.find("a.slider-handle").draggable({axis:opts.mode,cursor:"pointer",disabled:opts.disabled,onDrag:function(e){ +var left=e.data.left; +var _c6a=_c68.width(); +if(opts.mode!="h"){ +left=e.data.top; +_c6a=_c68.height(); +} +if(left<0||left>_c6a){ +return false; +}else{ +_c6b(left,this); +return false; +} +},onStartDrag:function(){ +_c67.isDragging=true; +opts.onSlideStart.call(_c66,opts.value); +},onStopDrag:function(e){ +_c6b(opts.mode=="h"?e.data.left:e.data.top,this); +opts.onSlideEnd.call(_c66,opts.value); +opts.onComplete.call(_c66,opts.value); +_c67.isDragging=false; +}}); +_c68.find("div.slider-inner").unbind(".slider").bind("mousedown.slider",function(e){ +if(_c67.isDragging||opts.disabled){ +return; +} +var pos=$(this).offset(); +_c6b(opts.mode=="h"?(e.pageX-pos.left):(e.pageY-pos.top)); +opts.onComplete.call(_c66,opts.value); +}); +function _c6c(_c6d){ +var dd=String(opts.step).split("."); +var dlen=dd.length>1?dd[1].length:0; +return parseFloat(_c6d.toFixed(dlen)); +}; +function _c6b(pos,_c6e){ +var _c6f=_c70(_c66,pos); +var s=Math.abs(_c6f%opts.step); +if(s0; +if(_c6f<=v2&&_c71){ +v1=_c6f; +}else{ +if(_c6f>=v1&&(!_c71)){ +v2=_c6f; +} +} +}else{ +if(_c6fv2){ +v2=_c6f; +}else{ +_c6fopts.max){ +_c79=opts.max; +} +var _c7a=$("").appendTo(_c76); +_c7a.attr("name",name); +_c7a.val(_c79); +_c78.push(_c79); +var _c7b=_c76.find(".slider-handle:eq("+i+")"); +var tip=_c7b.next(); +var pos=_c7c(_c73,_c79); +if(opts.showTip){ +tip.show(); +tip.html(opts.tipFormatter.call(_c73,_c79)); +}else{ +tip.hide(); +} +if(opts.mode=="h"){ +var _c7d="left:"+pos+"px;"; +_c7b.attr("style",_c7d); +tip.attr("style",_c7d+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px"); +}else{ +var _c7d="top:"+pos+"px;"; +_c7b.attr("style",_c7d); +tip.attr("style",_c7d+"margin-left:"+(-Math.round(tip.outerWidth()))+"px"); +} +} +opts.value=opts.range?_c78:_c78[0]; +$(_c73).val(opts.range?_c78.join(opts.separator):_c78[0]); +if(_c77.join(",")!=_c78.join(",")){ +opts.onChange.call(_c73,opts.value,(opts.range?_c77:_c77[0])); +} +}; +function _c5d(_c7e){ +var opts=$.data(_c7e,"slider").options; +var fn=opts.onChange; +opts.onChange=function(){ +}; +_c72(_c7e,opts.value); +opts.onChange=fn; +}; +function _c7c(_c7f,_c80){ +var _c81=$.data(_c7f,"slider"); +var opts=_c81.options; +var _c82=_c81.slider; +var size=opts.mode=="h"?_c82.width():_c82.height(); +var pos=opts.converter.toPosition.call(_c7f,_c80,size); +if(opts.mode=="v"){ +pos=_c82.height()-pos; +} +if(opts.reversed){ +pos=size-pos; +} +return pos; +}; +function _c70(_c83,pos){ +var _c84=$.data(_c83,"slider"); +var opts=_c84.options; +var _c85=_c84.slider; +var size=opts.mode=="h"?_c85.width():_c85.height(); +var pos=opts.mode=="h"?(opts.reversed?(size-pos):pos):(opts.reversed?pos:(size-pos)); +var _c86=opts.converter.toValue.call(_c83,pos,size); +return _c86; +}; +$.fn.slider=function(_c87,_c88){ +if(typeof _c87=="string"){ +return $.fn.slider.methods[_c87](this,_c88); +} +_c87=_c87||{}; +return this.each(function(){ +var _c89=$.data(this,"slider"); +if(_c89){ +$.extend(_c89.options,_c87); +}else{ +_c89=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_c87),slider:init(this)}); +$(this)._propAttr("disabled",false); +} +var opts=_c89.options; +opts.min=parseFloat(opts.min); +opts.max=parseFloat(opts.max); +if(opts.range){ +if(!$.isArray(opts.value)){ +opts.value=$.map(String(opts.value).split(opts.separator),function(v){ +return parseFloat(v); +}); +} +if(opts.value.length<2){ +opts.value.push(opts.max); +} +}else{ +opts.value=parseFloat(opts.value); +} +opts.step=parseFloat(opts.step); +opts.originalValue=opts.value; +_c65(this); +_c5e(this); +_c58(this); +}); +}; +$.fn.slider.methods={options:function(jq){ +return $.data(jq[0],"slider").options; +},destroy:function(jq){ +return jq.each(function(){ +$.data(this,"slider").slider.remove(); +$(this).remove(); +}); +},resize:function(jq,_c8a){ +return jq.each(function(){ +_c58(this,_c8a); +}); +},getValue:function(jq){ +return jq.slider("options").value; +},getValues:function(jq){ +return jq.slider("options").value; +},setValue:function(jq,_c8b){ +return jq.each(function(){ +_c72(this,[_c8b]); +}); +},setValues:function(jq,_c8c){ +return jq.each(function(){ +_c72(this,_c8c); +}); +},clear:function(jq){ +return jq.each(function(){ +var opts=$(this).slider("options"); +_c72(this,opts.range?[opts.min,opts.max]:[opts.min]); +}); +},reset:function(jq){ +return jq.each(function(){ +var opts=$(this).slider("options"); +$(this).slider(opts.range?"setValues":"setValue",opts.originalValue); +}); +},enable:function(jq){ +return jq.each(function(){ +$.data(this,"slider").options.disabled=false; +_c65(this); +}); +},disable:function(jq){ +return jq.each(function(){ +$.data(this,"slider").options.disabled=true; +_c65(this); +}); +}}; +$.fn.slider.parseOptions=function(_c8d){ +var t=$(_c8d); +return $.extend({},$.parser.parseOptions(_c8d,["width","height","mode",{reversed:"boolean",showTip:"boolean",range:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)}); +}; +$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,range:false,value:0,separator:",",min:0,max:100,step:1,rule:[],tipFormatter:function(_c8e){ +return _c8e; +},converter:{toPosition:function(_c8f,size){ +var opts=$(this).slider("options"); +var p=(_c8f-opts.min)/(opts.max-opts.min)*size; +return p; +},toValue:function(pos,size){ +var opts=$(this).slider("options"); +var v=opts.min+(opts.max-opts.min)*(pos/size); +return v; +}},onChange:function(_c90,_c91){ +},onSlideStart:function(_c92){ +},onSlideEnd:function(_c93){ +},onComplete:function(_c94){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.easyui.mobile.js b/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.easyui.mobile.js new file mode 100644 index 000000000..e76d4c028 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.easyui.mobile.js @@ -0,0 +1,141 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +$.fn.navpanel=function(_1,_2){ +if(typeof _1=="string"){ +var _3=$.fn.navpanel.methods[_1]; +return _3?_3(this,_2):this.panel(_1,_2); +}else{ +_1=_1||{}; +return this.each(function(){ +var _4=$.data(this,"navpanel"); +if(_4){ +$.extend(_4.options,_1); +}else{ +_4=$.data(this,"navpanel",{options:$.extend({},$.fn.navpanel.defaults,$.fn.navpanel.parseOptions(this),_1)}); +} +$(this).panel(_4.options); +}); +} +}; +$.fn.navpanel.methods={options:function(jq){ +return $.data(jq[0],"navpanel").options; +}}; +$.fn.navpanel.parseOptions=function(_5){ +return $.extend({},$.fn.panel.parseOptions(_5),$.parser.parseOptions(_5,[])); +}; +$.fn.navpanel.defaults=$.extend({},$.fn.panel.defaults,{fit:true,border:false,cls:"navpanel"}); +$.parser.plugins.push("navpanel"); +})(jQuery); +(function($){ +$(function(){ +$.mobile.init(); +}); +$.mobile={defaults:{animation:"slide",direction:"left",reverseDirections:{up:"down",down:"up",left:"right",right:"left"}},panels:[],init:function(_6){ +$.mobile.panels=[]; +var _7=$(_6||"body").children(".navpanel:visible"); +if(_7.length){ +_7.not(":first").children(".panel-body").navpanel("close"); +var p=_7.eq(0).children(".panel-body"); +$.mobile.panels.push({panel:p,animation:$.mobile.defaults.animation,direction:$.mobile.defaults.direction}); +} +$(document).unbind(".mobile").bind("click.mobile",function(e){ +var a=$(e.target).closest("a"); +if(a.length){ +var _8=$.parser.parseOptions(a[0],["animation","direction",{back:"boolean"}]); +if(_8.back){ +$.mobile.back(); +e.preventDefault(); +}else{ +var _9=$.trim(a.attr("href")); +if(/^#/.test(_9)){ +var to=$(_9); +if(to.length&&to.hasClass("panel-body")){ +$.mobile.go(to,_8.animation,_8.direction); +e.preventDefault(); +} +} +} +} +}); +$(window).unbind(".mobile").bind("hashchange.mobile",function(){ +var _a=$.mobile.panels.length; +if(_a>1){ +var _b=location.hash; +var p=$.mobile.panels[_a-2]; +if(!_b||_b=="#&"+p.panel.attr("id")){ +$.mobile._back(); +} +} +}); +},nav:function(_c,to,_d,_e){ +if(window.WebKitAnimationEvent){ +_d=_d!=undefined?_d:$.mobile.defaults.animation; +_e=_e!=undefined?_e:$.mobile.defaults.direction; +var _f="m-"+_d+(_e?"-"+_e:""); +var p1=$(_c).panel("open").panel("resize").panel("panel"); +var p2=$(to).panel("open").panel("resize").panel("panel"); +p1.add(p2).bind("webkitAnimationEnd",function(){ +$(this).unbind("webkitAnimationEnd"); +var p=$(this).children(".panel-body"); +if($(this).hasClass("m-in")){ +p.panel("open").panel("resize"); +}else{ +p.panel("close"); +} +$(this).removeClass(_f+" m-in m-out"); +}); +p2.addClass(_f+" m-in"); +p1.addClass(_f+" m-out"); +}else{ +$(to).panel("open").panel("resize"); +$(_c).panel("close"); +} +},_go:function(_10,_11,_12){ +_11=_11!=undefined?_11:$.mobile.defaults.animation; +_12=_12!=undefined?_12:$.mobile.defaults.direction; +var _13=$.mobile.panels[$.mobile.panels.length-1].panel; +var to=$(_10); +if(_13[0]!=to[0]){ +$.mobile.nav(_13,to,_11,_12); +$.mobile.panels.push({panel:to,animation:_11,direction:_12}); +} +},_back:function(){ +if($.mobile.panels.length<2){ +return; +} +var p1=$.mobile.panels.pop(); +var p2=$.mobile.panels[$.mobile.panels.length-1]; +var _14=p1.animation; +var _15=$.mobile.defaults.reverseDirections[p1.direction]||""; +$.mobile.nav(p1.panel,p2.panel,_14,_15); +},go:function(_16,_17,_18){ +_17=_17!=undefined?_17:$.mobile.defaults.animation; +_18=_18!=undefined?_18:$.mobile.defaults.direction; +location.hash="#&"+$(_16).attr("id"); +$.mobile._go(_16,_17,_18); +},back:function(){ +history.go(-1); +}}; +$.map(["validatebox","textbox","passwordbox","filebox","searchbox","combo","combobox","combogrid","combotree","combotreegrid","datebox","datetimebox","numberbox","spinner","numberspinner","timespinner","datetimespinner"],function(_19){ +if($.fn[_19]){ +$.extend($.fn[_19].defaults,{iconWidth:28,tipPosition:"bottom"}); +} +}); +$.map(["spinner","numberspinner","timespinner","datetimespinner"],function(_1a){ +if($.fn[_1a]){ +$.extend($.fn[_1a].defaults,{iconWidth:56,spinAlign:"horizontal"}); +} +}); +if($.fn.menu){ +$.extend($.fn.menu.defaults,{itemHeight:30,noline:true}); +} +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.min.js b/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.min.js new file mode 100644 index 000000000..e83647587 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; +}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
                                                                                                    a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
                                                                                                    ","
                                                                                                    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
                                                                                                    "],tr:[2,"","
                                                                                                    "],col:[2,"","
                                                                                                    "],td:[3,"","
                                                                                                    "],_default:l.htmlSerialize?[0,"",""]:[1,"X
                                                                                                    ","
                                                                                                    "]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("").appendTo("body"); +_e.attr("src",window.ActiveXObject?"javascript:false":"about:blank"); +_e.css({position:"absolute",top:-1000,left:-1000}); +_e.bind("load",cb); +_f(_b); +function _f(_10){ +var _11=$(_a); +if(_c.url){ +_11.attr("action",_c.url); +} +var t=_11.attr("target"),a=_11.attr("action"); +_11.attr("target",_d); +var _12=$(); +try{ +for(var n in _10){ +var _13=$("").val(_10[n]).appendTo(_11); +_12=_12.add(_13); +} +_14(); +_11[0].submit(); +} +finally{ +_11.attr("action",a); +t?_11.attr("target",t):_11.removeAttr("target"); +_12.remove(); +} +}; +function _14(){ +var f=$("#"+_d); +if(!f.length){ +return; +} +try{ +var s=f.contents()[0].readyState; +if(s&&s.toLowerCase()=="uninitialized"){ +setTimeout(_14,100); +} +} +catch(e){ +cb(); +} +}; +var _15=10; +function cb(){ +var f=$("#"+_d); +if(!f.length){ +return; +} +f.unbind(); +var _16=""; +try{ +var _17=f.contents().find("body"); +_16=_17.html(); +if(_16==""){ +if(--_15){ +setTimeout(cb,100); +return; +} +} +var ta=_17.find(">textarea"); +if(ta.length){ +_16=ta.val(); +}else{ +var pre=_17.find(">pre"); +if(pre.length){ +_16=pre.html(); +} +} +} +catch(e){ +} +_c.success.call(_a,_16); +setTimeout(function(){ +f.unbind(); +f.remove(); +},100); +}; +}; +function _9(_18,_19){ +var _1a=$.data(_18,"form").options; +var _1b=new FormData($(_18)[0]); +for(var _1c in _19){ +_1b.append(_1c,_19[_1c]); +} +$.ajax({url:_1a.url,type:"post",xhr:function(){ +var xhr=$.ajaxSettings.xhr(); +if(xhr.upload){ +xhr.upload.addEventListener("progress",function(e){ +if(e.lengthComputable){ +var _1d=e.total; +var _1e=e.loaded||e.position; +var _1f=Math.ceil(_1e*100/_1d); +_1a.onProgress.call(_18,_1f); +} +},false); +} +return xhr; +},data:_1b,dataType:"html",cache:false,contentType:false,processData:false,complete:function(res){ +_1a.success.call(_18,res.responseText); +}}); +}; +function _20(_21,_22){ +var _23=$.data(_21,"form").options; +if(typeof _22=="string"){ +var _24={}; +if(_23.onBeforeLoad.call(_21,_24)==false){ +return; +} +$.ajax({url:_22,data:_24,dataType:"json",success:function(_25){ +_26(_25); +},error:function(){ +_23.onLoadError.apply(_21,arguments); +}}); +}else{ +_26(_22); +} +function _26(_27){ +var _28=$(_21); +for(var _29 in _27){ +var val=_27[_29]; +if(!_2a(_29,val)){ +if(!_2b(_29,val)){ +_28.find("input[name=\""+_29+"\"]").val(val); +_28.find("textarea[name=\""+_29+"\"]").val(val); +_28.find("select[name=\""+_29+"\"]").val(val); +} +} +} +_23.onLoadSuccess.call(_21,_27); +_28.form("validate"); +}; +function _2a(_2c,val){ +var cc=$(_21).find("[switchbuttonName=\""+_2c+"\"]"); +if(cc.length){ +cc.switchbutton("uncheck"); +cc.each(function(){ +if(_2d($(this).switchbutton("options").value,val)){ +$(this).switchbutton("check"); +} +}); +return true; +} +cc=$(_21).find("input[name=\""+_2c+"\"][type=radio], input[name=\""+_2c+"\"][type=checkbox]"); +if(cc.length){ +cc._propAttr("checked",false); +cc.each(function(){ +if(_2d($(this).val(),val)){ +$(this)._propAttr("checked",true); +} +}); +return true; +} +return false; +}; +function _2d(v,val){ +if(v==String(val)||$.inArray(v,$.isArray(val)?val:[val])>=0){ +return true; +}else{ +return false; +} +}; +function _2b(_2e,val){ +var _2f=$(_21).find("[textboxName=\""+_2e+"\"],[sliderName=\""+_2e+"\"]"); +if(_2f.length){ +for(var i=0;i<_23.fieldTypes.length;i++){ +var _30=_23.fieldTypes[i]; +var _31=_2f.data(_30); +if(_31){ +if(_31.options.multiple||_31.options.range){ +_2f[_30]("setValues",val); +}else{ +_2f[_30]("setValue",val); +} +return true; +} +} +} +return false; +}; +}; +function _32(_33){ +$("input,select,textarea",_33).each(function(){ +if($(this).hasClass("textbox-value")){ +return; +} +var t=this.type,tag=this.tagName.toLowerCase(); +if(t=="text"||t=="hidden"||t=="password"||tag=="textarea"){ +this.value=""; +}else{ +if(t=="file"){ +var _34=$(this); +if(!_34.hasClass("textbox-value")){ +var _35=_34.clone().val(""); +_35.insertAfter(_34); +if(_34.data("validatebox")){ +_34.validatebox("destroy"); +_35.validatebox(); +}else{ +_34.remove(); +} +} +}else{ +if(t=="checkbox"||t=="radio"){ +this.checked=false; +}else{ +if(tag=="select"){ +this.selectedIndex=-1; +} +} +} +} +}); +var tmp=$(); +var _36=$(_33); +var _37=$.data(_33,"form").options; +for(var i=0;i<_37.fieldTypes.length;i++){ +var _38=_37.fieldTypes[i]; +var _39=_36.find("."+_38+"-f").not(tmp); +if(_39.length&&_39[_38]){ +_39[_38]("clear"); +tmp=tmp.add(_39); +} +} +_36.form("validate"); +}; +function _3a(_3b){ +_3b.reset(); +var _3c=$(_3b); +var _3d=$.data(_3b,"form").options; +for(var i=_3d.fieldTypes.length-1;i>=0;i--){ +var _3e=_3d.fieldTypes[i]; +var _3f=_3c.find("."+_3e+"-f"); +if(_3f.length&&_3f[_3e]){ +_3f[_3e]("reset"); +} +} +_3c.form("validate"); +}; +function _40(_41){ +var _42=$.data(_41,"form").options; +$(_41).unbind(".form"); +if(_42.ajax){ +$(_41).bind("submit.form",function(){ +setTimeout(function(){ +_1(_41,_42); +},0); +return false; +}); +} +$(_41).bind("_change.form",function(e,t){ +if($.inArray(t,_42.dirtyFields)==-1){ +_42.dirtyFields.push(t); +} +_42.onChange.call(this,t); +}).bind("change.form",function(e){ +var t=e.target; +if(!$(t).hasClass("textbox-text")){ +if($.inArray(t,_42.dirtyFields)==-1){ +_42.dirtyFields.push(t); +} +_42.onChange.call(this,t); +} +}); +_43(_41,_42.novalidate); +}; +function _44(_45,_46){ +_46=_46||{}; +var _47=$.data(_45,"form"); +if(_47){ +$.extend(_47.options,_46); +}else{ +$.data(_45,"form",{options:$.extend({},$.fn.form.defaults,$.fn.form.parseOptions(_45),_46)}); +} +}; +function _48(_49){ +if($.fn.validatebox){ +var t=$(_49); +t.find(".validatebox-text:not(:disabled)").validatebox("validate"); +var _4a=t.find(".validatebox-invalid"); +_4a.filter(":not(:disabled):first").focus(); +return _4a.length==0; +} +return true; +}; +function _43(_4b,_4c){ +var _4d=$.data(_4b,"form").options; +_4d.novalidate=_4c; +$(_4b).find(".validatebox-text:not(:disabled)").validatebox(_4c?"disableValidation":"enableValidation"); +}; +$.fn.form=function(_4e,_4f){ +if(typeof _4e=="string"){ +this.each(function(){ +_44(this); +}); +return $.fn.form.methods[_4e](this,_4f); +} +return this.each(function(){ +_44(this,_4e); +_40(this); +}); +}; +$.fn.form.methods={options:function(jq){ +return $.data(jq[0],"form").options; +},submit:function(jq,_50){ +return jq.each(function(){ +_1(this,_50); +}); +},load:function(jq,_51){ +return jq.each(function(){ +_20(this,_51); +}); +},clear:function(jq){ +return jq.each(function(){ +_32(this); +}); +},reset:function(jq){ +return jq.each(function(){ +_3a(this); +}); +},validate:function(jq){ +return _48(jq[0]); +},disableValidation:function(jq){ +return jq.each(function(){ +_43(this,true); +}); +},enableValidation:function(jq){ +return jq.each(function(){ +_43(this,false); +}); +},resetValidation:function(jq){ +return jq.each(function(){ +$(this).find(".validatebox-text:not(:disabled)").validatebox("resetValidation"); +}); +},resetDirty:function(jq){ +return jq.each(function(){ +$(this).form("options").dirtyFields=[]; +}); +}}; +$.fn.form.parseOptions=function(_52){ +var t=$(_52); +return $.extend({},$.parser.parseOptions(_52,[{ajax:"boolean",dirty:"boolean"}]),{url:(t.attr("action")?t.attr("action"):undefined)}); +}; +$.fn.form.defaults={fieldTypes:["tagbox","combobox","combotree","combogrid","combotreegrid","datetimebox","datebox","combo","datetimespinner","timespinner","numberspinner","spinner","slider","searchbox","numberbox","passwordbox","filebox","textbox","switchbutton"],novalidate:false,ajax:true,iframe:true,dirty:false,dirtyFields:[],url:null,queryParams:{},onSubmit:function(_53){ +return $(this).form("validate"); +},onProgress:function(_54){ +},success:function(_55){ +},onBeforeLoad:function(_56){ +},onLoadSuccess:function(_57){ +},onLoadError:function(){ +},onChange:function(_58){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.layout.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.layout.js new file mode 100755 index 000000000..0acc557b0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.layout.js @@ -0,0 +1,519 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +var _1=false; +function _2(_3,_4){ +var _5=$.data(_3,"layout"); +var _6=_5.options; +var _7=_5.panels; +var cc=$(_3); +if(_4){ +$.extend(_6,{width:_4.width,height:_4.height}); +} +if(_3.tagName.toLowerCase()=="body"){ +cc._size("fit"); +}else{ +cc._size(_6); +} +var _8={top:0,left:0,width:cc.width(),height:cc.height()}; +_9(_a(_7.expandNorth)?_7.expandNorth:_7.north,"n"); +_9(_a(_7.expandSouth)?_7.expandSouth:_7.south,"s"); +_b(_a(_7.expandEast)?_7.expandEast:_7.east,"e"); +_b(_a(_7.expandWest)?_7.expandWest:_7.west,"w"); +_7.center.panel("resize",_8); +function _9(pp,_c){ +if(!pp.length||!_a(pp)){ +return; +} +var _d=pp.panel("options"); +pp.panel("resize",{width:cc.width(),height:_d.height}); +var _e=pp.panel("panel").outerHeight(); +pp.panel("move",{left:0,top:(_c=="n"?0:cc.height()-_e)}); +_8.height-=_e; +if(_c=="n"){ +_8.top+=_e; +if(!_d.split&&_d.border){ +_8.top--; +} +} +if(!_d.split&&_d.border){ +_8.height++; +} +}; +function _b(pp,_f){ +if(!pp.length||!_a(pp)){ +return; +} +var _10=pp.panel("options"); +pp.panel("resize",{width:_10.width,height:_8.height}); +var _11=pp.panel("panel").outerWidth(); +pp.panel("move",{left:(_f=="e"?cc.width()-_11:0),top:_8.top}); +_8.width-=_11; +if(_f=="w"){ +_8.left+=_11; +if(!_10.split&&_10.border){ +_8.left--; +} +} +if(!_10.split&&_10.border){ +_8.width++; +} +}; +}; +function _12(_13){ +var cc=$(_13); +cc.addClass("layout"); +function _14(el){ +var _15=$.fn.layout.parsePanelOptions(el); +if("north,south,east,west,center".indexOf(_15.region)>=0){ +_19(_13,_15,el); +} +}; +var _16=cc.layout("options"); +var _17=_16.onAdd; +_16.onAdd=function(){ +}; +cc.find(">div,>form>div").each(function(){ +_14(this); +}); +_16.onAdd=_17; +cc.append("
                                                                                                    "); +cc.bind("_resize",function(e,_18){ +if($(this).hasClass("easyui-fluid")||_18){ +_2(_13); +} +return false; +}); +}; +function _19(_1a,_1b,el){ +_1b.region=_1b.region||"center"; +var _1c=$.data(_1a,"layout").panels; +var cc=$(_1a); +var dir=_1b.region; +if(_1c[dir].length){ +return; +} +var pp=$(el); +if(!pp.length){ +pp=$("
                                                                                                    ").appendTo(cc); +} +var _1d=$.extend({},$.fn.layout.paneldefaults,{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),doSize:false,collapsible:true,onOpen:function(){ +var _1e=$(this).panel("header").children("div.panel-tool"); +_1e.children("a.panel-tool-collapse").hide(); +var _1f={north:"up",south:"down",east:"right",west:"left"}; +if(!_1f[dir]){ +return; +} +var _20="layout-button-"+_1f[dir]; +var t=_1e.children("a."+_20); +if(!t.length){ +t=$("").addClass(_20).appendTo(_1e); +t.bind("click",{dir:dir},function(e){ +_39(_1a,e.data.dir); +return false; +}); +} +$(this).panel("options").collapsible?t.show():t.hide(); +}},_1b,{cls:((_1b.cls||"")+" layout-panel layout-panel-"+dir),bodyCls:((_1b.bodyCls||"")+" layout-body")}); +pp.panel(_1d); +_1c[dir]=pp; +var _21={north:"s",south:"n",east:"w",west:"e"}; +var _22=pp.panel("panel"); +if(pp.panel("options").split){ +_22.addClass("layout-split-"+dir); +} +_22.resizable($.extend({},{handles:(_21[dir]||""),disabled:(!pp.panel("options").split),onStartResize:function(e){ +_1=true; +if(dir=="north"||dir=="south"){ +var _23=$(">div.layout-split-proxy-v",_1a); +}else{ +var _23=$(">div.layout-split-proxy-h",_1a); +} +var top=0,_24=0,_25=0,_26=0; +var pos={display:"block"}; +if(dir=="north"){ +pos.top=parseInt(_22.css("top"))+_22.outerHeight()-_23.height(); +pos.left=parseInt(_22.css("left")); +pos.width=_22.outerWidth(); +pos.height=_23.height(); +}else{ +if(dir=="south"){ +pos.top=parseInt(_22.css("top")); +pos.left=parseInt(_22.css("left")); +pos.width=_22.outerWidth(); +pos.height=_23.height(); +}else{ +if(dir=="east"){ +pos.top=parseInt(_22.css("top"))||0; +pos.left=parseInt(_22.css("left"))||0; +pos.width=_23.width(); +pos.height=_22.outerHeight(); +}else{ +if(dir=="west"){ +pos.top=parseInt(_22.css("top"))||0; +pos.left=_22.outerWidth()-_23.width(); +pos.width=_23.width(); +pos.height=_22.outerHeight(); +} +} +} +} +_23.css(pos); +$("
                                                                                                    ").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc); +},onResize:function(e){ +if(dir=="north"||dir=="south"){ +var _27=_28(this); +$(this).resizable("options").maxHeight=_27; +var _29=$(">div.layout-split-proxy-v",_1a); +var top=dir=="north"?e.data.height-_29.height():$(_1a).height()-e.data.height; +_29.css("top",top); +}else{ +var _2a=_28(this); +$(this).resizable("options").maxWidth=_2a; +var _29=$(">div.layout-split-proxy-h",_1a); +var _2b=dir=="west"?e.data.width-_29.width():$(_1a).width()-e.data.width; +_29.css("left",_2b); +} +return false; +},onStopResize:function(e){ +cc.children("div.layout-split-proxy-v,div.layout-split-proxy-h").hide(); +pp.panel("resize",e.data); +_2(_1a); +_1=false; +cc.find(">div.layout-mask").remove(); +}},_1b)); +cc.layout("options").onAdd.call(_1a,dir); +function _28(p){ +var _2c="expand"+dir.substring(0,1).toUpperCase()+dir.substring(1); +var _2d=_1c["center"]; +var _2e=(dir=="north"||dir=="south")?"minHeight":"minWidth"; +var _2f=(dir=="north"||dir=="south")?"maxHeight":"maxWidth"; +var _30=(dir=="north"||dir=="south")?"_outerHeight":"_outerWidth"; +var _31=$.parser.parseValue(_2f,_1c[dir].panel("options")[_2f],$(_1a)); +var _32=$.parser.parseValue(_2e,_2d.panel("options")[_2e],$(_1a)); +var _33=_2d.panel("panel")[_30]()-_32; +if(_a(_1c[_2c])){ +_33+=_1c[_2c][_30]()-1; +}else{ +_33+=$(p)[_30](); +} +if(_33>_31){ +_33=_31; +} +return _33; +}; +}; +function _34(_35,_36){ +var _37=$.data(_35,"layout").panels; +if(_37[_36].length){ +_37[_36].panel("destroy"); +_37[_36]=$(); +var _38="expand"+_36.substring(0,1).toUpperCase()+_36.substring(1); +if(_37[_38]){ +_37[_38].panel("destroy"); +_37[_38]=undefined; +} +$(_35).layout("options").onRemove.call(_35,_36); +} +}; +function _39(_3a,_3b,_3c){ +if(_3c==undefined){ +_3c="normal"; +} +var _3d=$.data(_3a,"layout").panels; +var p=_3d[_3b]; +var _3e=p.panel("options"); +if(_3e.onBeforeCollapse.call(p)==false){ +return; +} +var _3f="expand"+_3b.substring(0,1).toUpperCase()+_3b.substring(1); +if(!_3d[_3f]){ +_3d[_3f]=_40(_3b); +var ep=_3d[_3f].panel("panel"); +if(!_3e.expandMode){ +ep.css("cursor","default"); +}else{ +ep.bind("click",function(){ +if(_3e.expandMode=="dock"){ +_4f(_3a,_3b); +}else{ +p.panel("expand",false).panel("open"); +var _41=_42(); +p.panel("resize",_41.collapse); +p.panel("panel").unbind(".layout").bind("mouseleave.layout",{region:_3b},function(e){ +$(this).stop(true,true); +if(_1==true){ +return; +} +if($("body>div.combo-p>div.combo-panel:visible").length){ +return; +} +_39(_3a,e.data.region); +}); +p.panel("panel").animate(_41.expand,function(){ +$(_3a).layout("options").onExpand.call(_3a,_3b); +}); +} +return false; +}); +} +} +var _43=_42(); +if(!_a(_3d[_3f])){ +_3d.center.panel("resize",_43.resizeC); +} +p.panel("panel").animate(_43.collapse,_3c,function(){ +p.panel("collapse",false).panel("close"); +_3d[_3f].panel("open").panel("resize",_43.expandP); +$(this).unbind(".layout"); +$(_3a).layout("options").onCollapse.call(_3a,_3b); +}); +function _40(dir){ +var _44={"east":"left","west":"right","north":"down","south":"up"}; +var _45=(_3e.region=="north"||_3e.region=="south"); +var _46="layout-button-"+_44[dir]; +var p=$("
                                                                                                    ").appendTo(_3a); +p.panel($.extend({},$.fn.layout.paneldefaults,{cls:("layout-expand layout-expand-"+dir),title:" ",titleDirection:_3e.titleDirection,iconCls:(_3e.hideCollapsedContent?null:_3e.iconCls),closed:true,minWidth:0,minHeight:0,doSize:false,region:_3e.region,collapsedSize:_3e.collapsedSize,noheader:(!_45&&_3e.hideExpandTool),tools:((_45&&_3e.hideExpandTool)?null:[{iconCls:_46,handler:function(){ +_4f(_3a,_3b); +return false; +}}]),onResize:function(){ +var _47=$(this).children(".layout-expand-title"); +if(_47.length){ +_47._outerWidth($(this).height()); +var _48=($(this).width()-Math.min(_47._outerWidth(),_47._outerHeight()))/2; +var top=Math.max(_47._outerWidth(),_47._outerHeight()); +if(_47.hasClass("layout-expand-title-down")){ +_48+=Math.min(_47._outerWidth(),_47._outerHeight()); +top=0; +} +_47.css({left:(_48+"px"),top:(top+"px")}); +} +}})); +if(!_3e.hideCollapsedContent){ +var _49=typeof _3e.collapsedContent=="function"?_3e.collapsedContent.call(p[0],_3e.title):_3e.collapsedContent; +_45?p.panel("setTitle",_49):p.html(_49); +} +p.panel("panel").hover(function(){ +$(this).addClass("layout-expand-over"); +},function(){ +$(this).removeClass("layout-expand-over"); +}); +return p; +}; +function _42(){ +var cc=$(_3a); +var _4a=_3d.center.panel("options"); +var _4b=_3e.collapsedSize; +if(_3b=="east"){ +var _4c=p.panel("panel")._outerWidth(); +var _4d=_4a.width+_4c-_4b; +if(_3e.split||!_3e.border){ +_4d++; +} +return {resizeC:{width:_4d},expand:{left:cc.width()-_4c},expandP:{top:_4a.top,left:cc.width()-_4b,width:_4b,height:_4a.height},collapse:{left:cc.width(),top:_4a.top,height:_4a.height}}; +}else{ +if(_3b=="west"){ +var _4c=p.panel("panel")._outerWidth(); +var _4d=_4a.width+_4c-_4b; +if(_3e.split||!_3e.border){ +_4d++; +} +return {resizeC:{width:_4d,left:_4b-1},expand:{left:0},expandP:{left:0,top:_4a.top,width:_4b,height:_4a.height},collapse:{left:-_4c,top:_4a.top,height:_4a.height}}; +}else{ +if(_3b=="north"){ +var _4e=p.panel("panel")._outerHeight(); +var hh=_4a.height; +if(!_a(_3d.expandNorth)){ +hh+=_4e-_4b+((_3e.split||!_3e.border)?1:0); +} +_3d.east.add(_3d.west).add(_3d.expandEast).add(_3d.expandWest).panel("resize",{top:_4b-1,height:hh}); +return {resizeC:{top:_4b-1,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:_4b},collapse:{top:-_4e,width:cc.width()}}; +}else{ +if(_3b=="south"){ +var _4e=p.panel("panel")._outerHeight(); +var hh=_4a.height; +if(!_a(_3d.expandSouth)){ +hh+=_4e-_4b+((_3e.split||!_3e.border)?1:0); +} +_3d.east.add(_3d.west).add(_3d.expandEast).add(_3d.expandWest).panel("resize",{height:hh}); +return {resizeC:{height:hh},expand:{top:cc.height()-_4e},expandP:{top:cc.height()-_4b,left:0,width:cc.width(),height:_4b},collapse:{top:cc.height(),width:cc.width()}}; +} +} +} +} +}; +}; +function _4f(_50,_51){ +var _52=$.data(_50,"layout").panels; +var p=_52[_51]; +var _53=p.panel("options"); +if(_53.onBeforeExpand.call(p)==false){ +return; +} +var _54="expand"+_51.substring(0,1).toUpperCase()+_51.substring(1); +if(_52[_54]){ +_52[_54].panel("close"); +p.panel("panel").stop(true,true); +p.panel("expand",false).panel("open"); +var _55=_56(); +p.panel("resize",_55.collapse); +p.panel("panel").animate(_55.expand,function(){ +_2(_50); +$(_50).layout("options").onExpand.call(_50,_51); +}); +} +function _56(){ +var cc=$(_50); +var _57=_52.center.panel("options"); +if(_51=="east"&&_52.expandEast){ +return {collapse:{left:cc.width(),top:_57.top,height:_57.height},expand:{left:cc.width()-p.panel("panel")._outerWidth()}}; +}else{ +if(_51=="west"&&_52.expandWest){ +return {collapse:{left:-p.panel("panel")._outerWidth(),top:_57.top,height:_57.height},expand:{left:0}}; +}else{ +if(_51=="north"&&_52.expandNorth){ +return {collapse:{top:-p.panel("panel")._outerHeight(),width:cc.width()},expand:{top:0}}; +}else{ +if(_51=="south"&&_52.expandSouth){ +return {collapse:{top:cc.height(),width:cc.width()},expand:{top:cc.height()-p.panel("panel")._outerHeight()}}; +} +} +} +} +}; +}; +function _a(pp){ +if(!pp){ +return false; +} +if(pp.length){ +return pp.panel("panel").is(":visible"); +}else{ +return false; +} +}; +function _58(_59){ +var _5a=$.data(_59,"layout"); +var _5b=_5a.options; +var _5c=_5a.panels; +var _5d=_5b.onCollapse; +_5b.onCollapse=function(){ +}; +_5e("east"); +_5e("west"); +_5e("north"); +_5e("south"); +_5b.onCollapse=_5d; +function _5e(_5f){ +var p=_5c[_5f]; +if(p.length&&p.panel("options").collapsed){ +_39(_59,_5f,0); +} +}; +}; +function _60(_61,_62,_63){ +var p=$(_61).layout("panel",_62); +p.panel("options").split=_63; +var cls="layout-split-"+_62; +var _64=p.panel("panel").removeClass(cls); +if(_63){ +_64.addClass(cls); +} +_64.resizable({disabled:(!_63)}); +_2(_61); +}; +$.fn.layout=function(_65,_66){ +if(typeof _65=="string"){ +return $.fn.layout.methods[_65](this,_66); +} +_65=_65||{}; +return this.each(function(){ +var _67=$.data(this,"layout"); +if(_67){ +$.extend(_67.options,_65); +}else{ +var _68=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_65); +$.data(this,"layout",{options:_68,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}}); +_12(this); +} +_2(this); +_58(this); +}); +}; +$.fn.layout.methods={options:function(jq){ +return $.data(jq[0],"layout").options; +},resize:function(jq,_69){ +return jq.each(function(){ +_2(this,_69); +}); +},panel:function(jq,_6a){ +return $.data(jq[0],"layout").panels[_6a]; +},collapse:function(jq,_6b){ +return jq.each(function(){ +_39(this,_6b); +}); +},expand:function(jq,_6c){ +return jq.each(function(){ +_4f(this,_6c); +}); +},add:function(jq,_6d){ +return jq.each(function(){ +_19(this,_6d); +_2(this); +if($(this).layout("panel",_6d.region).panel("options").collapsed){ +_39(this,_6d.region,0); +} +}); +},remove:function(jq,_6e){ +return jq.each(function(){ +_34(this,_6e); +_2(this); +}); +},split:function(jq,_6f){ +return jq.each(function(){ +_60(this,_6f,true); +}); +},unsplit:function(jq,_70){ +return jq.each(function(){ +_60(this,_70,false); +}); +}}; +$.fn.layout.parseOptions=function(_71){ +return $.extend({},$.parser.parseOptions(_71,[{fit:"boolean"}])); +}; +$.fn.layout.defaults={fit:false,onExpand:function(_72){ +},onCollapse:function(_73){ +},onAdd:function(_74){ +},onRemove:function(_75){ +}}; +$.fn.layout.parsePanelOptions=function(_76){ +var t=$(_76); +return $.extend({},$.fn.panel.parseOptions(_76),$.parser.parseOptions(_76,["region",{split:"boolean",collpasedSize:"number",minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number"}])); +}; +$.fn.layout.paneldefaults=$.extend({},$.fn.panel.defaults,{region:null,split:false,collapsedSize:28,expandMode:"float",hideExpandTool:false,hideCollapsedContent:true,collapsedContent:function(_77){ +var p=$(this); +var _78=p.panel("options"); +if(_78.region=="north"||_78.region=="south"){ +return _77; +} +var cc=[]; +if(_78.iconCls){ +cc.push("
                                                                                                    "); +} +cc.push("
                                                                                                    "); +cc.push(_77); +cc.push("
                                                                                                    "); +return cc.join(""); +},minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.linkbutton.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.linkbutton.js new file mode 100755 index 000000000..65d6fb8b1 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.linkbutton.js @@ -0,0 +1,184 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2,_3){ +var _4=$.data(_2,"linkbutton").options; +if(_3){ +$.extend(_4,_3); +} +if(_4.width||_4.height||_4.fit){ +var _5=$(_2); +var _6=_5.parent(); +var _7=_5.is(":visible"); +if(!_7){ +var _8=$("
                                                                                                    ").insertBefore(_2); +var _9={position:_5.css("position"),display:_5.css("display"),left:_5.css("left")}; +_5.appendTo("body"); +_5.css({position:"absolute",display:"inline-block",left:-20000}); +} +_5._size(_4,_6); +var _a=_5.find(".l-btn-left"); +_a.css("margin-top",0); +_a.css("margin-top",parseInt((_5.height()-_a.height())/2)+"px"); +if(!_7){ +_5.insertAfter(_8); +_5.css(_9); +_8.remove(); +} +} +}; +function _b(_c){ +var _d=$.data(_c,"linkbutton").options; +var t=$(_c).empty(); +t.addClass("l-btn").removeClass("l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline"); +t.removeClass("l-btn-small l-btn-medium l-btn-large").addClass("l-btn-"+_d.size); +if(_d.plain){ +t.addClass("l-btn-plain"); +} +if(_d.outline){ +t.addClass("l-btn-outline"); +} +if(_d.selected){ +t.addClass(_d.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); +} +t.attr("group",_d.group||""); +t.attr("id",_d.id||""); +var _e=$("").appendTo(t); +if(_d.text){ +$("").html(_d.text).appendTo(_e); +}else{ +$(" ").appendTo(_e); +} +if(_d.iconCls){ +$(" ").addClass(_d.iconCls).appendTo(_e); +_e.addClass("l-btn-icon-"+_d.iconAlign); +} +t.unbind(".linkbutton").bind("focus.linkbutton",function(){ +if(!_d.disabled){ +$(this).addClass("l-btn-focus"); +} +}).bind("blur.linkbutton",function(){ +$(this).removeClass("l-btn-focus"); +}).bind("click.linkbutton",function(){ +if(!_d.disabled){ +if(_d.toggle){ +if(_d.selected){ +$(this).linkbutton("unselect"); +}else{ +$(this).linkbutton("select"); +} +} +_d.onClick.call(this); +} +}); +_f(_c,_d.selected); +_10(_c,_d.disabled); +}; +function _f(_11,_12){ +var _13=$.data(_11,"linkbutton").options; +if(_12){ +if(_13.group){ +$("a.l-btn[group=\""+_13.group+"\"]").each(function(){ +var o=$(this).linkbutton("options"); +if(o.toggle){ +$(this).removeClass("l-btn-selected l-btn-plain-selected"); +o.selected=false; +} +}); +} +$(_11).addClass(_13.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); +_13.selected=true; +}else{ +if(!_13.group){ +$(_11).removeClass("l-btn-selected l-btn-plain-selected"); +_13.selected=false; +} +} +}; +function _10(_14,_15){ +var _16=$.data(_14,"linkbutton"); +var _17=_16.options; +$(_14).removeClass("l-btn-disabled l-btn-plain-disabled"); +if(_15){ +_17.disabled=true; +var _18=$(_14).attr("href"); +if(_18){ +_16.href=_18; +$(_14).attr("href","javascript:;"); +} +if(_14.onclick){ +_16.onclick=_14.onclick; +_14.onclick=null; +} +_17.plain?$(_14).addClass("l-btn-disabled l-btn-plain-disabled"):$(_14).addClass("l-btn-disabled"); +}else{ +_17.disabled=false; +if(_16.href){ +$(_14).attr("href",_16.href); +} +if(_16.onclick){ +_14.onclick=_16.onclick; +} +} +}; +$.fn.linkbutton=function(_19,_1a){ +if(typeof _19=="string"){ +return $.fn.linkbutton.methods[_19](this,_1a); +} +_19=_19||{}; +return this.each(function(){ +var _1b=$.data(this,"linkbutton"); +if(_1b){ +$.extend(_1b.options,_19); +}else{ +$.data(this,"linkbutton",{options:$.extend({},$.fn.linkbutton.defaults,$.fn.linkbutton.parseOptions(this),_19)}); +$(this)._propAttr("disabled",false); +$(this).bind("_resize",function(e,_1c){ +if($(this).hasClass("easyui-fluid")||_1c){ +_1(this); +} +return false; +}); +} +_b(this); +_1(this); +}); +}; +$.fn.linkbutton.methods={options:function(jq){ +return $.data(jq[0],"linkbutton").options; +},resize:function(jq,_1d){ +return jq.each(function(){ +_1(this,_1d); +}); +},enable:function(jq){ +return jq.each(function(){ +_10(this,false); +}); +},disable:function(jq){ +return jq.each(function(){ +_10(this,true); +}); +},select:function(jq){ +return jq.each(function(){ +_f(this,true); +}); +},unselect:function(jq){ +return jq.each(function(){ +_f(this,false); +}); +}}; +$.fn.linkbutton.parseOptions=function(_1e){ +var t=$(_1e); +return $.extend({},$.parser.parseOptions(_1e,["id","iconCls","iconAlign","group","size","text",{plain:"boolean",toggle:"boolean",selected:"boolean",outline:"boolean"}]),{disabled:(t.attr("disabled")?true:undefined),text:($.trim(t.html())||undefined),iconCls:(t.attr("icon")||t.attr("iconCls"))}); +}; +$.fn.linkbutton.defaults={id:null,disabled:false,toggle:false,selected:false,outline:false,group:null,plain:false,text:"",iconCls:null,iconAlign:"left",size:"small",onClick:function(){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.maskedbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.maskedbox.js new file mode 100644 index 000000000..268b285b7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.maskedbox.js @@ -0,0 +1,221 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$(_2).data("maskedbox"); +var _4=_3.options; +$(_2).textbox(_4); +$(_2).maskedbox("initValue",_4.value); +}; +function _5(_6,_7){ +var _8=$(_6).maskedbox("options"); +var tt=(_7||$(_6).maskedbox("getText")||"").split(""); +var vv=[]; +for(var i=0;i<_8.mask.length;i++){ +if(_8.masks[_8.mask[i]]){ +var t=tt[i]; +vv.push(t!=_8.promptChar?t:" "); +} +} +return vv.join(""); +}; +function _9(_a,_b){ +var _c=$(_a).maskedbox("options"); +var cc=_b.split(""); +var tt=[]; +for(var i=0;i<_c.mask.length;i++){ +var m=_c.mask[i]; +var r=_c.masks[m]; +if(r){ +var c=cc.shift(); +if(c!=undefined){ +var d=new RegExp(r,"i"); +if(d.test(c)){ +tt.push(c); +continue; +} +} +tt.push(_c.promptChar); +}else{ +tt.push(m); +} +} +return tt.join(""); +}; +function _d(_e,c){ +var _f=$(_e).maskedbox("options"); +var _10=$(_e).maskedbox("getSelectionRange"); +var _11=_12(_e,_10.start); +var end=_12(_e,_10.end); +if(_11!=-1){ +var r=new RegExp(_f.masks[_f.mask[_11]],"i"); +if(r.test(c)){ +var vv=_5(_e).split(""); +var _13=_11-_14(_e,_11); +var _15=end-_14(_e,end); +vv.splice(_13,_15-_13,c); +$(_e).maskedbox("setValue",_9(_e,vv.join(""))); +_11=_12(_e,++_11); +$(_e).maskedbox("setSelectionRange",{start:_11,end:_11}); +} +} +}; +function _16(_17,_18){ +var _19=$(_17).maskedbox("options"); +var vv=_5(_17).split(""); +var _1a=$(_17).maskedbox("getSelectionRange"); +if(_1a.start==_1a.end){ +if(_18){ +var _1b=_1c(_17,_1a.start); +}else{ +var _1b=_12(_17,_1a.start); +} +var _1d=_1b-_14(_17,_1b); +if(_1d>=0){ +vv.splice(_1d,1); +} +}else{ +var _1b=_12(_17,_1a.start); +var end=_1c(_17,_1a.end); +var _1d=_1b-_14(_17,_1b); +var _1e=end-_14(_17,end); +vv.splice(_1d,_1e-_1d+1); +} +$(_17).maskedbox("setValue",_9(_17,vv.join(""))); +$(_17).maskedbox("setSelectionRange",{start:_1b,end:_1b}); +}; +function _14(_1f,pos){ +var _20=$(_1f).maskedbox("options"); +var _21=0; +if(pos>=_20.mask.length){ +pos--; +} +for(var i=pos;i>=0;i--){ +if(_20.masks[_20.mask[i]]==undefined){ +_21++; +} +} +return _21; +}; +function _12(_22,pos){ +var _23=$(_22).maskedbox("options"); +var m=_23.mask[pos]; +var r=_23.masks[m]; +while(pos<_23.mask.length&&!r){ +pos++; +m=_23.mask[pos]; +r=_23.masks[m]; +} +return pos; +}; +function _1c(_24,pos){ +var _25=$(_24).maskedbox("options"); +var m=_25.mask[--pos]; +var r=_25.masks[m]; +while(pos>=0&&!r){ +pos--; +m=_25.mask[pos]; +r=_25.masks[m]; +} +return pos<0?0:pos; +}; +function _26(e){ +if(e.metaKey||e.ctrlKey){ +return; +} +var _27=e.data.target; +var _28=$(_27).maskedbox("options"); +var _29=[9,13,35,36,37,39]; +if($.inArray(e.keyCode,_29)!=-1){ +return true; +} +if(e.keyCode>=96&&e.keyCode<=105){ +e.keyCode-=48; +} +var c=String.fromCharCode(e.keyCode); +if(e.keyCode>=65&&e.keyCode<=90&&!e.shiftKey){ +c=c.toLowerCase(); +}else{ +if(e.keyCode==189){ +c="-"; +}else{ +if(e.keyCode==187){ +c="+"; +}else{ +if(e.keyCode==190){ +c="."; +} +} +} +} +if(e.keyCode==8){ +_16(_27,true); +}else{ +if(e.keyCode==46){ +_16(_27,false); +}else{ +_d(_27,c); +} +} +return false; +}; +$.extend($.fn.textbox.methods,{inputMask:function(jq,_2a){ +return jq.each(function(){ +var _2b=this; +var _2c=$.extend({},$.fn.maskedbox.defaults,_2a); +$.data(_2b,"maskedbox",{options:_2c}); +var _2d=$(_2b).textbox("textbox"); +_2d.unbind(".maskedbox"); +for(var _2e in _2c.inputEvents){ +_2d.bind(_2e+".maskedbox",{target:_2b},_2c.inputEvents[_2e]); +} +}); +}}); +$.fn.maskedbox=function(_2f,_30){ +if(typeof _2f=="string"){ +var _31=$.fn.maskedbox.methods[_2f]; +if(_31){ +return _31(this,_30); +}else{ +return this.textbox(_2f,_30); +} +} +_2f=_2f||{}; +return this.each(function(){ +var _32=$.data(this,"maskedbox"); +if(_32){ +$.extend(_32.options,_2f); +}else{ +$.data(this,"maskedbox",{options:$.extend({},$.fn.maskedbox.defaults,$.fn.maskedbox.parseOptions(this),_2f)}); +} +_1(this); +}); +}; +$.fn.maskedbox.methods={options:function(jq){ +var _33=jq.textbox("options"); +return $.extend($.data(jq[0],"maskedbox").options,{width:_33.width,value:_33.value,originalValue:_33.originalValue,disabled:_33.disabled,readonly:_33.readonly}); +},initValue:function(jq,_34){ +return jq.each(function(){ +_34=_9(this,_5(this,_34)); +$(this).textbox("initValue",_34); +}); +},setValue:function(jq,_35){ +return jq.each(function(){ +_35=_9(this,_5(this,_35)); +$(this).textbox("setValue",_35); +}); +}}; +$.fn.maskedbox.parseOptions=function(_36){ +var t=$(_36); +return $.extend({},$.fn.textbox.parseOptions(_36),$.parser.parseOptions(_36,["mask","promptChar"]),{}); +}; +$.fn.maskedbox.defaults=$.extend({},$.fn.textbox.defaults,{mask:"",promptChar:"_",masks:{"9":"[0-9]","a":"[a-zA-Z]","*":"[0-9a-zA-Z]"},inputEvents:{keydown:_26}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menu.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menu.js new file mode 100755 index 000000000..98fcf9b9c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menu.js @@ -0,0 +1,502 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +$(function(){ +$(document).unbind(".menu").bind("mousedown.menu",function(e){ +var m=$(e.target).closest("div.menu,div.combo-p"); +if(m.length){ +return; +} +$("body>div.menu-top:visible").not(".menu-inline").menu("hide"); +_1($("body>div.menu:visible").not(".menu-inline")); +}); +}); +function _2(_3){ +var _4=$.data(_3,"menu").options; +$(_3).addClass("menu-top"); +_4.inline?$(_3).addClass("menu-inline"):$(_3).appendTo("body"); +$(_3).bind("_resize",function(e,_5){ +if($(this).hasClass("easyui-fluid")||_5){ +$(_3).menu("resize",_3); +} +return false; +}); +var _6=_7($(_3)); +for(var i=0;i<_6.length;i++){ +_b(_3,_6[i]); +} +function _7(_8){ +var _9=[]; +_8.addClass("menu"); +_9.push(_8); +if(!_8.hasClass("menu-content")){ +_8.children("div").each(function(){ +var _a=$(this).children("div"); +if(_a.length){ +_a.appendTo("body"); +this.submenu=_a; +var mm=_7(_a); +_9=_9.concat(mm); +} +}); +} +return _9; +}; +}; +function _b(_c,_d){ +var _e=$(_d).addClass("menu"); +if(!_e.data("menu")){ +_e.data("menu",{options:$.parser.parseOptions(_e[0],["width","height"])}); +} +if(!_e.hasClass("menu-content")){ +_e.children("div").each(function(){ +_f(_c,this); +}); +$("
                                                                                                    ").prependTo(_e); +} +_10(_c,_e); +if(!_e.hasClass("menu-inline")){ +_e.hide(); +} +_11(_c,_e); +}; +function _f(_12,div,_13){ +var _14=$(div); +var _15=$.extend({},$.parser.parseOptions(_14[0],["id","name","iconCls","href",{separator:"boolean"}]),{disabled:(_14.attr("disabled")?true:undefined),text:$.trim(_14.html()),onclick:_14[0].onclick},_13||{}); +_15.onclick=_15.onclick||_15.handler||null; +_14.data("menuitem",{options:_15}); +if(_15.separator){ +_14.addClass("menu-sep"); +} +if(!_14.hasClass("menu-sep")){ +_14.addClass("menu-item"); +_14.empty().append($("
                                                                                                    ").html(_15.text)); +if(_15.iconCls){ +$("
                                                                                                    ").addClass(_15.iconCls).appendTo(_14); +} +if(_15.id){ +_14.attr("id",_15.id); +} +if(_15.onclick){ +if(typeof _15.onclick=="string"){ +_14.attr("onclick",_15.onclick); +}else{ +_14[0].onclick=eval(_15.onclick); +} +} +if(_15.disabled){ +_16(_12,_14[0],true); +} +if(_14[0].submenu){ +$("
                                                                                                    ").appendTo(_14); +} +} +}; +function _10(_17,_18){ +var _19=$.data(_17,"menu").options; +var _1a=_18.attr("style")||""; +var _1b=_18.is(":visible"); +_18.css({display:"block",left:-10000,height:"auto",overflow:"hidden"}); +_18.find(".menu-item").each(function(){ +$(this)._outerHeight(_19.itemHeight); +$(this).find(".menu-text").css({height:(_19.itemHeight-2)+"px",lineHeight:(_19.itemHeight-2)+"px"}); +}); +_18.removeClass("menu-noline").addClass(_19.noline?"menu-noline":""); +var _1c=_18.data("menu").options; +var _1d=_1c.width; +var _1e=_1c.height; +if(isNaN(parseInt(_1d))){ +_1d=0; +_18.find("div.menu-text").each(function(){ +if(_1d<$(this).outerWidth()){ +_1d=$(this).outerWidth(); +} +}); +_1d=_1d?_1d+40:""; +} +var _1f=_18.outerHeight(); +if(isNaN(parseInt(_1e))){ +_1e=_1f; +if(_18.hasClass("menu-top")&&_19.alignTo){ +var at=$(_19.alignTo); +var h1=at.offset().top-$(document).scrollTop(); +var h2=$(window)._outerHeight()+$(document).scrollTop()-at.offset().top-at._outerHeight(); +_1e=Math.min(_1e,Math.max(h1,h2)); +}else{ +if(_1e>$(window)._outerHeight()){ +_1e=$(window).height(); +} +} +} +_18.attr("style",_1a); +_18.show(); +_18._size($.extend({},_1c,{width:_1d,height:_1e,minWidth:_1c.minWidth||_19.minWidth,maxWidth:_1c.maxWidth||_19.maxWidth})); +_18.find(".easyui-fluid").triggerHandler("_resize",[true]); +_18.css("overflow",_18.outerHeight()<_1f?"auto":"hidden"); +_18.children("div.menu-line")._outerHeight(_1f-2); +if(!_1b){ +_18.hide(); +} +}; +function _11(_20,_21){ +var _22=$.data(_20,"menu"); +var _23=_22.options; +_21.unbind(".menu"); +for(var _24 in _23.events){ +_21.bind(_24+".menu",{target:_20},_23.events[_24]); +} +}; +function _25(e){ +var _26=e.data.target; +var _27=$.data(_26,"menu"); +if(_27.timer){ +clearTimeout(_27.timer); +_27.timer=null; +} +}; +function _28(e){ +var _29=e.data.target; +var _2a=$.data(_29,"menu"); +if(_2a.options.hideOnUnhover){ +_2a.timer=setTimeout(function(){ +_2b(_29,$(_29).hasClass("menu-inline")); +},_2a.options.duration); +} +}; +function _2c(e){ +var _2d=e.data.target; +var _2e=$(e.target).closest(".menu-item"); +if(_2e.length){ +_2e.siblings().each(function(){ +if(this.submenu){ +_1(this.submenu); +} +$(this).removeClass("menu-active"); +}); +_2e.addClass("menu-active"); +if(_2e.hasClass("menu-item-disabled")){ +_2e.addClass("menu-active-disabled"); +return; +} +var _2f=_2e[0].submenu; +if(_2f){ +$(_2d).menu("show",{menu:_2f,parent:_2e}); +} +} +}; +function _30(e){ +var _31=$(e.target).closest(".menu-item"); +if(_31.length){ +_31.removeClass("menu-active menu-active-disabled"); +var _32=_31[0].submenu; +if(_32){ +if(e.pageX>=parseInt(_32.css("left"))){ +_31.addClass("menu-active"); +}else{ +_1(_32); +} +}else{ +_31.removeClass("menu-active"); +} +} +}; +function _33(e){ +var _34=e.data.target; +var _35=$(e.target).closest(".menu-item"); +if(_35.length){ +var _36=$(_34).data("menu").options; +var _37=_35.data("menuitem").options; +if(_37.disabled){ +return; +} +if(!_35[0].submenu){ +_2b(_34,_36.inline); +if(_37.href){ +location.href=_37.href; +} +} +_35.trigger("mouseenter"); +_36.onClick.call(_34,$(_34).menu("getItem",_35[0])); +} +}; +function _2b(_38,_39){ +var _3a=$.data(_38,"menu"); +if(_3a){ +if($(_38).is(":visible")){ +_1($(_38)); +if(_39){ +$(_38).show(); +}else{ +_3a.options.onHide.call(_38); +} +} +} +return false; +}; +function _3b(_3c,_3d){ +_3d=_3d||{}; +var _3e,top; +var _3f=$.data(_3c,"menu").options; +var _40=$(_3d.menu||_3c); +$(_3c).menu("resize",_40[0]); +if(_40.hasClass("menu-top")){ +$.extend(_3f,_3d); +_3e=_3f.left; +top=_3f.top; +if(_3f.alignTo){ +var at=$(_3f.alignTo); +_3e=at.offset().left; +top=at.offset().top+at._outerHeight(); +if(_3f.align=="right"){ +_3e+=at.outerWidth()-_40.outerWidth(); +} +} +if(_3e+_40.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ +_3e=$(window)._outerWidth()+$(document).scrollLeft()-_40.outerWidth()-5; +} +if(_3e<0){ +_3e=0; +} +top=_41(top,_3f.alignTo); +}else{ +var _42=_3d.parent; +_3e=_42.offset().left+_42.outerWidth()-2; +if(_3e+_40.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){ +_3e=_42.offset().left-_40.outerWidth()+2; +} +top=_41(_42.offset().top-3); +} +function _41(top,_43){ +if(top+_40.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ +if(_43){ +top=$(_43).offset().top-_40._outerHeight(); +}else{ +top=$(window)._outerHeight()+$(document).scrollTop()-_40.outerHeight(); +} +} +if(top<0){ +top=0; +} +return top; +}; +_40.css(_3f.position.call(_3c,_40[0],_3e,top)); +_40.show(0,function(){ +if(!_40[0].shadow){ +_40[0].shadow=$("
                                                                                                    ").insertAfter(_40); +} +_40[0].shadow.css({display:(_40.hasClass("menu-inline")?"none":"block"),zIndex:$.fn.menu.defaults.zIndex++,left:_40.css("left"),top:_40.css("top"),width:_40.outerWidth(),height:_40.outerHeight()}); +_40.css("z-index",$.fn.menu.defaults.zIndex++); +if(_40.hasClass("menu-top")){ +_3f.onShow.call(_3c); +} +}); +}; +function _1(_44){ +if(_44&&_44.length){ +_45(_44); +_44.find("div.menu-item").each(function(){ +if(this.submenu){ +_1(this.submenu); +} +$(this).removeClass("menu-active"); +}); +} +function _45(m){ +m.stop(true,true); +if(m[0].shadow){ +m[0].shadow.hide(); +} +m.hide(); +}; +}; +function _46(_47,_48){ +var _49=null; +var fn=$.isFunction(_48)?_48:function(_4a){ +for(var p in _48){ +if(_4a[p]!=_48[p]){ +return false; +} +} +return true; +}; +function _4b(_4c){ +_4c.children("div.menu-item").each(function(){ +var _4d=$(this).data("menuitem").options; +if(fn.call(_47,_4d)==true){ +_49=$(_47).menu("getItem",this); +}else{ +if(this.submenu&&!_49){ +_4b(this.submenu); +} +} +}); +}; +_4b($(_47)); +return _49; +}; +function _16(_4e,_4f,_50){ +var t=$(_4f); +if(t.hasClass("menu-item")){ +var _51=t.data("menuitem").options; +_51.disabled=_50; +if(_50){ +t.addClass("menu-item-disabled"); +t[0].onclick=null; +}else{ +t.removeClass("menu-item-disabled"); +t[0].onclick=_51.onclick; +} +} +}; +function _52(_53,_54){ +var _55=$.data(_53,"menu").options; +var _56=$(_53); +if(_54.parent){ +if(!_54.parent.submenu){ +var _57=$("
                                                                                                    ").appendTo("body"); +_54.parent.submenu=_57; +$("
                                                                                                    ").appendTo(_54.parent); +_b(_53,_57); +} +_56=_54.parent.submenu; +} +var div=$("
                                                                                                    ").appendTo(_56); +_f(_53,div,_54); +}; +function _58(_59,_5a){ +function _5b(el){ +if(el.submenu){ +el.submenu.children("div.menu-item").each(function(){ +_5b(this); +}); +var _5c=el.submenu[0].shadow; +if(_5c){ +_5c.remove(); +} +el.submenu.remove(); +} +$(el).remove(); +}; +_5b(_5a); +}; +function _5d(_5e,_5f,_60){ +var _61=$(_5f).parent(); +if(_60){ +$(_5f).show(); +}else{ +$(_5f).hide(); +} +_10(_5e,_61); +}; +function _62(_63){ +$(_63).children("div.menu-item").each(function(){ +_58(_63,this); +}); +if(_63.shadow){ +_63.shadow.remove(); +} +$(_63).remove(); +}; +$.fn.menu=function(_64,_65){ +if(typeof _64=="string"){ +return $.fn.menu.methods[_64](this,_65); +} +_64=_64||{}; +return this.each(function(){ +var _66=$.data(this,"menu"); +if(_66){ +$.extend(_66.options,_64); +}else{ +_66=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_64)}); +_2(this); +} +$(this).css({left:_66.options.left,top:_66.options.top}); +}); +}; +$.fn.menu.methods={options:function(jq){ +return $.data(jq[0],"menu").options; +},show:function(jq,pos){ +return jq.each(function(){ +_3b(this,pos); +}); +},hide:function(jq){ +return jq.each(function(){ +_2b(this); +}); +},destroy:function(jq){ +return jq.each(function(){ +_62(this); +}); +},setText:function(jq,_67){ +return jq.each(function(){ +var _68=$(_67.target).data("menuitem").options; +_68.text=_67.text; +$(_67.target).children("div.menu-text").html(_67.text); +}); +},setIcon:function(jq,_69){ +return jq.each(function(){ +var _6a=$(_69.target).data("menuitem").options; +_6a.iconCls=_69.iconCls; +$(_69.target).children("div.menu-icon").remove(); +if(_69.iconCls){ +$("
                                                                                                    ").addClass(_69.iconCls).appendTo(_69.target); +} +}); +},getItem:function(jq,_6b){ +var _6c=$(_6b).data("menuitem").options; +return $.extend({},_6c,{target:$(_6b)[0]}); +},findItem:function(jq,_6d){ +if(typeof _6d=="string"){ +return _46(jq[0],function(_6e){ +return $("
                                                                                                    "+_6e.text+"
                                                                                                    ").text()==_6d; +}); +}else{ +return _46(jq[0],_6d); +} +},appendItem:function(jq,_6f){ +return jq.each(function(){ +_52(this,_6f); +}); +},removeItem:function(jq,_70){ +return jq.each(function(){ +_58(this,_70); +}); +},enableItem:function(jq,_71){ +return jq.each(function(){ +_16(this,_71,false); +}); +},disableItem:function(jq,_72){ +return jq.each(function(){ +_16(this,_72,true); +}); +},showItem:function(jq,_73){ +return jq.each(function(){ +_5d(this,_73,true); +}); +},hideItem:function(jq,_74){ +return jq.each(function(){ +_5d(this,_74,false); +}); +},resize:function(jq,_75){ +return jq.each(function(){ +_10(this,_75?$(_75):$(this)); +}); +}}; +$.fn.menu.parseOptions=function(_76){ +return $.extend({},$.parser.parseOptions(_76,[{minWidth:"number",itemHeight:"number",duration:"number",hideOnUnhover:"boolean"},{fit:"boolean",inline:"boolean",noline:"boolean"}])); +}; +$.fn.menu.defaults={zIndex:110000,left:0,top:0,alignTo:null,align:"left",minWidth:150,itemHeight:32,duration:100,hideOnUnhover:true,inline:false,fit:false,noline:false,events:{mouseenter:_25,mouseleave:_28,mouseover:_2c,mouseout:_30,click:_33},position:function(_77,_78,top){ +return {left:_78,top:top}; +},onShow:function(){ +},onHide:function(){ +},onClick:function(_79){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menubutton.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menubutton.js new file mode 100755 index 000000000..6103f3684 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menubutton.js @@ -0,0 +1,123 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"menubutton").options; +var _4=$(_2); +_4.linkbutton(_3); +if(_3.hasDownArrow){ +_4.removeClass(_3.cls.btn1+" "+_3.cls.btn2).addClass("m-btn"); +_4.removeClass("m-btn-small m-btn-medium m-btn-large").addClass("m-btn-"+_3.size); +var _5=_4.find(".l-btn-left"); +$("").addClass(_3.cls.arrow).appendTo(_5); +$("").addClass("m-btn-line").appendTo(_5); +} +$(_2).menubutton("resize"); +if(_3.menu){ +$(_3.menu).menu({duration:_3.duration}); +var _6=$(_3.menu).menu("options"); +var _7=_6.onShow; +var _8=_6.onHide; +$.extend(_6,{onShow:function(){ +var _9=$(this).menu("options"); +var _a=$(_9.alignTo); +var _b=_a.menubutton("options"); +_a.addClass((_b.plain==true)?_b.cls.btn2:_b.cls.btn1); +_7.call(this); +},onHide:function(){ +var _c=$(this).menu("options"); +var _d=$(_c.alignTo); +var _e=_d.menubutton("options"); +_d.removeClass((_e.plain==true)?_e.cls.btn2:_e.cls.btn1); +_8.call(this); +}}); +} +}; +function _f(_10){ +var _11=$.data(_10,"menubutton").options; +var btn=$(_10); +var t=btn.find("."+_11.cls.trigger); +if(!t.length){ +t=btn; +} +t.unbind(".menubutton"); +var _12=null; +t.bind(_11.showEvent+".menubutton",function(){ +if(!_13()){ +_12=setTimeout(function(){ +_14(_10); +},_11.duration); +return false; +} +}).bind(_11.hideEvent+".menubutton",function(){ +if(_12){ +clearTimeout(_12); +} +$(_11.menu).triggerHandler("mouseleave"); +}); +function _13(){ +return $(_10).linkbutton("options").disabled; +}; +}; +function _14(_15){ +var _16=$(_15).menubutton("options"); +if(_16.disabled||!_16.menu){ +return; +} +$("body>div.menu-top").menu("hide"); +var btn=$(_15); +var mm=$(_16.menu); +if(mm.length){ +mm.menu("options").alignTo=btn; +mm.menu("show",{alignTo:btn,align:_16.menuAlign}); +} +btn.blur(); +}; +$.fn.menubutton=function(_17,_18){ +if(typeof _17=="string"){ +var _19=$.fn.menubutton.methods[_17]; +if(_19){ +return _19(this,_18); +}else{ +return this.linkbutton(_17,_18); +} +} +_17=_17||{}; +return this.each(function(){ +var _1a=$.data(this,"menubutton"); +if(_1a){ +$.extend(_1a.options,_17); +}else{ +$.data(this,"menubutton",{options:$.extend({},$.fn.menubutton.defaults,$.fn.menubutton.parseOptions(this),_17)}); +$(this)._propAttr("disabled",false); +} +_1(this); +_f(this); +}); +}; +$.fn.menubutton.methods={options:function(jq){ +var _1b=jq.linkbutton("options"); +return $.extend($.data(jq[0],"menubutton").options,{toggle:_1b.toggle,selected:_1b.selected,disabled:_1b.disabled}); +},destroy:function(jq){ +return jq.each(function(){ +var _1c=$(this).menubutton("options"); +if(_1c.menu){ +$(_1c.menu).menu("destroy"); +} +$(this).remove(); +}); +}}; +$.fn.menubutton.parseOptions=function(_1d){ +var t=$(_1d); +return $.extend({},$.fn.linkbutton.parseOptions(_1d),$.parser.parseOptions(_1d,["menu",{plain:"boolean",hasDownArrow:"boolean",duration:"number"}])); +}; +$.fn.menubutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,hasDownArrow:true,menu:null,menuAlign:"left",duration:100,showEvent:"mouseenter",hideEvent:"mouseleave",cls:{btn1:"m-btn-active",btn2:"m-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn"}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.messager.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.messager.js new file mode 100755 index 000000000..60ea45909 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.messager.js @@ -0,0 +1,186 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(){ +$(document).unbind(".messager").bind("keydown.messager",function(e){ +if(e.keyCode==27){ +$("body").children("div.messager-window").children("div.messager-body").each(function(){ +$(this).dialog("close"); +}); +}else{ +if(e.keyCode==9){ +var _2=$("body").children("div.messager-window"); +if(!_2.length){ +return; +} +var _3=_2.find(".messager-input,.messager-button .l-btn"); +for(var i=0;i<_3.length;i++){ +if($(_3[i]).is(":focus")){ +$(_3[i>=_3.length-1?0:i+1]).focus(); +return false; +} +} +}else{ +if(e.keyCode==13){ +var _4=$(e.target).closest("input.messager-input"); +if(_4.length){ +var _5=_4.closest(".messager-body"); +_6(_5,_4.val()); +} +} +} +} +}); +}; +function _7(){ +$(document).unbind(".messager"); +}; +function _8(_9){ +var _a=$.extend({},$.messager.defaults,{modal:false,shadow:false,draggable:false,resizable:false,closed:true,style:{left:"",top:"",right:0,zIndex:$.fn.window.defaults.zIndex++,bottom:-document.body.scrollTop-document.documentElement.scrollTop},title:"",width:300,height:150,minHeight:0,showType:"slide",showSpeed:600,content:_9.msg,timeout:4000},_9); +var _b=$("
                                                                                                    ").appendTo("body"); +_b.dialog($.extend({},_a,{noheader:(_a.title?false:true),openAnimation:(_a.showType),closeAnimation:(_a.showType=="show"?"hide":_a.showType),openDuration:_a.showSpeed,closeDuration:_a.showSpeed,onOpen:function(){ +_b.dialog("dialog").hover(function(){ +if(_a.timer){ +clearTimeout(_a.timer); +} +},function(){ +_c(); +}); +_c(); +function _c(){ +if(_a.timeout>0){ +_a.timer=setTimeout(function(){ +if(_b.length&&_b.data("dialog")){ +_b.dialog("close"); +} +},_a.timeout); +} +}; +if(_9.onOpen){ +_9.onOpen.call(this); +}else{ +_a.onOpen.call(this); +} +},onClose:function(){ +if(_a.timer){ +clearTimeout(_a.timer); +} +if(_9.onClose){ +_9.onClose.call(this); +}else{ +_a.onClose.call(this); +} +_b.dialog("destroy"); +}})); +_b.dialog("dialog").css(_a.style); +_b.dialog("open"); +return _b; +}; +function _d(_e){ +_1(); +var _f=$("
                                                                                                    ").appendTo("body"); +_f.dialog($.extend({},_e,{noheader:(_e.title?false:true),onClose:function(){ +_7(); +if(_e.onClose){ +_e.onClose.call(this); +} +_f.dialog("destroy"); +}})); +var win=_f.dialog("dialog").addClass("messager-window"); +win.find(".dialog-button").addClass("messager-button").find("a:first").focus(); +return _f; +}; +function _6(dlg,_10){ +var _11=dlg.dialog("options"); +dlg.dialog("close"); +_11.fn(_10); +}; +$.messager={show:function(_12){ +return _8(_12); +},alert:function(_13,msg,_14,fn){ +var _15=typeof _13=="object"?_13:{title:_13,msg:msg,icon:_14,fn:fn}; +var cls=_15.icon?"messager-icon messager-"+_15.icon:""; +_15=$.extend({},$.messager.defaults,{content:"
                                                                                                    "+"
                                                                                                    "+_15.msg+"
                                                                                                    "+"
                                                                                                    "},_15); +if(!_15.buttons){ +_15.buttons=[{text:_15.ok,onClick:function(){ +_6(dlg); +}}]; +} +var dlg=_d(_15); +return dlg; +},confirm:function(_16,msg,fn){ +var _17=typeof _16=="object"?_16:{title:_16,msg:msg,fn:fn}; +_17=$.extend({},$.messager.defaults,{content:"
                                                                                                    "+"
                                                                                                    "+_17.msg+"
                                                                                                    "+"
                                                                                                    "},_17); +if(!_17.buttons){ +_17.buttons=[{text:_17.ok,onClick:function(){ +_6(dlg,true); +}},{text:_17.cancel,onClick:function(){ +_6(dlg,false); +}}]; +} +var dlg=_d(_17); +return dlg; +},prompt:function(_18,msg,fn){ +var _19=typeof _18=="object"?_18:{title:_18,msg:msg,fn:fn}; +_19=$.extend({},$.messager.defaults,{content:"
                                                                                                    "+"
                                                                                                    "+_19.msg+"
                                                                                                    "+"
                                                                                                    "+"
                                                                                                    "+"
                                                                                                    "},_19); +if(!_19.buttons){ +_19.buttons=[{text:_19.ok,onClick:function(){ +_6(dlg,dlg.find(".messager-input").val()); +}},{text:_19.cancel,onClick:function(){ +_6(dlg); +}}]; +} +var dlg=_d(_19); +dlg.find(".messager-input").focus(); +return dlg; +},progress:function(_1a){ +var _1b={bar:function(){ +return $("body>div.messager-window").find("div.messager-p-bar"); +},close:function(){ +var dlg=$("body>div.messager-window>div.messager-body:has(div.messager-progress)"); +if(dlg.length){ +dlg.dialog("close"); +} +}}; +if(typeof _1a=="string"){ +var _1c=_1b[_1a]; +return _1c(); +} +_1a=_1a||{}; +var _1d=$.extend({},{title:"",minHeight:0,content:undefined,msg:"",text:undefined,interval:300},_1a); +var dlg=_d($.extend({},$.messager.defaults,{content:"
                                                                                                    "+_1d.msg+"
                                                                                                    ",closable:false,doSize:false},_1d,{onClose:function(){ +if(this.timer){ +clearInterval(this.timer); +} +if(_1a.onClose){ +_1a.onClose.call(this); +}else{ +$.messager.defaults.onClose.call(this); +} +}})); +var bar=dlg.find("div.messager-p-bar"); +bar.progressbar({text:_1d.text}); +dlg.dialog("resize"); +if(_1d.interval){ +dlg[0].timer=setInterval(function(){ +var v=bar.progressbar("getValue"); +v+=10; +if(v>100){ +v=0; +} +bar.progressbar("setValue",v); +},_1d.interval); +} +return dlg; +}}; +$.messager.defaults=$.extend({},$.fn.dialog.defaults,{ok:"Ok",cancel:"Cancel",width:300,height:"auto",minHeight:150,modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,fn:function(){ +}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.mobile.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.mobile.js new file mode 100644 index 000000000..e76d4c028 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.mobile.js @@ -0,0 +1,141 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +$.fn.navpanel=function(_1,_2){ +if(typeof _1=="string"){ +var _3=$.fn.navpanel.methods[_1]; +return _3?_3(this,_2):this.panel(_1,_2); +}else{ +_1=_1||{}; +return this.each(function(){ +var _4=$.data(this,"navpanel"); +if(_4){ +$.extend(_4.options,_1); +}else{ +_4=$.data(this,"navpanel",{options:$.extend({},$.fn.navpanel.defaults,$.fn.navpanel.parseOptions(this),_1)}); +} +$(this).panel(_4.options); +}); +} +}; +$.fn.navpanel.methods={options:function(jq){ +return $.data(jq[0],"navpanel").options; +}}; +$.fn.navpanel.parseOptions=function(_5){ +return $.extend({},$.fn.panel.parseOptions(_5),$.parser.parseOptions(_5,[])); +}; +$.fn.navpanel.defaults=$.extend({},$.fn.panel.defaults,{fit:true,border:false,cls:"navpanel"}); +$.parser.plugins.push("navpanel"); +})(jQuery); +(function($){ +$(function(){ +$.mobile.init(); +}); +$.mobile={defaults:{animation:"slide",direction:"left",reverseDirections:{up:"down",down:"up",left:"right",right:"left"}},panels:[],init:function(_6){ +$.mobile.panels=[]; +var _7=$(_6||"body").children(".navpanel:visible"); +if(_7.length){ +_7.not(":first").children(".panel-body").navpanel("close"); +var p=_7.eq(0).children(".panel-body"); +$.mobile.panels.push({panel:p,animation:$.mobile.defaults.animation,direction:$.mobile.defaults.direction}); +} +$(document).unbind(".mobile").bind("click.mobile",function(e){ +var a=$(e.target).closest("a"); +if(a.length){ +var _8=$.parser.parseOptions(a[0],["animation","direction",{back:"boolean"}]); +if(_8.back){ +$.mobile.back(); +e.preventDefault(); +}else{ +var _9=$.trim(a.attr("href")); +if(/^#/.test(_9)){ +var to=$(_9); +if(to.length&&to.hasClass("panel-body")){ +$.mobile.go(to,_8.animation,_8.direction); +e.preventDefault(); +} +} +} +} +}); +$(window).unbind(".mobile").bind("hashchange.mobile",function(){ +var _a=$.mobile.panels.length; +if(_a>1){ +var _b=location.hash; +var p=$.mobile.panels[_a-2]; +if(!_b||_b=="#&"+p.panel.attr("id")){ +$.mobile._back(); +} +} +}); +},nav:function(_c,to,_d,_e){ +if(window.WebKitAnimationEvent){ +_d=_d!=undefined?_d:$.mobile.defaults.animation; +_e=_e!=undefined?_e:$.mobile.defaults.direction; +var _f="m-"+_d+(_e?"-"+_e:""); +var p1=$(_c).panel("open").panel("resize").panel("panel"); +var p2=$(to).panel("open").panel("resize").panel("panel"); +p1.add(p2).bind("webkitAnimationEnd",function(){ +$(this).unbind("webkitAnimationEnd"); +var p=$(this).children(".panel-body"); +if($(this).hasClass("m-in")){ +p.panel("open").panel("resize"); +}else{ +p.panel("close"); +} +$(this).removeClass(_f+" m-in m-out"); +}); +p2.addClass(_f+" m-in"); +p1.addClass(_f+" m-out"); +}else{ +$(to).panel("open").panel("resize"); +$(_c).panel("close"); +} +},_go:function(_10,_11,_12){ +_11=_11!=undefined?_11:$.mobile.defaults.animation; +_12=_12!=undefined?_12:$.mobile.defaults.direction; +var _13=$.mobile.panels[$.mobile.panels.length-1].panel; +var to=$(_10); +if(_13[0]!=to[0]){ +$.mobile.nav(_13,to,_11,_12); +$.mobile.panels.push({panel:to,animation:_11,direction:_12}); +} +},_back:function(){ +if($.mobile.panels.length<2){ +return; +} +var p1=$.mobile.panels.pop(); +var p2=$.mobile.panels[$.mobile.panels.length-1]; +var _14=p1.animation; +var _15=$.mobile.defaults.reverseDirections[p1.direction]||""; +$.mobile.nav(p1.panel,p2.panel,_14,_15); +},go:function(_16,_17,_18){ +_17=_17!=undefined?_17:$.mobile.defaults.animation; +_18=_18!=undefined?_18:$.mobile.defaults.direction; +location.hash="#&"+$(_16).attr("id"); +$.mobile._go(_16,_17,_18); +},back:function(){ +history.go(-1); +}}; +$.map(["validatebox","textbox","passwordbox","filebox","searchbox","combo","combobox","combogrid","combotree","combotreegrid","datebox","datetimebox","numberbox","spinner","numberspinner","timespinner","datetimespinner"],function(_19){ +if($.fn[_19]){ +$.extend($.fn[_19].defaults,{iconWidth:28,tipPosition:"bottom"}); +} +}); +$.map(["spinner","numberspinner","timespinner","datetimespinner"],function(_1a){ +if($.fn[_1a]){ +$.extend($.fn[_1a].defaults,{iconWidth:56,spinAlign:"horizontal"}); +} +}); +if($.fn.menu){ +$.extend($.fn.menu.defaults,{itemHeight:30,noline:true}); +} +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberbox.js new file mode 100755 index 000000000..ecae9764a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberbox.js @@ -0,0 +1,184 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"numberbox"); +var _4=_3.options; +$(_2).addClass("numberbox-f").textbox(_4); +$(_2).textbox("textbox").css({imeMode:"disabled"}); +$(_2).attr("numberboxName",$(_2).attr("textboxName")); +_3.numberbox=$(_2).next(); +_3.numberbox.addClass("numberbox"); +var _5=_4.parser.call(_2,_4.value); +var _6=_4.formatter.call(_2,_5); +$(_2).numberbox("initValue",_5).numberbox("setText",_6); +}; +function _7(_8,_9){ +var _a=$.data(_8,"numberbox"); +var _b=_a.options; +_b.value=parseFloat(_9); +var _9=_b.parser.call(_8,_9); +var _c=_b.formatter.call(_8,_9); +_b.value=_9; +$(_8).textbox("setText",_c).textbox("setValue",_9); +_c=_b.formatter.call(_8,$(_8).textbox("getValue")); +$(_8).textbox("setText",_c); +}; +$.fn.numberbox=function(_d,_e){ +if(typeof _d=="string"){ +var _f=$.fn.numberbox.methods[_d]; +if(_f){ +return _f(this,_e); +}else{ +return this.textbox(_d,_e); +} +} +_d=_d||{}; +return this.each(function(){ +var _10=$.data(this,"numberbox"); +if(_10){ +$.extend(_10.options,_d); +}else{ +_10=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_d)}); +} +_1(this); +}); +}; +$.fn.numberbox.methods={options:function(jq){ +var _11=jq.data("textbox")?jq.textbox("options"):{}; +return $.extend($.data(jq[0],"numberbox").options,{width:_11.width,originalValue:_11.originalValue,disabled:_11.disabled,readonly:_11.readonly}); +},cloneFrom:function(jq,_12){ +return jq.each(function(){ +$(this).textbox("cloneFrom",_12); +$.data(this,"numberbox",{options:$.extend(true,{},$(_12).numberbox("options"))}); +$(this).addClass("numberbox-f"); +}); +},fix:function(jq){ +return jq.each(function(){ +var _13=$(this).numberbox("options"); +_13.value=null; +var _14=_13.parser.call(this,$(this).numberbox("getText")); +$(this).numberbox("setValue",_14); +}); +},setValue:function(jq,_15){ +return jq.each(function(){ +_7(this,_15); +}); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("clear"); +$(this).numberbox("options").value=""; +}); +},reset:function(jq){ +return jq.each(function(){ +$(this).textbox("reset"); +$(this).numberbox("setValue",$(this).numberbox("getValue")); +}); +}}; +$.fn.numberbox.parseOptions=function(_16){ +var t=$(_16); +return $.extend({},$.fn.textbox.parseOptions(_16),$.parser.parseOptions(_16,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined)}); +}; +$.fn.numberbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{keypress:function(e){ +var _17=e.data.target; +var _18=$(_17).numberbox("options"); +return _18.filter.call(_17,e); +},blur:function(e){ +$(e.data.target).numberbox("fix"); +},keydown:function(e){ +if(e.keyCode==13){ +$(e.data.target).numberbox("fix"); +} +}},min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",filter:function(e){ +var _19=$(this).numberbox("options"); +var s=$(this).numberbox("getText"); +if(e.metaKey||e.ctrlKey){ +return true; +} +if($.inArray(String(e.which),["46","8","13","0"])>=0){ +return true; +} +var tmp=$(""); +tmp.html(String.fromCharCode(e.which)); +var c=tmp.text(); +tmp.remove(); +if(!c){ +return true; +} +if(c=="-"||c==_19.decimalSeparator){ +return (s.indexOf(c)==-1)?true:false; +}else{ +if(c==_19.groupSeparator){ +return true; +}else{ +if("0123456789".indexOf(c)>=0){ +return true; +}else{ +return false; +} +} +} +},formatter:function(_1a){ +if(!_1a){ +return _1a; +} +_1a=_1a+""; +var _1b=$(this).numberbox("options"); +var s1=_1a,s2=""; +var _1c=_1a.indexOf("."); +if(_1c>=0){ +s1=_1a.substring(0,_1c); +s2=_1a.substring(_1c+1,_1a.length); +} +if(_1b.groupSeparator){ +var p=/(\d+)(\d{3})/; +while(p.test(s1)){ +s1=s1.replace(p,"$1"+_1b.groupSeparator+"$2"); +} +} +if(s2){ +return _1b.prefix+s1+_1b.decimalSeparator+s2+_1b.suffix; +}else{ +return _1b.prefix+s1+_1b.suffix; +} +},parser:function(s){ +s=s+""; +var _1d=$(this).numberbox("options"); +if(_1d.prefix){ +s=$.trim(s.replace(new RegExp("\\"+$.trim(_1d.prefix),"g"),"")); +} +if(_1d.suffix){ +s=$.trim(s.replace(new RegExp("\\"+$.trim(_1d.suffix),"g"),"")); +} +if(parseFloat(s)!=_1d.value){ +if(_1d.groupSeparator){ +s=$.trim(s.replace(new RegExp("\\"+_1d.groupSeparator,"g"),"")); +} +if(_1d.decimalSeparator){ +s=$.trim(s.replace(new RegExp("\\"+_1d.decimalSeparator,"g"),".")); +} +s=s.replace(/\s/g,""); +} +var val=parseFloat(s).toFixed(_1d.precision); +if(isNaN(val)){ +val=""; +}else{ +if(typeof (_1d.min)=="number"&&val<_1d.min){ +val=_1d.min.toFixed(_1d.precision); +}else{ +if(typeof (_1d.max)=="number"&&val>_1d.max){ +val=_1d.max.toFixed(_1d.precision); +} +} +} +return val; +}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberspinner.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberspinner.js new file mode 100755 index 000000000..f27138e47 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberspinner.js @@ -0,0 +1,58 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +$(_2).addClass("numberspinner-f"); +var _3=$.data(_2,"numberspinner").options; +$(_2).numberbox($.extend({},_3,{doSize:false})).spinner(_3); +$(_2).numberbox("setValue",_3.value); +}; +function _4(_5,_6){ +var _7=$.data(_5,"numberspinner").options; +var v=parseFloat($(_5).numberbox("getValue")||_7.value)||0; +if(_6){ +v-=_7.increment; +}else{ +v+=_7.increment; +} +$(_5).numberbox("setValue",v); +}; +$.fn.numberspinner=function(_8,_9){ +if(typeof _8=="string"){ +var _a=$.fn.numberspinner.methods[_8]; +if(_a){ +return _a(this,_9); +}else{ +return this.numberbox(_8,_9); +} +} +_8=_8||{}; +return this.each(function(){ +var _b=$.data(this,"numberspinner"); +if(_b){ +$.extend(_b.options,_8); +}else{ +$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_8)}); +} +_1(this); +}); +}; +$.fn.numberspinner.methods={options:function(jq){ +var _c=jq.numberbox("options"); +return $.extend($.data(jq[0],"numberspinner").options,{width:_c.width,value:_c.value,originalValue:_c.originalValue,disabled:_c.disabled,readonly:_c.readonly}); +}}; +$.fn.numberspinner.parseOptions=function(_d){ +return $.extend({},$.fn.spinner.parseOptions(_d),$.fn.numberbox.parseOptions(_d),{}); +}; +$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(_e){ +_4(this,_e); +}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.pagination.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.pagination.js new file mode 100755 index 000000000..822a613c6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.pagination.js @@ -0,0 +1,296 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"pagination"); +var _4=_3.options; +var bb=_3.bb={}; +var _5=$(_2).addClass("pagination").html("
                                                                                                    "); +var tr=_5.find("tr"); +var aa=$.extend([],_4.layout); +if(!_4.showPageList){ +_6(aa,"list"); +} +if(!_4.showPageInfo){ +_6(aa,"info"); +} +if(!_4.showRefresh){ +_6(aa,"refresh"); +} +if(aa[0]=="sep"){ +aa.shift(); +} +if(aa[aa.length-1]=="sep"){ +aa.pop(); +} +for(var _7=0;_7"); +ps.bind("change",function(){ +_4.pageSize=parseInt($(this).val()); +_4.onChangePageSize.call(_2,_4.pageSize); +_10(_2,_4.pageNumber); +}); +for(var i=0;i<_4.pageList.length;i++){ +$("").text(_4.pageList[i]).appendTo(ps); +} +$("").append(ps).appendTo(tr); +}else{ +if(_8=="sep"){ +$("
                                                                                                    ").appendTo(tr); +}else{ +if(_8=="first"){ +bb.first=_9("first"); +}else{ +if(_8=="prev"){ +bb.prev=_9("prev"); +}else{ +if(_8=="next"){ +bb.next=_9("next"); +}else{ +if(_8=="last"){ +bb.last=_9("last"); +}else{ +if(_8=="manual"){ +$("").html(_4.beforePageText).appendTo(tr).wrap(""); +bb.num=$("").appendTo(tr).wrap(""); +bb.num.unbind(".pagination").bind("keydown.pagination",function(e){ +if(e.keyCode==13){ +var _a=parseInt($(this).val())||1; +_10(_2,_a); +return false; +} +}); +bb.after=$("").appendTo(tr).wrap(""); +}else{ +if(_8=="refresh"){ +bb.refresh=_9("refresh"); +}else{ +if(_8=="links"){ +$("").appendTo(tr); +}else{ +if(_8=="info"){ +if(_7==aa.length-1){ +$("
                                                                                                    ").appendTo(_5); +}else{ +$("
                                                                                                    ").appendTo(tr); +} +} +} +} +} +} +} +} +} +} +} +} +if(_4.buttons){ +$("
                                                                                                    ").appendTo(tr); +if($.isArray(_4.buttons)){ +for(var i=0;i<_4.buttons.length;i++){ +var _b=_4.buttons[i]; +if(_b=="-"){ +$("
                                                                                                    ").appendTo(tr); +}else{ +var td=$("").appendTo(tr); +var a=$("").appendTo(td); +a[0].onclick=eval(_b.handler||function(){ +}); +a.linkbutton($.extend({},_b,{plain:true})); +} +} +}else{ +var td=$("").appendTo(tr); +$(_4.buttons).appendTo(td).show(); +} +} +$("
                                                                                                    ").appendTo(_5); +function _9(_c){ +var _d=_4.nav[_c]; +var a=$("").appendTo(tr); +a.wrap(""); +a.linkbutton({iconCls:_d.iconCls,plain:true}).unbind(".pagination").bind("click.pagination",function(){ +_d.handler.call(_2); +}); +return a; +}; +function _6(aa,_e){ +var _f=$.inArray(_e,aa); +if(_f>=0){ +aa.splice(_f,1); +} +return aa; +}; +}; +function _10(_11,_12){ +var _13=$.data(_11,"pagination").options; +_14(_11,{pageNumber:_12}); +_13.onSelectPage.call(_11,_13.pageNumber,_13.pageSize); +}; +function _14(_15,_16){ +var _17=$.data(_15,"pagination"); +var _18=_17.options; +var bb=_17.bb; +$.extend(_18,_16||{}); +var ps=$(_15).find("select.pagination-page-list"); +if(ps.length){ +ps.val(_18.pageSize+""); +_18.pageSize=parseInt(ps.val()); +} +var _19=Math.ceil(_18.total/_18.pageSize)||1; +if(_18.pageNumber<1){ +_18.pageNumber=1; +} +if(_18.pageNumber>_19){ +_18.pageNumber=_19; +} +if(_18.total==0){ +_18.pageNumber=0; +_19=0; +} +if(bb.num){ +bb.num.val(_18.pageNumber); +} +if(bb.after){ +bb.after.html(_18.afterPageText.replace(/{pages}/,_19)); +} +var td=$(_15).find("td.pagination-links"); +if(td.length){ +td.empty(); +var _1a=_18.pageNumber-Math.floor(_18.links/2); +if(_1a<1){ +_1a=1; +} +var _1b=_1a+_18.links-1; +if(_1b>_19){ +_1b=_19; +} +_1a=_1b-_18.links+1; +if(_1a<1){ +_1a=1; +} +for(var i=_1a;i<=_1b;i++){ +var a=$("").appendTo(td); +a.linkbutton({plain:true,text:i}); +if(i==_18.pageNumber){ +a.linkbutton("select"); +}else{ +a.unbind(".pagination").bind("click.pagination",{pageNumber:i},function(e){ +_10(_15,e.data.pageNumber); +}); +} +} +} +var _1c=_18.displayMsg; +_1c=_1c.replace(/{from}/,_18.total==0?0:_18.pageSize*(_18.pageNumber-1)+1); +_1c=_1c.replace(/{to}/,Math.min(_18.pageSize*(_18.pageNumber),_18.total)); +_1c=_1c.replace(/{total}/,_18.total); +$(_15).find("div.pagination-info").html(_1c); +if(bb.first){ +bb.first.linkbutton({disabled:((!_18.total)||_18.pageNumber==1)}); +} +if(bb.prev){ +bb.prev.linkbutton({disabled:((!_18.total)||_18.pageNumber==1)}); +} +if(bb.next){ +bb.next.linkbutton({disabled:(_18.pageNumber==_19)}); +} +if(bb.last){ +bb.last.linkbutton({disabled:(_18.pageNumber==_19)}); +} +_1d(_15,_18.loading); +}; +function _1d(_1e,_1f){ +var _20=$.data(_1e,"pagination"); +var _21=_20.options; +_21.loading=_1f; +if(_21.showRefresh&&_20.bb.refresh){ +_20.bb.refresh.linkbutton({iconCls:(_21.loading?"pagination-loading":"pagination-load")}); +} +}; +$.fn.pagination=function(_22,_23){ +if(typeof _22=="string"){ +return $.fn.pagination.methods[_22](this,_23); +} +_22=_22||{}; +return this.each(function(){ +var _24; +var _25=$.data(this,"pagination"); +if(_25){ +_24=$.extend(_25.options,_22); +}else{ +_24=$.extend({},$.fn.pagination.defaults,$.fn.pagination.parseOptions(this),_22); +$.data(this,"pagination",{options:_24}); +} +_1(this); +_14(this); +}); +}; +$.fn.pagination.methods={options:function(jq){ +return $.data(jq[0],"pagination").options; +},loading:function(jq){ +return jq.each(function(){ +_1d(this,true); +}); +},loaded:function(jq){ +return jq.each(function(){ +_1d(this,false); +}); +},refresh:function(jq,_26){ +return jq.each(function(){ +_14(this,_26); +}); +},select:function(jq,_27){ +return jq.each(function(){ +_10(this,_27); +}); +}}; +$.fn.pagination.parseOptions=function(_28){ +var t=$(_28); +return $.extend({},$.parser.parseOptions(_28,[{total:"number",pageSize:"number",pageNumber:"number",links:"number"},{loading:"boolean",showPageList:"boolean",showPageInfo:"boolean",showRefresh:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined)}); +}; +$.fn.pagination.defaults={total:1,pageSize:10,pageNumber:1,pageList:[10,20,30,50],loading:false,buttons:null,showPageList:true,showPageInfo:true,showRefresh:true,links:10,layout:["list","sep","first","prev","sep","manual","sep","next","last","sep","refresh","info"],onSelectPage:function(_29,_2a){ +},onBeforeRefresh:function(_2b,_2c){ +},onRefresh:function(_2d,_2e){ +},onChangePageSize:function(_2f){ +},beforePageText:"Page",afterPageText:"of {pages}",displayMsg:"Displaying {from} to {to} of {total} items",nav:{first:{iconCls:"pagination-first",handler:function(){ +var _30=$(this).pagination("options"); +if(_30.pageNumber>1){ +$(this).pagination("select",1); +} +}},prev:{iconCls:"pagination-prev",handler:function(){ +var _31=$(this).pagination("options"); +if(_31.pageNumber>1){ +$(this).pagination("select",_31.pageNumber-1); +} +}},next:{iconCls:"pagination-next",handler:function(){ +var _32=$(this).pagination("options"); +var _33=Math.ceil(_32.total/_32.pageSize); +if(_32.pageNumber<_33){ +$(this).pagination("select",_32.pageNumber+1); +} +}},last:{iconCls:"pagination-last",handler:function(){ +var _34=$(this).pagination("options"); +var _35=Math.ceil(_34.total/_34.pageSize); +if(_34.pageNumber<_35){ +$(this).pagination("select",_35); +} +}},refresh:{iconCls:"pagination-refresh",handler:function(){ +var _36=$(this).pagination("options"); +if(_36.onBeforeRefresh.call(this,_36.pageNumber,_36.pageSize)!=false){ +$(this).pagination("select",_36.pageNumber); +_36.onRefresh.call(this,_36.pageNumber,_36.pageSize); +} +}}}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.panel.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.panel.js new file mode 100755 index 000000000..74b25b1fd --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.panel.js @@ -0,0 +1,691 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +$.fn._remove=function(){ +return this.each(function(){ +$(this).remove(); +try{ +this.outerHTML=""; +} +catch(err){ +} +}); +}; +function _1(_2){ +_2._remove(); +}; +function _3(_4,_5){ +var _6=$.data(_4,"panel"); +var _7=_6.options; +var _8=_6.panel; +var _9=_8.children(".panel-header"); +var _a=_8.children(".panel-body"); +var _b=_8.children(".panel-footer"); +var _c=(_7.halign=="left"||_7.halign=="right"); +if(_5){ +$.extend(_7,{width:_5.width,height:_5.height,minWidth:_5.minWidth,maxWidth:_5.maxWidth,minHeight:_5.minHeight,maxHeight:_5.maxHeight,left:_5.left,top:_5.top}); +_7.hasResized=false; +} +var _d=_8.outerWidth(); +var _e=_8.outerHeight(); +_8._size(_7); +var _f=_8.outerWidth(); +var _10=_8.outerHeight(); +if(_7.hasResized&&(_d==_f&&_e==_10)){ +return; +} +_7.hasResized=true; +if(!_c){ +_9._outerWidth(_8.width()); +} +_a._outerWidth(_8.width()); +if(!isNaN(parseInt(_7.height))){ +if(_c){ +if(_7.header){ +var _11=$(_7.header)._outerWidth(); +}else{ +_9.css("width",""); +var _11=_9._outerWidth(); +} +var _12=_9.find(".panel-title"); +_11+=Math.min(_12._outerWidth(),_12._outerHeight()); +var _13=_8.height(); +_9._outerWidth(_11)._outerHeight(_13); +_12._outerWidth(_9.height()); +_a._outerWidth(_8.width()-_11-_b._outerWidth())._outerHeight(_13); +_b._outerHeight(_13); +_a.css({left:"",right:""}).css(_7.halign,(_9.position()[_7.halign]+_11)+"px"); +_7.panelCssWidth=_8.css("width"); +if(_7.collapsed){ +_8._outerWidth(_11+_b._outerWidth()); +} +}else{ +_a._outerHeight(_8.height()-_9._outerHeight()-_b._outerHeight()); +} +}else{ +_a.css("height",""); +var min=$.parser.parseValue("minHeight",_7.minHeight,_8.parent()); +var max=$.parser.parseValue("maxHeight",_7.maxHeight,_8.parent()); +var _14=_9._outerHeight()+_b._outerHeight()+_8._outerHeight()-_8.height(); +_a._size("minHeight",min?(min-_14):""); +_a._size("maxHeight",max?(max-_14):""); +} +_8.css({height:(_c?undefined:""),minHeight:"",maxHeight:"",left:_7.left,top:_7.top}); +_7.onResize.apply(_4,[_7.width,_7.height]); +$(_4).panel("doLayout"); +}; +function _15(_16,_17){ +var _18=$.data(_16,"panel"); +var _19=_18.options; +var _1a=_18.panel; +if(_17){ +if(_17.left!=null){ +_19.left=_17.left; +} +if(_17.top!=null){ +_19.top=_17.top; +} +} +_1a.css({left:_19.left,top:_19.top}); +_1a.find(".tooltip-f").each(function(){ +$(this).tooltip("reposition"); +}); +_19.onMove.apply(_16,[_19.left,_19.top]); +}; +function _1b(_1c){ +$(_1c).addClass("panel-body")._size("clear"); +var _1d=$("
                                                                                                    ").insertBefore(_1c); +_1d[0].appendChild(_1c); +_1d.bind("_resize",function(e,_1e){ +if($(this).hasClass("easyui-fluid")||_1e){ +_3(_1c,{}); +} +return false; +}); +return _1d; +}; +function _1f(_20){ +var _21=$.data(_20,"panel"); +var _22=_21.options; +var _23=_21.panel; +_23.css(_22.style); +_23.addClass(_22.cls); +_23.removeClass("panel-hleft panel-hright").addClass("panel-h"+_22.halign); +_24(); +_25(); +var _26=$(_20).panel("header"); +var _27=$(_20).panel("body"); +var _28=$(_20).siblings(".panel-footer"); +if(_22.border){ +_26.removeClass("panel-header-noborder"); +_27.removeClass("panel-body-noborder"); +_28.removeClass("panel-footer-noborder"); +}else{ +_26.addClass("panel-header-noborder"); +_27.addClass("panel-body-noborder"); +_28.addClass("panel-footer-noborder"); +} +_26.addClass(_22.headerCls); +_27.addClass(_22.bodyCls); +$(_20).attr("id",_22.id||""); +if(_22.content){ +$(_20).panel("clear"); +$(_20).html(_22.content); +$.parser.parse($(_20)); +} +function _24(){ +if(_22.noheader||(!_22.title&&!_22.header)){ +_1(_23.children(".panel-header")); +_23.children(".panel-body").addClass("panel-body-noheader"); +}else{ +if(_22.header){ +$(_22.header).addClass("panel-header").prependTo(_23); +}else{ +var _29=_23.children(".panel-header"); +if(!_29.length){ +_29=$("
                                                                                                    ").prependTo(_23); +} +if(!$.isArray(_22.tools)){ +_29.find("div.panel-tool .panel-tool-a").appendTo(_22.tools); +} +_29.empty(); +var _2a=$("
                                                                                                    ").html(_22.title).appendTo(_29); +if(_22.iconCls){ +_2a.addClass("panel-with-icon"); +$("
                                                                                                    ").addClass(_22.iconCls).appendTo(_29); +} +if(_22.halign=="left"||_22.halign=="right"){ +_2a.addClass("panel-title-"+_22.titleDirection); +} +var _2b=$("
                                                                                                    ").appendTo(_29); +_2b.bind("click",function(e){ +e.stopPropagation(); +}); +if(_22.tools){ +if($.isArray(_22.tools)){ +$.map(_22.tools,function(t){ +_2c(_2b,t.iconCls,eval(t.handler)); +}); +}else{ +$(_22.tools).children().each(function(){ +$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(_2b); +}); +} +} +if(_22.collapsible){ +_2c(_2b,"panel-tool-collapse",function(){ +if(_22.collapsed==true){ +_57(_20,true); +}else{ +_43(_20,true); +} +}); +} +if(_22.minimizable){ +_2c(_2b,"panel-tool-min",function(){ +_62(_20); +}); +} +if(_22.maximizable){ +_2c(_2b,"panel-tool-max",function(){ +if(_22.maximized==true){ +_66(_20); +}else{ +_42(_20); +} +}); +} +if(_22.closable){ +_2c(_2b,"panel-tool-close",function(){ +_44(_20); +}); +} +} +_23.children("div.panel-body").removeClass("panel-body-noheader"); +} +}; +function _2c(c,_2d,_2e){ +var a=$("").addClass(_2d).appendTo(c); +a.bind("click",_2e); +}; +function _25(){ +if(_22.footer){ +$(_22.footer).addClass("panel-footer").appendTo(_23); +$(_20).addClass("panel-body-nobottom"); +}else{ +_23.children(".panel-footer").remove(); +$(_20).removeClass("panel-body-nobottom"); +} +}; +}; +function _2f(_30,_31){ +var _32=$.data(_30,"panel"); +var _33=_32.options; +if(_34){ +_33.queryParams=_31; +} +if(!_33.href){ +return; +} +if(!_32.isLoaded||!_33.cache){ +var _34=$.extend({},_33.queryParams); +if(_33.onBeforeLoad.call(_30,_34)==false){ +return; +} +_32.isLoaded=false; +if(_33.loadingMessage){ +$(_30).panel("clear"); +$(_30).html($("
                                                                                                    ").html(_33.loadingMessage)); +} +_33.loader.call(_30,_34,function(_35){ +var _36=_33.extractor.call(_30,_35); +$(_30).panel("clear"); +$(_30).html(_36); +$.parser.parse($(_30)); +_33.onLoad.apply(_30,arguments); +_32.isLoaded=true; +},function(){ +_33.onLoadError.apply(_30,arguments); +}); +} +}; +function _37(_38){ +var t=$(_38); +t.find(".combo-f").each(function(){ +$(this).combo("destroy"); +}); +t.find(".m-btn").each(function(){ +$(this).menubutton("destroy"); +}); +t.find(".s-btn").each(function(){ +$(this).splitbutton("destroy"); +}); +t.find(".tooltip-f").each(function(){ +$(this).tooltip("destroy"); +}); +t.children("div").each(function(){ +$(this)._size("unfit"); +}); +t.empty(); +}; +function _39(_3a){ +$(_3a).panel("doLayout",true); +}; +function _3b(_3c,_3d){ +var _3e=$.data(_3c,"panel"); +var _3f=_3e.options; +var _40=_3e.panel; +if(_3d!=true){ +if(_3f.onBeforeOpen.call(_3c)==false){ +return; +} +} +_40.stop(true,true); +if($.isFunction(_3f.openAnimation)){ +_3f.openAnimation.call(_3c,cb); +}else{ +switch(_3f.openAnimation){ +case "slide": +_40.slideDown(_3f.openDuration,cb); +break; +case "fade": +_40.fadeIn(_3f.openDuration,cb); +break; +case "show": +_40.show(_3f.openDuration,cb); +break; +default: +_40.show(); +cb(); +} +} +function cb(){ +_3f.closed=false; +_3f.minimized=false; +var _41=_40.children(".panel-header").find("a.panel-tool-restore"); +if(_41.length){ +_3f.maximized=true; +} +_3f.onOpen.call(_3c); +if(_3f.maximized==true){ +_3f.maximized=false; +_42(_3c); +} +if(_3f.collapsed==true){ +_3f.collapsed=false; +_43(_3c); +} +if(!_3f.collapsed){ +if(_3f.href&&(!_3e.isLoaded||!_3f.cache)){ +_2f(_3c); +_39(_3c); +_3f.doneLayout=true; +} +} +if(!_3f.doneLayout){ +_3f.doneLayout=true; +_39(_3c); +} +}; +}; +function _44(_45,_46){ +var _47=$.data(_45,"panel"); +var _48=_47.options; +var _49=_47.panel; +if(_46!=true){ +if(_48.onBeforeClose.call(_45)==false){ +return; +} +} +_49.find(".tooltip-f").each(function(){ +$(this).tooltip("hide"); +}); +_49.stop(true,true); +_49._size("unfit"); +if($.isFunction(_48.closeAnimation)){ +_48.closeAnimation.call(_45,cb); +}else{ +switch(_48.closeAnimation){ +case "slide": +_49.slideUp(_48.closeDuration,cb); +break; +case "fade": +_49.fadeOut(_48.closeDuration,cb); +break; +case "hide": +_49.hide(_48.closeDuration,cb); +break; +default: +_49.hide(); +cb(); +} +} +function cb(){ +_48.closed=true; +_48.onClose.call(_45); +}; +}; +function _4a(_4b,_4c){ +var _4d=$.data(_4b,"panel"); +var _4e=_4d.options; +var _4f=_4d.panel; +if(_4c!=true){ +if(_4e.onBeforeDestroy.call(_4b)==false){ +return; +} +} +$(_4b).panel("clear").panel("clear","footer"); +_1(_4f); +_4e.onDestroy.call(_4b); +}; +function _43(_50,_51){ +var _52=$.data(_50,"panel").options; +var _53=$.data(_50,"panel").panel; +var _54=_53.children(".panel-body"); +var _55=_53.children(".panel-header"); +var _56=_55.find("a.panel-tool-collapse"); +if(_52.collapsed==true){ +return; +} +_54.stop(true,true); +if(_52.onBeforeCollapse.call(_50)==false){ +return; +} +_56.addClass("panel-tool-expand"); +if(_51==true){ +if(_52.halign=="left"||_52.halign=="right"){ +_53.animate({width:_55._outerWidth()+_53.children(".panel-footer")._outerWidth()},function(){ +cb(); +}); +}else{ +_54.slideUp("normal",function(){ +cb(); +}); +} +}else{ +if(_52.halign=="left"||_52.halign=="right"){ +_53._outerWidth(_55._outerWidth()+_53.children(".panel-footer")._outerWidth()); +} +cb(); +} +function cb(){ +_54.hide(); +_52.collapsed=true; +_52.onCollapse.call(_50); +}; +}; +function _57(_58,_59){ +var _5a=$.data(_58,"panel").options; +var _5b=$.data(_58,"panel").panel; +var _5c=_5b.children(".panel-body"); +var _5d=_5b.children(".panel-header").find("a.panel-tool-collapse"); +if(_5a.collapsed==false){ +return; +} +_5c.stop(true,true); +if(_5a.onBeforeExpand.call(_58)==false){ +return; +} +_5d.removeClass("panel-tool-expand"); +if(_59==true){ +if(_5a.halign=="left"||_5a.halign=="right"){ +_5c.show(); +_5b.animate({width:_5a.panelCssWidth},function(){ +cb(); +}); +}else{ +_5c.slideDown("normal",function(){ +cb(); +}); +} +}else{ +if(_5a.halign=="left"||_5a.halign=="right"){ +_5b.css("width",_5a.panelCssWidth); +} +cb(); +} +function cb(){ +_5c.show(); +_5a.collapsed=false; +_5a.onExpand.call(_58); +_2f(_58); +_39(_58); +}; +}; +function _42(_5e){ +var _5f=$.data(_5e,"panel").options; +var _60=$.data(_5e,"panel").panel; +var _61=_60.children(".panel-header").find("a.panel-tool-max"); +if(_5f.maximized==true){ +return; +} +_61.addClass("panel-tool-restore"); +if(!$.data(_5e,"panel").original){ +$.data(_5e,"panel").original={width:_5f.width,height:_5f.height,left:_5f.left,top:_5f.top,fit:_5f.fit}; +} +_5f.left=0; +_5f.top=0; +_5f.fit=true; +_3(_5e); +_5f.minimized=false; +_5f.maximized=true; +_5f.onMaximize.call(_5e); +}; +function _62(_63){ +var _64=$.data(_63,"panel").options; +var _65=$.data(_63,"panel").panel; +_65._size("unfit"); +_65.hide(); +_64.minimized=true; +_64.maximized=false; +_64.onMinimize.call(_63); +}; +function _66(_67){ +var _68=$.data(_67,"panel").options; +var _69=$.data(_67,"panel").panel; +var _6a=_69.children(".panel-header").find("a.panel-tool-max"); +if(_68.maximized==false){ +return; +} +_69.show(); +_6a.removeClass("panel-tool-restore"); +$.extend(_68,$.data(_67,"panel").original); +_3(_67); +_68.minimized=false; +_68.maximized=false; +$.data(_67,"panel").original=null; +_68.onRestore.call(_67); +}; +function _6b(_6c,_6d){ +$.data(_6c,"panel").options.title=_6d; +$(_6c).panel("header").find("div.panel-title").html(_6d); +}; +var _6e=null; +$(window).unbind(".panel").bind("resize.panel",function(){ +if(_6e){ +clearTimeout(_6e); +} +_6e=setTimeout(function(){ +var _6f=$("body.layout"); +if(_6f.length){ +_6f.layout("resize"); +$("body").children(".easyui-fluid:visible").each(function(){ +$(this).triggerHandler("_resize"); +}); +}else{ +$("body").panel("doLayout"); +} +_6e=null; +},100); +}); +$.fn.panel=function(_70,_71){ +if(typeof _70=="string"){ +return $.fn.panel.methods[_70](this,_71); +} +_70=_70||{}; +return this.each(function(){ +var _72=$.data(this,"panel"); +var _73; +if(_72){ +_73=$.extend(_72.options,_70); +_72.isLoaded=false; +}else{ +_73=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_70); +$(this).attr("title",""); +_72=$.data(this,"panel",{options:_73,panel:_1b(this),isLoaded:false}); +} +_1f(this); +$(this).show(); +if(_73.doSize==true){ +_72.panel.css("display","block"); +_3(this); +} +if(_73.closed==true||_73.minimized==true){ +_72.panel.hide(); +}else{ +_3b(this); +} +}); +}; +$.fn.panel.methods={options:function(jq){ +return $.data(jq[0],"panel").options; +},panel:function(jq){ +return $.data(jq[0],"panel").panel; +},header:function(jq){ +return $.data(jq[0],"panel").panel.children(".panel-header"); +},footer:function(jq){ +return jq.panel("panel").children(".panel-footer"); +},body:function(jq){ +return $.data(jq[0],"panel").panel.children(".panel-body"); +},setTitle:function(jq,_74){ +return jq.each(function(){ +_6b(this,_74); +}); +},open:function(jq,_75){ +return jq.each(function(){ +_3b(this,_75); +}); +},close:function(jq,_76){ +return jq.each(function(){ +_44(this,_76); +}); +},destroy:function(jq,_77){ +return jq.each(function(){ +_4a(this,_77); +}); +},clear:function(jq,_78){ +return jq.each(function(){ +_37(_78=="footer"?$(this).panel("footer"):this); +}); +},refresh:function(jq,_79){ +return jq.each(function(){ +var _7a=$.data(this,"panel"); +_7a.isLoaded=false; +if(_79){ +if(typeof _79=="string"){ +_7a.options.href=_79; +}else{ +_7a.options.queryParams=_79; +} +} +_2f(this); +}); +},resize:function(jq,_7b){ +return jq.each(function(){ +_3(this,_7b||{}); +}); +},doLayout:function(jq,all){ +return jq.each(function(){ +_7c(this,"body"); +_7c($(this).siblings(".panel-footer")[0],"footer"); +function _7c(_7d,_7e){ +if(!_7d){ +return; +} +var _7f=_7d==$("body")[0]; +var s=$(_7d).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible,.easyui-fluid:visible").filter(function(_80,el){ +var p=$(el).parents(".panel-"+_7e+":first"); +return _7f?p.length==0:p[0]==_7d; +}); +s.each(function(){ +$(this).triggerHandler("_resize",[all||false]); +}); +}; +}); +},move:function(jq,_81){ +return jq.each(function(){ +_15(this,_81); +}); +},maximize:function(jq){ +return jq.each(function(){ +_42(this); +}); +},minimize:function(jq){ +return jq.each(function(){ +_62(this); +}); +},restore:function(jq){ +return jq.each(function(){ +_66(this); +}); +},collapse:function(jq,_82){ +return jq.each(function(){ +_43(this,_82); +}); +},expand:function(jq,_83){ +return jq.each(function(){ +_57(this,_83); +}); +}}; +$.fn.panel.parseOptions=function(_84){ +var t=$(_84); +var hh=t.children(".panel-header,header"); +var ff=t.children(".panel-footer,footer"); +return $.extend({},$.parser.parseOptions(_84,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href","method","header","footer","halign","titleDirection",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"},"openAnimation","closeAnimation",{openDuration:"number",closeDuration:"number"},]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined),header:(hh.length?hh.removeClass("panel-header"):undefined),footer:(ff.length?ff.removeClass("panel-footer"):undefined)}); +}; +$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,halign:"top",titleDirection:"down",collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,openAnimation:false,openDuration:400,closeAnimation:false,closeDuration:400,tools:null,footer:null,header:null,queryParams:{},method:"get",href:null,loadingMessage:"Loading...",loader:function(_85,_86,_87){ +var _88=$(this).panel("options"); +if(!_88.href){ +return false; +} +$.ajax({type:_88.method,url:_88.href,cache:false,data:_85,dataType:"html",success:function(_89){ +_86(_89); +},error:function(){ +_87.apply(this,arguments); +}}); +},extractor:function(_8a){ +var _8b=/]*>((.|[\n\r])*)<\/body>/im; +var _8c=_8b.exec(_8a); +if(_8c){ +return _8c[1]; +}else{ +return _8a; +} +},onBeforeLoad:function(_8d){ +},onLoad:function(){ +},onLoadError:function(){ +},onBeforeOpen:function(){ +},onOpen:function(){ +},onBeforeClose:function(){ +},onClose:function(){ +},onBeforeDestroy:function(){ +},onDestroy:function(){ +},onResize:function(_8e,_8f){ +},onMove:function(_90,top){ +},onMaximize:function(){ +},onRestore:function(){ +},onMinimize:function(){ +},onBeforeCollapse:function(){ +},onBeforeExpand:function(){ +},onCollapse:function(){ +},onExpand:function(){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.parser.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.parser.js new file mode 100755 index 000000000..2b121d415 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.parser.js @@ -0,0 +1,386 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +$.easyui={indexOfArray:function(a,o,id){ +for(var i=0,_1=a.length;i<_1;i++){ +if(id==undefined){ +if(a[i]==o){ +return i; +} +}else{ +if(a[i][o]==id){ +return i; +} +} +} +return -1; +},removeArrayItem:function(a,o,id){ +if(typeof o=="string"){ +for(var i=0,_2=a.length;i<_2;i++){ +if(a[i][o]==id){ +a.splice(i,1); +return; +} +} +}else{ +var _3=this.indexOfArray(a,o); +if(_3!=-1){ +a.splice(_3,1); +} +} +},addArrayItem:function(a,o,r){ +var _4=this.indexOfArray(a,o,r?r[o]:undefined); +if(_4==-1){ +a.push(r?r:o); +}else{ +a[_4]=r?r:o; +} +},getArrayItem:function(a,o,id){ +var _5=this.indexOfArray(a,o,id); +return _5==-1?null:a[_5]; +},forEach:function(_6,_7,_8){ +var _9=[]; +for(var i=0;i<_6.length;i++){ +_9.push(_6[i]); +} +while(_9.length){ +var _a=_9.shift(); +if(_8(_a)==false){ +return; +} +if(_7&&_a.children){ +for(var i=_a.children.length-1;i>=0;i--){ +_9.unshift(_a.children[i]); +} +} +} +}}; +$.parser={auto:true,onComplete:function(_b){ +},plugins:["draggable","droppable","resizable","pagination","tooltip","linkbutton","menu","sidemenu","menubutton","splitbutton","switchbutton","progressbar","tree","textbox","passwordbox","maskedbox","filebox","combo","combobox","combotree","combogrid","combotreegrid","tagbox","numberbox","validatebox","searchbox","spinner","numberspinner","timespinner","datetimespinner","calendar","datebox","datetimebox","slider","layout","panel","datagrid","propertygrid","treegrid","datalist","tabs","accordion","window","dialog","form"],parse:function(_c){ +var aa=[]; +for(var i=0;i<$.parser.plugins.length;i++){ +var _d=$.parser.plugins[i]; +var r=$(".easyui-"+_d,_c); +if(r.length){ +if(r[_d]){ +r.each(function(){ +$(this)[_d]($.data(this,"options")||{}); +}); +}else{ +aa.push({name:_d,jq:r}); +} +} +} +if(aa.length&&window.easyloader){ +var _e=[]; +for(var i=0;i=0){ +v=Math.floor((_12.width()-_13)*v/100); +}else{ +v=Math.floor((_12.height()-_13)*v/100); +} +}else{ +v=parseInt(v)||undefined; +} +return v; +},parseOptions:function(_15,_16){ +var t=$(_15); +var _17={}; +var s=$.trim(t.attr("data-options")); +if(s){ +if(s.substring(0,1)!="{"){ +s="{"+s+"}"; +} +_17=(new Function("return "+s))(); +} +$.map(["width","height","left","top","minWidth","maxWidth","minHeight","maxHeight"],function(p){ +var pv=$.trim(_15.style[p]||""); +if(pv){ +if(pv.indexOf("%")==-1){ +pv=parseInt(pv); +if(isNaN(pv)){ +pv=undefined; +} +} +_17[p]=pv; +} +}); +if(_16){ +var _18={}; +for(var i=0;i<_16.length;i++){ +var pp=_16[i]; +if(typeof pp=="string"){ +_18[pp]=t.attr(pp); +}else{ +for(var _19 in pp){ +var _1a=pp[_19]; +if(_1a=="boolean"){ +_18[_19]=t.attr(_19)?(t.attr(_19)=="true"):undefined; +}else{ +if(_1a=="number"){ +_18[_19]=t.attr(_19)=="0"?0:parseFloat(t.attr(_19))||undefined; +} +} +} +} +} +$.extend(_17,_18); +} +return _17; +}}; +$(function(){ +var d=$("
                                                                                                    ").appendTo("body"); +$._boxModel=d.outerWidth()!=100; +d.remove(); +d=$("
                                                                                                    ").appendTo("body"); +$._positionFixed=(d.css("position")=="fixed"); +d.remove(); +if(!window.easyloader&&$.parser.auto){ +$.parser.parse(); +} +}); +$.fn._outerWidth=function(_1b){ +if(_1b==undefined){ +if(this[0]==window){ +return this.width()||document.body.clientWidth; +} +return this.outerWidth()||0; +} +return this._size("width",_1b); +}; +$.fn._outerHeight=function(_1c){ +if(_1c==undefined){ +if(this[0]==window){ +return this.height()||document.body.clientHeight; +} +return this.outerHeight()||0; +} +return this._size("height",_1c); +}; +$.fn._scrollLeft=function(_1d){ +if(_1d==undefined){ +return this.scrollLeft(); +}else{ +return this.each(function(){ +$(this).scrollLeft(_1d); +}); +} +}; +$.fn._propAttr=$.fn.prop||$.fn.attr; +$.fn._size=function(_1e,_1f){ +if(typeof _1e=="string"){ +if(_1e=="clear"){ +return this.each(function(){ +$(this).css({width:"",minWidth:"",maxWidth:"",height:"",minHeight:"",maxHeight:""}); +}); +}else{ +if(_1e=="fit"){ +return this.each(function(){ +_20(this,this.tagName=="BODY"?$("body"):$(this).parent(),true); +}); +}else{ +if(_1e=="unfit"){ +return this.each(function(){ +_20(this,$(this).parent(),false); +}); +}else{ +if(_1f==undefined){ +return _21(this[0],_1e); +}else{ +return this.each(function(){ +_21(this,_1e,_1f); +}); +} +} +} +} +}else{ +return this.each(function(){ +_1f=_1f||$(this).parent(); +$.extend(_1e,_20(this,_1f,_1e.fit)||{}); +var r1=_22(this,"width",_1f,_1e); +var r2=_22(this,"height",_1f,_1e); +if(r1||r2){ +$(this).addClass("easyui-fluid"); +}else{ +$(this).removeClass("easyui-fluid"); +} +}); +} +function _20(_23,_24,fit){ +if(!_24.length){ +return false; +} +var t=$(_23)[0]; +var p=_24[0]; +var _25=p.fcount||0; +if(fit){ +if(!t.fitted){ +t.fitted=true; +p.fcount=_25+1; +$(p).addClass("panel-noscroll"); +if(p.tagName=="BODY"){ +$("html").addClass("panel-fit"); +} +} +return {width:($(p).width()||1),height:($(p).height()||1)}; +}else{ +if(t.fitted){ +t.fitted=false; +p.fcount=_25-1; +if(p.fcount==0){ +$(p).removeClass("panel-noscroll"); +if(p.tagName=="BODY"){ +$("html").removeClass("panel-fit"); +} +} +} +return false; +} +}; +function _22(_26,_27,_28,_29){ +var t=$(_26); +var p=_27; +var p1=p.substr(0,1).toUpperCase()+p.substr(1); +var min=$.parser.parseValue("min"+p1,_29["min"+p1],_28); +var max=$.parser.parseValue("max"+p1,_29["max"+p1],_28); +var val=$.parser.parseValue(p,_29[p],_28); +var _2a=(String(_29[p]||"").indexOf("%")>=0?true:false); +if(!isNaN(val)){ +var v=Math.min(Math.max(val,min||0),max||99999); +if(!_2a){ +_29[p]=v; +} +t._size("min"+p1,""); +t._size("max"+p1,""); +t._size(p,v); +}else{ +t._size(p,""); +t._size("min"+p1,min); +t._size("max"+p1,max); +} +return _2a||_29.fit; +}; +function _21(_2b,_2c,_2d){ +var t=$(_2b); +if(_2d==undefined){ +_2d=parseInt(_2b.style[_2c]); +if(isNaN(_2d)){ +return undefined; +} +if($._boxModel){ +_2d+=_2e(); +} +return _2d; +}else{ +if(_2d===""){ +t.css(_2c,""); +}else{ +if($._boxModel){ +_2d-=_2e(); +if(_2d<0){ +_2d=0; +} +} +t.css(_2c,_2d+"px"); +} +} +function _2e(){ +if(_2c.toLowerCase().indexOf("width")>=0){ +return t.outerWidth()-t.width(); +}else{ +return t.outerHeight()-t.height(); +} +}; +}; +}; +})(jQuery); +(function($){ +var _2f=null; +var _30=null; +var _31=false; +function _32(e){ +if(e.touches.length!=1){ +return; +} +if(!_31){ +_31=true; +dblClickTimer=setTimeout(function(){ +_31=false; +},500); +}else{ +clearTimeout(dblClickTimer); +_31=false; +_33(e,"dblclick"); +} +_2f=setTimeout(function(){ +_33(e,"contextmenu",3); +},1000); +_33(e,"mousedown"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _34(e){ +if(e.touches.length!=1){ +return; +} +if(_2f){ +clearTimeout(_2f); +} +_33(e,"mousemove"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _35(e){ +if(_2f){ +clearTimeout(_2f); +} +_33(e,"mouseup"); +if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ +e.preventDefault(); +} +}; +function _33(e,_36,_37){ +var _38=new $.Event(_36); +_38.pageX=e.changedTouches[0].pageX; +_38.pageY=e.changedTouches[0].pageY; +_38.which=_37||1; +$(e.target).trigger(_38); +}; +if(document.addEventListener){ +document.addEventListener("touchstart",_32,true); +document.addEventListener("touchmove",_34,true); +document.addEventListener("touchend",_35,true); +} +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.passwordbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.passwordbox.js new file mode 100644 index 000000000..d28bb1018 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.passwordbox.js @@ -0,0 +1,156 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"passwordbox"); +var _4=_3.options; +var _5=$.extend(true,[],_4.icons); +if(_4.showEye){ +_5.push({iconCls:"passwordbox-open",handler:function(e){ +_4.revealed=!_4.revealed; +_6(_2); +}}); +} +$(_2).addClass("passwordbox-f").textbox($.extend({},_4,{icons:_5})); +_6(_2); +}; +function _7(_8,_9,_a){ +var t=$(_8); +var _b=t.passwordbox("options"); +if(_b.revealed){ +t.textbox("setValue",_9); +return; +} +var _c=unescape(_b.passwordChar); +var cc=_9.split(""); +var vv=t.passwordbox("getValue").split(""); +for(var i=0;i
                                                                                                    "); +$(_2).bind("_resize",function(e,_3){ +if($(this).hasClass("easyui-fluid")||_3){ +_4(_2); +} +return false; +}); +return $(_2); +}; +function _4(_5,_6){ +var _7=$.data(_5,"progressbar").options; +var _8=$.data(_5,"progressbar").bar; +if(_6){ +_7.width=_6; +} +_8._size(_7); +_8.find("div.progressbar-text").css("width",_8.width()); +_8.find("div.progressbar-text,div.progressbar-value").css({height:_8.height()+"px",lineHeight:_8.height()+"px"}); +}; +$.fn.progressbar=function(_9,_a){ +if(typeof _9=="string"){ +var _b=$.fn.progressbar.methods[_9]; +if(_b){ +return _b(this,_a); +} +} +_9=_9||{}; +return this.each(function(){ +var _c=$.data(this,"progressbar"); +if(_c){ +$.extend(_c.options,_9); +}else{ +_c=$.data(this,"progressbar",{options:$.extend({},$.fn.progressbar.defaults,$.fn.progressbar.parseOptions(this),_9),bar:_1(this)}); +} +$(this).progressbar("setValue",_c.options.value); +_4(this); +}); +}; +$.fn.progressbar.methods={options:function(jq){ +return $.data(jq[0],"progressbar").options; +},resize:function(jq,_d){ +return jq.each(function(){ +_4(this,_d); +}); +},getValue:function(jq){ +return $.data(jq[0],"progressbar").options.value; +},setValue:function(jq,_e){ +if(_e<0){ +_e=0; +} +if(_e>100){ +_e=100; +} +return jq.each(function(){ +var _f=$.data(this,"progressbar").options; +var _10=_f.text.replace(/{value}/,_e); +var _11=_f.value; +_f.value=_e; +$(this).find("div.progressbar-value").width(_e+"%"); +$(this).find("div.progressbar-text").html(_10); +if(_11!=_e){ +_f.onChange.call(this,_e,_11); +} +}); +}}; +$.fn.progressbar.parseOptions=function(_12){ +return $.extend({},$.parser.parseOptions(_12,["width","height","text",{value:"number"}])); +}; +$.fn.progressbar.defaults={width:"auto",height:22,value:0,text:"{value}%",onChange:function(_13,_14){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.propertygrid.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.propertygrid.js new file mode 100755 index 000000000..d8c47932a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.propertygrid.js @@ -0,0 +1,427 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +var _1; +$(document).unbind(".propertygrid").bind("mousedown.propertygrid",function(e){ +var p=$(e.target).closest("div.datagrid-view,div.combo-panel"); +if(p.length){ +return; +} +_2(_1); +_1=undefined; +}); +function _3(_4){ +var _5=$.data(_4,"propertygrid"); +var _6=$.data(_4,"propertygrid").options; +$(_4).datagrid($.extend({},_6,{cls:"propertygrid",view:(_6.showGroup?_6.groupView:_6.view),onBeforeEdit:function(_7,_8){ +if(_6.onBeforeEdit.call(_4,_7,_8)==false){ +return false; +} +var dg=$(this); +var _8=dg.datagrid("getRows")[_7]; +var _9=dg.datagrid("getColumnOption","value"); +_9.editor=_8.editor; +},onClickCell:function(_a,_b,_c){ +if(_1!=this){ +_2(_1); +_1=this; +} +if(_6.editIndex!=_a){ +_2(_1); +$(this).datagrid("beginEdit",_a); +var ed=$(this).datagrid("getEditor",{index:_a,field:_b}); +if(!ed){ +ed=$(this).datagrid("getEditor",{index:_a,field:"value"}); +} +if(ed){ +var t=$(ed.target); +var _d=t.data("textbox")?t.textbox("textbox"):t; +_d.focus(); +_6.editIndex=_a; +} +} +_6.onClickCell.call(_4,_a,_b,_c); +},loadFilter:function(_e){ +_2(this); +return _6.loadFilter.call(this,_e); +}})); +}; +function _2(_f){ +var t=$(_f); +if(!t.length){ +return; +} +var _10=$.data(_f,"propertygrid").options; +_10.finder.getTr(_f,null,"editing").each(function(){ +var _11=parseInt($(this).attr("datagrid-row-index")); +if(t.datagrid("validateRow",_11)){ +t.datagrid("endEdit",_11); +}else{ +t.datagrid("cancelEdit",_11); +} +}); +_10.editIndex=undefined; +}; +$.fn.propertygrid=function(_12,_13){ +if(typeof _12=="string"){ +var _14=$.fn.propertygrid.methods[_12]; +if(_14){ +return _14(this,_13); +}else{ +return this.datagrid(_12,_13); +} +} +_12=_12||{}; +return this.each(function(){ +var _15=$.data(this,"propertygrid"); +if(_15){ +$.extend(_15.options,_12); +}else{ +var _16=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_12); +_16.frozenColumns=$.extend(true,[],_16.frozenColumns); +_16.columns=$.extend(true,[],_16.columns); +$.data(this,"propertygrid",{options:_16}); +} +_3(this); +}); +}; +$.fn.propertygrid.methods={options:function(jq){ +return $.data(jq[0],"propertygrid").options; +}}; +$.fn.propertygrid.parseOptions=function(_17){ +return $.extend({},$.fn.datagrid.parseOptions(_17),$.parser.parseOptions(_17,[{showGroup:"boolean"}])); +}; +var _18=$.extend({},$.fn.datagrid.defaults.view,{render:function(_19,_1a,_1b){ +var _1c=[]; +var _1d=this.groups; +for(var i=0;i<_1d.length;i++){ +_1c.push(this.renderGroup.call(this,_19,i,_1d[i],_1b)); +} +$(_1a).html(_1c.join("")); +},renderGroup:function(_1e,_1f,_20,_21){ +var _22=$.data(_1e,"datagrid"); +var _23=_22.options; +var _24=$(_1e).datagrid("getColumnFields",_21); +var _25=_23.frozenColumns&&_23.frozenColumns.length; +if(_21){ +if(!(_23.rownumbers||_25)){ +return ""; +} +} +var _26=[]; +var css=_23.groupStyler.call(_1e,_20.value,_20.rows); +var cs=_27(css,"datagrid-group"); +_26.push("
                                                                                                    "); +if((_21&&(_23.rownumbers||_23.frozenColumns.length))||(!_21&&!(_23.rownumbers||_23.frozenColumns.length))){ +_26.push(""); +_26.push(" "); +_26.push(""); +} +if((_21&&_25)||(!_21)){ +_26.push(""); +_26.push(_23.groupFormatter.call(_1e,_20.value,_20.rows)); +_26.push(""); +} +_26.push("
                                                                                                    "); +_26.push(""); +var _28=_20.startIndex; +for(var j=0;j<_20.rows.length;j++){ +var css=_23.rowStyler?_23.rowStyler.call(_1e,_28,_20.rows[j]):""; +var _29=""; +var _2a=""; +if(typeof css=="string"){ +_2a=css; +}else{ +if(css){ +_29=css["class"]||""; +_2a=css["style"]||""; +} +} +var cls="class=\"datagrid-row "+(_28%2&&_23.striped?"datagrid-row-alt ":" ")+_29+"\""; +var _2b=_2a?"style=\""+_2a+"\"":""; +var _2c=_22.rowIdPrefix+"-"+(_21?1:2)+"-"+_28; +_26.push(""); +_26.push(this.renderRow.call(this,_1e,_24,_21,_28,_20.rows[j])); +_26.push(""); +_28++; +} +_26.push("
                                                                                                    "); +return _26.join(""); +function _27(css,cls){ +var _2d=""; +var _2e=""; +if(typeof css=="string"){ +_2e=css; +}else{ +if(css){ +_2d=css["class"]||""; +_2e=css["style"]||""; +} +} +return "class=\""+cls+(_2d?" "+_2d:"")+"\" "+"style=\""+_2e+"\""; +}; +},bindEvents:function(_2f){ +var _30=$.data(_2f,"datagrid"); +var dc=_30.dc; +var _31=dc.body1.add(dc.body2); +var _32=($.data(_31[0],"events")||$._data(_31[0],"events")).click[0].handler; +_31.unbind("click").bind("click",function(e){ +var tt=$(e.target); +var _33=tt.closest("span.datagrid-row-expander"); +if(_33.length){ +var _34=_33.closest("div.datagrid-group").attr("group-index"); +if(_33.hasClass("datagrid-row-collapse")){ +$(_2f).datagrid("collapseGroup",_34); +}else{ +$(_2f).datagrid("expandGroup",_34); +} +}else{ +_32(e); +} +e.stopPropagation(); +}); +},onBeforeRender:function(_35,_36){ +var _37=$.data(_35,"datagrid"); +var _38=_37.options; +_39(); +var _3a=[]; +for(var i=0;i<_36.length;i++){ +var row=_36[i]; +var _3b=_3c(row[_38.groupField]); +if(!_3b){ +_3b={value:row[_38.groupField],rows:[row]}; +_3a.push(_3b); +}else{ +_3b.rows.push(row); +} +} +var _3d=0; +var _3e=[]; +for(var i=0;i<_3a.length;i++){ +var _3b=_3a[i]; +_3b.startIndex=_3d; +_3d+=_3b.rows.length; +_3e=_3e.concat(_3b.rows); +} +_37.data.rows=_3e; +this.groups=_3a; +var _3f=this; +setTimeout(function(){ +_3f.bindEvents(_35); +},0); +function _3c(_40){ +for(var i=0;i<_3a.length;i++){ +var _41=_3a[i]; +if(_41.value==_40){ +return _41; +} +} +return null; +}; +function _39(){ +if(!$("#datagrid-group-style").length){ +$("head").append(""); +} +}; +},onAfterRender:function(_42){ +$.fn.datagrid.defaults.view.onAfterRender.call(this,_42); +var _43=this; +var _44=$.data(_42,"datagrid"); +var _45=_44.options; +if(!_44.onResizeColumn){ +_44.onResizeColumn=_45.onResizeColumn; +} +if(!_44.onResize){ +_44.onResize=_45.onResize; +} +_45.onResizeColumn=function(_46,_47){ +_43.resizeGroup(_42); +_44.onResizeColumn.call(_42,_46,_47); +}; +_45.onResize=function(_48,_49){ +_43.resizeGroup(_42); +_44.onResize.call($(_42).datagrid("getPanel")[0],_48,_49); +}; +_43.resizeGroup(_42); +}}); +$.extend($.fn.datagrid.methods,{groups:function(jq){ +return jq.datagrid("options").view.groups; +},expandGroup:function(jq,_4a){ +return jq.each(function(){ +var _4b=$(this).datagrid("options"); +var _4c=$.data(this,"datagrid").dc.view; +var _4d=_4c.find(_4a!=undefined?"div.datagrid-group[group-index=\""+_4a+"\"]":"div.datagrid-group"); +var _4e=_4d.find("span.datagrid-row-expander"); +if(_4e.hasClass("datagrid-row-expand")){ +_4e.removeClass("datagrid-row-expand").addClass("datagrid-row-collapse"); +_4d.next("table").show(); +} +$(this).datagrid("fixRowHeight"); +if(_4b.onExpandGroup){ +_4b.onExpandGroup.call(this,_4a); +} +}); +},collapseGroup:function(jq,_4f){ +return jq.each(function(){ +var _50=$(this).datagrid("options"); +var _51=$.data(this,"datagrid").dc.view; +var _52=_51.find(_4f!=undefined?"div.datagrid-group[group-index=\""+_4f+"\"]":"div.datagrid-group"); +var _53=_52.find("span.datagrid-row-expander"); +if(_53.hasClass("datagrid-row-collapse")){ +_53.removeClass("datagrid-row-collapse").addClass("datagrid-row-expand"); +_52.next("table").hide(); +} +$(this).datagrid("fixRowHeight"); +if(_50.onCollapseGroup){ +_50.onCollapseGroup.call(this,_4f); +} +}); +},scrollToGroup:function(jq,_54){ +return jq.each(function(){ +var _55=$.data(this,"datagrid"); +var dc=_55.dc; +var _56=dc.body2.children("div.datagrid-group[group-index=\""+_54+"\"]"); +if(_56.length){ +var _57=_56.outerHeight(); +var _58=dc.view2.children("div.datagrid-header")._outerHeight(); +var _59=dc.body2.outerHeight(true)-dc.body2.outerHeight(); +var top=_56.position().top-_58-_59; +if(top<0){ +dc.body2.scrollTop(dc.body2.scrollTop()+top); +}else{ +if(top+_57>dc.body2.height()-18){ +dc.body2.scrollTop(dc.body2.scrollTop()+top+_57-dc.body2.height()+18); +} +} +} +}); +}}); +$.extend(_18,{refreshGroupTitle:function(_5a,_5b){ +var _5c=$.data(_5a,"datagrid"); +var _5d=_5c.options; +var dc=_5c.dc; +var _5e=this.groups[_5b]; +var _5f=dc.body1.add(dc.body2).children("div.datagrid-group[group-index="+_5b+"]").find("span.datagrid-group-title"); +_5f.html(_5d.groupFormatter.call(_5a,_5e.value,_5e.rows)); +},resizeGroup:function(_60,_61){ +var _62=$.data(_60,"datagrid"); +var dc=_62.dc; +var ht=dc.header2.find("table"); +var fr=ht.find("tr.datagrid-filter-row").hide(); +var ww=ht.width(); +if(_61==undefined){ +var _63=dc.body2.children("div.datagrid-group"); +}else{ +var _63=dc.body2.children("div.datagrid-group[group-index="+_61+"]"); +} +_63._outerWidth(ww); +var _64=_62.options; +if(_64.frozenColumns&&_64.frozenColumns.length){ +var _65=dc.view1.width()-_64.expanderWidth; +var _66=dc.view1.css("direction").toLowerCase()=="rtl"; +_63.find(".datagrid-group-title").css(_66?"right":"left",-_65+"px"); +} +if(fr.length){ +if(_64.showFilterBar){ +fr.show(); +} +} +},insertRow:function(_67,_68,row){ +var _69=$.data(_67,"datagrid"); +var _6a=_69.options; +var dc=_69.dc; +var _6b=null; +var _6c; +if(!_69.data.rows.length){ +$(_67).datagrid("loadData",[row]); +return; +} +for(var i=0;i_6b.startIndex+_6b.rows.length){ +_68=_6b.startIndex+_6b.rows.length; +} +} +$.fn.datagrid.defaults.view.insertRow.call(this,_67,_68,row); +if(_68>=_6b.startIndex+_6b.rows.length){ +_6d(_68,true); +_6d(_68,false); +} +_6b.rows.splice(_68-_6b.startIndex,0,row); +}else{ +_6b={value:row[_6a.groupField],rows:[row],startIndex:_69.data.rows.length}; +_6c=this.groups.length; +dc.body1.append(this.renderGroup.call(this,_67,_6c,_6b,true)); +dc.body2.append(this.renderGroup.call(this,_67,_6c,_6b,false)); +this.groups.push(_6b); +_69.data.rows.push(row); +} +this.setGroupIndex(_67); +this.refreshGroupTitle(_67,_6c); +this.resizeGroup(_67); +function _6d(_6e,_6f){ +var _70=_6f?1:2; +var _71=_6a.finder.getTr(_67,_6e-1,"body",_70); +var tr=_6a.finder.getTr(_67,_6e,"body",_70); +tr.insertAfter(_71); +}; +},updateRow:function(_72,_73,row){ +var _74=$.data(_72,"datagrid").options; +$.fn.datagrid.defaults.view.updateRow.call(this,_72,_73,row); +var tb=_74.finder.getTr(_72,_73,"body",2).closest("table.datagrid-btable"); +var _75=parseInt(tb.prev().attr("group-index")); +this.refreshGroupTitle(_72,_75); +},deleteRow:function(_76,_77){ +var _78=$.data(_76,"datagrid"); +var _79=_78.options; +var dc=_78.dc; +var _7a=dc.body1.add(dc.body2); +var tb=_79.finder.getTr(_76,_77,"body",2).closest("table.datagrid-btable"); +var _7b=parseInt(tb.prev().attr("group-index")); +$.fn.datagrid.defaults.view.deleteRow.call(this,_76,_77); +var _7c=this.groups[_7b]; +if(_7c.rows.length>1){ +_7c.rows.splice(_77-_7c.startIndex,1); +this.refreshGroupTitle(_76,_7b); +}else{ +_7a.children("div.datagrid-group[group-index="+_7b+"]").remove(); +for(var i=_7b+1;i_e.top&&e.pageY<_e.top+_11){ +_d+="n"; +}else{ +if(e.pageY<_e.top+_10&&e.pageY>_e.top+_10-_11){ +_d+="s"; +} +} +if(e.pageX>_e.left&&e.pageX<_e.left+_11){ +_d+="w"; +}else{ +if(e.pageX<_e.left+_f&&e.pageX>_e.left+_f-_11){ +_d+="e"; +} +} +var _12=_c.handles.split(","); +_12=$.map(_12,function(h){ +return $.trim(h).toLowerCase(); +}); +if($.inArray("all",_12)>=0||$.inArray(_d,_12)>=0){ +return _d; +} +for(var i=0;i<_d.length;i++){ +var _13=$.inArray(_d.substr(i,1),_12); +if(_13>=0){ +return _12[_13]; +} +} +return ""; +}; +$.fn.resizable=function(_14,_15){ +if(typeof _14=="string"){ +return $.fn.resizable.methods[_14](this,_15); +} +return this.each(function(){ +var _16=null; +var _17=$.data(this,"resizable"); +if(_17){ +$(this).unbind(".resizable"); +_16=$.extend(_17.options,_14||{}); +}else{ +_16=$.extend({},$.fn.resizable.defaults,$.fn.resizable.parseOptions(this),_14||{}); +$.data(this,"resizable",{options:_16}); +} +if(_16.disabled==true){ +return; +} +$(this).bind("mousemove.resizable",{target:this},function(e){ +if($.fn.resizable.isResizing){ +return; +} +var dir=_b(e); +$(e.data.target).css("cursor",dir?dir+"-resize":""); +}).bind("mouseleave.resizable",{target:this},function(e){ +$(e.data.target).css("cursor",""); +}).bind("mousedown.resizable",{target:this},function(e){ +var dir=_b(e); +if(dir==""){ +return; +} +function _18(css){ +var val=parseInt($(e.data.target).css(css)); +if(isNaN(val)){ +return 0; +}else{ +return val; +} +}; +var _19={target:e.data.target,dir:dir,startLeft:_18("left"),startTop:_18("top"),left:_18("left"),top:_18("top"),startX:e.pageX,startY:e.pageY,startWidth:$(e.data.target).outerWidth(),startHeight:$(e.data.target).outerHeight(),width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),deltaWidth:$(e.data.target).outerWidth()-$(e.data.target).width(),deltaHeight:$(e.data.target).outerHeight()-$(e.data.target).height()}; +$(document).bind("mousedown.resizable",_19,_8); +$(document).bind("mousemove.resizable",_19,_9); +$(document).bind("mouseup.resizable",_19,_a); +$("body").css("cursor",dir+"-resize"); +}); +}); +}; +$.fn.resizable.methods={options:function(jq){ +return $.data(jq[0],"resizable").options; +},enable:function(jq){ +return jq.each(function(){ +$(this).resizable({disabled:false}); +}); +},disable:function(jq){ +return jq.each(function(){ +$(this).resizable({disabled:true}); +}); +}}; +$.fn.resizable.parseOptions=function(_1a){ +var t=$(_1a); +return $.extend({},$.parser.parseOptions(_1a,["handles",{minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number",edge:"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); +}; +$.fn.resizable.defaults={disabled:false,handles:"n, e, s, w, ne, se, sw, nw, all",minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000,edge:5,onStartResize:function(e){ +},onResize:function(e){ +},onStopResize:function(e){ +}}; +$.fn.resizable.isResizing=false; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.searchbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.searchbox.js new file mode 100755 index 000000000..ba2966ea7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.searchbox.js @@ -0,0 +1,132 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"searchbox"); +var _4=_3.options; +var _5=$.extend(true,[],_4.icons); +_5.push({iconCls:"searchbox-button",handler:function(e){ +var t=$(e.data.target); +var _6=t.searchbox("options"); +_6.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); +}}); +_7(); +var _8=_9(); +$(_2).addClass("searchbox-f").textbox($.extend({},_4,{icons:_5,buttonText:(_8?_8.text:"")})); +$(_2).attr("searchboxName",$(_2).attr("textboxName")); +_3.searchbox=$(_2).next(); +_3.searchbox.addClass("searchbox"); +_a(_8); +function _7(){ +if(_4.menu){ +_3.menu=$(_4.menu).menu(); +var _b=_3.menu.menu("options"); +var _c=_b.onClick; +_b.onClick=function(_d){ +_a(_d); +_c.call(this,_d); +}; +}else{ +if(_3.menu){ +_3.menu.menu("destroy"); +} +_3.menu=null; +} +}; +function _9(){ +if(_3.menu){ +var _e=_3.menu.children("div.menu-item:first"); +_3.menu.children("div.menu-item").each(function(){ +var _f=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); +if(_f.selected){ +_e=$(this); +return false; +} +}); +return _3.menu.menu("getItem",_e[0]); +}else{ +return null; +} +}; +function _a(_10){ +if(!_10){ +return; +} +$(_2).textbox("button").menubutton({text:_10.text,iconCls:(_10.iconCls||null),menu:_3.menu,menuAlign:_4.buttonAlign,plain:false}); +_3.searchbox.find("input.textbox-value").attr("name",_10.name||_10.text); +$(_2).searchbox("resize"); +}; +}; +$.fn.searchbox=function(_11,_12){ +if(typeof _11=="string"){ +var _13=$.fn.searchbox.methods[_11]; +if(_13){ +return _13(this,_12); +}else{ +return this.textbox(_11,_12); +} +} +_11=_11||{}; +return this.each(function(){ +var _14=$.data(this,"searchbox"); +if(_14){ +$.extend(_14.options,_11); +}else{ +$.data(this,"searchbox",{options:$.extend({},$.fn.searchbox.defaults,$.fn.searchbox.parseOptions(this),_11)}); +} +_1(this); +}); +}; +$.fn.searchbox.methods={options:function(jq){ +var _15=jq.textbox("options"); +return $.extend($.data(jq[0],"searchbox").options,{width:_15.width,value:_15.value,originalValue:_15.originalValue,disabled:_15.disabled,readonly:_15.readonly}); +},menu:function(jq){ +return $.data(jq[0],"searchbox").menu; +},getName:function(jq){ +return $.data(jq[0],"searchbox").searchbox.find("input.textbox-value").attr("name"); +},selectName:function(jq,_16){ +return jq.each(function(){ +var _17=$.data(this,"searchbox").menu; +if(_17){ +_17.children("div.menu-item").each(function(){ +var _18=_17.menu("getItem",this); +if(_18.name==_16){ +$(this).trigger("click"); +return false; +} +}); +} +}); +},destroy:function(jq){ +return jq.each(function(){ +var _19=$(this).searchbox("menu"); +if(_19){ +_19.menu("destroy"); +} +$(this).textbox("destroy"); +}); +}}; +$.fn.searchbox.parseOptions=function(_1a){ +var t=$(_1a); +return $.extend({},$.fn.textbox.parseOptions(_1a),$.parser.parseOptions(_1a,["menu"]),{searcher:(t.attr("searcher")?eval(t.attr("searcher")):undefined)}); +}; +$.fn.searchbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:$.extend({},$.fn.textbox.defaults.inputEvents,{keydown:function(e){ +if(e.keyCode==13){ +e.preventDefault(); +var t=$(e.data.target); +var _1b=t.searchbox("options"); +t.searchbox("setValue",$(this).val()); +_1b.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); +return false; +} +}}),buttonAlign:"left",menu:null,searcher:function(_1c,_1d){ +}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.sidemenu.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.sidemenu.js new file mode 100644 index 000000000..2a446874f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.sidemenu.js @@ -0,0 +1,226 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +var _1=1; +function _2(_3){ +$(_3).addClass("sidemenu"); +}; +function _4(_5,_6){ +var _7=$(_5).sidemenu("options"); +if(_6){ +$.extend(_7,{width:_6.width,height:_6.height}); +} +$(_5)._size(_7); +$(_5).find(".accordion").accordion("resize"); +}; +function _8(_9,_a,_b){ +var _c=$(_9).sidemenu("options"); +var tt=$("
                                                                                                      ").appendTo(_a); +tt.tree({data:_b,animate:_c.animate,onBeforeSelect:function(_d){ +if(_d.children){ +return false; +} +},onSelect:function(_e){ +_12(_9,_e.id); +},onExpand:function(_f){ +_22(_9,_f); +},onCollapse:function(_10){ +_22(_9,_10); +},onClick:function(_11){ +if(_11.children){ +if(_11.state=="open"){ +$(_11.target).addClass("tree-node-nonleaf-collapsed"); +}else{ +$(_11.target).removeClass("tree-node-nonleaf-collapsed"); +} +$(this).tree("toggle",_11.target); +} +}}); +tt.unbind(".sidemenu").bind("mouseleave.sidemenu",function(){ +$(_a).trigger("mouseleave"); +}); +_12(_9,_c.selectedItemId); +}; +function _13(_14,_15,_16){ +var _17=$(_14).sidemenu("options"); +$(_15).tooltip({content:$("
                                                                                                      "),position:_17.floatMenuPosition,valign:"top",data:_16,onUpdate:function(_18){ +var _19=$(this).tooltip("options"); +var _1a=_19.data; +_18.accordion({width:_17.floatMenuWidth,multiple:false}).accordion("add",{title:_1a.text,iconCls:_1a.iconCls,collapsed:false,collapsible:false}); +_8(_14,_18.accordion("panels")[0],_1a.children); +},onShow:function(){ +var t=$(this); +var tip=t.tooltip("tip").addClass("sidemenu-tooltip"); +tip.children(".tooltip-content").addClass("sidemenu"); +tip.find(".accordion").accordion("resize"); +tip.unbind().bind("mouseenter",function(){ +t.tooltip("show"); +}).bind("mouseleave",function(){ +t.tooltip("hide"); +}); +},onPosition:function(){ +if(!_17.collapsed){ +$(this).tooltip("tip").css({left:-999999}); +} +}}); +}; +function _1b(_1c,_1d){ +$(_1c).find(".sidemenu-tree").each(function(){ +_1d($(this)); +}); +$(_1c).find(".tooltip-f").each(function(){ +var tip=$(this).tooltip("tip"); +if(tip){ +tip.find(".sidemenu-tree").each(function(){ +_1d($(this)); +}); +} +}); +}; +function _12(_1e,_1f){ +var _20=$(_1e).sidemenu("options"); +_1b(_1e,function(t){ +t.find("div.tree-node-selected").removeClass("tree-node-selected"); +var _21=t.tree("find",_1f); +if(_21){ +$(_21.target).addClass("tree-node-selected"); +_20.selectedItemId=_21.id; +t.trigger("mouseleave"); +_20.onSelect.call(_1e,_21); +} +}); +}; +function _22(_23,_24){ +_1b(_23,function(t){ +var _25=t.tree("find",_24.id); +if(_25){ +t.tree(_24.state=="open"?"expand":"collapse",_25.target); +} +}); +}; +function _26(_27){ +var _28=$(_27).sidemenu("options"); +$(_27).empty(); +if(_28.data){ +$.easyui.forEach(_28.data,true,function(_29){ +if(!_29.id){ +_29.id="_easyui_sidemenu_"+(_1++); +} +if(!_29.iconCls){ +_29.iconCls="sidemenu-default-icon"; +} +if(_29.children){ +_29.nodeCls="tree-node-nonleaf"; +if(!_29.state){ +_29.state="closed"; +} +if(_29.state=="open"){ +_29.nodeCls="tree-node-nonleaf"; +}else{ +_29.nodeCls="tree-node-nonleaf tree-node-nonleaf-collapsed"; +} +} +}); +var acc=$("
                                                                                                      ").appendTo(_27); +acc.accordion({fit:_28.height=="auto"?false:true,border:_28.border,multiple:_28.multiple}); +for(var i=0;i"+"
                                                                                                      "+""+""+"
                                                                                                      "+"
                                                                                                      "+"
                                                                                                      "+"
                                                                                                      "+""+"").insertAfter(_2); +var t=$(_2); +t.addClass("slider-f").hide(); +var _4=t.attr("name"); +if(_4){ +_3.find("input.slider-value").attr("name",_4); +t.removeAttr("name").attr("sliderName",_4); +} +_3.bind("_resize",function(e,_5){ +if($(this).hasClass("easyui-fluid")||_5){ +_6(_2); +} +return false; +}); +return _3; +}; +function _6(_7,_8){ +var _9=$.data(_7,"slider"); +var _a=_9.options; +var _b=_9.slider; +if(_8){ +if(_8.width){ +_a.width=_8.width; +} +if(_8.height){ +_a.height=_8.height; +} +} +_b._size(_a); +if(_a.mode=="h"){ +_b.css("height",""); +_b.children("div").css("height",""); +}else{ +_b.css("width",""); +_b.children("div").css("width",""); +_b.children("div.slider-rule,div.slider-rulelabel,div.slider-inner")._outerHeight(_b._outerHeight()); +} +_c(_7); +}; +function _d(_e){ +var _f=$.data(_e,"slider"); +var _10=_f.options; +var _11=_f.slider; +var aa=_10.mode=="h"?_10.rule:_10.rule.slice(0).reverse(); +if(_10.reversed){ +aa=aa.slice(0).reverse(); +} +_12(aa); +function _12(aa){ +var _13=_11.find("div.slider-rule"); +var _14=_11.find("div.slider-rulelabel"); +_13.empty(); +_14.empty(); +for(var i=0;i").appendTo(_13); +_16.css((_10.mode=="h"?"left":"top"),_15); +if(aa[i]!="|"){ +_16=$("").appendTo(_14); +_16.html(aa[i]); +if(_10.mode=="h"){ +_16.css({left:_15,marginLeft:-Math.round(_16.outerWidth()/2)}); +}else{ +_16.css({top:_15,marginTop:-Math.round(_16.outerHeight()/2)}); +} +} +} +}; +}; +function _17(_18){ +var _19=$.data(_18,"slider"); +var _1a=_19.options; +var _1b=_19.slider; +_1b.removeClass("slider-h slider-v slider-disabled"); +_1b.addClass(_1a.mode=="h"?"slider-h":"slider-v"); +_1b.addClass(_1a.disabled?"slider-disabled":""); +var _1c=_1b.find(".slider-inner"); +_1c.html(""+""); +if(_1a.range){ +_1c.append(""+""); +} +_1b.find("a.slider-handle").draggable({axis:_1a.mode,cursor:"pointer",disabled:_1a.disabled,onDrag:function(e){ +var _1d=e.data.left; +var _1e=_1b.width(); +if(_1a.mode!="h"){ +_1d=e.data.top; +_1e=_1b.height(); +} +if(_1d<0||_1d>_1e){ +return false; +}else{ +_1f(_1d,this); +return false; +} +},onStartDrag:function(){ +_19.isDragging=true; +_1a.onSlideStart.call(_18,_1a.value); +},onStopDrag:function(e){ +_1f(_1a.mode=="h"?e.data.left:e.data.top,this); +_1a.onSlideEnd.call(_18,_1a.value); +_1a.onComplete.call(_18,_1a.value); +_19.isDragging=false; +}}); +_1b.find("div.slider-inner").unbind(".slider").bind("mousedown.slider",function(e){ +if(_19.isDragging||_1a.disabled){ +return; +} +var pos=$(this).offset(); +_1f(_1a.mode=="h"?(e.pageX-pos.left):(e.pageY-pos.top)); +_1a.onComplete.call(_18,_1a.value); +}); +function _20(_21){ +var dd=String(_1a.step).split("."); +var _22=dd.length>1?dd[1].length:0; +return parseFloat(_21.toFixed(_22)); +}; +function _1f(pos,_23){ +var _24=_25(_18,pos); +var s=Math.abs(_24%_1a.step); +if(s<_1a.step/2){ +_24-=s; +}else{ +_24=_24-s+_1a.step; +} +_24=_20(_24); +if(_1a.range){ +var v1=_1a.value[0]; +var v2=_1a.value[1]; +var m=parseFloat((v1+v2)/2); +if(_23){ +var _26=$(_23).nextAll(".slider-handle").length>0; +if(_24<=v2&&_26){ +v1=_24; +}else{ +if(_24>=v1&&(!_26)){ +v2=_24; +} +} +}else{ +if(_24v2){ +v2=_24; +}else{ +_24_2b.max){ +_30=_2b.max; +} +var _31=$("").appendTo(_2c); +_31.attr("name",_2f); +_31.val(_30); +_2e.push(_30); +var _32=_2c.find(".slider-handle:eq("+i+")"); +var tip=_32.next(); +var pos=_33(_28,_30); +if(_2b.showTip){ +tip.show(); +tip.html(_2b.tipFormatter.call(_28,_30)); +}else{ +tip.hide(); +} +if(_2b.mode=="h"){ +var _34="left:"+pos+"px;"; +_32.attr("style",_34); +tip.attr("style",_34+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px"); +}else{ +var _34="top:"+pos+"px;"; +_32.attr("style",_34); +tip.attr("style",_34+"margin-left:"+(-Math.round(tip.outerWidth()))+"px"); +} +} +_2b.value=_2b.range?_2e:_2e[0]; +$(_28).val(_2b.range?_2e.join(_2b.separator):_2e[0]); +if(_2d.join(",")!=_2e.join(",")){ +_2b.onChange.call(_28,_2b.value,(_2b.range?_2d:_2d[0])); +} +}; +function _c(_35){ +var _36=$.data(_35,"slider").options; +var fn=_36.onChange; +_36.onChange=function(){ +}; +_27(_35,_36.value); +_36.onChange=fn; +}; +function _33(_37,_38){ +var _39=$.data(_37,"slider"); +var _3a=_39.options; +var _3b=_39.slider; +var _3c=_3a.mode=="h"?_3b.width():_3b.height(); +var pos=_3a.converter.toPosition.call(_37,_38,_3c); +if(_3a.mode=="v"){ +pos=_3b.height()-pos; +} +if(_3a.reversed){ +pos=_3c-pos; +} +return pos; +}; +function _25(_3d,pos){ +var _3e=$.data(_3d,"slider"); +var _3f=_3e.options; +var _40=_3e.slider; +var _41=_3f.mode=="h"?_40.width():_40.height(); +var pos=_3f.mode=="h"?(_3f.reversed?(_41-pos):pos):(_3f.reversed?pos:(_41-pos)); +var _42=_3f.converter.toValue.call(_3d,pos,_41); +return _42; +}; +$.fn.slider=function(_43,_44){ +if(typeof _43=="string"){ +return $.fn.slider.methods[_43](this,_44); +} +_43=_43||{}; +return this.each(function(){ +var _45=$.data(this,"slider"); +if(_45){ +$.extend(_45.options,_43); +}else{ +_45=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_43),slider:_1(this)}); +$(this)._propAttr("disabled",false); +} +var _46=_45.options; +_46.min=parseFloat(_46.min); +_46.max=parseFloat(_46.max); +if(_46.range){ +if(!$.isArray(_46.value)){ +_46.value=$.map(String(_46.value).split(_46.separator),function(v){ +return parseFloat(v); +}); +} +if(_46.value.length<2){ +_46.value.push(_46.max); +} +}else{ +_46.value=parseFloat(_46.value); +} +_46.step=parseFloat(_46.step); +_46.originalValue=_46.value; +_17(this); +_d(this); +_6(this); +}); +}; +$.fn.slider.methods={options:function(jq){ +return $.data(jq[0],"slider").options; +},destroy:function(jq){ +return jq.each(function(){ +$.data(this,"slider").slider.remove(); +$(this).remove(); +}); +},resize:function(jq,_47){ +return jq.each(function(){ +_6(this,_47); +}); +},getValue:function(jq){ +return jq.slider("options").value; +},getValues:function(jq){ +return jq.slider("options").value; +},setValue:function(jq,_48){ +return jq.each(function(){ +_27(this,[_48]); +}); +},setValues:function(jq,_49){ +return jq.each(function(){ +_27(this,_49); +}); +},clear:function(jq){ +return jq.each(function(){ +var _4a=$(this).slider("options"); +_27(this,_4a.range?[_4a.min,_4a.max]:[_4a.min]); +}); +},reset:function(jq){ +return jq.each(function(){ +var _4b=$(this).slider("options"); +$(this).slider(_4b.range?"setValues":"setValue",_4b.originalValue); +}); +},enable:function(jq){ +return jq.each(function(){ +$.data(this,"slider").options.disabled=false; +_17(this); +}); +},disable:function(jq){ +return jq.each(function(){ +$.data(this,"slider").options.disabled=true; +_17(this); +}); +}}; +$.fn.slider.parseOptions=function(_4c){ +var t=$(_4c); +return $.extend({},$.parser.parseOptions(_4c,["width","height","mode",{reversed:"boolean",showTip:"boolean",range:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)}); +}; +$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,range:false,value:0,separator:",",min:0,max:100,step:1,rule:[],tipFormatter:function(_4d){ +return _4d; +},converter:{toPosition:function(_4e,_4f){ +var _50=$(this).slider("options"); +var p=(_4e-_50.min)/(_50.max-_50.min)*_4f; +return p; +},toValue:function(pos,_51){ +var _52=$(this).slider("options"); +var v=_52.min+(_52.max-_52.min)*(pos/_51); +return v; +}},onChange:function(_53,_54){ +},onSlideStart:function(_55){ +},onSlideEnd:function(_56){ +},onComplete:function(_57){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.spinner.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.spinner.js new file mode 100755 index 000000000..0bb82369c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.spinner.js @@ -0,0 +1,128 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"spinner"); +var _4=_3.options; +var _5=$.extend(true,[],_4.icons); +if(_4.spinAlign=="left"||_4.spinAlign=="right"){ +_4.spinArrow=true; +_4.iconAlign=_4.spinAlign; +var _6={iconCls:"spinner-button-updown",handler:function(e){ +var _7=$(e.target).closest(".spinner-arrow-up,.spinner-arrow-down"); +_13(e.data.target,_7.hasClass("spinner-arrow-down")); +}}; +if(_4.spinAlign=="left"){ +_5.unshift(_6); +}else{ +_5.push(_6); +} +}else{ +_4.spinArrow=false; +if(_4.spinAlign=="vertical"){ +if(_4.buttonAlign!="top"){ +_4.buttonAlign="bottom"; +} +_4.clsLeft="textbox-button-bottom"; +_4.clsRight="textbox-button-top"; +}else{ +_4.clsLeft="textbox-button-left"; +_4.clsRight="textbox-button-right"; +} +} +$(_2).addClass("spinner-f").textbox($.extend({},_4,{icons:_5,doSize:false,onResize:function(_8,_9){ +if(!_4.spinArrow){ +var _a=$(this).next(); +var _b=_a.find(".textbox-button:not(.spinner-button)"); +if(_b.length){ +var _c=_b.outerWidth(); +var _d=_b.outerHeight(); +var _e=_a.find(".spinner-button."+_4.clsLeft); +var _f=_a.find(".spinner-button."+_4.clsRight); +if(_4.buttonAlign=="right"){ +_f.css("marginRight",_c+"px"); +}else{ +if(_4.buttonAlign=="left"){ +_e.css("marginLeft",_c+"px"); +}else{ +if(_4.buttonAlign=="top"){ +_f.css("marginTop",_d+"px"); +}else{ +_e.css("marginBottom",_d+"px"); +} +} +} +} +} +_4.onResize.call(this,_8,_9); +}})); +$(_2).attr("spinnerName",$(_2).attr("textboxName")); +_3.spinner=$(_2).next(); +_3.spinner.addClass("spinner"); +if(_4.spinArrow){ +var _10=_3.spinner.find(".spinner-button-updown"); +_10.append(""+""+""+""+""+""); +}else{ +var _11=$("").addClass(_4.clsLeft).appendTo(_3.spinner); +var _12=$("").addClass(_4.clsRight).appendTo(_3.spinner); +_11.linkbutton({iconCls:_4.reversed?"spinner-button-up":"spinner-button-down",onClick:function(){ +_13(_2,!_4.reversed); +}}); +_12.linkbutton({iconCls:_4.reversed?"spinner-button-down":"spinner-button-up",onClick:function(){ +_13(_2,_4.reversed); +}}); +if(_4.disabled){ +$(_2).spinner("disable"); +} +if(_4.readonly){ +$(_2).spinner("readonly"); +} +} +$(_2).spinner("resize"); +}; +function _13(_14,_15){ +var _16=$(_14).spinner("options"); +_16.spin.call(_14,_15); +_16[_15?"onSpinDown":"onSpinUp"].call(_14); +$(_14).spinner("validate"); +}; +$.fn.spinner=function(_17,_18){ +if(typeof _17=="string"){ +var _19=$.fn.spinner.methods[_17]; +if(_19){ +return _19(this,_18); +}else{ +return this.textbox(_17,_18); +} +} +_17=_17||{}; +return this.each(function(){ +var _1a=$.data(this,"spinner"); +if(_1a){ +$.extend(_1a.options,_17); +}else{ +_1a=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_17)}); +} +_1(this); +}); +}; +$.fn.spinner.methods={options:function(jq){ +var _1b=jq.textbox("options"); +return $.extend($.data(jq[0],"spinner").options,{width:_1b.width,value:_1b.value,originalValue:_1b.originalValue,disabled:_1b.disabled,readonly:_1b.readonly}); +}}; +$.fn.spinner.parseOptions=function(_1c){ +return $.extend({},$.fn.textbox.parseOptions(_1c),$.parser.parseOptions(_1c,["min","max","spinAlign",{increment:"number",reversed:"boolean"}])); +}; +$.fn.spinner.defaults=$.extend({},$.fn.textbox.defaults,{min:null,max:null,increment:1,spinAlign:"right",reversed:false,spin:function(_1d){ +},onSpinUp:function(){ +},onSpinDown:function(){ +}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.splitbutton.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.splitbutton.js new file mode 100755 index 000000000..5bb4e55e6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.splitbutton.js @@ -0,0 +1,49 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"splitbutton").options; +$(_2).menubutton(_3); +$(_2).addClass("s-btn"); +}; +$.fn.splitbutton=function(_4,_5){ +if(typeof _4=="string"){ +var _6=$.fn.splitbutton.methods[_4]; +if(_6){ +return _6(this,_5); +}else{ +return this.menubutton(_4,_5); +} +} +_4=_4||{}; +return this.each(function(){ +var _7=$.data(this,"splitbutton"); +if(_7){ +$.extend(_7.options,_4); +}else{ +$.data(this,"splitbutton",{options:$.extend({},$.fn.splitbutton.defaults,$.fn.splitbutton.parseOptions(this),_4)}); +$(this)._propAttr("disabled",false); +} +_1(this); +}); +}; +$.fn.splitbutton.methods={options:function(jq){ +var _8=jq.menubutton("options"); +var _9=$.data(jq[0],"splitbutton").options; +$.extend(_9,{disabled:_8.disabled,toggle:_8.toggle,selected:_8.selected}); +return _9; +}}; +$.fn.splitbutton.parseOptions=function(_a){ +var t=$(_a); +return $.extend({},$.fn.linkbutton.parseOptions(_a),$.parser.parseOptions(_a,["menu",{plain:"boolean",duration:"number"}])); +}; +$.fn.splitbutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100,cls:{btn1:"m-btn-active s-btn-active",btn2:"m-btn-plain-active s-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn-line"}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.switchbutton.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.switchbutton.js new file mode 100644 index 000000000..8a752c44c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.switchbutton.js @@ -0,0 +1,193 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$(""+""+""+""+""+""+""+"").insertAfter(_2); +var t=$(_2); +t.addClass("switchbutton-f").hide(); +var _4=t.attr("name"); +if(_4){ +t.removeAttr("name").attr("switchbuttonName",_4); +_3.find(".switchbutton-value").attr("name",_4); +} +_3.bind("_resize",function(e,_5){ +if($(this).hasClass("easyui-fluid")||_5){ +_6(_2); +} +return false; +}); +return _3; +}; +function _6(_7,_8){ +var _9=$.data(_7,"switchbutton"); +var _a=_9.options; +var _b=_9.switchbutton; +if(_8){ +$.extend(_a,_8); +} +var _c=_b.is(":visible"); +if(!_c){ +_b.appendTo("body"); +} +_b._size(_a); +var w=_b.width(); +var h=_b.height(); +var w=_b.outerWidth(); +var h=_b.outerHeight(); +var _d=parseInt(_a.handleWidth)||_b.height(); +var _e=w*2-_d; +_b.find(".switchbutton-inner").css({width:_e+"px",height:h+"px",lineHeight:h+"px"}); +_b.find(".switchbutton-handle")._outerWidth(_d)._outerHeight(h).css({marginLeft:-_d/2+"px"}); +_b.find(".switchbutton-on").css({width:(w-_d/2)+"px",textIndent:(_a.reversed?"":"-")+_d/2+"px"}); +_b.find(".switchbutton-off").css({width:(w-_d/2)+"px",textIndent:(_a.reversed?"-":"")+_d/2+"px"}); +_a.marginWidth=w-_d; +_f(_7,_a.checked,false); +if(!_c){ +_b.insertAfter(_7); +} +}; +function _10(_11){ +var _12=$.data(_11,"switchbutton"); +var _13=_12.options; +var _14=_12.switchbutton; +var _15=_14.find(".switchbutton-inner"); +var on=_15.find(".switchbutton-on").html(_13.onText); +var off=_15.find(".switchbutton-off").html(_13.offText); +var _16=_15.find(".switchbutton-handle").html(_13.handleText); +if(_13.reversed){ +off.prependTo(_15); +on.insertAfter(_16); +}else{ +on.prependTo(_15); +off.insertAfter(_16); +} +_14.find(".switchbutton-value")._propAttr("checked",_13.checked); +_14.removeClass("switchbutton-disabled").addClass(_13.disabled?"switchbutton-disabled":""); +_14.removeClass("switchbutton-reversed").addClass(_13.reversed?"switchbutton-reversed":""); +_f(_11,_13.checked); +_17(_11,_13.readonly); +$(_11).switchbutton("setValue",_13.value); +}; +function _f(_18,_19,_1a){ +var _1b=$.data(_18,"switchbutton"); +var _1c=_1b.options; +_1c.checked=_19; +var _1d=_1b.switchbutton.find(".switchbutton-inner"); +var _1e=_1d.find(".switchbutton-on"); +var _1f=_1c.reversed?(_1c.checked?_1c.marginWidth:0):(_1c.checked?0:_1c.marginWidth); +var dir=_1e.css("float").toLowerCase(); +var css={}; +css["margin-"+dir]=-_1f+"px"; +_1a?_1d.animate(css,200):_1d.css(css); +var _20=_1d.find(".switchbutton-value"); +var ck=_20.is(":checked"); +$(_18).add(_20)._propAttr("checked",_1c.checked); +if(ck!=_1c.checked){ +_1c.onChange.call(_18,_1c.checked); +} +}; +function _21(_22,_23){ +var _24=$.data(_22,"switchbutton"); +var _25=_24.options; +var _26=_24.switchbutton; +var _27=_26.find(".switchbutton-value"); +if(_23){ +_25.disabled=true; +$(_22).add(_27)._propAttr("disabled",true); +_26.addClass("switchbutton-disabled"); +}else{ +_25.disabled=false; +$(_22).add(_27)._propAttr("disabled",false); +_26.removeClass("switchbutton-disabled"); +} +}; +function _17(_28,_29){ +var _2a=$.data(_28,"switchbutton"); +var _2b=_2a.options; +_2b.readonly=_29==undefined?true:_29; +_2a.switchbutton.removeClass("switchbutton-readonly").addClass(_2b.readonly?"switchbutton-readonly":""); +}; +function _2c(_2d){ +var _2e=$.data(_2d,"switchbutton"); +var _2f=_2e.options; +_2e.switchbutton.unbind(".switchbutton").bind("click.switchbutton",function(){ +if(!_2f.disabled&&!_2f.readonly){ +_f(_2d,_2f.checked?false:true,true); +} +}); +}; +$.fn.switchbutton=function(_30,_31){ +if(typeof _30=="string"){ +return $.fn.switchbutton.methods[_30](this,_31); +} +_30=_30||{}; +return this.each(function(){ +var _32=$.data(this,"switchbutton"); +if(_32){ +$.extend(_32.options,_30); +}else{ +_32=$.data(this,"switchbutton",{options:$.extend({},$.fn.switchbutton.defaults,$.fn.switchbutton.parseOptions(this),_30),switchbutton:_1(this)}); +} +_32.options.originalChecked=_32.options.checked; +_10(this); +_6(this); +_2c(this); +}); +}; +$.fn.switchbutton.methods={options:function(jq){ +var _33=jq.data("switchbutton"); +return $.extend(_33.options,{value:_33.switchbutton.find(".switchbutton-value").val()}); +},resize:function(jq,_34){ +return jq.each(function(){ +_6(this,_34); +}); +},enable:function(jq){ +return jq.each(function(){ +_21(this,false); +}); +},disable:function(jq){ +return jq.each(function(){ +_21(this,true); +}); +},readonly:function(jq,_35){ +return jq.each(function(){ +_17(this,_35); +}); +},check:function(jq){ +return jq.each(function(){ +_f(this,true); +}); +},uncheck:function(jq){ +return jq.each(function(){ +_f(this,false); +}); +},clear:function(jq){ +return jq.each(function(){ +_f(this,false); +}); +},reset:function(jq){ +return jq.each(function(){ +var _36=$(this).switchbutton("options"); +_f(this,_36.originalChecked); +}); +},setValue:function(jq,_37){ +return jq.each(function(){ +$(this).val(_37); +$.data(this,"switchbutton").switchbutton.find(".switchbutton-value").val(_37); +}); +}}; +$.fn.switchbutton.parseOptions=function(_38){ +var t=$(_38); +return $.extend({},$.parser.parseOptions(_38,["onText","offText","handleText",{handleWidth:"number",reversed:"boolean"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)}); +}; +$.fn.switchbutton.defaults={handleWidth:"auto",width:60,height:30,checked:false,disabled:false,readonly:false,reversed:false,onText:"ON",offText:"OFF",handleText:"",value:"on",onChange:function(_39){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tabs.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tabs.js new file mode 100755 index 000000000..4dc74d913 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tabs.js @@ -0,0 +1,716 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(c){ +var w=0; +$(c).children().each(function(){ +w+=$(this).outerWidth(true); +}); +return w; +}; +function _2(_3){ +var _4=$.data(_3,"tabs").options; +if(!_4.showHeader){ +return; +} +var _5=$(_3).children("div.tabs-header"); +var _6=_5.children("div.tabs-tool:not(.tabs-tool-hidden)"); +var _7=_5.children("div.tabs-scroller-left"); +var _8=_5.children("div.tabs-scroller-right"); +var _9=_5.children("div.tabs-wrap"); +if(_4.tabPosition=="left"||_4.tabPosition=="right"){ +if(!_6.length){ +return; +} +_6._outerWidth(_5.width()); +var _a={left:_4.tabPosition=="left"?"auto":0,right:_4.tabPosition=="left"?0:"auto",top:_4.toolPosition=="top"?0:"auto",bottom:_4.toolPosition=="top"?"auto":0}; +var _b={marginTop:_4.toolPosition=="top"?_6.outerHeight():0}; +_6.css(_a); +_9.css(_b); +return; +} +var _c=_5.outerHeight(); +if(_4.plain){ +_c-=_c-_5.height(); +} +_6._outerHeight(_c); +var _d=_1(_5.find("ul.tabs")); +var _e=_5.width()-_6._outerWidth(); +if(_d>_e){ +_7.add(_8).show()._outerHeight(_c); +if(_4.toolPosition=="left"){ +_6.css({left:_7.outerWidth(),right:""}); +_9.css({marginLeft:_7.outerWidth()+_6._outerWidth(),marginRight:_8._outerWidth(),width:_e-_7.outerWidth()-_8.outerWidth()}); +}else{ +_6.css({left:"",right:_8.outerWidth()}); +_9.css({marginLeft:_7.outerWidth(),marginRight:_8.outerWidth()+_6._outerWidth(),width:_e-_7.outerWidth()-_8.outerWidth()}); +} +}else{ +_7.add(_8).hide(); +if(_4.toolPosition=="left"){ +_6.css({left:0,right:""}); +_9.css({marginLeft:_6._outerWidth(),marginRight:0,width:_e}); +}else{ +_6.css({left:"",right:0}); +_9.css({marginLeft:0,marginRight:_6._outerWidth(),width:_e}); +} +} +}; +function _f(_10){ +var _11=$.data(_10,"tabs").options; +var _12=$(_10).children("div.tabs-header"); +if(_11.tools){ +if(typeof _11.tools=="string"){ +$(_11.tools).addClass("tabs-tool").appendTo(_12); +$(_11.tools).show(); +}else{ +_12.children("div.tabs-tool").remove(); +var _13=$("
                                                                                                      ").appendTo(_12); +var tr=_13.find("tr"); +for(var i=0;i<_11.tools.length;i++){ +var td=$("").appendTo(tr); +var _14=$("").appendTo(td); +_14[0].onclick=eval(_11.tools[i].handler||function(){ +}); +_14.linkbutton($.extend({},_11.tools[i],{plain:true})); +} +} +}else{ +_12.children("div.tabs-tool").remove(); +} +}; +function _15(_16,_17){ +var _18=$.data(_16,"tabs"); +var _19=_18.options; +var cc=$(_16); +if(!_19.doSize){ +return; +} +if(_17){ +$.extend(_19,{width:_17.width,height:_17.height}); +} +cc._size(_19); +var _1a=cc.children("div.tabs-header"); +var _1b=cc.children("div.tabs-panels"); +var _1c=_1a.find("div.tabs-wrap"); +var ul=_1c.find(".tabs"); +ul.children("li").removeClass("tabs-first tabs-last"); +ul.children("li:first").addClass("tabs-first"); +ul.children("li:last").addClass("tabs-last"); +if(_19.tabPosition=="left"||_19.tabPosition=="right"){ +_1a._outerWidth(_19.showHeader?_19.headerWidth:0); +_1b._outerWidth(cc.width()-_1a.outerWidth()); +_1a.add(_1b)._size("height",isNaN(parseInt(_19.height))?"":cc.height()); +_1c._outerWidth(_1a.width()); +ul._outerWidth(_1c.width()).css("height",""); +}else{ +_1a.children("div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)").css("display",_19.showHeader?"block":"none"); +_1a._outerWidth(cc.width()).css("height",""); +if(_19.showHeader){ +_1a.css("background-color",""); +_1c.css("height",""); +}else{ +_1a.css("background-color","transparent"); +_1a._outerHeight(0); +_1c._outerHeight(0); +} +ul._outerHeight(_19.tabHeight).css("width",""); +ul._outerHeight(ul.outerHeight()-ul.height()-1+_19.tabHeight).css("width",""); +_1b._size("height",isNaN(parseInt(_19.height))?"":(cc.height()-_1a.outerHeight())); +_1b._size("width",cc.width()); +} +if(_18.tabs.length){ +var d1=ul.outerWidth(true)-ul.width(); +var li=ul.children("li:first"); +var d2=li.outerWidth(true)-li.width(); +var _1d=_1a.width()-_1a.children(".tabs-tool:not(.tabs-tool-hidden)")._outerWidth(); +var _1e=Math.floor((_1d-d1-d2*_18.tabs.length)/_18.tabs.length); +$.map(_18.tabs,function(p){ +_1f(p,(_19.justified&&$.inArray(_19.tabPosition,["top","bottom"])>=0)?_1e:undefined); +}); +if(_19.justified&&$.inArray(_19.tabPosition,["top","bottom"])>=0){ +var _20=_1d-d1-_1(ul); +_1f(_18.tabs[_18.tabs.length-1],_1e+_20); +} +} +_2(_16); +function _1f(p,_21){ +var _22=p.panel("options"); +var p_t=_22.tab.find("a.tabs-inner"); +var _21=_21?_21:(parseInt(_22.tabWidth||_19.tabWidth||undefined)); +if(_21){ +p_t._outerWidth(_21); +}else{ +p_t.css("width",""); +} +p_t._outerHeight(_19.tabHeight); +p_t.css("lineHeight",p_t.height()+"px"); +p_t.find(".easyui-fluid:visible").triggerHandler("_resize"); +}; +}; +function _23(_24){ +var _25=$.data(_24,"tabs").options; +var tab=_26(_24); +if(tab){ +var _27=$(_24).children("div.tabs-panels"); +var _28=_25.width=="auto"?"auto":_27.width(); +var _29=_25.height=="auto"?"auto":_27.height(); +tab.panel("resize",{width:_28,height:_29}); +} +}; +function _2a(_2b){ +var _2c=$.data(_2b,"tabs").tabs; +var cc=$(_2b).addClass("tabs-container"); +var _2d=$("
                                                                                                      ").insertBefore(cc); +cc.children("div").each(function(){ +_2d[0].appendChild(this); +}); +cc[0].appendChild(_2d[0]); +$("
                                                                                                      "+"
                                                                                                      "+"
                                                                                                      "+"
                                                                                                      "+"
                                                                                                        "+"
                                                                                                        "+"
                                                                                                        ").prependTo(_2b); +cc.children("div.tabs-panels").children("div").each(function(i){ +var _2e=$.extend({},$.parser.parseOptions(this),{disabled:($(this).attr("disabled")?true:undefined),selected:($(this).attr("selected")?true:undefined)}); +_3e(_2b,_2e,$(this)); +}); +cc.children("div.tabs-header").find(".tabs-scroller-left, .tabs-scroller-right").hover(function(){ +$(this).addClass("tabs-scroller-over"); +},function(){ +$(this).removeClass("tabs-scroller-over"); +}); +cc.bind("_resize",function(e,_2f){ +if($(this).hasClass("easyui-fluid")||_2f){ +_15(_2b); +_23(_2b); +} +return false; +}); +}; +function _30(_31){ +var _32=$.data(_31,"tabs"); +var _33=_32.options; +$(_31).children("div.tabs-header").unbind().bind("click",function(e){ +if($(e.target).hasClass("tabs-scroller-left")){ +$(_31).tabs("scrollBy",-_33.scrollIncrement); +}else{ +if($(e.target).hasClass("tabs-scroller-right")){ +$(_31).tabs("scrollBy",_33.scrollIncrement); +}else{ +var li=$(e.target).closest("li"); +if(li.hasClass("tabs-disabled")){ +return false; +} +var a=$(e.target).closest("a.tabs-close"); +if(a.length){ +_5d(_31,_34(li)); +}else{ +if(li.length){ +var _35=_34(li); +var _36=_32.tabs[_35].panel("options"); +if(_36.collapsible){ +_36.closed?_53(_31,_35):_7b(_31,_35); +}else{ +_53(_31,_35); +} +} +} +return false; +} +} +}).bind("contextmenu",function(e){ +var li=$(e.target).closest("li"); +if(li.hasClass("tabs-disabled")){ +return; +} +if(li.length){ +_33.onContextMenu.call(_31,e,li.find("span.tabs-title").html(),_34(li)); +} +}); +function _34(li){ +var _37=0; +li.parent().children("li").each(function(i){ +if(li[0]==this){ +_37=i; +return false; +} +}); +return _37; +}; +}; +function _38(_39){ +var _3a=$.data(_39,"tabs").options; +var _3b=$(_39).children("div.tabs-header"); +var _3c=$(_39).children("div.tabs-panels"); +_3b.removeClass("tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right"); +_3c.removeClass("tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right"); +if(_3a.tabPosition=="top"){ +_3b.insertBefore(_3c); +}else{ +if(_3a.tabPosition=="bottom"){ +_3b.insertAfter(_3c); +_3b.addClass("tabs-header-bottom"); +_3c.addClass("tabs-panels-top"); +}else{ +if(_3a.tabPosition=="left"){ +_3b.addClass("tabs-header-left"); +_3c.addClass("tabs-panels-right"); +}else{ +if(_3a.tabPosition=="right"){ +_3b.addClass("tabs-header-right"); +_3c.addClass("tabs-panels-left"); +} +} +} +} +if(_3a.plain==true){ +_3b.addClass("tabs-header-plain"); +}else{ +_3b.removeClass("tabs-header-plain"); +} +_3b.removeClass("tabs-header-narrow").addClass(_3a.narrow?"tabs-header-narrow":""); +var _3d=_3b.find(".tabs"); +_3d.removeClass("tabs-pill").addClass(_3a.pill?"tabs-pill":""); +_3d.removeClass("tabs-narrow").addClass(_3a.narrow?"tabs-narrow":""); +_3d.removeClass("tabs-justified").addClass(_3a.justified?"tabs-justified":""); +if(_3a.border==true){ +_3b.removeClass("tabs-header-noborder"); +_3c.removeClass("tabs-panels-noborder"); +}else{ +_3b.addClass("tabs-header-noborder"); +_3c.addClass("tabs-panels-noborder"); +} +_3a.doSize=true; +}; +function _3e(_3f,_40,pp){ +_40=_40||{}; +var _41=$.data(_3f,"tabs"); +var _42=_41.tabs; +if(_40.index==undefined||_40.index>_42.length){ +_40.index=_42.length; +} +if(_40.index<0){ +_40.index=0; +} +var ul=$(_3f).children("div.tabs-header").find("ul.tabs"); +var _43=$(_3f).children("div.tabs-panels"); +var tab=$("
                                                                                                      • "+""+""+""+""+"
                                                                                                      • "); +if(!pp){ +pp=$("
                                                                                                        "); +} +if(_40.index>=_42.length){ +tab.appendTo(ul); +pp.appendTo(_43); +_42.push(pp); +}else{ +tab.insertBefore(ul.children("li:eq("+_40.index+")")); +pp.insertBefore(_43.children("div.panel:eq("+_40.index+")")); +_42.splice(_40.index,0,pp); +} +pp.panel($.extend({},_40,{tab:tab,border:false,noheader:true,closed:true,doSize:false,iconCls:(_40.icon?_40.icon:undefined),onLoad:function(){ +if(_40.onLoad){ +_40.onLoad.apply(this,arguments); +} +_41.options.onLoad.call(_3f,$(this)); +},onBeforeOpen:function(){ +if(_40.onBeforeOpen){ +if(_40.onBeforeOpen.call(this)==false){ +return false; +} +} +var p=$(_3f).tabs("getSelected"); +if(p){ +if(p[0]!=this){ +$(_3f).tabs("unselect",_4d(_3f,p)); +p=$(_3f).tabs("getSelected"); +if(p){ +return false; +} +}else{ +_23(_3f); +return false; +} +} +var _44=$(this).panel("options"); +_44.tab.addClass("tabs-selected"); +var _45=$(_3f).find(">div.tabs-header>div.tabs-wrap"); +var _46=_44.tab.position().left; +var _47=_46+_44.tab.outerWidth(); +if(_46<0||_47>_45.width()){ +var _48=_46-(_45.width()-_44.tab.width())/2; +$(_3f).tabs("scrollBy",_48); +}else{ +$(_3f).tabs("scrollBy",0); +} +var _49=$(this).panel("panel"); +_49.css("display","block"); +_23(_3f); +_49.css("display","none"); +},onOpen:function(){ +if(_40.onOpen){ +_40.onOpen.call(this); +} +var _4a=$(this).panel("options"); +var _4b=_4d(_3f,this); +_41.selectHis.push(_4b); +_41.options.onSelect.call(_3f,_4a.title,_4b); +},onBeforeClose:function(){ +if(_40.onBeforeClose){ +if(_40.onBeforeClose.call(this)==false){ +return false; +} +} +$(this).panel("options").tab.removeClass("tabs-selected"); +},onClose:function(){ +if(_40.onClose){ +_40.onClose.call(this); +} +var _4c=$(this).panel("options"); +_41.options.onUnselect.call(_3f,_4c.title,_4d(_3f,this)); +}})); +$(_3f).tabs("update",{tab:pp,options:pp.panel("options"),type:"header"}); +}; +function _4e(_4f,_50){ +var _51=$.data(_4f,"tabs"); +var _52=_51.options; +if(_50.selected==undefined){ +_50.selected=true; +} +_3e(_4f,_50); +_52.onAdd.call(_4f,_50.title,_50.index); +if(_50.selected){ +_53(_4f,_50.index); +} +}; +function _54(_55,_56){ +_56.type=_56.type||"all"; +var _57=$.data(_55,"tabs").selectHis; +var pp=_56.tab; +var _58=pp.panel("options"); +var _59=_58.title; +$.extend(_58,_56.options,{iconCls:(_56.options.icon?_56.options.icon:undefined)}); +if(_56.type=="all"||_56.type=="body"){ +pp.panel(); +} +if(_56.type=="all"||_56.type=="header"){ +var tab=_58.tab; +if(_58.header){ +tab.find(".tabs-inner").html($(_58.header)); +}else{ +var _5a=tab.find("span.tabs-title"); +var _5b=tab.find("span.tabs-icon"); +_5a.html(_58.title); +_5b.attr("class","tabs-icon"); +tab.find("a.tabs-close").remove(); +if(_58.closable){ +_5a.addClass("tabs-closable"); +$("").appendTo(tab); +}else{ +_5a.removeClass("tabs-closable"); +} +if(_58.iconCls){ +_5a.addClass("tabs-with-icon"); +_5b.addClass(_58.iconCls); +}else{ +_5a.removeClass("tabs-with-icon"); +} +if(_58.tools){ +var _5c=tab.find("span.tabs-p-tool"); +if(!_5c.length){ +var _5c=$("").insertAfter(tab.find("a.tabs-inner")); +} +if($.isArray(_58.tools)){ +_5c.empty(); +for(var i=0;i<_58.tools.length;i++){ +var t=$("").appendTo(_5c); +t.addClass(_58.tools[i].iconCls); +if(_58.tools[i].handler){ +t.bind("click",{handler:_58.tools[i].handler},function(e){ +if($(this).parents("li").hasClass("tabs-disabled")){ +return; +} +e.data.handler.call(this); +}); +} +} +}else{ +$(_58.tools).children().appendTo(_5c); +} +var pr=_5c.children().length*12; +if(_58.closable){ +pr+=8; +_5c.css("right",""); +}else{ +pr-=3; +_5c.css("right","5px"); +} +_5a.css("padding-right",pr+"px"); +}else{ +tab.find("span.tabs-p-tool").remove(); +_5a.css("padding-right",""); +} +} +} +if(_58.disabled){ +_58.tab.addClass("tabs-disabled"); +}else{ +_58.tab.removeClass("tabs-disabled"); +} +_15(_55); +$.data(_55,"tabs").options.onUpdate.call(_55,_58.title,_4d(_55,pp)); +}; +function _5d(_5e,_5f){ +var _60=$.data(_5e,"tabs"); +var _61=_60.options; +var _62=_60.tabs; +var _63=_60.selectHis; +if(!_64(_5e,_5f)){ +return; +} +var tab=_65(_5e,_5f); +var _66=tab.panel("options").title; +var _67=_4d(_5e,tab); +if(_61.onBeforeClose.call(_5e,_66,_67)==false){ +return; +} +var tab=_65(_5e,_5f,true); +tab.panel("options").tab.remove(); +tab.panel("destroy"); +_61.onClose.call(_5e,_66,_67); +_15(_5e); +var his=[]; +for(var i=0;i<_63.length;i++){ +var _68=_63[i]; +if(_68!=_67){ +his.push(_68>_67?_68-1:_68); +} +} +_60.selectHis=his; +var _69=$(_5e).tabs("getSelected"); +if(!_69&&his.length){ +_67=_60.selectHis.pop(); +$(_5e).tabs("select",_67); +} +}; +function _65(_6a,_6b,_6c){ +var _6d=$.data(_6a,"tabs").tabs; +var tab=null; +if(typeof _6b=="number"){ +if(_6b>=0&&_6b<_6d.length){ +tab=_6d[_6b]; +if(_6c){ +_6d.splice(_6b,1); +} +} +}else{ +var tmp=$(""); +for(var i=0;i<_6d.length;i++){ +var p=_6d[i]; +tmp.html(p.panel("options").title); +var _6e=tmp.text(); +tmp.html(_6b); +_6b=tmp.text(); +if(_6e==_6b){ +tab=p; +if(_6c){ +_6d.splice(i,1); +} +break; +} +} +tmp.remove(); +} +return tab; +}; +function _4d(_6f,tab){ +var _70=$.data(_6f,"tabs").tabs; +for(var i=0;i<_70.length;i++){ +if(_70[i][0]==$(tab)[0]){ +return i; +} +} +return -1; +}; +function _26(_71){ +var _72=$.data(_71,"tabs").tabs; +for(var i=0;i<_72.length;i++){ +var tab=_72[i]; +if(tab.panel("options").tab.hasClass("tabs-selected")){ +return tab; +} +} +return null; +}; +function _73(_74){ +var _75=$.data(_74,"tabs"); +var _76=_75.tabs; +for(var i=0;i<_76.length;i++){ +var _77=_76[i].panel("options"); +if(_77.selected&&!_77.disabled){ +_53(_74,i); +return; +} +} +_53(_74,_75.options.selected); +}; +function _53(_78,_79){ +var p=_65(_78,_79); +if(p&&!p.is(":visible")){ +_7a(_78); +if(!p.panel("options").disabled){ +p.panel("open"); +} +} +}; +function _7b(_7c,_7d){ +var p=_65(_7c,_7d); +if(p&&p.is(":visible")){ +_7a(_7c); +p.panel("close"); +} +}; +function _7a(_7e){ +$(_7e).children("div.tabs-panels").each(function(){ +$(this).stop(true,true); +}); +}; +function _64(_7f,_80){ +return _65(_7f,_80)!=null; +}; +function _81(_82,_83){ +var _84=$.data(_82,"tabs").options; +_84.showHeader=_83; +$(_82).tabs("resize"); +}; +function _85(_86,_87){ +var _88=$(_86).find(">.tabs-header>.tabs-tool"); +if(_87){ +_88.removeClass("tabs-tool-hidden").show(); +}else{ +_88.addClass("tabs-tool-hidden").hide(); +} +$(_86).tabs("resize").tabs("scrollBy",0); +}; +$.fn.tabs=function(_89,_8a){ +if(typeof _89=="string"){ +return $.fn.tabs.methods[_89](this,_8a); +} +_89=_89||{}; +return this.each(function(){ +var _8b=$.data(this,"tabs"); +if(_8b){ +$.extend(_8b.options,_89); +}else{ +$.data(this,"tabs",{options:$.extend({},$.fn.tabs.defaults,$.fn.tabs.parseOptions(this),_89),tabs:[],selectHis:[]}); +_2a(this); +} +_f(this); +_38(this); +_15(this); +_30(this); +_73(this); +}); +}; +$.fn.tabs.methods={options:function(jq){ +var cc=jq[0]; +var _8c=$.data(cc,"tabs").options; +var s=_26(cc); +_8c.selected=s?_4d(cc,s):-1; +return _8c; +},tabs:function(jq){ +return $.data(jq[0],"tabs").tabs; +},resize:function(jq,_8d){ +return jq.each(function(){ +_15(this,_8d); +_23(this); +}); +},add:function(jq,_8e){ +return jq.each(function(){ +_4e(this,_8e); +}); +},close:function(jq,_8f){ +return jq.each(function(){ +_5d(this,_8f); +}); +},getTab:function(jq,_90){ +return _65(jq[0],_90); +},getTabIndex:function(jq,tab){ +return _4d(jq[0],tab); +},getSelected:function(jq){ +return _26(jq[0]); +},select:function(jq,_91){ +return jq.each(function(){ +_53(this,_91); +}); +},unselect:function(jq,_92){ +return jq.each(function(){ +_7b(this,_92); +}); +},exists:function(jq,_93){ +return _64(jq[0],_93); +},update:function(jq,_94){ +return jq.each(function(){ +_54(this,_94); +}); +},enableTab:function(jq,_95){ +return jq.each(function(){ +var _96=$(this).tabs("getTab",_95).panel("options"); +_96.tab.removeClass("tabs-disabled"); +_96.disabled=false; +}); +},disableTab:function(jq,_97){ +return jq.each(function(){ +var _98=$(this).tabs("getTab",_97).panel("options"); +_98.tab.addClass("tabs-disabled"); +_98.disabled=true; +}); +},showHeader:function(jq){ +return jq.each(function(){ +_81(this,true); +}); +},hideHeader:function(jq){ +return jq.each(function(){ +_81(this,false); +}); +},showTool:function(jq){ +return jq.each(function(){ +_85(this,true); +}); +},hideTool:function(jq){ +return jq.each(function(){ +_85(this,false); +}); +},scrollBy:function(jq,_99){ +return jq.each(function(){ +var _9a=$(this).tabs("options"); +var _9b=$(this).find(">div.tabs-header>div.tabs-wrap"); +var pos=Math.min(_9b._scrollLeft()+_99,_9c()); +_9b.animate({scrollLeft:pos},_9a.scrollDuration); +function _9c(){ +var w=0; +var ul=_9b.children("ul"); +ul.children("li").each(function(){ +w+=$(this).outerWidth(true); +}); +return w-_9b.width()+(ul.outerWidth()-ul.width()); +}; +}); +}}; +$.fn.tabs.parseOptions=function(_9d){ +return $.extend({},$.parser.parseOptions(_9d,["tools","toolPosition","tabPosition",{fit:"boolean",border:"boolean",plain:"boolean"},{headerWidth:"number",tabWidth:"number",tabHeight:"number",selected:"number"},{showHeader:"boolean",justified:"boolean",narrow:"boolean",pill:"boolean"}])); +}; +$.fn.tabs.defaults={width:"auto",height:"auto",headerWidth:150,tabWidth:"auto",tabHeight:32,selected:0,showHeader:true,plain:false,fit:false,border:true,justified:false,narrow:false,pill:false,tools:null,toolPosition:"right",tabPosition:"top",scrollIncrement:100,scrollDuration:400,onLoad:function(_9e){ +},onSelect:function(_9f,_a0){ +},onUnselect:function(_a1,_a2){ +},onBeforeClose:function(_a3,_a4){ +},onClose:function(_a5,_a6){ +},onAdd:function(_a7,_a8){ +},onUpdate:function(_a9,_aa){ +},onContextMenu:function(e,_ab,_ac){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tagbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tagbox.js new file mode 100644 index 000000000..d08e02fe6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tagbox.js @@ -0,0 +1,223 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"tagbox"); +var _4=_3.options; +$(_2).addClass("tagbox-f").combobox($.extend({},_4,{cls:"tagbox",reversed:true,onChange:function(_5,_6){ +_7(); +$(this).combobox("hidePanel"); +_4.onChange.call(_2,_5,_6); +},onResizing:function(_8,_9){ +var _a=$(this).combobox("textbox"); +var tb=$(this).data("textbox").textbox; +var _b=tb.outerWidth(); +tb.css({height:"",paddingLeft:_a.css("marginLeft"),paddingRight:_a.css("marginRight")}); +_a.css("margin",0); +tb._outerWidth(_b); +_23(_2); +_12(this); +_4.onResizing.call(_2,_8,_9); +},onLoadSuccess:function(_c){ +_7(); +_4.onLoadSuccess.call(_2,_c); +}})); +_7(); +_23(_2); +function _7(){ +$(_2).next().find(".tagbox-label").remove(); +var _d=$(_2).tagbox("textbox"); +var ss=[]; +$.map($(_2).tagbox("getValues"),function(_e,_f){ +var row=_4.finder.getRow(_2,_e); +var _10=_4.tagFormatter.call(_2,_e,row); +var cs={}; +var css=_4.tagStyler.call(_2,_e,row)||""; +if(typeof css=="string"){ +cs={s:css}; +}else{ +cs={c:css["class"]||"",s:css["style"]||""}; +} +var _11=$("").insertBefore(_d).html(_10); +_11.attr("tagbox-index",_f); +_11.attr("style",cs.s).addClass(cs.c); +$("").appendTo(_11); +}); +_12(_2); +$(_2).combobox("setText",""); +}; +}; +function _12(_13,_14){ +var _15=$(_13).next(); +var _16=_14?$(_14):_15.find(".tagbox-label"); +if(_16.length){ +var _17=$(_13).tagbox("textbox"); +var _18=$(_16[0]); +var _19=_18.outerHeight(true)-_18.outerHeight(); +var _1a=_17.outerHeight()-_19*2; +_16.css({height:_1a+"px",lineHeight:_1a+"px"}); +var _1b=_15.find(".textbox-addon").css("height","100%"); +_1b.find(".textbox-icon").css("height","100%"); +_15.find(".textbox-button").linkbutton("resize",{height:"100%"}); +} +}; +function _1c(_1d){ +var _1e=$(_1d).next(); +_1e.unbind(".tagbox").bind("click.tagbox",function(e){ +var _1f=$(_1d).tagbox("options"); +if(_1f.disabled||_1f.readonly){ +return; +} +if($(e.target).hasClass("tagbox-remove")){ +var _20=parseInt($(e.target).parent().attr("tagbox-index")); +var _21=$(_1d).tagbox("getValues"); +if(_1f.onBeforeRemoveTag.call(_1d,_21[_20])==false){ +return; +} +_1f.onRemoveTag.call(_1d,_21[_20]); +_21.splice(_20,1); +$(_1d).tagbox("setValues",_21); +}else{ +var _22=$(e.target).closest(".tagbox-label"); +if(_22.length){ +var _20=parseInt(_22.attr("tagbox-index")); +var _21=$(_1d).tagbox("getValues"); +_1f.onClickTag.call(_1d,_21[_20]); +} +} +$(this).find(".textbox-text").focus(); +}).bind("keyup.tagbox",function(e){ +_23(_1d); +}).bind("mouseover.tagbox",function(e){ +if($(e.target).closest(".textbox-button,.textbox-addon,.tagbox-label").length){ +$(this).triggerHandler("mouseleave"); +}else{ +$(this).find(".textbox-text").triggerHandler("mouseenter"); +} +}).bind("mouseleave.tagbox",function(e){ +$(this).find(".textbox-text").triggerHandler("mouseleave"); +}); +}; +function _23(_24){ +var _25=$(_24).tagbox("options"); +var _26=$(_24).tagbox("textbox"); +var _27=$(_24).next(); +var tmp=$("").appendTo("body"); +tmp.attr("style",_26.attr("style")); +tmp.css({position:"absolute",top:-9999,left:-9999,width:"auto",fontFamily:_26.css("fontFamily"),fontSize:_26.css("fontSize"),fontWeight:_26.css("fontWeight"),whiteSpace:"nowrap"}); +var _28=_29(_26.val()); +var _2a=_29(_25.prompt||""); +tmp.remove(); +var _2b=Math.min(Math.max(_28,_2a)+20,_27.width()); +_26._outerWidth(_2b); +_27.find(".textbox-button").linkbutton("resize",{height:"100%"}); +function _29(val){ +var s=val.replace(/&/g,"&").replace(/\s/g," ").replace(//g,">"); +tmp.html(s); +return tmp.outerWidth(); +}; +}; +function _2c(_2d){ +var t=$(_2d); +var _2e=t.tagbox("options"); +if(_2e.limitToList){ +var _2f=t.tagbox("panel"); +var _30=_2f.children("div.combobox-item-hover"); +if(_30.length){ +_30.removeClass("combobox-item-hover"); +var row=_2e.finder.getRow(_2d,_30); +var _31=row[_2e.valueField]; +$(_2d).tagbox(_30.hasClass("combobox-item-selected")?"unselect":"select",_31); +} +$(_2d).tagbox("hidePanel"); +}else{ +var v=$.trim($(_2d).tagbox("getText")); +if(v!==""){ +var _32=$(_2d).tagbox("getValues"); +_32.push(v); +$(_2d).tagbox("setValues",_32); +} +} +}; +function _33(_34,_35){ +$(_34).combobox("setText",""); +_23(_34); +$(_34).combobox("setValues",_35); +$(_34).combobox("setText",""); +$(_34).tagbox("validate"); +}; +$.fn.tagbox=function(_36,_37){ +if(typeof _36=="string"){ +var _38=$.fn.tagbox.methods[_36]; +if(_38){ +return _38(this,_37); +}else{ +return this.combobox(_36,_37); +} +} +_36=_36||{}; +return this.each(function(){ +var _39=$.data(this,"tagbox"); +if(_39){ +$.extend(_39.options,_36); +}else{ +$.data(this,"tagbox",{options:$.extend({},$.fn.tagbox.defaults,$.fn.tagbox.parseOptions(this),_36)}); +} +_1(this); +_1c(this); +}); +}; +$.fn.tagbox.methods={options:function(jq){ +var _3a=jq.combobox("options"); +return $.extend($.data(jq[0],"tagbox").options,{width:_3a.width,height:_3a.height,originalValue:_3a.originalValue,disabled:_3a.disabled,readonly:_3a.readonly}); +},setValues:function(jq,_3b){ +return jq.each(function(){ +_33(this,_3b); +}); +},reset:function(jq){ +return jq.each(function(){ +$(this).combobox("reset").combobox("setText",""); +}); +}}; +$.fn.tagbox.parseOptions=function(_3c){ +return $.extend({},$.fn.combobox.parseOptions(_3c),$.parser.parseOptions(_3c,[])); +}; +$.fn.tagbox.defaults=$.extend({},$.fn.combobox.defaults,{hasDownArrow:false,multiple:true,reversed:true,selectOnNavigation:false,tipOptions:$.extend({},$.fn.textbox.defaults.tipOptions,{showDelay:200}),val:function(_3d){ +var vv=$(_3d).parent().prev().tagbox("getValues"); +if($(_3d).is(":focus")){ +vv.push($(_3d).val()); +} +return vv.join(","); +},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ +var _3e=e.data.target; +var _3f=$(_3e).tagbox("options"); +if(_3f.limitToList){ +_2c(_3e); +} +}}),keyHandler:$.extend({},$.fn.combobox.defaults.keyHandler,{enter:function(e){ +_2c(this); +},query:function(q,e){ +var _40=$(this).tagbox("options"); +if(_40.limitToList){ +$.fn.combobox.defaults.keyHandler.query.call(this,q,e); +}else{ +$(this).combobox("hidePanel"); +} +}}),tagFormatter:function(_41,row){ +var _42=$(this).tagbox("options"); +return row?row[_42.textField]:_41; +},tagStyler:function(_43,row){ +return ""; +},onClickTag:function(_44){ +},onBeforeRemoveTag:function(_45){ +},onRemoveTag:function(_46){ +}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.textbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.textbox.js new file mode 100644 index 000000000..c3a57164d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.textbox.js @@ -0,0 +1,566 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +var _1=0; +function _2(_3){ +$(_3).addClass("textbox-f").hide(); +var _4=$(""+""+""+"").insertAfter(_3); +var _5=$(_3).attr("name"); +if(_5){ +_4.find("input.textbox-value").attr("name",_5); +$(_3).removeAttr("name").attr("textboxName",_5); +} +return _4; +}; +function _6(_7){ +var _8=$.data(_7,"textbox"); +var _9=_8.options; +var tb=_8.textbox; +var _a="_easyui_textbox_input"+(++_1); +tb.addClass(_9.cls); +tb.find(".textbox-text").remove(); +if(_9.multiline){ +$("").prependTo(tb); +}else{ +$("").prependTo(tb); +} +$("#"+_a).attr("tabindex",$(_7).attr("tabindex")||"").css("text-align",_7.style.textAlign||""); +tb.find(".textbox-addon").remove(); +var bb=_9.icons?$.extend(true,[],_9.icons):[]; +if(_9.iconCls){ +bb.push({iconCls:_9.iconCls,disabled:true}); +} +if(bb.length){ +var bc=$("").prependTo(tb); +bc.addClass("textbox-addon-"+_9.iconAlign); +for(var i=0;i"); +} +} +tb.find(".textbox-button").remove(); +if(_9.buttonText||_9.buttonIcon){ +var _b=$("").prependTo(tb); +_b.addClass("textbox-button-"+_9.buttonAlign).linkbutton({text:_9.buttonText,iconCls:_9.buttonIcon,onClick:function(){ +var t=$(this).parent().prev(); +t.textbox("options").onClickButton.call(t[0]); +}}); +} +if(_9.label){ +if(typeof _9.label=="object"){ +_8.label=$(_9.label); +_8.label.attr("for",_a); +}else{ +$(_8.label).remove(); +_8.label=$("").html(_9.label); +_8.label.css("textAlign",_9.labelAlign).attr("for",_a); +if(_9.labelPosition=="after"){ +_8.label.insertAfter(tb); +}else{ +_8.label.insertBefore(_7); +} +_8.label.removeClass("textbox-label-left textbox-label-right textbox-label-top"); +_8.label.addClass("textbox-label-"+_9.labelPosition); +} +}else{ +$(_8.label).remove(); +} +_c(_7); +_d(_7,_9.disabled); +_e(_7,_9.readonly); +}; +function _f(_10){ +var _11=$.data(_10,"textbox"); +var tb=_11.textbox; +tb.find(".textbox-text").validatebox("destroy"); +tb.remove(); +$(_11.label).remove(); +$(_10).remove(); +}; +function _12(_13,_14){ +var _15=$.data(_13,"textbox"); +var _16=_15.options; +var tb=_15.textbox; +var _17=tb.parent(); +if(_14){ +if(typeof _14=="object"){ +$.extend(_16,_14); +}else{ +_16.width=_14; +} +} +if(isNaN(parseInt(_16.width))){ +var c=$(_13).clone(); +c.css("visibility","hidden"); +c.insertAfter(_13); +_16.width=c.outerWidth(); +c.remove(); +} +var _18=tb.is(":visible"); +if(!_18){ +tb.appendTo("body"); +} +var _19=tb.find(".textbox-text"); +var btn=tb.find(".textbox-button"); +var _1a=tb.find(".textbox-addon"); +var _1b=_1a.find(".textbox-icon"); +if(_16.height=="auto"){ +_19.css({margin:"",paddingTop:"",paddingBottom:"",height:"",lineHeight:""}); +} +tb._size(_16,_17); +if(_16.label&&_16.labelPosition){ +if(_16.labelPosition=="top"){ +_15.label._size({width:_16.labelWidth=="auto"?tb.outerWidth():_16.labelWidth},tb); +if(_16.height!="auto"){ +tb._size("height",tb.outerHeight()-_15.label.outerHeight()); +} +}else{ +_15.label._size({width:_16.labelWidth,height:tb.outerHeight()},tb); +if(!_16.multiline){ +_15.label.css("lineHeight",_15.label.height()+"px"); +} +tb._size("width",tb.outerWidth()-_15.label.outerWidth()); +} +} +if(_16.buttonAlign=="left"||_16.buttonAlign=="right"){ +btn.linkbutton("resize",{height:tb.height()}); +}else{ +btn.linkbutton("resize",{width:"100%"}); +} +var _1c=tb.width()-_1b.length*_16.iconWidth-_1d("left")-_1d("right"); +var _1e=_16.height=="auto"?_19.outerHeight():(tb.height()-_1d("top")-_1d("bottom")); +_1a.css(_16.iconAlign,_1d(_16.iconAlign)+"px"); +_1a.css("top",_1d("top")+"px"); +_1b.css({width:_16.iconWidth+"px",height:_1e+"px"}); +_19.css({paddingLeft:(_13.style.paddingLeft||""),paddingRight:(_13.style.paddingRight||""),marginLeft:_1f("left"),marginRight:_1f("right"),marginTop:_1d("top"),marginBottom:_1d("bottom")}); +if(_16.multiline){ +_19.css({paddingTop:(_13.style.paddingTop||""),paddingBottom:(_13.style.paddingBottom||"")}); +_19._outerHeight(_1e); +}else{ +_19.css({paddingTop:0,paddingBottom:0,height:_1e+"px",lineHeight:_1e+"px"}); +} +_19._outerWidth(_1c); +_16.onResizing.call(_13,_16.width,_16.height); +if(!_18){ +tb.insertAfter(_13); +} +_16.onResize.call(_13,_16.width,_16.height); +function _1f(_20){ +return (_16.iconAlign==_20?_1a._outerWidth():0)+_1d(_20); +}; +function _1d(_21){ +var w=0; +btn.filter(".textbox-button-"+_21).each(function(){ +if(_21=="left"||_21=="right"){ +w+=$(this).outerWidth(); +}else{ +w+=$(this).outerHeight(); +} +}); +return w; +}; +}; +function _c(_22){ +var _23=$(_22).textbox("options"); +var _24=$(_22).textbox("textbox"); +_24.validatebox($.extend({},_23,{deltaX:function(_25){ +return $(_22).textbox("getTipX",_25); +},deltaY:function(_26){ +return $(_22).textbox("getTipY",_26); +},onBeforeValidate:function(){ +_23.onBeforeValidate.call(_22); +var box=$(this); +if(!box.is(":focus")){ +if(box.val()!==_23.value){ +_23.oldInputValue=box.val(); +box.val(_23.value); +} +} +},onValidate:function(_27){ +var box=$(this); +if(_23.oldInputValue!=undefined){ +box.val(_23.oldInputValue); +_23.oldInputValue=undefined; +} +var tb=box.parent(); +if(_27){ +tb.removeClass("textbox-invalid"); +}else{ +tb.addClass("textbox-invalid"); +} +_23.onValidate.call(_22,_27); +}})); +}; +function _28(_29){ +var _2a=$.data(_29,"textbox"); +var _2b=_2a.options; +var tb=_2a.textbox; +var _2c=tb.find(".textbox-text"); +_2c.attr("placeholder",_2b.prompt); +_2c.unbind(".textbox"); +$(_2a.label).unbind(".textbox"); +if(!_2b.disabled&&!_2b.readonly){ +if(_2a.label){ +$(_2a.label).bind("click.textbox",function(e){ +if(!_2b.hasFocusMe){ +_2c.focus(); +$(_29).textbox("setSelectionRange",{start:0,end:_2c.val().length}); +} +}); +} +_2c.bind("blur.textbox",function(e){ +if(!tb.hasClass("textbox-focused")){ +return; +} +_2b.value=$(this).val(); +if(_2b.value==""){ +$(this).val(_2b.prompt).addClass("textbox-prompt"); +}else{ +$(this).removeClass("textbox-prompt"); +} +tb.removeClass("textbox-focused"); +tb.closest(".form-field").removeClass("form-field-focused"); +}).bind("focus.textbox",function(e){ +_2b.hasFocusMe=true; +if(tb.hasClass("textbox-focused")){ +return; +} +if($(this).val()!=_2b.value){ +$(this).val(_2b.value); +} +$(this).removeClass("textbox-prompt"); +tb.addClass("textbox-focused"); +tb.closest(".form-field").addClass("form-field-focused"); +}); +for(var _2d in _2b.inputEvents){ +_2c.bind(_2d+".textbox",{target:_29},_2b.inputEvents[_2d]); +} +} +var _2e=tb.find(".textbox-addon"); +_2e.unbind().bind("click",{target:_29},function(e){ +var _2f=$(e.target).closest("a.textbox-icon:not(.textbox-icon-disabled)"); +if(_2f.length){ +var _30=parseInt(_2f.attr("icon-index")); +var _31=_2b.icons[_30]; +if(_31&&_31.handler){ +_31.handler.call(_2f[0],e); +} +_2b.onClickIcon.call(_29,_30); +} +}); +_2e.find(".textbox-icon").each(function(_32){ +var _33=_2b.icons[_32]; +var _34=$(this); +if(!_33||_33.disabled||_2b.disabled||_2b.readonly){ +_34.addClass("textbox-icon-disabled"); +}else{ +_34.removeClass("textbox-icon-disabled"); +} +}); +var btn=tb.find(".textbox-button"); +btn.linkbutton((_2b.disabled||_2b.readonly)?"disable":"enable"); +tb.unbind(".textbox").bind("_resize.textbox",function(e,_35){ +if($(this).hasClass("easyui-fluid")||_35){ +_12(_29); +} +return false; +}); +}; +function _d(_36,_37){ +var _38=$.data(_36,"textbox"); +var _39=_38.options; +var tb=_38.textbox; +var _3a=tb.find(".textbox-text"); +var ss=$(_36).add(tb.find(".textbox-value")); +_39.disabled=_37; +if(_39.disabled){ +_3a.blur(); +_3a.validatebox("disable"); +tb.addClass("textbox-disabled"); +ss._propAttr("disabled",true); +$(_38.label).addClass("textbox-label-disabled"); +}else{ +_3a.validatebox("enable"); +tb.removeClass("textbox-disabled"); +ss._propAttr("disabled",false); +$(_38.label).removeClass("textbox-label-disabled"); +} +}; +function _e(_3b,_3c){ +var _3d=$.data(_3b,"textbox"); +var _3e=_3d.options; +var tb=_3d.textbox; +var _3f=tb.find(".textbox-text"); +_3e.readonly=_3c==undefined?true:_3c; +if(_3e.readonly){ +_3f.triggerHandler("blur.textbox"); +} +_3f.validatebox("readonly",_3e.readonly); +tb.removeClass("textbox-readonly").addClass(_3e.readonly?"textbox-readonly":""); +}; +$.fn.textbox=function(_40,_41){ +if(typeof _40=="string"){ +var _42=$.fn.textbox.methods[_40]; +if(_42){ +return _42(this,_41); +}else{ +return this.each(function(){ +var _43=$(this).textbox("textbox"); +_43.validatebox(_40,_41); +}); +} +} +_40=_40||{}; +return this.each(function(){ +var _44=$.data(this,"textbox"); +if(_44){ +$.extend(_44.options,_40); +if(_40.value!=undefined){ +_44.options.originalValue=_40.value; +} +}else{ +_44=$.data(this,"textbox",{options:$.extend({},$.fn.textbox.defaults,$.fn.textbox.parseOptions(this),_40),textbox:_2(this)}); +_44.options.originalValue=_44.options.value; +} +_6(this); +_28(this); +if(_44.options.doSize){ +_12(this); +} +var _45=_44.options.value; +_44.options.value=""; +$(this).textbox("initValue",_45); +}); +}; +$.fn.textbox.methods={options:function(jq){ +return $.data(jq[0],"textbox").options; +},cloneFrom:function(jq,_46){ +return jq.each(function(){ +var t=$(this); +if(t.data("textbox")){ +return; +} +if(!$(_46).data("textbox")){ +$(_46).textbox(); +} +var _47=$.extend(true,{},$(_46).textbox("options")); +var _48=t.attr("name")||""; +t.addClass("textbox-f").hide(); +t.removeAttr("name").attr("textboxName",_48); +var _49=$(_46).next().clone().insertAfter(t); +var _4a="_easyui_textbox_input"+(++_1); +_49.find(".textbox-value").attr("name",_48); +_49.find(".textbox-text").attr("id",_4a); +var _4b=$($(_46).textbox("label")).clone(); +if(_4b.length){ +_4b.attr("for",_4a); +if(_47.labelPosition=="after"){ +_4b.insertAfter(t.next()); +}else{ +_4b.insertBefore(t); +} +} +$.data(this,"textbox",{options:_47,textbox:_49,label:(_4b.length?_4b:undefined)}); +var _4c=$(_46).textbox("button"); +if(_4c.length){ +t.textbox("button").linkbutton($.extend(true,{},_4c.linkbutton("options"))); +} +_28(this); +_c(this); +}); +},textbox:function(jq){ +return $.data(jq[0],"textbox").textbox.find(".textbox-text"); +},button:function(jq){ +return $.data(jq[0],"textbox").textbox.find(".textbox-button"); +},label:function(jq){ +return $.data(jq[0],"textbox").label; +},destroy:function(jq){ +return jq.each(function(){ +_f(this); +}); +},resize:function(jq,_4d){ +return jq.each(function(){ +_12(this,_4d); +}); +},disable:function(jq){ +return jq.each(function(){ +_d(this,true); +_28(this); +}); +},enable:function(jq){ +return jq.each(function(){ +_d(this,false); +_28(this); +}); +},readonly:function(jq,_4e){ +return jq.each(function(){ +_e(this,_4e); +_28(this); +}); +},isValid:function(jq){ +return jq.textbox("textbox").validatebox("isValid"); +},clear:function(jq){ +return jq.each(function(){ +$(this).textbox("setValue",""); +}); +},setText:function(jq,_4f){ +return jq.each(function(){ +var _50=$(this).textbox("options"); +var _51=$(this).textbox("textbox"); +_4f=_4f==undefined?"":String(_4f); +if($(this).textbox("getText")!=_4f){ +_51.val(_4f); +} +_50.value=_4f; +if(!_51.is(":focus")){ +if(_4f){ +_51.removeClass("textbox-prompt"); +}else{ +_51.val(_50.prompt).addClass("textbox-prompt"); +} +} +if(_50.value){ +$(this).closest(".form-field").removeClass("form-field-empty"); +}else{ +$(this).closest(".form-field").addClass("form-field-empty"); +} +$(this).textbox("validate"); +}); +},initValue:function(jq,_52){ +return jq.each(function(){ +var _53=$.data(this,"textbox"); +$(this).textbox("setText",_52); +_53.textbox.find(".textbox-value").val(_52); +$(this).val(_52); +}); +},setValue:function(jq,_54){ +return jq.each(function(){ +var _55=$.data(this,"textbox").options; +var _56=$(this).textbox("getValue"); +$(this).textbox("initValue",_54); +if(_56!=_54){ +_55.onChange.call(this,_54,_56); +$(this).closest("form").trigger("_change",[this]); +} +}); +},getText:function(jq){ +var _57=jq.textbox("textbox"); +if(_57.is(":focus")){ +return _57.val(); +}else{ +return jq.textbox("options").value; +} +},getValue:function(jq){ +return jq.data("textbox").textbox.find(".textbox-value").val(); +},reset:function(jq){ +return jq.each(function(){ +var _58=$(this).textbox("options"); +$(this).textbox("textbox").val(_58.originalValue); +$(this).textbox("setValue",_58.originalValue); +}); +},getIcon:function(jq,_59){ +return jq.data("textbox").textbox.find(".textbox-icon:eq("+_59+")"); +},getTipX:function(jq,_5a){ +var _5b=jq.data("textbox"); +var _5c=_5b.options; +var tb=_5b.textbox; +var _5d=tb.find(".textbox-text"); +var _5a=_5a||_5c.tipPosition; +var p1=tb.offset(); +var p2=_5d.offset(); +var w1=tb.outerWidth(); +var w2=_5d.outerWidth(); +if(_5a=="right"){ +return w1-w2-p2.left+p1.left; +}else{ +if(_5a=="left"){ +return p1.left-p2.left; +}else{ +return (w1-w2-p2.left+p1.left)/2-(p2.left-p1.left)/2; +} +} +},getTipY:function(jq,_5e){ +var _5f=jq.data("textbox"); +var _60=_5f.options; +var tb=_5f.textbox; +var _61=tb.find(".textbox-text"); +var _5e=_5e||_60.tipPosition; +var p1=tb.offset(); +var p2=_61.offset(); +var h1=tb.outerHeight(); +var h2=_61.outerHeight(); +if(_5e=="left"||_5e=="right"){ +return (h1-h2-p2.top+p1.top)/2-(p2.top-p1.top)/2; +}else{ +if(_5e=="bottom"){ +return (h1-h2-p2.top+p1.top); +}else{ +return (p1.top-p2.top); +} +} +},getSelectionStart:function(jq){ +return jq.textbox("getSelectionRange").start; +},getSelectionRange:function(jq){ +var _62=jq.textbox("textbox")[0]; +var _63=0; +var end=0; +if(typeof _62.selectionStart=="number"){ +_63=_62.selectionStart; +end=_62.selectionEnd; +}else{ +if(_62.createTextRange){ +var s=document.selection.createRange(); +var _64=_62.createTextRange(); +_64.setEndPoint("EndToStart",s); +_63=_64.text.length; +end=_63+s.text.length; +} +} +return {start:_63,end:end}; +},setSelectionRange:function(jq,_65){ +return jq.each(function(){ +var _66=$(this).textbox("textbox")[0]; +var _67=_65.start; +var end=_65.end; +if(_66.setSelectionRange){ +_66.setSelectionRange(_67,end); +}else{ +if(_66.createTextRange){ +var _68=_66.createTextRange(); +_68.collapse(); +_68.moveEnd("character",end); +_68.moveStart("character",_67); +_68.select(); +} +} +}); +}}; +$.fn.textbox.parseOptions=function(_69){ +var t=$(_69); +return $.extend({},$.fn.validatebox.parseOptions(_69),$.parser.parseOptions(_69,["prompt","iconCls","iconAlign","buttonText","buttonIcon","buttonAlign","label","labelPosition","labelAlign",{multiline:"boolean",iconWidth:"number",labelWidth:"number"}]),{value:(t.val()||undefined),type:(t.attr("type")?t.attr("type"):undefined)}); +}; +$.fn.textbox.defaults=$.extend({},$.fn.validatebox.defaults,{doSize:true,width:"auto",height:"auto",cls:null,prompt:"",value:"",type:"text",multiline:false,icons:[],iconCls:null,iconAlign:"right",iconWidth:26,buttonText:"",buttonIcon:null,buttonAlign:"right",label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",inputEvents:{blur:function(e){ +var t=$(e.data.target); +var _6a=t.textbox("options"); +if(t.textbox("getValue")!=_6a.value){ +t.textbox("setValue",_6a.value); +} +},keydown:function(e){ +if(e.keyCode==13){ +var t=$(e.data.target); +t.textbox("setValue",t.textbox("getText")); +} +}},onChange:function(_6b,_6c){ +},onResizing:function(_6d,_6e){ +},onResize:function(_6f,_70){ +},onClickButton:function(){ +},onClickIcon:function(_71){ +}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.timespinner.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.timespinner.js new file mode 100755 index 000000000..a956b446e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.timespinner.js @@ -0,0 +1,149 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"timespinner").options; +$(_2).addClass("timespinner-f").spinner(_3); +var _4=_3.formatter.call(_2,_3.parser.call(_2,_3.value)); +$(_2).timespinner("initValue",_4); +}; +function _5(e){ +var _6=e.data.target; +var _7=$.data(_6,"timespinner").options; +var _8=$(_6).timespinner("getSelectionStart"); +for(var i=0;i<_7.selections.length;i++){ +var _9=_7.selections[i]; +if(_8>=_9[0]&&_8<=_9[1]){ +_a(_6,i); +return; +} +} +}; +function _a(_b,_c){ +var _d=$.data(_b,"timespinner").options; +if(_c!=undefined){ +_d.highlight=_c; +} +var _e=_d.selections[_d.highlight]; +if(_e){ +var tb=$(_b).timespinner("textbox"); +$(_b).timespinner("setSelectionRange",{start:_e[0],end:_e[1]}); +tb.focus(); +} +}; +function _f(_10,_11){ +var _12=$.data(_10,"timespinner").options; +var _11=_12.parser.call(_10,_11); +var _13=_12.formatter.call(_10,_11); +$(_10).spinner("setValue",_13); +}; +function _14(_15,_16){ +var _17=$.data(_15,"timespinner").options; +var s=$(_15).timespinner("getValue"); +var _18=_17.selections[_17.highlight]; +var s1=s.substring(0,_18[0]); +var s2=s.substring(_18[0],_18[1]); +var s3=s.substring(_18[1]); +var v=s1+((parseInt(s2,10)||0)+_17.increment*(_16?-1:1))+s3; +$(_15).timespinner("setValue",v); +_a(_15); +}; +$.fn.timespinner=function(_19,_1a){ +if(typeof _19=="string"){ +var _1b=$.fn.timespinner.methods[_19]; +if(_1b){ +return _1b(this,_1a); +}else{ +return this.spinner(_19,_1a); +} +} +_19=_19||{}; +return this.each(function(){ +var _1c=$.data(this,"timespinner"); +if(_1c){ +$.extend(_1c.options,_19); +}else{ +$.data(this,"timespinner",{options:$.extend({},$.fn.timespinner.defaults,$.fn.timespinner.parseOptions(this),_19)}); +} +_1(this); +}); +}; +$.fn.timespinner.methods={options:function(jq){ +var _1d=jq.data("spinner")?jq.spinner("options"):{}; +return $.extend($.data(jq[0],"timespinner").options,{width:_1d.width,value:_1d.value,originalValue:_1d.originalValue,disabled:_1d.disabled,readonly:_1d.readonly}); +},setValue:function(jq,_1e){ +return jq.each(function(){ +_f(this,_1e); +}); +},getHours:function(jq){ +var _1f=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(_1f.separator); +return parseInt(vv[0],10); +},getMinutes:function(jq){ +var _20=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(_20.separator); +return parseInt(vv[1],10); +},getSeconds:function(jq){ +var _21=$.data(jq[0],"timespinner").options; +var vv=jq.timespinner("getValue").split(_21.separator); +return parseInt(vv[2],10)||0; +}}; +$.fn.timespinner.parseOptions=function(_22){ +return $.extend({},$.fn.spinner.parseOptions(_22),$.parser.parseOptions(_22,["separator",{showSeconds:"boolean",highlight:"number"}])); +}; +$.fn.timespinner.defaults=$.extend({},$.fn.spinner.defaults,{inputEvents:$.extend({},$.fn.spinner.defaults.inputEvents,{click:function(e){ +_5.call(this,e); +},blur:function(e){ +var t=$(e.data.target); +t.timespinner("setValue",t.timespinner("getText")); +},keydown:function(e){ +if(e.keyCode==13){ +var t=$(e.data.target); +t.timespinner("setValue",t.timespinner("getText")); +} +}}),formatter:function(_23){ +if(!_23){ +return ""; +} +var _24=$(this).timespinner("options"); +var tt=[_25(_23.getHours()),_25(_23.getMinutes())]; +if(_24.showSeconds){ +tt.push(_25(_23.getSeconds())); +} +return tt.join(_24.separator); +function _25(_26){ +return (_26<10?"0":"")+_26; +}; +},parser:function(s){ +var _27=$(this).timespinner("options"); +var _28=_29(s); +if(_28){ +var min=_29(_27.min); +var max=_29(_27.max); +if(min&&min>_28){ +_28=min; +} +if(max&&max<_28){ +_28=max; +} +} +return _28; +function _29(s){ +if(!s){ +return null; +} +var tt=s.split(_27.separator); +return new Date(1900,0,0,parseInt(tt[0],10)||0,parseInt(tt[1],10)||0,parseInt(tt[2],10)||0); +}; +},selections:[[0,2],[3,5],[6,8]],separator:":",showSeconds:false,highlight:0,spin:function(_2a){ +_14(this,_2a); +}}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tooltip.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tooltip.js new file mode 100755 index 000000000..c15686578 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tooltip.js @@ -0,0 +1,238 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +$(_2).addClass("tooltip-f"); +}; +function _3(_4){ +var _5=$.data(_4,"tooltip").options; +$(_4).unbind(".tooltip").bind(_5.showEvent+".tooltip",function(e){ +$(_4).tooltip("show",e); +}).bind(_5.hideEvent+".tooltip",function(e){ +$(_4).tooltip("hide",e); +}).bind("mousemove.tooltip",function(e){ +if(_5.trackMouse){ +_5.trackMouseX=e.pageX; +_5.trackMouseY=e.pageY; +$(_4).tooltip("reposition"); +} +}); +}; +function _6(_7){ +var _8=$.data(_7,"tooltip"); +if(_8.showTimer){ +clearTimeout(_8.showTimer); +_8.showTimer=null; +} +if(_8.hideTimer){ +clearTimeout(_8.hideTimer); +_8.hideTimer=null; +} +}; +function _9(_a){ +var _b=$.data(_a,"tooltip"); +if(!_b||!_b.tip){ +return; +} +var _c=_b.options; +var _d=_b.tip; +var _e={left:-100000,top:-100000}; +if($(_a).is(":visible")){ +_e=_f(_c.position); +if(_c.position=="top"&&_e.top<0){ +_e=_f("bottom"); +}else{ +if((_c.position=="bottom")&&(_e.top+_d._outerHeight()>$(window)._outerHeight()+$(document).scrollTop())){ +_e=_f("top"); +} +} +if(_e.left<0){ +if(_c.position=="left"){ +_e=_f("right"); +}else{ +$(_a).tooltip("arrow").css("left",_d._outerWidth()/2+_e.left); +_e.left=0; +} +}else{ +if(_e.left+_d._outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ +if(_c.position=="right"){ +_e=_f("left"); +}else{ +var _10=_e.left; +_e.left=$(window)._outerWidth()+$(document)._scrollLeft()-_d._outerWidth(); +$(_a).tooltip("arrow").css("left",_d._outerWidth()/2-(_e.left-_10)); +} +} +} +} +_d.css({left:_e.left,top:_e.top,zIndex:(_c.zIndex!=undefined?_c.zIndex:($.fn.window?$.fn.window.defaults.zIndex++:""))}); +_c.onPosition.call(_a,_e.left,_e.top); +function _f(_11){ +_c.position=_11||"bottom"; +_d.removeClass("tooltip-top tooltip-bottom tooltip-left tooltip-right").addClass("tooltip-"+_c.position); +var _12,top; +var _13=$.isFunction(_c.deltaX)?_c.deltaX.call(_a,_c.position):_c.deltaX; +var _14=$.isFunction(_c.deltaY)?_c.deltaY.call(_a,_c.position):_c.deltaY; +if(_c.trackMouse){ +t=$(); +_12=_c.trackMouseX+_13; +top=_c.trackMouseY+_14; +}else{ +var t=$(_a); +_12=t.offset().left+_13; +top=t.offset().top+_14; +} +switch(_c.position){ +case "right": +_12+=t._outerWidth()+12+(_c.trackMouse?12:0); +if(_c.valign=="middle"){ +top-=(_d._outerHeight()-t._outerHeight())/2; +} +break; +case "left": +_12-=_d._outerWidth()+12+(_c.trackMouse?12:0); +if(_c.valign=="middle"){ +top-=(_d._outerHeight()-t._outerHeight())/2; +} +break; +case "top": +_12-=(_d._outerWidth()-t._outerWidth())/2; +top-=_d._outerHeight()+12+(_c.trackMouse?12:0); +break; +case "bottom": +_12-=(_d._outerWidth()-t._outerWidth())/2; +top+=t._outerHeight()+12+(_c.trackMouse?12:0); +break; +} +return {left:_12,top:top}; +}; +}; +function _15(_16,e){ +var _17=$.data(_16,"tooltip"); +var _18=_17.options; +var tip=_17.tip; +if(!tip){ +tip=$("
                                                                                                        "+"
                                                                                                        "+"
                                                                                                        "+"
                                                                                                        "+"
                                                                                                        ").appendTo("body"); +_17.tip=tip; +_19(_16); +} +_6(_16); +_17.showTimer=setTimeout(function(){ +$(_16).tooltip("reposition"); +tip.show(); +_18.onShow.call(_16,e); +var _1a=tip.children(".tooltip-arrow-outer"); +var _1b=tip.children(".tooltip-arrow"); +var bc="border-"+_18.position+"-color"; +_1a.add(_1b).css({borderTopColor:"",borderBottomColor:"",borderLeftColor:"",borderRightColor:""}); +_1a.css(bc,tip.css(bc)); +_1b.css(bc,tip.css("backgroundColor")); +},_18.showDelay); +}; +function _1c(_1d,e){ +var _1e=$.data(_1d,"tooltip"); +if(_1e&&_1e.tip){ +_6(_1d); +_1e.hideTimer=setTimeout(function(){ +_1e.tip.hide(); +_1e.options.onHide.call(_1d,e); +},_1e.options.hideDelay); +} +}; +function _19(_1f,_20){ +var _21=$.data(_1f,"tooltip"); +var _22=_21.options; +if(_20){ +_22.content=_20; +} +if(!_21.tip){ +return; +} +var cc=typeof _22.content=="function"?_22.content.call(_1f):_22.content; +_21.tip.children(".tooltip-content").html(cc); +_22.onUpdate.call(_1f,cc); +}; +function _23(_24){ +var _25=$.data(_24,"tooltip"); +if(_25){ +_6(_24); +var _26=_25.options; +if(_25.tip){ +_25.tip.remove(); +} +if(_26._title){ +$(_24).attr("title",_26._title); +} +$.removeData(_24,"tooltip"); +$(_24).unbind(".tooltip").removeClass("tooltip-f"); +_26.onDestroy.call(_24); +} +}; +$.fn.tooltip=function(_27,_28){ +if(typeof _27=="string"){ +return $.fn.tooltip.methods[_27](this,_28); +} +_27=_27||{}; +return this.each(function(){ +var _29=$.data(this,"tooltip"); +if(_29){ +$.extend(_29.options,_27); +}else{ +$.data(this,"tooltip",{options:$.extend({},$.fn.tooltip.defaults,$.fn.tooltip.parseOptions(this),_27)}); +_1(this); +} +_3(this); +_19(this); +}); +}; +$.fn.tooltip.methods={options:function(jq){ +return $.data(jq[0],"tooltip").options; +},tip:function(jq){ +return $.data(jq[0],"tooltip").tip; +},arrow:function(jq){ +return jq.tooltip("tip").children(".tooltip-arrow-outer,.tooltip-arrow"); +},show:function(jq,e){ +return jq.each(function(){ +_15(this,e); +}); +},hide:function(jq,e){ +return jq.each(function(){ +_1c(this,e); +}); +},update:function(jq,_2a){ +return jq.each(function(){ +_19(this,_2a); +}); +},reposition:function(jq){ +return jq.each(function(){ +_9(this); +}); +},destroy:function(jq){ +return jq.each(function(){ +_23(this); +}); +}}; +$.fn.tooltip.parseOptions=function(_2b){ +var t=$(_2b); +var _2c=$.extend({},$.parser.parseOptions(_2b,["position","showEvent","hideEvent","content",{trackMouse:"boolean",deltaX:"number",deltaY:"number",showDelay:"number",hideDelay:"number"}]),{_title:t.attr("title")}); +t.attr("title",""); +if(!_2c.content){ +_2c.content=_2c._title; +} +return _2c; +}; +$.fn.tooltip.defaults={position:"bottom",valign:"middle",content:null,trackMouse:false,deltaX:0,deltaY:0,showEvent:"mouseenter",hideEvent:"mouseleave",showDelay:200,hideDelay:100,onShow:function(e){ +},onHide:function(e){ +},onUpdate:function(_2d){ +},onPosition:function(_2e,top){ +},onDestroy:function(){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tree.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tree.js new file mode 100755 index 000000000..e6fcf1d26 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tree.js @@ -0,0 +1,1247 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$(_2); +_3.addClass("tree"); +return _3; +}; +function _4(_5){ +var _6=$.data(_5,"tree").options; +$(_5).unbind().bind("mouseover",function(e){ +var tt=$(e.target); +var _7=tt.closest("div.tree-node"); +if(!_7.length){ +return; +} +_7.addClass("tree-node-hover"); +if(tt.hasClass("tree-hit")){ +if(tt.hasClass("tree-expanded")){ +tt.addClass("tree-expanded-hover"); +}else{ +tt.addClass("tree-collapsed-hover"); +} +} +e.stopPropagation(); +}).bind("mouseout",function(e){ +var tt=$(e.target); +var _8=tt.closest("div.tree-node"); +if(!_8.length){ +return; +} +_8.removeClass("tree-node-hover"); +if(tt.hasClass("tree-hit")){ +if(tt.hasClass("tree-expanded")){ +tt.removeClass("tree-expanded-hover"); +}else{ +tt.removeClass("tree-collapsed-hover"); +} +} +e.stopPropagation(); +}).bind("click",function(e){ +var tt=$(e.target); +var _9=tt.closest("div.tree-node"); +if(!_9.length){ +return; +} +if(tt.hasClass("tree-hit")){ +_85(_5,_9[0]); +return false; +}else{ +if(tt.hasClass("tree-checkbox")){ +_34(_5,_9[0]); +return false; +}else{ +_d9(_5,_9[0]); +_6.onClick.call(_5,_c(_5,_9[0])); +} +} +e.stopPropagation(); +}).bind("dblclick",function(e){ +var _a=$(e.target).closest("div.tree-node"); +if(!_a.length){ +return; +} +_d9(_5,_a[0]); +_6.onDblClick.call(_5,_c(_5,_a[0])); +e.stopPropagation(); +}).bind("contextmenu",function(e){ +var _b=$(e.target).closest("div.tree-node"); +if(!_b.length){ +return; +} +_6.onContextMenu.call(_5,e,_c(_5,_b[0])); +e.stopPropagation(); +}); +}; +function _d(_e){ +var _f=$.data(_e,"tree").options; +_f.dnd=false; +var _10=$(_e).find("div.tree-node"); +_10.draggable("disable"); +_10.css("cursor","pointer"); +}; +function _11(_12){ +var _13=$.data(_12,"tree"); +var _14=_13.options; +var _15=_13.tree; +_13.disabledNodes=[]; +_14.dnd=true; +_15.find("div.tree-node").draggable({disabled:false,revert:true,cursor:"pointer",proxy:function(_16){ +var p=$("
                                                                                                        ").appendTo("body"); +p.html(" "+$(_16).find(".tree-title").html()); +p.hide(); +return p; +},deltaX:15,deltaY:15,onBeforeDrag:function(e){ +if(_14.onBeforeDrag.call(_12,_c(_12,this))==false){ +return false; +} +if($(e.target).hasClass("tree-hit")||$(e.target).hasClass("tree-checkbox")){ +return false; +} +if(e.which!=1){ +return false; +} +var _17=$(this).find("span.tree-indent"); +if(_17.length){ +e.data.offsetWidth-=_17.length*_17.width(); +} +},onStartDrag:function(e){ +$(this).next("ul").find("div.tree-node").each(function(){ +$(this).droppable("disable"); +_13.disabledNodes.push(this); +}); +$(this).draggable("proxy").css({left:-10000,top:-10000}); +_14.onStartDrag.call(_12,_c(_12,this)); +var _18=_c(_12,this); +if(_18.id==undefined){ +_18.id="easyui_tree_node_id_temp"; +_60(_12,_18); +} +_13.draggingNodeId=_18.id; +},onDrag:function(e){ +var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY; +var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); +if(d>3){ +$(this).draggable("proxy").show(); +} +this.pageY=e.pageY; +},onStopDrag:function(){ +for(var i=0;i<_13.disabledNodes.length;i++){ +$(_13.disabledNodes[i]).droppable("enable"); +} +_13.disabledNodes=[]; +var _19=_d0(_12,_13.draggingNodeId); +if(_19&&_19.id=="easyui_tree_node_id_temp"){ +_19.id=""; +_60(_12,_19); +} +_14.onStopDrag.call(_12,_19); +}}).droppable({accept:"div.tree-node",onDragEnter:function(e,_1a){ +if(_14.onDragEnter.call(_12,this,_1b(_1a))==false){ +_1c(_1a,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +$(this).droppable("disable"); +_13.disabledNodes.push(this); +} +},onDragOver:function(e,_1d){ +if($(this).droppable("options").disabled){ +return; +} +var _1e=_1d.pageY; +var top=$(this).offset().top; +var _1f=top+$(this).outerHeight(); +_1c(_1d,true); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +if(_1e>top+(_1f-top)/2){ +if(_1f-_1e<5){ +$(this).addClass("tree-node-bottom"); +}else{ +$(this).addClass("tree-node-append"); +} +}else{ +if(_1e-top<5){ +$(this).addClass("tree-node-top"); +}else{ +$(this).addClass("tree-node-append"); +} +} +if(_14.onDragOver.call(_12,this,_1b(_1d))==false){ +_1c(_1d,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +$(this).droppable("disable"); +_13.disabledNodes.push(this); +} +},onDragLeave:function(e,_20){ +_1c(_20,false); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +_14.onDragLeave.call(_12,this,_1b(_20)); +},onDrop:function(e,_21){ +var _22=this; +var _23,_24; +if($(this).hasClass("tree-node-append")){ +_23=_25; +_24="append"; +}else{ +_23=_26; +_24=$(this).hasClass("tree-node-top")?"top":"bottom"; +} +if(_14.onBeforeDrop.call(_12,_22,_1b(_21),_24)==false){ +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +return; +} +_23(_21,_22,_24); +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); +}}); +function _1b(_27,pop){ +return $(_27).closest("ul.tree").tree(pop?"pop":"getData",_27); +}; +function _1c(_28,_29){ +var _2a=$(_28).draggable("proxy").find("span.tree-dnd-icon"); +_2a.removeClass("tree-dnd-yes tree-dnd-no").addClass(_29?"tree-dnd-yes":"tree-dnd-no"); +}; +function _25(_2b,_2c){ +if(_c(_12,_2c).state=="closed"){ +_79(_12,_2c,function(){ +_2d(); +}); +}else{ +_2d(); +} +function _2d(){ +var _2e=_1b(_2b,true); +$(_12).tree("append",{parent:_2c,data:[_2e]}); +_14.onDrop.call(_12,_2c,_2e,"append"); +}; +}; +function _26(_2f,_30,_31){ +var _32={}; +if(_31=="top"){ +_32.before=_30; +}else{ +_32.after=_30; +} +var _33=_1b(_2f,true); +_32.data=_33; +$(_12).tree("insert",_32); +_14.onDrop.call(_12,_30,_33,_31); +}; +}; +function _34(_35,_36,_37,_38){ +var _39=$.data(_35,"tree"); +var _3a=_39.options; +if(!_3a.checkbox){ +return; +} +var _3b=_c(_35,_36); +if(!_3b.checkState){ +return; +} +var ck=$(_36).find(".tree-checkbox"); +if(_37==undefined){ +if(ck.hasClass("tree-checkbox1")){ +_37=false; +}else{ +if(ck.hasClass("tree-checkbox0")){ +_37=true; +}else{ +if(_3b._checked==undefined){ +_3b._checked=$(_36).find(".tree-checkbox").hasClass("tree-checkbox1"); +} +_37=!_3b._checked; +} +} +} +_3b._checked=_37; +if(_37){ +if(ck.hasClass("tree-checkbox1")){ +return; +} +}else{ +if(ck.hasClass("tree-checkbox0")){ +return; +} +} +if(!_38){ +if(_3a.onBeforeCheck.call(_35,_3b,_37)==false){ +return; +} +} +if(_3a.cascadeCheck){ +_3c(_35,_3b,_37); +_3d(_35,_3b); +}else{ +_3e(_35,_3b,_37?"1":"0"); +} +if(!_38){ +_3a.onCheck.call(_35,_3b,_37); +} +}; +function _3c(_3f,_40,_41){ +var _42=$.data(_3f,"tree").options; +var _43=_41?1:0; +_3e(_3f,_40,_43); +if(_42.deepCheck){ +$.easyui.forEach(_40.children||[],true,function(n){ +_3e(_3f,n,_43); +}); +}else{ +var _44=[]; +if(_40.children&&_40.children.length){ +_44.push(_40); +} +$.easyui.forEach(_40.children||[],true,function(n){ +if(!n.hidden){ +_3e(_3f,n,_43); +if(n.children&&n.children.length){ +_44.push(n); +} +} +}); +for(var i=_44.length-1;i>=0;i--){ +var _45=_44[i]; +_3e(_3f,_45,_46(_45)); +} +} +}; +function _3e(_47,_48,_49){ +var _4a=$.data(_47,"tree").options; +if(!_48.checkState||_49==undefined){ +return; +} +if(_48.hidden&&!_4a.deepCheck){ +return; +} +var ck=$("#"+_48.domId).find(".tree-checkbox"); +_48.checkState=["unchecked","checked","indeterminate"][_49]; +_48.checked=(_48.checkState=="checked"); +ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); +ck.addClass("tree-checkbox"+_49); +}; +function _3d(_4b,_4c){ +var pd=_4d(_4b,$("#"+_4c.domId)[0]); +if(pd){ +_3e(_4b,pd,_46(pd)); +_3d(_4b,pd); +} +}; +function _46(row){ +var c0=0; +var c1=0; +var len=0; +$.easyui.forEach(row.children||[],false,function(r){ +if(r.checkState){ +len++; +if(r.checkState=="checked"){ +c1++; +}else{ +if(r.checkState=="unchecked"){ +c0++; +} +} +} +}); +if(len==0){ +return undefined; +} +var _4e=0; +if(c0==len){ +_4e=0; +}else{ +if(c1==len){ +_4e=1; +}else{ +_4e=2; +} +} +return _4e; +}; +function _4f(_50,_51){ +var _52=$.data(_50,"tree").options; +if(!_52.checkbox){ +return; +} +var _53=$(_51); +var ck=_53.find(".tree-checkbox"); +var _54=_c(_50,_51); +if(_52.view.hasCheckbox(_50,_54)){ +if(!ck.length){ +_54.checkState=_54.checkState||"unchecked"; +$("").insertBefore(_53.find(".tree-title")); +} +if(_54.checkState=="checked"){ +_34(_50,_51,true,true); +}else{ +if(_54.checkState=="unchecked"){ +_34(_50,_51,false,true); +}else{ +var _55=_46(_54); +if(_55===0){ +_34(_50,_51,false,true); +}else{ +if(_55===1){ +_34(_50,_51,true,true); +} +} +} +} +}else{ +ck.remove(); +_54.checkState=undefined; +_54.checked=undefined; +_3d(_50,_54); +} +}; +function _56(_57,ul,_58,_59,_5a){ +var _5b=$.data(_57,"tree"); +var _5c=_5b.options; +var _5d=$(ul).prevAll("div.tree-node:first"); +_58=_5c.loadFilter.call(_57,_58,_5d[0]); +var _5e=_5f(_57,"domId",_5d.attr("id")); +if(!_59){ +_5e?_5e.children=_58:_5b.data=_58; +$(ul).empty(); +}else{ +if(_5e){ +_5e.children?_5e.children=_5e.children.concat(_58):_5e.children=_58; +}else{ +_5b.data=_5b.data.concat(_58); +} +} +_5c.view.render.call(_5c.view,_57,ul,_58); +if(_5c.dnd){ +_11(_57); +} +if(_5e){ +_60(_57,_5e); +} +for(var i=0;i<_5b.tmpIds.length;i++){ +_34(_57,$("#"+_5b.tmpIds[i])[0],true,true); +} +_5b.tmpIds=[]; +setTimeout(function(){ +_61(_57,_57); +},0); +if(!_5a){ +_5c.onLoadSuccess.call(_57,_5e,_58); +} +}; +function _61(_62,ul,_63){ +var _64=$.data(_62,"tree").options; +if(_64.lines){ +$(_62).addClass("tree-lines"); +}else{ +$(_62).removeClass("tree-lines"); +return; +} +if(!_63){ +_63=true; +$(_62).find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); +$(_62).find("div.tree-node").removeClass("tree-node-last tree-root-first tree-root-one"); +var _65=$(_62).tree("getRoots"); +if(_65.length>1){ +$(_65[0].target).addClass("tree-root-first"); +}else{ +if(_65.length==1){ +$(_65[0].target).addClass("tree-root-one"); +} +} +} +$(ul).children("li").each(function(){ +var _66=$(this).children("div.tree-node"); +var ul=_66.next("ul"); +if(ul.length){ +if($(this).next().length){ +_67(_66); +} +_61(_62,ul,_63); +}else{ +_68(_66); +} +}); +var _69=$(ul).children("li:last").children("div.tree-node").addClass("tree-node-last"); +_69.children("span.tree-join").removeClass("tree-join").addClass("tree-joinbottom"); +function _68(_6a,_6b){ +var _6c=_6a.find("span.tree-icon"); +_6c.prev("span.tree-indent").addClass("tree-join"); +}; +function _67(_6d){ +var _6e=_6d.find("span.tree-indent, span.tree-hit").length; +_6d.next().find("div.tree-node").each(function(){ +$(this).children("span:eq("+(_6e-1)+")").addClass("tree-line"); +}); +}; +}; +function _6f(_70,ul,_71,_72){ +var _73=$.data(_70,"tree").options; +_71=$.extend({},_73.queryParams,_71||{}); +var _74=null; +if(_70!=ul){ +var _75=$(ul).prev(); +_74=_c(_70,_75[0]); +} +if(_73.onBeforeLoad.call(_70,_74,_71)==false){ +return; +} +var _76=$(ul).prev().children("span.tree-folder"); +_76.addClass("tree-loading"); +var _77=_73.loader.call(_70,_71,function(_78){ +_76.removeClass("tree-loading"); +_56(_70,ul,_78); +if(_72){ +_72(); +} +},function(){ +_76.removeClass("tree-loading"); +_73.onLoadError.apply(_70,arguments); +if(_72){ +_72(); +} +}); +if(_77==false){ +_76.removeClass("tree-loading"); +} +}; +function _79(_7a,_7b,_7c){ +var _7d=$.data(_7a,"tree").options; +var hit=$(_7b).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +return; +} +var _7e=_c(_7a,_7b); +if(_7d.onBeforeExpand.call(_7a,_7e)==false){ +return; +} +hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); +hit.next().addClass("tree-folder-open"); +var ul=$(_7b).next(); +if(ul.length){ +if(_7d.animate){ +ul.slideDown("normal",function(){ +_7e.state="open"; +_7d.onExpand.call(_7a,_7e); +if(_7c){ +_7c(); +} +}); +}else{ +ul.css("display","block"); +_7e.state="open"; +_7d.onExpand.call(_7a,_7e); +if(_7c){ +_7c(); +} +} +}else{ +var _7f=$("
                                                                                                          ").insertAfter(_7b); +_6f(_7a,_7f[0],{id:_7e.id},function(){ +if(_7f.is(":empty")){ +_7f.remove(); +} +if(_7d.animate){ +_7f.slideDown("normal",function(){ +_7e.state="open"; +_7d.onExpand.call(_7a,_7e); +if(_7c){ +_7c(); +} +}); +}else{ +_7f.css("display","block"); +_7e.state="open"; +_7d.onExpand.call(_7a,_7e); +if(_7c){ +_7c(); +} +} +}); +} +}; +function _80(_81,_82){ +var _83=$.data(_81,"tree").options; +var hit=$(_82).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-collapsed")){ +return; +} +var _84=_c(_81,_82); +if(_83.onBeforeCollapse.call(_81,_84)==false){ +return; +} +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +hit.next().removeClass("tree-folder-open"); +var ul=$(_82).next(); +if(_83.animate){ +ul.slideUp("normal",function(){ +_84.state="closed"; +_83.onCollapse.call(_81,_84); +}); +}else{ +ul.css("display","none"); +_84.state="closed"; +_83.onCollapse.call(_81,_84); +} +}; +function _85(_86,_87){ +var hit=$(_87).children("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +_80(_86,_87); +}else{ +_79(_86,_87); +} +}; +function _88(_89,_8a){ +var _8b=_8c(_89,_8a); +if(_8a){ +_8b.unshift(_c(_89,_8a)); +} +for(var i=0;i<_8b.length;i++){ +_79(_89,_8b[i].target); +} +}; +function _8d(_8e,_8f){ +var _90=[]; +var p=_4d(_8e,_8f); +while(p){ +_90.unshift(p); +p=_4d(_8e,p.target); +} +for(var i=0;i<_90.length;i++){ +_79(_8e,_90[i].target); +} +}; +function _91(_92,_93){ +var c=$(_92).parent(); +while(c[0].tagName!="BODY"&&c.css("overflow-y")!="auto"){ +c=c.parent(); +} +var n=$(_93); +var _94=n.offset().top; +if(c[0].tagName!="BODY"){ +var _95=c.offset().top; +if(_94<_95){ +c.scrollTop(c.scrollTop()+_94-_95); +}else{ +if(_94+n.outerHeight()>_95+c.outerHeight()-18){ +c.scrollTop(c.scrollTop()+_94+n.outerHeight()-_95-c.outerHeight()+18); +} +} +}else{ +c.scrollTop(_94); +} +}; +function _96(_97,_98){ +var _99=_8c(_97,_98); +if(_98){ +_99.unshift(_c(_97,_98)); +} +for(var i=0;i<_99.length;i++){ +_80(_97,_99[i].target); +} +}; +function _9a(_9b,_9c){ +var _9d=$(_9c.parent); +var _9e=_9c.data; +if(!_9e){ +return; +} +_9e=$.isArray(_9e)?_9e:[_9e]; +if(!_9e.length){ +return; +} +var ul; +if(_9d.length==0){ +ul=$(_9b); +}else{ +if(_9f(_9b,_9d[0])){ +var _a0=_9d.find("span.tree-icon"); +_a0.removeClass("tree-file").addClass("tree-folder tree-folder-open"); +var hit=$("").insertBefore(_a0); +if(hit.prev().length){ +hit.prev().remove(); +} +} +ul=_9d.next(); +if(!ul.length){ +ul=$("
                                                                                                            ").insertAfter(_9d); +} +} +_56(_9b,ul[0],_9e,true,true); +}; +function _a1(_a2,_a3){ +var ref=_a3.before||_a3.after; +var _a4=_4d(_a2,ref); +var _a5=_a3.data; +if(!_a5){ +return; +} +_a5=$.isArray(_a5)?_a5:[_a5]; +if(!_a5.length){ +return; +} +_9a(_a2,{parent:(_a4?_a4.target:null),data:_a5}); +var _a6=_a4?_a4.children:$(_a2).tree("getRoots"); +for(var i=0;i<_a6.length;i++){ +if(_a6[i].domId==$(ref).attr("id")){ +for(var j=_a5.length-1;j>=0;j--){ +_a6.splice((_a3.before?i:(i+1)),0,_a5[j]); +} +_a6.splice(_a6.length-_a5.length,_a5.length); +break; +} +} +var li=$(); +for(var i=0;i<_a5.length;i++){ +li=li.add($("#"+_a5[i].domId).parent()); +} +if(_a3.before){ +li.insertBefore($(ref).parent()); +}else{ +li.insertAfter($(ref).parent()); +} +}; +function _a7(_a8,_a9){ +var _aa=del(_a9); +$(_a9).parent().remove(); +if(_aa){ +if(!_aa.children||!_aa.children.length){ +var _ab=$(_aa.target); +_ab.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); +_ab.find(".tree-hit").remove(); +$("").prependTo(_ab); +_ab.next().remove(); +} +_60(_a8,_aa); +} +_61(_a8,_a8); +function del(_ac){ +var id=$(_ac).attr("id"); +var _ad=_4d(_a8,_ac); +var cc=_ad?_ad.children:$.data(_a8,"tree").data; +for(var i=0;i").appendTo(nt); +_e6.val(_e4.text).focus(); +_e6.width(_e5+20); +_e6._outerHeight(_e3.editorHeight); +_e6.bind("click",function(e){ +return false; +}).bind("mousedown",function(e){ +e.stopPropagation(); +}).bind("mousemove",function(e){ +e.stopPropagation(); +}).bind("keydown",function(e){ +if(e.keyCode==13){ +_e7(_e1,_e2); +return false; +}else{ +if(e.keyCode==27){ +_ed(_e1,_e2); +return false; +} +} +}).bind("blur",function(e){ +e.stopPropagation(); +_e7(_e1,_e2); +}); +}; +function _e7(_e8,_e9){ +var _ea=$.data(_e8,"tree").options; +$(_e9).css("position",""); +var _eb=$(_e9).find("input.tree-editor"); +var val=_eb.val(); +_eb.remove(); +var _ec=_c(_e8,_e9); +_ec.text=val; +_60(_e8,_ec); +_ea.onAfterEdit.call(_e8,_ec); +}; +function _ed(_ee,_ef){ +var _f0=$.data(_ee,"tree").options; +$(_ef).css("position",""); +$(_ef).find("input.tree-editor").remove(); +var _f1=_c(_ee,_ef); +_60(_ee,_f1); +_f0.onCancelEdit.call(_ee,_f1); +}; +function _f2(_f3,q){ +var _f4=$.data(_f3,"tree"); +var _f5=_f4.options; +var ids={}; +$.easyui.forEach(_f4.data,true,function(_f6){ +if(_f5.filter.call(_f3,q,_f6)){ +$("#"+_f6.domId).removeClass("tree-node-hidden"); +ids[_f6.domId]=1; +_f6.hidden=false; +}else{ +$("#"+_f6.domId).addClass("tree-node-hidden"); +_f6.hidden=true; +} +}); +for(var id in ids){ +_f7(id); +} +function _f7(_f8){ +var p=$(_f3).tree("getParent",$("#"+_f8)[0]); +while(p){ +$(p.target).removeClass("tree-node-hidden"); +p.hidden=false; +p=$(_f3).tree("getParent",p.target); +} +}; +}; +$.fn.tree=function(_f9,_fa){ +if(typeof _f9=="string"){ +return $.fn.tree.methods[_f9](this,_fa); +} +var _f9=_f9||{}; +return this.each(function(){ +var _fb=$.data(this,"tree"); +var _fc; +if(_fb){ +_fc=$.extend(_fb.options,_f9); +_fb.options=_fc; +}else{ +_fc=$.extend({},$.fn.tree.defaults,$.fn.tree.parseOptions(this),_f9); +$.data(this,"tree",{options:_fc,tree:_1(this),data:[],tmpIds:[]}); +var _fd=$.fn.tree.parseData(this); +if(_fd.length){ +_56(this,this,_fd); +} +} +_4(this); +if(_fc.data){ +_56(this,this,$.extend(true,[],_fc.data)); +} +_6f(this,this); +}); +}; +$.fn.tree.methods={options:function(jq){ +return $.data(jq[0],"tree").options; +},loadData:function(jq,_fe){ +return jq.each(function(){ +_56(this,this,_fe); +}); +},getNode:function(jq,_ff){ +return _c(jq[0],_ff); +},getData:function(jq,_100){ +return _c9(jq[0],_100); +},reload:function(jq,_101){ +return jq.each(function(){ +if(_101){ +var node=$(_101); +var hit=node.children("span.tree-hit"); +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +node.next().remove(); +_79(this,_101); +}else{ +$(this).empty(); +_6f(this,this); +} +}); +},getRoot:function(jq,_102){ +return _b3(jq[0],_102); +},getRoots:function(jq){ +return _b7(jq[0]); +},getParent:function(jq,_103){ +return _4d(jq[0],_103); +},getChildren:function(jq,_104){ +return _8c(jq[0],_104); +},getChecked:function(jq,_105){ +return _c2(jq[0],_105); +},getSelected:function(jq){ +return _c6(jq[0]); +},isLeaf:function(jq,_106){ +return _9f(jq[0],_106); +},find:function(jq,id){ +return _d0(jq[0],id); +},select:function(jq,_107){ +return jq.each(function(){ +_d9(this,_107); +}); +},check:function(jq,_108){ +return jq.each(function(){ +_34(this,_108,true); +}); +},uncheck:function(jq,_109){ +return jq.each(function(){ +_34(this,_109,false); +}); +},collapse:function(jq,_10a){ +return jq.each(function(){ +_80(this,_10a); +}); +},expand:function(jq,_10b){ +return jq.each(function(){ +_79(this,_10b); +}); +},collapseAll:function(jq,_10c){ +return jq.each(function(){ +_96(this,_10c); +}); +},expandAll:function(jq,_10d){ +return jq.each(function(){ +_88(this,_10d); +}); +},expandTo:function(jq,_10e){ +return jq.each(function(){ +_8d(this,_10e); +}); +},scrollTo:function(jq,_10f){ +return jq.each(function(){ +_91(this,_10f); +}); +},toggle:function(jq,_110){ +return jq.each(function(){ +_85(this,_110); +}); +},append:function(jq,_111){ +return jq.each(function(){ +_9a(this,_111); +}); +},insert:function(jq,_112){ +return jq.each(function(){ +_a1(this,_112); +}); +},remove:function(jq,_113){ +return jq.each(function(){ +_a7(this,_113); +}); +},pop:function(jq,_114){ +var node=jq.tree("getData",_114); +jq.tree("remove",_114); +return node; +},update:function(jq,_115){ +return jq.each(function(){ +_60(this,$.extend({},_115,{checkState:_115.checked?"checked":(_115.checked===false?"unchecked":undefined)})); +}); +},enableDnd:function(jq){ +return jq.each(function(){ +_11(this); +}); +},disableDnd:function(jq){ +return jq.each(function(){ +_d(this); +}); +},beginEdit:function(jq,_116){ +return jq.each(function(){ +_e0(this,_116); +}); +},endEdit:function(jq,_117){ +return jq.each(function(){ +_e7(this,_117); +}); +},cancelEdit:function(jq,_118){ +return jq.each(function(){ +_ed(this,_118); +}); +},doFilter:function(jq,q){ +return jq.each(function(){ +_f2(this,q); +}); +}}; +$.fn.tree.parseOptions=function(_119){ +var t=$(_119); +return $.extend({},$.parser.parseOptions(_119,["url","method",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean",lines:"boolean",dnd:"boolean"}])); +}; +$.fn.tree.parseData=function(_11a){ +var data=[]; +_11b(data,$(_11a)); +return data; +function _11b(aa,tree){ +tree.children("li").each(function(){ +var node=$(this); +var item=$.extend({},$.parser.parseOptions(this,["id","iconCls","state"]),{checked:(node.attr("checked")?true:undefined)}); +item.text=node.children("span").html(); +if(!item.text){ +item.text=node.html(); +} +var _11c=node.children("ul"); +if(_11c.length){ +item.children=[]; +_11b(item.children,_11c); +} +aa.push(item); +}); +}; +}; +var _11d=1; +var _11e={render:function(_11f,ul,data){ +var _120=$.data(_11f,"tree"); +var opts=_120.options; +var _121=$(ul).prev(".tree-node"); +var _122=_121.length?$(_11f).tree("getNode",_121[0]):null; +var _123=_121.find("span.tree-indent, span.tree-hit").length; +var cc=_124.call(this,_123,data); +$(ul).append(cc.join("")); +function _124(_125,_126){ +var cc=[]; +for(var i=0;i<_126.length;i++){ +var item=_126[i]; +if(item.state!="open"&&item.state!="closed"){ +item.state="open"; +} +item.domId="_easyui_tree_"+_11d++; +cc.push("
                                                                                                          • "); +cc.push("
                                                                                                            "); +for(var j=0;j<_125;j++){ +cc.push(""); +} +if(item.state=="closed"){ +cc.push(""); +cc.push(""); +}else{ +if(item.children&&item.children.length){ +cc.push(""); +cc.push(""); +}else{ +cc.push(""); +cc.push(""); +} +} +if(this.hasCheckbox(_11f,item)){ +var flag=0; +if(_122&&_122.checkState=="checked"&&opts.cascadeCheck){ +flag=1; +item.checked=true; +}else{ +if(item.checked){ +$.easyui.addArrayItem(_120.tmpIds,item.domId); +} +} +item.checkState=flag?"checked":"unchecked"; +cc.push(""); +}else{ +item.checkState=undefined; +item.checked=undefined; +} +cc.push(""+opts.formatter.call(_11f,item)+""); +cc.push("
                                                                                                            "); +if(item.children&&item.children.length){ +var tmp=_124.call(this,_125+1,item.children); +cc.push("
                                                                                                              "); +cc=cc.concat(tmp); +cc.push("
                                                                                                            "); +} +cc.push("
                                                                                                          • "); +} +return cc; +}; +},hasCheckbox:function(_127,item){ +var _128=$.data(_127,"tree"); +var opts=_128.options; +if(opts.checkbox){ +if($.isFunction(opts.checkbox)){ +if(opts.checkbox.call(_127,item)){ +return true; +}else{ +return false; +} +}else{ +if(opts.onlyLeafCheck){ +if(item.state=="open"&&!(item.children&&item.children.length)){ +return true; +} +}else{ +return true; +} +} +} +return false; +}}; +$.fn.tree.defaults={url:null,method:"post",animate:false,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,dnd:false,editorHeight:26,data:null,queryParams:{},formatter:function(node){ +return node.text; +},filter:function(q,node){ +var qq=[]; +$.map($.isArray(q)?q:[q],function(q){ +q=$.trim(q); +if(q){ +qq.push(q); +} +}); +for(var i=0;i=0){ +return true; +} +} +return !qq.length; +},loader:function(_12a,_12b,_12c){ +var opts=$(this).tree("options"); +if(!opts.url){ +return false; +} +$.ajax({type:opts.method,url:opts.url,data:_12a,dataType:"json",success:function(data){ +_12b(data); +},error:function(){ +_12c.apply(this,arguments); +}}); +},loadFilter:function(data,_12d){ +return data; +},view:_11e,onBeforeLoad:function(node,_12e){ +},onLoadSuccess:function(node,data){ +},onLoadError:function(){ +},onClick:function(node){ +},onDblClick:function(node){ +},onBeforeExpand:function(node){ +},onExpand:function(node){ +},onBeforeCollapse:function(node){ +},onCollapse:function(node){ +},onBeforeCheck:function(node,_12f){ +},onCheck:function(node,_130){ +},onBeforeSelect:function(node){ +},onSelect:function(node){ +},onContextMenu:function(e,node){ +},onBeforeDrag:function(node){ +},onStartDrag:function(node){ +},onStopDrag:function(node){ +},onDragEnter:function(_131,_132){ +},onDragOver:function(_133,_134){ +},onDragLeave:function(_135,_136){ +},onBeforeDrop:function(_137,_138,_139){ +},onDrop:function(_13a,_13b,_13c){ +},onBeforeEdit:function(node){ +},onAfterEdit:function(node){ +},onCancelEdit:function(node){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.treegrid.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.treegrid.js new file mode 100755 index 000000000..1f0bb30a2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.treegrid.js @@ -0,0 +1,1353 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2){ +var _3=$.data(_2,"treegrid"); +var _4=_3.options; +$(_2).datagrid($.extend({},_4,{url:null,data:null,loader:function(){ +return false; +},onBeforeLoad:function(){ +return false; +},onLoadSuccess:function(){ +},onResizeColumn:function(_5,_6){ +_16(_2); +_4.onResizeColumn.call(_2,_5,_6); +},onBeforeSortColumn:function(_7,_8){ +if(_4.onBeforeSortColumn.call(_2,_7,_8)==false){ +return false; +} +},onSortColumn:function(_9,_a){ +_4.sortName=_9; +_4.sortOrder=_a; +if(_4.remoteSort){ +_15(_2); +}else{ +var _b=$(_2).treegrid("getData"); +_56(_2,null,_b); +} +_4.onSortColumn.call(_2,_9,_a); +},onClickCell:function(_c,_d){ +_4.onClickCell.call(_2,_d,_37(_2,_c)); +},onDblClickCell:function(_e,_f){ +_4.onDblClickCell.call(_2,_f,_37(_2,_e)); +},onRowContextMenu:function(e,_10){ +_4.onContextMenu.call(_2,e,_37(_2,_10)); +}})); +var _11=$.data(_2,"datagrid").options; +_4.columns=_11.columns; +_4.frozenColumns=_11.frozenColumns; +_3.dc=$.data(_2,"datagrid").dc; +if(_4.pagination){ +var _12=$(_2).datagrid("getPager"); +_12.pagination({pageNumber:_4.pageNumber,pageSize:_4.pageSize,pageList:_4.pageList,onSelectPage:function(_13,_14){ +_4.pageNumber=_13; +_4.pageSize=_14; +_15(_2); +}}); +_4.pageSize=_12.pagination("options").pageSize; +} +}; +function _16(_17,_18){ +var _19=$.data(_17,"datagrid").options; +var dc=$.data(_17,"datagrid").dc; +if(!dc.body1.is(":empty")&&(!_19.nowrap||_19.autoRowHeight)){ +if(_18!=undefined){ +var _1a=_1b(_17,_18); +for(var i=0;i<_1a.length;i++){ +_1c(_1a[i][_19.idField]); +} +} +} +$(_17).datagrid("fixRowHeight",_18); +function _1c(_1d){ +var tr1=_19.finder.getTr(_17,_1d,"body",1); +var tr2=_19.finder.getTr(_17,_1d,"body",2); +tr1.css("height",""); +tr2.css("height",""); +var _1e=Math.max(tr1.height(),tr2.height()); +tr1.css("height",_1e); +tr2.css("height",_1e); +}; +}; +function _1f(_20){ +var dc=$.data(_20,"datagrid").dc; +var _21=$.data(_20,"treegrid").options; +if(!_21.rownumbers){ +return; +} +dc.body1.find("div.datagrid-cell-rownumber").each(function(i){ +$(this).html(i+1); +}); +}; +function _22(_23){ +return function(e){ +$.fn.datagrid.defaults.rowEvents[_23?"mouseover":"mouseout"](e); +var tt=$(e.target); +var fn=_23?"addClass":"removeClass"; +if(tt.hasClass("tree-hit")){ +tt.hasClass("tree-expanded")?tt[fn]("tree-expanded-hover"):tt[fn]("tree-collapsed-hover"); +} +}; +}; +function _24(e){ +var tt=$(e.target); +var tr=tt.closest("tr.datagrid-row"); +if(!tr.length||!tr.parent().length){ +return; +} +var _25=tr.attr("node-id"); +var _26=_27(tr); +if(tt.hasClass("tree-hit")){ +_28(_26,_25); +}else{ +if(tt.hasClass("tree-checkbox")){ +_29(_26,_25); +}else{ +var _2a=$(_26).datagrid("options"); +if(!tt.parent().hasClass("datagrid-cell-check")&&!_2a.singleSelect&&e.shiftKey){ +var _2b=$(_26).treegrid("getChildren"); +var _2c=$.easyui.indexOfArray(_2b,_2a.idField,_2a.lastSelectedIndex); +var _2d=$.easyui.indexOfArray(_2b,_2a.idField,_25); +var _2e=Math.min(Math.max(_2c,0),_2d); +var to=Math.max(_2c,_2d); +var row=_2b[_2d]; +var td=tt.closest("td[field]",tr); +if(td.length){ +var _2f=td.attr("field"); +_2a.onClickCell.call(_26,_25,_2f,row[_2f]); +} +$(_26).treegrid("clearSelections"); +for(var i=_2e;i<=to;i++){ +$(_26).treegrid("selectRow",_2b[i][_2a.idField]); +} +_2a.onClickRow.call(_26,row); +}else{ +$.fn.datagrid.defaults.rowEvents.click(e); +} +} +} +}; +function _27(t){ +return $(t).closest("div.datagrid-view").children(".datagrid-f")[0]; +}; +function _29(_30,_31,_32,_33){ +var _34=$.data(_30,"treegrid"); +var _35=_34.checkedRows; +var _36=_34.options; +if(!_36.checkbox){ +return; +} +var row=_37(_30,_31); +if(!row.checkState){ +return; +} +var tr=_36.finder.getTr(_30,_31); +var ck=tr.find(".tree-checkbox"); +if(_32==undefined){ +if(ck.hasClass("tree-checkbox1")){ +_32=false; +}else{ +if(ck.hasClass("tree-checkbox0")){ +_32=true; +}else{ +if(row._checked==undefined){ +row._checked=ck.hasClass("tree-checkbox1"); +} +_32=!row._checked; +} +} +} +row._checked=_32; +if(_32){ +if(ck.hasClass("tree-checkbox1")){ +return; +} +}else{ +if(ck.hasClass("tree-checkbox0")){ +return; +} +} +if(!_33){ +if(_36.onBeforeCheckNode.call(_30,row,_32)==false){ +return; +} +} +if(_36.cascadeCheck){ +_38(_30,row,_32); +_39(_30,row); +}else{ +_3a(_30,row,_32?"1":"0"); +} +if(!_33){ +_36.onCheckNode.call(_30,row,_32); +} +}; +function _3a(_3b,row,_3c){ +var _3d=$.data(_3b,"treegrid"); +var _3e=_3d.checkedRows; +var _3f=_3d.options; +if(!row.checkState||_3c==undefined){ +return; +} +var tr=_3f.finder.getTr(_3b,row[_3f.idField]); +var ck=tr.find(".tree-checkbox"); +if(!ck.length){ +return; +} +row.checkState=["unchecked","checked","indeterminate"][_3c]; +row.checked=(row.checkState=="checked"); +ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); +ck.addClass("tree-checkbox"+_3c); +if(_3c==0){ +$.easyui.removeArrayItem(_3e,_3f.idField,row[_3f.idField]); +}else{ +$.easyui.addArrayItem(_3e,_3f.idField,row); +} +}; +function _38(_40,row,_41){ +var _42=_41?1:0; +_3a(_40,row,_42); +$.easyui.forEach(row.children||[],true,function(r){ +_3a(_40,r,_42); +}); +}; +function _39(_43,row){ +var _44=$.data(_43,"treegrid").options; +var _45=_46(_43,row[_44.idField]); +if(_45){ +_3a(_43,_45,_47(_45)); +_39(_43,_45); +} +}; +function _47(row){ +var len=0; +var c0=0; +var c1=0; +$.easyui.forEach(row.children||[],false,function(r){ +if(r.checkState){ +len++; +if(r.checkState=="checked"){ +c1++; +}else{ +if(r.checkState=="unchecked"){ +c0++; +} +} +} +}); +if(len==0){ +return undefined; +} +var _48=0; +if(c0==len){ +_48=0; +}else{ +if(c1==len){ +_48=1; +}else{ +_48=2; +} +} +return _48; +}; +function _49(_4a,_4b){ +var _4c=$.data(_4a,"treegrid").options; +if(!_4c.checkbox){ +return; +} +var row=_37(_4a,_4b); +var tr=_4c.finder.getTr(_4a,_4b); +var ck=tr.find(".tree-checkbox"); +if(_4c.view.hasCheckbox(_4a,row)){ +if(!ck.length){ +row.checkState=row.checkState||"unchecked"; +$("").insertBefore(tr.find(".tree-title")); +} +if(row.checkState=="checked"){ +_29(_4a,_4b,true,true); +}else{ +if(row.checkState=="unchecked"){ +_29(_4a,_4b,false,true); +}else{ +var _4d=_47(row); +if(_4d===0){ +_29(_4a,_4b,false,true); +}else{ +if(_4d===1){ +_29(_4a,_4b,true,true); +} +} +} +} +}else{ +ck.remove(); +row.checkState=undefined; +row.checked=undefined; +_39(_4a,row); +} +}; +function _4e(_4f,_50){ +var _51=$.data(_4f,"treegrid").options; +var tr1=_51.finder.getTr(_4f,_50,"body",1); +var tr2=_51.finder.getTr(_4f,_50,"body",2); +var _52=$(_4f).datagrid("getColumnFields",true).length+(_51.rownumbers?1:0); +var _53=$(_4f).datagrid("getColumnFields",false).length; +_54(tr1,_52); +_54(tr2,_53); +function _54(tr,_55){ +$(""+""+"
                                                                                                            "+""+"").insertAfter(tr); +}; +}; +function _56(_57,_58,_59,_5a,_5b){ +var _5c=$.data(_57,"treegrid"); +var _5d=_5c.options; +var dc=_5c.dc; +_59=_5d.loadFilter.call(_57,_59,_58); +var _5e=_37(_57,_58); +if(_5e){ +var _5f=_5d.finder.getTr(_57,_58,"body",1); +var _60=_5d.finder.getTr(_57,_58,"body",2); +var cc1=_5f.next("tr.treegrid-tr-tree").children("td").children("div"); +var cc2=_60.next("tr.treegrid-tr-tree").children("td").children("div"); +if(!_5a){ +_5e.children=[]; +} +}else{ +var cc1=dc.body1; +var cc2=dc.body2; +if(!_5a){ +_5c.data=[]; +} +} +if(!_5a){ +cc1.empty(); +cc2.empty(); +} +if(_5d.view.onBeforeRender){ +_5d.view.onBeforeRender.call(_5d.view,_57,_58,_59); +} +_5d.view.render.call(_5d.view,_57,cc1,true); +_5d.view.render.call(_5d.view,_57,cc2,false); +if(_5d.showFooter){ +_5d.view.renderFooter.call(_5d.view,_57,dc.footer1,true); +_5d.view.renderFooter.call(_5d.view,_57,dc.footer2,false); +} +if(_5d.view.onAfterRender){ +_5d.view.onAfterRender.call(_5d.view,_57); +} +if(!_58&&_5d.pagination){ +var _61=$.data(_57,"treegrid").total; +var _62=$(_57).datagrid("getPager"); +if(_62.pagination("options").total!=_61){ +_62.pagination({total:_61}); +} +} +_16(_57); +_1f(_57); +$(_57).treegrid("showLines"); +$(_57).treegrid("setSelectionState"); +$(_57).treegrid("autoSizeColumn"); +if(!_5b){ +_5d.onLoadSuccess.call(_57,_5e,_59); +} +}; +function _15(_63,_64,_65,_66,_67){ +var _68=$.data(_63,"treegrid").options; +var _69=$(_63).datagrid("getPanel").find("div.datagrid-body"); +if(_64==undefined&&_68.queryParams){ +_68.queryParams.id=undefined; +} +if(_65){ +_68.queryParams=_65; +} +var _6a=$.extend({},_68.queryParams); +if(_68.pagination){ +$.extend(_6a,{page:_68.pageNumber,rows:_68.pageSize}); +} +if(_68.sortName){ +$.extend(_6a,{sort:_68.sortName,order:_68.sortOrder}); +} +var row=_37(_63,_64); +if(_68.onBeforeLoad.call(_63,row,_6a)==false){ +return; +} +var _6b=_69.find("tr[node-id=\""+_64+"\"] span.tree-folder"); +_6b.addClass("tree-loading"); +$(_63).treegrid("loading"); +var _6c=_68.loader.call(_63,_6a,function(_6d){ +_6b.removeClass("tree-loading"); +$(_63).treegrid("loaded"); +_56(_63,_64,_6d,_66); +if(_67){ +_67(); +} +},function(){ +_6b.removeClass("tree-loading"); +$(_63).treegrid("loaded"); +_68.onLoadError.apply(_63,arguments); +if(_67){ +_67(); +} +}); +if(_6c==false){ +_6b.removeClass("tree-loading"); +$(_63).treegrid("loaded"); +} +}; +function _6e(_6f){ +var _70=_71(_6f); +return _70.length?_70[0]:null; +}; +function _71(_72){ +return $.data(_72,"treegrid").data; +}; +function _46(_73,_74){ +var row=_37(_73,_74); +if(row._parentId){ +return _37(_73,row._parentId); +}else{ +return null; +} +}; +function _1b(_75,_76){ +var _77=$.data(_75,"treegrid").data; +if(_76){ +var _78=_37(_75,_76); +_77=_78?(_78.children||[]):[]; +} +var _79=[]; +$.easyui.forEach(_77,true,function(_7a){ +_79.push(_7a); +}); +return _79; +}; +function _7b(_7c,_7d){ +var _7e=$.data(_7c,"treegrid").options; +var tr=_7e.finder.getTr(_7c,_7d); +var _7f=tr.children("td[field=\""+_7e.treeField+"\"]"); +return _7f.find("span.tree-indent,span.tree-hit").length; +}; +function _37(_80,_81){ +var _82=$.data(_80,"treegrid"); +var _83=_82.options; +var _84=null; +$.easyui.forEach(_82.data,true,function(_85){ +if(_85[_83.idField]==_81){ +_84=_85; +return false; +} +}); +return _84; +}; +function _86(_87,_88){ +var _89=$.data(_87,"treegrid").options; +var row=_37(_87,_88); +var tr=_89.finder.getTr(_87,_88); +var hit=tr.find("span.tree-hit"); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-collapsed")){ +return; +} +if(_89.onBeforeCollapse.call(_87,row)==false){ +return; +} +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +hit.next().removeClass("tree-folder-open"); +row.state="closed"; +tr=tr.next("tr.treegrid-tr-tree"); +var cc=tr.children("td").children("div"); +if(_89.animate){ +cc.slideUp("normal",function(){ +$(_87).treegrid("autoSizeColumn"); +_16(_87,_88); +_89.onCollapse.call(_87,row); +}); +}else{ +cc.hide(); +$(_87).treegrid("autoSizeColumn"); +_16(_87,_88); +_89.onCollapse.call(_87,row); +} +}; +function _8a(_8b,_8c){ +var _8d=$.data(_8b,"treegrid").options; +var tr=_8d.finder.getTr(_8b,_8c); +var hit=tr.find("span.tree-hit"); +var row=_37(_8b,_8c); +if(hit.length==0){ +return; +} +if(hit.hasClass("tree-expanded")){ +return; +} +if(_8d.onBeforeExpand.call(_8b,row)==false){ +return; +} +hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); +hit.next().addClass("tree-folder-open"); +var _8e=tr.next("tr.treegrid-tr-tree"); +if(_8e.length){ +var cc=_8e.children("td").children("div"); +_8f(cc); +}else{ +_4e(_8b,row[_8d.idField]); +var _8e=tr.next("tr.treegrid-tr-tree"); +var cc=_8e.children("td").children("div"); +cc.hide(); +var _90=$.extend({},_8d.queryParams||{}); +_90.id=row[_8d.idField]; +_15(_8b,row[_8d.idField],_90,true,function(){ +if(cc.is(":empty")){ +_8e.remove(); +}else{ +_8f(cc); +} +}); +} +function _8f(cc){ +row.state="open"; +if(_8d.animate){ +cc.slideDown("normal",function(){ +$(_8b).treegrid("autoSizeColumn"); +_16(_8b,_8c); +_8d.onExpand.call(_8b,row); +}); +}else{ +cc.show(); +$(_8b).treegrid("autoSizeColumn"); +_16(_8b,_8c); +_8d.onExpand.call(_8b,row); +} +}; +}; +function _28(_91,_92){ +var _93=$.data(_91,"treegrid").options; +var tr=_93.finder.getTr(_91,_92); +var hit=tr.find("span.tree-hit"); +if(hit.hasClass("tree-expanded")){ +_86(_91,_92); +}else{ +_8a(_91,_92); +} +}; +function _94(_95,_96){ +var _97=$.data(_95,"treegrid").options; +var _98=_1b(_95,_96); +if(_96){ +_98.unshift(_37(_95,_96)); +} +for(var i=0;i<_98.length;i++){ +_86(_95,_98[i][_97.idField]); +} +}; +function _99(_9a,_9b){ +var _9c=$.data(_9a,"treegrid").options; +var _9d=_1b(_9a,_9b); +if(_9b){ +_9d.unshift(_37(_9a,_9b)); +} +for(var i=0;i<_9d.length;i++){ +_8a(_9a,_9d[i][_9c.idField]); +} +}; +function _9e(_9f,_a0){ +var _a1=$.data(_9f,"treegrid").options; +var ids=[]; +var p=_46(_9f,_a0); +while(p){ +var id=p[_a1.idField]; +ids.unshift(id); +p=_46(_9f,id); +} +for(var i=0;i").insertBefore(_a8); +if(hit.prev().length){ +hit.prev().remove(); +} +} +} +_56(_a3,_a4.parent,_a4.data,_a5.data.length>0,true); +}; +function _a9(_aa,_ab){ +var ref=_ab.before||_ab.after; +var _ac=$.data(_aa,"treegrid").options; +var _ad=_46(_aa,ref); +_a2(_aa,{parent:(_ad?_ad[_ac.idField]:null),data:[_ab.data]}); +var _ae=_ad?_ad.children:$(_aa).treegrid("getRoots"); +for(var i=0;i<_ae.length;i++){ +if(_ae[i][_ac.idField]==ref){ +var _af=_ae[_ae.length-1]; +_ae.splice(_ab.before?i:(i+1),0,_af); +_ae.splice(_ae.length-1,1); +break; +} +} +_b0(true); +_b0(false); +_1f(_aa); +$(_aa).treegrid("showLines"); +function _b0(_b1){ +var _b2=_b1?1:2; +var tr=_ac.finder.getTr(_aa,_ab.data[_ac.idField],"body",_b2); +var _b3=tr.closest("table.datagrid-btable"); +tr=tr.parent().children(); +var _b4=_ac.finder.getTr(_aa,ref,"body",_b2); +if(_ab.before){ +tr.insertBefore(_b4); +}else{ +var sub=_b4.next("tr.treegrid-tr-tree"); +tr.insertAfter(sub.length?sub:_b4); +} +_b3.remove(); +}; +}; +function _b5(_b6,_b7){ +var _b8=$.data(_b6,"treegrid"); +var _b9=_b8.options; +var _ba=_46(_b6,_b7); +$(_b6).datagrid("deleteRow",_b7); +$.easyui.removeArrayItem(_b8.checkedRows,_b9.idField,_b7); +_1f(_b6); +if(_ba){ +_49(_b6,_ba[_b9.idField]); +} +_b8.total-=1; +$(_b6).datagrid("getPager").pagination("refresh",{total:_b8.total}); +$(_b6).treegrid("showLines"); +}; +function _bb(_bc){ +var t=$(_bc); +var _bd=t.treegrid("options"); +if(_bd.lines){ +t.treegrid("getPanel").addClass("tree-lines"); +}else{ +t.treegrid("getPanel").removeClass("tree-lines"); +return; +} +t.treegrid("getPanel").find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); +t.treegrid("getPanel").find("div.datagrid-cell").removeClass("tree-node-last tree-root-first tree-root-one"); +var _be=t.treegrid("getRoots"); +if(_be.length>1){ +_bf(_be[0]).addClass("tree-root-first"); +}else{ +if(_be.length==1){ +_bf(_be[0]).addClass("tree-root-one"); +} +} +_c0(_be); +_c1(_be); +function _c0(_c2){ +$.map(_c2,function(_c3){ +if(_c3.children&&_c3.children.length){ +_c0(_c3.children); +}else{ +var _c4=_bf(_c3); +_c4.find(".tree-icon").prev().addClass("tree-join"); +} +}); +if(_c2.length){ +var _c5=_bf(_c2[_c2.length-1]); +_c5.addClass("tree-node-last"); +_c5.find(".tree-join").removeClass("tree-join").addClass("tree-joinbottom"); +} +}; +function _c1(_c6){ +$.map(_c6,function(_c7){ +if(_c7.children&&_c7.children.length){ +_c1(_c7.children); +} +}); +for(var i=0;i<_c6.length-1;i++){ +var _c8=_c6[i]; +var _c9=t.treegrid("getLevel",_c8[_bd.idField]); +var tr=_bd.finder.getTr(_bc,_c8[_bd.idField]); +var cc=tr.next().find("tr.datagrid-row td[field=\""+_bd.treeField+"\"] div.datagrid-cell"); +cc.find("span:eq("+(_c9-1)+")").addClass("tree-line"); +} +}; +function _bf(_ca){ +var tr=_bd.finder.getTr(_bc,_ca[_bd.idField]); +var _cb=tr.find("td[field=\""+_bd.treeField+"\"] div.datagrid-cell"); +return _cb; +}; +}; +$.fn.treegrid=function(_cc,_cd){ +if(typeof _cc=="string"){ +var _ce=$.fn.treegrid.methods[_cc]; +if(_ce){ +return _ce(this,_cd); +}else{ +return this.datagrid(_cc,_cd); +} +} +_cc=_cc||{}; +return this.each(function(){ +var _cf=$.data(this,"treegrid"); +if(_cf){ +$.extend(_cf.options,_cc); +}else{ +_cf=$.data(this,"treegrid",{options:$.extend({},$.fn.treegrid.defaults,$.fn.treegrid.parseOptions(this),_cc),data:[],checkedRows:[],tmpIds:[]}); +} +_1(this); +if(_cf.options.data){ +$(this).treegrid("loadData",_cf.options.data); +} +_15(this); +}); +}; +$.fn.treegrid.methods={options:function(jq){ +return $.data(jq[0],"treegrid").options; +},resize:function(jq,_d0){ +return jq.each(function(){ +$(this).datagrid("resize",_d0); +}); +},fixRowHeight:function(jq,_d1){ +return jq.each(function(){ +_16(this,_d1); +}); +},loadData:function(jq,_d2){ +return jq.each(function(){ +_56(this,_d2.parent,_d2); +}); +},load:function(jq,_d3){ +return jq.each(function(){ +$(this).treegrid("options").pageNumber=1; +$(this).treegrid("getPager").pagination({pageNumber:1}); +$(this).treegrid("reload",_d3); +}); +},reload:function(jq,id){ +return jq.each(function(){ +var _d4=$(this).treegrid("options"); +var _d5={}; +if(typeof id=="object"){ +_d5=id; +}else{ +_d5=$.extend({},_d4.queryParams); +_d5.id=id; +} +if(_d5.id){ +var _d6=$(this).treegrid("find",_d5.id); +if(_d6.children){ +_d6.children.splice(0,_d6.children.length); +} +_d4.queryParams=_d5; +var tr=_d4.finder.getTr(this,_d5.id); +tr.next("tr.treegrid-tr-tree").remove(); +tr.find("span.tree-hit").removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); +_8a(this,_d5.id); +}else{ +_15(this,null,_d5); +} +}); +},reloadFooter:function(jq,_d7){ +return jq.each(function(){ +var _d8=$.data(this,"treegrid").options; +var dc=$.data(this,"datagrid").dc; +if(_d7){ +$.data(this,"treegrid").footer=_d7; +} +if(_d8.showFooter){ +_d8.view.renderFooter.call(_d8.view,this,dc.footer1,true); +_d8.view.renderFooter.call(_d8.view,this,dc.footer2,false); +if(_d8.view.onAfterRender){ +_d8.view.onAfterRender.call(_d8.view,this); +} +$(this).treegrid("fixRowHeight"); +} +}); +},getData:function(jq){ +return $.data(jq[0],"treegrid").data; +},getFooterRows:function(jq){ +return $.data(jq[0],"treegrid").footer; +},getRoot:function(jq){ +return _6e(jq[0]); +},getRoots:function(jq){ +return _71(jq[0]); +},getParent:function(jq,id){ +return _46(jq[0],id); +},getChildren:function(jq,id){ +return _1b(jq[0],id); +},getLevel:function(jq,id){ +return _7b(jq[0],id); +},find:function(jq,id){ +return _37(jq[0],id); +},isLeaf:function(jq,id){ +var _d9=$.data(jq[0],"treegrid").options; +var tr=_d9.finder.getTr(jq[0],id); +var hit=tr.find("span.tree-hit"); +return hit.length==0; +},select:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("selectRow",id); +}); +},unselect:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("unselectRow",id); +}); +},collapse:function(jq,id){ +return jq.each(function(){ +_86(this,id); +}); +},expand:function(jq,id){ +return jq.each(function(){ +_8a(this,id); +}); +},toggle:function(jq,id){ +return jq.each(function(){ +_28(this,id); +}); +},collapseAll:function(jq,id){ +return jq.each(function(){ +_94(this,id); +}); +},expandAll:function(jq,id){ +return jq.each(function(){ +_99(this,id); +}); +},expandTo:function(jq,id){ +return jq.each(function(){ +_9e(this,id); +}); +},append:function(jq,_da){ +return jq.each(function(){ +_a2(this,_da); +}); +},insert:function(jq,_db){ +return jq.each(function(){ +_a9(this,_db); +}); +},remove:function(jq,id){ +return jq.each(function(){ +_b5(this,id); +}); +},pop:function(jq,id){ +var row=jq.treegrid("find",id); +jq.treegrid("remove",id); +return row; +},refresh:function(jq,id){ +return jq.each(function(){ +var _dc=$.data(this,"treegrid").options; +_dc.view.refreshRow.call(_dc.view,this,id); +}); +},update:function(jq,_dd){ +return jq.each(function(){ +var _de=$.data(this,"treegrid").options; +var row=_dd.row; +_de.view.updateRow.call(_de.view,this,_dd.id,row); +if(row.checked!=undefined){ +row=_37(this,_dd.id); +$.extend(row,{checkState:row.checked?"checked":(row.checked===false?"unchecked":undefined)}); +_49(this,_dd.id); +} +}); +},beginEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("beginEdit",id); +$(this).treegrid("fixRowHeight",id); +}); +},endEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("endEdit",id); +}); +},cancelEdit:function(jq,id){ +return jq.each(function(){ +$(this).datagrid("cancelEdit",id); +}); +},showLines:function(jq){ +return jq.each(function(){ +_bb(this); +}); +},setSelectionState:function(jq){ +return jq.each(function(){ +$(this).datagrid("setSelectionState"); +var _df=$(this).data("treegrid"); +for(var i=0;i<_df.tmpIds.length;i++){ +_29(this,_df.tmpIds[i],true,true); +} +_df.tmpIds=[]; +}); +},getCheckedNodes:function(jq,_e0){ +_e0=_e0||"checked"; +var _e1=[]; +$.easyui.forEach(jq.data("treegrid").checkedRows,false,function(row){ +if(row.checkState==_e0){ +_e1.push(row); +} +}); +return _e1; +},checkNode:function(jq,id){ +return jq.each(function(){ +_29(this,id,true); +}); +},uncheckNode:function(jq,id){ +return jq.each(function(){ +_29(this,id,false); +}); +},clearChecked:function(jq){ +return jq.each(function(){ +var _e2=this; +var _e3=$(_e2).treegrid("options"); +$(_e2).datagrid("clearChecked"); +$.map($(_e2).treegrid("getCheckedNodes"),function(row){ +_29(_e2,row[_e3.idField],false,true); +}); +}); +}}; +$.fn.treegrid.parseOptions=function(_e4){ +return $.extend({},$.fn.datagrid.parseOptions(_e4),$.parser.parseOptions(_e4,["treeField",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean"}])); +}; +var _e5=$.extend({},$.fn.datagrid.defaults.view,{render:function(_e6,_e7,_e8){ +var _e9=$.data(_e6,"treegrid").options; +var _ea=$(_e6).datagrid("getColumnFields",_e8); +var _eb=$.data(_e6,"datagrid").rowIdPrefix; +if(_e8){ +if(!(_e9.rownumbers||(_e9.frozenColumns&&_e9.frozenColumns.length))){ +return; +} +} +var _ec=this; +if(this.treeNodes&&this.treeNodes.length){ +var _ed=_ee.call(this,_e8,this.treeLevel,this.treeNodes); +$(_e7).append(_ed.join("")); +} +function _ee(_ef,_f0,_f1){ +var _f2=$(_e6).treegrid("getParent",_f1[0][_e9.idField]); +var _f3=(_f2?_f2.children.length:$(_e6).treegrid("getRoots").length)-_f1.length; +var _f4=[""]; +for(var i=0;i<_f1.length;i++){ +var row=_f1[i]; +if(row.state!="open"&&row.state!="closed"){ +row.state="open"; +} +var css=_e9.rowStyler?_e9.rowStyler.call(_e6,row):""; +var cs=this.getStyleValue(css); +var cls="class=\"datagrid-row "+(_f3++%2&&_e9.striped?"datagrid-row-alt ":" ")+cs.c+"\""; +var _f5=cs.s?"style=\""+cs.s+"\"":""; +var _f6=_eb+"-"+(_ef?1:2)+"-"+row[_e9.idField]; +_f4.push(""); +_f4=_f4.concat(_ec.renderRow.call(_ec,_e6,_ea,_ef,_f0,row)); +_f4.push(""); +if(row.children&&row.children.length){ +var tt=_ee.call(this,_ef,_f0+1,row.children); +var v=row.state=="closed"?"none":"block"; +_f4.push(""); +} +} +_f4.push("
                                                                                                            "); +_f4=_f4.concat(tt); +_f4.push("
                                                                                                            "); +return _f4; +}; +},renderFooter:function(_f7,_f8,_f9){ +var _fa=$.data(_f7,"treegrid").options; +var _fb=$.data(_f7,"treegrid").footer||[]; +var _fc=$(_f7).datagrid("getColumnFields",_f9); +var _fd=[""]; +for(var i=0;i<_fb.length;i++){ +var row=_fb[i]; +row[_fa.idField]=row[_fa.idField]||("foot-row-id"+i); +_fd.push(""); +_fd.push(this.renderRow.call(this,_f7,_fc,_f9,0,row)); +_fd.push(""); +} +_fd.push("
                                                                                                            "); +$(_f8).html(_fd.join("")); +},renderRow:function(_fe,_ff,_100,_101,row){ +var _102=$.data(_fe,"treegrid"); +var opts=_102.options; +var cc=[]; +if(_100&&opts.rownumbers){ +cc.push("
                                                                                                            0
                                                                                                            "); +} +for(var i=0;i<_ff.length;i++){ +var _103=_ff[i]; +var col=$(_fe).datagrid("getColumnOption",_103); +if(col){ +var css=col.styler?(col.styler(row[_103],row)||""):""; +var cs=this.getStyleValue(css); +var cls=cs.c?"class=\""+cs.c+"\"":""; +var _104=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); +cc.push(""); +var _104=""; +if(!col.checkbox){ +if(col.align){ +_104+="text-align:"+col.align+";"; +} +if(!opts.nowrap){ +_104+="white-space:normal;height:auto;"; +}else{ +if(opts.autoRowHeight){ +_104+="height:auto;"; +} +} +} +cc.push("
                                                                                                            "); +if(col.checkbox){ +if(row.checked){ +cc.push(""); +}else{ +var val=null; +if(col.formatter){ +val=col.formatter(row[_103],row); +}else{ +val=row[_103]; +} +if(_103==opts.treeField){ +for(var j=0;j<_101;j++){ +cc.push(""); +} +if(row.state=="closed"){ +cc.push(""); +cc.push(""); +}else{ +if(row.children&&row.children.length){ +cc.push(""); +cc.push(""); +}else{ +cc.push(""); +cc.push(""); +} +} +if(this.hasCheckbox(_fe,row)){ +var flag=0; +var crow=$.easyui.getArrayItem(_102.checkedRows,opts.idField,row[opts.idField]); +if(crow){ +flag=crow.checkState=="checked"?1:2; +row.checkState=crow.checkState; +row.checked=crow.checked; +$.easyui.addArrayItem(_102.checkedRows,opts.idField,row); +}else{ +var prow=$.easyui.getArrayItem(_102.checkedRows,opts.idField,row._parentId); +if(prow&&prow.checkState=="checked"&&opts.cascadeCheck){ +flag=1; +row.checked=true; +$.easyui.addArrayItem(_102.checkedRows,opts.idField,row); +}else{ +if(row.checked){ +$.easyui.addArrayItem(_102.tmpIds,row[opts.idField]); +} +} +row.checkState=flag?"checked":"unchecked"; +} +cc.push(""); +}else{ +row.checkState=undefined; +row.checked=undefined; +} +cc.push(""+val+""); +}else{ +cc.push(val); +} +} +cc.push("
                                                                                                            "); +cc.push(""); +} +} +return cc.join(""); +},hasCheckbox:function(_105,row){ +var opts=$.data(_105,"treegrid").options; +if(opts.checkbox){ +if($.isFunction(opts.checkbox)){ +if(opts.checkbox.call(_105,row)){ +return true; +}else{ +return false; +} +}else{ +if(opts.onlyLeafCheck){ +if(row.state=="open"&&!(row.children&&row.children.length)){ +return true; +} +}else{ +return true; +} +} +} +return false; +},refreshRow:function(_106,id){ +this.updateRow.call(this,_106,id,{}); +},updateRow:function(_107,id,row){ +var opts=$.data(_107,"treegrid").options; +var _108=$(_107).treegrid("find",id); +$.extend(_108,row); +var _109=$(_107).treegrid("getLevel",id)-1; +var _10a=opts.rowStyler?opts.rowStyler.call(_107,_108):""; +var _10b=$.data(_107,"datagrid").rowIdPrefix; +var _10c=_108[opts.idField]; +function _10d(_10e){ +var _10f=$(_107).treegrid("getColumnFields",_10e); +var tr=opts.finder.getTr(_107,id,"body",(_10e?1:2)); +var _110=tr.find("div.datagrid-cell-rownumber").html(); +var _111=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); +tr.html(this.renderRow(_107,_10f,_10e,_109,_108)); +tr.attr("style",_10a||""); +tr.find("div.datagrid-cell-rownumber").html(_110); +if(_111){ +tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); +} +if(_10c!=id){ +tr.attr("id",_10b+"-"+(_10e?1:2)+"-"+_10c); +tr.attr("node-id",_10c); +} +}; +_10d.call(this,true); +_10d.call(this,false); +$(_107).treegrid("fixRowHeight",id); +},deleteRow:function(_112,id){ +var opts=$.data(_112,"treegrid").options; +var tr=opts.finder.getTr(_112,id); +tr.next("tr.treegrid-tr-tree").remove(); +tr.remove(); +var _113=del(id); +if(_113){ +if(_113.children.length==0){ +tr=opts.finder.getTr(_112,_113[opts.idField]); +tr.next("tr.treegrid-tr-tree").remove(); +var cell=tr.children("td[field=\""+opts.treeField+"\"]").children("div.datagrid-cell"); +cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); +cell.find(".tree-hit").remove(); +$("").prependTo(cell); +} +} +this.setEmptyMsg(_112); +function del(id){ +var cc; +var _114=$(_112).treegrid("getParent",id); +if(_114){ +cc=_114.children; +}else{ +cc=$(_112).treegrid("getData"); +} +for(var i=0;ib?1:-1); +}; +r=_11f(r1[sn],r2[sn])*(so=="asc"?1:-1); +if(r!=0){ +return r; +} +} +return r; +}); +for(var i=0;i=_45[0]&&len<=_45[1]; +},message:"Please enter a value between {0} and {1}."},remote:{validator:function(_46,_47){ +var _48={}; +_48[_47[1]]=_46; +var _49=$.ajax({url:_47[0],dataType:"json",data:_48,async:false,cache:false,type:"post"}).responseText; +return _49=="true"; +},message:"Please fix this field."}},onBeforeValidate:function(){ +},onValidate:function(_4a){ +}}; +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.window.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.window.js new file mode 100755 index 000000000..09e7cde1f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.window.js @@ -0,0 +1,311 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +(function($){ +function _1(_2,_3){ +var _4=$.data(_2,"window"); +if(_3){ +if(_3.left!=null){ +_4.options.left=_3.left; +} +if(_3.top!=null){ +_4.options.top=_3.top; +} +} +$(_2).panel("move",_4.options); +if(_4.shadow){ +_4.shadow.css({left:_4.options.left,top:_4.options.top}); +} +}; +function _5(_6,_7){ +var _8=$.data(_6,"window").options; +var pp=$(_6).window("panel"); +var _9=pp._outerWidth(); +if(_8.inline){ +var _a=pp.parent(); +_8.left=Math.ceil((_a.width()-_9)/2+_a.scrollLeft()); +}else{ +_8.left=Math.ceil(($(window)._outerWidth()-_9)/2+$(document).scrollLeft()); +} +if(_7){ +_1(_6); +} +}; +function _b(_c,_d){ +var _e=$.data(_c,"window").options; +var pp=$(_c).window("panel"); +var _f=pp._outerHeight(); +if(_e.inline){ +var _10=pp.parent(); +_e.top=Math.ceil((_10.height()-_f)/2+_10.scrollTop()); +}else{ +_e.top=Math.ceil(($(window)._outerHeight()-_f)/2+$(document).scrollTop()); +} +if(_d){ +_1(_c); +} +}; +function _11(_12){ +var _13=$.data(_12,"window"); +var _14=_13.options; +var win=$(_12).panel($.extend({},_13.options,{border:false,doSize:true,closed:true,cls:"window "+(!_14.border?"window-thinborder window-noborder ":(_14.border=="thin"?"window-thinborder ":""))+(_14.cls||""),headerCls:"window-header "+(_14.headerCls||""),bodyCls:"window-body "+(_14.noheader?"window-body-noheader ":" ")+(_14.bodyCls||""),onBeforeDestroy:function(){ +if(_14.onBeforeDestroy.call(_12)==false){ +return false; +} +if(_13.shadow){ +_13.shadow.remove(); +} +if(_13.mask){ +_13.mask.remove(); +} +},onClose:function(){ +if(_13.shadow){ +_13.shadow.hide(); +} +if(_13.mask){ +_13.mask.hide(); +} +_14.onClose.call(_12); +},onOpen:function(){ +if(_13.mask){ +_13.mask.css($.extend({display:"block",zIndex:$.fn.window.defaults.zIndex++},$.fn.window.getMaskSize(_12))); +} +if(_13.shadow){ +_13.shadow.css({display:"block",zIndex:$.fn.window.defaults.zIndex++,left:_14.left,top:_14.top,width:_13.window._outerWidth(),height:_13.window._outerHeight()}); +} +_13.window.css("z-index",$.fn.window.defaults.zIndex++); +_14.onOpen.call(_12); +},onResize:function(_15,_16){ +var _17=$(this).panel("options"); +$.extend(_14,{width:_17.width,height:_17.height,left:_17.left,top:_17.top}); +if(_13.shadow){ +_13.shadow.css({left:_14.left,top:_14.top,width:_13.window._outerWidth(),height:_13.window._outerHeight()}); +} +_14.onResize.call(_12,_15,_16); +},onMinimize:function(){ +if(_13.shadow){ +_13.shadow.hide(); +} +if(_13.mask){ +_13.mask.hide(); +} +_13.options.onMinimize.call(_12); +},onBeforeCollapse:function(){ +if(_14.onBeforeCollapse.call(_12)==false){ +return false; +} +if(_13.shadow){ +_13.shadow.hide(); +} +},onExpand:function(){ +if(_13.shadow){ +_13.shadow.show(); +} +_14.onExpand.call(_12); +}})); +_13.window=win.panel("panel"); +if(_13.mask){ +_13.mask.remove(); +} +if(_14.modal){ +_13.mask=$("
                                                                                                            ").insertAfter(_13.window); +} +if(_13.shadow){ +_13.shadow.remove(); +} +if(_14.shadow){ +_13.shadow=$("
                                                                                                            ").insertAfter(_13.window); +} +var _18=_14.closed; +if(_14.left==null){ +_5(_12); +} +if(_14.top==null){ +_b(_12); +} +_1(_12); +if(!_18){ +win.window("open"); +} +}; +function _19(_1a,top,_1b,_1c){ +var _1d=this; +var _1e=$.data(_1d,"window"); +var _1f=_1e.options; +if(!_1f.constrain){ +return {}; +} +if($.isFunction(_1f.constrain)){ +return _1f.constrain.call(_1d,_1a,top,_1b,_1c); +} +var win=$(_1d).window("window"); +var _20=_1f.inline?win.parent():$(window); +if(_1a<0){ +_1a=0; +} +if(top<_20.scrollTop()){ +top=_20.scrollTop(); +} +if(_1a+_1b>_20.width()){ +if(_1b==win.outerWidth()){ +_1a=_20.width()-_1b; +}else{ +_1b=_20.width()-_1a; +} +} +if(top-_20.scrollTop()+_1c>_20.height()){ +if(_1c==win.outerHeight()){ +top=_20.height()-_1c+_20.scrollTop(); +}else{ +_1c=_20.height()-top+_20.scrollTop(); +} +} +return {left:_1a,top:top,width:_1b,height:_1c}; +}; +function _21(_22){ +var _23=$.data(_22,"window"); +_23.window.draggable({handle:">div.panel-header>div.panel-title",disabled:_23.options.draggable==false,onBeforeDrag:function(e){ +if(_23.mask){ +_23.mask.css("z-index",$.fn.window.defaults.zIndex++); +} +if(_23.shadow){ +_23.shadow.css("z-index",$.fn.window.defaults.zIndex++); +} +_23.window.css("z-index",$.fn.window.defaults.zIndex++); +},onStartDrag:function(e){ +_24(e); +},onDrag:function(e){ +_25(e); +return false; +},onStopDrag:function(e){ +_26(e,"move"); +}}); +_23.window.resizable({disabled:_23.options.resizable==false,onStartResize:function(e){ +_24(e); +},onResize:function(e){ +_25(e); +return false; +},onStopResize:function(e){ +_26(e,"resize"); +}}); +function _24(e){ +if(_23.pmask){ +_23.pmask.remove(); +} +_23.pmask=$("
                                                                                                            ").insertAfter(_23.window); +_23.pmask.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top,width:_23.window._outerWidth(),height:_23.window._outerHeight()}); +if(_23.proxy){ +_23.proxy.remove(); +} +_23.proxy=$("
                                                                                                            ").insertAfter(_23.window); +_23.proxy.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top}); +_23.proxy._outerWidth(e.data.width)._outerHeight(e.data.height); +_23.proxy.hide(); +setTimeout(function(){ +if(_23.pmask){ +_23.pmask.show(); +} +if(_23.proxy){ +_23.proxy.show(); +} +},500); +}; +function _25(e){ +$.extend(e.data,_19.call(_22,e.data.left,e.data.top,e.data.width,e.data.height)); +_23.pmask.show(); +_23.proxy.css({display:"block",left:e.data.left,top:e.data.top}); +_23.proxy._outerWidth(e.data.width); +_23.proxy._outerHeight(e.data.height); +}; +function _26(e,_27){ +$.extend(e.data,_19.call(_22,e.data.left,e.data.top,e.data.width+0.1,e.data.height+0.1)); +$(_22).window(_27,e.data); +_23.pmask.remove(); +_23.pmask=null; +_23.proxy.remove(); +_23.proxy=null; +}; +}; +$(function(){ +if(!$._positionFixed){ +$(window).resize(function(){ +$("body>div.window-mask:visible").css({width:"",height:""}); +setTimeout(function(){ +$("body>div.window-mask:visible").css($.fn.window.getMaskSize()); +},50); +}); +} +}); +$.fn.window=function(_28,_29){ +if(typeof _28=="string"){ +var _2a=$.fn.window.methods[_28]; +if(_2a){ +return _2a(this,_29); +}else{ +return this.panel(_28,_29); +} +} +_28=_28||{}; +return this.each(function(){ +var _2b=$.data(this,"window"); +if(_2b){ +$.extend(_2b.options,_28); +}else{ +_2b=$.data(this,"window",{options:$.extend({},$.fn.window.defaults,$.fn.window.parseOptions(this),_28)}); +if(!_2b.options.inline){ +document.body.appendChild(this); +} +} +_11(this); +_21(this); +}); +}; +$.fn.window.methods={options:function(jq){ +var _2c=jq.panel("options"); +var _2d=$.data(jq[0],"window").options; +return $.extend(_2d,{closed:_2c.closed,collapsed:_2c.collapsed,minimized:_2c.minimized,maximized:_2c.maximized}); +},window:function(jq){ +return $.data(jq[0],"window").window; +},move:function(jq,_2e){ +return jq.each(function(){ +_1(this,_2e); +}); +},hcenter:function(jq){ +return jq.each(function(){ +_5(this,true); +}); +},vcenter:function(jq){ +return jq.each(function(){ +_b(this,true); +}); +},center:function(jq){ +return jq.each(function(){ +_5(this); +_b(this); +_1(this); +}); +}}; +$.fn.window.getMaskSize=function(_2f){ +var _30=$(_2f).data("window"); +if(_30&&_30.options.inline){ +return {}; +}else{ +if($._positionFixed){ +return {position:"fixed"}; +}else{ +return {width:$(document).width(),height:$(document).height()}; +} +} +}; +$.fn.window.parseOptions=function(_31){ +return $.extend({},$.fn.panel.parseOptions(_31),$.parser.parseOptions(_31,[{draggable:"boolean",resizable:"boolean",shadow:"boolean",modal:"boolean",inline:"boolean"}])); +}; +$.fn.window.defaults=$.extend({},$.fn.panel.defaults,{zIndex:9000,draggable:true,resizable:true,shadow:true,modal:false,border:true,inline:false,title:"New Window",collapsible:true,minimizable:true,maximizable:true,closable:true,closed:false,constrain:false}); +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/readme.txt b/testapps/ResourceLoaderTest/src/main/resources/asset/readme.txt new file mode 100755 index 000000000..2088b75c4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/readme.txt @@ -0,0 +1,4 @@ +Current Version: 1.5.5.5 +======================== +This software is allowed to use under freeware license or you need to buy commercial license for better support or other purpose. +Please contact us at info@jeasyui.com diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/easyloader.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/easyloader.js new file mode 100644 index 000000000..38d53844c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/easyloader.js @@ -0,0 +1,439 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * easyloader - EasyUI for jQuery + * + */ +(function(){ + var modules = { + draggable:{ + js:'jquery.draggable.js' + }, + droppable:{ + js:'jquery.droppable.js' + }, + resizable:{ + js:'jquery.resizable.js' + }, + linkbutton:{ + js:'jquery.linkbutton.js', + css:'linkbutton.css' + }, + progressbar:{ + js:'jquery.progressbar.js', + css:'progressbar.css' + }, + tooltip:{ + js:'jquery.tooltip.js', + css:'tooltip.css' + }, + pagination:{ + js:'jquery.pagination.js', + css:'pagination.css', + dependencies:['linkbutton'] + }, + datagrid:{ + js:'jquery.datagrid.js', + css:'datagrid.css', + dependencies:['panel','resizable','linkbutton','pagination'] + }, + treegrid:{ + js:'jquery.treegrid.js', + css:'tree.css', + dependencies:['datagrid'] + }, + propertygrid:{ + js:'jquery.propertygrid.js', + css:'propertygrid.css', + dependencies:['datagrid'] + }, + datalist:{ + js:'jquery.datalist.js', + css:'datalist.css', + dependencies:['datagrid'] + }, + panel: { + js:'jquery.panel.js', + css:'panel.css' + }, + window:{ + js:'jquery.window.js', + css:'window.css', + dependencies:['resizable','draggable','panel'] + }, + dialog:{ + js:'jquery.dialog.js', + css:'dialog.css', + dependencies:['linkbutton','window'] + }, + messager:{ + js:'jquery.messager.js', + css:'messager.css', + dependencies:['linkbutton','dialog','progressbar'] + }, + layout:{ + js:'jquery.layout.js', + css:'layout.css', + dependencies:['resizable','panel'] + }, + form:{ + js:'jquery.form.js' + }, + menu:{ + js:'jquery.menu.js', + css:'menu.css' + }, + tabs:{ + js:'jquery.tabs.js', + css:'tabs.css', + dependencies:['panel','linkbutton'] + }, + menubutton:{ + js:'jquery.menubutton.js', + css:'menubutton.css', + dependencies:['linkbutton','menu'] + }, + splitbutton:{ + js:'jquery.splitbutton.js', + css:'splitbutton.css', + dependencies:['menubutton'] + }, + switchbutton:{ + js:'jquery.switchbutton.js', + css:'switchbutton.css' + }, + accordion:{ + js:'jquery.accordion.js', + css:'accordion.css', + dependencies:['panel'] + }, + calendar:{ + js:'jquery.calendar.js', + css:'calendar.css' + }, + textbox:{ + js:'jquery.textbox.js', + css:'textbox.css', + dependencies:['validatebox','linkbutton'] + }, + passwordbox:{ + js:'jquery.passwordbox.js', + css:'passwordbox.css', + dependencies:['textbox'] + }, + filebox:{ + js:'jquery.filebox.js', + css:'filebox.css', + dependencies:['textbox'] + }, + combo:{ + js:'jquery.combo.js', + css:'combo.css', + dependencies:['panel','textbox'] + }, + combobox:{ + js:'jquery.combobox.js', + css:'combobox.css', + dependencies:['combo'] + }, + combotree:{ + js:'jquery.combotree.js', + dependencies:['combo','tree'] + }, + combogrid:{ + js:'jquery.combogrid.js', + dependencies:['combo','datagrid'] + }, + combotreegrid:{ + js:'jquery.combotreegrid.js', + dependencies:['combo','treegrid'] + }, + tagbox:{ + js:'jquery.tagbox.js', + dependencies:['combobox'] + }, + validatebox:{ + js:'jquery.validatebox.js', + css:'validatebox.css', + dependencies:['tooltip'] + }, + numberbox:{ + js:'jquery.numberbox.js', + dependencies:['textbox'] + }, + searchbox:{ + js:'jquery.searchbox.js', + css:'searchbox.css', + dependencies:['menubutton','textbox'] + }, + spinner:{ + js:'jquery.spinner.js', + css:'spinner.css', + dependencies:['textbox'] + }, + numberspinner:{ + js:'jquery.numberspinner.js', + dependencies:['spinner','numberbox'] + }, + timespinner:{ + js:'jquery.timespinner.js', + dependencies:['spinner'] + }, + tree:{ + js:'jquery.tree.js', + css:'tree.css', + dependencies:['draggable','droppable'] + }, + datebox:{ + js:'jquery.datebox.js', + css:'datebox.css', + dependencies:['calendar','combo'] + }, + datetimebox:{ + js:'jquery.datetimebox.js', + dependencies:['datebox','timespinner'] + }, + slider:{ + js:'jquery.slider.js', + dependencies:['draggable'] + }, + parser:{ + js:'jquery.parser.js' + }, + mobile:{ + js:'jquery.mobile.js' + } + }; + + var locales = { + 'af':'easyui-lang-af.js', + 'ar':'easyui-lang-ar.js', + 'bg':'easyui-lang-bg.js', + 'ca':'easyui-lang-ca.js', + 'cs':'easyui-lang-cs.js', + 'cz':'easyui-lang-cz.js', + 'da':'easyui-lang-da.js', + 'de':'easyui-lang-de.js', + 'el':'easyui-lang-el.js', + 'en':'easyui-lang-en.js', + 'es':'easyui-lang-es.js', + 'fr':'easyui-lang-fr.js', + 'it':'easyui-lang-it.js', + 'jp':'easyui-lang-jp.js', + 'nl':'easyui-lang-nl.js', + 'pl':'easyui-lang-pl.js', + 'pt_BR':'easyui-lang-pt_BR.js', + 'ru':'easyui-lang-ru.js', + 'sv_SE':'easyui-lang-sv_SE.js', + 'tr':'easyui-lang-tr.js', + 'zh_CN':'easyui-lang-zh_CN.js', + 'zh_TW':'easyui-lang-zh_TW.js' + }; + + var queues = {}; + + function loadJs(url, callback){ + var done = false; + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.language = 'javascript'; + script.src = url; + script.onload = script.onreadystatechange = function(){ + if (!done && (!script.readyState || script.readyState == 'loaded' || script.readyState == 'complete')){ + done = true; + script.onload = script.onreadystatechange = null; + if (callback){ + callback.call(script); + } + } + } + document.getElementsByTagName("head")[0].appendChild(script); + } + + function runJs(url, callback){ + loadJs(url, function(){ + document.getElementsByTagName("head")[0].removeChild(this); + if (callback){ + callback(); + } + }); + } + + function loadCss(url, callback){ + var link = document.createElement('link'); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.media = 'screen'; + link.href = url; + document.getElementsByTagName('head')[0].appendChild(link); + if (callback){ + callback.call(link); + } + } + + function loadSingle(name, callback){ + queues[name] = 'loading'; + + var module = modules[name]; + var jsStatus = 'loading'; + var cssStatus = (easyloader.css && module['css']) ? 'loading' : 'loaded'; + + if (easyloader.css && module['css']){ + if (/^http/i.test(module['css'])){ + var url = module['css']; + } else { + var url = easyloader.base + 'themes/' + easyloader.theme + '/' + module['css']; + } + loadCss(url, function(){ + cssStatus = 'loaded'; + if (jsStatus == 'loaded' && cssStatus == 'loaded'){ + finish(); + } + }); + } + + if (/^http/i.test(module['js'])){ + var url = module['js']; + } else { + var url = easyloader.base + 'plugins/' + module['js']; + } + loadJs(url, function(){ + jsStatus = 'loaded'; + if (jsStatus == 'loaded' && cssStatus == 'loaded'){ + finish(); + } + }); + + function finish(){ + queues[name] = 'loaded'; + easyloader.onProgress(name); + if (callback){ + callback(); + } + } + } + + function loadModule(name, callback){ + var mm = []; + var doLoad = false; + + if (typeof name == 'string'){ + add(name); + } else { + for(var i=0; i.panel>.accordion-header'); + // if (headers.length){ + // headerHeight = $(headers[0]).css('height', '')._outerHeight(); + // } + // if (!isNaN(parseInt(opts.height))){ + // bodyHeight = cc.height() - headerHeight*headers.length; + // } + + // _resize(true, bodyHeight - _resize(false) + 1); + + // function _resize(collapsible, height){ + // var totalHeight = 0; + // for(var i=0; i.panel>.accordion-header'); + if (headers.length){ + if (isHorizontal){ + $(panels[0]).panel('resize', {width:cc.width(),height:cc.height()}); + headerHeight = $(headers[0])._outerWidth(); + } else { + headerHeight = $(headers[0]).css('height', '')._outerHeight(); + } + } + if (!isNaN(parseInt(opts.height))){ + if (isHorizontal){ + bodyHeight = cc.width() - headerHeight*headers.length; + } else { + bodyHeight = cc.height() - headerHeight*headers.length; + } + } + + // _resize(true, bodyHeight - _resize(false) + 1); + _resize(true, bodyHeight - _resize(false)); + + function _resize(collapsible, height){ + var totalHeight = 0; + for(var i=0; i= panels.length){ + return null; + } else { + return panels[which]; + } + } + return findBy(container, 'title', which); + } + + function setProperties(container){ + var opts = $.data(container, 'accordion').options; + var cc = $(container); + if (opts.border){ + cc.removeClass('accordion-noborder'); + } else { + cc.addClass('accordion-noborder'); + } + } + + function init(container){ + var state = $.data(container, 'accordion'); + var cc = $(container); + cc.addClass('accordion'); + + state.panels = []; + cc.children('div').each(function(){ + var opts = $.extend({}, $.parser.parseOptions(this), { + selected: ($(this).attr('selected') ? true : undefined) + }); + var pp = $(this); + state.panels.push(pp); + createPanel(container, pp, opts); + }); + + cc.bind('_resize', function(e,force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(container); + } + return false; + }); + } + + function createPanel(container, pp, options){ + var opts = $.data(container, 'accordion').options; + pp.panel($.extend({}, { + collapsible: true, + minimizable: false, + maximizable: false, + closable: false, + doSize: false, + collapsed: true, + headerCls: 'accordion-header', + bodyCls: 'accordion-body', + halign: opts.halign + }, options, { + onBeforeExpand: function(){ + if (options.onBeforeExpand){ + if (options.onBeforeExpand.call(this) == false){return false} + } + if (!opts.multiple){ + // get all selected panel + var all = $.grep(getSelections(container), function(p){ + return p.panel('options').collapsible; + }); + for(var i=0; i.panel-last>.accordion-header').removeClass('accordion-header-border'); + if (options.onExpand){options.onExpand.call(this)} + opts.onSelect.call(container, $(this).panel('options').title, getPanelIndex(container, this)); + }, + onBeforeCollapse: function(){ + if (options.onBeforeCollapse){ + if (options.onBeforeCollapse.call(this) == false){return false} + } + $(container).find('>.panel-last>.accordion-header').addClass('accordion-header-border'); + var header = $(this).panel('header'); + header.removeClass('accordion-header-selected'); + header.find('.accordion-collapse').addClass('accordion-expand'); + }, + onCollapse: function(){ + if (isNaN(parseInt(opts.height))){ + $(container).find('>.panel-last>.accordion-header').removeClass('accordion-header-border'); + } + if (options.onCollapse){options.onCollapse.call(this)} + opts.onUnselect.call(container, $(this).panel('options').title, getPanelIndex(container, this)); + } + })); + + var header = pp.panel('header'); + var tool = header.children('div.panel-tool'); + tool.children('a.panel-tool-collapse').hide(); // hide the old collapse button + var t = $('').addClass('accordion-collapse accordion-expand').appendTo(tool); + t.bind('click', function(){ + togglePanel(pp); + return false; + }); + pp.panel('options').collapsible ? t.show() : t.hide(); + if (opts.halign=='left' || opts.halign=='right'){ + t.hide(); + } + + header.click(function(){ + togglePanel(pp); + return false; + }); + + function togglePanel(p){ + var popts = p.panel('options'); + if (popts.collapsible){ + var index = getPanelIndex(container, p); + if (popts.collapsed){ + select(container, index); + } else { + unselect(container, index); + } + } + } + } + + /** + * select and set the specified panel active + */ + function select(container, which){ + var p = getPanel(container, which); + if (!p){return} + stopAnimate(container); + var opts = $.data(container, 'accordion').options; + p.panel('expand', opts.animate); + } + + function unselect(container, which){ + var p = getPanel(container, which); + if (!p){return} + stopAnimate(container); + var opts = $.data(container, 'accordion').options; + p.panel('collapse', opts.animate); + } + + function doFirstSelect(container){ + var opts = $.data(container, 'accordion').options; + $(container).find('>.panel-last>.accordion-header').addClass('accordion-header-border'); + + var p = findBy(container, 'selected', true); + if (p){ + _select(getPanelIndex(container, p)); + } else { + _select(opts.selected); + } + + function _select(index){ + var animate = opts.animate; + opts.animate = false; + select(container, index); + opts.animate = animate; + } + } + + /** + * stop the animation of all panels + */ + function stopAnimate(container){ + var panels = $.data(container, 'accordion').panels; + for(var i=0; i').appendTo(container); + panels.push(pp); + createPanel(container, pp, options); + setSize(container); + + opts.onAdd.call(container, options.title, panels.length-1); + + if (options.selected){ + select(container, panels.length-1); + } + } + + function remove(container, which){ + var state = $.data(container, 'accordion'); + var opts = state.options; + var panels = state.panels; + + stopAnimate(container); + + var panel = getPanel(container, which); + var title = panel.panel('options').title; + var index = getPanelIndex(container, panel); + + if (!panel){return} + if (opts.onBeforeRemove.call(container, title, index) == false){return} + + panels.splice(index, 1); + panel.panel('destroy'); + if (panels.length){ + setSize(container); + var curr = getSelected(container); + if (!curr){ + select(container, 0); + } + } + + opts.onRemove.call(container, title, index); + } + + $.fn.accordion = function(options, param){ + if (typeof options == 'string'){ + return $.fn.accordion.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'accordion'); + if (state){ + $.extend(state.options, options); + } else { + $.data(this, 'accordion', { + options: $.extend({}, $.fn.accordion.defaults, $.fn.accordion.parseOptions(this), options), + accordion: $(this).addClass('accordion'), + panels: [] + }); + init(this); + } + + setProperties(this); + setSize(this); + doFirstSelect(this); + }); + }; + + $.fn.accordion.methods = { + options: function(jq){ + return $.data(jq[0], 'accordion').options; + }, + panels: function(jq){ + return $.data(jq[0], 'accordion').panels; + }, + resize: function(jq, param){ + return jq.each(function(){ + setSize(this, param); + }); + }, + getSelections: function(jq){ + return getSelections(jq[0]); + }, + getSelected: function(jq){ + return getSelected(jq[0]); + }, + getPanel: function(jq, which){ + return getPanel(jq[0], which); + }, + getPanelIndex: function(jq, panel){ + return getPanelIndex(jq[0], panel); + }, + select: function(jq, which){ + return jq.each(function(){ + select(this, which); + }); + }, + unselect: function(jq, which){ + return jq.each(function(){ + unselect(this, which); + }); + }, + add: function(jq, options){ + return jq.each(function(){ + add(this, options); + }); + }, + remove: function(jq, which){ + return jq.each(function(){ + remove(this, which); + }); + } + }; + + $.fn.accordion.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, [ + 'width','height','halign', + {fit:'boolean',border:'boolean',animate:'boolean',multiple:'boolean',selected:'number'} + ])); + }; + + $.fn.accordion.defaults = { + width: 'auto', + height: 'auto', + fit: false, + border: true, + animate: true, + multiple: false, + selected: 0, + halign: 'top', // the header alignment: 'top','left','right' + + onSelect: function(title, index){}, + onUnselect: function(title, index){}, + onAdd: function(title, index){}, + onBeforeRemove: function(title, index){}, + onRemove: function(title, index){} + }; +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.calendar.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.calendar.js new file mode 100644 index 000000000..ab40eaa49 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.calendar.js @@ -0,0 +1,455 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * calendar - EasyUI for jQuery + * + */ +(function($){ + + function setSize(target, param){ + var opts = $.data(target, 'calendar').options; + var t = $(target); + if (param){ + $.extend(opts, { + width: param.width, + height: param.height + }); + } + t._size(opts, t.parent()); + t.find('.calendar-body')._outerHeight(t.height() - t.find('.calendar-header')._outerHeight()); + if (t.find('.calendar-menu').is(':visible')){ + showSelectMenus(target); + } + } + + function init(target){ + $(target).addClass('calendar').html( + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '' + + '' + + '' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + ); + + + $(target).bind('_resize', function(e,force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(target); + } + return false; + }); + } + + function bindEvents(target){ + var opts = $.data(target, 'calendar').options; + var menu = $(target).find('.calendar-menu'); + menu.find('.calendar-menu-year').unbind('.calendar').bind('keypress.calendar', function(e){ + if (e.keyCode == 13){ + setDate(true); + } + }); + $(target).unbind('.calendar').bind('mouseover.calendar', function(e){ + var t = toTarget(e.target); + if (t.hasClass('calendar-nav') || t.hasClass('calendar-text') || (t.hasClass('calendar-day') && !t.hasClass('calendar-disabled'))){ + t.addClass('calendar-nav-hover'); + } + }).bind('mouseout.calendar', function(e){ + var t = toTarget(e.target); + if (t.hasClass('calendar-nav') || t.hasClass('calendar-text') || (t.hasClass('calendar-day') && !t.hasClass('calendar-disabled'))){ + t.removeClass('calendar-nav-hover'); + } + }).bind('click.calendar', function(e){ + var t = toTarget(e.target); + if (t.hasClass('calendar-menu-next') || t.hasClass('calendar-nextyear')){ + showYear(1); + } else if (t.hasClass('calendar-menu-prev') || t.hasClass('calendar-prevyear')){ + showYear(-1); + } else if (t.hasClass('calendar-menu-month')){ + menu.find('.calendar-selected').removeClass('calendar-selected'); + t.addClass('calendar-selected'); + setDate(true); + } else if (t.hasClass('calendar-prevmonth')){ + showMonth(-1); + } else if (t.hasClass('calendar-nextmonth')){ + showMonth(1); + } else if (t.hasClass('calendar-text')){ + if (menu.is(':visible')){ + menu.hide(); + } else { + showSelectMenus(target); + } + } else if (t.hasClass('calendar-day')){ + if (t.hasClass('calendar-disabled')){return} + var oldValue = opts.current; + t.closest('div.calendar-body').find('.calendar-selected').removeClass('calendar-selected'); + t.addClass('calendar-selected'); + var parts = t.attr('abbr').split(','); + var y = parseInt(parts[0]); + var m = parseInt(parts[1]); + var d = parseInt(parts[2]); + opts.current = new Date(y, m-1, d); + opts.onSelect.call(target, opts.current); + if (!oldValue || oldValue.getTime() != opts.current.getTime()){ + opts.onChange.call(target, opts.current, oldValue); + } + if (opts.year != y || opts.month != m){ + opts.year = y; + opts.month = m; + show(target); + } + } + }); + function toTarget(t){ + var day = $(t).closest('.calendar-day'); + if (day.length){ + return day; + } else { + return $(t); + } + } + function setDate(hideMenu){ + var menu = $(target).find('.calendar-menu'); + var year = menu.find('.calendar-menu-year').val(); + var month = menu.find('.calendar-selected').attr('abbr'); + if (!isNaN(year)){ + opts.year = parseInt(year); + opts.month = parseInt(month); + show(target); + } + if (hideMenu){menu.hide()} + } + function showYear(delta){ + opts.year += delta; + show(target); + menu.find('.calendar-menu-year').val(opts.year); + } + function showMonth(delta){ + opts.month += delta; + if (opts.month > 12){ + opts.year++; + opts.month = 1; + } else if (opts.month < 1){ + opts.year--; + opts.month = 12; + } + show(target); + + menu.find('td.calendar-selected').removeClass('calendar-selected'); + menu.find('td:eq(' + (opts.month-1) + ')').addClass('calendar-selected'); + } + } + + /** + * show the select menu that can change year or month, if the menu is not be created then create it. + */ + function showSelectMenus(target){ + var opts = $.data(target, 'calendar').options; + $(target).find('.calendar-menu').show(); + + if ($(target).find('.calendar-menu-month-inner').is(':empty')){ + $(target).find('.calendar-menu-month-inner').empty(); + var t = $('
                                                                                                            ').appendTo($(target).find('.calendar-menu-month-inner')); + var idx = 0; + for(var i=0; i<3; i++){ + var tr = $('').appendTo(t); + for(var j=0; j<4; j++){ + $('').html(opts.months[idx++]).attr('abbr',idx).appendTo(tr); + } + } + } + + var body = $(target).find('.calendar-body'); + var sele = $(target).find('.calendar-menu'); + var seleYear = sele.find('.calendar-menu-year-inner'); + var seleMonth = sele.find('.calendar-menu-month-inner'); + + seleYear.find('input').val(opts.year).focus(); + seleMonth.find('td.calendar-selected').removeClass('calendar-selected'); + seleMonth.find('td:eq('+(opts.month-1)+')').addClass('calendar-selected'); + + sele._outerWidth(body._outerWidth()); + sele._outerHeight(body._outerHeight()); + seleMonth._outerHeight(sele.height() - seleYear._outerHeight()); + } + + /** + * get weeks data. + */ + function getWeeks(target, year, month){ + var opts = $.data(target, 'calendar').options; + var dates = []; + var lastDay = new Date(year, month, 0).getDate(); + for(var i=1; i<=lastDay; i++) dates.push([year,month,i]); + + // group date by week + var weeks = [], week = []; + var memoDay = -1; + while(dates.length > 0){ + var date = dates.shift(); + week.push(date); + var day = new Date(date[0],date[1]-1,date[2]).getDay(); + if (memoDay == day){ + day = 0; + } else if (day == (opts.firstDay==0 ? 7 : opts.firstDay) - 1){ + weeks.push(week); + week = []; + } + memoDay = day; + } + if (week.length){ + weeks.push(week); + } + + var firstWeek = weeks[0]; + if (firstWeek.length < 7){ + while(firstWeek.length < 7){ + var firstDate = firstWeek[0]; + var date = new Date(firstDate[0],firstDate[1]-1,firstDate[2]-1) + firstWeek.unshift([date.getFullYear(), date.getMonth()+1, date.getDate()]); + } + } else { + var firstDate = firstWeek[0]; + var week = []; + for(var i=1; i<=7; i++){ + var date = new Date(firstDate[0], firstDate[1]-1, firstDate[2]-i); + week.unshift([date.getFullYear(), date.getMonth()+1, date.getDate()]); + } + weeks.unshift(week); + } + + var lastWeek = weeks[weeks.length-1]; + while(lastWeek.length < 7){ + var lastDate = lastWeek[lastWeek.length-1]; + var date = new Date(lastDate[0], lastDate[1]-1, lastDate[2]+1); + lastWeek.push([date.getFullYear(), date.getMonth()+1, date.getDate()]); + } + if (weeks.length < 6){ + var lastDate = lastWeek[lastWeek.length-1]; + var week = []; + for(var i=1; i<=7; i++){ + var date = new Date(lastDate[0], lastDate[1]-1, lastDate[2]+i); + week.push([date.getFullYear(), date.getMonth()+1, date.getDate()]); + } + weeks.push(week); + } + + return weeks; + } + + /** + * show the calendar day. + */ + function show(target){ + var opts = $.data(target, 'calendar').options; + if (opts.current && !opts.validator.call(target, opts.current)){ + opts.current = null; + } + + var now = new Date(); + var todayInfo = now.getFullYear()+','+(now.getMonth()+1)+','+now.getDate(); + var currentInfo = opts.current ? (opts.current.getFullYear()+','+(opts.current.getMonth()+1)+','+opts.current.getDate()) : ''; + // calulate the saturday and sunday index + var saIndex = 6 - opts.firstDay; + var suIndex = saIndex + 1; + if (saIndex >= 7) saIndex -= 7; + if (suIndex >= 7) suIndex -= 7; + + $(target).find('.calendar-title span').html(opts.months[opts.month-1] + ' ' + opts.year); + + var body = $(target).find('div.calendar-body'); + body.children('table').remove(); + + var data = ['']; + data.push(''); + if (opts.showWeek){ + data.push(''); + } + for(var i=opts.firstDay; i'+opts.weeks[i]+''); + } + for(var i=0; i'+opts.weeks[i]+''); + } + data.push(''); + + data.push(''); + var weeks = getWeeks(target, opts.year, opts.month); + for(var i=0; i'); + if (opts.showWeek){ + var weekNumber = opts.getWeekNumber(new Date(week[0][0], parseInt(week[0][1])-1, week[0][2])); + data.push(''); + } + for(var j=0; j' + d + ''); + } + data.push(''); + } + data.push(''); + data.push('
                                                                                                            '+opts.weekNumberHeader+'
                                                                                                            '+weekNumber+'
                                                                                                            '); + + body.append(data.join('')); + body.children('table.calendar-dtable').prependTo(body); + + opts.onNavigate.call(target, opts.year, opts.month); + } + + $.fn.calendar = function(options, param){ + if (typeof options == 'string'){ + return $.fn.calendar.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'calendar'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'calendar', { + options:$.extend({}, $.fn.calendar.defaults, $.fn.calendar.parseOptions(this), options) + }); + init(this); + } + if (state.options.border == false){ + $(this).addClass('calendar-noborder'); + } + setSize(this); + bindEvents(this); + show(this); + $(this).find('div.calendar-menu').hide(); // hide the calendar menu + }); + }; + + $.fn.calendar.methods = { + options: function(jq){ + return $.data(jq[0], 'calendar').options; + }, + resize: function(jq, param){ + return jq.each(function(){ + setSize(this, param); + }); + }, + moveTo: function(jq, date){ + return jq.each(function(){ + if (!date){ + var now = new Date(); + $(this).calendar({ + year: now.getFullYear(), + month: now.getMonth()+1, + current: date + }); + return; + } + var opts = $(this).calendar('options'); + if (opts.validator.call(this, date)){ + var oldValue = opts.current; + $(this).calendar({ + year: date.getFullYear(), + month: date.getMonth()+1, + current: date + }); + if (!oldValue || oldValue.getTime() != date.getTime()){ + opts.onChange.call(this, opts.current, oldValue); + } + } + }); + } + }; + + $.fn.calendar.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, [ + 'weekNumberHeader',{firstDay:'number',fit:'boolean',border:'boolean',showWeek:'boolean'} + ])); + }; + + $.fn.calendar.defaults = { + width:180, + height:180, + fit:false, + border:true, + showWeek:false, + firstDay:0, + weeks:['S','M','T','W','T','F','S'], + months:['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + year:new Date().getFullYear(), + month:new Date().getMonth()+1, + current:(function(){ + var d = new Date(); + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + })(), + weekNumberHeader:'', + getWeekNumber: function(date){ + var checkDate = new Date(date.getTime()); + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + var time = checkDate.getTime(); + checkDate.setMonth(0); + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + formatter:function(date){return date.getDate()}, + styler:function(date){return ''}, + validator:function(date){return true}, + + onSelect: function(date){}, + onChange: function(newDate, oldDate){}, + onNavigate: function(year, month){} + }; +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.combobox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.combobox.js new file mode 100644 index 000000000..fda617698 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.combobox.js @@ -0,0 +1,742 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * combobox - EasyUI for jQuery + * + * Dependencies: + * combo + * + */ +(function($){ + function getRowIndex(target, value){ + var state = $.data(target, 'combobox'); + return $.easyui.indexOfArray(state.data, state.options.valueField, value); + } + + /** + * scroll panel to display the specified item + */ + function scrollTo(target, value){ + var opts = $.data(target, 'combobox').options; + var panel = $(target).combo('panel'); + var item = opts.finder.getEl(target, value); + if (item.length){ + if (item.position().top <= 0){ + var h = panel.scrollTop() + item.position().top; + panel.scrollTop(h); + } else if (item.position().top + item.outerHeight() > panel.height()){ + var h = panel.scrollTop() + item.position().top + item.outerHeight() - panel.height(); + panel.scrollTop(h); + } + } + panel.triggerHandler('scroll'); // trigger the group sticking + } + + function nav(target, dir){ + var opts = $.data(target, 'combobox').options; + var panel = $(target).combobox('panel'); + var item = panel.children('div.combobox-item-hover'); + if (!item.length){ + item = panel.children('div.combobox-item-selected'); + } + item.removeClass('combobox-item-hover'); + var firstSelector = 'div.combobox-item:visible:not(.combobox-item-disabled):first'; + var lastSelector = 'div.combobox-item:visible:not(.combobox-item-disabled):last'; + if (!item.length){ + item = panel.children(dir=='next' ? firstSelector : lastSelector); + } else { + if (dir == 'next'){ + item = item.nextAll(firstSelector); + if (!item.length){ + item = panel.children(firstSelector); + } + } else { + item = item.prevAll(firstSelector); + if (!item.length){ + item = panel.children(lastSelector); + } + } + } + if (item.length){ + item.addClass('combobox-item-hover'); + var row = opts.finder.getRow(target, item); + if (row){ + $(target).combobox('scrollTo', row[opts.valueField]); + if (opts.selectOnNavigation){ + select(target, row[opts.valueField]); + } + } + } + } + + /** + * select the specified value + */ + function select(target, value, remainText){ + var opts = $.data(target, 'combobox').options; + var values = $(target).combo('getValues'); + if ($.inArray(value+'', values) == -1){ + if (opts.multiple){ + values.push(value); + } else { + values = [value]; + } + setValues(target, values, remainText); + } + } + + /** + * unselect the specified value + */ + function unselect(target, value){ + var opts = $.data(target, 'combobox').options; + var values = $(target).combo('getValues'); + var index = $.inArray(value+'', values); + if (index >= 0){ + values.splice(index, 1); + setValues(target, values); + } + } + + /** + * set values + */ + function setValues(target, values, remainText){ + var opts = $.data(target, 'combobox').options; + var panel = $(target).combo('panel'); + + if (!$.isArray(values)){ + values = values.split(opts.separator); + } + if (!opts.multiple){ + values = values.length ? [values[0]] : ['']; + } + + // unselect the old rows + var oldValues = $(target).combo('getValues'); + if (panel.is(':visible')){ + panel.find('.combobox-item-selected').each(function(){ + var row = opts.finder.getRow(target, $(this)); + if (row){ + if ($.easyui.indexOfArray(oldValues, row[opts.valueField]) == -1){ + $(this).removeClass('combobox-item-selected'); + } + } + }); + } + $.map(oldValues, function(v){ + if ($.easyui.indexOfArray(values, v) == -1){ + var el = opts.finder.getEl(target, v); + if (el.hasClass('combobox-item-selected')){ + el.removeClass('combobox-item-selected'); + opts.onUnselect.call(target, opts.finder.getRow(target, v)); + } + } + }); + + var theRow = null; + var vv = [], ss = []; + for(var i=0; i= 0){ + vv.push(v); + } + }); + t.combobox('setValues', vv); + if (!opts.multiple){ + t.combobox('hidePanel'); + } + } + + /** + * create the component + */ + function create(target){ + var state = $.data(target, 'combobox'); + var opts = state.options; + + $(target).addClass('combobox-f'); + $(target).combo($.extend({}, opts, { + onShowPanel: function(){ + $(this).combo('panel').find('div.combobox-item:hidden,div.combobox-group:hidden').show(); + setValues(this, $(this).combobox('getValues'), true); + $(this).combobox('scrollTo', $(this).combobox('getValue')); + opts.onShowPanel.call(this); + } + })); + + // var p = $(target).combo('panel'); + // p.unbind('.combobox'); + // for(var event in opts.panelEvents){ + // p.bind(event+'.combobox', {target:target}, opts.panelEvents[event]); + // } + } + + function mouseoverHandler(e){ + $(this).children('div.combobox-item-hover').removeClass('combobox-item-hover'); + var item = $(e.target).closest('div.combobox-item'); + if (!item.hasClass('combobox-item-disabled')){ + item.addClass('combobox-item-hover'); + } + e.stopPropagation(); + } + function mouseoutHandler(e){ + $(e.target).closest('div.combobox-item').removeClass('combobox-item-hover'); + e.stopPropagation(); + } + function clickHandler(e){ + var target = $(this).panel('options').comboTarget; + if (!target){return;} + var opts = $(target).combobox('options'); + var item = $(e.target).closest('div.combobox-item'); + if (!item.length || item.hasClass('combobox-item-disabled')){return} + var row = opts.finder.getRow(target, item); + if (!row){return;} + if (opts.blurTimer){ + clearTimeout(opts.blurTimer); + opts.blurTimer = null; + } + opts.onClick.call(target, row); + var value = row[opts.valueField]; + if (opts.multiple){ + if (item.hasClass('combobox-item-selected')){ + unselect(target, value); + } else { + select(target, value); + } + } else { + $(target).combobox('setValue', value).combobox('hidePanel'); + } + e.stopPropagation(); + } + function scrollHandler(e){ + var target = $(this).panel('options').comboTarget; + if (!target){return;} + var opts = $(target).combobox('options'); + if (opts.groupPosition == 'sticky'){ + var stick = $(this).children('.combobox-stick'); + if (!stick.length){ + stick = $('
                                                                                                            ').appendTo(this); + } + stick.hide(); + var state = $(target).data('combobox'); + $(this).children('.combobox-group:visible').each(function(){ + var g = $(this); + var groupData = opts.finder.getGroup(target, g); + var rowData = state.data[groupData.startIndex + groupData.count - 1]; + var last = opts.finder.getEl(target, rowData[opts.valueField]); + if (g.position().top < 0 && last.position().top > 0){ + stick.show().html(g.html()); + return false; + } + }); + } + } + + $.fn.combobox = function(options, param){ + if (typeof options == 'string'){ + var method = $.fn.combobox.methods[options]; + if (method){ + return method(this, param); + } else { + return this.combo(options, param); + } + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'combobox'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'combobox', { + options: $.extend({}, $.fn.combobox.defaults, $.fn.combobox.parseOptions(this), options), + data: [] + }); + } + create(this); + if (state.options.data){ + loadData(this, state.options.data); + } else { + var data = $.fn.combobox.parseData(this); + if (data.length){ + loadData(this, data); + } + } + request(this); + }); + }; + + + $.fn.combobox.methods = { + options: function(jq){ + var copts = jq.combo('options'); + return $.extend($.data(jq[0], 'combobox').options, { + width: copts.width, + height: copts.height, + originalValue: copts.originalValue, + disabled: copts.disabled, + readonly: copts.readonly + }); + }, + cloneFrom: function(jq, from){ + return jq.each(function(){ + $(this).combo('cloneFrom', from); + $.data(this, 'combobox', $(from).data('combobox')); + $(this).addClass('combobox-f').attr('comboboxName', $(this).attr('textboxName')); + }); + }, + getData: function(jq){ + return $.data(jq[0], 'combobox').data; + }, + setValues: function(jq, values){ + return jq.each(function(){ + var opts = $(this).combobox('options'); + if ($.isArray(values)){ + values = $.map(values, function(value){ + if (value && typeof value == 'object'){ + $.easyui.addArrayItem(opts.mappingRows, opts.valueField, value); + return value[opts.valueField]; + } else { + return value; + } + }); + } + setValues(this, values); + }); + }, + setValue: function(jq, value){ + return jq.each(function(){ + $(this).combobox('setValues', $.isArray(value)?value:[value]); + }); + }, + clear: function(jq){ + return jq.each(function(){ + setValues(this, []); + }); + }, + reset: function(jq){ + return jq.each(function(){ + var opts = $(this).combobox('options'); + if (opts.multiple){ + $(this).combobox('setValues', opts.originalValue); + } else { + $(this).combobox('setValue', opts.originalValue); + } + }); + }, + loadData: function(jq, data){ + return jq.each(function(){ + loadData(this, data); + }); + }, + reload: function(jq, url){ + return jq.each(function(){ + if (typeof url == 'string'){ + request(this, url); + } else { + if (url){ + var opts = $(this).combobox('options'); + opts.queryParams = url; + } + request(this); + } + }); + }, + select: function(jq, value){ + return jq.each(function(){ + select(this, value); + }); + }, + unselect: function(jq, value){ + return jq.each(function(){ + unselect(this, value); + }); + }, + scrollTo: function(jq, value){ + return jq.each(function(){ + scrollTo(this, value); + }); + } + }; + + $.fn.combobox.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.fn.combo.parseOptions(target), $.parser.parseOptions(target,[ + 'valueField','textField','groupField','groupPosition','mode','method','url', + {showItemIcon:'boolean',limitToList:'boolean'} + ])); + }; + + $.fn.combobox.parseData = function(target){ + var data = []; + var opts = $(target).combobox('options'); + $(target).children().each(function(){ + if (this.tagName.toLowerCase() == 'optgroup'){ + var group = $(this).attr('label'); + $(this).children().each(function(){ + _parseItem(this, group); + }); + } else { + _parseItem(this); + } + }); + return data; + + function _parseItem(el, group){ + var t = $(el); + var row = {}; + row[opts.valueField] = t.attr('value')!=undefined ? t.attr('value') : t.text(); + row[opts.textField] = t.text(); + row['iconCls'] = $.parser.parseOptions(el, ['iconCls']).iconCls; + row['selected'] = t.is(':selected'); + row['disabled'] = t.is(':disabled'); + if (group){ + opts.groupField = opts.groupField || 'group'; + row[opts.groupField] = group; + } + data.push(row); + } + }; + + var COMBOBOX_SERNO = 0; + var defaultView = { + render: function(target, container, data){ + var state = $.data(target, 'combobox'); + var opts = state.options; + + COMBOBOX_SERNO++; + state.itemIdPrefix = '_easyui_combobox_i' + COMBOBOX_SERNO; + state.groupIdPrefix = '_easyui_combobox_g' + COMBOBOX_SERNO; + state.groups = []; + + var dd = []; + var group = undefined; + for(var i=0; i'); + dd.push(opts.groupFormatter ? opts.groupFormatter.call(target, g) : g); + dd.push(''); + } else { + state.groups[state.groups.length-1].count++; + } + } else { + group = undefined; + } + + var cls = 'combobox-item' + (row.disabled ? ' combobox-item-disabled' : '') + (g ? ' combobox-gitem' : ''); + dd.push('
                                                                                                            '); + if (opts.showItemIcon && row.iconCls){ + dd.push(''); + } + dd.push(opts.formatter ? opts.formatter.call(target, row) : s); + dd.push('
                                                                                                            '); + } + $(container).html(dd.join('')); + } + }; + + $.fn.combobox.defaults = $.extend({}, $.fn.combo.defaults, { + valueField: 'value', + textField: 'text', + groupPosition: 'static', // or 'sticky' + groupField: null, + groupFormatter: function(group){return group;}, + mode: 'local', // or 'remote' + method: 'post', + url: null, + data: null, + queryParams: {}, + showItemIcon: false, + limitToList: false, // limit the inputed values to the listed items + unselectedValues: [], + mappingRows: [], + view: defaultView, + + keyHandler: { + up: function(e){nav(this,'prev');e.preventDefault()}, + down: function(e){nav(this,'next');e.preventDefault()}, + left: function(e){}, + right: function(e){}, + enter: function(e){doEnter(this)}, + query: function(q,e){doQuery(this, q)} + }, + inputEvents: $.extend({}, $.fn.combo.defaults.inputEvents, { + blur: function(e){ + $.fn.combo.defaults.inputEvents.blur(e); + var target = e.data.target; + var opts = $(target).combobox('options'); + if (opts.reversed || opts.limitToList){ + if (opts.blurTimer){ + clearTimeout(opts.blurTimer); + } + opts.blurTimer = setTimeout(function(){ + var existing = $(target).parent().length; + if (existing){ + if (opts.reversed){ + $(target).combobox('setValues', $(target).combobox('getValues')); + } else if (opts.limitToList){ + //doEnter(target); + var vv = []; + $.map($(target).combobox('getValues'), function(v){ + var index = $.easyui.indexOfArray($(target).combobox('getData'), opts.valueField, v); + if (index >= 0){ + vv.push(v); + } + }); + $(target).combobox('setValues', vv); + } + opts.blurTimer = null; + } + },50); + } + } + }), + panelEvents: { + mouseover: mouseoverHandler, + mouseout: mouseoutHandler, + mousedown: function(e){ + e.preventDefault(); + e.stopPropagation(); + }, + click: clickHandler, + scroll: scrollHandler + }, + filter: function(q, row){ + var opts = $(this).combobox('options'); + return row[opts.textField].toLowerCase().indexOf(q.toLowerCase()) >= 0; + }, + formatter: function(row){ + var opts = $(this).combobox('options'); + return row[opts.textField]; + }, + loader: function(param, success, error){ + var opts = $(this).combobox('options'); + if (!opts.url) return false; + $.ajax({ + type: opts.method, + url: opts.url, + data: param, + dataType: 'json', + success: function(data){ + success(data); + }, + error: function(){ + error.apply(this, arguments); + } + }); + }, + loadFilter: function(data){ + return data; + }, + finder:{ + getEl:function(target, value){ + var index = getRowIndex(target, value); + var id = $.data(target, 'combobox').itemIdPrefix + '_' + index; + return $('#'+id); + }, + getGroupEl:function(target, gvalue){ + var state = $.data(target, 'combobox'); + var index = $.easyui.indexOfArray(state.groups, 'value', gvalue); + var id = state.groupIdPrefix + '_' + index; + return $('#'+id); + }, + getGroup:function(target, p){ + var state = $.data(target, 'combobox'); + var index = p.attr('id').substr(state.groupIdPrefix.length+1); + return state.groups[parseInt(index)]; + }, + getRow:function(target, p){ + var state = $.data(target, 'combobox'); + var index = (p instanceof $) ? p.attr('id').substr(state.itemIdPrefix.length+1) : getRowIndex(target, p); + return state.data[parseInt(index)]; + } + }, + + onBeforeLoad: function(param){}, + onLoadSuccess: function(data){}, + onLoadError: function(){}, + onSelect: function(record){}, + onUnselect: function(record){}, + onClick: function(record){} + }); +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.datebox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.datebox.js new file mode 100644 index 000000000..6ab1741ef --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.datebox.js @@ -0,0 +1,288 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * datebox - EasyUI for jQuery + * + * Dependencies: + * calendar + * combo + * + */ +(function($){ + /** + * create date box + */ + function createBox(target){ + var state = $.data(target, 'datebox'); + var opts = state.options; + + $(target).addClass('datebox-f').combo($.extend({}, opts, { + onShowPanel:function(){ + bindEvents(this); + setButtons(this); + setCalendar(this); + setValue(this, $(this).datebox('getText'), true); + opts.onShowPanel.call(this); + } + })); + + /** + * if the calendar isn't created, create it. + */ + if (!state.calendar){ + var panel = $(target).combo('panel').css('overflow','hidden'); + panel.panel('options').onBeforeDestroy = function(){ + var c = $(this).find('.calendar-shared'); + if (c.length){ + c.insertBefore(c[0].pholder); + } + }; + var cc = $('
                                                                                                            ').prependTo(panel); + if (opts.sharedCalendar){ + var c = $(opts.sharedCalendar); + if (!c[0].pholder){ + c[0].pholder = $('').insertAfter(c); + } + c.addClass('calendar-shared').appendTo(cc); + if (!c.hasClass('calendar')){ + c.calendar(); + } + state.calendar = c; + } else { + state.calendar = $('
                                                                                                            ').appendTo(cc).calendar(); + } + + $.extend(state.calendar.calendar('options'), { + fit:true, + border:false, + onSelect:function(date){ + var target = this.target; + var opts = $(target).datebox('options'); + opts.onSelect.call(target, date); + setValue(target, opts.formatter.call(target, date)); + $(target).combo('hidePanel'); + } + }); + } + + $(target).combo('textbox').parent().addClass('datebox'); + $(target).datebox('initValue', opts.value); + + function bindEvents(target){ + var opts = $(target).datebox('options'); + var panel = $(target).combo('panel'); + panel.unbind('.datebox').bind('click.datebox', function(e){ + if ($(e.target).hasClass('datebox-button-a')){ + var index = parseInt($(e.target).attr('datebox-button-index')); + opts.buttons[index].handler.call(e.target, target); + } + }); + } + function setButtons(target){ + var panel = $(target).combo('panel'); + if (panel.children('div.datebox-button').length){return} + var button = $('
                                                                                                            ').appendTo(panel); + var tr = button.find('tr'); + for(var i=0; i').appendTo(tr); + var btn = opts.buttons[i]; + var t = $('').html($.isFunction(btn.text) ? btn.text(target) : btn.text).appendTo(td); + t.attr('datebox-button-index', i); + } + tr.find('td').css('width', (100/opts.buttons.length)+'%'); + } + function setCalendar(target){ + var panel = $(target).combo('panel'); + var cc = panel.children('div.datebox-calendar-inner'); + panel.children()._outerWidth(panel.width()); + state.calendar.appendTo(cc); + state.calendar[0].target = target; + if (opts.panelHeight != 'auto'){ + var height = panel.height(); + panel.children().not(cc).each(function(){ + height -= $(this).outerHeight(); + }); + cc._outerHeight(height); + } + state.calendar.calendar('resize'); + } + } + + /** + * called when user inputs some value in text box + */ + function doQuery(target, q){ + setValue(target, q, true); + } + + /** + * called when user press enter key + */ + function doEnter(target){ + var state = $.data(target, 'datebox'); + var opts = state.options; + var current = state.calendar.calendar('options').current; + if (current){ + setValue(target, opts.formatter.call(target, current)); + $(target).combo('hidePanel'); + } + } + + function setValue(target, value, remainText){ + var state = $.data(target, 'datebox'); + var opts = state.options; + var calendar = state.calendar; + calendar.calendar('moveTo', opts.parser.call(target, value)); + if (remainText){ + $(target).combo('setValue', value); + } else { + if (value){ + value = opts.formatter.call(target, calendar.calendar('options').current); + } + $(target).combo('setText', value).combo('setValue', value); + } + } + + $.fn.datebox = function(options, param){ + if (typeof options == 'string'){ + var method = $.fn.datebox.methods[options]; + if (method){ + return method(this, param); + } else { + return this.combo(options, param); + } + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'datebox'); + if (state){ + $.extend(state.options, options); + } else { + $.data(this, 'datebox', { + options: $.extend({}, $.fn.datebox.defaults, $.fn.datebox.parseOptions(this), options) + }); + } + createBox(this); + }); + }; + + $.fn.datebox.methods = { + options: function(jq){ + var copts = jq.combo('options'); + return $.extend($.data(jq[0], 'datebox').options, { + width: copts.width, + height: copts.height, + originalValue: copts.originalValue, + disabled: copts.disabled, + readonly: copts.readonly + }); + }, + cloneFrom: function(jq, from){ + return jq.each(function(){ + $(this).combo('cloneFrom', from); + $.data(this, 'datebox', { + options: $.extend(true, {}, $(from).datebox('options')), + calendar: $(from).datebox('calendar') + }); + $(this).addClass('datebox-f'); + }); + }, + calendar: function(jq){ // get the calendar object + return $.data(jq[0], 'datebox').calendar; + }, + initValue: function(jq, value){ + return jq.each(function(){ + var opts = $(this).datebox('options'); + var value = opts.value; + if (value){ + value = opts.formatter.call(this, opts.parser.call(this, value)); + } + $(this).combo('initValue', value).combo('setText', value); + }); + }, + setValue: function(jq, value){ + return jq.each(function(){ + setValue(this, value); + }); + }, + reset: function(jq){ + return jq.each(function(){ + var opts = $(this).datebox('options'); + $(this).datebox('setValue', opts.originalValue); + }); + } + }; + + $.fn.datebox.parseOptions = function(target){ + return $.extend({}, $.fn.combo.parseOptions(target), $.parser.parseOptions(target, ['sharedCalendar'])); + }; + + $.fn.datebox.defaults = $.extend({}, $.fn.combo.defaults, { + panelWidth:250, + panelHeight:'auto', + sharedCalendar:null, + + keyHandler: { + up:function(e){}, + down:function(e){}, + left: function(e){}, + right: function(e){}, + enter:function(e){doEnter(this)}, + query:function(q,e){doQuery(this, q)} + }, + + currentText:'Today', + closeText:'Close', + okText:'Ok', + + buttons:[{ + text: function(target){return $(target).datebox('options').currentText;}, + handler: function(target){ + var opts = $(target).datebox('options'); + var now = new Date(); + var current = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + $(target).datebox('calendar').calendar({ + year:current.getFullYear(), + month:current.getMonth()+1, + current:current + }); + opts.onSelect.call(target, current); + doEnter(target); + } + },{ + text: function(target){return $(target).datebox('options').closeText;}, + handler: function(target){ + $(this).closest('div.combo-panel').panel('close'); + } + }], + + formatter:function(date){ + var y = date.getFullYear(); + var m = date.getMonth()+1; + var d = date.getDate(); + return (m<10?('0'+m):m)+'/'+(d<10?('0'+d):d)+'/'+y; + }, + parser:function(s){ + if (!s) return new Date(); + var ss = s.split('/'); + var m = parseInt(ss[0],10); + var d = parseInt(ss[1],10); + var y = parseInt(ss[2],10); + if (!isNaN(y) && !isNaN(m) && !isNaN(d)){ + return new Date(y,m-1,d); + } else { + return new Date(); + } + }, + + onSelect:function(date){} + }); +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.draggable.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.draggable.js new file mode 100644 index 000000000..8187c8c80 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.draggable.js @@ -0,0 +1,399 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * draggable - EasyUI for jQuery + * + */ +(function($){ + function drag(e){ + var state = $.data(e.data.target, 'draggable'); + var opts = state.options; + var proxy = state.proxy; + + var dragData = e.data; + var left = dragData.startLeft + e.pageX - dragData.startX; + var top = dragData.startTop + e.pageY - dragData.startY; + + if (proxy){ + if (proxy.parent()[0] == document.body){ + if (opts.deltaX != null && opts.deltaX != undefined){ + left = e.pageX + opts.deltaX; + } else { + left = e.pageX - e.data.offsetWidth; + } + if (opts.deltaY != null && opts.deltaY != undefined){ + top = e.pageY + opts.deltaY; + } else { + top = e.pageY - e.data.offsetHeight; + } + } else { + if (opts.deltaX != null && opts.deltaX != undefined){ + left += e.data.offsetWidth + opts.deltaX; + } + if (opts.deltaY != null && opts.deltaY != undefined){ + top += e.data.offsetHeight + opts.deltaY; + } + } + } + + if (e.data.parent != document.body) { + left += $(e.data.parent).scrollLeft(); + top += $(e.data.parent).scrollTop(); + } + + if (opts.axis == 'h') { + dragData.left = left; + } else if (opts.axis == 'v') { + dragData.top = top; + } else { + dragData.left = left; + dragData.top = top; + } + } + + function applyDrag(e){ + var state = $.data(e.data.target, 'draggable'); + var opts = state.options; + var proxy = state.proxy; + if (!proxy){ + proxy = $(e.data.target); + } + proxy.css({ + left:e.data.left, + top:e.data.top + }); + $('body').css('cursor', opts.cursor); + } + + function doDown(e){ + if (!$.fn.draggable.isDragging){return false;} + + var state = $.data(e.data.target, 'draggable'); + var opts = state.options; + + var droppables = $('.droppable:visible').filter(function(){ + return e.data.target != this; + }).filter(function(){ + var accept = $.data(this, 'droppable').options.accept; + if (accept){ + return $(accept).filter(function(){ + return this == e.data.target; + }).length > 0; + } else { + return true; + } + }); + state.droppables = droppables; + + var proxy = state.proxy; + if (!proxy){ + if (opts.proxy){ + if (opts.proxy == 'clone'){ + proxy = $(e.data.target).clone().insertAfter(e.data.target); + } else { + proxy = opts.proxy.call(e.data.target, e.data.target); + } + state.proxy = proxy; + } else { + proxy = $(e.data.target); + } + } + + proxy.css('position', 'absolute'); + drag(e); + applyDrag(e); + + opts.onStartDrag.call(e.data.target, e); + return false; + } + + function doMove(e){ + if (!$.fn.draggable.isDragging){return false;} + + var state = $.data(e.data.target, 'draggable'); + drag(e); + if (state.options.onDrag.call(e.data.target, e) != false){ + applyDrag(e); + } + + var source = e.data.target; + state.droppables.each(function(){ + var dropObj = $(this); + if (dropObj.droppable('options').disabled){return;} + + var p2 = dropObj.offset(); + if (e.pageX > p2.left && e.pageX < p2.left + dropObj.outerWidth() + && e.pageY > p2.top && e.pageY < p2.top + dropObj.outerHeight()){ + if (!this.entered){ + $(this).trigger('_dragenter', [source]); + this.entered = true; + } + $(this).trigger('_dragover', [source]); + } else { + if (this.entered){ + $(this).trigger('_dragleave', [source]); + this.entered = false; + } + } + }); + + return false; + } + + function doUp(e){ + if (!$.fn.draggable.isDragging){ + clearDragging(); + return false; + } + + doMove(e); + + var state = $.data(e.data.target, 'draggable'); + var proxy = state.proxy; + var opts = state.options; + opts.onEndDrag.call(e.data.target, e); + if (opts.revert){ + if (checkDrop() == true){ + $(e.data.target).css({ + position:e.data.startPosition, + left:e.data.startLeft, + top:e.data.startTop + }); + } else { + if (proxy){ + var left, top; + if (proxy.parent()[0] == document.body){ + left = e.data.startX - e.data.offsetWidth; + top = e.data.startY - e.data.offsetHeight; + } else { + left = e.data.startLeft; + top = e.data.startTop; + } + proxy.animate({ + left: left, + top: top + }, function(){ + removeProxy(); + }); + } else { + $(e.data.target).animate({ + left:e.data.startLeft, + top:e.data.startTop + }, function(){ + $(e.data.target).css('position', e.data.startPosition); + }); + } + } + } else { + $(e.data.target).css({ + position:'absolute', + left:e.data.left, + top:e.data.top + }); + checkDrop(); + } + + opts.onStopDrag.call(e.data.target, e); + + clearDragging(); + + function removeProxy(){ + if (proxy){ + proxy.remove(); + } + state.proxy = null; + } + + function checkDrop(){ + var dropped = false; + state.droppables.each(function(){ + var dropObj = $(this); + if (dropObj.droppable('options').disabled){return;} + + var p2 = dropObj.offset(); + if (e.pageX > p2.left && e.pageX < p2.left + dropObj.outerWidth() + && e.pageY > p2.top && e.pageY < p2.top + dropObj.outerHeight()){ + if (opts.revert){ + $(e.data.target).css({ + position:e.data.startPosition, + left:e.data.startLeft, + top:e.data.startTop + }); + } + $(this).triggerHandler('_drop', [e.data.target]); + removeProxy(); + dropped = true; + this.entered = false; + return false; + } + }); + if (!dropped && !opts.revert){ + removeProxy(); + } + return dropped; + } + + return false; + } + + function clearDragging(){ + if ($.fn.draggable.timer){ + clearTimeout($.fn.draggable.timer); + $.fn.draggable.timer = undefined; + } + $(document).unbind('.draggable'); + $.fn.draggable.isDragging = false; + setTimeout(function(){ + $('body').css('cursor',''); + },100); + } + + $.fn.draggable = function(options, param){ + if (typeof options == 'string'){ + return $.fn.draggable.methods[options](this, param); + } + + return this.each(function(){ + var opts; + var state = $.data(this, 'draggable'); + if (state) { + state.handle.unbind('.draggable'); + opts = $.extend(state.options, options); + } else { + opts = $.extend({}, $.fn.draggable.defaults, $.fn.draggable.parseOptions(this), options || {}); + } + var handle = opts.handle ? (typeof opts.handle=='string' ? $(opts.handle, this) : opts.handle) : $(this); + + $.data(this, 'draggable', { + options: opts, + handle: handle + }); + + if (opts.disabled) { + $(this).css('cursor', ''); + return; + } + + handle.unbind('.draggable').bind('mousemove.draggable', {target:this}, function(e){ + if ($.fn.draggable.isDragging){return} + var opts = $.data(e.data.target, 'draggable').options; + if (checkArea(e)){ + $(this).css('cursor', opts.cursor); + } else { + $(this).css('cursor', ''); + } + }).bind('mouseleave.draggable', {target:this}, function(e){ + $(this).css('cursor', ''); + }).bind('mousedown.draggable', {target:this}, function(e){ + if (checkArea(e) == false) return; + $(this).css('cursor', ''); + + var position = $(e.data.target).position(); + var offset = $(e.data.target).offset(); + var data = { + startPosition: $(e.data.target).css('position'), + startLeft: position.left, + startTop: position.top, + left: position.left, + top: position.top, + startX: e.pageX, + startY: e.pageY, + width: $(e.data.target).outerWidth(), + height: $(e.data.target).outerHeight(), + offsetWidth: (e.pageX - offset.left), + offsetHeight: (e.pageY - offset.top), + target: e.data.target, + parent: $(e.data.target).parent()[0] + }; + + $.extend(e.data, data); + var opts = $.data(e.data.target, 'draggable').options; + if (opts.onBeforeDrag.call(e.data.target, e) == false) return; + + $(document).bind('mousedown.draggable', e.data, doDown); + $(document).bind('mousemove.draggable', e.data, doMove); + $(document).bind('mouseup.draggable', e.data, doUp); + + $.fn.draggable.timer = setTimeout(function(){ + $.fn.draggable.isDragging = true; + doDown(e); + }, opts.delay); + return false; + }); + + // check if the handle can be dragged + function checkArea(e) { + var state = $.data(e.data.target, 'draggable'); + var handle = state.handle; + var offset = $(handle).offset(); + var width = $(handle).outerWidth(); + var height = $(handle).outerHeight(); + var t = e.pageY - offset.top; + var r = offset.left + width - e.pageX; + var b = offset.top + height - e.pageY; + var l = e.pageX - offset.left; + + return Math.min(t,r,b,l) > state.options.edge; + } + + }); + }; + + $.fn.draggable.methods = { + options: function(jq){ + return $.data(jq[0], 'draggable').options; + }, + proxy: function(jq){ + return $.data(jq[0], 'draggable').proxy; + }, + enable: function(jq){ + return jq.each(function(){ + $(this).draggable({disabled:false}); + }); + }, + disable: function(jq){ + return jq.each(function(){ + $(this).draggable({disabled:true}); + }); + } + }; + + $.fn.draggable.parseOptions = function(target){ + var t = $(target); + return $.extend({}, + $.parser.parseOptions(target, ['cursor','handle','axis', + {'revert':'boolean','deltaX':'number','deltaY':'number','edge':'number','delay':'number'}]), { + disabled: (t.attr('disabled') ? true : undefined) + }); + }; + + $.fn.draggable.defaults = { + proxy:null, // 'clone' or a function that will create the proxy object, + // the function has the source parameter that indicate the source object dragged. + revert:false, + cursor:'move', + deltaX:null, + deltaY:null, + handle: null, + disabled: false, + edge:0, + axis:null, // v or h + delay:100, + + onBeforeDrag: function(e){}, + onStartDrag: function(e){}, + onDrag: function(e){}, + onEndDrag: function(e){}, + onStopDrag: function(e){} + }; + + $.fn.draggable.isDragging = false; + +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.droppable.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.droppable.js new file mode 100644 index 000000000..33ce6301c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.droppable.js @@ -0,0 +1,81 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * droppable - EasyUI for jQuery + * + */ +(function($){ + function init(target){ + $(target).addClass('droppable'); + $(target).bind('_dragenter', function(e, source){ + $.data(target, 'droppable').options.onDragEnter.apply(target, [e, source]); + }); + $(target).bind('_dragleave', function(e, source){ + $.data(target, 'droppable').options.onDragLeave.apply(target, [e, source]); + }); + $(target).bind('_dragover', function(e, source){ + $.data(target, 'droppable').options.onDragOver.apply(target, [e, source]); + }); + $(target).bind('_drop', function(e, source){ + $.data(target, 'droppable').options.onDrop.apply(target, [e, source]); + }); + } + + $.fn.droppable = function(options, param){ + if (typeof options == 'string'){ + return $.fn.droppable.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'droppable'); + if (state){ + $.extend(state.options, options); + } else { + init(this); + $.data(this, 'droppable', { + options: $.extend({}, $.fn.droppable.defaults, $.fn.droppable.parseOptions(this), options) + }); + } + }); + }; + + $.fn.droppable.methods = { + options: function(jq){ + return $.data(jq[0], 'droppable').options; + }, + enable: function(jq){ + return jq.each(function(){ + $(this).droppable({disabled:false}); + }); + }, + disable: function(jq){ + return jq.each(function(){ + $(this).droppable({disabled:true}); + }); + } + }; + + $.fn.droppable.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, ['accept']), { + disabled: (t.attr('disabled') ? true : undefined) + }); + }; + + $.fn.droppable.defaults = { + accept:null, + disabled:false, + onDragEnter:function(e, source){}, + onDragOver:function(e, source){}, + onDragLeave:function(e, source){}, + onDrop:function(e, source){} + }; +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.form.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.form.js new file mode 100644 index 000000000..7a2b3fae1 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.form.js @@ -0,0 +1,492 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * form - EasyUI for jQuery + * + */ +(function($){ + /** + * submit the form + */ + function ajaxSubmit(target, options){ + var opts = $.data(target, 'form').options; + $.extend(opts, options||{}); + + var param = $.extend({}, opts.queryParams); + if (opts.onSubmit.call(target, param) == false){return;} + + // $(target).find('.textbox-text:focus').blur(); + var input = $(target).find('.textbox-text:focus'); + input.triggerHandler('blur'); + input.focus(); + + var disabledFields = null; // the fields to be disabled + if (opts.dirty){ + var ff = []; // all the dirty fields + $.map(opts.dirtyFields, function(f){ + if ($(f).hasClass('textbox-f')){ + $(f).next().find('.textbox-value').each(function(){ + ff.push(this); + }); + } else { + ff.push(f); + } + }); + disabledFields = $(target).find('input[name]:enabled,textarea[name]:enabled,select[name]:enabled').filter(function(){ + return $.inArray(this, ff) == -1; + }); + // disabledFields.attr('disabled', 'disabled'); + disabledFields._propAttr('disabled', true); + } + + if (opts.ajax){ + if (opts.iframe){ + submitIframe(target, param); + } else { + if (window.FormData !== undefined){ + submitXhr(target, param); + } else { + submitIframe(target, param); + } + } + } else { + $(target).submit(); + } + + if (opts.dirty){ + // disabledFields.removeAttr('disabled'); + disabledFields._propAttr('disabled', false); + } + } + + function submitIframe(target, param){ + var opts = $.data(target, 'form').options; + var frameId = 'easyui_frame_' + (new Date().getTime()); + var frame = $('').appendTo('body') + frame.attr('src', window.ActiveXObject ? 'javascript:false' : 'about:blank'); + frame.css({ + position:'absolute', + top:-1000, + left:-1000 + }); + frame.bind('load', cb); + + submit(param); + + function submit(param){ + var form = $(target); + if (opts.url){ + form.attr('action', opts.url); + } + var t = form.attr('target'), a = form.attr('action'); + form.attr('target', frameId); + var paramFields = $(); + try { + for(var n in param){ + var field = $('').val(param[n]).appendTo(form); + paramFields = paramFields.add(field); + } + checkState(); + form[0].submit(); + } finally { + form.attr('action', a); + t ? form.attr('target', t) : form.removeAttr('target'); + paramFields.remove(); + } + } + + function checkState(){ + var f = $('#'+frameId); + if (!f.length){return} + try{ + var s = f.contents()[0].readyState; + if (s && s.toLowerCase() == 'uninitialized'){ + setTimeout(checkState, 100); + } + } catch(e){ + cb(); + } + } + + var checkCount = 10; + function cb(){ + var f = $('#'+frameId); + if (!f.length){return} + f.unbind(); + var data = ''; + try{ + var body = f.contents().find('body'); + data = body.html(); + if (data == ''){ + if (--checkCount){ + setTimeout(cb, 100); + return; + } + } + var ta = body.find('>textarea'); + if (ta.length){ + data = ta.val(); + } else { + var pre = body.find('>pre'); + if (pre.length){ + data = pre.html(); + } + } + } catch(e){ + } + opts.success.call(target, data); + setTimeout(function(){ + f.unbind(); + f.remove(); + }, 100); + } + } + + function submitXhr(target, param){ + var opts = $.data(target, 'form').options; + var formData = new FormData($(target)[0]); + for(var name in param){ + formData.append(name, param[name]); + } + $.ajax({ + url: opts.url, + type: 'post', + xhr: function(){ + var xhr = $.ajaxSettings.xhr(); + if (xhr.upload) { + xhr.upload.addEventListener('progress', function(e){ + if (e.lengthComputable) { + var total = e.total; + var position = e.loaded || e.position; + var percent = Math.ceil(position * 100 / total); + opts.onProgress.call(target, percent); + } + }, false); + } + return xhr; + }, + data: formData, + dataType: 'html', + cache: false, + contentType: false, + processData: false, + complete: function(res){ + opts.success.call(target, res.responseText); + } + }); + } + + + /** + * load form data + * if data is a URL string type load from remote site, + * otherwise load from local data object. + */ + function load(target, data){ + var opts = $.data(target, 'form').options; + + if (typeof data == 'string'){ + var param = {}; + if (opts.onBeforeLoad.call(target, param) == false) return; + + $.ajax({ + url: data, + data: param, + dataType: 'json', + success: function(data){ + _load(data); + }, + error: function(){ + opts.onLoadError.apply(target, arguments); + } + }); + } else { + _load(data); + } + + function _load(data){ + var form = $(target); + for(var name in data){ + var val = data[name]; + if (!_checkField(name, val)){ + if (!_loadBox(name, val)){ + form.find('input[name="'+name+'"]').val(val); + form.find('textarea[name="'+name+'"]').val(val); + form.find('select[name="'+name+'"]').val(val); + } + } + } + opts.onLoadSuccess.call(target, data); + form.form('validate'); + } + + /** + * check the checkbox and radio fields + */ + function _checkField(name, val){ + var cc = $(target).find('[switchbuttonName="'+name+'"]'); + if (cc.length){ + cc.switchbutton('uncheck'); + cc.each(function(){ + if (_isChecked($(this).switchbutton('options').value, val)){ + $(this).switchbutton('check'); + } + }); + return true; + } + cc = $(target).find('input[name="'+name+'"][type=radio], input[name="'+name+'"][type=checkbox]'); + if (cc.length){ + cc._propAttr('checked', false); + cc.each(function(){ + if (_isChecked($(this).val(), val)){ + $(this)._propAttr('checked', true); + } + }); + return true; + } + return false; + } + function _isChecked(v, val){ + if (v == String(val) || $.inArray(v, $.isArray(val)?val:[val]) >= 0){ + return true; + } else { + return false; + } + } + + function _loadBox(name, val){ + var field = $(target).find('[textboxName="'+name+'"],[sliderName="'+name+'"]'); + if (field.length){ + for(var i=0; i=0; i--){ + var type = opts.fieldTypes[i]; + var field = form.find('.'+type+'-f'); + if (field.length && field[type]){ + field[type]('reset'); + } + } + form.form('validate'); + } + + /** + * set the form to make it can submit with ajax. + */ + function setForm(target){ + var options = $.data(target, 'form').options; + $(target).unbind('.form'); + if (options.ajax){ + $(target).bind('submit.form', function(){ + setTimeout(function(){ + ajaxSubmit(target, options); + }, 0); + return false; + }); + } + $(target).bind('_change.form', function(e, t){ + if ($.inArray(t, options.dirtyFields) == -1){ + options.dirtyFields.push(t); + } + options.onChange.call(this, t); + }).bind('change.form', function(e){ + var t = e.target; + if (!$(t).hasClass('textbox-text')){ + if ($.inArray(t, options.dirtyFields) == -1){ + options.dirtyFields.push(t); + } + options.onChange.call(this, t); + } + }); + setValidation(target, options.novalidate); + } + + function initForm(target, options){ + options = options || {}; + var state = $.data(target, 'form'); + if (state){ + $.extend(state.options, options); + } else { + $.data(target, 'form', { + options: $.extend({}, $.fn.form.defaults, $.fn.form.parseOptions(target), options) + }); + } + } + + function validate(target){ + if ($.fn.validatebox){ + var t = $(target); + t.find('.validatebox-text:not(:disabled)').validatebox('validate'); + var invalidbox = t.find('.validatebox-invalid'); + invalidbox.filter(':not(:disabled):first').focus(); + return invalidbox.length == 0; + } + return true; + } + + function setValidation(target, novalidate){ + var opts = $.data(target, 'form').options; + opts.novalidate = novalidate; + $(target).find('.validatebox-text:not(:disabled)').validatebox(novalidate ? 'disableValidation' : 'enableValidation'); + } + + $.fn.form = function(options, param){ + if (typeof options == 'string'){ + this.each(function(){ + initForm(this); + }); + return $.fn.form.methods[options](this, param); + } + + return this.each(function(){ + initForm(this, options); + setForm(this); + }); + }; + + $.fn.form.methods = { + options: function(jq){ + return $.data(jq[0], 'form').options; + }, + submit: function(jq, options){ + return jq.each(function(){ + ajaxSubmit(this, options); + }); + }, + load: function(jq, data){ + return jq.each(function(){ + load(this, data); + }); + }, + clear: function(jq){ + return jq.each(function(){ + clear(this); + }); + }, + reset: function(jq){ + return jq.each(function(){ + reset(this); + }); + }, + validate: function(jq){ + return validate(jq[0]); + }, + disableValidation: function(jq){ + return jq.each(function(){ + setValidation(this, true); + }); + }, + enableValidation: function(jq){ + return jq.each(function(){ + setValidation(this, false); + }); + }, + resetValidation: function(jq){ + return jq.each(function(){ + $(this).find('.validatebox-text:not(:disabled)').validatebox('resetValidation'); + }); + }, + resetDirty: function(jq){ + return jq.each(function(){ + $(this).form('options').dirtyFields = []; + }); + } + }; + + $.fn.form.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, [ + {ajax:'boolean',dirty:'boolean'} + ]), { + url: (t.attr('action') ? t.attr('action') : undefined) + }); + }; + + $.fn.form.defaults = { + fieldTypes: ['tagbox','combobox','combotree','combogrid','combotreegrid','datetimebox','datebox','combo', + 'datetimespinner','timespinner','numberspinner','spinner', + 'slider','searchbox','numberbox','passwordbox','filebox','textbox','switchbutton'], + novalidate: false, + ajax: true, + iframe: true, + dirty: false, + dirtyFields: [], + url: null, + queryParams: {}, + onSubmit: function(param){return $(this).form('validate');}, + onProgress: function(percent){}, + success: function(data){}, + onBeforeLoad: function(param){}, + onLoadSuccess: function(data){}, + onLoadError: function(){}, + onChange: function(target){} + }; +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.linkbutton.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.linkbutton.js new file mode 100644 index 000000000..471751561 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.linkbutton.js @@ -0,0 +1,243 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * linkbutton - EasyUI for jQuery + * + */ +(function($){ + function setSize(target, param){ + var opts = $.data(target, 'linkbutton').options; + if (param){ + $.extend(opts, param); + } + if (opts.width || opts.height || opts.fit){ + var btn = $(target); + var parent = btn.parent(); + var isVisible = btn.is(':visible'); + if (!isVisible){ + var spacer = $('
                                                                                                            ').insertBefore(target); + var style = { + position: btn.css('position'), + display: btn.css('display'), + left: btn.css('left') + }; + btn.appendTo('body'); + btn.css({ + position: 'absolute', + display: 'inline-block', + left: -20000 + }); + } + btn._size(opts, parent); + var left = btn.find('.l-btn-left'); + left.css('margin-top', 0); + left.css('margin-top', parseInt((btn.height()-left.height())/2)+'px'); + if (!isVisible){ + btn.insertAfter(spacer); + btn.css(style); + spacer.remove(); + } + } + } + + function createButton(target) { + var opts = $.data(target, 'linkbutton').options; + var t = $(target).empty(); + + t.addClass('l-btn').removeClass('l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline'); + t.removeClass('l-btn-small l-btn-medium l-btn-large').addClass('l-btn-'+opts.size); + if (opts.plain){t.addClass('l-btn-plain')} + if (opts.outline){t.addClass('l-btn-outline')} + if (opts.selected){ + t.addClass(opts.plain ? 'l-btn-selected l-btn-plain-selected' : 'l-btn-selected'); + } + t.attr('group', opts.group || ''); + t.attr('id', opts.id || ''); + + var inner = $('').appendTo(t); + if (opts.text){ + $('').html(opts.text).appendTo(inner); + } else { + $(' ').appendTo(inner); + } + if (opts.iconCls){ + $(' ').addClass(opts.iconCls).appendTo(inner); + inner.addClass('l-btn-icon-'+opts.iconAlign); + } + + t.unbind('.linkbutton').bind('focus.linkbutton',function(){ + if (!opts.disabled){ + $(this).addClass('l-btn-focus'); + } + }).bind('blur.linkbutton',function(){ + $(this).removeClass('l-btn-focus'); + }).bind('click.linkbutton',function(){ + if (!opts.disabled){ + if (opts.toggle){ + if (opts.selected){ + $(this).linkbutton('unselect'); + } else { + $(this).linkbutton('select'); + } + } + opts.onClick.call(this); + } +// return false; + }); +// if (opts.toggle && !opts.disabled){ +// t.bind('click.linkbutton', function(){ +// if (opts.selected){ +// $(this).linkbutton('unselect'); +// } else { +// $(this).linkbutton('select'); +// } +// }); +// } + + setSelected(target, opts.selected) + setDisabled(target, opts.disabled); + } + + function setSelected(target, selected){ + var opts = $.data(target, 'linkbutton').options; + if (selected){ + if (opts.group){ + $('a.l-btn[group="'+opts.group+'"]').each(function(){ + var o = $(this).linkbutton('options'); + if (o.toggle){ + $(this).removeClass('l-btn-selected l-btn-plain-selected'); + o.selected = false; + } + }); + } + $(target).addClass(opts.plain ? 'l-btn-selected l-btn-plain-selected' : 'l-btn-selected'); + opts.selected = true; + } else { + if (!opts.group){ + $(target).removeClass('l-btn-selected l-btn-plain-selected'); + opts.selected = false; + } + } + } + + function setDisabled(target, disabled){ + var state = $.data(target, 'linkbutton'); + var opts = state.options; + $(target).removeClass('l-btn-disabled l-btn-plain-disabled'); + if (disabled){ + opts.disabled = true; + var href = $(target).attr('href'); + if (href){ + state.href = href; + $(target).attr('href', 'javascript:;'); + } + if (target.onclick){ + state.onclick = target.onclick; + target.onclick = null; + } + opts.plain ? $(target).addClass('l-btn-disabled l-btn-plain-disabled') : $(target).addClass('l-btn-disabled'); + } else { + opts.disabled = false; + if (state.href) { + $(target).attr('href', state.href); + } + if (state.onclick) { + target.onclick = state.onclick; + } + } + } + + $.fn.linkbutton = function(options, param){ + if (typeof options == 'string'){ + return $.fn.linkbutton.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'linkbutton'); + if (state){ + $.extend(state.options, options); + } else { + $.data(this, 'linkbutton', { + options: $.extend({}, $.fn.linkbutton.defaults, $.fn.linkbutton.parseOptions(this), options) + }); + // $(this).removeAttr('disabled'); + $(this)._propAttr('disabled', false); + $(this).bind('_resize', function(e, force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(this); + } + return false; + }); + } + + createButton(this); + setSize(this); + }); + }; + + $.fn.linkbutton.methods = { + options: function(jq){ + return $.data(jq[0], 'linkbutton').options; + }, + resize: function(jq, param){ + return jq.each(function(){ + setSize(this, param); + }); + }, + enable: function(jq){ + return jq.each(function(){ + setDisabled(this, false); + }); + }, + disable: function(jq){ + return jq.each(function(){ + setDisabled(this, true); + }); + }, + select: function(jq){ + return jq.each(function(){ + setSelected(this, true); + }); + }, + unselect: function(jq){ + return jq.each(function(){ + setSelected(this, false); + }); + } + }; + + $.fn.linkbutton.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, + ['id','iconCls','iconAlign','group','size','text',{plain:'boolean',toggle:'boolean',selected:'boolean',outline:'boolean'}] + ), { + disabled: (t.attr('disabled') ? true : undefined), + text: ($.trim(t.html()) || undefined), + iconCls: (t.attr('icon') || t.attr('iconCls')) + }); + }; + + $.fn.linkbutton.defaults = { + id: null, + disabled: false, + toggle: false, + selected: false, + outline: false, + group: null, + plain: false, + text: '', + iconCls: null, + iconAlign: 'left', + size: 'small', // small,large + onClick: function(){} + }; + +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.menu.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.menu.js new file mode 100644 index 000000000..76f083a05 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.menu.js @@ -0,0 +1,648 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * menu - EasyUI for jQuery + * + */ +(function($){ + $(function(){ + $(document).unbind('.menu').bind('mousedown.menu', function(e){ + var m = $(e.target).closest('div.menu,div.combo-p'); + if (m.length){return} + $('body>div.menu-top:visible').not('.menu-inline').menu('hide'); + hideMenu($('body>div.menu:visible').not('.menu-inline')); + }); + }); + + /** + * initialize the target menu, the function can be invoked only once + */ + function init(target){ + var opts = $.data(target, 'menu').options; + $(target).addClass('menu-top'); // the top menu + opts.inline ? $(target).addClass('menu-inline') : $(target).appendTo('body'); + $(target).bind('_resize', function(e, force){ + if ($(this).hasClass('easyui-fluid') || force){ + $(target).menu('resize', target); + } + return false; + }); + + var menus = splitMenu($(target)); + for(var i=0; i').prependTo(menu); + } + setMenuSize(target, menu); + if (!menu.hasClass('menu-inline')){ + menu.hide(); + } + bindMenuEvent(target, menu); + } + + /** + * create the menu item + */ + function createItem(target, div, options){ + var item = $(div); + var itemOpts = $.extend({}, $.parser.parseOptions(item[0], ['id','name','iconCls','href',{separator:'boolean'}]), { + disabled: (item.attr('disabled') ? true : undefined), + text: $.trim(item.html()), + onclick: item[0].onclick + }, options||{}); + itemOpts.onclick = itemOpts.onclick || itemOpts.handler || null; + item.data('menuitem', { + options: itemOpts + }); + if (itemOpts.separator){ + item.addClass('menu-sep'); + } + if (!item.hasClass('menu-sep')){ + item.addClass('menu-item'); + item.empty().append($('').html(itemOpts.text)); + if (itemOpts.iconCls){ + $('').addClass(itemOpts.iconCls).appendTo(item); + } + if (itemOpts.id){ + item.attr('id', itemOpts.id); + } + if (itemOpts.onclick){ + if (typeof itemOpts.onclick == 'string'){ + item.attr('onclick', itemOpts.onclick); + } else { + item[0].onclick = eval(itemOpts.onclick); + } + } + if (itemOpts.disabled){ + setDisabled(target, item[0], true); + } + if (item[0].submenu){ + $('').appendTo(item); // has sub menu + } + } + } + + function setMenuSize(target, menu){ + var opts = $.data(target, 'menu').options; + var style = menu.attr('style') || ''; + var isVisible = menu.is(':visible'); + menu.css({ + display: 'block', + left: -10000, + height: 'auto', + overflow: 'hidden' + }); + menu.find('.menu-item').each(function(){ + $(this)._outerHeight(opts.itemHeight); + $(this).find('.menu-text').css({ + height: (opts.itemHeight-2)+'px', + lineHeight: (opts.itemHeight-2)+'px' + }); + }); + menu.removeClass('menu-noline').addClass(opts.noline?'menu-noline':''); + + var mopts = menu.data('menu').options; + var width = mopts.width; + var height = mopts.height; + if (isNaN(parseInt(width))){ + width = 0; + menu.find('div.menu-text').each(function(){ + if (width < $(this).outerWidth()){ + width = $(this).outerWidth(); + } + }); + // width += 40; + width = width ? width+40 : ''; + } + var autoHeight = menu.outerHeight(); + if (isNaN(parseInt(height))){ + height = autoHeight; + if (menu.hasClass('menu-top') && opts.alignTo){ + var at = $(opts.alignTo); + var h1 = at.offset().top - $(document).scrollTop(); + var h2 = $(window)._outerHeight() + $(document).scrollTop() - at.offset().top - at._outerHeight(); + height = Math.min(height, Math.max(h1, h2)); + } else if (height > $(window)._outerHeight()){ + height = $(window).height(); + } + } + + menu.attr('style', style); // restore the original style + menu.show(); + menu._size($.extend({}, mopts, { + width: width, + height: height, + minWidth: mopts.minWidth || opts.minWidth, + maxWidth: mopts.maxWidth || opts.maxWidth + })); + menu.find('.easyui-fluid').triggerHandler('_resize', [true]); + menu.css('overflow', menu.outerHeight() < autoHeight ? 'auto' : 'hidden'); + menu.children('div.menu-line')._outerHeight(autoHeight-2); + if (!isVisible){ + menu.hide(); + } + } + + /** + * bind menu event + */ + function bindMenuEvent(target, menu){ + var state = $.data(target, 'menu'); + var opts = state.options; + menu.unbind('.menu'); + for(var event in opts.events){ + menu.bind(event+'.menu', {target:target}, opts.events[event]); + } + } + function mouseenterHandler(e){ + var target = e.data.target; + var state = $.data(target, 'menu'); + if (state.timer){ + clearTimeout(state.timer); + state.timer = null; + } + } + function mouseleaveHandler(e){ + var target = e.data.target; + var state = $.data(target, 'menu'); + if (state.options.hideOnUnhover){ + state.timer = setTimeout(function(){ + hideAll(target, $(target).hasClass('menu-inline')); + }, state.options.duration); + } + } + function mouseoverHandler(e){ + var target = e.data.target; + var item = $(e.target).closest('.menu-item'); + if (item.length){ + item.siblings().each(function(){ + if (this.submenu){ + hideMenu(this.submenu); + } + $(this).removeClass('menu-active'); + }); + // show this menu + item.addClass('menu-active'); + + if (item.hasClass('menu-item-disabled')){ + item.addClass('menu-active-disabled'); + return; + } + + var submenu = item[0].submenu; + if (submenu){ + $(target).menu('show', { + menu: submenu, + parent: item + }); + } + } + } + function mouseoutHandler(e){ + var item = $(e.target).closest('.menu-item'); + if (item.length){ + item.removeClass('menu-active menu-active-disabled'); + var submenu = item[0].submenu; + if (submenu){ + if (e.pageX>=parseInt(submenu.css('left'))){ + item.addClass('menu-active'); + } else { + hideMenu(submenu); + } + } else { + item.removeClass('menu-active'); + } + } + } + function clickHandler(e){ + var target = e.data.target; + var item = $(e.target).closest('.menu-item'); + if (item.length){ + var opts = $(target).data('menu').options; + var itemOpts = item.data('menuitem').options; + if (itemOpts.disabled){return;} + if (!item[0].submenu){ + hideAll(target, opts.inline); + if (itemOpts.href){ + location.href = itemOpts.href; + } + } + item.trigger('mouseenter'); + opts.onClick.call(target, $(target).menu('getItem', item[0])); + } + } + + /** + * hide top menu and it's all sub menus + */ + function hideAll(target, inline){ + var state = $.data(target, 'menu'); + if (state){ + if ($(target).is(':visible')){ + hideMenu($(target)); + if (inline){ + $(target).show(); + } else { + state.options.onHide.call(target); + } + } + } + return false; + } + + /** + * show the menu, the 'param' object has one or more properties: + * left: the left position to display + * top: the top position to display + * menu: the menu to display, if not defined, the 'target menu' is used + * parent: the parent menu item to align to + * alignTo: the element object to align to + */ + function showMenu(target, param){ + param = param || {}; + var left,top; + var opts = $.data(target, 'menu').options; + var menu = $(param.menu || target); + $(target).menu('resize', menu[0]); + if (menu.hasClass('menu-top')){ + $.extend(opts, param); + left = opts.left; + top = opts.top; + if (opts.alignTo){ + var at = $(opts.alignTo); + left = at.offset().left; + top = at.offset().top + at._outerHeight(); + if (opts.align == 'right'){ + left += at.outerWidth() - menu.outerWidth(); + } + } + if (left + menu.outerWidth() > $(window)._outerWidth() + $(document)._scrollLeft()){ + left = $(window)._outerWidth() + $(document).scrollLeft() - menu.outerWidth() - 5; + } + if (left < 0){left = 0;} + top = _fixTop(top, opts.alignTo); + } else { + var parent = param.parent; // the parent menu item + left = parent.offset().left + parent.outerWidth() - 2; + if (left + menu.outerWidth() + 5 > $(window)._outerWidth() + $(document).scrollLeft()){ + left = parent.offset().left - menu.outerWidth() + 2; + } + top = _fixTop(parent.offset().top - 3); + } + + function _fixTop(top, alignTo){ + if (top + menu.outerHeight() > $(window)._outerHeight() + $(document).scrollTop()){ + if (alignTo){ + top = $(alignTo).offset().top - menu._outerHeight(); + } else { + top = $(window)._outerHeight() + $(document).scrollTop() - menu.outerHeight(); + } + } + if (top < 0){top = 0;} + return top; + } + + menu.css(opts.position.call(target, menu[0], left, top)); + menu.show(0, function(){ + if (!menu[0].shadow){ + menu[0].shadow = $('').insertAfter(menu); + } + menu[0].shadow.css({ + display:(menu.hasClass('menu-inline')?'none':'block'), + zIndex:$.fn.menu.defaults.zIndex++, + left:menu.css('left'), + top:menu.css('top'), + width:menu.outerWidth(), + height:menu.outerHeight() + }); + menu.css('z-index', $.fn.menu.defaults.zIndex++); + if (menu.hasClass('menu-top')){ + opts.onShow.call(target); + } + }); + } + + function hideMenu(menu){ + if (menu && menu.length){ + hideit(menu); + menu.find('div.menu-item').each(function(){ + if (this.submenu){ + hideMenu(this.submenu); + } + $(this).removeClass('menu-active'); + }); + } + + function hideit(m){ + m.stop(true,true); + if (m[0].shadow){ + m[0].shadow.hide(); + } + m.hide(); + } + } + + function findItem(target, param){ + var result = null; + var fn = $.isFunction(param) ? param : function(item){ + for(var p in param){ + if (item[p] != param[p]){ + return false;; + } + } + return true; + } + function find(menu){ + menu.children('div.menu-item').each(function(){ + var opts = $(this).data('menuitem').options; + if (fn.call(target, opts) == true){ + result = $(target).menu('getItem', this); + } else if (this.submenu && !result){ + find(this.submenu); + } + }); + } + find($(target)); + return result; + } + + function setDisabled(target, itemEl, disabled){ + var t = $(itemEl); + if (t.hasClass('menu-item')){ + var opts = t.data('menuitem').options; + opts.disabled = disabled; + if (disabled){ + t.addClass('menu-item-disabled'); + t[0].onclick = null; + } else { + t.removeClass('menu-item-disabled'); + t[0].onclick = opts.onclick; + } + } + } + + function appendItem(target, param){ + var opts = $.data(target, 'menu').options; + var menu = $(target); + if (param.parent){ + if (!param.parent.submenu){ + var submenu = $('
                                                                                                            ').appendTo('body'); + param.parent.submenu = submenu; + $('').appendTo(param.parent); + createMenu(target, submenu); + } + menu = param.parent.submenu; + } + var div = $('
                                                                                                            ').appendTo(menu); + createItem(target, div, param); + } + + function removeItem(target, itemEl){ + function removeit(el){ + if (el.submenu){ + el.submenu.children('div.menu-item').each(function(){ + removeit(this); + }); + var shadow = el.submenu[0].shadow; + if (shadow) shadow.remove(); + el.submenu.remove(); + } + $(el).remove(); + } + removeit(itemEl); + } + + function setVisible(target, itemEl, visible){ + var menu = $(itemEl).parent(); + if (visible){ + $(itemEl).show(); + } else { + $(itemEl).hide(); + } + setMenuSize(target, menu); + } + + function destroyMenu(target){ + $(target).children('div.menu-item').each(function(){ + removeItem(target, this); + }); + if (target.shadow) target.shadow.remove(); + $(target).remove(); + } + + $.fn.menu = function(options, param){ + if (typeof options == 'string'){ + return $.fn.menu.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'menu'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'menu', { + options: $.extend({}, $.fn.menu.defaults, $.fn.menu.parseOptions(this), options) + }); + init(this); + } + $(this).css({ + left: state.options.left, + top: state.options.top + }); + }); + }; + + $.fn.menu.methods = { + options: function(jq){ + return $.data(jq[0], 'menu').options; + }, + show: function(jq, pos){ + return jq.each(function(){ + showMenu(this, pos); + }); + }, + hide: function(jq){ + return jq.each(function(){ + hideAll(this); + }); + }, + destroy: function(jq){ + return jq.each(function(){ + destroyMenu(this); + }); + }, + /** + * set the menu item text + * param: { + * target: DOM object, indicate the menu item + * text: string, the new text + * } + */ + setText: function(jq, param){ + return jq.each(function(){ + var item = $(param.target).data('menuitem').options; + item.text = param.text; + $(param.target).children('div.menu-text').html(param.text); + }); + }, + /** + * set the menu icon class + * param: { + * target: DOM object, indicate the menu item + * iconCls: the menu item icon class + * } + */ + setIcon: function(jq, param){ + return jq.each(function(){ + var item = $(param.target).data('menuitem').options; + item.iconCls = param.iconCls; + $(param.target).children('div.menu-icon').remove(); + if (param.iconCls){ + $('').addClass(param.iconCls).appendTo(param.target); + } + }); + }, + /** + * get the menu item data that contains the following property: + * { + * target: DOM object, the menu item + * id: the menu id + * text: the menu item text + * iconCls: the icon class + * href: a remote address to redirect to + * onclick: a function to be called when the item is clicked + * } + */ + getItem: function(jq, itemEl){ + var item = $(itemEl).data('menuitem').options; + return $.extend({}, item, { + target: $(itemEl)[0] + }); + }, + findItem: function(jq, text){ + if (typeof text == 'string'){ + return findItem(jq[0], function(item){ + return $('
                                                                                                            '+item.text+'
                                                                                                            ').text() == text; + }); + } else { + return findItem(jq[0], text); + } + }, + /** + * append menu item, the param contains following properties: + * parent,id,text,iconCls,href,onclick + * when parent property is assigned, append menu item to it + */ + appendItem: function(jq, param){ + return jq.each(function(){ + appendItem(this, param); + }); + }, + removeItem: function(jq, itemEl){ + return jq.each(function(){ + removeItem(this, itemEl); + }); + }, + enableItem: function(jq, itemEl){ + return jq.each(function(){ + setDisabled(this, itemEl, false); + }); + }, + disableItem: function(jq, itemEl){ + return jq.each(function(){ + setDisabled(this, itemEl, true); + }); + }, + showItem: function(jq, itemEl){ + return jq.each(function(){ + setVisible(this, itemEl, true); + }); + }, + hideItem: function(jq, itemEl){ + return jq.each(function(){ + setVisible(this, itemEl, false); + }); + }, + resize: function(jq, menuEl){ + return jq.each(function(){ + setMenuSize(this, menuEl ? $(menuEl) : $(this)); + }); + } + }; + + $.fn.menu.parseOptions = function(target){ + return $.extend({}, $.parser.parseOptions(target, [ + {minWidth:'number',itemHeight:'number',duration:'number',hideOnUnhover:'boolean'}, + {fit:'boolean',inline:'boolean',noline:'boolean'} + ])); + }; + + $.fn.menu.defaults = { + zIndex:110000, + left: 0, + top: 0, + alignTo: null, + align: 'left', + minWidth: 150, + // itemHeight: 22, + itemHeight: 32, + duration: 100, // Defines duration time in milliseconds to hide when the mouse leaves the menu. + hideOnUnhover: true, // Automatically hides the menu when mouse exits it + inline: false, // true to stay inside its parent, false to go on top of all elements + fit: false, + noline: false, + events: { + mouseenter: mouseenterHandler, + mouseleave: mouseleaveHandler, + mouseover: mouseoverHandler, + mouseout: mouseoutHandler, + click: clickHandler + }, + position: function(target, left, top){ + return {left:left,top:top} + }, + onShow: function(){}, + onHide: function(){}, + onClick: function(item){} + }; +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.parser.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.parser.js new file mode 100644 index 000000000..a15646346 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.parser.js @@ -0,0 +1,431 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * parser - EasyUI for jQuery + * + */ + +(function($){ + $.easyui = { + /** + * Get the index of array item, return -1 when the item is not found. + */ + indexOfArray: function(a, o, id){ + for(var i=0,len=a.length; i=0; i--){ + nodes.unshift(node.children[i]); + } + } + } + } + }; + + $.parser = { + auto: true, + onComplete: function(context){}, + plugins:['draggable','droppable','resizable','pagination','tooltip', + 'linkbutton','menu','sidemenu','menubutton','splitbutton','switchbutton','progressbar', + 'tree','textbox','passwordbox','maskedbox','filebox','combo','combobox','combotree','combogrid','combotreegrid','tagbox','numberbox','validatebox','searchbox', + 'spinner','numberspinner','timespinner','datetimespinner','calendar','datebox','datetimebox','slider', + 'layout','panel','datagrid','propertygrid','treegrid','datalist','tabs','accordion','window','dialog','form' + ], + parse: function(context){ + var aa = []; + for(var i=0; i<$.parser.plugins.length; i++){ + var name = $.parser.plugins[i]; + var r = $('.easyui-' + name, context); + if (r.length){ + if (r[name]){ + r.each(function(){ + $(this)[name]($.data(this, 'options')||{}); + }); + } else { + aa.push({name:name,jq:r}); + } + } + } + if (aa.length && window.easyloader){ + var names = []; + for(var i=0; i= 0){ + v = Math.floor((parent.width()-delta) * v / 100.0); + } else { + v = Math.floor((parent.height()-delta) * v / 100.0); + } + } else { + v = parseInt(v) || undefined; + } + return v; + }, + + /** + * parse options, including standard 'data-options' attribute. + * + * calling examples: + * $.parser.parseOptions(target); + * $.parser.parseOptions(target, ['id','title','width',{fit:'boolean',border:'boolean'},{min:'number'}]); + */ + parseOptions: function(target, properties){ + var t = $(target); + var options = {}; + + var s = $.trim(t.attr('data-options')); + if (s){ + if (s.substring(0, 1) != '{'){ + s = '{' + s + '}'; + } + options = (new Function('return ' + s))(); + } + $.map(['width','height','left','top','minWidth','maxWidth','minHeight','maxHeight'], function(p){ + var pv = $.trim(target.style[p] || ''); + if (pv){ + if (pv.indexOf('%') == -1){ + pv = parseInt(pv); + if (isNaN(pv)){ + pv = undefined; + } + } + options[p] = pv; + } + }); + + if (properties){ + var opts = {}; + for(var i=0; i').appendTo('body'); + $._boxModel = d.outerWidth()!=100; + d.remove(); + d = $('
                                                                                                            ').appendTo('body'); + $._positionFixed = (d.css('position') == 'fixed'); + d.remove(); + + if (!window.easyloader && $.parser.auto){ + $.parser.parse(); + } + }); + + /** + * extend plugin to set box model width + */ + $.fn._outerWidth = function(width){ + if (width == undefined){ + if (this[0] == window){ + return this.width() || document.body.clientWidth; + } + return this.outerWidth()||0; + } + return this._size('width', width); + }; + + /** + * extend plugin to set box model height + */ + $.fn._outerHeight = function(height){ + if (height == undefined){ + if (this[0] == window){ + return this.height() || document.body.clientHeight; + } + return this.outerHeight()||0; + } + return this._size('height', height); + }; + + $.fn._scrollLeft = function(left){ + if (left == undefined){ + return this.scrollLeft(); + } else { + return this.each(function(){$(this).scrollLeft(left)}); + } + }; + + $.fn._propAttr = $.fn.prop || $.fn.attr; + + $.fn._size = function(options, parent){ + if (typeof options == 'string'){ + if (options == 'clear'){ + return this.each(function(){ + $(this).css({width:'',minWidth:'',maxWidth:'',height:'',minHeight:'',maxHeight:''}); + }); + } else if (options == 'fit'){ + return this.each(function(){ + _fit(this, this.tagName=='BODY' ? $('body') : $(this).parent(), true); + }); + } else if (options == 'unfit'){ + return this.each(function(){ + _fit(this, $(this).parent(), false); + }); + } else { + if (parent == undefined){ + return _css(this[0], options); + } else { + return this.each(function(){ + _css(this, options, parent); + }); + } + } + } else { + return this.each(function(){ + parent = parent || $(this).parent(); + $.extend(options, _fit(this, parent, options.fit)||{}); + var r1 = _setSize(this, 'width', parent, options); + var r2 = _setSize(this, 'height', parent, options); + if (r1 || r2){ + $(this).addClass('easyui-fluid'); + } else { + $(this).removeClass('easyui-fluid'); + } + }); + } + + function _fit(target, parent, fit){ + if (!parent.length){return false;} + var t = $(target)[0]; + var p = parent[0]; + var fcount = p.fcount || 0; + if (fit){ + if (!t.fitted){ + t.fitted = true; + p.fcount = fcount + 1; + $(p).addClass('panel-noscroll'); + if (p.tagName == 'BODY'){ + $('html').addClass('panel-fit'); + } + } + return { + width: ($(p).width()||1), + height: ($(p).height()||1) + }; + } else { + if (t.fitted){ + t.fitted = false; + p.fcount = fcount - 1; + if (p.fcount == 0){ + $(p).removeClass('panel-noscroll'); + if (p.tagName == 'BODY'){ + $('html').removeClass('panel-fit'); + } + } + } + return false; + } + } + function _setSize(target, property, parent, options){ + var t = $(target); + var p = property; + var p1 = p.substr(0,1).toUpperCase() + p.substr(1); + var min = $.parser.parseValue('min'+p1, options['min'+p1], parent);// || 0; + var max = $.parser.parseValue('max'+p1, options['max'+p1], parent);// || 99999; + var val = $.parser.parseValue(p, options[p], parent); + var fluid = (String(options[p]||'').indexOf('%') >= 0 ? true : false); + + if (!isNaN(val)){ + var v = Math.min(Math.max(val, min||0), max||99999); + if (!fluid){ + options[p] = v; + } + t._size('min'+p1, ''); + t._size('max'+p1, ''); + t._size(p, v); + } else { + t._size(p, ''); + t._size('min'+p1, min); + t._size('max'+p1, max); + } + return fluid || options.fit; + } + function _css(target, property, value){ + var t = $(target); + if (value == undefined){ + value = parseInt(target.style[property]); + if (isNaN(value)){return undefined;} + if ($._boxModel){ + value += getDeltaSize(); + } + return value; + } else if (value === ''){ + t.css(property, ''); + } else { + if ($._boxModel){ + value -= getDeltaSize(); + if (value < 0){value = 0;} + } + t.css(property, value+'px'); + } + function getDeltaSize(){ + if (property.toLowerCase().indexOf('width') >= 0){ + return t.outerWidth() - t.width(); + } else { + return t.outerHeight() - t.height(); + } + } + } + }; + +})(jQuery); + +/** + * support for mobile devices + */ +(function($){ + var longTouchTimer = null; + var dblTouchTimer = null; + var isDblClick = false; + + function onTouchStart(e){ + if (e.touches.length != 1){return} + if (!isDblClick){ + isDblClick = true; + dblClickTimer = setTimeout(function(){ + isDblClick = false; + }, 500); + } else { + clearTimeout(dblClickTimer); + isDblClick = false; + fire(e, 'dblclick'); +// e.preventDefault(); + } + longTouchTimer = setTimeout(function(){ + fire(e, 'contextmenu', 3); + }, 1000); + fire(e, 'mousedown'); + if ($.fn.draggable.isDragging || $.fn.resizable.isResizing){ + e.preventDefault(); + } + } + function onTouchMove(e){ + if (e.touches.length != 1){return} + if (longTouchTimer){ + clearTimeout(longTouchTimer); + } + fire(e, 'mousemove'); + if ($.fn.draggable.isDragging || $.fn.resizable.isResizing){ + e.preventDefault(); + } + } + function onTouchEnd(e){ +// if (e.touches.length > 0){return} + if (longTouchTimer){ + clearTimeout(longTouchTimer); + } + fire(e, 'mouseup'); + if ($.fn.draggable.isDragging || $.fn.resizable.isResizing){ + e.preventDefault(); + } + } + + function fire(e, name, which){ + var event = new $.Event(name); + event.pageX = e.changedTouches[0].pageX; + event.pageY = e.changedTouches[0].pageY; + event.which = which || 1; + $(e.target).trigger(event); + } + + if (document.addEventListener){ + document.addEventListener("touchstart", onTouchStart, true); + document.addEventListener("touchmove", onTouchMove, true); + document.addEventListener("touchend", onTouchEnd, true); + } +})(jQuery); + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.progressbar.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.progressbar.js new file mode 100644 index 000000000..d9e644cab --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.progressbar.js @@ -0,0 +1,107 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * progressbar - EasyUI for jQuery + * + * Dependencies: + * none + * + */ +(function($){ + function init(target){ + $(target).addClass('progressbar'); + $(target).html('
                                                                                                            '); + $(target).bind('_resize', function(e,force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(target); + } + return false; + }); + return $(target); + } + + function setSize(target,width){ + var opts = $.data(target, 'progressbar').options; + var bar = $.data(target, 'progressbar').bar; + if (width) opts.width = width; + bar._size(opts); + + bar.find('div.progressbar-text').css('width', bar.width()); + bar.find('div.progressbar-text,div.progressbar-value').css({ + height: bar.height()+'px', + lineHeight: bar.height()+'px' + }); + } + + $.fn.progressbar = function(options, param){ + if (typeof options == 'string'){ + var method = $.fn.progressbar.methods[options]; + if (method){ + return method(this, param); + } + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'progressbar'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'progressbar', { + options: $.extend({}, $.fn.progressbar.defaults, $.fn.progressbar.parseOptions(this), options), + bar: init(this) + }); + } + $(this).progressbar('setValue', state.options.value); + setSize(this); + }); + }; + + $.fn.progressbar.methods = { + options: function(jq){ + return $.data(jq[0], 'progressbar').options; + }, + resize: function(jq, width){ + return jq.each(function(){ + setSize(this, width); + }); + }, + getValue: function(jq){ + return $.data(jq[0], 'progressbar').options.value; + }, + setValue: function(jq, value){ + if (value < 0) value = 0; + if (value > 100) value = 100; + return jq.each(function(){ + var opts = $.data(this, 'progressbar').options; + var text = opts.text.replace(/{value}/, value); + var oldValue = opts.value; + opts.value = value; + $(this).find('div.progressbar-value').width(value+'%'); + $(this).find('div.progressbar-text').html(text); + if (oldValue != value){ + opts.onChange.call(this, value, oldValue); + } + }); + } + }; + + $.fn.progressbar.parseOptions = function(target){ + return $.extend({}, $.parser.parseOptions(target, ['width','height','text',{value:'number'}])); + }; + + $.fn.progressbar.defaults = { + width: 'auto', + height: 22, + value: 0, // percentage value + text: '{value}%', + onChange:function(newValue,oldValue){} + }; +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.propertygrid.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.propertygrid.js new file mode 100644 index 000000000..508a223ce --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.propertygrid.js @@ -0,0 +1,525 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * propertygrid - EasyUI for jQuery + * + * Dependencies: + * datagrid + * + */ +(function($){ + var currTarget; + $(document).unbind('.propertygrid').bind('mousedown.propertygrid', function(e){ + var p = $(e.target).closest('div.datagrid-view,div.combo-panel'); + if (p.length){return;} + stopEditing(currTarget); + currTarget = undefined; + }); + + function buildGrid(target){ + var state = $.data(target, 'propertygrid'); + var opts = $.data(target, 'propertygrid').options; + $(target).datagrid($.extend({}, opts, { + cls:'propertygrid', + view:(opts.showGroup ? opts.groupView : opts.view), + onBeforeEdit:function(index, row){ + if (opts.onBeforeEdit.call(target, index, row) == false){return false;} + var dg = $(this); + var row = dg.datagrid('getRows')[index]; + var col = dg.datagrid('getColumnOption', 'value'); + col.editor = row.editor; + }, + onClickCell:function(index, field, value){ + if (currTarget != this){ + stopEditing(currTarget); + currTarget = this; + } + if (opts.editIndex != index){ + stopEditing(currTarget); + $(this).datagrid('beginEdit', index); + var ed = $(this).datagrid('getEditor', {index:index,field:field}); + if (!ed){ + ed = $(this).datagrid('getEditor', {index:index,field:'value'}); + } + if (ed){ + var t = $(ed.target); + var input = t.data('textbox') ? t.textbox('textbox') : t; + input.focus(); + opts.editIndex = index; + } + } + opts.onClickCell.call(target, index, field, value); + }, + loadFilter:function(data){ + stopEditing(this); + return opts.loadFilter.call(this, data); + } + })); + } + + function stopEditing(target){ + var t = $(target); + if (!t.length){return} + var opts = $.data(target, 'propertygrid').options; + opts.finder.getTr(target, null, 'editing').each(function(){ + var index = parseInt($(this).attr('datagrid-row-index')); + if (t.datagrid('validateRow', index)){ + t.datagrid('endEdit', index); + } else { + t.datagrid('cancelEdit', index); + } + }); + opts.editIndex = undefined; + } + + $.fn.propertygrid = function(options, param){ + if (typeof options == 'string'){ + var method = $.fn.propertygrid.methods[options]; + if (method){ + return method(this, param); + } else { + return this.datagrid(options, param); + } + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'propertygrid'); + if (state){ + $.extend(state.options, options); + } else { + var opts = $.extend({}, $.fn.propertygrid.defaults, $.fn.propertygrid.parseOptions(this), options); + opts.frozenColumns = $.extend(true, [], opts.frozenColumns); + opts.columns = $.extend(true, [], opts.columns); + $.data(this, 'propertygrid', { + options: opts + }); + } + buildGrid(this); + }); + } + + $.fn.propertygrid.methods = { + options: function(jq){ + return $.data(jq[0], 'propertygrid').options; + } + }; + + $.fn.propertygrid.parseOptions = function(target){ + return $.extend({}, $.fn.datagrid.parseOptions(target), $.parser.parseOptions(target,[{showGroup:'boolean'}])); + }; + + // the group view definition + var groupview = $.extend({}, $.fn.datagrid.defaults.view, { + render: function(target, container, frozen){ + var table = []; + var groups = this.groups; + for(var i=0; i'); + if ((frozen && (opts.rownumbers || opts.frozenColumns.length)) || + (!frozen && !(opts.rownumbers || opts.frozenColumns.length))){ + table.push(''); + table.push(' '); + table.push(''); + } + if ((frozen && hasFrozen) || (!frozen)){ + table.push(''); + table.push(opts.groupFormatter.call(target, group.value, group.rows)); + table.push(''); + } + table.push(''); + + table.push(''); + var index = group.startIndex; + for(var j=0; j'); + table.push(this.renderRow.call(this, target, fields, frozen, index, group.rows[j])); + table.push(''); + index++; + } + table.push('
                                                                                                            '); + return table.join(''); + + function parseCss(css, cls){ + var classValue = ''; + var styleValue = ''; + if (typeof css == 'string'){ + styleValue = css; + } else if (css){ + classValue = css['class'] || ''; + styleValue = css['style'] || ''; + } + return 'class="' + cls + (classValue ? ' '+classValue : '') + '" ' + + 'style="' + styleValue + '"'; + } + }, + + bindEvents: function(target){ + var state = $.data(target, 'datagrid'); + var dc = state.dc; + var body = dc.body1.add(dc.body2); + var clickHandler = ($.data(body[0],'events')||$._data(body[0],'events')).click[0].handler; + body.unbind('click').bind('click', function(e){ + var tt = $(e.target); + var expander = tt.closest('span.datagrid-row-expander'); + if (expander.length){ + var gindex = expander.closest('div.datagrid-group').attr('group-index'); + if (expander.hasClass('datagrid-row-collapse')){ + $(target).datagrid('collapseGroup', gindex); + } else { + $(target).datagrid('expandGroup', gindex); + } + } else { + clickHandler(e); + } + e.stopPropagation(); + }); + }, + + onBeforeRender: function(target, rows){ + var state = $.data(target, 'datagrid'); + var opts = state.options; + + initCss(); + + var groups = []; + for(var i=0; i' + + '.datagrid-group{height:'+opts.groupHeight+'px;overflow:hidden;font-weight:bold;border-bottom:1px solid #ccc;white-space:nowrap;word-break:normal;}' + + '.datagrid-group-title,.datagrid-group-expander{display:inline-block;vertical-align:bottom;height:100%;line-height:'+opts.groupHeight+'px;padding:0 4px;}' + + '.datagrid-group-title{position:relative;}' + + '.datagrid-group-expander{width:'+opts.expanderWidth+'px;text-align:center;padding:0}' + + '.datagrid-row-expander{margin:'+Math.floor((opts.groupHeight-16)/2)+'px 0;display:inline-block;width:16px;height:16px;cursor:pointer}' + + '' + ); + } + } + }, + onAfterRender: function(target){ + $.fn.datagrid.defaults.view.onAfterRender.call(this, target); + + var view = this; + var state = $.data(target, 'datagrid'); + var opts = state.options; + if (!state.onResizeColumn){ + state.onResizeColumn = opts.onResizeColumn; + } + if (!state.onResize){ + state.onResize = opts.onResize; + } + opts.onResizeColumn = function(field, width){ + view.resizeGroup(target); + state.onResizeColumn.call(target, field, width); + } + opts.onResize = function(width, height){ + view.resizeGroup(target); + state.onResize.call($(target).datagrid('getPanel')[0], width, height); + } + view.resizeGroup(target); + } + }); + + $.extend($.fn.datagrid.methods, { + groups:function(jq){ + return jq.datagrid('options').view.groups; + }, + expandGroup:function(jq, groupIndex){ + return jq.each(function(){ + var opts = $(this).datagrid('options'); + var view = $.data(this, 'datagrid').dc.view; + var group = view.find(groupIndex!=undefined ? 'div.datagrid-group[group-index="'+groupIndex+'"]' : 'div.datagrid-group'); + var expander = group.find('span.datagrid-row-expander'); + if (expander.hasClass('datagrid-row-expand')){ + expander.removeClass('datagrid-row-expand').addClass('datagrid-row-collapse'); + group.next('table').show(); + } + $(this).datagrid('fixRowHeight'); + if (opts.onExpandGroup){ + opts.onExpandGroup.call(this, groupIndex); + } + }); + }, + collapseGroup:function(jq, groupIndex){ + return jq.each(function(){ + var opts = $(this).datagrid('options'); + var view = $.data(this, 'datagrid').dc.view; + var group = view.find(groupIndex!=undefined ? 'div.datagrid-group[group-index="'+groupIndex+'"]' : 'div.datagrid-group'); + var expander = group.find('span.datagrid-row-expander'); + if (expander.hasClass('datagrid-row-collapse')){ + expander.removeClass('datagrid-row-collapse').addClass('datagrid-row-expand'); + group.next('table').hide(); + } + $(this).datagrid('fixRowHeight'); + if (opts.onCollapseGroup){ + opts.onCollapseGroup.call(this, groupIndex); + } + }); + }, + scrollToGroup: function(jq, groupIndex){ + return jq.each(function(){ + var state = $.data(this, 'datagrid'); + var dc = state.dc; + var grow = dc.body2.children('div.datagrid-group[group-index="'+groupIndex+'"]'); + if (grow.length){ + var groupHeight = grow.outerHeight(); + var headerHeight = dc.view2.children('div.datagrid-header')._outerHeight(); + var frozenHeight = dc.body2.outerHeight(true) - dc.body2.outerHeight(); + var top = grow.position().top - headerHeight - frozenHeight; + if (top < 0){ + dc.body2.scrollTop(dc.body2.scrollTop() + top); + } else if (top + groupHeight > dc.body2.height() - 18){ + dc.body2.scrollTop(dc.body2.scrollTop() + top + groupHeight - dc.body2.height() + 18); + } + } + }); + } + }); + + $.extend(groupview, { + refreshGroupTitle: function(target, groupIndex){ + var state = $.data(target, 'datagrid'); + var opts = state.options; + var dc = state.dc; + var group = this.groups[groupIndex]; + var span = dc.body1.add(dc.body2).children('div.datagrid-group[group-index=' + groupIndex + ']').find('span.datagrid-group-title'); + span.html(opts.groupFormatter.call(target, group.value, group.rows)); + }, + resizeGroup: function(target, groupIndex){ + var state = $.data(target, 'datagrid'); + var dc = state.dc; + var ht = dc.header2.find('table'); + var fr = ht.find('tr.datagrid-filter-row').hide(); + var ww = ht.width(); + if (groupIndex == undefined){ + var groupHeader = dc.body2.children('div.datagrid-group'); + } else { + var groupHeader = dc.body2.children('div.datagrid-group[group-index=' + groupIndex + ']'); + } + groupHeader._outerWidth(ww); + var opts = state.options; + if (opts.frozenColumns && opts.frozenColumns.length){ + var width = dc.view1.width() - opts.expanderWidth; + var isRtl = dc.view1.css('direction').toLowerCase()=='rtl'; + groupHeader.find('.datagrid-group-title').css(isRtl?'right':'left', -width+'px'); + } + if (fr.length){ + if (opts.showFilterBar){ + fr.show(); + } + } + // fr.show(); + }, + + insertRow: function(target, index, row){ + var state = $.data(target, 'datagrid'); + var opts = state.options; + var dc = state.dc; + var group = null; + var groupIndex; + + if (!state.data.rows.length){ + $(target).datagrid('loadData', [row]); + return; + } + + for(var i=0; i group.startIndex + group.rows.length){ + index = group.startIndex + group.rows.length; + } + $.fn.datagrid.defaults.view.insertRow.call(this, target, index, row); + + if (index >= group.startIndex + group.rows.length){ + _moveTr(index, true); + _moveTr(index, false); + } + group.rows.splice(index - group.startIndex, 0, row); + } else { + group = { + value: row[opts.groupField], + rows: [row], + startIndex: state.data.rows.length + } + groupIndex = this.groups.length; + dc.body1.append(this.renderGroup.call(this, target, groupIndex, group, true)); + dc.body2.append(this.renderGroup.call(this, target, groupIndex, group, false)); + this.groups.push(group); + state.data.rows.push(row); + } + + this.setGroupIndex(target); + this.refreshGroupTitle(target, groupIndex); + this.resizeGroup(target); + + function _moveTr(index,frozen){ + var serno = frozen?1:2; + var prevTr = opts.finder.getTr(target, index-1, 'body', serno); + var tr = opts.finder.getTr(target, index, 'body', serno); + tr.insertAfter(prevTr); + } + }, + + updateRow: function(target, index, row){ + var opts = $.data(target, 'datagrid').options; + $.fn.datagrid.defaults.view.updateRow.call(this, target, index, row); + var tb = opts.finder.getTr(target, index, 'body', 2).closest('table.datagrid-btable'); + var groupIndex = parseInt(tb.prev().attr('group-index')); + this.refreshGroupTitle(target, groupIndex); + }, + + deleteRow: function(target, index){ + var state = $.data(target, 'datagrid'); + var opts = state.options; + var dc = state.dc; + var body = dc.body1.add(dc.body2); + + var tb = opts.finder.getTr(target, index, 'body', 2).closest('table.datagrid-btable'); + var groupIndex = parseInt(tb.prev().attr('group-index')); + + $.fn.datagrid.defaults.view.deleteRow.call(this, target, index); + + var group = this.groups[groupIndex]; + if (group.rows.length > 1){ + group.rows.splice(index-group.startIndex, 1); + this.refreshGroupTitle(target, groupIndex); + } else { + body.children('div.datagrid-group[group-index='+groupIndex+']').remove(); + for(var i=groupIndex+1; i offset.top && e.pageY < offset.top + edge) { + dir += 'n'; + } else if (e.pageY < offset.top + height && e.pageY > offset.top + height - edge) { + dir += 's'; + } + if (e.pageX > offset.left && e.pageX < offset.left + edge) { + dir += 'w'; + } else if (e.pageX < offset.left + width && e.pageX > offset.left + width - edge) { + dir += 'e'; + } + + var handles = opts.handles.split(','); + handles = $.map(handles, function(h){return $.trim(h).toLowerCase();}); + if ($.inArray('all', handles) >= 0 || $.inArray(dir, handles) >= 0){ + return dir; + } + for(var i=0; i= 0){ + return handles[index]; + } + } + return ''; + } + + $.fn.resizable = function(options, param){ + if (typeof options == 'string'){ + return $.fn.resizable.methods[options](this, param); + } + + return this.each(function(){ + var opts = null; + var state = $.data(this, 'resizable'); + if (state) { + $(this).unbind('.resizable'); + opts = $.extend(state.options, options || {}); + } else { + opts = $.extend({}, $.fn.resizable.defaults, $.fn.resizable.parseOptions(this), options || {}); + $.data(this, 'resizable', { + options:opts + }); + } + + if (opts.disabled == true) { + return; + } + $(this).bind('mousemove.resizable', {target:this}, function(e){ + if ($.fn.resizable.isResizing){return} + var dir = getDirection(e); + $(e.data.target).css('cursor', dir ? dir+'-resize' : ''); + }).bind('mouseleave.resizable', {target:this}, function(e){ + $(e.data.target).css('cursor', ''); + }).bind('mousedown.resizable', {target:this}, function(e){ + var dir = getDirection(e); + if (dir == ''){return;} + + function getCssValue(css) { + var val = parseInt($(e.data.target).css(css)); + if (isNaN(val)) { + return 0; + } else { + return val; + } + } + + var data = { + target: e.data.target, + dir: dir, + startLeft: getCssValue('left'), + startTop: getCssValue('top'), + left: getCssValue('left'), + top: getCssValue('top'), + startX: e.pageX, + startY: e.pageY, + startWidth: $(e.data.target).outerWidth(), + startHeight: $(e.data.target).outerHeight(), + width: $(e.data.target).outerWidth(), + height: $(e.data.target).outerHeight(), + deltaWidth: $(e.data.target).outerWidth() - $(e.data.target).width(), + deltaHeight: $(e.data.target).outerHeight() - $(e.data.target).height() + }; + $(document).bind('mousedown.resizable', data, doDown); + $(document).bind('mousemove.resizable', data, doMove); + $(document).bind('mouseup.resizable', data, doUp); + $('body').css('cursor', dir+'-resize'); + }); + }); + }; + + $.fn.resizable.methods = { + options: function(jq){ + return $.data(jq[0], 'resizable').options; + }, + enable: function(jq){ + return jq.each(function(){ + $(this).resizable({disabled:false}); + }); + }, + disable: function(jq){ + return jq.each(function(){ + $(this).resizable({disabled:true}); + }); + } + }; + + $.fn.resizable.parseOptions = function(target){ + var t = $(target); + return $.extend({}, + $.parser.parseOptions(target, [ + 'handles',{minWidth:'number',minHeight:'number',maxWidth:'number',maxHeight:'number',edge:'number'} + ]), { + disabled: (t.attr('disabled') ? true : undefined) + }) + }; + + $.fn.resizable.defaults = { + disabled:false, + handles:'n, e, s, w, ne, se, sw, nw, all', + minWidth: 10, + minHeight: 10, + maxWidth: 10000,//$(document).width(), + maxHeight: 10000,//$(document).height(), + edge:5, + onStartResize: function(e){}, + onResize: function(e){}, + onStopResize: function(e){} + }; + + $.fn.resizable.isResizing = false; + +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.slider.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.slider.js new file mode 100644 index 000000000..dc9b8142e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.slider.js @@ -0,0 +1,455 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * slider - EasyUI for jQuery + * + * Dependencies: + * draggable + * + */ +(function($){ + function init(target){ + var slider = $('
                                                                                                            ' + + '
                                                                                                            ' + + '' + + '' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '' + + '
                                                                                                            ').insertAfter(target); + var t = $(target); + t.addClass('slider-f').hide(); + var name = t.attr('name'); + if (name){ + slider.find('input.slider-value').attr('name', name); + t.removeAttr('name').attr('sliderName', name); + } + slider.bind('_resize', function(e,force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(target); + } + return false; + }); + return slider; + } + + /** + * set the slider size, for vertical slider, the height property is required + */ + function setSize(target, param){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + + if (param){ + if (param.width) opts.width = param.width; + if (param.height) opts.height = param.height; + } + slider._size(opts); + if (opts.mode == 'h'){ + slider.css('height', ''); + slider.children('div').css('height', ''); + } else { + slider.css('width', ''); + slider.children('div').css('width', ''); + slider.children('div.slider-rule,div.slider-rulelabel,div.slider-inner')._outerHeight(slider._outerHeight()); + } + initValue(target); + } + + /** + * show slider rule if needed + */ + function showRule(target){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + + var aa = opts.mode == 'h' ? opts.rule : opts.rule.slice(0).reverse(); + if (opts.reversed){ + aa = aa.slice(0).reverse(); + } + _build(aa); + + function _build(aa){ + var rule = slider.find('div.slider-rule'); + var label = slider.find('div.slider-rulelabel'); + rule.empty(); + label.empty(); + for(var i=0; i').appendTo(rule); + span.css((opts.mode=='h'?'left':'top'), distance); + + // show the labels + if (aa[i] != '|'){ + span = $('').appendTo(label); + span.html(aa[i]); + if (opts.mode == 'h'){ + span.css({ + left: distance, + marginLeft: -Math.round(span.outerWidth()/2) + }); + } else { + span.css({ + top: distance, + marginTop: -Math.round(span.outerHeight()/2) + }); + } + } + } + } + } + + /** + * build the slider and set some properties + */ + function buildSlider(target){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + + slider.removeClass('slider-h slider-v slider-disabled'); + slider.addClass(opts.mode == 'h' ? 'slider-h' : 'slider-v'); + slider.addClass(opts.disabled ? 'slider-disabled' : ''); + + var inner = slider.find('.slider-inner'); + inner.html( + '' + + '' + ); + if (opts.range){ + inner.append( + '' + + '' + ); + } + + slider.find('a.slider-handle').draggable({ + axis:opts.mode, + cursor:'pointer', + disabled: opts.disabled, + onDrag:function(e){ + var left = e.data.left; + var width = slider.width(); + if (opts.mode!='h'){ + left = e.data.top; + width = slider.height(); + } + if (left < 0 || left > width) { + return false; + } else { + setPos(left, this); + return false; + } + }, + onStartDrag:function(){ + state.isDragging = true; + opts.onSlideStart.call(target, opts.value); + }, + onStopDrag:function(e){ + setPos(opts.mode=='h'?e.data.left:e.data.top, this); + opts.onSlideEnd.call(target, opts.value); + opts.onComplete.call(target, opts.value); + state.isDragging = false; + } + }); + slider.find('div.slider-inner').unbind('.slider').bind('mousedown.slider', function(e){ + if (state.isDragging || opts.disabled){return} + var pos = $(this).offset(); + setPos(opts.mode=='h'?(e.pageX-pos.left):(e.pageY-pos.top)); + opts.onComplete.call(target, opts.value); + }); + + function fixVal(value){ + var dd = String(opts.step).split('.'); + var dlen = dd.length>1 ? dd[1].length : 0; + return parseFloat(value.toFixed(dlen)); + } + + function setPos(pos, handle){ + var value = pos2value(target, pos); + var s = Math.abs(value % opts.step); + if (s < opts.step/2){ + value -= s; + } else { + value = value - s + opts.step; + } + value = fixVal(value); + if (opts.range){ + var v1 = opts.value[0]; + var v2 = opts.value[1]; + var m = parseFloat((v1+v2)/2); + if (handle){ + var isLeft = $(handle).nextAll('.slider-handle').length > 0; + if (value <= v2 && isLeft){ + v1 = value; + } else if (value >= v1 && (!isLeft)){ + v2 = value; + } + } else { + if (value < v1){ + v1 = value; + } else if (value > v2){ + v2 = value; + } else { + value < m ? v1 = value : v2 = value; + } + } + $(target).slider('setValues', [v1,v2]); + } else { + $(target).slider('setValue', value); + } + } + } + + /** + * set a specified value to slider + */ + function setValues(target, values){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + var oldValues = $.isArray(opts.value) ? opts.value : [opts.value]; + var newValues = []; + + if (!$.isArray(values)){ + values = $.map(String(values).split(opts.separator), function(v){ + return parseFloat(v); + }); + } + + slider.find('.slider-value').remove(); + var name = $(target).attr('sliderName') || ''; + for(var i=0; i opts.max) value = opts.max; + + var input = $('').appendTo(slider); + input.attr('name', name); + input.val(value); + newValues.push(value); + + var handle = slider.find('.slider-handle:eq('+i+')'); + var tip = handle.next(); + var pos = value2pos(target, value); + if (opts.showTip){ + tip.show(); + tip.html(opts.tipFormatter.call(target, value)); + } else { + tip.hide(); + } + + if (opts.mode == 'h'){ + var style = 'left:'+pos+'px;'; + handle.attr('style', style); + tip.attr('style', style + 'margin-left:' + (-Math.round(tip.outerWidth()/2)) + 'px'); + } else { + var style = 'top:' + pos + 'px;'; + handle.attr('style', style); + tip.attr('style', style + 'margin-left:' + (-Math.round(tip.outerWidth())) + 'px'); + } + } + opts.value = opts.range ? newValues : newValues[0]; + $(target).val(opts.range ? newValues.join(opts.separator) : newValues[0]); + + if (oldValues.join(',') != newValues.join(',')){ + opts.onChange.call(target, opts.value, (opts.range?oldValues:oldValues[0])); + } + } + + function initValue(target){ + var opts = $.data(target, 'slider').options; + var fn = opts.onChange; + opts.onChange = function(){}; + setValues(target, opts.value); + opts.onChange = fn; + } + + /** + * translate value to slider position + */ + function value2pos(target, value){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + var size = opts.mode == 'h' ? slider.width() : slider.height(); + var pos = opts.converter.toPosition.call(target, value, size); + if (opts.mode == 'v'){ + pos = slider.height() - pos; + } + if (opts.reversed){ + pos = size - pos; + } + return pos; + // return pos.toFixed(0); + } + + /** + * translate slider position to value + */ + function pos2value(target, pos){ + var state = $.data(target, 'slider'); + var opts = state.options; + var slider = state.slider; + var size = opts.mode == 'h' ? slider.width() : slider.height(); + var pos = opts.mode=='h' ? (opts.reversed?(size-pos):pos) : (opts.reversed?pos:(size-pos)); + var value = opts.converter.toValue.call(target, pos, size); + return value; + // return value.toFixed(0); + } + + $.fn.slider = function(options, param){ + if (typeof options == 'string'){ + return $.fn.slider.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'slider'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'slider', { + options: $.extend({}, $.fn.slider.defaults, $.fn.slider.parseOptions(this), options), + slider: init(this) + }); + // $(this).removeAttr('disabled'); + $(this)._propAttr('disabled', false); + } + + var opts = state.options; + opts.min = parseFloat(opts.min); + opts.max = parseFloat(opts.max); + if (opts.range){ + if (!$.isArray(opts.value)){ + opts.value = $.map(String(opts.value).split(opts.separator), function(v){ + return parseFloat(v); + }); + } + if (opts.value.length < 2){ + opts.value.push(opts.max); + } + } else { + opts.value = parseFloat(opts.value); + } + opts.step = parseFloat(opts.step); + opts.originalValue = opts.value; + + buildSlider(this); + showRule(this); + setSize(this); + }); + }; + + $.fn.slider.methods = { + options: function(jq){ + return $.data(jq[0], 'slider').options; + }, + destroy: function(jq){ + return jq.each(function(){ + $.data(this, 'slider').slider.remove(); + $(this).remove(); + }); + }, + resize: function(jq, param){ + return jq.each(function(){ + setSize(this, param); + }); + }, + getValue: function(jq){ + return jq.slider('options').value; + }, + getValues: function(jq){ + return jq.slider('options').value; + }, + setValue: function(jq, value){ + return jq.each(function(){ + setValues(this, [value]); + }); + }, + setValues: function(jq, values){ + return jq.each(function(){ + setValues(this, values); + }); + }, + clear: function(jq){ + return jq.each(function(){ + var opts = $(this).slider('options'); + setValues(this, opts.range?[opts.min,opts.max]:[opts.min]); + }); + }, + reset: function(jq){ + return jq.each(function(){ + var opts = $(this).slider('options'); + $(this).slider(opts.range?'setValues':'setValue', opts.originalValue); + }); + }, + enable: function(jq){ + return jq.each(function(){ + $.data(this, 'slider').options.disabled = false; + buildSlider(this); + }); + }, + disable: function(jq){ + return jq.each(function(){ + $.data(this, 'slider').options.disabled = true; + buildSlider(this); + }); + } + }; + + $.fn.slider.parseOptions = function(target){ + var t = $(target); + return $.extend({}, $.parser.parseOptions(target, [ + 'width','height','mode',{reversed:'boolean',showTip:'boolean',range:'boolean',min:'number',max:'number',step:'number'} + ]), { + value: (t.val() || undefined), + disabled: (t.attr('disabled') ? true : undefined), + rule: (t.attr('rule') ? eval(t.attr('rule')) : undefined) + }); + }; + + $.fn.slider.defaults = { + width: 'auto', + height: 'auto', + mode: 'h', // 'h'(horizontal) or 'v'(vertical) + reversed: false, + showTip: false, + disabled: false, + range: false, + value: 0, + separator: ',', + min: 0, + max: 100, + step: 1, + rule: [], // [0,'|',100] + tipFormatter: function(value){return value}, + converter:{ + toPosition:function(value, size){ + var opts = $(this).slider('options'); + var p = (value-opts.min)/(opts.max-opts.min)*size; + return p; + }, + toValue:function(pos, size){ + var opts = $(this).slider('options'); + var v = opts.min + (opts.max-opts.min)*(pos/size); + return v; + } + }, + onChange: function(value, oldValue){}, + onSlideStart: function(value){}, + onSlideEnd: function(value){}, + onComplete: function(value){} + }; +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.tabs.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.tabs.js new file mode 100644 index 000000000..1037a23fb --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.tabs.js @@ -0,0 +1,927 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * tabs - EasyUI for jQuery + * + * Dependencies: + * panel + * linkbutton + * + */ +(function($){ + function getContentWidth(c){ + var w = 0; + $(c).children().each(function(){ + w += $(this).outerWidth(true); + }); + return w; + } + /** + * set the tabs scrollers to show or not, + * dependent on the tabs count and width + */ + function setScrollers(container) { + var opts = $.data(container, 'tabs').options; + if (!opts.showHeader){return} + + var header = $(container).children('div.tabs-header'); + var tool = header.children('div.tabs-tool:not(.tabs-tool-hidden)'); + var sLeft = header.children('div.tabs-scroller-left'); + var sRight = header.children('div.tabs-scroller-right'); + var wrap = header.children('div.tabs-wrap'); + + if (opts.tabPosition == 'left' || opts.tabPosition == 'right'){ + if (!tool.length){return} + tool._outerWidth(header.width()); + var toolCss = { + left: opts.tabPosition == 'left' ? 'auto':0, + right: opts.tabPosition == 'left' ? 0 : 'auto', + top: opts.toolPosition == 'top' ? 0 : 'auto', + bottom: opts.toolPosition == 'top' ? 'auto' : 0 + }; + var wrapCss = { + marginTop: opts.toolPosition == 'top' ? tool.outerHeight() : 0 + }; + tool.css(toolCss); + wrap.css(wrapCss); + return; + } + + // set the tool height + var tHeight = header.outerHeight(); + if (opts.plain){ + tHeight -= tHeight - header.height(); + } + tool._outerHeight(tHeight); + + var tabsWidth = getContentWidth(header.find('ul.tabs')); + var cWidth = header.width() - tool._outerWidth(); + + if (tabsWidth > cWidth) { + sLeft.add(sRight).show()._outerHeight(tHeight); + if (opts.toolPosition == 'left'){ + tool.css({ + left: sLeft.outerWidth(), + right: '' + }); + wrap.css({ + marginLeft: sLeft.outerWidth() + tool._outerWidth(), + marginRight: sRight._outerWidth(), + width: cWidth - sLeft.outerWidth() - sRight.outerWidth() + }); + } else { + tool.css({ + left: '', + right: sRight.outerWidth() + }); + wrap.css({ + marginLeft: sLeft.outerWidth(), + marginRight: sRight.outerWidth() + tool._outerWidth(), + width: cWidth - sLeft.outerWidth() - sRight.outerWidth() + }); + } + } else { + sLeft.add(sRight).hide(); + if (opts.toolPosition == 'left'){ + tool.css({ + left: 0, + right: '' + }); + wrap.css({ + marginLeft: tool._outerWidth(), + marginRight: 0, + width: cWidth + }); + } else { + tool.css({ + left: '', + right: 0 + }); + wrap.css({ + marginLeft: 0, + marginRight: tool._outerWidth(), + width: cWidth + }); + } + } + } + + function addTools(container){ + var opts = $.data(container, 'tabs').options; + var header = $(container).children('div.tabs-header'); + if (opts.tools) { + if (typeof opts.tools == 'string'){ + $(opts.tools).addClass('tabs-tool').appendTo(header); + $(opts.tools).show(); + } else { + header.children('div.tabs-tool').remove(); + var tools = $('
                                                                                                            ').appendTo(header); + var tr = tools.find('tr'); + for(var i=0; i').appendTo(tr); + var tool = $('').appendTo(td); + tool[0].onclick = eval(opts.tools[i].handler || function(){}); + tool.linkbutton($.extend({}, opts.tools[i], { + plain: true + })); + } + } + } else { + header.children('div.tabs-tool').remove(); + } + } + + function setSize(container, param) { + var state = $.data(container, 'tabs'); + var opts = state.options; + var cc = $(container); + + if (!opts.doSize){return} + if (param){ + $.extend(opts, { + width: param.width, + height: param.height + }); + } + cc._size(opts); + + var header = cc.children('div.tabs-header'); + var panels = cc.children('div.tabs-panels'); + var wrap = header.find('div.tabs-wrap'); + var ul = wrap.find('.tabs'); + ul.children('li').removeClass('tabs-first tabs-last'); + ul.children('li:first').addClass('tabs-first'); + ul.children('li:last').addClass('tabs-last'); + + if (opts.tabPosition == 'left' || opts.tabPosition == 'right'){ + header._outerWidth(opts.showHeader ? opts.headerWidth : 0); + panels._outerWidth(cc.width() - header.outerWidth()); + header.add(panels)._size('height', isNaN(parseInt(opts.height)) ? '' : cc.height()); + wrap._outerWidth(header.width()); + ul._outerWidth(wrap.width()).css('height',''); + } else { + header.children('div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)').css('display', opts.showHeader?'block':'none'); + header._outerWidth(cc.width()).css('height',''); + if (opts.showHeader){ + header.css('background-color',''); + wrap.css('height',''); + } else { + header.css('background-color','transparent'); + header._outerHeight(0); + wrap._outerHeight(0); + } + ul._outerHeight(opts.tabHeight).css('width',''); + ul._outerHeight(ul.outerHeight()-ul.height()-1+opts.tabHeight).css('width',''); + + panels._size('height', isNaN(parseInt(opts.height)) ? '' : (cc.height()-header.outerHeight())); + panels._size('width', cc.width()); + } + + if (state.tabs.length){ + var d1 = ul.outerWidth(true) - ul.width(); + var li = ul.children('li:first'); + var d2 = li.outerWidth(true) - li.width(); + var hwidth = header.width() - header.children('.tabs-tool:not(.tabs-tool-hidden)')._outerWidth(); + var justifiedWidth = Math.floor((hwidth-d1-d2*state.tabs.length)/state.tabs.length); + + $.map(state.tabs, function(p){ + setTabSize(p, (opts.justified && $.inArray(opts.tabPosition,['top','bottom'])>=0) ? justifiedWidth : undefined); + }); + if (opts.justified && $.inArray(opts.tabPosition,['top','bottom'])>=0){ + var deltaWidth = hwidth - d1 - getContentWidth(ul); + setTabSize(state.tabs[state.tabs.length-1], justifiedWidth+deltaWidth); + } + } + setScrollers(container); + + function setTabSize(p, width){ + var p_opts = p.panel('options'); + var p_t = p_opts.tab.find('a.tabs-inner'); + var width = width ? width : (parseInt(p_opts.tabWidth||opts.tabWidth||undefined)); + if (width){ + p_t._outerWidth(width); + } else { + p_t.css('width', ''); + } + p_t._outerHeight(opts.tabHeight); + p_t.css('lineHeight', p_t.height()+'px'); + p_t.find('.easyui-fluid:visible').triggerHandler('_resize'); + } + } + + /** + * set selected tab panel size + */ + function setSelectedSize(container){ + var opts = $.data(container, 'tabs').options; + var tab = getSelectedTab(container); + if (tab){ + var panels = $(container).children('div.tabs-panels'); + var width = opts.width=='auto' ? 'auto' : panels.width(); + var height = opts.height=='auto' ? 'auto' : panels.height(); + tab.panel('resize', { + width: width, + height: height + }); + } + } + + /** + * wrap the tabs header and body + */ + function wrapTabs(container) { + var tabs = $.data(container, 'tabs').tabs; + var cc = $(container).addClass('tabs-container'); + var panels = $('
                                                                                                            ').insertBefore(cc); + cc.children('div').each(function(){ + panels[0].appendChild(this); + }); + cc[0].appendChild(panels[0]); + $('
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                            ' + + '
                                                                                                              ' + + '
                                                                                                              ' + + '
                                                                                                              ').prependTo(container); + + cc.children('div.tabs-panels').children('div').each(function(i){ + var opts = $.extend({}, $.parser.parseOptions(this), { + disabled: ($(this).attr('disabled') ? true : undefined), + selected: ($(this).attr('selected') ? true : undefined) + }); + createTab(container, opts, $(this)); + }); + + cc.children('div.tabs-header').find('.tabs-scroller-left, .tabs-scroller-right').hover( + function(){$(this).addClass('tabs-scroller-over');}, + function(){$(this).removeClass('tabs-scroller-over');} + ); + cc.bind('_resize', function(e,force){ + if ($(this).hasClass('easyui-fluid') || force){ + setSize(container); + setSelectedSize(container); + } + return false; + }); + } + + function bindEvents(container){ + var state = $.data(container, 'tabs') + var opts = state.options; + $(container).children('div.tabs-header').unbind().bind('click', function(e){ + if ($(e.target).hasClass('tabs-scroller-left')){ + $(container).tabs('scrollBy', -opts.scrollIncrement); + } else if ($(e.target).hasClass('tabs-scroller-right')){ + $(container).tabs('scrollBy', opts.scrollIncrement); + } else { + var li = $(e.target).closest('li'); + if (li.hasClass('tabs-disabled')){return false;} + var a = $(e.target).closest('a.tabs-close'); + if (a.length){ + closeTab(container, getLiIndex(li)); + } else if (li.length){ +// selectTab(container, getLiIndex(li)); + var index = getLiIndex(li); + var popts = state.tabs[index].panel('options'); + if (popts.collapsible){ + popts.closed ? selectTab(container, index) : unselectTab(container, index); + } else { + selectTab(container, index); + } + } + return false; + } + }).bind('contextmenu', function(e){ + var li = $(e.target).closest('li'); + if (li.hasClass('tabs-disabled')){return;} + if (li.length){ + opts.onContextMenu.call(container, e, li.find('span.tabs-title').html(), getLiIndex(li)); + } + }); + + function getLiIndex(li){ + var index = 0; + li.parent().children('li').each(function(i){ + if (li[0] == this){ + index = i; + return false; + } + }); + return index; + } + } + + function setProperties(container){ + var opts = $.data(container, 'tabs').options; + var header = $(container).children('div.tabs-header'); + var panels = $(container).children('div.tabs-panels'); + + header.removeClass('tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right'); + panels.removeClass('tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right'); + if (opts.tabPosition == 'top'){ + header.insertBefore(panels); + } else if (opts.tabPosition == 'bottom'){ + header.insertAfter(panels); + header.addClass('tabs-header-bottom'); + panels.addClass('tabs-panels-top'); + } else if (opts.tabPosition == 'left'){ + header.addClass('tabs-header-left'); + panels.addClass('tabs-panels-right'); + } else if (opts.tabPosition == 'right'){ + header.addClass('tabs-header-right'); + panels.addClass('tabs-panels-left'); + } + + if (opts.plain == true) { + header.addClass('tabs-header-plain'); + } else { + header.removeClass('tabs-header-plain'); + } + header.removeClass('tabs-header-narrow').addClass(opts.narrow?'tabs-header-narrow':''); + var tabs = header.find('.tabs'); + tabs.removeClass('tabs-pill').addClass(opts.pill?'tabs-pill':''); + tabs.removeClass('tabs-narrow').addClass(opts.narrow?'tabs-narrow':''); + tabs.removeClass('tabs-justified').addClass(opts.justified?'tabs-justified':''); + if (opts.border == true){ + header.removeClass('tabs-header-noborder'); + panels.removeClass('tabs-panels-noborder'); + } else { + header.addClass('tabs-header-noborder'); + panels.addClass('tabs-panels-noborder'); + } + opts.doSize = true; + } + + function createTab(container, options, pp) { + options = options || {}; + var state = $.data(container, 'tabs'); + var tabs = state.tabs; + if (options.index == undefined || options.index > tabs.length){options.index = tabs.length} + if (options.index < 0){options.index = 0} + + var ul = $(container).children('div.tabs-header').find('ul.tabs'); + var panels = $(container).children('div.tabs-panels'); + var tab = $( + '
                                                                                                            • ' + + '' + + '' + + '' + + '' + + '
                                                                                                            • '); + if (!pp){pp = $('
                                                                                                              ');} + if (options.index >= tabs.length){ + tab.appendTo(ul); + pp.appendTo(panels); + tabs.push(pp); + } else { + tab.insertBefore(ul.children('li:eq('+options.index+')')); + pp.insertBefore(panels.children('div.panel:eq('+options.index+')')); + tabs.splice(options.index, 0, pp); + } + + // create panel + pp.panel($.extend({}, options, { + tab: tab, + border: false, + noheader: true, + closed: true, + doSize: false, + iconCls: (options.icon ? options.icon : undefined), + onLoad: function(){ + if (options.onLoad){ + options.onLoad.apply(this, arguments); + } + state.options.onLoad.call(container, $(this)); + }, + onBeforeOpen: function(){ + if (options.onBeforeOpen){ + if (options.onBeforeOpen.call(this) == false){return false;} + } + var p = $(container).tabs('getSelected'); + if (p){ + if (p[0] != this){ + $(container).tabs('unselect', getTabIndex(container, p)); + p = $(container).tabs('getSelected'); + if (p){ + return false; + } + } else { + setSelectedSize(container); + return false; + } + } + + var popts = $(this).panel('options'); + popts.tab.addClass('tabs-selected'); + // scroll the tab to center position if required. + var wrap = $(container).find('>div.tabs-header>div.tabs-wrap'); + var left = popts.tab.position().left; + var right = left + popts.tab.outerWidth(); + if (left < 0 || right > wrap.width()){ + var deltaX = left - (wrap.width()-popts.tab.width()) / 2; + $(container).tabs('scrollBy', deltaX); + } else { + $(container).tabs('scrollBy', 0); + } + + var panel = $(this).panel('panel'); + panel.css('display','block'); + setSelectedSize(container); + panel.css('display','none'); + }, + onOpen: function(){ + if (options.onOpen){ + options.onOpen.call(this); + } + var popts = $(this).panel('options'); + var index = getTabIndex(container, this); + // state.selectHis.push(popts.title); + state.selectHis.push(index); + state.options.onSelect.call(container, popts.title, index); + }, + onBeforeClose: function(){ + if (options.onBeforeClose){ + if (options.onBeforeClose.call(this) == false){return false;} + } + $(this).panel('options').tab.removeClass('tabs-selected'); + }, + onClose: function(){ + if (options.onClose){ + options.onClose.call(this); + } + var popts = $(this).panel('options'); + state.options.onUnselect.call(container, popts.title, getTabIndex(container, this)); + } + })); + + // only update the tab header + $(container).tabs('update', { + tab: pp, + options: pp.panel('options'), + type: 'header' + }); + } + + function addTab(container, options) { + var state = $.data(container, 'tabs'); + var opts = state.options; + if (options.selected == undefined) options.selected = true; + + createTab(container, options); + opts.onAdd.call(container, options.title, options.index); + if (options.selected){ + selectTab(container, options.index); // select the added tab panel + } + } + + /** + * update tab panel, param has following properties: + * tab: the tab panel to be updated + * options: the tab panel options + * type: the update type, possible values are: 'header','body','all' + */ + function updateTab(container, param){ + param.type = param.type || 'all'; + var selectHis = $.data(container, 'tabs').selectHis; + var pp = param.tab; // the tab panel + var opts = pp.panel('options'); // get the tab panel options + var oldTitle = opts.title; + $.extend(opts, param.options, { + iconCls: (param.options.icon ? param.options.icon : undefined) + }); + + if (param.type == 'all' || param.type == 'body'){ + pp.panel(); + } + if (param.type == 'all' || param.type == 'header'){ + var tab = opts.tab; + + if (opts.header){ + tab.find('.tabs-inner').html($(opts.header)); + } else { + var s_title = tab.find('span.tabs-title'); + var s_icon = tab.find('span.tabs-icon'); + s_title.html(opts.title); + s_icon.attr('class', 'tabs-icon'); + + tab.find('a.tabs-close').remove(); + if (opts.closable){ + s_title.addClass('tabs-closable'); + $('').appendTo(tab); + } else{ + s_title.removeClass('tabs-closable'); + } + if (opts.iconCls){ + s_title.addClass('tabs-with-icon'); + s_icon.addClass(opts.iconCls); + } else { + s_title.removeClass('tabs-with-icon'); + } + if (opts.tools){ + var p_tool = tab.find('span.tabs-p-tool'); + if (!p_tool.length){ + var p_tool = $('').insertAfter(tab.find('a.tabs-inner')); + } + if ($.isArray(opts.tools)){ + p_tool.empty(); + for(var i=0; i').appendTo(p_tool); + t.addClass(opts.tools[i].iconCls); + if (opts.tools[i].handler){ + t.bind('click', {handler:opts.tools[i].handler}, function(e){ + if ($(this).parents('li').hasClass('tabs-disabled')){return;} + e.data.handler.call(this); + }); + } + } + } else { + $(opts.tools).children().appendTo(p_tool); + } + var pr = p_tool.children().length * 12; + if (opts.closable) { + pr += 8; + p_tool.css('right', ''); + } else { + pr -= 3; + p_tool.css('right','5px'); + } + s_title.css('padding-right', pr+'px'); + } else { + tab.find('span.tabs-p-tool').remove(); + s_title.css('padding-right', ''); + } + } + // if (oldTitle != opts.title){ + // for(var i=0; i index ? tindex-1 : tindex); + } + } + state.selectHis = his; + var selected = $(container).tabs('getSelected'); + if (!selected && his.length){ + index = state.selectHis.pop(); + $(container).tabs('select', index); + } + + // for(var i=0; i=0 && which < tabs.length){ + tab = tabs[which]; + if (removeit){ + tabs.splice(which, 1); + } + } + } else { + var tmp = $(''); + for(var i=0; i.tabs-header>.tabs-tool'); + if (visible){ + tool.removeClass('tabs-tool-hidden').show(); + } else { + tool.addClass('tabs-tool-hidden').hide(); + } + $(container).tabs('resize').tabs('scrollBy', 0); + } + + + $.fn.tabs = function(options, param){ + if (typeof options == 'string') { + return $.fn.tabs.methods[options](this, param); + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'tabs'); + if (state) { + $.extend(state.options, options); + } else { + $.data(this, 'tabs', { + options: $.extend({},$.fn.tabs.defaults, $.fn.tabs.parseOptions(this), options), + tabs: [], + selectHis: [] + }); + wrapTabs(this); + } + + addTools(this); + setProperties(this); + setSize(this); + bindEvents(this); + + doFirstSelect(this); + }); + }; + + $.fn.tabs.methods = { + options: function(jq){ + var cc = jq[0]; + var opts = $.data(cc, 'tabs').options; + var s = getSelectedTab(cc); + opts.selected = s ? getTabIndex(cc, s) : -1; + return opts; + }, + tabs: function(jq){ + return $.data(jq[0], 'tabs').tabs; + }, + resize: function(jq, param){ + return jq.each(function(){ + setSize(this, param); + setSelectedSize(this); + }); + }, + add: function(jq, options){ + return jq.each(function(){ + addTab(this, options); + }); + }, + close: function(jq, which){ + return jq.each(function(){ + closeTab(this, which); + }); + }, + getTab: function(jq, which){ + return getTab(jq[0], which); + }, + getTabIndex: function(jq, tab){ + return getTabIndex(jq[0], tab); + }, + getSelected: function(jq){ + return getSelectedTab(jq[0]); + }, + select: function(jq, which){ + return jq.each(function(){ + selectTab(this, which); + }); + }, + unselect: function(jq, which){ + return jq.each(function(){ + unselectTab(this, which); + }); + }, + exists: function(jq, which){ + return exists(jq[0], which); + }, + update: function(jq, options){ + return jq.each(function(){ + updateTab(this, options); + }); + }, + enableTab: function(jq, which){ + return jq.each(function(){ + var opts = $(this).tabs('getTab', which).panel('options'); + opts.tab.removeClass('tabs-disabled'); + opts.disabled = false; + }); + }, + disableTab: function(jq, which){ + return jq.each(function(){ + var opts = $(this).tabs('getTab', which).panel('options'); + opts.tab.addClass('tabs-disabled'); + opts.disabled = true; + }); + }, + showHeader: function(jq){ + return jq.each(function(){ + showHeader(this, true); + }); + }, + hideHeader: function(jq){ + return jq.each(function(){ + showHeader(this, false); + }); + }, + showTool: function(jq){ + return jq.each(function(){ + showTool(this, true); + }); + }, + hideTool: function(jq){ + return jq.each(function(){ + showTool(this, false); + }); + }, + scrollBy: function(jq, deltaX){ // scroll the tab header by the specified amount of pixels + return jq.each(function(){ + var opts = $(this).tabs('options'); + var wrap = $(this).find('>div.tabs-header>div.tabs-wrap'); + var pos = Math.min(wrap._scrollLeft() + deltaX, getMaxScrollWidth()); + wrap.animate({scrollLeft: pos}, opts.scrollDuration); + + function getMaxScrollWidth(){ + var w = 0; + var ul = wrap.children('ul'); + ul.children('li').each(function(){ + w += $(this).outerWidth(true); + }); + return w - wrap.width() + (ul.outerWidth() - ul.width()); + } + }); + } + }; + + $.fn.tabs.parseOptions = function(target){ + return $.extend({}, $.parser.parseOptions(target, [ + 'tools','toolPosition','tabPosition', + {fit:'boolean',border:'boolean',plain:'boolean'}, + {headerWidth:'number',tabWidth:'number',tabHeight:'number',selected:'number'}, + {showHeader:'boolean',justified:'boolean',narrow:'boolean',pill:'boolean'} + ])); + }; + + $.fn.tabs.defaults = { + width: 'auto', + height: 'auto', + headerWidth: 150, // the tab header width, it is valid only when tabPosition set to 'left' or 'right' + tabWidth: 'auto', // the tab width + // tabHeight: 27, // the tab height + tabHeight: 32, // the tab height + selected: 0, // the initialized selected tab index + showHeader: true, + plain: false, + fit: false, + border: true, + justified: false, + narrow: false, + pill: false, + tools: null, + toolPosition: 'right', // left,right,top,bottom + tabPosition: 'top', // possible values: top,bottom + scrollIncrement: 100, + scrollDuration: 400, + onLoad: function(panel){}, + onSelect: function(title, index){}, + onUnselect: function(title, index){}, + onBeforeClose: function(title, index){}, + onClose: function(title, index){}, + onAdd: function(title, index){}, + onUpdate: function(title, index){}, + onContextMenu: function(e, title, index){} + }; +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.window.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.window.js new file mode 100644 index 000000000..fb9bbf8d8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.window.js @@ -0,0 +1,417 @@ +/** + * EasyUI for jQuery 1.5.5.5 + * + * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. + * + * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php + * To use it on other terms please contact us: info@jeasyui.com + * + */ +/** + * window - EasyUI for jQuery + * + * Dependencies: + * panel + * draggable + * resizable + * + */ +(function($){ + function moveWindow(target, param){ + var state = $.data(target, 'window'); + if (param){ + if (param.left != null) state.options.left = param.left; + if (param.top != null) state.options.top = param.top; + } + $(target).panel('move', state.options); + if (state.shadow){ + state.shadow.css({ + left: state.options.left, + top: state.options.top + }); + } + } + + /** + * center the window only horizontally + */ + function hcenter(target, tomove){ + var opts = $.data(target, 'window').options; + var pp = $(target).window('panel'); + var width = pp._outerWidth(); + if (opts.inline){ + var parent = pp.parent(); + opts.left = Math.ceil((parent.width() - width) / 2 + parent.scrollLeft()); + } else { + opts.left = Math.ceil(($(window)._outerWidth() - width) / 2 + $(document).scrollLeft()); + } + if (tomove){moveWindow(target);} + } + + /** + * center the window only vertically + */ + function vcenter(target, tomove){ + var opts = $.data(target, 'window').options; + var pp = $(target).window('panel'); + var height = pp._outerHeight(); + if (opts.inline){ + var parent = pp.parent(); + opts.top = Math.ceil((parent.height() - height) / 2 + parent.scrollTop()); + } else { + opts.top = Math.ceil(($(window)._outerHeight() - height) / 2 + $(document).scrollTop()); + } + if (tomove){moveWindow(target);} + } + + function create(target){ + var state = $.data(target, 'window'); + var opts = state.options; + var win = $(target).panel($.extend({}, state.options, { + border: false, + doSize: true, // size the panel, the property undefined in window component + closed: true, // close the panel + cls: 'window ' + (!opts.border?'window-thinborder window-noborder ':(opts.border=='thin'?'window-thinborder ':'')) + (opts.cls || ''), + headerCls: 'window-header ' + (opts.headerCls || ''), + bodyCls: 'window-body ' + (opts.noheader ? 'window-body-noheader ' : ' ') + (opts.bodyCls||''), + + onBeforeDestroy: function(){ + if (opts.onBeforeDestroy.call(target) == false){return false;} + if (state.shadow){state.shadow.remove();} + if (state.mask){state.mask.remove();} + }, + onClose: function(){ + if (state.shadow){state.shadow.hide();} + if (state.mask){state.mask.hide();} + opts.onClose.call(target); + }, + onOpen: function(){ + if (state.mask){ + state.mask.css($.extend({ + display:'block', + zIndex: $.fn.window.defaults.zIndex++ + }, $.fn.window.getMaskSize(target))); + } + if (state.shadow){ + state.shadow.css({ + display:'block', + zIndex: $.fn.window.defaults.zIndex++, + left: opts.left, + top: opts.top, + width: state.window._outerWidth(), + height: state.window._outerHeight() + }); + } + state.window.css('z-index', $.fn.window.defaults.zIndex++); + + opts.onOpen.call(target); + }, + onResize: function(width, height){ + var popts = $(this).panel('options'); + $.extend(opts, { + width: popts.width, + height: popts.height, + left: popts.left, + top: popts.top + }); + if (state.shadow){ + state.shadow.css({ + left: opts.left, + top: opts.top, + width: state.window._outerWidth(), + height: state.window._outerHeight() + }); + } + opts.onResize.call(target, width, height); + }, + onMinimize: function(){ + if (state.shadow){state.shadow.hide();} + if (state.mask){state.mask.hide();} + state.options.onMinimize.call(target); + }, + onBeforeCollapse: function(){ + if (opts.onBeforeCollapse.call(target) == false){return false;} + if (state.shadow){state.shadow.hide();} + }, + onExpand: function(){ + if (state.shadow){state.shadow.show();} + opts.onExpand.call(target); + } + })); + + state.window = win.panel('panel'); + + // create mask + if (state.mask){state.mask.remove();} + if (opts.modal){ + state.mask = $('').insertAfter(state.window); + } + + // create shadow + if (state.shadow){state.shadow.remove();} + if (opts.shadow){ + state.shadow = $('').insertAfter(state.window); + } + + // center and open the window + var closed = opts.closed; + if (opts.left == null){hcenter(target);} + if (opts.top == null){vcenter(target);} + moveWindow(target); + if (!closed){win.window('open');} + } + + function constrain(left, top, width, height){ + var target = this; + var state = $.data(target, 'window'); + var opts = state.options; + if (!opts.constrain){return {};} + if ($.isFunction(opts.constrain)){ + return opts.constrain.call(target, left, top, width, height); + } + var win = $(target).window('window'); + var parent = opts.inline ? win.parent() : $(window); + if (left < 0){left = 0;} + if (top < parent.scrollTop()){top = parent.scrollTop();} + if (left + width > parent.width()){ + if (width == win.outerWidth()){ // moving + left = parent.width() - width; + } else { // resizing + width = parent.width() - left; + } + } + if (top - parent.scrollTop() + height > parent.height()){ + if (height == win.outerHeight()){ // moving + top = parent.height() - height + parent.scrollTop(); + } else { // resizing + height = parent.height() - top + parent.scrollTop(); + } + } + + return { + left:left, + top:top, + width:width, + height:height + }; + } + + + /** + * set window drag and resize property + */ + function setProperties(target){ + var state = $.data(target, 'window'); + + state.window.draggable({ + handle: '>div.panel-header>div.panel-title', + disabled: state.options.draggable == false, + onBeforeDrag: function(e){ + if (state.mask) state.mask.css('z-index', $.fn.window.defaults.zIndex++); + if (state.shadow) state.shadow.css('z-index', $.fn.window.defaults.zIndex++); + state.window.css('z-index', $.fn.window.defaults.zIndex++); + }, + onStartDrag: function(e){ + start1(e); + }, + onDrag: function(e){ + proc1(e); + return false; + }, + onStopDrag: function(e){ + stop1(e, 'move'); + } + }); + + state.window.resizable({ + disabled: state.options.resizable == false, + onStartResize:function(e){ + start1(e); + }, + onResize: function(e){ + proc1(e); + return false; + }, + onStopResize: function(e){ + stop1(e, 'resize'); + } + }); + + function start1(e){ + if (state.pmask){state.pmask.remove();} + state.pmask = $('
                                                                                                              ').insertAfter(state.window); + state.pmask.css({ + display: 'none', + zIndex: $.fn.window.defaults.zIndex++, + left: e.data.left, + top: e.data.top, + width: state.window._outerWidth(), + height: state.window._outerHeight() + }); + if (state.proxy){state.proxy.remove();} + state.proxy = $('
                                                                                                              ').insertAfter(state.window); + state.proxy.css({ + display: 'none', + zIndex: $.fn.window.defaults.zIndex++, + left: e.data.left, + top: e.data.top + }); + state.proxy._outerWidth(e.data.width)._outerHeight(e.data.height); + state.proxy.hide(); + setTimeout(function(){ + if (state.pmask){state.pmask.show();} + if (state.proxy){state.proxy.show();} + }, 500); + } + function proc1(e){ + $.extend(e.data, constrain.call(target, e.data.left, e.data.top, e.data.width, e.data.height)); + state.pmask.show(); + state.proxy.css({ + display: 'block', + left: e.data.left, + top: e.data.top + }); + state.proxy._outerWidth(e.data.width); + state.proxy._outerHeight(e.data.height); + } + function stop1(e, method){ + $.extend(e.data, constrain.call(target, e.data.left, e.data.top, e.data.width+0.1, e.data.height+0.1)); + $(target).window(method, e.data); + state.pmask.remove(); + state.pmask = null; + state.proxy.remove(); + state.proxy = null; + } + } + + // when window resize, reset the width and height of the window's mask + $(function(){ + if (!$._positionFixed){ + $(window).resize(function(){ + $('body>div.window-mask:visible').css({ + width: '', + height: '' + }); + setTimeout(function(){ + $('body>div.window-mask:visible').css($.fn.window.getMaskSize()); + }, 50); + }); + } + }); + + $.fn.window = function(options, param){ + if (typeof options == 'string'){ + var method = $.fn.window.methods[options]; + if (method){ + return method(this, param); + } else { + return this.panel(options, param); + } + } + + options = options || {}; + return this.each(function(){ + var state = $.data(this, 'window'); + if (state){ + $.extend(state.options, options); + } else { + state = $.data(this, 'window', { + options: $.extend({}, $.fn.window.defaults, $.fn.window.parseOptions(this), options) + }); + if (!state.options.inline){ + document.body.appendChild(this); + } + } + create(this); + setProperties(this); + }); + }; + + $.fn.window.methods = { + options: function(jq){ + var popts = jq.panel('options'); + var wopts = $.data(jq[0], 'window').options; + return $.extend(wopts, { + closed: popts.closed, + collapsed: popts.collapsed, + minimized: popts.minimized, + maximized: popts.maximized + }); + }, + window: function(jq){ + return $.data(jq[0], 'window').window; + }, + move: function(jq, param){ + return jq.each(function(){ + moveWindow(this, param); + }); + }, + hcenter: function(jq){ + return jq.each(function(){ + hcenter(this, true); + }); + }, + vcenter: function(jq){ + return jq.each(function(){ + vcenter(this, true); + }); + }, + center: function(jq){ + return jq.each(function(){ + hcenter(this); + vcenter(this); + moveWindow(this); + }); + } + }; + + $.fn.window.getMaskSize = function(target){ + var state = $(target).data('window'); + if (state && state.options.inline){ + return {}; + } else if ($._positionFixed){ + return {position: 'fixed'}; + } else { + return { + width: $(document).width(), + height: $(document).height() + }; + } + }; + + $.fn.window.parseOptions = function(target){ + return $.extend({}, $.fn.panel.parseOptions(target), $.parser.parseOptions(target, [ + {draggable:'boolean',resizable:'boolean',shadow:'boolean',modal:'boolean',inline:'boolean'} + ])); + }; + + // Inherited from $.fn.panel.defaults + $.fn.window.defaults = $.extend({}, $.fn.panel.defaults, { + zIndex: 9000, + draggable: true, + resizable: true, + shadow: true, + modal: false, + border: true, // possible values are: true,false,'thin','thick' + inline: false, // true to stay inside its parent, false to go on top of all elements + + // window's property which difference from panel + title: 'New Window', + collapsible: true, + minimizable: true, + maximizable: true, + closable: true, + closed: false, + constrain: false + /* + constrain: function(left,top,width,height){ + return { + left:left, + top:top, + width:width, + height:height + }; + } + */ + }); +})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/angular.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/angular.css new file mode 100644 index 000000000..b2ea7d48a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/angular.css @@ -0,0 +1,639 @@ +*{ + box-sizing: border-box; +} +.f-block{ + display: block; + position: relative; +} +.f-row{ + display: -webkit-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + position: relative; +} +.f-column{ + display: -webkit-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: vertical; + -webkit-flex-direction: column; + -moz-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + position: relative; +} +.f-inline-row{ + white-space: nowrap; + display: -webkit-inline-box; + display: -ms-inline-box; + display: inline-flex; + vertical-align: middle; + position: relative; + align-items: stretch; + -webkit-tap-highlight-color: transparent; +} +.f-content-center{ + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; +} +.f-full{ + -webkit-box-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} +.f-hide{ + display: none; +} +.f-order0{ + order: 0; +} +.f-order1{ + order: 1; +} +.f-order2{ + order: 2; +} +.f-order3{ + order: 3; +} +.f-order4{ + order: 4; +} +.f-order5{ + order: 5; +} +.f-order6{ + order: 6; +} +.f-order7{ + order: 7; +} +.f-order8{ + order: 8; +} +.f-noshrink{ + -webkit-flex-shrink: 0; + -moz-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.f-animate{ + transition: all .3s; +} + +.scroll-body{ + overflow: auto; + position: relative; +} + +.textbox .textbox-text{ + width: 100%; + height: auto; + overflow: hidden; +} +.textbox-addon{ + align-items: center; +} +.textbox-disabled>.textbox-addon .textbox-icon, +.textbox-readonly>.textbox-addon .textbox-icon{ + cursor: default; +} +.textbox-disabled>.textbox-addon .textbox-icon:hover, +.textbox-readonly>.textbox-addon .textbox-icon:hover{ + opacity: 0.6; + cursor: default; +} +.textbox-addon .textbox-icon{ + width: 26px; + height: 18px; +} + +.spinner .textbox-text{ + height: auto; +} +.spinner-button-left,.spinner-button-right{ + width: 26px; +} +.spinner-button-updown{ + width: 26px; +} +.spinner-button-top,.spinner-button-bottom{ + position: absolute; + width: 100%; + height: 26px; +} +.spinner-button-top{ + top: 0; +} +.spinner-button-bottom{ + top: auto; + bottom: 0; +} +.spinner-button{ + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.spinner-arrow{ + cursor: pointer; + opacity: 0.6; +} + +.textbox-disabled .spinner-arrow:hover, +.textbox-readonly .spinner-arrow:hover +{ + opacity: 0.6; + cursor: default; +} +.textbox-readonly .spinner-arrow .spinner-arrow-up:hover, +.textbox-disabled .spinner-arrow .spinner-arrow-up:hover, +.textbox-readonly .spinner-arrow .spinner-arrow-down:hover, +.textbox-disabled .spinner-arrow .spinner-arrow-down:hover +{ + cursor: default; +} + +.l-btn{ + width: 100%; +} +.l-btn-empty{ + height: 28px; +} +.l-btn-large .l-btn-empty{ + height: 44px; +} +.l-btn-left{ + overflow: visible; +} +.m-btn .l-btn-left .m-btn-line{ + top: -100px; + width: 36px; + right: -20px; +} +eui-button-group eui-linkbutton.f-inline-row{ + margin-left: -1px; +} +eui-button-group .l-btn:hover{ + z-index: 99; +} +eui-button-group eui-linkbutton:not(:first-child):not(:last-child) .l-btn{ + border-radius: 0; +} +eui-button-group eui-linkbutton:first-child .l-btn{ + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +eui-button-group eui-linkbutton:last-child .l-btn{ + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.switchbutton-on,.switchbutton-off{ + position: absolute; + left: 0; + width: calc(100% - 15px); + height: 100%; +} +.switchbutton-on span,.switchbutton-off span,.switchbutton-handle span{ + height: 100%; +} +.switchbutton-on span{ + text-indent: -15px; +} +.switchbutton-off span{ + text-indent: 15px; +} +.switchbutton-off{ + left: calc(100% - 15px); +} +.switchbutton-handle{ + width: 30px; + left: auto; + right: 0; + z-index: 9; +} +.switchbutton-inner{ + transition: all 200ms ease-out; + overflow: visible; + position: absolute; + width: 100%; + top: -1px; + bottom: -1px; + left: calc(-100% + 30px); + right: auto; +} +.switchbutton-checked .switchbutton-inner{ + left: 0; +} +.draggable-reverting{ + transition: all 200ms ease-out; +} +.slider-h .slider-tip{ + transform: translateX(-50%); +} +.slider-h .slider-rulelabel span{ + transform: translateX(-50%); +} +.slider-v .slider-tip{ + margin-top: 0; + transform: translate(-100%,-50%); +} +.slider-v .slider-rulelabel span{ + transform: translateY(-50%); +} +.slider-v .slider-inner{ + height: auto; +} + + +.panel{ + position:relative; +} +.panel-title{ + height: 20px; + line-height: 20px; +} +.panel-footer-fixed{ + position:absolute; + width:100%; + bottom:0; +} +.window{ + position: absolute; +} +.window-mask{ + position: fixed; +} +.window .window-footer{ + top: 0; +} +.dialog-toolbar{ + border-width: 0 0 1px 0; +} +.dialog-button{ + border-width: 1px 0 0 0; + top: 0; +} + +.tabs{ + width: 100%; + height: auto; +} +.tabs-scrollable{ + transition: left 400ms, right 400ms; + position: absolute; + width: auto; + height: 100%; + left: 0; + top: 0; +} +.tabs li{ + display: inherit; +} +.tabs li a.tabs-inner{ + height: auto; + line-height: normal; + display: inherit; + overflow: hidden; +} +.tabs-title{ + display: inherit; + align-items: center; + line-height: normal; +} +.tabs-close{ + outline: none; +} +.tabs-scroller-left,.tabs-scroller-right{ + position: relative; + display: block; + width: 21px; + height: 100%; +} +.tabs-header-left .tabs li{ + right: -1px; +} +.tabs-header-left .tabs li,.tabs-header-right .tabs li, +.tabs-header-left .tabs li a.tabs-inner, +.tabs-header-right .tabs li a.tabs-inner{ + display: inherit; +} + +.combo-panel{ + position: absolute; + height: 200px; + z-index: 9999; +} +.combo-panel eui-virtual-scroll, +.combo-panel eui-datagrid, +.combo-panel eui-treegrid{ + width: 100%; + height: 100%; +} +.combobox-item{ + padding: 6px 4px; + line-height: 20px; +} +.tagbox-labels{ + padding-bottom: 4px; +} +.tagbox-label{ + height: 20px; + line-height: 20px; +} +.tagbox .textbox-text{ + width: 50px; + max-width: 100%; + margin-top: 4px; + padding-top: 0; + padding-bottom: 0; + height: 20px; + line-height: 20px; +} + +.datagrid,eui-datagrid, +eui-datagrid-view,eui-datagrid-body, +eui-treegrid-view,eui-treegrid-body{ + overflow: hidden; +} +.datagrid-view,.datagrid-view1,.datagrid-view2{ + position: relative; +} +.datagrid-vbody{ + overflow: hidden; +} +.datagrid-view3{ + margin-left: -1px; +} +.datagrid-view3 .datagrid-body{ + overflow: hidden; +} +.datagrid-view3 .datagrid-body-inner{ + padding-bottom: 20px; +} +.datagrid-view3 .datagrid-header td, +.datagrid-view3 .datagrid-body td, +.datagrid-view3 .datagrid-footer td { + border-width: 0 0 1px 1px; +} +.datagrid-htable,.datagrid-btable,.datagrid-ftable{ + table-layout: fixed; + width: 100%; +} +.datagrid-htable{ + height: 100%; +} +.datagrid-header .datagrid-header, +.datagrid-footer .datagrid-header{ + border-width: 0 0 0 1px; +} +.datagrid-header-inner,.datagrid-footer-inner{ + overflow: hidden; +} +.datagrid-header-row, .datagrid-row{ + height: 32px; +} +.datagrid-cell{ + text-align: left; + height: auto; + font-size: inherit; +} +.datagrid-cell-group{ + text-align: center; +} +.datagrid .datagrid-pager{ + padding: 2px 4px; + display: inherit; +} +.datagrid-loading{ + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + justify-content: center; + align-items: center; +} +.datagrid-mask{ + display: block; +} +.datagrid-mask-msg{ + display: block; + position: static; + line-height: 36px; + height: 40px; + margin: 0; + padding: 0 5px 0 30px; + z-index: 9; +} +.datagrid-body .datagrid-td-group{ + border-left-color: transparent; + border-right-color: transparent; +} +.datagrid-group-expander{ + cursor: pointer; +} +.datagrid-row-expander{ + display: inline-block; + width: 16px; + height: 18px; + cursor: pointer; +} +.datagrid-group-title{ + align-self: center; + padding: 0 4px; + white-space: nowrap; + word-break: normal; + position: relative; +} +.datagrid-editable> .f-field, +.datagrid-editable> *{ + width: 100%; + height: 31px; +} +.datagrid-editable .textbox, .datagrid-editable .textbox-text{ + border-radius: 0; +} +.datagrid-filter-row .textbox{ + border-radius: 0; +} +.datagrid-filter-c{ + padding: 4px; + height: 38px; +} +.datagrid-filter-c> .f-field, +.datagrid-filter-c> *{ + height: 30px; +} +.datagrid-filter-c .datagrid-editable-input{ + width: 100%; +} +.datagrid-filter-btn{ + width: 30px; +} +.datagrid-filter-btn .textbox-icon{ + width: 28px; +} +.datagrid-filter-btn .textbox{ + background-color: transparent; +} +.datagrid-filter-btn-left{ + margin-right: 4px; +} +.datagrid-filter-btn-right{ + margin-left: 4px; +} + +eui-menu.menu-inline{ + position: relative; + display: inline; + margin: 0; + padding: 0; +} +eui-menu> .menu-container{ + position: relative; +} +.menu-container{ + position: absolute; + left: 0; + top: 0; + min-width: 200px; +} +.menu{ + overflow: visible; +} +.menu-shadow{ + width: 100%; + height: 100%; + left: 0; + top: 0; +} +.menu-item{ + overflow: visible; +} +.menu-text{ + height: 32px; + line-height: 32px; + float: none; +} +.menu-line{ + z-index: 9999999; + height: 100%; +} +.menu-active{ + z-index: 99999999; +} + +.progressbar-value{ + overflow: visible; +} + +.searchbox .textbox-button, +.searchbox .textbox-button:hover{ + position: inherit; +} + +.calendar-content{ + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; +} +.calendar-menu{ + position: absolute; + width: 100%; + height: 100%; +} +.calendar-menu-month-inner{ + position: relative; +} + +.f-field{ + width: 12em; + height: 30px; +} +eui-tagbox{ + width: 12em; + height: auto; + min-height: 30px; +} +eui-switchbutton{ + width: 70px; + height: 30px; +} +eui-radiobutton{ + width: 20px; + height: 20px; +} +eui-checkbox{ + width: 20px; + height: 20px; +} +eui-progressbar{ + height: 24px; +} +eui-pagination{ + height: 34px; + padding: 2px; +} +eui-layout{ + display: block; +} +.layout{ + height: 100%; +} +.layout-animate{ + transition: transform 400ms; +} +.layout-panel-north,.layout-panel-south{ + position: absolute; + width: 100%; + left: 0; + top: 0; +} +.layout-panel-south{ + top: auto; + bottom: 0; +} +.layout-panel-west,.layout-panel-east{ + position: absolute; + left: 0; + top: 0; + bottom: 0; +} +.layout-panel-east{ + left: auto; + right: 0; +} +.layout-panel-west.layout-collapsed{ + transform: translate3d(-100%, 0, 0); +} +.layout-panel-east.layout-collapsed{ + transform: translate3d(100%, 0, 0) +} +.layout-panel-north.layout-collapsed{ + transform: translate3d(0, -100%, 0) +} +.layout-panel-south.layout-collapsed{ + transform: translate3d(0, 100%, 0) +} + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/accordion.css new file mode 100644 index 000000000..b2dba5200 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #666; + border-color: #000; +} +.accordion .accordion-header { + background: #3d3d3d; + filter: none; +} +.accordion .accordion-header-selected { + background: #0052A3; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #3d3d3d; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #666; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #000; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #3d3d3d; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #666; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #000; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #3d3d3d; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #666; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/calendar.css new file mode 100644 index 000000000..eed5a4b4b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #ffffff; +} +.calendar-day { + color: #fff; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #000; +} +.calendar { + border-color: #000; +} +.calendar-header { + background: #3d3d3d; +} +.calendar-body, +.calendar-menu { + background: #666; +} +.calendar-body th { + background: #555; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #777; + color: #fff; +} +.calendar-hover { + border: 1px solid #555; + padding: 0; +} +.calendar-selected { + background-color: #0052A3; + color: #fff; + border: 1px solid #00458a; + padding: 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/checkbox.css new file mode 100644 index 000000000..e84e80dd9 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #00458a; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #00458a; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combo.css new file mode 100644 index 000000000..0798ce198 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #666; +} +.combo-arrow { + background-color: #3d3d3d; +} +.combo-arrow-hover { + background-color: #777; +} +.combo-arrow:hover { + background-color: #777; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combobox.css new file mode 100644 index 000000000..6415d08a0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #777; + color: #fff; +} +.combobox-item-selected { + background-color: #0052A3; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datagrid.css new file mode 100644 index 000000000..376206d83 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datagrid.css @@ -0,0 +1,291 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #444; + border-right: 1px solid #777; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #000; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #666 url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #444; + background: -webkit-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: -moz-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: -o-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: linear-gradient(to bottom,#4c4c4c 0,#3f3f3f 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4c4c4c,endColorstr=#3f3f3f,GradientType=0); +} +.datagrid-cell-rownumber { + color: #fff; +} +.datagrid-resize-proxy { + background: #cccccc; +} +.datagrid-mask { + background: #000; +} +.datagrid-mask-msg { + border-color: #000; +} +.datagrid-toolbar, +.datagrid-pager { + background: #555; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #222; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #222; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #fff; + border-collapse: separate; +} +.datagrid-row-alt { + background: #555; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #777; + color: #fff; + cursor: default; +} +.datagrid-row-selected { + background: #0052A3; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datalist.css new file mode 100644 index 000000000..94dd67e5f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #444; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #222; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #fff; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #222; +} +.m-list li>a:hover { + background: #777; + color: #fff; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datebox.css new file mode 100644 index 000000000..ae25037df --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #555; +} +.datebox-button a { + color: #fff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/dialog.css new file mode 100644 index 000000000..4a6f36eb2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #444; + border-right: 1px solid #777; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #555; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #000 #000 #222 #000; +} +.dialog-button { + border-color: #222 #000 #000 #000; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #555; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/easyui.css new file mode 100644 index 000000000..2e1d4ccd7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/easyui.css @@ -0,0 +1,3427 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #777; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #000; +} +.panel-header { + background-color: #3d3d3d; + background: -webkit-linear-gradient(top,#454545 0,#383838 100%); + background: -moz-linear-gradient(top,#454545 0,#383838 100%); + background: -o-linear-gradient(top,#454545 0,#383838 100%); + background: linear-gradient(to bottom,#454545 0,#383838 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); +} +.panel-body { + background-color: #666; + color: #fff; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #fff; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #000; + overflow: hidden; + background: #555; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #666; + border-color: #000; +} +.accordion .accordion-header { + background: #3d3d3d; + filter: none; +} +.accordion .accordion-header-selected { + background: #0052A3; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #3d3d3d; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #666; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #000; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #3d3d3d; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #666; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #000; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #3d3d3d; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #666; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #000; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #777; + -moz-box-shadow: 2px 2px 3px #787878; + -webkit-box-shadow: 2px 2px 3px #787878; + box-shadow: 2px 2px 3px #787878; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #000; +} +.window { + background-color: #3d3d3d; + background: -webkit-linear-gradient(top,#454545 0,#383838 20%); + background: -moz-linear-gradient(top,#454545 0,#383838 20%); + background: -o-linear-gradient(top,#454545 0,#383838 20%); + background: linear-gradient(to bottom,#454545 0,#383838 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); +} +.window-proxy { + border: 1px dashed #000; +} +.window-proxy-mask, +.window-mask { + background: #000; +} +.window .panel-footer { + border: 1px solid #000; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #444; + border-right: 1px solid #777; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #555; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #000 #000 #222 #000; +} +.dialog-button { + border-color: #222 #000 #000 #000; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #555; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #fff; + background: #777; + background-repeat: repeat-x; + border: 1px solid #555; + background: -webkit-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: -moz-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: -o-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: linear-gradient(to bottom,#919191 0,#6a6a6a 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#919191,endColorstr=#6a6a6a,GradientType=0); + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn:hover { + background: #777; + color: #fff; + border: 1px solid #555; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #555; + padding: 0; +} +.l-btn-plain:hover { + background: #777; + color: #fff; + border: 1px solid #555; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #777; + color: #fff; + background: -webkit-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: -moz-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: -o-linear-gradient(top,#919191 0,#6a6a6a 100%); + background: linear-gradient(to bottom,#919191 0,#6a6a6a 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#919191,endColorstr=#6a6a6a,GradientType=0); +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #000; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #000; +} +.textbox { + position: relative; + border: 1px solid #000; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #000000; + -moz-box-shadow: 0 0 3px 0 #000; + -webkit-box-shadow: 0 0 3px 0 #000; + box-shadow: 0 0 3px 0 #000; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #666; +} +.combo-arrow { + background-color: #3d3d3d; +} +.combo-arrow-hover { + background-color: #777; +} +.combo-arrow:hover { + background-color: #777; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #777; + color: #fff; +} +.combobox-item-selected { + background-color: #0052A3; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #777; + color: #fff; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #cccccc; +} +.layout-split-north { + border-bottom: 5px solid #444; +} +.layout-split-south { + border-top: 5px solid #444; +} +.layout-split-east { + border-left: 5px solid #444; +} +.layout-split-west { + border-right: 5px solid #444; +} +.layout-expand { + background-color: #3d3d3d; +} +.layout-expand-over { + background-color: #3d3d3d; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #3d3d3d url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #3d3d3d url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #777; + color: #fff; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #666; + color: #fff; + background: -webkit-linear-gradient(top,#454545 0,#666 100%); + background: -moz-linear-gradient(top,#454545 0,#666 100%); + background: -o-linear-gradient(top,#454545 0,#666 100%); + background: linear-gradient(to bottom,#454545 0,#666 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#666 0,#454545 100%); + background: -moz-linear-gradient(top,#666 0,#454545 100%); + background: -o-linear-gradient(top,#666 0,#454545 100%); + background: linear-gradient(to bottom,#666 0,#454545 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#454545 0,#666 100%); + background: -moz-linear-gradient(left,#454545 0,#666 100%); + background: -o-linear-gradient(left,#454545 0,#666 100%); + background: linear-gradient(to right,#454545 0,#666 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#666 0,#454545 100%); + background: -moz-linear-gradient(left,#666 0,#454545 100%); + background: -o-linear-gradient(left,#666 0,#454545 100%); + background: linear-gradient(to right,#666 0,#454545 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=1); +} +.tabs li a.tabs-inner { + color: #fff; + background-color: #3d3d3d; + background: -webkit-linear-gradient(top,#454545 0,#383838 100%); + background: -moz-linear-gradient(top,#454545 0,#383838 100%); + background: -o-linear-gradient(top,#454545 0,#383838 100%); + background: linear-gradient(to bottom,#454545 0,#383838 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #3d3d3d; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #000; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #777; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #666; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #666; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #666; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #666; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0052A3; + color: #fff; + filter: none; + border-color: #000; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #444; + border-right: 1px solid #777; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #000; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #666 url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #444; + background: -webkit-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: -moz-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: -o-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); + background: linear-gradient(to bottom,#4c4c4c 0,#3f3f3f 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4c4c4c,endColorstr=#3f3f3f,GradientType=0); +} +.datagrid-cell-rownumber { + color: #fff; +} +.datagrid-resize-proxy { + background: #cccccc; +} +.datagrid-mask { + background: #000; +} +.datagrid-mask-msg { + border-color: #000; +} +.datagrid-toolbar, +.datagrid-pager { + background: #555; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #222; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #222; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #fff; + border-collapse: separate; +} +.datagrid-row-alt { + background: #555; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #777; + color: #fff; + cursor: default; +} +.datagrid-row-selected { + background: #0052A3; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #222; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #3d3d3d; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #222; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #3d3d3d; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #444; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #222; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #fff; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #222; +} +.m-list li>a:hover { + background: #777; + color: #fff; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #444; + border-right: 1px solid #777; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #000; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #ffffff; +} +.calendar-day { + color: #fff; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #000; +} +.calendar { + border-color: #000; +} +.calendar-header { + background: #3d3d3d; +} +.calendar-body, +.calendar-menu { + background: #666; +} +.calendar-body th { + background: #555; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #777; + color: #fff; +} +.calendar-hover { + border: 1px solid #555; + padding: 0; +} +.calendar-selected { + background-color: #0052A3; + color: #fff; + border: 1px solid #00458a; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #555; +} +.datebox-button a { + color: #fff; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #3d3d3d; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #fff; + outline-style: none; + background-color: #3d3d3d; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #777; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #777; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #3d3d3d; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #3d3d3d; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #3d3d3d; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #000; +} +.progressbar-text { + color: #fff; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0052A3; + color: #fff; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #3d3d3d; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #000; + background: #3d3d3d; +} +.slider-rule span { + border-color: #000; +} +.slider-rulelabel span { + color: #fff; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #777; + -moz-box-shadow: 2px 2px 3px #787878; + -webkit-box-shadow: 2px 2px 3px #787878; + box-shadow: 2px 2px 3px #787878; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #444; + border-right: 1px solid #777; +} +.menu-sep { + border-top: 1px solid #444; + border-bottom: 1px solid #777; +} +.menu { + background-color: #666; + border-color: #444; + color: #fff; +} +.menu-content { + background: #666; +} +.menu-item { + border-color: transparent; + _border-color: #666; +} +.menu-active { + border-color: #555; + color: #fff; + background: #777; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #fff; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #777; + color: #fff; + border: 1px solid #555; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #cccccc; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #555; + background-color: #777; + color: #fff; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #cccccc; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #000; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #000; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #666; + color: #fff; + border-color: #000; +} +.tree-node-hover { + background: #777; + color: #fff; +} +.tree-node-selected { + background: #0052A3; + color: #fff; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #666; + border-color: #000; + color: #fff; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #000; +} +.tooltip-right .tooltip-arrow { + border-right-color: #666; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #000; +} +.tooltip-left .tooltip-arrow { + border-left-color: #666; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #000; +} +.tooltip-top .tooltip-arrow { + border-top-color: #666; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #000; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #666; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #555; + border: 1px solid #555; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0052A3; + color: #fff; +} +.switchbutton-off { + background-color: #666; + color: #fff; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #666; + color: #fff; + border: 1px solid #555; + -moz-box-shadow: 0 0 3px 0 #555; + -webkit-box-shadow: 0 0 3px 0 #555; + box-shadow: 0 0 3px 0 #555; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #00458a; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #00458a; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #00458a; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #00458a; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #fff; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #fff; +} +.sidemenu .accordion-header:hover { + background: #777; + color: #fff; +} +.sidemenu .tree-node-hover { + background: #777; + color: #fff; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #00458a; + color: #fff; + background: #0052A3; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..45fd44aa30476e107428feeea74273a354d3b003 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel%uDMV@SoVN1z5L3B> xDW~hhNx=}0EonJY9@lzK3(R79rLjPWf#H~1{zPk!fAK(V44$rjF6*2Ung9evL?JRtAPgomjiGH|9{f$n(B`$j zEeb&pg!EKZW!#K$4@xNm$yT6c41rc&wh}>_*7}p71!8&8673tn-QQiFh646*YwHT+ z)EV#dB}QIviTL0tB!=YS+5%Rf3nh>uG`~OIR&I9Pb&1#X>AvnQFNH)(9OKtKv|Z?jXgA8=g#}$o8PwWf~s)v4TOWbIh-FayvCIQ*!i4(A|Z*a`pRGU y`z_2`-mf|ief_$wXW7b|3Y(^xL#4%pFkRlNzMe3nx0Htf00005OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$f3kcwMx!yWk;1b9CG_kXOx zmzFK*Ssi^NN-27((w?4M8@u`^_qP=9nfy4m{lwb6;U^wS@qDtp9?C45@HGEwayQ3S z%Ua=ZSB3W+c`gDw6;3c4*f@AGFEUxQKH4x2D*a5)78&qol`;+03qN((f|Me literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/linkbutton_bg.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/linkbutton_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..fc66bd2cd24047b8377342365a1df3846327ecde GIT binary patch literal 1274 zcmVc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..2a984941d6590c78d67ee68d2087d8cc88efbac6 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQof!pjv*Dd-d;V(%b>u);`l3H z>g53sy@tf+`c*Dhco^6|8Eg#8WENqsU-wu%RB=*I5D$X7F_Nb6Mw<&;$S;RV&B< literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000P2Jv3>80t+5#NSCz>DdY1?+6=lRq-0N)F#H;wIQi`C_sJ!SVT`Wft}8_wH~Q%XA*9t9fT|c lGy-mR literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/panel_tools.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/panel_tools.png new file mode 100755 index 0000000000000000000000000000000000000000..f97761eb393def3b5f61774142413e740fe8fe8b GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^20*O9!3HEluKbn(QuUrLjv*Dd-p+93Yfuni{`r6T z$48CLf{EOzXU|M@xy0GMavBpu(5ti8zb3QZ+Tfp^siO37?WI*8%sM?7u5w1XttgAw z*Z5axHOr-aZj1~Mw;UHx3vIVCg!0FXpSG5`Po literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_close.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_close.png new file mode 100644 index 0000000000000000000000000000000000000000..276b57974284d1449250e362644dd7416632d92c GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..0f25d535e05b22b406fd72647611aace9cfa6249 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..349d7d9d1dd5757fe673c74779ca4397b3ac9880 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQo)`sjv*Dd-cGgTVld!f`TKvl zx$i261Imkz%njSa<|ydo5x!wz!%F5U-;Ot$9v8}1XAs{bw8eCRinje8hmeGw4b#=% p?40+0pF;`bK1VJIy@m-jV#fsL6&$#pdj@DcgQu&X%Q~loCIE{>Fhc+U literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..732b1237a14cf6c525dee8646f322d5603664866 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2O2978H@B_~L*E^a7$U@!3C zaj-Z4S(*MEORM>}ezCPaUb%ArQw1m64&Nzopr0N{TzyZ`_I literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..faddd10cab63488000e766ca3cb10a4a21671c10 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoV($fFg z6O)c!JXo)x5GJ#nd4ld?HMbLtC#EF|E8h}a647_oX_D^oryN0xCn=p~zr)BZ#mYR7 hgWX2DuSt-dVWQ=IMMbkYnLu+HJYD@<);T3K0RXNJC2Rly literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..2b4fd2025c7588c84df27d89466b470e273f5c06 GIT binary patch literal 3086 zcmV+p4Ds`cP)~TesqeqN>v{0t!Gi}6eg)$W;^97jYuB!YrL@_X1+wAp+no|T zcDh$_O7P%eqeu&X29&AWo<{PPpCRe9F=#J60RjkzE?U3Z3?eJo?8kQd7R}F@guc7` zUhkAAqN4FO%Cs%*PXFraYFJ9He{gzxb|BR7?~fB=#%+2M*65p>Z;2^ae-9wWQ(T@F zZaqY%vR>>jE}y>~JsP`eXW;4mkGHVp>~)jt(@xyDaic>lTycF1-p_49Lgg*AH$eFE zj$3Ze&Lbx(M9AM5$q=0S$KyD$&JR&*2I1S)190S{e)xKo4_d<`!brlRUWo%SbRteO zom2t_`k39pxnAR4*7f;5=sSNzH_gT5Z^wcKvw3DU5(x_n3vF`Jqobq6&y%xm{>>Kj zkJn;UvKH#nW}AHfS7l8I$ZkYwo$1dr{DB*8Z+kbepW64^s{^4fhtfE-(i_>?*|=XH zVJ2Ja&!0aJV-Ca+7RKC&r1RZ4sNQ?spiK6fS3e`W=E&ad9q7AxaQ)`ecaYUGA5)Hw z2m6!DDvJk&HuC!Q>*B_0G#c0f9&!P4`Nk~~Apg1Agi%Ra>}?}N_7yjZpGSG+CI^VU z0K{H`#w&Djf z0_%Bqr)Ccx*8RPK2Pa29i~m*!A)_T2(~dunu7LwK$~q|0kEf!dLfnMP%1X2a9y4al zkPVQFcL0)J*^I9UB7zf1tg@~MNRGi!Ht0)U&-vq9$5%ux$@vHGzdJn%P78(}5M7B9fKZf| zmqT(S*1|&(Kx*y*B&(_!N6K}LKkJ6Ffz^F_@Q?sfP|F<%cObTngil848mDXr5ssbj zIo$<_Jogfg%V&ag>t9?W>Wu?LnFD#`Rn-$C)<3IFY}$gLn0IbF&mU4eYW>){Ems1O zqTPfubt^F^b}HQGJsHKkz1?LWl(sq$LwG0w$fY|Dgy8XYSu;ip4kSsT1EDbweRxO! zDdJt2pA10SYYc>DO2o!lwO(Ed>;5~aduxDL=(cF9*Nf}7d><_8ZQ($K=;kqN)b_Bn zKx8)Tz|z#;Vt4U!oU8d1N2^z2;kjR<*Zgr=%zt!$MF+2~V<4smkK|}`YjprQBEW;X zFZ-`59|NHQQ)%2oN_wxXUOqthay|2cG59Ot>ZbYDi2oTcWg@{G)sFA!= zg~B5*iF&IXh>@w>o>L~gI&Q;rw~th;!`Yh6I9mR99RBfr1gE@?KJ#DDF#icdn6&_~ z)hvvXD6G@X!i-MR;=onw22g3Xg$7J%%!9fu|2B0O>b=n%7ga-Yl3N_dLcf zo7$*)?u}Wz1@Pd}jzK`6Zi$@Khldmd1nQQ^Nqu-o08x_0wtw{G>1#*Ke5+~rb8o-T z&n6GMx`OlV=fQ&q4<0=DRjl*uKd%YGg9i^DJh%hl4utC;)(B;6_(4Cvw6g(ovBT5z z+sTZ1NXuSf%ypBS+u^8y0DLxL#Kl0y#&I(6;9sSot@S$Hy(BGVW#u(7 zNn=cZVCc~E)t3Z#M67{!SZ}nPJcN?ebbR9Fb!xqf%Qu?1v#5;ZdAF?usn#Ms$_ImDpe_KFM#mn9k<+`9f+L9UsrciY{0b4)_OVcsIRYU zrH`NU2ee$x6X4MU)xHeZ20KCyx8)2 zq~~CiJOpPLq@$;DtvxAJjf@_qqvv9%N|_QZJqtq*&(Tx4Z2<^>B9~VslM4_zjbE#+ zhqSIzz3K}U8XB|~^m%w}_fQN}`(el)Kk?OX&k!*Q9uh$G^*elhkCzB8gPg~;!H=L+ zfQY8ABdWeRgzKlH1bDb2*_9#IxeJPSY{!-Kbc78WlxX&V&=a`&Pvlw)5NjbqRmi9s z8C4}CfKZh(C3Vj~9*e5{j$$`j$M`L4y8334vha7;AR<%bZfE|)#9q!{3TatMm4M)F3z5tKQUJTiToN<1j8&cc^cnI#J@bj%G7P>lN zDpl%K;VVrZ466M>LA5}P{fLwRM5+U#1R_*@jGPBmBcq~11c8eR0YXpV>Q^FDn}CR6 zbt$D)z1pfb)xg?I-_iTu)~aJ|br81terl9*;9;x*8|n!Z#^6C|PA_#^BnLtuA%IAK zlh%~}7mT@o+@r?{&DnTVMSdy3!wne%L{dB%;=Q^FgYtdpZW!Pke*SfgVVCRDeehhSNQrpgFJ?IZ4S_ z=HU_TEx^X?!LYRhQ3?^NK1Nl@s2UkTgc|=Pg$|_XX0y?XWR}K6I6!z+GHb^`J~RyBVNNd%nCf?32q01y#+07i2Tj!$#Kr3dOnqFDEOcAqdph8ZXLlU$#t_-v z0l9m2BR3-hON8!@ztHVzw=ocFs*+I^GU~=qRWfS$RHaPGcT@2oQ&q|MEC`>4c@Pdn z4m`{Oz+AUQj$WE=(RUtFH-_FbrQg)E*WtXACvoFU6teob>c%{r88ka01n032k&X^H zEHvl6j*hsbRwFwu4#9o9CqmsB8WW*`RdfF@ zjPwKN_i^y5WY#zkIq)zC0DV0TmKuYHIlcZ=tu$aNM;{e12Tj7?8Qva9e1rx}yP_~6 z9QlIVxSW`XoV{x7b8x^;0V3hux}ivTUmX%6@3?mKeIQhojP3)WDrJlZk524B)&TBElF4`cdm!-wZo=4(*!!4kx}yPbN~PV07*qoM6N<$fk literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/progressbar.css new file mode 100644 index 000000000..e89cb3a35 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #000; +} +.progressbar-text { + color: #fff; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0052A3; + color: #fff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/propertygrid.css new file mode 100644 index 000000000..871c585e5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #222; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #3d3d3d; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #222; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #3d3d3d; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/radiobutton.css new file mode 100644 index 000000000..a31bc36e5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #00458a; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #00458a; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/searchbox.css new file mode 100644 index 000000000..01f669742 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #3d3d3d; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/sidemenu.css new file mode 100644 index 000000000..396db6350 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #fff; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #fff; +} +.sidemenu .accordion-header:hover { + background: #777; + color: #fff; +} +.sidemenu .tree-node-hover { + background: #777; + color: #fff; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #00458a; + color: #fff; + background: #0052A3; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/slider.css new file mode 100644 index 000000000..22d97447c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #000; + background: #3d3d3d; +} +.slider-rule span { + border-color: #000; +} +.slider-rulelabel span { + color: #fff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/spinner.css new file mode 100644 index 000000000..9d8010293 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #3d3d3d; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #fff; + outline-style: none; + background-color: #3d3d3d; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #777; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #777; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #3d3d3d; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #3d3d3d; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #3d3d3d; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/splitbutton.css new file mode 100644 index 000000000..b42e3963f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #cccccc; + border-width: 0 0 0 1px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/switchbutton.css new file mode 100644 index 000000000..0e78b569b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #555; + border: 1px solid #555; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0052A3; + color: #fff; +} +.switchbutton-off { + background-color: #666; + color: #fff; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #666; + color: #fff; + border: 1px solid #555; + -moz-box-shadow: 0 0 3px 0 #555; + -webkit-box-shadow: 0 0 3px 0 #555; + box-shadow: 0 0 3px 0 #555; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tabs.css new file mode 100644 index 000000000..65a465c13 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tabs.css @@ -0,0 +1,413 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #3d3d3d url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #3d3d3d url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #777; + color: #fff; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #666; + color: #fff; + background: -webkit-linear-gradient(top,#454545 0,#666 100%); + background: -moz-linear-gradient(top,#454545 0,#666 100%); + background: -o-linear-gradient(top,#454545 0,#666 100%); + background: linear-gradient(to bottom,#454545 0,#666 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#666 0,#454545 100%); + background: -moz-linear-gradient(top,#666 0,#454545 100%); + background: -o-linear-gradient(top,#666 0,#454545 100%); + background: linear-gradient(to bottom,#666 0,#454545 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#454545 0,#666 100%); + background: -moz-linear-gradient(left,#454545 0,#666 100%); + background: -o-linear-gradient(left,#454545 0,#666 100%); + background: linear-gradient(to right,#454545 0,#666 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#666 0,#454545 100%); + background: -moz-linear-gradient(left,#666 0,#454545 100%); + background: -o-linear-gradient(left,#666 0,#454545 100%); + background: linear-gradient(to right,#666 0,#454545 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=1); +} +.tabs li a.tabs-inner { + color: #fff; + background-color: #3d3d3d; + background: -webkit-linear-gradient(top,#454545 0,#383838 100%); + background: -moz-linear-gradient(top,#454545 0,#383838 100%); + background: -o-linear-gradient(top,#454545 0,#383838 100%); + background: linear-gradient(to bottom,#454545 0,#383838 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #3d3d3d; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #000; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #777; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #666; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #666; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #666; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #666; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0052A3; + color: #fff; + filter: none; + border-color: #000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tagbox.css new file mode 100644 index 000000000..e08ec87b4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #777; + color: #fff; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/textbox.css new file mode 100644 index 000000000..1d18ad9fe --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #000; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #000000; + -moz-box-shadow: 0 0 3px 0 #000; + -webkit-box-shadow: 0 0 3px 0 #000; + box-shadow: 0 0 3px 0 #000; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tooltip.css new file mode 100644 index 000000000..13e310d06 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #666; + border-color: #000; + color: #fff; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #000; +} +.tooltip-right .tooltip-arrow { + border-right-color: #666; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #000; +} +.tooltip-left .tooltip-arrow { + border-left-color: #666; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #000; +} +.tooltip-top .tooltip-arrow { + border-top-color: #666; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #000; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #666; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tree.css new file mode 100644 index 000000000..08e484951 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #000; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #666; + color: #fff; + border-color: #000; +} +.tree-node-hover { + background: #777; + color: #fff; +} +.tree-node-selected { + background: #0052A3; + color: #fff; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/validatebox.css new file mode 100644 index 000000000..1fc3ad64e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/window.css new file mode 100644 index 000000000..03695899d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/window.css @@ -0,0 +1,188 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #777; + -moz-box-shadow: 2px 2px 3px #787878; + -webkit-box-shadow: 2px 2px 3px #787878; + box-shadow: 2px 2px 3px #787878; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #000; +} +.window { + background-color: #3d3d3d; + background: -webkit-linear-gradient(top,#454545 0,#383838 20%); + background: -moz-linear-gradient(top,#454545 0,#383838 20%); + background: -o-linear-gradient(top,#454545 0,#383838 20%); + background: linear-gradient(to bottom,#454545 0,#383838 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); +} +.window-proxy { + border: 1px dashed #000; +} +.window-proxy-mask, +.window-mask { + background: #000; +} +.window .panel-footer { + border: 1px solid #000; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/accordion.css new file mode 100644 index 000000000..9d268c023 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #D4D4D4; +} +.accordion .accordion-header { + background: #F2F2F2; + filter: none; +} +.accordion .accordion-header-selected { + background: #0081c2; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #F2F2F2; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #D4D4D4; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #F2F2F2; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #D4D4D4; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #F2F2F2; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #D4D4D4; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/calendar.css new file mode 100644 index 000000000..b3c749516 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 12px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 12px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 12px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 12px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 12px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #808080; +} +.calendar-day { + color: #333; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #D4D4D4; +} +.calendar { + border-color: #D4D4D4; +} +.calendar-header { + background: #F2F2F2; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #F5F5F5; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #e6e6e6; + color: #00438a; +} +.calendar-hover { + border: 1px solid #ddd; + padding: 0; +} +.calendar-selected { + background-color: #0081c2; + color: #fff; + border: 1px solid #0070a9; + padding: 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/checkbox.css new file mode 100644 index 000000000..0edec673f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #0070a9; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #0070a9; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combo.css new file mode 100644 index 000000000..fc9030d8b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #F2F2F2; +} +.combo-arrow-hover { + background-color: #e6e6e6; +} +.combo-arrow:hover { + background-color: #e6e6e6; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combobox.css new file mode 100644 index 000000000..f490811a4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 12px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #e6e6e6; + color: #00438a; +} +.combobox-item-selected { + background-color: #0081c2; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datagrid.css new file mode 100644 index 000000000..8c67b1735 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datagrid.css @@ -0,0 +1,291 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 12px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 12px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #D4D4D4; + font-size: 12px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.datagrid-cell-rownumber { + color: #333; +} +.datagrid-resize-proxy { + background: #bbb; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #D4D4D4; +} +.datagrid-toolbar, +.datagrid-pager { + background: #F5F5F5; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #e6e6e6; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #333; + border-collapse: separate; +} +.datagrid-row-alt { + background: #F5F5F5; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #e6e6e6; + color: #00438a; + cursor: default; +} +.datagrid-row-selected { + background: #0081c2; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datalist.css new file mode 100644 index 000000000..68e8df6f4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #F2F2F2; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #333; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #e6e6e6; + color: #00438a; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datebox.css new file mode 100644 index 000000000..34e376f2e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 12px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #F5F5F5; +} +.datebox-button a { + color: #444; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/dialog.css new file mode 100644 index 000000000..b44497f82 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #F5F5F5; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #D4D4D4 #D4D4D4 #e6e6e6 #D4D4D4; +} +.dialog-button { + border-color: #e6e6e6 #D4D4D4 #D4D4D4 #D4D4D4; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #F5F5F5; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/easyui.css new file mode 100644 index 000000000..4f57b93f6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/easyui.css @@ -0,0 +1,3446 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #e6e6e6; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #D4D4D4; +} +.panel-header { + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.panel-body { + background-color: #ffffff; + color: #333; + font-size: 12px; +} +.panel-title { + font-size: 12px; + font-weight: bold; + color: #777; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #D4D4D4; + overflow: hidden; + background: #F5F5F5; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #D4D4D4; +} +.accordion .accordion-header { + background: #F2F2F2; + filter: none; +} +.accordion .accordion-header-selected { + background: #0081c2; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #F2F2F2; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #D4D4D4; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #F2F2F2; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #D4D4D4; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #F2F2F2; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #D4D4D4; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #D4D4D4; +} +.window { + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.window-proxy { + border: 1px dashed #D4D4D4; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #D4D4D4; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #F5F5F5; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #D4D4D4 #D4D4D4 #e6e6e6 #D4D4D4; +} +.dialog-button { + border-color: #e6e6e6 #D4D4D4 #D4D4D4 #D4D4D4; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #F5F5F5; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 12px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #444; + background: #f5f5f5; + background-repeat: repeat-x; + border: 1px solid #bbb; + background: -webkit-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: -moz-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: -o-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: linear-gradient(to bottom,#ffffff 0,#e6e6e6 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0); + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn:hover { + background: #e6e6e6; + color: #00438a; + border: 1px solid #ddd; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #ddd; + padding: 0; +} +.l-btn-plain:hover { + background: #e6e6e6; + color: #00438a; + border: 1px solid #ddd; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #f5f5f5; + color: #444; + background: -webkit-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: -moz-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: -o-linear-gradient(top,#ffffff 0,#e6e6e6 100%); + background: linear-gradient(to bottom,#ffffff 0,#e6e6e6 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0); +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #ddd; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #ddd; +} +.textbox { + position: relative; + border: 1px solid #D4D4D4; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 12px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 12px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #bbbbbb; + -moz-box-shadow: 0 0 3px 0 #D4D4D4; + -webkit-box-shadow: 0 0 3px 0 #D4D4D4; + box-shadow: 0 0 3px 0 #D4D4D4; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #F2F2F2; +} +.combo-arrow-hover { + background-color: #e6e6e6; +} +.combo-arrow:hover { + background-color: #e6e6e6; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 12px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #e6e6e6; + color: #00438a; +} +.combobox-item-selected { + background-color: #0081c2; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #e6e6e6; + color: #00438a; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #bbb; +} +.layout-split-north { + border-bottom: 5px solid #eee; +} +.layout-split-south { + border-top: 5px solid #eee; +} +.layout-split-east { + border-left: 5px solid #eee; +} +.layout-split-west { + border-right: 5px solid #eee; +} +.layout-expand { + background-color: #F2F2F2; +} +.layout-expand-over { + background-color: #F2F2F2; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 12px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #F2F2F2 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #F2F2F2 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #e6e6e6; + color: #00438a; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #777; + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: linear-gradient(to right,#ffffff 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: linear-gradient(to right,#ffffff 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); +} +.tabs li a.tabs-inner { + color: #777; + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #F2F2F2; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #D4D4D4; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #e6e6e6; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0081c2; + color: #fff; + filter: none; + border-color: #D4D4D4; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 12px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 12px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #D4D4D4; + font-size: 12px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.datagrid-cell-rownumber { + color: #333; +} +.datagrid-resize-proxy { + background: #bbb; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #D4D4D4; +} +.datagrid-toolbar, +.datagrid-pager { + background: #F5F5F5; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #e6e6e6; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #333; + border-collapse: separate; +} +.datagrid-row-alt { + background: #F5F5F5; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #e6e6e6; + color: #00438a; + cursor: default; +} +.datagrid-row-selected { + background: #0081c2; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #e6e6e6; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #F2F2F2; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #e6e6e6; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #F2F2F2; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #F2F2F2; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #333; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #e6e6e6; + color: #00438a; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 12px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 12px; +} +.pagination span { + font-size: 12px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #D4D4D4; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 12px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 12px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 12px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 12px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 12px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #808080; +} +.calendar-day { + color: #333; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #D4D4D4; +} +.calendar { + border-color: #D4D4D4; +} +.calendar-header { + background: #F2F2F2; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #F5F5F5; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #e6e6e6; + color: #00438a; +} +.calendar-hover { + border: 1px solid #ddd; + padding: 0; +} +.calendar-selected { + background-color: #0081c2; + color: #fff; + border: 1px solid #0070a9; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 12px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #F5F5F5; +} +.datebox-button a { + color: #444; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #F2F2F2; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #F2F2F2; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #e6e6e6; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #e6e6e6; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #F2F2F2; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #F2F2F2; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #F2F2F2; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #D4D4D4; +} +.progressbar-text { + color: #333; + font-size: 12px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0081c2; + color: #fff; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #F2F2F2; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 12px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 12px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #D4D4D4; + background: #F2F2F2; +} +.slider-rule span { + border-color: #D4D4D4; +} +.slider-rulelabel span { + color: #333; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 12px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #ccc; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #ccc; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #fff; + border-color: #e6e6e6; + color: #333; +} +.menu-content { + background: #ffffff; +} +.menu-item { + border-color: transparent; + _border-color: #fff; +} +.menu-active { + border-color: #ddd; + color: #00438a; + background: #e6e6e6; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #333; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #e6e6e6; + color: #00438a; + border: 1px solid #ddd; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #bbb; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #ddd; + background-color: #e6e6e6; + color: #00438a; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #bbb; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #D4D4D4; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 12px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 12px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #D4D4D4; + font-size: 12px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #333; + border-color: #D4D4D4; +} +.tree-node-hover { + background: #e6e6e6; + color: #00438a; +} +.tree-node-selected { + background: #0081c2; + color: #fff; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 12px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #D4D4D4; + color: #333; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #D4D4D4; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #D4D4D4; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #D4D4D4; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #D4D4D4; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 12px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0081c2; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #333; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #333; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #0070a9; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #0070a9; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #0070a9; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #0070a9; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #777; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #777; +} +.sidemenu .accordion-header:hover { + background: #e6e6e6; + color: #777; +} +.sidemenu .tree-node-hover { + background: #e6e6e6; + color: #777; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #0070a9; + color: #fff; + background: #0081c2; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} +.tabs-panels { + border-color: transparent; +} +.tabs li a.tabs-inner { + border-color: transparent; + background: transparent; + filter: none; + color: #0088CC; +} +.menu-active { + background-color: #0081C2; + border-color: #0081C2; + color: #fff; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #333; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..720835f69c96c17ec32a20b03ac9753aa59b7f4f GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYeRK2H*V@SoVUT_Y-nKxaI`{RC0WjSLJ&w^R(C-|JQTojLXc1&{d*_z{$ jW+oTMdQ(F|jDg|L>K${_)^zO#I)%a0)z4*}Q$iB}_fAN- literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/blank.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/blank.gif new file mode 100755 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/calendar_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/calendar_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..430c4ad685b8c0068ecb7e3cbef74f493a84ad0d GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQYD@)jv*Dd-cCEn)nLHm{QbZE z+q@uWwandfr?Jb4eDYYmB3UAt=OO2Vt+MMT&+KD%&6hZDt!FBpej;sEpMN69^tKl% zp6y<4_lG^P z=;=eQ4Vs74-2)Ua&f1tcVdk$#{GPKe@&?ZMHmT&SMw?IV&w7)}ixLbB3d$Zg{&KGb P8OPx1>gTe~DWM4fp>5!O@Gl{c zHXr?)EMpjkiI0?0nVI4ps;W|uWCd!b5UAxPD-onMP4mgv0vV&Ul|KA@T-G#0QTd(IpSp7SIAsd;)#A=FjzgW9D>i*LbaNyX|0kF(mrr z;o92b6Zp@36nqs7kw}pT2qBaieQ3N+owvm{e=N(DufonR5DseQ_ISSW8dV0M=To{w zToOt35OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fRl}UZ@-Co%Cq`k{wEj}Dr>ShP9AQ|IKKA30{ejJboVoF`C-z@6mZMY&%Wiz%6S}#zb4u?o?9Mi=ECopVxzz+sNviAA!DK)mm8xe zgY9ZT9jlddc^&y2^u9XqDeU4{8s^AS#8C7TXsxEJW@uLu(3Whc35-X6v}jEgEb{G` z!{)$uKzw<~%0A6PhNHYfSuTvOzD8LpPF>PVr=&QqGC936QlPgc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000zI<5nO~0)=fnxErNrCA`WgM*1^R=&_zX)CMr1T;-rJKi{RhT zwTRWWFSbznW6?ZwYBk2xccxEVa`0%4(Yva@;pbF0^9S2uAKfle(?qtbyxJ(2%kiF>CHXa` zwdcneqDH8s8`O=^Z;G*FoH3bGkRlewXgRMPCtCR>olp$6SSk2LaLtdk735GTeS6JrtWdjq}ZZs34}bF$p9qsdLBnIC+J1{xF!;M>5@n5YI? z&4z;cHjvE$_V&)MtT*$6579tEVTAaOu<<1(%cR!^622ph;K0g-9AQF(O3vhYiNJ*b z7Xuat7f#qV!aOb!Q6;pKF~UjxbnQ*DOwWIpHq-OqgFQe0fa`fz9oUMD0Z9VV1d9Q= z5#TIiB5HxD12dV7Jd)hJ_=qt$xd^NA4nEk!Bp@qUu0k4c(cRlRc0Y)25Z^q7^m|=T zEPSa{>fbuK*p?QKGWOF9-+|Bne}*tPWtM~)t<`EXu;7__@_h5{U+e{vTT29oHFe~Ze6XJ(Q>Kb zHH)*`i>&-o-mMNlRLeM*)b=tl9I*eiXO{b+PdrTgTX%D4@ZRav{vE&cqCShv#9g;J tE!>t@mbeRM^gTGoKdYo(nL%h1<2#QP_cRaf4g@-i!PC{xWt~$(697v`TRe8 z#G%R{$NfX%tci2`Gda4n1O70V3HltacN37lc`VT21_Oig(wY*}T!mDijSQZyelF{r G5}E*M5;#5p literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d328891f6a18ea703fd25a47b228df9cb13b4744 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fh6C~y}*jFF6I{2&m zf8fW~lSf{d9=Ouc<(SoRr6$ox=6dW5rxOB`TRe8 z#G%R{$Nj@Z)5m5kM@2RMITi_;Npmte=_#;rBych_7F`xqKKy}=f%DM}Q4`(M(}DIf Nc)I$ztaD0e0su|qH(3Ax literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..7c2df483dbb30dfb3a51332c03fe6f0c229c0547 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4Dgeh3R zJz6gy$J;RRRRiNz`7}$-z5~nWg=}UsVYp!HpQ#{_&8An~S<1fjm*zKyrHmF27#+^4 x`1rk&EZfSkR8C?on>%wt3;O{L3Dzy_3@=Og7TEqO`UJFx!PC{xWt~$(69D$UE$jdQ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..4d29966d7154338a9e2e358821a5f72655eba43e GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq+&f?978H@B_~L*E^a7uNPG49 z|BoM6E;$_tDnm{r-UW|t3f!- literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..bd02e2d817c6b7c4e2a105919e9a89cc0a1d577f GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel&`0YV@SoV>_0CQASS literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/progressbar.css new file mode 100644 index 000000000..73f0de06e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #D4D4D4; +} +.progressbar-text { + color: #333; + font-size: 12px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0081c2; + color: #fff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/propertygrid.css new file mode 100644 index 000000000..4b37fa61c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #e6e6e6; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #F2F2F2; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #e6e6e6; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #F2F2F2; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/radiobutton.css new file mode 100644 index 000000000..341e570fd --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #0070a9; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #0070a9; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/searchbox.css new file mode 100644 index 000000000..bf615de03 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #F2F2F2; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/sidemenu.css new file mode 100644 index 000000000..e9460591d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #777; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #777; +} +.sidemenu .accordion-header:hover { + background: #e6e6e6; + color: #777; +} +.sidemenu .tree-node-hover { + background: #e6e6e6; + color: #777; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #0070a9; + color: #fff; + background: #0081c2; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/slider.css new file mode 100644 index 000000000..b58d8de55 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 12px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 12px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #D4D4D4; + background: #F2F2F2; +} +.slider-rule span { + border-color: #D4D4D4; +} +.slider-rulelabel span { + color: #333; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/spinner.css new file mode 100644 index 000000000..6a6e6fca5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #F2F2F2; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #F2F2F2; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #e6e6e6; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #e6e6e6; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #F2F2F2; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #F2F2F2; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #F2F2F2; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/splitbutton.css new file mode 100644 index 000000000..bf8645332 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #bbb; + border-width: 0 0 0 1px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/switchbutton.css new file mode 100644 index 000000000..38803aa0d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 12px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0081c2; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #333; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #333; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tabs.css new file mode 100644 index 000000000..c06a4aab4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tabs.css @@ -0,0 +1,413 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 12px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #F2F2F2 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #F2F2F2 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #e6e6e6; + color: #00438a; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #777; + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: linear-gradient(to right,#ffffff 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); + background: linear-gradient(to right,#ffffff 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); +} +.tabs li a.tabs-inner { + color: #777; + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #F2F2F2; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #D4D4D4; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #e6e6e6; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0081c2; + color: #fff; + filter: none; + border-color: #D4D4D4; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tagbox.css new file mode 100644 index 000000000..7e98a0a31 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #e6e6e6; + color: #00438a; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/textbox.css new file mode 100644 index 000000000..a708ce34f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #D4D4D4; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 12px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 12px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #bbbbbb; + -moz-box-shadow: 0 0 3px 0 #D4D4D4; + -webkit-box-shadow: 0 0 3px 0 #D4D4D4; + box-shadow: 0 0 3px 0 #D4D4D4; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tooltip.css new file mode 100644 index 000000000..ed9fe1c25 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 12px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #D4D4D4; + color: #333; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #D4D4D4; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #D4D4D4; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #D4D4D4; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #D4D4D4; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tree.css new file mode 100644 index 000000000..87d2474cb --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 12px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 12px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #D4D4D4; + font-size: 12px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #333; + border-color: #D4D4D4; +} +.tree-node-hover { + background: #e6e6e6; + color: #00438a; +} +.tree-node-selected { + background: #0081c2; + color: #fff; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/validatebox.css new file mode 100644 index 000000000..1fc3ad64e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/window.css new file mode 100644 index 000000000..a544a4e81 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/window.css @@ -0,0 +1,188 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #D4D4D4; +} +.window { + background-color: #F2F2F2; + background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 20%); + background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); +} +.window-proxy { + border: 1px dashed #D4D4D4; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #D4D4D4; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/color.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/color.css new file mode 100755 index 000000000..2985680f3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/color.css @@ -0,0 +1,210 @@ +.c1,.c1:hover,.c1>.panel-header{ + color: #fff; + border-color: #3c8b3c; + background: #4cae4c; + background: -webkit-linear-gradient(top,#4cae4c 0,#449d44 100%); + background: -moz-linear-gradient(top,#4cae4c 0,#449d44 100%); + background: -o-linear-gradient(top,#4cae4c 0,#449d44 100%); + background: linear-gradient(to bottom,#4cae4c 0,#449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4cae4c,endColorstr=#449d44,GradientType=0); +} +a.c1:hover{ + background: #449d44; + filter: none; +} +.c1>.panel-body{ + border-color: #3c8b3c; +} +.c1>.dialog-toolbar,.c1>.dialog-button{ + border-left-color: #3c8b3c; + border-right-color: #3c8b3c; +} +.c1>.dialog-button{ + border-bottom-color: #3c8b3c; +} +.c2,.c2:hover,.c2>.panel-header{ + color: #fff; + border-color: #5f5f5f; + background: #747474; + background: -webkit-linear-gradient(top,#747474 0,#676767 100%); + background: -moz-linear-gradient(top,#747474 0,#676767 100%); + background: -o-linear-gradient(top,#747474 0,#676767 100%); + background: linear-gradient(to bottom,#747474 0,#676767 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#747474,endColorstr=#676767,GradientType=0); +} +a.c2:hover{ + background: #676767; + filter: none; +} +.c2>.panel-body{ + border-color: #5f5f5f; +} +.c2>.dialog-toolbar,.c2>.dialog-button{ + border-left-color: #5f5f5f; + border-right-color: #5f5f5f; +} +.c2>.dialog-button{ + border-bottom-color: #5f5f5f; +} +.c3,.c3:hover,.c3>.panel-header{ + color: #333; + border-color: #ff8080; + background: #ffb3b3; + background: -webkit-linear-gradient(top,#ffb3b3 0,#ff9999 100%); + background: -moz-linear-gradient(top,#ffb3b3 0,#ff9999 100%); + background: -o-linear-gradient(top,#ffb3b3 0,#ff9999 100%); + background: linear-gradient(to bottom,#ffb3b3 0,#ff9999 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffb3b3,endColorstr=#ff9999,GradientType=0); +} +a.c3:hover{ + background: #ff9999; + filter: none; +} +.c3>.panel-body{ + border-color: #ff8080; +} +.c3>.dialog-toolbar,.c3>.dialog-button{ + border-left-color: #ff8080; + border-right-color: #ff8080; +} +.c3>.dialog-button{ + border-bottom-color: #ff8080; +} +.c4,.c4:hover,.c4>.panel-header{ + color: #333; + border-color: #52d689; + background: #b8eecf; + background: -webkit-linear-gradient(top,#b8eecf 0,#a4e9c1 100%); + background: -moz-linear-gradient(top,#b8eecf 0,#a4e9c1 100%); + background: -o-linear-gradient(top,#b8eecf 0,#a4e9c1 100%); + background: linear-gradient(to bottom,#b8eecf 0,#a4e9c1 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#b8eecf,endColorstr=#a4e9c1,GradientType=0); +} +a.c4:hover{ + background: #a4e9c1; + filter: none; +} +.c4>.panel-body{ + border-color: #52d689; +} +.c4>.dialog-toolbar,.c4>.dialog-button{ + border-left-color: #52d689; + border-right-color: #52d689; +} +.c4>.dialog-button{ + border-bottom-color: #52d689; +} +.c5,.c5:hover,.c5>.panel-header{ + color: #fff; + border-color: #b52b27; + background: #d84f4b; + background: -webkit-linear-gradient(top,#d84f4b 0,#c9302c 100%); + background: -moz-linear-gradient(top,#d84f4b 0,#c9302c 100%); + background: -o-linear-gradient(top,#d84f4b 0,#c9302c 100%); + background: linear-gradient(to bottom,#d84f4b 0,#c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#d84f4b,endColorstr=#c9302c,GradientType=0); +} +a.c5:hover{ + background: #c9302c; + filter: none; +} +.c5>.panel-body{ + border-color: #b52b27; +} +.c5>.dialog-toolbar,.c5>.dialog-button{ + border-left-color: #b52b27; + border-right-color: #b52b27; +} +.c5>.dialog-button{ + border-bottom-color: #b52b27; +} +.c6,.c6:hover,.c6>.panel-header{ + color: #fff; + border-color: #1f637b; + background: #2984a4; + background: -webkit-linear-gradient(top,#2984a4 0,#24748f 100%); + background: -moz-linear-gradient(top,#2984a4 0,#24748f 100%); + background: -o-linear-gradient(top,#2984a4 0,#24748f 100%); + background: linear-gradient(to bottom,#2984a4 0,#24748f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#2984a4,endColorstr=#24748f,GradientType=0); +} +a.c6:hover{ + background: #24748f; + filter: none; +} +.c6>.panel-body{ + border-color: #1f637b; +} +.c6>.dialog-toolbar,.c6>.dialog-button{ + border-left-color: #1f637b; + border-right-color: #1f637b; +} +.c6>.dialog-button{ + border-bottom-color: #1f637b; +} +.c7,.c7:hover,.c7>.panel-header{ + color: #333; + border-color: #e68900; + background: #ffab2e; + background: -webkit-linear-gradient(top,#ffab2e 0,#ff9900 100%); + background: -moz-linear-gradient(top,#ffab2e 0,#ff9900 100%); + background: -o-linear-gradient(top,#ffab2e 0,#ff9900 100%); + background: linear-gradient(to bottom,#ffab2e 0,#ff9900 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffab2e,endColorstr=#ff9900,GradientType=0); +} +a.c7:hover{ + background: #ff9900; + filter: none; +} +.c7>.panel-body{ + border-color: #e68900; +} +.c7>.dialog-toolbar,.c7>.dialog-button{ + border-left-color: #e68900; + border-right-color: #e68900; +} +.c7>.dialog-button{ + border-bottom-color: #e68900; +} +.c8,.c8:hover,.c8>.panel-header{ + color: #fff; + border-color: #4b72a4; + background: #698cba; + background: -webkit-linear-gradient(top,#698cba 0,#577eb2 100%); + background: -moz-linear-gradient(top,#698cba 0,#577eb2 100%); + background: -o-linear-gradient(top,#698cba 0,#577eb2 100%); + background: linear-gradient(to bottom,#698cba 0,#577eb2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#698cba,endColorstr=#577eb2,GradientType=0); +} +a.c8:hover{ + background: #577eb2; + filter: none; +} +.c8>.panel-body{ + border-color: #4b72a4; +} +.c8>.dialog-toolbar,.c8>.dialog-button{ + border-left-color: #4b72a4; + border-right-color: #4b72a4; +} +.c8>.dialog-button{ + border-bottom-color: #4b72a4; +} +.c1>.panel-header>.panel-title,.c2>.panel-header>.panel-title, +.c5>.panel-header>.panel-title,.c6>.panel-header>.panel-title,.c8>.panel-header>.panel-title{ + color: #fff; +} +.c-plain{ + border-color: #fff; + background: #fff; +} +.c-plain>.panel-header, +.c-plain>.panel-body, +.c-plain>.dialog-button, +.c-plain>.dialog-toolbar{ + border-color: transparent; + background: transparent; +} +.c-raised{ + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/accordion.css new file mode 100644 index 000000000..9d60531f6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #95B8E7; +} +.accordion .accordion-header { + background: #E0ECFF; + filter: none; +} +.accordion .accordion-header-selected { + background: #ffe48d; +} +.accordion .accordion-header-selected .panel-title { + color: #000000; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #E0ECFF; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #95B8E7; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #E0ECFF; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #95B8E7; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #E0ECFF; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #95B8E7; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/calendar.css new file mode 100644 index 000000000..f25a45849 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #4d4d4d; +} +.calendar-day { + color: #000000; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #95B8E7; +} +.calendar { + border-color: #95B8E7; +} +.calendar-header { + background: #E0ECFF; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #F4F4F4; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eaf2ff; + color: #000000; +} +.calendar-hover { + border: 1px solid #b7d2ff; + padding: 0; +} +.calendar-selected { + background-color: #ffe48d; + color: #000000; + border: 1px solid #ffab3f; + padding: 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/checkbox.css new file mode 100644 index 000000000..61c5351b9 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #ffab3f; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #ffab3f; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combo.css new file mode 100644 index 000000000..a51638652 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #E0ECFF; +} +.combo-arrow-hover { + background-color: #eaf2ff; +} +.combo-arrow:hover { + background-color: #eaf2ff; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combobox.css new file mode 100644 index 000000000..c315199e5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eaf2ff; + color: #000000; +} +.combobox-item-selected { + background-color: #ffe48d; + color: #000000; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datagrid.css new file mode 100644 index 000000000..f86aa1484 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datagrid.css @@ -0,0 +1,291 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #95B8E7; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #efefef; + background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: -moz-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: -o-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: linear-gradient(to bottom,#F9F9F9 0,#efefef 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F9F9F9,endColorstr=#efefef,GradientType=0); +} +.datagrid-cell-rownumber { + color: #000000; +} +.datagrid-resize-proxy { + background: #aac5e7; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #95B8E7; +} +.datagrid-toolbar, +.datagrid-pager { + background: #F4F4F4; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #dddddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #000000; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eaf2ff; + color: #000000; + cursor: default; +} +.datagrid-row-selected { + background: #ffe48d; + color: #000000; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datalist.css new file mode 100644 index 000000000..eedd25bc0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #efefef; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #000000; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #eaf2ff; + color: #000000; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datebox.css new file mode 100644 index 000000000..61093f08f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #F4F4F4; +} +.datebox-button a { + color: #444; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/dialog.css new file mode 100644 index 000000000..ff5538774 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #F4F4F4; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #95B8E7 #95B8E7 #dddddd #95B8E7; +} +.dialog-button { + border-color: #dddddd #95B8E7 #95B8E7 #95B8E7; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #F4F4F4; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/easyui.css new file mode 100644 index 000000000..fabb4be5f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/easyui.css @@ -0,0 +1,3427 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #eaf2ff; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #95B8E7; +} +.panel-header { + background-color: #E0ECFF; + background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); +} +.panel-body { + background-color: #ffffff; + color: #000000; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #0E2D5F; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #95B8E7; + overflow: hidden; + background: #F4F4F4; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #95B8E7; +} +.accordion .accordion-header { + background: #E0ECFF; + filter: none; +} +.accordion .accordion-header-selected { + background: #ffe48d; +} +.accordion .accordion-header-selected .panel-title { + color: #000000; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #E0ECFF; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #95B8E7; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #E0ECFF; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #95B8E7; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #E0ECFF; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #95B8E7; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #95B8E7; +} +.window { + background-color: #E0ECFF; + background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); +} +.window-proxy { + border: 1px dashed #95B8E7; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #95B8E7; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #F4F4F4; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #95B8E7 #95B8E7 #dddddd #95B8E7; +} +.dialog-button { + border-color: #dddddd #95B8E7 #95B8E7 #95B8E7; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #F4F4F4; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #444; + background: #fafafa; + background-repeat: repeat-x; + border: 1px solid #bbb; + background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn:hover { + background: #eaf2ff; + color: #000000; + border: 1px solid #b7d2ff; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #b7d2ff; + padding: 0; +} +.l-btn-plain:hover { + background: #eaf2ff; + color: #000000; + border: 1px solid #b7d2ff; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #fafafa; + color: #444; + background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #ddd; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #ddd; +} +.textbox { + position: relative; + border: 1px solid #95B8E7; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #6b9cde; + -moz-box-shadow: 0 0 3px 0 #95B8E7; + -webkit-box-shadow: 0 0 3px 0 #95B8E7; + box-shadow: 0 0 3px 0 #95B8E7; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #E0ECFF; +} +.combo-arrow-hover { + background-color: #eaf2ff; +} +.combo-arrow:hover { + background-color: #eaf2ff; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eaf2ff; + color: #000000; +} +.combobox-item-selected { + background-color: #ffe48d; + color: #000000; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #eaf2ff; + color: #000000; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #aac5e7; +} +.layout-split-north { + border-bottom: 5px solid #E6EEF8; +} +.layout-split-south { + border-top: 5px solid #E6EEF8; +} +.layout-split-east { + border-left: 5px solid #E6EEF8; +} +.layout-split-west { + border-right: 5px solid #E6EEF8; +} +.layout-expand { + background-color: #E0ECFF; +} +.layout-expand-over { + background-color: #E0ECFF; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #E0ECFF url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #E0ECFF url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eaf2ff; + color: #000000; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #0E2D5F; + background: -webkit-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: -moz-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: -o-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: linear-gradient(to bottom,#EFF5FF 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: -moz-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: -o-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: linear-gradient(to bottom,#ffffff 0,#EFF5FF 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: -moz-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: -o-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: linear-gradient(to right,#EFF5FF 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: -moz-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: -o-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: linear-gradient(to right,#ffffff 0,#EFF5FF 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=1); +} +.tabs li a.tabs-inner { + color: #0E2D5F; + background-color: #E0ECFF; + background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #E0ECFF; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #95B8E7; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eaf2ff; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #ffe48d; + color: #000000; + filter: none; + border-color: #95B8E7; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #95B8E7; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #efefef; + background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: -moz-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: -o-linear-gradient(top,#F9F9F9 0,#efefef 100%); + background: linear-gradient(to bottom,#F9F9F9 0,#efefef 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F9F9F9,endColorstr=#efefef,GradientType=0); +} +.datagrid-cell-rownumber { + color: #000000; +} +.datagrid-resize-proxy { + background: #aac5e7; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #95B8E7; +} +.datagrid-toolbar, +.datagrid-pager { + background: #F4F4F4; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #dddddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #000000; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eaf2ff; + color: #000000; + cursor: default; +} +.datagrid-row-selected { + background: #ffe48d; + color: #000000; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #dddddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #E0ECFF; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #dddddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #E0ECFF; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #efefef; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #000000; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #eaf2ff; + color: #000000; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #95B8E7; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #4d4d4d; +} +.calendar-day { + color: #000000; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #95B8E7; +} +.calendar { + border-color: #95B8E7; +} +.calendar-header { + background: #E0ECFF; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #F4F4F4; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eaf2ff; + color: #000000; +} +.calendar-hover { + border: 1px solid #b7d2ff; + padding: 0; +} +.calendar-selected { + background-color: #ffe48d; + color: #000000; + border: 1px solid #ffab3f; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #F4F4F4; +} +.datebox-button a { + color: #444; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #E0ECFF; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #E0ECFF; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eaf2ff; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eaf2ff; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #E0ECFF; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #E0ECFF; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #E0ECFF; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #95B8E7; +} +.progressbar-text { + color: #000000; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #ffe48d; + color: #000000; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #E0ECFF; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #95B8E7; + background: #E0ECFF; +} +.slider-rule span { + border-color: #95B8E7; +} +.slider-rulelabel span { + color: #000000; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #ccc; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #ccc; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #fafafa; + border-color: #ddd; + color: #444; +} +.menu-content { + background: #ffffff; +} +.menu-item { + border-color: transparent; + _border-color: #fafafa; +} +.menu-active { + border-color: #b7d2ff; + color: #000000; + background: #eaf2ff; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #444; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #eaf2ff; + color: #000000; + border: 1px solid #b7d2ff; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #aac5e7; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #b7d2ff; + background-color: #eaf2ff; + color: #000000; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #aac5e7; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #95B8E7; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #95B8E7; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #000000; + border-color: #95B8E7; +} +.tree-node-hover { + background: #eaf2ff; + color: #000000; +} +.tree-node-selected { + background: #ffe48d; + color: #000000; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #95B8E7; + color: #000000; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #95B8E7; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #95B8E7; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #95B8E7; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #95B8E7; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #ffe48d; + color: #000000; +} +.switchbutton-off { + background-color: #ffffff; + color: #000000; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #000000; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #ffab3f; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #ffab3f; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #ffab3f; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #ffab3f; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #0E2D5F; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #0E2D5F; +} +.sidemenu .accordion-header:hover { + background: #eaf2ff; + color: #0E2D5F; +} +.sidemenu .tree-node-hover { + background: #eaf2ff; + color: #0E2D5F; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #ffab3f; + color: #000000; + background: #ffe48d; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..720835f69c96c17ec32a20b03ac9753aa59b7f4f GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYeRK2H*V@SoVUT_Y-nKxaI`{RC0WjSLJ&w^R(C-|JQTojLXc1&{d*_z{$ jW+oTMdQ(F|jDg|L>K${_)^zO#I)%a0)z4*}Q$iB}_fAN- literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/blank.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/blank.gif new file mode 100755 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/calendar_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/calendar_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..430c4ad685b8c0068ecb7e3cbef74f493a84ad0d GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQYD@)jv*Dd-cCEn)nLHm{QbZE z+q@uWwandfr?Jb4eDYYmB3UAt=OO2Vt+MMT&+KD%&6hZDt!FBpej;sEpMN69^tKl% zp6y<4_lG^P z=;=eQ4Vs74-2)Ua&f1tcVdk$#{GPKe@&?ZMHmT&SMw?IV&w7)}ixLbB3d$Zg{&KGb P8OPx1>gTe~DWM4fp>5!O@Gl{c zHXr?)EMpjkiI0?0nVI4ps;W|uWCd!b5UAxPD-onMP4mgv0vV&Ul|KA@T-G#0QTd(IpSp7SIAsd;)#A=FjzgW9D>i*LbaNyX|0kF(mrr z;o92b6Zp@36nqs7kw}pT2qBaieQ3N+owvm{e=N(DufonR5DseQ_ISSW8dV0M=To{w zToOt35OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fRl}UZ@-Co%Cq`k{wEj}Dr>ShP9AQ|IKKA30{ejJboVoF`C-z@6mZMY&%Wiz%6S}#zb4u?o?9Mi=ECopVxzz+sNviAA!DK)mm8xe zgY9ZT9jlddc^&y2^u9XqDeU4{8s^AS#8C7TXsxEJW@uLu(3Whc35-X6v}jEgEb{G` z!{)$uKzw<~%0A6PhNHYfSuTvOzD8LpPF>PVr=&QqGC936QlPgc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000zI<5nO~0)=fnxErNrCA`WgM*1^R=&_zX)CMr1T;-rJKi{RhT zwTRWWFSbznW6?ZwYBk2xccxEVa`0%4(Yva@;pbF0^9S2uAKfle(?qtbyxJ(2%kiF>CHXa` zwdcneqDH8s8`O=^Z;G*FoH3bGkRlewXgRMPCtCR>olp$6SSk2LaLtdk735GTeS6JrtWdjq}ZZs34}bF$p9qsdLBnIC+J1{xF!;M>5@n5YI? z&4z;cHjvE$_V&)MtT*$6579tEVTAaOu<<1(%cR!^622ph;K0g-9AQF(O3vhYiNJ*b z7Xuat7f#qV!aOb!Q6;pKF~UjxbnQ*DOwWIpHq-OqgFQe0fa`fz9oUMD0Z9VV1d9Q= z5#TIiB5HxD12dV7Jd)hJ_=qt$xd^NA4nEk!Bp@qUu0k4c(cRlRc0Y)25Z^q7^m|=T zEPSa{>fbuK*p?QKGWOF9-+|Bne}*tPWtM~)t<`EXu;7__@_h5{U+e{v=r+F-NMp}oB#0F&Ath1Z0fB%h<+sXzP;6TCwIF) z=XWKASa=$lA2eqle32Vdi_T3x4Qu>yxA*?om5;I#SWP5^#D2B6W$V>}P2w$`U+8H@ z0Ci?&Wu5GGc(Ia9{_CO5k{E>dTE6S>md@Y8z9L=77KeNpc;t7B)#8uV-B0>e^*5VwvF24Q#~Lh^WJDN!=N)I%V_ z3gc!>Fya-lLcclypp#1paq!SzI)AUI+cGqr6pX%dy3^@MQaM7bubeKKUmk$ssBS+{ z+D{bs1Nc(Z?FVcB@Meu!ev3HfXH1NcL_ z+>=<>Hi(2XX;)F{S;fEtv9G)w*hwlY~kM zCZMZPpFad1^A}a4J^;=P&LDat|`y57>Sp=A%yET$ajG`}@`p^xNM^J>GAB eBlUQ{{Qm&YJg{HE_Fe7(0000`TRe8 z#G%R{$NfX%tci2`Gda4n1O70V3HltacN37lc`VT21_Oig(wY*}T!mDijSQZyelF{r G5}E*M5;#5p literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d328891f6a18ea703fd25a47b228df9cb13b4744 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fh6C~y}*jFF6I{2&m zf8fW~lSf{d9=Ouc<(SoRr6$ox=6dW5rxOB`TRe8 z#G%R{$Nj@Z)5m5kM@2RMITi_;Npmte=_#;rBych_7F`xqKKy}=f%DM}Q4`(M(}DIf Nc)I$ztaD0e0su|qH(3Ax literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..7c2df483dbb30dfb3a51332c03fe6f0c229c0547 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4Dgeh3R zJz6gy$J;RRRRiNz`7}$-z5~nWg=}UsVYp!HpQ#{_&8An~S<1fjm*zKyrHmF27#+^4 x`1rk&EZfSkR8C?on>%wt3;O{L3Dzy_3@=Og7TEqO`UJFx!PC{xWt~$(69D$UE$jdQ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..4d29966d7154338a9e2e358821a5f72655eba43e GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq+&f?978H@B_~L*E^a7uNPG49 z|BoM6E;$_tDnm{r-UW|t3f!- literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..bd02e2d817c6b7c4e2a105919e9a89cc0a1d577f GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel&`0YV@SoV>_0CQASS literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/progressbar.css new file mode 100644 index 000000000..9fbcb3a20 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #95B8E7; +} +.progressbar-text { + color: #000000; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #ffe48d; + color: #000000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/propertygrid.css new file mode 100644 index 000000000..3b6f419e3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #dddddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #E0ECFF; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #dddddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #E0ECFF; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/radiobutton.css new file mode 100644 index 000000000..82533c8b5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #ffab3f; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #ffab3f; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/searchbox.css new file mode 100644 index 000000000..ada5ce39a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #E0ECFF; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/sidemenu.css new file mode 100644 index 000000000..2111e5b8d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #0E2D5F; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #0E2D5F; +} +.sidemenu .accordion-header:hover { + background: #eaf2ff; + color: #0E2D5F; +} +.sidemenu .tree-node-hover { + background: #eaf2ff; + color: #0E2D5F; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #ffab3f; + color: #000000; + background: #ffe48d; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/slider.css new file mode 100644 index 000000000..8721832cf --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #95B8E7; + background: #E0ECFF; +} +.slider-rule span { + border-color: #95B8E7; +} +.slider-rulelabel span { + color: #000000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/spinner.css new file mode 100644 index 000000000..9e163f9e7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #E0ECFF; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #E0ECFF; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eaf2ff; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eaf2ff; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #E0ECFF; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #E0ECFF; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #E0ECFF; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/splitbutton.css new file mode 100644 index 000000000..86d6da58e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #aac5e7; + border-width: 0 0 0 1px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/switchbutton.css new file mode 100644 index 000000000..4b5d4ad71 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #ffe48d; + color: #000000; +} +.switchbutton-off { + background-color: #ffffff; + color: #000000; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #000000; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tabs.css new file mode 100644 index 000000000..e3e97c78b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tabs.css @@ -0,0 +1,413 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #E0ECFF url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #E0ECFF url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eaf2ff; + color: #000000; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #0E2D5F; + background: -webkit-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: -moz-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: -o-linear-gradient(top,#EFF5FF 0,#ffffff 100%); + background: linear-gradient(to bottom,#EFF5FF 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: -moz-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: -o-linear-gradient(top,#ffffff 0,#EFF5FF 100%); + background: linear-gradient(to bottom,#ffffff 0,#EFF5FF 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: -moz-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: -o-linear-gradient(left,#EFF5FF 0,#ffffff 100%); + background: linear-gradient(to right,#EFF5FF 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: -moz-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: -o-linear-gradient(left,#ffffff 0,#EFF5FF 100%); + background: linear-gradient(to right,#ffffff 0,#EFF5FF 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=1); +} +.tabs li a.tabs-inner { + color: #0E2D5F; + background-color: #E0ECFF; + background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); + background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #E0ECFF; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #95B8E7; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eaf2ff; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #ffe48d; + color: #000000; + filter: none; + border-color: #95B8E7; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tagbox.css new file mode 100644 index 000000000..67d51a367 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #eaf2ff; + color: #000000; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/textbox.css new file mode 100644 index 000000000..71b154aa0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #95B8E7; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #6b9cde; + -moz-box-shadow: 0 0 3px 0 #95B8E7; + -webkit-box-shadow: 0 0 3px 0 #95B8E7; + box-shadow: 0 0 3px 0 #95B8E7; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tooltip.css new file mode 100644 index 000000000..8ce21b40e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #95B8E7; + color: #000000; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #95B8E7; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #95B8E7; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #95B8E7; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #95B8E7; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tree.css new file mode 100644 index 000000000..4a1bce0a0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #95B8E7; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #000000; + border-color: #95B8E7; +} +.tree-node-hover { + background: #eaf2ff; + color: #000000; +} +.tree-node-selected { + background: #ffe48d; + color: #000000; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/validatebox.css new file mode 100644 index 000000000..1fc3ad64e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/window.css new file mode 100644 index 000000000..25a4bee98 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/window.css @@ -0,0 +1,188 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #95B8E7; +} +.window { + background-color: #E0ECFF; + background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); + background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); +} +.window-proxy { + border: 1px dashed #95B8E7; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #95B8E7; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/accordion.css new file mode 100644 index 000000000..3226cb381 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #D3D3D3; +} +.accordion .accordion-header { + background: #f3f3f3; + filter: none; +} +.accordion .accordion-header-selected { + background: #0092DC; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #f3f3f3; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #D3D3D3; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #f3f3f3; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #D3D3D3; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #f3f3f3; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #D3D3D3; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/calendar.css new file mode 100644 index 000000000..c647dcd31 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #4d4d4d; +} +.calendar-day { + color: #000000; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #D3D3D3; +} +.calendar { + border-color: #D3D3D3; +} +.calendar-header { + background: #f3f3f3; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #e2e2e2; + color: #000000; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #0092DC; + color: #fff; + border: 1px solid #0070a9; + padding: 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/checkbox.css new file mode 100644 index 000000000..0edec673f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #0070a9; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #0070a9; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combo.css new file mode 100644 index 000000000..6ebdf5ee7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #f3f3f3; +} +.combo-arrow-hover { + background-color: #e2e2e2; +} +.combo-arrow:hover { + background-color: #e2e2e2; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combobox.css new file mode 100644 index 000000000..06613c144 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #e2e2e2; + color: #000000; +} +.combobox-item-selected { + background-color: #0092DC; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datagrid.css new file mode 100644 index 000000000..f5e39b43a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datagrid.css @@ -0,0 +1,291 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #D3D3D3; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fafafa; + background: -webkit-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: -moz-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: -o-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: linear-gradient(to bottom,#fdfdfd 0,#f5f5f5 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#fdfdfd,endColorstr=#f5f5f5,GradientType=0); +} +.datagrid-cell-rownumber { + color: #000000; +} +.datagrid-resize-proxy { + background: #bfbfbf; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #D3D3D3; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #ddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #000000; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #e2e2e2; + color: #000000; + cursor: default; +} +.datagrid-row-selected { + background: #0092DC; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datalist.css new file mode 100644 index 000000000..de149ef05 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fafafa; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #000000; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #e2e2e2; + color: #000000; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datebox.css new file mode 100644 index 000000000..36281af1b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #444; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/dialog.css new file mode 100644 index 000000000..2850ca1dc --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #D3D3D3 #D3D3D3 #ddd #D3D3D3; +} +.dialog-button { + border-color: #ddd #D3D3D3 #D3D3D3 #D3D3D3; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/easyui.css new file mode 100644 index 000000000..43bc780b8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/easyui.css @@ -0,0 +1,3427 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #e2e2e2; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #D3D3D3; +} +.panel-header { + background-color: #f3f3f3; + background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); +} +.panel-body { + background-color: #ffffff; + color: #000000; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #575765; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #D3D3D3; + overflow: hidden; + background: #fafafa; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #D3D3D3; +} +.accordion .accordion-header { + background: #f3f3f3; + filter: none; +} +.accordion .accordion-header-selected { + background: #0092DC; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #f3f3f3; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #D3D3D3; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #f3f3f3; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #D3D3D3; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #f3f3f3; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #D3D3D3; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #D3D3D3; +} +.window { + background-color: #f3f3f3; + background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); +} +.window-proxy { + border: 1px dashed #D3D3D3; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #D3D3D3; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #D3D3D3 #D3D3D3 #ddd #D3D3D3; +} +.dialog-button { + border-color: #ddd #D3D3D3 #D3D3D3 #D3D3D3; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #444; + background: #fafafa; + background-repeat: repeat-x; + border: 1px solid #bbb; + background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn:hover { + background: #e2e2e2; + color: #000000; + border: 1px solid #ccc; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #ccc; + padding: 0; +} +.l-btn-plain:hover { + background: #e2e2e2; + color: #000000; + border: 1px solid #ccc; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #fafafa; + color: #444; + background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); + background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #ddd; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #ddd; +} +.textbox { + position: relative; + border: 1px solid #D3D3D3; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #bababa; + -moz-box-shadow: 0 0 3px 0 #D3D3D3; + -webkit-box-shadow: 0 0 3px 0 #D3D3D3; + box-shadow: 0 0 3px 0 #D3D3D3; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #f3f3f3; +} +.combo-arrow-hover { + background-color: #e2e2e2; +} +.combo-arrow:hover { + background-color: #e2e2e2; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #e2e2e2; + color: #000000; +} +.combobox-item-selected { + background-color: #0092DC; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #e2e2e2; + color: #000000; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #bfbfbf; +} +.layout-split-north { + border-bottom: 5px solid #efefef; +} +.layout-split-south { + border-top: 5px solid #efefef; +} +.layout-split-east { + border-left: 5px solid #efefef; +} +.layout-split-west { + border-right: 5px solid #efefef; +} +.layout-expand { + background-color: #f3f3f3; +} +.layout-expand-over { + background-color: #f3f3f3; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #f3f3f3 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #f3f3f3 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #e2e2e2; + color: #000000; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #575765; + background: -webkit-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: -moz-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: -o-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: linear-gradient(to bottom,#F8F8F8 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: -o-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: linear-gradient(to bottom,#ffffff 0,#F8F8F8 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: -moz-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: -o-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: linear-gradient(to right,#F8F8F8 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: -moz-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: -o-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: linear-gradient(to right,#ffffff 0,#F8F8F8 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=1); +} +.tabs li a.tabs-inner { + color: #575765; + background-color: #f3f3f3; + background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #f3f3f3; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #D3D3D3; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #e2e2e2; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0092DC; + color: #fff; + filter: none; + border-color: #D3D3D3; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #D3D3D3; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fafafa; + background: -webkit-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: -moz-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: -o-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); + background: linear-gradient(to bottom,#fdfdfd 0,#f5f5f5 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#fdfdfd,endColorstr=#f5f5f5,GradientType=0); +} +.datagrid-cell-rownumber { + color: #000000; +} +.datagrid-resize-proxy { + background: #bfbfbf; +} +.datagrid-mask { + background: #ccc; +} +.datagrid-mask-msg { + border-color: #D3D3D3; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #ddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ccc; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #000000; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #e2e2e2; + color: #000000; + cursor: default; +} +.datagrid-row-selected { + background: #0092DC; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #ddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #f3f3f3; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #ddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #f3f3f3; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fafafa; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #000000; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ccc; +} +.m-list li>a:hover { + background: #e2e2e2; + color: #000000; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ccc; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #D3D3D3; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.calendar-body th, +.calendar-menu-month { + color: #4d4d4d; +} +.calendar-day { + color: #000000; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #D3D3D3; +} +.calendar { + border-color: #D3D3D3; +} +.calendar-header { + background: #f3f3f3; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #e2e2e2; + color: #000000; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #0092DC; + color: #fff; + border: 1px solid #0070a9; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #444; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #f3f3f3; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #f3f3f3; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #e2e2e2; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #e2e2e2; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #f3f3f3; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #f3f3f3; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #f3f3f3; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #D3D3D3; +} +.progressbar-text { + color: #000000; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0092DC; + color: #fff; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #f3f3f3; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #D3D3D3; + background: #f3f3f3; +} +.slider-rule span { + border-color: #D3D3D3; +} +.slider-rulelabel span { + color: #000000; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #ccc; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #ccc; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #f3f3f3; + border-color: #D3D3D3; + color: #444; +} +.menu-content { + background: #ffffff; +} +.menu-item { + border-color: transparent; + _border-color: #f3f3f3; +} +.menu-active { + border-color: #ccc; + color: #000000; + background: #e2e2e2; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #444; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #e2e2e2; + color: #000000; + border: 1px solid #ccc; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #bfbfbf; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #ccc; + background-color: #e2e2e2; + color: #000000; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #bfbfbf; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #D3D3D3; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #D3D3D3; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #000000; + border-color: #D3D3D3; +} +.tree-node-hover { + background: #e2e2e2; + color: #000000; +} +.tree-node-selected { + background: #0092DC; + color: #fff; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #D3D3D3; + color: #000000; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #D3D3D3; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #D3D3D3; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #D3D3D3; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #D3D3D3; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0092DC; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #000000; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #000000; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #0070a9; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #0070a9; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #0070a9; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.checkbox-checked { + border: 0; + background: #0070a9; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #575765; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #575765; +} +.sidemenu .accordion-header:hover { + background: #e2e2e2; + color: #575765; +} +.sidemenu .tree-node-hover { + background: #e2e2e2; + color: #575765; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #0070a9; + color: #fff; + background: #0092DC; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..a0b8769cc5091d81760c7ed555ac3c3453febbfd GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#8c}V@SoVHq8x z8Mn?6aTf^k-V*tOYvn_ZO}fk5lvg|}E|PI9vs&aPwII@?XO4*juRBlIrj#un@>dub Yl7)&6CQe}74m6L!)78&qol`;+0Id=veEh?7!oT zn93bYIb9!43Wj)WNz0M)xYl!8U>3_OjRiss3@1j_Zvlb#iD~jUnsR3em#t_3WtUHqj%c^0} zFSrhZpjU$)YHUS-lsMx)nN8pghWK6h!524#*oXjC@NjHF9H1y2K%G?c=lr%4eY%ue zT+7R9Pld<2<$C}OAU0HZIJPqD0RA&Sip042zF(tA4uaUhZ>jL`*HN0POocjDIidNRbTZ#@zvW7@I c5>Ct23v;ttA1D3-v;Y7A07*qoM6N<$f&+eyE&u=k literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/datebox_arrow.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/datebox_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135 GIT binary patch literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fWs*_M~|PZK4f_B}P-f8$r|z#h zE+)9D_?OzcE{A)9cRCb`94D|RR5VOsbIEjx-=1{JpsQ;^Px3ZX?(@vc^nEOU2KU{_ gJ$cDa*@;a`BkgHpqSBTGpgR~mUHx3vIVCg!07Oqo9{>OV literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/linkbutton_bg.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/linkbutton_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..fc66bd2cd24047b8377342365a1df3846327ecde GIT binary patch literal 1274 zcmVc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000_$JYFBpo`sqZyU339@ZwM6gi$;Pr>w&6M&T1N3Q$b?ahk3>@EL9`+1-BwzvH4 z=V<*uH!1ee(Sv*K$aVm^9zxbfZU9nZC#eDGVQ*&XXK(qpy{>x2j~_q0QX@ky?B2S$ z`TO_pb_Ho^lHPWf$3SXG3P5TF!a(UIB>)3m?2n~HhFtml`Lhm)4-7>2Cr_RTgV@`) zZDWrM_B#twLv#R=>k(}FC=EbL>?Sq<16=LCHdYi*!X*!q1F0DeKpY^*)!|!SNr;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..0f25d535e05b22b406fd72647611aace9cfa6249 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b1773c24b20b30318e38c4b84690e3d0010c9c43 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4DgeBzU z{E=^QXHHmRmEiEUJ<_jB`NK-}t7{l}8A{FvOK}{T)p$BC>8|6-x-MIXOa{IRh5%#E x$&;(vVs#x>vb(K5c#%QkA)^788{=C>2L8QE5AM%P*8@KmF984m literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..dfa10f7d78b3dc6965ef86957a0e4345ec000bc6 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2O2978H@B_~L*E^a70aO1`g zdpoacw*Y(&nwsF2UyID`n8m&$nZ<^krzppre_*0C6=+@buQ_y%c^L~IL^<_ t&+}8oM91jk1`W4%S64GGH^xE+hOnLmClB8dn+LRl!PC{xWt~$(69Df$H1z-g literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec64360884b3fdb81255ad6074bc08ed183232c GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoVtb9vwNkrdSr%AfUpK=5(o}_e|{SG6u6f5&Q g4t5*qz9vC-hN^}472i&@1{u%b>FVdQ&MBb@08Zm4@c;k- literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/progressbar.css new file mode 100644 index 000000000..ca49e9404 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.progressbar { + border-color: #D3D3D3; +} +.progressbar-text { + color: #000000; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #0092DC; + color: #fff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/propertygrid.css new file mode 100644 index 000000000..e9f98ee57 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #ddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #f3f3f3; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #ddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #f3f3f3; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/radiobutton.css new file mode 100644 index 000000000..341e570fd --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #0070a9; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #0070a9; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/searchbox.css new file mode 100644 index 000000000..7b15815d2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #f3f3f3; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/sidemenu.css new file mode 100644 index 000000000..43e137260 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #575765; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #575765; +} +.sidemenu .accordion-header:hover { + background: #e2e2e2; + color: #575765; +} +.sidemenu .tree-node-hover { + background: #e2e2e2; + color: #575765; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #0070a9; + color: #fff; + background: #0092DC; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/slider.css new file mode 100644 index 000000000..11c8b2682 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #D3D3D3; + background: #f3f3f3; +} +.slider-rule span { + border-color: #D3D3D3; +} +.slider-rulelabel span { + color: #000000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/spinner.css new file mode 100644 index 000000000..391f22780 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #f3f3f3; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #444; + outline-style: none; + background-color: #f3f3f3; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #e2e2e2; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #e2e2e2; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #f3f3f3; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #f3f3f3; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #f3f3f3; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/splitbutton.css new file mode 100644 index 000000000..bb2b6daaf --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #bfbfbf; + border-width: 0 0 0 1px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/switchbutton.css new file mode 100644 index 000000000..a5bf61f75 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #bbb; + border: 1px solid #bbb; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.switchbutton-on { + background: #0092DC; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #000000; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #000000; + border: 1px solid #bbb; + -moz-box-shadow: 0 0 3px 0 #bbb; + -webkit-box-shadow: 0 0 3px 0 #bbb; + box-shadow: 0 0 3px 0 #bbb; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tabs.css new file mode 100644 index 000000000..2767fc0da --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tabs.css @@ -0,0 +1,413 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; + border-radius: 5px 0 0 5px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #f3f3f3 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #f3f3f3 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #e2e2e2; + color: #000000; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #575765; + background: -webkit-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: -moz-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: -o-linear-gradient(top,#F8F8F8 0,#ffffff 100%); + background: linear-gradient(to bottom,#F8F8F8 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=0); +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: -moz-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: -o-linear-gradient(top,#ffffff 0,#F8F8F8 100%); + background: linear-gradient(to bottom,#ffffff 0,#F8F8F8 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=0); +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: -moz-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: -o-linear-gradient(left,#F8F8F8 0,#ffffff 100%); + background: linear-gradient(to right,#F8F8F8 0,#ffffff 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=1); +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + background: -webkit-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: -moz-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: -o-linear-gradient(left,#ffffff 0,#F8F8F8 100%); + background: linear-gradient(to right,#ffffff 0,#F8F8F8 100%); + background-repeat: repeat-y; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=1); +} +.tabs li a.tabs-inner { + color: #575765; + background-color: #f3f3f3; + background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); + background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); +} +.tabs-header, +.tabs-tool { + background-color: #f3f3f3; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #D3D3D3; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #e2e2e2; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #0092DC; + color: #fff; + filter: none; + border-color: #D3D3D3; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tagbox.css new file mode 100644 index 000000000..46cbd333d --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + background: #e2e2e2; + color: #000000; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/textbox.css new file mode 100644 index 000000000..2705ebcf9 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #D3D3D3; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #bababa; + -moz-box-shadow: 0 0 3px 0 #D3D3D3; + -webkit-box-shadow: 0 0 3px 0 #D3D3D3; + box-shadow: 0 0 3px 0 #D3D3D3; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tooltip.css new file mode 100644 index 000000000..fee263f7f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #D3D3D3; + color: #000000; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #D3D3D3; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #D3D3D3; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #D3D3D3; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #D3D3D3; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tree.css new file mode 100644 index 000000000..1cc4f2d3a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #D3D3D3; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #000000; + border-color: #D3D3D3; +} +.tree-node-hover { + background: #e2e2e2; + color: #000000; +} +.tree-node-selected { + background: #0092DC; + color: #fff; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/validatebox.css new file mode 100644 index 000000000..1fc3ad64e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/window.css new file mode 100644 index 000000000..0e522cd88 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/window.css @@ -0,0 +1,188 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + border-radius: 5px 5px 5px 5px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #D3D3D3; +} +.window { + background-color: #f3f3f3; + background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); + background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 20%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); +} +.window-proxy { + border: 1px dashed #D3D3D3; +} +.window-proxy-mask, +.window-mask { + background: #ccc; +} +.window .panel-footer { + border: 1px solid #D3D3D3; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icon.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icon.css new file mode 100755 index 000000000..50d4f1b65 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icon.css @@ -0,0 +1,96 @@ +.icon-blank{ + background:url('icons/blank.gif') no-repeat center center; +} +.icon-add{ + background:url('icons/edit_add.png') no-repeat center center; +} +.icon-edit{ + background:url('icons/pencil.png') no-repeat center center; +} +.icon-clear{ + background:url('icons/clear.png') no-repeat center center; +} +.icon-remove{ + background:url('icons/edit_remove.png') no-repeat center center; +} +.icon-save{ + background:url('icons/filesave.png') no-repeat center center; +} +.icon-cut{ + background:url('icons/cut.png') no-repeat center center; +} +.icon-ok{ + background:url('icons/ok.png') no-repeat center center; +} +.icon-no{ + background:url('icons/no.png') no-repeat center center; +} +.icon-cancel{ + background:url('icons/cancel.png') no-repeat center center; +} +.icon-reload{ + background:url('icons/reload.png') no-repeat center center; +} +.icon-search{ + background:url('icons/search.png') no-repeat center center; +} +.icon-print{ + background:url('icons/print.png') no-repeat center center; +} +.icon-help{ + background:url('icons/help.png') no-repeat center center; +} +.icon-undo{ + background:url('icons/undo.png') no-repeat center center; +} +.icon-redo{ + background:url('icons/redo.png') no-repeat center center; +} +.icon-back{ + background:url('icons/back.png') no-repeat center center; +} +.icon-sum{ + background:url('icons/sum.png') no-repeat center center; +} +.icon-tip{ + background:url('icons/tip.png') no-repeat center center; +} +.icon-filter{ + background:url('icons/filter.png') no-repeat center center; +} +.icon-man{ + background:url('icons/man.png') no-repeat center center; +} +.icon-lock{ + background:url('icons/lock.png') no-repeat center center; +} +.icon-more{ + background:url('icons/more.png') no-repeat center center; +} + + +.icon-mini-add{ + background:url('icons/mini_add.png') no-repeat center center; +} +.icon-mini-edit{ + background:url('icons/mini_edit.png') no-repeat center center; +} +.icon-mini-refresh{ + background:url('icons/mini_refresh.png') no-repeat center center; +} + +.icon-large-picture{ + background:url('icons/large_picture.png') no-repeat center center; +} +.icon-large-clipart{ + background:url('icons/large_clipart.png') no-repeat center center; +} +.icon-large-shapes{ + background:url('icons/large_shapes.png') no-repeat center center; +} +.icon-large-smartart{ + background:url('icons/large_smartart.png') no-repeat center center; +} +.icon-large-chart{ + background:url('icons/large_chart.png') no-repeat center center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/back.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/back.png new file mode 100755 index 0000000000000000000000000000000000000000..3fe8b178ec9eb9fdbfefe0f2c81c8d4acf0dc275 GIT binary patch literal 912 zcmV;B18@9^P)DPbufGfoO#dy!l?7(~R{rJuB|Ic3( zr2qlMf}#2UUndb!-U*#ucDjkNIt+}=Obow%{r$o4^UqfXE*6k;foc%S0Rjlgfd4?5 zf5px&s!cN{J9F|ViZCp>{+}U8Tk|V?U_iPMphZz_IS$;9h@%hJaXH%3`;KjXZQ*9FFVV3hN%aCGjMUR1HHn+ z@a^MI26o0j4AJ(Y49b$+;J^R~Ag}?Z#!~g|?RE?+ZZR?}IQyT0vRH6Gfp6#Aq|XXnD!yol{GeUeEH15z{&iNK}>*+ff=Ho0U&_D2K@WS)Y#U3 zL<*QjlG@v>7^K*LF;uO1$H33~kD)O@mf_`_pA4@*{$OBc;sM6se}=oyzcD<1{hb-4 z7a)M3fynfS;s3w1j*cU*?%aD#}SqhQ+&{GkpB3~WDG86SXj0t66JI$#2Z>i^0$tFE0td*)?Zf4{AAccL7__n-e5zW@IF`Rlho zISk)^-(&#U%K~&i4@4_K0AWeW%&YF-``{WFx_xe1-VuhUFTXRebF#1lJi_@W|M}sAhw_srY>W~TKsPfouoxLJNIief_Uq!sAfaEsA{^Y@xOjmE zgETUH_`vZ0)G3BDOP2h+bm&kaKmak@u(Mx&^y$-mrq{2%AP9OrSt~`cWMBe}Df@WdXVtAb^-{fqrKM zhBm{WKbK$p{CV}~>(@b&Z{ISrfec|{VqpC9hvEOnj||^|n$Pav|M&czJ4yfk{hPxK ziXor@00G3p|Me>aP=MhdQ1O2@wh#Zfxc+?xI`hkm7YtzU0Ks3N8c+cLWnuXTwCn>L zPz;1Y=>#Bvm|a;}8UBK7;o$HwmX%#&_3Ev z8Du=HOuX z4|L&Apeyv`#@8bfBxE!U^>5?3)J&j7~IN0z^T7prh^aQ_9m=nqi-_p@gVCMG7_z;K%h5I{^nzkYr61?WsB zppBr|;1UpEcqk91j^EtPTT1|U8QuVY?eYHqKSSK zP3o7x#7F%IgmygBVw*mDl7H^Z{OA78x#wJf^N>g+(A}*)`QG z5RTB`_EMce+Rq7v1K^?@u()CXf6xoz7!8!yDW$`H4viiQVXJBa++G(roc6hNHhJa` zc)tgNK1C=T#LYg4#zR25R*jil>eLtT{GdaAuGwmA2T&d-c>V5!!d9NyEp9Qmxe|`j ziex$g4vI7tOS{$FMw-cFlc$u|)oH@xv;lB4TdF3p9zS6L`{g|*5)D-xF1xRMSgLOC z7MSARP8Hv+kyxnx2--m{*z6VvMS>8Zy#!`G*)JEFkDm^i! z57&EQSe~y>rx{P4Jq8WqI_>n@dK|C^u()ifPp27dDGN*U z^*)3m0U({Lwv9rzno6%R=}dwtY~>hiY=vzs3$T+mn9{vzjZvdfBXyxZ39Q1lxt*_O za!Cf)+FBy^2Uli$r+^So1&^UvC9Uv!asn@3M*|?0O5yp7r!a4LH=D=I>FhdY&DZp^ zI_lx02LqV>=f-B1VTE_&n|?;e8M}28xLj@nAnp)D|3JTRN;i4Tjw+i=)$ZND8$(OU zO0JNPx!jIl*?fw5pNO9Is(T6ipVtD2MW9ltL~^<8_V~oBFC(MFPBbrJi4vhmDCP_J z3YkoHXME!2*U=lJE*_6}vFCCRm&4&S04zz3eYkpUkW2Ite1g#M`uYfvc1r7BSCpMy$Yx?I literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/cut.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/cut.png new file mode 100755 index 0000000000000000000000000000000000000000..21fdb4dc3c8ee79a0ce59a981c336538bb334442 GIT binary patch literal 1024 zcmV+b1poVqP)KUssI7R0t_;S-$0W-{rMx#%*eo)+e?%RfoV-A` z?ccwj;n}liPhDMIlit34>!qu!Yo(>7CAn+YuBQM2#PSp96fq8t;>8MTUb14+5!+ zh1}fS`vC%oB~w|slAW3PZ_cGlj@4{z(`tBmEnEc!mA;smFnr?YXSj9d48xmOul_%M z{`}=lpp}mwKc2(K$G039!2g(mVFeICEJ7?SLUQ8b%?bbpD{3O`OVC%+UevppX=w(zf+GMz2w2fBr5aagUt~(wq2b6{=H%aCSg#% z;Q+?Mw_m@&E&&K2CXiWwfX;daOnK_U!VcEb(%ehWpTE%h^=r=l|Nr0dGcxisGXPUK z$TlG61Zw>H_%XwOp!#1x0|5dEoRGc&4FEao?Uyf)o&i%`p`f6d>(i&31V4QeYY`CW z`^e6IpfT9{;&=|5oFFCgx5C zCdU5^zkvGwFf#xI5F^9@Mj&PZ>i;XIDz1EIW7#HNO(``7Wbpj`D~6DkIEG`Fj~g>E zv7BT0%MMh}%m5HTKwUu1|AE&0`w6t2L0CglgBzr|=0G*WndfI1m|2+_WcXznrnpXK zFxRwXICk!k9K(Oca|}%X!CCZghWKjC@{mZ}K|9&$aet3l8(A`4} z3_y#NM3or6{{6!6{l|9(hVS2X7}(iA0KNK@fra@tKmf4-8BwZIYO@XHj5z=N`2F8h z!HkKOiG_iOjfa7mgPDPijg5hqofqgzMg|KtBZgP5QB79zkL@az9?F#YcPyZ^3>T>rDQvi#@l=KQZeU;qEDcej8t|Nj34Vi0)x=H-9m zRJUIM0mPyts?4V;rOD8+yMbZvjlB#koIpo0{bjiO@h$^58#ge#m>6Dvd(DusJA;9f zos;1k5E_WURn1feKaiAuu1|BaZK*xijMU?6_J&-MoG9!s-C zzdQA+U}|%2STXXENpkw6Jq=WB#30h**Zqx80G7xg2LKoZVN&=1FEccT3xQkve43;n zjZvX^?*P{BPNoA(9dqA2RbK$HFf%bTgA}R?sWRwG>M<~LvjC&_AH(x+&l!FKqZXu* zgNcJdK|q0lm5r6*+rMuN%KXYeyO>(c-8{PO?x|MdU-|N8&%^z#2WXiNJ7h~@6v zdzJqE0h7#>E!qD3`omx(tIv?@mCeAx!U6Ut*b6}K$qC3ZY&&|8VcW@F4D1|S3|H@7 z|9AS=o?ccaRt6&pBZl99|1dDI zGBU^m{m;e1#lXV}Oi-MhCxK>dW&i~p&}9Gt!~zOUV9)~%0Wtr6y!+zLuZM3QbN0IR zG5i5SP>3@F;m5C^8P4814U9_G7Yt0G+{*~gyZ`~j$dJs4lARg<{>{>s*6r4l)n@}` z=l}m08CV!u816i~$8h@Qg}#6P7^{HU`5(hCMsRip2rvLwO?vxoke4F>0000k-9#K@4yU?IRNuvAG{MT+4+!{7h^fL{8`$iM*d**|6= z4P^fVVJ0wUWME=o`p?At@cFZEuRncB1qdJpzI47ba}Uk?|Kr!s|G$3!`TyhRum9hF zK=JqAK>Q1Wzk%@Y|3AL{`Tz6B-~ZcB?f)+or2iBkfLOGob+i+#;~6f!yu|SE{X+(J z7B&V3CZLTV1o9vwBM<>GNC3$H3xvX)LJS_J4h&{mrV;=F#KOtK@sEj#iJ^O6H^aK~ z>lj$LSr{0AW-tI<&&a~az|73dz{Cu6HVXuQ`~Qu>M#h?9tM@hrPBzZJ00F2XV-x^j z7z9cv`TuhRA=;X)qu}73hnoGd)hHEGiI`W8Wd+4gnzL6}5;?d6hzTh;Al{IJA|HldbA>qGJ3W z(Akj0gy6FuMFMs&||L0%d|AW9UApQ!(pZ@&+|Lq@y|Mx!xy!-m`f6?aW|CJIi zgSZR;0Vo`U6o5e(2o6=NC;k67TPnoF(0CnomdWR}+}Y*TYj=gwum!e34a6bEszh3= z!9Qg_5-j;~e*pwG;QznB|Ns7DWME)o1UvLUBgD}l>Nil}H_*V}Ob~(JKmlGpK?W`k zuzm)B0AgW)14af$paG0PMQqGK9!Q=Us_72{I7~pU0)`4Wj6lu@0e}Dk8vxV?mSALJ zf(SB0Y-eDC7z8r(H&F8*sH6WgGBGeRL#zb|Ah-*dfU4M-L8kr%^O=DPIDxwV0X6*r zc?B39|Nnu!_Y-I?Cj%2yA3y*>0ujjj`kRsA*aK#UKmY##Z39LlQ0L#je}VLWhQA;$ z03i$WUxq(F{xf{~!^yw`jbDHO0vo{2@}J?wcLs(tS6LbUeES7<^Pj&!!+?SC_b(&` z`~X_;?h`WuhX6AJJ3lZ+SRe)f1Q6H&W}qLx0b`K!=QoB7%dZUL;!F%*zcDiW`~?XM z77j*++Yf#-Kmb7k5$NBaKxeYD{AG|5`NuGK?Oz55Qziy; zeKv;gK$mfHGBNIfE{W8Kmb9!05tU%&_vdFGjGd1eqWv00a=k1&oZ$Yy|!NK66*5ZHhV+bRpY|MBzx zeXpJ~@NlyNT?C9qXd+?)M%h=O&F_E~aC~8Ako(8TcyI5es|*dw3;+Sd2uqUW0)PMm Y07EoBQ)jr0B>(^b07*qoM6N<$g57L=!vFvP literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/filter.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/filter.png new file mode 100755 index 0000000000000000000000000000000000000000..1fedf7ae66f9512c8991a91f606e33926210dfd1 GIT binary patch literal 305 zcmV-10nYx3P)i;JxOiC&m|MyN^@V~Zu%6~m0)Bj`zY(-tqe_OBM|76EZZDa3$M~@)# z4XCPX|L^4POMwARE&rW8d?@fjbNzpNXSe?h!y5nqPb`Zh>Gjmx00000NkvXXu0mjf D9Yd^C literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/help.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/help.png new file mode 100755 index 0000000000000000000000000000000000000000..28a0f9e5e6a24fe2cc3d842d0708e70512dbf84b GIT binary patch literal 1187 zcmXX`YfMuI6h6Hzx2+Ut1EjYq1A-3cSfq4{Is$g`oXj!QjiG^7TiBdhXGlOZxm1@9 zS*DOla3bRT0cHN_rJ;^5DgN)q2ZN z|EAt&1z&5w`m%mvX&4t+@c4Ki)zj^n9Qtq}u-Kkgm|S+sG2Fc6RK?X36?YJhP0dA}?VOU?JP&>G6klO2uGz08Gy=gKR?}h(b{K&aenodIzi% z2f@MJp01+RY|(6BJziiDpcm1+C)f4BSg6zCdpJmKRiimi){G4(q} z1^PxxRYp%IvSXi?q6Z{WU1=c||G9fvjNOV8M5eGC9+9=$-Km*DQ5AV*WII_(dnpARZKp%77uh;KZ$z~72R!)*N`!~x=0M8DAMel@xO((;7NkGYln^j z>m@53+D`)q@q?T2z|AfKr0Wq7@&V%3vEWE%IJj2*@I~|AQ1|l-SXw1vg>V7oa|8I- z0PP3HCDVWP3>La6dZtL>>2W$NTXeTeE3}I*#OEs`#HLvXE;&}!k}!JOU8}8G*^*;= zPjSv0_%M5yo+6j0Lw14m9`2dn-mf1NjIPg)Vw7)%a0o9zj^>|q#+Vv13MJSTT;}7h z4Zfq*P7G=k-K=j!InVUNj9wh!)4I~ern6^GUXtfu4!SZ`QB}@5t|WV`n%8=*ErSn) zGjYM$*~Vxc9q@=I`#Q~!`<=w&Se+$ud=Pk1O*Brwau1*M?WFKRth>8iTZJdIQgn~v zCzI($b7!BT>3&ZqyhH4&mz1-ow|8KFVjY;l(ti5lghhYge-hacl;-uimIqemZ0Qjj zBEs2%Kv-FHfq7&Jo><&)%Bjgdi{^SdvbB+` z{s9&)87BY$ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_chart.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..527608ee94683724de57fac1ed7593714ac41be4 GIT binary patch literal 1669 zcmV;027394P)OoL=dNpfT{jDe$P=9Ivhqz^iKm@S3IrUXvM(0iptmQ@N;^Xr`2l z>4!e;MtyMJ3@@+P z*cta0P;qWNgQ5t%kIIj;1wLh)>WhuhRMihnmHnENfO~VPJZBe!rXUHBxK2!dnjp`y z(`>y!X!;Ed4J}m4t$ZUqDz_on(tKFP<=Z=Rs60EC!Cg-WdZizNtwDlZX0M^Vz;da) zRk?SP0@rg5(0I-o4d?oDoM&fiyuRg4U;@stq2@8HW2l!$}hO{43f| zkRR=*CN3~#OC`C|Iv#~EN98>g3S3CjgZzXU!JJQyrc1M^d~XB;xx@+$vxiXb(Hu;2 zFkVG15abzF9mEABn@ce}UQW15nZ?ctSFs`YA(b2XNb$S02Wm1+P?Kd!R)b`wDdkb6 zCzU6LGN^U6z@3>6xI=D6HtT0{`DdiBAW!S7q=4(sCGh;Unj`KKp_&pQYoKyNuN0h3 z>4uAkjZtyfh~o%1H-B;Tyx`6PO>T7N03V` zRm26HLyu!xbTQ#9Pcfzv)@CTEytl`8oQ&&CR-qS4QuImc^K&oUE}l;1F@X$9N9*IV zt0kqDPnO3&c?t4VOC>Ad6r2G`;c zZL$jAAUCcD$!6rIrcrt1d7v}p0A*tdPKG=NXjthX$oHBn*@BUalQ2H`5S$6` z=j!BAD(~+66VldeLAJFU$F}YQwYk%%Jlu!D>47@<&9NuWwLl;BLGFS)*|eRw!0-ie za0*Js*mo@Da%Dm>mFtdK4rzo2jz;S?v#Be|uBeu|QF-WW1}FM!qG)(`6n)FmjZ1QT zD{!hH-)-`>xWHha&2U__1EVQB;porJD|X~jx$a1R>xdQ@kmMRh^?hR)nfvf`+O z%7Z-_$ZXV*Kcq8G59xyZ!8~ME1WXp>iN;C_IDEeWBj(2tw(!JIf?{P<-f74@B!zT< zbe#^N6Q4RbKqyO}MCB`HFgRwVijxkV$WJf1UsxQp=`3I5BFGbr+K3C-O%KIT?T?T-@#dA#9Q z;sUmAt1xJ0IEN>jVHikqadaA$YuV30+)`ES3DG2Ik=5Xmr9?W3%2^JXwn3&%2M%i% zH8QK=vahos-)X311*~0{V8FCs!YV!q?!oZixSz_^ZQSt75)~w@)IcI3VHJxeJuXgl z5elRlllOu?D&(=NLi0!;Rg$Wxo;OaAr}+IKF3`u>4|bBJu$#P;roAMHWDxu!_E7ma z?={#K&<>Oq`+Z|wn+bg3ZL(&JZbVMWEEBYkyTWk)Z(So z!f8HiUHo|hg!B!M$GACb=$E$mwIkcmQAGak2~^IWlW0V?!K{sl3*KXpx^l@oc}8YI z#pD*RYzcN>l)?XzF!)U82=c!Hwib{lHNGh0 P00000NkvXXu0mjf#2YXZ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_clipart.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_clipart.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9c44002b6f76fcddea75aad020f5f58e91d10f GIT binary patch literal 1727 zcmV;w20;0VP)x*u^o!J%G8Go5#Sw4Cl=Gy7nFjGX+6p^{qM5 z(mrROv)2Cizt&#=dFY|fu88YsK_y|UCd*MlMq#B`Ia$u|+!1FrnT0iE+ROFxIagbZ z*u&b#QAI{Ujm(#m>8uF*IBWF1ilh9FIxj@|tpboCFB!ZBvjgBC6C1_SV?ero`zVd409F^ZnVytEzj z+IIM8J67)xU|=f@Jq7(+nHr4d z0U&f+D!PDBi@zS9KwR8w?BBni`1p8IQ&aKJ&TEz;{no63;7Qqi@sn8RHxaD=A$0u$ zx_>0Qm$~8Z5R`FZD2KgiCqD_K@~Rk6R3AE&#=d>~Nli(^mYhgcRTcU9c}(4##uOGJ z{no4j|JzS6SFnZ2(_3iT`#2pLKOxYv4WnZ#!T!z6k3PZp$XmQ}a3xSyVU=b;Hpr{5 zyv$3xcH?$mr=__Sm#dM4ghVDMd<2cfD8E$z6qSMe&G;RgxoiJ6P4Sy>$34zq;ZK=u zeHQ=7_nDgf6(d8Hyqxm(3IkGvAr^JvH8ft~#a(--tGmei^|cf@3VFkph|lN4FpMa_ zHBwN`Oxm}Y%l#(Csc%5_*P-zdEcYhNq2~w=KZkELmb*Rg@~5QZQ7KS4P%JE(2JNja z#O>a}fxR!1{fDP1%R7wk{v->A73H@k0Pk-erEA9{4DI;+?@~A?bnf;fzNL4t^Nn0~#vfY&ASrkdzf}NKdsJ;weekJlsii)s z-&z13RxcE~Ph-oX@}Pcev|^=bqJ%=J8dYb^5(QL^M$vraRJop0->Gpqkosm>^^~3{ zZBRWW+ff~kuiWVroYEkX6=#icGj;%1T3}S9!12t5+O=>M!0#K?! zD6@G=H6ybV?=Uyv&;b5h4bMpm%EkWKDBb%Oc<-2ahhWTS=!It%1WaH9HOwif2rt@F zrm61iI;C^2c7EgExsu3gsfk*q#@>8L>*7}-+H@GPvZhS1(%f@PWMW~-1b70MvV)`!#h+IbRoX|`pxyy9^705_c zQ_LN!GRdh7ka>QAjC1pxcZ0i6F%aT27~oqPO8>F_$_6ol(Q+4B2H zRa1@Y&3FAAE}fyUF`R!-4_xaB;qHd!?(lPq*t%+{s8pvwQLPr48_(4D`e-iA+ggNy z>;H;UHN`+qr9pK&T=9x^T71|6m(|#XwoBfS9@kYv)jl6Y)l|#PXAXGiP${ng8#1mU}|Zo%=uhJ*(?ORjUPT&oV7T@4iq1#kIXS z>pwEh!}dHSP*~HAq;&3nO#JJFPUWA*kVU3>ISzyYsesrOhcfc zvI7a}3{qggjZq)|mazaZE|~}dlRLnSPelvA4FU`uTiT#!;BH$smhNLmGU3GsO(z7pa&TA zLbbzQT|(cA3CSb{WF_A3Brq=kjWbv9s2_g zHe9csPs=!tXKj}-$Rg7a$b3?#7H)Gd22$I06FGEDdVeIrD&H7H_40VmpCR8OQOg?F_{fi%dh{ zR$i6bJ!j|y#f|UKyatsPN$Ywl?VBl)PJL?zct9m@yh#BhFupA?UtGzsDY zTIBPPetZ7*Af>@JgVkW15N}yLAbfHPa{?SVrqcYDGGA z5p_@nGN22w?bo-fM?X)mC9F*bS!5al=~*W1Nv9)ljQrYhR4>Cw$z%lg%ZK6Ljbc3% zMenE+&j(h}>`b8f)H!+0Ga|`tU%^jVX51*Xqh{emiMC0aWgA(W46?{H1TNouh7eyK z|1lm_TTvw!+Y3q2_yPVfS+V9jL?o7kSMK@nNfLKzW>GSM3~ z4LUL7ioxoPA^n*RCH51wg$)wcCW9<84S}@GB6WSt`;L(N!h%YH=UYO!S7w1L7)3;& z>%kZ*`h6(v+Lrg(t0YXeeblYUHmxLZC4Ug6&Mj<36PQ}lVCo5@VLXaUMOKu~#!xG= ztW5@4WEuh&Za;)54$}IzO)@hAe=xrn#BH50__uFnB+1jmh~)>Xi%dh{hieZZmlf=ukGNmb{aHf> zS!5al-=#l*Tv+%ZugF=1EHVv&Z?9yjZ}4^bE;x&jMW!L}_2v6;^FJc_XW=YD7MX^? zS7~?Q(tj76MaUx45IBD^Q+1wY$TS4LypVzaB8C8erSgX&JI*x1{1Z}+=L?a2m%RW0 N002ovPDHLkV1luY1RVeX literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_shapes.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..90a0dcacd8d8b851262102fbbd9f99e23404da11 GIT binary patch literal 1318 zcmV+>1=;$EP)9s!&kf1?`{(nr_nL4ijp z@Q59_AEy-e%+o#ZJ=sso=F5O#0npiiBF!K&3p5uYxXhffFJlfWXEo!=YI0RFHj|7W z&H(1NBtX7zVpRehUIYfo{O?&edZ&-@i=qNGe+_v<@V;`X*;FshvcF;T88V-8p>5(AZNn>gl#-9;-jVL6Zqt{a0Jynq z=d$e|UqepKAj-6p7_e+%Y4Zq2$EP^I+-^6v4_uhEA3$qbL2-*2*?;t+e{vhTc{lps zyU|0LcUUCzma!wWo44>?RMtg+^*yP4@*ZZC^RgtE6sv5dFQ1Brbbj=2NJS70%oFl<4p8eh$siTIRu^T?<{w4o zO=R3)cB1v26SpHX{{@gzDCU}*i#0~06P{d1)GpdTw`eE^IVH2hW2ryhkXf6>4UOp# zRk|J0HfjvJl%W&1!qN%;80}=O&W=zzH!cA1_^~mI4a1TO(K6ve z?<_6=*!%$084n2hL;y(UQs(uhebgHEQKjF7vU&gsFDiWikiolUNjzeqNd@?G()}L* zxB$S=w?dza%-LLHI-ttz3G;^GJw&FyhN`l|8z3UNK#ZSRo^4V{Vt@eSC-^$#iIh2& zy_QVXdIx>(Kz4Z_VxN`K88EW#bq<6luOHzqnF*auL*&S>Jxa^#HoxuSGW$xFUS7_o(5!A3KNgoUV^#B8C2JFaD4^28?_+<%y_grD6z~>!07Bw^NBr{&sH!?HH|NF8(A;BIaA(R2wgPNQaZIAy zso^etBH|Aig2zHuumB$OaE=wwGvPG=oXvS4>p?=k_etpRK8oMk&H$u2_nv~F0q)1= z`33l#F$@~uhhJ49*yRA;Q^42P2Jmx6849&?=&_ywoSa@>fm-^tE9siYou3rJ190ai zDb^faoa~#vtuJo{>G47$b(*}il2nl)ZxD%s9IQ=WSaMlM1aFb`3 z193JPDm9|h@^P24;|Gp!!_sg!T7jrk71ETISDX8*K*;AqW8dg)8OE1{Dc=+5++PL8 cmjX5Y2jT&te&o4V^Z)<=07*qoM6N<$f=jV;pa1{> literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_smartart.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_smartart.png new file mode 100644 index 0000000000000000000000000000000000000000..b47da08fa7ff9b56f6abb2517cb6c2177029faf8 GIT binary patch literal 1336 zcmV-81;_e{P)pBh)O^%3AYgtAK>fS=bS`B3ob2ygd+n1+_U!rp`nRtOoyGX4 z=(KTP5eZuwP_)XRw^g9SUyshotLT2$geTLtU<+8$8*JY(&u4BU|8g?AY}~;uO)!@y z>wkj2Plaovm1yv2ah0#c4PJ+vZatdah8=NjxDqu^B~rEDZ*79zU=O5Q_QT*TLmht} zwVWEYLlv+Ll%uADk^-pOgQdid1!+XCm|3L0E>AWS|%q`)HvTg}BgDAjS}svlza|@=dV0YH3{6 zlZT?;5|LSXFg_DGEyrMdDaVDrLR8!HQDr-gs^@uODs6dD`NlaRe|~z?Tn_SS-8^HO zU}CG+Gl3mS)#Gevp5;KhOEeN}tbCY(<8&VG+4;sTzoc?ne#H5wCtc4@QF? z8cVQTnB(CM;}OWMQX}i!QL5g(8gmDdE#IO1!7org&JZwKo8epZkf0|V$L4v74MG7o zJcM^+9+U|181awbSYB>Oyz{eXAknlJC0$8SK1!oriRi62Nth>L9^(s4)GaU?ieYgV zJaaBVj2Fgk@RYj=*9-@zyBDWaMz-}_mz__EdJB@w-=eVNXR1C0G$ibX+|Vviq-%pr(~4|WBhpIhalD`wM{`U#l%)eVbHj>odMUZ zi>l_pO^={|bO3{14*t0nOwO%F8_?aWhOCXmyOUAvI0e&iVHD<$R!ppni;K(T>4rEm0?aX^j%&w4$RTOCJA`P6-9ma{O zACRd&6cbHd132F>F(fcNK7^q$k-^bdR3Sz0t1tr|#vu9$-@C17zr@~VMVO#}j;dx*^?pe_mVpFjf=$HYdWRi><#o(0 zeIOGbkS;e7227I?h2al@VqH55G;KIp(Ta?c8%Qp!$FbZ?IGk-HQ)>bff`R(azXe-e z*V}s$T>gl_(nm6}PA1l+U0B1rAR!4%(oQg@NXRcSF}o`CpNa3nfIYT>`7av?@4)O1 z4P0$!E%+$5V3EWb)Qai(55f*ig$Nm$TNA~Jx2$>+enXM5GXr;DKyA4#e3((VOSWww uo;PJ%&{}NG?HKsto3b6^`p5L2x&8(W8B7jWgRVFL0000P$7bO0Bg$#2^g^4GL=P|t$hNq6Wo3a*(T;p z0vQVx+}+~^FZg$7F5mpj8TfC>dxjeSoPQ1VOMaA_u^ZnVr5#t%}HrnH>ScvMk452cyww4>){z4m<+~ zz$VYjod;A^<#YL=rT|^%{p!C3c<0*i002ov JPDHLkV1n}aiueEk literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/man.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/man.png new file mode 100644 index 0000000000000000000000000000000000000000..a8cafcb9a1bc9fafbc429093084aa2e5b37103b6 GIT binary patch literal 244 zcmVC_BI~?$baTUM>r&7#gjkN^eHIi#o0SqI#KDxPp zw@9vyR-*q#A1*f^_CI2jYYrM;0TvR|rdBA|{&P?5Vul}=KM*D;@QW`DQsz%=+`fM~ u3QS{w?+kN@RWQ}B0CTJ}SKVj!J=PhX&@(3LQ}*Qm0000>$j+3?x7IEPn{3BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%xd!-zxLTAQhakJ^Q+73{+?&sPG@tVTk}cBH8-FbMA2gTIwZ$R1rnqZ!{LQN5dZW*_A98)a hcb&}1B^+S+>+nau>-9y|=gz9{lr;}c=wVN)Q*o7; z#1rt#{)*L{NuLvUInMbWz@F$~q+t2X*32`7HA0n}1B^+RR-Z*1Eqt_euNB=!4?3hCYmYkCBcssH5 zPdnEk2K$~yJ;tQ}=`B*K3`ckaI0gPP&VH(3X7A9z$Z+9+&@?^iN_(Jb44$rjF6*2U FngA=BGHCz+ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/more.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/more.png new file mode 100755 index 0000000000000000000000000000000000000000..94922a2c86cb6b1cd2a7085e055073226ad591ed GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar-fh6Atj!H2mNcuy5Mr z$>!hq!(QaR^6>_B54Jn1#~Jije3o~(=`7H5>`;cz1${9F%W##sAI~(r1scHM>FVdQ I&MBb@08~pNrT_o{ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/no.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/no.png new file mode 100755 index 0000000000000000000000000000000000000000..37a7c7497782dadcf14a765051a62dd5616200c5 GIT binary patch literal 922 zcmV;L17-Y)P)~H)FpGiVA+maa075~P;^Ost z%FF+My>{*Y{|_Jj|9|)H|Nl2{{{Mgd`v2FHC;#tBN%>zXAW)C22Oxl$VT=}a_4z4N zrW6=>dNQ#7{ma1c;R6H1`}YhCZ{IR7ym`aG`ujJ7l8z38nu>}8%kkq1$A10V2+{`- zKwtwZB_!%oy1NTx6%`p6K7NE?kmh&qz?vCezh+=~@q&Tj`Ev$7py4W#k_H^-&M_Qi zU^oa6K+Hft^Ls=_t}xct=3w~ph2g@XLkuqj1Q@RF*ukL03^f1MD~7#5#lI~rfyxgu zaNW7Xz<&Nb!`D}@41jje0SF)#Adz5aXehvN>=*+B8yf?swKapfn;XM72M30|Sy>DW zKpQP*⪼M8hY&JO$LjiB8ETz{xN7UFbD`TFvI`^5R0b1z5^G~7O=A!85y{?ZDaUm zW(L+^Ic*v^d_e5S7cMYxwYD<+1#12S6ypJ6X$A&ofB<6R;@}Wqc=-|@XtF@Rz6ILy z4af&+glT^3?aiPM6a#4n;om^~pMgONAb^+{fF?40{tPhyif@4oL;}JJ3Jh;0B^mw# zW8x=}{|jLN13&;Vy?*uT0mILqkWdF|-uwSQgXPktaGPN+vD~wV;i$eo!w;Y)5C$0p zwDt}_05Ls!`0&8vU%%kCa{`?TcealY!&?szxFJjd0dNCeK=2WO00KL4xwZBE|LW@h z|4T~#eCJ-NHV0gBdfguHGz&s%LFGwFi05M|8lxzVE3}(QD5+KCD wpazO6V0O9-%njRjGcW*?E5jFL#Q*^Y0M({d4SP?a6aWAK07*qoM6N<$f&>VU5C8xG literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/ok.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/ok.png new file mode 100755 index 0000000000000000000000000000000000000000..5b0f6a6174f67879d89b8c970d88734cd6f9f844 GIT binary patch literal 883 zcmV-(1C0EMP)wF51aIxG|t0o~WeTux?(*f!J?S`!vJrWM3^ z)v?u>(g^>@;xO#mkNlu=e*%b!BkO=S9U%&s|{QUTj4;ur+Qxv`b{1=&{q{_{@=tdkKKPJjPv{N-R+ z=H{q0b!wOgrI|?`QkZ(!{_7i9LV-VtRJx`%DQ2F^23wD{DqBhIRk` zF);r5{m+$GoMl&Put7+Jt2=`@4-Z4{!AlI=w!d7({+qd+0V(7F0suh(zW)OTFd63V z^!sFSNlF9<4gMd;*WzU&Dh*+FS2`3*A~OK^{__Bz$W0R(*Uum z?9l=80a*nF0_+3*1ONs71^@>82>=H93IGBCK>)u00}wAF|NZm@`|<(rTQ4UU0WcOM z00aL60Pp?k0KeVV0IsF+;Q#FbO$G-6;062!00#UB00{XE00{OE015OE00M|vNJE=} z^$*A6FQ5Ne@vDAS;$dfD`1Jo3!|5mY7`86`{^s{nmH;M>-&g)K|ATm%5g73x%=8b8 z0Ro7L;}<&v=RdZejL-PCo<9Aa;W^_ShKsN6GwfXY>&vg(Trted45#rWFn|DJV*bm{ z0Ky#q*cZJ%!~O8Y?dJ?fS26$kepw(JsCg%$6bcYP%o1uwz$j&AU}9wa&h(8#?9FW+ ziyzl{>lm2-O#9FFhv6UdZ-)OYzzhWT0wab200G2EX?6w(FaS`kAv2YZ@FM^K002ov JPDHLkV1n^7jC=q9 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/pencil.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/pencil.png new file mode 100755 index 0000000000000000000000000000000000000000..5b8cc893d0e50c0e15cf10fbbb08706f81ec224a GIT binary patch literal 713 zcmV;)0yh1LP)R)!_m*FeI9eJ0Gxq#H zf0_XxfS9lv%LmkKB8}kx16siJFV!*nd7pOS69ERhSDg(18DcA(#PsQ(DfoWDDC{a=@>nto>xWzb;o zP$*;Aa%nq5TlT(fKhM4o2P*mk(g_ei5CcqsHvff2=RY9k`aMC~Kn&o76a{330bLQrJ&U26`M=Sy3)uqGxWf%F0d5QMO1 v>|l^)2n34pz-1YUGXNlf7%9!p009O71V-RMzjpE=00000NkvXXu0mjfxvf2L literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/print.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/print.png new file mode 100755 index 0000000000000000000000000000000000000000..fdf67a1e2771c1481d4fdf3c3bb219904cdde434 GIT binary patch literal 1057 zcmV++1m63JP)z1G?hxZ;&`ED+>cNGYingzZn1m zi0SLs4-79~-etIOVGqOe=l2>Z%BAk7f^KhW_13_pMU`pwSH#-O94%^)f& z3N-K^13&;VLHzfh;p^8g3^#9{H2wblqZrJ9KS1%{Kv(?!`4i~P{|ua*91=XdJgT6; z`St4;*p&bQ!~(?P!otFnEG?~V1q1{|M1_S}KY#tr@b%YUh9AFvGyDPKzd*%*zcVld z`Ugr`TiaZI_Ty@A>nW=<)yo#7xKlEh(vj1xwlt7#MgWzP$bT0%*uZWO;x9 z!fSwov9Uh~14Beagrk7ItviRhqIkg9=T8*)ge4C=e*XL?NDV*$F=Er`Vr(4mXr?g1 z)x}1@)Y^!FfsqM{nHgR`f5y<=G55mJn=cZMojrRIAb>Coh_o}9pPyizU~Z|yz`(=; z#6U+fLTM=f>$l$wi{@|tuwv(>V1NKZ@j|4%et%nvY=(}S5Cg-n4-5>yKLTkW{__dQ z{tTo)gT>g`J~N1_^Ko3f_)G{OfLLIf9gU6cqmAAaD6jz)zkJHTz{3~O8o!7fdBvhJL&&7 zEzS8KWN)@fPg66=+sNqB{}Vy~Up;L5Ul8klLse1H6FK$(0tk$}jE(!hOym0h|8~m% zDNRwIbd{B3fWmAbIX`3L{U`QU{to~eC?zhgj2`F!0R%=(K`Q6}?=tznbY|Lr4LLb~ zWE+4{s&A&Qo(5!cV$%x{Kwva8UiSa1o0b3Vw6&)alRA+BKmf4-{V&fa#mul`<-^an zUcH*g01htV0YCr&lNW=6vZVpTfxUMQymyyFg$$D!0_P3$1SAV4gvrH q1Tx^k^5vIKzWDHAF9R6>Aiw}@kj85RTB}e10000VP)p|3y6O+Fnsy(*G|dGwA8_{sE@0VD?kY)l*s511}8@N@DpuwT|nH_3V>hx1ODQ%gn&~@8_@IOt#8aVhL_V%$IK8 zWk{S+eg652N7)Q)9AE25ELv$HybnO!M{I#uKD}#=M;vYf7lrQFmo`l@cj9I@ZL*+0D=T!0-G4a z_us4x|CxR%P+4O z%=m19E(1m6KcMkUz;yA2;myD24DM`^3=_Jyz22~IyVL&*H?9B#5X1$4SsA{6|NY{@ z(^>zp*f|F>^Eg`1=E%Jp>r!82Fy*Fx0GG_T{`ts%Hw-;|-9sl#=*HT~_cnLQ6 zZwyY1jNAqP|1re_1K>S4TZ6MV5dUL@_zCI)fB*vkslXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32dEcNn4H`bJ0C+qr9t=q z3IB5(AiS{sSlm!hKmUK){R9C#j!Zc}`+sBs9tE)p5$}U$;ZzVK5OzQCHlA<@UGIO! zvj@U9`H!I>IKl6{$7vAD0_aTr_h<@&41C_Zzj3U$sW?P)s`^}rT?-9$gz_!>OcE=Nf062l+NnAOE%LIKMeUciG zG5@4$#o>#0(^REaszX( z@Br;Y1jl>uI&DD}m2Idxq%!Gwkr0;PT_BnCf*VQmb@KBW^WVSl?z4#ixOz4Ke!ssk zy+~qx3HN1Lmf_*JwldghDRx~#Huv5AzuyA9NNmE;P!yvrh(>!r*9CAQI{gJZ77+*H z@%Rxtk;~ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/undo.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/undo.png new file mode 100755 index 0000000000000000000000000000000000000000..6129fa0c77eb1d2100ed1c99b5643ab8990a9566 GIT binary patch literal 707 zcmV;!0zCbRP)gx00G1Zv_aomR`x(qRh0l2FE0bbpFa!?fB$08 zkFQ)|s9L!2z&&2xfMaLReuNnS5I{^UzkfRf$Hoe9fp{-pGBCV;4WVDWU|@Lm41ym& zW{~CPX6X0xb5MHuav8D<00M~l)~8P=@1HyOnT?gzU0Y6$f#K#&28Oq985rKZgBbSe z6~w?NPZ+p>wDzArsy8?}Ki_-*{y4}0fB<3!5w|~mI{y0k^X(5GJqk7R^5S3xY54Gg z;V@9{y|_37pRO(g>+jzT438c$h_JFUeEIar>Y2FstQW6ee+LL4W|&hReEj(I13UYi znbkhd^K)@A%v-naX4mP{i91)X{{CA+!pI;bgn{AeRR)QlKiRi``0yC0=M+Ey zVT~0JdHJSom6iV+{r%6t#LV>djcY9}FMXXe=l_3O+y7ZoQhPw+00D#(*(oWx*+@tv zp{LLZetz%&x3v79qNw;ED8va6Kn$b;P{O)4dGi0A+S>nhH8gAh0*IMZ1Ma+ke^KiH z{{%~Qb%Axyo~;K6ASMPf!11eBC%hFCV_^OEO$;D_$THxanAm~S7cMXefB&up5J1f2 p81VS{^OpjgoMw-I|K0`=U;x^&`B18C?@a&z002ovPDHLkV1f|(PF(;1 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/accordion.css new file mode 100644 index 000000000..5f104a441 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #dfdfdf; +} +.accordion .accordion-header { + background: #fafafa; + filter: none; +} +.accordion .accordion-header-selected { + background: #eee; +} +.accordion .accordion-header-selected .panel-title { + color: #39c; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #fafafa; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #dfdfdf; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #fafafa; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #dfdfdf; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #fafafa; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #dfdfdf; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/calendar.css new file mode 100644 index 000000000..194f6f65f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-body th, +.calendar-menu-month { + color: #8d8d8d; +} +.calendar-day { + color: #404040; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #dfdfdf; +} +.calendar { + border-color: #dfdfdf; +} +.calendar-header { + background: #fafafa; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eee; + color: #404040; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #eee; + color: #39c; + border: 1px solid #39c; + padding: 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/checkbox.css new file mode 100644 index 000000000..8cd106b60 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #39c; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.checkbox-checked { + border: 0; + background: #39c; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combo.css new file mode 100644 index 000000000..cbe460bfa --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #fafafa; +} +.combo-arrow-hover { + background-color: #eee; +} +.combo-arrow:hover { + background-color: #eee; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combobox.css new file mode 100644 index 000000000..bacfda06a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eee; + color: #404040; +} +.combobox-item-selected { + background-color: #eee; + color: #39c; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datagrid.css new file mode 100644 index 000000000..5f73ebe79 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datagrid.css @@ -0,0 +1,285 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #dfdfdf; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fff; +} +.datagrid-cell-rownumber { + color: #404040; +} +.datagrid-resize-proxy { + background: #ccc; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #dfdfdf; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #dfdfdf; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #dfdfdf; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #404040; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eee; + color: #404040; + cursor: default; +} +.datagrid-row-selected { + background: #eee; + color: #39c; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datalist.css new file mode 100644 index 000000000..308548293 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fff; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #dfdfdf; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #404040; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #dfdfdf; +} +.m-list li>a:hover { + background: #eee; + color: #404040; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datebox.css new file mode 100644 index 000000000..392b779d3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #404040; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/dialog.css new file mode 100644 index 000000000..c962c42a9 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; +} +.dialog-button { + border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/easyui.css new file mode 100644 index 000000000..420e8f55e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/easyui.css @@ -0,0 +1,3549 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #eee; + -moz-border-radius: 2px 2px 2px 2px; + -webkit-border-radius: 2px 2px 2px 2px; + border-radius: 2px 2px 2px 2px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #dfdfdf; +} +.panel-header { + background-color: #fafafa; +} +.panel-body { + background-color: #ffffff; + color: #404040; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #404040; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #dfdfdf; + overflow: hidden; + background: #fafafa; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #dfdfdf; +} +.accordion .accordion-header { + background: #fafafa; + filter: none; +} +.accordion .accordion-header-selected { + background: #eee; +} +.accordion .accordion-header-selected .panel-title { + color: #39c; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #fafafa; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #dfdfdf; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #fafafa; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #dfdfdf; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #fafafa; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #dfdfdf; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #dfdfdf; +} +.window { + background-color: #fafafa; +} +.window-proxy { + border: 1px dashed #dfdfdf; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #dfdfdf; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; +} +.dialog-button { + border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #404040; + background: #fafafa; + background-repeat: repeat-x; + border: 1px solid #dfdfdf; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.l-btn:hover { + background: #eee; + color: #404040; + border: 1px solid #ccc; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #ccc; + padding: 0; +} +.l-btn-plain:hover { + background: #eee; + color: #404040; + border: 1px solid #ccc; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #fafafa; + color: #404040; +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #39c; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #39c; +} +.textbox { + position: relative; + border: 1px solid #dfdfdf; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c6c6c6; + -moz-box-shadow: 0 0 3px 0 #dfdfdf; + -webkit-box-shadow: 0 0 3px 0 #dfdfdf; + box-shadow: 0 0 3px 0 #dfdfdf; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #fafafa; +} +.combo-arrow-hover { + background-color: #eee; +} +.combo-arrow:hover { + background-color: #eee; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eee; + color: #404040; +} +.combobox-item-selected { + background-color: #eee; + color: #39c; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #eee; + color: #404040; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #ccc; +} +.layout-split-north { + border-bottom: 5px solid #ffffff; +} +.layout-split-south { + border-top: 5px solid #ffffff; +} +.layout-split-east { + border-left: 5px solid #ffffff; +} +.layout-split-west { + border-right: 5px solid #ffffff; +} +.layout-expand { + background-color: #fafafa; +} +.layout-expand-over { + background-color: #fafafa; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 0 0; + -webkit-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 4px 4px; + -webkit-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #fafafa url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #fafafa url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eee; + color: #404040; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #404040; +} +.tabs li a.tabs-inner { + color: #404040; + background-color: #fafafa; +} +.tabs-header, +.tabs-tool { + background-color: #fafafa; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #dfdfdf; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eee; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #eee; + color: #39c; + filter: none; + border-color: #dfdfdf; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #dfdfdf; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fff; +} +.datagrid-cell-rownumber { + color: #404040; +} +.datagrid-resize-proxy { + background: #ccc; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #dfdfdf; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #dfdfdf; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #dfdfdf; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #404040; + border-collapse: separate; +} +.datagrid-row-alt { + background: #fafafa; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eee; + color: #404040; + cursor: default; +} +.datagrid-row-selected { + background: #eee; + color: #39c; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #dfdfdf; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #fafafa; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #dfdfdf; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #fafafa; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fff; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #dfdfdf; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #404040; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #dfdfdf; +} +.m-list li>a:hover { + background: #eee; + color: #404040; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #dfdfdf; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-body th, +.calendar-menu-month { + color: #8d8d8d; +} +.calendar-day { + color: #404040; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #dfdfdf; +} +.calendar { + border-color: #dfdfdf; +} +.calendar-header { + background: #fafafa; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eee; + color: #404040; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #eee; + color: #39c; + border: 1px solid #39c; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #404040; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #fafafa; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #404040; + outline-style: none; + background-color: #fafafa; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eee; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eee; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #fafafa; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #fafafa; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #fafafa; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.progressbar { + border-color: #dfdfdf; +} +.progressbar-text { + color: #404040; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #eee; + color: #39c; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #fafafa; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 4px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #dfdfdf; + background: #fafafa; +} +.slider-rule span { + border-color: #dfdfdf; +} +.slider-rulelabel span { + color: #404040; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #dfdfdf; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #dfdfdf; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #fff; + border-color: #eee; + color: #404040; +} +.menu-content { + background: #ffffff; +} +.menu-item { + border-color: transparent; + _border-color: #fff; +} +.menu-active { + border-color: #ccc; + color: #404040; + background: #eee; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #404040; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #eee; + color: #404040; + border: 1px solid #ccc; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #ccc; + background-color: #eee; + color: #404040; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #dfdfdf; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #dfdfdf; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #404040; + border-color: #dfdfdf; +} +.tree-node-hover { + background: #eee; + color: #404040; +} +.tree-node-selected { + background: #eee; + color: #39c; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff; + color: #404040; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #dfdfdf; + color: #404040; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #dfdfdf; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #dfdfdf; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #dfdfdf; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #dfdfdf; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #dfdfdf; + border: 1px solid #dfdfdf; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-on { + background: #eee; + color: #39c; +} +.switchbutton-off { + background-color: #ffffff; + color: #404040; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #404040; + border: 1px solid #dfdfdf; + -moz-box-shadow: 0 0 3px 0 #dfdfdf; + -webkit-box-shadow: 0 0 3px 0 #dfdfdf; + box-shadow: 0 0 3px 0 #dfdfdf; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #39c; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #39c; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #39c; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.checkbox-checked { + border: 0; + background: #39c; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #404040; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #404040; +} +.sidemenu .accordion-header:hover { + background: #eee; + color: #404040; +} +.sidemenu .tree-node-hover { + background: #eee; + color: #404040; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #39c; + color: #39c; + background: #eee; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} +.textbox { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent; +} +.textbox-focused { + border-color: #39c; + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent; + -moz-box-shadow: 0 0 3px 0 transparent; + -webkit-box-shadow: 0 0 3px 0 transparent; + box-shadow: 0 0 3px 0 transparent; +} +.textbox .textbox-button { + background-color: transparent; +} +.textbox .textbox-button-left, +.textbox .textbox-button-right, +.textbox .textbox-button-top, +.textbox .textbox-button-bottom { + border-color: transparent; +} +.combo-arrow, +.combo-arrow:hover, +.spinner-arrow-up, +.spinner-arrow-up:hover, +.spinner-arrow-down, +.spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom { + background-color: transparent; +} +.datagrid-header .datagrid-cell, +.datagrid-cell-group { + color: #a6a6a6; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; +} +.datagrid-row-alt .datagrid-td-rownumber { + background-color: #fafafa; +} +.datagrid-row-over .datagrid-td-rownumber { + background-color: #eee; +} +.datagrid-row-selected .datagrid-td-rownumber { + background-color: #eee; +} +.datagrid-row-selected .datagrid-cell-rownumber { + color: #39c; +} +.datagrid-filter-row .textbox, +.datagrid-editable .textbox { + border: 1px solid #dfdfdf; +} +.tree-node { + border-left: 2px solid transparent; +} +.tree-node-selected { + border-left: 2px solid #39c; +} +.calendar-header, +.calendar-body th { + background: transparent; +} +.calendar-selected { + background: #39c; + color: #fff; + border-color: transparent; +} +.calendar-selected.calendar-saturday { + background: #00ee00; +} +.calendar-selected.calendar-sunday { + background: #CC2222; +} +.tabs-header, +.tabs-tool { + padding-top: 0; +} +.tabs li { + margin-bottom: 0; +} +.tabs li a.tabs-inner, +.tabs li a:hover.tabs-inner { + color: #404040; + background: transparent; + border-color: transparent; + border-left-width: 0; + border-right-width: 0; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tabs li.tabs-selected a.tabs-inner { + background: transparent; + border-color: transparent; + color: #39c; + border-bottom: 2px solid #39c; + border-radius: 0; + font-weight: normal; +} +.tabs-header-bottom .tabs li a.tabs-inner { + border-top: 2px solid transparent; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 2px solid #39c; + border-bottom: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + border-right: 2px solid transparent; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 2px solid #39c; + border-top-color: transparent; + border-bottom-color: transparent; +} +.tabs-header-right .tabs li a.tabs-inner { + border-left: 2px solid transparent; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 2px solid #39c; + border-top-color: transparent; + border-bottom-color: transparent; +} +.l-btn-selected, +.l-btn-selected:hover { + color: #fff; +} +.slider-handle { + background: #39c; + -moz-border-radius: 50% 50% 50% 50%; + -webkit-border-radius: 50% 50% 50% 50%; + border-radius: 50% 50% 50% 50%; +} +.menu-shadow, +.combo-p { + -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + filter: none; +} +.menu { + padding: 3px 0; + border: 0; +} +.menu-icon { + left: 4px; +} +.menu-active { + border-color: transparent; + color: #39c; + background: #eee; + border-radius: 0; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #404040; +} +.window { + background-color: #fff; +} +.window-proxy { + border-color: #ccc; +} +.window-shadow { + -moz-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + -webkit-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + filter: none; +} +.window-mask { + background: #000; +} +.sidemenu .tree-node-selected { + border-right: 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/Thumbs.db b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/Thumbs.db new file mode 100755 index 0000000000000000000000000000000000000000..5f257a2a49959543d36e2641d352572547e40e63 GIT binary patch literal 35328 zcmeI52|QI>`}ns^Wu7Hd10{saWN1RTQWRxO2$?d=bTp}qsi+Xi6q1?D^PJ3N4ozl9 zhLhp=KfB?*b>Dm6Pw&0&@Avz6-xlAqj&s&p&t7}4^{i*D{p_W=iS}i5`lcb|H$e^| zMDS}H5R$JxCxG`T9|H}7tb;d10Df(4?bC+{0&jnYALtCM!m+N0i%0+YS`tHyUUO1l z0|1v9Ap^((3V;%z0;mC6U=u(GFaX;DMt})m1~vjL04u-^umS7<2fztz2DSiOfo%X6 zumji)NCG^-PJkES1NebmfB+x}2m!)?3?KrC0%CwTAOT1LXxo&Acn=`^`ENOh<$=Ax zK43p^06^3Jw*?Kv7JeMzS|}hk5Zfc?;Y@sgU_yxh(dW_j@~=X(mahm#t)74o679A9 zloGwxej=KSX5U*@DtZtQ4j@KQYa_%8&Vt#ekN&M!8qk9Ou6(rb_@W&R0@{B6 zNJd~Ad{6&J+YfpUzx02!yf6J9)gh=3_|pGTJ%Q?g zKkEMn;X5?HBE(9-AwU^W0aSrs05#w+pbnsEk3y^gXadK8*a7x{1KYG71WEGIDZCDmofUDq1RXavCNYT6zXXMn(#1=8a4Y8|fGr8PGxq z2q6y<@djez4GfgzlnnoNSSv+n*TcATijZI{vW}L3kd|Pr5*60Rd6M2{L$d&2h!5iK#@mfibE=#LtaZna|&z7QO}e%t=^GDeM- z87`62_7^vhF)?ps*~Gnl2hUDkQ894|Nh#?A2Ne{R4k@c>9y_k3ed45!v5Dy!Gjofx z4vtRFF0SX@E?vIjbM@MF-h%hDTn#e)IO-=oohP{oMS*BJRTyS}y{G@Kd$^QM2FFix%p&j);hm zh!m|C!8#X!kd}ye%We|7eMd=+?C7@&Us%tuKR7zQY{NDYjTy$%_AO*gT%tqVShQ*% zYxaE=yZEPS_K%AFTCX02f{*|%9w99Zz^e>Tu}-0Pc686Px|>haoL0}Wrl`q#`$#UE zb7e=5;G*anvOLO1H?8b5@aAAq_$vSI_sVtL1rb3yeiNH8D+`>94VWv4Bj-$%c}ZW} z8ZsRlgQuTlUJk>o&V@9sUQ%B}A}jD8Y-eKrCdn~t-Cx@HKVllN)L7uJQ=dU~-p8K6 zV>ckrUr%rvG>IW-7$?vUj-WMc;4cTz97ga?0KT*MsBJ#!P;?wX4wg*(Q9h$@a-h~0 z;Xm|8*$<*Wgb=!)`s1Ts{PFdN_!@GVwL-s8K8|pVe}weIam%7jw$wX%=7e8w+Y{f$ zvA?ChXr=I0`i$`IvUf^S6!^i#m}Sg>w}iEr`=0SbHb!{?5AQJ@+*8A=sPz6}v2_P) zC3WI}Sm+v(elMcTf25($8GrYo_nv*jo*Olf{8p#dY3;BeVt-0=qpL(OaQ!gW9u{$b% z;O@)C@i1h8Rc-6@>Q+{B>zEVK3IQZ#_q&(2_z1BLdnCKzcR z!iJK})kpZIh2*H2;CD*#=?S;q3EYT!t6664Fs#V5q$6`~cV+(N;E+RI#m|E72U(qy zzE!=R^p<`QO-g%t8>X8u?J7(4vz3x~p47NWQNKN`hpeM>0#09H5@jVNBO#rA=q>*{ z+67ez|2llJ9|~b;{SoX3Flv7G|F8N#YB&Ft@Mq>nfv==m>qsU(gsC*cDKCV}Q znfzVzA9Ri28JYG`F@mJ-OKmq7n?R)Eg1k#p#uK$m0KPqKs zVRJTLa*J%`tjVq(ryIcrFi zYsvHl&6fX(&lQ|ZZ9?0G%VK6 zt5x{pVhF=gg>PV_e7oYNjvvABhD8^yAwkM(NT2QNy~I%~Zu{_11^74 zm=Dv;s|!5q&hm2R^sXUIaCy^}zAF9KGx2K~zGG7)+4r=}>v;AOT$MRO`lp7zkKOjm z_*eSV{{13quE|5t(HtHEvz9$h)vJg1((hn zeH9L@3c~!?Tmp~z2fbDB=uMKiW~f>0$ao}tX-C*sN>V`3uB)V#u z-t1Afu_}9(qmgH7I-M!i1Lp7C^nc3ywft!Qp8f;#w?Bw>7nr}#mNz@k+C^A3H7uR> zUD9bgl$oC8)5B`s$#c|rU)s3`r!c%cgnv#4eChu;U_Ad3>|a)d;HUljmHqo8+dr!B zSKmFxZ_xGM z$j~*!to>9@AeMw{dEb#|?vZYn#*eNc<(?1M5C>SoExws%Op`?FVFZWb$zbC&_{2FKP?`7HP#WJ z_h->|@V)g9gtRw5%m3fLf5-LH{`h=f^2gWTr1<9?mu4U4%Vz}5@}#=-X1>Kg36Rf> z+NWSRtHAi`ePqoRS%#x0*#Fh^`iuT*g8uj;*w34h&3`NV`2y$y)W6^o#Fv39fDdpL zxCUGYd;vee9|!=@^g$5c0D^&=z%Af55CVh(cYwP9nl=pLa3BJ>4@3e{zylx}cnHJ* zXxcc4Wg;3& zk#YmU)?#J_!K)q)(fhJi!0hqrYJ?VK;l zx3&%baEGhs?c2oyOZU~zk|wMahR|HZtJ!5!++@|lJ?vK~9F<700k7;g4MHd)jKWnp3XapGuJSX$^Xo(a81-S-r`AaXGtO zA{!-B3lFoA6!nGR_PJehHT$x|YqXiBja}U14?kWiFw)v-aveG0yV-iy%%<;FHtlgt zU~vlZ;RVczlEsqnHAH0%sXLD;#8|Alz3?-T*UTAsJG;7aXAQ~CD|zbPTrREK|n1{*&dx3lbbZjR#f!hW6l3Z2zUa04 zU`{VadyhKFXg;P&UtXnsUTrI-;mMLfz7%ckyk@FoUY0F_c^9L%s0Qt#p-Fmx2xW6t zS`!||X(wQ8Tumo-iTO!R#rsUvRMaTvWk;?bzQITG;l93^etm`I&dokVzHbWYu?#C5 zZPOmRhQ;%m=fmwRZS5#@$}PHRvo>s<=UE=X2niX@rjeE2u#hntsgn~O(6f*hdzIfA zhp}9ZO0cj@Bp+q;CugzpCnid`w=Lv2Tc{*UwC1C9=8`Fm*-WkF$yCS3*9&C>vYm9_ z=esPINI3tVuL`Piej6y@15iUq1K6WK!uY=)A^%&A|Nq7Me_6wjz=DG`SQJCkk9)6O zeD{N!?CU%JVi%VxP6cl`>YT_}?|t%phPZ;o?T1`-M9ItijY&b-gDYydfEfM8_i|AW zU5l}kyH@EWo(gVzd5Zb81Y6pnvh{Hc1mCyx_OUB`Y5zVyNc(5{Ie+`x%-?=lKJ+k6 zKFhO;fuQk2)9MJ^PX1R@wco1lZ`$wA`yW51|M2er!1@y-v;-yqrYRq%6~Eh1zWVSU zy#M0=BK#kaPY&hL0^ch?7Si^CzD0w`e?UGnl(P}|UioQ|)|CWaAc+14aDna zjEz-E`e!?xXNw+BQ}~GACOPu%07anW*8HWR;vHiPOqs5_>XEbSZBxaP4_I5x5^(i$ zX?Z5MPqIZg#^(|$;TZ>Dfk-}o5l=l`f}7v5!q+H>$2d)|a1LUyW21HP^m_BWvlG?9 z^(&IXN|sM_iW(cAX@zCY?C)}+mhs!zvwzzD#K?|Bv92!aneh{CQ)0FoEz$=}AHt*;iw;g~10{_OLhD zY%bU`-cFYHGU%GK8{=C)(dBWA;H%f26q%0(ynHiST0cLucQi7j+QSPgkms~LSpJd~ zH!VErVO2zjR9!2SaqG^dOiCrt0kKRKP)Y^|W0Y_Tgf*^R@-_%^hIFvfbny z7S~8y5!(IXxVtCkuxv}E0TY(cJ)C9lN^NTUNaw74(nH(U+)@8bd!dK;ZmVT3w_y`W&Di1uYk;!VQR{7@_vKy z^8Ch@wlkTX0tQ1Vrl$rDrWM}1vD4(m@w*q<4^>OeV!E%0O;eoZ*e16-GfF8la)6#( zKREA|md(10x{}5{MM{+e!fn~I2P!(XnBJ@C8n!m|aOq#Lb7wjy9VxuWDfQWVe+nVV z`loIhn*Pof@%LNZQ$$~^itMb?s(v}zmCB(kIu*HCR3i8+!c``S9oJKLgGB!q!w2{| zZQ5j?rSpEmtH-*o)-3N?Ig0J7Ox-9NDcmWuCwd=mohiwECwlMH`^i}mg7tYdhIie% zdZpKpi*vSgdP)wMGX`U#yHlRg6$)Q|?mQh3a;-`7xrm;Ux9!B7ASF>~jc!gsL8NNl zaFj}M*g<};L*37;PQ)6~OUXM97aBN^7ii1Q(NT+&6uZp|9< zMLZv_a@E9p4Vmbe*BjWJbt~5G(HioUdvOh6Nzy#4H9Mz&1k*>gyoUI<8pOyQy0d`6 zMGdL5xyrc=fWv<-)&@Vo{?`bcl+ou~kHfrFySq?Lv}$Mt0>_i-TXrpB}JBe~v#tpFjQG z2W$U_{AcNL3!*3$ius<^(Lc9wRm3jD&4 zOdX9b#&SHksL1!;zPzgvlU6fH?-Vzh-Z$uKsL|MX|3(9)Rw?b>Tb)zAk_NNeJ7hAf z%To+Z+Avg24Y{@RX_A7e)p645i;4PzZ&Zg>m+Q{nITkk1waWXj*e!e^B)mpi!6$l% z#j&4!e|yZJ>Em&KuBQbo)u%GGHArJr-Z`ugIlT|!^w?iAGf{g7&yUqgPkL6+xlxS3 zcq2=-N^cS|8=L1yjaT;D$MuX@yM~!#uXQq)g|yvloqLo8QVIm(>B^-=Id;&C9VUMq zHSh8&TkhGzV%{0j>Ol^Ruq$0J1g6E>voF}hwumK%JbgdRb#Y7Hi&VA*$jtcT`Iz@2N3Cs|T#2q+n1tZvj&ZIWQWcW86aQG<)gXXk}NP7i6_&wDuO=_(Q9EMC^E&Z|xDOjH?^o z{FKWq=q?rCkZXx>^{Gc~ahC!<^oLIb#nz5ii^&#E3{Tyk=*Umqv(SZ=Bc6G4$u8A3 zWv(|qt7STJdBUyZ{;))dnTOZwO4YzEd2=uM6LRl9@H~EgW~3sF`6B;mtZ1DBm7kT% zSeM4eFfkUcDbg)UrH5&&;%rvufRr?X@1YHh5C!k(J(3 z)t+HR$$LU3bnIrg=pFZNt}K_yq9!}+^yLTG!Anj7>xQ*22u}7eM#`6v&nq*p#+`aB zTbdf^wG9_DjHwc&d*LD4lI1r@F+R0pq;d94!+X!UY)=zo4DA8+NJjdXfn3@i^za0N&p;ez# zy(3OSn5o~st*?sTFY?|of6fPwsW*CX<1EaESyS09rAeYV;t0d*oHjIApLF&%?Y6<7MUruH4Plib9hTKlm8ZvXr%+#?ICZmCba|9D85C^{T z)@|h}Jwk#!E+N55D9c|KHw!hzsNkf0i%#ACON6^Hh>9W1~vjLz$SndU<23z4gmHy zK{f+hfUN*3XE(&$z;<8AfNy!0!qLkKp9X0(0so@tOgtg)PW;VVB z5pV*W0T;j(I1ji1?tlm233ve*z#I54zW=|fnYs-dG-))GS?aa5xOqN`u7M-Yct?l> z`;(CK&cVvwDlA*Bw4I~K(|cuNLRPk#T4F(t>0TZh31^A6WgNSP9c_`LzVX0gQJ|

                                                                                                              NA+ZcC>&vv>@9CR4VtY9M(_F}@-1%;|KR!4iA9GaQ>eBDX}J`#J5%ao~~20i!d=uaWnN2JTaCZc`4~#{=ltA0#Q#aZrz(q zm2=*?xv736TAM|Kl=3M&Bw@D{zAUxk)aE6-BAe5h;+@@bY7J3ppPMZ$$}S~5x2U-o zQjkbmI-tbu1yQUt@EkZA~%UI zDZD8leyDP5!{b&)XQ9#uFDH9gW$d3%xV`jLCJ9x3F0V2d)ngzpp)j-GseibEU`g3< zw}%EUZ+MWvwLm-Q7ya#T)zZw{CR~~&&pg|?W$Qs3suK&ceD9y{sA%;Opo@4M*1u@g znZR5@5PCE*P%q8zm0o(U;?z=6wp(T+e$R@;(;1Fz%BlMdZ+|I1y-SO}lFDmEUy{9g z52kCkf!%6wO6Kj{)_KL<5&Jc^my)u))<)PCMw=Fy$?)Oz3))h2DG<`)a!XVo!GVvb4v6F8sz76QAYsC7a~r9%a{jt!y*OGU7Jj4X z(9=811A`MM28COelk{3Li>H^EEZF?%V6sKoc z$$2S~5*L?H6m`8&-ZV+E;%exYBK1c$50<-9BTR0;Hwh2-4~cS$#zjhB7Gc|3)?u?# z&ZKj+rzassXEGtN$?Lg}?F&4$>rRysInFfp-D?OxUHC&B{m>dxs=L$niP(v`Yb@-P zoq0*t3R+w4@;I-TB788Zcf4sLbJ&xk)O>&zS2P?&?P|MOAo9$~Fd{Z0Uo*|Ef@xM{ zK@}xwS1TG+=i65f^#u9PTfI&dD@b^1@AX*CjbWzaxPi4`=Ae=-PNp|hD%!Rs_`jbA(=v(l-y%-aTAId{wnS->smC-as|g_-m8iYF5Wyx}LxR_Nz03 zJ?v~@?>WPddrf`XS5W|Vo3i=5x1umuDMSF$-N7s%gzirD^}bX_A9t!U`(~G^y^xp~ z%@HN4w`L zny3<+N2lRPO+d<*T_O!(w?1?yEk}@szW#G=QOLa>Kq6_qS0#U&8{LP?7LMHEo0`f% z@(pO7XL?R?;%FZ0kL5c-`Jc`zT1z9SpFQMu`6jP8WFtfK9w)rU4`=D?yy!6+LH(?t zG?Q=64SF?D--$2h_Ul}~e>Tyxg3j2G6`#s>v2W$r!x=JztAL)5-#^NOkdYG2Z9uk( z?>9$@o=b<1dCx#O=&_!IdZJg>@tb4b57|+F2ZUtM_K(XjgSrtTfN6-J)Z3)eZ`dJ_?D@j?u)DxiX`^)@Q4ea?JVf~s0q4|0L z^zU*1bg5v3BzuJV${^j!zG2H0L)|tC7H}k)t#&+yc6{dHq`^nGF=%S6suv5)R&xZ=w;qF ztRy%*-py=vj%lM2(fM+db0=P3dw!UTZ#v!8DnC^7a6GT&IGwNEkuFt>rrt)k?p^A) zq77Lzg(7$qmKg>`Lc<0P4Dg26zaC%E9`}dgH1ux6kDB6>?)h5t{MzS*AV2CMhMb7w zIIZ-l=YGohrT=dKLHaNGPyh43i~sFX>acn>;gG&YJ#kudw#Bq)vU@>8-C3CX*!;)R1mi=YZGeN)Y zn8q+x+d>~iN6KG!6GiPGbX5xJ3$K}0`MSUT)*AWJ|9%wz;mtq&-~TTCZ&iF*fie6| zlpA0Bf*JGfd)MWQ*O2>+4)qW7^PYWB|7}Z0oAW=1FYWi}4>ErI*8Y?F53E1KlH?ld zPL0O@e1`t{6Ioby)Q9th2BE*W13v73@KG)*8x5aI{nxLmAV2uC|M%|y1NmAY|H{Wn zExPYAIt%;r;m_3H8ssy5md^?9&p-E1{~`BJU!EQwoFt9)kh(dpl6ELNh;F~{Y_Ci? zt1e9i@1nzvgM0mHyhVe8v)4;;7|&Q5U|p)@uWzEho|1jv@_5TGv!}O?w-?s&XPq1o zpH*Vaj(akpnxmyHEWYqT>fE`QLfrJS01h+4@3P6C?ml_tRLrUzcRyvz@t%io_%CcH zLF}#`K`1X=dS#dycmeA$L|v64UnZS%$Jv9Kx9M#YgPL3v4eg#9F5wF~!q1c94);yH zcJN8fFC9t~v(L}0XoUGm-pL$!u#>IrRkC!-ga}TQSg^YJ7f0Mc zWVG5}Xq-maTAbB|XL4m-n43|^^;=0>N$Vzta$5=`h?|-q*+A*o{>izW!H0V z96$byUEPfPS&m>)OAbLwdhXSEY2oV2MD{m zjXKE_TQ2IzBpvXKlyV^V59HW(`;=$RYeN%!V^r2aIJUL?t$INqyGT_ip@i1%^w~Fu zTPtoJ9z4z!B3rvT>Kg#u0NO_$arONx5{BjEk#B4Vw--;$spzxt(mJU^fg2CQ5R+S*mHfowhnHb%I1^_ z-bCnMC*Hcgw)P;YR8>#9;~61{m>anf3# zA^mN03Q-4sg&1Y`_VA3``6^4|h1t2GxvT4NN5z>sfi>j2?2JFM(7)(!vL94`Ux2v)>QizF;>+l~1n>c_0@r}+fG^+& z_yYkzAP@xH0D^&=z%Af55CWj(-GTTna1RIr!hs0jJ`f2+0S|y^;2{tL!~$_ZJdgl9 z0uq5F04?(|#3{fNAQeah(t!*h6UYLx0W@tc#7}`dARj0I3IX)HpW)Xt@N@q6AH?@VW)C8=k4+SU=9=WROuEwe9?yh?+j!tCH!;nvoGyk6SNx`&#fe;3+=Qtugt+4b`@0Qz_DXN( zbSt*;Ue~g$RGJ=hodQDcHyZWt2@XC<4h>kg-E2d=mqNlw+k$aqFjMe)Hl^i)Jo6P zWKpwl9}%jhB02W*eWRuKGvlifreaBMa#6y&C3hZEE1Pb9iDy2$C{H9uXCb!{>(qIh zYi2bq$7ia1G)yX*<<#u70&Uv!^~4vd?L{t>;D<&iY_??EM`qPBsCS#r_FBdesxRMkWjb4=R=8e%s%v#*pY^*PKY z_DQTmYI6I$*k?LJhS;~WizudDQfnL97&y=`p46o%&%W{b(Tg49USSKuWkakgv4aiG z|IUE=W&ErJw~(Lnpa1>mzeN5I)*mmzINbcv4G7);;(verGZf_S`n>)r_J1Hh8RUQQ zzy2e;^56OV*U|j@*1x|l`@eYpySm$2OW$V6(p~wW^N|}Iu62EtPRIhwNZ`|P-`OT# zOcu3|7d>vIB9bV*#SAMLP`E#3S7-=PTB%HW0VP*!M$!~dnG*N4ZH%orPMwn;66B;5 z&uSb9JD*1RdC|>?Wxw~(>ME28i@GMWEuqfI!ZEI}G;Qi01J7pqr#T}10q!S$5oK4H z)UTyMx7hxk@ARgirxO}D!etGZEZ-^YbWCO!IWm*$n`L8@HM#G&sRDIc{-Mhk z8LO%HZ(wsU$d1Dmk0@Z-q^YuZ+*^prsh{yC7vdc2Z4a)M{g4_`Vj|exiMg`qGDusf z;A~ih=gF~n!aq_IVxHOXHm!E7n^!i?({*kz$Y6&WU&TV#vUfqYqdB$xa&^awI%8W< z+0g_ol}m*hE7mDdmUoA+4mb6dGt?RT20fUuGUG06H(k#x?O#~jY--H4S}jY!dF9+1 z!cnL@9L3}z64^B5Twt4k3)8*3FI1V9i)p#Ub(?^=&uCYU-E+S2eqE)EE-RCa_Fcw> z**A=aL+s-V4J$DjSAE#I^P7o!OvkpE8!4aIZZa^ z%gxm@t|BT?lOhHg>~}O$`wq?@m$}s(LD7+lcu7mh9>3qu#30y@g2gy5_;0X=(=+DcHH4GWx2uVjWWA#CQ5wk z7Ws8A`{Vat#=k8;%>0q_r~laB!+#9+-=MG5>AO?B_2%=PD!Sc|xM8D#2F=T~LwX+LnXo=$#qqL7p96d&*L^utqX+2&Q^p<&C7x`#Wv zBO~de_)V|f%r}f$A)KxvR19K79@>;Dg zDi{@-lSW#`N>aBq$Z?G~JjVI%;+5z(i^ngFkow#XWS$|N7kkN>_5A(=+?}#82DvR* zrl6sxLs*U|cgE^W410tFud3g*ko(?eEL|e3*xfiN&#ow7C%ei^=m#vq@ZpK-P7d4j zQaa-AJ2)_mDOYUR7I0z7Y+I4X8iE~bD2>XJ8DO|o>Fl-L+tqFCrK($CK z4Z+*%n?moJo@#h5CB=E6foGVa%XcK)SZMxT+uQsIi^CqlK@}#U1zeLwy>dmWYa_m*xmxZ$29_qb#ex1u@^RN`cQ?ne)AygWSYv;_kb1mvXMrSe8;Ik%|A+3|5 z3AbM-w3>4DMl9~8nUN?wwa7T+W?PfOtkgE~*jhBeZr8-izyTUZ-QoRPujobXc!DHJ zD^=~nR1RjTduOY!!)a@mwC|eC-k7cYB&*j?SJRS9_vViCjP@R{lsK+#!v(kxY6Y%%dYhXeg8nww^h5XRu4PXhrR`QT+2#)Av3em{YO-^d^B;cyG14#k z^QZsNkGcQgkG%gJ;jHYV6vK?8V7?t4nPtToFNkWD1WzisM!uNKqyD~G@UK3q=#vWQ zQ>+M;KY8|N@A6MRs;D>o8SsPuecx6A$bvroi7>hy@KOHOpB?qfJNJzbJ1Pa;uMy#i zpt*9Wo&fc6cYq%w@ZLk8oiP0Piaue0K1cDZM<4ox0lLTIALm1T_0K@QuXCZ#3!u9r z{&6llcmm{;=f4Hy{q}#7qfbPj`zro%ZkLbe#OC930^dHrfzB$?=aP}Q%W~g(AR56F T0gjLZeOBaa?|wA#e_!~27*z{8 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b6368d636e2ff36501ff9c6b14f7ce09997f3743 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel!K>>V@SoV?_1tQrr|vg#{&FxgXS!5MW?fq8aJ< T>6BX`&@2W|S3j3^P6h?7!oT zn93bYIb9!43Wj)WNz0M)xYl!8U>3_OjRiss3@1j_Zvlb#iD~jUnsR3em#t_3WtUHqj%c^0} zFSrhZpjU$)YHUS-lsMx)nN8pghWK6h!524#*oXjC@NjHF9H1y2K%G?c=lr%4eY%ue zT+7R9Pld<2<$C}OAU0HZIJPqD0RA&Sip042zF(tA4uaUhZ>jL`*HN0POocjDIidNRbTZ#@zvW7@I c5>Ct23v;ttA1D3-v;Y7A07*qoM6N<$f&+eyE&u=k literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/datebox_arrow.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/datebox_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135 GIT binary patch literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$f|L1?c z_O8;7?=$$OZE)N^=kf)!wu_8{hTkWuP3Lf!{Qqt%*U6B7qRbydZ`F0T{#^CG?%493 zHc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000_$JYFBpo`sqZyU339@ZwM6gi$;Pr>w&6M&T1N3Q$b?ahk3>@EL9`+1-BwzvH4 z=V<*uH!1ee(Sv*K$aVm^9zxbfZU9nZC#eDGVQ*&XXK(qpy{>x2j~_q0QX@ky?B2S$ z`TO_pb_Ho^lHPWf$3SXG3P5TF!a(UIB>)3m?2n~HhFtml`Lhm)4-7>2Cr_RTgV@`) zZDWrM_B#twLv#R=>k(}FC=EbL>?Sq<16=LCHdYi*!X*!q1F0DeKpY^*)!|!SNr;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..0f25d535e05b22b406fd72647611aace9cfa6249 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b1773c24b20b30318e38c4b84690e3d0010c9c43 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4DgeBzU z{E=^QXHHmRmEiEUJ<_jB`NK-}t7{l}8A{FvOK}{T)p$BC>8|6-x-MIXOa{IRh5%#E x$&;(vVs#x>vb(K5c#%QkA)^788{=C>2L8QE5AM%P*8@KmF984m literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..4dbacce18ec1310d22dc4de8ff895f597b0d61eb GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2L1978H@B_~L*E^hdC;Kq#~ z_8gbJY-45o``Fp;2v4zS5!xHXwo~JmL(T+=yD|FVdQ&MBb@0IQ}mHUIzs literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec64360884b3fdb81255ad6074bc08ed183232c GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoVtb9vwNkrdSr%AfUpK=5(o}_e|{SG6u6f5&Q g4t5*qz9vC-hN^}472i&@1{u%b>FVdQ&MBb@08Zm4@c;k- literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/progressbar.css new file mode 100644 index 000000000..1acc690b8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.progressbar { + border-color: #dfdfdf; +} +.progressbar-text { + color: #404040; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #eee; + color: #39c; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/propertygrid.css new file mode 100644 index 000000000..03e222b40 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #dfdfdf; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #fafafa; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #dfdfdf; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #fafafa; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/radiobutton.css new file mode 100644 index 000000000..8e439eeae --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #39c; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #39c; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/searchbox.css new file mode 100644 index 000000000..fc3cb1043 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #fafafa; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/sidemenu.css new file mode 100644 index 000000000..3bcfe92d0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #404040; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #404040; +} +.sidemenu .accordion-header:hover { + background: #eee; + color: #404040; +} +.sidemenu .tree-node-hover { + background: #eee; + color: #404040; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #39c; + color: #39c; + background: #eee; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/slider.css new file mode 100644 index 000000000..7e4a91c35 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 4px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #dfdfdf; + background: #fafafa; +} +.slider-rule span { + border-color: #dfdfdf; +} +.slider-rulelabel span { + color: #404040; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/spinner.css new file mode 100644 index 000000000..f81643cfe --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #fafafa; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #404040; + outline-style: none; + background-color: #fafafa; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eee; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eee; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #fafafa; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #fafafa; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #fafafa; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/splitbutton.css new file mode 100644 index 000000000..2ad86f774 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/switchbutton.css new file mode 100644 index 000000000..701657ab2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #dfdfdf; + border: 1px solid #dfdfdf; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-on { + background: #eee; + color: #39c; +} +.switchbutton-off { + background-color: #ffffff; + color: #404040; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #404040; + border: 1px solid #dfdfdf; + -moz-box-shadow: 0 0 3px 0 #dfdfdf; + -webkit-box-shadow: 0 0 3px 0 #dfdfdf; + box-shadow: 0 0 3px 0 #dfdfdf; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tabs.css new file mode 100644 index 000000000..e438b0b05 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tabs.css @@ -0,0 +1,377 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 0 0; + -webkit-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 4px 4px; + -webkit-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #fafafa url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #fafafa url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eee; + color: #404040; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #404040; +} +.tabs li a.tabs-inner { + color: #404040; + background-color: #fafafa; +} +.tabs-header, +.tabs-tool { + background-color: #fafafa; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #dfdfdf; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eee; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #eee; + color: #39c; + filter: none; + border-color: #dfdfdf; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tagbox.css new file mode 100644 index 000000000..16ff41475 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #eee; + color: #404040; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/textbox.css new file mode 100644 index 000000000..60f5ce29a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #dfdfdf; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c6c6c6; + -moz-box-shadow: 0 0 3px 0 #dfdfdf; + -webkit-box-shadow: 0 0 3px 0 #dfdfdf; + box-shadow: 0 0 3px 0 #dfdfdf; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tooltip.css new file mode 100644 index 000000000..8f1055d64 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #dfdfdf; + color: #404040; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #dfdfdf; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #dfdfdf; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #dfdfdf; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #dfdfdf; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tree.css new file mode 100644 index 000000000..51d1ee069 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #dfdfdf; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #404040; + border-color: #dfdfdf; +} +.tree-node-hover { + background: #eee; + color: #404040; +} +.tree-node-selected { + background: #eee; + color: #39c; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/validatebox.css new file mode 100644 index 000000000..5911752fe --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff; + color: #404040; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/window.css new file mode 100644 index 000000000..542f0710f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/window.css @@ -0,0 +1,182 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.window-shadow { + background: #ccc; + -moz-box-shadow: 2px 2px 3px #cccccc; + -webkit-box-shadow: 2px 2px 3px #cccccc; + box-shadow: 2px 2px 3px #cccccc; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #dfdfdf; +} +.window { + background-color: #fafafa; +} +.window-proxy { + border: 1px dashed #dfdfdf; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #dfdfdf; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/accordion.css new file mode 100644 index 000000000..51d0c7010 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #ddd; +} +.accordion .accordion-header { + background: #f5f5f5; + filter: none; +} +.accordion .accordion-header-selected { + background: #00bbee; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #f5f5f5; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #ddd; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #f5f5f5; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #ddd; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #f5f5f5; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #ddd; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/calendar.css new file mode 100644 index 000000000..cd206276f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-body th, +.calendar-menu-month { + color: #8d8d8d; +} +.calendar-day { + color: #404040; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #ddd; +} +.calendar { + border-color: #ddd; +} +.calendar-header { + background: #f5f5f5; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eee; + color: #404040; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #00bbee; + color: #fff; + border: 1px solid #00bbee; + padding: 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/checkbox.css new file mode 100644 index 000000000..5180d4305 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #00bbee; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.checkbox-checked { + border: 0; + background: #00bbee; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combo.css new file mode 100644 index 000000000..622d7c2db --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #f5f5f5; +} +.combo-arrow-hover { + background-color: #eee; +} +.combo-arrow:hover { + background-color: #eee; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combobox.css new file mode 100644 index 000000000..619efd43e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eee; + color: #404040; +} +.combobox-item-selected { + background-color: #00bbee; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datagrid.css new file mode 100644 index 000000000..bbc719af3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datagrid.css @@ -0,0 +1,285 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #ddd; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fafafa; +} +.datagrid-cell-rownumber { + color: #404040; +} +.datagrid-resize-proxy { + background: #ccc; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #ddd; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #eee; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ebebeb; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #404040; + border-collapse: separate; +} +.datagrid-row-alt { + background: #f9f9f9; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eee; + color: #404040; + cursor: default; +} +.datagrid-row-selected { + background: #00bbee; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datalist.css new file mode 100644 index 000000000..27617f0b5 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fafafa; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ebebeb; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #404040; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ebebeb; +} +.m-list li>a:hover { + background: #eee; + color: #404040; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datebox.css new file mode 100644 index 000000000..392b779d3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #404040; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/dialog.css new file mode 100644 index 000000000..82a1bb881 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #ddd #ddd #eee #ddd; +} +.dialog-button { + border-color: #eee #ddd #ddd #ddd; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/easyui.css new file mode 100644 index 000000000..6bccaaee2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/easyui.css @@ -0,0 +1,3436 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #eee; + -moz-border-radius: 2px 2px 2px 2px; + -webkit-border-radius: 2px 2px 2px 2px; + border-radius: 2px 2px 2px 2px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #ddd; +} +.panel-header { + background-color: #f5f5f5; +} +.panel-body { + background-color: #ffffff; + color: #404040; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #000000; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #ddd; + overflow: hidden; + background: #fafafa; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #ffffff; + border-color: #ddd; +} +.accordion .accordion-header { + background: #f5f5f5; + filter: none; +} +.accordion .accordion-header-selected { + background: #00bbee; +} +.accordion .accordion-header-selected .panel-title { + color: #fff; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #f5f5f5; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #ddd; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #f5f5f5; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #ddd; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #f5f5f5; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #ddd; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.window-shadow { + background: #fafafa; + -moz-box-shadow: 2px 2px 3px #fafafa; + -webkit-box-shadow: 2px 2px 3px #fafafa; + box-shadow: 2px 2px 3px #fafafa; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #ddd; +} +.window { + background-color: #f5f5f5; +} +.window-proxy { + border: 1px dashed #ddd; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #ddd; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fafafa; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #ddd #ddd #eee #ddd; +} +.dialog-button { + border-color: #eee #ddd #ddd #ddd; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fafafa; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #404040; + background: #fafafa; + background-repeat: repeat-x; + border: 1px solid #d9d9d9; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.l-btn:hover { + background: #eee; + color: #404040; + border: 1px solid #ccc; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #ccc; + padding: 0; +} +.l-btn-plain:hover { + background: #eee; + color: #404040; + border: 1px solid #ccc; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #fafafa; + color: #404040; +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #00bbee; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #00bbee; +} +.textbox { + position: relative; + border: 1px solid #ddd; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c4c4c4; + -moz-box-shadow: 0 0 3px 0 #ddd; + -webkit-box-shadow: 0 0 3px 0 #ddd; + box-shadow: 0 0 3px 0 #ddd; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #ffffff; +} +.combo-arrow { + background-color: #f5f5f5; +} +.combo-arrow-hover { + background-color: #eee; +} +.combo-arrow:hover { + background-color: #eee; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #eee; + color: #404040; +} +.combobox-item-selected { + background-color: #00bbee; + color: #fff; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #eee; + color: #404040; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #ccc; +} +.layout-split-north { + border-bottom: 5px solid #ffffff; +} +.layout-split-south { + border-top: 5px solid #ffffff; +} +.layout-split-east { + border-left: 5px solid #ffffff; +} +.layout-split-west { + border-right: 5px solid #ffffff; +} +.layout-expand { + background-color: #f5f5f5; +} +.layout-expand-over { + background-color: #f5f5f5; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 0 0; + -webkit-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 4px 4px; + -webkit-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #f5f5f5 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #f5f5f5 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eee; + color: #404040; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #000000; +} +.tabs li a.tabs-inner { + color: #000000; + background-color: #f5f5f5; +} +.tabs-header, +.tabs-tool { + background-color: #f5f5f5; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #ddd; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eee; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #00bbee; + color: #fff; + filter: none; + border-color: #ddd; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #ddd; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #fafafa; +} +.datagrid-cell-rownumber { + color: #404040; +} +.datagrid-resize-proxy { + background: #ccc; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #ddd; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fafafa; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #eee; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ebebeb; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #404040; + border-collapse: separate; +} +.datagrid-row-alt { + background: #f9f9f9; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #eee; + color: #404040; + cursor: default; +} +.datagrid-row-selected { + background: #00bbee; + color: #fff; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #eee; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #f5f5f5; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #eee; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #f5f5f5; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #fafafa; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ebebeb; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #404040; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ebebeb; +} +.m-list li>a:hover { + background: #eee; + color: #404040; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #ddd; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.calendar-body th, +.calendar-menu-month { + color: #8d8d8d; +} +.calendar-day { + color: #404040; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #ddd; +} +.calendar { + border-color: #ddd; +} +.calendar-header { + background: #f5f5f5; +} +.calendar-body, +.calendar-menu { + background: #ffffff; +} +.calendar-body th { + background: #fafafa; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #eee; + color: #404040; +} +.calendar-hover { + border: 1px solid #ccc; + padding: 0; +} +.calendar-selected { + background-color: #00bbee; + color: #fff; + border: 1px solid #00bbee; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fafafa; +} +.datebox-button a { + color: #404040; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #f5f5f5; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #404040; + outline-style: none; + background-color: #f5f5f5; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eee; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eee; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #f5f5f5; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #f5f5f5; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #f5f5f5; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.progressbar { + border-color: #ddd; +} +.progressbar-text { + color: #404040; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #00bbee; + color: #fff; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #f5f5f5; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 4px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #ddd; + background: #f5f5f5; +} +.slider-rule span { + border-color: #ddd; +} +.slider-rulelabel span { + color: #404040; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #fafafa; + -moz-box-shadow: 2px 2px 3px #fafafa; + -webkit-box-shadow: 2px 2px 3px #fafafa; + box-shadow: 2px 2px 3px #fafafa; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #ddd; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #ddd; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #fff; + border-color: #eee; + color: #404040; +} +.menu-content { + background: #ffffff; +} +.menu-item { + border-color: transparent; + _border-color: #fff; +} +.menu-active { + border-color: #ccc; + color: #404040; + background: #eee; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #404040; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #eee; + color: #404040; + border: 1px solid #ccc; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #ccc; + background-color: #eee; + color: #404040; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #ddd; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #ddd; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #404040; + border-color: #ddd; +} +.tree-node-hover { + background: #eee; + color: #404040; +} +.tree-node-selected { + background: #00bbee; + color: #fff; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff; + color: #404040; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #ddd; + color: #404040; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #ddd; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #ddd; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #ddd; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #ddd; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #d9d9d9; + border: 1px solid #d9d9d9; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-on { + background: #00bbee; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #404040; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #404040; + border: 1px solid #d9d9d9; + -moz-box-shadow: 0 0 3px 0 #d9d9d9; + -webkit-box-shadow: 0 0 3px 0 #d9d9d9; + box-shadow: 0 0 3px 0 #d9d9d9; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #00bbee; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #00bbee; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #00bbee; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.checkbox-checked { + border: 0; + background: #00bbee; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #000000; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #000000; +} +.sidemenu .accordion-header:hover { + background: #eee; + color: #000000; +} +.sidemenu .tree-node-hover { + background: #eee; + color: #000000; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #00bbee; + color: #fff; + background: #00bbee; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} +.l-btn { + box-shadow: 0 1px 2px rgba(0,0,0,0.2), 0 1px 1px rgba(0,0,0,0.05); +} +.l-btn:active { + box-shadow: 0 6px 17px 0 rgba(235,235,235,0.3); +} +.l-btn-selected { + box-shadow: 0 1px 2px rgba(89,205,226,0.2), 0 1px 1px rgba(89,205,226,0.05); +} +.l-btn-plain, +.l-btn-disabled, +.l-btn-disabled:active, +.textbox-button { + box-shadow: none; +} +.l-btn-selected, +.l-btn-selected:hover { + background: #00bbee; + color: #fff; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #00bbee; +} +.m-btn-active, +.m-btn-plain-active, +.s-btn-active, +.s-btn-plain-active { + background: #00bbee; + color: #fff; +} +.menu-shadow, +.combo-p { + -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + filter: none; +} +.menu-active { + border-color: transparent; + color: #fff; + background: #00bbee; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #404040; +} +.window { + background-color: #fff; +} +.window-proxy { + border-color: #ccc; +} +.window-shadow { + -moz-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + -webkit-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); + filter: none; +} +.window-mask { + background: #000; +} +.datagrid-header .datagrid-cell, +.datagrid-header .datagrid-cell-group { + color: #666; + font-weight: bold; + filter: alpha(opacity=80); + opacity: 0.80; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-style: solid; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/Thumbs.db b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/Thumbs.db new file mode 100755 index 0000000000000000000000000000000000000000..5f257a2a49959543d36e2641d352572547e40e63 GIT binary patch literal 35328 zcmeI52|QI>`}ns^Wu7Hd10{saWN1RTQWRxO2$?d=bTp}qsi+Xi6q1?D^PJ3N4ozl9 zhLhp=KfB?*b>Dm6Pw&0&@Avz6-xlAqj&s&p&t7}4^{i*D{p_W=iS}i5`lcb|H$e^| zMDS}H5R$JxCxG`T9|H}7tb;d10Df(4?bC+{0&jnYALtCM!m+N0i%0+YS`tHyUUO1l z0|1v9Ap^((3V;%z0;mC6U=u(GFaX;DMt})m1~vjL04u-^umS7<2fztz2DSiOfo%X6 zumji)NCG^-PJkES1NebmfB+x}2m!)?3?KrC0%CwTAOT1LXxo&Acn=`^`ENOh<$=Ax zK43p^06^3Jw*?Kv7JeMzS|}hk5Zfc?;Y@sgU_yxh(dW_j@~=X(mahm#t)74o679A9 zloGwxej=KSX5U*@DtZtQ4j@KQYa_%8&Vt#ekN&M!8qk9Ou6(rb_@W&R0@{B6 zNJd~Ad{6&J+YfpUzx02!yf6J9)gh=3_|pGTJ%Q?g zKkEMn;X5?HBE(9-AwU^W0aSrs05#w+pbnsEk3y^gXadK8*a7x{1KYG71WEGIDZCDmofUDq1RXavCNYT6zXXMn(#1=8a4Y8|fGr8PGxq z2q6y<@djez4GfgzlnnoNSSv+n*TcATijZI{vW}L3kd|Pr5*60Rd6M2{L$d&2h!5iK#@mfibE=#LtaZna|&z7QO}e%t=^GDeM- z87`62_7^vhF)?ps*~Gnl2hUDkQ894|Nh#?A2Ne{R4k@c>9y_k3ed45!v5Dy!Gjofx z4vtRFF0SX@E?vIjbM@MF-h%hDTn#e)IO-=oohP{oMS*BJRTyS}y{G@Kd$^QM2FFix%p&j);hm zh!m|C!8#X!kd}ye%We|7eMd=+?C7@&Us%tuKR7zQY{NDYjTy$%_AO*gT%tqVShQ*% zYxaE=yZEPS_K%AFTCX02f{*|%9w99Zz^e>Tu}-0Pc686Px|>haoL0}Wrl`q#`$#UE zb7e=5;G*anvOLO1H?8b5@aAAq_$vSI_sVtL1rb3yeiNH8D+`>94VWv4Bj-$%c}ZW} z8ZsRlgQuTlUJk>o&V@9sUQ%B}A}jD8Y-eKrCdn~t-Cx@HKVllN)L7uJQ=dU~-p8K6 zV>ckrUr%rvG>IW-7$?vUj-WMc;4cTz97ga?0KT*MsBJ#!P;?wX4wg*(Q9h$@a-h~0 z;Xm|8*$<*Wgb=!)`s1Ts{PFdN_!@GVwL-s8K8|pVe}weIam%7jw$wX%=7e8w+Y{f$ zvA?ChXr=I0`i$`IvUf^S6!^i#m}Sg>w}iEr`=0SbHb!{?5AQJ@+*8A=sPz6}v2_P) zC3WI}Sm+v(elMcTf25($8GrYo_nv*jo*Olf{8p#dY3;BeVt-0=qpL(OaQ!gW9u{$b% z;O@)C@i1h8Rc-6@>Q+{B>zEVK3IQZ#_q&(2_z1BLdnCKzcR z!iJK})kpZIh2*H2;CD*#=?S;q3EYT!t6664Fs#V5q$6`~cV+(N;E+RI#m|E72U(qy zzE!=R^p<`QO-g%t8>X8u?J7(4vz3x~p47NWQNKN`hpeM>0#09H5@jVNBO#rA=q>*{ z+67ez|2llJ9|~b;{SoX3Flv7G|F8N#YB&Ft@Mq>nfv==m>qsU(gsC*cDKCV}Q znfzVzA9Ri28JYG`F@mJ-OKmq7n?R)Eg1k#p#uK$m0KPqKs zVRJTLa*J%`tjVq(ryIcrFi zYsvHl&6fX(&lQ|ZZ9?0G%VK6 zt5x{pVhF=gg>PV_e7oYNjvvABhD8^yAwkM(NT2QNy~I%~Zu{_11^74 zm=Dv;s|!5q&hm2R^sXUIaCy^}zAF9KGx2K~zGG7)+4r=}>v;AOT$MRO`lp7zkKOjm z_*eSV{{13quE|5t(HtHEvz9$h)vJg1((hn zeH9L@3c~!?Tmp~z2fbDB=uMKiW~f>0$ao}tX-C*sN>V`3uB)V#u z-t1Afu_}9(qmgH7I-M!i1Lp7C^nc3ywft!Qp8f;#w?Bw>7nr}#mNz@k+C^A3H7uR> zUD9bgl$oC8)5B`s$#c|rU)s3`r!c%cgnv#4eChu;U_Ad3>|a)d;HUljmHqo8+dr!B zSKmFxZ_xGM z$j~*!to>9@AeMw{dEb#|?vZYn#*eNc<(?1M5C>SoExws%Op`?FVFZWb$zbC&_{2FKP?`7HP#WJ z_h->|@V)g9gtRw5%m3fLf5-LH{`h=f^2gWTr1<9?mu4U4%Vz}5@}#=-X1>Kg36Rf> z+NWSRtHAi`ePqoRS%#x0*#Fh^`iuT*g8uj;*w34h&3`NV`2y$y)W6^o#Fv39fDdpL zxCUGYd;vee9|!=@^g$5c0D^&=z%Af55CVh(cYwP9nl=pLa3BJ>4@3e{zylx}cnHJ* zXxcc4Wg;3& zk#YmU)?#J_!K)q)(fhJi!0hqrYJ?VK;l zx3&%baEGhs?c2oyOZU~zk|wMahR|HZtJ!5!++@|lJ?vK~9F<700k7;g4MHd)jKWnp3XapGuJSX$^Xo(a81-S-r`AaXGtO zA{!-B3lFoA6!nGR_PJehHT$x|YqXiBja}U14?kWiFw)v-aveG0yV-iy%%<;FHtlgt zU~vlZ;RVczlEsqnHAH0%sXLD;#8|Alz3?-T*UTAsJG;7aXAQ~CD|zbPTrREK|n1{*&dx3lbbZjR#f!hW6l3Z2zUa04 zU`{VadyhKFXg;P&UtXnsUTrI-;mMLfz7%ckyk@FoUY0F_c^9L%s0Qt#p-Fmx2xW6t zS`!||X(wQ8Tumo-iTO!R#rsUvRMaTvWk;?bzQITG;l93^etm`I&dokVzHbWYu?#C5 zZPOmRhQ;%m=fmwRZS5#@$}PHRvo>s<=UE=X2niX@rjeE2u#hntsgn~O(6f*hdzIfA zhp}9ZO0cj@Bp+q;CugzpCnid`w=Lv2Tc{*UwC1C9=8`Fm*-WkF$yCS3*9&C>vYm9_ z=esPINI3tVuL`Piej6y@15iUq1K6WK!uY=)A^%&A|Nq7Me_6wjz=DG`SQJCkk9)6O zeD{N!?CU%JVi%VxP6cl`>YT_}?|t%phPZ;o?T1`-M9ItijY&b-gDYydfEfM8_i|AW zU5l}kyH@EWo(gVzd5Zb81Y6pnvh{Hc1mCyx_OUB`Y5zVyNc(5{Ie+`x%-?=lKJ+k6 zKFhO;fuQk2)9MJ^PX1R@wco1lZ`$wA`yW51|M2er!1@y-v;-yqrYRq%6~Eh1zWVSU zy#M0=BK#kaPY&hL0^ch?7Si^CzD0w`e?UGnl(P}|UioQ|)|CWaAc+14aDna zjEz-E`e!?xXNw+BQ}~GACOPu%07anW*8HWR;vHiPOqs5_>XEbSZBxaP4_I5x5^(i$ zX?Z5MPqIZg#^(|$;TZ>Dfk-}o5l=l`f}7v5!q+H>$2d)|a1LUyW21HP^m_BWvlG?9 z^(&IXN|sM_iW(cAX@zCY?C)}+mhs!zvwzzD#K?|Bv92!aneh{CQ)0FoEz$=}AHt*;iw;g~10{_OLhD zY%bU`-cFYHGU%GK8{=C)(dBWA;H%f26q%0(ynHiST0cLucQi7j+QSPgkms~LSpJd~ zH!VErVO2zjR9!2SaqG^dOiCrt0kKRKP)Y^|W0Y_Tgf*^R@-_%^hIFvfbny z7S~8y5!(IXxVtCkuxv}E0TY(cJ)C9lN^NTUNaw74(nH(U+)@8bd!dK;ZmVT3w_y`W&Di1uYk;!VQR{7@_vKy z^8Ch@wlkTX0tQ1Vrl$rDrWM}1vD4(m@w*q<4^>OeV!E%0O;eoZ*e16-GfF8la)6#( zKREA|md(10x{}5{MM{+e!fn~I2P!(XnBJ@C8n!m|aOq#Lb7wjy9VxuWDfQWVe+nVV z`loIhn*Pof@%LNZQ$$~^itMb?s(v}zmCB(kIu*HCR3i8+!c``S9oJKLgGB!q!w2{| zZQ5j?rSpEmtH-*o)-3N?Ig0J7Ox-9NDcmWuCwd=mohiwECwlMH`^i}mg7tYdhIie% zdZpKpi*vSgdP)wMGX`U#yHlRg6$)Q|?mQh3a;-`7xrm;Ux9!B7ASF>~jc!gsL8NNl zaFj}M*g<};L*37;PQ)6~OUXM97aBN^7ii1Q(NT+&6uZp|9< zMLZv_a@E9p4Vmbe*BjWJbt~5G(HioUdvOh6Nzy#4H9Mz&1k*>gyoUI<8pOyQy0d`6 zMGdL5xyrc=fWv<-)&@Vo{?`bcl+ou~kHfrFySq?Lv}$Mt0>_i-TXrpB}JBe~v#tpFjQG z2W$U_{AcNL3!*3$ius<^(Lc9wRm3jD&4 zOdX9b#&SHksL1!;zPzgvlU6fH?-Vzh-Z$uKsL|MX|3(9)Rw?b>Tb)zAk_NNeJ7hAf z%To+Z+Avg24Y{@RX_A7e)p645i;4PzZ&Zg>m+Q{nITkk1waWXj*e!e^B)mpi!6$l% z#j&4!e|yZJ>Em&KuBQbo)u%GGHArJr-Z`ugIlT|!^w?iAGf{g7&yUqgPkL6+xlxS3 zcq2=-N^cS|8=L1yjaT;D$MuX@yM~!#uXQq)g|yvloqLo8QVIm(>B^-=Id;&C9VUMq zHSh8&TkhGzV%{0j>Ol^Ruq$0J1g6E>voF}hwumK%JbgdRb#Y7Hi&VA*$jtcT`Iz@2N3Cs|T#2q+n1tZvj&ZIWQWcW86aQG<)gXXk}NP7i6_&wDuO=_(Q9EMC^E&Z|xDOjH?^o z{FKWq=q?rCkZXx>^{Gc~ahC!<^oLIb#nz5ii^&#E3{Tyk=*Umqv(SZ=Bc6G4$u8A3 zWv(|qt7STJdBUyZ{;))dnTOZwO4YzEd2=uM6LRl9@H~EgW~3sF`6B;mtZ1DBm7kT% zSeM4eFfkUcDbg)UrH5&&;%rvufRr?X@1YHh5C!k(J(3 z)t+HR$$LU3bnIrg=pFZNt}K_yq9!}+^yLTG!Anj7>xQ*22u}7eM#`6v&nq*p#+`aB zTbdf^wG9_DjHwc&d*LD4lI1r@F+R0pq;d94!+X!UY)=zo4DA8+NJjdXfn3@i^za0N&p;ez# zy(3OSn5o~st*?sTFY?|of6fPwsW*CX<1EaESyS09rAeYV;t0d*oHjIApLF&%?Y6<7MUruH4Plib9hTKlm8ZvXr%+#?ICZmCba|9D85C^{T z)@|h}Jwk#!E+N55D9c|KHw!hzsNkf0i%#ACON6^Hh>9W1~vjLz$SndU<23z4gmHy zK{f+hfUN*3XE(&$z;<8AfNy!0!qLkKp9X0(0so@tOgtg)PW;VVB z5pV*W0T;j(I1ji1?tlm233ve*z#I54zW=|fnYs-dG-))GS?aa5xOqN`u7M-Yct?l> z`;(CK&cVvwDlA*Bw4I~K(|cuNLRPk#T4F(t>0TZh31^A6WgNSP9c_`LzVX0gQJ|

                                                                                                              NA+ZcC>&vv>@9CR4VtY9M(_F}@-1%;|KR!4iA9GaQ>eBDX}J`#J5%ao~~20i!d=uaWnN2JTaCZc`4~#{=ltA0#Q#aZrz(q zm2=*?xv736TAM|Kl=3M&Bw@D{zAUxk)aE6-BAe5h;+@@bY7J3ppPMZ$$}S~5x2U-o zQjkbmI-tbu1yQUt@EkZA~%UI zDZD8leyDP5!{b&)XQ9#uFDH9gW$d3%xV`jLCJ9x3F0V2d)ngzpp)j-GseibEU`g3< zw}%EUZ+MWvwLm-Q7ya#T)zZw{CR~~&&pg|?W$Qs3suK&ceD9y{sA%;Opo@4M*1u@g znZR5@5PCE*P%q8zm0o(U;?z=6wp(T+e$R@;(;1Fz%BlMdZ+|I1y-SO}lFDmEUy{9g z52kCkf!%6wO6Kj{)_KL<5&Jc^my)u))<)PCMw=Fy$?)Oz3))h2DG<`)a!XVo!GVvb4v6F8sz76QAYsC7a~r9%a{jt!y*OGU7Jj4X z(9=811A`MM28COelk{3Li>H^EEZF?%V6sKoc z$$2S~5*L?H6m`8&-ZV+E;%exYBK1c$50<-9BTR0;Hwh2-4~cS$#zjhB7Gc|3)?u?# z&ZKj+rzassXEGtN$?Lg}?F&4$>rRysInFfp-D?OxUHC&B{m>dxs=L$niP(v`Yb@-P zoq0*t3R+w4@;I-TB788Zcf4sLbJ&xk)O>&zS2P?&?P|MOAo9$~Fd{Z0Uo*|Ef@xM{ zK@}xwS1TG+=i65f^#u9PTfI&dD@b^1@AX*CjbWzaxPi4`=Ae=-PNp|hD%!Rs_`jbA(=v(l-y%-aTAId{wnS->smC-as|g_-m8iYF5Wyx}LxR_Nz03 zJ?v~@?>WPddrf`XS5W|Vo3i=5x1umuDMSF$-N7s%gzirD^}bX_A9t!U`(~G^y^xp~ z%@HN4w`L zny3<+N2lRPO+d<*T_O!(w?1?yEk}@szW#G=QOLa>Kq6_qS0#U&8{LP?7LMHEo0`f% z@(pO7XL?R?;%FZ0kL5c-`Jc`zT1z9SpFQMu`6jP8WFtfK9w)rU4`=D?yy!6+LH(?t zG?Q=64SF?D--$2h_Ul}~e>Tyxg3j2G6`#s>v2W$r!x=JztAL)5-#^NOkdYG2Z9uk( z?>9$@o=b<1dCx#O=&_!IdZJg>@tb4b57|+F2ZUtM_K(XjgSrtTfN6-J)Z3)eZ`dJ_?D@j?u)DxiX`^)@Q4ea?JVf~s0q4|0L z^zU*1bg5v3BzuJV${^j!zG2H0L)|tC7H}k)t#&+yc6{dHq`^nGF=%S6suv5)R&xZ=w;qF ztRy%*-py=vj%lM2(fM+db0=P3dw!UTZ#v!8DnC^7a6GT&IGwNEkuFt>rrt)k?p^A) zq77Lzg(7$qmKg>`Lc<0P4Dg26zaC%E9`}dgH1ux6kDB6>?)h5t{MzS*AV2CMhMb7w zIIZ-l=YGohrT=dKLHaNGPyh43i~sFX>acn>;gG&YJ#kudw#Bq)vU@>8-C3CX*!;)R1mi=YZGeN)Y zn8q+x+d>~iN6KG!6GiPGbX5xJ3$K}0`MSUT)*AWJ|9%wz;mtq&-~TTCZ&iF*fie6| zlpA0Bf*JGfd)MWQ*O2>+4)qW7^PYWB|7}Z0oAW=1FYWi}4>ErI*8Y?F53E1KlH?ld zPL0O@e1`t{6Ioby)Q9th2BE*W13v73@KG)*8x5aI{nxLmAV2uC|M%|y1NmAY|H{Wn zExPYAIt%;r;m_3H8ssy5md^?9&p-E1{~`BJU!EQwoFt9)kh(dpl6ELNh;F~{Y_Ci? zt1e9i@1nzvgM0mHyhVe8v)4;;7|&Q5U|p)@uWzEho|1jv@_5TGv!}O?w-?s&XPq1o zpH*Vaj(akpnxmyHEWYqT>fE`QLfrJS01h+4@3P6C?ml_tRLrUzcRyvz@t%io_%CcH zLF}#`K`1X=dS#dycmeA$L|v64UnZS%$Jv9Kx9M#YgPL3v4eg#9F5wF~!q1c94);yH zcJN8fFC9t~v(L}0XoUGm-pL$!u#>IrRkC!-ga}TQSg^YJ7f0Mc zWVG5}Xq-maTAbB|XL4m-n43|^^;=0>N$Vzta$5=`h?|-q*+A*o{>izW!H0V z96$byUEPfPS&m>)OAbLwdhXSEY2oV2MD{m zjXKE_TQ2IzBpvXKlyV^V59HW(`;=$RYeN%!V^r2aIJUL?t$INqyGT_ip@i1%^w~Fu zTPtoJ9z4z!B3rvT>Kg#u0NO_$arONx5{BjEk#B4Vw--;$spzxt(mJU^fg2CQ5R+S*mHfowhnHb%I1^_ z-bCnMC*Hcgw)P;YR8>#9;~61{m>anf3# zA^mN03Q-4sg&1Y`_VA3``6^4|h1t2GxvT4NN5z>sfi>j2?2JFM(7)(!vL94`Ux2v)>QizF;>+l~1n>c_0@r}+fG^+& z_yYkzAP@xH0D^&=z%Af55CWj(-GTTna1RIr!hs0jJ`f2+0S|y^;2{tL!~$_ZJdgl9 z0uq5F04?(|#3{fNAQeah(t!*h6UYLx0W@tc#7}`dARj0I3IX)HpW)Xt@N@q6AH?@VW)C8=k4+SU=9=WROuEwe9?yh?+j!tCH!;nvoGyk6SNx`&#fe;3+=Qtugt+4b`@0Qz_DXN( zbSt*;Ue~g$RGJ=hodQDcHyZWt2@XC<4h>kg-E2d=mqNlw+k$aqFjMe)Hl^i)Jo6P zWKpwl9}%jhB02W*eWRuKGvlifreaBMa#6y&C3hZEE1Pb9iDy2$C{H9uXCb!{>(qIh zYi2bq$7ia1G)yX*<<#u70&Uv!^~4vd?L{t>;D<&iY_??EM`qPBsCS#r_FBdesxRMkWjb4=R=8e%s%v#*pY^*PKY z_DQTmYI6I$*k?LJhS;~WizudDQfnL97&y=`p46o%&%W{b(Tg49USSKuWkakgv4aiG z|IUE=W&ErJw~(Lnpa1>mzeN5I)*mmzINbcv4G7);;(verGZf_S`n>)r_J1Hh8RUQQ zzy2e;^56OV*U|j@*1x|l`@eYpySm$2OW$V6(p~wW^N|}Iu62EtPRIhwNZ`|P-`OT# zOcu3|7d>vIB9bV*#SAMLP`E#3S7-=PTB%HW0VP*!M$!~dnG*N4ZH%orPMwn;66B;5 z&uSb9JD*1RdC|>?Wxw~(>ME28i@GMWEuqfI!ZEI}G;Qi01J7pqr#T}10q!S$5oK4H z)UTyMx7hxk@ARgirxO}D!etGZEZ-^YbWCO!IWm*$n`L8@HM#G&sRDIc{-Mhk z8LO%HZ(wsU$d1Dmk0@Z-q^YuZ+*^prsh{yC7vdc2Z4a)M{g4_`Vj|exiMg`qGDusf z;A~ih=gF~n!aq_IVxHOXHm!E7n^!i?({*kz$Y6&WU&TV#vUfqYqdB$xa&^awI%8W< z+0g_ol}m*hE7mDdmUoA+4mb6dGt?RT20fUuGUG06H(k#x?O#~jY--H4S}jY!dF9+1 z!cnL@9L3}z64^B5Twt4k3)8*3FI1V9i)p#Ub(?^=&uCYU-E+S2eqE)EE-RCa_Fcw> z**A=aL+s-V4J$DjSAE#I^P7o!OvkpE8!4aIZZa^ z%gxm@t|BT?lOhHg>~}O$`wq?@m$}s(LD7+lcu7mh9>3qu#30y@g2gy5_;0X=(=+DcHH4GWx2uVjWWA#CQ5wk z7Ws8A`{Vat#=k8;%>0q_r~laB!+#9+-=MG5>AO?B_2%=PD!Sc|xM8D#2F=T~LwX+LnXo=$#qqL7p96d&*L^utqX+2&Q^p<&C7x`#Wv zBO~de_)V|f%r}f$A)KxvR19K79@>;Dg zDi{@-lSW#`N>aBq$Z?G~JjVI%;+5z(i^ngFkow#XWS$|N7kkN>_5A(=+?}#82DvR* zrl6sxLs*U|cgE^W410tFud3g*ko(?eEL|e3*xfiN&#ow7C%ei^=m#vq@ZpK-P7d4j zQaa-AJ2)_mDOYUR7I0z7Y+I4X8iE~bD2>XJ8DO|o>Fl-L+tqFCrK($CK z4Z+*%n?moJo@#h5CB=E6foGVa%XcK)SZMxT+uQsIi^CqlK@}#U1zeLwy>dmWYa_m*xmxZ$29_qb#ex1u@^RN`cQ?ne)AygWSYv;_kb1mvXMrSe8;Ik%|A+3|5 z3AbM-w3>4DMl9~8nUN?wwa7T+W?PfOtkgE~*jhBeZr8-izyTUZ-QoRPujobXc!DHJ zD^=~nR1RjTduOY!!)a@mwC|eC-k7cYB&*j?SJRS9_vViCjP@R{lsK+#!v(kxY6Y%%dYhXeg8nww^h5XRu4PXhrR`QT+2#)Av3em{YO-^d^B;cyG14#k z^QZsNkGcQgkG%gJ;jHYV6vK?8V7?t4nPtToFNkWD1WzisM!uNKqyD~G@UK3q=#vWQ zQ>+M;KY8|N@A6MRs;D>o8SsPuecx6A$bvroi7>hy@KOHOpB?qfJNJzbJ1Pa;uMy#i zpt*9Wo&fc6cYq%w@ZLk8oiP0Piaue0K1cDZM<4ox0lLTIALm1T_0K@QuXCZ#3!u9r z{&6llcmm{;=f4Hy{q}#7qfbPj`zro%ZkLbe#OC930^dHrfzB$?=aP}Q%W~g(AR56F T0gjLZeOBaa?|wA#e_!~27*z{8 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b6368d636e2ff36501ff9c6b14f7ce09997f3743 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel!K>>V@SoV?_1tQrr|vg#{&FxgXS!5MW?fq8aJ< T>6BX`&@2W|S3j3^P6h?7!oT zn93bYIb9!43Wj)WNz0M)xYl!8U>3_OjRiss3@1j_Zvlb#iD~jUnsR3em#t_3WtUHqj%c^0} zFSrhZpjU$)YHUS-lsMx)nN8pghWK6h!524#*oXjC@NjHF9H1y2K%G?c=lr%4eY%ue zT+7R9Pld<2<$C}OAU0HZIJPqD0RA&Sip042zF(tA4uaUhZ>jL`*HN0POocjDIidNRbTZ#@zvW7@I c5>Ct23v;ttA1D3-v;Y7A07*qoM6N<$f&+eyE&u=k literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/datebox_arrow.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/datebox_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135 GIT binary patch literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$f|L1?c z_O8;7?=$$OZE)N^=kf)!wu_8{hTkWuP3Lf!{Qqt%*U6B7qRbydZ`F0T{#^CG?%493 zHc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000_$JYFBpo`sqZyU339@ZwM6gi$;Pr>w&6M&T1N3Q$b?ahk3>@EL9`+1-BwzvH4 z=V<*uH!1ee(Sv*K$aVm^9zxbfZU9nZC#eDGVQ*&XXK(qpy{>x2j~_q0QX@ky?B2S$ z`TO_pb_Ho^lHPWf$3SXG3P5TF!a(UIB>)3m?2n~HhFtml`Lhm)4-7>2Cr_RTgV@`) zZDWrM_B#twLv#R=>k(}FC=EbL>?Sq<16=LCHdYi*!X*!q1F0DeKpY^*)!|!SNr;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..0f25d535e05b22b406fd72647611aace9cfa6249 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b1773c24b20b30318e38c4b84690e3d0010c9c43 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4DgeBzU z{E=^QXHHmRmEiEUJ<_jB`NK-}t7{l}8A{FvOK}{T)p$BC>8|6-x-MIXOa{IRh5%#E x$&;(vVs#x>vb(K5c#%QkA)^788{=C>2L8QE5AM%P*8@KmF984m literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..4dbacce18ec1310d22dc4de8ff895f597b0d61eb GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2L1978H@B_~L*E^hdC;Kq#~ z_8gbJY-45o``Fp;2v4zS5!xHXwo~JmL(T+=yD|FVdQ&MBb@0IQ}mHUIzs literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec64360884b3fdb81255ad6074bc08ed183232c GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoVtb9vwNkrdSr%AfUpK=5(o}_e|{SG6u6f5&Q g4t5*qz9vC-hN^}472i&@1{u%b>FVdQ&MBb@08Zm4@c;k- literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/progressbar.css new file mode 100644 index 000000000..3eb2e0bc4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.progressbar { + border-color: #ddd; +} +.progressbar-text { + color: #404040; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #00bbee; + color: #fff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/propertygrid.css new file mode 100644 index 000000000..1d7a39211 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #eee; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #f5f5f5; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #eee; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #f5f5f5; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/radiobutton.css new file mode 100644 index 000000000..8dda45fd3 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #00bbee; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #00bbee; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/searchbox.css new file mode 100644 index 000000000..54ad88517 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #f5f5f5; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/sidemenu.css new file mode 100644 index 000000000..cc1a99b61 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #000000; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #000000; +} +.sidemenu .accordion-header:hover { + background: #eee; + color: #000000; +} +.sidemenu .tree-node-hover { + background: #eee; + color: #000000; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #00bbee; + color: #fff; + background: #00bbee; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/slider.css new file mode 100644 index 000000000..43658ddbe --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 4px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #ddd; + background: #f5f5f5; +} +.slider-rule span { + border-color: #ddd; +} +.slider-rulelabel span { + color: #404040; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/spinner.css new file mode 100644 index 000000000..55580b341 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #f5f5f5; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #404040; + outline-style: none; + background-color: #f5f5f5; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #eee; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #eee; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #f5f5f5; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #f5f5f5; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #f5f5f5; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/splitbutton.css new file mode 100644 index 000000000..2ad86f774 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #ccc; + border-width: 0 0 0 1px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/switchbutton.css new file mode 100644 index 000000000..4c628cf40 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #d9d9d9; + border: 1px solid #d9d9d9; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.switchbutton-on { + background: #00bbee; + color: #fff; +} +.switchbutton-off { + background-color: #ffffff; + color: #404040; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #ffffff; + color: #404040; + border: 1px solid #d9d9d9; + -moz-box-shadow: 0 0 3px 0 #d9d9d9; + -webkit-box-shadow: 0 0 3px 0 #d9d9d9; + box-shadow: 0 0 3px 0 #d9d9d9; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tabs.css new file mode 100644 index 000000000..a44d914c7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tabs.css @@ -0,0 +1,377 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px 4px 0 0; + -webkit-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 4px 4px; + -webkit-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 4px 0 0 4px; + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 4px 4px 0; + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #f5f5f5 url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #f5f5f5 url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #eee; + color: #404040; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #ffffff; + color: #000000; +} +.tabs li a.tabs-inner { + color: #000000; + background-color: #f5f5f5; +} +.tabs-header, +.tabs-tool { + background-color: #f5f5f5; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #ddd; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #eee; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #ffffff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #ffffff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #ffffff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #ffffff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #00bbee; + color: #fff; + filter: none; + border-color: #ddd; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tagbox.css new file mode 100644 index 000000000..16ff41475 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + background: #eee; + color: #404040; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/textbox.css new file mode 100644 index 000000000..488e6b7d2 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #ddd; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c4c4c4; + -moz-box-shadow: 0 0 3px 0 #ddd; + -webkit-box-shadow: 0 0 3px 0 #ddd; + box-shadow: 0 0 3px 0 #ddd; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tooltip.css new file mode 100644 index 000000000..a00004879 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #ffffff; + border-color: #ddd; + color: #404040; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #ddd; +} +.tooltip-right .tooltip-arrow { + border-right-color: #ffffff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #ddd; +} +.tooltip-left .tooltip-arrow { + border-left-color: #ffffff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #ddd; +} +.tooltip-top .tooltip-arrow { + border-top-color: #ffffff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #ddd; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #ffffff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tree.css new file mode 100644 index 000000000..ccb900b96 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #ddd; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #ffffff; + color: #404040; + border-color: #ddd; +} +.tree-node-hover { + background: #eee; + color: #404040; +} +.tree-node-selected { + background: #00bbee; + color: #fff; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/validatebox.css new file mode 100644 index 000000000..5911752fe --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff; + color: #404040; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/window.css new file mode 100644 index 000000000..8f1851ec7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/window.css @@ -0,0 +1,182 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 4px 4px 4px 4px; + -webkit-border-radius: 4px 4px 4px 4px; + border-radius: 4px 4px 4px 4px; +} +.window-shadow { + background: #fafafa; + -moz-box-shadow: 2px 2px 3px #fafafa; + -webkit-box-shadow: 2px 2px 3px #fafafa; + box-shadow: 2px 2px 3px #fafafa; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #ddd; +} +.window { + background-color: #f5f5f5; +} +.window-proxy { + border: 1px dashed #ddd; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #ddd; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/accordion.css new file mode 100644 index 000000000..fb9f85e46 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/accordion.css @@ -0,0 +1,89 @@ +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #fff; + border-color: #ddd; +} +.accordion .accordion-header { + background: #ffffff; + filter: none; +} +.accordion .accordion-header-selected { + background: #CCE6FF; +} +.accordion .accordion-header-selected .panel-title { + color: #000; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #fff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #ddd; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #fff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #ddd; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #fff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #ddd; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/calendar.css new file mode 100644 index 000000000..3f32d30b6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/calendar.css @@ -0,0 +1,203 @@ +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-body th, +.calendar-menu-month { + color: #919191; +} +.calendar-day { + color: #444; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #ddd; +} +.calendar { + border-color: #ddd; +} +.calendar-header { + background: #ffffff; +} +.calendar-body, +.calendar-menu { + background: #fff; +} +.calendar-body th { + background: #fff; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #E6E6E6; + color: #444; +} +.calendar-hover { + border: 1px solid #ddd; + padding: 0; +} +.calendar-selected { + background-color: #CCE6FF; + color: #000; + border: 1px solid #99cdff; + padding: 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/checkbox.css new file mode 100644 index 000000000..5c8ebdd41 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/checkbox.css @@ -0,0 +1,31 @@ +.checkbox { + position: relative; + border: 2px solid #99cdff; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.checkbox-checked { + border: 0; + background: #99cdff; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combo.css new file mode 100644 index 000000000..2e8907183 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combo.css @@ -0,0 +1,35 @@ +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #fff; +} +.combo-arrow { + background-color: #ffffff; +} +.combo-arrow-hover { + background-color: #E6E6E6; +} +.combo-arrow:hover { + background-color: #E6E6E6; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combobox.css new file mode 100644 index 000000000..115192c0e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combobox.css @@ -0,0 +1,40 @@ +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #E6E6E6; + color: #444; +} +.combobox-item-selected { + background-color: #CCE6FF; + color: #000; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datagrid.css new file mode 100644 index 000000000..220e6a97a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datagrid.css @@ -0,0 +1,285 @@ +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #ddd; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #fff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #ffffff; +} +.datagrid-cell-rownumber { + color: #444; +} +.datagrid-resize-proxy { + background: #b3b3b3; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #ddd; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fff; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #ddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ddd; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #444; + border-collapse: separate; +} +.datagrid-row-alt { + background: #f5f5f5; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #E6E6E6; + color: #444; + cursor: default; +} +.datagrid-row-selected { + background: #CCE6FF; + color: #000; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datalist.css new file mode 100644 index 000000000..8a7f94989 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datalist.css @@ -0,0 +1,95 @@ +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #ffffff; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ddd; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #444; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ddd; +} +.m-list li>a:hover { + background: #E6E6E6; + color: #444; +} +.m-list .m-list-group { + padding: 0 4px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datebox.css new file mode 100644 index 000000000..931b825e1 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datebox.css @@ -0,0 +1,36 @@ +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fff; +} +.datebox-button a { + color: #777; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/dialog.css new file mode 100644 index 000000000..373747925 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/dialog.css @@ -0,0 +1,47 @@ +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fff; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #ddd #ddd #ddd #ddd; +} +.dialog-button { + border-color: #ddd #ddd #ddd #ddd; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fff; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/easyui.css new file mode 100644 index 000000000..7deea709f --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/easyui.css @@ -0,0 +1,3373 @@ +.panel { + overflow: hidden; + text-align: left; + margin: 0; + border: 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.panel-header, +.panel-body { + border-width: 1px; + border-style: solid; +} +.panel-header { + padding: 5px; + position: relative; +} +.panel-title { + background: url('images/blank.gif') no-repeat; +} +.panel-header-noborder { + border-width: 0 0 1px 0; +} +.panel-body { + overflow: auto; + border-top-width: 0; + padding: 0; +} +.panel-body-noheader { + border-top-width: 1px; +} +.panel-body-noborder { + border-width: 0px; +} +.panel-body-nobottom { + border-bottom-width: 0; +} +.panel-with-icon { + padding-left: 18px; +} +.panel-icon, +.panel-tool { + position: absolute; + top: 50%; + margin-top: -8px; + height: 16px; + overflow: hidden; +} +.panel-icon { + left: 5px; + width: 16px; +} +.panel-tool { + right: 5px; + width: auto; +} +.panel-tool a { + display: inline-block; + width: 16px; + height: 16px; + opacity: 0.6; + filter: alpha(opacity=60); + margin: 0 0 0 2px; + vertical-align: top; +} +.panel-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + background-color: #E6E6E6; + -moz-border-radius: -2px -2px -2px -2px; + -webkit-border-radius: -2px -2px -2px -2px; + border-radius: -2px -2px -2px -2px; +} +.panel-loading { + padding: 11px 0px 10px 30px; +} +.panel-noscroll { + overflow: hidden; +} +.panel-fit, +.panel-fit body { + height: 100%; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.panel-loading { + background: url('images/loading.gif') no-repeat 10px 10px; +} +.panel-tool-close { + background: url('images/panel_tools.png') no-repeat -16px 0px; +} +.panel-tool-min { + background: url('images/panel_tools.png') no-repeat 0px 0px; +} +.panel-tool-max { + background: url('images/panel_tools.png') no-repeat 0px -16px; +} +.panel-tool-restore { + background: url('images/panel_tools.png') no-repeat -16px -16px; +} +.panel-tool-collapse { + background: url('images/panel_tools.png') no-repeat -32px 0; +} +.panel-tool-expand { + background: url('images/panel_tools.png') no-repeat -32px -16px; +} +.panel-header, +.panel-body { + border-color: #ddd; +} +.panel-header { + background-color: #ffffff; +} +.panel-body { + background-color: #fff; + color: #444; + font-size: 14px; +} +.panel-title { + font-size: 14px; + font-weight: bold; + color: #777; + height: 20px; + line-height: 20px; +} +.panel-footer { + border: 1px solid #ddd; + overflow: hidden; + background: #fff; +} +.panel-footer-noborder { + border-width: 1px 0 0 0; +} +.panel-hleft, +.panel-hright { + position: relative; +} +.panel-hleft>.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} +.accordion { + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.accordion .accordion-header { + border-width: 0 0 1px; + cursor: pointer; +} +.accordion .accordion-body { + border-width: 0 0 1px; +} +.accordion-noborder { + border-width: 0; +} +.accordion-noborder .accordion-header { + border-width: 0 0 1px; +} +.accordion-noborder .accordion-body { + border-width: 0 0 1px; +} +.accordion-collapse { + background: url('images/accordion_arrows.png') no-repeat 0 0; +} +.accordion-expand { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.accordion { + background: #fff; + border-color: #ddd; +} +.accordion .accordion-header { + background: #ffffff; + filter: none; +} +.accordion .accordion-header-selected { + background: #CCE6FF; +} +.accordion .accordion-header-selected .panel-title { + color: #000; +} +.accordion .panel-last > .accordion-header { + border-bottom-color: #ffffff; +} +.accordion .panel-last > .accordion-body { + border-bottom-color: #fff; +} +.accordion .panel-last > .accordion-header-selected, +.accordion .panel-last > .accordion-header-border { + border-bottom-color: #ddd; +} +.accordion> .panel-hleft { + float: left; +} +.accordion> .panel-hleft>.panel-header { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft> .panel-body { + border-width: 0 1px 0 0; +} +.accordion> .panel-hleft.panel-last > .accordion-header { + border-right-color: #ffffff; +} +.accordion> .panel-hleft.panel-last > .accordion-body { + border-right-color: #fff; +} +.accordion> .panel-hleft.panel-last > .accordion-header-selected, +.accordion> .panel-hleft.panel-last > .accordion-header-border { + border-right-color: #ddd; +} +.accordion> .panel-hright { + float: right; +} +.accordion> .panel-hright>.panel-header { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright> .panel-body { + border-width: 0 0 0 1px; +} +.accordion> .panel-hright.panel-last > .accordion-header { + border-left-color: #ffffff; +} +.accordion> .panel-hright.panel-last > .accordion-body { + border-left-color: #fff; +} +.accordion> .panel-hright.panel-last > .accordion-header-selected, +.accordion> .panel-hright.panel-last > .accordion-header-border { + border-left-color: #ddd; +} +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.window-shadow { + background: #eee; + -moz-box-shadow: 2px 2px 3px #ededed; + -webkit-box-shadow: 2px 2px 3px #ededed; + box-shadow: 2px 2px 3px #ededed; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #ddd; +} +.window { + background-color: #ffffff; +} +.window-proxy { + border: 1px dashed #ddd; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #ddd; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} +.dialog-content { + overflow: auto; +} +.dialog-toolbar { + position: relative; + padding: 2px 5px; +} +.dialog-tool-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.dialog-button { + position: relative; + top: -1px; + padding: 5px; + text-align: right; +} +.dialog-button .l-btn { + margin-left: 5px; +} +.dialog-toolbar, +.dialog-button { + background: #fff; + border-width: 1px; + border-style: solid; +} +.dialog-toolbar { + border-color: #ddd #ddd #ddd #ddd; +} +.dialog-button { + border-color: #ddd #ddd #ddd #ddd; +} +.window-thinborder .dialog-toolbar { + border-left: transparent; + border-right: transparent; + border-top-color: #fff; +} +.window-thinborder .dialog-button { + top: 0px; + padding: 5px 8px 8px 8px; + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.l-btn { + text-decoration: none; + display: inline-block; + overflow: hidden; + margin: 0; + padding: 0; + cursor: pointer; + outline: none; + text-align: center; + vertical-align: middle; + line-height: normal; +} +.l-btn-plain { + border-width: 0; + padding: 1px; +} +.l-btn-left { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + vertical-align: top; +} +.l-btn-text { + display: inline-block; + vertical-align: top; + width: auto; + line-height: 28px; + font-size: 14px; + padding: 0; + margin: 0 6px; +} +.l-btn-icon { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 50%; + margin-top: -8px; + font-size: 1px; +} +.l-btn span span .l-btn-empty { + display: inline-block; + margin: 0; + width: 16px; + height: 24px; + font-size: 1px; + vertical-align: top; +} +.l-btn span .l-btn-icon-left { + padding: 0 0 0 20px; + background-position: left center; +} +.l-btn span .l-btn-icon-right { + padding: 0 20px 0 0; + background-position: right center; +} +.l-btn-icon-left .l-btn-text { + margin: 0 6px 0 26px; +} +.l-btn-icon-left .l-btn-icon { + left: 6px; +} +.l-btn-icon-right .l-btn-text { + margin: 0 26px 0 6px; +} +.l-btn-icon-right .l-btn-icon { + right: 6px; +} +.l-btn-icon-top .l-btn-text { + margin: 20px 4px 0 4px; +} +.l-btn-icon-top .l-btn-icon { + top: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-icon-bottom .l-btn-text { + margin: 0 4px 20px 4px; +} +.l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 4px; + left: 50%; + margin: 0 0 0 -8px; +} +.l-btn-left .l-btn-empty { + margin: 0 6px; + width: 16px; +} +.l-btn-plain:hover { + padding: 0; +} +.l-btn-focus { + outline: #0000FF dotted thin; +} +.l-btn-large .l-btn-text { + line-height: 44px; +} +.l-btn-large .l-btn-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-top: -16px; +} +.l-btn-large .l-btn-icon-left .l-btn-text { + margin-left: 40px; +} +.l-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.l-btn-large .l-btn-icon-top .l-btn-text { + margin-top: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-top .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 36px; + line-height: 24px; + min-width: 32px; +} +.l-btn-large .l-btn-icon-bottom .l-btn-icon { + margin: 0 0 0 -16px; +} +.l-btn-large .l-btn-left .l-btn-empty { + margin: 0 6px; + width: 32px; +} +.l-btn { + color: #777; + background: #ffffff; + background-repeat: repeat-x; + border: 1px solid #dddddd; + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.l-btn:hover { + background: #E6E6E6; + color: #444; + border: 1px solid #ddd; + filter: none; +} +.l-btn-plain { + background: transparent; + border-width: 0; + filter: none; +} +.l-btn-outline { + border-width: 1px; + border-color: #ddd; + padding: 0; +} +.l-btn-plain:hover { + background: #E6E6E6; + color: #444; + border: 1px solid #ddd; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.l-btn-disabled, +.l-btn-disabled:hover { + opacity: 0.5; + cursor: default; + background: #ffffff; + color: #777; + background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); + background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); +} +.l-btn-disabled .l-btn-text, +.l-btn-disabled .l-btn-icon { + filter: alpha(opacity=50); +} +.l-btn-plain-disabled, +.l-btn-plain-disabled:hover { + background: transparent; + filter: alpha(opacity=50); +} +.l-btn-selected, +.l-btn-selected:hover { + background: #ddd; + filter: none; +} +.l-btn-plain-selected, +.l-btn-plain-selected:hover { + background: #ddd; +} +.textbox { + position: relative; + border: 1px solid #ddd; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c4c4c4; + -moz-box-shadow: 0 0 3px 0 #ddd; + -webkit-box-shadow: 0 0 3px 0 #ddd; + box-shadow: 0 0 3px 0 #ddd; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} +.combo-arrow { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.combo-arrow-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.combo-panel { + overflow: auto; +} +.combo-arrow { + background: url('images/combo_arrow.png') no-repeat center center; +} +.combo-panel { + background-color: #fff; +} +.combo-arrow { + background-color: #ffffff; +} +.combo-arrow-hover { + background-color: #E6E6E6; +} +.combo-arrow:hover { + background-color: #E6E6E6; +} +.combo .textbox-icon-disabled:hover { + cursor: default; +} +.combobox-item, +.combobox-group, +.combobox-stick { + font-size: 14px; + padding: 6px 4px; + line-height: 20px; +} +.combobox-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.combobox-gitem { + padding-left: 10px; +} +.combobox-group, +.combobox-stick { + font-weight: bold; +} +.combobox-stick { + position: absolute; + top: 1px; + left: 1px; + right: 1px; + background: inherit; +} +.combobox-item-hover { + background-color: #E6E6E6; + color: #444; +} +.combobox-item-selected { + background-color: #CCE6FF; + color: #000; +} +.combobox-icon { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + margin-right: 2px; +} +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + background: #E6E6E6; + color: #444; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} +.layout { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + z-index: 0; +} +.layout-panel { + position: absolute; + overflow: hidden; +} +.layout-body { + min-width: 1px; + min-height: 1px; +} +.layout-panel-east, +.layout-panel-west { + z-index: 2; +} +.layout-panel-north, +.layout-panel-south { + z-index: 3; +} +.layout-expand { + position: absolute; + padding: 0px; + font-size: 1px; + cursor: pointer; + z-index: 1; +} +.layout-expand .panel-header, +.layout-expand .panel-body { + background: transparent; + filter: none; + overflow: hidden; +} +.layout-expand .panel-header { + border-bottom-width: 0px; +} +.layout-expand .panel-body { + position: relative; +} +.layout-expand .panel-body .panel-icon { + margin-top: 0; + top: 0; + left: 50%; + margin-left: -8px; +} +.layout-expand-west .panel-header .panel-icon, +.layout-expand-east .panel-header .panel-icon { + display: none; +} +.layout-expand-title { + position: absolute; + top: 0; + left: 21px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.layout-expand-title-up { + position: absolute; + top: 0; + left: 0; + text-align: right; + padding-left: 5px; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 0; +} +.layout-expand-with-icon { + top: 18px; +} +.layout-expand .panel-body-noheader .layout-expand-title, +.layout-expand .panel-body-noheader .panel-icon { + top: 5px; +} +.layout-expand .panel-body-noheader .layout-expand-with-icon { + top: 23px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + position: absolute; + font-size: 1px; + display: none; + z-index: 5; +} +.layout-split-proxy-h { + width: 5px; + cursor: e-resize; +} +.layout-split-proxy-v { + height: 5px; + cursor: n-resize; +} +.layout-mask { + position: absolute; + background: #fafafa; + filter: alpha(opacity=10); + opacity: 0.10; + z-index: 4; +} +.layout-button-up { + background: url('images/layout_arrows.png') no-repeat -16px -16px; +} +.layout-button-down { + background: url('images/layout_arrows.png') no-repeat -16px 0; +} +.layout-button-left { + background: url('images/layout_arrows.png') no-repeat 0 0; +} +.layout-button-right { + background: url('images/layout_arrows.png') no-repeat 0 -16px; +} +.layout-split-proxy-h, +.layout-split-proxy-v { + background-color: #b3b3b3; +} +.layout-split-north { + border-bottom: 5px solid #fff; +} +.layout-split-south { + border-top: 5px solid #fff; +} +.layout-split-east { + border-left: 5px solid #fff; +} +.layout-split-west { + border-right: 5px solid #fff; +} +.layout-expand { + background-color: #ffffff; +} +.layout-expand-over { + background-color: #ffffff; +} +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 0px 0px 0 0; + -webkit-border-radius: 0px 0px 0 0; + border-radius: 0px 0px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 0px 0px; + -webkit-border-radius: 0 0 0px 0px; + border-radius: 0 0 0px 0px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 0px 0px 0; + -webkit-border-radius: 0 0px 0px 0; + border-radius: 0 0px 0px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #ffffff url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #ffffff url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #E6E6E6; + color: #444; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #fff; + color: #777; +} +.tabs li a.tabs-inner { + color: #777; + background-color: #ffffff; +} +.tabs-header, +.tabs-tool { + background-color: #ffffff; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #ddd; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #E6E6E6; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #fff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #fff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #fff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #fff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #CCE6FF; + color: #000; + filter: none; + border-color: #ddd; +} +.datagrid .panel-body { + overflow: hidden; + position: relative; +} +.datagrid-view { + position: relative; + overflow: hidden; +} +.datagrid-view1, +.datagrid-view2 { + position: absolute; + overflow: hidden; + top: 0; +} +.datagrid-view1 { + left: 0; +} +.datagrid-view2 { + right: 0; +} +.datagrid-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + filter: alpha(opacity=30); + display: none; +} +.datagrid-mask-msg { + position: absolute; + top: 50%; + margin-top: -20px; + padding: 10px 5px 10px 30px; + width: auto; + height: 16px; + border-width: 2px; + border-style: solid; + display: none; +} +.datagrid-empty { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 25px; + line-height: 25px; + text-align: center; +} +.datagrid-sort-icon { + padding: 0; + display: none; +} +.datagrid-toolbar { + height: auto; + padding: 1px 2px; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 2px 1px; +} +.datagrid .datagrid-pager { + display: block; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.datagrid .datagrid-pager-top { + border-width: 0 0 1px 0; +} +.datagrid-header { + overflow: hidden; + cursor: default; + border-width: 0 0 1px 0; + border-style: solid; +} +.datagrid-header-inner { + float: left; + width: 10000px; +} +.datagrid-header-row, +.datagrid-row { + height: 32px; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-width: 0 1px 1px 0; + border-style: dotted; + margin: 0; + padding: 0; +} +.datagrid-cell, +.datagrid-cell-group, +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + margin: 0; + padding: 0 4px; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; + height: 18px; + line-height: 18px; + font-size: 14px; +} +.datagrid-header .datagrid-cell { + height: auto; +} +.datagrid-header .datagrid-cell span { + font-size: 14px; +} +.datagrid-cell-group { + text-align: center; + text-overflow: ellipsis; +} +.datagrid-header-rownumber, +.datagrid-cell-rownumber { + width: 30px; + text-align: center; + margin: 0; + padding: 0; +} +.datagrid-body { + margin: 0; + padding: 0; + overflow: auto; + zoom: 1; +} +.datagrid-view1 .datagrid-body-inner { + padding-bottom: 20px; +} +.datagrid-view1 .datagrid-body { + overflow: hidden; +} +.datagrid-footer { + overflow: hidden; +} +.datagrid-footer-inner { + border-width: 1px 0 0 0; + border-style: solid; + width: 10000px; + float: left; +} +.datagrid-row-editing .datagrid-cell { + height: auto; +} +.datagrid-header-check, +.datagrid-cell-check { + padding: 0; + width: 27px; + height: 18px; + font-size: 1px; + text-align: center; + overflow: hidden; +} +.datagrid-header-check input, +.datagrid-cell-check input { + margin: 0; + padding: 0; + width: 15px; + height: 18px; +} +.datagrid-resize-proxy { + position: absolute; + width: 1px; + height: 10000px; + top: 0; + cursor: e-resize; + display: none; +} +.datagrid-body .datagrid-editable { + margin: 0; + padding: 0; +} +.datagrid-body .datagrid-editable table { + width: 100%; + height: 100%; +} +.datagrid-body .datagrid-editable td { + border: 0; + margin: 0; + padding: 0; +} +.datagrid-view .datagrid-editable-input { + margin: 0; + padding: 2px 4px; + border: 1px solid #ddd; + font-size: 14px; + outline-style: none; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-view .validatebox-invalid { + border-color: #ffa8a8; +} +.datagrid-sort .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -64px center; +} +.datagrid-sort-desc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat -16px center; +} +.datagrid-sort-asc .datagrid-sort-icon { + display: inline; + padding: 0 13px 0 0; + background: url('images/datagrid_icons.png') no-repeat 0px center; +} +.datagrid-row-collapse { + background: url('images/datagrid_icons.png') no-repeat -48px center; +} +.datagrid-row-expand { + background: url('images/datagrid_icons.png') no-repeat -32px center; +} +.datagrid-mask-msg { + background: #fff url('images/loading.gif') no-repeat scroll 5px center; +} +.datagrid-header, +.datagrid-td-rownumber { + background-color: #ffffff; +} +.datagrid-cell-rownumber { + color: #444; +} +.datagrid-resize-proxy { + background: #b3b3b3; +} +.datagrid-mask { + background: #eee; +} +.datagrid-mask-msg { + border-color: #ddd; +} +.datagrid-toolbar, +.datagrid-pager { + background: #fff; +} +.datagrid-header, +.datagrid-toolbar, +.datagrid-pager, +.datagrid-footer-inner { + border-color: #ddd; +} +.datagrid-header td, +.datagrid-body td, +.datagrid-footer td { + border-color: #ddd; +} +.datagrid-htable, +.datagrid-btable, +.datagrid-ftable { + color: #444; + border-collapse: separate; +} +.datagrid-row-alt { + background: #f5f5f5; +} +.datagrid-row-over, +.datagrid-header td.datagrid-header-over { + background: #E6E6E6; + color: #444; + cursor: default; +} +.datagrid-row-selected { + background: #CCE6FF; + color: #000; +} +.datagrid-row-editing .textbox, +.datagrid-row-editing .textbox-text { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.datagrid-header .datagrid-filter-row td.datagrid-header-over { + background: inherit; +} +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #ddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #ffffff; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #ddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #ffffff; +} +.datalist .datagrid-header { + border-width: 0; +} +.datalist .datagrid-group, +.m-list .m-list-group { + height: 25px; + line-height: 25px; + font-weight: bold; + overflow: hidden; + background-color: #ffffff; + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ddd; +} +.datalist .datagrid-group-expander { + display: none; +} +.datalist .datagrid-group-title { + padding: 0 4px; +} +.datalist .datagrid-btable { + width: 100%; + table-layout: fixed; +} +.datalist .datagrid-row td { + border-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-width: 0; +} +.datalist-lines .datagrid-row td { + border-bottom-width: 1px; +} +.datalist .datagrid-cell, +.m-list li { + width: auto; + height: auto; + padding: 2px 4px; + line-height: 18px; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link, +.m-list li>a { + display: block; + position: relative; + cursor: pointer; + color: #444; + text-decoration: none; + overflow: hidden; + margin: -2px -4px; + padding: 2px 4px; + padding-right: 16px; + line-height: 18px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.datalist-link::after, +.m-list li>a::after { + position: absolute; + display: block; + width: 8px; + height: 8px; + content: ''; + right: 6px; + top: 50%; + margin-top: -4px; + border-style: solid; + border-width: 1px 1px 0 0; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.m-list { + margin: 0; + padding: 0; + list-style: none; +} +.m-list li { + border-style: solid; + border-width: 0 0 1px 0; + border-color: #ddd; +} +.m-list li>a:hover { + background: #E6E6E6; + color: #444; +} +.m-list .m-list-group { + padding: 0 4px; +} +.pagination { + zoom: 1; + padding: 2px; +} +.pagination table { + float: left; + height: 30px; +} +.pagination td { + border: 0; +} +.pagination-btn-separator { + float: left; + height: 24px; + border-left: 1px solid #ddd; + border-right: 1px solid #fff; + margin: 3px 1px; +} +.pagination .pagination-num { + border-width: 1px; + border-style: solid; + margin: 0 2px; + padding: 2px; + width: 3em; + height: auto; + text-align: center; + font-size: 14px; +} +.pagination-page-list { + margin: 0px 6px; + padding: 1px 2px; + width: auto; + height: auto; + border-width: 1px; + border-style: solid; +} +.pagination-info { + float: right; + margin: 0 6px; + padding: 0; + height: 30px; + line-height: 30px; + font-size: 14px; +} +.pagination span { + font-size: 14px; +} +.pagination-link .l-btn-text { + box-sizing: border-box; + text-align: center; + margin: 0; + padding: 0 .5em; + width: auto; + min-width: 28px; +} +.pagination-first { + background: url('images/pagination_icons.png') no-repeat 0 center; +} +.pagination-prev { + background: url('images/pagination_icons.png') no-repeat -16px center; +} +.pagination-next { + background: url('images/pagination_icons.png') no-repeat -32px center; +} +.pagination-last { + background: url('images/pagination_icons.png') no-repeat -48px center; +} +.pagination-load { + background: url('images/pagination_icons.png') no-repeat -64px center; +} +.pagination-loading { + background: url('images/loading.gif') no-repeat center center; +} +.pagination-page-list, +.pagination .pagination-num { + border-color: #ddd; +} +.calendar { + border-width: 1px; + border-style: solid; + padding: 1px; + overflow: hidden; +} +.calendar table { + table-layout: fixed; + border-collapse: separate; + font-size: 14px; + width: 100%; + height: 100%; +} +.calendar table td, +.calendar table th { + font-size: 14px; +} +.calendar-noborder { + border: 0; +} +.calendar-header { + position: relative; + height: 28px; +} +.calendar-title { + text-align: center; + height: 28px; +} +.calendar-title span { + position: relative; + display: inline-block; + top: 0px; + padding: 0 3px; + height: 28px; + line-height: 28px; + font-size: 14px; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-prevmonth, +.calendar-nextmonth, +.calendar-prevyear, +.calendar-nextyear { + position: absolute; + top: 50%; + margin-top: -8px; + width: 16px; + height: 16px; + cursor: pointer; + font-size: 1px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-prevmonth { + left: 20px; + background: url('images/calendar_arrows.png') no-repeat -16px 0; +} +.calendar-nextmonth { + right: 20px; + background: url('images/calendar_arrows.png') no-repeat -32px 0; +} +.calendar-prevyear { + left: 3px; + background: url('images/calendar_arrows.png') no-repeat 0px 0; +} +.calendar-nextyear { + right: 3px; + background: url('images/calendar_arrows.png') no-repeat -48px 0; +} +.calendar-body { + position: relative; +} +.calendar-body th, +.calendar-body td { + text-align: center; +} +.calendar-day { + border: 0; + padding: 1px; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-other-month { + opacity: 0.3; + filter: alpha(opacity=30); +} +.calendar-disabled { + opacity: 0.6; + filter: alpha(opacity=60); + cursor: default; +} +.calendar-menu { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 150px; + padding: 5px; + font-size: 14px; + display: none; + overflow: hidden; +} +.calendar-menu-year-inner { + text-align: center; + padding-bottom: 5px; +} +.calendar-menu-year { + width: 80px; + line-height: 26px; + text-align: center; + border-width: 1px; + border-style: solid; + outline-style: none; + resize: none; + margin: 0; + padding: 0; + font-weight: bold; + font-size: 14px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-menu-prev, +.calendar-menu-next { + display: inline-block; + width: 25px; + height: 28px; + vertical-align: top; + cursor: pointer; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-menu-prev { + margin-right: 10px; + background: url('images/calendar_arrows.png') no-repeat 5px center; +} +.calendar-menu-next { + margin-left: 10px; + background: url('images/calendar_arrows.png') no-repeat -44px center; +} +.calendar-menu-month { + text-align: center; + cursor: pointer; + font-weight: bold; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.calendar-body th, +.calendar-menu-month { + color: #919191; +} +.calendar-day { + color: #444; +} +.calendar-sunday { + color: #CC2222; +} +.calendar-saturday { + color: #00ee00; +} +.calendar-today { + color: #0000ff; +} +.calendar-menu-year { + border-color: #ddd; +} +.calendar { + border-color: #ddd; +} +.calendar-header { + background: #ffffff; +} +.calendar-body, +.calendar-menu { + background: #fff; +} +.calendar-body th { + background: #fff; + padding: 4px 0; +} +.calendar-hover, +.calendar-nav-hover, +.calendar-menu-hover { + background-color: #E6E6E6; + color: #444; +} +.calendar-hover { + border: 1px solid #ddd; + padding: 0; +} +.calendar-selected { + background-color: #CCE6FF; + color: #000; + border: 1px solid #99cdff; + padding: 0; +} +.datebox-calendar-inner { + height: 250px; +} +.datebox-button { + padding: 4px 0; + text-align: center; +} +.datebox-button a { + line-height: 22px; + font-size: 14px; + font-weight: bold; + text-decoration: none; + opacity: 0.6; + filter: alpha(opacity=60); +} +.datebox-button a:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.datebox-current, +.datebox-close { + float: left; +} +.datebox-close { + float: right; +} +.datebox .combo-arrow { + background-image: url('images/datebox_arrow.png'); + background-position: center center; +} +.datebox-button { + background-color: #fff; +} +.datebox-button a { + color: #777; +} +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #ffffff; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #777; + outline-style: none; + background-color: #ffffff; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #E6E6E6; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #E6E6E6; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #ffffff; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #ffffff; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #ffffff; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.progressbar { + border-color: #ddd; +} +.progressbar-text { + color: #444; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #CCE6FF; + color: #000; +} +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #ffffff; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 0px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #ddd; + background: #ffffff; +} +.slider-rule span { + border-color: #ddd; +} +.slider-rulelabel span { + color: #444; +} +.menu { + position: absolute; + margin: 0; + padding: 2px; + border-width: 1px; + border-style: solid; + overflow: hidden; +} +.menu-inline { + position: relative; +} +.menu-item { + position: relative; + margin: 0; + padding: 0; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.menu-text { + height: 20px; + line-height: 20px; + float: left; + padding-left: 28px; +} +.menu-icon { + position: absolute; + width: 16px; + height: 16px; + left: 2px; + top: 50%; + margin-top: -8px; +} +.menu-rightarrow { + position: absolute; + width: 16px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; +} +.menu-line { + position: absolute; + left: 26px; + top: 0; + height: 2000px; + font-size: 1px; +} +.menu-sep { + margin: 3px 0px 3px 25px; + font-size: 1px; +} +.menu-noline .menu-line { + display: none; +} +.menu-noline .menu-sep { + margin-left: 0; + margin-right: 0; +} +.menu-active { + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.menu-item-disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default; +} +.menu-text, +.menu-text span { + font-size: 14px; +} +.menu-shadow { + position: absolute; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + background: #eee; + -moz-box-shadow: 2px 2px 3px #ededed; + -webkit-box-shadow: 2px 2px 3px #ededed; + box-shadow: 2px 2px 3px #ededed; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.menu-rightarrow { + background: url('images/menu_arrows.png') no-repeat -32px center; +} +.menu-line { + border-left: 1px solid #ddd; + border-right: 1px solid #fff; +} +.menu-sep { + border-top: 1px solid #ddd; + border-bottom: 1px solid #fff; +} +.menu { + background-color: #ffffff; + border-color: #ddd; + color: #444; +} +.menu-content { + background: #fff; +} +.menu-item { + border-color: transparent; + _border-color: #ffffff; +} +.menu-active { + border-color: #ddd; + color: #444; + background: #E6E6E6; +} +.menu-active-disabled { + border-color: transparent; + background: transparent; + color: #444; +} +.m-btn-downarrow, +.s-btn-downarrow { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + font-size: 1px; + right: 0; + top: 50%; + margin-top: -8px; +} +.m-btn-active, +.s-btn-active { + background: #E6E6E6; + color: #444; + border: 1px solid #ddd; + filter: none; +} +.m-btn-plain-active, +.s-btn-plain-active { + background: transparent; + padding: 0; + border-width: 1px; + border-style: solid; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.m-btn .l-btn-left .l-btn-text { + margin-right: 20px; +} +.m-btn .l-btn-icon-right .l-btn-text { + margin-right: 40px; +} +.m-btn .l-btn-icon-right .l-btn-icon { + right: 20px; +} +.m-btn .l-btn-icon-top .l-btn-text { + margin-right: 4px; + margin-bottom: 14px; +} +.m-btn .l-btn-icon-bottom .l-btn-text { + margin-right: 4px; + margin-bottom: 34px; +} +.m-btn .l-btn-icon-bottom .l-btn-icon { + top: auto; + bottom: 20px; +} +.m-btn .l-btn-icon-top .m-btn-downarrow, +.m-btn .l-btn-icon-bottom .m-btn-downarrow { + top: auto; + bottom: 0px; + left: 50%; + margin-left: -8px; +} +.m-btn-line { + display: inline-block; + position: absolute; + font-size: 1px; + display: none; +} +.m-btn .l-btn-left .m-btn-line { + right: 0; + width: 16px; + height: 500px; + border-style: solid; + border-color: #b3b3b3; + border-width: 0 0 0 1px; +} +.m-btn .l-btn-icon-top .m-btn-line, +.m-btn .l-btn-icon-bottom .m-btn-line { + left: 0; + bottom: 0; + width: 500px; + height: 16px; + border-width: 1px 0 0 0; +} +.m-btn-large .l-btn-icon-right .l-btn-text { + margin-right: 56px; +} +.m-btn-large .l-btn-icon-bottom .l-btn-text { + margin-bottom: 50px; +} +.m-btn-downarrow, +.s-btn-downarrow { + background: url('images/menu_arrows.png') no-repeat 0 center; +} +.m-btn-plain-active, +.s-btn-plain-active { + border-color: #ddd; + background-color: #E6E6E6; + color: #444; +} +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #b3b3b3; + border-width: 0 0 0 1px; +} +.messager-body { + padding: 10px 10px 30px 10px; + overflow: auto; +} +.messager-button { + text-align: center; + padding: 5px; +} +.messager-button .l-btn { + width: 70px; +} +.messager-icon { + float: left; + width: 32px; + height: 32px; + margin: 0 10px 10px 0; +} +.messager-error { + background: url('images/messager_icons.png') no-repeat scroll -64px 0; +} +.messager-info { + background: url('images/messager_icons.png') no-repeat scroll 0 0; +} +.messager-question { + background: url('images/messager_icons.png') no-repeat scroll -32px 0; +} +.messager-warning { + background: url('images/messager_icons.png') no-repeat scroll -96px 0; +} +.messager-progress { + padding: 10px; +} +.messager-p-msg { + margin-bottom: 5px; +} +.messager-body .messager-input { + width: 100%; + padding: 4px 0; + outline-style: none; + border: 1px solid #ddd; +} +.window-thinborder .messager-button { + padding-bottom: 8px; +} +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #ddd; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #fff; + color: #444; + border-color: #ddd; +} +.tree-node-hover { + background: #E6E6E6; + color: #444; +} +.tree-node-selected { + background: #CCE6FF; + color: #000; +} +.tree-node-hidden { + display: none; +} +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #fff; + border-color: #ddd; + color: #444; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #ddd; +} +.tooltip-right .tooltip-arrow { + border-right-color: #fff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #ddd; +} +.tooltip-left .tooltip-arrow { + border-left-color: #fff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #ddd; +} +.tooltip-top .tooltip-arrow { + border-top-color: #fff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #ddd; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #fff; +} +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #dddddd; + border: 1px solid #dddddd; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.switchbutton-on { + background: #CCE6FF; + color: #000; +} +.switchbutton-off { + background-color: #fff; + color: #444; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 0px 0px 0; + -webkit-border-radius: 0 0px 0px 0; + border-radius: 0 0px 0px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #fff; + color: #444; + border: 1px solid #dddddd; + -moz-box-shadow: 0 0 3px 0 #dddddd; + -webkit-box-shadow: 0 0 3px 0 #dddddd; + box-shadow: 0 0 3px 0 #dddddd; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} +.radiobutton { + position: relative; + border: 2px solid #99cdff; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #99cdff; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.checkbox { + position: relative; + border: 2px solid #99cdff; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.checkbox-checked { + border: 0; + background: #99cdff; +} +.checkbox-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.checkbox path { + stroke-width: 2px; +} +.checkbox-disabled { + opacity: 0.6; +} +.checkbox-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #777; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #777; +} +.sidemenu .accordion-header:hover { + background: #E6E6E6; + color: #777; +} +.sidemenu .tree-node-hover { + background: #E6E6E6; + color: #777; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #99cdff; + color: #000; + background: #CCE6FF; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/filebox.css new file mode 100644 index 000000000..c6bac6631 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/filebox.css @@ -0,0 +1,20 @@ +.filebox .textbox-value { + vertical-align: top; + position: absolute; + top: 0; + left: -5000px; +} +.filebox-label { + display: inline-block; + position: absolute; + width: 100%; + height: 100%; + cursor: pointer; + left: 0; + top: 0; + z-index: 10; + background: url('images/blank.gif') no-repeat; +} +.l-btn-disabled .filebox-label { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/accordion_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..720835f69c96c17ec32a20b03ac9753aa59b7f4f GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYeRK2H*V@SoVUT_Y-nKxaI`{RC0WjSLJ&w^R(C-|JQTojLXc1&{d*_z{$ jW+oTMdQ(F|jDg|L>K${_)^zO#I)%a0)z4*}Q$iB}_fAN- literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/blank.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/blank.gif new file mode 100755 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/calendar_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/calendar_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..430c4ad685b8c0068ecb7e3cbef74f493a84ad0d GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQYD@)jv*Dd-cCEn)nLHm{QbZE z+q@uWwandfr?Jb4eDYYmB3UAt=OO2Vt+MMT&+KD%&6hZDt!FBpej;sEpMN69^tKl% zp6y<4_lG^P z=;=eQ4Vs74-2)Ua&f1tcVdk$#{GPKe@&?ZMHmT&SMw?IV&w7)}ixLbB3d$Zg{&KGb P8OPx1>gTe~DWM4fp>5!O@Gl{c zHXr?)EMpjkiI0?0nVI4ps;W|uWCd!b5UAxPD-onMP4mgv0vV&Ul|KA@T-G#0QTd(IpSp7SIAsd;)#A=FjzgW9D>i*LbaNyX|0kF(mrr z;o92b6Zp@36nqs7kw}pT2qBaieQ3N+owvm{e=N(DufonR5DseQ_ISSW8dV0M=To{w zToOt35OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fRl}UZ@-Co%Cq`k{wEj}Dr>ShP9AQ|IKKA30{ejJboVoF`C-z@6mZMY&%Wiz%6S}#zb4u?o?9Mi=ECopVxzz+sNviAA!DK)mm8xe zgY9ZT9jlddc^&y2^u9XqDeU4{8s^AS#8C7TXsxEJW@uLu(3Whc35-X6v}jEgEb{G` z!{)$uKzw<~%0A6PhNHYfSuTvOzD8LpPF>PVr=&QqGC936QlPgc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/menu_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..b986842e7e4044caed18edbcb4b376a4bb915623 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/messager_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..62c18c135860351063ebaabe8c0f4df7664b8f65 GIT binary patch literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000zI<5nO~0)=fnxErNrCA`WgM*1^R=&_zX)CMr1T;-rJKi{RhT zwTRWWFSbznW6?ZwYBk2xccxEVa`0%4(Yva@;pbF0^9S2uAKfle(?qtbyxJ(2%kiF>CHXa` zwdcneqDH8s8`O=^Z;G*FoH3bGkRlewXgRMPCtCR>olp$6SSk2LaLtdk735GTeS6JrtWdjq}ZZs34}bF$p9qsdLBnIC+J1{xF!;M>5@n5YI? z&4z;cHjvE$_V&)MtT*$6579tEVTAaOu<<1(%cR!^622ph;K0g-9AQF(O3vhYiNJ*b z7Xuat7f#qV!aOb!Q6;pKF~UjxbnQ*DOwWIpHq-OqgFQe0fa`fz9oUMD0Z9VV1d9Q= z5#TIiB5HxD12dV7Jd)hJ_=qt$xd^NA4nEk!Bp@qUu0k4c(cRlRc0Y)25Z^q7^m|=T zEPSa{>fbuK*p?QKGWOF9-+|Bne}*tPWtM~)t<`EXu;7__@_h5{U+e{vTT29oHFe~Ze6XJ(Q>Kb zHH)*`i>&-o-mMNlRLeM*)b=tl9I*eiXO{b+PdrTgTX%D4@ZRav{vE&cqCShv#9g;J tE!>t@mbeRM^gTGoKdYo(nL%h1<2#QP_cRaf4g@-i!PC{xWt~$(697v`TRe8 z#G%R{$NfX%tci2`Gda4n1O70V3HltacN37lc`VT21_Oig(wY*}T!mDijSQZyelF{r G5}E*M5;#5p literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/passwordbox_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d328891f6a18ea703fd25a47b228df9cb13b4744 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fh6C~y}*jFF6I{2&m zf8fW~lSf{d9=Ouc<(SoRr6$ox=6dW5rxOB`TRe8 z#G%R{$Nj@Z)5m5kM@2RMITi_;Npmte=_#;rBych_7F`xqKKy}=f%DM}Q4`(M(}DIf Nc)I$ztaD0e0su|qH(3Ax literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/searchbox_button.png new file mode 100755 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/spinner_arrows.png new file mode 100755 index 0000000000000000000000000000000000000000..7c2df483dbb30dfb3a51332c03fe6f0c229c0547 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4Dgeh3R zJz6gy$J;RRRRiNz`7}$-z5~nWg=}UsVYp!HpQ#{_&8An~S<1fjm*zKyrHmF27#+^4 x`1rk&EZfSkR8C?on>%wt3;O{L3Dzy_3@=Og7TEqO`UJFx!PC{xWt~$(69D$UE$jdQ literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tabs_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..4d29966d7154338a9e2e358821a5f72655eba43e GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq+&f?978H@B_~L*E^a7uNPG49 z|BoM6E;$_tDnm{r-UW|t3f!- literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tagbox_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..bd02e2d817c6b7c4e2a105919e9a89cc0a1d577f GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel&`0YV@SoV>_0CQASS literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tree_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..e9be4f3a9965e49a4e4078f8c53f486d761a7468 GIT binary patch literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy literal 0 HcmV?d00001 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/validatebox_warning.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3d4f05babf3f82b146350e96570fac02075de0 GIT binary patch literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, +.panel-hright>.panel-body { + position: absolute; +} +.panel-hleft>.panel-header { + float: left; +} +.panel-hright>.panel-header { + float: right; +} +.panel-hleft>.panel-body { + border-top-width: 1px; + border-left-width: 0; +} +.panel-hright>.panel-body { + border-top-width: 1px; + border-right-width: 0; +} +.panel-hleft>.panel-body-nobottom { + border-bottom-width: 1px; + border-right-width: 0; +} +.panel-hright>.panel-body-nobottom { + border-bottom-width: 1px; + border-left-width: 0; +} +.panel-hleft>.panel-footer { + position: absolute; + right: 0; +} +.panel-hright>.panel-footer { + position: absolute; + left: 0; +} +.panel-hleft>.panel-header-noborder { + border-width: 0 1px 0 0; +} +.panel-hright>.panel-header-noborder { + border-width: 0 0 0 1px; +} +.panel-hleft>.panel-body-noborder { + border-width: 0; +} +.panel-hright>.panel-body-noborder { + border-width: 0; +} +.panel-hleft>.panel-body-noheader { + border-left-width: 1px; +} +.panel-hright>.panel-body-noheader { + border-right-width: 1px; +} +.panel-hleft>.panel-footer-noborder { + border-width: 0 0 0 1px; +} +.panel-hright>.panel-footer-noborder { + border-width: 0 1px 0 0; +} +.panel-hleft>.panel-header .panel-icon, +.panel-hright>.panel-header .panel-icon { + margin-top: 0; + top: 5px; + left: 50%; + margin-left: -8px; +} +.panel-hleft>.panel-header .panel-title, +.panel-hright>.panel-header .panel-title { + position: absolute; + min-width: 16px; + left: 25px; + top: 5px; + bottom: auto; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(90deg); + -o-transform-origin: 0 0; + transform: rotate(90deg); + transform-origin: 0 0; +} +.panel-hleft>.panel-header .panel-title-up, +.panel-hright>.panel-header .panel-title-up { + position: absolute; + min-width: 16px; + left: 21px; + top: auto; + bottom: 0px; + text-align: right; + white-space: nowrap; + word-wrap: normal; + -webkit-transform: rotate(-90deg); + -webkit-transform-origin: 0 0; + -moz-transform: rotate(-90deg); + -moz-transform-origin: 0 0; + -o-transform: rotate(-90deg); + -o-transform-origin: 0 0; + transform: rotate(-90deg); + transform-origin: 0 16px; +} +.panel-hleft>.panel-header .panel-with-icon.panel-title-up, +.panel-hright>.panel-header .panel-with-icon.panel-title-up { + padding-left: 0; + padding-right: 18px; +} +.panel-hleft>.panel-header .panel-tool, +.panel-hright>.panel-header .panel-tool { + top: auto; + bottom: 5px; + width: 16px; + height: auto; + left: 50%; + margin-left: -8px; + margin-top: 0; +} +.panel-hleft>.panel-header .panel-tool a, +.panel-hright>.panel-header .panel-tool a { + margin: 2px 0 0 0; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/passwordbox.css new file mode 100644 index 000000000..92c9ce586 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/passwordbox.css @@ -0,0 +1,6 @@ +.passwordbox-open { + background: url('images/passwordbox_open.png') no-repeat center center; +} +.passwordbox-close { + background: url('images/passwordbox_close.png') no-repeat center center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/progressbar.css new file mode 100644 index 000000000..77512af86 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/progressbar.css @@ -0,0 +1,33 @@ +.progressbar { + border-width: 1px; + border-style: solid; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + overflow: hidden; + position: relative; +} +.progressbar-text { + text-align: center; + position: absolute; +} +.progressbar-value { + position: relative; + overflow: hidden; + width: 0; + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.progressbar { + border-color: #ddd; +} +.progressbar-text { + color: #444; + font-size: 14px; +} +.progressbar-value, +.progressbar-value .progressbar-text { + background-color: #CCE6FF; + color: #000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/propertygrid.css new file mode 100644 index 000000000..9c859b192 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/propertygrid.css @@ -0,0 +1,27 @@ +.propertygrid .datagrid-view1 .datagrid-body td { + padding-bottom: 1px; + border-width: 0 1px 0 0; +} +.propertygrid .datagrid-group { + overflow: hidden; + border-width: 0 0 1px 0; + border-style: solid; +} +.propertygrid .datagrid-group span { + font-weight: bold; +} +.propertygrid .datagrid-view1 .datagrid-body td { + border-color: #ddd; +} +.propertygrid .datagrid-view1 .datagrid-group { + border-color: #ffffff; +} +.propertygrid .datagrid-view2 .datagrid-group { + border-color: #ddd; +} +.propertygrid .datagrid-group, +.propertygrid .datagrid-view1 .datagrid-body, +.propertygrid .datagrid-view1 .datagrid-row-over, +.propertygrid .datagrid-view1 .datagrid-row-selected { + background: #ffffff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/radiobutton.css new file mode 100644 index 000000000..d1b61ce44 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/radiobutton.css @@ -0,0 +1,25 @@ +.radiobutton { + position: relative; + border: 2px solid #99cdff; + border-radius: 50%; +} +.radiobutton-inner { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #99cdff; + border-radius: 50%; + transform: scale(.6); +} +.radiobutton-disabled { + opacity: 0.6; +} +.radiobutton-value { + position: absolute; + overflow: hidden; + width: 1px; + height: 1px; + left: -999px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/searchbox.css new file mode 100644 index 000000000..2d3af1c15 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/searchbox.css @@ -0,0 +1,61 @@ +.searchbox-button { + width: 18px; + height: 20px; + overflow: hidden; + display: inline-block; + vertical-align: top; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.searchbox-button-hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.searchbox .l-btn-plain { + border: 0; + padding: 0; + vertical-align: top; + opacity: 0.6; + filter: alpha(opacity=60); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .l-btn-plain:hover { + border: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox a.m-btn-plain-active { + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .m-btn-active { + border-width: 0 1px 0 0; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.searchbox .textbox-button-right { + border-width: 0 0 0 1px; +} +.searchbox .textbox-button-left { + border-width: 0 1px 0 0; +} +.searchbox-button { + background: url('images/searchbox_button.png') no-repeat center center; +} +.searchbox .l-btn-plain { + background: #ffffff; +} +.searchbox .l-btn-plain-disabled, +.searchbox .l-btn-plain-disabled:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/sidemenu.css new file mode 100644 index 000000000..4165e46d0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/sidemenu.css @@ -0,0 +1,69 @@ +.sidemenu .tree-hit { + background-image: none; +} +.sidemenu-default-icon { + background-image: none; + width: 0; +} +.sidemenu .accordion .accordion-header, +.sidemenu .accordion .accordion-body { + border-bottom-color: transparent; + background: transparent; +} +.sidemenu .accordion .accordion-header { + color: #777; +} +.sidemenu .accordion-header .panel-title { + height: 30px; + line-height: 30px; + color: #777; +} +.sidemenu .accordion-header:hover { + background: #E6E6E6; + color: #777; +} +.sidemenu .tree-node-hover { + background: #E6E6E6; + color: #777; +} +.sidemenu .tree-node-selected { + border-right: 2px solid #99cdff; + color: #000; + background: #CCE6FF; +} +.sidemenu .tree-node { + height: 40px; +} +.sidemenu .tree-title { + margin: 11px 0; +} +.sidemenu .tree-node-nonleaf { + position: relative; +} +.sidemenu .tree-node-nonleaf::after { + display: inline-block; + content: ''; + position: absolute; + top: 50%; + margin-top: -8px; + background: url('images/accordion_arrows.png') no-repeat 0 0; + width: 16px; + height: 16px; + right: 5px; +} +.sidemenu .tree-node-nonleaf-collapsed::after { + background: url('images/accordion_arrows.png') no-repeat -16px 0; +} +.sidemenu-collapsed .panel-icon { + left: 50%; + margin-left: -8px; +} +.sidemenu-tooltip { + padding: 0; + margin: 0 -12px; + border: 0; +} +.sidemenu-tooltip .tooltip-arrow-outer, +.sidemenu-tooltip .tooltip-arrow { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/slider.css new file mode 100644 index 000000000..7f841034e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/slider.css @@ -0,0 +1,101 @@ +.slider-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.slider-h { + height: 22px; +} +.slider-v { + width: 22px; +} +.slider-inner { + position: relative; + height: 6px; + top: 7px; + border-width: 1px; + border-style: solid; + border-radius: 0px; +} +.slider-handle { + position: absolute; + display: block; + outline: none; + width: 20px; + height: 20px; + top: 50%; + margin-top: -10px; + margin-left: -10px; +} +.slider-tip { + position: absolute; + display: inline-block; + line-height: 12px; + font-size: 14px; + white-space: nowrap; + top: -22px; +} +.slider-rule { + position: relative; + top: 15px; +} +.slider-rule span { + position: absolute; + display: inline-block; + font-size: 0; + height: 5px; + border-width: 0 0 0 1px; + border-style: solid; +} +.slider-rulelabel { + position: relative; + top: 20px; +} +.slider-rulelabel span { + position: absolute; + display: inline-block; + font-size: 14px; +} +.slider-v .slider-inner { + width: 6px; + left: 7px; + top: 0; + float: left; +} +.slider-v .slider-handle { + left: 50%; + margin-top: -10px; +} +.slider-v .slider-tip { + left: -10px; + margin-top: -6px; +} +.slider-v .slider-rule { + float: left; + top: 0; + left: 16px; +} +.slider-v .slider-rule span { + width: 5px; + height: 'auto'; + border-left: 0; + border-width: 1px 0 0 0; + border-style: solid; +} +.slider-v .slider-rulelabel { + float: left; + top: 0; + left: 23px; +} +.slider-handle { + background: url('images/slider_handle.png') no-repeat; +} +.slider-inner { + border-color: #ddd; + background: #ffffff; +} +.slider-rule span { + border-color: #ddd; +} +.slider-rulelabel span { + color: #444; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/spinner.css new file mode 100644 index 000000000..cbc7e591a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/spinner.css @@ -0,0 +1,114 @@ +.spinner-arrow { + display: inline-block; + overflow: hidden; + vertical-align: top; + margin: 0; + padding: 0; + opacity: 1.0; + filter: alpha(opacity=100); + width: 18px; +} +.spinner-arrow.spinner-button-top, +.spinner-arrow.spinner-button-bottom, +.spinner-arrow.spinner-button-left, +.spinner-arrow.spinner-button-right { + background-color: #ffffff; +} +.spinner-arrow-up, +.spinner-arrow-down { + opacity: 0.6; + filter: alpha(opacity=60); + display: block; + font-size: 1px; + width: 18px; + height: 10px; + width: 100%; + height: 50%; + color: #777; + outline-style: none; + background-color: #ffffff; +} +.spinner-button-updown { + opacity: 1.0; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + position: relative; + display: block; + width: 100%; + height: 50%; +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down { + opacity: 1.0; + filter: alpha(opacity=100); + cursor: pointer; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; + position: absolute; +} +.spinner-button-updown .spinner-button-top, +.spinner-button-updown .spinner-button-bottom { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-button-updown .spinner-button-top:hover, +.spinner-button-updown .spinner-button-bottom:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-updown .spinner-arrow-up, +.spinner-button-updown .spinner-arrow-down, +.spinner-button-updown .spinner-arrow-up:hover, +.spinner-button-updown .spinner-arrow-down:hover { + background-color: transparent; +} +.spinner-arrow-hover { + background-color: #E6E6E6; + opacity: 1.0; + filter: alpha(opacity=100); +} +.spinner-button-top:hover, +.spinner-button-bottom:hover, +.spinner-button-left:hover, +.spinner-button-right:hover, +.spinner-arrow-up:hover, +.spinner-arrow-down:hover { + opacity: 1.0; + filter: alpha(opacity=100); + background-color: #E6E6E6; +} +.textbox-disabled .spinner-button-top:hover, +.textbox-disabled .spinner-button-bottom:hover, +.textbox-disabled .spinner-button-left:hover, +.textbox-disabled .spinner-button-right:hover, +.textbox-icon-disabled .spinner-arrow-up:hover, +.textbox-icon-disabled .spinner-arrow-down:hover { + opacity: 0.6; + filter: alpha(opacity=60); + background-color: #ffffff; + cursor: default; +} +.spinner .textbox-icon-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.spinner-arrow-up { + background: url('images/spinner_arrows.png') no-repeat 1px center; + background-color: #ffffff; +} +.spinner-arrow-down { + background: url('images/spinner_arrows.png') no-repeat -15px center; + background-color: #ffffff; +} +.spinner-button-up { + background: url('images/spinner_arrows.png') no-repeat -32px center; +} +.spinner-button-down { + background: url('images/spinner_arrows.png') no-repeat -48px center; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/splitbutton.css new file mode 100644 index 000000000..3451138c7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/splitbutton.css @@ -0,0 +1,12 @@ +.s-btn:hover .m-btn-line, +.s-btn-active .m-btn-line, +.s-btn-plain-active .m-btn-line { + display: inline-block; +} +.l-btn:hover .s-btn-downarrow, +.s-btn-active .s-btn-downarrow, +.s-btn-plain-active .s-btn-downarrow { + border-style: solid; + border-color: #b3b3b3; + border-width: 0 0 0 1px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/switchbutton.css new file mode 100644 index 000000000..057bf5587 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/switchbutton.css @@ -0,0 +1,77 @@ +.switchbutton { + text-decoration: none; + display: inline-block; + overflow: hidden; + vertical-align: middle; + margin: 0; + padding: 0; + cursor: pointer; + background: #dddddd; + border: 1px solid #dddddd; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.switchbutton-inner { + display: inline-block; + overflow: hidden; + position: relative; + top: -1px; + left: -1px; +} +.switchbutton-on, +.switchbutton-off, +.switchbutton-handle { + display: inline-block; + text-align: center; + height: 100%; + float: left; + font-size: 14px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.switchbutton-on { + background: #CCE6FF; + color: #000; +} +.switchbutton-off { + background-color: #fff; + color: #444; +} +.switchbutton-on, +.switchbutton-reversed .switchbutton-off { + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.switchbutton-off, +.switchbutton-reversed .switchbutton-on { + -moz-border-radius: 0 0px 0px 0; + -webkit-border-radius: 0 0px 0px 0; + border-radius: 0 0px 0px 0; +} +.switchbutton-handle { + position: absolute; + top: 0; + left: 50%; + background-color: #fff; + color: #444; + border: 1px solid #dddddd; + -moz-box-shadow: 0 0 3px 0 #dddddd; + -webkit-box-shadow: 0 0 3px 0 #dddddd; + box-shadow: 0 0 3px 0 #dddddd; +} +.switchbutton-value { + position: absolute; + top: 0; + left: -5000px; +} +.switchbutton-disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} +.switchbutton-disabled, +.switchbutton-readonly { + cursor: default; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tabs.css new file mode 100644 index 000000000..cc1500ea9 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tabs.css @@ -0,0 +1,377 @@ +.tabs-container { + overflow: hidden; +} +.tabs-header { + border-width: 1px; + border-style: solid; + border-bottom-width: 0; + position: relative; + padding: 0; + padding-top: 2px; + overflow: hidden; +} +.tabs-scroller-left, +.tabs-scroller-right { + position: absolute; + top: auto; + bottom: 0; + width: 18px; + font-size: 1px; + display: none; + cursor: pointer; + border-width: 1px; + border-style: solid; +} +.tabs-scroller-left { + left: 0; +} +.tabs-scroller-right { + right: 0; +} +.tabs-tool { + position: absolute; + bottom: 0; + padding: 1px; + overflow: hidden; + border-width: 1px; + border-style: solid; +} +.tabs-header-plain .tabs-tool { + padding: 0 1px; +} +.tabs-wrap { + position: relative; + left: 0; + overflow: hidden; + width: 100%; + margin: 0; + padding: 0; +} +.tabs-scrolling { + margin-left: 18px; + margin-right: 18px; +} +.tabs-disabled { + opacity: 0.3; + filter: alpha(opacity=30); +} +.tabs { + list-style-type: none; + height: 26px; + margin: 0px; + padding: 0px; + padding-left: 4px; + width: 50000px; + border-style: solid; + border-width: 0 0 1px 0; +} +.tabs li { + float: left; + display: inline-block; + margin: 0 4px -1px 0; + padding: 0; + position: relative; + border: 0; +} +.tabs li a.tabs-inner { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0 10px; + height: 25px; + line-height: 25px; + text-align: center; + white-space: nowrap; + border-width: 1px; + border-style: solid; + -moz-border-radius: 0px 0px 0 0; + -webkit-border-radius: 0px 0px 0 0; + border-radius: 0px 0px 0 0; +} +.tabs li.tabs-selected a.tabs-inner { + font-weight: bold; + outline: none; +} +.tabs li.tabs-selected a:hover.tabs-inner { + cursor: default; + pointer: default; +} +.tabs li a.tabs-close, +.tabs-p-tool { + position: absolute; + font-size: 1px; + display: block; + height: 12px; + padding: 0; + top: 50%; + margin-top: -6px; + overflow: hidden; +} +.tabs li a.tabs-close { + width: 12px; + right: 5px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs-p-tool { + right: 16px; +} +.tabs-p-tool a { + display: inline-block; + font-size: 1px; + width: 12px; + height: 12px; + margin: 0; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tabs li a:hover.tabs-close, +.tabs-p-tool a:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: hand; + cursor: pointer; +} +.tabs-with-icon { + padding-left: 18px; +} +.tabs-icon { + position: absolute; + width: 16px; + height: 16px; + left: 10px; + top: 50%; + margin-top: -8px; +} +.tabs-title { + font-size: 14px; +} +.tabs-closable { + padding-right: 8px; +} +.tabs-panels { + margin: 0px; + padding: 0px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + overflow: hidden; +} +.tabs-header-bottom { + border-width: 0 1px 1px 1px; + padding: 0 0 2px 0; +} +.tabs-header-bottom .tabs { + border-width: 1px 0 0 0; +} +.tabs-header-bottom .tabs li { + margin: -1px 4px 0 0; +} +.tabs-header-bottom .tabs li a.tabs-inner { + -moz-border-radius: 0 0 0px 0px; + -webkit-border-radius: 0 0 0px 0px; + border-radius: 0 0 0px 0px; +} +.tabs-header-bottom .tabs-tool { + top: 0; +} +.tabs-header-bottom .tabs-scroller-left, +.tabs-header-bottom .tabs-scroller-right { + top: 0; + bottom: auto; +} +.tabs-panels-top { + border-width: 1px 1px 0 1px; +} +.tabs-header-left { + float: left; + border-width: 1px 0 1px 1px; + padding: 0; +} +.tabs-header-right { + float: right; + border-width: 1px 1px 1px 0; + padding: 0; +} +.tabs-header-left .tabs-wrap, +.tabs-header-right .tabs-wrap { + height: 100%; +} +.tabs-header-left .tabs { + height: 100%; + padding: 4px 0 0 2px; + border-width: 0 1px 0 0; +} +.tabs-header-right .tabs { + height: 100%; + padding: 4px 2px 0 0; + border-width: 0 0 0 1px; +} +.tabs-header-left .tabs li, +.tabs-header-right .tabs li { + display: block; + width: 100%; + position: relative; +} +.tabs-header-left .tabs li { + left: auto; + right: 0; + margin: 0 -1px 4px 0; + float: right; +} +.tabs-header-right .tabs li { + left: 0; + right: auto; + margin: 0 0 4px -1px; + float: left; +} +.tabs-justified li a.tabs-inner { + padding-left: 0; + padding-right: 0; +} +.tabs-header-left .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0px 0 0 0px; + -webkit-border-radius: 0px 0 0 0px; + border-radius: 0px 0 0 0px; +} +.tabs-header-right .tabs li a.tabs-inner { + display: block; + text-align: left; + padding-left: 10px; + padding-right: 10px; + -moz-border-radius: 0 0px 0px 0; + -webkit-border-radius: 0 0px 0px 0; + border-radius: 0 0px 0px 0; +} +.tabs-panels-right { + float: right; + border-width: 1px 1px 1px 0; +} +.tabs-panels-left { + float: left; + border-width: 1px 0 1px 1px; +} +.tabs-header-noborder, +.tabs-panels-noborder { + border: 0px; +} +.tabs-header-plain { + border: 0px; + background: transparent; +} +.tabs-pill { + padding-bottom: 3px; +} +.tabs-header-bottom .tabs-pill { + padding-top: 3px; + padding-bottom: 0; +} +.tabs-header-left .tabs-pill { + padding-right: 3px; +} +.tabs-header-right .tabs-pill { + padding-left: 3px; +} +.tabs-header .tabs-pill li a.tabs-inner { + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.tabs-header-narrow, +.tabs-header-narrow .tabs-narrow { + padding: 0; +} +.tabs-narrow li, +.tabs-header-bottom .tabs-narrow li { + margin-left: 0; + margin-right: -1px; +} +.tabs-narrow li.tabs-last, +.tabs-header-bottom .tabs-narrow li.tabs-last { + margin-right: 0; +} +.tabs-header-left .tabs-narrow, +.tabs-header-right .tabs-narrow { + padding-top: 0; +} +.tabs-header-left .tabs-narrow li { + margin-bottom: -1px; + margin-right: -1px; +} +.tabs-header-left .tabs-narrow li.tabs-last, +.tabs-header-right .tabs-narrow li.tabs-last { + margin-bottom: 0; +} +.tabs-header-right .tabs-narrow li { + margin-bottom: -1px; + margin-left: -1px; +} +.tabs-scroller-left { + background: #ffffff url('images/tabs_icons.png') no-repeat 1px center; +} +.tabs-scroller-right { + background: #ffffff url('images/tabs_icons.png') no-repeat -15px center; +} +.tabs li a.tabs-close { + background: url('images/tabs_icons.png') no-repeat -34px center; +} +.tabs li a.tabs-inner:hover { + background: #E6E6E6; + color: #444; + filter: none; +} +.tabs li.tabs-selected a.tabs-inner { + background-color: #fff; + color: #777; +} +.tabs li a.tabs-inner { + color: #777; + background-color: #ffffff; +} +.tabs-header, +.tabs-tool { + background-color: #ffffff; +} +.tabs-header-plain { + background: transparent; +} +.tabs-header, +.tabs-scroller-left, +.tabs-scroller-right, +.tabs-tool, +.tabs, +.tabs-panels, +.tabs li a.tabs-inner, +.tabs li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, +.tabs-header-left .tabs li.tabs-selected a.tabs-inner, +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-color: #ddd; +} +.tabs-p-tool a:hover, +.tabs li a:hover.tabs-close, +.tabs-scroller-over { + background-color: #E6E6E6; +} +.tabs li.tabs-selected a.tabs-inner { + border-bottom: 1px solid #fff; +} +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { + border-top: 1px solid #fff; +} +.tabs-header-left .tabs li.tabs-selected a.tabs-inner { + border-right: 1px solid #fff; +} +.tabs-header-right .tabs li.tabs-selected a.tabs-inner { + border-left: 1px solid #fff; +} +.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { + background: #CCE6FF; + color: #000; + filter: none; + border-color: #ddd; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tagbox.css new file mode 100644 index 000000000..7c6fd15f8 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tagbox.css @@ -0,0 +1,44 @@ +.tagbox { + cursor: text; +} +.tagbox .textbox-text { + float: left; +} +.tagbox-label { + position: relative; + display: block; + margin: 4px 0 0 4px; + padding: 0 20px 0 4px; + float: left; + vertical-align: top; + text-decoration: none; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + background: #E6E6E6; + color: #444; +} +.tagbox-remove { + background: url('images/tagbox_icons.png') no-repeat -16px center; + position: absolute; + display: block; + width: 16px; + height: 16px; + right: 2px; + top: 50%; + margin-top: -8px; + opacity: 0.6; + filter: alpha(opacity=60); +} +.tagbox-remove:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.textbox-disabled .tagbox-label { + cursor: default; +} +.textbox-disabled .tagbox-remove:hover { + cursor: default; + opacity: 0.6; + filter: alpha(opacity=60); +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/textbox.css new file mode 100644 index 000000000..55dc50348 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/textbox.css @@ -0,0 +1,144 @@ +.textbox { + position: relative; + border: 1px solid #ddd; + background-color: #fff; + vertical-align: middle; + display: inline-block; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.textbox .textbox-text { + font-size: 14px; + border: 0; + margin: 0; + padding: 0 4px; + white-space: normal; + vertical-align: top; + outline-style: none; + resize: none; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; + height: 28px; + line-height: 28px; +} +.textbox textarea.textbox-text { + line-height: normal; +} +.textbox .textbox-text::-ms-clear, +.textbox .textbox-text::-ms-reveal { + display: none; +} +.textbox textarea.textbox-text { + white-space: pre-wrap; +} +.textbox .textbox-prompt { + font-size: 14px; + color: #aaa; +} +.textbox .textbox-bgicon { + background-position: 3px center; + padding-left: 21px; +} +.textbox .textbox-button, +.textbox .textbox-button:hover { + position: absolute; + top: 0; + padding: 0; + vertical-align: top; + -moz-border-radius: 0 0 0 0; + -webkit-border-radius: 0 0 0 0; + border-radius: 0 0 0 0; +} +.textbox .textbox-button-right, +.textbox .textbox-button-right:hover { + right: 0; + border-width: 0 0 0 1px; +} +.textbox .textbox-button-left, +.textbox .textbox-button-left:hover { + left: 0; + border-width: 0 1px 0 0; +} +.textbox .textbox-button-top, +.textbox .textbox-button-top:hover { + left: 0; + border-width: 0 0 1px 0; +} +.textbox .textbox-button-bottom, +.textbox .textbox-button-bottom:hover { + top: auto; + bottom: 0; + left: 0; + border-width: 1px 0 0 0; +} +.textbox-addon { + position: absolute; + top: 0; +} +.textbox-label { + display: inline-block; + width: 80px; + height: 30px; + line-height: 30px; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0; + padding-right: 5px; +} +.textbox-label-after { + padding-left: 5px; + padding-right: 0; +} +.textbox-label-top { + display: block; + width: auto; + padding: 0; +} +.textbox-disabled, +.textbox-label-disabled { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-icon { + display: inline-block; + width: 18px; + height: 20px; + overflow: hidden; + vertical-align: top; + background-position: center center; + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); + text-decoration: none; + outline-style: none; +} +.textbox-icon-disabled, +.textbox-icon-readonly { + cursor: default; +} +.textbox-icon:hover { + opacity: 1.0; + filter: alpha(opacity=100); +} +.textbox-icon-disabled:hover { + opacity: 0.6; + filter: alpha(opacity=60); +} +.textbox-focused { + border-color: #c4c4c4; + -moz-box-shadow: 0 0 3px 0 #ddd; + -webkit-box-shadow: 0 0 3px 0 #ddd; + box-shadow: 0 0 3px 0 #ddd; +} +.textbox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tooltip.css new file mode 100644 index 000000000..21ae21180 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tooltip.css @@ -0,0 +1,103 @@ +.tooltip { + position: absolute; + display: none; + z-index: 9900000; + outline: none; + opacity: 1; + filter: alpha(opacity=100); + padding: 5px; + border-width: 1px; + border-style: solid; + border-radius: 5px; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.tooltip-content { + font-size: 14px; +} +.tooltip-arrow-outer, +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + font-size: 0; + border-style: solid; + border-width: 6px; + border-color: transparent; + _border-color: tomato; + _filter: chroma(color=tomato); +} +.tooltip-arrow { + display: none \9; +} +.tooltip-right .tooltip-arrow-outer { + left: 0; + top: 50%; + margin: -6px 0 0 -13px; +} +.tooltip-right .tooltip-arrow { + left: 0; + top: 50%; + margin: -6px 0 0 -12px; +} +.tooltip-left .tooltip-arrow-outer { + right: 0; + top: 50%; + margin: -6px -13px 0 0; +} +.tooltip-left .tooltip-arrow { + right: 0; + top: 50%; + margin: -6px -12px 0 0; +} +.tooltip-top .tooltip-arrow-outer { + bottom: 0; + left: 50%; + margin: 0 0 -13px -6px; +} +.tooltip-top .tooltip-arrow { + bottom: 0; + left: 50%; + margin: 0 0 -12px -6px; +} +.tooltip-bottom .tooltip-arrow-outer { + top: 0; + left: 50%; + margin: -13px 0 0 -6px; +} +.tooltip-bottom .tooltip-arrow { + top: 0; + left: 50%; + margin: -12px 0 0 -6px; +} +.tooltip { + background-color: #fff; + border-color: #ddd; + color: #444; +} +.tooltip-right .tooltip-arrow-outer { + border-right-color: #ddd; +} +.tooltip-right .tooltip-arrow { + border-right-color: #fff; +} +.tooltip-left .tooltip-arrow-outer { + border-left-color: #ddd; +} +.tooltip-left .tooltip-arrow { + border-left-color: #fff; +} +.tooltip-top .tooltip-arrow-outer { + border-top-color: #ddd; +} +.tooltip-top .tooltip-arrow { + border-top-color: #fff; +} +.tooltip-bottom .tooltip-arrow-outer { + border-bottom-color: #ddd; +} +.tooltip-bottom .tooltip-arrow { + border-bottom-color: #fff; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tree.css new file mode 100644 index 000000000..ab4efa62c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tree.css @@ -0,0 +1,164 @@ +.tree { + margin: 0; + padding: 0; + list-style-type: none; +} +.tree li { + white-space: nowrap; +} +.tree li ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.tree-node { + height: 26px; + white-space: nowrap; + cursor: pointer; +} +.tree-hit { + cursor: pointer; +} +.tree-expanded, +.tree-collapsed, +.tree-folder, +.tree-file, +.tree-checkbox, +.tree-indent { + display: inline-block; + width: 16px; + height: 18px; + margin: 4px 0; + vertical-align: middle; + overflow: hidden; +} +.tree-expanded { + background: url('images/tree_icons.png') no-repeat -18px 0px; +} +.tree-expanded-hover { + background: url('images/tree_icons.png') no-repeat -50px 0px; +} +.tree-collapsed { + background: url('images/tree_icons.png') no-repeat 0px 0px; +} +.tree-collapsed-hover { + background: url('images/tree_icons.png') no-repeat -32px 0px; +} +.tree-lines .tree-expanded, +.tree-lines .tree-root-first .tree-expanded { + background: url('images/tree_icons.png') no-repeat -144px 0; +} +.tree-lines .tree-collapsed, +.tree-lines .tree-root-first .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -128px 0; +} +.tree-lines .tree-node-last .tree-expanded, +.tree-lines .tree-root-one .tree-expanded { + background: url('images/tree_icons.png') no-repeat -80px 0; +} +.tree-lines .tree-node-last .tree-collapsed, +.tree-lines .tree-root-one .tree-collapsed { + background: url('images/tree_icons.png') no-repeat -64px 0; +} +.tree-line { + background: url('images/tree_icons.png') no-repeat -176px 0; +} +.tree-join { + background: url('images/tree_icons.png') no-repeat -192px 0; +} +.tree-joinbottom { + background: url('images/tree_icons.png') no-repeat -160px 0; +} +.tree-folder { + background: url('images/tree_icons.png') no-repeat -208px 0; +} +.tree-folder-open { + background: url('images/tree_icons.png') no-repeat -224px 0; +} +.tree-file { + background: url('images/tree_icons.png') no-repeat -240px 0; +} +.tree-loading { + background: url('images/loading.gif') no-repeat center center; +} +.tree-checkbox0 { + background: url('images/tree_icons.png') no-repeat -208px -18px; +} +.tree-checkbox1 { + background: url('images/tree_icons.png') no-repeat -224px -18px; +} +.tree-checkbox2 { + background: url('images/tree_icons.png') no-repeat -240px -18px; +} +.tree-title { + font-size: 14px; + display: inline-block; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + padding: 0 2px; + margin: 4px 0; + height: 18px; + line-height: 18px; +} +.tree-node-proxy { + font-size: 14px; + line-height: 20px; + padding: 0 2px 0 20px; + border-width: 1px; + border-style: solid; + z-index: 9900000; +} +.tree-dnd-icon { + display: inline-block; + position: absolute; + width: 16px; + height: 18px; + left: 2px; + top: 50%; + margin-top: -9px; +} +.tree-dnd-yes { + background: url('images/tree_icons.png') no-repeat -256px 0; +} +.tree-dnd-no { + background: url('images/tree_icons.png') no-repeat -256px -18px; +} +.tree-node-top { + border-top: 1px dotted red; +} +.tree-node-bottom { + border-bottom: 1px dotted red; +} +.tree-node-append .tree-title { + border: 1px dotted red; +} +.tree-editor { + border: 1px solid #ddd; + font-size: 14px; + height: 26px; + line-height: 26px; + padding: 0 4px; + margin: 0; + width: 80px; + outline-style: none; + vertical-align: middle; + position: absolute; + top: 0; +} +.tree-node-proxy { + background-color: #fff; + color: #444; + border-color: #ddd; +} +.tree-node-hover { + background: #E6E6E6; + color: #444; +} +.tree-node-selected { + background: #CCE6FF; + color: #000; +} +.tree-node-hidden { + display: none; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/validatebox.css new file mode 100644 index 000000000..1fc3ad64e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/validatebox.css @@ -0,0 +1,5 @@ +.validatebox-invalid { + border-color: #ffa8a8; + background-color: #fff3f3; + color: #000; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/window.css new file mode 100644 index 000000000..9602f67d1 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/window.css @@ -0,0 +1,182 @@ +.window { + overflow: hidden; + padding: 5px; + border-width: 1px; + border-style: solid; +} +.window .window-header { + background: transparent; + padding: 0px 0px 6px 0px; +} +.window .window-body { + border-width: 1px; + border-style: solid; + border-top-width: 0px; +} +.window .window-body-noheader { + border-top-width: 1px; +} +.window .panel-body-nobottom { + border-bottom-width: 0; +} +.window .window-header .panel-icon, +.window .window-header .panel-tool { + top: 50%; + margin-top: -11px; +} +.window .window-header .panel-icon { + left: 1px; +} +.window .window-header .panel-tool { + right: 1px; +} +.window .window-header .panel-with-icon { + padding-left: 18px; +} +.window-proxy { + position: absolute; + overflow: hidden; +} +.window-proxy-mask { + position: absolute; + filter: alpha(opacity=5); + opacity: 0.05; +} +.window-mask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + filter: alpha(opacity=40); + opacity: 0.40; + font-size: 1px; + overflow: hidden; +} +.window, +.window-shadow { + position: absolute; + -moz-border-radius: 0px 0px 0px 0px; + -webkit-border-radius: 0px 0px 0px 0px; + border-radius: 0px 0px 0px 0px; +} +.window-shadow { + background: #eee; + -moz-box-shadow: 2px 2px 3px #ededed; + -webkit-box-shadow: 2px 2px 3px #ededed; + box-shadow: 2px 2px 3px #ededed; + filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); +} +.window, +.window .window-body { + border-color: #ddd; +} +.window { + background-color: #ffffff; +} +.window-proxy { + border: 1px dashed #ddd; +} +.window-proxy-mask, +.window-mask { + background: #eee; +} +.window .panel-footer { + border: 1px solid #ddd; + position: relative; + top: -1px; +} +.window-thinborder { + padding: 0; +} +.window-thinborder .window-header { + padding: 5px 5px 6px 5px; +} +.window-thinborder .window-body { + border-width: 0px; +} +.window-thinborder .window-footer { + border-left: transparent; + border-right: transparent; + border-bottom: transparent; +} +.window-thinborder .window-header .panel-icon, +.window-thinborder .window-header .panel-tool { + margin-top: -9px; + margin-left: 5px; + margin-right: 5px; +} +.window-noborder { + border: 0; +} +.window.panel-hleft .window-header { + padding: 0 6px 0 0; +} +.window.panel-hright .window-header { + padding: 0 0 0 6px; +} +.window.panel-hleft>.panel-header .panel-title { + top: auto; + left: 16px; +} +.window.panel-hright>.panel-header .panel-title { + top: auto; + right: 16px; +} +.window.panel-hleft>.panel-header .panel-title-up, +.window.panel-hright>.panel-header .panel-title-up { + bottom: 0; +} +.window.panel-hleft .window-body { + border-width: 1px 1px 1px 0; +} +.window.panel-hright .window-body { + border-width: 1px 0 1px 1px; +} +.window.panel-hleft .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: 0; +} +.window.panel-hright .window-header .panel-icon { + top: 1px; + margin-top: 0; + left: auto; + right: 1px; +} +.window.panel-hleft .window-header .panel-tool, +.window.panel-hright .window-header .panel-tool { + margin-top: 0; + top: auto; + bottom: 1px; + right: auto; + margin-right: 0; + left: 50%; + margin-left: -11px; +} +.window.panel-hright .window-header .panel-tool { + left: auto; + right: 1px; +} +.window-thinborder.panel-hleft .window-header { + padding: 5px 6px 5px 5px; +} +.window-thinborder.panel-hright .window-header { + padding: 5px 5px 5px 6px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title { + left: 21px; +} +.window-thinborder.panel-hleft>.panel-header .panel-title-up, +.window-thinborder.panel-hright>.panel-header .panel-title-up { + bottom: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-icon, +.window-thinborder.panel-hright .window-header .panel-icon { + margin-top: 5px; +} +.window-thinborder.panel-hleft .window-header .panel-tool, +.window-thinborder.panel-hright .window-header .panel-tool { + left: 16px; + bottom: 5px; +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/mobile.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/mobile.css new file mode 100644 index 000000000..ff5724521 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/mobile.css @@ -0,0 +1,355 @@ +*{ + box-sizing: border-box; +} +.m-toolbar{ + position: relative; + text-align: center; + min-height: 34px; +} +.m-toolbar .m-title{ + line-height: 34px; + font-size: 16px; + font-weight: bold; + text-align: center; +} +.m-left{ + position: absolute; + height: 100%; + vertical-align: middle; + top:0; + left:0; + z-index: 1; +} +.m-right{ + position: absolute; + height: 100%; + vertical-align: middle; + top:0; + right:0; + z-index: 1; +} +.m-left>.l-btn,.m-right>.l-btn, +.m-left>.switchbutton,.m-right>.switchbutton{ + position: relative; + vertical-align: top; + top: 50%; + margin-top: -15px; +} +.m-back::before,.m-next::after{ + display: inline-block; + box-sizing: border-box; + vertical-align: top; + border-style: solid; + -webkit-transform:rotate(45deg); + transform:rotate(45deg); + width: 12px; + height: 12px; + content: ''; + position: absolute; + top: 50%; + margin-top: -6px; +} +.m-back::before{ + border-width: 0 0 1px 1px; + left: 8px; +} +.m-next::after{ + border-width: 1px 1px 0 0; + right: 8px; +} +.m-back .l-btn-text{ + padding-left: 12px; +} +.m-next .l-btn-text{ + padding-right: 12px; +} +.m-buttongroup{ + display: inline-block; + margin: 0; + padding: 0; + overflow: hidden; + vertical-align: middle; +} +.m-buttongroup .l-btn{ + float: left; + margin-left: -1px; +} +.m-buttongroup .l-btn:last-child::after{ + content: ''; + clear: both; +} +.m-buttongroup .l-btn:not(:first-child):not(:last-child){ + border-radius: 0; +} +.m-buttongroup .l-btn:first-child{ + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-left: 0; +} +.m-buttongroup .l-btn:last-child{ + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.m-buttongroup-justified{ + display: table; + table-layout: fixed; +} +.m-buttongroup-justified .l-btn{ + float: none; + display: table-cell; +} +.m-badge:not(.l-btn), +.l-btn.m-badge::after{ + display: inline-block; + min-width: 10px; + line-height: 1; + font-size: 12px; + text-align: center; + white-space: nowrap; + border-radius: 10px; + padding: 2px 4px; + border-style: solid; + border-width: 0px; + background-color: #d9534f; + color: #fff; + z-index: 99999; +} +.l-btn.m-badge::after, +.l-btn .m-badge{ + position: absolute; + top: -10px; + right: -10px; +} +.tabs-inner .m-badge{ + position: absolute; + top: 1px; + right: -10px; +} +.tabs-inner>.tabs-title>.m-badge{ + top: 0; + right: 0; +} +.tabs-header-bottom .tabs-inner>.tabs-title>.m-badge{ + top: auto; + bottom: 0; + right: 0; +} +.panel-footer .l-btn .l-btn-icon-top .m-badge, +.panel-footer .l-btn .l-btn-icon-bottom .m-badge{ + top: 0; + right: -10px; +} +.l-btn.m-badge::after{ + content: attr(data-badge); +} +.l-btn,.l-btn-left{ + overflow: visible; + position: relative; +} + +.m-in{ + -webkit-animation-timing-function: ease-out; + -webkit-animation-duration: 250ms; +} +.m-out{ + -webkit-animation-timing-function: ease-in; + -webkit-animation-duration: 250ms; +} +.m-slide-left.m-in{ + -webkit-animation-name: slideLeftIn; +} +.m-slide-left.m-out{ + -webkit-animation-name: slideLeftOut; +} +.m-slide-right.m-in{ + -webkit-animation-name: slideRightIn; +} +.m-slide-right.m-out{ + -webkit-animation-name: slideRightOut; +} +.m-slide-up.m-in{ + -webkit-animation-name: slideUpIn; +} +.m-slide-up.m-out{ + -webkit-animation-name: slideUpOut; +} +.m-slide-down.m-in{ + -webkit-animation-name: slideDownIn; +} +.m-slide-down.m-out{ + -webkit-animation-name: slideDownOut; +} + +@-webkit-keyframes slideLeftIn{ + from {-webkit-transform: translateX(100%);} + to {-webkit-transform: translateX(0);} +} +@-webkit-keyframes slideLeftOut{ + from {-webkit-transform: translateX(0);} + to {-webkit-transform: translateX(-100%);} +} +@-webkit-keyframes slideRightIn{ + from {-webkit-transform: translateX(-100%);} + to {-webkit-transform: translateX(0);} +} +@-webkit-keyframes slideRightOut{ + from {-webkit-transform: translateX(0);} + to {-webkit-transform: translateX(100%);} +} +@-webkit-keyframes slideUpIn{ + from {-webkit-transform: translateY(100%);} + to {-webkit-transform: translateY(0);} +} +@-webkit-keyframes slideUpOut{ + from {-webkit-transform: translateY(0);} + to {-webkit-transform: translateY(-100%);} +} +@-webkit-keyframes slideDownIn{ + from {-webkit-transform: translateY(-100%);} + to {-webkit-transform: translateY(0);} +} +@-webkit-keyframes slideDownOut{ + from {-webkit-transform: translateY(0);} + to {-webkit-transform: translateY(100%);} +} + +.m-fade.m-in{ + -webkit-animation-name: fadeIn; +} +.m-fade.m-out{ + -webkit-animation-name: fadeOut; +} + +@-webkit-keyframes fadeIn{ + from {opacity: 0;} + to {opacity: 1} +} +@-webkit-keyframes fadeOut{ + from {opacity: 1;} + to {opacity: 0;} +} + +.m-pop.m-in{ + -webkit-animation-name: popIn; +} +.m-pop.m-out{ + -webkit-animation-name: popOut; +} +@-webkit-keyframes popIn{ + from { + opacity: 0; + -webkit-transform: scale(.2); + } + to { + opacity: 1; + -webkit-transform: scale(1); + } +} +@-webkit-keyframes popOut{ + from { + opacity: 1; + -webkit-transform: scale(1); + } + to { + opacity: 0; + -webkit-transform: scale(0); + } +} + +.navpanel{ + position: absolute; +} +.textbox .textbox-text{ + padding: 0 4px; + height: 30px; + line-height: 30px; +} +.calendar-header,.calendar-title{ + height: 30px; +} +.calendar-title span{ + height: 30px; + line-height: 30px +} +.datebox-button{ + height: 24px; +} +.datebox-button a{ + line-height: 24px; +} +.tree-node{ + box-sizing: border-box; + height: 32px; + padding: 3px 0; +} + +.panel-title{ + height: 26px; + line-height: 26px; +} +.window{ + padding: 5px 0 0 0; +} +.window-shadow{ + -moz-box-shadow: 0 0 30px 0 #D3D3D3; + -webkit-box-shadow: 0 0 30px 0 #D3D3D3; + box-shadow: 0 0 30px 0 #D3D3D3; +} +.window-header .panel-title{ + height: 26px; + line-height: 26px; + text-align: center; +} +.window-header .panel-tool{ + display: none; +} +.window .window-body{ + border: 0; +} +.dialog-button{ + border-color: transparent; + overflow: hidden; +} +.dialog-button .l-btn{ + margin: 0; +} + +.tabs-justified, +.tabs-justified .l-btn, +.tabs-justified li a.tabs-inner, +.tabs-justified li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs-justified li.tabs-selected a.tabs-inner, +.tabs-header-bottom .tabs-justified li a.tabs-inner{ + -moz-border-radius:0; + -webkit-border-radius:0; + border-radius:0; +} + +.datagrid-row,.datagrid-header-row{ + height: 32px; +} +.datalist .datagrid-group-title, +.m-list .m-list-group{ + padding: 0 10px; +} +.datalist .datagrid-cell, +.m-list li{ + padding: 10px; +} +.m-list li .m-right{ + right: 10px; +} +.datalist .datalist-link, +.m-list li>a{ + margin: -10px; + padding: 10px; + padding-right: 24px; +} +.m-list li>a .m-right{ + right: 24px; +} +.datalist .datalist-link::after, +.m-list li>a::after{ + right: 12px; +} + diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/vue.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/vue.css new file mode 100644 index 000000000..da5e52cea --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/vue.css @@ -0,0 +1,650 @@ +*{ + box-sizing: border-box; +} +.f-block{ + display: block; + position: relative; +} +.f-row{ + display: -webkit-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + position: relative; +} +.f-column{ + display: -webkit-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: vertical; + -webkit-flex-direction: column; + -moz-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + position: relative; +} +.f-inline-row{ + white-space: nowrap; + display: -webkit-inline-box; + display: -ms-inline-box; + display: inline-flex; + vertical-align: middle; + position: relative; + align-items: stretch; + -webkit-tap-highlight-color: transparent; +} +.f-content-center{ + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; +} +.f-full{ + -webkit-box-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} +.f-hide{ + display: none; +} +.f-order0{ + order: 0; +} +.f-order1{ + order: 1; +} +.f-order2{ + order: 2; +} +.f-order3{ + order: 3; +} +.f-order4{ + order: 4; +} +.f-order5{ + order: 5; +} +.f-order6{ + order: 6; +} +.f-order7{ + order: 7; +} +.f-order8{ + order: 8; +} +.f-noshrink{ + -webkit-flex-shrink: 0; + -moz-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.f-animate{ + transition: all .3s; +} +.f-field{ + width: 12em; + height: 30px; +} + +.scroll-body{ + overflow: auto; + position: relative; +} + +.textbox .textbox-text{ + width: 100%; + height: auto; + overflow: hidden; +} +.textbox-addon{ + align-items: center; +} +.textbox textarea.textbox-text{ + height: auto; + overflow: auto; +} +.textbox-disabled>.textbox-addon .textbox-icon, +.textbox-readonly>.textbox-addon .textbox-icon{ + cursor: default; +} +.textbox-disabled>.textbox-addon .textbox-icon:hover, +.textbox-readonly>.textbox-addon .textbox-icon:hover{ + opacity: 0.6; + cursor: default; +} +.textbox-addon .textbox-icon{ + width: 26px; + height: 18px; +} + +.spinner .textbox-text{ + height: auto; +} +.spinner-button-left,.spinner-button-right{ + width: 26px; +} +.spinner-button-updown{ + width: 26px; +} +.spinner-button-top,.spinner-button-bottom{ + position: absolute; + width: 100%; + height: 26px; +} +.spinner-button-top{ + top: 0; +} +.spinner-button-bottom{ + top: auto; + bottom: 0; +} +.spinner-button{ + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.spinner-arrow{ + cursor: pointer; + opacity: 0.6; +} + +.textbox-disabled .spinner-arrow:hover, +.textbox-readonly .spinner-arrow:hover +{ + opacity: 0.6; + cursor: default; +} +.textbox-readonly .spinner-arrow .spinner-arrow-up:hover, +.textbox-disabled .spinner-arrow .spinner-arrow-up:hover, +.textbox-readonly .spinner-arrow .spinner-arrow-down:hover, +.textbox-disabled .spinner-arrow .spinner-arrow-down:hover +{ + cursor: default; +} + +.l-btn{ + width1: 100%; +} +.l-btn-empty{ + height: 28px; +} +.l-btn-large .l-btn-empty{ + height: 44px; +} +.l-btn-left{ + overflow: visible; +} +.m-btn .l-btn-left .m-btn-line{ + top: -100px; + width: 36px; + right: -20px; +} +.button-group .l-btn.f-inline-row{ + margin-left: -1px; +} +.button-group .l-btn:hover{ + z-index: 99; +} +.button-group .l-btn:not(:first-child):not(:last-child){ + border-radius: 0; +} +.button-group .l-btn:first-child{ + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.button-group .l-btn:last-child{ + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.switchbutton{ + width: 70px; + height: 30px; +} +.switchbutton-on,.switchbutton-off{ + position: absolute; + left: 0; + width: calc(100% - 15px); + height: 100%; +} +.switchbutton-on span,.switchbutton-off span,.switchbutton-handle span{ + height: 100%; +} +.switchbutton-on span{ + text-indent: -15px; +} +.switchbutton-off span{ + text-indent: 15px; +} +.switchbutton-off{ + left: calc(100% - 15px); +} +.switchbutton-handle{ + width: 30px; + left: auto; + right: 0; + z-index: 9; +} +.switchbutton-inner{ + transition: all 200ms ease-out; + overflow: visible; + position: absolute; + width: 100%; + top: -1px; + bottom: -1px; + left: calc(-100% + 30px); + right: auto; +} +.switchbutton-checked .switchbutton-inner{ + left: 0; +} +.draggable-reverting{ + transition: all 200ms ease-out; +} +.slider-h .slider-tip{ + transform: translateX(-50%); +} +.slider-h .slider-rulelabel span{ + transform: translateX(-50%); +} +.slider-v .slider-tip{ + margin-top: 0; + transform: translate(-100%,-50%); +} +.slider-v .slider-rulelabel span{ + transform: translateY(-50%); +} +.slider-v .slider-inner{ + height: auto; +} + + +.panel{ + position:relative; +} +.panel-title{ + height: 20px; + line-height: 20px; +} +.panel-footer-fixed{ + position:absolute; + width:100%; + bottom:0; +} +.window{ + position: absolute; +} +.window-mask{ + position: fixed; +} +.window .window-footer{ + top: 0; +} +.dialog-toolbar{ + border-width: 0 0 1px 0; +} +.dialog-button{ + border-width: 1px 0 0 0; + top: 0; +} + +.tabs{ + width: 100%; + height: auto; +} +.tabs-scrollable{ + transition: left 400ms, right 400ms; + position: absolute; + width: auto; + height: 100%; + left: 0; + top: 0; +} +.tabs li{ + display: inherit; +} +.tabs li a.tabs-inner{ + height: auto; + line-height: normal; + display: inherit; + overflow: hidden; +} +.tabs-title{ + display: inherit; + align-items: center; + line-height: normal; +} +.tabs-close{ + outline: none; +} +.tabs-scroller-left,.tabs-scroller-right{ + position: relative; + display: block; + width: 21px; + height: 100%; +} +.tabs-header-left .tabs li{ + right: -1px; +} +.tabs-header-left .tabs li,.tabs-header-right .tabs li, +.tabs-header-left .tabs li a.tabs-inner, +.tabs-header-right .tabs li a.tabs-inner{ + display: inherit; +} + +.combo-panel{ + position: absolute; + height: 200px; + z-index: 9999; +} +.combo-panel eui-virtual-scroll, +.combo-panel eui-datagrid, +.combo-panel eui-treegrid{ + width: 100%; + height: 100%; +} +.combobox-item{ + padding: 6px 4px; + line-height: 20px; +} +.tagbox-labels{ + padding-bottom: 4px; +} +.tagbox-label{ + height: 20px; + line-height: 20px; +} +.tagbox .textbox-text{ + width: 50px; + max-width: 100%; + margin-top: 4px; + padding-top: 0; + padding-bottom: 0; + height: 20px; + line-height: 20px; +} + +.datagrid,eui-datagrid, +eui-datagrid-view,eui-datagrid-body, +eui-treegrid-view,eui-treegrid-body{ + overflow: hidden; +} +.datagrid-view,.datagrid-view1,.datagrid-view2{ + position: relative; +} +.datagrid-vbody{ + overflow: hidden; +} +.datagrid-view3{ + margin-left: -1px; +} +.datagrid-view3 .datagrid-body{ + overflow: hidden; +} +.datagrid-view3 .datagrid-body-inner{ + padding-bottom: 20px; +} +.datagrid-view3 .datagrid-header td, +.datagrid-view3 .datagrid-body td, +.datagrid-view3 .datagrid-footer td { + border-width: 0 0 1px 1px; +} +.datagrid-htable,.datagrid-btable,.datagrid-ftable{ + table-layout: fixed; + width: 100%; +} +.datagrid-htable{ + height: 100%; +} +.datagrid-header .datagrid-header, +.datagrid-footer .datagrid-header{ + border-width: 0 0 0 1px; +} +.datagrid-header-inner,.datagrid-footer-inner{ + overflow: hidden; +} +.datagrid-header-row, .datagrid-row{ + height: 32px; +} +.datagrid-header td.datagrid-field-td{ + border-bottom: 0; +} +.datagrid-cell{ + text-align: left; + height: auto; + font-size: inherit; +} +.datagrid-cell-group{ + text-align: center; +} +.datagrid .datagrid-pager{ + padding: 2px 4px; + display: inherit; +} +.datagrid-loading{ + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + justify-content: center; + align-items: center; +} +.datagrid-mask{ + display: block; +} +.datagrid-mask-msg{ + display: block; + position: static; + line-height: 36px; + height: 40px; + margin: 0; + padding: 0 5px 0 30px; + z-index: 9; +} +.datagrid-body .datagrid-td-group{ + border-left-color: transparent; + border-right-color: transparent; +} +.datagrid-group-expander{ + cursor: pointer; +} +.datagrid-row-expander{ + display: inline-block; + width: 16px; + height: 18px; + cursor: pointer; +} +.datagrid-group-title{ + align-self: center; + padding: 0 4px; + white-space: nowrap; + word-break: normal; + position: relative; +} +.datagrid-editable> .f-field, +.datagrid-editable> *{ + width: 100%; + height: 31px; +} +.datagrid-editable .textbox, .datagrid-editable .textbox-text{ + border-radius: 0; +} +.datagrid-filter-row .textbox{ + border-radius: 0; +} +.datagrid-filter-c{ + padding: 4px; + height: 38px; +} +.datagrid-filter-c> .f-field, +.datagrid-filter-c> *{ + height: 30px; +} +.datagrid-filter-c .datagrid-editable-input{ + width: 100%; +} +.datagrid-filter-btn{ + width: 30px; +} +.datagrid-filter-btn .textbox-icon{ + width: 28px; +} +.datagrid-filter-btn .textbox{ + background-color: transparent; +} +.datagrid-filter-btn-left{ + margin-right: 4px; +} +.datagrid-filter-btn-right{ + margin-left: 4px; +} + +.menu-inline{ + position: relative; + display: inline; + margin: 0; + padding: 0; +} +.menu-inline> .menu-container{ + position: relative; +} +.menu-container{ + position: absolute; + left: 0; + top: 0; + min-width: 200px; +} +.menu{ + overflow: visible; +} +.menu-shadow{ + width: 100%; + height: 100%; + left: 0; + top: 0; +} +.menu-item{ + overflow: visible; +} +.menu-text{ + height: 32px; + line-height: 32px; + float: none; +} +.menu-line{ + z-index: 9999999; + height: 100%; +} +.menu-active{ + z-index: 99999999; +} + +.progressbar-value{ + overflow: visible; +} + +.searchbox .textbox-button, +.searchbox .textbox-button:hover{ + position: inherit; +} + +.calendar-content{ + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; +} +.calendar-menu{ + position: absolute; + width: 100%; + height: 100%; +} +.calendar-menu-month-inner{ + position: relative; +} + +eui-tagbox{ + width: 12em; + height: auto; + min-height: 30px; +} +eui-switchbutton{ + width: 70px; + height: 30px; +} +.radiobutton{ + width: 20px; + height: 20px; +} +.checkbox{ + width: 20px; + height: 20px; +} +.progressbar{ + height: 24px; +} +.pagination1{ + height: 34px; + padding: 2px; +} +eui-layout{ + display: block; +} +.layout{ + height: 100%; +} +.layout-animate{ + transition: transform 400ms; +} +.layout-panel-north,.layout-panel-south{ + position: absolute; + width: 100%; + left: 0; + top: 0; +} +.layout-panel-south{ + top: auto; + bottom: 0; +} +.layout-panel-west,.layout-panel-east{ + position: absolute; + left: 0; + top: 0; + bottom: 0; +} +.layout-panel-east{ + left: auto; + right: 0; +} +.layout-panel-west.layout-collapsed{ + transform: translate3d(-100%, 0, 0); +} +.layout-panel-east.layout-collapsed{ + transform: translate3d(100%, 0, 0) +} +.layout-panel-north.layout-collapsed{ + transform: translate3d(0, -100%, 0) +} +.layout-panel-south.layout-collapsed{ + transform: translate3d(0, 100%, 0) +} + diff --git a/testapps/ResourceLoaderTest/src/main/resources/conf/app.properties b/testapps/ResourceLoaderTest/src/main/resources/conf/app.properties new file mode 100644 index 000000000..7612bb6a7 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/conf/app.properties @@ -0,0 +1,800 @@ +############################################## +# Application configuration +# act-1.8.8-RC12-SNAPSHOT +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy年MM月dd日 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy年MM月dd日 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=xcgXKMICkvZ3k3uLj2AIiarXjLt2Lr6nHzvkBs9o1a9eKyspfvSd1eKYYSYNAhu8 + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/ResourceLoaderTest/src/main/resources/conf/prod/app.properties b/testapps/ResourceLoaderTest/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..5f0017b9a --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC12-SNAPSHOT +############################################## +act.secret=clypiSZ9qOFMZ8JgAdutcvPctiPYRhC4HFkjcvwhf9j3YQrAUxAx9cUL0FzmnlRB \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/conf/uat/app.properties b/testapps/ResourceLoaderTest/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..844739167 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC12-SNAPSHOT +############################################## +act.secret=AkrRnS5yuyq98LmEBRwoQom9nCIj8oLlXEKRUjXiBlbjPc0phCf7VL3yJOJqjjbC \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/logback.xml b/testapps/ResourceLoaderTest/src/main/resources/logback.xml new file mode 100644 index 000000000..6b65d6b02 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/ResourceLoaderTest/src/main/resources/resourceloader/.version b/testapps/ResourceLoaderTest/src/main/resources/resourceloader/.version new file mode 100644 index 000000000..ea0c26126 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/resourceloader/.version @@ -0,0 +1,3 @@ +artifact=${project.artifactId} +version=${project.version} +build=${buildNumber} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/rythm/com/mycom/helloworld/AppEntry/home.html b/testapps/ResourceLoaderTest/src/main/resources/rythm/com/mycom/helloworld/AppEntry/home.html new file mode 100644 index 000000000..52a6b6e83 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/rythm/com/mycom/helloworld/AppEntry/home.html @@ -0,0 +1,13 @@ + + +@args String who + + Hello World - ActFramework + + +

                                                                                                              Hi @who

                                                                                                              +

                                                                                                              + Powered by ActFramework @act.Act.VERSION.getVersion() +

                                                                                                              + + diff --git a/testapps/ResourceLoaderTest/src/main/resources/students.xls b/testapps/ResourceLoaderTest/src/main/resources/students.xls new file mode 100644 index 0000000000000000000000000000000000000000..6efa6385e06a1d5153cfa5d0ae329b990112539f GIT binary patch literal 16896 zcmeHOd5~O3dH-g$r_R-7+>$I0maSXzu2&~UXm@q3j@7lYgl!r8cK7Y>vu0=HIb^L( z@EUL+fWg9GSmFen*f<0S%wwARY>xONh+zNlBx)bREjFhr-J(N!cy}d_Q-FoZIoeS${$Y*#^9KC+g%0-LXR=2e+tZ$L0Xg35e>cim) z`R{5Ljm6LDEajYgE&u7I$vI!O%3ny%T5FYm{mP%foMt&Z`^59S!py_jw0zkGA zUw#33OHFwL%t!a9$F^JFHiPTlcma9SdGe=q`Q}*Od~W|+E+~J}w99*oe#|_yz*2R8 z&XYfNp8SzI81T4M`QAD{Nx#n=Z`ALz#_RR_?C~c3K4-k4`VlxxIAr`w|ZtmI)VH zC&)U$h2T!@L?47BzMc0#tmKwlP%3p%@?_SNbbnClWfT5ApJ_%CIrLCQ{sYbxw6nLd zpfsM%@(pXsD=7Cc6MX_xobQk+XL-&1V-#$b2Qs*pHlK!*m*!4c_+wr~aWQSif;Qvg z+5A7aoBmw-nm>suUVsi4)~BEMkzy`SLU4_B^4Qi4_Q3i9Y1n%V)j zF3_G7=tmYktPG-JG;vEQ%#{oIL_YxGj$kZ@^8&fv5Sc-55(ZJ<=ork{;uC0ZR|wNZ z+ac=i>JPnU??I>cM)@JOdIW_M-brY>a#1Nn>)qH?zA=t*h*6;*^TfWPKSj@0?uBeO zMz4q0i>(cl_U5UJ0}RHvo41w9VG$koI@AsF_8^D#g1$Szd=2L!Zf)x>wjhfoL%(vI zNw|#BeokvrVk?aQwgS7orC2Eyyt=oc}5A+cm$IZj-f+GMxt_<4+gwR-h*m)1*Op_kCJ;inqywIz0mF-sTA_VtUn69 zn)jmoHct8=%>_;kW;~kA-ad|{QpSElrms-R`P}`OIqYFQ_U_<#Il}rS)C25N;Y6f& z>z-i5x6-J?m5bIS*|kYF@zzn|{G-GNM~OT0>>;AxG^P;^B-zAGczY}wN(#`QS=vaF zO}0&RS0YVjJxX?^H)m0@Yof%?qvJ^pcPH7zzj@0YCFUE^#B9$_B-wkC?8zjXSa5W2 zBJE1D-AR@k$JVl90 z{0q#7x5t6zxk$*^htV%SbqtxAkJhc{e6*g58_ghYKl~^&83ybRgr2HZO{xY0cT&GYrkHDiT-eU~m9huq$+W$)3ii@_h#&%bV7;^mjRdjD@jDg^^jDg{_jDg~`jDh2{j9)sW zWeaM^7-&wHG=4EYN$ChkB@szp{&uh==NwAEZKq;nU6MNL>_H{I?kQaUtt-<_PG8Ak(YId zyf<3JSyu3prsNde-Xe#{yWSzcpWN3d=K?GBL_uOH7Bg|ADDg)G#(I~*eKZ4UW7`XD85x4LUJ z?@ouv3ml4hyeDNLO`m7nn`s$6S6W8@m6p+qrDgP9X&HT3T1HQnmeGTyW%Ofd8NFFr zMq5kE=-JXT`nR-Oq|7BYp1r?H8wUfThO zxVD21acy}flE-ya5<0{^J>(F1!w!)b?@g|?k`b%BPPZ31MBZHv`8?W#l4Dl4Nb_PeqkSs5$Lf}7-bshZ8*|7XA8lC4y;iqW^X_wqymvT6Uc3&pbA``Grk~3+ z@0|{jcfUh^Ke-o_j9cAu&3nKh^4{f;-yYjl@@}hJp?U9dh`a|KB9Hb(JL8^G@~aMU z9p38@dGB+`?{!bllxc6hpp~L z&3o7(@=iJA^SH;Ae8lS7H183I$or^6}#gXNUgo z$bL>1e8&DyoXhx3ezpgC#3atLUl}AgG{`5NcbvClQE&wSX(zyOhJ9LCo+40FW~!Xx}i1L0((E0GivX}J-Y&j1 zz#+j){+87-raDjJ)3IKEl8aBrdeoZm=*5)$w&j^f$^nPi-a&_A@5-Lh=_&j!!Su6H zw-PJ-h3Pt_@!7oT$6*GhiZ@=PQpzV$Jtp4|GTY93EH_Jwnx#xg}#dOIbY8w zJ&-|uKY1=F`2(vnk(BtBxj^$i?R4bD`+@IDzF~DHlCseu_VY~+`TgYiqU1TNGm(_N z4w1LdA-|tIgOvQC)tN}jfJ5XBIu!TwN+iX6bH@FjKGW$1(y|+C$l7Yi+H1&esv+yB zAzPD@(IT^uDfuJ38bn|IPKUU*_dCS3jn6pxAcbF!8QvSUFJJ5sc}pDfZSXqHJ8g9) zlES{Sb^fGyzOa`Dkr(ex`X?pNTb+rd^f*M`PKU^geKI|nl5bj_iKIN_5P2VR$nWP3 zn)fGGcY_|^dmSS0eGd6N&ViCYwK@|?p&#Rj7VGiRI~hb??8`Y@O8(61Oe7`e5ZfDd z$RFQQ&HI+snMleZhse9dA-|tI2bKJ})tN{N_c?pEO!qVE5P9)B@WfR5=i4l4A}Nz? zNq&=_e0#S1oI3;00wsTGOPWZ^oeq%~IONaEN=TLbmDR1(>u`rdANJRq`FHGm(^a4w1LsA)m)RuH>(+ z&O}luef$@i?zL{c7hh`dt{kr%H! z_o$M;u{sk;xy>Q+Zg+^h_^je?R{F>A9D|9ZblZ|^^!TXBz-#7%gop)r5udHv2n1}ltU z9KwOsYHM>HRvZBq{VLmeS?rAliiJ{PDE{^I#`UWX1^xK3YN$Wsc1J@)8%*(6_6qwm zjlMEEdQaOwzY5y*iw}P4CqLUa()zhm&9Y+2mw!lSMVHu!L_Is+g4Bt`gMn^#3esDV zrXumGI1P#Ji7ov5OXlxinO}?4i6k$4bNYcePmHINFVEaj{)ZoaE5m%pKhIlr-Ob44`@wg9@Yw44t&e;h{a^XB&u@jSAtgHs84qn%&eV!TF8j*Rqbu7+gG=(Ub}8R{qvRQ zH9iBc=HGv6`%C$dTGO)t!cH0 z@HzfDwqOH(R#CzDM{%j;-~R5zSGhxaO(-ejZy*c$%iRmryVSPNd&8xUpY!#!Ykwcg7MS;pSJD48gG|7|Nh_K{(raszjEbcvH$=8 literal 0 HcmV?d00001 From bbd4bb761f1a2e7f745a1f3e61710159992de5f7 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 16 Aug 2018 06:04:05 +1000 Subject: [PATCH 062/730] remove testing static assets from ResourceLoaderTest --- .../src/main/resources/asset/changelog.txt | 630 - .../asset/demo-mobile/accordion/_content.html | 18 - .../asset/demo-mobile/accordion/basic.html | 1 - .../asset/demo-mobile/accordion/header.html | 1 - .../asset/demo-mobile/animation/basic.html | 1 - .../asset/demo-mobile/animation/fade.html | 1 - .../asset/demo-mobile/animation/pop.html | 1 - .../asset/demo-mobile/animation/slide.html | 1 - .../asset/demo-mobile/badge/basic.html | 1 - .../asset/demo-mobile/badge/button.html | 1 - .../asset/demo-mobile/badge/list.html | 1 - .../asset/demo-mobile/badge/tabs.html | 1 - .../asset/demo-mobile/button/basic.html | 1 - .../asset/demo-mobile/button/group.html | 1 - .../asset/demo-mobile/button/style.html | 1 - .../asset/demo-mobile/button/switch.html | 1 - .../asset/demo-mobile/datagrid/basic.html | 1 - .../demo-mobile/datagrid/rowediting.html | 104 - .../asset/demo-mobile/datalist/basic.html | 1 - .../asset/demo-mobile/datalist/group.html | 1 - .../asset/demo-mobile/datalist/selection.html | 1 - .../asset/demo-mobile/dialog/basic.html | 46 - .../asset/demo-mobile/dialog/message.html | 41 - .../asset/demo-mobile/form/basic.html | 44 - .../asset/demo-mobile/images/login1.jpg | Bin 25789 -> 0 bytes .../asset/demo-mobile/images/modem.png | Bin 1633 -> 0 bytes .../asset/demo-mobile/images/more.png | Bin 110 -> 0 bytes .../asset/demo-mobile/images/pda.png | Bin 1787 -> 0 bytes .../asset/demo-mobile/images/scanner.png | Bin 2600 -> 0 bytes .../asset/demo-mobile/images/tablet.png | Bin 2505 -> 0 bytes .../demo-mobile/input/numberspinner.html | 1 - .../asset/demo-mobile/input/textbox.html | 1 - .../asset/demo-mobile/layout/basic.html | 32 - .../asset/demo-mobile/menu/basic.html | 39 - .../asset/demo-mobile/menu/menubar.html | 45 - .../asset/demo-mobile/panel/_content.html | 18 - .../asset/demo-mobile/panel/ajax.html | 1 - .../asset/demo-mobile/panel/basic.html | 1 - .../asset/demo-mobile/panel/nav.html | 39 - .../asset/demo-mobile/simplelist/basic.html | 1 - .../asset/demo-mobile/simplelist/button.html | 1 - .../asset/demo-mobile/simplelist/group.html | 1 - .../asset/demo-mobile/simplelist/image.html | 1 - .../asset/demo-mobile/simplelist/link.html | 1 - .../asset/demo-mobile/tabs/basic.html | 1 - .../resources/asset/demo-mobile/tabs/nav.html | 1 - .../asset/demo-mobile/tabs/pill.html | 1 - .../asset/demo-mobile/toolbar/basic.html | 63 - .../asset/demo-mobile/toolbar/button.html | 45 - .../asset/demo-mobile/toolbar/menu.html | 76 - .../asset/demo-mobile/tree/basic.html | 56 - .../resources/asset/demo-mobile/tree/dnd.html | 56 - .../asset/demo/accordion/_content.html | 18 - .../asset/demo/accordion/actions.html | 51 - .../resources/asset/demo/accordion/ajax.html | 28 - .../resources/asset/demo/accordion/basic.html | 52 - .../asset/demo/accordion/datagrid_data1.json | 12 - .../asset/demo/accordion/expandable.html | 33 - .../resources/asset/demo/accordion/fluid.html | 33 - .../asset/demo/accordion/horizontal.html | 52 - .../asset/demo/accordion/multiple.html | 34 - .../resources/asset/demo/accordion/tools.html | 48 - .../resources/asset/demo/calendar/basic.html | 19 - .../resources/asset/demo/calendar/custom.html | 46 - .../asset/demo/calendar/disabledate.html | 28 - .../asset/demo/calendar/firstday.html | 30 - .../resources/asset/demo/calendar/fluid.html | 23 - .../asset/demo/calendar/weeknumber.html | 19 - .../resources/asset/demo/combo/animation.html | 41 - .../resources/asset/demo/combo/basic.html | 48 - .../asset/demo/combobox/actions.html | 88 - .../resources/asset/demo/combobox/basic.html | 73 - .../asset/demo/combobox/combobox_data1.json | 22 - .../asset/demo/combobox/combobox_data2.json | 47 - .../asset/demo/combobox/customformat.html | 39 - .../asset/demo/combobox/dynamicdata.html | 31 - .../resources/asset/demo/combobox/fluid.html | 43 - .../resources/asset/demo/combobox/group.html | 33 - .../resources/asset/demo/combobox/icons.html | 36 - .../asset/demo/combobox/itemicon.html | 35 - .../asset/demo/combobox/multiline.html | 75 - .../asset/demo/combobox/multiple.html | 32 - .../asset/demo/combobox/navigation.html | 77 - .../asset/demo/combobox/remotedata.html | 30 - .../asset/demo/combobox/remotejsonp.html | 54 - .../asset/demo/combogrid/actions.html | 60 - .../resources/asset/demo/combogrid/basic.html | 40 - .../asset/demo/combogrid/datagrid_data1.json | 12 - .../resources/asset/demo/combogrid/fluid.html | 63 - .../asset/demo/combogrid/initvalue.html | 41 - .../asset/demo/combogrid/multiple.html | 42 - .../asset/demo/combogrid/navigation.html | 43 - .../asset/demo/combogrid/setvalue.html | 59 - .../asset/demo/combotree/actions.html | 43 - .../resources/asset/demo/combotree/basic.html | 22 - .../resources/asset/demo/combotree/fluid.html | 25 - .../asset/demo/combotree/initvalue.html | 22 - .../asset/demo/combotree/multiple.html | 26 - .../asset/demo/combotree/tree_data1.json | 49 - .../asset/demo/combotreegrid/basic.html | 34 - .../asset/demo/combotreegrid/multiple.html | 36 - .../demo/combotreegrid/treegrid_data1.json | 73 - .../asset/demo/datagrid/aligncolumns.html | 32 - .../resources/asset/demo/datagrid/basic.html | 32 - .../asset/demo/datagrid/cacheeditor.html | 149 - .../asset/demo/datagrid/cellediting.html | 94 - .../asset/demo/datagrid/cellstyle.html | 42 - .../asset/demo/datagrid/checkbox.html | 42 - .../asset/demo/datagrid/clientpagination.html | 160 - .../asset/demo/datagrid/columngroup.html | 34 - .../asset/demo/datagrid/complextoolbar.html | 50 - .../asset/demo/datagrid/contextmenu.html | 89 - .../asset/demo/datagrid/custompager.html | 53 - .../asset/demo/datagrid/datagrid_data1.json | 12 - .../asset/demo/datagrid/datagrid_data2.json | 15 - .../resources/asset/demo/datagrid/fluid.html | 32 - .../resources/asset/demo/datagrid/footer.html | 38 - .../asset/demo/datagrid/formatcolumns.html | 39 - .../asset/demo/datagrid/frozencolumns.html | 35 - .../asset/demo/datagrid/frozenrows.html | 44 - .../asset/demo/datagrid/mergecells.html | 58 - .../asset/demo/datagrid/multisorting.html | 37 - .../asset/demo/datagrid/products.json | 9 - .../asset/demo/datagrid/rowborder.html | 60 - .../asset/demo/datagrid/rowediting.html | 125 - .../asset/demo/datagrid/rowstyle.html | 41 - .../asset/demo/datagrid/selection.html | 57 - .../asset/demo/datagrid/simpletoolbar.html | 45 - .../asset/demo/datagrid/transform.html | 46 - .../resources/asset/demo/datalist/basic.html | 69 - .../asset/demo/datalist/checkbox.html | 25 - .../asset/demo/datalist/datalist_data1.json | 18 - .../resources/asset/demo/datalist/group.html | 23 - .../asset/demo/datalist/multiselect.html | 23 - .../asset/demo/datalist/remotedata.html | 22 - .../resources/asset/demo/datebox/basic.html | 25 - .../resources/asset/demo/datebox/buttons.html | 34 - .../resources/asset/demo/datebox/clone.html | 31 - .../asset/demo/datebox/dateformat.html | 45 - .../resources/asset/demo/datebox/events.html | 31 - .../resources/asset/demo/datebox/fluid.html | 25 - .../asset/demo/datebox/restrict.html | 34 - .../asset/demo/datebox/sharedcalendar.html | 26 - .../asset/demo/datebox/validate.html | 37 - .../asset/demo/datetimebox/basic.html | 25 - .../asset/demo/datetimebox/fluid.html | 25 - .../asset/demo/datetimebox/initvalue.html | 22 - .../asset/demo/datetimebox/showseconds.html | 25 - .../asset/demo/datetimespinner/basic.html | 25 - .../asset/demo/datetimespinner/clearicon.html | 33 - .../asset/demo/datetimespinner/fluid.html | 25 - .../asset/demo/datetimespinner/format.html | 55 - .../src/main/resources/asset/demo/demo.css | 24 - .../resources/asset/demo/dialog/basic.html | 23 - .../asset/demo/dialog/complextoolbar.html | 46 - .../resources/asset/demo/dialog/fluid.html | 24 - .../asset/demo/dialog/toolbarbuttons.html | 52 - .../resources/asset/demo/draggable/basic.html | 21 - .../asset/demo/draggable/constrain.html | 35 - .../resources/asset/demo/draggable/snap.html | 37 - .../asset/demo/droppable/accept.html | 78 - .../resources/asset/demo/droppable/basic.html | 77 - .../resources/asset/demo/droppable/sort.html | 71 - .../asset/demo/easyloader/basic.html | 75 - .../resources/asset/demo/filebox/basic.html | 31 - .../asset/demo/filebox/buttonalign.html | 32 - .../resources/asset/demo/filebox/fluid.html | 25 - .../main/resources/asset/demo/form/basic.html | 48 - .../resources/asset/demo/form/form_data1.json | 8 - .../main/resources/asset/demo/form/load.html | 62 - .../asset/demo/form/validateonsubmit.html | 52 - .../resources/asset/demo/layout/_content.html | 18 - .../asset/demo/layout/addremove.html | 53 - .../asset/demo/layout/autoheight.html | 59 - .../resources/asset/demo/layout/basic.html | 39 - .../asset/demo/layout/collapsetitle.html | 39 - .../resources/asset/demo/layout/complex.html | 57 - .../demo/layout/customcollapsetitle.html | 51 - .../asset/demo/layout/datagrid_data1.json | 12 - .../resources/asset/demo/layout/fluid.html | 24 - .../resources/asset/demo/layout/full.html | 19 - .../asset/demo/layout/nestedlayout.html | 31 - .../asset/demo/layout/nocollapsible.html | 34 - .../asset/demo/layout/propertygrid_data1.json | 20 - .../asset/demo/layout/tree_data1.json | 49 - .../asset/demo/linkbutton/basic.html | 33 - .../asset/demo/linkbutton/fluid.html | 33 - .../asset/demo/linkbutton/group.html | 33 - .../asset/demo/linkbutton/iconalign.html | 32 - .../asset/demo/linkbutton/plain.html | 28 - .../resources/asset/demo/linkbutton/size.html | 34 - .../asset/demo/linkbutton/style.html | 31 - .../asset/demo/linkbutton/toggle.html | 25 - .../resources/asset/demo/maskedbox/basic.html | 30 - .../main/resources/asset/demo/menu/basic.html | 68 - .../resources/asset/demo/menu/customitem.html | 50 - .../resources/asset/demo/menu/events.html | 40 - .../resources/asset/demo/menu/inline.html | 59 - .../main/resources/asset/demo/menu/nav.html | 146 - .../asset/demo/menubutton/actions.html | 58 - .../asset/demo/menubutton/alignment.html | 69 - .../asset/demo/menubutton/basic.html | 54 - .../resources/asset/demo/menubutton/nav.html | 166 - .../resources/asset/demo/messager/alert.html | 40 - .../resources/asset/demo/messager/basic.html | 56 - .../asset/demo/messager/interactive.html | 36 - .../asset/demo/messager/position.html | 140 - .../resources/asset/demo/numberbox/basic.html | 29 - .../resources/asset/demo/numberbox/fluid.html | 26 - .../asset/demo/numberbox/format.html | 34 - .../resources/asset/demo/numberbox/range.html | 28 - .../asset/demo/numberspinner/align.html | 31 - .../asset/demo/numberspinner/basic.html | 27 - .../asset/demo/numberspinner/fluid.html | 25 - .../asset/demo/numberspinner/increment.html | 28 - .../asset/demo/numberspinner/range.html | 25 - .../asset/demo/pagination/attaching.html | 32 - .../asset/demo/pagination/basic.html | 20 - .../asset/demo/pagination/custombuttons.html | 38 - .../asset/demo/pagination/layout.html | 62 - .../asset/demo/pagination/links.html | 23 - .../asset/demo/pagination/simple.html | 25 - .../resources/asset/demo/panel/_content.html | 18 - .../resources/asset/demo/panel/basic.html | 31 - .../asset/demo/panel/customtools.html | 35 - .../resources/asset/demo/panel/fluid.html | 21 - .../resources/asset/demo/panel/footer.html | 22 - .../resources/asset/demo/panel/halign.html | 26 - .../asset/demo/panel/loadcontent.html | 27 - .../asset/demo/panel/nestedpanel.html | 30 - .../asset/demo/panel/paneltools.html | 37 - .../asset/demo/passwordbox/basic.html | 25 - .../asset/demo/passwordbox/flash.html | 48 - .../demo/passwordbox/validatepassword.html | 40 - .../asset/demo/progressbar/basic.html | 30 - .../asset/demo/progressbar/fluid.html | 21 - .../asset/demo/propertygrid/basic.html | 61 - .../demo/propertygrid/customcolumns.html | 31 - .../asset/demo/propertygrid/groupformat.html | 30 - .../demo/propertygrid/propertygrid_data1.json | 20 - .../resources/asset/demo/resizable/basic.html | 24 - .../resources/asset/demo/searchbox/basic.html | 25 - .../asset/demo/searchbox/category.html | 30 - .../resources/asset/demo/searchbox/fluid.html | 29 - .../resources/asset/demo/sidemenu/basic.html | 58 - .../resources/asset/demo/sidemenu/style.css | 63 - .../resources/asset/demo/sidemenu/style.html | 70 - .../resources/asset/demo/slider/basic.html | 18 - .../resources/asset/demo/slider/fluid.html | 21 - .../asset/demo/slider/formattip.html | 28 - .../asset/demo/slider/nonlinear.html | 58 - .../resources/asset/demo/slider/range.html | 23 - .../resources/asset/demo/slider/rule.html | 21 - .../resources/asset/demo/slider/vertical.html | 25 - .../asset/demo/splitbutton/actions.html | 64 - .../asset/demo/splitbutton/basic.html | 61 - .../asset/demo/switchbutton/action.html | 24 - .../asset/demo/switchbutton/basic.html | 32 - .../resources/asset/demo/tabs/_content.html | 18 - .../resources/asset/demo/tabs/autoheight.html | 36 - .../main/resources/asset/demo/tabs/basic.html | 36 - .../resources/asset/demo/tabs/dropdown.html | 55 - .../resources/asset/demo/tabs/fixedwidth.html | 37 - .../main/resources/asset/demo/tabs/fluid.html | 24 - .../main/resources/asset/demo/tabs/hover.html | 46 - .../asset/demo/tabs/images/modem.png | Bin 1633 -> 0 bytes .../resources/asset/demo/tabs/images/pda.png | Bin 1787 -> 0 bytes .../asset/demo/tabs/images/scanner.png | Bin 2600 -> 0 bytes .../asset/demo/tabs/images/tablet.png | Bin 2505 -> 0 bytes .../resources/asset/demo/tabs/nestedtabs.html | 54 - .../resources/asset/demo/tabs/striptools.html | 39 - .../main/resources/asset/demo/tabs/style.html | 51 - .../resources/asset/demo/tabs/tabimage.html | 41 - .../asset/demo/tabs/tabposition.html | 45 - .../resources/asset/demo/tabs/tabstools.html | 41 - .../resources/asset/demo/tabs/tree_data1.json | 49 - .../asset/demo/tagbox/autocomplete.html | 29 - .../resources/asset/demo/tagbox/basic.html | 20 - .../resources/asset/demo/tagbox/button.html | 25 - .../resources/asset/demo/tagbox/format.html | 24 - .../resources/asset/demo/tagbox/style.html | 35 - .../asset/demo/tagbox/tagbox_data1.json | 21 - .../resources/asset/demo/tagbox/validate.html | 34 - .../resources/asset/demo/textbox/basic.html | 35 - .../resources/asset/demo/textbox/button.html | 25 - .../asset/demo/textbox/clearicon.html | 68 - .../resources/asset/demo/textbox/custom.html | 34 - .../resources/asset/demo/textbox/fluid.html | 25 - .../resources/asset/demo/textbox/icons.html | 51 - .../asset/demo/textbox/multiline.html | 25 - .../resources/asset/demo/textbox/size.html | 31 - .../asset/demo/timespinner/actions.html | 42 - .../asset/demo/timespinner/basic.html | 25 - .../asset/demo/timespinner/fluid.html | 25 - .../asset/demo/timespinner/range.html | 24 - .../asset/demo/tooltip/_content.html | 18 - .../resources/asset/demo/tooltip/_dialog.html | 23 - .../resources/asset/demo/tooltip/ajax.html | 32 - .../resources/asset/demo/tooltip/basic.html | 20 - .../asset/demo/tooltip/customcontent.html | 32 - .../asset/demo/tooltip/customstyle.html | 52 - .../asset/demo/tooltip/position.html | 34 - .../resources/asset/demo/tooltip/toolbar.html | 40 - .../asset/demo/tooltip/tooltipdialog.html | 44 - .../resources/asset/demo/tree/actions.html | 47 - .../resources/asset/demo/tree/animation.html | 20 - .../main/resources/asset/demo/tree/basic.html | 53 - .../resources/asset/demo/tree/checkbox.html | 37 - .../asset/demo/tree/contextmenu.html | 65 - .../asset/demo/tree/customcheckbox.html | 29 - .../main/resources/asset/demo/tree/dnd.html | 20 - .../resources/asset/demo/tree/editable.html | 27 - .../resources/asset/demo/tree/formatting.html | 32 - .../main/resources/asset/demo/tree/icons.html | 20 - .../resources/asset/demo/tree/lazyload.html | 82 - .../main/resources/asset/demo/tree/lines.html | 20 - .../resources/asset/demo/tree/tree_data1.json | 49 - .../resources/asset/demo/tree/tree_data2.json | 61 - .../asset/demo/treegrid/actions.html | 64 - .../resources/asset/demo/treegrid/basic.html | 34 - .../asset/demo/treegrid/checkbox.html | 35 - .../asset/demo/treegrid/clientpagination.html | 189 - .../asset/demo/treegrid/contextmenu.html | 106 - .../asset/demo/treegrid/customcheckbox.html | 40 - .../asset/demo/treegrid/editable.html | 93 - .../resources/asset/demo/treegrid/fluid.html | 33 - .../resources/asset/demo/treegrid/footer.html | 55 - .../resources/asset/demo/treegrid/lines.html | 35 - .../asset/demo/treegrid/reports.html | 49 - .../asset/demo/treegrid/treegrid_data1.json | 73 - .../asset/demo/treegrid/treegrid_data2.json | 11 - .../asset/demo/treegrid/treegrid_data3.json | 13 - .../asset/demo/validatebox/basic.html | 45 - .../asset/demo/validatebox/customtooltip.html | 56 - .../demo/validatebox/errorplacement.html | 62 - .../demo/validatebox/validateonblur.html | 45 - .../resources/asset/demo/window/basic.html | 23 - .../asset/demo/window/borderstyle.html | 53 - .../asset/demo/window/customtools.html | 30 - .../resources/asset/demo/window/fluid.html | 24 - .../resources/asset/demo/window/footer.html | 24 - .../asset/demo/window/inlinewindow.html | 26 - .../asset/demo/window/modalwindow.html | 24 - .../asset/demo/window/windowlayout.html | 33 - .../src/main/resources/asset/easyloader.js | 190 - .../main/resources/asset/jquery.easyui.min.js | 16776 ---------------- .../resources/asset/jquery.easyui.mobile.js | 141 - .../src/main/resources/asset/jquery.min.js | 5 - .../main/resources/asset/license_freeware.txt | 14 - .../resources/asset/locale/easyui-lang-af.js | 44 - .../resources/asset/locale/easyui-lang-am.js | 46 - .../resources/asset/locale/easyui-lang-ar.js | 45 - .../resources/asset/locale/easyui-lang-bg.js | 44 - .../resources/asset/locale/easyui-lang-ca.js | 44 - .../resources/asset/locale/easyui-lang-cs.js | 44 - .../resources/asset/locale/easyui-lang-cz.js | 44 - .../resources/asset/locale/easyui-lang-da.js | 44 - .../resources/asset/locale/easyui-lang-de.js | 63 - .../resources/asset/locale/easyui-lang-el.js | 45 - .../resources/asset/locale/easyui-lang-en.js | 45 - .../resources/asset/locale/easyui-lang-es.js | 45 - .../resources/asset/locale/easyui-lang-fa.js | 45 - .../resources/asset/locale/easyui-lang-fr.js | 62 - .../resources/asset/locale/easyui-lang-it.js | 64 - .../resources/asset/locale/easyui-lang-jp.js | 45 - .../resources/asset/locale/easyui-lang-ko.js | 45 - .../resources/asset/locale/easyui-lang-nl.js | 44 - .../resources/asset/locale/easyui-lang-pl.js | 45 - .../asset/locale/easyui-lang-pt_BR.js | 45 - .../resources/asset/locale/easyui-lang-ru.js | 46 - .../asset/locale/easyui-lang-sv_SE.js | 45 - .../resources/asset/locale/easyui-lang-tr.js | 59 - .../resources/asset/locale/easyui-lang-ua.js | 46 - .../asset/locale/easyui-lang-zh_CN.js | 66 - .../asset/locale/easyui-lang-zh_TW.js | 48 - .../asset/plugins/jquery.accordion.js | 350 - .../asset/plugins/jquery.calendar.js | 403 - .../resources/asset/plugins/jquery.combo.js | 404 - .../asset/plugins/jquery.combobox.js | 611 - .../asset/plugins/jquery.combogrid.js | 351 - .../asset/plugins/jquery.combotree.js | 237 - .../asset/plugins/jquery.combotreegrid.js | 317 - .../asset/plugins/jquery.datagrid.js | 2580 --- .../asset/plugins/jquery.datalist.js | 136 - .../resources/asset/plugins/jquery.datebox.js | 215 - .../asset/plugins/jquery.datetimebox.js | 179 - .../asset/plugins/jquery.datetimespinner.js | 61 - .../resources/asset/plugins/jquery.dialog.js | 136 - .../asset/plugins/jquery.draggable.js | 306 - .../asset/plugins/jquery.droppable.js | 62 - .../resources/asset/plugins/jquery.filebox.js | 100 - .../resources/asset/plugins/jquery.form.js | 410 - .../resources/asset/plugins/jquery.layout.js | 519 - .../asset/plugins/jquery.linkbutton.js | 184 - .../asset/plugins/jquery.maskedbox.js | 221 - .../resources/asset/plugins/jquery.menu.js | 502 - .../asset/plugins/jquery.menubutton.js | 123 - .../asset/plugins/jquery.messager.js | 186 - .../resources/asset/plugins/jquery.mobile.js | 141 - .../asset/plugins/jquery.numberbox.js | 184 - .../asset/plugins/jquery.numberspinner.js | 58 - .../asset/plugins/jquery.pagination.js | 296 - .../resources/asset/plugins/jquery.panel.js | 691 - .../resources/asset/plugins/jquery.parser.js | 386 - .../asset/plugins/jquery.passwordbox.js | 156 - .../asset/plugins/jquery.progressbar.js | 84 - .../asset/plugins/jquery.propertygrid.js | 427 - .../asset/plugins/jquery.resizable.js | 173 - .../asset/plugins/jquery.searchbox.js | 132 - .../asset/plugins/jquery.sidemenu.js | 226 - .../resources/asset/plugins/jquery.slider.js | 347 - .../resources/asset/plugins/jquery.spinner.js | 128 - .../asset/plugins/jquery.splitbutton.js | 49 - .../asset/plugins/jquery.switchbutton.js | 193 - .../resources/asset/plugins/jquery.tabs.js | 716 - .../resources/asset/plugins/jquery.tagbox.js | 223 - .../resources/asset/plugins/jquery.textbox.js | 566 - .../asset/plugins/jquery.timespinner.js | 149 - .../resources/asset/plugins/jquery.tooltip.js | 238 - .../resources/asset/plugins/jquery.tree.js | 1247 -- .../asset/plugins/jquery.treegrid.js | 1353 -- .../asset/plugins/jquery.validatebox.js | 310 - .../resources/asset/plugins/jquery.window.js | 311 - .../src/main/resources/asset/readme.txt | 4 - .../main/resources/asset/src/easyloader.js | 439 - .../resources/asset/src/jquery.accordion.js | 493 - .../resources/asset/src/jquery.calendar.js | 455 - .../resources/asset/src/jquery.combobox.js | 742 - .../resources/asset/src/jquery.datebox.js | 288 - .../resources/asset/src/jquery.draggable.js | 399 - .../resources/asset/src/jquery.droppable.js | 81 - .../main/resources/asset/src/jquery.form.js | 492 - .../resources/asset/src/jquery.linkbutton.js | 243 - .../main/resources/asset/src/jquery.menu.js | 648 - .../main/resources/asset/src/jquery.parser.js | 431 - .../resources/asset/src/jquery.progressbar.js | 107 - .../asset/src/jquery.propertygrid.js | 525 - .../resources/asset/src/jquery.resizable.js | 228 - .../main/resources/asset/src/jquery.slider.js | 455 - .../main/resources/asset/src/jquery.tabs.js | 927 - .../main/resources/asset/src/jquery.window.js | 417 - .../main/resources/asset/themes/angular.css | 639 - .../asset/themes/black/accordion.css | 89 - .../resources/asset/themes/black/calendar.css | 203 - .../resources/asset/themes/black/checkbox.css | 31 - .../resources/asset/themes/black/combo.css | 35 - .../resources/asset/themes/black/combobox.css | 40 - .../resources/asset/themes/black/datagrid.css | 291 - .../resources/asset/themes/black/datalist.css | 95 - .../resources/asset/themes/black/datebox.css | 36 - .../resources/asset/themes/black/dialog.css | 47 - .../resources/asset/themes/black/easyui.css | 3427 ---- .../resources/asset/themes/black/filebox.css | 20 - .../themes/black/images/accordion_arrows.png | Bin 122 -> 0 bytes .../asset/themes/black/images/blank.gif | Bin 43 -> 0 bytes .../themes/black/images/calendar_arrows.png | Bin 173 -> 0 bytes .../asset/themes/black/images/combo_arrow.png | Bin 100 -> 0 bytes .../themes/black/images/datagrid_icons.png | Bin 300 -> 0 bytes .../themes/black/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/black/images/layout_arrows.png | Bin 179 -> 0 bytes .../themes/black/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../asset/themes/black/images/loading.gif | Bin 1737 -> 0 bytes .../asset/themes/black/images/menu_arrows.png | Bin 134 -> 0 bytes .../themes/black/images/messager_icons.png | Bin 6116 -> 0 bytes .../themes/black/images/pagination_icons.png | Bin 339 -> 0 bytes .../asset/themes/black/images/panel_tools.png | Bin 184 -> 0 bytes .../themes/black/images/passwordbox_close.png | Bin 149 -> 0 bytes .../themes/black/images/passwordbox_open.png | Bin 160 -> 0 bytes .../themes/black/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/black/images/slider_handle.png | Bin 863 -> 0 bytes .../themes/black/images/spinner_arrows.png | Bin 140 -> 0 bytes .../asset/themes/black/images/tabs_icons.png | Bin 144 -> 0 bytes .../themes/black/images/tagbox_icons.png | Bin 133 -> 0 bytes .../asset/themes/black/images/tree_icons.png | Bin 3086 -> 0 bytes .../black/images/validatebox_warning.png | Bin 921 -> 0 bytes .../resources/asset/themes/black/layout.css | 150 - .../asset/themes/black/linkbutton.css | 203 - .../resources/asset/themes/black/menu.css | 119 - .../asset/themes/black/menubutton.css | 94 - .../resources/asset/themes/black/messager.css | 44 - .../asset/themes/black/numberbox.css | 0 .../asset/themes/black/pagination.css | 77 - .../resources/asset/themes/black/panel.css | 267 - .../asset/themes/black/passwordbox.css | 6 - .../asset/themes/black/progressbar.css | 33 - .../asset/themes/black/propertygrid.css | 27 - .../asset/themes/black/radiobutton.css | 25 - .../asset/themes/black/searchbox.css | 61 - .../resources/asset/themes/black/sidemenu.css | 69 - .../resources/asset/themes/black/slider.css | 101 - .../resources/asset/themes/black/spinner.css | 114 - .../asset/themes/black/splitbutton.css | 12 - .../asset/themes/black/switchbutton.css | 77 - .../resources/asset/themes/black/tabs.css | 413 - .../resources/asset/themes/black/tagbox.css | 44 - .../resources/asset/themes/black/textbox.css | 144 - .../resources/asset/themes/black/tooltip.css | 103 - .../resources/asset/themes/black/tree.css | 164 - .../asset/themes/black/validatebox.css | 5 - .../resources/asset/themes/black/window.css | 188 - .../asset/themes/bootstrap/accordion.css | 89 - .../asset/themes/bootstrap/calendar.css | 203 - .../asset/themes/bootstrap/checkbox.css | 31 - .../asset/themes/bootstrap/combo.css | 35 - .../asset/themes/bootstrap/combobox.css | 40 - .../asset/themes/bootstrap/datagrid.css | 291 - .../asset/themes/bootstrap/datalist.css | 95 - .../asset/themes/bootstrap/datebox.css | 36 - .../asset/themes/bootstrap/dialog.css | 47 - .../asset/themes/bootstrap/easyui.css | 3446 ---- .../asset/themes/bootstrap/filebox.css | 20 - .../bootstrap/images/accordion_arrows.png | Bin 184 -> 0 bytes .../asset/themes/bootstrap/images/blank.gif | Bin 43 -> 0 bytes .../bootstrap/images/calendar_arrows.png | Bin 173 -> 0 bytes .../themes/bootstrap/images/combo_arrow.png | Bin 117 -> 0 bytes .../bootstrap/images/datagrid_icons.png | Bin 307 -> 0 bytes .../themes/bootstrap/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/bootstrap/images/layout_arrows.png | Bin 319 -> 0 bytes .../themes/bootstrap/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../asset/themes/bootstrap/images/loading.gif | Bin 1737 -> 0 bytes .../themes/bootstrap/images/menu_arrows.png | Bin 160 -> 0 bytes .../bootstrap/images/messager_icons.png | Bin 6116 -> 0 bytes .../bootstrap/images/pagination_icons.png | Bin 628 -> 0 bytes .../themes/bootstrap/images/panel_tools.png | Bin 194 -> 0 bytes .../bootstrap/images/passwordbox_close.png | Bin 159 -> 0 bytes .../bootstrap/images/passwordbox_open.png | Bin 165 -> 0 bytes .../bootstrap/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/bootstrap/images/slider_handle.png | Bin 863 -> 0 bytes .../bootstrap/images/spinner_arrows.png | Bin 149 -> 0 bytes .../themes/bootstrap/images/tabs_icons.png | Bin 150 -> 0 bytes .../themes/bootstrap/images/tagbox_icons.png | Bin 134 -> 0 bytes .../themes/bootstrap/images/tree_icons.png | Bin 3115 -> 0 bytes .../bootstrap/images/validatebox_warning.png | Bin 921 -> 0 bytes .../asset/themes/bootstrap/layout.css | 150 - .../asset/themes/bootstrap/linkbutton.css | 203 - .../resources/asset/themes/bootstrap/menu.css | 119 - .../asset/themes/bootstrap/menubutton.css | 94 - .../asset/themes/bootstrap/messager.css | 44 - .../asset/themes/bootstrap/numberbox.css | 0 .../asset/themes/bootstrap/pagination.css | 77 - .../asset/themes/bootstrap/panel.css | 267 - .../asset/themes/bootstrap/passwordbox.css | 6 - .../asset/themes/bootstrap/progressbar.css | 33 - .../asset/themes/bootstrap/propertygrid.css | 27 - .../asset/themes/bootstrap/radiobutton.css | 25 - .../asset/themes/bootstrap/searchbox.css | 61 - .../asset/themes/bootstrap/sidemenu.css | 69 - .../asset/themes/bootstrap/slider.css | 101 - .../asset/themes/bootstrap/spinner.css | 114 - .../asset/themes/bootstrap/splitbutton.css | 12 - .../asset/themes/bootstrap/switchbutton.css | 77 - .../resources/asset/themes/bootstrap/tabs.css | 413 - .../asset/themes/bootstrap/tagbox.css | 44 - .../asset/themes/bootstrap/textbox.css | 144 - .../asset/themes/bootstrap/tooltip.css | 103 - .../resources/asset/themes/bootstrap/tree.css | 164 - .../asset/themes/bootstrap/validatebox.css | 5 - .../asset/themes/bootstrap/window.css | 188 - .../src/main/resources/asset/themes/color.css | 210 - .../asset/themes/default/accordion.css | 89 - .../asset/themes/default/calendar.css | 203 - .../asset/themes/default/checkbox.css | 31 - .../resources/asset/themes/default/combo.css | 35 - .../asset/themes/default/combobox.css | 40 - .../asset/themes/default/datagrid.css | 291 - .../asset/themes/default/datalist.css | 95 - .../asset/themes/default/datebox.css | 36 - .../resources/asset/themes/default/dialog.css | 47 - .../resources/asset/themes/default/easyui.css | 3427 ---- .../asset/themes/default/filebox.css | 20 - .../default/images/accordion_arrows.png | Bin 184 -> 0 bytes .../asset/themes/default/images/blank.gif | Bin 43 -> 0 bytes .../themes/default/images/calendar_arrows.png | Bin 173 -> 0 bytes .../themes/default/images/combo_arrow.png | Bin 117 -> 0 bytes .../themes/default/images/datagrid_icons.png | Bin 307 -> 0 bytes .../themes/default/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/default/images/layout_arrows.png | Bin 319 -> 0 bytes .../themes/default/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../asset/themes/default/images/loading.gif | Bin 1737 -> 0 bytes .../themes/default/images/menu_arrows.png | Bin 160 -> 0 bytes .../themes/default/images/messager_icons.png | Bin 6116 -> 0 bytes .../default/images/pagination_icons.png | Bin 628 -> 0 bytes .../themes/default/images/panel_tools.png | Bin 852 -> 0 bytes .../default/images/passwordbox_close.png | Bin 159 -> 0 bytes .../default/images/passwordbox_open.png | Bin 165 -> 0 bytes .../default/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/default/images/slider_handle.png | Bin 863 -> 0 bytes .../themes/default/images/spinner_arrows.png | Bin 149 -> 0 bytes .../themes/default/images/tabs_icons.png | Bin 150 -> 0 bytes .../themes/default/images/tagbox_icons.png | Bin 134 -> 0 bytes .../themes/default/images/tree_icons.png | Bin 3115 -> 0 bytes .../default/images/validatebox_warning.png | Bin 921 -> 0 bytes .../resources/asset/themes/default/layout.css | 150 - .../asset/themes/default/linkbutton.css | 203 - .../resources/asset/themes/default/menu.css | 119 - .../asset/themes/default/menubutton.css | 94 - .../asset/themes/default/messager.css | 44 - .../asset/themes/default/numberbox.css | 0 .../asset/themes/default/pagination.css | 77 - .../resources/asset/themes/default/panel.css | 267 - .../asset/themes/default/passwordbox.css | 6 - .../asset/themes/default/progressbar.css | 33 - .../asset/themes/default/propertygrid.css | 27 - .../asset/themes/default/radiobutton.css | 25 - .../asset/themes/default/searchbox.css | 61 - .../asset/themes/default/sidemenu.css | 69 - .../resources/asset/themes/default/slider.css | 101 - .../asset/themes/default/spinner.css | 114 - .../asset/themes/default/splitbutton.css | 12 - .../asset/themes/default/switchbutton.css | 77 - .../resources/asset/themes/default/tabs.css | 413 - .../resources/asset/themes/default/tagbox.css | 44 - .../asset/themes/default/textbox.css | 144 - .../asset/themes/default/tooltip.css | 103 - .../resources/asset/themes/default/tree.css | 164 - .../asset/themes/default/validatebox.css | 5 - .../resources/asset/themes/default/window.css | 188 - .../resources/asset/themes/gray/accordion.css | 89 - .../resources/asset/themes/gray/calendar.css | 203 - .../resources/asset/themes/gray/checkbox.css | 31 - .../resources/asset/themes/gray/combo.css | 35 - .../resources/asset/themes/gray/combobox.css | 40 - .../resources/asset/themes/gray/datagrid.css | 291 - .../resources/asset/themes/gray/datalist.css | 95 - .../resources/asset/themes/gray/datebox.css | 36 - .../resources/asset/themes/gray/dialog.css | 47 - .../resources/asset/themes/gray/easyui.css | 3427 ---- .../resources/asset/themes/gray/filebox.css | 20 - .../themes/gray/images/accordion_arrows.png | Bin 125 -> 0 bytes .../asset/themes/gray/images/blank.gif | Bin 43 -> 0 bytes .../themes/gray/images/calendar_arrows.png | Bin 173 -> 0 bytes .../asset/themes/gray/images/combo_arrow.png | Bin 103 -> 0 bytes .../themes/gray/images/datagrid_icons.png | Bin 330 -> 0 bytes .../themes/gray/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/gray/images/layout_arrows.png | Bin 181 -> 0 bytes .../themes/gray/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../asset/themes/gray/images/loading.gif | Bin 1737 -> 0 bytes .../asset/themes/gray/images/menu_arrows.png | Bin 160 -> 0 bytes .../themes/gray/images/messager_icons.png | Bin 6116 -> 0 bytes .../themes/gray/images/pagination_icons.png | Bin 466 -> 0 bytes .../asset/themes/gray/images/panel_tools.png | Bin 191 -> 0 bytes .../themes/gray/images/passwordbox_close.png | Bin 149 -> 0 bytes .../themes/gray/images/passwordbox_open.png | Bin 160 -> 0 bytes .../themes/gray/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/gray/images/slider_handle.png | Bin 863 -> 0 bytes .../themes/gray/images/spinner_arrows.png | Bin 149 -> 0 bytes .../asset/themes/gray/images/tabs_icons.png | Bin 144 -> 0 bytes .../asset/themes/gray/images/tagbox_icons.png | Bin 133 -> 0 bytes .../asset/themes/gray/images/tree_icons.png | Bin 3115 -> 0 bytes .../gray/images/validatebox_warning.png | Bin 921 -> 0 bytes .../resources/asset/themes/gray/layout.css | 150 - .../asset/themes/gray/linkbutton.css | 203 - .../main/resources/asset/themes/gray/menu.css | 119 - .../asset/themes/gray/menubutton.css | 94 - .../resources/asset/themes/gray/messager.css | 44 - .../resources/asset/themes/gray/numberbox.css | 0 .../asset/themes/gray/pagination.css | 77 - .../resources/asset/themes/gray/panel.css | 267 - .../asset/themes/gray/passwordbox.css | 6 - .../asset/themes/gray/progressbar.css | 33 - .../asset/themes/gray/propertygrid.css | 27 - .../asset/themes/gray/radiobutton.css | 25 - .../resources/asset/themes/gray/searchbox.css | 61 - .../resources/asset/themes/gray/sidemenu.css | 69 - .../resources/asset/themes/gray/slider.css | 101 - .../resources/asset/themes/gray/spinner.css | 114 - .../asset/themes/gray/splitbutton.css | 12 - .../asset/themes/gray/switchbutton.css | 77 - .../main/resources/asset/themes/gray/tabs.css | 413 - .../resources/asset/themes/gray/tagbox.css | 44 - .../resources/asset/themes/gray/textbox.css | 144 - .../resources/asset/themes/gray/tooltip.css | 103 - .../main/resources/asset/themes/gray/tree.css | 164 - .../asset/themes/gray/validatebox.css | 5 - .../resources/asset/themes/gray/window.css | 188 - .../src/main/resources/asset/themes/icon.css | 96 - .../resources/asset/themes/icons/back.png | Bin 912 -> 0 bytes .../resources/asset/themes/icons/blank.gif | Bin 43 -> 0 bytes .../resources/asset/themes/icons/cancel.png | Bin 1133 -> 0 bytes .../resources/asset/themes/icons/clear.png | Bin 779 -> 0 bytes .../main/resources/asset/themes/icons/cut.png | Bin 1024 -> 0 bytes .../resources/asset/themes/icons/edit_add.png | Bin 1088 -> 0 bytes .../asset/themes/icons/edit_remove.png | Bin 625 -> 0 bytes .../resources/asset/themes/icons/filesave.png | Bin 898 -> 0 bytes .../resources/asset/themes/icons/filter.png | Bin 305 -> 0 bytes .../resources/asset/themes/icons/help.png | Bin 1187 -> 0 bytes .../asset/themes/icons/large_chart.png | Bin 1669 -> 0 bytes .../asset/themes/icons/large_clipart.png | Bin 1727 -> 0 bytes .../asset/themes/icons/large_picture.png | Bin 1667 -> 0 bytes .../asset/themes/icons/large_shapes.png | Bin 1318 -> 0 bytes .../asset/themes/icons/large_smartart.png | Bin 1336 -> 0 bytes .../resources/asset/themes/icons/lock.png | Bin 311 -> 0 bytes .../main/resources/asset/themes/icons/man.png | Bin 244 -> 0 bytes .../resources/asset/themes/icons/mini_add.png | Bin 244 -> 0 bytes .../asset/themes/icons/mini_edit.png | Bin 161 -> 0 bytes .../asset/themes/icons/mini_refresh.png | Bin 160 -> 0 bytes .../resources/asset/themes/icons/more.png | Bin 110 -> 0 bytes .../main/resources/asset/themes/icons/no.png | Bin 922 -> 0 bytes .../main/resources/asset/themes/icons/ok.png | Bin 883 -> 0 bytes .../resources/asset/themes/icons/pencil.png | Bin 713 -> 0 bytes .../resources/asset/themes/icons/print.png | Bin 1057 -> 0 bytes .../resources/asset/themes/icons/redo.png | Bin 708 -> 0 bytes .../resources/asset/themes/icons/reload.png | Bin 1045 -> 0 bytes .../resources/asset/themes/icons/search.png | Bin 813 -> 0 bytes .../main/resources/asset/themes/icons/sum.png | Bin 289 -> 0 bytes .../main/resources/asset/themes/icons/tip.png | Bin 743 -> 0 bytes .../resources/asset/themes/icons/undo.png | Bin 707 -> 0 bytes .../asset/themes/material-teal/accordion.css | 89 - .../asset/themes/material-teal/calendar.css | 203 - .../asset/themes/material-teal/checkbox.css | 31 - .../asset/themes/material-teal/combo.css | 35 - .../asset/themes/material-teal/combobox.css | 40 - .../asset/themes/material-teal/datagrid.css | 285 - .../asset/themes/material-teal/datalist.css | 95 - .../asset/themes/material-teal/datebox.css | 36 - .../asset/themes/material-teal/dialog.css | 47 - .../asset/themes/material-teal/easyui.css | 3549 ---- .../asset/themes/material-teal/filebox.css | 20 - .../themes/material-teal/images/Thumbs.db | Bin 35328 -> 0 bytes .../material-teal/images/accordion_arrows.png | Bin 121 -> 0 bytes .../themes/material-teal/images/blank.gif | Bin 43 -> 0 bytes .../material-teal/images/calendar_arrows.png | Bin 173 -> 0 bytes .../material-teal/images/combo_arrow.png | Bin 103 -> 0 bytes .../material-teal/images/datagrid_icons.png | Bin 330 -> 0 bytes .../material-teal/images/datebox_arrow.png | Bin 626 -> 0 bytes .../material-teal/images/layout_arrows.png | Bin 170 -> 0 bytes .../material-teal/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../themes/material-teal/images/loading.gif | Bin 1737 -> 0 bytes .../material-teal/images/menu_arrows.png | Bin 160 -> 0 bytes .../material-teal/images/messager_icons.png | Bin 6116 -> 0 bytes .../material-teal/images/pagination_icons.png | Bin 466 -> 0 bytes .../material-teal/images/panel_tools.png | Bin 191 -> 0 bytes .../images/passwordbox_close.png | Bin 149 -> 0 bytes .../material-teal/images/passwordbox_open.png | Bin 160 -> 0 bytes .../material-teal/images/searchbox_button.png | Bin 813 -> 0 bytes .../material-teal/images/slider_handle.png | Bin 863 -> 0 bytes .../material-teal/images/spinner_arrows.png | Bin 149 -> 0 bytes .../material-teal/images/tabs_icons.png | Bin 143 -> 0 bytes .../material-teal/images/tagbox_icons.png | Bin 133 -> 0 bytes .../material-teal/images/tree_icons.png | Bin 3115 -> 0 bytes .../images/validatebox_warning.png | Bin 921 -> 0 bytes .../asset/themes/material-teal/layout.css | 150 - .../asset/themes/material-teal/linkbutton.css | 191 - .../asset/themes/material-teal/menu.css | 119 - .../asset/themes/material-teal/menubutton.css | 94 - .../asset/themes/material-teal/messager.css | 44 - .../asset/themes/material-teal/numberbox.css | 0 .../asset/themes/material-teal/pagination.css | 77 - .../asset/themes/material-teal/panel.css | 261 - .../themes/material-teal/passwordbox.css | 6 - .../themes/material-teal/progressbar.css | 33 - .../themes/material-teal/propertygrid.css | 27 - .../themes/material-teal/radiobutton.css | 25 - .../asset/themes/material-teal/searchbox.css | 61 - .../asset/themes/material-teal/sidemenu.css | 69 - .../asset/themes/material-teal/slider.css | 101 - .../asset/themes/material-teal/spinner.css | 114 - .../themes/material-teal/splitbutton.css | 12 - .../themes/material-teal/switchbutton.css | 77 - .../asset/themes/material-teal/tabs.css | 377 - .../asset/themes/material-teal/tagbox.css | 44 - .../asset/themes/material-teal/textbox.css | 144 - .../asset/themes/material-teal/tooltip.css | 103 - .../asset/themes/material-teal/tree.css | 164 - .../themes/material-teal/validatebox.css | 5 - .../asset/themes/material-teal/window.css | 182 - .../asset/themes/material/accordion.css | 89 - .../asset/themes/material/calendar.css | 203 - .../asset/themes/material/checkbox.css | 31 - .../resources/asset/themes/material/combo.css | 35 - .../asset/themes/material/combobox.css | 40 - .../asset/themes/material/datagrid.css | 285 - .../asset/themes/material/datalist.css | 95 - .../asset/themes/material/datebox.css | 36 - .../asset/themes/material/dialog.css | 47 - .../asset/themes/material/easyui.css | 3436 ---- .../asset/themes/material/filebox.css | 20 - .../asset/themes/material/images/Thumbs.db | Bin 35328 -> 0 bytes .../material/images/accordion_arrows.png | Bin 121 -> 0 bytes .../asset/themes/material/images/blank.gif | Bin 43 -> 0 bytes .../material/images/calendar_arrows.png | Bin 173 -> 0 bytes .../themes/material/images/combo_arrow.png | Bin 103 -> 0 bytes .../themes/material/images/datagrid_icons.png | Bin 330 -> 0 bytes .../themes/material/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/material/images/layout_arrows.png | Bin 170 -> 0 bytes .../themes/material/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../asset/themes/material/images/loading.gif | Bin 1737 -> 0 bytes .../themes/material/images/menu_arrows.png | Bin 160 -> 0 bytes .../themes/material/images/messager_icons.png | Bin 6116 -> 0 bytes .../material/images/pagination_icons.png | Bin 466 -> 0 bytes .../themes/material/images/panel_tools.png | Bin 191 -> 0 bytes .../material/images/passwordbox_close.png | Bin 149 -> 0 bytes .../material/images/passwordbox_open.png | Bin 160 -> 0 bytes .../material/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/material/images/slider_handle.png | Bin 863 -> 0 bytes .../themes/material/images/spinner_arrows.png | Bin 149 -> 0 bytes .../themes/material/images/tabs_icons.png | Bin 143 -> 0 bytes .../themes/material/images/tagbox_icons.png | Bin 133 -> 0 bytes .../themes/material/images/tree_icons.png | Bin 3115 -> 0 bytes .../material/images/validatebox_warning.png | Bin 921 -> 0 bytes .../asset/themes/material/layout.css | 150 - .../asset/themes/material/linkbutton.css | 191 - .../resources/asset/themes/material/menu.css | 119 - .../asset/themes/material/menubutton.css | 94 - .../asset/themes/material/messager.css | 44 - .../asset/themes/material/numberbox.css | 0 .../asset/themes/material/pagination.css | 77 - .../resources/asset/themes/material/panel.css | 261 - .../asset/themes/material/passwordbox.css | 6 - .../asset/themes/material/progressbar.css | 33 - .../asset/themes/material/propertygrid.css | 27 - .../asset/themes/material/radiobutton.css | 25 - .../asset/themes/material/searchbox.css | 61 - .../asset/themes/material/sidemenu.css | 69 - .../asset/themes/material/slider.css | 101 - .../asset/themes/material/spinner.css | 114 - .../asset/themes/material/splitbutton.css | 12 - .../asset/themes/material/switchbutton.css | 77 - .../resources/asset/themes/material/tabs.css | 377 - .../asset/themes/material/tagbox.css | 44 - .../asset/themes/material/textbox.css | 144 - .../asset/themes/material/tooltip.css | 103 - .../resources/asset/themes/material/tree.css | 164 - .../asset/themes/material/validatebox.css | 5 - .../asset/themes/material/window.css | 182 - .../asset/themes/metro/accordion.css | 89 - .../resources/asset/themes/metro/calendar.css | 203 - .../resources/asset/themes/metro/checkbox.css | 31 - .../resources/asset/themes/metro/combo.css | 35 - .../resources/asset/themes/metro/combobox.css | 40 - .../resources/asset/themes/metro/datagrid.css | 285 - .../resources/asset/themes/metro/datalist.css | 95 - .../resources/asset/themes/metro/datebox.css | 36 - .../resources/asset/themes/metro/dialog.css | 47 - .../resources/asset/themes/metro/easyui.css | 3373 ---- .../resources/asset/themes/metro/filebox.css | 20 - .../themes/metro/images/accordion_arrows.png | Bin 184 -> 0 bytes .../asset/themes/metro/images/blank.gif | Bin 43 -> 0 bytes .../themes/metro/images/calendar_arrows.png | Bin 173 -> 0 bytes .../asset/themes/metro/images/combo_arrow.png | Bin 117 -> 0 bytes .../themes/metro/images/datagrid_icons.png | Bin 307 -> 0 bytes .../themes/metro/images/datebox_arrow.png | Bin 626 -> 0 bytes .../themes/metro/images/layout_arrows.png | Bin 319 -> 0 bytes .../themes/metro/images/linkbutton_bg.png | Bin 1274 -> 0 bytes .../asset/themes/metro/images/loading.gif | Bin 1737 -> 0 bytes .../asset/themes/metro/images/menu_arrows.png | Bin 160 -> 0 bytes .../themes/metro/images/messager_icons.png | Bin 6116 -> 0 bytes .../themes/metro/images/pagination_icons.png | Bin 628 -> 0 bytes .../asset/themes/metro/images/panel_tools.png | Bin 194 -> 0 bytes .../themes/metro/images/passwordbox_close.png | Bin 159 -> 0 bytes .../themes/metro/images/passwordbox_open.png | Bin 165 -> 0 bytes .../themes/metro/images/searchbox_button.png | Bin 813 -> 0 bytes .../themes/metro/images/slider_handle.png | Bin 863 -> 0 bytes .../themes/metro/images/spinner_arrows.png | Bin 149 -> 0 bytes .../asset/themes/metro/images/tabs_icons.png | Bin 150 -> 0 bytes .../themes/metro/images/tagbox_icons.png | Bin 134 -> 0 bytes .../asset/themes/metro/images/tree_icons.png | Bin 3115 -> 0 bytes .../metro/images/validatebox_warning.png | Bin 921 -> 0 bytes .../resources/asset/themes/metro/layout.css | 150 - .../asset/themes/metro/linkbutton.css | 203 - .../resources/asset/themes/metro/menu.css | 119 - .../asset/themes/metro/menubutton.css | 94 - .../resources/asset/themes/metro/messager.css | 44 - .../asset/themes/metro/numberbox.css | 0 .../asset/themes/metro/pagination.css | 77 - .../resources/asset/themes/metro/panel.css | 261 - .../asset/themes/metro/passwordbox.css | 6 - .../asset/themes/metro/progressbar.css | 33 - .../asset/themes/metro/propertygrid.css | 27 - .../asset/themes/metro/radiobutton.css | 25 - .../asset/themes/metro/searchbox.css | 61 - .../resources/asset/themes/metro/sidemenu.css | 69 - .../resources/asset/themes/metro/slider.css | 101 - .../resources/asset/themes/metro/spinner.css | 114 - .../asset/themes/metro/splitbutton.css | 12 - .../asset/themes/metro/switchbutton.css | 77 - .../resources/asset/themes/metro/tabs.css | 377 - .../resources/asset/themes/metro/tagbox.css | 44 - .../resources/asset/themes/metro/textbox.css | 144 - .../resources/asset/themes/metro/tooltip.css | 103 - .../resources/asset/themes/metro/tree.css | 164 - .../asset/themes/metro/validatebox.css | 5 - .../resources/asset/themes/metro/window.css | 182 - .../main/resources/asset/themes/mobile.css | 355 - .../src/main/resources/asset/themes/vue.css | 650 - 885 files changed, 106117 deletions(-) delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/changelog.txt delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/_content.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/header.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/fade.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/pop.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/slide.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/button.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/list.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/tabs.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/group.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/style.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/switch.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/rowediting.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/group.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/selection.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/message.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/form/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/login1.jpg delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/modem.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/more.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/pda.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/scanner.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/tablet.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/input/numberspinner.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/input/textbox.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/layout/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/menubar.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/_content.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/ajax.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/nav.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/button.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/group.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/image.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/link.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/nav.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/pill.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/button.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/menu.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/dnd.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/_content.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/actions.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/ajax.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/datagrid_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/expandable.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/horizontal.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/multiple.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/tools.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/custom.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/disabledate.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/firstday.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/weeknumber.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/animation.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/actions.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data2.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/customformat.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/dynamicdata.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/group.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/icons.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/itemicon.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiline.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiple.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/navigation.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotedata.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotejsonp.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/actions.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/datagrid_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/initvalue.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/multiple.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/navigation.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/setvalue.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/actions.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/initvalue.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/multiple.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/tree_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/multiple.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/aligncolumns.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cacheeditor.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellediting.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellstyle.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/checkbox.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/clientpagination.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/columngroup.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/complextoolbar.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/contextmenu.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/custompager.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data2.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/footer.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/formatcolumns.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozencolumns.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozenrows.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/mergecells.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/multisorting.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/products.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowborder.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowediting.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowstyle.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/selection.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/simpletoolbar.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/transform.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/basic.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/checkbox.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/datalist_data1.json delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/group.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/multiselect.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/remotedata.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/buttons.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/clone.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/dateformat.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/events.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/restrict.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/sharedcalendar.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/validate.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/initvalue.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/showseconds.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/basic.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/clearicon.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/fluid.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/format.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/demo.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/complextoolbar.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/toolbarbuttons.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/constrain.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/snap.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/accept.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/sort.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/easyloader/basic.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/basic.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/buttonalign.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/form_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/load.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/validateonsubmit.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/_content.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/addremove.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/autoheight.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/collapsetitle.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/complex.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/customcollapsetitle.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/datagrid_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/full.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nestedlayout.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nocollapsible.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/propertygrid_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/tree_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/group.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/iconalign.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/plain.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/size.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/style.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/toggle.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/maskedbox/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/customitem.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/events.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/inline.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/nav.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/actions.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/alignment.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/nav.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/alert.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/interactive.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/position.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/format.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/range.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/align.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/increment.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/range.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/attaching.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/custombuttons.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/layout.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/links.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/simple.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/_content.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/customtools.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/footer.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/halign.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/loadcontent.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/nestedpanel.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/paneltools.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/basic.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/flash.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/validatepassword.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/customcolumns.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/groupformat.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/resizable/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/category.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/basic.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/formattip.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/nonlinear.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/range.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/rule.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/vertical.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/actions.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/basic.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/action.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/_content.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/autoheight.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/dropdown.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fixedwidth.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/hover.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/modem.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/pda.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/scanner.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/tablet.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/nestedtabs.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/striptools.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/style.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabimage.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabposition.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabstools.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tree_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/autocomplete.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/button.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/format.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/style.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/tagbox_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/validate.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/basic.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/button.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/clearicon.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/custom.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/fluid.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/icons.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/multiline.html delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/size.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/actions.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/range.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_content.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_dialog.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/ajax.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customcontent.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customstyle.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/position.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/toolbar.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/tooltipdialog.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/actions.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/animation.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/checkbox.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/contextmenu.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/customcheckbox.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/dnd.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/editable.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/formatting.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/icons.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lazyload.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lines.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data2.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/actions.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/checkbox.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/clientpagination.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/contextmenu.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/customcheckbox.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/editable.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/footer.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/lines.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/reports.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data1.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data2.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data3.json delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/customtooltip.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/errorplacement.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/validateonblur.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/basic.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/borderstyle.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/customtools.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/fluid.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/footer.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/inlinewindow.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/modalwindow.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/windowlayout.html delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/easyloader.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/jquery.easyui.min.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/jquery.easyui.mobile.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/jquery.min.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/license_freeware.txt delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-af.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-am.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-ar.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-bg.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-ca.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-cs.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-cz.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-da.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-de.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-el.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-en.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-es.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-fa.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-fr.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-it.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-jp.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-ko.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-nl.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-pl.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-pt_BR.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-ru.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-sv_SE.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-tr.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-ua.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-zh_CN.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/locale/easyui-lang-zh_TW.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.accordion.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.calendar.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.combo.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.combobox.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.combogrid.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.combotree.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.combotreegrid.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.datagrid.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.datalist.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.datebox.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.datetimebox.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.datetimespinner.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.dialog.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.draggable.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.droppable.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.filebox.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.form.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.layout.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.linkbutton.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.maskedbox.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menu.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menubutton.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.messager.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.mobile.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberbox.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberspinner.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.pagination.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.panel.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.parser.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.passwordbox.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.progressbar.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.propertygrid.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.resizable.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.searchbox.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.sidemenu.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.slider.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.spinner.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.splitbutton.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.switchbutton.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tabs.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tagbox.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.textbox.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.timespinner.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tooltip.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tree.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.treegrid.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.validatebox.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.window.js delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/readme.txt delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/easyloader.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.accordion.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.calendar.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.combobox.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.datebox.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.draggable.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.droppable.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.form.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.linkbutton.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.menu.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.parser.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.progressbar.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.propertygrid.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.resizable.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.slider.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.tabs.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.window.js delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/angular.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/accordion.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/calendar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/checkbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combo.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combobox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datagrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datalist.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/dialog.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/easyui.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/filebox.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/accordion_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/blank.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/calendar_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/combo_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/datagrid_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/datebox_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/layout_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/linkbutton_bg.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/loading.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/menu_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/messager_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/pagination_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/panel_tools.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_close.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_open.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/searchbox_button.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/slider_handle.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/spinner_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tabs_icons.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tagbox_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tree_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/validatebox_warning.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/layout.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/linkbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/menu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/menubutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/messager.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/numberbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/pagination.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/panel.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/passwordbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/progressbar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/propertygrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/radiobutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/searchbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/sidemenu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/slider.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/spinner.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/splitbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/switchbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tabs.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tagbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/textbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tooltip.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tree.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/validatebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/window.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/accordion.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/calendar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/checkbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combo.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combobox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datagrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datalist.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/dialog.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/easyui.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/filebox.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/accordion_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/blank.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/calendar_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/combo_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/datagrid_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/datebox_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/layout_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/linkbutton_bg.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/loading.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/menu_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/messager_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/pagination_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/panel_tools.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/passwordbox_close.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/passwordbox_open.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/searchbox_button.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/slider_handle.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/spinner_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tabs_icons.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tagbox_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tree_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/validatebox_warning.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/layout.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/linkbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/menu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/menubutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/messager.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/numberbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/pagination.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/panel.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/passwordbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/progressbar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/propertygrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/radiobutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/searchbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/sidemenu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/slider.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/spinner.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/splitbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/switchbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tabs.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tagbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/textbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tooltip.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tree.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/validatebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/window.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/color.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/accordion.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/calendar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/checkbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combo.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combobox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datagrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datalist.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/dialog.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/easyui.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/filebox.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/accordion_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/blank.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/calendar_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/combo_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/datagrid_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/datebox_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/layout_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/linkbutton_bg.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/loading.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/menu_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/messager_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/pagination_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/panel_tools.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/passwordbox_close.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/passwordbox_open.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/searchbox_button.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/slider_handle.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/spinner_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tabs_icons.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tagbox_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tree_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/validatebox_warning.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/layout.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/linkbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/menu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/menubutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/messager.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/numberbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/pagination.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/panel.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/passwordbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/progressbar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/propertygrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/radiobutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/searchbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/sidemenu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/slider.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/spinner.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/splitbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/switchbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tabs.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tagbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/textbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tooltip.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tree.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/validatebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/window.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/accordion.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/calendar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/checkbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combo.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combobox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datagrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datalist.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/dialog.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/easyui.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/filebox.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/accordion_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/blank.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/calendar_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/combo_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/datagrid_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/datebox_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/layout_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/linkbutton_bg.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/loading.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/menu_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/messager_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/pagination_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/panel_tools.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/passwordbox_close.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/passwordbox_open.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/searchbox_button.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/slider_handle.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/spinner_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tabs_icons.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tagbox_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tree_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/validatebox_warning.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/layout.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/linkbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/menu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/menubutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/messager.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/numberbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/pagination.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/panel.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/passwordbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/progressbar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/propertygrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/radiobutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/searchbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/sidemenu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/slider.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/spinner.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/splitbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/switchbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tabs.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tagbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/textbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tooltip.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tree.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/validatebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/window.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icon.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/back.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/blank.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/cancel.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/clear.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/cut.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/edit_add.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/edit_remove.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/filesave.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/filter.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/help.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_chart.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_clipart.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_picture.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_shapes.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_smartart.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/lock.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/man.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/mini_add.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/mini_edit.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/mini_refresh.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/more.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/no.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/ok.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/pencil.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/print.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/redo.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/reload.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/search.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/sum.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/tip.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/undo.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/accordion.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/calendar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/checkbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combo.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combobox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datagrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datalist.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/dialog.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/easyui.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/filebox.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/Thumbs.db delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/accordion_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/blank.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/calendar_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/combo_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/datagrid_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/datebox_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/layout_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/linkbutton_bg.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/loading.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/menu_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/messager_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/pagination_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/panel_tools.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/passwordbox_close.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/passwordbox_open.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/searchbox_button.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/slider_handle.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/spinner_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tabs_icons.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tagbox_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tree_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/validatebox_warning.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/layout.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/linkbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/menu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/menubutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/messager.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/numberbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/pagination.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/panel.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/passwordbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/progressbar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/propertygrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/radiobutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/searchbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/sidemenu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/slider.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/spinner.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/splitbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/switchbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tabs.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tagbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/textbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tooltip.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tree.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/validatebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/window.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/accordion.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/calendar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/checkbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combo.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combobox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datagrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datalist.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/dialog.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/easyui.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/filebox.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/Thumbs.db delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/accordion_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/blank.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/calendar_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/combo_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/datagrid_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/datebox_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/layout_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/linkbutton_bg.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/loading.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/menu_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/messager_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/pagination_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/panel_tools.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/passwordbox_close.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/passwordbox_open.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/searchbox_button.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/slider_handle.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/spinner_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tabs_icons.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tagbox_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tree_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/validatebox_warning.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/layout.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/linkbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/menu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/menubutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/messager.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/numberbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/pagination.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/panel.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/passwordbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/progressbar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/propertygrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/radiobutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/searchbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/sidemenu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/slider.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/spinner.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/splitbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/switchbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tabs.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tagbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/textbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tooltip.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tree.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/validatebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/window.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/accordion.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/calendar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/checkbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combo.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combobox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datagrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datalist.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/dialog.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/easyui.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/filebox.css delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/accordion_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/blank.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/calendar_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/combo_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/datagrid_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/datebox_arrow.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/layout_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/linkbutton_bg.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/loading.gif delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/menu_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/messager_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/pagination_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/panel_tools.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/passwordbox_close.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/passwordbox_open.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/searchbox_button.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/slider_handle.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/spinner_arrows.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tabs_icons.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tagbox_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tree_icons.png delete mode 100755 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/validatebox_warning.png delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/layout.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/linkbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/menu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/menubutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/messager.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/numberbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/pagination.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/panel.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/passwordbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/progressbar.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/propertygrid.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/radiobutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/searchbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/sidemenu.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/slider.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/spinner.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/splitbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/switchbutton.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tabs.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tagbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/textbox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tooltip.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tree.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/validatebox.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/window.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/mobile.css delete mode 100644 testapps/ResourceLoaderTest/src/main/resources/asset/themes/vue.css diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/changelog.txt b/testapps/ResourceLoaderTest/src/main/resources/asset/changelog.txt deleted file mode 100755 index d06e2fba7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/changelog.txt +++ /dev/null @@ -1,630 +0,0 @@ -Version 1.5.5.x ---------------- -* Bug - * maskedbox: The component does not accept numeric keypad. fixed. - * combogrid: When selecting multiple records, the datagrid will scroll to the last checked record. fixed. -* Improvement - * Compatible with jQuery 3.x. - * tabs: The 'toolPosition' property can accept 'top' and 'bottom' values. - * textbox: The textbox label has the animating feature when focus or blur on it. - * tooltip: Add 'valign' property. - * tree: The node class can be initialized by setting the 'nodeCls' in the data. - -Version 1.5.5 -------------- -* Bug - * tabs: The selecting history has wrong order when the title contains complex elements. fixed. - * combo: The drop-down panel may not be hidden if a bigger 'delay' value is set. fixed. - * layout: The expanding panel does not collapse when move mouse quickly away from it. fixed. - * tagbox: The tagbox and the label don't stay in the same line. fixed. -* Improvement - * combo: The 'blur' event handler is attached to the 'inputEvents' property. - * numberbox: The 'cloneFrom' method is available. - * slider: The 'step' property can be set with a floating number. - * menu: The 'findItem' method allows the user to find menu item by any parameters. - * menubutton: Add 'showEvent' and 'hideEvent' properties. -* New Plugins - * maskedbox: The maskedbox enforces its structure as the user types. - -Version 1.5.4 -------------- -* Bug - * combotreegrid: The 'onChange' event does not fire when entering values on the inputing box. fixed. - * combobox: Clicking on the drop-down panel will jump to the bottom of body on win10 IE11. fixed. - * datebox: Clicking on the 'Today' button doesn't trigger the 'onSelect' event. fixed. - * propertygrid: The 'getChanges' method doesn't work after editing the only one row. fixed. -* Improvement - * combo: Add the 'panelEvents' property. - * combo: Attach the default 'mousedown' event handler. - * combobox: The 'setValues' method can be called to initialize the displaying text. - * combotreegrid: Press ENTER key to select the highlighted rows. - * panel: Improve the resizing performance. - * filebox: The 'files' method allows the user to get the selected file list. - * searchbox: Improvent the 'selectName' method. - -Version 1.5.3 -------------- -* Bug - * combobox: The 'iconCls' property can not be parsed from the
                                                                                                              markup to display a different page. - * tree: The tree node can use markup to act as a tree menu. - * pagination: Add some event on refresh button and page list. - * datagrid: Add a 'param' parameter for reload method, with which users can pass query parameter when reload data. - * numberbox: Add required validation support, the usage is same as validatebox plugin. - * combobox: Add required validation support. - * combotree: Add required validation support. - * layout: Add some method that can get a region panel and attach event handlers. -* New Plugins - * droppable: A droppable plugin that supports drag drop operation. - * calendar: A calendar plugin that can either be embedded within a page or popup. - * datebox: Combines a textbox with a calendar that let users to select date. - * easyloader: A JavaScript loader that allows you to load plugin and their dependencies into your page. - -Version 1.0.5 -* Bug - * panel: The fit property of panel performs incorrectly. fixed. -* Improvement - * menu: Add a href attribute for menu item, with which user can display a different page in the current browser window. - * form: Add a validate method to do validation for validatebox component. - * dialog: The dialog can read collapsible,minimizable,maximizable and resizable attribute from markup. -* New Plugins - * validatebox: A validation plugin that checks to make sure the user's input value is valid. - -Version 1.0.4 -------------- -* Bug - * panel: When panel is invisible, it is abnormal when resized. fixed. - * panel: Memory leak in method 'destroy'. fixed. - * messager: Memory leak when messager box is closed. fixed. - * dialog: No onLoad event occurs when loading remote data. fixed. -* Improvement - * panel: Add method 'setTitle'. - * window: Add method 'setTitle'. - * dialog: Add method 'setTitle'. - * combotree: Add method 'getValue'. - * combobox: Add method 'getValue'. - * form: The 'load' method can load data and fill combobox and combotree field correctly. - -Version 1.0.3 -------------- -* Bug - * menu: When menu is show in a DIV container, it will be cropped. fixed. - * layout: If you collpase a region panel and then expand it immediately, the region panel will not show normally. fixed. - * accordion: If no panel selected then the first one will become selected and the first panel's body height will not set correctly. fixed. -* Improvement - * tree: Add some methods to support CRUD operation. - * datagrid: Toolbar can accept a new property named 'disabled' to disable the specified tool button. -* New Plugins - * combobox: Combines a textbox with a list of options that users are able to choose from. - * combotree: Combines combobox with drop-down tree component. - * numberbox: Make input element can only enter number char. - * dialog: rewrite the dialog plugin, dialog can contains toolbar and buttons. diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/_content.html deleted file mode 100755 index 996740274..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

                                                                                                              Here is the content loaded via AJAX.

                                                                                                              -
                                                                                                                -
                                                                                                              • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                              • -
                                                                                                              • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                                                                              • -
                                                                                                              • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                              • -
                                                                                                              • complete framework for HTML5 web page.
                                                                                                              • -
                                                                                                              • easyui save your time and scales while developing your products.
                                                                                                              • -
                                                                                                              • easyui is very easy but powerful.
                                                                                                              • -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/basic.html deleted file mode 100755 index 36eece52a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/basic.html +++ /dev/null @@ -1 +0,0 @@ - Basic Accordion - jQuery EasyUI Mobile Demo
                                                                                                              Basic Accordion
                                                                                                              • WLAN
                                                                                                              • Memory
                                                                                                              • Screen
                                                                                                              • More...
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/header.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/header.html deleted file mode 100755 index 6ea6250b4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/accordion/header.html +++ /dev/null @@ -1 +0,0 @@ - Custom Accordion Header - jQuery EasyUI Mobile Demo
                                                                                                              Custom Accordion Header
                                                                                                              List 26/51
                                                                                                              • WLAN
                                                                                                              • Memory
                                                                                                              • Screen
                                                                                                              • More...
                                                                                                              Ajax Loading via ajax 23
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/basic.html deleted file mode 100755 index 995b0f932..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/basic.html +++ /dev/null @@ -1 +0,0 @@ - Basic Animation - jQuery EasyUI Mobile Demo
                                                                                                              Panel2
                                                                                                              Panel3

                                                                                                              Panel3 Content.

                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/fade.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/fade.html deleted file mode 100755 index b85c7846b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/fade.html +++ /dev/null @@ -1 +0,0 @@ - Fade Animation - jQuery EasyUI Mobile Demo
                                                                                                              Fade Animation
                                                                                                              Panel2

                                                                                                              Panel2 Content.

                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/pop.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/pop.html deleted file mode 100755 index 6bcebccd1..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/pop.html +++ /dev/null @@ -1 +0,0 @@ - Pop Animation - jQuery EasyUI Mobile Demo
                                                                                                              Pop Animation
                                                                                                              Panel2

                                                                                                              Panel2 Content.

                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/slide.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/slide.html deleted file mode 100755 index 4528d68c8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/animation/slide.html +++ /dev/null @@ -1 +0,0 @@ - Slide Animation - jQuery EasyUI Mobile Demo
                                                                                                              Panel2

                                                                                                              Panel2 Content.

                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/basic.html deleted file mode 100755 index 6f9cdc6a9..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/basic.html +++ /dev/null @@ -1 +0,0 @@ - Basic Badge - jQuery EasyUI Mobile Demo \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/button.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/button.html deleted file mode 100755 index db5d5310f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/button.html +++ /dev/null @@ -1 +0,0 @@ - Button Badge - jQuery EasyUI Mobile Demo \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/list.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/list.html deleted file mode 100755 index c06f18b3c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/list.html +++ /dev/null @@ -1 +0,0 @@ - List Badge - jQuery EasyUI Mobile Demo
                                                                                                              List Badge
                                                                                                              • Large
                                                                                                                234
                                                                                                              • Spotted Adult Female
                                                                                                                215
                                                                                                              • Venomless
                                                                                                                12
                                                                                                              • Rattleless
                                                                                                                6
                                                                                                              • Green Adult
                                                                                                              • Tailless
                                                                                                              • With tail
                                                                                                              • Adult Female
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/tabs.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/tabs.html deleted file mode 100755 index 51cd85977..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/badge/tabs.html +++ /dev/null @@ -1 +0,0 @@ - Tabs Badge - jQuery EasyUI Mobile Demo
                                                                                                              Tabs Badge

                                                                                                              Modem

                                                                                                              A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.


                                                                                                              Scanner

                                                                                                              In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.


                                                                                                              Pda 23

                                                                                                              A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.


                                                                                                              Pda 13

                                                                                                              A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/basic.html deleted file mode 100755 index e500fbe7d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/basic.html +++ /dev/null @@ -1 +0,0 @@ - Basic LinkButton - jQuery EasyUI Mobile Demo
                                                                                                              Login to System
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/group.html deleted file mode 100755 index 8bd165da9..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/group.html +++ /dev/null @@ -1 +0,0 @@ - Group LinkButton - jQuery EasyUI Mobile Demo
                                                                                                              Button Group

                                                                                                              A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.

                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/style.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/style.html deleted file mode 100755 index 66620940a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/style.html +++ /dev/null @@ -1 +0,0 @@ - Button Style - jQuery EasyUI Mobile Demo \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/switch.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/switch.html deleted file mode 100755 index f2e128e34..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/button/switch.html +++ /dev/null @@ -1 +0,0 @@ - Switch Button - jQuery EasyUI Mobile Demo
                                                                                                              Switch Button
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/basic.html deleted file mode 100755 index d81c652de..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/basic.html +++ /dev/null @@ -1 +0,0 @@ - Basic DataGrid - jQuery EasyUI Mobile Demo
                                                                                                              Item ID Product List Price Unit Cost
                                                                                                              Basic DataGrid
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/rowediting.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/rowediting.html deleted file mode 100755 index 8c425e862..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datagrid/rowediting.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - Row Editing DataGrid - jQuery EasyUI Mobile Demo - - - - - - - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit Cost
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Row Editing
                                                                                                              -
                                                                                                              - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/basic.html deleted file mode 100755 index 33f5e5bc5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/basic.html +++ /dev/null @@ -1 +0,0 @@ - Basic DataList - jQuery EasyUI Mobile Demo
                                                                                                              Basic DataList
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/group.html deleted file mode 100755 index d9e644352..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/group.html +++ /dev/null @@ -1 +0,0 @@ - Group DataList - jQuery EasyUI Mobile Demo
                                                                                                              Group DataList
                                                                                                              Detail
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/selection.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/selection.html deleted file mode 100755 index 06b262303..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/datalist/selection.html +++ /dev/null @@ -1 +0,0 @@ - DataList Selection - jQuery EasyUI Mobile Demo
                                                                                                              DataList Selection
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/basic.html deleted file mode 100755 index d02c84d96..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/basic.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - Basic Dialog - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Basic Dialog
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              - Login -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - Sign in -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/message.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/message.html deleted file mode 100755 index 0254dbe49..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/dialog/message.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Message Dialog - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Message Dialog
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              - Click me -
                                                                                                              - -
                                                                                                              -

                                                                                                              This is a message dialog.

                                                                                                              -
                                                                                                              - OK -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/form/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/form/basic.html deleted file mode 100755 index 3d0860d7c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/form/basic.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Basic Form - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Basic Form
                                                                                                              -
                                                                                                              - Reset -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/login1.jpg b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/login1.jpg deleted file mode 100755 index e9faa80895abbf60d56eb871bd1e8a2b49d4a1e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25789 zcmeFXWmFwsvnPBAn&83R4iMbkCAho0yK8{pc8~+X-67%N9Gu`5Bsd)0gS(St_&@iV zJG17~++jOvO#qgHjJym04h{}r_PPQ7ZUGcN`q|q6 z0Lsb$MgRbS0)U4j1|YstaIZTj9Layuf^Z)I@c+912EhAz1_ZWpSc?w2P-=pKv>Mr&D_$_+KbY{+ScAhg#NtaJ3Xbn zl?c5qk21Tmo0PSkyVMnf>+8$v%f;&IVavuLARxfT&dJ8f$@0p< z;_2_=W$wq~;z{#w0n*lZ1cw{Z3L5~23?wzm?rF}LBdu(IM|u`uVd zV&UMhGG{Tj;^JVj;^MO6HyYjZDGkN>b=)7t(2oBdAqqAIQ)Hm**Nl)Cm#R!;Ud)|6Tv-kx5vnC*YJ;a^Pun-BiY{p!|N>OVW-^-aqEAKHH_`7b&7zuooU?)ooz z;J?KDe~hmGHIZApyw2XfuhaD36@U}~5gq{n0Uq)7fQX2Qgp7uQ{Ms;4QQx9rW4?cn zjfstogHK9;gG-EujZH{JNK8gXK|z5-KnqXxXehJ(k3`#S)jcnxTXuVL?>$oKCC_XZx})k>7N?@(VEny~uG_ZqPOXZsIe{|7GYS6pviy9ELHA6#&6d|!8XYy?Cq z4y5-I>d5BqIMke>D7cc~qWa#qG+Y`NcorVh@9=@#TeO$|K>HW6|2tq||4+#N6WIU4 z1p}bL!@YJMJT^cKP_%`Kv7~=2IC#B2YKvDB=^jYi2Beld+&c%{po3@Q;`{MEj@1r{ zg?c(pOKok4gd_l#qPJyb4k+nQ$0iaEhn05LSRUg8<9O7Re*uk&Tt9V9H=XG)(H{bg zO}039gAc`feMA5g9tu8fOYNLaq0{J;B6%WG zr|jeF7W7@_r*m;c=IKdp%zRjuo+we$Badr6Lnf><$|sP4eat%#W?&XaXNfZq2Nn>Bbu$N2lBqd zUqF9I{jXre1#h5k%04h!rRC#R{AjQ6{m@P}ZQWe8*E(^oLpM)H&Q!iU{@SwibY%jr zZCICn{aO-v8WJSvz&-;fI(aoyT`K9zN1P9Au*^6(yK&+nwKR%8lg@lwVhJeM&PRDe;VTjl^W_lI|jIm+_# zoX(8sQW|j1r=xM6&l5)~yPA198H7ejnV0!_T*m3?)HynS>SZbN+6S%Oa#Gacpp%aP ztS&yUoi~*aoOee%#?3#An)$(L5n+C1MuiQiDzrF?ApO>?#@Dv8%!IN5?-a0!}79h zKd)*GFh;wC05jkQn>ZumEMQl!9U#l+Hl z0tTCyW?Ma|$AzVcvU%v!7Z)S|X~*W}q@V{!Tva*k;6ho6K}T0aHN^9P8m_KQ$k6V2 zNj(fxZQ|G%@%Ma(efna675?3{s~uvd@i)|DR2kB%ii97zVby|W3%W=4j_IAq2tEa_ z?cZAnW>$nyqA6OBVw=1DZ0XC0qj*E$n8H!MZ0G03=^>;c-0vA$j5a@}}Lk>4llO zUgkEvj8uFTOqN_L50ByXMz5S!7Ox+uwzD9$70F-h?1kypMif$u`4w?fQ93RD&S=w( zf*Hw}nU)Vz zLI|&I*v!soyWNAR)Jux@o%y5ASxLE({`f-Jq-1g%`twf-8W1=?!qdp6@@}6b6I6uu zjgnfxqbT}a&?A|MV`=B2v(5Ke))Sa);@LV;&5~>+TOE@26m4tIX|`e@b^c(lrMufD zOct%i+Czg*K*pkNC28wm7Ji|@TWs|Qsg8$~Loc5{qHNX3lycVv*CNE#{%Npu!POZ( z_adlj>@8hT*^-;YK{_c`07jsWO|uIc?;*=byWWVN#`+SNr1BY(ny^uH581suAn2%~R%8?R{=4l}JVw@$Bvb;qsL~sqXELE^Y&>~&v>cOm4z6n; z(n!pQ@Z}qZG4fo|)|v>;z|Vdwk46||ncN4T{e_=s^MjLnKBv1ud+vtAdp$v=DbsV}Z#ceH@S_CPj zEIfNfi713AE6Hackladlgl~$3jNcYs;2ix0tdM`0vn8skq)P!Ge@!k6km5`RxDR>?k}hWZf|`dD_a~p6IZ^WD z*P1)Wahk69=-g8T1|3W`k~2|064 zNe=d8XhCBw*Muhc5!WR8_|g1G-P-t%!<4;3oG(t-AWc4MISsT}qv4=~?ww>Q_&M8J zmsLnY6Yp&4eKzg<();8Mhw-mO8R3Z$*EfgqwJQ%bSS&0Sb6k7L&Q4rJu^a_?N$(0n zbInpujTJ5NYy5p9I(a<*0^WWSv|ih6v(`#?BJ1%*O-8P-DcEuHJZ^E_>Ut9x3u*SfMvw7=2kH;B2Mz7&el4;+vHw8zm1r?)osu%?& z21k!uwOnEapRJ3%y9{Q`_~m=j{K5V#Jvqcd{~=%BrcGBoI>Zuv4V-95%Yq{_T^%zHw;blyPY(>%c0u61Pb!sTId2(dve#fpm;`q#6*AmHB z43of25AW5F-1)(~%(Pl8BZnie!`$ac(eOK>ogiIKAiNS?%H0X>BN&<{(Omy~+jBOq z|1yGl;p&WsBw^rZN)PFGg!}Ue7r#=_UtFy~$?m=Z$K%EYg z-M4g}CY~UV7f1G1>Ij4rv5y*Fwm`x;Qg1F!oNmBxJzL*eRO2Zb)Gp=zwfmbZ+ zg?EPUr4b@w<9m2}rfVY5EW5Y@JM=J_Z7sHEqwJu`2A%@! zf%Ic{*K$K4m|j1LnOu*HuN(6CFu?NXb|Vi{RP*$ra^pM?!_Bjv??>o5o{SIS)Y>R= z;iPI8%Vao4`qRgRz9YnG1N}3NlSpPQd~NlCYt24yeNC{-ddwJjX}5O ziELbvFCS5uAoNTreOaEG_zPI5VlAHr>&zXV*!XQ(J&R7WZmzzJvm?WYA8VtNkXDZ; z*cvs4G)a`@U3Nxlvz!{kbgd~EMcI+jQ!tgbGn89rOst!k+;^kj8`~@>SBHd&=DNK- z2sfNw9^Gqu)^E03rqlIaue)+yxzn1r53c7`tdE8;m)WFDM<|TEq!Xb`fEa}9O}CKO>nThxmg-W}ovV#WuE1+B z#`ifHxh1*IU<`f3R$5hqi~(5WUGvvR-G+ES6MrINnN?{IK!;>_3nA*6=afR3n{(5n z$@=VQCwM+0>X_o!;m_nwfCoR(LAHIo#d!?#d2R3%9^@d;n$+eBW=P$$hObr@4tIqJ zZ?BnxA%Qn}_;fqc8LgT<*Y9puI?U45g6JN)PkB)8Z_+l&t=XdRYbIDBwx{)pKBN`XV?6FQ;xiVSO|Q+5QRfm z2}RvnStjQmIZHGoOiJQt6Oh6L5FN)rIIuXI$Q`FbU?pEw z7%KovqWT6J$wqZC8Qhn;W(@DPDgDRMj5_>YoT7h3;N^(DinLKF!xKL?vLAPc-0)4I zWf8pFgciHJOF3bR0L_O6JVIJuxE~lj7eR+l4*ll5l@Nr_#Y58|S0#K6_|4x7$hA&t zd80P@9SI)|e)Y&_Zv?1}>wTwfxty(7X!Lq^T$55uoC#d$^l3p^N#;v0MV3LXGDAfp z-;8T>4YAiP*4po)`n}=uSdWn^p&F97@GX7e-P7#JeIC3rAID^Q-<2Z1-`uAN z=w9y$``U4tsQ*Rp3>#13ubd^IkRnI2E1lGR%tkL+%(=c!-Rqi$8A6){Hiv!}!pxka z4nET+LzW>$+isd}Hm5uJxw3MY{bylrkQ5ef{I#^>bAtL@LP;a()8!=Gv4IbEzk48h z!tW*@)%yO-)keYHJ?+q*qagR}=I!rjtIPIK;?qvl5B9o$4AA;kLeV>j7~w3#XY=R7 zoe^hEQEE-6nD##s4~bvp`IAIf4I_|}-c;yZ{LEZFGI#LR4e)_l)qg0Kai@v6ek<0u z}* z6DDQ`;cp+p?O7!gX@@vKZsG?;HQ@tEM2rl z*G(J5o@uJK%F7JKmZpwM!>T#O1)M$$9?%!!sVcP3vUO738M_cgu5~Ip?k4x(y>tJJ z;d?i1BEuDKPWPhGxG3OcX32GsdF3DN>&;IUBI?(66SU`_V1_c*|G?{!&9LtBLp#aYANdHQ| z^rOjz8U8JNwU4wbkR^TWDKy=>Ui53MkTfr>BWLvX314Jv=eg~ER^qYh9^KB zmcZPdGWVy%3`g3DJxE@heMYjN>7lBd9Ouvga-4dLZ~C}^$}+OB&JcLpkVR8BUbVY1 zki~@CJ43GZlatNxWbJf68(eP>G9eO_dPp>UYG6E&!aDUw(7+~xtIBSY!g;6qS6TPVcRMnm;^88DuAw->dLKXE_wJ{m zNtPy-g(K5`-ab>rXB|qN{fuAx^EpPy({`qPR!{Q}WJ`jg{9U*e^B7qij>r<;$-f`4 zaULjGXI~{X<3m#=B0{Pw>+B4P(J*opG?TZ|c{D?de4q(lm|R>-SW7awo%i#gO`p`G z)N0GJ9k^$eqKZC?(whQ4bL=#GuG7w+?kuJnN6F@Yz%6S^O$LH9ko{qzXR`45{55gl zy*OP`YkvZ7r6Ys&FqVZQ-N59(0GnjGO#pybH$0czZxe&*>t)k~GbB3o1m?B)Op~H3 zX`E`mLJS|;lIZ5CcUmoB>rZwXF<8{)1#Psq7>J2R+WI_v-%xm4)lKJ!okY0W4;)~= zo91u%#I2DAdc&?dwgbZJ4+_vxh7A}T(D>Sl93&OZ6lWQe`(@J*t;@pGRGlx~RCapu zmef8>X*4#5o>GTx4czeO|0Qro;lhprgEw-5nm+0 zsUu7fKMFD|B+Yh>z`G4{*{2UBQR|quc1(-C2MUb@W4eP_Ro(1|^^KD(OD_nbS-AO6 zn!nXMyP~DWZ0bJGC=7fWH%xIK6&o?r3Ks6{h}%(b>X>IcOD8JD>IhnYAS5N#Roo#H z)9$#`$%Lk#;zyU^g@Qo!LnrKdpXD}E+;8wQc1}g%zplk(>Cj?QyQGq2#R}|H9fI8B z(jUutnkO|CXXy%zrcYQs77lPYQ-?E9R)+}>!N-p}Wv4Hx0;yi{!iyeeCzFFdt7`#1 zdG9K#ZB*+fsryh?J~;xB3&x1{nl;HGrz-1ZX2*F7x4jrLHw?LR$$&J+ zlB%BzR}?YCAzz}VcUx>D*P@0&yG%HL0g1T_7Ds}S>(KNK`(-GB{`)oYtMBatq2L!; zfo~?r*^1|cAHC5sh*PC1CR!WAuh9oSi}%&Yb~9yOEG@8V$SYq<(GFC6f>yr$IIKJz z767+`yW?W^%UffuIV~LW!=N*RI2ObV`qZ4r(PV~`&OA(+n-cVu3h#vX4wherEm*Ik z=ub}=w;JX-OA{i|b3A1*ak1({@E2g)HBV<~JrgUNrs;LhDL^X@|L_?(bvR(QqdW1U z^m2LZS0ipq5-Odfa(%x)SDAX-f4djh!+2L)Oq!C;eB{u1BA8(acZQ#F}Py^~VwEBSP(MAIXZ6*q8 zZx9^%>M~k9v-D+_q-+s+^a4gk$vZ+=Z}g#K`*L41?sz>!(`-L9r_q26(}`%aWU0g% zQAn+JpDZB18V{kwKpnn-h$@22A*T4~jXQ=|YsR&4Clxs&n4Ebp56CMA*zMXhX~kH1 z`2$HlIZd;drW})gX+bs4qAUH%jwXab?;AcNJh#>7!hobjh=|6V^6Ker0*CqZUQ1e^ z>DFmBo)YKYPXb_~3=%Rw&2=?BhyB&M%#eLkQnFxb+w=&`MA*$Raj6Us-hhnnCkYcqtU{?dX`nqI139n z+fGTiCHYkDQ`E+)aaf*saH^h6yoRwnw~2=FR&>3Du);q5!~ONz@1|AByFk=(y!y7Z z=&#_@^J?kuWdNm{TaVctk2WNNoO602wcm?APR>AX z&bd{xBb>CLYl&gcJ&xr^5oSB11BaoWX+L+Ob^LhZ+rH04Bm#+2OI0qv!*ParOm$kX zxdRE$^2NYSz}Cos#19ySMa#n-(U zpf4~#_{)T-pVwai_Adg#KrRJ@W>q=eW}LPho)1*JS<^vb}E3WM-Js1>a@&R$-2YcHL{Z?>H@NjOyU4h{!}HOux6KZy%_987V%~{R_}f z{<;^10^b64pcpKiF4;1S;R*W4Mwfs3NsI-g{?XekLhyq}8DRzWM-5-wWEByn_=iAO z#HhB~)n%dzTe=+u`GRpNioCk?gG!?-|6U&2YJ-d@nX+vbB(n}fmy!zM%tW<~>+z(H z4=Z`Y=bFl$KM!H1al%6G2ZuU3yUnmjQvsrt30)SlauwMtHAQH&c~h%;0kb0ztZu>F4iEI8l3+ds+EM;F z8WJb$IUWiM>ZDg{6D59_FJGJR+Fn0H2n)<2RZ1OX{9=o6*|M+M^n0CY`INP`iAbd& zB(Ss#QfEP>=o6)U6zp7z&z9f0-EKE_SZ=9~+{;OO1dv!t8W!A~R%Wy=8bR9R zfYyV4xu>;LHB5<-g;#Hmp4-jQ;N@Wzwl8m{ORn#BkucIVI*NHd1u?Tz!HiDpUb6hy zj-oZ3Jp9~xJU3|)@(}o}WBq-$={a5wQd9D2kbg`LNe(8+gn4dzT^*m%+%(Nn z%z`GcuCJG{600UZq=G`~yHjS*+cizw_Fc$SvD!{&+m%aEE6$L)hK%zwKYbN#-Lh!Y zMgkvi(oUYj!UExbDt1htS?s&wl<~k1X91}_U)4igH`eW8qIngxUE}IN2A*rIvUmby z+jSb`3IIs^#~Ok5Y{mRvK$FYI-{)d>bJB*vvmY4Wu-!{00&XgscS&9|QG!lQ)4cT@ zil+v9Aa$kD$T-$$id7;p%|u6u<~*7{w^g?2ZGBe*8P2uSm9EQ4u_a^*rTG;RN7%8c*>DH; zFsZIUAZcnJ6kiu>MOJj}9+A|)b;y4gAgkhLKiH)gPb>nNZ+cQ_QinZWDZ9JLZ8lbJ zKEow48P{wjsdu)4ztAKx%$uHlF4>2taJym`6CCYse#_s%$^0ROor&a3%Lu)I;}0D? z5YwdDD1>K_gwUIu#RY{SiajTZFS7-&8A%A{8ro(QPkj>J=T zBdn-aa)Zz?l0pR1q#6bReFu&B)Srj+bJ5FI-|-K*7kMv@2z*BpIZ&7gMd~D+e0fIf zJ)0XHbX5V4u{H5Dr|Z*5fQHD|Bq~J#8RKbZ3vyq(u$w#(lP))XFqu?Id)b%c1Q&Ct zq@^AI>2z;w1!g2qxVAq^I8e@Q{F@_}=>WOztA9~_ZtBVu@B>r{Ux|rx z^Aw(DLo8BEm&1@J)mW~c$p~=vl?1u*l=LECrzYsD2(gg%eDg<$& zxigVA?JppPAEA~e!?=z9qSEV!kfUOzl}&5B?A%Vmt#rhnJ^e;fJ__+3mmy9Jbnjq} zS@S3|9YhItT%|D@S+QT2F})*}b5|;FcT*6}q^eNQQGf=YeC{m*r5m$-Y(KI)_1c&i zx(f`GzD^k2sdmvc`HSB0n9-+Aza`yxFfrFfA{J(bqw@JgWQ5R5z_WWakbnsMsclSb zB4@k<`8V}o3QwGR`FE;o8o`$$gZ_MRUR?%92vL{xNdv@MjQ8;a1$Ol-nKdN#TXW{5 zq*%PG;Veh#dN!M+eb`l32=*0=q6T>qaK?-wQaFb7gL{L zM7om80Xm8}1b@31)5tUR_O^!LE@Po^x|`GpMq9EHR9^^9DEd?=V=?Y?M=1U#f4>V; zseO?$MGk!^rxNt%ArvUdl^e9JB7aLCy2!Iv(2V;X_UC;|Q**tcmtu^ur9FWQirb3m zS#JI?!cN?g$8?saYL?OEuk|zgPEIu=MW$#lni4`zk#XihC339@|8|R0=ZI5z+zbb! zHETq-`U-IiW$w+9>}|CxrYh}y9Hc3bpV$tv{?K<>|EMFg7M}RkJv_;My*&i|2)nmJ ze+oBlItapjTxsR}tv(iBq&|Gu9NIawlD07HTrz6grl>frtL2y=xUY|0g4XMN)os>m z;Ts~@xXFUCaIIVCsHoRHXo2roApvgU6B<2O$?v>_tT>9uYF{Qi^;orpAz!h%WCF09 zht+%Op+dwz=8PT!mD?}wqggf1{sIiUtXr-o-yy&%PYel_%Njfrmfz$kJiWC`aOT{y zeE4SR@6D|O$;qPC{JhdeFLv@7Hy{$ZOVQDc<#xi=wA+iK7cmv}4$&gRiSLd3@;_6hFlTyGZQED#*?(nClz8GfuuyWilV}t5z*bl)U zxG9m^Mw@WCpqrhms`9+~q0_N(h{_DfkJ6|iq-W>B0X0aEw=0*!`(ZM1B4ipOo{sG` z;yzR|Oy$;&)DupbRG=K;V+lQ{GnpY{aIP-zIeAXyL%8m&MJ(}x7&R^vHrf-U;I|BqBwQGRf$Th{LY#LY@A%bwksY-_5j%i&*LMxuDUu-cf-2ESYEakgEXm z%L9>BYr7_4x*AcG%t?U}fMY$cMu|!>L{Qgn+#bD3$42i0UX*K6o|4a1g)!B~$(g3I z4f?FxmjGARrr((pAC(AO2S{F~Sp;whqurP)-If)v`~_Isr~9^`OsfWxtab>O@iG7z z^P^dkMs!-@!LwVK5lv;u^f0YtrF2B;h0gZ>hi*=8}dI zYqn(h!`ngt;mP};Za?)|=i|kR54&NAt+;dlic$mq^&CYOJldzFDP)QSy~LT>XIhs9 zDNdejffR;BiEFp&ABo{4Dk4b`?dnkvOKu2Oi1n&*wWc8Ki|-dXPPjdznqc$%?s>K_ z7uM6;Q5ZXep~dn!)bP zSmgnCBQM9OdeN$Jd_Uh`$h`)(F>psgj#Z?!4B&tOo35wa+W<57e#fzgpuO?%#eFat+j!5kai&L}`kx1k(%mNZDL`^_KPwnIZvo<_S) zopTG@Fh$2QC{*99$CSBJ{X}NlO}v~ZZI$n}nCG4owX%j4;rzpqJ9^JlFkG-BAAVX~ z{LlSDpAcL~b7m&KZaVsjs18T+q~PwBD%rPyeKAp#8*e4p`jW^u&W zdpfJK!e*rJ1Z0Vb!xh6Eh4k_-6OLiPg~dz7ec3kgx6GKD1! zc#q}es_Dn?W`@btEeb5#vEGg*WN~))ez|IH-mIdJ?|mYzV^5)ItScutl$qiA>85u(~nqQ#0tU}Ql zasIS#odbJMLz0&fk0$J0YVIu$=gF`Sl=;_Xlb~tT?zItnn3*{}Y8%kgrZjJ`!Bx}ZfdTZDqF zl8i40^?RZBcrd^0XLaaIQy#f1BkYK2)|&i8$t9da=i0q5at9cmFBEr;iEWg?XBfrA ze%Wt#v0(r`Z@aEa5l-w(UA+}yn)^ffNDxflILBO!u!__jIwLOnXPS~c(!(=#Qnk#; zYL?4UQ`E<>0Nv5GB6i`9iu)tE>AF~Yj?u?n)>03D1i1CD4>Wz3M+O)L_T^LT(la!z z?Q)qF`9$}e-~IwnLF8hcNTQe354IU97k4GT&RnQDhX=8|bv6++FDa}W?F0x&@T9*T zYcDcl*qWvghq--pDzq~^CWNrQno=@@i+7!^5YWt!)@FG=ZJ>{)FVbEPMHkkjT7Uf{ zEN`*km6gu$a?hLV8fli^q zPg;n)Jt`$1YBF!X#3%qhr6o+I;jAL$n62P)u@kACsrVLj2DuHx^Tcl^2wqD+l)V0O zNTE$wD00PUiuuaN@I#g}Q4mjnrp)P1DdH?it**sU@AS{CNT<$LCQ2;x+1CK@i~b!U z`R!ovEEs0u$GaB3!o@O9Zomlo-1|tl=|v{uzu!gDPizeWH7Ewr_9pT=Ryc;eCHzBO zh%+RrCQhMgV*jkef&)XRnrm+JnIytg(U5* ze(geug;`bkhrGO^{8*G`PFN%eaV;-xOy56)f4zr+wZ3W-utP7lMtH2Rd;jOdW#nJL zaO-M0`DG>Vz4#x@7iYQ|~cP-xBT4vFa-ZrC>*jV^V^`@Q^h;7upCna}*agBUL1d+F5iT_d9avOY`vmv&AuO9BV;b#WVI;>UCO1-N5uZF zJWSW7w8RsysB9^JA(Fz&bpF`N=Vq9T^iUVqwiTU`K`CQ5rL8&}vipsvVi$Y5fe zHA0c^n0*OcXb%CsrgxmIo6~fLr|g|uWz&*(!6|$=i=?*MhcDQq?WUir35UDRYJeTd zkw;)E7x~i;yaefOm__`)dU2$u3SXJYW<+sx^XKim+5(b5~}nEao3Hk8u&jD&1bYH zJ2E->{vmBzEYl)@4a`g-V5Lw&ff05krZt?Z^Z+l2vsEU&*JK%|^$n z6`Hdar7fADOAmQ-%Z~r7+JoZeec}iG-4w<5XCCZEE=Esg?}NWgkvm|~#UiCSP0OMu z!K$HS+g`Ql}xc)Sz^l$v4+KKjoX+ny^Zp?y(>Yp%g2B@iD&3r!_5AlMb9p^ z5PLV2o$u|b&nm-|-xytcweH72p~pI%I(N{;KL`tFbgoURwTkX;;P(nl&Tp^DSIL7s zwSy^+4&6oLxA7tm+J5T5WUQaJv7YJHexHN;Ndt7E6P#~OHTyl{C2Nt=Ao?&V$|(kx z9ee>&=YBNe)-`G3xvuT#?BPL(MGY+h-+3hiKbr8eCCnovI(4xMsiCRTw)Ik_t!8y# zFtJS}TZm4r8XS~Ezbd-nG?z~k7IKLK{zV`rhIF&Imn@W}!DbuX$UhoXWVv)S*@E0>!)03K*5k}4bO*Ob4}m3Ge32+pzd zY$iI%zUn)_6o(joZ+6T!DRRhI z)G>gjGOZY_GC8NnAw=S9?4&mSHe{G0bPX7~U!CWsjhupco#IHffgz{2r~)vUCAp4J zs@tQgIVS)qBo-M$Im^9*iN5j{K||5ENJd*Sm&Si3OYA)Bt-xW^lQyccb+c;Z*)!1b z^bJ?J5yM}ALHvGHm}cUUBHB}Jm&>YO+@jI!&4i79gePku3oBSWFkMz z;3o@YoFcBWrRr{lg;j`fQ%NO)2_YfoG1|LVyXQPRzW@H%AM)U;)zP7jn2>j}2qz)U z3eIJlyZr2F*glXgy@A;&%W@NWb^tRYaU(%1+`T15!z}Z!jbewU%5x1_hRs}2wKWJ2 zOEe_~1mRFQOvyaxnr}_e^un98Lo?LpYY?VY8iWv|nZQ_6q_(2F`;Eakeqqy15d4KB z20WJiz_;41pso0i!#V<#w#6x2DlOSO7xV4Ezj29I6C(>#`St*BesN7f%>8(W$W;3Y zC=Qu$lRUX&bm(Y_45|7tTagh89J+l@t!zImlV_OOD(2+ywt@~d$9_8bM^wM0tZ2E9 z@B=RZJO{PgOwSv!(3b3oW0!Uo5X`GZMqH^_eXj?z{!w;c+2z+lJbGRyjMIOSpdUvD z$x8Kn6H{hYgugmZwg0VmwcoL7CrUsWuE^N2Ay;IL{)MahAQ*<5T*Y|+H@M8BJZYd z`dWDJ@SD0%9L!S{6Xh#RkJ(YZxFO!#7;rW$8vv`+Bc`;D(!^2--Q;~=fL41(tj#4_ zI+V>9B??t&i7YuMT60Kr>uQl%g&)SqMqtu)yO8xerE!X^PM>nUr;#yA^3QGy@GqcQ zx6>XXv4x4;19LK;;^j4OMc^YKfPe1U{XpGT#Jmtd5lz&&WaFo9X-V+X;4j%mU!;Tl z)2nLVMZWmdZaFi%u(809gPZPbUkbgUIEfJmyw3a1b-4k`Z$2TXO`KJk-<}C8bvLk^ zUa66Lcdev4BJjLK`tB+TZ6(C+lTu?MNt7?&IWXViOh9KPH^1^VvU+JU0mcGpal>MQ%Z-M=4-oU!=+DGFEu-gt(r zy7}*y%~{XipcBY+MtMp3e`A>2XL}y8wnld?FyjoaAWw5pSio!M2_XOOeD8kbR=4(rzvgmsuhc0tT7LN13lbW&EkZ%>+d@B@>WB zfL6cY-CqEkX=llj?}U3d@q%T;EO#t0vKBMT6K8+~gS5Dw_WRoT(z|tNdy-N&zFOVu z*RHK$PS|N3!L?QzO+5^m?3;nNh67L`XU{_fXV_v~|1evKc09q{g8T|A2Of#^%Do`R z{dmaJgsITDNtEVYz7zJUDo_K7DhKUdq~&Tt&%t+t8;Y3hv(O5^_WdLN{l5T(I>{L0 zvDoli8Uf10@L!I@-Vn9XZIa{G%o2qGD1{wHKckz-bKtzL{fcIO-mI-RSevE$Q94@$YU3TDHiJv*;l;U}KqhsKudv)YY9a#@ZYNj2O#9roT@tue2A8P3p@=A2+qLq#ddk zPC?%NbRtfFIklyFN!NmwZ5nr40riPP_2L-dCxKTG4E$6AzutOGVE=-YNQ*MPwo#iO z?Q=RkO!;KRLGkD7r$do<^@oBl7ltn^7t#!j{xDDLP!rS~jUM+6h|Z!DE02CBo4*iD zm|d9l7X|I7bc>UNdJA2M=O5wh$shgMblKKI`*U>QInwVOol@{W(a1#@oy7(ytf#&B zapfNC+MzZh-u}kea|J{pZZqCjAL={7mW(mqI zkhBy_@DRLBXdaHd#ex74a8a+evV_asL@St1XVTa?`F5eH<`MLMd%n|p72jtDCt>qW&RNg`j?LN`h zNRgE`MDA(T!6q?0ff|))ff${02D_TSHeRdk8p~#OqGr|FB*DdWG;LvOzR7~&#Nf~) zCa%6ZnB&#PLx@2tehYyrPoWO1$_p#Q^iDc9w&-%Ux9`oUp2g0ikh;l~MRoYWUohti#R=mEgp--)1as z*?_quMlA?C{5b7cm*6Z*G+i)apq@nadONg zSKpavo5IP z41FwPubF<4uH5y47Z?udi(k=_?%Qg1SCg%n2P zB!B~80NZiTO2_cc&EfdD;`Fs;j%`NDd6X((7E&JodyT{2HJRbvTI>E6^Ii*IImN4> zjs*aWp;PoDH0o6MU5kqMjNPiHTe3rlltkwS{6AQPHh!OG<4_n1d`;k|B>dvOkFYkpewhyBnQWJu5`K zXf745^*DvSyAV_@tV@#EAKqh%W%I9TI6oO&qa z{uS7G(@r;D4~tW?pD@}))|U*Q!?Ok^$Dtsv;47Kabbsts)wNM8%OsJ>90AZMU{Dzu zS2-a;+7GEUXH(a%G;bo-8+E$0)U9tU?-kz*kinvFVhXVyxFW5!vKKGAc2f9W(nYUo zTHJtzv9yv#B=lej>-9A66WbLUU8TmSaXit5GWn!`qcqW$MO<_nl$@TXpWrKIm%)0f zu6JrzP}?&D*`yi$0i)t2jkcetU)&3MATqkyd0_IB!0Pcg(c@#!wPk?^SH>B-LK}DW=-++}qqJO#HjD7~`S)qp!VP z`i(1YE}oO?-wyQa-I1Awtu?t+=^R%KuD?KCU-Pd=_&YzB&IhyyTB{*0g_XX_8eqavv?lD(!=7S*+$~x0$^R>?$7R5=Ffbb zx8qKu&>~6U%{?>^26(>VWGL77w>o5Gf*oQ7i?%wF0T`;D5r^y_2s}rqM!+1@#@dX_sp<3FqsG(N#==!3WU`m?^(!mXBw+5zjQ)UEF8ZJROEDvE5VICL zvz2_SAIy)+rJnKbQ0nU=JEPddJK{wSO&n6sAWyxs&1`;P zAIR2$u{N)5VG*6y*7_3*tK-c_AfZv*?Qhb!tBY&xM*BySWxJXyWRf=#KwJb8u*m3t zjQiH#!*93Uc%x0x=3w(_dX2KjF_R=9-L!MtZv)brXe{hp@dddaJ@E#a46N;Or?tdr z!v_#ayBPH;zmIA)n~`s&+^jDo#lFohPa|X7j1O)XZ{b&UTbQoCBPG;DVG>^5M6Aj4 zqRD8)sXp)0xaclsdtE}>;s*^L*wAMuVvL?T5~PfF`A@Aa)ymlz*7}q--w*F}_lT>D z#Rf&|wWL6JrA6!(%nqp=?(ke1p{(<{fd zdJ(;f@56ef{1C-&6z^lMMHm?n+{17nxlTF&NF&&a@ox`m?KSm}oo)$<=8y#77ni9X zn6BsH(Y(2rQt{2x>RPijg42}hd~qd=dasD|dxm9)?Pf$M zyHCjO4(xRtgI-7B+sQQDS4`FlIF1R2ngQet;E%);itRorT)dt&x>)XGD|aKg-f&qR z5x^vR6ZzK>5`(9k02DdqQ<6Sm_dxB(8T!+;wk2w{J1u%yBfr%myEuw#hh>@9JCLYo zn0pX0&wAbPx%*zPaSXD-7u(>uWMmjd*kc?h>Bz^{xasv6F8nj6&pZzI32Q7<^ONRA z$`qe$8jr(z&Ao;0jehZ|2{UgQI7BP~B>EB8+*G|$jGMXW5zldXq1ah7$Sw#~KqUEB zZdBxc9cwql!4t!tcy`}q+qW{&nl9?`U+lMVGF zJAf5_ePSEEKI+nAB$o0;EG`jId2HoD#zxe($lB`BImLU zGY*B%wPwC6olU2p-x6!mN8*=QWx4*&v$SYTV`(XFamg6MyJsisil4@}b{D!wn{0~0 z+fkA$c@cP#0%v}E^4R=MWq7)H;L!#WA^4k&m89DC>)rX|XfJYQ)UIb?ZK*-_TbtP30{p7%x$BL@e8hAgTEOtviNVy4v3G%b z5L#U!Br9%Bo4_25vZ**D2Cv*|8fLSv>DHwPePxlaaK{N6uyU$BmU8>qW{{We4Pdlxp zk7*h2h5+WXp0FHC-YL8nUMsiK1T7@7dCoR~cC!vxl6VI{UYM+JjQ2Lsd_%FYXF(r^ z^f-}F@)lW+?Z@Bl*6oxwY4NvPn^KY}<5_K@+|9;JVTd011me8^0K`*Es`#Jcj=qKo zr!tFcG%fOt&H@m7ZB;*wLf26uDJ?H_>wmK8bGTS?u>e30}evZAR3^cm^sDJ=B}q>2-9Wg)l-p~CGUn{Ow!JJspsvS`)vfzAm;QsX$!-cygt zqVh*%AsZt;Y4yv51l&&<$Xu8ZHap;&&6*urWy@UZEO`VpQAQ3s=M|-OC8&I@#Bm+D z++rki{Lj{)7nW-$nJwFpG8hPc@jVY-G1jR$b_qr%Mv0<}9d6fJn%#j_VRIakVOZ_P zROf+{o}H%vW%=U&nMa<3c$h~ zsO|=O5<31>P;2nOr|gMz*$T!eo5@xBmBxRaUF6oL5~l^RmoJ3uqtd2W?KL-zpkyz< zP#~FisEaTvnBPHlGd5A`@jJTz#e~H=YDuO##=t4HH7vWmA1ON#7XvBrTLHV)T5kWvGmA2Ye3(<)u)=I#crP}u#JkS z9fmo_(zi6ND_g#U?CB^zbYP@XvUzf=bQpHeKHVsbkz9!9YN4rmTG(H+ zbM~7;?2dYXrGO`BAQOR;(y-G>o?Ttzy3xW|sUkl*9lO|j<28K9hf3Os6WWN3aZ4L2 zjKv4Z8kF-y@ReF9W@~>U^oeRyYPWo16kWD0{ zC(L|_g4{$#Jv_-59kE_(tJq&(y4z1PGw|ygC(HHxDx&PgQYysuULk;Ze(K-Lm2N!6 z%OPE?#Qp4^nO+DTNC(!7Ws3S6OE|${62?wO0La|L%i-g*jFE==$h61e`b<40yQqBn;QpGFnH^Z zojX@atJ=vF_I@GrWk;PEHy8RJjBF%${HZkAmR2L8r#T;h&1HB)TZc#S?vt-Itj(v1 zTGv$#jjwGm*(PuY_p|AdU7y1JF+4Z%w_fm7^vKX(THV=2C_gNTBxlND^#oID@ib9! z(8t%jQ*Yv*h=1EZ+cJfYWrp6|*}AGCNH`35$>fvkSl5=aYCb2{o-I-zmh$3PxSl2e zpER=o2;}qw*0HVaVYk*Tt?pu-4a}j+9vGqExMSCm)Ow22OSOq+nIf7n@~g{*AL};o zr|3vEpTd#VV%@;Ig8nPnB!+QvRz2QpG_B@z4Z!1rz~Z%jCzg)?07-T{C4Pt56O@FHC7MB|%g(irZbNpX7IQHb?x@&in#6K8Knq92cu)4(QuFf)cB`V(RBSL9UoAgR_4b^TZ?G$Pnk2n3xU+_1oPPDxp{uqp?F>! z3@_X7-}^%2a2zlEvs2D`TPg+EZE1Kzl8cUIH& zU1IN7y+@Ks^DJiI&HP5 z*`&7?SBW*^eX)Q-G3B@b6Z|J`@0ZZmPc_#mo2Kt_oratx@yOO09RXP3jQ|cs%SW|v zaz5`F^y9g!I!3;p0r9=9{OZkRBQ=JnImgBa21h|Zu0F2}~EzpzsQoHIFv(W4OX>+OH>;5gd zvW!otL3LxPLH2TGNzx?9Iqa^ZKD^XgGHQBmnW^e`+HKIe*6t#>5yGn52F>iiF&O}` zTzgj^@YBUp*-H{V*%z8rFKq@;4>H}ua9hh#yJ%ot@W0pZ1UP_F*I`^+Z?vQka+ayartpk$+|n4BQi%8%;U|2%K@lN&(wC%?DjN+N=5 z&E8d~oc{pp3O|>D^~nd1YK8Qenk6D;M10`xRv->|KEGbIak3^_m2Y&*6_~0dZVy5w zQ;&SsMb4Wv4IGyC$k73`v%2yRV~&TK+?z*&Lb4*x%z4^~rv3@AT7C; zG4iiwQ=V#@*)qPxXry?Q1qhhj0msaG@!G7lx}a7uJGlAcUBO8JeZ!6hYc|t0P*0&s zJ#%H*p6(g^wIps$ibqaPc){!MS8e=5r3pN_w7KQ;0p0$dRJd+<+PEBNo=-|uv$lpW zHtfVpwj%`#uLG4Qr&2!}%bMFr6RgQRu&m9sjB$ljBLFh>^zG|HlITRK$!vETcZ;o~ zX%@%9`an~)ciqVMF00V7EI`LjgB)VAZ7;OBHCZ)Vy%Nh*pUnBAxGWGH;1Hno9ftr` zL|3t^F_L+sgsF~ix_77@1_vX**P5OQtfQIQJLy$O#B6Q?hETl^9er-0z*Irwe`z)(z8z5Ck)gnf~BOoe}248$SFAH+@w>%~Q-+G%=XC8FGqC^=!~ zt4fL(bGf>=IODb|bh^`RWmzOx1c`$hyr(LpjQRpk3XP*@oV}n|lH{&!%grI@P3dyr#z5<8a+7$q%nN z+737)wL^8QSTQ$q+Nu>H6=Sw|%7St_@#)vK9M78mQ%J*nHcJ5}o>JM`ZeT`N? zyy8NkhkWzbKhCM&+|Lt6*A~!$w1h%ghTIX7bN4|%rYcCT-Ww_H;n5OB4VdJS3b4;4 zk)M8^l@FOTflL;6vP|F|@e5v`$yU1GYOfdwE@713BU+(pHrX0 zv+jHys|%=xbhhCArTvF2_l!-d#`QsjaS+=C_JZCM9w{P|KVt z1LYt&$sU5M>V{A3@nvqlU}=TTw6UFp#@Pos>$l}N`u3R|%zR7Yi#1e|!UX8OT4SR`4v6 zeW7M9%^;cZ?spym=O?{mCgmv?YepwiEYl>B-0B+47GWeaJ)0kzUzf@SiuGI*^7TD( zD=$xjQRWeFRH4vJU|O_ zq#0bR5I$milb%mgT-Bw`z`K$^K2nP77*fQIyK{_vYgb3Sx)+hj=f31DUtANE3SbeeZQFAU z_CHQ))S9lLcXK;jT$u{Ih%%sIayaQ)8h8`xvWb9@M`&bC!#i7W8T_fO$!kN8(>y06 z7oXZ`rQKRfXo@Z^i?CUjINU{-t^JyA|{k83sD`6seklVuGh~xwf!S?*? zj1QZfk7}c@OEYOQ%4eH;L`t79@z2(@CbouaSdvuSvA`KdaVr^6jmWFFf(qk~Ip@C>XTp9k)b;IdBc@NKSm|-IK^w^$w7_TYIAU;c z2mp4+HN@*E6(C^FeAIp5xghNvaCqXmp90&&HA5cLwdF$DVtEX3eT`a*vuw@F-cde- z)g_6q9y@&^)?LuxT?qD*&jW8hp8WAy0_MtDpx+dbd9rNs(TORHoM3WE>%~QVES8ID zb!_G-lHGQ)@r}fW{Od;PQfoAs<4-XlSrwH+klV45kEL@ZsoBt_becm>lFJsN@fZI9 zS}n38CmS4+M^Vwa>NCwY6tKd`nuMU0*y||r-8$eNdH3(0oK~Kd8eLdJ_JQX4bF!}E zoCQ!o`ec)jde7IbEu)pTK!f+=sL%1I_?l>!p-@L1&Je|PWOIP=;|$}V+BwPf>BUr@ z&Fva9E};HGw*lPlYz(nndL9p`=}~JIuqTOxamVGULQcX|=jP`loYM*{66rSakKM{x zIB%Gc6rQIfb6Q%&r*dniv`;GHN4QVjsRcJPM))~9alj-TW3kU_Wt!>oIFT*<)h~}N z)T84a*RdJSSJZk`w)QsH4|5c##S&*l0oZUO+&Uh{qKy;ncE}U}_VG;E;Fmec&)_LE zkxOwdAhZyw2=4sQrb$66b_E1_edEB!PDt%hX;9c3LnyU(SCa`ZmVQzPM^@;$n6E0MVE0kASa+%UKUIHOjcQQ})jOYe?!R*_r= z1mivWatBI|S?2!GR5CLr-W85O`IvAIN+m0zBLy2?cJ0p2`7>O>5Ona z>a@CyrqwLlPd_|+VRry-#~`8PV?Md9OQ>Uy!yjpl1adBR?DkUrvodIEZnTCsDgM?Hf>4W{IZ zB?t>MZerOdX&*Ki{{SP}q|^%=>ln+wmn=$MHyxzsu;@Atl_|A?-&48r6U!OK6^I{k zo2S>BTZX9Q{Bv&%mfBL^T-w^lb9oZUBOy$wWnIiiOl5{gPW9DmGFw~f7nX~rM*daA zmgyOvDyWUM4gmu@Kp>vEt~=tSF+<^~k|YYaSuy_6bQ!Nj)!>M-xm=gH!*Y2A0XeJt zDUiN4bJmh8mSv2P%e!gLbJT?gI43v*9Q4SiTic<%ge3CKDZ`lJW<|>N$sBJVmMD_? z>N_1cEP$DABo5A@nYcYk8SFnQU3C)LTWO$0NBd+ja0WJPA1*p#mn$9DQBjVa9Magv z(|M8*?YM$u86-A2Bmzcz@mbNy=RkwcxeNiDan2APIw;A{PDLfm^CgtdlS-}%uHff5 zOnSO4r$e7@K`x^`Rf!>;kle*BCPm=i{jx8~6kyJD)&a8HC>(qBW3F%bt zp_%oREB&CisEUsSv$@`bCjB6eO~CS4HwQg)SsHGiX?b~i Vw=tPSLox1l`AKeZ%~vTW|JfiVbr}Ev diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/modem.png b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/modem.png deleted file mode 100755 index be5a2eb2fc48a8f16681b591f4ef74888ee09c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1633 zcmV-n2A=teP)DSXo(n z6%-WGq@<)6*xA{^2Ei8OFVPRn@pc;RG z0K(}2kU_v;uacIQE|igxVPIil0lOU8LJ$V2gBcFvgF+DKL$KN}U%tQ{3j&`%e`fgj z@gvL=d;kH2(*Zz33V;^3sH&=hEe8c1aykKFkQgk@fP4zVAcH}^2L(OIK_D>@4RRES ze)sMj*gUAC{s9CKRtErm69G(cJz`>Fj2}LHfCnwe5SVX(p#$bKGczNn7qEqVe0*Tb zKx$wP1gU%b_AT5|K=waih<*VGAQtps2Pz2H)YP1#tEdz1LA-G{v90jAo(|M-Y{Iec=5@nPoJ&=1Q2>IaFvsjn`>!l$t@@-2(}dD z0GK0?EkXud!iJNWd(GMH9%!pb!uh6=itz=n=!YbLZ{?6XRZ>k+%Q> zhy`Q`&;nIpmRY8(tSkWx7KUffo-s&DO2QK#$WmB3Ko0?!SPXU#m1Z4_<00M=8Jg|USYhq#|2XZmU!j~^!g0l-ZH#ay%!+e4s0^qV7 zCl zzk}l%xnx6*cces$;#;tKkUTJDgZV%`;9LP^gB$_!J;-ce!utdC{SlxvDE_~K)Byw# z3oyP-K}9Sx5VA6|Gca)cV_^9Y%36#J|Cs)QM1f48BN)Nn1tk_xApwc!e}BRC+4mpc z86F%z4whpB71y9L1E@wA=qY;#2Zjsh&of-Ue3{|QnKSo*QNADMdk_E!AQqr6xn4eh z#qi+MGlt6_&NBGR1u$ z0{{Yu<Cx%1A~kt11BpmeSi!CrWZyY9!TmJ7G?m2;TK>OdVJl%92G$?!48NGZF}SmPF>w9nW%&C26N4Xf z00ZYQUWPA1Um5-f1~UBq_k)2IR52MCGQ4~95>y1jif%}W2lO#BFiL>+E&~^z05CCs zVmN;M_>U(~p6rME{s*!H00M|*&z?PPz=SkSTvS{D7-$Skj7;G4z`*hXOoI&m$Mlkc znS+yo>HT}K&zO058JK{<%mPXaz!VNj<)Add07`g3`se1&48M$w7?`+u!SR3g?Afcp z#0yIKkI;*KfB*tHn;DoBY=PJr$mRzc!~(>uKtn+^3nLRF3ou86#ef(n%*@Kf$jA&< z2T=p$g5`mpXJG*;`2Fr3Gnc3+Gb50H=l1Ql4<9~U4~&|{K=YrVI{+Yn7?GN0TtLhY zauAfygvLh4gw(;r{y;5$3@UKZ9RLtOj04>>0tlc1Z!hq!(QaR^6>_B54Jn1#~Jije3o~(=`7H5>`;cz1${9F%W##sAI~(r1scHM>FVdQ I&MBb@08~pNrT_o{ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/pda.png b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/pda.png deleted file mode 100755 index 1458d9bfa4ef7d27c2434177c8d54294ba9f4028..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 zcmW+%X;f1O7JkXg1|$%KLIPM`gi_jp0ZbGHH7_i($k1pRHgO1$ut<9(fPf0VEH;5s zA=Dyxuq9L0899Q>XtfG21Qdk=RTSi)EQ1{_6i^UCwl}dq?)Kwu=icw$3Vv(^&DzBp z003H4WY{5#gx(W{WZ?xTPp(-6A&d7n9sqO>1QNe~ZLyh!;faNxAImH(PRkboJmIl) z5ft@hT9)XLC{1`m{6Mq^07z$}!gz5dlj%kb<7#2N1V~S32mm?^E&&!@<5jOx&3q{o za+2cX&tua)2r{taVogmAuD$W)qm~2Jb-st=OE#9C%TaGk*+GINT|sbi^6jAAyQ69v z8kDn-+d5(SDD|F*MUq!Y8 zc(PIdZebZiFlP5@(-6e!MAaf;@5+D2xe6|d8cfdKc6~j+K7)-5c4y4Sx{BFnKaWtq z>5TRFH=1ZgLzdQf!x{T;+PrT8Xs^e8w-+;+?n9TsNf?}i%e{^x&~3>;nZbF>Wk~-xi=)I9adQP-N!XQOOPah0O(QZ>2owWjyN~2)5!9nUX;qfIGvsHp@IVxcl=2QSj-aDrbsm+71?S} z(P`Ip&yPj&*46_(_|&4!Hz=_a?i71#2Li$LLi<)nVL z!{}WfIN}P&}jcP#>G?Gb4@Dg8Slpya_Y>1sq)VLm%q6alT7GG9ciH z=o`?VqJQAg0KhTaeay7TgYio%ePJb?E);6I?M9S?xW$@CT%}tOf{H0q7 zl`i}Cu}DQlJM)s>yd2C@xO01?p`g&-I~j%}`IIk6Y_>=2dpr+&3oX_Q8)ei(kFHYPxu*ps zYp-_l-RgrA8RDn!$Lm2bgGYu5Mdd0wSFTWOo4`S!NZ7|18*^m7=q?+~d$Wx!S3~ad z+qd`d_qu8q#;X~go_&(vYbA?;RKI^rk(F-U-T(#aumx`5F2EK1)KvG2^wc{g_+chg z$@@b)Sm!5c3i<3aJ0E2Ax4)~wB=r2XF8_c%C3(*EJ1#I%Qc@Vr&3)3U6U3N=3DN{@*z34hoRim^Arg_jcG>cCncl_cW}jS2nCa`kchCB!qvQ7I z=uc6;itt-`r&{6r(~xd+mFyq3twZh~O*rUVb*%k2+a5q+M`OXKY6x!|)7R8~b} zRQte@Xl8~+psdw=Kq)?VK}7sJE0SkH5r z2LOO|aL}fmrbzs@EHI}1#M!gcreGEyuq^-pDqDQe*`ua2K4o)M%1?=LDW{poV}XE} z#OPRJ@KI)b?9Nzb%$elYSU&);tP9>05W)H1iWnwxi( z35bh~vl9bllm9;Bm|~5OTm-YU69c^q@(A*Cv!8l93qnHH5jc8{4qtAxavOpx)su3t zmNn(O!v?S*3Q-NI+Vr2lbQX(pkjT`>3dQHP@o`xjqaih3qnq&vH|)yjEDq3ENj~*X zHu!OjW0JD%1loDs^o+wRE&(SBPF;+pu?5j!9T3>*lVMBnrwD~YZ{KzQkk_w2SMZ=J zIZE+guB(d+&c)T$a-Fj2l1G_{6W`s{-5owOJPc~IUwufI!6p&g5H~n7!W>j8mF%zY zFMYYQ<@79aQSRyzgqfW~RX>{FM*E8)BA;%`zTE52*1u5AsTqPkuL_*w27&a?l9IN; z_wVB>%gb-tu1a$%d}5MpQ%I3vYUrh5^%3U}6K~I`B$W(~xC9!omvc*|iW^^r7c}#oKM-NxzD*T(-)|KN1dXb}#%=YvteLUV5fj?QWh?F#CY?Buwoy4L z=R{FRcUdeJ4u{8YHp$&Oqnr8qj_$^m$dKPUCU^0(=R~(VZA6bUq)go=uBAqky{lu% zKBp0-hnxjVXxt1HYRIW5*NEKu6jf1CANS=;c1UPw=wN#0$^fI$kcs%UORLpFBlDg% zUiZi=N;T@IJY_@(K&}VXpRdyydb2uQOiLmrGV&DW)TvV#cXwwntDO4rBcJ+lY!6vj zRYeU7UIsO>O^I_aE?;VX@?`UmQmHf@Z`|lPXI-Nw@G&>C!DM&$HJGrlH7^q7?89;q zXYQkj!zt!21nlUZeQ6rgjo>$6Uy#9Quo@>_;g^(HlSqyJJ0rTI4SFpv|5_TZ;C8*E zc3D89fkJ-s&M*}KsBvH2-$)o&e` zeQZ5Jk_XdpQME?zdYwK`@frob;-GYTS2q-mYQ^*Qa^U$AtayNjD=$k-!<_t?DR8UB zAA9RNX`3QGZ1R;Q36%0ky~Hx~5dMwxZ-2ab6L?MC5Ja8+eF$V3Gr8QodJk0dg18KZ zoR7!#@wqmLYCIpuHpa(jR3l!JujVwIf4!~)NcnMNaGE3UV%2;}W*!Z9!;|>|>Eea8 zqq7zPA%671(%VaWl*3>`+Yc2|;n3m*l99>;EN2rAZ^i+v?s$poGHzbw+Nba4L#rH6 zq+MiGe?o-}D~G1MR<^zfzq+(@km=Q-(zW}5CylOrwh4>Vb%z8_K1v z{}MwZw_Q@a*%FqqwK59Fw(zE8C3}B&C? zVuA%ti8StfH{XZc2D8U_J|AyH{NhfILtZi<_ZTM@xbX@teKzjklX>M9=8`#Ed1Jrk z`Gv38>mF)aL&|8kP52^nQ#%GVws*XEG5;VahotE%ja@!`-&8RZhC-_mDh+X z=UGQpR`C`B!&I*F7JfdG22&_W)fCFGR!FUNO{VG(#$axsU>vlzfI0g2&z!Q*(e=i$ zp6es@6#)$*^JItW*m3o4-rEJ#L9 z*=8N2x83C0Xso1i*qhR#qLO0@sT3UP1j_21GkA#Notip#m8q2W%RhAdUiaZ;f%+xn zK4GR*3$K_M2~m(W_C`&j2-->mlPx`~d~q7cUxC`=j;vVIpx3_?Pt6e|1)Vuq4x5{b zPFZAERh{-X!c9^ml40Giad7jeVKOO5Mb;ZTWn!D0;=MJC$qygRJR7J@)^-%rL@UvI zl5kl&T-?98E1c60o$b2I)!8x#^2ut6A*9!6Isf^KKJv)K7Y%>4YSykdhIk% zG3y$bafGoO=g*Eumo9S0Y=2UTz4{vsI?HNo>_F$-kz{s~yL)T=)}^wV_XwIHzG9Uf zyrDDs82Z;OeZGFzLA43QCeL`1*}N`1?pHA_%fC;wv@OD4F+%=u9u zt-<>(M_a6z@xfr+c7ypZJpinAWK!d!Ghh8dYNbMFnq_p$qt8!?WC$6CA`S#_9<50R>^sn!rDR{DTdpKSy zZnNCkjFc6LaB=N>W^3-<8=3AZQ#+&DD znap!$rDu-T1i*cbI2HlTBPDG_Nil0PGBd4YM!nW`BSW6UxbA+Ea8~^pO{zMIezf1h zX$C-~-(vtWbL>jHE0^Cf%t?YrO9MI9##yQY#miw?pxwq6g9^*n`9 zsG$Q$SFfL-v2nrJMU08YC1iBZ160*gviuODFfn)e^088ae|`Mg)1O-qhoYaF{TULJ z4A6nAW5Dp6RUV{vfKm>dkEQ#6*K^zsupk2q+Ea4=oYE*vUp*jrbJ(W)8^E;x12P5j A&;S4c diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/tablet.png b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/images/tablet.png deleted file mode 100755 index fa871f54035fcd0bb0f7f2068d2b2ed4e5e0e0cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 zcmW+&Yh02C7k>ank;hAE24+c9(=C@5nzmOHNV6i*EwWAy0MbXsy0K#HV?N8$W`pv6QT zjiNmD$4~(?B4QR`0#=CzfSwt;NKvh#!WIdB z%YB|dcjx@oo`(`bd`9z^!A(QY1iPF%6?1cRBpWIN`RzH8N~L-O;@a)6gcQs3YyzKw zS8F8Q3ey0*t9pI8N+#*A02%I+ZZ5pG(swWbrgxqRY_5pm-6ONBQaTL##bG};rs z&qhw~Rdm&{2#oiLSHT~s%W05S|HMj#%*G5_Q`N~l#tE|oK9qIHDCueJIiqjoqJ=wO z6)(8utZ6E4$g|H1?q;%R#Ct)#J#a%@GeQfg7RTQWmfVkW;@u1Y&%)-}AgKBB(WfWU zMkk(IE3Q~3d{#80MM@-ZWnYeq(Pk^lAvkxY6adTrme$>nUA@}@IHZ-*dA*#|*s z==2flXx~Gi>+WTGOz&Jfl3-vyh50 zz08MfbZ+=dFZfWOL<32pD7ipvfmfEHE?|m}55gxR!ge>D!C1>p=^xoLm$yh!(Idwi zgfB;FH=L4ZIgiApTPB@R*tXbfad!eL+$<+1CaK}0k>TOwv4{w>@Th3Bk6MY~RfkB> z(Ivu(#3IFtr>)~HAf=nZCIk?*1X^+Sf!44H<>Ea2J_3LjZLols2`mbb8JN@v^pelH zL(|XyR%Q%nUBB-kEP4+FvI&0&T$1<2_#yqM;fUgtWEXr6V#gAJ*lkiqP6$3|lCgT7 zB{O%Ke}K3p8?*IebNE`9-4>hTHEHM1ZR}NtxRe5L!&>x!o}F1JIiGcfGJ_tk(j23B zd9^gAh>x-3oVBh$4p^biJYFxBuYZ<+M*BeUCcF#`$|FQRUi|EhaNdF_Fmvd&jz+R2 zd<@1L7`L(bbFLkRxKdNex-xH5z%xV_wBO@wLfDq>x*r6C8(PCB`ewPmqIUTC+3wu` z%X@kBKEEIe6dpUUR3eiGB_T6uNcJ3M&dqn=uxkdU)P=XEzAo$M6Tl%S9w>$O?UQ+2 z)GnKb|6@RPR09h&tc?%Hut^QVq%eoKxFO_{<9%g2LQNj+VH=OVEJH8o8a++W=3 zBH|;?Qe*Ks1|_bDBaj+Vy%bu5Y0uMia(751xVUYjurf@BqYfhjFosrrVO&b=UaBJ* zRVN78NkBo!#fmE0cTcT_jX@G@AWtc#%DLj^v8gTWtqy10)QAq%X6{P@Q|Um~Nce`J z6C6{`db6PK_*$qBhHKT~6^QX= z`2pm`0;Xk>TfmW!Xr*QzEBvF%8Jp_Vg0=jd*PS>&;faj4v=c)(nbhpBxpufuO(|-M z#Q-P#lEIs7?HOWR6zM!d&uouzVwZgTrZGW@?`cWH&GeCx|9B=m+Ud-^A%LZd9FWLN z>X>TjvxiUr!YMF_{{Zg@H-9PVG{wBNO=Z=i(R;M4C*?Bd-670aa(Iqu0NPqGG(WLS zL2jo-vyV>)sfXWhyYyP2lJEQfURv$sY*5OL*_76my7x&_Gb2Gn1na~#8Q$eMq%}qT zL;!yW?cbaP%Rj|~O$kHMk5d+1g}K~m;yVXNy*yGbH0`{bq`eR+UKKnPJb(Q{G4_#x z%+Ah@K95C{cN^*wT3Hcr`U$&c!dhcBEqw6M7sMV4lO%$71xuO5(|tjH$WuP9NQ0Ip za5k6+=H&B03ge6XZIP~yM{tlF32eoRgP9~mYfNC`e9z9wMj+I=s;>H4oxLV^& z(hzt0iAT`jb*aE?)L;i^uGhlkP@h%y% z4F*xWY>D>oAR7q#t9>=b_W~AcLW!YfXg_Sl-xlb$eXWTSnjPVo7p_S5=0F|=B^c3B zBr=%nm;*@^^UG-VoV49d;qU0yoQ%fjXiSP5I22rawBFTM;`KU~c{Q$`q3#qQoPN3T zp&B#r1cUvjRxN2x{M5nc+r+o)J)E#50W0)M@Q6w6p{N zZ6g%Axx1*dc;Md~b;UWI27CD17uycnas}P0v1hRWU)K4fR1O z_GBXjE!MHHv6fqU4|87?aSAtB;K2$ODqVa6cZM+vRg51?!1GSGqHbs5$>`hH=Z$g9 zP=yCQ&n4$SZBbp%Z^6#?ct4Nl%rat>>dn=|dwj9g3_R@ck)rziA#RRI{NOwgckukd z@=SR5BNa0^UYdPf_WoIY6K3}7Jaue7@z%) zyF|hvcM#Y?q7EGb(K5dgQ+A^PC*V}dKZ6eh`6Jux$~3_-b>1`oEkSLng_yMZ$A NumberSpinner - jQuery EasyUI Mobile Demo
                                                                                                              NumberSpinner
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/input/textbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/input/textbox.html deleted file mode 100755 index a03bf1e76..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/input/textbox.html +++ /dev/null @@ -1 +0,0 @@ - TextBox - jQuery EasyUI Mobile Demo
                                                                                                              TextBox
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/layout/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/layout/basic.html deleted file mode 100755 index c1ecaffb5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/layout/basic.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Basic Layout - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Layout
                                                                                                              -
                                                                                                              - Back -
                                                                                                              -
                                                                                                              - Search -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/basic.html deleted file mode 100755 index fb9709615..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/basic.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Basic Menu - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Menu
                                                                                                              -
                                                                                                              - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Undo
                                                                                                              -
                                                                                                              Redo
                                                                                                              - -
                                                                                                              Cut
                                                                                                              -
                                                                                                              Copy
                                                                                                              -
                                                                                                              Paste
                                                                                                              - -
                                                                                                              Toolbar
                                                                                                              -
                                                                                                              Delete
                                                                                                              -
                                                                                                              Select All
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/menubar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/menubar.html deleted file mode 100755 index 5ef8eef8f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/menu/menubar.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Menubar - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - Home - Edit - Help - About -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Undo
                                                                                                              -
                                                                                                              Redo
                                                                                                              - -
                                                                                                              Cut
                                                                                                              -
                                                                                                              Copy
                                                                                                              -
                                                                                                              Paste
                                                                                                              - -
                                                                                                              Toolbar
                                                                                                              -
                                                                                                              Delete
                                                                                                              -
                                                                                                              Select All
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Help
                                                                                                              -
                                                                                                              Update
                                                                                                              -
                                                                                                              About
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/_content.html deleted file mode 100755 index 996740274..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

                                                                                                              Here is the content loaded via AJAX.

                                                                                                              -
                                                                                                                -
                                                                                                              • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                              • -
                                                                                                              • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                                                                              • -
                                                                                                              • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                              • -
                                                                                                              • complete framework for HTML5 web page.
                                                                                                              • -
                                                                                                              • easyui save your time and scales while developing your products.
                                                                                                              • -
                                                                                                              • easyui is very easy but powerful.
                                                                                                              • -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/ajax.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/ajax.html deleted file mode 100755 index e4b4f2de3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/ajax.html +++ /dev/null @@ -1 +0,0 @@ - Ajax Panel - jQuery EasyUI Mobile Demo
                                                                                                              Ajax Panel
                                                                                                              Panel Footer
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/basic.html deleted file mode 100755 index 407a2f32c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/basic.html +++ /dev/null @@ -1 +0,0 @@ - Basic Panel - jQuery EasyUI Mobile Demo
                                                                                                              Panel Header
                                                                                                              Panel Footer
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/nav.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/nav.html deleted file mode 100755 index 0362890b0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/panel/nav.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Navigation Panel - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Navigation
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Panel2
                                                                                                              -
                                                                                                              - Back -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - Go Back -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/basic.html deleted file mode 100755 index 906d94261..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/basic.html +++ /dev/null @@ -1 +0,0 @@ - Simple List - jQuery EasyUI Mobile Demo
                                                                                                              Simple List
                                                                                                              • Large
                                                                                                              • Spotted Adult Female
                                                                                                              • Venomless
                                                                                                              • Rattleless
                                                                                                              • Green Adult
                                                                                                              • Tailless
                                                                                                              • With tail
                                                                                                              • Adult Female
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/button.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/button.html deleted file mode 100755 index f326ba970..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/button.html +++ /dev/null @@ -1 +0,0 @@ - Button on List - jQuery EasyUI Mobile Demo
                                                                                                              Button on List
                                                                                                              • HP Deskjet 1000 Printer
                                                                                                                Add
                                                                                                              • Epson WorkForce 845
                                                                                                                Add
                                                                                                              • Logitech Keyboard K120
                                                                                                                Add
                                                                                                              • Nikon COOLPIX L26 16.1 MP
                                                                                                                Add
                                                                                                              • SanDisk Sansa Clip Zip 4GB
                                                                                                                Add
                                                                                                              • BLUE MP3 Metal Mini Clip Player
                                                                                                                Add
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/group.html deleted file mode 100755 index e64c2e4aa..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/group.html +++ /dev/null @@ -1 +0,0 @@ - Group List - jQuery EasyUI Mobile Demo
                                                                                                              Detail
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/image.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/image.html deleted file mode 100755 index ddf79e592..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/image.html +++ /dev/null @@ -1 +0,0 @@ - List with Image - jQuery EasyUI Mobile Demo
                                                                                                              List with Image
                                                                                                              • modem
                                                                                                                modulates an analog carrier signal to encode digital information.
                                                                                                              • scanner
                                                                                                                scans images, printed text, handwriting, or an object.
                                                                                                              • pda
                                                                                                                A personal digital assistant.
                                                                                                              • tablet
                                                                                                                one-piece mobile computer.
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/link.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/link.html deleted file mode 100755 index c630576da..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/simplelist/link.html +++ /dev/null @@ -1 +0,0 @@ - Link List - jQuery EasyUI Mobile Demo
                                                                                                              Detail
                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/basic.html deleted file mode 100755 index 4654e1256..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/basic.html +++ /dev/null @@ -1 +0,0 @@ - Basic Tabs - jQuery EasyUI Mobile Demo

                                                                                                              Java is a general-purpose, concurrent, class-based, object-oriented computer programming language that is specifically designed to have as few implementation dependencies as possible.

                                                                                                              Java applications are typically compiled to bytecode (class file) that can run on any Java virtual machine (JVM) regardless of computer architecture.

                                                                                                              Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing. Originally developed by IBM at their campus in south San Jose, California[1] in the 1950s for scientific and engineering applications.

                                                                                                              Perl is a family of high-level, general-purpose, interpreted, dynamic programming languages. The languages in this family include Perl 5 and Perl 6.

                                                                                                              Though Perl is not officially an acronym, there are various backronyms in use, such as: Practical Extraction and Reporting Language. Perl was originally developed by Larry Wall in 1987 as a general-purpose Unix scripting language to make report processing easier. Since then, it has undergone many changes and revisions.

                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/nav.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/nav.html deleted file mode 100755 index 061218f35..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/nav.html +++ /dev/null @@ -1 +0,0 @@ - Navigation Tabs - jQuery EasyUI Mobile Demo
                                                                                                              Devices

                                                                                                              Modem

                                                                                                              A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.


                                                                                                              Scanner

                                                                                                              In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.


                                                                                                              Pda

                                                                                                              A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.


                                                                                                              Pda

                                                                                                              A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/pill.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/pill.html deleted file mode 100755 index ead286386..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tabs/pill.html +++ /dev/null @@ -1 +0,0 @@ - Pill Tabs - jQuery EasyUI Mobile Demo

                                                                                                              Java is a general-purpose, concurrent, class-based, object-oriented computer programming language that is specifically designed to have as few implementation dependencies as possible.

                                                                                                              Java applications are typically compiled to bytecode (class file) that can run on any Java virtual machine (JVM) regardless of computer architecture.

                                                                                                              Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing. Originally developed by IBM at their campus in south San Jose, California[1] in the 1950s for scientific and engineering applications.

                                                                                                              Perl is a family of high-level, general-purpose, interpreted, dynamic programming languages. The languages in this family include Perl 5 and Perl 6.

                                                                                                              Though Perl is not officially an acronym, there are various backronyms in use, such as: Practical Extraction and Reporting Language. Perl was originally developed by Larry Wall in 1987 as a general-purpose Unix scripting language to make report processing easier. Since then, it has undergone many changes and revisions.

                                                                                                              \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/basic.html deleted file mode 100755 index 9bed8acb6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/basic.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Basic Toolbar - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Basic Toolbar
                                                                                                              -
                                                                                                              - Back -
                                                                                                              -
                                                                                                              - Next -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                                -
                                                                                                              • Large
                                                                                                              • -
                                                                                                              • Spotted Adult Female
                                                                                                              • -
                                                                                                              • Venomless
                                                                                                              • -
                                                                                                              • Rattleless
                                                                                                              • -
                                                                                                              • Green Adult
                                                                                                              • -
                                                                                                              • Tailless
                                                                                                              • -
                                                                                                              • With tail
                                                                                                              • -
                                                                                                              • Adult Female
                                                                                                              • -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - Detail -
                                                                                                              - Back -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - Go Back -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/button.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/button.html deleted file mode 100755 index 3db342ad0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/button.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Toolbar Button - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Toolbar Button
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                                -
                                                                                                              • Large
                                                                                                              • -
                                                                                                              • Spotted Adult Female
                                                                                                              • -
                                                                                                              • Venomless
                                                                                                              • -
                                                                                                              • Rattleless
                                                                                                              • -
                                                                                                              • Green Adult
                                                                                                              • -
                                                                                                              • Tailless
                                                                                                              • -
                                                                                                              • With tail
                                                                                                              • -
                                                                                                              • Adult Female
                                                                                                              • -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/menu.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/menu.html deleted file mode 100755 index 356747beb..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/toolbar/menu.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - Menu on Toolbar - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Menu on Toolbar
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Undo
                                                                                                              -
                                                                                                              Redo
                                                                                                              - -
                                                                                                              Cut
                                                                                                              -
                                                                                                              Copy
                                                                                                              -
                                                                                                              Paste
                                                                                                              - -
                                                                                                              Toolbar
                                                                                                              -
                                                                                                              Delete
                                                                                                              -
                                                                                                              Select All
                                                                                                              -
                                                                                                              -
                                                                                                                -
                                                                                                              • Large
                                                                                                              • -
                                                                                                              • Spotted Adult Female
                                                                                                              • -
                                                                                                              • Venomless
                                                                                                              • -
                                                                                                              • Rattleless
                                                                                                              • -
                                                                                                              • Green Adult
                                                                                                              • -
                                                                                                              • Tailless
                                                                                                              • -
                                                                                                              • With tail
                                                                                                              • -
                                                                                                              • Adult Female
                                                                                                              • -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - Detail -
                                                                                                              - Back -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - Go Back -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/basic.html deleted file mode 100755 index 9284505d2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/basic.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - Basic Tree - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Basic Tree
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                                -
                                                                                                              • - My Documents -
                                                                                                                  -
                                                                                                                • - Photos -
                                                                                                                    -
                                                                                                                  • - Friend -
                                                                                                                  • -
                                                                                                                  • - Wife -
                                                                                                                  • -
                                                                                                                  • - Company -
                                                                                                                  • -
                                                                                                                  -
                                                                                                                • -
                                                                                                                • - Program Files -
                                                                                                                    -
                                                                                                                  • Intel
                                                                                                                  • -
                                                                                                                  • Java
                                                                                                                  • -
                                                                                                                  • Microsoft Office
                                                                                                                  • -
                                                                                                                  • Games
                                                                                                                  • -
                                                                                                                  -
                                                                                                                • -
                                                                                                                • index.html
                                                                                                                • -
                                                                                                                • about.html
                                                                                                                • -
                                                                                                                • welcome.html
                                                                                                                • -
                                                                                                                -
                                                                                                              • -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/dnd.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/dnd.html deleted file mode 100755 index ecb8e3131..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo-mobile/tree/dnd.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - Drag Drop Tree Nodes - jQuery EasyUI Mobile Demo - - - - - - - - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Drag Drop Tree Nodes
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                                -
                                                                                                              • - My Documents -
                                                                                                                  -
                                                                                                                • - Photos -
                                                                                                                    -
                                                                                                                  • - Friend -
                                                                                                                  • -
                                                                                                                  • - Wife -
                                                                                                                  • -
                                                                                                                  • - Company -
                                                                                                                  • -
                                                                                                                  -
                                                                                                                • -
                                                                                                                • - Program Files -
                                                                                                                    -
                                                                                                                  • Intel
                                                                                                                  • -
                                                                                                                  • Java
                                                                                                                  • -
                                                                                                                  • Microsoft Office
                                                                                                                  • -
                                                                                                                  • Games
                                                                                                                  • -
                                                                                                                  -
                                                                                                                • -
                                                                                                                • index.html
                                                                                                                • -
                                                                                                                • about.html
                                                                                                                • -
                                                                                                                • welcome.html
                                                                                                                • -
                                                                                                                -
                                                                                                              • -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/_content.html deleted file mode 100755 index 996740274..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

                                                                                                              Here is the content loaded via AJAX.

                                                                                                              -
                                                                                                                -
                                                                                                              • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                              • -
                                                                                                              • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                                                                              • -
                                                                                                              • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                              • -
                                                                                                              • complete framework for HTML5 web page.
                                                                                                              • -
                                                                                                              • easyui save your time and scales while developing your products.
                                                                                                              • -
                                                                                                              • easyui is very easy but powerful.
                                                                                                              • -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/actions.html deleted file mode 100755 index f895ebb01..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/actions.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - Accordion Actions - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Accordion Actions

                                                                                                              -

                                                                                                              Click the buttons below to add or remove accordion items.

                                                                                                              -
                                                                                                              - Select - Add - Remove -
                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              Accordion for jQuery

                                                                                                              -

                                                                                                              Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/ajax.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/ajax.html deleted file mode 100755 index e5c77f330..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/ajax.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Loading Accordion Content with AJAX - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Loading Accordion Content with AJAX

                                                                                                              -

                                                                                                              Click AJAX panel header to load content via AJAX.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              Accordion for jQuery

                                                                                                              -

                                                                                                              Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/basic.html deleted file mode 100755 index b643f5b53..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/basic.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Basic Accordion - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic Accordion

                                                                                                              -

                                                                                                              Click on panel header to show its content.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              Accordion for jQuery

                                                                                                              -

                                                                                                              Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                                -
                                                                                                              • - Foods -
                                                                                                                  -
                                                                                                                • - Fruits -
                                                                                                                    -
                                                                                                                  • apple
                                                                                                                  • -
                                                                                                                  • orange
                                                                                                                  • -
                                                                                                                  -
                                                                                                                • -
                                                                                                                • - Vegetables -
                                                                                                                    -
                                                                                                                  • tomato
                                                                                                                  • -
                                                                                                                  • carrot
                                                                                                                  • -
                                                                                                                  • cabbage
                                                                                                                  • -
                                                                                                                  • potato
                                                                                                                  • -
                                                                                                                  • lettuce
                                                                                                                  • -
                                                                                                                  -
                                                                                                                • -
                                                                                                                -
                                                                                                              • -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/datagrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/datagrid_data1.json deleted file mode 100755 index 63d647358..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/datagrid_data1.json +++ /dev/null @@ -1,12 +0,0 @@ -{"total":28,"rows":[ - {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, - {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, - {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, - {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} -]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/expandable.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/expandable.html deleted file mode 100755 index 5353ca51a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/expandable.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Keep Expandable Panel in Accordion - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Keep Expandable Panel in Accordion

                                                                                                              -

                                                                                                              Keep a expandable panel and prevent it from collapsing.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              -

                                                                                                              Accordion for jQuery

                                                                                                              -

                                                                                                              Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              Content1

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              Content2

                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/fluid.html deleted file mode 100755 index 184880266..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/fluid.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Fluid Accordion - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid Accordion

                                                                                                              -

                                                                                                              This example shows how to set the width of accordion to a percentage of its parent container.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              width: 100%

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              -

                                                                                                              width: 50%

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/horizontal.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/horizontal.html deleted file mode 100755 index c52d25f0b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/horizontal.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Horizontal Accordion - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Horizontal Accordion

                                                                                                              -

                                                                                                              You can easily set the 'halign' property to create a horizontal accordion.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              Accordion for jQuery

                                                                                                              -

                                                                                                              Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              The accordion allows you to provide multiple panels and display one or more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                                -
                                                                                                              • - Foods -
                                                                                                                  -
                                                                                                                • - Fruits -
                                                                                                                    -
                                                                                                                  • apple
                                                                                                                  • -
                                                                                                                  • orange
                                                                                                                  • -
                                                                                                                  -
                                                                                                                • -
                                                                                                                • - Vegetables -
                                                                                                                    -
                                                                                                                  • tomato
                                                                                                                  • -
                                                                                                                  • carrot
                                                                                                                  • -
                                                                                                                  • cabbage
                                                                                                                  • -
                                                                                                                  • potato
                                                                                                                  • -
                                                                                                                  • lettuce
                                                                                                                  • -
                                                                                                                  -
                                                                                                                • -
                                                                                                                -
                                                                                                              • -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/multiple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/multiple.html deleted file mode 100755 index 12b90a83c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/multiple.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Multiple Accordion Panels - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Multiple Accordion Panels

                                                                                                              -

                                                                                                              Enable 'multiple' mode to expand multiple panels at one time.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              A programming language is a formal language designed to communicate instructions to a machine, particularly a computer. Programming languages can be used to create programs that control the behavior of a machine and/or to express algorithms precisely.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              Java (Indonesian: Jawa) is an island of Indonesia. With a population of 135 million (excluding the 3.6 million on the island of Madura which is administered as part of the provinces of Java), Java is the world's most populous island, and one of the most densely populated places in the world.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              C# is a multi-paradigm programming language encompassing strong typing, imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              A dynamic, reflective, general-purpose object-oriented programming language.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              Fortran (previously FORTRAN) is a general-purpose, imperative programming language that is especially suited to numeric computation and scientific computing.

                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/tools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/tools.html deleted file mode 100755 index 271694b46..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/accordion/tools.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Accordion Tools - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Accordion Tools

                                                                                                              -

                                                                                                              Click the tools on top right of panel to perform actions.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              Accordion for jQuery

                                                                                                              -

                                                                                                              Accordion is a part of easyui framework for jQuery. It lets you define your accordion component on web page more easily.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              The accordion allows you to provide multiple panels and display one ore more at a time. Each panel has built-in support for expanding and collapsing. Clicking on a panel header to expand or collapse that panel body. The panel content can be loaded via ajax by specifying a 'href' property. Users can define a panel to be selected. If it is not specified, then the first panel is taken by default.

                                                                                                              -
                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProduct IDList PriceUnit CostAttributeStatus
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/basic.html deleted file mode 100755 index 64f37fe84..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/basic.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Basic Calendar - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic Calendar

                                                                                                              -

                                                                                                              Click to select date.

                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/custom.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/custom.html deleted file mode 100755 index f3fea452c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/custom.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Custom Calendar - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Custom Calendar

                                                                                                              -

                                                                                                              This example shows how to custom the calendar date by using 'formatter' function.

                                                                                                              -
                                                                                                              - -
                                                                                                              - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/disabledate.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/disabledate.html deleted file mode 100755 index ef2c7ea59..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/disabledate.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Disable Calendar Date - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Disable Calendar Date

                                                                                                              -

                                                                                                              This example shows how to disable specified dates, only allows the user to select Mondays.

                                                                                                              -
                                                                                                              - -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/firstday.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/firstday.html deleted file mode 100755 index c636a0700..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/firstday.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - First Day of Week - jQuery EasyUI Demo - - - - - - - -

                                                                                                              First Day of Week

                                                                                                              -

                                                                                                              Choose the first day of the week.

                                                                                                              - -
                                                                                                              - -
                                                                                                              - -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/fluid.html deleted file mode 100755 index e5e707024..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/fluid.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Fluid Calendar - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid Calendar

                                                                                                              -

                                                                                                              This example shows how to set the width of calendar to a percentage of its parent container.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              width: 50%, height: 250px

                                                                                                              -
                                                                                                              -

                                                                                                              width: 30%, height: 40%

                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/weeknumber.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/weeknumber.html deleted file mode 100755 index 37d38b243..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/calendar/weeknumber.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Week Number on Calendar - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Week Number on Calendar

                                                                                                              -

                                                                                                              This example shows how to display the week number on calendar.

                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/animation.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/animation.html deleted file mode 100755 index 4f1d4af90..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/animation.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Combo Animation - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Combo Animation

                                                                                                              -

                                                                                                              Change the animation type when open & close the drop-down panel.

                                                                                                              -
                                                                                                              - Animation Type: - -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/basic.html deleted file mode 100755 index cd966241a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combo/basic.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Basic Combo - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic Combo

                                                                                                              -

                                                                                                              Click the right arrow button to show drop down panel that can be filled with any content.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Select a language
                                                                                                              -
                                                                                                              - Java
                                                                                                              - C#
                                                                                                              - Ruby
                                                                                                              - Basic
                                                                                                              - Fortran -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/actions.html deleted file mode 100755 index a883e174d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/actions.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - ComboBox Actions - jQuery EasyUI Demo - - - - - - - -

                                                                                                              ComboBox

                                                                                                              -

                                                                                                              Click the buttons below to perform actions.

                                                                                                              - - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/basic.html deleted file mode 100755 index 1f268ea57..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/basic.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Basic ComboBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic ComboBox

                                                                                                              -

                                                                                                              Type in ComboBox to try auto complete.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data1.json deleted file mode 100755 index 9c8f7f5b1..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data1.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "id":1, - "text":"Java", - "desc":"Write once, run anywhere" -},{ - "id":2, - "text":"C#", - "desc":"One of the programming languages designed for the Common Language Infrastructure" -},{ - "id":3, - "text":"Ruby", - "selected":true, - "desc":"A dynamic, reflective, general-purpose object-oriented programming language" -},{ - "id":4, - "text":"Perl", - "desc":"A high-level, general-purpose, interpreted, dynamic programming language" -},{ - "id":5, - "text":"Basic", - "desc":"A family of general-purpose, high-level programming languages" -}] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data2.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data2.json deleted file mode 100755 index c3baf77dc..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/combobox_data2.json +++ /dev/null @@ -1,47 +0,0 @@ -[{ - "value":"f20", - "text":"Firefox 2.0 or higher", - "group":"Firefox" -},{ - "value":"f15", - "text":"Firefox 1.5.x", - "group":"Firefox" -},{ - "value":"f10", - "text":"Firefox 1.0.x", - "group":"Firefox" -},{ - "value":"ie7", - "text":"Microsoft Internet Explorer 7.0 or higher", - "group":"Microsoft Internet Explorer" -},{ - "value":"ie6", - "text":"Microsoft Internet Explorer 6.x", - "group":"Microsoft Internet Explorer" -},{ - "value":"ie5", - "text":"Microsoft Internet Explorer 5.x", - "group":"Microsoft Internet Explorer" -},{ - "value":"ie4", - "text":"Microsoft Internet Explorer 4.x", - "group":"Microsoft Internet Explorer" -},{ - "value":"op9", - "text":"Opera 9.0 or higher", - "group":"Opera" -},{ - "value":"op8", - "text":"Opera 8.x", - "group":"Opera" -},{ - "value":"op7", - "text":"Opera 7.x", - "group":"Opera" -},{ - "value":"Safari", - "text":"Safari" -},{ - "value":"Other", - "text":"Other" -}] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/customformat.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/customformat.html deleted file mode 100755 index 4ccadfe86..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/customformat.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Custom Format in ComboBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Custom Format in ComboBox

                                                                                                              -

                                                                                                              This sample shows how to custom the format of list item.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/dynamicdata.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/dynamicdata.html deleted file mode 100755 index ce151461a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/dynamicdata.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Load Dynamic ComboBox Data - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Load Dynamic ComboBox Data

                                                                                                              -

                                                                                                              Click the button below to load data.

                                                                                                              - -
                                                                                                              - LoadData -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/fluid.html deleted file mode 100755 index 0f5cd2596..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/fluid.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Fluid ComboBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid ComboBox

                                                                                                              -

                                                                                                              This example shows how to set the width of combobox to a percentage of its parent container.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/group.html deleted file mode 100755 index 8bc3ad87c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/group.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Group ComboBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Group ComboBox

                                                                                                              -

                                                                                                              This example shows how to display combobox items in groups.

                                                                                                              -
                                                                                                              - - Sticky Group -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/icons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/icons.html deleted file mode 100755 index 0c30cc1fa..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/icons.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - ComboBox with Extra Icons- jQuery EasyUI Demo - - - - - - - -

                                                                                                              ComboBox with Extra Icons

                                                                                                              -

                                                                                                              The user can attach extra icons to the ComboBox.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/itemicon.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/itemicon.html deleted file mode 100644 index 6a818197c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/itemicon.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Show Item Icon in ComboBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Show Item Icon in ComboBox

                                                                                                              -

                                                                                                              This example shows how to display item icon in ComboBox.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiline.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiline.html deleted file mode 100755 index 133221f3a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiline.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Multiline ComboBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Multiline ComboBox

                                                                                                              -

                                                                                                              This example shows how to create a multiline ComboBox.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiple.html deleted file mode 100755 index 9fd2a114b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/multiple.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Multiple Select - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Load Dynamic ComboBox Data

                                                                                                              -

                                                                                                              Drop down the panel and select multiple items.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/navigation.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/navigation.html deleted file mode 100755 index 691bc7c07..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/navigation.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - Navigate ComboBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Navigate ComboBox

                                                                                                              -

                                                                                                              Navigate through combobox items width keyboard to select an item.

                                                                                                              -
                                                                                                              - - SelectOnNavigation -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotedata.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotedata.html deleted file mode 100755 index 8277d27d6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotedata.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Binding to Remote Data - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Binding to Remote Data

                                                                                                              -

                                                                                                              The ComboBox is bound to a remote data.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotejsonp.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotejsonp.html deleted file mode 100755 index 1fbc04fdb..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combobox/remotejsonp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Remote JSONP - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Remote JSONP

                                                                                                              -

                                                                                                              This sample shows how to use JSONP to retrieve data from a remote site.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/actions.html deleted file mode 100755 index 64443e5fe..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/actions.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - ComboGrid Actions - jQuery EasyUI Demo - - - - - - - -

                                                                                                              ComboGrid Actions

                                                                                                              -

                                                                                                              Click the buttons below to perform actions.

                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/basic.html deleted file mode 100755 index 3edc31ee2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/basic.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Basic ComboGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic ComboGrid

                                                                                                              -

                                                                                                              Click the right arrow button to show the DataGrid.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/datagrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/datagrid_data1.json deleted file mode 100755 index c74fa230d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/datagrid_data1.json +++ /dev/null @@ -1,12 +0,0 @@ -{"total":28,"rows":[ - {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, - {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, - {"selected":true,"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, - {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} -]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/fluid.html deleted file mode 100755 index 52b0ac75e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/fluid.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - Fluid ComboGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid ComboGrid

                                                                                                              -

                                                                                                              This example shows how to set the width of ComboGrid to a percentage of its parent container.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/initvalue.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/initvalue.html deleted file mode 100755 index be122a091..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/initvalue.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Initialize Value for ComboGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Initialize Value for ComboGrid

                                                                                                              -

                                                                                                              Initialize value when ComboGrid is created.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/multiple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/multiple.html deleted file mode 100755 index c357d7be8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/multiple.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Multiple ComboGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Multiple ComboGrid

                                                                                                              -

                                                                                                              Click the right arrow button to show the DataGrid and select items.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/navigation.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/navigation.html deleted file mode 100755 index 793c74e1a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/navigation.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Navigate ComboGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Navigate ComboGrid

                                                                                                              -

                                                                                                              Navigate through grid items with keyboard to select an item.

                                                                                                              -
                                                                                                              - - SelectOnNavigation -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/setvalue.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/setvalue.html deleted file mode 100755 index df86ba4e2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combogrid/setvalue.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Set Value for ComboGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Set Value for ComboGrid

                                                                                                              -

                                                                                                              Click the buttons below to perform actions.

                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/actions.html deleted file mode 100755 index 1d4660af2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/actions.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - ComboTree Actions - jQuery EasyUI Demo - - - - - - - -

                                                                                                              ComboTree Actions

                                                                                                              -

                                                                                                              Click the buttons below to perform actions

                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/basic.html deleted file mode 100755 index 687207cbf..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/basic.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Basic ComboTree - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic ComboTree

                                                                                                              -

                                                                                                              Click the right arrow button to show the tree panel.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/fluid.html deleted file mode 100755 index bc77d9e6a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid ComboTree - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid ComboTree

                                                                                                              -

                                                                                                              This example shows how to set the width of ComboTree to a percentage of its parent container.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/initvalue.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/initvalue.html deleted file mode 100755 index 92af22ddc..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/initvalue.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Initialize Value for ComboTree - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Initialize Value for ComboTree

                                                                                                              -

                                                                                                              Initialize Value when ComboTree is created.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/multiple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/multiple.html deleted file mode 100755 index 7ae86eab3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/multiple.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Multiple ComboTree - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Multiple ComboTree

                                                                                                              -

                                                                                                              Click the right arrow button to show the tree panel and select multiple nodes.

                                                                                                              -
                                                                                                              - Cascade Check: - -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/tree_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/tree_data1.json deleted file mode 100755 index e0c619226..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotree/tree_data1.json +++ /dev/null @@ -1,49 +0,0 @@ -[{ - "id":1, - "text":"My Documents", - "children":[{ - "id":11, - "text":"Photos", - "state":"closed", - "children":[{ - "id":111, - "text":"Friend" - },{ - "id":112, - "text":"Wife" - },{ - "id":113, - "text":"Company" - }] - },{ - "id":12, - "text":"Program Files", - "children":[{ - "id":121, - "text":"Intel" - },{ - "id":122, - "text":"Java", - "attributes":{ - "p1":"Custom Attribute1", - "p2":"Custom Attribute2" - } - },{ - "id":123, - "text":"Microsoft Office" - },{ - "id":124, - "text":"Games", - "checked":true - }] - },{ - "id":13, - "text":"index.html" - },{ - "id":14, - "text":"about.html" - },{ - "id":15, - "text":"welcome.html" - }] -}] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/basic.html deleted file mode 100755 index f4fac4bfb..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/basic.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Basic ComboTreeGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic ComboTreeGrid

                                                                                                              -

                                                                                                              Click the right arrow button to show the TreeGrid.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/multiple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/multiple.html deleted file mode 100755 index 91d35299c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/multiple.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - Multiple ComboTreeGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Multiple ComboTreeGrid

                                                                                                              -

                                                                                                              Click the right arrow button to show the TreeGrid and select items.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json deleted file mode 100755 index 6cc109739..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/combotreegrid/treegrid_data1.json +++ /dev/null @@ -1,73 +0,0 @@ -[{ - "id":1, - "name":"C", - "size":"", - "date":"02/19/2010", - "children":[{ - "id":2, - "name":"Program Files", - "size":"120 MB", - "date":"03/20/2010", - "children":[{ - "id":21, - "name":"Java", - "size":"", - "date":"01/13/2010", - "state":"closed", - "children":[{ - "id":211, - "name":"java.exe", - "size":"142 KB", - "date":"01/13/2010" - },{ - "id":212, - "name":"jawt.dll", - "size":"5 KB", - "date":"01/13/2010" - }] - },{ - "id":22, - "name":"MySQL", - "size":"", - "date":"01/13/2010", - "state":"closed", - "children":[{ - "id":221, - "name":"my.ini", - "size":"10 KB", - "date":"02/26/2009" - },{ - "id":222, - "name":"my-huge.ini", - "size":"5 KB", - "date":"02/26/2009" - },{ - "id":223, - "name":"my-large.ini", - "size":"5 KB", - "date":"02/26/2009" - }] - }] - },{ - "id":3, - "name":"eclipse", - "size":"", - "date":"01/20/2010", - "children":[{ - "id":31, - "name":"eclipse.exe", - "size":"56 KB", - "date":"05/19/2009" - },{ - "id":32, - "name":"eclipse.ini", - "size":"1 KB", - "date":"04/20/2010" - },{ - "id":33, - "name":"notice.html", - "size":"7 KB", - "date":"03/17/2005" - }] - }] -}] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/aligncolumns.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/aligncolumns.html deleted file mode 100755 index 602196211..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/aligncolumns.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Aligning Columns in DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Aligning Columns in DataGrid

                                                                                                              -

                                                                                                              Use align and halign properties to set the alignment of the columns and their header.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/basic.html deleted file mode 100755 index 6870ac217..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/basic.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Basic DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic DataGrid

                                                                                                              -

                                                                                                              The DataGrid is created from markup, no JavaScript code needed.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cacheeditor.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cacheeditor.html deleted file mode 100755 index df55e30f6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cacheeditor.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - Cache Editor for DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Cache Editor for DataGrid

                                                                                                              -

                                                                                                              This example shows how to cache the editors for datagrid to improve the editing speed.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellediting.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellediting.html deleted file mode 100755 index 385b2d4d8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellediting.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - Cell Editing in DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Cell Editing in DataGrid

                                                                                                              -

                                                                                                              Click a cell to start editing.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellstyle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellstyle.html deleted file mode 100755 index 9230ac214..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/cellstyle.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - DataGrid Cell Style - jQuery EasyUI Demo - - - - - - - -

                                                                                                              DataGrid Cell Style

                                                                                                              -

                                                                                                              The cells which listprice value is less than 30 are highlighted.

                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/checkbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/checkbox.html deleted file mode 100755 index ca1c81c2e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/checkbox.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - CheckBox Selection on DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              CheckBox Selection on DataGrid

                                                                                                              -

                                                                                                              Click the checkbox on header to select or unselect all selections.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              -
                                                                                                              - Selection Mode: -
                                                                                                              - SelectOnCheck:
                                                                                                              - CheckOnSelect: -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/clientpagination.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/clientpagination.html deleted file mode 100755 index 3bec54cd8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/clientpagination.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - Client Side Pagination in DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Client Side Pagination in DataGrid

                                                                                                              -

                                                                                                              This sample shows how to implement client side pagination in DataGrid.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - - -
                                                                                                              Inv NoDateNameAmountPriceCostNote
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/columngroup.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/columngroup.html deleted file mode 100755 index 9c3340e11..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/columngroup.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Column Group - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Column Group

                                                                                                              -

                                                                                                              The header cells can be merged. Useful to group columns under a category.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - - - -
                                                                                                              Item IDProductItem Details
                                                                                                              List PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/complextoolbar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/complextoolbar.html deleted file mode 100755 index 35c9ba186..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/complextoolbar.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - DataGrid Complex Toolbar - jQuery EasyUI Demo - - - - - - - -

                                                                                                              DataGrid Complex Toolbar

                                                                                                              -

                                                                                                              The DataGrid toolbar can be defined from a <div> markup, so you can define the layout of toolbar easily.

                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              -
                                                                                                              - Date From: - To: - Language: - - Search -
                                                                                                              -
                                                                                                              - - - - - -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/contextmenu.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/contextmenu.html deleted file mode 100755 index 4da2f842d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/contextmenu.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - Context Menu on DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Context Menu on DataGrid

                                                                                                              -

                                                                                                              Right click on the header of DataGrid to display context menu.

                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/custompager.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/custompager.html deleted file mode 100755 index c4c62d707..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/custompager.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Custom DataGrid Pager - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Custom DataGrid Pager

                                                                                                              -

                                                                                                              You can append some buttons to the standard datagrid pager bar.

                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data1.json deleted file mode 100755 index 63d647358..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data1.json +++ /dev/null @@ -1,12 +0,0 @@ -{"total":28,"rows":[ - {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, - {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, - {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, - {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} -]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data2.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data2.json deleted file mode 100755 index ce91babf0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/datagrid_data2.json +++ /dev/null @@ -1,15 +0,0 @@ -{"total":28,"rows":[ - {"productid":"FI-SW-01","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, - {"productid":"K9-DL-01","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, - {"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":28.50,"attr1":"Venomless","itemid":"EST-11"}, - {"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, - {"productid":"RP-LI-02","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, - {"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, - {"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, - {"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":63.50,"attr1":"Adult Female","itemid":"EST-16"}, - {"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, - {"productid":"AV-CB-01","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} -],"footer":[ - {"unitcost":19.80,"listprice":60.40,"productid":"Average:"}, - {"unitcost":198.00,"listprice":604.00,"productid":"Total:"} -]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/fluid.html deleted file mode 100755 index 463f570c5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/fluid.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Fluid DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid DataGrid

                                                                                                              -

                                                                                                              This example shows how to assign percentage width to a column in DataGrid.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - -
                                                                                                              Item ID(15%)Product(15%)List Price(15%)Unit Cost(15%)Attribute(25%)Status(15%)
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/footer.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/footer.html deleted file mode 100755 index ccb8885fa..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/footer.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - Footer Rows in DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Footer Rows in DataGrid

                                                                                                              -

                                                                                                              The summary informations can be displayed in footer rows.

                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProduct IDList PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/formatcolumns.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/formatcolumns.html deleted file mode 100755 index e5a2e0252..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/formatcolumns.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Format DataGrid Columns - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Format DataGrid Columns

                                                                                                              -

                                                                                                              The list price value will show red color when less than 30.

                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozencolumns.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozencolumns.html deleted file mode 100755 index 3542017b4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozencolumns.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Frozen Columns in DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Frozen Columns in DataGrid

                                                                                                              -

                                                                                                              You can freeze some columns that can't scroll out of view.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - - - - -
                                                                                                              Item IDProduct
                                                                                                              List PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozenrows.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozenrows.html deleted file mode 100755 index be27afd83..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/frozenrows.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Frozen Rows in DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Frozen Rows in DataGrid

                                                                                                              -

                                                                                                              This sample shows how to freeze some rows that will always be displayed at the top when the datagrid is scrolled down.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - - - - -
                                                                                                              Item IDProduct
                                                                                                              List PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/mergecells.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/mergecells.html deleted file mode 100755 index 3d0ff75e8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/mergecells.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Merge Cells for DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Merge Cells for DataGrid

                                                                                                              -

                                                                                                              Cells in DataGrid body can be merged.

                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              ProductItem IDList PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/multisorting.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/multisorting.html deleted file mode 100755 index d7337f3d8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/multisorting.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Multiple Sorting - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Multiple Sorting

                                                                                                              -

                                                                                                              Set 'multiSort' property to true to enable multiple column sorting.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/products.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/products.json deleted file mode 100755 index b0b6a936e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/products.json +++ /dev/null @@ -1,9 +0,0 @@ -[ -{"productid":"FI-SW-01","productname":"Koi"}, -{"productid":"K9-DL-01","productname":"Dalmation"}, -{"productid":"RP-SN-01","productname":"Rattlesnake"}, -{"productid":"RP-LI-02","productname":"Iguana"}, -{"productid":"FL-DSH-01","productname":"Manx"}, -{"productid":"FL-DLH-02","productname":"Persian"}, -{"productid":"AV-CB-01","productname":"Amazon Parrot"} -] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowborder.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowborder.html deleted file mode 100755 index 21843f451..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowborder.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - Row Border in DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Row Border in DataGrid

                                                                                                              -

                                                                                                              This sample shows how to change the row border style of datagrid.

                                                                                                              -
                                                                                                              - Border: - - Striped: - -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowediting.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowediting.html deleted file mode 100755 index c9dd52683..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowediting.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - Row Editing in DataGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Row Editing in DataGrid

                                                                                                              -

                                                                                                              Click the row to start editing.

                                                                                                              -
                                                                                                              - - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowstyle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowstyle.html deleted file mode 100755 index d4e36a877..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/rowstyle.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - DataGrid Row Style - jQuery EasyUI Demo - - - - - - - -

                                                                                                              DataGrid Row Style

                                                                                                              -

                                                                                                              The rows which listprice value is less than 30 are highlighted.

                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/selection.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/selection.html deleted file mode 100755 index d6b4047bc..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/selection.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - DataGrid Selection - jQuery EasyUI Demo - - - - - - - -

                                                                                                              DataGrid Selection

                                                                                                              -

                                                                                                              Choose a selection mode and select one or more rows.

                                                                                                              - - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              -
                                                                                                              - Selection Mode: - -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/simpletoolbar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/simpletoolbar.html deleted file mode 100755 index 4c67f56e7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/simpletoolbar.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - DataGrid with Toolbar - jQuery EasyUI Demo - - - - - - - -

                                                                                                              DataGrid with Toolbar

                                                                                                              -

                                                                                                              Put buttons on top toolbar of DataGrid.

                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceUnit CostAttributeStatus
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/transform.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/transform.html deleted file mode 100755 index 9379832ae..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datagrid/transform.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Transform DataGrid from Table - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Transform DataGrid from Table

                                                                                                              -

                                                                                                              Transform DataGrid from an existing, unformatted html table.

                                                                                                              -
                                                                                                              - Transform -
                                                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                              Item IDProductList PriceAttribute
                                                                                                              EST-1FI-SW-0136.50Large
                                                                                                              EST-10K9-DL-0118.50Spotted Adult Female
                                                                                                              EST-11RP-SN-0128.50Venomless
                                                                                                              EST-12RP-SN-0126.50Rattleless
                                                                                                              EST-13RP-LI-0235.50Green Adult
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/basic.html deleted file mode 100644 index 491021908..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/basic.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - Basic DataList - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic DataList

                                                                                                              -

                                                                                                              The DataList can be created from the <ul> element.

                                                                                                              -
                                                                                                              -
                                                                                                                -
                                                                                                              • Alabama
                                                                                                              • -
                                                                                                              • Alaska
                                                                                                              • -
                                                                                                              • Arizona
                                                                                                              • -
                                                                                                              • Arkansas
                                                                                                              • -
                                                                                                              • California
                                                                                                              • -
                                                                                                              • Colorado
                                                                                                              • -
                                                                                                              • Connecticut
                                                                                                              • -
                                                                                                              • Delaware
                                                                                                              • -
                                                                                                              • Florida
                                                                                                              • -
                                                                                                              • Georgia
                                                                                                              • -
                                                                                                              • Hawaii
                                                                                                              • -
                                                                                                              • Idaho
                                                                                                              • -
                                                                                                              • Illinois
                                                                                                              • -
                                                                                                              • Indiana
                                                                                                              • -
                                                                                                              • Iowa
                                                                                                              • -
                                                                                                              • Kansas
                                                                                                              • -
                                                                                                              • Kentucky
                                                                                                              • -
                                                                                                              • Louisiana
                                                                                                              • -
                                                                                                              • Maine
                                                                                                              • -
                                                                                                              • Maryland
                                                                                                              • -
                                                                                                              • Massachusetts
                                                                                                              • -
                                                                                                              • Michigan
                                                                                                              • -
                                                                                                              • Minnesota
                                                                                                              • -
                                                                                                              • Mississippi
                                                                                                              • -
                                                                                                              • Missouri
                                                                                                              • -
                                                                                                              • Montana
                                                                                                              • -
                                                                                                              • Nebraska
                                                                                                              • -
                                                                                                              • Nevada
                                                                                                              • -
                                                                                                              • New Hampshire
                                                                                                              • -
                                                                                                              • New Jersey
                                                                                                              • -
                                                                                                              • New Mexico
                                                                                                              • -
                                                                                                              • New York
                                                                                                              • -
                                                                                                              • North Carolina
                                                                                                              • -
                                                                                                              • North Dakota
                                                                                                              • -
                                                                                                              • Ohio
                                                                                                              • -
                                                                                                              • Oklahoma
                                                                                                              • -
                                                                                                              • Oregon
                                                                                                              • -
                                                                                                              • Pennsylvania
                                                                                                              • -
                                                                                                              • Rhode Island
                                                                                                              • -
                                                                                                              • South Carolina
                                                                                                              • -
                                                                                                              • South Dakota
                                                                                                              • -
                                                                                                              • Tennessee
                                                                                                              • -
                                                                                                              • Texas
                                                                                                              • -
                                                                                                              • Utah
                                                                                                              • -
                                                                                                              • Vermont
                                                                                                              • -
                                                                                                              • Virginia
                                                                                                              • -
                                                                                                              • Washington
                                                                                                              • -
                                                                                                              • West Virginia
                                                                                                              • -
                                                                                                              • Wisconsin
                                                                                                              • -
                                                                                                              • Wyoming
                                                                                                              • -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/checkbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/checkbox.html deleted file mode 100644 index dd18f5b1c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/checkbox.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Checkbox in DataList - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Checkbox in DataList

                                                                                                              -

                                                                                                              Each item in the DataList has a checkbox.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/datalist_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/datalist_data1.json deleted file mode 100644 index d53cf62a0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/datalist_data1.json +++ /dev/null @@ -1,18 +0,0 @@ -[ -{"text":"Epson WorkForce 845","group":"Printer"}, -{"text":"Canon PIXMA MG5320","group":"Printer"}, -{"text":"HP Deskjet 1000 Printer","group":"Printer"}, -{"text":"Cisco RV110W-A-NA-K9","group":"Firewall"}, -{"text":"ZyXEL ZyWALL USG50","group":"Firewall"}, -{"text":"NETGEAR FVS318","group":"Firewall"}, -{"text":"Logitech Keyboard K120","group":"Keyboard"}, -{"text":"Microsoft Natural Ergonomic Keyboard 4000","group":"Keyboard"}, -{"text":"Logitech Wireless Touch Keyboard K400","group":"Keyboard"}, -{"text":"Logitech Gaming Keyboard G110","group":"Keyboard"}, -{"text":"Nikon COOLPIX L26 16.1 MP","group":"Camera"}, -{"text":"Canon PowerShot A1300","group":"Camera"}, -{"text":"Canon PowerShot A2300","group":"Camera"} - - - -] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/group.html deleted file mode 100644 index bf22b6f03..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/group.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Group DataList - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Group DataList

                                                                                                              -

                                                                                                              This example shows how to display items in groups.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/multiselect.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/multiselect.html deleted file mode 100644 index 704924c6a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/multiselect.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Multiple Selection DataList - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Multiple Selection DataList

                                                                                                              -

                                                                                                              The multiple selection allows the user to select multiple items in a datalist.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/remotedata.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/remotedata.html deleted file mode 100644 index 0c71604aa..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datalist/remotedata.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Binding to Remote Data - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Binding to Remote Data

                                                                                                              -

                                                                                                              The DataList is bound to a remote data.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/basic.html deleted file mode 100755 index ccbde6f3d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic DateBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic DateBox

                                                                                                              -

                                                                                                              Click the calendar image on the right side.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/buttons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/buttons.html deleted file mode 100755 index 10b566a58..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/buttons.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - DateBox Buttons - jQuery EasyUI Demo - - - - - - - -

                                                                                                              DateBox Buttons

                                                                                                              -

                                                                                                              This example shows how to customize the datebox buttons underneath the calendar.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/clone.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/clone.html deleted file mode 100755 index be975ecc7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/clone.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Clone DateBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Clone DateBox

                                                                                                              -

                                                                                                              Click the 'Clone' button to clone datebox components from the exiting datebox.

                                                                                                              -
                                                                                                              - Clone -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/dateformat.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/dateformat.html deleted file mode 100755 index 3fa8b3b62..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/dateformat.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Date Format - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Date Format

                                                                                                              -

                                                                                                              Different date formats are applied to different DateBox components.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/events.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/events.html deleted file mode 100755 index 3d75faefd..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/events.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - DateBox Events - jQuery EasyUI Demo - - - - - - - -

                                                                                                              DateBox Events

                                                                                                              -

                                                                                                              Click the calendar image on the right side.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - Selected Date: - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/fluid.html deleted file mode 100755 index 3bf3dd400..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid DateBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid DateBox

                                                                                                              -

                                                                                                              This example shows how to set the width of DateBox to a percentage of its parent container.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/restrict.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/restrict.html deleted file mode 100755 index 0622efe49..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/restrict.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Restrict Date Range in DateBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Restrict Date Range in DateBox

                                                                                                              -

                                                                                                              This example shows how to restrict the user to select only ten days from now.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/sharedcalendar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/sharedcalendar.html deleted file mode 100644 index ca06eb82a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/sharedcalendar.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Shared Calendar in DateBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Shared Calendar in DateBox

                                                                                                              -

                                                                                                              Multiple datebox components can share a calendar and use it to pick dates.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/validate.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/validate.html deleted file mode 100755 index 067582dba..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datebox/validate.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Validate DateBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Validate DateBox

                                                                                                              -

                                                                                                              When the selected date is greater than specified date. The field validator will raise an error.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/basic.html deleted file mode 100755 index f1521d02c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic DateTimeBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic DateTimeBox

                                                                                                              -

                                                                                                              Click the calendar image on the right side.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/fluid.html deleted file mode 100755 index 827a1b2a0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid DateTimeBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid DateTimeBox

                                                                                                              -

                                                                                                              This example shows how to set the width of DateTimeBox to a percentage of its parent container.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/initvalue.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/initvalue.html deleted file mode 100755 index 59079f556..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/initvalue.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Initialize Value for DateTime - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Initialize Value for DateTime

                                                                                                              -

                                                                                                              The value is initialized when DateTimeBox has been created.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/showseconds.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/showseconds.html deleted file mode 100755 index 508ac19ff..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimebox/showseconds.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Display Seconds - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Display Seconds

                                                                                                              -

                                                                                                              The user can decide to display seconds part or not.

                                                                                                              -
                                                                                                              - Show Seconds: - -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/basic.html deleted file mode 100644 index 8a00c41a2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic DateTimeSpinner - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic DateTimeSpinner

                                                                                                              -

                                                                                                              Click spin button to adjust date and time.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/clearicon.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/clearicon.html deleted file mode 100644 index 74e2795d0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/clearicon.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - DateTimeSpinner with Clear Icon - jQuery EasyUI Demo - - - - - - - -

                                                                                                              DateTimeSpinner with Clear Icon

                                                                                                              -

                                                                                                              A clear icon can be attached to the datetimespinner. Click it to clear the entered value.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/fluid.html deleted file mode 100644 index e5e3f1fe9..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid DateTimeSpinner - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid DateTimeSpinner

                                                                                                              -

                                                                                                              The width of datetimespinner is set in percentages.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/format.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/format.html deleted file mode 100644 index f470c715b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/datetimespinner/format.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Format DateTimeSpinner - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Format DateTimeSpinner

                                                                                                              -

                                                                                                              The DataTimeSpinner value can be formatted by specifying the 'formatter' and 'parser' functions.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/demo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/demo.css deleted file mode 100755 index fe8b3c70a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/demo.css +++ /dev/null @@ -1,24 +0,0 @@ -body { - font-family:verdana,helvetica,arial,sans-serif; - padding:20px; - font-size:12px; - margin:0; -} -h2 { - font-size:18px; - font-weight:bold; - margin:0; - margin-bottom:15px; -} -.demo-info{ - padding:0 0 12px 0; -} -.demo-tip{ - display:none; -} -.label-top{ - display: block; - height: 22px; - line-height: 22px; - vertical-align: middle; -} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/basic.html deleted file mode 100755 index 37ca83059..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/basic.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Basic Dialog - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic Dialog

                                                                                                              -

                                                                                                              Click below button to open or close dialog.

                                                                                                              -
                                                                                                              - Open - Close -
                                                                                                              -
                                                                                                              - The dialog content. -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/complextoolbar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/complextoolbar.html deleted file mode 100755 index adaa97b7b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/complextoolbar.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Complex Toolbar on Dialog - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Complex Toolbar on Dialog

                                                                                                              -

                                                                                                              This sample shows how to create complex toolbar on dialog.

                                                                                                              -
                                                                                                              - Open - Close -
                                                                                                              -
                                                                                                              - The dialog content. -
                                                                                                              -
                                                                                                              - - - - - -
                                                                                                              - Edit - Help - - -
                                                                                                              -
                                                                                                              -
                                                                                                              - Save - Close -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/fluid.html deleted file mode 100755 index f64f72e0d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/fluid.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Fluid Dialog - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid Dialog

                                                                                                              -

                                                                                                              This example shows how to set the width of Dialog to a percentage of its parent container.

                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              width: 80%; height: 200px

                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/toolbarbuttons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/toolbarbuttons.html deleted file mode 100755 index 12e230758..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/dialog/toolbarbuttons.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Toolbar and Buttons - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Toolbar and Buttons

                                                                                                              -

                                                                                                              The toolbar and buttons can be added to dialog.

                                                                                                              -
                                                                                                              - Open - Close -
                                                                                                              -
                                                                                                              - The dialog content. -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/basic.html deleted file mode 100755 index 3a73cf230..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/basic.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Basic Draggable - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic Draggable

                                                                                                              -

                                                                                                              Move the boxes below by clicking on it with mouse.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Title
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/constrain.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/constrain.html deleted file mode 100755 index b72e3ff44..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/constrain.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Constrain Draggable - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Constrain Draggable

                                                                                                              -

                                                                                                              The draggable object can only be moved within its parent container.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/snap.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/snap.html deleted file mode 100755 index c3ddd0584..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/draggable/snap.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Snap Draggable - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Snap Draggable

                                                                                                              -

                                                                                                              This sample shows how to snap a draggable object to a 20x20 grid.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/accept.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/accept.html deleted file mode 100755 index 8da0d42cd..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/accept.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - Accept a Drop - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Accept a Drop

                                                                                                              -

                                                                                                              Some draggable object can not be accepted.

                                                                                                              -
                                                                                                              -
                                                                                                              - drag me! -
                                                                                                              Drag 1
                                                                                                              -
                                                                                                              Drag 2
                                                                                                              -
                                                                                                              Drag 3
                                                                                                              -
                                                                                                              -
                                                                                                              - drop here! -
                                                                                                              -
                                                                                                              - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/basic.html deleted file mode 100755 index 7738c0688..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/basic.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - Basic Droppable - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic Droppable

                                                                                                              -

                                                                                                              Drag the boxed on left to the target area on right.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Source
                                                                                                              -
                                                                                                              -
                                                                                                              Apple
                                                                                                              -
                                                                                                              Peach
                                                                                                              -
                                                                                                              Orange
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Target
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/sort.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/sort.html deleted file mode 100755 index 1d99cd822..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/droppable/sort.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Change Items Order - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Change Items Order

                                                                                                              -

                                                                                                              Drag the list items to change their order.

                                                                                                              -
                                                                                                              -
                                                                                                                -
                                                                                                              • Drag 1
                                                                                                              • -
                                                                                                              • Drag 2
                                                                                                              • -
                                                                                                              • Drag 3
                                                                                                              • -
                                                                                                              • Drag 4
                                                                                                              • -
                                                                                                              • Drag 5
                                                                                                              • -
                                                                                                              • Drag 6
                                                                                                              • -
                                                                                                              - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/easyloader/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/easyloader/basic.html deleted file mode 100755 index 0d7ba7b12..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/easyloader/basic.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Basic EasyLoader - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic EasyLoader

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              Click the buttons below to load components dynamically.
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              -
                                                                                                              - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/basic.html deleted file mode 100644 index 394dcf983..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/basic.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Basic FileBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic FileBox

                                                                                                              -

                                                                                                              The filebox component represents a file field of the forms.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - Upload -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/buttonalign.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/buttonalign.html deleted file mode 100644 index 072a4067c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/buttonalign.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Button Align on FileBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Button Align on FileBox

                                                                                                              -

                                                                                                              Change the button align to the left or right of filebox.

                                                                                                              -
                                                                                                              - Select Button Align: - -
                                                                                                              -
                                                                                                              - -
                                                                                                              - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/fluid.html deleted file mode 100644 index 67eaf1dfa..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/filebox/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid FileBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Fluid FileBox

                                                                                                              -

                                                                                                              This example shows how to set the width of FileBox to a percentage of its parent container.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/basic.html deleted file mode 100755 index 7df82aa02..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/basic.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Basic Form - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic Form

                                                                                                              -

                                                                                                              Fill the form and submit it.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              -
                                                                                                              - Submit - Clear -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/form_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/form_data1.json deleted file mode 100755 index 4ac269bfc..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/form_data1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name":"easyui", - "email":"easyui@gmail.com", - "subject":"Subject Title", - "message":"Message Content", - "language":"de", - "accept":"true" -} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/load.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/load.html deleted file mode 100755 index c699b6ece..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/load.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Load Form Data - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Load Form Data

                                                                                                              -

                                                                                                              Click the buttons below to load form data.

                                                                                                              - -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - - -
                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/validateonsubmit.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/validateonsubmit.html deleted file mode 100755 index 2c0c349fd..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/form/validateonsubmit.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Validate Form on Submit - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Validate Form on Submit

                                                                                                              -

                                                                                                              The form does not perform validation before being submitted.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              - -
                                                                                                              -
                                                                                                              -
                                                                                                              - Submit - Clear -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/_content.html deleted file mode 100755 index 76f2506a6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

                                                                                                              jQuery EasyUI framework help you build your web page easily.

                                                                                                              -
                                                                                                                -
                                                                                                              • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                              • -
                                                                                                              • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                                                                              • -
                                                                                                              • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                              • -
                                                                                                              • complete framework for HTML5 web page.
                                                                                                              • -
                                                                                                              • easyui save your time and scales while developing your products.
                                                                                                              • -
                                                                                                              • easyui is very easy but powerful.
                                                                                                              • -
                                                                                                              - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/addremove.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/addremove.html deleted file mode 100755 index ede288918..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/addremove.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Add and Remove Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Add and Remove Layout

                                                                                                              -

                                                                                                              Click the buttons below to add or remove region panel of layout.

                                                                                                              -
                                                                                                              - Select Region Panel: - - Add - Remove -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/autoheight.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/autoheight.html deleted file mode 100755 index b9ccc7e3d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/autoheight.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Auto Height for Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Auto Height for Layout

                                                                                                              -

                                                                                                              This example shows how to auto adjust layout height after dynamically adding items.

                                                                                                              - -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -

                                                                                                              Panel Content.

                                                                                                              -

                                                                                                              Panel Content.

                                                                                                              -

                                                                                                              Panel Content.

                                                                                                              -

                                                                                                              Panel Content.

                                                                                                              -

                                                                                                              Panel Content.

                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/basic.html deleted file mode 100755 index f428724fe..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/basic.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Basic Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Basic Layout

                                                                                                              -

                                                                                                              The layout contains north,south,west,east and center regions.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProduct IDList PriceUnit CostAttributeStatus
                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/collapsetitle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/collapsetitle.html deleted file mode 100755 index 0d103e65f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/collapsetitle.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Collapse Title in Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Collapse Title in Layout

                                                                                                              -

                                                                                                              The title bar will display while collapse a region panel.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              - - - - - - - - - - - -
                                                                                                              Item IDProduct IDList PriceUnit CostAttributeStatus
                                                                                                              -
                                                                                                              -
                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/complex.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/complex.html deleted file mode 100755 index 9d1ab66a0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/complex.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Complex Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                              Complex Layout

                                                                                                              -

                                                                                                              This sample shows how to create a complex layout.

                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                              -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - content1 -
                                                                                                                -
                                                                                                                - content2 -
                                                                                                                -
                                                                                                                - content3 -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - - - - - - - - - -
                                                                                                                Item IDProduct IDList PriceUnit CostAttributeStatus
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/customcollapsetitle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/customcollapsetitle.html deleted file mode 100755 index 945b6afaa..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/customcollapsetitle.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - Custom Collapse Title in Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Custom Collapse Title in Layout

                                                                                                                -

                                                                                                                Any components can display on the title bar of a collapsed panel.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - - - - - - - - - -
                                                                                                                Item IDProduct IDList PriceUnit CostAttributeStatus
                                                                                                                -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/datagrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/datagrid_data1.json deleted file mode 100755 index 63d647358..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/datagrid_data1.json +++ /dev/null @@ -1,12 +0,0 @@ -{"total":28,"rows":[ - {"productid":"FI-SW-01","productname":"Koi","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"}, - {"productid":"K9-DL-01","productname":"Dalmation","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":38.50,"attr1":"Venomless","itemid":"EST-11"}, - {"productid":"RP-SN-01","productname":"Rattlesnake","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"}, - {"productid":"RP-LI-02","productname":"Iguana","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"}, - {"productid":"FL-DSH-01","productname":"Manx","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":23.50,"attr1":"Adult Female","itemid":"EST-16"}, - {"productid":"FL-DLH-02","productname":"Persian","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"}, - {"productid":"AV-CB-01","productname":"Amazon Parrot","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"} -]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/fluid.html deleted file mode 100755 index 8ddd50fc4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/fluid.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Fluid Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Fluid Layout

                                                                                                                -

                                                                                                                Percentage width of region panel in a layout.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -

                                                                                                                width: 30%

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/full.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/full.html deleted file mode 100755 index 13eb94ade..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/full.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Full Layout - jQuery EasyUI Demo - - - - - - - -
                                                                                                                north region
                                                                                                                -
                                                                                                                west content
                                                                                                                -
                                                                                                                east region
                                                                                                                -
                                                                                                                south region
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nestedlayout.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nestedlayout.html deleted file mode 100755 index b0e1b2c18..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nestedlayout.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Nested Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Nested Layout

                                                                                                                -

                                                                                                                The layout region panel contains another layout or other components.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nocollapsible.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nocollapsible.html deleted file mode 100755 index 5854b2d0b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/nocollapsible.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - No collapsible button in Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                                No collapsible button in Layout

                                                                                                                -

                                                                                                                The layout region panel has no collapsible button.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/propertygrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/propertygrid_data1.json deleted file mode 100755 index a458d83fc..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/propertygrid_data1.json +++ /dev/null @@ -1,20 +0,0 @@ -{"total":7,"rows":[ - {"name":"Name","value":"Bill Smith","group":"ID Settings","editor":"text"}, - {"name":"Address","value":"","group":"ID Settings","editor":"text"}, - {"name":"Age","value":"40","group":"ID Settings","editor":"numberbox"}, - {"name":"Birthday","value":"01/02/2012","group":"ID Settings","editor":"datebox"}, - {"name":"SSN","value":"123-456-7890","group":"ID Settings","editor":"text"}, - {"name":"Email","value":"bill@gmail.com","group":"Marketing Settings","editor":{ - "type":"validatebox", - "options":{ - "validType":"email" - } - }}, - {"name":"FrequentBuyer","value":"false","group":"Marketing Settings","editor":{ - "type":"checkbox", - "options":{ - "on":true, - "off":false - } - }} -]} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/tree_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/tree_data1.json deleted file mode 100755 index e0c619226..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/layout/tree_data1.json +++ /dev/null @@ -1,49 +0,0 @@ -[{ - "id":1, - "text":"My Documents", - "children":[{ - "id":11, - "text":"Photos", - "state":"closed", - "children":[{ - "id":111, - "text":"Friend" - },{ - "id":112, - "text":"Wife" - },{ - "id":113, - "text":"Company" - }] - },{ - "id":12, - "text":"Program Files", - "children":[{ - "id":121, - "text":"Intel" - },{ - "id":122, - "text":"Java", - "attributes":{ - "p1":"Custom Attribute1", - "p2":"Custom Attribute2" - } - },{ - "id":123, - "text":"Microsoft Office" - },{ - "id":124, - "text":"Games", - "checked":true - }] - },{ - "id":13, - "text":"index.html" - },{ - "id":14, - "text":"about.html" - },{ - "id":15, - "text":"welcome.html" - }] -}] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/basic.html deleted file mode 100755 index d46c47f63..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/basic.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Basic LinkButton - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic LinkButton

                                                                                                                -

                                                                                                                Buttons can be created from <a> or <button> elements.

                                                                                                                -
                                                                                                                -

                                                                                                                Basic Buttons

                                                                                                                -
                                                                                                                - Add - Remove - Save - Cut - Text Button -
                                                                                                                -

                                                                                                                Fixed Width Buttons

                                                                                                                -
                                                                                                                - Search - Print - Reload - Help -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/fluid.html deleted file mode 100755 index cb033e774..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/fluid.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Fluid LinkButton - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Fluid LinkButton

                                                                                                                -

                                                                                                                This example shows how to set the width of LinkButton to a percentage of its parent container.

                                                                                                                -
                                                                                                                -

                                                                                                                width: 15%

                                                                                                                -
                                                                                                                - Add - Remove - Save - Cut - Text Button -
                                                                                                                -

                                                                                                                width: 20%

                                                                                                                -
                                                                                                                - Search - Print - Reload - Help -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/group.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/group.html deleted file mode 100755 index 4c1293d9b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/group.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Button Group - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Button Group

                                                                                                                -

                                                                                                                In a button group only one button can be selected.

                                                                                                                -
                                                                                                                - -
                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/iconalign.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/iconalign.html deleted file mode 100755 index 21835f089..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/iconalign.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Icon Align on LinkButton - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Icon Align on LinkButton

                                                                                                                -

                                                                                                                Change the icon align to place icon on left, right, top or bottom of button.

                                                                                                                -
                                                                                                                -
                                                                                                                - Select Icon Align: - -
                                                                                                                -
                                                                                                                - Add - Remove - Save - Cut -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/plain.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/plain.html deleted file mode 100755 index 71c89cd65..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/plain.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Plain LinkButton - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Plain LinkButton

                                                                                                                -

                                                                                                                The buttons with plain style have transparent background.

                                                                                                                -
                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/size.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/size.html deleted file mode 100755 index 3e121bb4c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/size.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - LinkButton Size - jQuery EasyUI Demo - - - - - - - -

                                                                                                                LinkButton Size

                                                                                                                -

                                                                                                                This sample shows how to display small buttons and large buttons.

                                                                                                                -
                                                                                                                -

                                                                                                                Small Buttons

                                                                                                                -
                                                                                                                - Add - Remove - Save - Cut - Text Button -
                                                                                                                -

                                                                                                                Large Buttons

                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/style.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/style.html deleted file mode 100755 index fe61dd927..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/style.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Style LinkButton - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Style LinkButton

                                                                                                                -

                                                                                                                This example shows how to style a linkbutton.

                                                                                                                -
                                                                                                                - - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/toggle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/toggle.html deleted file mode 100755 index 352001a3e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/linkbutton/toggle.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Toggle Button - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Toggle Button

                                                                                                                -

                                                                                                                Click the button below to switch its selected state.

                                                                                                                -
                                                                                                                -
                                                                                                                - Add - Remove - Save - Cut - Text Button -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/maskedbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/maskedbox/basic.html deleted file mode 100755 index 780f987af..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/maskedbox/basic.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Basic MaskedBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic MaskedBox

                                                                                                                -

                                                                                                                The maskedbox enforces its structure as the user types.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/basic.html deleted file mode 100755 index c1bf0d35e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/basic.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Basic Menu - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic Menu

                                                                                                                -

                                                                                                                Right click on page to display menu.

                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                New
                                                                                                                -
                                                                                                                - Open -
                                                                                                                -
                                                                                                                Word
                                                                                                                -
                                                                                                                Excel
                                                                                                                -
                                                                                                                PowerPoint
                                                                                                                -
                                                                                                                - M1 -
                                                                                                                -
                                                                                                                sub1
                                                                                                                -
                                                                                                                sub2
                                                                                                                -
                                                                                                                - Sub -
                                                                                                                -
                                                                                                                sub21
                                                                                                                -
                                                                                                                sub22
                                                                                                                -
                                                                                                                sub23
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                sub3
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - Window Demos -
                                                                                                                -
                                                                                                                Window
                                                                                                                -
                                                                                                                Dialog
                                                                                                                - -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Save
                                                                                                                -
                                                                                                                Print
                                                                                                                - -
                                                                                                                Exit
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/customitem.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/customitem.html deleted file mode 100755 index 43b35e999..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/customitem.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - Custom Menu Item - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Custom Menu Item

                                                                                                                -

                                                                                                                Right click on page to display menu, move to the 'Open' item to display its custom sub content.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                New
                                                                                                                -
                                                                                                                - Open - -
                                                                                                                -
                                                                                                                Save
                                                                                                                -
                                                                                                                Print
                                                                                                                - -
                                                                                                                Exit
                                                                                                                -
                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/events.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/events.html deleted file mode 100755 index c26b060d5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/events.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Menu Events - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Menu Events

                                                                                                                -

                                                                                                                Right click on page to display menu and click an item.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                New
                                                                                                                -
                                                                                                                Save
                                                                                                                -
                                                                                                                Print
                                                                                                                - -
                                                                                                                Exit
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/inline.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/inline.html deleted file mode 100755 index e23e3ae75..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/inline.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Inline Menu - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Inline Menu

                                                                                                                -

                                                                                                                The inline menu stays inside its parent container.

                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                -
                                                                                                                New
                                                                                                                -
                                                                                                                - Open -
                                                                                                                -
                                                                                                                Word
                                                                                                                -
                                                                                                                Excel
                                                                                                                -
                                                                                                                PowerPoint
                                                                                                                -
                                                                                                                - M1 -
                                                                                                                -
                                                                                                                sub1
                                                                                                                -
                                                                                                                sub2
                                                                                                                -
                                                                                                                - Sub -
                                                                                                                -
                                                                                                                sub21
                                                                                                                -
                                                                                                                sub22
                                                                                                                -
                                                                                                                sub23
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                sub3
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - Window Demos -
                                                                                                                -
                                                                                                                Window
                                                                                                                -
                                                                                                                Dialog
                                                                                                                - -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Save
                                                                                                                -
                                                                                                                Print
                                                                                                                - -
                                                                                                                Exit
                                                                                                                -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/nav.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/nav.html deleted file mode 100755 index bc419df1c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menu/nav.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - Keyboard Navigation in Menu - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Keyboard Navigation in Menu

                                                                                                                -

                                                                                                                Press Alt+W to focus the menu. Once the menu get focus, you will be able to navigate menu using keyboard keys.

                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                -
                                                                                                                New
                                                                                                                -
                                                                                                                - Open -
                                                                                                                -
                                                                                                                Word
                                                                                                                -
                                                                                                                Excel
                                                                                                                -
                                                                                                                PowerPoint
                                                                                                                -
                                                                                                                - M1 -
                                                                                                                -
                                                                                                                sub1
                                                                                                                -
                                                                                                                sub2
                                                                                                                -
                                                                                                                - Sub -
                                                                                                                -
                                                                                                                sub21
                                                                                                                -
                                                                                                                sub22
                                                                                                                -
                                                                                                                sub23
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                sub3
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - Window Demos -
                                                                                                                -
                                                                                                                Window
                                                                                                                -
                                                                                                                Dialog
                                                                                                                -
                                                                                                                EasyUI
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Save
                                                                                                                -
                                                                                                                Print
                                                                                                                - -
                                                                                                                Exit
                                                                                                                -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/actions.html deleted file mode 100755 index 5d447fe98..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/actions.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - MenuButton Actions - jQuery EasyUI Demo - - - - - - - -

                                                                                                                MenuButton Actions

                                                                                                                -

                                                                                                                Click the buttons below to perform actions.

                                                                                                                - -
                                                                                                                - Home - Edit - Help - About -
                                                                                                                -
                                                                                                                -
                                                                                                                Undo
                                                                                                                -
                                                                                                                Redo
                                                                                                                - -
                                                                                                                Cut
                                                                                                                -
                                                                                                                Copy
                                                                                                                -
                                                                                                                Paste
                                                                                                                - -
                                                                                                                - Toolbar -
                                                                                                                -
                                                                                                                Address
                                                                                                                -
                                                                                                                Link
                                                                                                                -
                                                                                                                Navigation Toolbar
                                                                                                                -
                                                                                                                Bookmark Toolbar
                                                                                                                - -
                                                                                                                New Toolbar...
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Delete
                                                                                                                -
                                                                                                                Select All
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Help
                                                                                                                -
                                                                                                                Update
                                                                                                                -
                                                                                                                About
                                                                                                                -
                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/alignment.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/alignment.html deleted file mode 100755 index f34f89a03..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/alignment.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - Menu Alignment on MenuButton - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Menu Alignment on MenuButton

                                                                                                                -

                                                                                                                This example shows how to change the alignment of the top level menu.

                                                                                                                -
                                                                                                                - Change Alignment: - -
                                                                                                                -
                                                                                                                - Home - Edit - Help - About - -
                                                                                                                -
                                                                                                                -
                                                                                                                Undo
                                                                                                                -
                                                                                                                Redo
                                                                                                                - -
                                                                                                                Cut
                                                                                                                -
                                                                                                                Copy
                                                                                                                -
                                                                                                                Paste
                                                                                                                - -
                                                                                                                - Toolbar -
                                                                                                                -
                                                                                                                Address
                                                                                                                -
                                                                                                                Link
                                                                                                                -
                                                                                                                Navigation Toolbar
                                                                                                                -
                                                                                                                Bookmark Toolbar
                                                                                                                - -
                                                                                                                New Toolbar...
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Delete
                                                                                                                -
                                                                                                                Select All
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Help
                                                                                                                -
                                                                                                                Update
                                                                                                                -
                                                                                                                About
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                History
                                                                                                                -
                                                                                                                Faq
                                                                                                                -
                                                                                                                Our Team
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/basic.html deleted file mode 100755 index 932309b76..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/basic.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Basic MenuButton - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic MenuButton

                                                                                                                -

                                                                                                                Move mouse over the button to drop down menu.

                                                                                                                -
                                                                                                                -
                                                                                                                - Home - Edit - Help - About -
                                                                                                                -
                                                                                                                -
                                                                                                                Undo
                                                                                                                -
                                                                                                                Redo
                                                                                                                - -
                                                                                                                Cut
                                                                                                                -
                                                                                                                Copy
                                                                                                                -
                                                                                                                Paste
                                                                                                                - -
                                                                                                                - Toolbar -
                                                                                                                -
                                                                                                                Address
                                                                                                                -
                                                                                                                Link
                                                                                                                -
                                                                                                                Navigation Toolbar
                                                                                                                -
                                                                                                                Bookmark Toolbar
                                                                                                                - -
                                                                                                                New Toolbar...
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Delete
                                                                                                                -
                                                                                                                Select All
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Help
                                                                                                                -
                                                                                                                Update
                                                                                                                -
                                                                                                                About
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/nav.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/nav.html deleted file mode 100755 index 7c34b3d47..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/menubutton/nav.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - Keyboard Navigation in MenuButton - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Keyboard Navigation in MenuButton

                                                                                                                -

                                                                                                                Press Alt+W to focus the menubutton. Once the menubutton get focus, you will be able to navigate menubutton using keyboard keys.

                                                                                                                -
                                                                                                                -
                                                                                                                - Home - Edit - Help - About -
                                                                                                                -
                                                                                                                -
                                                                                                                Undo
                                                                                                                -
                                                                                                                Redo
                                                                                                                - -
                                                                                                                Cut
                                                                                                                -
                                                                                                                Copy
                                                                                                                -
                                                                                                                Paste
                                                                                                                - -
                                                                                                                - Toolbar -
                                                                                                                -
                                                                                                                Address
                                                                                                                -
                                                                                                                Link
                                                                                                                -
                                                                                                                Navigation Toolbar
                                                                                                                -
                                                                                                                Bookmark Toolbar
                                                                                                                - -
                                                                                                                New Toolbar...
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Delete
                                                                                                                -
                                                                                                                Select All
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Help
                                                                                                                -
                                                                                                                Update
                                                                                                                -
                                                                                                                About
                                                                                                                -
                                                                                                                - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/alert.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/alert.html deleted file mode 100755 index a69c16603..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/alert.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Alert Messager - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Alert Messager

                                                                                                                -

                                                                                                                Click on each button to display different alert message box.

                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/basic.html deleted file mode 100755 index 65026efc4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/basic.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - Basic Messager - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic Messager

                                                                                                                -

                                                                                                                Click on each button to see a distinct message box.

                                                                                                                -
                                                                                                                - Show - Slide - Fade - Progress -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/interactive.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/interactive.html deleted file mode 100755 index e71224312..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/interactive.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - Interactive Messager - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Interactive Messager

                                                                                                                -

                                                                                                                Click on each button to display interactive message box.

                                                                                                                -
                                                                                                                - Confirm - Prompt -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/position.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/position.html deleted file mode 100755 index 6a6273e96..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/messager/position.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - Message Box Position - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Message Box Position

                                                                                                                -

                                                                                                                Click the buttons below to display message box on different position.

                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/basic.html deleted file mode 100755 index 3b1a68416..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/basic.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Basic NumberBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic NumberBox

                                                                                                                -

                                                                                                                The NumberBox can only accept inputing numbers.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/fluid.html deleted file mode 100755 index 4b5981e97..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/fluid.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Fluid NumberBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Fluid NumberBox

                                                                                                                -

                                                                                                                This example shows how to set the width of NumberBox to a percentage of its parent container.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/format.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/format.html deleted file mode 100755 index 8fcb82239..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/format.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Format NumberBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Format NumberBox

                                                                                                                -

                                                                                                                Number formatting is the ability to control how a number is displayed.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/range.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/range.html deleted file mode 100755 index fee11e961..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberbox/range.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Number Range - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Number Range

                                                                                                                -

                                                                                                                The value is constrained to a specified range.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/align.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/align.html deleted file mode 100755 index f36a681f3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/align.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Number Spin Alignment - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Number Spin Alignment

                                                                                                                -

                                                                                                                This example shows how to set different spin alignments on numberspinner.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/basic.html deleted file mode 100755 index b04560d7f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/basic.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Basic NumberSpinner - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic NumberSpinner

                                                                                                                -

                                                                                                                Click spinner button to change value.

                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                - Value: -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/fluid.html deleted file mode 100755 index 69c94f5c9..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid NumberSpinner - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Fluid NumberSpinner

                                                                                                                -

                                                                                                                This example shows how to set the width of NumberSpinner to a percentage of its parent container.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/increment.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/increment.html deleted file mode 100755 index 76eab5845..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/increment.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Increment Number - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Increment Number

                                                                                                                -

                                                                                                                The sample shows how to set the increment step.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/range.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/range.html deleted file mode 100755 index a0a037278..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/numberspinner/range.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Number Range - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Number Range

                                                                                                                -

                                                                                                                The value is constrained to a range between 10 and 100.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/attaching.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/attaching.html deleted file mode 100755 index 0e56bb35e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/attaching.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Attaching Other Components - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Attaching Other Components

                                                                                                                -

                                                                                                                Any other components can be attached to page bar.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - - - -
                                                                                                                - - - -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/basic.html deleted file mode 100755 index bcdba63df..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/basic.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Basic Pagination - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic Pagination

                                                                                                                -

                                                                                                                The user can change page number and page size on page bar.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/custombuttons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/custombuttons.html deleted file mode 100755 index 113e92116..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/custombuttons.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - Custom Pagination Buttons - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Custom Pagination Buttons

                                                                                                                -

                                                                                                                The customized buttons can be appended to page bar.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/layout.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/layout.html deleted file mode 100755 index 1992f4ecb..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/layout.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Pagination Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Pagination Layout

                                                                                                                -

                                                                                                                The pagination layout supports various types of pages which you can choose.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/links.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/links.html deleted file mode 100755 index dafab34b7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/links.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Pagination Links - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Pagination Links

                                                                                                                -

                                                                                                                The example shows how to customize numbered pagination links.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/simple.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/simple.html deleted file mode 100755 index 23a0eee08..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/pagination/simple.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Simplify Pagination - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Simplify Pagination

                                                                                                                -

                                                                                                                The sample shows how to simplify pagination.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/_content.html deleted file mode 100755 index 996740274..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

                                                                                                                Here is the content loaded via AJAX.

                                                                                                                -
                                                                                                                  -
                                                                                                                • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                • -
                                                                                                                • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                                                                                • -
                                                                                                                • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                • -
                                                                                                                • complete framework for HTML5 web page.
                                                                                                                • -
                                                                                                                • easyui save your time and scales while developing your products.
                                                                                                                • -
                                                                                                                • easyui is very easy but powerful.
                                                                                                                • -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/basic.html deleted file mode 100755 index ec0e535d9..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/basic.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Basic Panel - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic Panel

                                                                                                                -

                                                                                                                The panel is a container for other components or elements.

                                                                                                                -
                                                                                                                - Open - Close -
                                                                                                                -
                                                                                                                -

                                                                                                                jQuery EasyUI framework helps you build your web pages easily.

                                                                                                                -
                                                                                                                  -
                                                                                                                • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                • -
                                                                                                                • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                                                                • -
                                                                                                                • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                • -
                                                                                                                • complete framework for HTML5 web page.
                                                                                                                • -
                                                                                                                • easyui save your time and scales while developing your products.
                                                                                                                • -
                                                                                                                • easyui is very easy but powerful.
                                                                                                                • -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/customtools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/customtools.html deleted file mode 100755 index 670001e9b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/customtools.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Custom Panel Tools - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Custom Panel Tools

                                                                                                                -

                                                                                                                Click the right top buttons to perform actions with panel.

                                                                                                                -
                                                                                                                -
                                                                                                                -

                                                                                                                jQuery EasyUI framework helps you build your web pages easily.

                                                                                                                -
                                                                                                                  -
                                                                                                                • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                • -
                                                                                                                • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                                                                • -
                                                                                                                • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                • -
                                                                                                                • complete framework for HTML5 web page.
                                                                                                                • -
                                                                                                                • easyui save your time and scales while developing your products.
                                                                                                                • -
                                                                                                                • easyui is very easy but powerful.
                                                                                                                • -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - - -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/fluid.html deleted file mode 100755 index 72510f23d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/fluid.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Fluid Panel - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Fluid Panel

                                                                                                                -

                                                                                                                This example shows how to set the width of Panel to a percentage of its parent container.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -

                                                                                                                The panel has a width of 100%.

                                                                                                                -

                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/footer.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/footer.html deleted file mode 100755 index 31e6385c2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/footer.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Panel Footer - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Panel Footer

                                                                                                                -

                                                                                                                The panel footer is displayed at the bottom of the panel and can consist of any other components.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/halign.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/halign.html deleted file mode 100755 index 77ae7b499..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/halign.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Panel Header Alignment - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Panel Header Alignment

                                                                                                                -

                                                                                                                The panel header can be aligned horizontally or vertically.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/loadcontent.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/loadcontent.html deleted file mode 100755 index 6db638d39..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/loadcontent.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Load Panel Content - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Load Panel Content

                                                                                                                -

                                                                                                                Click the refresh button on top right of panel to load content.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/nestedpanel.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/nestedpanel.html deleted file mode 100755 index 28f51703d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/nestedpanel.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Nested Panel - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Nested Panel

                                                                                                                -

                                                                                                                The panel can be placed inside containers and can contain other components.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - Left Content -
                                                                                                                -
                                                                                                                - Right Content -
                                                                                                                -
                                                                                                                - Center Content -
                                                                                                                -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/paneltools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/paneltools.html deleted file mode 100755 index 47efc11f7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/panel/paneltools.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Panel Tools - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Panel Tools

                                                                                                                -

                                                                                                                Click the right top buttons to perform actions with panel.

                                                                                                                - -
                                                                                                                -
                                                                                                                -

                                                                                                                jQuery EasyUI framework helps you build your web pages easily.

                                                                                                                -
                                                                                                                  -
                                                                                                                • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                • -
                                                                                                                • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                                                                • -
                                                                                                                • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                • -
                                                                                                                • complete framework for HTML5 web page.
                                                                                                                • -
                                                                                                                • easyui save your time and scales while developing your products.
                                                                                                                • -
                                                                                                                • easyui is very easy but powerful.
                                                                                                                • -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/basic.html deleted file mode 100644 index f725bc087..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic PasswordBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic PasswordBox

                                                                                                                -

                                                                                                                The passwordbox allows a user to enter passwords.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/flash.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/flash.html deleted file mode 100644 index 391a09cda..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/flash.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Flash PasswordBox Letters - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Flash PasswordBox Letters

                                                                                                                -

                                                                                                                This example shows how to flash the entered password letter by letter.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/validatepassword.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/validatepassword.html deleted file mode 100644 index 630dbc7a1..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/passwordbox/validatepassword.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Validate Password - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Validate Password

                                                                                                                -

                                                                                                                This example shows how to validate whether a user enters the same password.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/basic.html deleted file mode 100755 index 966d5560f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/basic.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Basic ProgressBar - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic ProgressBar

                                                                                                                -

                                                                                                                Click the button below to show progress information.

                                                                                                                -
                                                                                                                - Start -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/fluid.html deleted file mode 100755 index 613e180f1..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/progressbar/fluid.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Fluid ProgressBar - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Fluid ProgressBar

                                                                                                                -

                                                                                                                This example shows how to set the width of ProgressBar to a percentage of its parent container.

                                                                                                                -
                                                                                                                -

                                                                                                                width: 50%

                                                                                                                -
                                                                                                                -

                                                                                                                width: 30%

                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/basic.html deleted file mode 100755 index 8f7743c4e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/basic.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Basic PropertyGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic PropertyGrid

                                                                                                                -

                                                                                                                Click on row to change each property value.

                                                                                                                - - -
                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/customcolumns.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/customcolumns.html deleted file mode 100755 index 0a683ef3e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/customcolumns.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Customize Columns of PropertyGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Customize Columns of PropertyGrid

                                                                                                                -

                                                                                                                The columns of PropertyGrid can be changed.

                                                                                                                -
                                                                                                                - -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/groupformat.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/groupformat.html deleted file mode 100755 index d4eb883ce..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/groupformat.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Group Format - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Group Format

                                                                                                                -

                                                                                                                The user can change the group information.

                                                                                                                -
                                                                                                                - -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json deleted file mode 100755 index a458d83fc..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/propertygrid/propertygrid_data1.json +++ /dev/null @@ -1,20 +0,0 @@ -{"total":7,"rows":[ - {"name":"Name","value":"Bill Smith","group":"ID Settings","editor":"text"}, - {"name":"Address","value":"","group":"ID Settings","editor":"text"}, - {"name":"Age","value":"40","group":"ID Settings","editor":"numberbox"}, - {"name":"Birthday","value":"01/02/2012","group":"ID Settings","editor":"datebox"}, - {"name":"SSN","value":"123-456-7890","group":"ID Settings","editor":"text"}, - {"name":"Email","value":"bill@gmail.com","group":"Marketing Settings","editor":{ - "type":"validatebox", - "options":{ - "validType":"email" - } - }}, - {"name":"FrequentBuyer","value":"false","group":"Marketing Settings","editor":{ - "type":"checkbox", - "options":{ - "on":true, - "off":false - } - }} -]} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/resizable/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/resizable/basic.html deleted file mode 100755 index 7b9e74773..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/resizable/basic.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Basic Resizable - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic Resizable

                                                                                                                -

                                                                                                                Click on the edge of box and move the edge to resize the box.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Resize Me
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Title
                                                                                                                -
                                                                                                                Drag and Resize Me
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/basic.html deleted file mode 100755 index a152113fa..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic SearchBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic SearchBox

                                                                                                                -

                                                                                                                Click search button or press enter key in input box to do searching.

                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/category.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/category.html deleted file mode 100755 index ca3029f04..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/category.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Search Category - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Search Category

                                                                                                                -

                                                                                                                Select a category and click search button or press enter key in input box to do searching.

                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                -
                                                                                                                All News
                                                                                                                -
                                                                                                                Sports News
                                                                                                                -
                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/fluid.html deleted file mode 100755 index c48096f1c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/searchbox/fluid.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Fluid SearchBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Fluid SearchBox

                                                                                                                -

                                                                                                                This example shows how to set the width of SearchBox to a percentage of its parent container.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                All News
                                                                                                                -
                                                                                                                Sports News
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/basic.html deleted file mode 100755 index 5096d28b0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/basic.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Basic SideMenu - jQuery EasyUI Demo - - - - - - - - -

                                                                                                                Basic SideMenu

                                                                                                                -

                                                                                                                Collapse the side menu to display the main icon.

                                                                                                                -
                                                                                                                - Toggle -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.css b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.css deleted file mode 100644 index 6ae84e1e8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.css +++ /dev/null @@ -1,63 +0,0 @@ -@import 'http://netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'; - -.sidemenu .accordion .panel-title{ - color: #b8c7ce; -} -.sidemenu .accordion .accordion-header{ - background: #222d32; - color: #b8c7ce; -} -.sidemenu .accordion .accordion-body{ - background: #2c3b41; - color: #8aa4af; -} -.sidemenu .accordion .accordion-header-selected{ - background: #1e282c; -} -.sidemenu .accordion .accordion-collapse{ - background: transparent; -} -.sidemenu .tree-node-hover{ - background: #2c3b41; - color: #fff; -} -.sidemenu .tree-node-selected{ - background: #2c3b41; - color: #fff; -} -.sidemenu .accordion-header .panel-icon{ - font-size: 16px; -} -.sidemenu .accordion-header .panel-tool{ - display: none; -} -.sidemenu .accordion-header::after, -.sidemenu .tree-node-nonleaf::after{ - display: inline-block; - vertical-align: top; - border-style: solid; - transform:rotate(45deg); - width: 4px; - height: 4px; - content: ''; - position: absolute; - right: 10px; - top: 50%; - margin-top: -3px; - border-width: 0 1px 1px 0; -} -.sidemenu .accordion-header-selected::after{ - transform:rotate(-135deg); -} -.sidemenu .tree-node-nonleaf::after{ - transform:rotate(-135deg); -} -.sidemenu .tree-node-nonleaf-collapsed::after{ - transform:rotate(45deg); -} -.sidemenu-collapsed .accordion-header::after{ - display: none; -} -.sidemenu-tooltip .accordion{ - border-color: #1e282c; -} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.html deleted file mode 100644 index 332e74f34..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/sidemenu/style.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - Basic SideMenu - jQuery EasyUI Demo - - - - - - - - - -

                                                                                                                Basic SideMenu

                                                                                                                -

                                                                                                                Collapse the side menu to display the main icon.

                                                                                                                -
                                                                                                                - Toggle -
                                                                                                                -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/basic.html deleted file mode 100755 index a71f0e4c3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/basic.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - Basic Slider - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic Slider

                                                                                                                -

                                                                                                                Drag the slider to change value.

                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/fluid.html deleted file mode 100755 index 745927687..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/fluid.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Fluid Slider - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Fluid Slider

                                                                                                                -

                                                                                                                This example shows how to set the width of Slider to a percentage of its parent container.

                                                                                                                -
                                                                                                                -

                                                                                                                width: 50%

                                                                                                                - -

                                                                                                                width: 30%

                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/formattip.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/formattip.html deleted file mode 100755 index 6b5c39835..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/formattip.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Format Tip Information - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Format Tip Information

                                                                                                                -

                                                                                                                This sample shows how to format tip information.

                                                                                                                -
                                                                                                                - -
                                                                                                                jQuery EasyUI
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/nonlinear.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/nonlinear.html deleted file mode 100755 index b07c61bd5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/nonlinear.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Non Linear Slider - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Non Linear Slider

                                                                                                                -

                                                                                                                This example shows how to create a slider with a non-linear scale.

                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/range.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/range.html deleted file mode 100755 index c7e6cf533..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/range.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Range Slider - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Range Slider

                                                                                                                -

                                                                                                                This sample shows how to define a range slider.

                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/rule.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/rule.html deleted file mode 100755 index 652b4e52b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/rule.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Slider Rule - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Slider Rule

                                                                                                                -

                                                                                                                This sample shows how to define slider rule.

                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/vertical.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/vertical.html deleted file mode 100755 index 59d3b4994..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/slider/vertical.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Vertical Slider - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Vertical Slider

                                                                                                                -

                                                                                                                This sample shows how to create a vertical slider.

                                                                                                                -
                                                                                                                -
                                                                                                                - -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/actions.html deleted file mode 100755 index 311048468..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/actions.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - SplitButton Actions - jQuery EasyUI Demo - - - - - - - -

                                                                                                                SplitButton Actions

                                                                                                                -

                                                                                                                Click the buttons below to perform actions.

                                                                                                                - -
                                                                                                                - Home - Edit - Ok - Help -
                                                                                                                -
                                                                                                                -
                                                                                                                Undo
                                                                                                                -
                                                                                                                Redo
                                                                                                                - -
                                                                                                                Cut
                                                                                                                -
                                                                                                                Copy
                                                                                                                -
                                                                                                                Paste
                                                                                                                - -
                                                                                                                - Toolbar -
                                                                                                                -
                                                                                                                Address
                                                                                                                -
                                                                                                                Link
                                                                                                                -
                                                                                                                Navigation Toolbar
                                                                                                                -
                                                                                                                Bookmark Toolbar
                                                                                                                - -
                                                                                                                New Toolbar...
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Delete
                                                                                                                -
                                                                                                                Select All
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Ok
                                                                                                                -
                                                                                                                Cancel
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Help
                                                                                                                -
                                                                                                                Update
                                                                                                                -
                                                                                                                - About - -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/basic.html deleted file mode 100755 index 795d526e8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/splitbutton/basic.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Basic SplitButton - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic SplitButton

                                                                                                                -

                                                                                                                Move mouse over the arrow area of button to drop down menu.

                                                                                                                -
                                                                                                                -
                                                                                                                - Home - Edit - Ok - Help -
                                                                                                                -
                                                                                                                -
                                                                                                                Undo
                                                                                                                -
                                                                                                                Redo
                                                                                                                - -
                                                                                                                Cut
                                                                                                                -
                                                                                                                Copy
                                                                                                                -
                                                                                                                Paste
                                                                                                                - -
                                                                                                                - Toolbar -
                                                                                                                -
                                                                                                                Address
                                                                                                                -
                                                                                                                Link
                                                                                                                -
                                                                                                                Navigation Toolbar
                                                                                                                -
                                                                                                                Bookmark Toolbar
                                                                                                                - -
                                                                                                                New Toolbar...
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Delete
                                                                                                                -
                                                                                                                Select All
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Ok
                                                                                                                -
                                                                                                                Cancel
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                Help
                                                                                                                -
                                                                                                                Update
                                                                                                                -
                                                                                                                - About - -
                                                                                                                -
                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/action.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/action.html deleted file mode 100644 index 0a6e197d8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/action.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - SwitchButton Actions - jQuery EasyUI Demo - - - - - - - -

                                                                                                                SwitchButton Actions

                                                                                                                -

                                                                                                                Click the buttons below to perform actions.

                                                                                                                -
                                                                                                                - -
                                                                                                                - Disable - Enable -
                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/basic.html deleted file mode 100644 index 56a09b586..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/switchbutton/basic.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Basic SwitchButton - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Basic SwitchButton

                                                                                                                -

                                                                                                                Click the switchbutton to change its state.

                                                                                                                -
                                                                                                                - - - - - - - - - - - - - - -
                                                                                                                Receive mail:
                                                                                                                Shared network:
                                                                                                                Subscribed:
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/_content.html deleted file mode 100755 index 996740274..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

                                                                                                                Here is the content loaded via AJAX.

                                                                                                                -
                                                                                                                  -
                                                                                                                • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                • -
                                                                                                                • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                                                                                • -
                                                                                                                • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                • -
                                                                                                                • complete framework for HTML5 web page.
                                                                                                                • -
                                                                                                                • easyui save your time and scales while developing your products.
                                                                                                                • -
                                                                                                                • easyui is very easy but powerful.
                                                                                                                • -
                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/autoheight.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/autoheight.html deleted file mode 100755 index 8fd287ad6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/autoheight.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - Auto Height for Tabs - jQuery EasyUI Demo - - - - - - - -

                                                                                                                Auto Height for Tabs

                                                                                                                -

                                                                                                                The tabs height is auto adjusted according to tab panel content.

                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                -

                                                                                                                jQuery EasyUI framework helps you build your web pages easily.

                                                                                                                -
                                                                                                                  -
                                                                                                                • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                • -
                                                                                                                • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                                                                • -
                                                                                                                • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                • -
                                                                                                                • complete framework for HTML5 web page.
                                                                                                                • -
                                                                                                                • easyui save your time and scales while developing your products.
                                                                                                                • -
                                                                                                                • easyui is very easy but powerful.
                                                                                                                • -
                                                                                                                -
                                                                                                                -
                                                                                                                -
                                                                                                                  -
                                                                                                                  -
                                                                                                                  - This is the help content. -
                                                                                                                  -
                                                                                                                  - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/basic.html deleted file mode 100755 index c5a7ce675..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/basic.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - Basic Tabs - jQuery EasyUI Demo - - - - - - - -

                                                                                                                  Basic Tabs

                                                                                                                  -

                                                                                                                  Click tab strip to swap tab panel content.

                                                                                                                  -
                                                                                                                  -
                                                                                                                  -
                                                                                                                  -

                                                                                                                  jQuery EasyUI framework helps you build your web pages easily.

                                                                                                                  -
                                                                                                                    -
                                                                                                                  • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                  • -
                                                                                                                  • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                                                                  • -
                                                                                                                  • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                  • -
                                                                                                                  • complete framework for HTML5 web page.
                                                                                                                  • -
                                                                                                                  • easyui save your time and scales while developing your products.
                                                                                                                  • -
                                                                                                                  • easyui is very easy but powerful.
                                                                                                                  • -
                                                                                                                  -
                                                                                                                  -
                                                                                                                  -
                                                                                                                    -
                                                                                                                    -
                                                                                                                    - This is the help content. -
                                                                                                                    -
                                                                                                                    - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/dropdown.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/dropdown.html deleted file mode 100755 index e13426c39..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/dropdown.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Tabs with DropDown - jQuery EasyUI Demo - - - - - - - -

                                                                                                                    Tabs with DropDown

                                                                                                                    -

                                                                                                                    This sample shows how to add a dropdown menu over a tab strip.

                                                                                                                    -
                                                                                                                    -
                                                                                                                    -
                                                                                                                    -

                                                                                                                    jQuery EasyUI framework helps you build your web pages easily.

                                                                                                                    -
                                                                                                                      -
                                                                                                                    • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                    • -
                                                                                                                    • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                                                                    • -
                                                                                                                    • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                    • -
                                                                                                                    • complete framework for HTML5 web page.
                                                                                                                    • -
                                                                                                                    • easyui save your time and scales while developing your products.
                                                                                                                    • -
                                                                                                                    • easyui is very easy but powerful.
                                                                                                                    • -
                                                                                                                    -
                                                                                                                    -
                                                                                                                    -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      - This is the help content. -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      Welcome
                                                                                                                      -
                                                                                                                      Help Contents
                                                                                                                      -
                                                                                                                      Search
                                                                                                                      -
                                                                                                                      Dynamic Help
                                                                                                                      -
                                                                                                                      - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fixedwidth.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fixedwidth.html deleted file mode 100755 index 18030664a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fixedwidth.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Fixed Tab Width - jQuery EasyUI Demo - - - - - - - -

                                                                                                                      Fixed Tab Width

                                                                                                                      -

                                                                                                                      The tab strips have fixed width and height.

                                                                                                                      -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      Home Content.

                                                                                                                      -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      Maps Content.

                                                                                                                      -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      Journal Content.

                                                                                                                      -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      History Content.

                                                                                                                      -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      References Content.

                                                                                                                      -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      Contact Content.

                                                                                                                      -
                                                                                                                      -
                                                                                                                      - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fluid.html deleted file mode 100755 index 42cf7fc36..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/fluid.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Fluid Tabs - jQuery EasyUI Demo - - - - - - - -

                                                                                                                      Fluid Tabs

                                                                                                                      -

                                                                                                                      This example shows how to set the width of Tabs to a percentage of its parent container.

                                                                                                                      -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      The tabs has a width of 100%.

                                                                                                                      -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/hover.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/hover.html deleted file mode 100755 index 04419c852..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/hover.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Hover Tabs - jQuery EasyUI Demo - - - - - - - -

                                                                                                                      Hover Tabs

                                                                                                                      -

                                                                                                                      Move mouse over the tab strip to open the tab panel.

                                                                                                                      -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      -

                                                                                                                      jQuery EasyUI framework helps you build your web pages easily.

                                                                                                                      -
                                                                                                                        -
                                                                                                                      • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                      • -
                                                                                                                      • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                                                                      • -
                                                                                                                      • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                      • -
                                                                                                                      • complete framework for HTML5 web page.
                                                                                                                      • -
                                                                                                                      • easyui save your time and scales while developing your products.
                                                                                                                      • -
                                                                                                                      • easyui is very easy but powerful.
                                                                                                                      • -
                                                                                                                      -
                                                                                                                      -
                                                                                                                      -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        - This is the help content. -
                                                                                                                        -
                                                                                                                        - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/modem.png b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/modem.png deleted file mode 100755 index be5a2eb2fc48a8f16681b591f4ef74888ee09c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1633 zcmV-n2A=teP)DSXo(n z6%-WGq@<)6*xA{^2Ei8OFVPRn@pc;RG z0K(}2kU_v;uacIQE|igxVPIil0lOU8LJ$V2gBcFvgF+DKL$KN}U%tQ{3j&`%e`fgj z@gvL=d;kH2(*Zz33V;^3sH&=hEe8c1aykKFkQgk@fP4zVAcH}^2L(OIK_D>@4RRES ze)sMj*gUAC{s9CKRtErm69G(cJz`>Fj2}LHfCnwe5SVX(p#$bKGczNn7qEqVe0*Tb zKx$wP1gU%b_AT5|K=waih<*VGAQtps2Pz2H)YP1#tEdz1LA-G{v90jAo(|M-Y{Iec=5@nPoJ&=1Q2>IaFvsjn`>!l$t@@-2(}dD z0GK0?EkXud!iJNWd(GMH9%!pb!uh6=itz=n=!YbLZ{?6XRZ>k+%Q> zhy`Q`&;nIpmRY8(tSkWx7KUffo-s&DO2QK#$WmB3Ko0?!SPXU#m1Z4_<00M=8Jg|USYhq#|2XZmU!j~^!g0l-ZH#ay%!+e4s0^qV7 zCl zzk}l%xnx6*cces$;#;tKkUTJDgZV%`;9LP^gB$_!J;-ce!utdC{SlxvDE_~K)Byw# z3oyP-K}9Sx5VA6|Gca)cV_^9Y%36#J|Cs)QM1f48BN)Nn1tk_xApwc!e}BRC+4mpc z86F%z4whpB71y9L1E@wA=qY;#2Zjsh&of-Ue3{|QnKSo*QNADMdk_E!AQqr6xn4eh z#qi+MGlt6_&NBGR1u$ z0{{Yu<Cx%1A~kt11BpmeSi!CrWZyY9!TmJ7G?m2;TK>OdVJl%92G$?!48NGZF}SmPF>w9nW%&C26N4Xf z00ZYQUWPA1Um5-f1~UBq_k)2IR52MCGQ4~95>y1jif%}W2lO#BFiL>+E&~^z05CCs zVmN;M_>U(~p6rME{s*!H00M|*&z?PPz=SkSTvS{D7-$Skj7;G4z`*hXOoI&m$Mlkc znS+yo>HT}K&zO058JK{<%mPXaz!VNj<)Add07`g3`se1&48M$w7?`+u!SR3g?Afcp z#0yIKkI;*KfB*tHn;DoBY=PJr$mRzc!~(>uKtn+^3nLRF3ou86#ef(n%*@Kf$jA&< z2T=p$g5`mpXJG*;`2Fr3Gnc3+Gb50H=l1Ql4<9~U4~&|{K=YrVI{+Yn7?GN0TtLhY zauAfygvLh4gw(;r{y;5$3@UKZ9RLtOj04>>0tlc1ZXtfG21Qdk=RTSi)EQ1{_6i^UCwl}dq?)Kwu=icw$3Vv(^&DzBp z003H4WY{5#gx(W{WZ?xTPp(-6A&d7n9sqO>1QNe~ZLyh!;faNxAImH(PRkboJmIl) z5ft@hT9)XLC{1`m{6Mq^07z$}!gz5dlj%kb<7#2N1V~S32mm?^E&&!@<5jOx&3q{o za+2cX&tua)2r{taVogmAuD$W)qm~2Jb-st=OE#9C%TaGk*+GINT|sbi^6jAAyQ69v z8kDn-+d5(SDD|F*MUq!Y8 zc(PIdZebZiFlP5@(-6e!MAaf;@5+D2xe6|d8cfdKc6~j+K7)-5c4y4Sx{BFnKaWtq z>5TRFH=1ZgLzdQf!x{T;+PrT8Xs^e8w-+;+?n9TsNf?}i%e{^x&~3>;nZbF>Wk~-xi=)I9adQP-N!XQOOPah0O(QZ>2owWjyN~2)5!9nUX;qfIGvsHp@IVxcl=2QSj-aDrbsm+71?S} z(P`Ip&yPj&*46_(_|&4!Hz=_a?i71#2Li$LLi<)nVL z!{}WfIN}P&}jcP#>G?Gb4@Dg8Slpya_Y>1sq)VLm%q6alT7GG9ciH z=o`?VqJQAg0KhTaeay7TgYio%ePJb?E);6I?M9S?xW$@CT%}tOf{H0q7 zl`i}Cu}DQlJM)s>yd2C@xO01?p`g&-I~j%}`IIk6Y_>=2dpr+&3oX_Q8)ei(kFHYPxu*ps zYp-_l-RgrA8RDn!$Lm2bgGYu5Mdd0wSFTWOo4`S!NZ7|18*^m7=q?+~d$Wx!S3~ad z+qd`d_qu8q#;X~go_&(vYbA?;RKI^rk(F-U-T(#aumx`5F2EK1)KvG2^wc{g_+chg z$@@b)Sm!5c3i<3aJ0E2Ax4)~wB=r2XF8_c%C3(*EJ1#I%Qc@Vr&3)3U6U3N=3DN{@*z34hoRim^Arg_jcG>cCncl_cW}jS2nCa`kchCB!qvQ7I z=uc6;itt-`r&{6r(~xd+mFyq3twZh~O*rUVb*%k2+a5q+M`OXKY6x!|)7R8~b} zRQte@Xl8~+psdw=Kq)?VK}7sJE0SkH5r z2LOO|aL}fmrbzs@EHI}1#M!gcreGEyuq^-pDqDQe*`ua2K4o)M%1?=LDW{poV}XE} z#OPRJ@KI)b?9Nzb%$elYSU&);tP9>05W)H1iWnwxi( z35bh~vl9bllm9;Bm|~5OTm-YU69c^q@(A*Cv!8l93qnHH5jc8{4qtAxavOpx)su3t zmNn(O!v?S*3Q-NI+Vr2lbQX(pkjT`>3dQHP@o`xjqaih3qnq&vH|)yjEDq3ENj~*X zHu!OjW0JD%1loDs^o+wRE&(SBPF;+pu?5j!9T3>*lVMBnrwD~YZ{KzQkk_w2SMZ=J zIZE+guB(d+&c)T$a-Fj2l1G_{6W`s{-5owOJPc~IUwufI!6p&g5H~n7!W>j8mF%zY zFMYYQ<@79aQSRyzgqfW~RX>{FM*E8)BA;%`zTE52*1u5AsTqPkuL_*w27&a?l9IN; z_wVB>%gb-tu1a$%d}5MpQ%I3vYUrh5^%3U}6K~I`B$W(~xC9!omvc*|iW^^r7c}#oKM-NxzD*T(-)|KN1dXb}#%=YvteLUV5fj?QWh?F#CY?Buwoy4L z=R{FRcUdeJ4u{8YHp$&Oqnr8qj_$^m$dKPUCU^0(=R~(VZA6bUq)go=uBAqky{lu% zKBp0-hnxjVXxt1HYRIW5*NEKu6jf1CANS=;c1UPw=wN#0$^fI$kcs%UORLpFBlDg% zUiZi=N;T@IJY_@(K&}VXpRdyydb2uQOiLmrGV&DW)TvV#cXwwntDO4rBcJ+lY!6vj zRYeU7UIsO>O^I_aE?;VX@?`UmQmHf@Z`|lPXI-Nw@G&>C!DM&$HJGrlH7^q7?89;q zXYQkj!zt!21nlUZeQ6rgjo>$6Uy#9Quo@>_;g^(HlSqyJJ0rTI4SFpv|5_TZ;C8*E zc3D89fkJ-s&M*}KsBvH2-$)o&e` zeQZ5Jk_XdpQME?zdYwK`@frob;-GYTS2q-mYQ^*Qa^U$AtayNjD=$k-!<_t?DR8UB zAA9RNX`3QGZ1R;Q36%0ky~Hx~5dMwxZ-2ab6L?MC5Ja8+eF$V3Gr8QodJk0dg18KZ zoR7!#@wqmLYCIpuHpa(jR3l!JujVwIf4!~)NcnMNaGE3UV%2;}W*!Z9!;|>|>Eea8 zqq7zPA%671(%VaWl*3>`+Yc2|;n3m*l99>;EN2rAZ^i+v?s$poGHzbw+Nba4L#rH6 zq+MiGe?o-}D~G1MR<^zfzq+(@km=Q-(zW}5CylOrwh4>Vb%z8_K1v z{}MwZw_Q@a*%FqqwK59Fw(zE8C3}B&C? zVuA%ti8StfH{XZc2D8U_J|AyH{NhfILtZi<_ZTM@xbX@teKzjklX>M9=8`#Ed1Jrk z`Gv38>mF)aL&|8kP52^nQ#%GVws*XEG5;VahotE%ja@!`-&8RZhC-_mDh+X z=UGQpR`C`B!&I*F7JfdG22&_W)fCFGR!FUNO{VG(#$axsU>vlzfI0g2&z!Q*(e=i$ zp6es@6#)$*^JItW*m3o4-rEJ#L9 z*=8N2x83C0Xso1i*qhR#qLO0@sT3UP1j_21GkA#Notip#m8q2W%RhAdUiaZ;f%+xn zK4GR*3$K_M2~m(W_C`&j2-->mlPx`~d~q7cUxC`=j;vVIpx3_?Pt6e|1)Vuq4x5{b zPFZAERh{-X!c9^ml40Giad7jeVKOO5Mb;ZTWn!D0;=MJC$qygRJR7J@)^-%rL@UvI zl5kl&T-?98E1c60o$b2I)!8x#^2ut6A*9!6Isf^KKJv)K7Y%>4YSykdhIk% zG3y$bafGoO=g*Eumo9S0Y=2UTz4{vsI?HNo>_F$-kz{s~yL)T=)}^wV_XwIHzG9Uf zyrDDs82Z;OeZGFzLA43QCeL`1*}N`1?pHA_%fC;wv@OD4F+%=u9u zt-<>(M_a6z@xfr+c7ypZJpinAWK!d!Ghh8dYNbMFnq_p$qt8!?WC$6CA`S#_9<50R>^sn!rDR{DTdpKSy zZnNCkjFc6LaB=N>W^3-<8=3AZQ#+&DD znap!$rDu-T1i*cbI2HlTBPDG_Nil0PGBd4YM!nW`BSW6UxbA+Ea8~^pO{zMIezf1h zX$C-~-(vtWbL>jHE0^Cf%t?YrO9MI9##yQY#miw?pxwq6g9^*n`9 zsG$Q$SFfL-v2nrJMU08YC1iBZ160*gviuODFfn)e^088ae|`Mg)1O-qhoYaF{TULJ z4A6nAW5Dp6RUV{vfKm>dkEQ#6*K^zsupk2q+Ea4=oYE*vUp*jrbJ(W)8^E;x12P5j A&;S4c diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/tablet.png b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/images/tablet.png deleted file mode 100755 index fa871f54035fcd0bb0f7f2068d2b2ed4e5e0e0cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 zcmW+&Yh02C7k>ank;hAE24+c9(=C@5nzmOHNV6i*EwWAy0MbXsy0K#HV?N8$W`pv6QT zjiNmD$4~(?B4QR`0#=CzfSwt;NKvh#!WIdB z%YB|dcjx@oo`(`bd`9z^!A(QY1iPF%6?1cRBpWIN`RzH8N~L-O;@a)6gcQs3YyzKw zS8F8Q3ey0*t9pI8N+#*A02%I+ZZ5pG(swWbrgxqRY_5pm-6ONBQaTL##bG};rs z&qhw~Rdm&{2#oiLSHT~s%W05S|HMj#%*G5_Q`N~l#tE|oK9qIHDCueJIiqjoqJ=wO z6)(8utZ6E4$g|H1?q;%R#Ct)#J#a%@GeQfg7RTQWmfVkW;@u1Y&%)-}AgKBB(WfWU zMkk(IE3Q~3d{#80MM@-ZWnYeq(Pk^lAvkxY6adTrme$>nUA@}@IHZ-*dA*#|*s z==2flXx~Gi>+WTGOz&Jfl3-vyh50 zz08MfbZ+=dFZfWOL<32pD7ipvfmfEHE?|m}55gxR!ge>D!C1>p=^xoLm$yh!(Idwi zgfB;FH=L4ZIgiApTPB@R*tXbfad!eL+$<+1CaK}0k>TOwv4{w>@Th3Bk6MY~RfkB> z(Ivu(#3IFtr>)~HAf=nZCIk?*1X^+Sf!44H<>Ea2J_3LjZLols2`mbb8JN@v^pelH zL(|XyR%Q%nUBB-kEP4+FvI&0&T$1<2_#yqM;fUgtWEXr6V#gAJ*lkiqP6$3|lCgT7 zB{O%Ke}K3p8?*IebNE`9-4>hTHEHM1ZR}NtxRe5L!&>x!o}F1JIiGcfGJ_tk(j23B zd9^gAh>x-3oVBh$4p^biJYFxBuYZ<+M*BeUCcF#`$|FQRUi|EhaNdF_Fmvd&jz+R2 zd<@1L7`L(bbFLkRxKdNex-xH5z%xV_wBO@wLfDq>x*r6C8(PCB`ewPmqIUTC+3wu` z%X@kBKEEIe6dpUUR3eiGB_T6uNcJ3M&dqn=uxkdU)P=XEzAo$M6Tl%S9w>$O?UQ+2 z)GnKb|6@RPR09h&tc?%Hut^QVq%eoKxFO_{<9%g2LQNj+VH=OVEJH8o8a++W=3 zBH|;?Qe*Ks1|_bDBaj+Vy%bu5Y0uMia(751xVUYjurf@BqYfhjFosrrVO&b=UaBJ* zRVN78NkBo!#fmE0cTcT_jX@G@AWtc#%DLj^v8gTWtqy10)QAq%X6{P@Q|Um~Nce`J z6C6{`db6PK_*$qBhHKT~6^QX= z`2pm`0;Xk>TfmW!Xr*QzEBvF%8Jp_Vg0=jd*PS>&;faj4v=c)(nbhpBxpufuO(|-M z#Q-P#lEIs7?HOWR6zM!d&uouzVwZgTrZGW@?`cWH&GeCx|9B=m+Ud-^A%LZd9FWLN z>X>TjvxiUr!YMF_{{Zg@H-9PVG{wBNO=Z=i(R;M4C*?Bd-670aa(Iqu0NPqGG(WLS zL2jo-vyV>)sfXWhyYyP2lJEQfURv$sY*5OL*_76my7x&_Gb2Gn1na~#8Q$eMq%}qT zL;!yW?cbaP%Rj|~O$kHMk5d+1g}K~m;yVXNy*yGbH0`{bq`eR+UKKnPJb(Q{G4_#x z%+Ah@K95C{cN^*wT3Hcr`U$&c!dhcBEqw6M7sMV4lO%$71xuO5(|tjH$WuP9NQ0Ip za5k6+=H&B03ge6XZIP~yM{tlF32eoRgP9~mYfNC`e9z9wMj+I=s;>H4oxLV^& z(hzt0iAT`jb*aE?)L;i^uGhlkP@h%y% z4F*xWY>D>oAR7q#t9>=b_W~AcLW!YfXg_Sl-xlb$eXWTSnjPVo7p_S5=0F|=B^c3B zBr=%nm;*@^^UG-VoV49d;qU0yoQ%fjXiSP5I22rawBFTM;`KU~c{Q$`q3#qQoPN3T zp&B#r1cUvjRxN2x{M5nc+r+o)J)E#50W0)M@Q6w6p{N zZ6g%Axx1*dc;Md~b;UWI27CD17uycnas}P0v1hRWU)K4fR1O z_GBXjE!MHHv6fqU4|87?aSAtB;K2$ODqVa6cZM+vRg51?!1GSGqHbs5$>`hH=Z$g9 zP=yCQ&n4$SZBbp%Z^6#?ct4Nl%rat>>dn=|dwj9g3_R@ck)rziA#RRI{NOwgckukd z@=SR5BNa0^UYdPf_WoIY6K3}7Jaue7@z%) zyF|hvcM#Y?q7EGb(K5dgQ+A^PC*V}dKZ6eh`6Jux$~3_-b>1`oEkSLng_yMZ$A - - - - Nested Tabs - jQuery EasyUI Demo - - - - - - - -

                                                                                                                        Nested Tabs

                                                                                                                        -

                                                                                                                        The tab panel can contain sub tabs or other components.

                                                                                                                        -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        Content 1
                                                                                                                        -
                                                                                                                        Content 2
                                                                                                                        -
                                                                                                                        Content 3
                                                                                                                        -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        - -
                                                                                                                        -
                                                                                                                        - - - - - - - - - - - - - - - - - - - - -
                                                                                                                        Title1Title2Title3
                                                                                                                        d11d12d13
                                                                                                                        d21d22d23
                                                                                                                        -
                                                                                                                        -
                                                                                                                        - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/striptools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/striptools.html deleted file mode 100755 index 13ca5b458..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/striptools.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Tabs Strip Tools - jQuery EasyUI Demo - - - - - - - -

                                                                                                                        Tabs Strip Tools

                                                                                                                        -

                                                                                                                        Click the mini-buttons on the tab strip to perform actions.

                                                                                                                        -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        -

                                                                                                                        jQuery EasyUI framework helps you build your web pages easily.

                                                                                                                        -
                                                                                                                          -
                                                                                                                        • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                        • -
                                                                                                                        • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                                                                        • -
                                                                                                                        • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                        • -
                                                                                                                        • complete framework for HTML5 web page.
                                                                                                                        • -
                                                                                                                        • easyui save your time and scales while developing your products.
                                                                                                                        • -
                                                                                                                        • easyui is very easy but powerful.
                                                                                                                        • -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        - This is the help content. -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        - - - -
                                                                                                                        - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/style.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/style.html deleted file mode 100755 index adcb50771..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/style.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - Tabs Style - jQuery EasyUI Demo - - - - - - - -

                                                                                                                        Tabs Style

                                                                                                                        -

                                                                                                                        Click the options below to change the tabs style.

                                                                                                                        -
                                                                                                                        - plain
                                                                                                                        - narrow
                                                                                                                        - pill
                                                                                                                        - justified -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        -

                                                                                                                        jQuery EasyUI framework helps you build your web pages easily.

                                                                                                                        -
                                                                                                                          -
                                                                                                                        • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                        • -
                                                                                                                        • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                                                                        • -
                                                                                                                        • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                        • -
                                                                                                                        • complete framework for HTML5 web page.
                                                                                                                        • -
                                                                                                                        • easyui save your time and scales while developing your products.
                                                                                                                        • -
                                                                                                                        • easyui is very easy but powerful.
                                                                                                                        • -
                                                                                                                        -
                                                                                                                        -
                                                                                                                        -
                                                                                                                          -
                                                                                                                          -
                                                                                                                          - This is the help content. -
                                                                                                                          -
                                                                                                                          - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabimage.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabimage.html deleted file mode 100755 index 415cbef86..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabimage.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Tabs with Images - jQuery EasyUI Demo - - - - - - - -

                                                                                                                          Tabs with Images

                                                                                                                          -

                                                                                                                          The tab strip can display big images.

                                                                                                                          -
                                                                                                                          -
                                                                                                                          -
                                                                                                                          -

                                                                                                                          A modem (modulator-demodulator) is a device that modulates an analog carrier signal to encode digital information, and also demodulates such a carrier signal to decode the transmitted information.

                                                                                                                          -
                                                                                                                          -
                                                                                                                          -

                                                                                                                          In computing, an image scanner—often abbreviated to just scanner—is a device that optically scans images, printed text, handwriting, or an object, and converts it to a digital image.

                                                                                                                          -
                                                                                                                          -
                                                                                                                          -

                                                                                                                          A personal digital assistant (PDA), also known as a palmtop computer, or personal data assistant, is a mobile device that functions as a personal information manager. PDAs are largely considered obsolete with the widespread adoption of smartphones.

                                                                                                                          -
                                                                                                                          -
                                                                                                                          -

                                                                                                                          A tablet computer, or simply tablet, is a one-piece mobile computer. Devices typically have a touchscreen, with finger or stylus gestures replacing the conventional computer mouse.

                                                                                                                          -
                                                                                                                          -
                                                                                                                          - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabposition.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabposition.html deleted file mode 100755 index 43547367c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabposition.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Tab Position - jQuery EasyUI Demo - - - - - - - -

                                                                                                                          Tab Position

                                                                                                                          -

                                                                                                                          Click the 'position' drop-down list and select an item to change the tab position.

                                                                                                                          -
                                                                                                                          - Position: - -
                                                                                                                          -
                                                                                                                          -
                                                                                                                          -

                                                                                                                          jQuery EasyUI framework helps you build your web pages easily.

                                                                                                                          -
                                                                                                                            -
                                                                                                                          • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                          • -
                                                                                                                          • easyui provides essential functionality for building modem, interactive, javascript applications.
                                                                                                                          • -
                                                                                                                          • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                          • -
                                                                                                                          • complete framework for HTML5 web page.
                                                                                                                          • -
                                                                                                                          • easyui save your time and scales while developing your products.
                                                                                                                          • -
                                                                                                                          • easyui is very easy but powerful.
                                                                                                                          • -
                                                                                                                          -
                                                                                                                          -
                                                                                                                          -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - This is the help content. -
                                                                                                                            -
                                                                                                                            - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabstools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabstools.html deleted file mode 100755 index 9c8fa1012..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tabstools.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Tabs Tools - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Tabs Tools

                                                                                                                            -

                                                                                                                            Click the buttons on the top right of tabs header to add or remove tab panel.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - - -
                                                                                                                            - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tree_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tree_data1.json deleted file mode 100755 index e0c619226..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tabs/tree_data1.json +++ /dev/null @@ -1,49 +0,0 @@ -[{ - "id":1, - "text":"My Documents", - "children":[{ - "id":11, - "text":"Photos", - "state":"closed", - "children":[{ - "id":111, - "text":"Friend" - },{ - "id":112, - "text":"Wife" - },{ - "id":113, - "text":"Company" - }] - },{ - "id":12, - "text":"Program Files", - "children":[{ - "id":121, - "text":"Intel" - },{ - "id":122, - "text":"Java", - "attributes":{ - "p1":"Custom Attribute1", - "p2":"Custom Attribute2" - } - },{ - "id":123, - "text":"Microsoft Office" - },{ - "id":124, - "text":"Games", - "checked":true - }] - },{ - "id":13, - "text":"index.html" - },{ - "id":14, - "text":"about.html" - },{ - "id":15, - "text":"welcome.html" - }] -}] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/autocomplete.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/autocomplete.html deleted file mode 100755 index f192f3e87..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/autocomplete.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - TagBox with Autocomplete - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            TagBox with Autocomplete

                                                                                                                            -

                                                                                                                            The autocomplete is the built-in feature that allows the user to select a value from the drop-down list.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/basic.html deleted file mode 100755 index 256bb931f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/basic.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Basic TagBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Basic TagBox

                                                                                                                            -

                                                                                                                            The TagBox is created from a simple input element.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/button.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/button.html deleted file mode 100755 index b16ac1cea..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/button.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - TagBox with Button - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            TagBox with Button

                                                                                                                            -

                                                                                                                            The button can be attached to a tagbox.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/format.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/format.html deleted file mode 100644 index 0a441bd94..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/format.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Format TagBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Format TagBox

                                                                                                                            -

                                                                                                                            This example shows how to format the tagbox values.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/style.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/style.html deleted file mode 100755 index 26cb95e15..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/style.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Custom TagBox Style - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Custom TagBox Style

                                                                                                                            -

                                                                                                                            This example shows how to apply different CSS styles to different tags.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/tagbox_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/tagbox_data1.json deleted file mode 100755 index 4e4f03c3c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/tagbox_data1.json +++ /dev/null @@ -1,21 +0,0 @@ -[{ - "id":"1", - "text":"Java", - "desc":"Write once, run anywhere" -},{ - "id":"2", - "text":"C#", - "desc":"One of the programming languages designed for the Common Language Infrastructure" -},{ - "id":"3", - "text":"Ruby", - "desc":"A dynamic, reflective, general-purpose object-oriented programming language" -},{ - "id":"4", - "text":"Perl", - "desc":"A high-level, general-purpose, interpreted, dynamic programming language" -},{ - "id":"5", - "text":"Basic", - "desc":"A family of general-purpose, high-level programming languages" -}] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/validate.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/validate.html deleted file mode 100755 index 86e57b38e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tagbox/validate.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Validate TagBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Validate TagBox

                                                                                                                            -

                                                                                                                            This example shows how to validate the tagbox values.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/basic.html deleted file mode 100644 index d7f93327f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/basic.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Basic TextBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Basic TextBox

                                                                                                                            -

                                                                                                                            The textbox allows a user to enter information.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            - -
                                                                                                                            - Register -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/button.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/button.html deleted file mode 100644 index bc78b1f1a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/button.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - TextBox with Button - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            TextBox with Button

                                                                                                                            -

                                                                                                                            The button can be attached to a textbox.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/clearicon.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/clearicon.html deleted file mode 100644 index 94a0ee1b7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/clearicon.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - TextBox with Clear Icon - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            TextBox with Clear Icon

                                                                                                                            -

                                                                                                                            This example shows how to create an textbox with an icon to clear the input element itself.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/custom.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/custom.html deleted file mode 100644 index b4cf18237..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/custom.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Custom TextBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Custom TextBox

                                                                                                                            -

                                                                                                                            This example shows how to custom a login form.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - Remember me -
                                                                                                                            - -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/fluid.html deleted file mode 100644 index 1c62dc232..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid TextBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Fluid TextBox

                                                                                                                            -

                                                                                                                            This example shows how to set the width of TextBox to a percentage of its parent container.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/icons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/icons.html deleted file mode 100644 index 10a9653ea..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/icons.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - TextBox with Icons - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            TextBox with Icons

                                                                                                                            -

                                                                                                                            Click the icons on textbox to perform actions.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            - Select Icon Align: - -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/multiline.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/multiline.html deleted file mode 100644 index f56b4e5e6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/multiline.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Multiline TextBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Multiline TextBox

                                                                                                                            -

                                                                                                                            This example shows how to define a textbox for the user to enter multi-line text input.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/size.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/size.html deleted file mode 100644 index 12e17dcaa..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/textbox/size.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - TextBox Size - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            TextBox Size

                                                                                                                            -

                                                                                                                            The textbox can vary in size.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/actions.html deleted file mode 100755 index 2480f8a17..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/actions.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - TimeSpinner Actions - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            TimeSpinner Actions

                                                                                                                            -

                                                                                                                            Click the buttons below to perform actions.

                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/basic.html deleted file mode 100755 index 9a30add42..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/basic.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Basic TimeSpinner - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Basic TimeSpinner

                                                                                                                            -

                                                                                                                            Click spin button to adjust time.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/fluid.html deleted file mode 100755 index 403ead1bd..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/fluid.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Fluid TimeSpinner - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Fluid TimeSpinner

                                                                                                                            -

                                                                                                                            This example shows how to set the width of TimeSpinner to a percentage of its parent container.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/range.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/range.html deleted file mode 100755 index 042c26ae1..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/timespinner/range.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Time Range - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Time Range

                                                                                                                            -

                                                                                                                            The time value is constrained in specified range.

                                                                                                                            -
                                                                                                                            - From 08:30 to 18:00 -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_content.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_content.html deleted file mode 100755 index 996740274..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_content.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - AJAX Content - - -

                                                                                                                            Here is the content loaded via AJAX.

                                                                                                                            -
                                                                                                                              -
                                                                                                                            • easyui is a collection of user-interface plugin based on jQuery.
                                                                                                                            • -
                                                                                                                            • easyui provides essential functionality for building modern, interactive, javascript applications.
                                                                                                                            • -
                                                                                                                            • using easyui you don't need to write many javascript code, you usually defines user-interface by writing some HTML markup.
                                                                                                                            • -
                                                                                                                            • complete framework for HTML5 web page.
                                                                                                                            • -
                                                                                                                            • easyui save your time and scales while developing your products.
                                                                                                                            • -
                                                                                                                            • easyui is very easy but powerful.
                                                                                                                            • -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_dialog.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_dialog.html deleted file mode 100755 index ddcdc074c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/_dialog.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Dialog Content - - -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            User Name:
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            Password:
                                                                                                                            - -
                                                                                                                            -
                                                                                                                            - Login - Cancel -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/ajax.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/ajax.html deleted file mode 100755 index c0095fa2b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/ajax.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Ajax Tooltip - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Ajax Tooltip

                                                                                                                            -

                                                                                                                            The tooltip content can be loaded via AJAX.

                                                                                                                            -
                                                                                                                            - Hove me to display tooltip content via AJAX. - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/basic.html deleted file mode 100755 index 3fb13625b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/basic.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Basic Tooltip - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Basic Tooltip

                                                                                                                            -

                                                                                                                            Hover the links to display tooltip message.

                                                                                                                            -
                                                                                                                            -

                                                                                                                            The tooltip can use each elements title attribute. - Hover me to display tooltip. -

                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customcontent.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customcontent.html deleted file mode 100755 index 68ce13c20..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customcontent.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Custom Tooltip Content - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Custom Tooltip Content

                                                                                                                            -

                                                                                                                            Access to each elements attribute to get the tooltip content.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customstyle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customstyle.html deleted file mode 100755 index 13f10ac59..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/customstyle.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Custom Tooltip Style - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Custom Tooltip Style

                                                                                                                            -

                                                                                                                            This sample shows how to change the tooltip style.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            Hover Me
                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            Hover Me
                                                                                                                            -
                                                                                                                            - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/position.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/position.html deleted file mode 100755 index 8707b2557..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/position.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Tooltip Position - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Tooltip Position

                                                                                                                            -

                                                                                                                            Click the drop-down list below to change where the tooltip appears.

                                                                                                                            -
                                                                                                                            - Select position: - -
                                                                                                                            -
                                                                                                                            Hover Me
                                                                                                                            -
                                                                                                                            - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/toolbar.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/toolbar.html deleted file mode 100755 index c376ea2cd..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/toolbar.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Tooltip as Toolbar - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Tooltip as Toolbar

                                                                                                                            -

                                                                                                                            This sample shows how to create a tooltip style toolbar.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -

                                                                                                                            Hover me to display toolbar.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -
                                                                                                                            - - - - - -
                                                                                                                            -
                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/tooltipdialog.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/tooltipdialog.html deleted file mode 100755 index a22bcac0b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tooltip/tooltipdialog.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Tooltip Dialog - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Tooltip Dialog

                                                                                                                            -

                                                                                                                            This sample shows how to create a tooltip dialog.

                                                                                                                            -
                                                                                                                            -
                                                                                                                            -

                                                                                                                            Click here to see the tooltip dialog. -

                                                                                                                            - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/actions.html deleted file mode 100755 index 4b194e724..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/actions.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - Tree Actions - jQuery EasyUI Demo - - - - - - - -

                                                                                                                            Tree Actions

                                                                                                                            -

                                                                                                                            Click the buttons below to perform actions.

                                                                                                                            - -
                                                                                                                            -
                                                                                                                              -
                                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/animation.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/animation.html deleted file mode 100755 index 83fb263fe..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/animation.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Animation Tree - jQuery EasyUI Demo - - - - - - - -

                                                                                                                              Animation Tree

                                                                                                                              -

                                                                                                                              Apply 'animate' property to true to enable animation effect.

                                                                                                                              -
                                                                                                                              -
                                                                                                                              -
                                                                                                                                -
                                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/basic.html deleted file mode 100755 index 96f4396ec..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/basic.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Basic Tree - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                Basic Tree

                                                                                                                                -

                                                                                                                                Click the arrow on the left to expand or collapse nodes.

                                                                                                                                -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                  -
                                                                                                                                • - My Documents -
                                                                                                                                    -
                                                                                                                                  • - Photos -
                                                                                                                                      -
                                                                                                                                    • - Friend -
                                                                                                                                    • -
                                                                                                                                    • - Wife -
                                                                                                                                    • -
                                                                                                                                    • - Company -
                                                                                                                                    • -
                                                                                                                                    -
                                                                                                                                  • -
                                                                                                                                  • - Program Files -
                                                                                                                                      -
                                                                                                                                    • Intel
                                                                                                                                    • -
                                                                                                                                    • Java
                                                                                                                                    • -
                                                                                                                                    • Microsoft Office
                                                                                                                                    • -
                                                                                                                                    • Games
                                                                                                                                    • -
                                                                                                                                    -
                                                                                                                                  • -
                                                                                                                                  • index.html
                                                                                                                                  • -
                                                                                                                                  • about.html
                                                                                                                                  • -
                                                                                                                                  • welcome.html
                                                                                                                                  • -
                                                                                                                                  -
                                                                                                                                • -
                                                                                                                                -
                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/checkbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/checkbox.html deleted file mode 100755 index 2d1f8d564..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/checkbox.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - CheckBox Tree - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                CheckBox Tree

                                                                                                                                -

                                                                                                                                Tree nodes with check boxes.

                                                                                                                                - -
                                                                                                                                - CascadeCheck - OnlyLeafCheck -
                                                                                                                                -
                                                                                                                                -
                                                                                                                                  -
                                                                                                                                  - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/contextmenu.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/contextmenu.html deleted file mode 100755 index 342fcf3ee..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/contextmenu.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - Tree Context Menu - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                  Tree Context Menu

                                                                                                                                  -

                                                                                                                                  Right click on a node to display context menu.

                                                                                                                                  -
                                                                                                                                  -
                                                                                                                                  -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    Append
                                                                                                                                    -
                                                                                                                                    Remove
                                                                                                                                    - -
                                                                                                                                    Expand
                                                                                                                                    -
                                                                                                                                    Collapse
                                                                                                                                    -
                                                                                                                                    - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/customcheckbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/customcheckbox.html deleted file mode 100755 index 366639abd..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/customcheckbox.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Custom CheckBox Tree - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                    Custom CheckBox Tree

                                                                                                                                    -

                                                                                                                                    Tree nodes with customized check boxes.

                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                    -
                                                                                                                                      -
                                                                                                                                      - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/dnd.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/dnd.html deleted file mode 100755 index 4be5bbd45..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/dnd.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Drag Drop Tree Nodes - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                      Drag Drop Tree Nodes

                                                                                                                                      -

                                                                                                                                      Press mouse down and drag a node to another position.

                                                                                                                                      -
                                                                                                                                      -
                                                                                                                                      -
                                                                                                                                        -
                                                                                                                                        - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/editable.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/editable.html deleted file mode 100755 index 9d3b62c80..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/editable.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Editable Tree - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                        Editable Tree

                                                                                                                                        -

                                                                                                                                        Click the node to begin edit, press enter key to stop edit or esc key to cancel edit.

                                                                                                                                        -
                                                                                                                                        -
                                                                                                                                        -
                                                                                                                                          -
                                                                                                                                          - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/formatting.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/formatting.html deleted file mode 100755 index 187f58869..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/formatting.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Formatting Tree Nodes - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                          Formatting Tree Nodes

                                                                                                                                          -

                                                                                                                                          This example shows how to display extra information on nodes.

                                                                                                                                          -
                                                                                                                                          -
                                                                                                                                          -
                                                                                                                                            -
                                                                                                                                          -
                                                                                                                                          - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/icons.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/icons.html deleted file mode 100755 index c4cecb84d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/icons.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Tree Node Icons - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                          Tree Node Icons

                                                                                                                                          -

                                                                                                                                          This sample illustrates how to add icons to tree node.

                                                                                                                                          -
                                                                                                                                          -
                                                                                                                                          -
                                                                                                                                            -
                                                                                                                                            - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lazyload.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lazyload.html deleted file mode 100755 index 865cee614..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lazyload.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - Lazy Load Tree Nodes - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                            Lazy Load Tree Nodes

                                                                                                                                            -

                                                                                                                                            Get full hierarchical tree data but lazy load nodes level by level.

                                                                                                                                            -
                                                                                                                                            -
                                                                                                                                            -
                                                                                                                                              -
                                                                                                                                              - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lines.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lines.html deleted file mode 100755 index 681a16b4a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/lines.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Tree Lines - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                              Tree Lines

                                                                                                                                              -

                                                                                                                                              This sample shows how to show tree lines.

                                                                                                                                              -
                                                                                                                                              -
                                                                                                                                              -
                                                                                                                                                -
                                                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data1.json deleted file mode 100755 index e0c619226..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data1.json +++ /dev/null @@ -1,49 +0,0 @@ -[{ - "id":1, - "text":"My Documents", - "children":[{ - "id":11, - "text":"Photos", - "state":"closed", - "children":[{ - "id":111, - "text":"Friend" - },{ - "id":112, - "text":"Wife" - },{ - "id":113, - "text":"Company" - }] - },{ - "id":12, - "text":"Program Files", - "children":[{ - "id":121, - "text":"Intel" - },{ - "id":122, - "text":"Java", - "attributes":{ - "p1":"Custom Attribute1", - "p2":"Custom Attribute2" - } - },{ - "id":123, - "text":"Microsoft Office" - },{ - "id":124, - "text":"Games", - "checked":true - }] - },{ - "id":13, - "text":"index.html" - },{ - "id":14, - "text":"about.html" - },{ - "id":15, - "text":"welcome.html" - }] -}] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data2.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data2.json deleted file mode 100755 index a6e225177..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/tree/tree_data2.json +++ /dev/null @@ -1,61 +0,0 @@ -[{ - "id":1, - "text":"My Documents", - "children":[{ - "id":11, - "text":"Photos", - "state":"closed", - "children":[{ - "id":111, - "text":"Friend" - },{ - "id":112, - "text":"Wife" - },{ - "id":113, - "text":"Company" - }] - },{ - "id":12, - "text":"Program Files", - "state":"closed", - "children":[{ - "id":121, - "text":"Intel" - },{ - "id":122, - "text":"Java" - },{ - "id":123, - "text":"Microsoft Office" - },{ - "id":124, - "text":"Games" - }] - },{ - "id":16, - "text":"Actions", - "children":[{ - "text":"Add", - "iconCls":"icon-add" - },{ - "text":"Remove", - "iconCls":"icon-remove" - },{ - "text":"Save", - "iconCls":"icon-save" - },{ - "text":"Search", - "iconCls":"icon-search" - }] - },{ - "id":13, - "text":"index.html" - },{ - "id":14, - "text":"about.html" - },{ - "id":15, - "text":"welcome.html" - }] -}] diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/actions.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/actions.html deleted file mode 100755 index 6249a9eed..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/actions.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - TreeGrid Actions - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                TreeGrid Actions

                                                                                                                                                -

                                                                                                                                                Click the buttons below to perform actions.

                                                                                                                                                - - - - - - - - - - - -
                                                                                                                                                Task NamePersonsBegin DateEnd DateProgress
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/basic.html deleted file mode 100755 index 3b5076bb2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/basic.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Basic TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Basic TreeGrid

                                                                                                                                                -

                                                                                                                                                TreeGrid allows you to expand or collapse group rows.

                                                                                                                                                -
                                                                                                                                                - - - - - - - - -
                                                                                                                                                NameSizeModified Date
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/checkbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/checkbox.html deleted file mode 100755 index bbf6f8309..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/checkbox.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Cascade CheckBox in TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Cascade CheckBox in TreeGrid

                                                                                                                                                -

                                                                                                                                                TreeGrid nodes with cascade check boxes.

                                                                                                                                                -
                                                                                                                                                - - - - - - - - -
                                                                                                                                                NameSizeModified Date
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/clientpagination.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/clientpagination.html deleted file mode 100755 index 03f8bf3a5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/clientpagination.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - Client Side Pagination in TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Client Side Pagination in TreeGrid

                                                                                                                                                -

                                                                                                                                                This sample shows how to implement client side pagination in TreeGrid.

                                                                                                                                                -
                                                                                                                                                - - - - - - - - - - -
                                                                                                                                                Task NamePersonsBegin DateEnd DateProgress
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/contextmenu.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/contextmenu.html deleted file mode 100755 index 3394ea15d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/contextmenu.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - TreeGrid ContextMenu - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                TreeGrid ContextMenu

                                                                                                                                                -

                                                                                                                                                Right click to display the context menu.

                                                                                                                                                -
                                                                                                                                                - - - - - - - - - - -
                                                                                                                                                Task NamePersonsBegin DateEnd DateProgress
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                Append
                                                                                                                                                -
                                                                                                                                                Remove
                                                                                                                                                - -
                                                                                                                                                Collapse
                                                                                                                                                -
                                                                                                                                                Expand
                                                                                                                                                -
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/customcheckbox.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/customcheckbox.html deleted file mode 100755 index 40a34c02d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/customcheckbox.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Custom CheckBox in TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Custom CheckBox in TreeGrid

                                                                                                                                                -

                                                                                                                                                TreeGrid nodes with customized check boxes.

                                                                                                                                                -
                                                                                                                                                - - - - - - - - -
                                                                                                                                                NameSizeModified Date
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/editable.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/editable.html deleted file mode 100755 index 0b79d39d4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/editable.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - Editable TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Editable TreeGrid

                                                                                                                                                -

                                                                                                                                                Select one node and click edit button to perform editing.

                                                                                                                                                -
                                                                                                                                                - Edit - Save - Cancel -
                                                                                                                                                - - - - - - - - - - -
                                                                                                                                                Task NamePersonsBegin DateEnd DateProgress
                                                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/fluid.html deleted file mode 100755 index 1fd82f674..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/fluid.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Fluid TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Fluid TreeGrid

                                                                                                                                                -

                                                                                                                                                This example shows how to assign percentage width to a column in TreeGrid.

                                                                                                                                                -
                                                                                                                                                - - - - - - - - -
                                                                                                                                                Name(50%)Size(20%)Modified Date(30%)
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/footer.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/footer.html deleted file mode 100755 index d03e7563f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/footer.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - TreeGrid with Footer - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                TreeGrid with Footer

                                                                                                                                                -

                                                                                                                                                Show summary information on TreeGrid footer.

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/lines.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/lines.html deleted file mode 100755 index 935f862a3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/lines.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - TreeGrid Lines - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                TreeGrid Lines

                                                                                                                                                -

                                                                                                                                                This example shows how to show treegrid lines.

                                                                                                                                                -
                                                                                                                                                - - - - - - - - -
                                                                                                                                                NameSizeModified Date
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/reports.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/reports.html deleted file mode 100755 index 062e6c87b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/reports.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - Reports using TreeGrid - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Reports using TreeGrid

                                                                                                                                                -

                                                                                                                                                Using TreeGrid to show complex reports.

                                                                                                                                                -
                                                                                                                                                - - - - - - - - - - - - - - - - - - - - - - -
                                                                                                                                                Region
                                                                                                                                                20092010
                                                                                                                                                1st qrt.2st qrt.3st qrt.4st qrt.1st qrt.2st qrt.3st qrt.4st qrt.
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data1.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data1.json deleted file mode 100755 index 6cc109739..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data1.json +++ /dev/null @@ -1,73 +0,0 @@ -[{ - "id":1, - "name":"C", - "size":"", - "date":"02/19/2010", - "children":[{ - "id":2, - "name":"Program Files", - "size":"120 MB", - "date":"03/20/2010", - "children":[{ - "id":21, - "name":"Java", - "size":"", - "date":"01/13/2010", - "state":"closed", - "children":[{ - "id":211, - "name":"java.exe", - "size":"142 KB", - "date":"01/13/2010" - },{ - "id":212, - "name":"jawt.dll", - "size":"5 KB", - "date":"01/13/2010" - }] - },{ - "id":22, - "name":"MySQL", - "size":"", - "date":"01/13/2010", - "state":"closed", - "children":[{ - "id":221, - "name":"my.ini", - "size":"10 KB", - "date":"02/26/2009" - },{ - "id":222, - "name":"my-huge.ini", - "size":"5 KB", - "date":"02/26/2009" - },{ - "id":223, - "name":"my-large.ini", - "size":"5 KB", - "date":"02/26/2009" - }] - }] - },{ - "id":3, - "name":"eclipse", - "size":"", - "date":"01/20/2010", - "children":[{ - "id":31, - "name":"eclipse.exe", - "size":"56 KB", - "date":"05/19/2009" - },{ - "id":32, - "name":"eclipse.ini", - "size":"1 KB", - "date":"04/20/2010" - },{ - "id":33, - "name":"notice.html", - "size":"7 KB", - "date":"03/17/2005" - }] - }] -}] \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data2.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data2.json deleted file mode 100755 index 52c2c0527..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data2.json +++ /dev/null @@ -1,11 +0,0 @@ -{"total":7,"rows":[ - {"id":1,"name":"All Tasks","begin":"3/4/2010","end":"3/20/2010","progress":60,"iconCls":"icon-ok"}, - {"id":2,"name":"Designing","begin":"3/4/2010","end":"3/10/2010","progress":100,"_parentId":1,"state":"closed"}, - {"id":21,"name":"Database","persons":2,"begin":"3/4/2010","end":"3/6/2010","progress":100,"_parentId":2}, - {"id":22,"name":"UML","persons":1,"begin":"3/7/2010","end":"3/8/2010","progress":100,"_parentId":2}, - {"id":23,"name":"Export Document","persons":1,"begin":"3/9/2010","end":"3/10/2010","progress":100,"_parentId":2}, - {"id":3,"name":"Coding","persons":2,"begin":"3/11/2010","end":"3/18/2010","progress":80}, - {"id":4,"name":"Testing","persons":1,"begin":"3/19/2010","end":"3/20/2010","progress":20} -],"footer":[ - {"name":"Total Persons:","persons":7,"iconCls":"icon-sum"} -]} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data3.json b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data3.json deleted file mode 100755 index 7015d317b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/treegrid/treegrid_data3.json +++ /dev/null @@ -1,13 +0,0 @@ -{"total":9,"rows":[ - {"id":1,"region":"Wyoming"}, - {"id":11,"region":"Albin","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, - {"id":12,"region":"Canon","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, - {"id":13,"region":"Egbert","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":1}, - {"id":2,"region":"Washington"}, - {"id":21,"region":"Bellingham","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, - {"id":22,"region":"Chehalis","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, - {"id":23,"region":"Ellensburg","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2}, - {"id":24,"region":"Monroe","f1":2000,"f2":1800,"f3":1903,"f4":2183,"f5":2133,"f6":1923,"f7":2018,"f8":1838,"_parentId":2} -],"footer":[ - {"region":"Total","f1":14000,"f2":12600,"f3":13321,"f4":15281,"f5":14931,"f6":13461,"f7":14126,"f8":12866} -]} \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/basic.html deleted file mode 100755 index 41bd5097c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/basic.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Basic ValidateBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Basic ValidateBox

                                                                                                                                                -

                                                                                                                                                It's easy to add validate logic to a input box.

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/customtooltip.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/customtooltip.html deleted file mode 100755 index a5adf6a5b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/customtooltip.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - Custom ValidateBox Tooltip - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Custom ValidateBox Tooltip

                                                                                                                                                -

                                                                                                                                                This sample shows how to display another tooltip message on a valid textbox.

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/errorplacement.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/errorplacement.html deleted file mode 100755 index 7bc164886..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/errorplacement.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Error Placement in ValidateBox - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Error Placement in ValidateBox

                                                                                                                                                -

                                                                                                                                                This example shows how to display the error message below the field.

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/validateonblur.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/validateonblur.html deleted file mode 100755 index 372cff452..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/validatebox/validateonblur.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Validate On Blur - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Validate On Blur

                                                                                                                                                -

                                                                                                                                                Active validation on first blur event.

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - -
                                                                                                                                                -
                                                                                                                                                - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/basic.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/basic.html deleted file mode 100755 index fb402468b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/basic.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Basic Window - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Basic Window

                                                                                                                                                -

                                                                                                                                                Window can be dragged freely on screen.

                                                                                                                                                -
                                                                                                                                                - Open - Close -
                                                                                                                                                -
                                                                                                                                                - The window content. -
                                                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/borderstyle.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/borderstyle.html deleted file mode 100755 index fd7a8f495..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/borderstyle.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Window Border Style - jQuery EasyUI Demo - - - - - - - - -

                                                                                                                                                Window Border Style

                                                                                                                                                -

                                                                                                                                                This example shows how to set the different border style.

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -

                                                                                                                                                Window content

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -

                                                                                                                                                Window content

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -

                                                                                                                                                Window content

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -

                                                                                                                                                Window content

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -

                                                                                                                                                Window content

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -

                                                                                                                                                Window content

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                - - - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/customtools.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/customtools.html deleted file mode 100755 index 4a0e2c45d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/customtools.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Custom Window Tools - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Custom Window Tools

                                                                                                                                                -

                                                                                                                                                Click the right top buttons to perform actions.

                                                                                                                                                -
                                                                                                                                                - Open - Close -
                                                                                                                                                -
                                                                                                                                                - The window content. -
                                                                                                                                                -
                                                                                                                                                - - - - -
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/fluid.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/fluid.html deleted file mode 100755 index 13406fa19..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/fluid.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Fluid Window - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Fluid Window

                                                                                                                                                -

                                                                                                                                                This example shows how to set the width of Window to a percentage of its parent container.

                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -

                                                                                                                                                The window has a width of 80%.

                                                                                                                                                -
                                                                                                                                                - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/footer.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/footer.html deleted file mode 100755 index 60e8b9aeb..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/footer.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Window with a Footer - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Window with a Footer

                                                                                                                                                -

                                                                                                                                                This example shows how to attach a footer bar to the window.

                                                                                                                                                -
                                                                                                                                                - Open - Close -
                                                                                                                                                -
                                                                                                                                                - The window content. -
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/inlinewindow.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/inlinewindow.html deleted file mode 100755 index f272bb167..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/inlinewindow.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Inline Window - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Inline Window

                                                                                                                                                -

                                                                                                                                                The inline window stay inside its parent.

                                                                                                                                                -
                                                                                                                                                - Open - Close -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                - This window stay inside its parent -
                                                                                                                                                -
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/modalwindow.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/modalwindow.html deleted file mode 100755 index ee273ec91..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/modalwindow.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Modal Window - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Modal Window

                                                                                                                                                -

                                                                                                                                                Click the open button below to open the modal window.

                                                                                                                                                -
                                                                                                                                                - Open - Close -
                                                                                                                                                -
                                                                                                                                                - The window content. -
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/windowlayout.html b/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/windowlayout.html deleted file mode 100755 index d79927213..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/demo/window/windowlayout.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Window Layout - jQuery EasyUI Demo - - - - - - - -

                                                                                                                                                Window Layout

                                                                                                                                                -

                                                                                                                                                Using layout on window.

                                                                                                                                                -
                                                                                                                                                - Open - Close -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                - jQuery EasyUI framework help you build your web page easily. -
                                                                                                                                                -
                                                                                                                                                - Ok - Cancel -
                                                                                                                                                -
                                                                                                                                                -
                                                                                                                                                - - - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/easyloader.js b/testapps/ResourceLoaderTest/src/main/resources/asset/easyloader.js deleted file mode 100755 index d082ad2bd..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/easyloader.js +++ /dev/null @@ -1,190 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function(){ -var _1={draggable:{js:"jquery.draggable.js"},droppable:{js:"jquery.droppable.js"},resizable:{js:"jquery.resizable.js"},linkbutton:{js:"jquery.linkbutton.js",css:"linkbutton.css"},progressbar:{js:"jquery.progressbar.js",css:"progressbar.css"},tooltip:{js:"jquery.tooltip.js",css:"tooltip.css"},pagination:{js:"jquery.pagination.js",css:"pagination.css",dependencies:["linkbutton"]},datagrid:{js:"jquery.datagrid.js",css:"datagrid.css",dependencies:["panel","resizable","linkbutton","pagination"]},treegrid:{js:"jquery.treegrid.js",css:"tree.css",dependencies:["datagrid"]},propertygrid:{js:"jquery.propertygrid.js",css:"propertygrid.css",dependencies:["datagrid"]},datalist:{js:"jquery.datalist.js",css:"datalist.css",dependencies:["datagrid"]},panel:{js:"jquery.panel.js",css:"panel.css"},window:{js:"jquery.window.js",css:"window.css",dependencies:["resizable","draggable","panel"]},dialog:{js:"jquery.dialog.js",css:"dialog.css",dependencies:["linkbutton","window"]},messager:{js:"jquery.messager.js",css:"messager.css",dependencies:["linkbutton","dialog","progressbar"]},layout:{js:"jquery.layout.js",css:"layout.css",dependencies:["resizable","panel"]},form:{js:"jquery.form.js"},menu:{js:"jquery.menu.js",css:"menu.css"},tabs:{js:"jquery.tabs.js",css:"tabs.css",dependencies:["panel","linkbutton"]},menubutton:{js:"jquery.menubutton.js",css:"menubutton.css",dependencies:["linkbutton","menu"]},splitbutton:{js:"jquery.splitbutton.js",css:"splitbutton.css",dependencies:["menubutton"]},switchbutton:{js:"jquery.switchbutton.js",css:"switchbutton.css"},accordion:{js:"jquery.accordion.js",css:"accordion.css",dependencies:["panel"]},calendar:{js:"jquery.calendar.js",css:"calendar.css"},textbox:{js:"jquery.textbox.js",css:"textbox.css",dependencies:["validatebox","linkbutton"]},passwordbox:{js:"jquery.passwordbox.js",css:"passwordbox.css",dependencies:["textbox"]},filebox:{js:"jquery.filebox.js",css:"filebox.css",dependencies:["textbox"]},combo:{js:"jquery.combo.js",css:"combo.css",dependencies:["panel","textbox"]},combobox:{js:"jquery.combobox.js",css:"combobox.css",dependencies:["combo"]},combotree:{js:"jquery.combotree.js",dependencies:["combo","tree"]},combogrid:{js:"jquery.combogrid.js",dependencies:["combo","datagrid"]},combotreegrid:{js:"jquery.combotreegrid.js",dependencies:["combo","treegrid"]},tagbox:{js:"jquery.tagbox.js",dependencies:["combobox"]},validatebox:{js:"jquery.validatebox.js",css:"validatebox.css",dependencies:["tooltip"]},numberbox:{js:"jquery.numberbox.js",dependencies:["textbox"]},searchbox:{js:"jquery.searchbox.js",css:"searchbox.css",dependencies:["menubutton","textbox"]},spinner:{js:"jquery.spinner.js",css:"spinner.css",dependencies:["textbox"]},numberspinner:{js:"jquery.numberspinner.js",dependencies:["spinner","numberbox"]},timespinner:{js:"jquery.timespinner.js",dependencies:["spinner"]},tree:{js:"jquery.tree.js",css:"tree.css",dependencies:["draggable","droppable"]},datebox:{js:"jquery.datebox.js",css:"datebox.css",dependencies:["calendar","combo"]},datetimebox:{js:"jquery.datetimebox.js",dependencies:["datebox","timespinner"]},slider:{js:"jquery.slider.js",dependencies:["draggable"]},parser:{js:"jquery.parser.js"},mobile:{js:"jquery.mobile.js"}}; -var _2={"af":"easyui-lang-af.js","ar":"easyui-lang-ar.js","bg":"easyui-lang-bg.js","ca":"easyui-lang-ca.js","cs":"easyui-lang-cs.js","cz":"easyui-lang-cz.js","da":"easyui-lang-da.js","de":"easyui-lang-de.js","el":"easyui-lang-el.js","en":"easyui-lang-en.js","es":"easyui-lang-es.js","fr":"easyui-lang-fr.js","it":"easyui-lang-it.js","jp":"easyui-lang-jp.js","nl":"easyui-lang-nl.js","pl":"easyui-lang-pl.js","pt_BR":"easyui-lang-pt_BR.js","ru":"easyui-lang-ru.js","sv_SE":"easyui-lang-sv_SE.js","tr":"easyui-lang-tr.js","zh_CN":"easyui-lang-zh_CN.js","zh_TW":"easyui-lang-zh_TW.js"}; -var _3={}; -function _4(_5,_6){ -var _7=false; -var _8=document.createElement("script"); -_8.type="text/javascript"; -_8.language="javascript"; -_8.src=_5; -_8.onload=_8.onreadystatechange=function(){ -if(!_7&&(!_8.readyState||_8.readyState=="loaded"||_8.readyState=="complete")){ -_7=true; -_8.onload=_8.onreadystatechange=null; -if(_6){ -_6.call(_8); -} -} -}; -document.getElementsByTagName("head")[0].appendChild(_8); -}; -function _9(_a,_b){ -_4(_a,function(){ -document.getElementsByTagName("head")[0].removeChild(this); -if(_b){ -_b(); -} -}); -}; -function _c(_d,_e){ -var _f=document.createElement("link"); -_f.rel="stylesheet"; -_f.type="text/css"; -_f.media="screen"; -_f.href=_d; -document.getElementsByTagName("head")[0].appendChild(_f); -if(_e){ -_e.call(_f); -} -}; -function _10(_11,_12){ -_3[_11]="loading"; -var _13=_1[_11]; -var _14="loading"; -var _15=(easyloader.css&&_13["css"])?"loading":"loaded"; -if(easyloader.css&&_13["css"]){ -if(/^http/i.test(_13["css"])){ -var url=_13["css"]; -}else{ -var url=easyloader.base+"themes/"+easyloader.theme+"/"+_13["css"]; -} -_c(url,function(){ -_15="loaded"; -if(_14=="loaded"&&_15=="loaded"){ -_16(); -} -}); -} -if(/^http/i.test(_13["js"])){ -var url=_13["js"]; -}else{ -var url=easyloader.base+"plugins/"+_13["js"]; -} -_4(url,function(){ -_14="loaded"; -if(_14=="loaded"&&_15=="loaded"){ -_16(); -} -}); -function _16(){ -_3[_11]="loaded"; -easyloader.onProgress(_11); -if(_12){ -_12(); -} -}; -}; -function _17(_18,_19){ -var mm=[]; -var _1a=false; -if(typeof _18=="string"){ -add(_18); -}else{ -for(var i=0;i<_18.length;i++){ -add(_18[i]); -} -} -function add(_1b){ -if(!_1[_1b]){ -return; -} -var d=_1[_1b]["dependencies"]; -if(d){ -for(var i=0;i=0;i--){ -_9.unshift(_a.children[i]); -} -} -} -}}; -$.parser={auto:true,onComplete:function(_b){ -},plugins:["draggable","droppable","resizable","pagination","tooltip","linkbutton","menu","sidemenu","menubutton","splitbutton","switchbutton","progressbar","tree","textbox","passwordbox","maskedbox","filebox","combo","combobox","combotree","combogrid","combotreegrid","tagbox","numberbox","validatebox","searchbox","spinner","numberspinner","timespinner","datetimespinner","calendar","datebox","datetimebox","slider","layout","panel","datagrid","propertygrid","treegrid","datalist","tabs","accordion","window","dialog","form"],parse:function(_c){ -var aa=[]; -for(var i=0;i<$.parser.plugins.length;i++){ -var _d=$.parser.plugins[i]; -var r=$(".easyui-"+_d,_c); -if(r.length){ -if(r[_d]){ -r.each(function(){ -$(this)[_d]($.data(this,"options")||{}); -}); -}else{ -aa.push({name:_d,jq:r}); -} -} -} -if(aa.length&&window.easyloader){ -var _e=[]; -for(var i=0;i=0){ -v=Math.floor((_12.width()-_13)*v/100); -}else{ -v=Math.floor((_12.height()-_13)*v/100); -} -}else{ -v=parseInt(v)||undefined; -} -return v; -},parseOptions:function(_15,_16){ -var t=$(_15); -var _17={}; -var s=$.trim(t.attr("data-options")); -if(s){ -if(s.substring(0,1)!="{"){ -s="{"+s+"}"; -} -_17=(new Function("return "+s))(); -} -$.map(["width","height","left","top","minWidth","maxWidth","minHeight","maxHeight"],function(p){ -var pv=$.trim(_15.style[p]||""); -if(pv){ -if(pv.indexOf("%")==-1){ -pv=parseInt(pv); -if(isNaN(pv)){ -pv=undefined; -} -} -_17[p]=pv; -} -}); -if(_16){ -var _18={}; -for(var i=0;i<_16.length;i++){ -var pp=_16[i]; -if(typeof pp=="string"){ -_18[pp]=t.attr(pp); -}else{ -for(var _19 in pp){ -var _1a=pp[_19]; -if(_1a=="boolean"){ -_18[_19]=t.attr(_19)?(t.attr(_19)=="true"):undefined; -}else{ -if(_1a=="number"){ -_18[_19]=t.attr(_19)=="0"?0:parseFloat(t.attr(_19))||undefined; -} -} -} -} -} -$.extend(_17,_18); -} -return _17; -}}; -$(function(){ -var d=$("
                                                                                                                                                ").appendTo("body"); -$._boxModel=d.outerWidth()!=100; -d.remove(); -d=$("
                                                                                                                                                ").appendTo("body"); -$._positionFixed=(d.css("position")=="fixed"); -d.remove(); -if(!window.easyloader&&$.parser.auto){ -$.parser.parse(); -} -}); -$.fn._outerWidth=function(_1b){ -if(_1b==undefined){ -if(this[0]==window){ -return this.width()||document.body.clientWidth; -} -return this.outerWidth()||0; -} -return this._size("width",_1b); -}; -$.fn._outerHeight=function(_1c){ -if(_1c==undefined){ -if(this[0]==window){ -return this.height()||document.body.clientHeight; -} -return this.outerHeight()||0; -} -return this._size("height",_1c); -}; -$.fn._scrollLeft=function(_1d){ -if(_1d==undefined){ -return this.scrollLeft(); -}else{ -return this.each(function(){ -$(this).scrollLeft(_1d); -}); -} -}; -$.fn._propAttr=$.fn.prop||$.fn.attr; -$.fn._size=function(_1e,_1f){ -if(typeof _1e=="string"){ -if(_1e=="clear"){ -return this.each(function(){ -$(this).css({width:"",minWidth:"",maxWidth:"",height:"",minHeight:"",maxHeight:""}); -}); -}else{ -if(_1e=="fit"){ -return this.each(function(){ -_20(this,this.tagName=="BODY"?$("body"):$(this).parent(),true); -}); -}else{ -if(_1e=="unfit"){ -return this.each(function(){ -_20(this,$(this).parent(),false); -}); -}else{ -if(_1f==undefined){ -return _21(this[0],_1e); -}else{ -return this.each(function(){ -_21(this,_1e,_1f); -}); -} -} -} -} -}else{ -return this.each(function(){ -_1f=_1f||$(this).parent(); -$.extend(_1e,_20(this,_1f,_1e.fit)||{}); -var r1=_22(this,"width",_1f,_1e); -var r2=_22(this,"height",_1f,_1e); -if(r1||r2){ -$(this).addClass("easyui-fluid"); -}else{ -$(this).removeClass("easyui-fluid"); -} -}); -} -function _20(_23,_24,fit){ -if(!_24.length){ -return false; -} -var t=$(_23)[0]; -var p=_24[0]; -var _25=p.fcount||0; -if(fit){ -if(!t.fitted){ -t.fitted=true; -p.fcount=_25+1; -$(p).addClass("panel-noscroll"); -if(p.tagName=="BODY"){ -$("html").addClass("panel-fit"); -} -} -return {width:($(p).width()||1),height:($(p).height()||1)}; -}else{ -if(t.fitted){ -t.fitted=false; -p.fcount=_25-1; -if(p.fcount==0){ -$(p).removeClass("panel-noscroll"); -if(p.tagName=="BODY"){ -$("html").removeClass("panel-fit"); -} -} -} -return false; -} -}; -function _22(_26,_27,_28,_29){ -var t=$(_26); -var p=_27; -var p1=p.substr(0,1).toUpperCase()+p.substr(1); -var min=$.parser.parseValue("min"+p1,_29["min"+p1],_28); -var max=$.parser.parseValue("max"+p1,_29["max"+p1],_28); -var val=$.parser.parseValue(p,_29[p],_28); -var _2a=(String(_29[p]||"").indexOf("%")>=0?true:false); -if(!isNaN(val)){ -var v=Math.min(Math.max(val,min||0),max||99999); -if(!_2a){ -_29[p]=v; -} -t._size("min"+p1,""); -t._size("max"+p1,""); -t._size(p,v); -}else{ -t._size(p,""); -t._size("min"+p1,min); -t._size("max"+p1,max); -} -return _2a||_29.fit; -}; -function _21(_2b,_2c,_2d){ -var t=$(_2b); -if(_2d==undefined){ -_2d=parseInt(_2b.style[_2c]); -if(isNaN(_2d)){ -return undefined; -} -if($._boxModel){ -_2d+=_2e(); -} -return _2d; -}else{ -if(_2d===""){ -t.css(_2c,""); -}else{ -if($._boxModel){ -_2d-=_2e(); -if(_2d<0){ -_2d=0; -} -} -t.css(_2c,_2d+"px"); -} -} -function _2e(){ -if(_2c.toLowerCase().indexOf("width")>=0){ -return t.outerWidth()-t.width(); -}else{ -return t.outerHeight()-t.height(); -} -}; -}; -}; -})(jQuery); -(function($){ -var _2f=null; -var _30=null; -var _31=false; -function _32(e){ -if(e.touches.length!=1){ -return; -} -if(!_31){ -_31=true; -dblClickTimer=setTimeout(function(){ -_31=false; -},500); -}else{ -clearTimeout(dblClickTimer); -_31=false; -_33(e,"dblclick"); -} -_2f=setTimeout(function(){ -_33(e,"contextmenu",3); -},1000); -_33(e,"mousedown"); -if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ -e.preventDefault(); -} -}; -function _34(e){ -if(e.touches.length!=1){ -return; -} -if(_2f){ -clearTimeout(_2f); -} -_33(e,"mousemove"); -if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ -e.preventDefault(); -} -}; -function _35(e){ -if(_2f){ -clearTimeout(_2f); -} -_33(e,"mouseup"); -if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ -e.preventDefault(); -} -}; -function _33(e,_36,_37){ -var _38=new $.Event(_36); -_38.pageX=e.changedTouches[0].pageX; -_38.pageY=e.changedTouches[0].pageY; -_38.which=_37||1; -$(e.target).trigger(_38); -}; -if(document.addEventListener){ -document.addEventListener("touchstart",_32,true); -document.addEventListener("touchmove",_34,true); -document.addEventListener("touchend",_35,true); -} -})(jQuery); -(function($){ -function _39(e){ -var _3a=$.data(e.data.target,"draggable"); -var _3b=_3a.options; -var _3c=_3a.proxy; -var _3d=e.data; -var _3e=_3d.startLeft+e.pageX-_3d.startX; -var top=_3d.startTop+e.pageY-_3d.startY; -if(_3c){ -if(_3c.parent()[0]==document.body){ -if(_3b.deltaX!=null&&_3b.deltaX!=undefined){ -_3e=e.pageX+_3b.deltaX; -}else{ -_3e=e.pageX-e.data.offsetWidth; -} -if(_3b.deltaY!=null&&_3b.deltaY!=undefined){ -top=e.pageY+_3b.deltaY; -}else{ -top=e.pageY-e.data.offsetHeight; -} -}else{ -if(_3b.deltaX!=null&&_3b.deltaX!=undefined){ -_3e+=e.data.offsetWidth+_3b.deltaX; -} -if(_3b.deltaY!=null&&_3b.deltaY!=undefined){ -top+=e.data.offsetHeight+_3b.deltaY; -} -} -} -if(e.data.parent!=document.body){ -_3e+=$(e.data.parent).scrollLeft(); -top+=$(e.data.parent).scrollTop(); -} -if(_3b.axis=="h"){ -_3d.left=_3e; -}else{ -if(_3b.axis=="v"){ -_3d.top=top; -}else{ -_3d.left=_3e; -_3d.top=top; -} -} -}; -function _3f(e){ -var _40=$.data(e.data.target,"draggable"); -var _41=_40.options; -var _42=_40.proxy; -if(!_42){ -_42=$(e.data.target); -} -_42.css({left:e.data.left,top:e.data.top}); -$("body").css("cursor",_41.cursor); -}; -function _43(e){ -if(!$.fn.draggable.isDragging){ -return false; -} -var _44=$.data(e.data.target,"draggable"); -var _45=_44.options; -var _46=$(".droppable:visible").filter(function(){ -return e.data.target!=this; -}).filter(function(){ -var _47=$.data(this,"droppable").options.accept; -if(_47){ -return $(_47).filter(function(){ -return this==e.data.target; -}).length>0; -}else{ -return true; -} -}); -_44.droppables=_46; -var _48=_44.proxy; -if(!_48){ -if(_45.proxy){ -if(_45.proxy=="clone"){ -_48=$(e.data.target).clone().insertAfter(e.data.target); -}else{ -_48=_45.proxy.call(e.data.target,e.data.target); -} -_44.proxy=_48; -}else{ -_48=$(e.data.target); -} -} -_48.css("position","absolute"); -_39(e); -_3f(e); -_45.onStartDrag.call(e.data.target,e); -return false; -}; -function _49(e){ -if(!$.fn.draggable.isDragging){ -return false; -} -var _4a=$.data(e.data.target,"draggable"); -_39(e); -if(_4a.options.onDrag.call(e.data.target,e)!=false){ -_3f(e); -} -var _4b=e.data.target; -_4a.droppables.each(function(){ -var _4c=$(this); -if(_4c.droppable("options").disabled){ -return; -} -var p2=_4c.offset(); -if(e.pageX>p2.left&&e.pageXp2.top&&e.pageYp2.left&&e.pageXp2.top&&e.pageY_62.options.edge; -}; -}); -}; -$.fn.draggable.methods={options:function(jq){ -return $.data(jq[0],"draggable").options; -},proxy:function(jq){ -return $.data(jq[0],"draggable").proxy; -},enable:function(jq){ -return jq.each(function(){ -$(this).draggable({disabled:false}); -}); -},disable:function(jq){ -return jq.each(function(){ -$(this).draggable({disabled:true}); -}); -}}; -$.fn.draggable.parseOptions=function(_67){ -var t=$(_67); -return $.extend({},$.parser.parseOptions(_67,["cursor","handle","axis",{"revert":"boolean","deltaX":"number","deltaY":"number","edge":"number","delay":"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.draggable.defaults={proxy:null,revert:false,cursor:"move",deltaX:null,deltaY:null,handle:null,disabled:false,edge:0,axis:null,delay:100,onBeforeDrag:function(e){ -},onStartDrag:function(e){ -},onDrag:function(e){ -},onEndDrag:function(e){ -},onStopDrag:function(e){ -}}; -$.fn.draggable.isDragging=false; -})(jQuery); -(function($){ -function _68(_69){ -$(_69).addClass("droppable"); -$(_69).bind("_dragenter",function(e,_6a){ -$.data(_69,"droppable").options.onDragEnter.apply(_69,[e,_6a]); -}); -$(_69).bind("_dragleave",function(e,_6b){ -$.data(_69,"droppable").options.onDragLeave.apply(_69,[e,_6b]); -}); -$(_69).bind("_dragover",function(e,_6c){ -$.data(_69,"droppable").options.onDragOver.apply(_69,[e,_6c]); -}); -$(_69).bind("_drop",function(e,_6d){ -$.data(_69,"droppable").options.onDrop.apply(_69,[e,_6d]); -}); -}; -$.fn.droppable=function(_6e,_6f){ -if(typeof _6e=="string"){ -return $.fn.droppable.methods[_6e](this,_6f); -} -_6e=_6e||{}; -return this.each(function(){ -var _70=$.data(this,"droppable"); -if(_70){ -$.extend(_70.options,_6e); -}else{ -_68(this); -$.data(this,"droppable",{options:$.extend({},$.fn.droppable.defaults,$.fn.droppable.parseOptions(this),_6e)}); -} -}); -}; -$.fn.droppable.methods={options:function(jq){ -return $.data(jq[0],"droppable").options; -},enable:function(jq){ -return jq.each(function(){ -$(this).droppable({disabled:false}); -}); -},disable:function(jq){ -return jq.each(function(){ -$(this).droppable({disabled:true}); -}); -}}; -$.fn.droppable.parseOptions=function(_71){ -var t=$(_71); -return $.extend({},$.parser.parseOptions(_71,["accept"]),{disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.droppable.defaults={accept:null,disabled:false,onDragEnter:function(e,_72){ -},onDragOver:function(e,_73){ -},onDragLeave:function(e,_74){ -},onDrop:function(e,_75){ -}}; -})(jQuery); -(function($){ -function _76(e){ -var _77=e.data; -var _78=$.data(_77.target,"resizable").options; -if(_77.dir.indexOf("e")!=-1){ -var _79=_77.startWidth+e.pageX-_77.startX; -_79=Math.min(Math.max(_79,_78.minWidth),_78.maxWidth); -_77.width=_79; -} -if(_77.dir.indexOf("s")!=-1){ -var _7a=_77.startHeight+e.pageY-_77.startY; -_7a=Math.min(Math.max(_7a,_78.minHeight),_78.maxHeight); -_77.height=_7a; -} -if(_77.dir.indexOf("w")!=-1){ -var _79=_77.startWidth-e.pageX+_77.startX; -_79=Math.min(Math.max(_79,_78.minWidth),_78.maxWidth); -_77.width=_79; -_77.left=_77.startLeft+_77.startWidth-_77.width; -} -if(_77.dir.indexOf("n")!=-1){ -var _7a=_77.startHeight-e.pageY+_77.startY; -_7a=Math.min(Math.max(_7a,_78.minHeight),_78.maxHeight); -_77.height=_7a; -_77.top=_77.startTop+_77.startHeight-_77.height; -} -}; -function _7b(e){ -var _7c=e.data; -var t=$(_7c.target); -t.css({left:_7c.left,top:_7c.top}); -if(t.outerWidth()!=_7c.width){ -t._outerWidth(_7c.width); -} -if(t.outerHeight()!=_7c.height){ -t._outerHeight(_7c.height); -} -}; -function _7d(e){ -$.fn.resizable.isResizing=true; -$.data(e.data.target,"resizable").options.onStartResize.call(e.data.target,e); -return false; -}; -function _7e(e){ -_76(e); -if($.data(e.data.target,"resizable").options.onResize.call(e.data.target,e)!=false){ -_7b(e); -} -return false; -}; -function _7f(e){ -$.fn.resizable.isResizing=false; -_76(e,true); -_7b(e); -$.data(e.data.target,"resizable").options.onStopResize.call(e.data.target,e); -$(document).unbind(".resizable"); -$("body").css("cursor",""); -return false; -}; -function _80(e){ -var _81=$(e.data.target).resizable("options"); -var tt=$(e.data.target); -var dir=""; -var _82=tt.offset(); -var _83=tt.outerWidth(); -var _84=tt.outerHeight(); -var _85=_81.edge; -if(e.pageY>_82.top&&e.pageY<_82.top+_85){ -dir+="n"; -}else{ -if(e.pageY<_82.top+_84&&e.pageY>_82.top+_84-_85){ -dir+="s"; -} -} -if(e.pageX>_82.left&&e.pageX<_82.left+_85){ -dir+="w"; -}else{ -if(e.pageX<_82.left+_83&&e.pageX>_82.left+_83-_85){ -dir+="e"; -} -} -var _86=_81.handles.split(","); -_86=$.map(_86,function(h){ -return $.trim(h).toLowerCase(); -}); -if($.inArray("all",_86)>=0||$.inArray(dir,_86)>=0){ -return dir; -} -for(var i=0;i=0){ -return _86[_87]; -} -} -return ""; -}; -$.fn.resizable=function(_88,_89){ -if(typeof _88=="string"){ -return $.fn.resizable.methods[_88](this,_89); -} -return this.each(function(){ -var _8a=null; -var _8b=$.data(this,"resizable"); -if(_8b){ -$(this).unbind(".resizable"); -_8a=$.extend(_8b.options,_88||{}); -}else{ -_8a=$.extend({},$.fn.resizable.defaults,$.fn.resizable.parseOptions(this),_88||{}); -$.data(this,"resizable",{options:_8a}); -} -if(_8a.disabled==true){ -return; -} -$(this).bind("mousemove.resizable",{target:this},function(e){ -if($.fn.resizable.isResizing){ -return; -} -var dir=_80(e); -$(e.data.target).css("cursor",dir?dir+"-resize":""); -}).bind("mouseleave.resizable",{target:this},function(e){ -$(e.data.target).css("cursor",""); -}).bind("mousedown.resizable",{target:this},function(e){ -var dir=_80(e); -if(dir==""){ -return; -} -function _8c(css){ -var val=parseInt($(e.data.target).css(css)); -if(isNaN(val)){ -return 0; -}else{ -return val; -} -}; -var _8d={target:e.data.target,dir:dir,startLeft:_8c("left"),startTop:_8c("top"),left:_8c("left"),top:_8c("top"),startX:e.pageX,startY:e.pageY,startWidth:$(e.data.target).outerWidth(),startHeight:$(e.data.target).outerHeight(),width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),deltaWidth:$(e.data.target).outerWidth()-$(e.data.target).width(),deltaHeight:$(e.data.target).outerHeight()-$(e.data.target).height()}; -$(document).bind("mousedown.resizable",_8d,_7d); -$(document).bind("mousemove.resizable",_8d,_7e); -$(document).bind("mouseup.resizable",_8d,_7f); -$("body").css("cursor",dir+"-resize"); -}); -}); -}; -$.fn.resizable.methods={options:function(jq){ -return $.data(jq[0],"resizable").options; -},enable:function(jq){ -return jq.each(function(){ -$(this).resizable({disabled:false}); -}); -},disable:function(jq){ -return jq.each(function(){ -$(this).resizable({disabled:true}); -}); -}}; -$.fn.resizable.parseOptions=function(_8e){ -var t=$(_8e); -return $.extend({},$.parser.parseOptions(_8e,["handles",{minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number",edge:"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.resizable.defaults={disabled:false,handles:"n, e, s, w, ne, se, sw, nw, all",minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000,edge:5,onStartResize:function(e){ -},onResize:function(e){ -},onStopResize:function(e){ -}}; -$.fn.resizable.isResizing=false; -})(jQuery); -(function($){ -function _8f(_90,_91){ -var _92=$.data(_90,"linkbutton").options; -if(_91){ -$.extend(_92,_91); -} -if(_92.width||_92.height||_92.fit){ -var btn=$(_90); -var _93=btn.parent(); -var _94=btn.is(":visible"); -if(!_94){ -var _95=$("
                                                                                                                                                ").insertBefore(_90); -var _96={position:btn.css("position"),display:btn.css("display"),left:btn.css("left")}; -btn.appendTo("body"); -btn.css({position:"absolute",display:"inline-block",left:-20000}); -} -btn._size(_92,_93); -var _97=btn.find(".l-btn-left"); -_97.css("margin-top",0); -_97.css("margin-top",parseInt((btn.height()-_97.height())/2)+"px"); -if(!_94){ -btn.insertAfter(_95); -btn.css(_96); -_95.remove(); -} -} -}; -function _98(_99){ -var _9a=$.data(_99,"linkbutton").options; -var t=$(_99).empty(); -t.addClass("l-btn").removeClass("l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline"); -t.removeClass("l-btn-small l-btn-medium l-btn-large").addClass("l-btn-"+_9a.size); -if(_9a.plain){ -t.addClass("l-btn-plain"); -} -if(_9a.outline){ -t.addClass("l-btn-outline"); -} -if(_9a.selected){ -t.addClass(_9a.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); -} -t.attr("group",_9a.group||""); -t.attr("id",_9a.id||""); -var _9b=$("").appendTo(t); -if(_9a.text){ -$("").html(_9a.text).appendTo(_9b); -}else{ -$(" ").appendTo(_9b); -} -if(_9a.iconCls){ -$(" ").addClass(_9a.iconCls).appendTo(_9b); -_9b.addClass("l-btn-icon-"+_9a.iconAlign); -} -t.unbind(".linkbutton").bind("focus.linkbutton",function(){ -if(!_9a.disabled){ -$(this).addClass("l-btn-focus"); -} -}).bind("blur.linkbutton",function(){ -$(this).removeClass("l-btn-focus"); -}).bind("click.linkbutton",function(){ -if(!_9a.disabled){ -if(_9a.toggle){ -if(_9a.selected){ -$(this).linkbutton("unselect"); -}else{ -$(this).linkbutton("select"); -} -} -_9a.onClick.call(this); -} -}); -_9c(_99,_9a.selected); -_9d(_99,_9a.disabled); -}; -function _9c(_9e,_9f){ -var _a0=$.data(_9e,"linkbutton").options; -if(_9f){ -if(_a0.group){ -$("a.l-btn[group=\""+_a0.group+"\"]").each(function(){ -var o=$(this).linkbutton("options"); -if(o.toggle){ -$(this).removeClass("l-btn-selected l-btn-plain-selected"); -o.selected=false; -} -}); -} -$(_9e).addClass(_a0.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); -_a0.selected=true; -}else{ -if(!_a0.group){ -$(_9e).removeClass("l-btn-selected l-btn-plain-selected"); -_a0.selected=false; -} -} -}; -function _9d(_a1,_a2){ -var _a3=$.data(_a1,"linkbutton"); -var _a4=_a3.options; -$(_a1).removeClass("l-btn-disabled l-btn-plain-disabled"); -if(_a2){ -_a4.disabled=true; -var _a5=$(_a1).attr("href"); -if(_a5){ -_a3.href=_a5; -$(_a1).attr("href","javascript:;"); -} -if(_a1.onclick){ -_a3.onclick=_a1.onclick; -_a1.onclick=null; -} -_a4.plain?$(_a1).addClass("l-btn-disabled l-btn-plain-disabled"):$(_a1).addClass("l-btn-disabled"); -}else{ -_a4.disabled=false; -if(_a3.href){ -$(_a1).attr("href",_a3.href); -} -if(_a3.onclick){ -_a1.onclick=_a3.onclick; -} -} -}; -$.fn.linkbutton=function(_a6,_a7){ -if(typeof _a6=="string"){ -return $.fn.linkbutton.methods[_a6](this,_a7); -} -_a6=_a6||{}; -return this.each(function(){ -var _a8=$.data(this,"linkbutton"); -if(_a8){ -$.extend(_a8.options,_a6); -}else{ -$.data(this,"linkbutton",{options:$.extend({},$.fn.linkbutton.defaults,$.fn.linkbutton.parseOptions(this),_a6)}); -$(this)._propAttr("disabled",false); -$(this).bind("_resize",function(e,_a9){ -if($(this).hasClass("easyui-fluid")||_a9){ -_8f(this); -} -return false; -}); -} -_98(this); -_8f(this); -}); -}; -$.fn.linkbutton.methods={options:function(jq){ -return $.data(jq[0],"linkbutton").options; -},resize:function(jq,_aa){ -return jq.each(function(){ -_8f(this,_aa); -}); -},enable:function(jq){ -return jq.each(function(){ -_9d(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_9d(this,true); -}); -},select:function(jq){ -return jq.each(function(){ -_9c(this,true); -}); -},unselect:function(jq){ -return jq.each(function(){ -_9c(this,false); -}); -}}; -$.fn.linkbutton.parseOptions=function(_ab){ -var t=$(_ab); -return $.extend({},$.parser.parseOptions(_ab,["id","iconCls","iconAlign","group","size","text",{plain:"boolean",toggle:"boolean",selected:"boolean",outline:"boolean"}]),{disabled:(t.attr("disabled")?true:undefined),text:($.trim(t.html())||undefined),iconCls:(t.attr("icon")||t.attr("iconCls"))}); -}; -$.fn.linkbutton.defaults={id:null,disabled:false,toggle:false,selected:false,outline:false,group:null,plain:false,text:"",iconCls:null,iconAlign:"left",size:"small",onClick:function(){ -}}; -})(jQuery); -(function($){ -function _ac(_ad){ -var _ae=$.data(_ad,"pagination"); -var _af=_ae.options; -var bb=_ae.bb={}; -var _b0=$(_ad).addClass("pagination").html("
                                                                                                                                                "); -var tr=_b0.find("tr"); -var aa=$.extend([],_af.layout); -if(!_af.showPageList){ -_b1(aa,"list"); -} -if(!_af.showPageInfo){ -_b1(aa,"info"); -} -if(!_af.showRefresh){ -_b1(aa,"refresh"); -} -if(aa[0]=="sep"){ -aa.shift(); -} -if(aa[aa.length-1]=="sep"){ -aa.pop(); -} -for(var _b2=0;_b2"); -ps.bind("change",function(){ -_af.pageSize=parseInt($(this).val()); -_af.onChangePageSize.call(_ad,_af.pageSize); -_b9(_ad,_af.pageNumber); -}); -for(var i=0;i<_af.pageList.length;i++){ -$("").text(_af.pageList[i]).appendTo(ps); -} -$("").append(ps).appendTo(tr); -}else{ -if(_b3=="sep"){ -$("
                                                                                                                                                ").appendTo(tr); -}else{ -if(_b3=="first"){ -bb.first=_b4("first"); -}else{ -if(_b3=="prev"){ -bb.prev=_b4("prev"); -}else{ -if(_b3=="next"){ -bb.next=_b4("next"); -}else{ -if(_b3=="last"){ -bb.last=_b4("last"); -}else{ -if(_b3=="manual"){ -$("").html(_af.beforePageText).appendTo(tr).wrap(""); -bb.num=$("").appendTo(tr).wrap(""); -bb.num.unbind(".pagination").bind("keydown.pagination",function(e){ -if(e.keyCode==13){ -var _b5=parseInt($(this).val())||1; -_b9(_ad,_b5); -return false; -} -}); -bb.after=$("").appendTo(tr).wrap(""); -}else{ -if(_b3=="refresh"){ -bb.refresh=_b4("refresh"); -}else{ -if(_b3=="links"){ -$("").appendTo(tr); -}else{ -if(_b3=="info"){ -if(_b2==aa.length-1){ -$("
                                                                                                                                                ").appendTo(_b0); -}else{ -$("
                                                                                                                                                ").appendTo(tr); -} -} -} -} -} -} -} -} -} -} -} -} -if(_af.buttons){ -$("
                                                                                                                                                ").appendTo(tr); -if($.isArray(_af.buttons)){ -for(var i=0;i<_af.buttons.length;i++){ -var btn=_af.buttons[i]; -if(btn=="-"){ -$("
                                                                                                                                                ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var a=$("").appendTo(td); -a[0].onclick=eval(btn.handler||function(){ -}); -a.linkbutton($.extend({},btn,{plain:true})); -} -} -}else{ -var td=$("").appendTo(tr); -$(_af.buttons).appendTo(td).show(); -} -} -$("
                                                                                                                                                ").appendTo(_b0); -function _b4(_b6){ -var btn=_af.nav[_b6]; -var a=$("").appendTo(tr); -a.wrap(""); -a.linkbutton({iconCls:btn.iconCls,plain:true}).unbind(".pagination").bind("click.pagination",function(){ -btn.handler.call(_ad); -}); -return a; -}; -function _b1(aa,_b7){ -var _b8=$.inArray(_b7,aa); -if(_b8>=0){ -aa.splice(_b8,1); -} -return aa; -}; -}; -function _b9(_ba,_bb){ -var _bc=$.data(_ba,"pagination").options; -_bd(_ba,{pageNumber:_bb}); -_bc.onSelectPage.call(_ba,_bc.pageNumber,_bc.pageSize); -}; -function _bd(_be,_bf){ -var _c0=$.data(_be,"pagination"); -var _c1=_c0.options; -var bb=_c0.bb; -$.extend(_c1,_bf||{}); -var ps=$(_be).find("select.pagination-page-list"); -if(ps.length){ -ps.val(_c1.pageSize+""); -_c1.pageSize=parseInt(ps.val()); -} -var _c2=Math.ceil(_c1.total/_c1.pageSize)||1; -if(_c1.pageNumber<1){ -_c1.pageNumber=1; -} -if(_c1.pageNumber>_c2){ -_c1.pageNumber=_c2; -} -if(_c1.total==0){ -_c1.pageNumber=0; -_c2=0; -} -if(bb.num){ -bb.num.val(_c1.pageNumber); -} -if(bb.after){ -bb.after.html(_c1.afterPageText.replace(/{pages}/,_c2)); -} -var td=$(_be).find("td.pagination-links"); -if(td.length){ -td.empty(); -var _c3=_c1.pageNumber-Math.floor(_c1.links/2); -if(_c3<1){ -_c3=1; -} -var _c4=_c3+_c1.links-1; -if(_c4>_c2){ -_c4=_c2; -} -_c3=_c4-_c1.links+1; -if(_c3<1){ -_c3=1; -} -for(var i=_c3;i<=_c4;i++){ -var a=$("").appendTo(td); -a.linkbutton({plain:true,text:i}); -if(i==_c1.pageNumber){ -a.linkbutton("select"); -}else{ -a.unbind(".pagination").bind("click.pagination",{pageNumber:i},function(e){ -_b9(_be,e.data.pageNumber); -}); -} -} -} -var _c5=_c1.displayMsg; -_c5=_c5.replace(/{from}/,_c1.total==0?0:_c1.pageSize*(_c1.pageNumber-1)+1); -_c5=_c5.replace(/{to}/,Math.min(_c1.pageSize*(_c1.pageNumber),_c1.total)); -_c5=_c5.replace(/{total}/,_c1.total); -$(_be).find("div.pagination-info").html(_c5); -if(bb.first){ -bb.first.linkbutton({disabled:((!_c1.total)||_c1.pageNumber==1)}); -} -if(bb.prev){ -bb.prev.linkbutton({disabled:((!_c1.total)||_c1.pageNumber==1)}); -} -if(bb.next){ -bb.next.linkbutton({disabled:(_c1.pageNumber==_c2)}); -} -if(bb.last){ -bb.last.linkbutton({disabled:(_c1.pageNumber==_c2)}); -} -_c6(_be,_c1.loading); -}; -function _c6(_c7,_c8){ -var _c9=$.data(_c7,"pagination"); -var _ca=_c9.options; -_ca.loading=_c8; -if(_ca.showRefresh&&_c9.bb.refresh){ -_c9.bb.refresh.linkbutton({iconCls:(_ca.loading?"pagination-loading":"pagination-load")}); -} -}; -$.fn.pagination=function(_cb,_cc){ -if(typeof _cb=="string"){ -return $.fn.pagination.methods[_cb](this,_cc); -} -_cb=_cb||{}; -return this.each(function(){ -var _cd; -var _ce=$.data(this,"pagination"); -if(_ce){ -_cd=$.extend(_ce.options,_cb); -}else{ -_cd=$.extend({},$.fn.pagination.defaults,$.fn.pagination.parseOptions(this),_cb); -$.data(this,"pagination",{options:_cd}); -} -_ac(this); -_bd(this); -}); -}; -$.fn.pagination.methods={options:function(jq){ -return $.data(jq[0],"pagination").options; -},loading:function(jq){ -return jq.each(function(){ -_c6(this,true); -}); -},loaded:function(jq){ -return jq.each(function(){ -_c6(this,false); -}); -},refresh:function(jq,_cf){ -return jq.each(function(){ -_bd(this,_cf); -}); -},select:function(jq,_d0){ -return jq.each(function(){ -_b9(this,_d0); -}); -}}; -$.fn.pagination.parseOptions=function(_d1){ -var t=$(_d1); -return $.extend({},$.parser.parseOptions(_d1,[{total:"number",pageSize:"number",pageNumber:"number",links:"number"},{loading:"boolean",showPageList:"boolean",showPageInfo:"boolean",showRefresh:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined)}); -}; -$.fn.pagination.defaults={total:1,pageSize:10,pageNumber:1,pageList:[10,20,30,50],loading:false,buttons:null,showPageList:true,showPageInfo:true,showRefresh:true,links:10,layout:["list","sep","first","prev","sep","manual","sep","next","last","sep","refresh","info"],onSelectPage:function(_d2,_d3){ -},onBeforeRefresh:function(_d4,_d5){ -},onRefresh:function(_d6,_d7){ -},onChangePageSize:function(_d8){ -},beforePageText:"Page",afterPageText:"of {pages}",displayMsg:"Displaying {from} to {to} of {total} items",nav:{first:{iconCls:"pagination-first",handler:function(){ -var _d9=$(this).pagination("options"); -if(_d9.pageNumber>1){ -$(this).pagination("select",1); -} -}},prev:{iconCls:"pagination-prev",handler:function(){ -var _da=$(this).pagination("options"); -if(_da.pageNumber>1){ -$(this).pagination("select",_da.pageNumber-1); -} -}},next:{iconCls:"pagination-next",handler:function(){ -var _db=$(this).pagination("options"); -var _dc=Math.ceil(_db.total/_db.pageSize); -if(_db.pageNumber<_dc){ -$(this).pagination("select",_db.pageNumber+1); -} -}},last:{iconCls:"pagination-last",handler:function(){ -var _dd=$(this).pagination("options"); -var _de=Math.ceil(_dd.total/_dd.pageSize); -if(_dd.pageNumber<_de){ -$(this).pagination("select",_de); -} -}},refresh:{iconCls:"pagination-refresh",handler:function(){ -var _df=$(this).pagination("options"); -if(_df.onBeforeRefresh.call(this,_df.pageNumber,_df.pageSize)!=false){ -$(this).pagination("select",_df.pageNumber); -_df.onRefresh.call(this,_df.pageNumber,_df.pageSize); -} -}}}}; -})(jQuery); -(function($){ -function _e0(_e1){ -var _e2=$(_e1); -_e2.addClass("tree"); -return _e2; -}; -function _e3(_e4){ -var _e5=$.data(_e4,"tree").options; -$(_e4).unbind().bind("mouseover",function(e){ -var tt=$(e.target); -var _e6=tt.closest("div.tree-node"); -if(!_e6.length){ -return; -} -_e6.addClass("tree-node-hover"); -if(tt.hasClass("tree-hit")){ -if(tt.hasClass("tree-expanded")){ -tt.addClass("tree-expanded-hover"); -}else{ -tt.addClass("tree-collapsed-hover"); -} -} -e.stopPropagation(); -}).bind("mouseout",function(e){ -var tt=$(e.target); -var _e7=tt.closest("div.tree-node"); -if(!_e7.length){ -return; -} -_e7.removeClass("tree-node-hover"); -if(tt.hasClass("tree-hit")){ -if(tt.hasClass("tree-expanded")){ -tt.removeClass("tree-expanded-hover"); -}else{ -tt.removeClass("tree-collapsed-hover"); -} -} -e.stopPropagation(); -}).bind("click",function(e){ -var tt=$(e.target); -var _e8=tt.closest("div.tree-node"); -if(!_e8.length){ -return; -} -if(tt.hasClass("tree-hit")){ -_146(_e4,_e8[0]); -return false; -}else{ -if(tt.hasClass("tree-checkbox")){ -_10d(_e4,_e8[0]); -return false; -}else{ -_189(_e4,_e8[0]); -_e5.onClick.call(_e4,_eb(_e4,_e8[0])); -} -} -e.stopPropagation(); -}).bind("dblclick",function(e){ -var _e9=$(e.target).closest("div.tree-node"); -if(!_e9.length){ -return; -} -_189(_e4,_e9[0]); -_e5.onDblClick.call(_e4,_eb(_e4,_e9[0])); -e.stopPropagation(); -}).bind("contextmenu",function(e){ -var _ea=$(e.target).closest("div.tree-node"); -if(!_ea.length){ -return; -} -_e5.onContextMenu.call(_e4,e,_eb(_e4,_ea[0])); -e.stopPropagation(); -}); -}; -function _ec(_ed){ -var _ee=$.data(_ed,"tree").options; -_ee.dnd=false; -var _ef=$(_ed).find("div.tree-node"); -_ef.draggable("disable"); -_ef.css("cursor","pointer"); -}; -function _f0(_f1){ -var _f2=$.data(_f1,"tree"); -var _f3=_f2.options; -var _f4=_f2.tree; -_f2.disabledNodes=[]; -_f3.dnd=true; -_f4.find("div.tree-node").draggable({disabled:false,revert:true,cursor:"pointer",proxy:function(_f5){ -var p=$("
                                                                                                                                                ").appendTo("body"); -p.html(" "+$(_f5).find(".tree-title").html()); -p.hide(); -return p; -},deltaX:15,deltaY:15,onBeforeDrag:function(e){ -if(_f3.onBeforeDrag.call(_f1,_eb(_f1,this))==false){ -return false; -} -if($(e.target).hasClass("tree-hit")||$(e.target).hasClass("tree-checkbox")){ -return false; -} -if(e.which!=1){ -return false; -} -var _f6=$(this).find("span.tree-indent"); -if(_f6.length){ -e.data.offsetWidth-=_f6.length*_f6.width(); -} -},onStartDrag:function(e){ -$(this).next("ul").find("div.tree-node").each(function(){ -$(this).droppable("disable"); -_f2.disabledNodes.push(this); -}); -$(this).draggable("proxy").css({left:-10000,top:-10000}); -_f3.onStartDrag.call(_f1,_eb(_f1,this)); -var _f7=_eb(_f1,this); -if(_f7.id==undefined){ -_f7.id="easyui_tree_node_id_temp"; -_12d(_f1,_f7); -} -_f2.draggingNodeId=_f7.id; -},onDrag:function(e){ -var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY; -var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); -if(d>3){ -$(this).draggable("proxy").show(); -} -this.pageY=e.pageY; -},onStopDrag:function(){ -for(var i=0;i<_f2.disabledNodes.length;i++){ -$(_f2.disabledNodes[i]).droppable("enable"); -} -_f2.disabledNodes=[]; -var _f8=_183(_f1,_f2.draggingNodeId); -if(_f8&&_f8.id=="easyui_tree_node_id_temp"){ -_f8.id=""; -_12d(_f1,_f8); -} -_f3.onStopDrag.call(_f1,_f8); -}}).droppable({accept:"div.tree-node",onDragEnter:function(e,_f9){ -if(_f3.onDragEnter.call(_f1,this,_fa(_f9))==false){ -_fb(_f9,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -$(this).droppable("disable"); -_f2.disabledNodes.push(this); -} -},onDragOver:function(e,_fc){ -if($(this).droppable("options").disabled){ -return; -} -var _fd=_fc.pageY; -var top=$(this).offset().top; -var _fe=top+$(this).outerHeight(); -_fb(_fc,true); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -if(_fd>top+(_fe-top)/2){ -if(_fe-_fd<5){ -$(this).addClass("tree-node-bottom"); -}else{ -$(this).addClass("tree-node-append"); -} -}else{ -if(_fd-top<5){ -$(this).addClass("tree-node-top"); -}else{ -$(this).addClass("tree-node-append"); -} -} -if(_f3.onDragOver.call(_f1,this,_fa(_fc))==false){ -_fb(_fc,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -$(this).droppable("disable"); -_f2.disabledNodes.push(this); -} -},onDragLeave:function(e,_ff){ -_fb(_ff,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -_f3.onDragLeave.call(_f1,this,_fa(_ff)); -},onDrop:function(e,_100){ -var dest=this; -var _101,_102; -if($(this).hasClass("tree-node-append")){ -_101=_103; -_102="append"; -}else{ -_101=_104; -_102=$(this).hasClass("tree-node-top")?"top":"bottom"; -} -if(_f3.onBeforeDrop.call(_f1,dest,_fa(_100),_102)==false){ -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -return; -} -_101(_100,dest,_102); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -}}); -function _fa(_105,pop){ -return $(_105).closest("ul.tree").tree(pop?"pop":"getData",_105); -}; -function _fb(_106,_107){ -var icon=$(_106).draggable("proxy").find("span.tree-dnd-icon"); -icon.removeClass("tree-dnd-yes tree-dnd-no").addClass(_107?"tree-dnd-yes":"tree-dnd-no"); -}; -function _103(_108,dest){ -if(_eb(_f1,dest).state=="closed"){ -_13e(_f1,dest,function(){ -_109(); -}); -}else{ -_109(); -} -function _109(){ -var node=_fa(_108,true); -$(_f1).tree("append",{parent:dest,data:[node]}); -_f3.onDrop.call(_f1,dest,node,"append"); -}; -}; -function _104(_10a,dest,_10b){ -var _10c={}; -if(_10b=="top"){ -_10c.before=dest; -}else{ -_10c.after=dest; -} -var node=_fa(_10a,true); -_10c.data=node; -$(_f1).tree("insert",_10c); -_f3.onDrop.call(_f1,dest,node,_10b); -}; -}; -function _10d(_10e,_10f,_110,_111){ -var _112=$.data(_10e,"tree"); -var opts=_112.options; -if(!opts.checkbox){ -return; -} -var _113=_eb(_10e,_10f); -if(!_113.checkState){ -return; -} -var ck=$(_10f).find(".tree-checkbox"); -if(_110==undefined){ -if(ck.hasClass("tree-checkbox1")){ -_110=false; -}else{ -if(ck.hasClass("tree-checkbox0")){ -_110=true; -}else{ -if(_113._checked==undefined){ -_113._checked=$(_10f).find(".tree-checkbox").hasClass("tree-checkbox1"); -} -_110=!_113._checked; -} -} -} -_113._checked=_110; -if(_110){ -if(ck.hasClass("tree-checkbox1")){ -return; -} -}else{ -if(ck.hasClass("tree-checkbox0")){ -return; -} -} -if(!_111){ -if(opts.onBeforeCheck.call(_10e,_113,_110)==false){ -return; -} -} -if(opts.cascadeCheck){ -_114(_10e,_113,_110); -_115(_10e,_113); -}else{ -_116(_10e,_113,_110?"1":"0"); -} -if(!_111){ -opts.onCheck.call(_10e,_113,_110); -} -}; -function _114(_117,_118,_119){ -var opts=$.data(_117,"tree").options; -var flag=_119?1:0; -_116(_117,_118,flag); -if(opts.deepCheck){ -$.easyui.forEach(_118.children||[],true,function(n){ -_116(_117,n,flag); -}); -}else{ -var _11a=[]; -if(_118.children&&_118.children.length){ -_11a.push(_118); -} -$.easyui.forEach(_118.children||[],true,function(n){ -if(!n.hidden){ -_116(_117,n,flag); -if(n.children&&n.children.length){ -_11a.push(n); -} -} -}); -for(var i=_11a.length-1;i>=0;i--){ -var node=_11a[i]; -_116(_117,node,_11b(node)); -} -} -}; -function _116(_11c,_11d,flag){ -var opts=$.data(_11c,"tree").options; -if(!_11d.checkState||flag==undefined){ -return; -} -if(_11d.hidden&&!opts.deepCheck){ -return; -} -var ck=$("#"+_11d.domId).find(".tree-checkbox"); -_11d.checkState=["unchecked","checked","indeterminate"][flag]; -_11d.checked=(_11d.checkState=="checked"); -ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); -ck.addClass("tree-checkbox"+flag); -}; -function _115(_11e,_11f){ -var pd=_120(_11e,$("#"+_11f.domId)[0]); -if(pd){ -_116(_11e,pd,_11b(pd)); -_115(_11e,pd); -} -}; -function _11b(row){ -var c0=0; -var c1=0; -var len=0; -$.easyui.forEach(row.children||[],false,function(r){ -if(r.checkState){ -len++; -if(r.checkState=="checked"){ -c1++; -}else{ -if(r.checkState=="unchecked"){ -c0++; -} -} -} -}); -if(len==0){ -return undefined; -} -var flag=0; -if(c0==len){ -flag=0; -}else{ -if(c1==len){ -flag=1; -}else{ -flag=2; -} -} -return flag; -}; -function _121(_122,_123){ -var opts=$.data(_122,"tree").options; -if(!opts.checkbox){ -return; -} -var node=$(_123); -var ck=node.find(".tree-checkbox"); -var _124=_eb(_122,_123); -if(opts.view.hasCheckbox(_122,_124)){ -if(!ck.length){ -_124.checkState=_124.checkState||"unchecked"; -$("").insertBefore(node.find(".tree-title")); -} -if(_124.checkState=="checked"){ -_10d(_122,_123,true,true); -}else{ -if(_124.checkState=="unchecked"){ -_10d(_122,_123,false,true); -}else{ -var flag=_11b(_124); -if(flag===0){ -_10d(_122,_123,false,true); -}else{ -if(flag===1){ -_10d(_122,_123,true,true); -} -} -} -} -}else{ -ck.remove(); -_124.checkState=undefined; -_124.checked=undefined; -_115(_122,_124); -} -}; -function _125(_126,ul,data,_127,_128){ -var _129=$.data(_126,"tree"); -var opts=_129.options; -var _12a=$(ul).prevAll("div.tree-node:first"); -data=opts.loadFilter.call(_126,data,_12a[0]); -var _12b=_12c(_126,"domId",_12a.attr("id")); -if(!_127){ -_12b?_12b.children=data:_129.data=data; -$(ul).empty(); -}else{ -if(_12b){ -_12b.children?_12b.children=_12b.children.concat(data):_12b.children=data; -}else{ -_129.data=_129.data.concat(data); -} -} -opts.view.render.call(opts.view,_126,ul,data); -if(opts.dnd){ -_f0(_126); -} -if(_12b){ -_12d(_126,_12b); -} -for(var i=0;i<_129.tmpIds.length;i++){ -_10d(_126,$("#"+_129.tmpIds[i])[0],true,true); -} -_129.tmpIds=[]; -setTimeout(function(){ -_12e(_126,_126); -},0); -if(!_128){ -opts.onLoadSuccess.call(_126,_12b,data); -} -}; -function _12e(_12f,ul,_130){ -var opts=$.data(_12f,"tree").options; -if(opts.lines){ -$(_12f).addClass("tree-lines"); -}else{ -$(_12f).removeClass("tree-lines"); -return; -} -if(!_130){ -_130=true; -$(_12f).find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); -$(_12f).find("div.tree-node").removeClass("tree-node-last tree-root-first tree-root-one"); -var _131=$(_12f).tree("getRoots"); -if(_131.length>1){ -$(_131[0].target).addClass("tree-root-first"); -}else{ -if(_131.length==1){ -$(_131[0].target).addClass("tree-root-one"); -} -} -} -$(ul).children("li").each(function(){ -var node=$(this).children("div.tree-node"); -var ul=node.next("ul"); -if(ul.length){ -if($(this).next().length){ -_132(node); -} -_12e(_12f,ul,_130); -}else{ -_133(node); -} -}); -var _134=$(ul).children("li:last").children("div.tree-node").addClass("tree-node-last"); -_134.children("span.tree-join").removeClass("tree-join").addClass("tree-joinbottom"); -function _133(node,_135){ -var icon=node.find("span.tree-icon"); -icon.prev("span.tree-indent").addClass("tree-join"); -}; -function _132(node){ -var _136=node.find("span.tree-indent, span.tree-hit").length; -node.next().find("div.tree-node").each(function(){ -$(this).children("span:eq("+(_136-1)+")").addClass("tree-line"); -}); -}; -}; -function _137(_138,ul,_139,_13a){ -var opts=$.data(_138,"tree").options; -_139=$.extend({},opts.queryParams,_139||{}); -var _13b=null; -if(_138!=ul){ -var node=$(ul).prev(); -_13b=_eb(_138,node[0]); -} -if(opts.onBeforeLoad.call(_138,_13b,_139)==false){ -return; -} -var _13c=$(ul).prev().children("span.tree-folder"); -_13c.addClass("tree-loading"); -var _13d=opts.loader.call(_138,_139,function(data){ -_13c.removeClass("tree-loading"); -_125(_138,ul,data); -if(_13a){ -_13a(); -} -},function(){ -_13c.removeClass("tree-loading"); -opts.onLoadError.apply(_138,arguments); -if(_13a){ -_13a(); -} -}); -if(_13d==false){ -_13c.removeClass("tree-loading"); -} -}; -function _13e(_13f,_140,_141){ -var opts=$.data(_13f,"tree").options; -var hit=$(_140).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -return; -} -var node=_eb(_13f,_140); -if(opts.onBeforeExpand.call(_13f,node)==false){ -return; -} -hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); -hit.next().addClass("tree-folder-open"); -var ul=$(_140).next(); -if(ul.length){ -if(opts.animate){ -ul.slideDown("normal",function(){ -node.state="open"; -opts.onExpand.call(_13f,node); -if(_141){ -_141(); -} -}); -}else{ -ul.css("display","block"); -node.state="open"; -opts.onExpand.call(_13f,node); -if(_141){ -_141(); -} -} -}else{ -var _142=$("
                                                                                                                                                  ").insertAfter(_140); -_137(_13f,_142[0],{id:node.id},function(){ -if(_142.is(":empty")){ -_142.remove(); -} -if(opts.animate){ -_142.slideDown("normal",function(){ -node.state="open"; -opts.onExpand.call(_13f,node); -if(_141){ -_141(); -} -}); -}else{ -_142.css("display","block"); -node.state="open"; -opts.onExpand.call(_13f,node); -if(_141){ -_141(); -} -} -}); -} -}; -function _143(_144,_145){ -var opts=$.data(_144,"tree").options; -var hit=$(_145).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-collapsed")){ -return; -} -var node=_eb(_144,_145); -if(opts.onBeforeCollapse.call(_144,node)==false){ -return; -} -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -hit.next().removeClass("tree-folder-open"); -var ul=$(_145).next(); -if(opts.animate){ -ul.slideUp("normal",function(){ -node.state="closed"; -opts.onCollapse.call(_144,node); -}); -}else{ -ul.css("display","none"); -node.state="closed"; -opts.onCollapse.call(_144,node); -} -}; -function _146(_147,_148){ -var hit=$(_148).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -_143(_147,_148); -}else{ -_13e(_147,_148); -} -}; -function _149(_14a,_14b){ -var _14c=_14d(_14a,_14b); -if(_14b){ -_14c.unshift(_eb(_14a,_14b)); -} -for(var i=0;i<_14c.length;i++){ -_13e(_14a,_14c[i].target); -} -}; -function _14e(_14f,_150){ -var _151=[]; -var p=_120(_14f,_150); -while(p){ -_151.unshift(p); -p=_120(_14f,p.target); -} -for(var i=0;i<_151.length;i++){ -_13e(_14f,_151[i].target); -} -}; -function _152(_153,_154){ -var c=$(_153).parent(); -while(c[0].tagName!="BODY"&&c.css("overflow-y")!="auto"){ -c=c.parent(); -} -var n=$(_154); -var ntop=n.offset().top; -if(c[0].tagName!="BODY"){ -var ctop=c.offset().top; -if(ntopctop+c.outerHeight()-18){ -c.scrollTop(c.scrollTop()+ntop+n.outerHeight()-ctop-c.outerHeight()+18); -} -} -}else{ -c.scrollTop(ntop); -} -}; -function _155(_156,_157){ -var _158=_14d(_156,_157); -if(_157){ -_158.unshift(_eb(_156,_157)); -} -for(var i=0;i<_158.length;i++){ -_143(_156,_158[i].target); -} -}; -function _159(_15a,_15b){ -var node=$(_15b.parent); -var data=_15b.data; -if(!data){ -return; -} -data=$.isArray(data)?data:[data]; -if(!data.length){ -return; -} -var ul; -if(node.length==0){ -ul=$(_15a); -}else{ -if(_15c(_15a,node[0])){ -var _15d=node.find("span.tree-icon"); -_15d.removeClass("tree-file").addClass("tree-folder tree-folder-open"); -var hit=$("").insertBefore(_15d); -if(hit.prev().length){ -hit.prev().remove(); -} -} -ul=node.next(); -if(!ul.length){ -ul=$("
                                                                                                                                                    ").insertAfter(node); -} -} -_125(_15a,ul[0],data,true,true); -}; -function _15e(_15f,_160){ -var ref=_160.before||_160.after; -var _161=_120(_15f,ref); -var data=_160.data; -if(!data){ -return; -} -data=$.isArray(data)?data:[data]; -if(!data.length){ -return; -} -_159(_15f,{parent:(_161?_161.target:null),data:data}); -var _162=_161?_161.children:$(_15f).tree("getRoots"); -for(var i=0;i<_162.length;i++){ -if(_162[i].domId==$(ref).attr("id")){ -for(var j=data.length-1;j>=0;j--){ -_162.splice((_160.before?i:(i+1)),0,data[j]); -} -_162.splice(_162.length-data.length,data.length); -break; -} -} -var li=$(); -for(var i=0;i").prependTo(node); -node.next().remove(); -} -_12d(_164,_166); -} -_12e(_164,_164); -function del(_167){ -var id=$(_167).attr("id"); -var _168=_120(_164,_167); -var cc=_168?_168.children:$.data(_164,"tree").data; -for(var i=0;i").appendTo(nt); -_192.val(node.text).focus(); -_192.width(_191+20); -_192._outerHeight(opts.editorHeight); -_192.bind("click",function(e){ -return false; -}).bind("mousedown",function(e){ -e.stopPropagation(); -}).bind("mousemove",function(e){ -e.stopPropagation(); -}).bind("keydown",function(e){ -if(e.keyCode==13){ -_193(_18f,_190); -return false; -}else{ -if(e.keyCode==27){ -_197(_18f,_190); -return false; -} -} -}).bind("blur",function(e){ -e.stopPropagation(); -_193(_18f,_190); -}); -}; -function _193(_194,_195){ -var opts=$.data(_194,"tree").options; -$(_195).css("position",""); -var _196=$(_195).find("input.tree-editor"); -var val=_196.val(); -_196.remove(); -var node=_eb(_194,_195); -node.text=val; -_12d(_194,node); -opts.onAfterEdit.call(_194,node); -}; -function _197(_198,_199){ -var opts=$.data(_198,"tree").options; -$(_199).css("position",""); -$(_199).find("input.tree-editor").remove(); -var node=_eb(_198,_199); -_12d(_198,node); -opts.onCancelEdit.call(_198,node); -}; -function _19a(_19b,q){ -var _19c=$.data(_19b,"tree"); -var opts=_19c.options; -var ids={}; -$.easyui.forEach(_19c.data,true,function(node){ -if(opts.filter.call(_19b,q,node)){ -$("#"+node.domId).removeClass("tree-node-hidden"); -ids[node.domId]=1; -node.hidden=false; -}else{ -$("#"+node.domId).addClass("tree-node-hidden"); -node.hidden=true; -} -}); -for(var id in ids){ -_19d(id); -} -function _19d(_19e){ -var p=$(_19b).tree("getParent",$("#"+_19e)[0]); -while(p){ -$(p.target).removeClass("tree-node-hidden"); -p.hidden=false; -p=$(_19b).tree("getParent",p.target); -} -}; -}; -$.fn.tree=function(_19f,_1a0){ -if(typeof _19f=="string"){ -return $.fn.tree.methods[_19f](this,_1a0); -} -var _19f=_19f||{}; -return this.each(function(){ -var _1a1=$.data(this,"tree"); -var opts; -if(_1a1){ -opts=$.extend(_1a1.options,_19f); -_1a1.options=opts; -}else{ -opts=$.extend({},$.fn.tree.defaults,$.fn.tree.parseOptions(this),_19f); -$.data(this,"tree",{options:opts,tree:_e0(this),data:[],tmpIds:[]}); -var data=$.fn.tree.parseData(this); -if(data.length){ -_125(this,this,data); -} -} -_e3(this); -if(opts.data){ -_125(this,this,$.extend(true,[],opts.data)); -} -_137(this,this); -}); -}; -$.fn.tree.methods={options:function(jq){ -return $.data(jq[0],"tree").options; -},loadData:function(jq,data){ -return jq.each(function(){ -_125(this,this,data); -}); -},getNode:function(jq,_1a2){ -return _eb(jq[0],_1a2); -},getData:function(jq,_1a3){ -return _17e(jq[0],_1a3); -},reload:function(jq,_1a4){ -return jq.each(function(){ -if(_1a4){ -var node=$(_1a4); -var hit=node.children("span.tree-hit"); -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -node.next().remove(); -_13e(this,_1a4); -}else{ -$(this).empty(); -_137(this,this); -} -}); -},getRoot:function(jq,_1a5){ -return _16b(jq[0],_1a5); -},getRoots:function(jq){ -return _16f(jq[0]); -},getParent:function(jq,_1a6){ -return _120(jq[0],_1a6); -},getChildren:function(jq,_1a7){ -return _14d(jq[0],_1a7); -},getChecked:function(jq,_1a8){ -return _178(jq[0],_1a8); -},getSelected:function(jq){ -return _17c(jq[0]); -},isLeaf:function(jq,_1a9){ -return _15c(jq[0],_1a9); -},find:function(jq,id){ -return _183(jq[0],id); -},select:function(jq,_1aa){ -return jq.each(function(){ -_189(this,_1aa); -}); -},check:function(jq,_1ab){ -return jq.each(function(){ -_10d(this,_1ab,true); -}); -},uncheck:function(jq,_1ac){ -return jq.each(function(){ -_10d(this,_1ac,false); -}); -},collapse:function(jq,_1ad){ -return jq.each(function(){ -_143(this,_1ad); -}); -},expand:function(jq,_1ae){ -return jq.each(function(){ -_13e(this,_1ae); -}); -},collapseAll:function(jq,_1af){ -return jq.each(function(){ -_155(this,_1af); -}); -},expandAll:function(jq,_1b0){ -return jq.each(function(){ -_149(this,_1b0); -}); -},expandTo:function(jq,_1b1){ -return jq.each(function(){ -_14e(this,_1b1); -}); -},scrollTo:function(jq,_1b2){ -return jq.each(function(){ -_152(this,_1b2); -}); -},toggle:function(jq,_1b3){ -return jq.each(function(){ -_146(this,_1b3); -}); -},append:function(jq,_1b4){ -return jq.each(function(){ -_159(this,_1b4); -}); -},insert:function(jq,_1b5){ -return jq.each(function(){ -_15e(this,_1b5); -}); -},remove:function(jq,_1b6){ -return jq.each(function(){ -_163(this,_1b6); -}); -},pop:function(jq,_1b7){ -var node=jq.tree("getData",_1b7); -jq.tree("remove",_1b7); -return node; -},update:function(jq,_1b8){ -return jq.each(function(){ -_12d(this,$.extend({},_1b8,{checkState:_1b8.checked?"checked":(_1b8.checked===false?"unchecked":undefined)})); -}); -},enableDnd:function(jq){ -return jq.each(function(){ -_f0(this); -}); -},disableDnd:function(jq){ -return jq.each(function(){ -_ec(this); -}); -},beginEdit:function(jq,_1b9){ -return jq.each(function(){ -_18e(this,_1b9); -}); -},endEdit:function(jq,_1ba){ -return jq.each(function(){ -_193(this,_1ba); -}); -},cancelEdit:function(jq,_1bb){ -return jq.each(function(){ -_197(this,_1bb); -}); -},doFilter:function(jq,q){ -return jq.each(function(){ -_19a(this,q); -}); -}}; -$.fn.tree.parseOptions=function(_1bc){ -var t=$(_1bc); -return $.extend({},$.parser.parseOptions(_1bc,["url","method",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean",lines:"boolean",dnd:"boolean"}])); -}; -$.fn.tree.parseData=function(_1bd){ -var data=[]; -_1be(data,$(_1bd)); -return data; -function _1be(aa,tree){ -tree.children("li").each(function(){ -var node=$(this); -var item=$.extend({},$.parser.parseOptions(this,["id","iconCls","state"]),{checked:(node.attr("checked")?true:undefined)}); -item.text=node.children("span").html(); -if(!item.text){ -item.text=node.html(); -} -var _1bf=node.children("ul"); -if(_1bf.length){ -item.children=[]; -_1be(item.children,_1bf); -} -aa.push(item); -}); -}; -}; -var _1c0=1; -var _1c1={render:function(_1c2,ul,data){ -var _1c3=$.data(_1c2,"tree"); -var opts=_1c3.options; -var _1c4=$(ul).prev(".tree-node"); -var _1c5=_1c4.length?$(_1c2).tree("getNode",_1c4[0]):null; -var _1c6=_1c4.find("span.tree-indent, span.tree-hit").length; -var cc=_1c7.call(this,_1c6,data); -$(ul).append(cc.join("")); -function _1c7(_1c8,_1c9){ -var cc=[]; -for(var i=0;i<_1c9.length;i++){ -var item=_1c9[i]; -if(item.state!="open"&&item.state!="closed"){ -item.state="open"; -} -item.domId="_easyui_tree_"+_1c0++; -cc.push("
                                                                                                                                                  • "); -cc.push("
                                                                                                                                                    "); -for(var j=0;j<_1c8;j++){ -cc.push(""); -} -if(item.state=="closed"){ -cc.push(""); -cc.push(""); -}else{ -if(item.children&&item.children.length){ -cc.push(""); -cc.push(""); -}else{ -cc.push(""); -cc.push(""); -} -} -if(this.hasCheckbox(_1c2,item)){ -var flag=0; -if(_1c5&&_1c5.checkState=="checked"&&opts.cascadeCheck){ -flag=1; -item.checked=true; -}else{ -if(item.checked){ -$.easyui.addArrayItem(_1c3.tmpIds,item.domId); -} -} -item.checkState=flag?"checked":"unchecked"; -cc.push(""); -}else{ -item.checkState=undefined; -item.checked=undefined; -} -cc.push(""+opts.formatter.call(_1c2,item)+""); -cc.push("
                                                                                                                                                    "); -if(item.children&&item.children.length){ -var tmp=_1c7.call(this,_1c8+1,item.children); -cc.push("
                                                                                                                                                      "); -cc=cc.concat(tmp); -cc.push("
                                                                                                                                                    "); -} -cc.push("
                                                                                                                                                  • "); -} -return cc; -}; -},hasCheckbox:function(_1ca,item){ -var _1cb=$.data(_1ca,"tree"); -var opts=_1cb.options; -if(opts.checkbox){ -if($.isFunction(opts.checkbox)){ -if(opts.checkbox.call(_1ca,item)){ -return true; -}else{ -return false; -} -}else{ -if(opts.onlyLeafCheck){ -if(item.state=="open"&&!(item.children&&item.children.length)){ -return true; -} -}else{ -return true; -} -} -} -return false; -}}; -$.fn.tree.defaults={url:null,method:"post",animate:false,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,dnd:false,editorHeight:26,data:null,queryParams:{},formatter:function(node){ -return node.text; -},filter:function(q,node){ -var qq=[]; -$.map($.isArray(q)?q:[q],function(q){ -q=$.trim(q); -if(q){ -qq.push(q); -} -}); -for(var i=0;i=0){ -return true; -} -} -return !qq.length; -},loader:function(_1cd,_1ce,_1cf){ -var opts=$(this).tree("options"); -if(!opts.url){ -return false; -} -$.ajax({type:opts.method,url:opts.url,data:_1cd,dataType:"json",success:function(data){ -_1ce(data); -},error:function(){ -_1cf.apply(this,arguments); -}}); -},loadFilter:function(data,_1d0){ -return data; -},view:_1c1,onBeforeLoad:function(node,_1d1){ -},onLoadSuccess:function(node,data){ -},onLoadError:function(){ -},onClick:function(node){ -},onDblClick:function(node){ -},onBeforeExpand:function(node){ -},onExpand:function(node){ -},onBeforeCollapse:function(node){ -},onCollapse:function(node){ -},onBeforeCheck:function(node,_1d2){ -},onCheck:function(node,_1d3){ -},onBeforeSelect:function(node){ -},onSelect:function(node){ -},onContextMenu:function(e,node){ -},onBeforeDrag:function(node){ -},onStartDrag:function(node){ -},onStopDrag:function(node){ -},onDragEnter:function(_1d4,_1d5){ -},onDragOver:function(_1d6,_1d7){ -},onDragLeave:function(_1d8,_1d9){ -},onBeforeDrop:function(_1da,_1db,_1dc){ -},onDrop:function(_1dd,_1de,_1df){ -},onBeforeEdit:function(node){ -},onAfterEdit:function(node){ -},onCancelEdit:function(node){ -}}; -})(jQuery); -(function($){ -function init(_1e0){ -$(_1e0).addClass("progressbar"); -$(_1e0).html("
                                                                                                                                                    "); -$(_1e0).bind("_resize",function(e,_1e1){ -if($(this).hasClass("easyui-fluid")||_1e1){ -_1e2(_1e0); -} -return false; -}); -return $(_1e0); -}; -function _1e2(_1e3,_1e4){ -var opts=$.data(_1e3,"progressbar").options; -var bar=$.data(_1e3,"progressbar").bar; -if(_1e4){ -opts.width=_1e4; -} -bar._size(opts); -bar.find("div.progressbar-text").css("width",bar.width()); -bar.find("div.progressbar-text,div.progressbar-value").css({height:bar.height()+"px",lineHeight:bar.height()+"px"}); -}; -$.fn.progressbar=function(_1e5,_1e6){ -if(typeof _1e5=="string"){ -var _1e7=$.fn.progressbar.methods[_1e5]; -if(_1e7){ -return _1e7(this,_1e6); -} -} -_1e5=_1e5||{}; -return this.each(function(){ -var _1e8=$.data(this,"progressbar"); -if(_1e8){ -$.extend(_1e8.options,_1e5); -}else{ -_1e8=$.data(this,"progressbar",{options:$.extend({},$.fn.progressbar.defaults,$.fn.progressbar.parseOptions(this),_1e5),bar:init(this)}); -} -$(this).progressbar("setValue",_1e8.options.value); -_1e2(this); -}); -}; -$.fn.progressbar.methods={options:function(jq){ -return $.data(jq[0],"progressbar").options; -},resize:function(jq,_1e9){ -return jq.each(function(){ -_1e2(this,_1e9); -}); -},getValue:function(jq){ -return $.data(jq[0],"progressbar").options.value; -},setValue:function(jq,_1ea){ -if(_1ea<0){ -_1ea=0; -} -if(_1ea>100){ -_1ea=100; -} -return jq.each(function(){ -var opts=$.data(this,"progressbar").options; -var text=opts.text.replace(/{value}/,_1ea); -var _1eb=opts.value; -opts.value=_1ea; -$(this).find("div.progressbar-value").width(_1ea+"%"); -$(this).find("div.progressbar-text").html(text); -if(_1eb!=_1ea){ -opts.onChange.call(this,_1ea,_1eb); -} -}); -}}; -$.fn.progressbar.parseOptions=function(_1ec){ -return $.extend({},$.parser.parseOptions(_1ec,["width","height","text",{value:"number"}])); -}; -$.fn.progressbar.defaults={width:"auto",height:22,value:0,text:"{value}%",onChange:function(_1ed,_1ee){ -}}; -})(jQuery); -(function($){ -function init(_1ef){ -$(_1ef).addClass("tooltip-f"); -}; -function _1f0(_1f1){ -var opts=$.data(_1f1,"tooltip").options; -$(_1f1).unbind(".tooltip").bind(opts.showEvent+".tooltip",function(e){ -$(_1f1).tooltip("show",e); -}).bind(opts.hideEvent+".tooltip",function(e){ -$(_1f1).tooltip("hide",e); -}).bind("mousemove.tooltip",function(e){ -if(opts.trackMouse){ -opts.trackMouseX=e.pageX; -opts.trackMouseY=e.pageY; -$(_1f1).tooltip("reposition"); -} -}); -}; -function _1f2(_1f3){ -var _1f4=$.data(_1f3,"tooltip"); -if(_1f4.showTimer){ -clearTimeout(_1f4.showTimer); -_1f4.showTimer=null; -} -if(_1f4.hideTimer){ -clearTimeout(_1f4.hideTimer); -_1f4.hideTimer=null; -} -}; -function _1f5(_1f6){ -var _1f7=$.data(_1f6,"tooltip"); -if(!_1f7||!_1f7.tip){ -return; -} -var opts=_1f7.options; -var tip=_1f7.tip; -var pos={left:-100000,top:-100000}; -if($(_1f6).is(":visible")){ -pos=_1f8(opts.position); -if(opts.position=="top"&&pos.top<0){ -pos=_1f8("bottom"); -}else{ -if((opts.position=="bottom")&&(pos.top+tip._outerHeight()>$(window)._outerHeight()+$(document).scrollTop())){ -pos=_1f8("top"); -} -} -if(pos.left<0){ -if(opts.position=="left"){ -pos=_1f8("right"); -}else{ -$(_1f6).tooltip("arrow").css("left",tip._outerWidth()/2+pos.left); -pos.left=0; -} -}else{ -if(pos.left+tip._outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ -if(opts.position=="right"){ -pos=_1f8("left"); -}else{ -var left=pos.left; -pos.left=$(window)._outerWidth()+$(document)._scrollLeft()-tip._outerWidth(); -$(_1f6).tooltip("arrow").css("left",tip._outerWidth()/2-(pos.left-left)); -} -} -} -} -tip.css({left:pos.left,top:pos.top,zIndex:(opts.zIndex!=undefined?opts.zIndex:($.fn.window?$.fn.window.defaults.zIndex++:""))}); -opts.onPosition.call(_1f6,pos.left,pos.top); -function _1f8(_1f9){ -opts.position=_1f9||"bottom"; -tip.removeClass("tooltip-top tooltip-bottom tooltip-left tooltip-right").addClass("tooltip-"+opts.position); -var left,top; -var _1fa=$.isFunction(opts.deltaX)?opts.deltaX.call(_1f6,opts.position):opts.deltaX; -var _1fb=$.isFunction(opts.deltaY)?opts.deltaY.call(_1f6,opts.position):opts.deltaY; -if(opts.trackMouse){ -t=$(); -left=opts.trackMouseX+_1fa; -top=opts.trackMouseY+_1fb; -}else{ -var t=$(_1f6); -left=t.offset().left+_1fa; -top=t.offset().top+_1fb; -} -switch(opts.position){ -case "right": -left+=t._outerWidth()+12+(opts.trackMouse?12:0); -if(opts.valign=="middle"){ -top-=(tip._outerHeight()-t._outerHeight())/2; -} -break; -case "left": -left-=tip._outerWidth()+12+(opts.trackMouse?12:0); -if(opts.valign=="middle"){ -top-=(tip._outerHeight()-t._outerHeight())/2; -} -break; -case "top": -left-=(tip._outerWidth()-t._outerWidth())/2; -top-=tip._outerHeight()+12+(opts.trackMouse?12:0); -break; -case "bottom": -left-=(tip._outerWidth()-t._outerWidth())/2; -top+=t._outerHeight()+12+(opts.trackMouse?12:0); -break; -} -return {left:left,top:top}; -}; -}; -function _1fc(_1fd,e){ -var _1fe=$.data(_1fd,"tooltip"); -var opts=_1fe.options; -var tip=_1fe.tip; -if(!tip){ -tip=$("
                                                                                                                                                    "+"
                                                                                                                                                    "+"
                                                                                                                                                    "+"
                                                                                                                                                    "+"
                                                                                                                                                    ").appendTo("body"); -_1fe.tip=tip; -_1ff(_1fd); -} -_1f2(_1fd); -_1fe.showTimer=setTimeout(function(){ -$(_1fd).tooltip("reposition"); -tip.show(); -opts.onShow.call(_1fd,e); -var _200=tip.children(".tooltip-arrow-outer"); -var _201=tip.children(".tooltip-arrow"); -var bc="border-"+opts.position+"-color"; -_200.add(_201).css({borderTopColor:"",borderBottomColor:"",borderLeftColor:"",borderRightColor:""}); -_200.css(bc,tip.css(bc)); -_201.css(bc,tip.css("backgroundColor")); -},opts.showDelay); -}; -function _202(_203,e){ -var _204=$.data(_203,"tooltip"); -if(_204&&_204.tip){ -_1f2(_203); -_204.hideTimer=setTimeout(function(){ -_204.tip.hide(); -_204.options.onHide.call(_203,e); -},_204.options.hideDelay); -} -}; -function _1ff(_205,_206){ -var _207=$.data(_205,"tooltip"); -var opts=_207.options; -if(_206){ -opts.content=_206; -} -if(!_207.tip){ -return; -} -var cc=typeof opts.content=="function"?opts.content.call(_205):opts.content; -_207.tip.children(".tooltip-content").html(cc); -opts.onUpdate.call(_205,cc); -}; -function _208(_209){ -var _20a=$.data(_209,"tooltip"); -if(_20a){ -_1f2(_209); -var opts=_20a.options; -if(_20a.tip){ -_20a.tip.remove(); -} -if(opts._title){ -$(_209).attr("title",opts._title); -} -$.removeData(_209,"tooltip"); -$(_209).unbind(".tooltip").removeClass("tooltip-f"); -opts.onDestroy.call(_209); -} -}; -$.fn.tooltip=function(_20b,_20c){ -if(typeof _20b=="string"){ -return $.fn.tooltip.methods[_20b](this,_20c); -} -_20b=_20b||{}; -return this.each(function(){ -var _20d=$.data(this,"tooltip"); -if(_20d){ -$.extend(_20d.options,_20b); -}else{ -$.data(this,"tooltip",{options:$.extend({},$.fn.tooltip.defaults,$.fn.tooltip.parseOptions(this),_20b)}); -init(this); -} -_1f0(this); -_1ff(this); -}); -}; -$.fn.tooltip.methods={options:function(jq){ -return $.data(jq[0],"tooltip").options; -},tip:function(jq){ -return $.data(jq[0],"tooltip").tip; -},arrow:function(jq){ -return jq.tooltip("tip").children(".tooltip-arrow-outer,.tooltip-arrow"); -},show:function(jq,e){ -return jq.each(function(){ -_1fc(this,e); -}); -},hide:function(jq,e){ -return jq.each(function(){ -_202(this,e); -}); -},update:function(jq,_20e){ -return jq.each(function(){ -_1ff(this,_20e); -}); -},reposition:function(jq){ -return jq.each(function(){ -_1f5(this); -}); -},destroy:function(jq){ -return jq.each(function(){ -_208(this); -}); -}}; -$.fn.tooltip.parseOptions=function(_20f){ -var t=$(_20f); -var opts=$.extend({},$.parser.parseOptions(_20f,["position","showEvent","hideEvent","content",{trackMouse:"boolean",deltaX:"number",deltaY:"number",showDelay:"number",hideDelay:"number"}]),{_title:t.attr("title")}); -t.attr("title",""); -if(!opts.content){ -opts.content=opts._title; -} -return opts; -}; -$.fn.tooltip.defaults={position:"bottom",valign:"middle",content:null,trackMouse:false,deltaX:0,deltaY:0,showEvent:"mouseenter",hideEvent:"mouseleave",showDelay:200,hideDelay:100,onShow:function(e){ -},onHide:function(e){ -},onUpdate:function(_210){ -},onPosition:function(left,top){ -},onDestroy:function(){ -}}; -})(jQuery); -(function($){ -$.fn._remove=function(){ -return this.each(function(){ -$(this).remove(); -try{ -this.outerHTML=""; -} -catch(err){ -} -}); -}; -function _211(node){ -node._remove(); -}; -function _212(_213,_214){ -var _215=$.data(_213,"panel"); -var opts=_215.options; -var _216=_215.panel; -var _217=_216.children(".panel-header"); -var _218=_216.children(".panel-body"); -var _219=_216.children(".panel-footer"); -var _21a=(opts.halign=="left"||opts.halign=="right"); -if(_214){ -$.extend(opts,{width:_214.width,height:_214.height,minWidth:_214.minWidth,maxWidth:_214.maxWidth,minHeight:_214.minHeight,maxHeight:_214.maxHeight,left:_214.left,top:_214.top}); -opts.hasResized=false; -} -var _21b=_216.outerWidth(); -var _21c=_216.outerHeight(); -_216._size(opts); -var _21d=_216.outerWidth(); -var _21e=_216.outerHeight(); -if(opts.hasResized&&(_21b==_21d&&_21c==_21e)){ -return; -} -opts.hasResized=true; -if(!_21a){ -_217._outerWidth(_216.width()); -} -_218._outerWidth(_216.width()); -if(!isNaN(parseInt(opts.height))){ -if(_21a){ -if(opts.header){ -var _21f=$(opts.header)._outerWidth(); -}else{ -_217.css("width",""); -var _21f=_217._outerWidth(); -} -var _220=_217.find(".panel-title"); -_21f+=Math.min(_220._outerWidth(),_220._outerHeight()); -var _221=_216.height(); -_217._outerWidth(_21f)._outerHeight(_221); -_220._outerWidth(_217.height()); -_218._outerWidth(_216.width()-_21f-_219._outerWidth())._outerHeight(_221); -_219._outerHeight(_221); -_218.css({left:"",right:""}).css(opts.halign,(_217.position()[opts.halign]+_21f)+"px"); -opts.panelCssWidth=_216.css("width"); -if(opts.collapsed){ -_216._outerWidth(_21f+_219._outerWidth()); -} -}else{ -_218._outerHeight(_216.height()-_217._outerHeight()-_219._outerHeight()); -} -}else{ -_218.css("height",""); -var min=$.parser.parseValue("minHeight",opts.minHeight,_216.parent()); -var max=$.parser.parseValue("maxHeight",opts.maxHeight,_216.parent()); -var _222=_217._outerHeight()+_219._outerHeight()+_216._outerHeight()-_216.height(); -_218._size("minHeight",min?(min-_222):""); -_218._size("maxHeight",max?(max-_222):""); -} -_216.css({height:(_21a?undefined:""),minHeight:"",maxHeight:"",left:opts.left,top:opts.top}); -opts.onResize.apply(_213,[opts.width,opts.height]); -$(_213).panel("doLayout"); -}; -function _223(_224,_225){ -var _226=$.data(_224,"panel"); -var opts=_226.options; -var _227=_226.panel; -if(_225){ -if(_225.left!=null){ -opts.left=_225.left; -} -if(_225.top!=null){ -opts.top=_225.top; -} -} -_227.css({left:opts.left,top:opts.top}); -_227.find(".tooltip-f").each(function(){ -$(this).tooltip("reposition"); -}); -opts.onMove.apply(_224,[opts.left,opts.top]); -}; -function _228(_229){ -$(_229).addClass("panel-body")._size("clear"); -var _22a=$("
                                                                                                                                                    ").insertBefore(_229); -_22a[0].appendChild(_229); -_22a.bind("_resize",function(e,_22b){ -if($(this).hasClass("easyui-fluid")||_22b){ -_212(_229,{}); -} -return false; -}); -return _22a; -}; -function _22c(_22d){ -var _22e=$.data(_22d,"panel"); -var opts=_22e.options; -var _22f=_22e.panel; -_22f.css(opts.style); -_22f.addClass(opts.cls); -_22f.removeClass("panel-hleft panel-hright").addClass("panel-h"+opts.halign); -_230(); -_231(); -var _232=$(_22d).panel("header"); -var body=$(_22d).panel("body"); -var _233=$(_22d).siblings(".panel-footer"); -if(opts.border){ -_232.removeClass("panel-header-noborder"); -body.removeClass("panel-body-noborder"); -_233.removeClass("panel-footer-noborder"); -}else{ -_232.addClass("panel-header-noborder"); -body.addClass("panel-body-noborder"); -_233.addClass("panel-footer-noborder"); -} -_232.addClass(opts.headerCls); -body.addClass(opts.bodyCls); -$(_22d).attr("id",opts.id||""); -if(opts.content){ -$(_22d).panel("clear"); -$(_22d).html(opts.content); -$.parser.parse($(_22d)); -} -function _230(){ -if(opts.noheader||(!opts.title&&!opts.header)){ -_211(_22f.children(".panel-header")); -_22f.children(".panel-body").addClass("panel-body-noheader"); -}else{ -if(opts.header){ -$(opts.header).addClass("panel-header").prependTo(_22f); -}else{ -var _234=_22f.children(".panel-header"); -if(!_234.length){ -_234=$("
                                                                                                                                                    ").prependTo(_22f); -} -if(!$.isArray(opts.tools)){ -_234.find("div.panel-tool .panel-tool-a").appendTo(opts.tools); -} -_234.empty(); -var _235=$("
                                                                                                                                                    ").html(opts.title).appendTo(_234); -if(opts.iconCls){ -_235.addClass("panel-with-icon"); -$("
                                                                                                                                                    ").addClass(opts.iconCls).appendTo(_234); -} -if(opts.halign=="left"||opts.halign=="right"){ -_235.addClass("panel-title-"+opts.titleDirection); -} -var tool=$("
                                                                                                                                                    ").appendTo(_234); -tool.bind("click",function(e){ -e.stopPropagation(); -}); -if(opts.tools){ -if($.isArray(opts.tools)){ -$.map(opts.tools,function(t){ -_236(tool,t.iconCls,eval(t.handler)); -}); -}else{ -$(opts.tools).children().each(function(){ -$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(tool); -}); -} -} -if(opts.collapsible){ -_236(tool,"panel-tool-collapse",function(){ -if(opts.collapsed==true){ -_257(_22d,true); -}else{ -_248(_22d,true); -} -}); -} -if(opts.minimizable){ -_236(tool,"panel-tool-min",function(){ -_25d(_22d); -}); -} -if(opts.maximizable){ -_236(tool,"panel-tool-max",function(){ -if(opts.maximized==true){ -_260(_22d); -}else{ -_247(_22d); -} -}); -} -if(opts.closable){ -_236(tool,"panel-tool-close",function(){ -_249(_22d); -}); -} -} -_22f.children("div.panel-body").removeClass("panel-body-noheader"); -} -}; -function _236(c,icon,_237){ -var a=$("").addClass(icon).appendTo(c); -a.bind("click",_237); -}; -function _231(){ -if(opts.footer){ -$(opts.footer).addClass("panel-footer").appendTo(_22f); -$(_22d).addClass("panel-body-nobottom"); -}else{ -_22f.children(".panel-footer").remove(); -$(_22d).removeClass("panel-body-nobottom"); -} -}; -}; -function _238(_239,_23a){ -var _23b=$.data(_239,"panel"); -var opts=_23b.options; -if(_23c){ -opts.queryParams=_23a; -} -if(!opts.href){ -return; -} -if(!_23b.isLoaded||!opts.cache){ -var _23c=$.extend({},opts.queryParams); -if(opts.onBeforeLoad.call(_239,_23c)==false){ -return; -} -_23b.isLoaded=false; -if(opts.loadingMessage){ -$(_239).panel("clear"); -$(_239).html($("
                                                                                                                                                    ").html(opts.loadingMessage)); -} -opts.loader.call(_239,_23c,function(data){ -var _23d=opts.extractor.call(_239,data); -$(_239).panel("clear"); -$(_239).html(_23d); -$.parser.parse($(_239)); -opts.onLoad.apply(_239,arguments); -_23b.isLoaded=true; -},function(){ -opts.onLoadError.apply(_239,arguments); -}); -} -}; -function _23e(_23f){ -var t=$(_23f); -t.find(".combo-f").each(function(){ -$(this).combo("destroy"); -}); -t.find(".m-btn").each(function(){ -$(this).menubutton("destroy"); -}); -t.find(".s-btn").each(function(){ -$(this).splitbutton("destroy"); -}); -t.find(".tooltip-f").each(function(){ -$(this).tooltip("destroy"); -}); -t.children("div").each(function(){ -$(this)._size("unfit"); -}); -t.empty(); -}; -function _240(_241){ -$(_241).panel("doLayout",true); -}; -function _242(_243,_244){ -var _245=$.data(_243,"panel"); -var opts=_245.options; -var _246=_245.panel; -if(_244!=true){ -if(opts.onBeforeOpen.call(_243)==false){ -return; -} -} -_246.stop(true,true); -if($.isFunction(opts.openAnimation)){ -opts.openAnimation.call(_243,cb); -}else{ -switch(opts.openAnimation){ -case "slide": -_246.slideDown(opts.openDuration,cb); -break; -case "fade": -_246.fadeIn(opts.openDuration,cb); -break; -case "show": -_246.show(opts.openDuration,cb); -break; -default: -_246.show(); -cb(); -} -} -function cb(){ -opts.closed=false; -opts.minimized=false; -var tool=_246.children(".panel-header").find("a.panel-tool-restore"); -if(tool.length){ -opts.maximized=true; -} -opts.onOpen.call(_243); -if(opts.maximized==true){ -opts.maximized=false; -_247(_243); -} -if(opts.collapsed==true){ -opts.collapsed=false; -_248(_243); -} -if(!opts.collapsed){ -if(opts.href&&(!_245.isLoaded||!opts.cache)){ -_238(_243); -_240(_243); -opts.doneLayout=true; -} -} -if(!opts.doneLayout){ -opts.doneLayout=true; -_240(_243); -} -}; -}; -function _249(_24a,_24b){ -var _24c=$.data(_24a,"panel"); -var opts=_24c.options; -var _24d=_24c.panel; -if(_24b!=true){ -if(opts.onBeforeClose.call(_24a)==false){ -return; -} -} -_24d.find(".tooltip-f").each(function(){ -$(this).tooltip("hide"); -}); -_24d.stop(true,true); -_24d._size("unfit"); -if($.isFunction(opts.closeAnimation)){ -opts.closeAnimation.call(_24a,cb); -}else{ -switch(opts.closeAnimation){ -case "slide": -_24d.slideUp(opts.closeDuration,cb); -break; -case "fade": -_24d.fadeOut(opts.closeDuration,cb); -break; -case "hide": -_24d.hide(opts.closeDuration,cb); -break; -default: -_24d.hide(); -cb(); -} -} -function cb(){ -opts.closed=true; -opts.onClose.call(_24a); -}; -}; -function _24e(_24f,_250){ -var _251=$.data(_24f,"panel"); -var opts=_251.options; -var _252=_251.panel; -if(_250!=true){ -if(opts.onBeforeDestroy.call(_24f)==false){ -return; -} -} -$(_24f).panel("clear").panel("clear","footer"); -_211(_252); -opts.onDestroy.call(_24f); -}; -function _248(_253,_254){ -var opts=$.data(_253,"panel").options; -var _255=$.data(_253,"panel").panel; -var body=_255.children(".panel-body"); -var _256=_255.children(".panel-header"); -var tool=_256.find("a.panel-tool-collapse"); -if(opts.collapsed==true){ -return; -} -body.stop(true,true); -if(opts.onBeforeCollapse.call(_253)==false){ -return; -} -tool.addClass("panel-tool-expand"); -if(_254==true){ -if(opts.halign=="left"||opts.halign=="right"){ -_255.animate({width:_256._outerWidth()+_255.children(".panel-footer")._outerWidth()},function(){ -cb(); -}); -}else{ -body.slideUp("normal",function(){ -cb(); -}); -} -}else{ -if(opts.halign=="left"||opts.halign=="right"){ -_255._outerWidth(_256._outerWidth()+_255.children(".panel-footer")._outerWidth()); -} -cb(); -} -function cb(){ -body.hide(); -opts.collapsed=true; -opts.onCollapse.call(_253); -}; -}; -function _257(_258,_259){ -var opts=$.data(_258,"panel").options; -var _25a=$.data(_258,"panel").panel; -var body=_25a.children(".panel-body"); -var tool=_25a.children(".panel-header").find("a.panel-tool-collapse"); -if(opts.collapsed==false){ -return; -} -body.stop(true,true); -if(opts.onBeforeExpand.call(_258)==false){ -return; -} -tool.removeClass("panel-tool-expand"); -if(_259==true){ -if(opts.halign=="left"||opts.halign=="right"){ -body.show(); -_25a.animate({width:opts.panelCssWidth},function(){ -cb(); -}); -}else{ -body.slideDown("normal",function(){ -cb(); -}); -} -}else{ -if(opts.halign=="left"||opts.halign=="right"){ -_25a.css("width",opts.panelCssWidth); -} -cb(); -} -function cb(){ -body.show(); -opts.collapsed=false; -opts.onExpand.call(_258); -_238(_258); -_240(_258); -}; -}; -function _247(_25b){ -var opts=$.data(_25b,"panel").options; -var _25c=$.data(_25b,"panel").panel; -var tool=_25c.children(".panel-header").find("a.panel-tool-max"); -if(opts.maximized==true){ -return; -} -tool.addClass("panel-tool-restore"); -if(!$.data(_25b,"panel").original){ -$.data(_25b,"panel").original={width:opts.width,height:opts.height,left:opts.left,top:opts.top,fit:opts.fit}; -} -opts.left=0; -opts.top=0; -opts.fit=true; -_212(_25b); -opts.minimized=false; -opts.maximized=true; -opts.onMaximize.call(_25b); -}; -function _25d(_25e){ -var opts=$.data(_25e,"panel").options; -var _25f=$.data(_25e,"panel").panel; -_25f._size("unfit"); -_25f.hide(); -opts.minimized=true; -opts.maximized=false; -opts.onMinimize.call(_25e); -}; -function _260(_261){ -var opts=$.data(_261,"panel").options; -var _262=$.data(_261,"panel").panel; -var tool=_262.children(".panel-header").find("a.panel-tool-max"); -if(opts.maximized==false){ -return; -} -_262.show(); -tool.removeClass("panel-tool-restore"); -$.extend(opts,$.data(_261,"panel").original); -_212(_261); -opts.minimized=false; -opts.maximized=false; -$.data(_261,"panel").original=null; -opts.onRestore.call(_261); -}; -function _263(_264,_265){ -$.data(_264,"panel").options.title=_265; -$(_264).panel("header").find("div.panel-title").html(_265); -}; -var _266=null; -$(window).unbind(".panel").bind("resize.panel",function(){ -if(_266){ -clearTimeout(_266); -} -_266=setTimeout(function(){ -var _267=$("body.layout"); -if(_267.length){ -_267.layout("resize"); -$("body").children(".easyui-fluid:visible").each(function(){ -$(this).triggerHandler("_resize"); -}); -}else{ -$("body").panel("doLayout"); -} -_266=null; -},100); -}); -$.fn.panel=function(_268,_269){ -if(typeof _268=="string"){ -return $.fn.panel.methods[_268](this,_269); -} -_268=_268||{}; -return this.each(function(){ -var _26a=$.data(this,"panel"); -var opts; -if(_26a){ -opts=$.extend(_26a.options,_268); -_26a.isLoaded=false; -}else{ -opts=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_268); -$(this).attr("title",""); -_26a=$.data(this,"panel",{options:opts,panel:_228(this),isLoaded:false}); -} -_22c(this); -$(this).show(); -if(opts.doSize==true){ -_26a.panel.css("display","block"); -_212(this); -} -if(opts.closed==true||opts.minimized==true){ -_26a.panel.hide(); -}else{ -_242(this); -} -}); -}; -$.fn.panel.methods={options:function(jq){ -return $.data(jq[0],"panel").options; -},panel:function(jq){ -return $.data(jq[0],"panel").panel; -},header:function(jq){ -return $.data(jq[0],"panel").panel.children(".panel-header"); -},footer:function(jq){ -return jq.panel("panel").children(".panel-footer"); -},body:function(jq){ -return $.data(jq[0],"panel").panel.children(".panel-body"); -},setTitle:function(jq,_26b){ -return jq.each(function(){ -_263(this,_26b); -}); -},open:function(jq,_26c){ -return jq.each(function(){ -_242(this,_26c); -}); -},close:function(jq,_26d){ -return jq.each(function(){ -_249(this,_26d); -}); -},destroy:function(jq,_26e){ -return jq.each(function(){ -_24e(this,_26e); -}); -},clear:function(jq,type){ -return jq.each(function(){ -_23e(type=="footer"?$(this).panel("footer"):this); -}); -},refresh:function(jq,href){ -return jq.each(function(){ -var _26f=$.data(this,"panel"); -_26f.isLoaded=false; -if(href){ -if(typeof href=="string"){ -_26f.options.href=href; -}else{ -_26f.options.queryParams=href; -} -} -_238(this); -}); -},resize:function(jq,_270){ -return jq.each(function(){ -_212(this,_270||{}); -}); -},doLayout:function(jq,all){ -return jq.each(function(){ -_271(this,"body"); -_271($(this).siblings(".panel-footer")[0],"footer"); -function _271(_272,type){ -if(!_272){ -return; -} -var _273=_272==$("body")[0]; -var s=$(_272).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible,.easyui-fluid:visible").filter(function(_274,el){ -var p=$(el).parents(".panel-"+type+":first"); -return _273?p.length==0:p[0]==_272; -}); -s.each(function(){ -$(this).triggerHandler("_resize",[all||false]); -}); -}; -}); -},move:function(jq,_275){ -return jq.each(function(){ -_223(this,_275); -}); -},maximize:function(jq){ -return jq.each(function(){ -_247(this); -}); -},minimize:function(jq){ -return jq.each(function(){ -_25d(this); -}); -},restore:function(jq){ -return jq.each(function(){ -_260(this); -}); -},collapse:function(jq,_276){ -return jq.each(function(){ -_248(this,_276); -}); -},expand:function(jq,_277){ -return jq.each(function(){ -_257(this,_277); -}); -}}; -$.fn.panel.parseOptions=function(_278){ -var t=$(_278); -var hh=t.children(".panel-header,header"); -var ff=t.children(".panel-footer,footer"); -return $.extend({},$.parser.parseOptions(_278,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href","method","header","footer","halign","titleDirection",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"},"openAnimation","closeAnimation",{openDuration:"number",closeDuration:"number"},]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined),header:(hh.length?hh.removeClass("panel-header"):undefined),footer:(ff.length?ff.removeClass("panel-footer"):undefined)}); -}; -$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,halign:"top",titleDirection:"down",collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,openAnimation:false,openDuration:400,closeAnimation:false,closeDuration:400,tools:null,footer:null,header:null,queryParams:{},method:"get",href:null,loadingMessage:"Loading...",loader:function(_279,_27a,_27b){ -var opts=$(this).panel("options"); -if(!opts.href){ -return false; -} -$.ajax({type:opts.method,url:opts.href,cache:false,data:_279,dataType:"html",success:function(data){ -_27a(data); -},error:function(){ -_27b.apply(this,arguments); -}}); -},extractor:function(data){ -var _27c=/]*>((.|[\n\r])*)<\/body>/im; -var _27d=_27c.exec(data); -if(_27d){ -return _27d[1]; -}else{ -return data; -} -},onBeforeLoad:function(_27e){ -},onLoad:function(){ -},onLoadError:function(){ -},onBeforeOpen:function(){ -},onOpen:function(){ -},onBeforeClose:function(){ -},onClose:function(){ -},onBeforeDestroy:function(){ -},onDestroy:function(){ -},onResize:function(_27f,_280){ -},onMove:function(left,top){ -},onMaximize:function(){ -},onRestore:function(){ -},onMinimize:function(){ -},onBeforeCollapse:function(){ -},onBeforeExpand:function(){ -},onCollapse:function(){ -},onExpand:function(){ -}}; -})(jQuery); -(function($){ -function _281(_282,_283){ -var _284=$.data(_282,"window"); -if(_283){ -if(_283.left!=null){ -_284.options.left=_283.left; -} -if(_283.top!=null){ -_284.options.top=_283.top; -} -} -$(_282).panel("move",_284.options); -if(_284.shadow){ -_284.shadow.css({left:_284.options.left,top:_284.options.top}); -} -}; -function _285(_286,_287){ -var opts=$.data(_286,"window").options; -var pp=$(_286).window("panel"); -var _288=pp._outerWidth(); -if(opts.inline){ -var _289=pp.parent(); -opts.left=Math.ceil((_289.width()-_288)/2+_289.scrollLeft()); -}else{ -opts.left=Math.ceil(($(window)._outerWidth()-_288)/2+$(document).scrollLeft()); -} -if(_287){ -_281(_286); -} -}; -function _28a(_28b,_28c){ -var opts=$.data(_28b,"window").options; -var pp=$(_28b).window("panel"); -var _28d=pp._outerHeight(); -if(opts.inline){ -var _28e=pp.parent(); -opts.top=Math.ceil((_28e.height()-_28d)/2+_28e.scrollTop()); -}else{ -opts.top=Math.ceil(($(window)._outerHeight()-_28d)/2+$(document).scrollTop()); -} -if(_28c){ -_281(_28b); -} -}; -function _28f(_290){ -var _291=$.data(_290,"window"); -var opts=_291.options; -var win=$(_290).panel($.extend({},_291.options,{border:false,doSize:true,closed:true,cls:"window "+(!opts.border?"window-thinborder window-noborder ":(opts.border=="thin"?"window-thinborder ":""))+(opts.cls||""),headerCls:"window-header "+(opts.headerCls||""),bodyCls:"window-body "+(opts.noheader?"window-body-noheader ":" ")+(opts.bodyCls||""),onBeforeDestroy:function(){ -if(opts.onBeforeDestroy.call(_290)==false){ -return false; -} -if(_291.shadow){ -_291.shadow.remove(); -} -if(_291.mask){ -_291.mask.remove(); -} -},onClose:function(){ -if(_291.shadow){ -_291.shadow.hide(); -} -if(_291.mask){ -_291.mask.hide(); -} -opts.onClose.call(_290); -},onOpen:function(){ -if(_291.mask){ -_291.mask.css($.extend({display:"block",zIndex:$.fn.window.defaults.zIndex++},$.fn.window.getMaskSize(_290))); -} -if(_291.shadow){ -_291.shadow.css({display:"block",zIndex:$.fn.window.defaults.zIndex++,left:opts.left,top:opts.top,width:_291.window._outerWidth(),height:_291.window._outerHeight()}); -} -_291.window.css("z-index",$.fn.window.defaults.zIndex++); -opts.onOpen.call(_290); -},onResize:function(_292,_293){ -var _294=$(this).panel("options"); -$.extend(opts,{width:_294.width,height:_294.height,left:_294.left,top:_294.top}); -if(_291.shadow){ -_291.shadow.css({left:opts.left,top:opts.top,width:_291.window._outerWidth(),height:_291.window._outerHeight()}); -} -opts.onResize.call(_290,_292,_293); -},onMinimize:function(){ -if(_291.shadow){ -_291.shadow.hide(); -} -if(_291.mask){ -_291.mask.hide(); -} -_291.options.onMinimize.call(_290); -},onBeforeCollapse:function(){ -if(opts.onBeforeCollapse.call(_290)==false){ -return false; -} -if(_291.shadow){ -_291.shadow.hide(); -} -},onExpand:function(){ -if(_291.shadow){ -_291.shadow.show(); -} -opts.onExpand.call(_290); -}})); -_291.window=win.panel("panel"); -if(_291.mask){ -_291.mask.remove(); -} -if(opts.modal){ -_291.mask=$("
                                                                                                                                                    ").insertAfter(_291.window); -} -if(_291.shadow){ -_291.shadow.remove(); -} -if(opts.shadow){ -_291.shadow=$("
                                                                                                                                                    ").insertAfter(_291.window); -} -var _295=opts.closed; -if(opts.left==null){ -_285(_290); -} -if(opts.top==null){ -_28a(_290); -} -_281(_290); -if(!_295){ -win.window("open"); -} -}; -function _296(left,top,_297,_298){ -var _299=this; -var _29a=$.data(_299,"window"); -var opts=_29a.options; -if(!opts.constrain){ -return {}; -} -if($.isFunction(opts.constrain)){ -return opts.constrain.call(_299,left,top,_297,_298); -} -var win=$(_299).window("window"); -var _29b=opts.inline?win.parent():$(window); -if(left<0){ -left=0; -} -if(top<_29b.scrollTop()){ -top=_29b.scrollTop(); -} -if(left+_297>_29b.width()){ -if(_297==win.outerWidth()){ -left=_29b.width()-_297; -}else{ -_297=_29b.width()-left; -} -} -if(top-_29b.scrollTop()+_298>_29b.height()){ -if(_298==win.outerHeight()){ -top=_29b.height()-_298+_29b.scrollTop(); -}else{ -_298=_29b.height()-top+_29b.scrollTop(); -} -} -return {left:left,top:top,width:_297,height:_298}; -}; -function _29c(_29d){ -var _29e=$.data(_29d,"window"); -_29e.window.draggable({handle:">div.panel-header>div.panel-title",disabled:_29e.options.draggable==false,onBeforeDrag:function(e){ -if(_29e.mask){ -_29e.mask.css("z-index",$.fn.window.defaults.zIndex++); -} -if(_29e.shadow){ -_29e.shadow.css("z-index",$.fn.window.defaults.zIndex++); -} -_29e.window.css("z-index",$.fn.window.defaults.zIndex++); -},onStartDrag:function(e){ -_29f(e); -},onDrag:function(e){ -_2a0(e); -return false; -},onStopDrag:function(e){ -_2a1(e,"move"); -}}); -_29e.window.resizable({disabled:_29e.options.resizable==false,onStartResize:function(e){ -_29f(e); -},onResize:function(e){ -_2a0(e); -return false; -},onStopResize:function(e){ -_2a1(e,"resize"); -}}); -function _29f(e){ -if(_29e.pmask){ -_29e.pmask.remove(); -} -_29e.pmask=$("
                                                                                                                                                    ").insertAfter(_29e.window); -_29e.pmask.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top,width:_29e.window._outerWidth(),height:_29e.window._outerHeight()}); -if(_29e.proxy){ -_29e.proxy.remove(); -} -_29e.proxy=$("
                                                                                                                                                    ").insertAfter(_29e.window); -_29e.proxy.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top}); -_29e.proxy._outerWidth(e.data.width)._outerHeight(e.data.height); -_29e.proxy.hide(); -setTimeout(function(){ -if(_29e.pmask){ -_29e.pmask.show(); -} -if(_29e.proxy){ -_29e.proxy.show(); -} -},500); -}; -function _2a0(e){ -$.extend(e.data,_296.call(_29d,e.data.left,e.data.top,e.data.width,e.data.height)); -_29e.pmask.show(); -_29e.proxy.css({display:"block",left:e.data.left,top:e.data.top}); -_29e.proxy._outerWidth(e.data.width); -_29e.proxy._outerHeight(e.data.height); -}; -function _2a1(e,_2a2){ -$.extend(e.data,_296.call(_29d,e.data.left,e.data.top,e.data.width+0.1,e.data.height+0.1)); -$(_29d).window(_2a2,e.data); -_29e.pmask.remove(); -_29e.pmask=null; -_29e.proxy.remove(); -_29e.proxy=null; -}; -}; -$(function(){ -if(!$._positionFixed){ -$(window).resize(function(){ -$("body>div.window-mask:visible").css({width:"",height:""}); -setTimeout(function(){ -$("body>div.window-mask:visible").css($.fn.window.getMaskSize()); -},50); -}); -} -}); -$.fn.window=function(_2a3,_2a4){ -if(typeof _2a3=="string"){ -var _2a5=$.fn.window.methods[_2a3]; -if(_2a5){ -return _2a5(this,_2a4); -}else{ -return this.panel(_2a3,_2a4); -} -} -_2a3=_2a3||{}; -return this.each(function(){ -var _2a6=$.data(this,"window"); -if(_2a6){ -$.extend(_2a6.options,_2a3); -}else{ -_2a6=$.data(this,"window",{options:$.extend({},$.fn.window.defaults,$.fn.window.parseOptions(this),_2a3)}); -if(!_2a6.options.inline){ -document.body.appendChild(this); -} -} -_28f(this); -_29c(this); -}); -}; -$.fn.window.methods={options:function(jq){ -var _2a7=jq.panel("options"); -var _2a8=$.data(jq[0],"window").options; -return $.extend(_2a8,{closed:_2a7.closed,collapsed:_2a7.collapsed,minimized:_2a7.minimized,maximized:_2a7.maximized}); -},window:function(jq){ -return $.data(jq[0],"window").window; -},move:function(jq,_2a9){ -return jq.each(function(){ -_281(this,_2a9); -}); -},hcenter:function(jq){ -return jq.each(function(){ -_285(this,true); -}); -},vcenter:function(jq){ -return jq.each(function(){ -_28a(this,true); -}); -},center:function(jq){ -return jq.each(function(){ -_285(this); -_28a(this); -_281(this); -}); -}}; -$.fn.window.getMaskSize=function(_2aa){ -var _2ab=$(_2aa).data("window"); -if(_2ab&&_2ab.options.inline){ -return {}; -}else{ -if($._positionFixed){ -return {position:"fixed"}; -}else{ -return {width:$(document).width(),height:$(document).height()}; -} -} -}; -$.fn.window.parseOptions=function(_2ac){ -return $.extend({},$.fn.panel.parseOptions(_2ac),$.parser.parseOptions(_2ac,[{draggable:"boolean",resizable:"boolean",shadow:"boolean",modal:"boolean",inline:"boolean"}])); -}; -$.fn.window.defaults=$.extend({},$.fn.panel.defaults,{zIndex:9000,draggable:true,resizable:true,shadow:true,modal:false,border:true,inline:false,title:"New Window",collapsible:true,minimizable:true,maximizable:true,closable:true,closed:false,constrain:false}); -})(jQuery); -(function($){ -function _2ad(_2ae){ -var opts=$.data(_2ae,"dialog").options; -opts.inited=false; -$(_2ae).window($.extend({},opts,{onResize:function(w,h){ -if(opts.inited){ -_2b3(this); -opts.onResize.call(this,w,h); -} -}})); -var win=$(_2ae).window("window"); -if(opts.toolbar){ -if($.isArray(opts.toolbar)){ -$(_2ae).siblings("div.dialog-toolbar").remove(); -var _2af=$("
                                                                                                                                                    ").appendTo(win); -var tr=_2af.find("tr"); -for(var i=0;i
                                                                                                                                                    ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var tool=$("").appendTo(td); -tool[0].onclick=eval(btn.handler||function(){ -}); -tool.linkbutton($.extend({},btn,{plain:true})); -} -} -}else{ -$(opts.toolbar).addClass("dialog-toolbar").appendTo(win); -$(opts.toolbar).show(); -} -}else{ -$(_2ae).siblings("div.dialog-toolbar").remove(); -} -if(opts.buttons){ -if($.isArray(opts.buttons)){ -$(_2ae).siblings("div.dialog-button").remove(); -var _2b0=$("
                                                                                                                                                    ").appendTo(win); -for(var i=0;i").appendTo(_2b0); -if(p.handler){ -_2b1[0].onclick=p.handler; -} -_2b1.linkbutton(p); -} -}else{ -$(opts.buttons).addClass("dialog-button").appendTo(win); -$(opts.buttons).show(); -} -}else{ -$(_2ae).siblings("div.dialog-button").remove(); -} -opts.inited=true; -var _2b2=opts.closed; -win.show(); -$(_2ae).window("resize",{}); -if(_2b2){ -win.hide(); -} -}; -function _2b3(_2b4,_2b5){ -var t=$(_2b4); -var opts=t.dialog("options"); -var _2b6=opts.noheader; -var tb=t.siblings(".dialog-toolbar"); -var bb=t.siblings(".dialog-button"); -tb.insertBefore(_2b4).css({borderTopWidth:(_2b6?1:0),top:(_2b6?tb.length:0)}); -bb.insertAfter(_2b4); -tb.add(bb)._outerWidth(t._outerWidth()).find(".easyui-fluid:visible").each(function(){ -$(this).triggerHandler("_resize"); -}); -var _2b7=tb._outerHeight()+bb._outerHeight(); -if(!isNaN(parseInt(opts.height))){ -t._outerHeight(t._outerHeight()-_2b7); -}else{ -var _2b8=t._size("min-height"); -if(_2b8){ -t._size("min-height",_2b8-_2b7); -} -var _2b9=t._size("max-height"); -if(_2b9){ -t._size("max-height",_2b9-_2b7); -} -} -var _2ba=$.data(_2b4,"window").shadow; -if(_2ba){ -var cc=t.panel("panel"); -_2ba.css({width:cc._outerWidth(),height:cc._outerHeight()}); -} -}; -$.fn.dialog=function(_2bb,_2bc){ -if(typeof _2bb=="string"){ -var _2bd=$.fn.dialog.methods[_2bb]; -if(_2bd){ -return _2bd(this,_2bc); -}else{ -return this.window(_2bb,_2bc); -} -} -_2bb=_2bb||{}; -return this.each(function(){ -var _2be=$.data(this,"dialog"); -if(_2be){ -$.extend(_2be.options,_2bb); -}else{ -$.data(this,"dialog",{options:$.extend({},$.fn.dialog.defaults,$.fn.dialog.parseOptions(this),_2bb)}); -} -_2ad(this); -}); -}; -$.fn.dialog.methods={options:function(jq){ -var _2bf=$.data(jq[0],"dialog").options; -var _2c0=jq.panel("options"); -$.extend(_2bf,{width:_2c0.width,height:_2c0.height,left:_2c0.left,top:_2c0.top,closed:_2c0.closed,collapsed:_2c0.collapsed,minimized:_2c0.minimized,maximized:_2c0.maximized}); -return _2bf; -},dialog:function(jq){ -return jq.window("window"); -}}; -$.fn.dialog.parseOptions=function(_2c1){ -var t=$(_2c1); -return $.extend({},$.fn.window.parseOptions(_2c1),$.parser.parseOptions(_2c1,["toolbar","buttons"]),{toolbar:(t.children(".dialog-toolbar").length?t.children(".dialog-toolbar").removeClass("dialog-toolbar"):undefined),buttons:(t.children(".dialog-button").length?t.children(".dialog-button").removeClass("dialog-button"):undefined)}); -}; -$.fn.dialog.defaults=$.extend({},$.fn.window.defaults,{title:"New Dialog",collapsible:false,minimizable:false,maximizable:false,resizable:false,toolbar:null,buttons:null}); -})(jQuery); -(function($){ -function _2c2(){ -$(document).unbind(".messager").bind("keydown.messager",function(e){ -if(e.keyCode==27){ -$("body").children("div.messager-window").children("div.messager-body").each(function(){ -$(this).dialog("close"); -}); -}else{ -if(e.keyCode==9){ -var win=$("body").children("div.messager-window"); -if(!win.length){ -return; -} -var _2c3=win.find(".messager-input,.messager-button .l-btn"); -for(var i=0;i<_2c3.length;i++){ -if($(_2c3[i]).is(":focus")){ -$(_2c3[i>=_2c3.length-1?0:i+1]).focus(); -return false; -} -} -}else{ -if(e.keyCode==13){ -var _2c4=$(e.target).closest("input.messager-input"); -if(_2c4.length){ -var dlg=_2c4.closest(".messager-body"); -_2c5(dlg,_2c4.val()); -} -} -} -} -}); -}; -function _2c6(){ -$(document).unbind(".messager"); -}; -function _2c7(_2c8){ -var opts=$.extend({},$.messager.defaults,{modal:false,shadow:false,draggable:false,resizable:false,closed:true,style:{left:"",top:"",right:0,zIndex:$.fn.window.defaults.zIndex++,bottom:-document.body.scrollTop-document.documentElement.scrollTop},title:"",width:300,height:150,minHeight:0,showType:"slide",showSpeed:600,content:_2c8.msg,timeout:4000},_2c8); -var dlg=$("
                                                                                                                                                    ").appendTo("body"); -dlg.dialog($.extend({},opts,{noheader:(opts.title?false:true),openAnimation:(opts.showType),closeAnimation:(opts.showType=="show"?"hide":opts.showType),openDuration:opts.showSpeed,closeDuration:opts.showSpeed,onOpen:function(){ -dlg.dialog("dialog").hover(function(){ -if(opts.timer){ -clearTimeout(opts.timer); -} -},function(){ -_2c9(); -}); -_2c9(); -function _2c9(){ -if(opts.timeout>0){ -opts.timer=setTimeout(function(){ -if(dlg.length&&dlg.data("dialog")){ -dlg.dialog("close"); -} -},opts.timeout); -} -}; -if(_2c8.onOpen){ -_2c8.onOpen.call(this); -}else{ -opts.onOpen.call(this); -} -},onClose:function(){ -if(opts.timer){ -clearTimeout(opts.timer); -} -if(_2c8.onClose){ -_2c8.onClose.call(this); -}else{ -opts.onClose.call(this); -} -dlg.dialog("destroy"); -}})); -dlg.dialog("dialog").css(opts.style); -dlg.dialog("open"); -return dlg; -}; -function _2ca(_2cb){ -_2c2(); -var dlg=$("
                                                                                                                                                    ").appendTo("body"); -dlg.dialog($.extend({},_2cb,{noheader:(_2cb.title?false:true),onClose:function(){ -_2c6(); -if(_2cb.onClose){ -_2cb.onClose.call(this); -} -dlg.dialog("destroy"); -}})); -var win=dlg.dialog("dialog").addClass("messager-window"); -win.find(".dialog-button").addClass("messager-button").find("a:first").focus(); -return dlg; -}; -function _2c5(dlg,_2cc){ -var opts=dlg.dialog("options"); -dlg.dialog("close"); -opts.fn(_2cc); -}; -$.messager={show:function(_2cd){ -return _2c7(_2cd); -},alert:function(_2ce,msg,icon,fn){ -var opts=typeof _2ce=="object"?_2ce:{title:_2ce,msg:msg,icon:icon,fn:fn}; -var cls=opts.icon?"messager-icon messager-"+opts.icon:""; -opts=$.extend({},$.messager.defaults,{content:"
                                                                                                                                                    "+"
                                                                                                                                                    "+opts.msg+"
                                                                                                                                                    "+"
                                                                                                                                                    "},opts); -if(!opts.buttons){ -opts.buttons=[{text:opts.ok,onClick:function(){ -_2c5(dlg); -}}]; -} -var dlg=_2ca(opts); -return dlg; -},confirm:function(_2cf,msg,fn){ -var opts=typeof _2cf=="object"?_2cf:{title:_2cf,msg:msg,fn:fn}; -opts=$.extend({},$.messager.defaults,{content:"
                                                                                                                                                    "+"
                                                                                                                                                    "+opts.msg+"
                                                                                                                                                    "+"
                                                                                                                                                    "},opts); -if(!opts.buttons){ -opts.buttons=[{text:opts.ok,onClick:function(){ -_2c5(dlg,true); -}},{text:opts.cancel,onClick:function(){ -_2c5(dlg,false); -}}]; -} -var dlg=_2ca(opts); -return dlg; -},prompt:function(_2d0,msg,fn){ -var opts=typeof _2d0=="object"?_2d0:{title:_2d0,msg:msg,fn:fn}; -opts=$.extend({},$.messager.defaults,{content:"
                                                                                                                                                    "+"
                                                                                                                                                    "+opts.msg+"
                                                                                                                                                    "+"
                                                                                                                                                    "+"
                                                                                                                                                    "+"
                                                                                                                                                    "},opts); -if(!opts.buttons){ -opts.buttons=[{text:opts.ok,onClick:function(){ -_2c5(dlg,dlg.find(".messager-input").val()); -}},{text:opts.cancel,onClick:function(){ -_2c5(dlg); -}}]; -} -var dlg=_2ca(opts); -dlg.find(".messager-input").focus(); -return dlg; -},progress:function(_2d1){ -var _2d2={bar:function(){ -return $("body>div.messager-window").find("div.messager-p-bar"); -},close:function(){ -var dlg=$("body>div.messager-window>div.messager-body:has(div.messager-progress)"); -if(dlg.length){ -dlg.dialog("close"); -} -}}; -if(typeof _2d1=="string"){ -var _2d3=_2d2[_2d1]; -return _2d3(); -} -_2d1=_2d1||{}; -var opts=$.extend({},{title:"",minHeight:0,content:undefined,msg:"",text:undefined,interval:300},_2d1); -var dlg=_2ca($.extend({},$.messager.defaults,{content:"
                                                                                                                                                    "+opts.msg+"
                                                                                                                                                    ",closable:false,doSize:false},opts,{onClose:function(){ -if(this.timer){ -clearInterval(this.timer); -} -if(_2d1.onClose){ -_2d1.onClose.call(this); -}else{ -$.messager.defaults.onClose.call(this); -} -}})); -var bar=dlg.find("div.messager-p-bar"); -bar.progressbar({text:opts.text}); -dlg.dialog("resize"); -if(opts.interval){ -dlg[0].timer=setInterval(function(){ -var v=bar.progressbar("getValue"); -v+=10; -if(v>100){ -v=0; -} -bar.progressbar("setValue",v); -},opts.interval); -} -return dlg; -}}; -$.messager.defaults=$.extend({},$.fn.dialog.defaults,{ok:"Ok",cancel:"Cancel",width:300,height:"auto",minHeight:150,modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,fn:function(){ -}}); -})(jQuery); -(function($){ -function _2d4(_2d5,_2d6){ -var _2d7=$.data(_2d5,"accordion"); -var opts=_2d7.options; -var _2d8=_2d7.panels; -var cc=$(_2d5); -var _2d9=(opts.halign=="left"||opts.halign=="right"); -cc.children(".panel-last").removeClass("panel-last"); -cc.children(".panel:last").addClass("panel-last"); -if(_2d6){ -$.extend(opts,{width:_2d6.width,height:_2d6.height}); -} -cc._size(opts); -var _2da=0; -var _2db="auto"; -var _2dc=cc.find(">.panel>.accordion-header"); -if(_2dc.length){ -if(_2d9){ -$(_2d8[0]).panel("resize",{width:cc.width(),height:cc.height()}); -_2da=$(_2dc[0])._outerWidth(); -}else{ -_2da=$(_2dc[0]).css("height","")._outerHeight(); -} -} -if(!isNaN(parseInt(opts.height))){ -if(_2d9){ -_2db=cc.width()-_2da*_2dc.length; -}else{ -_2db=cc.height()-_2da*_2dc.length; -} -} -_2dd(true,_2db-_2dd(false)); -function _2dd(_2de,_2df){ -var _2e0=0; -for(var i=0;i<_2d8.length;i++){ -var p=_2d8[i]; -if(_2d9){ -var h=p.panel("header")._outerWidth(_2da); -}else{ -var h=p.panel("header")._outerHeight(_2da); -} -if(p.panel("options").collapsible==_2de){ -var _2e1=isNaN(_2df)?undefined:(_2df+_2da*h.length); -if(_2d9){ -p.panel("resize",{height:cc.height(),width:(_2de?_2e1:undefined)}); -_2e0+=p.panel("panel")._outerWidth()-_2da*h.length; -}else{ -p.panel("resize",{width:cc.width(),height:(_2de?_2e1:undefined)}); -_2e0+=p.panel("panel").outerHeight()-_2da*h.length; -} -} -} -return _2e0; -}; -}; -function _2e2(_2e3,_2e4,_2e5,all){ -var _2e6=$.data(_2e3,"accordion").panels; -var pp=[]; -for(var i=0;i<_2e6.length;i++){ -var p=_2e6[i]; -if(_2e4){ -if(p.panel("options")[_2e4]==_2e5){ -pp.push(p); -} -}else{ -if(p[0]==$(_2e5)[0]){ -return i; -} -} -} -if(_2e4){ -return all?pp:(pp.length?pp[0]:null); -}else{ -return -1; -} -}; -function _2e7(_2e8){ -return _2e2(_2e8,"collapsed",false,true); -}; -function _2e9(_2ea){ -var pp=_2e7(_2ea); -return pp.length?pp[0]:null; -}; -function _2eb(_2ec,_2ed){ -return _2e2(_2ec,null,_2ed); -}; -function _2ee(_2ef,_2f0){ -var _2f1=$.data(_2ef,"accordion").panels; -if(typeof _2f0=="number"){ -if(_2f0<0||_2f0>=_2f1.length){ -return null; -}else{ -return _2f1[_2f0]; -} -} -return _2e2(_2ef,"title",_2f0); -}; -function _2f2(_2f3){ -var opts=$.data(_2f3,"accordion").options; -var cc=$(_2f3); -if(opts.border){ -cc.removeClass("accordion-noborder"); -}else{ -cc.addClass("accordion-noborder"); -} -}; -function init(_2f4){ -var _2f5=$.data(_2f4,"accordion"); -var cc=$(_2f4); -cc.addClass("accordion"); -_2f5.panels=[]; -cc.children("div").each(function(){ -var opts=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); -var pp=$(this); -_2f5.panels.push(pp); -_2f7(_2f4,pp,opts); -}); -cc.bind("_resize",function(e,_2f6){ -if($(this).hasClass("easyui-fluid")||_2f6){ -_2d4(_2f4); -} -return false; -}); -}; -function _2f7(_2f8,pp,_2f9){ -var opts=$.data(_2f8,"accordion").options; -pp.panel($.extend({},{collapsible:true,minimizable:false,maximizable:false,closable:false,doSize:false,collapsed:true,headerCls:"accordion-header",bodyCls:"accordion-body",halign:opts.halign},_2f9,{onBeforeExpand:function(){ -if(_2f9.onBeforeExpand){ -if(_2f9.onBeforeExpand.call(this)==false){ -return false; -} -} -if(!opts.multiple){ -var all=$.grep(_2e7(_2f8),function(p){ -return p.panel("options").collapsible; -}); -for(var i=0;i.panel-last>.accordion-header").removeClass("accordion-header-border"); -if(_2f9.onExpand){ -_2f9.onExpand.call(this); -} -opts.onSelect.call(_2f8,$(this).panel("options").title,_2eb(_2f8,this)); -},onBeforeCollapse:function(){ -if(_2f9.onBeforeCollapse){ -if(_2f9.onBeforeCollapse.call(this)==false){ -return false; -} -} -$(_2f8).find(">.panel-last>.accordion-header").addClass("accordion-header-border"); -var _2fb=$(this).panel("header"); -_2fb.removeClass("accordion-header-selected"); -_2fb.find(".accordion-collapse").addClass("accordion-expand"); -},onCollapse:function(){ -if(isNaN(parseInt(opts.height))){ -$(_2f8).find(">.panel-last>.accordion-header").removeClass("accordion-header-border"); -} -if(_2f9.onCollapse){ -_2f9.onCollapse.call(this); -} -opts.onUnselect.call(_2f8,$(this).panel("options").title,_2eb(_2f8,this)); -}})); -var _2fc=pp.panel("header"); -var tool=_2fc.children("div.panel-tool"); -tool.children("a.panel-tool-collapse").hide(); -var t=$("").addClass("accordion-collapse accordion-expand").appendTo(tool); -t.bind("click",function(){ -_2fd(pp); -return false; -}); -pp.panel("options").collapsible?t.show():t.hide(); -if(opts.halign=="left"||opts.halign=="right"){ -t.hide(); -} -_2fc.click(function(){ -_2fd(pp); -return false; -}); -function _2fd(p){ -var _2fe=p.panel("options"); -if(_2fe.collapsible){ -var _2ff=_2eb(_2f8,p); -if(_2fe.collapsed){ -_300(_2f8,_2ff); -}else{ -_301(_2f8,_2ff); -} -} -}; -}; -function _300(_302,_303){ -var p=_2ee(_302,_303); -if(!p){ -return; -} -_304(_302); -var opts=$.data(_302,"accordion").options; -p.panel("expand",opts.animate); -}; -function _301(_305,_306){ -var p=_2ee(_305,_306); -if(!p){ -return; -} -_304(_305); -var opts=$.data(_305,"accordion").options; -p.panel("collapse",opts.animate); -}; -function _307(_308){ -var opts=$.data(_308,"accordion").options; -$(_308).find(">.panel-last>.accordion-header").addClass("accordion-header-border"); -var p=_2e2(_308,"selected",true); -if(p){ -_309(_2eb(_308,p)); -}else{ -_309(opts.selected); -} -function _309(_30a){ -var _30b=opts.animate; -opts.animate=false; -_300(_308,_30a); -opts.animate=_30b; -}; -}; -function _304(_30c){ -var _30d=$.data(_30c,"accordion").panels; -for(var i=0;i<_30d.length;i++){ -_30d[i].stop(true,true); -} -}; -function add(_30e,_30f){ -var _310=$.data(_30e,"accordion"); -var opts=_310.options; -var _311=_310.panels; -if(_30f.selected==undefined){ -_30f.selected=true; -} -_304(_30e); -var pp=$("
                                                                                                                                                    ").appendTo(_30e); -_311.push(pp); -_2f7(_30e,pp,_30f); -_2d4(_30e); -opts.onAdd.call(_30e,_30f.title,_311.length-1); -if(_30f.selected){ -_300(_30e,_311.length-1); -} -}; -function _312(_313,_314){ -var _315=$.data(_313,"accordion"); -var opts=_315.options; -var _316=_315.panels; -_304(_313); -var _317=_2ee(_313,_314); -var _318=_317.panel("options").title; -var _319=_2eb(_313,_317); -if(!_317){ -return; -} -if(opts.onBeforeRemove.call(_313,_318,_319)==false){ -return; -} -_316.splice(_319,1); -_317.panel("destroy"); -if(_316.length){ -_2d4(_313); -var curr=_2e9(_313); -if(!curr){ -_300(_313,0); -} -} -opts.onRemove.call(_313,_318,_319); -}; -$.fn.accordion=function(_31a,_31b){ -if(typeof _31a=="string"){ -return $.fn.accordion.methods[_31a](this,_31b); -} -_31a=_31a||{}; -return this.each(function(){ -var _31c=$.data(this,"accordion"); -if(_31c){ -$.extend(_31c.options,_31a); -}else{ -$.data(this,"accordion",{options:$.extend({},$.fn.accordion.defaults,$.fn.accordion.parseOptions(this),_31a),accordion:$(this).addClass("accordion"),panels:[]}); -init(this); -} -_2f2(this); -_2d4(this); -_307(this); -}); -}; -$.fn.accordion.methods={options:function(jq){ -return $.data(jq[0],"accordion").options; -},panels:function(jq){ -return $.data(jq[0],"accordion").panels; -},resize:function(jq,_31d){ -return jq.each(function(){ -_2d4(this,_31d); -}); -},getSelections:function(jq){ -return _2e7(jq[0]); -},getSelected:function(jq){ -return _2e9(jq[0]); -},getPanel:function(jq,_31e){ -return _2ee(jq[0],_31e); -},getPanelIndex:function(jq,_31f){ -return _2eb(jq[0],_31f); -},select:function(jq,_320){ -return jq.each(function(){ -_300(this,_320); -}); -},unselect:function(jq,_321){ -return jq.each(function(){ -_301(this,_321); -}); -},add:function(jq,_322){ -return jq.each(function(){ -add(this,_322); -}); -},remove:function(jq,_323){ -return jq.each(function(){ -_312(this,_323); -}); -}}; -$.fn.accordion.parseOptions=function(_324){ -var t=$(_324); -return $.extend({},$.parser.parseOptions(_324,["width","height","halign",{fit:"boolean",border:"boolean",animate:"boolean",multiple:"boolean",selected:"number"}])); -}; -$.fn.accordion.defaults={width:"auto",height:"auto",fit:false,border:true,animate:true,multiple:false,selected:0,halign:"top",onSelect:function(_325,_326){ -},onUnselect:function(_327,_328){ -},onAdd:function(_329,_32a){ -},onBeforeRemove:function(_32b,_32c){ -},onRemove:function(_32d,_32e){ -}}; -})(jQuery); -(function($){ -function _32f(c){ -var w=0; -$(c).children().each(function(){ -w+=$(this).outerWidth(true); -}); -return w; -}; -function _330(_331){ -var opts=$.data(_331,"tabs").options; -if(!opts.showHeader){ -return; -} -var _332=$(_331).children("div.tabs-header"); -var tool=_332.children("div.tabs-tool:not(.tabs-tool-hidden)"); -var _333=_332.children("div.tabs-scroller-left"); -var _334=_332.children("div.tabs-scroller-right"); -var wrap=_332.children("div.tabs-wrap"); -if(opts.tabPosition=="left"||opts.tabPosition=="right"){ -if(!tool.length){ -return; -} -tool._outerWidth(_332.width()); -var _335={left:opts.tabPosition=="left"?"auto":0,right:opts.tabPosition=="left"?0:"auto",top:opts.toolPosition=="top"?0:"auto",bottom:opts.toolPosition=="top"?"auto":0}; -var _336={marginTop:opts.toolPosition=="top"?tool.outerHeight():0}; -tool.css(_335); -wrap.css(_336); -return; -} -var _337=_332.outerHeight(); -if(opts.plain){ -_337-=_337-_332.height(); -} -tool._outerHeight(_337); -var _338=_32f(_332.find("ul.tabs")); -var _339=_332.width()-tool._outerWidth(); -if(_338>_339){ -_333.add(_334).show()._outerHeight(_337); -if(opts.toolPosition=="left"){ -tool.css({left:_333.outerWidth(),right:""}); -wrap.css({marginLeft:_333.outerWidth()+tool._outerWidth(),marginRight:_334._outerWidth(),width:_339-_333.outerWidth()-_334.outerWidth()}); -}else{ -tool.css({left:"",right:_334.outerWidth()}); -wrap.css({marginLeft:_333.outerWidth(),marginRight:_334.outerWidth()+tool._outerWidth(),width:_339-_333.outerWidth()-_334.outerWidth()}); -} -}else{ -_333.add(_334).hide(); -if(opts.toolPosition=="left"){ -tool.css({left:0,right:""}); -wrap.css({marginLeft:tool._outerWidth(),marginRight:0,width:_339}); -}else{ -tool.css({left:"",right:0}); -wrap.css({marginLeft:0,marginRight:tool._outerWidth(),width:_339}); -} -} -}; -function _33a(_33b){ -var opts=$.data(_33b,"tabs").options; -var _33c=$(_33b).children("div.tabs-header"); -if(opts.tools){ -if(typeof opts.tools=="string"){ -$(opts.tools).addClass("tabs-tool").appendTo(_33c); -$(opts.tools).show(); -}else{ -_33c.children("div.tabs-tool").remove(); -var _33d=$("
                                                                                                                                                    ").appendTo(_33c); -var tr=_33d.find("tr"); -for(var i=0;i").appendTo(tr); -var tool=$("").appendTo(td); -tool[0].onclick=eval(opts.tools[i].handler||function(){ -}); -tool.linkbutton($.extend({},opts.tools[i],{plain:true})); -} -} -}else{ -_33c.children("div.tabs-tool").remove(); -} -}; -function _33e(_33f,_340){ -var _341=$.data(_33f,"tabs"); -var opts=_341.options; -var cc=$(_33f); -if(!opts.doSize){ -return; -} -if(_340){ -$.extend(opts,{width:_340.width,height:_340.height}); -} -cc._size(opts); -var _342=cc.children("div.tabs-header"); -var _343=cc.children("div.tabs-panels"); -var wrap=_342.find("div.tabs-wrap"); -var ul=wrap.find(".tabs"); -ul.children("li").removeClass("tabs-first tabs-last"); -ul.children("li:first").addClass("tabs-first"); -ul.children("li:last").addClass("tabs-last"); -if(opts.tabPosition=="left"||opts.tabPosition=="right"){ -_342._outerWidth(opts.showHeader?opts.headerWidth:0); -_343._outerWidth(cc.width()-_342.outerWidth()); -_342.add(_343)._size("height",isNaN(parseInt(opts.height))?"":cc.height()); -wrap._outerWidth(_342.width()); -ul._outerWidth(wrap.width()).css("height",""); -}else{ -_342.children("div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)").css("display",opts.showHeader?"block":"none"); -_342._outerWidth(cc.width()).css("height",""); -if(opts.showHeader){ -_342.css("background-color",""); -wrap.css("height",""); -}else{ -_342.css("background-color","transparent"); -_342._outerHeight(0); -wrap._outerHeight(0); -} -ul._outerHeight(opts.tabHeight).css("width",""); -ul._outerHeight(ul.outerHeight()-ul.height()-1+opts.tabHeight).css("width",""); -_343._size("height",isNaN(parseInt(opts.height))?"":(cc.height()-_342.outerHeight())); -_343._size("width",cc.width()); -} -if(_341.tabs.length){ -var d1=ul.outerWidth(true)-ul.width(); -var li=ul.children("li:first"); -var d2=li.outerWidth(true)-li.width(); -var _344=_342.width()-_342.children(".tabs-tool:not(.tabs-tool-hidden)")._outerWidth(); -var _345=Math.floor((_344-d1-d2*_341.tabs.length)/_341.tabs.length); -$.map(_341.tabs,function(p){ -_346(p,(opts.justified&&$.inArray(opts.tabPosition,["top","bottom"])>=0)?_345:undefined); -}); -if(opts.justified&&$.inArray(opts.tabPosition,["top","bottom"])>=0){ -var _347=_344-d1-_32f(ul); -_346(_341.tabs[_341.tabs.length-1],_345+_347); -} -} -_330(_33f); -function _346(p,_348){ -var _349=p.panel("options"); -var p_t=_349.tab.find("a.tabs-inner"); -var _348=_348?_348:(parseInt(_349.tabWidth||opts.tabWidth||undefined)); -if(_348){ -p_t._outerWidth(_348); -}else{ -p_t.css("width",""); -} -p_t._outerHeight(opts.tabHeight); -p_t.css("lineHeight",p_t.height()+"px"); -p_t.find(".easyui-fluid:visible").triggerHandler("_resize"); -}; -}; -function _34a(_34b){ -var opts=$.data(_34b,"tabs").options; -var tab=_34c(_34b); -if(tab){ -var _34d=$(_34b).children("div.tabs-panels"); -var _34e=opts.width=="auto"?"auto":_34d.width(); -var _34f=opts.height=="auto"?"auto":_34d.height(); -tab.panel("resize",{width:_34e,height:_34f}); -} -}; -function _350(_351){ -var tabs=$.data(_351,"tabs").tabs; -var cc=$(_351).addClass("tabs-container"); -var _352=$("
                                                                                                                                                    ").insertBefore(cc); -cc.children("div").each(function(){ -_352[0].appendChild(this); -}); -cc[0].appendChild(_352[0]); -$("
                                                                                                                                                    "+"
                                                                                                                                                    "+"
                                                                                                                                                    "+"
                                                                                                                                                    "+"
                                                                                                                                                      "+"
                                                                                                                                                      "+"
                                                                                                                                                      ").prependTo(_351); -cc.children("div.tabs-panels").children("div").each(function(i){ -var opts=$.extend({},$.parser.parseOptions(this),{disabled:($(this).attr("disabled")?true:undefined),selected:($(this).attr("selected")?true:undefined)}); -_35f(_351,opts,$(this)); -}); -cc.children("div.tabs-header").find(".tabs-scroller-left, .tabs-scroller-right").hover(function(){ -$(this).addClass("tabs-scroller-over"); -},function(){ -$(this).removeClass("tabs-scroller-over"); -}); -cc.bind("_resize",function(e,_353){ -if($(this).hasClass("easyui-fluid")||_353){ -_33e(_351); -_34a(_351); -} -return false; -}); -}; -function _354(_355){ -var _356=$.data(_355,"tabs"); -var opts=_356.options; -$(_355).children("div.tabs-header").unbind().bind("click",function(e){ -if($(e.target).hasClass("tabs-scroller-left")){ -$(_355).tabs("scrollBy",-opts.scrollIncrement); -}else{ -if($(e.target).hasClass("tabs-scroller-right")){ -$(_355).tabs("scrollBy",opts.scrollIncrement); -}else{ -var li=$(e.target).closest("li"); -if(li.hasClass("tabs-disabled")){ -return false; -} -var a=$(e.target).closest("a.tabs-close"); -if(a.length){ -_379(_355,_357(li)); -}else{ -if(li.length){ -var _358=_357(li); -var _359=_356.tabs[_358].panel("options"); -if(_359.collapsible){ -_359.closed?_370(_355,_358):_390(_355,_358); -}else{ -_370(_355,_358); -} -} -} -return false; -} -} -}).bind("contextmenu",function(e){ -var li=$(e.target).closest("li"); -if(li.hasClass("tabs-disabled")){ -return; -} -if(li.length){ -opts.onContextMenu.call(_355,e,li.find("span.tabs-title").html(),_357(li)); -} -}); -function _357(li){ -var _35a=0; -li.parent().children("li").each(function(i){ -if(li[0]==this){ -_35a=i; -return false; -} -}); -return _35a; -}; -}; -function _35b(_35c){ -var opts=$.data(_35c,"tabs").options; -var _35d=$(_35c).children("div.tabs-header"); -var _35e=$(_35c).children("div.tabs-panels"); -_35d.removeClass("tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right"); -_35e.removeClass("tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right"); -if(opts.tabPosition=="top"){ -_35d.insertBefore(_35e); -}else{ -if(opts.tabPosition=="bottom"){ -_35d.insertAfter(_35e); -_35d.addClass("tabs-header-bottom"); -_35e.addClass("tabs-panels-top"); -}else{ -if(opts.tabPosition=="left"){ -_35d.addClass("tabs-header-left"); -_35e.addClass("tabs-panels-right"); -}else{ -if(opts.tabPosition=="right"){ -_35d.addClass("tabs-header-right"); -_35e.addClass("tabs-panels-left"); -} -} -} -} -if(opts.plain==true){ -_35d.addClass("tabs-header-plain"); -}else{ -_35d.removeClass("tabs-header-plain"); -} -_35d.removeClass("tabs-header-narrow").addClass(opts.narrow?"tabs-header-narrow":""); -var tabs=_35d.find(".tabs"); -tabs.removeClass("tabs-pill").addClass(opts.pill?"tabs-pill":""); -tabs.removeClass("tabs-narrow").addClass(opts.narrow?"tabs-narrow":""); -tabs.removeClass("tabs-justified").addClass(opts.justified?"tabs-justified":""); -if(opts.border==true){ -_35d.removeClass("tabs-header-noborder"); -_35e.removeClass("tabs-panels-noborder"); -}else{ -_35d.addClass("tabs-header-noborder"); -_35e.addClass("tabs-panels-noborder"); -} -opts.doSize=true; -}; -function _35f(_360,_361,pp){ -_361=_361||{}; -var _362=$.data(_360,"tabs"); -var tabs=_362.tabs; -if(_361.index==undefined||_361.index>tabs.length){ -_361.index=tabs.length; -} -if(_361.index<0){ -_361.index=0; -} -var ul=$(_360).children("div.tabs-header").find("ul.tabs"); -var _363=$(_360).children("div.tabs-panels"); -var tab=$("
                                                                                                                                                    • "+""+""+""+""+"
                                                                                                                                                    • "); -if(!pp){ -pp=$("
                                                                                                                                                      "); -} -if(_361.index>=tabs.length){ -tab.appendTo(ul); -pp.appendTo(_363); -tabs.push(pp); -}else{ -tab.insertBefore(ul.children("li:eq("+_361.index+")")); -pp.insertBefore(_363.children("div.panel:eq("+_361.index+")")); -tabs.splice(_361.index,0,pp); -} -pp.panel($.extend({},_361,{tab:tab,border:false,noheader:true,closed:true,doSize:false,iconCls:(_361.icon?_361.icon:undefined),onLoad:function(){ -if(_361.onLoad){ -_361.onLoad.apply(this,arguments); -} -_362.options.onLoad.call(_360,$(this)); -},onBeforeOpen:function(){ -if(_361.onBeforeOpen){ -if(_361.onBeforeOpen.call(this)==false){ -return false; -} -} -var p=$(_360).tabs("getSelected"); -if(p){ -if(p[0]!=this){ -$(_360).tabs("unselect",_36b(_360,p)); -p=$(_360).tabs("getSelected"); -if(p){ -return false; -} -}else{ -_34a(_360); -return false; -} -} -var _364=$(this).panel("options"); -_364.tab.addClass("tabs-selected"); -var wrap=$(_360).find(">div.tabs-header>div.tabs-wrap"); -var left=_364.tab.position().left; -var _365=left+_364.tab.outerWidth(); -if(left<0||_365>wrap.width()){ -var _366=left-(wrap.width()-_364.tab.width())/2; -$(_360).tabs("scrollBy",_366); -}else{ -$(_360).tabs("scrollBy",0); -} -var _367=$(this).panel("panel"); -_367.css("display","block"); -_34a(_360); -_367.css("display","none"); -},onOpen:function(){ -if(_361.onOpen){ -_361.onOpen.call(this); -} -var _368=$(this).panel("options"); -var _369=_36b(_360,this); -_362.selectHis.push(_369); -_362.options.onSelect.call(_360,_368.title,_369); -},onBeforeClose:function(){ -if(_361.onBeforeClose){ -if(_361.onBeforeClose.call(this)==false){ -return false; -} -} -$(this).panel("options").tab.removeClass("tabs-selected"); -},onClose:function(){ -if(_361.onClose){ -_361.onClose.call(this); -} -var _36a=$(this).panel("options"); -_362.options.onUnselect.call(_360,_36a.title,_36b(_360,this)); -}})); -$(_360).tabs("update",{tab:pp,options:pp.panel("options"),type:"header"}); -}; -function _36c(_36d,_36e){ -var _36f=$.data(_36d,"tabs"); -var opts=_36f.options; -if(_36e.selected==undefined){ -_36e.selected=true; -} -_35f(_36d,_36e); -opts.onAdd.call(_36d,_36e.title,_36e.index); -if(_36e.selected){ -_370(_36d,_36e.index); -} -}; -function _371(_372,_373){ -_373.type=_373.type||"all"; -var _374=$.data(_372,"tabs").selectHis; -var pp=_373.tab; -var opts=pp.panel("options"); -var _375=opts.title; -$.extend(opts,_373.options,{iconCls:(_373.options.icon?_373.options.icon:undefined)}); -if(_373.type=="all"||_373.type=="body"){ -pp.panel(); -} -if(_373.type=="all"||_373.type=="header"){ -var tab=opts.tab; -if(opts.header){ -tab.find(".tabs-inner").html($(opts.header)); -}else{ -var _376=tab.find("span.tabs-title"); -var _377=tab.find("span.tabs-icon"); -_376.html(opts.title); -_377.attr("class","tabs-icon"); -tab.find("a.tabs-close").remove(); -if(opts.closable){ -_376.addClass("tabs-closable"); -$("").appendTo(tab); -}else{ -_376.removeClass("tabs-closable"); -} -if(opts.iconCls){ -_376.addClass("tabs-with-icon"); -_377.addClass(opts.iconCls); -}else{ -_376.removeClass("tabs-with-icon"); -} -if(opts.tools){ -var _378=tab.find("span.tabs-p-tool"); -if(!_378.length){ -var _378=$("").insertAfter(tab.find("a.tabs-inner")); -} -if($.isArray(opts.tools)){ -_378.empty(); -for(var i=0;i").appendTo(_378); -t.addClass(opts.tools[i].iconCls); -if(opts.tools[i].handler){ -t.bind("click",{handler:opts.tools[i].handler},function(e){ -if($(this).parents("li").hasClass("tabs-disabled")){ -return; -} -e.data.handler.call(this); -}); -} -} -}else{ -$(opts.tools).children().appendTo(_378); -} -var pr=_378.children().length*12; -if(opts.closable){ -pr+=8; -_378.css("right",""); -}else{ -pr-=3; -_378.css("right","5px"); -} -_376.css("padding-right",pr+"px"); -}else{ -tab.find("span.tabs-p-tool").remove(); -_376.css("padding-right",""); -} -} -} -if(opts.disabled){ -opts.tab.addClass("tabs-disabled"); -}else{ -opts.tab.removeClass("tabs-disabled"); -} -_33e(_372); -$.data(_372,"tabs").options.onUpdate.call(_372,opts.title,_36b(_372,pp)); -}; -function _379(_37a,_37b){ -var _37c=$.data(_37a,"tabs"); -var opts=_37c.options; -var tabs=_37c.tabs; -var _37d=_37c.selectHis; -if(!_37e(_37a,_37b)){ -return; -} -var tab=_37f(_37a,_37b); -var _380=tab.panel("options").title; -var _381=_36b(_37a,tab); -if(opts.onBeforeClose.call(_37a,_380,_381)==false){ -return; -} -var tab=_37f(_37a,_37b,true); -tab.panel("options").tab.remove(); -tab.panel("destroy"); -opts.onClose.call(_37a,_380,_381); -_33e(_37a); -var his=[]; -for(var i=0;i<_37d.length;i++){ -var _382=_37d[i]; -if(_382!=_381){ -his.push(_382>_381?_382-1:_382); -} -} -_37c.selectHis=his; -var _383=$(_37a).tabs("getSelected"); -if(!_383&&his.length){ -_381=_37c.selectHis.pop(); -$(_37a).tabs("select",_381); -} -}; -function _37f(_384,_385,_386){ -var tabs=$.data(_384,"tabs").tabs; -var tab=null; -if(typeof _385=="number"){ -if(_385>=0&&_385"); -for(var i=0;i.tabs-header>.tabs-tool"); -if(_39b){ -tool.removeClass("tabs-tool-hidden").show(); -}else{ -tool.addClass("tabs-tool-hidden").hide(); -} -$(_39a).tabs("resize").tabs("scrollBy",0); -}; -$.fn.tabs=function(_39c,_39d){ -if(typeof _39c=="string"){ -return $.fn.tabs.methods[_39c](this,_39d); -} -_39c=_39c||{}; -return this.each(function(){ -var _39e=$.data(this,"tabs"); -if(_39e){ -$.extend(_39e.options,_39c); -}else{ -$.data(this,"tabs",{options:$.extend({},$.fn.tabs.defaults,$.fn.tabs.parseOptions(this),_39c),tabs:[],selectHis:[]}); -_350(this); -} -_33a(this); -_35b(this); -_33e(this); -_354(this); -_38a(this); -}); -}; -$.fn.tabs.methods={options:function(jq){ -var cc=jq[0]; -var opts=$.data(cc,"tabs").options; -var s=_34c(cc); -opts.selected=s?_36b(cc,s):-1; -return opts; -},tabs:function(jq){ -return $.data(jq[0],"tabs").tabs; -},resize:function(jq,_39f){ -return jq.each(function(){ -_33e(this,_39f); -_34a(this); -}); -},add:function(jq,_3a0){ -return jq.each(function(){ -_36c(this,_3a0); -}); -},close:function(jq,_3a1){ -return jq.each(function(){ -_379(this,_3a1); -}); -},getTab:function(jq,_3a2){ -return _37f(jq[0],_3a2); -},getTabIndex:function(jq,tab){ -return _36b(jq[0],tab); -},getSelected:function(jq){ -return _34c(jq[0]); -},select:function(jq,_3a3){ -return jq.each(function(){ -_370(this,_3a3); -}); -},unselect:function(jq,_3a4){ -return jq.each(function(){ -_390(this,_3a4); -}); -},exists:function(jq,_3a5){ -return _37e(jq[0],_3a5); -},update:function(jq,_3a6){ -return jq.each(function(){ -_371(this,_3a6); -}); -},enableTab:function(jq,_3a7){ -return jq.each(function(){ -var opts=$(this).tabs("getTab",_3a7).panel("options"); -opts.tab.removeClass("tabs-disabled"); -opts.disabled=false; -}); -},disableTab:function(jq,_3a8){ -return jq.each(function(){ -var opts=$(this).tabs("getTab",_3a8).panel("options"); -opts.tab.addClass("tabs-disabled"); -opts.disabled=true; -}); -},showHeader:function(jq){ -return jq.each(function(){ -_396(this,true); -}); -},hideHeader:function(jq){ -return jq.each(function(){ -_396(this,false); -}); -},showTool:function(jq){ -return jq.each(function(){ -_399(this,true); -}); -},hideTool:function(jq){ -return jq.each(function(){ -_399(this,false); -}); -},scrollBy:function(jq,_3a9){ -return jq.each(function(){ -var opts=$(this).tabs("options"); -var wrap=$(this).find(">div.tabs-header>div.tabs-wrap"); -var pos=Math.min(wrap._scrollLeft()+_3a9,_3aa()); -wrap.animate({scrollLeft:pos},opts.scrollDuration); -function _3aa(){ -var w=0; -var ul=wrap.children("ul"); -ul.children("li").each(function(){ -w+=$(this).outerWidth(true); -}); -return w-wrap.width()+(ul.outerWidth()-ul.width()); -}; -}); -}}; -$.fn.tabs.parseOptions=function(_3ab){ -return $.extend({},$.parser.parseOptions(_3ab,["tools","toolPosition","tabPosition",{fit:"boolean",border:"boolean",plain:"boolean"},{headerWidth:"number",tabWidth:"number",tabHeight:"number",selected:"number"},{showHeader:"boolean",justified:"boolean",narrow:"boolean",pill:"boolean"}])); -}; -$.fn.tabs.defaults={width:"auto",height:"auto",headerWidth:150,tabWidth:"auto",tabHeight:32,selected:0,showHeader:true,plain:false,fit:false,border:true,justified:false,narrow:false,pill:false,tools:null,toolPosition:"right",tabPosition:"top",scrollIncrement:100,scrollDuration:400,onLoad:function(_3ac){ -},onSelect:function(_3ad,_3ae){ -},onUnselect:function(_3af,_3b0){ -},onBeforeClose:function(_3b1,_3b2){ -},onClose:function(_3b3,_3b4){ -},onAdd:function(_3b5,_3b6){ -},onUpdate:function(_3b7,_3b8){ -},onContextMenu:function(e,_3b9,_3ba){ -}}; -})(jQuery); -(function($){ -var _3bb=false; -function _3bc(_3bd,_3be){ -var _3bf=$.data(_3bd,"layout"); -var opts=_3bf.options; -var _3c0=_3bf.panels; -var cc=$(_3bd); -if(_3be){ -$.extend(opts,{width:_3be.width,height:_3be.height}); -} -if(_3bd.tagName.toLowerCase()=="body"){ -cc._size("fit"); -}else{ -cc._size(opts); -} -var cpos={top:0,left:0,width:cc.width(),height:cc.height()}; -_3c1(_3c2(_3c0.expandNorth)?_3c0.expandNorth:_3c0.north,"n"); -_3c1(_3c2(_3c0.expandSouth)?_3c0.expandSouth:_3c0.south,"s"); -_3c3(_3c2(_3c0.expandEast)?_3c0.expandEast:_3c0.east,"e"); -_3c3(_3c2(_3c0.expandWest)?_3c0.expandWest:_3c0.west,"w"); -_3c0.center.panel("resize",cpos); -function _3c1(pp,type){ -if(!pp.length||!_3c2(pp)){ -return; -} -var opts=pp.panel("options"); -pp.panel("resize",{width:cc.width(),height:opts.height}); -var _3c4=pp.panel("panel").outerHeight(); -pp.panel("move",{left:0,top:(type=="n"?0:cc.height()-_3c4)}); -cpos.height-=_3c4; -if(type=="n"){ -cpos.top+=_3c4; -if(!opts.split&&opts.border){ -cpos.top--; -} -} -if(!opts.split&&opts.border){ -cpos.height++; -} -}; -function _3c3(pp,type){ -if(!pp.length||!_3c2(pp)){ -return; -} -var opts=pp.panel("options"); -pp.panel("resize",{width:opts.width,height:cpos.height}); -var _3c5=pp.panel("panel").outerWidth(); -pp.panel("move",{left:(type=="e"?cc.width()-_3c5:0),top:cpos.top}); -cpos.width-=_3c5; -if(type=="w"){ -cpos.left+=_3c5; -if(!opts.split&&opts.border){ -cpos.left--; -} -} -if(!opts.split&&opts.border){ -cpos.width++; -} -}; -}; -function init(_3c6){ -var cc=$(_3c6); -cc.addClass("layout"); -function _3c7(el){ -var _3c8=$.fn.layout.parsePanelOptions(el); -if("north,south,east,west,center".indexOf(_3c8.region)>=0){ -_3cb(_3c6,_3c8,el); -} -}; -var opts=cc.layout("options"); -var _3c9=opts.onAdd; -opts.onAdd=function(){ -}; -cc.find(">div,>form>div").each(function(){ -_3c7(this); -}); -opts.onAdd=_3c9; -cc.append("
                                                                                                                                                      "); -cc.bind("_resize",function(e,_3ca){ -if($(this).hasClass("easyui-fluid")||_3ca){ -_3bc(_3c6); -} -return false; -}); -}; -function _3cb(_3cc,_3cd,el){ -_3cd.region=_3cd.region||"center"; -var _3ce=$.data(_3cc,"layout").panels; -var cc=$(_3cc); -var dir=_3cd.region; -if(_3ce[dir].length){ -return; -} -var pp=$(el); -if(!pp.length){ -pp=$("
                                                                                                                                                      ").appendTo(cc); -} -var _3cf=$.extend({},$.fn.layout.paneldefaults,{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),doSize:false,collapsible:true,onOpen:function(){ -var tool=$(this).panel("header").children("div.panel-tool"); -tool.children("a.panel-tool-collapse").hide(); -var _3d0={north:"up",south:"down",east:"right",west:"left"}; -if(!_3d0[dir]){ -return; -} -var _3d1="layout-button-"+_3d0[dir]; -var t=tool.children("a."+_3d1); -if(!t.length){ -t=$("").addClass(_3d1).appendTo(tool); -t.bind("click",{dir:dir},function(e){ -_3e8(_3cc,e.data.dir); -return false; -}); -} -$(this).panel("options").collapsible?t.show():t.hide(); -}},_3cd,{cls:((_3cd.cls||"")+" layout-panel layout-panel-"+dir),bodyCls:((_3cd.bodyCls||"")+" layout-body")}); -pp.panel(_3cf); -_3ce[dir]=pp; -var _3d2={north:"s",south:"n",east:"w",west:"e"}; -var _3d3=pp.panel("panel"); -if(pp.panel("options").split){ -_3d3.addClass("layout-split-"+dir); -} -_3d3.resizable($.extend({},{handles:(_3d2[dir]||""),disabled:(!pp.panel("options").split),onStartResize:function(e){ -_3bb=true; -if(dir=="north"||dir=="south"){ -var _3d4=$(">div.layout-split-proxy-v",_3cc); -}else{ -var _3d4=$(">div.layout-split-proxy-h",_3cc); -} -var top=0,left=0,_3d5=0,_3d6=0; -var pos={display:"block"}; -if(dir=="north"){ -pos.top=parseInt(_3d3.css("top"))+_3d3.outerHeight()-_3d4.height(); -pos.left=parseInt(_3d3.css("left")); -pos.width=_3d3.outerWidth(); -pos.height=_3d4.height(); -}else{ -if(dir=="south"){ -pos.top=parseInt(_3d3.css("top")); -pos.left=parseInt(_3d3.css("left")); -pos.width=_3d3.outerWidth(); -pos.height=_3d4.height(); -}else{ -if(dir=="east"){ -pos.top=parseInt(_3d3.css("top"))||0; -pos.left=parseInt(_3d3.css("left"))||0; -pos.width=_3d4.width(); -pos.height=_3d3.outerHeight(); -}else{ -if(dir=="west"){ -pos.top=parseInt(_3d3.css("top"))||0; -pos.left=_3d3.outerWidth()-_3d4.width(); -pos.width=_3d4.width(); -pos.height=_3d3.outerHeight(); -} -} -} -} -_3d4.css(pos); -$("
                                                                                                                                                      ").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc); -},onResize:function(e){ -if(dir=="north"||dir=="south"){ -var _3d7=_3d8(this); -$(this).resizable("options").maxHeight=_3d7; -var _3d9=$(">div.layout-split-proxy-v",_3cc); -var top=dir=="north"?e.data.height-_3d9.height():$(_3cc).height()-e.data.height; -_3d9.css("top",top); -}else{ -var _3da=_3d8(this); -$(this).resizable("options").maxWidth=_3da; -var _3d9=$(">div.layout-split-proxy-h",_3cc); -var left=dir=="west"?e.data.width-_3d9.width():$(_3cc).width()-e.data.width; -_3d9.css("left",left); -} -return false; -},onStopResize:function(e){ -cc.children("div.layout-split-proxy-v,div.layout-split-proxy-h").hide(); -pp.panel("resize",e.data); -_3bc(_3cc); -_3bb=false; -cc.find(">div.layout-mask").remove(); -}},_3cd)); -cc.layout("options").onAdd.call(_3cc,dir); -function _3d8(p){ -var _3db="expand"+dir.substring(0,1).toUpperCase()+dir.substring(1); -var _3dc=_3ce["center"]; -var _3dd=(dir=="north"||dir=="south")?"minHeight":"minWidth"; -var _3de=(dir=="north"||dir=="south")?"maxHeight":"maxWidth"; -var _3df=(dir=="north"||dir=="south")?"_outerHeight":"_outerWidth"; -var _3e0=$.parser.parseValue(_3de,_3ce[dir].panel("options")[_3de],$(_3cc)); -var _3e1=$.parser.parseValue(_3dd,_3dc.panel("options")[_3dd],$(_3cc)); -var _3e2=_3dc.panel("panel")[_3df]()-_3e1; -if(_3c2(_3ce[_3db])){ -_3e2+=_3ce[_3db][_3df]()-1; -}else{ -_3e2+=$(p)[_3df](); -} -if(_3e2>_3e0){ -_3e2=_3e0; -} -return _3e2; -}; -}; -function _3e3(_3e4,_3e5){ -var _3e6=$.data(_3e4,"layout").panels; -if(_3e6[_3e5].length){ -_3e6[_3e5].panel("destroy"); -_3e6[_3e5]=$(); -var _3e7="expand"+_3e5.substring(0,1).toUpperCase()+_3e5.substring(1); -if(_3e6[_3e7]){ -_3e6[_3e7].panel("destroy"); -_3e6[_3e7]=undefined; -} -$(_3e4).layout("options").onRemove.call(_3e4,_3e5); -} -}; -function _3e8(_3e9,_3ea,_3eb){ -if(_3eb==undefined){ -_3eb="normal"; -} -var _3ec=$.data(_3e9,"layout").panels; -var p=_3ec[_3ea]; -var _3ed=p.panel("options"); -if(_3ed.onBeforeCollapse.call(p)==false){ -return; -} -var _3ee="expand"+_3ea.substring(0,1).toUpperCase()+_3ea.substring(1); -if(!_3ec[_3ee]){ -_3ec[_3ee]=_3ef(_3ea); -var ep=_3ec[_3ee].panel("panel"); -if(!_3ed.expandMode){ -ep.css("cursor","default"); -}else{ -ep.bind("click",function(){ -if(_3ed.expandMode=="dock"){ -_3fb(_3e9,_3ea); -}else{ -p.panel("expand",false).panel("open"); -var _3f0=_3f1(); -p.panel("resize",_3f0.collapse); -p.panel("panel").unbind(".layout").bind("mouseleave.layout",{region:_3ea},function(e){ -$(this).stop(true,true); -if(_3bb==true){ -return; -} -if($("body>div.combo-p>div.combo-panel:visible").length){ -return; -} -_3e8(_3e9,e.data.region); -}); -p.panel("panel").animate(_3f0.expand,function(){ -$(_3e9).layout("options").onExpand.call(_3e9,_3ea); -}); -} -return false; -}); -} -} -var _3f2=_3f1(); -if(!_3c2(_3ec[_3ee])){ -_3ec.center.panel("resize",_3f2.resizeC); -} -p.panel("panel").animate(_3f2.collapse,_3eb,function(){ -p.panel("collapse",false).panel("close"); -_3ec[_3ee].panel("open").panel("resize",_3f2.expandP); -$(this).unbind(".layout"); -$(_3e9).layout("options").onCollapse.call(_3e9,_3ea); -}); -function _3ef(dir){ -var _3f3={"east":"left","west":"right","north":"down","south":"up"}; -var isns=(_3ed.region=="north"||_3ed.region=="south"); -var icon="layout-button-"+_3f3[dir]; -var p=$("
                                                                                                                                                      ").appendTo(_3e9); -p.panel($.extend({},$.fn.layout.paneldefaults,{cls:("layout-expand layout-expand-"+dir),title:" ",titleDirection:_3ed.titleDirection,iconCls:(_3ed.hideCollapsedContent?null:_3ed.iconCls),closed:true,minWidth:0,minHeight:0,doSize:false,region:_3ed.region,collapsedSize:_3ed.collapsedSize,noheader:(!isns&&_3ed.hideExpandTool),tools:((isns&&_3ed.hideExpandTool)?null:[{iconCls:icon,handler:function(){ -_3fb(_3e9,_3ea); -return false; -}}]),onResize:function(){ -var _3f4=$(this).children(".layout-expand-title"); -if(_3f4.length){ -_3f4._outerWidth($(this).height()); -var left=($(this).width()-Math.min(_3f4._outerWidth(),_3f4._outerHeight()))/2; -var top=Math.max(_3f4._outerWidth(),_3f4._outerHeight()); -if(_3f4.hasClass("layout-expand-title-down")){ -left+=Math.min(_3f4._outerWidth(),_3f4._outerHeight()); -top=0; -} -_3f4.css({left:(left+"px"),top:(top+"px")}); -} -}})); -if(!_3ed.hideCollapsedContent){ -var _3f5=typeof _3ed.collapsedContent=="function"?_3ed.collapsedContent.call(p[0],_3ed.title):_3ed.collapsedContent; -isns?p.panel("setTitle",_3f5):p.html(_3f5); -} -p.panel("panel").hover(function(){ -$(this).addClass("layout-expand-over"); -},function(){ -$(this).removeClass("layout-expand-over"); -}); -return p; -}; -function _3f1(){ -var cc=$(_3e9); -var _3f6=_3ec.center.panel("options"); -var _3f7=_3ed.collapsedSize; -if(_3ea=="east"){ -var _3f8=p.panel("panel")._outerWidth(); -var _3f9=_3f6.width+_3f8-_3f7; -if(_3ed.split||!_3ed.border){ -_3f9++; -} -return {resizeC:{width:_3f9},expand:{left:cc.width()-_3f8},expandP:{top:_3f6.top,left:cc.width()-_3f7,width:_3f7,height:_3f6.height},collapse:{left:cc.width(),top:_3f6.top,height:_3f6.height}}; -}else{ -if(_3ea=="west"){ -var _3f8=p.panel("panel")._outerWidth(); -var _3f9=_3f6.width+_3f8-_3f7; -if(_3ed.split||!_3ed.border){ -_3f9++; -} -return {resizeC:{width:_3f9,left:_3f7-1},expand:{left:0},expandP:{left:0,top:_3f6.top,width:_3f7,height:_3f6.height},collapse:{left:-_3f8,top:_3f6.top,height:_3f6.height}}; -}else{ -if(_3ea=="north"){ -var _3fa=p.panel("panel")._outerHeight(); -var hh=_3f6.height; -if(!_3c2(_3ec.expandNorth)){ -hh+=_3fa-_3f7+((_3ed.split||!_3ed.border)?1:0); -} -_3ec.east.add(_3ec.west).add(_3ec.expandEast).add(_3ec.expandWest).panel("resize",{top:_3f7-1,height:hh}); -return {resizeC:{top:_3f7-1,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:_3f7},collapse:{top:-_3fa,width:cc.width()}}; -}else{ -if(_3ea=="south"){ -var _3fa=p.panel("panel")._outerHeight(); -var hh=_3f6.height; -if(!_3c2(_3ec.expandSouth)){ -hh+=_3fa-_3f7+((_3ed.split||!_3ed.border)?1:0); -} -_3ec.east.add(_3ec.west).add(_3ec.expandEast).add(_3ec.expandWest).panel("resize",{height:hh}); -return {resizeC:{height:hh},expand:{top:cc.height()-_3fa},expandP:{top:cc.height()-_3f7,left:0,width:cc.width(),height:_3f7},collapse:{top:cc.height(),width:cc.width()}}; -} -} -} -} -}; -}; -function _3fb(_3fc,_3fd){ -var _3fe=$.data(_3fc,"layout").panels; -var p=_3fe[_3fd]; -var _3ff=p.panel("options"); -if(_3ff.onBeforeExpand.call(p)==false){ -return; -} -var _400="expand"+_3fd.substring(0,1).toUpperCase()+_3fd.substring(1); -if(_3fe[_400]){ -_3fe[_400].panel("close"); -p.panel("panel").stop(true,true); -p.panel("expand",false).panel("open"); -var _401=_402(); -p.panel("resize",_401.collapse); -p.panel("panel").animate(_401.expand,function(){ -_3bc(_3fc); -$(_3fc).layout("options").onExpand.call(_3fc,_3fd); -}); -} -function _402(){ -var cc=$(_3fc); -var _403=_3fe.center.panel("options"); -if(_3fd=="east"&&_3fe.expandEast){ -return {collapse:{left:cc.width(),top:_403.top,height:_403.height},expand:{left:cc.width()-p.panel("panel")._outerWidth()}}; -}else{ -if(_3fd=="west"&&_3fe.expandWest){ -return {collapse:{left:-p.panel("panel")._outerWidth(),top:_403.top,height:_403.height},expand:{left:0}}; -}else{ -if(_3fd=="north"&&_3fe.expandNorth){ -return {collapse:{top:-p.panel("panel")._outerHeight(),width:cc.width()},expand:{top:0}}; -}else{ -if(_3fd=="south"&&_3fe.expandSouth){ -return {collapse:{top:cc.height(),width:cc.width()},expand:{top:cc.height()-p.panel("panel")._outerHeight()}}; -} -} -} -} -}; -}; -function _3c2(pp){ -if(!pp){ -return false; -} -if(pp.length){ -return pp.panel("panel").is(":visible"); -}else{ -return false; -} -}; -function _404(_405){ -var _406=$.data(_405,"layout"); -var opts=_406.options; -var _407=_406.panels; -var _408=opts.onCollapse; -opts.onCollapse=function(){ -}; -_409("east"); -_409("west"); -_409("north"); -_409("south"); -opts.onCollapse=_408; -function _409(_40a){ -var p=_407[_40a]; -if(p.length&&p.panel("options").collapsed){ -_3e8(_405,_40a,0); -} -}; -}; -function _40b(_40c,_40d,_40e){ -var p=$(_40c).layout("panel",_40d); -p.panel("options").split=_40e; -var cls="layout-split-"+_40d; -var _40f=p.panel("panel").removeClass(cls); -if(_40e){ -_40f.addClass(cls); -} -_40f.resizable({disabled:(!_40e)}); -_3bc(_40c); -}; -$.fn.layout=function(_410,_411){ -if(typeof _410=="string"){ -return $.fn.layout.methods[_410](this,_411); -} -_410=_410||{}; -return this.each(function(){ -var _412=$.data(this,"layout"); -if(_412){ -$.extend(_412.options,_410); -}else{ -var opts=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_410); -$.data(this,"layout",{options:opts,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}}); -init(this); -} -_3bc(this); -_404(this); -}); -}; -$.fn.layout.methods={options:function(jq){ -return $.data(jq[0],"layout").options; -},resize:function(jq,_413){ -return jq.each(function(){ -_3bc(this,_413); -}); -},panel:function(jq,_414){ -return $.data(jq[0],"layout").panels[_414]; -},collapse:function(jq,_415){ -return jq.each(function(){ -_3e8(this,_415); -}); -},expand:function(jq,_416){ -return jq.each(function(){ -_3fb(this,_416); -}); -},add:function(jq,_417){ -return jq.each(function(){ -_3cb(this,_417); -_3bc(this); -if($(this).layout("panel",_417.region).panel("options").collapsed){ -_3e8(this,_417.region,0); -} -}); -},remove:function(jq,_418){ -return jq.each(function(){ -_3e3(this,_418); -_3bc(this); -}); -},split:function(jq,_419){ -return jq.each(function(){ -_40b(this,_419,true); -}); -},unsplit:function(jq,_41a){ -return jq.each(function(){ -_40b(this,_41a,false); -}); -}}; -$.fn.layout.parseOptions=function(_41b){ -return $.extend({},$.parser.parseOptions(_41b,[{fit:"boolean"}])); -}; -$.fn.layout.defaults={fit:false,onExpand:function(_41c){ -},onCollapse:function(_41d){ -},onAdd:function(_41e){ -},onRemove:function(_41f){ -}}; -$.fn.layout.parsePanelOptions=function(_420){ -var t=$(_420); -return $.extend({},$.fn.panel.parseOptions(_420),$.parser.parseOptions(_420,["region",{split:"boolean",collpasedSize:"number",minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number"}])); -}; -$.fn.layout.paneldefaults=$.extend({},$.fn.panel.defaults,{region:null,split:false,collapsedSize:28,expandMode:"float",hideExpandTool:false,hideCollapsedContent:true,collapsedContent:function(_421){ -var p=$(this); -var opts=p.panel("options"); -if(opts.region=="north"||opts.region=="south"){ -return _421; -} -var cc=[]; -if(opts.iconCls){ -cc.push("
                                                                                                                                                      "); -} -cc.push("
                                                                                                                                                      "); -cc.push(_421); -cc.push("
                                                                                                                                                      "); -return cc.join(""); -},minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000}); -})(jQuery); -(function($){ -$(function(){ -$(document).unbind(".menu").bind("mousedown.menu",function(e){ -var m=$(e.target).closest("div.menu,div.combo-p"); -if(m.length){ -return; -} -$("body>div.menu-top:visible").not(".menu-inline").menu("hide"); -_422($("body>div.menu:visible").not(".menu-inline")); -}); -}); -function init(_423){ -var opts=$.data(_423,"menu").options; -$(_423).addClass("menu-top"); -opts.inline?$(_423).addClass("menu-inline"):$(_423).appendTo("body"); -$(_423).bind("_resize",function(e,_424){ -if($(this).hasClass("easyui-fluid")||_424){ -$(_423).menu("resize",_423); -} -return false; -}); -var _425=_426($(_423)); -for(var i=0;i<_425.length;i++){ -_429(_423,_425[i]); -} -function _426(menu){ -var _427=[]; -menu.addClass("menu"); -_427.push(menu); -if(!menu.hasClass("menu-content")){ -menu.children("div").each(function(){ -var _428=$(this).children("div"); -if(_428.length){ -_428.appendTo("body"); -this.submenu=_428; -var mm=_426(_428); -_427=_427.concat(mm); -} -}); -} -return _427; -}; -}; -function _429(_42a,div){ -var menu=$(div).addClass("menu"); -if(!menu.data("menu")){ -menu.data("menu",{options:$.parser.parseOptions(menu[0],["width","height"])}); -} -if(!menu.hasClass("menu-content")){ -menu.children("div").each(function(){ -_42b(_42a,this); -}); -$("
                                                                                                                                                      ").prependTo(menu); -} -_42c(_42a,menu); -if(!menu.hasClass("menu-inline")){ -menu.hide(); -} -_42d(_42a,menu); -}; -function _42b(_42e,div,_42f){ -var item=$(div); -var _430=$.extend({},$.parser.parseOptions(item[0],["id","name","iconCls","href",{separator:"boolean"}]),{disabled:(item.attr("disabled")?true:undefined),text:$.trim(item.html()),onclick:item[0].onclick},_42f||{}); -_430.onclick=_430.onclick||_430.handler||null; -item.data("menuitem",{options:_430}); -if(_430.separator){ -item.addClass("menu-sep"); -} -if(!item.hasClass("menu-sep")){ -item.addClass("menu-item"); -item.empty().append($("
                                                                                                                                                      ").html(_430.text)); -if(_430.iconCls){ -$("
                                                                                                                                                      ").addClass(_430.iconCls).appendTo(item); -} -if(_430.id){ -item.attr("id",_430.id); -} -if(_430.onclick){ -if(typeof _430.onclick=="string"){ -item.attr("onclick",_430.onclick); -}else{ -item[0].onclick=eval(_430.onclick); -} -} -if(_430.disabled){ -_431(_42e,item[0],true); -} -if(item[0].submenu){ -$("
                                                                                                                                                      ").appendTo(item); -} -} -}; -function _42c(_432,menu){ -var opts=$.data(_432,"menu").options; -var _433=menu.attr("style")||""; -var _434=menu.is(":visible"); -menu.css({display:"block",left:-10000,height:"auto",overflow:"hidden"}); -menu.find(".menu-item").each(function(){ -$(this)._outerHeight(opts.itemHeight); -$(this).find(".menu-text").css({height:(opts.itemHeight-2)+"px",lineHeight:(opts.itemHeight-2)+"px"}); -}); -menu.removeClass("menu-noline").addClass(opts.noline?"menu-noline":""); -var _435=menu.data("menu").options; -var _436=_435.width; -var _437=_435.height; -if(isNaN(parseInt(_436))){ -_436=0; -menu.find("div.menu-text").each(function(){ -if(_436<$(this).outerWidth()){ -_436=$(this).outerWidth(); -} -}); -_436=_436?_436+40:""; -} -var _438=menu.outerHeight(); -if(isNaN(parseInt(_437))){ -_437=_438; -if(menu.hasClass("menu-top")&&opts.alignTo){ -var at=$(opts.alignTo); -var h1=at.offset().top-$(document).scrollTop(); -var h2=$(window)._outerHeight()+$(document).scrollTop()-at.offset().top-at._outerHeight(); -_437=Math.min(_437,Math.max(h1,h2)); -}else{ -if(_437>$(window)._outerHeight()){ -_437=$(window).height(); -} -} -} -menu.attr("style",_433); -menu.show(); -menu._size($.extend({},_435,{width:_436,height:_437,minWidth:_435.minWidth||opts.minWidth,maxWidth:_435.maxWidth||opts.maxWidth})); -menu.find(".easyui-fluid").triggerHandler("_resize",[true]); -menu.css("overflow",menu.outerHeight()<_438?"auto":"hidden"); -menu.children("div.menu-line")._outerHeight(_438-2); -if(!_434){ -menu.hide(); -} -}; -function _42d(_439,menu){ -var _43a=$.data(_439,"menu"); -var opts=_43a.options; -menu.unbind(".menu"); -for(var _43b in opts.events){ -menu.bind(_43b+".menu",{target:_439},opts.events[_43b]); -} -}; -function _43c(e){ -var _43d=e.data.target; -var _43e=$.data(_43d,"menu"); -if(_43e.timer){ -clearTimeout(_43e.timer); -_43e.timer=null; -} -}; -function _43f(e){ -var _440=e.data.target; -var _441=$.data(_440,"menu"); -if(_441.options.hideOnUnhover){ -_441.timer=setTimeout(function(){ -_442(_440,$(_440).hasClass("menu-inline")); -},_441.options.duration); -} -}; -function _443(e){ -var _444=e.data.target; -var item=$(e.target).closest(".menu-item"); -if(item.length){ -item.siblings().each(function(){ -if(this.submenu){ -_422(this.submenu); -} -$(this).removeClass("menu-active"); -}); -item.addClass("menu-active"); -if(item.hasClass("menu-item-disabled")){ -item.addClass("menu-active-disabled"); -return; -} -var _445=item[0].submenu; -if(_445){ -$(_444).menu("show",{menu:_445,parent:item}); -} -} -}; -function _446(e){ -var item=$(e.target).closest(".menu-item"); -if(item.length){ -item.removeClass("menu-active menu-active-disabled"); -var _447=item[0].submenu; -if(_447){ -if(e.pageX>=parseInt(_447.css("left"))){ -item.addClass("menu-active"); -}else{ -_422(_447); -} -}else{ -item.removeClass("menu-active"); -} -} -}; -function _448(e){ -var _449=e.data.target; -var item=$(e.target).closest(".menu-item"); -if(item.length){ -var opts=$(_449).data("menu").options; -var _44a=item.data("menuitem").options; -if(_44a.disabled){ -return; -} -if(!item[0].submenu){ -_442(_449,opts.inline); -if(_44a.href){ -location.href=_44a.href; -} -} -item.trigger("mouseenter"); -opts.onClick.call(_449,$(_449).menu("getItem",item[0])); -} -}; -function _442(_44b,_44c){ -var _44d=$.data(_44b,"menu"); -if(_44d){ -if($(_44b).is(":visible")){ -_422($(_44b)); -if(_44c){ -$(_44b).show(); -}else{ -_44d.options.onHide.call(_44b); -} -} -} -return false; -}; -function _44e(_44f,_450){ -_450=_450||{}; -var left,top; -var opts=$.data(_44f,"menu").options; -var menu=$(_450.menu||_44f); -$(_44f).menu("resize",menu[0]); -if(menu.hasClass("menu-top")){ -$.extend(opts,_450); -left=opts.left; -top=opts.top; -if(opts.alignTo){ -var at=$(opts.alignTo); -left=at.offset().left; -top=at.offset().top+at._outerHeight(); -if(opts.align=="right"){ -left+=at.outerWidth()-menu.outerWidth(); -} -} -if(left+menu.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ -left=$(window)._outerWidth()+$(document).scrollLeft()-menu.outerWidth()-5; -} -if(left<0){ -left=0; -} -top=_451(top,opts.alignTo); -}else{ -var _452=_450.parent; -left=_452.offset().left+_452.outerWidth()-2; -if(left+menu.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){ -left=_452.offset().left-menu.outerWidth()+2; -} -top=_451(_452.offset().top-3); -} -function _451(top,_453){ -if(top+menu.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ -if(_453){ -top=$(_453).offset().top-menu._outerHeight(); -}else{ -top=$(window)._outerHeight()+$(document).scrollTop()-menu.outerHeight(); -} -} -if(top<0){ -top=0; -} -return top; -}; -menu.css(opts.position.call(_44f,menu[0],left,top)); -menu.show(0,function(){ -if(!menu[0].shadow){ -menu[0].shadow=$("
                                                                                                                                                      ").insertAfter(menu); -} -menu[0].shadow.css({display:(menu.hasClass("menu-inline")?"none":"block"),zIndex:$.fn.menu.defaults.zIndex++,left:menu.css("left"),top:menu.css("top"),width:menu.outerWidth(),height:menu.outerHeight()}); -menu.css("z-index",$.fn.menu.defaults.zIndex++); -if(menu.hasClass("menu-top")){ -opts.onShow.call(_44f); -} -}); -}; -function _422(menu){ -if(menu&&menu.length){ -_454(menu); -menu.find("div.menu-item").each(function(){ -if(this.submenu){ -_422(this.submenu); -} -$(this).removeClass("menu-active"); -}); -} -function _454(m){ -m.stop(true,true); -if(m[0].shadow){ -m[0].shadow.hide(); -} -m.hide(); -}; -}; -function _455(_456,_457){ -var _458=null; -var fn=$.isFunction(_457)?_457:function(item){ -for(var p in _457){ -if(item[p]!=_457[p]){ -return false; -} -} -return true; -}; -function find(menu){ -menu.children("div.menu-item").each(function(){ -var opts=$(this).data("menuitem").options; -if(fn.call(_456,opts)==true){ -_458=$(_456).menu("getItem",this); -}else{ -if(this.submenu&&!_458){ -find(this.submenu); -} -} -}); -}; -find($(_456)); -return _458; -}; -function _431(_459,_45a,_45b){ -var t=$(_45a); -if(t.hasClass("menu-item")){ -var opts=t.data("menuitem").options; -opts.disabled=_45b; -if(_45b){ -t.addClass("menu-item-disabled"); -t[0].onclick=null; -}else{ -t.removeClass("menu-item-disabled"); -t[0].onclick=opts.onclick; -} -} -}; -function _45c(_45d,_45e){ -var opts=$.data(_45d,"menu").options; -var menu=$(_45d); -if(_45e.parent){ -if(!_45e.parent.submenu){ -var _45f=$("
                                                                                                                                                      ").appendTo("body"); -_45e.parent.submenu=_45f; -$("
                                                                                                                                                      ").appendTo(_45e.parent); -_429(_45d,_45f); -} -menu=_45e.parent.submenu; -} -var div=$("
                                                                                                                                                      ").appendTo(menu); -_42b(_45d,div,_45e); -}; -function _460(_461,_462){ -function _463(el){ -if(el.submenu){ -el.submenu.children("div.menu-item").each(function(){ -_463(this); -}); -var _464=el.submenu[0].shadow; -if(_464){ -_464.remove(); -} -el.submenu.remove(); -} -$(el).remove(); -}; -_463(_462); -}; -function _465(_466,_467,_468){ -var menu=$(_467).parent(); -if(_468){ -$(_467).show(); -}else{ -$(_467).hide(); -} -_42c(_466,menu); -}; -function _469(_46a){ -$(_46a).children("div.menu-item").each(function(){ -_460(_46a,this); -}); -if(_46a.shadow){ -_46a.shadow.remove(); -} -$(_46a).remove(); -}; -$.fn.menu=function(_46b,_46c){ -if(typeof _46b=="string"){ -return $.fn.menu.methods[_46b](this,_46c); -} -_46b=_46b||{}; -return this.each(function(){ -var _46d=$.data(this,"menu"); -if(_46d){ -$.extend(_46d.options,_46b); -}else{ -_46d=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_46b)}); -init(this); -} -$(this).css({left:_46d.options.left,top:_46d.options.top}); -}); -}; -$.fn.menu.methods={options:function(jq){ -return $.data(jq[0],"menu").options; -},show:function(jq,pos){ -return jq.each(function(){ -_44e(this,pos); -}); -},hide:function(jq){ -return jq.each(function(){ -_442(this); -}); -},destroy:function(jq){ -return jq.each(function(){ -_469(this); -}); -},setText:function(jq,_46e){ -return jq.each(function(){ -var item=$(_46e.target).data("menuitem").options; -item.text=_46e.text; -$(_46e.target).children("div.menu-text").html(_46e.text); -}); -},setIcon:function(jq,_46f){ -return jq.each(function(){ -var item=$(_46f.target).data("menuitem").options; -item.iconCls=_46f.iconCls; -$(_46f.target).children("div.menu-icon").remove(); -if(_46f.iconCls){ -$("
                                                                                                                                                      ").addClass(_46f.iconCls).appendTo(_46f.target); -} -}); -},getItem:function(jq,_470){ -var item=$(_470).data("menuitem").options; -return $.extend({},item,{target:$(_470)[0]}); -},findItem:function(jq,text){ -if(typeof text=="string"){ -return _455(jq[0],function(item){ -return $("
                                                                                                                                                      "+item.text+"
                                                                                                                                                      ").text()==text; -}); -}else{ -return _455(jq[0],text); -} -},appendItem:function(jq,_471){ -return jq.each(function(){ -_45c(this,_471); -}); -},removeItem:function(jq,_472){ -return jq.each(function(){ -_460(this,_472); -}); -},enableItem:function(jq,_473){ -return jq.each(function(){ -_431(this,_473,false); -}); -},disableItem:function(jq,_474){ -return jq.each(function(){ -_431(this,_474,true); -}); -},showItem:function(jq,_475){ -return jq.each(function(){ -_465(this,_475,true); -}); -},hideItem:function(jq,_476){ -return jq.each(function(){ -_465(this,_476,false); -}); -},resize:function(jq,_477){ -return jq.each(function(){ -_42c(this,_477?$(_477):$(this)); -}); -}}; -$.fn.menu.parseOptions=function(_478){ -return $.extend({},$.parser.parseOptions(_478,[{minWidth:"number",itemHeight:"number",duration:"number",hideOnUnhover:"boolean"},{fit:"boolean",inline:"boolean",noline:"boolean"}])); -}; -$.fn.menu.defaults={zIndex:110000,left:0,top:0,alignTo:null,align:"left",minWidth:150,itemHeight:32,duration:100,hideOnUnhover:true,inline:false,fit:false,noline:false,events:{mouseenter:_43c,mouseleave:_43f,mouseover:_443,mouseout:_446,click:_448},position:function(_479,left,top){ -return {left:left,top:top}; -},onShow:function(){ -},onHide:function(){ -},onClick:function(item){ -}}; -})(jQuery); -(function($){ -var _47a=1; -function init(_47b){ -$(_47b).addClass("sidemenu"); -}; -function _47c(_47d,_47e){ -var opts=$(_47d).sidemenu("options"); -if(_47e){ -$.extend(opts,{width:_47e.width,height:_47e.height}); -} -$(_47d)._size(opts); -$(_47d).find(".accordion").accordion("resize"); -}; -function _47f(_480,_481,data){ -var opts=$(_480).sidemenu("options"); -var tt=$("
                                                                                                                                                        ").appendTo(_481); -tt.tree({data:data,animate:opts.animate,onBeforeSelect:function(node){ -if(node.children){ -return false; -} -},onSelect:function(node){ -_482(_480,node.id); -},onExpand:function(node){ -_48d(_480,node); -},onCollapse:function(node){ -_48d(_480,node); -},onClick:function(node){ -if(node.children){ -if(node.state=="open"){ -$(node.target).addClass("tree-node-nonleaf-collapsed"); -}else{ -$(node.target).removeClass("tree-node-nonleaf-collapsed"); -} -$(this).tree("toggle",node.target); -} -}}); -tt.unbind(".sidemenu").bind("mouseleave.sidemenu",function(){ -$(_481).trigger("mouseleave"); -}); -_482(_480,opts.selectedItemId); -}; -function _483(_484,_485,data){ -var opts=$(_484).sidemenu("options"); -$(_485).tooltip({content:$("
                                                                                                                                                        "),position:opts.floatMenuPosition,valign:"top",data:data,onUpdate:function(_486){ -var _487=$(this).tooltip("options"); -var data=_487.data; -_486.accordion({width:opts.floatMenuWidth,multiple:false}).accordion("add",{title:data.text,iconCls:data.iconCls,collapsed:false,collapsible:false}); -_47f(_484,_486.accordion("panels")[0],data.children); -},onShow:function(){ -var t=$(this); -var tip=t.tooltip("tip").addClass("sidemenu-tooltip"); -tip.children(".tooltip-content").addClass("sidemenu"); -tip.find(".accordion").accordion("resize"); -tip.unbind().bind("mouseenter",function(){ -t.tooltip("show"); -}).bind("mouseleave",function(){ -t.tooltip("hide"); -}); -},onPosition:function(){ -if(!opts.collapsed){ -$(this).tooltip("tip").css({left:-999999}); -} -}}); -}; -function _488(_489,_48a){ -$(_489).find(".sidemenu-tree").each(function(){ -_48a($(this)); -}); -$(_489).find(".tooltip-f").each(function(){ -var tip=$(this).tooltip("tip"); -if(tip){ -tip.find(".sidemenu-tree").each(function(){ -_48a($(this)); -}); -} -}); -}; -function _482(_48b,_48c){ -var opts=$(_48b).sidemenu("options"); -_488(_48b,function(t){ -t.find("div.tree-node-selected").removeClass("tree-node-selected"); -var node=t.tree("find",_48c); -if(node){ -$(node.target).addClass("tree-node-selected"); -opts.selectedItemId=node.id; -t.trigger("mouseleave"); -opts.onSelect.call(_48b,node); -} -}); -}; -function _48d(_48e,item){ -_488(_48e,function(t){ -var node=t.tree("find",item.id); -if(node){ -t.tree(item.state=="open"?"expand":"collapse",node.target); -} -}); -}; -function _48f(_490){ -var opts=$(_490).sidemenu("options"); -$(_490).empty(); -if(opts.data){ -$.easyui.forEach(opts.data,true,function(node){ -if(!node.id){ -node.id="_easyui_sidemenu_"+(_47a++); -} -if(!node.iconCls){ -node.iconCls="sidemenu-default-icon"; -} -if(node.children){ -node.nodeCls="tree-node-nonleaf"; -if(!node.state){ -node.state="closed"; -} -if(node.state=="open"){ -node.nodeCls="tree-node-nonleaf"; -}else{ -node.nodeCls="tree-node-nonleaf tree-node-nonleaf-collapsed"; -} -} -}); -var acc=$("
                                                                                                                                                        ").appendTo(_490); -acc.accordion({fit:opts.height=="auto"?false:true,border:opts.border,multiple:opts.multiple}); -for(var i=0;i").addClass(opts.cls.arrow).appendTo(_4a0); -$("").addClass("m-btn-line").appendTo(_4a0); -} -$(_49f).menubutton("resize"); -if(opts.menu){ -$(opts.menu).menu({duration:opts.duration}); -var _4a1=$(opts.menu).menu("options"); -var _4a2=_4a1.onShow; -var _4a3=_4a1.onHide; -$.extend(_4a1,{onShow:function(){ -var _4a4=$(this).menu("options"); -var btn=$(_4a4.alignTo); -var opts=btn.menubutton("options"); -btn.addClass((opts.plain==true)?opts.cls.btn2:opts.cls.btn1); -_4a2.call(this); -},onHide:function(){ -var _4a5=$(this).menu("options"); -var btn=$(_4a5.alignTo); -var opts=btn.menubutton("options"); -btn.removeClass((opts.plain==true)?opts.cls.btn2:opts.cls.btn1); -_4a3.call(this); -}}); -} -}; -function _4a6(_4a7){ -var opts=$.data(_4a7,"menubutton").options; -var btn=$(_4a7); -var t=btn.find("."+opts.cls.trigger); -if(!t.length){ -t=btn; -} -t.unbind(".menubutton"); -var _4a8=null; -t.bind(opts.showEvent+".menubutton",function(){ -if(!_4a9()){ -_4a8=setTimeout(function(){ -_4aa(_4a7); -},opts.duration); -return false; -} -}).bind(opts.hideEvent+".menubutton",function(){ -if(_4a8){ -clearTimeout(_4a8); -} -$(opts.menu).triggerHandler("mouseleave"); -}); -function _4a9(){ -return $(_4a7).linkbutton("options").disabled; -}; -}; -function _4aa(_4ab){ -var opts=$(_4ab).menubutton("options"); -if(opts.disabled||!opts.menu){ -return; -} -$("body>div.menu-top").menu("hide"); -var btn=$(_4ab); -var mm=$(opts.menu); -if(mm.length){ -mm.menu("options").alignTo=btn; -mm.menu("show",{alignTo:btn,align:opts.menuAlign}); -} -btn.blur(); -}; -$.fn.menubutton=function(_4ac,_4ad){ -if(typeof _4ac=="string"){ -var _4ae=$.fn.menubutton.methods[_4ac]; -if(_4ae){ -return _4ae(this,_4ad); -}else{ -return this.linkbutton(_4ac,_4ad); -} -} -_4ac=_4ac||{}; -return this.each(function(){ -var _4af=$.data(this,"menubutton"); -if(_4af){ -$.extend(_4af.options,_4ac); -}else{ -$.data(this,"menubutton",{options:$.extend({},$.fn.menubutton.defaults,$.fn.menubutton.parseOptions(this),_4ac)}); -$(this)._propAttr("disabled",false); -} -init(this); -_4a6(this); -}); -}; -$.fn.menubutton.methods={options:function(jq){ -var _4b0=jq.linkbutton("options"); -return $.extend($.data(jq[0],"menubutton").options,{toggle:_4b0.toggle,selected:_4b0.selected,disabled:_4b0.disabled}); -},destroy:function(jq){ -return jq.each(function(){ -var opts=$(this).menubutton("options"); -if(opts.menu){ -$(opts.menu).menu("destroy"); -} -$(this).remove(); -}); -}}; -$.fn.menubutton.parseOptions=function(_4b1){ -var t=$(_4b1); -return $.extend({},$.fn.linkbutton.parseOptions(_4b1),$.parser.parseOptions(_4b1,["menu",{plain:"boolean",hasDownArrow:"boolean",duration:"number"}])); -}; -$.fn.menubutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,hasDownArrow:true,menu:null,menuAlign:"left",duration:100,showEvent:"mouseenter",hideEvent:"mouseleave",cls:{btn1:"m-btn-active",btn2:"m-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn"}}); -})(jQuery); -(function($){ -function init(_4b2){ -var opts=$.data(_4b2,"splitbutton").options; -$(_4b2).menubutton(opts); -$(_4b2).addClass("s-btn"); -}; -$.fn.splitbutton=function(_4b3,_4b4){ -if(typeof _4b3=="string"){ -var _4b5=$.fn.splitbutton.methods[_4b3]; -if(_4b5){ -return _4b5(this,_4b4); -}else{ -return this.menubutton(_4b3,_4b4); -} -} -_4b3=_4b3||{}; -return this.each(function(){ -var _4b6=$.data(this,"splitbutton"); -if(_4b6){ -$.extend(_4b6.options,_4b3); -}else{ -$.data(this,"splitbutton",{options:$.extend({},$.fn.splitbutton.defaults,$.fn.splitbutton.parseOptions(this),_4b3)}); -$(this)._propAttr("disabled",false); -} -init(this); -}); -}; -$.fn.splitbutton.methods={options:function(jq){ -var _4b7=jq.menubutton("options"); -var _4b8=$.data(jq[0],"splitbutton").options; -$.extend(_4b8,{disabled:_4b7.disabled,toggle:_4b7.toggle,selected:_4b7.selected}); -return _4b8; -}}; -$.fn.splitbutton.parseOptions=function(_4b9){ -var t=$(_4b9); -return $.extend({},$.fn.linkbutton.parseOptions(_4b9),$.parser.parseOptions(_4b9,["menu",{plain:"boolean",duration:"number"}])); -}; -$.fn.splitbutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100,cls:{btn1:"m-btn-active s-btn-active",btn2:"m-btn-plain-active s-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn-line"}}); -})(jQuery); -(function($){ -function init(_4ba){ -var _4bb=$(""+""+""+""+""+""+""+"").insertAfter(_4ba); -var t=$(_4ba); -t.addClass("switchbutton-f").hide(); -var name=t.attr("name"); -if(name){ -t.removeAttr("name").attr("switchbuttonName",name); -_4bb.find(".switchbutton-value").attr("name",name); -} -_4bb.bind("_resize",function(e,_4bc){ -if($(this).hasClass("easyui-fluid")||_4bc){ -_4bd(_4ba); -} -return false; -}); -return _4bb; -}; -function _4bd(_4be,_4bf){ -var _4c0=$.data(_4be,"switchbutton"); -var opts=_4c0.options; -var _4c1=_4c0.switchbutton; -if(_4bf){ -$.extend(opts,_4bf); -} -var _4c2=_4c1.is(":visible"); -if(!_4c2){ -_4c1.appendTo("body"); -} -_4c1._size(opts); -var w=_4c1.width(); -var h=_4c1.height(); -var w=_4c1.outerWidth(); -var h=_4c1.outerHeight(); -var _4c3=parseInt(opts.handleWidth)||_4c1.height(); -var _4c4=w*2-_4c3; -_4c1.find(".switchbutton-inner").css({width:_4c4+"px",height:h+"px",lineHeight:h+"px"}); -_4c1.find(".switchbutton-handle")._outerWidth(_4c3)._outerHeight(h).css({marginLeft:-_4c3/2+"px"}); -_4c1.find(".switchbutton-on").css({width:(w-_4c3/2)+"px",textIndent:(opts.reversed?"":"-")+_4c3/2+"px"}); -_4c1.find(".switchbutton-off").css({width:(w-_4c3/2)+"px",textIndent:(opts.reversed?"-":"")+_4c3/2+"px"}); -opts.marginWidth=w-_4c3; -_4c5(_4be,opts.checked,false); -if(!_4c2){ -_4c1.insertAfter(_4be); -} -}; -function _4c6(_4c7){ -var _4c8=$.data(_4c7,"switchbutton"); -var opts=_4c8.options; -var _4c9=_4c8.switchbutton; -var _4ca=_4c9.find(".switchbutton-inner"); -var on=_4ca.find(".switchbutton-on").html(opts.onText); -var off=_4ca.find(".switchbutton-off").html(opts.offText); -var _4cb=_4ca.find(".switchbutton-handle").html(opts.handleText); -if(opts.reversed){ -off.prependTo(_4ca); -on.insertAfter(_4cb); -}else{ -on.prependTo(_4ca); -off.insertAfter(_4cb); -} -_4c9.find(".switchbutton-value")._propAttr("checked",opts.checked); -_4c9.removeClass("switchbutton-disabled").addClass(opts.disabled?"switchbutton-disabled":""); -_4c9.removeClass("switchbutton-reversed").addClass(opts.reversed?"switchbutton-reversed":""); -_4c5(_4c7,opts.checked); -_4cc(_4c7,opts.readonly); -$(_4c7).switchbutton("setValue",opts.value); -}; -function _4c5(_4cd,_4ce,_4cf){ -var _4d0=$.data(_4cd,"switchbutton"); -var opts=_4d0.options; -opts.checked=_4ce; -var _4d1=_4d0.switchbutton.find(".switchbutton-inner"); -var _4d2=_4d1.find(".switchbutton-on"); -var _4d3=opts.reversed?(opts.checked?opts.marginWidth:0):(opts.checked?0:opts.marginWidth); -var dir=_4d2.css("float").toLowerCase(); -var css={}; -css["margin-"+dir]=-_4d3+"px"; -_4cf?_4d1.animate(css,200):_4d1.css(css); -var _4d4=_4d1.find(".switchbutton-value"); -var ck=_4d4.is(":checked"); -$(_4cd).add(_4d4)._propAttr("checked",opts.checked); -if(ck!=opts.checked){ -opts.onChange.call(_4cd,opts.checked); -} -}; -function _4d5(_4d6,_4d7){ -var _4d8=$.data(_4d6,"switchbutton"); -var opts=_4d8.options; -var _4d9=_4d8.switchbutton; -var _4da=_4d9.find(".switchbutton-value"); -if(_4d7){ -opts.disabled=true; -$(_4d6).add(_4da)._propAttr("disabled",true); -_4d9.addClass("switchbutton-disabled"); -}else{ -opts.disabled=false; -$(_4d6).add(_4da)._propAttr("disabled",false); -_4d9.removeClass("switchbutton-disabled"); -} -}; -function _4cc(_4db,mode){ -var _4dc=$.data(_4db,"switchbutton"); -var opts=_4dc.options; -opts.readonly=mode==undefined?true:mode; -_4dc.switchbutton.removeClass("switchbutton-readonly").addClass(opts.readonly?"switchbutton-readonly":""); -}; -function _4dd(_4de){ -var _4df=$.data(_4de,"switchbutton"); -var opts=_4df.options; -_4df.switchbutton.unbind(".switchbutton").bind("click.switchbutton",function(){ -if(!opts.disabled&&!opts.readonly){ -_4c5(_4de,opts.checked?false:true,true); -} -}); -}; -$.fn.switchbutton=function(_4e0,_4e1){ -if(typeof _4e0=="string"){ -return $.fn.switchbutton.methods[_4e0](this,_4e1); -} -_4e0=_4e0||{}; -return this.each(function(){ -var _4e2=$.data(this,"switchbutton"); -if(_4e2){ -$.extend(_4e2.options,_4e0); -}else{ -_4e2=$.data(this,"switchbutton",{options:$.extend({},$.fn.switchbutton.defaults,$.fn.switchbutton.parseOptions(this),_4e0),switchbutton:init(this)}); -} -_4e2.options.originalChecked=_4e2.options.checked; -_4c6(this); -_4bd(this); -_4dd(this); -}); -}; -$.fn.switchbutton.methods={options:function(jq){ -var _4e3=jq.data("switchbutton"); -return $.extend(_4e3.options,{value:_4e3.switchbutton.find(".switchbutton-value").val()}); -},resize:function(jq,_4e4){ -return jq.each(function(){ -_4bd(this,_4e4); -}); -},enable:function(jq){ -return jq.each(function(){ -_4d5(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_4d5(this,true); -}); -},readonly:function(jq,mode){ -return jq.each(function(){ -_4cc(this,mode); -}); -},check:function(jq){ -return jq.each(function(){ -_4c5(this,true); -}); -},uncheck:function(jq){ -return jq.each(function(){ -_4c5(this,false); -}); -},clear:function(jq){ -return jq.each(function(){ -_4c5(this,false); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).switchbutton("options"); -_4c5(this,opts.originalChecked); -}); -},setValue:function(jq,_4e5){ -return jq.each(function(){ -$(this).val(_4e5); -$.data(this,"switchbutton").switchbutton.find(".switchbutton-value").val(_4e5); -}); -}}; -$.fn.switchbutton.parseOptions=function(_4e6){ -var t=$(_4e6); -return $.extend({},$.parser.parseOptions(_4e6,["onText","offText","handleText",{handleWidth:"number",reversed:"boolean"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)}); -}; -$.fn.switchbutton.defaults={handleWidth:"auto",width:60,height:30,checked:false,disabled:false,readonly:false,reversed:false,onText:"ON",offText:"OFF",handleText:"",value:"on",onChange:function(_4e7){ -}}; -})(jQuery); -(function($){ -function init(_4e8){ -$(_4e8).addClass("validatebox-text"); -}; -function _4e9(_4ea){ -var _4eb=$.data(_4ea,"validatebox"); -_4eb.validating=false; -if(_4eb.vtimer){ -clearTimeout(_4eb.vtimer); -} -if(_4eb.ftimer){ -clearTimeout(_4eb.ftimer); -} -$(_4ea).tooltip("destroy"); -$(_4ea).unbind(); -$(_4ea).remove(); -}; -function _4ec(_4ed){ -var opts=$.data(_4ed,"validatebox").options; -$(_4ed).unbind(".validatebox"); -if(opts.novalidate||opts.disabled){ -return; -} -for(var _4ee in opts.events){ -$(_4ed).bind(_4ee+".validatebox",{target:_4ed},opts.events[_4ee]); -} -}; -function _4ef(e){ -var _4f0=e.data.target; -var _4f1=$.data(_4f0,"validatebox"); -var opts=_4f1.options; -if($(_4f0).attr("readonly")){ -return; -} -_4f1.validating=true; -_4f1.value=opts.val(_4f0); -(function(){ -if(!$(_4f0).is(":visible")){ -_4f1.validating=false; -} -if(_4f1.validating){ -var _4f2=opts.val(_4f0); -if(_4f1.value!=_4f2){ -_4f1.value=_4f2; -if(_4f1.vtimer){ -clearTimeout(_4f1.vtimer); -} -_4f1.vtimer=setTimeout(function(){ -$(_4f0).validatebox("validate"); -},opts.delay); -}else{ -if(_4f1.message){ -opts.err(_4f0,_4f1.message); -} -} -_4f1.ftimer=setTimeout(arguments.callee,opts.interval); -} -})(); -}; -function _4f3(e){ -var _4f4=e.data.target; -var _4f5=$.data(_4f4,"validatebox"); -var opts=_4f5.options; -_4f5.validating=false; -if(_4f5.vtimer){ -clearTimeout(_4f5.vtimer); -_4f5.vtimer=undefined; -} -if(_4f5.ftimer){ -clearTimeout(_4f5.ftimer); -_4f5.ftimer=undefined; -} -if(opts.validateOnBlur){ -setTimeout(function(){ -$(_4f4).validatebox("validate"); -},0); -} -opts.err(_4f4,_4f5.message,"hide"); -}; -function _4f6(e){ -var _4f7=e.data.target; -var _4f8=$.data(_4f7,"validatebox"); -_4f8.options.err(_4f7,_4f8.message,"show"); -}; -function _4f9(e){ -var _4fa=e.data.target; -var _4fb=$.data(_4fa,"validatebox"); -if(!_4fb.validating){ -_4fb.options.err(_4fa,_4fb.message,"hide"); -} -}; -function _4fc(_4fd,_4fe,_4ff){ -var _500=$.data(_4fd,"validatebox"); -var opts=_500.options; -var t=$(_4fd); -if(_4ff=="hide"||!_4fe){ -t.tooltip("hide"); -}else{ -if((t.is(":focus")&&_500.validating)||_4ff=="show"){ -t.tooltip($.extend({},opts.tipOptions,{content:_4fe,position:opts.tipPosition,deltaX:opts.deltaX,deltaY:opts.deltaY})).tooltip("show"); -} -} -}; -function _501(_502){ -var _503=$.data(_502,"validatebox"); -var opts=_503.options; -var box=$(_502); -opts.onBeforeValidate.call(_502); -var _504=_505(); -_504?box.removeClass("validatebox-invalid"):box.addClass("validatebox-invalid"); -opts.err(_502,_503.message); -opts.onValidate.call(_502,_504); -return _504; -function _506(msg){ -_503.message=msg; -}; -function _507(_508,_509){ -var _50a=opts.val(_502); -var _50b=/([a-zA-Z_]+)(.*)/.exec(_508); -var rule=opts.rules[_50b[1]]; -if(rule&&_50a){ -var _50c=_509||opts.validParams||eval(_50b[2]); -if(!rule["validator"].call(_502,_50a,_50c)){ -var _50d=rule["message"]; -if(_50c){ -for(var i=0;i<_50c.length;i++){ -_50d=_50d.replace(new RegExp("\\{"+i+"\\}","g"),_50c[i]); -} -} -_506(opts.invalidMessage||_50d); -return false; -} -} -return true; -}; -function _505(){ -_506(""); -if(!opts._validateOnCreate){ -setTimeout(function(){ -opts._validateOnCreate=true; -},0); -return true; -} -if(opts.novalidate||opts.disabled){ -return true; -} -if(opts.required){ -if(opts.val(_502)==""){ -_506(opts.missingMessage); -return false; -} -} -if(opts.validType){ -if($.isArray(opts.validType)){ -for(var i=0;i=_520[0]&&len<=_520[1]; -},message:"Please enter a value between {0} and {1}."},remote:{validator:function(_521,_522){ -var data={}; -data[_522[1]]=_521; -var _523=$.ajax({url:_522[0],dataType:"json",data:data,async:false,cache:false,type:"post"}).responseText; -return _523=="true"; -},message:"Please fix this field."}},onBeforeValidate:function(){ -},onValidate:function(_524){ -}}; -})(jQuery); -(function($){ -var _525=0; -function init(_526){ -$(_526).addClass("textbox-f").hide(); -var span=$(""+""+""+"").insertAfter(_526); -var name=$(_526).attr("name"); -if(name){ -span.find("input.textbox-value").attr("name",name); -$(_526).removeAttr("name").attr("textboxName",name); -} -return span; -}; -function _527(_528){ -var _529=$.data(_528,"textbox"); -var opts=_529.options; -var tb=_529.textbox; -var _52a="_easyui_textbox_input"+(++_525); -tb.addClass(opts.cls); -tb.find(".textbox-text").remove(); -if(opts.multiline){ -$("").prependTo(tb); -}else{ -$("").prependTo(tb); -} -$("#"+_52a).attr("tabindex",$(_528).attr("tabindex")||"").css("text-align",_528.style.textAlign||""); -tb.find(".textbox-addon").remove(); -var bb=opts.icons?$.extend(true,[],opts.icons):[]; -if(opts.iconCls){ -bb.push({iconCls:opts.iconCls,disabled:true}); -} -if(bb.length){ -var bc=$("").prependTo(tb); -bc.addClass("textbox-addon-"+opts.iconAlign); -for(var i=0;i"); -} -} -tb.find(".textbox-button").remove(); -if(opts.buttonText||opts.buttonIcon){ -var btn=$("").prependTo(tb); -btn.addClass("textbox-button-"+opts.buttonAlign).linkbutton({text:opts.buttonText,iconCls:opts.buttonIcon,onClick:function(){ -var t=$(this).parent().prev(); -t.textbox("options").onClickButton.call(t[0]); -}}); -} -if(opts.label){ -if(typeof opts.label=="object"){ -_529.label=$(opts.label); -_529.label.attr("for",_52a); -}else{ -$(_529.label).remove(); -_529.label=$("").html(opts.label); -_529.label.css("textAlign",opts.labelAlign).attr("for",_52a); -if(opts.labelPosition=="after"){ -_529.label.insertAfter(tb); -}else{ -_529.label.insertBefore(_528); -} -_529.label.removeClass("textbox-label-left textbox-label-right textbox-label-top"); -_529.label.addClass("textbox-label-"+opts.labelPosition); -} -}else{ -$(_529.label).remove(); -} -_52b(_528); -_52c(_528,opts.disabled); -_52d(_528,opts.readonly); -}; -function _52e(_52f){ -var _530=$.data(_52f,"textbox"); -var tb=_530.textbox; -tb.find(".textbox-text").validatebox("destroy"); -tb.remove(); -$(_530.label).remove(); -$(_52f).remove(); -}; -function _531(_532,_533){ -var _534=$.data(_532,"textbox"); -var opts=_534.options; -var tb=_534.textbox; -var _535=tb.parent(); -if(_533){ -if(typeof _533=="object"){ -$.extend(opts,_533); -}else{ -opts.width=_533; -} -} -if(isNaN(parseInt(opts.width))){ -var c=$(_532).clone(); -c.css("visibility","hidden"); -c.insertAfter(_532); -opts.width=c.outerWidth(); -c.remove(); -} -var _536=tb.is(":visible"); -if(!_536){ -tb.appendTo("body"); -} -var _537=tb.find(".textbox-text"); -var btn=tb.find(".textbox-button"); -var _538=tb.find(".textbox-addon"); -var _539=_538.find(".textbox-icon"); -if(opts.height=="auto"){ -_537.css({margin:"",paddingTop:"",paddingBottom:"",height:"",lineHeight:""}); -} -tb._size(opts,_535); -if(opts.label&&opts.labelPosition){ -if(opts.labelPosition=="top"){ -_534.label._size({width:opts.labelWidth=="auto"?tb.outerWidth():opts.labelWidth},tb); -if(opts.height!="auto"){ -tb._size("height",tb.outerHeight()-_534.label.outerHeight()); -} -}else{ -_534.label._size({width:opts.labelWidth,height:tb.outerHeight()},tb); -if(!opts.multiline){ -_534.label.css("lineHeight",_534.label.height()+"px"); -} -tb._size("width",tb.outerWidth()-_534.label.outerWidth()); -} -} -if(opts.buttonAlign=="left"||opts.buttonAlign=="right"){ -btn.linkbutton("resize",{height:tb.height()}); -}else{ -btn.linkbutton("resize",{width:"100%"}); -} -var _53a=tb.width()-_539.length*opts.iconWidth-_53b("left")-_53b("right"); -var _53c=opts.height=="auto"?_537.outerHeight():(tb.height()-_53b("top")-_53b("bottom")); -_538.css(opts.iconAlign,_53b(opts.iconAlign)+"px"); -_538.css("top",_53b("top")+"px"); -_539.css({width:opts.iconWidth+"px",height:_53c+"px"}); -_537.css({paddingLeft:(_532.style.paddingLeft||""),paddingRight:(_532.style.paddingRight||""),marginLeft:_53d("left"),marginRight:_53d("right"),marginTop:_53b("top"),marginBottom:_53b("bottom")}); -if(opts.multiline){ -_537.css({paddingTop:(_532.style.paddingTop||""),paddingBottom:(_532.style.paddingBottom||"")}); -_537._outerHeight(_53c); -}else{ -_537.css({paddingTop:0,paddingBottom:0,height:_53c+"px",lineHeight:_53c+"px"}); -} -_537._outerWidth(_53a); -opts.onResizing.call(_532,opts.width,opts.height); -if(!_536){ -tb.insertAfter(_532); -} -opts.onResize.call(_532,opts.width,opts.height); -function _53d(_53e){ -return (opts.iconAlign==_53e?_538._outerWidth():0)+_53b(_53e); -}; -function _53b(_53f){ -var w=0; -btn.filter(".textbox-button-"+_53f).each(function(){ -if(_53f=="left"||_53f=="right"){ -w+=$(this).outerWidth(); -}else{ -w+=$(this).outerHeight(); -} -}); -return w; -}; -}; -function _52b(_540){ -var opts=$(_540).textbox("options"); -var _541=$(_540).textbox("textbox"); -_541.validatebox($.extend({},opts,{deltaX:function(_542){ -return $(_540).textbox("getTipX",_542); -},deltaY:function(_543){ -return $(_540).textbox("getTipY",_543); -},onBeforeValidate:function(){ -opts.onBeforeValidate.call(_540); -var box=$(this); -if(!box.is(":focus")){ -if(box.val()!==opts.value){ -opts.oldInputValue=box.val(); -box.val(opts.value); -} -} -},onValidate:function(_544){ -var box=$(this); -if(opts.oldInputValue!=undefined){ -box.val(opts.oldInputValue); -opts.oldInputValue=undefined; -} -var tb=box.parent(); -if(_544){ -tb.removeClass("textbox-invalid"); -}else{ -tb.addClass("textbox-invalid"); -} -opts.onValidate.call(_540,_544); -}})); -}; -function _545(_546){ -var _547=$.data(_546,"textbox"); -var opts=_547.options; -var tb=_547.textbox; -var _548=tb.find(".textbox-text"); -_548.attr("placeholder",opts.prompt); -_548.unbind(".textbox"); -$(_547.label).unbind(".textbox"); -if(!opts.disabled&&!opts.readonly){ -if(_547.label){ -$(_547.label).bind("click.textbox",function(e){ -if(!opts.hasFocusMe){ -_548.focus(); -$(_546).textbox("setSelectionRange",{start:0,end:_548.val().length}); -} -}); -} -_548.bind("blur.textbox",function(e){ -if(!tb.hasClass("textbox-focused")){ -return; -} -opts.value=$(this).val(); -if(opts.value==""){ -$(this).val(opts.prompt).addClass("textbox-prompt"); -}else{ -$(this).removeClass("textbox-prompt"); -} -tb.removeClass("textbox-focused"); -tb.closest(".form-field").removeClass("form-field-focused"); -}).bind("focus.textbox",function(e){ -opts.hasFocusMe=true; -if(tb.hasClass("textbox-focused")){ -return; -} -if($(this).val()!=opts.value){ -$(this).val(opts.value); -} -$(this).removeClass("textbox-prompt"); -tb.addClass("textbox-focused"); -tb.closest(".form-field").addClass("form-field-focused"); -}); -for(var _549 in opts.inputEvents){ -_548.bind(_549+".textbox",{target:_546},opts.inputEvents[_549]); -} -} -var _54a=tb.find(".textbox-addon"); -_54a.unbind().bind("click",{target:_546},function(e){ -var icon=$(e.target).closest("a.textbox-icon:not(.textbox-icon-disabled)"); -if(icon.length){ -var _54b=parseInt(icon.attr("icon-index")); -var conf=opts.icons[_54b]; -if(conf&&conf.handler){ -conf.handler.call(icon[0],e); -} -opts.onClickIcon.call(_546,_54b); -} -}); -_54a.find(".textbox-icon").each(function(_54c){ -var conf=opts.icons[_54c]; -var icon=$(this); -if(!conf||conf.disabled||opts.disabled||opts.readonly){ -icon.addClass("textbox-icon-disabled"); -}else{ -icon.removeClass("textbox-icon-disabled"); -} -}); -var btn=tb.find(".textbox-button"); -btn.linkbutton((opts.disabled||opts.readonly)?"disable":"enable"); -tb.unbind(".textbox").bind("_resize.textbox",function(e,_54d){ -if($(this).hasClass("easyui-fluid")||_54d){ -_531(_546); -} -return false; -}); -}; -function _52c(_54e,_54f){ -var _550=$.data(_54e,"textbox"); -var opts=_550.options; -var tb=_550.textbox; -var _551=tb.find(".textbox-text"); -var ss=$(_54e).add(tb.find(".textbox-value")); -opts.disabled=_54f; -if(opts.disabled){ -_551.blur(); -_551.validatebox("disable"); -tb.addClass("textbox-disabled"); -ss._propAttr("disabled",true); -$(_550.label).addClass("textbox-label-disabled"); -}else{ -_551.validatebox("enable"); -tb.removeClass("textbox-disabled"); -ss._propAttr("disabled",false); -$(_550.label).removeClass("textbox-label-disabled"); -} -}; -function _52d(_552,mode){ -var _553=$.data(_552,"textbox"); -var opts=_553.options; -var tb=_553.textbox; -var _554=tb.find(".textbox-text"); -opts.readonly=mode==undefined?true:mode; -if(opts.readonly){ -_554.triggerHandler("blur.textbox"); -} -_554.validatebox("readonly",opts.readonly); -tb.removeClass("textbox-readonly").addClass(opts.readonly?"textbox-readonly":""); -}; -$.fn.textbox=function(_555,_556){ -if(typeof _555=="string"){ -var _557=$.fn.textbox.methods[_555]; -if(_557){ -return _557(this,_556); -}else{ -return this.each(function(){ -var _558=$(this).textbox("textbox"); -_558.validatebox(_555,_556); -}); -} -} -_555=_555||{}; -return this.each(function(){ -var _559=$.data(this,"textbox"); -if(_559){ -$.extend(_559.options,_555); -if(_555.value!=undefined){ -_559.options.originalValue=_555.value; -} -}else{ -_559=$.data(this,"textbox",{options:$.extend({},$.fn.textbox.defaults,$.fn.textbox.parseOptions(this),_555),textbox:init(this)}); -_559.options.originalValue=_559.options.value; -} -_527(this); -_545(this); -if(_559.options.doSize){ -_531(this); -} -var _55a=_559.options.value; -_559.options.value=""; -$(this).textbox("initValue",_55a); -}); -}; -$.fn.textbox.methods={options:function(jq){ -return $.data(jq[0],"textbox").options; -},cloneFrom:function(jq,from){ -return jq.each(function(){ -var t=$(this); -if(t.data("textbox")){ -return; -} -if(!$(from).data("textbox")){ -$(from).textbox(); -} -var opts=$.extend(true,{},$(from).textbox("options")); -var name=t.attr("name")||""; -t.addClass("textbox-f").hide(); -t.removeAttr("name").attr("textboxName",name); -var span=$(from).next().clone().insertAfter(t); -var _55b="_easyui_textbox_input"+(++_525); -span.find(".textbox-value").attr("name",name); -span.find(".textbox-text").attr("id",_55b); -var _55c=$($(from).textbox("label")).clone(); -if(_55c.length){ -_55c.attr("for",_55b); -if(opts.labelPosition=="after"){ -_55c.insertAfter(t.next()); -}else{ -_55c.insertBefore(t); -} -} -$.data(this,"textbox",{options:opts,textbox:span,label:(_55c.length?_55c:undefined)}); -var _55d=$(from).textbox("button"); -if(_55d.length){ -t.textbox("button").linkbutton($.extend(true,{},_55d.linkbutton("options"))); -} -_545(this); -_52b(this); -}); -},textbox:function(jq){ -return $.data(jq[0],"textbox").textbox.find(".textbox-text"); -},button:function(jq){ -return $.data(jq[0],"textbox").textbox.find(".textbox-button"); -},label:function(jq){ -return $.data(jq[0],"textbox").label; -},destroy:function(jq){ -return jq.each(function(){ -_52e(this); -}); -},resize:function(jq,_55e){ -return jq.each(function(){ -_531(this,_55e); -}); -},disable:function(jq){ -return jq.each(function(){ -_52c(this,true); -_545(this); -}); -},enable:function(jq){ -return jq.each(function(){ -_52c(this,false); -_545(this); -}); -},readonly:function(jq,mode){ -return jq.each(function(){ -_52d(this,mode); -_545(this); -}); -},isValid:function(jq){ -return jq.textbox("textbox").validatebox("isValid"); -},clear:function(jq){ -return jq.each(function(){ -$(this).textbox("setValue",""); -}); -},setText:function(jq,_55f){ -return jq.each(function(){ -var opts=$(this).textbox("options"); -var _560=$(this).textbox("textbox"); -_55f=_55f==undefined?"":String(_55f); -if($(this).textbox("getText")!=_55f){ -_560.val(_55f); -} -opts.value=_55f; -if(!_560.is(":focus")){ -if(_55f){ -_560.removeClass("textbox-prompt"); -}else{ -_560.val(opts.prompt).addClass("textbox-prompt"); -} -} -if(opts.value){ -$(this).closest(".form-field").removeClass("form-field-empty"); -}else{ -$(this).closest(".form-field").addClass("form-field-empty"); -} -$(this).textbox("validate"); -}); -},initValue:function(jq,_561){ -return jq.each(function(){ -var _562=$.data(this,"textbox"); -$(this).textbox("setText",_561); -_562.textbox.find(".textbox-value").val(_561); -$(this).val(_561); -}); -},setValue:function(jq,_563){ -return jq.each(function(){ -var opts=$.data(this,"textbox").options; -var _564=$(this).textbox("getValue"); -$(this).textbox("initValue",_563); -if(_564!=_563){ -opts.onChange.call(this,_563,_564); -$(this).closest("form").trigger("_change",[this]); -} -}); -},getText:function(jq){ -var _565=jq.textbox("textbox"); -if(_565.is(":focus")){ -return _565.val(); -}else{ -return jq.textbox("options").value; -} -},getValue:function(jq){ -return jq.data("textbox").textbox.find(".textbox-value").val(); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).textbox("options"); -$(this).textbox("textbox").val(opts.originalValue); -$(this).textbox("setValue",opts.originalValue); -}); -},getIcon:function(jq,_566){ -return jq.data("textbox").textbox.find(".textbox-icon:eq("+_566+")"); -},getTipX:function(jq,_567){ -var _568=jq.data("textbox"); -var opts=_568.options; -var tb=_568.textbox; -var _569=tb.find(".textbox-text"); -var _567=_567||opts.tipPosition; -var p1=tb.offset(); -var p2=_569.offset(); -var w1=tb.outerWidth(); -var w2=_569.outerWidth(); -if(_567=="right"){ -return w1-w2-p2.left+p1.left; -}else{ -if(_567=="left"){ -return p1.left-p2.left; -}else{ -return (w1-w2-p2.left+p1.left)/2-(p2.left-p1.left)/2; -} -} -},getTipY:function(jq,_56a){ -var _56b=jq.data("textbox"); -var opts=_56b.options; -var tb=_56b.textbox; -var _56c=tb.find(".textbox-text"); -var _56a=_56a||opts.tipPosition; -var p1=tb.offset(); -var p2=_56c.offset(); -var h1=tb.outerHeight(); -var h2=_56c.outerHeight(); -if(_56a=="left"||_56a=="right"){ -return (h1-h2-p2.top+p1.top)/2-(p2.top-p1.top)/2; -}else{ -if(_56a=="bottom"){ -return (h1-h2-p2.top+p1.top); -}else{ -return (p1.top-p2.top); -} -} -},getSelectionStart:function(jq){ -return jq.textbox("getSelectionRange").start; -},getSelectionRange:function(jq){ -var _56d=jq.textbox("textbox")[0]; -var _56e=0; -var end=0; -if(typeof _56d.selectionStart=="number"){ -_56e=_56d.selectionStart; -end=_56d.selectionEnd; -}else{ -if(_56d.createTextRange){ -var s=document.selection.createRange(); -var _56f=_56d.createTextRange(); -_56f.setEndPoint("EndToStart",s); -_56e=_56f.text.length; -end=_56e+s.text.length; -} -} -return {start:_56e,end:end}; -},setSelectionRange:function(jq,_570){ -return jq.each(function(){ -var _571=$(this).textbox("textbox")[0]; -var _572=_570.start; -var end=_570.end; -if(_571.setSelectionRange){ -_571.setSelectionRange(_572,end); -}else{ -if(_571.createTextRange){ -var _573=_571.createTextRange(); -_573.collapse(); -_573.moveEnd("character",end); -_573.moveStart("character",_572); -_573.select(); -} -} -}); -}}; -$.fn.textbox.parseOptions=function(_574){ -var t=$(_574); -return $.extend({},$.fn.validatebox.parseOptions(_574),$.parser.parseOptions(_574,["prompt","iconCls","iconAlign","buttonText","buttonIcon","buttonAlign","label","labelPosition","labelAlign",{multiline:"boolean",iconWidth:"number",labelWidth:"number"}]),{value:(t.val()||undefined),type:(t.attr("type")?t.attr("type"):undefined)}); -}; -$.fn.textbox.defaults=$.extend({},$.fn.validatebox.defaults,{doSize:true,width:"auto",height:"auto",cls:null,prompt:"",value:"",type:"text",multiline:false,icons:[],iconCls:null,iconAlign:"right",iconWidth:26,buttonText:"",buttonIcon:null,buttonAlign:"right",label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",inputEvents:{blur:function(e){ -var t=$(e.data.target); -var opts=t.textbox("options"); -if(t.textbox("getValue")!=opts.value){ -t.textbox("setValue",opts.value); -} -},keydown:function(e){ -if(e.keyCode==13){ -var t=$(e.data.target); -t.textbox("setValue",t.textbox("getText")); -} -}},onChange:function(_575,_576){ -},onResizing:function(_577,_578){ -},onResize:function(_579,_57a){ -},onClickButton:function(){ -},onClickIcon:function(_57b){ -}}); -})(jQuery); -(function($){ -function _57c(_57d){ -var _57e=$.data(_57d,"passwordbox"); -var opts=_57e.options; -var _57f=$.extend(true,[],opts.icons); -if(opts.showEye){ -_57f.push({iconCls:"passwordbox-open",handler:function(e){ -opts.revealed=!opts.revealed; -_580(_57d); -}}); -} -$(_57d).addClass("passwordbox-f").textbox($.extend({},opts,{icons:_57f})); -_580(_57d); -}; -function _581(_582,_583,all){ -var t=$(_582); -var opts=t.passwordbox("options"); -if(opts.revealed){ -t.textbox("setValue",_583); -return; -} -var _584=unescape(opts.passwordChar); -var cc=_583.split(""); -var vv=t.passwordbox("getValue").split(""); -for(var i=0;i=0){ -vv.splice(_5ad,1); -} -}else{ -var _5ab=_5a3(_5a8,_5aa.start); -var end=_5ac(_5a8,_5aa.end); -var _5ad=_5ab-_5a5(_5a8,_5ab); -var _5ae=end-_5a5(_5a8,end); -vv.splice(_5ad,_5ae-_5ad+1); -} -$(_5a8).maskedbox("setValue",_59c(_5a8,vv.join(""))); -$(_5a8).maskedbox("setSelectionRange",{start:_5ab,end:_5ab}); -}; -function _5a5(_5af,pos){ -var opts=$(_5af).maskedbox("options"); -var _5b0=0; -if(pos>=opts.mask.length){ -pos--; -} -for(var i=pos;i>=0;i--){ -if(opts.masks[opts.mask[i]]==undefined){ -_5b0++; -} -} -return _5b0; -}; -function _5a3(_5b1,pos){ -var opts=$(_5b1).maskedbox("options"); -var m=opts.mask[pos]; -var r=opts.masks[m]; -while(pos=0&&!r){ -pos--; -m=opts.mask[pos]; -r=opts.masks[m]; -} -return pos<0?0:pos; -}; -function _5b3(e){ -if(e.metaKey||e.ctrlKey){ -return; -} -var _5b4=e.data.target; -var opts=$(_5b4).maskedbox("options"); -var _5b5=[9,13,35,36,37,39]; -if($.inArray(e.keyCode,_5b5)!=-1){ -return true; -} -if(e.keyCode>=96&&e.keyCode<=105){ -e.keyCode-=48; -} -var c=String.fromCharCode(e.keyCode); -if(e.keyCode>=65&&e.keyCode<=90&&!e.shiftKey){ -c=c.toLowerCase(); -}else{ -if(e.keyCode==189){ -c="-"; -}else{ -if(e.keyCode==187){ -c="+"; -}else{ -if(e.keyCode==190){ -c="."; -} -} -} -} -if(e.keyCode==8){ -_5a7(_5b4,true); -}else{ -if(e.keyCode==46){ -_5a7(_5b4,false); -}else{ -_59f(_5b4,c); -} -} -return false; -}; -$.extend($.fn.textbox.methods,{inputMask:function(jq,_5b6){ -return jq.each(function(){ -var _5b7=this; -var opts=$.extend({},$.fn.maskedbox.defaults,_5b6); -$.data(_5b7,"maskedbox",{options:opts}); -var _5b8=$(_5b7).textbox("textbox"); -_5b8.unbind(".maskedbox"); -for(var _5b9 in opts.inputEvents){ -_5b8.bind(_5b9+".maskedbox",{target:_5b7},opts.inputEvents[_5b9]); -} -}); -}}); -$.fn.maskedbox=function(_5ba,_5bb){ -if(typeof _5ba=="string"){ -var _5bc=$.fn.maskedbox.methods[_5ba]; -if(_5bc){ -return _5bc(this,_5bb); -}else{ -return this.textbox(_5ba,_5bb); -} -} -_5ba=_5ba||{}; -return this.each(function(){ -var _5bd=$.data(this,"maskedbox"); -if(_5bd){ -$.extend(_5bd.options,_5ba); -}else{ -$.data(this,"maskedbox",{options:$.extend({},$.fn.maskedbox.defaults,$.fn.maskedbox.parseOptions(this),_5ba)}); -} -_596(this); -}); -}; -$.fn.maskedbox.methods={options:function(jq){ -var opts=jq.textbox("options"); -return $.extend($.data(jq[0],"maskedbox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -},initValue:function(jq,_5be){ -return jq.each(function(){ -_5be=_59c(this,_599(this,_5be)); -$(this).textbox("initValue",_5be); -}); -},setValue:function(jq,_5bf){ -return jq.each(function(){ -_5bf=_59c(this,_599(this,_5bf)); -$(this).textbox("setValue",_5bf); -}); -}}; -$.fn.maskedbox.parseOptions=function(_5c0){ -var t=$(_5c0); -return $.extend({},$.fn.textbox.parseOptions(_5c0),$.parser.parseOptions(_5c0,["mask","promptChar"]),{}); -}; -$.fn.maskedbox.defaults=$.extend({},$.fn.textbox.defaults,{mask:"",promptChar:"_",masks:{"9":"[0-9]","a":"[a-zA-Z]","*":"[0-9a-zA-Z]"},inputEvents:{keydown:_5b3}}); -})(jQuery); -(function($){ -var _5c1=0; -function _5c2(_5c3){ -var _5c4=$.data(_5c3,"filebox"); -var opts=_5c4.options; -opts.fileboxId="filebox_file_id_"+(++_5c1); -$(_5c3).addClass("filebox-f").textbox(opts); -$(_5c3).textbox("textbox").attr("readonly","readonly"); -_5c4.filebox=$(_5c3).next().addClass("filebox"); -var file=_5c5(_5c3); -var btn=$(_5c3).filebox("button"); -if(btn.length){ -$("").appendTo(btn); -if(btn.linkbutton("options").disabled){ -file._propAttr("disabled",true); -}else{ -file._propAttr("disabled",false); -} -} -}; -function _5c5(_5c6){ -var _5c7=$.data(_5c6,"filebox"); -var opts=_5c7.options; -_5c7.filebox.find(".textbox-value").remove(); -opts.oldValue=""; -var file=$("").appendTo(_5c7.filebox); -file.attr("id",opts.fileboxId).attr("name",$(_5c6).attr("textboxName")||""); -file.attr("accept",opts.accept); -file.attr("capture",opts.capture); -if(opts.multiple){ -file.attr("multiple","multiple"); -} -file.change(function(){ -var _5c8=this.value; -if(this.files){ -_5c8=$.map(this.files,function(file){ -return file.name; -}).join(opts.separator); -} -$(_5c6).filebox("setText",_5c8); -opts.onChange.call(_5c6,_5c8,opts.oldValue); -opts.oldValue=_5c8; -}); -return file; -}; -$.fn.filebox=function(_5c9,_5ca){ -if(typeof _5c9=="string"){ -var _5cb=$.fn.filebox.methods[_5c9]; -if(_5cb){ -return _5cb(this,_5ca); -}else{ -return this.textbox(_5c9,_5ca); -} -} -_5c9=_5c9||{}; -return this.each(function(){ -var _5cc=$.data(this,"filebox"); -if(_5cc){ -$.extend(_5cc.options,_5c9); -}else{ -$.data(this,"filebox",{options:$.extend({},$.fn.filebox.defaults,$.fn.filebox.parseOptions(this),_5c9)}); -} -_5c2(this); -}); -}; -$.fn.filebox.methods={options:function(jq){ -var opts=jq.textbox("options"); -return $.extend($.data(jq[0],"filebox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -},clear:function(jq){ -return jq.each(function(){ -$(this).textbox("clear"); -_5c5(this); -}); -},reset:function(jq){ -return jq.each(function(){ -$(this).filebox("clear"); -}); -},setValue:function(jq){ -return jq; -},setValues:function(jq){ -return jq; -},files:function(jq){ -return jq.next().find(".textbox-value")[0].files; -}}; -$.fn.filebox.parseOptions=function(_5cd){ -var t=$(_5cd); -return $.extend({},$.fn.textbox.parseOptions(_5cd),$.parser.parseOptions(_5cd,["accept","capture","separator"]),{multiple:(t.attr("multiple")?true:undefined)}); -}; -$.fn.filebox.defaults=$.extend({},$.fn.textbox.defaults,{buttonIcon:null,buttonText:"Choose File",buttonAlign:"right",inputEvents:{},accept:"",capture:"",separator:",",multiple:false}); -})(jQuery); -(function($){ -function _5ce(_5cf){ -var _5d0=$.data(_5cf,"searchbox"); -var opts=_5d0.options; -var _5d1=$.extend(true,[],opts.icons); -_5d1.push({iconCls:"searchbox-button",handler:function(e){ -var t=$(e.data.target); -var opts=t.searchbox("options"); -opts.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); -}}); -_5d2(); -var _5d3=_5d4(); -$(_5cf).addClass("searchbox-f").textbox($.extend({},opts,{icons:_5d1,buttonText:(_5d3?_5d3.text:"")})); -$(_5cf).attr("searchboxName",$(_5cf).attr("textboxName")); -_5d0.searchbox=$(_5cf).next(); -_5d0.searchbox.addClass("searchbox"); -_5d5(_5d3); -function _5d2(){ -if(opts.menu){ -_5d0.menu=$(opts.menu).menu(); -var _5d6=_5d0.menu.menu("options"); -var _5d7=_5d6.onClick; -_5d6.onClick=function(item){ -_5d5(item); -_5d7.call(this,item); -}; -}else{ -if(_5d0.menu){ -_5d0.menu.menu("destroy"); -} -_5d0.menu=null; -} -}; -function _5d4(){ -if(_5d0.menu){ -var item=_5d0.menu.children("div.menu-item:first"); -_5d0.menu.children("div.menu-item").each(function(){ -var _5d8=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); -if(_5d8.selected){ -item=$(this); -return false; -} -}); -return _5d0.menu.menu("getItem",item[0]); -}else{ -return null; -} -}; -function _5d5(item){ -if(!item){ -return; -} -$(_5cf).textbox("button").menubutton({text:item.text,iconCls:(item.iconCls||null),menu:_5d0.menu,menuAlign:opts.buttonAlign,plain:false}); -_5d0.searchbox.find("input.textbox-value").attr("name",item.name||item.text); -$(_5cf).searchbox("resize"); -}; -}; -$.fn.searchbox=function(_5d9,_5da){ -if(typeof _5d9=="string"){ -var _5db=$.fn.searchbox.methods[_5d9]; -if(_5db){ -return _5db(this,_5da); -}else{ -return this.textbox(_5d9,_5da); -} -} -_5d9=_5d9||{}; -return this.each(function(){ -var _5dc=$.data(this,"searchbox"); -if(_5dc){ -$.extend(_5dc.options,_5d9); -}else{ -$.data(this,"searchbox",{options:$.extend({},$.fn.searchbox.defaults,$.fn.searchbox.parseOptions(this),_5d9)}); -} -_5ce(this); -}); -}; -$.fn.searchbox.methods={options:function(jq){ -var opts=jq.textbox("options"); -return $.extend($.data(jq[0],"searchbox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -},menu:function(jq){ -return $.data(jq[0],"searchbox").menu; -},getName:function(jq){ -return $.data(jq[0],"searchbox").searchbox.find("input.textbox-value").attr("name"); -},selectName:function(jq,name){ -return jq.each(function(){ -var menu=$.data(this,"searchbox").menu; -if(menu){ -menu.children("div.menu-item").each(function(){ -var item=menu.menu("getItem",this); -if(item.name==name){ -$(this).trigger("click"); -return false; -} -}); -} -}); -},destroy:function(jq){ -return jq.each(function(){ -var menu=$(this).searchbox("menu"); -if(menu){ -menu.menu("destroy"); -} -$(this).textbox("destroy"); -}); -}}; -$.fn.searchbox.parseOptions=function(_5dd){ -var t=$(_5dd); -return $.extend({},$.fn.textbox.parseOptions(_5dd),$.parser.parseOptions(_5dd,["menu"]),{searcher:(t.attr("searcher")?eval(t.attr("searcher")):undefined)}); -}; -$.fn.searchbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:$.extend({},$.fn.textbox.defaults.inputEvents,{keydown:function(e){ -if(e.keyCode==13){ -e.preventDefault(); -var t=$(e.data.target); -var opts=t.searchbox("options"); -t.searchbox("setValue",$(this).val()); -opts.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); -return false; -} -}}),buttonAlign:"left",menu:null,searcher:function(_5de,name){ -}}); -})(jQuery); -(function($){ -function _5df(_5e0,_5e1){ -var opts=$.data(_5e0,"form").options; -$.extend(opts,_5e1||{}); -var _5e2=$.extend({},opts.queryParams); -if(opts.onSubmit.call(_5e0,_5e2)==false){ -return; -} -var _5e3=$(_5e0).find(".textbox-text:focus"); -_5e3.triggerHandler("blur"); -_5e3.focus(); -var _5e4=null; -if(opts.dirty){ -var ff=[]; -$.map(opts.dirtyFields,function(f){ -if($(f).hasClass("textbox-f")){ -$(f).next().find(".textbox-value").each(function(){ -ff.push(this); -}); -}else{ -ff.push(f); -} -}); -_5e4=$(_5e0).find("input[name]:enabled,textarea[name]:enabled,select[name]:enabled").filter(function(){ -return $.inArray(this,ff)==-1; -}); -_5e4._propAttr("disabled",true); -} -if(opts.ajax){ -if(opts.iframe){ -_5e5(_5e0,_5e2); -}else{ -if(window.FormData!==undefined){ -_5e6(_5e0,_5e2); -}else{ -_5e5(_5e0,_5e2); -} -} -}else{ -$(_5e0).submit(); -} -if(opts.dirty){ -_5e4._propAttr("disabled",false); -} -}; -function _5e5(_5e7,_5e8){ -var opts=$.data(_5e7,"form").options; -var _5e9="easyui_frame_"+(new Date().getTime()); -var _5ea=$("").appendTo("body"); -_5ea.attr("src",window.ActiveXObject?"javascript:false":"about:blank"); -_5ea.css({position:"absolute",top:-1000,left:-1000}); -_5ea.bind("load",cb); -_5eb(_5e8); -function _5eb(_5ec){ -var form=$(_5e7); -if(opts.url){ -form.attr("action",opts.url); -} -var t=form.attr("target"),a=form.attr("action"); -form.attr("target",_5e9); -var _5ed=$(); -try{ -for(var n in _5ec){ -var _5ee=$("").val(_5ec[n]).appendTo(form); -_5ed=_5ed.add(_5ee); -} -_5ef(); -form[0].submit(); -} -finally{ -form.attr("action",a); -t?form.attr("target",t):form.removeAttr("target"); -_5ed.remove(); -} -}; -function _5ef(){ -var f=$("#"+_5e9); -if(!f.length){ -return; -} -try{ -var s=f.contents()[0].readyState; -if(s&&s.toLowerCase()=="uninitialized"){ -setTimeout(_5ef,100); -} -} -catch(e){ -cb(); -} -}; -var _5f0=10; -function cb(){ -var f=$("#"+_5e9); -if(!f.length){ -return; -} -f.unbind(); -var data=""; -try{ -var body=f.contents().find("body"); -data=body.html(); -if(data==""){ -if(--_5f0){ -setTimeout(cb,100); -return; -} -} -var ta=body.find(">textarea"); -if(ta.length){ -data=ta.val(); -}else{ -var pre=body.find(">pre"); -if(pre.length){ -data=pre.html(); -} -} -} -catch(e){ -} -opts.success.call(_5e7,data); -setTimeout(function(){ -f.unbind(); -f.remove(); -},100); -}; -}; -function _5e6(_5f1,_5f2){ -var opts=$.data(_5f1,"form").options; -var _5f3=new FormData($(_5f1)[0]); -for(var name in _5f2){ -_5f3.append(name,_5f2[name]); -} -$.ajax({url:opts.url,type:"post",xhr:function(){ -var xhr=$.ajaxSettings.xhr(); -if(xhr.upload){ -xhr.upload.addEventListener("progress",function(e){ -if(e.lengthComputable){ -var _5f4=e.total; -var _5f5=e.loaded||e.position; -var _5f6=Math.ceil(_5f5*100/_5f4); -opts.onProgress.call(_5f1,_5f6); -} -},false); -} -return xhr; -},data:_5f3,dataType:"html",cache:false,contentType:false,processData:false,complete:function(res){ -opts.success.call(_5f1,res.responseText); -}}); -}; -function load(_5f7,data){ -var opts=$.data(_5f7,"form").options; -if(typeof data=="string"){ -var _5f8={}; -if(opts.onBeforeLoad.call(_5f7,_5f8)==false){ -return; -} -$.ajax({url:data,data:_5f8,dataType:"json",success:function(data){ -_5f9(data); -},error:function(){ -opts.onLoadError.apply(_5f7,arguments); -}}); -}else{ -_5f9(data); -} -function _5f9(data){ -var form=$(_5f7); -for(var name in data){ -var val=data[name]; -if(!_5fa(name,val)){ -if(!_5fb(name,val)){ -form.find("input[name=\""+name+"\"]").val(val); -form.find("textarea[name=\""+name+"\"]").val(val); -form.find("select[name=\""+name+"\"]").val(val); -} -} -} -opts.onLoadSuccess.call(_5f7,data); -form.form("validate"); -}; -function _5fa(name,val){ -var cc=$(_5f7).find("[switchbuttonName=\""+name+"\"]"); -if(cc.length){ -cc.switchbutton("uncheck"); -cc.each(function(){ -if(_5fc($(this).switchbutton("options").value,val)){ -$(this).switchbutton("check"); -} -}); -return true; -} -cc=$(_5f7).find("input[name=\""+name+"\"][type=radio], input[name=\""+name+"\"][type=checkbox]"); -if(cc.length){ -cc._propAttr("checked",false); -cc.each(function(){ -if(_5fc($(this).val(),val)){ -$(this)._propAttr("checked",true); -} -}); -return true; -} -return false; -}; -function _5fc(v,val){ -if(v==String(val)||$.inArray(v,$.isArray(val)?val:[val])>=0){ -return true; -}else{ -return false; -} -}; -function _5fb(name,val){ -var _5fd=$(_5f7).find("[textboxName=\""+name+"\"],[sliderName=\""+name+"\"]"); -if(_5fd.length){ -for(var i=0;i=0;i--){ -var type=opts.fieldTypes[i]; -var _605=form.find("."+type+"-f"); -if(_605.length&&_605[type]){ -_605[type]("reset"); -} -} -form.form("validate"); -}; -function _606(_607){ -var _608=$.data(_607,"form").options; -$(_607).unbind(".form"); -if(_608.ajax){ -$(_607).bind("submit.form",function(){ -setTimeout(function(){ -_5df(_607,_608); -},0); -return false; -}); -} -$(_607).bind("_change.form",function(e,t){ -if($.inArray(t,_608.dirtyFields)==-1){ -_608.dirtyFields.push(t); -} -_608.onChange.call(this,t); -}).bind("change.form",function(e){ -var t=e.target; -if(!$(t).hasClass("textbox-text")){ -if($.inArray(t,_608.dirtyFields)==-1){ -_608.dirtyFields.push(t); -} -_608.onChange.call(this,t); -} -}); -_609(_607,_608.novalidate); -}; -function _60a(_60b,_60c){ -_60c=_60c||{}; -var _60d=$.data(_60b,"form"); -if(_60d){ -$.extend(_60d.options,_60c); -}else{ -$.data(_60b,"form",{options:$.extend({},$.fn.form.defaults,$.fn.form.parseOptions(_60b),_60c)}); -} -}; -function _60e(_60f){ -if($.fn.validatebox){ -var t=$(_60f); -t.find(".validatebox-text:not(:disabled)").validatebox("validate"); -var _610=t.find(".validatebox-invalid"); -_610.filter(":not(:disabled):first").focus(); -return _610.length==0; -} -return true; -}; -function _609(_611,_612){ -var opts=$.data(_611,"form").options; -opts.novalidate=_612; -$(_611).find(".validatebox-text:not(:disabled)").validatebox(_612?"disableValidation":"enableValidation"); -}; -$.fn.form=function(_613,_614){ -if(typeof _613=="string"){ -this.each(function(){ -_60a(this); -}); -return $.fn.form.methods[_613](this,_614); -} -return this.each(function(){ -_60a(this,_613); -_606(this); -}); -}; -$.fn.form.methods={options:function(jq){ -return $.data(jq[0],"form").options; -},submit:function(jq,_615){ -return jq.each(function(){ -_5df(this,_615); -}); -},load:function(jq,data){ -return jq.each(function(){ -load(this,data); -}); -},clear:function(jq){ -return jq.each(function(){ -_5ff(this); -}); -},reset:function(jq){ -return jq.each(function(){ -_603(this); -}); -},validate:function(jq){ -return _60e(jq[0]); -},disableValidation:function(jq){ -return jq.each(function(){ -_609(this,true); -}); -},enableValidation:function(jq){ -return jq.each(function(){ -_609(this,false); -}); -},resetValidation:function(jq){ -return jq.each(function(){ -$(this).find(".validatebox-text:not(:disabled)").validatebox("resetValidation"); -}); -},resetDirty:function(jq){ -return jq.each(function(){ -$(this).form("options").dirtyFields=[]; -}); -}}; -$.fn.form.parseOptions=function(_616){ -var t=$(_616); -return $.extend({},$.parser.parseOptions(_616,[{ajax:"boolean",dirty:"boolean"}]),{url:(t.attr("action")?t.attr("action"):undefined)}); -}; -$.fn.form.defaults={fieldTypes:["tagbox","combobox","combotree","combogrid","combotreegrid","datetimebox","datebox","combo","datetimespinner","timespinner","numberspinner","spinner","slider","searchbox","numberbox","passwordbox","filebox","textbox","switchbutton"],novalidate:false,ajax:true,iframe:true,dirty:false,dirtyFields:[],url:null,queryParams:{},onSubmit:function(_617){ -return $(this).form("validate"); -},onProgress:function(_618){ -},success:function(data){ -},onBeforeLoad:function(_619){ -},onLoadSuccess:function(data){ -},onLoadError:function(){ -},onChange:function(_61a){ -}}; -})(jQuery); -(function($){ -function _61b(_61c){ -var _61d=$.data(_61c,"numberbox"); -var opts=_61d.options; -$(_61c).addClass("numberbox-f").textbox(opts); -$(_61c).textbox("textbox").css({imeMode:"disabled"}); -$(_61c).attr("numberboxName",$(_61c).attr("textboxName")); -_61d.numberbox=$(_61c).next(); -_61d.numberbox.addClass("numberbox"); -var _61e=opts.parser.call(_61c,opts.value); -var _61f=opts.formatter.call(_61c,_61e); -$(_61c).numberbox("initValue",_61e).numberbox("setText",_61f); -}; -function _620(_621,_622){ -var _623=$.data(_621,"numberbox"); -var opts=_623.options; -opts.value=parseFloat(_622); -var _622=opts.parser.call(_621,_622); -var text=opts.formatter.call(_621,_622); -opts.value=_622; -$(_621).textbox("setText",text).textbox("setValue",_622); -text=opts.formatter.call(_621,$(_621).textbox("getValue")); -$(_621).textbox("setText",text); -}; -$.fn.numberbox=function(_624,_625){ -if(typeof _624=="string"){ -var _626=$.fn.numberbox.methods[_624]; -if(_626){ -return _626(this,_625); -}else{ -return this.textbox(_624,_625); -} -} -_624=_624||{}; -return this.each(function(){ -var _627=$.data(this,"numberbox"); -if(_627){ -$.extend(_627.options,_624); -}else{ -_627=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_624)}); -} -_61b(this); -}); -}; -$.fn.numberbox.methods={options:function(jq){ -var opts=jq.data("textbox")?jq.textbox("options"):{}; -return $.extend($.data(jq[0],"numberbox").options,{width:opts.width,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).textbox("cloneFrom",from); -$.data(this,"numberbox",{options:$.extend(true,{},$(from).numberbox("options"))}); -$(this).addClass("numberbox-f"); -}); -},fix:function(jq){ -return jq.each(function(){ -var opts=$(this).numberbox("options"); -opts.value=null; -var _628=opts.parser.call(this,$(this).numberbox("getText")); -$(this).numberbox("setValue",_628); -}); -},setValue:function(jq,_629){ -return jq.each(function(){ -_620(this,_629); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).textbox("clear"); -$(this).numberbox("options").value=""; -}); -},reset:function(jq){ -return jq.each(function(){ -$(this).textbox("reset"); -$(this).numberbox("setValue",$(this).numberbox("getValue")); -}); -}}; -$.fn.numberbox.parseOptions=function(_62a){ -var t=$(_62a); -return $.extend({},$.fn.textbox.parseOptions(_62a),$.parser.parseOptions(_62a,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined)}); -}; -$.fn.numberbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{keypress:function(e){ -var _62b=e.data.target; -var opts=$(_62b).numberbox("options"); -return opts.filter.call(_62b,e); -},blur:function(e){ -$(e.data.target).numberbox("fix"); -},keydown:function(e){ -if(e.keyCode==13){ -$(e.data.target).numberbox("fix"); -} -}},min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",filter:function(e){ -var opts=$(this).numberbox("options"); -var s=$(this).numberbox("getText"); -if(e.metaKey||e.ctrlKey){ -return true; -} -if($.inArray(String(e.which),["46","8","13","0"])>=0){ -return true; -} -var tmp=$(""); -tmp.html(String.fromCharCode(e.which)); -var c=tmp.text(); -tmp.remove(); -if(!c){ -return true; -} -if(c=="-"||c==opts.decimalSeparator){ -return (s.indexOf(c)==-1)?true:false; -}else{ -if(c==opts.groupSeparator){ -return true; -}else{ -if("0123456789".indexOf(c)>=0){ -return true; -}else{ -return false; -} -} -} -},formatter:function(_62c){ -if(!_62c){ -return _62c; -} -_62c=_62c+""; -var opts=$(this).numberbox("options"); -var s1=_62c,s2=""; -var dpos=_62c.indexOf("."); -if(dpos>=0){ -s1=_62c.substring(0,dpos); -s2=_62c.substring(dpos+1,_62c.length); -} -if(opts.groupSeparator){ -var p=/(\d+)(\d{3})/; -while(p.test(s1)){ -s1=s1.replace(p,"$1"+opts.groupSeparator+"$2"); -} -} -if(s2){ -return opts.prefix+s1+opts.decimalSeparator+s2+opts.suffix; -}else{ -return opts.prefix+s1+opts.suffix; -} -},parser:function(s){ -s=s+""; -var opts=$(this).numberbox("options"); -if(opts.prefix){ -s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.prefix),"g"),"")); -} -if(opts.suffix){ -s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.suffix),"g"),"")); -} -if(parseFloat(s)!=opts.value){ -if(opts.groupSeparator){ -s=$.trim(s.replace(new RegExp("\\"+opts.groupSeparator,"g"),"")); -} -if(opts.decimalSeparator){ -s=$.trim(s.replace(new RegExp("\\"+opts.decimalSeparator,"g"),".")); -} -s=s.replace(/\s/g,""); -} -var val=parseFloat(s).toFixed(opts.precision); -if(isNaN(val)){ -val=""; -}else{ -if(typeof (opts.min)=="number"&&valopts.max){ -val=opts.max.toFixed(opts.precision); -} -} -} -return val; -}}); -})(jQuery); -(function($){ -function _62d(_62e,_62f){ -var opts=$.data(_62e,"calendar").options; -var t=$(_62e); -if(_62f){ -$.extend(opts,{width:_62f.width,height:_62f.height}); -} -t._size(opts,t.parent()); -t.find(".calendar-body")._outerHeight(t.height()-t.find(".calendar-header")._outerHeight()); -if(t.find(".calendar-menu").is(":visible")){ -_630(_62e); -} -}; -function init(_631){ -$(_631).addClass("calendar").html("
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+""+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+""+""+""+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "); -$(_631).bind("_resize",function(e,_632){ -if($(this).hasClass("easyui-fluid")||_632){ -_62d(_631); -} -return false; -}); -}; -function _633(_634){ -var opts=$.data(_634,"calendar").options; -var menu=$(_634).find(".calendar-menu"); -menu.find(".calendar-menu-year").unbind(".calendar").bind("keypress.calendar",function(e){ -if(e.keyCode==13){ -_635(true); -} -}); -$(_634).unbind(".calendar").bind("mouseover.calendar",function(e){ -var t=_636(e.target); -if(t.hasClass("calendar-nav")||t.hasClass("calendar-text")||(t.hasClass("calendar-day")&&!t.hasClass("calendar-disabled"))){ -t.addClass("calendar-nav-hover"); -} -}).bind("mouseout.calendar",function(e){ -var t=_636(e.target); -if(t.hasClass("calendar-nav")||t.hasClass("calendar-text")||(t.hasClass("calendar-day")&&!t.hasClass("calendar-disabled"))){ -t.removeClass("calendar-nav-hover"); -} -}).bind("click.calendar",function(e){ -var t=_636(e.target); -if(t.hasClass("calendar-menu-next")||t.hasClass("calendar-nextyear")){ -_637(1); -}else{ -if(t.hasClass("calendar-menu-prev")||t.hasClass("calendar-prevyear")){ -_637(-1); -}else{ -if(t.hasClass("calendar-menu-month")){ -menu.find(".calendar-selected").removeClass("calendar-selected"); -t.addClass("calendar-selected"); -_635(true); -}else{ -if(t.hasClass("calendar-prevmonth")){ -_638(-1); -}else{ -if(t.hasClass("calendar-nextmonth")){ -_638(1); -}else{ -if(t.hasClass("calendar-text")){ -if(menu.is(":visible")){ -menu.hide(); -}else{ -_630(_634); -} -}else{ -if(t.hasClass("calendar-day")){ -if(t.hasClass("calendar-disabled")){ -return; -} -var _639=opts.current; -t.closest("div.calendar-body").find(".calendar-selected").removeClass("calendar-selected"); -t.addClass("calendar-selected"); -var _63a=t.attr("abbr").split(","); -var y=parseInt(_63a[0]); -var m=parseInt(_63a[1]); -var d=parseInt(_63a[2]); -opts.current=new Date(y,m-1,d); -opts.onSelect.call(_634,opts.current); -if(!_639||_639.getTime()!=opts.current.getTime()){ -opts.onChange.call(_634,opts.current,_639); -} -if(opts.year!=y||opts.month!=m){ -opts.year=y; -opts.month=m; -show(_634); -} -} -} -} -} -} -} -} -}); -function _636(t){ -var day=$(t).closest(".calendar-day"); -if(day.length){ -return day; -}else{ -return $(t); -} -}; -function _635(_63b){ -var menu=$(_634).find(".calendar-menu"); -var year=menu.find(".calendar-menu-year").val(); -var _63c=menu.find(".calendar-selected").attr("abbr"); -if(!isNaN(year)){ -opts.year=parseInt(year); -opts.month=parseInt(_63c); -show(_634); -} -if(_63b){ -menu.hide(); -} -}; -function _637(_63d){ -opts.year+=_63d; -show(_634); -menu.find(".calendar-menu-year").val(opts.year); -}; -function _638(_63e){ -opts.month+=_63e; -if(opts.month>12){ -opts.year++; -opts.month=1; -}else{ -if(opts.month<1){ -opts.year--; -opts.month=12; -} -} -show(_634); -menu.find("td.calendar-selected").removeClass("calendar-selected"); -menu.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); -}; -}; -function _630(_63f){ -var opts=$.data(_63f,"calendar").options; -$(_63f).find(".calendar-menu").show(); -if($(_63f).find(".calendar-menu-month-inner").is(":empty")){ -$(_63f).find(".calendar-menu-month-inner").empty(); -var t=$("
                                                                                                                                                        ").appendTo($(_63f).find(".calendar-menu-month-inner")); -var idx=0; -for(var i=0;i<3;i++){ -var tr=$("").appendTo(t); -for(var j=0;j<4;j++){ -$("").html(opts.months[idx++]).attr("abbr",idx).appendTo(tr); -} -} -} -var body=$(_63f).find(".calendar-body"); -var sele=$(_63f).find(".calendar-menu"); -var _640=sele.find(".calendar-menu-year-inner"); -var _641=sele.find(".calendar-menu-month-inner"); -_640.find("input").val(opts.year).focus(); -_641.find("td.calendar-selected").removeClass("calendar-selected"); -_641.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected"); -sele._outerWidth(body._outerWidth()); -sele._outerHeight(body._outerHeight()); -_641._outerHeight(sele.height()-_640._outerHeight()); -}; -function _642(_643,year,_644){ -var opts=$.data(_643,"calendar").options; -var _645=[]; -var _646=new Date(year,_644,0).getDate(); -for(var i=1;i<=_646;i++){ -_645.push([year,_644,i]); -} -var _647=[],week=[]; -var _648=-1; -while(_645.length>0){ -var date=_645.shift(); -week.push(date); -var day=new Date(date[0],date[1]-1,date[2]).getDay(); -if(_648==day){ -day=0; -}else{ -if(day==(opts.firstDay==0?7:opts.firstDay)-1){ -_647.push(week); -week=[]; -} -} -_648=day; -} -if(week.length){ -_647.push(week); -} -var _649=_647[0]; -if(_649.length<7){ -while(_649.length<7){ -var _64a=_649[0]; -var date=new Date(_64a[0],_64a[1]-1,_64a[2]-1); -_649.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -}else{ -var _64a=_649[0]; -var week=[]; -for(var i=1;i<=7;i++){ -var date=new Date(_64a[0],_64a[1]-1,_64a[2]-i); -week.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -_647.unshift(week); -} -var _64b=_647[_647.length-1]; -while(_64b.length<7){ -var _64c=_64b[_64b.length-1]; -var date=new Date(_64c[0],_64c[1]-1,_64c[2]+1); -_64b.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -if(_647.length<6){ -var _64c=_64b[_64b.length-1]; -var week=[]; -for(var i=1;i<=7;i++){ -var date=new Date(_64c[0],_64c[1]-1,_64c[2]+i); -week.push([date.getFullYear(),date.getMonth()+1,date.getDate()]); -} -_647.push(week); -} -return _647; -}; -function show(_64d){ -var opts=$.data(_64d,"calendar").options; -if(opts.current&&!opts.validator.call(_64d,opts.current)){ -opts.current=null; -} -var now=new Date(); -var _64e=now.getFullYear()+","+(now.getMonth()+1)+","+now.getDate(); -var _64f=opts.current?(opts.current.getFullYear()+","+(opts.current.getMonth()+1)+","+opts.current.getDate()):""; -var _650=6-opts.firstDay; -var _651=_650+1; -if(_650>=7){ -_650-=7; -} -if(_651>=7){ -_651-=7; -} -$(_64d).find(".calendar-title span").html(opts.months[opts.month-1]+" "+opts.year); -var body=$(_64d).find("div.calendar-body"); -body.children("table").remove(); -var data=[""]; -data.push(""); -if(opts.showWeek){ -data.push(""); -} -for(var i=opts.firstDay;i"+opts.weeks[i]+""); -} -for(var i=0;i"+opts.weeks[i]+""); -} -data.push(""); -data.push(""); -var _652=_642(_64d,opts.year,opts.month); -for(var i=0;i<_652.length;i++){ -var week=_652[i]; -var cls=""; -if(i==0){ -cls="calendar-first"; -}else{ -if(i==_652.length-1){ -cls="calendar-last"; -} -} -data.push(""); -if(opts.showWeek){ -var _653=opts.getWeekNumber(new Date(week[0][0],parseInt(week[0][1])-1,week[0][2])); -data.push(""); -} -for(var j=0;j"+d+""); -} -data.push(""); -} -data.push(""); -data.push("
                                                                                                                                                        "+opts.weekNumberHeader+"
                                                                                                                                                        "+_653+"
                                                                                                                                                        "); -body.append(data.join("")); -body.children("table.calendar-dtable").prependTo(body); -opts.onNavigate.call(_64d,opts.year,opts.month); -}; -$.fn.calendar=function(_657,_658){ -if(typeof _657=="string"){ -return $.fn.calendar.methods[_657](this,_658); -} -_657=_657||{}; -return this.each(function(){ -var _659=$.data(this,"calendar"); -if(_659){ -$.extend(_659.options,_657); -}else{ -_659=$.data(this,"calendar",{options:$.extend({},$.fn.calendar.defaults,$.fn.calendar.parseOptions(this),_657)}); -init(this); -} -if(_659.options.border==false){ -$(this).addClass("calendar-noborder"); -} -_62d(this); -_633(this); -show(this); -$(this).find("div.calendar-menu").hide(); -}); -}; -$.fn.calendar.methods={options:function(jq){ -return $.data(jq[0],"calendar").options; -},resize:function(jq,_65a){ -return jq.each(function(){ -_62d(this,_65a); -}); -},moveTo:function(jq,date){ -return jq.each(function(){ -if(!date){ -var now=new Date(); -$(this).calendar({year:now.getFullYear(),month:now.getMonth()+1,current:date}); -return; -} -var opts=$(this).calendar("options"); -if(opts.validator.call(this,date)){ -var _65b=opts.current; -$(this).calendar({year:date.getFullYear(),month:date.getMonth()+1,current:date}); -if(!_65b||_65b.getTime()!=date.getTime()){ -opts.onChange.call(this,opts.current,_65b); -} -} -}); -}}; -$.fn.calendar.parseOptions=function(_65c){ -var t=$(_65c); -return $.extend({},$.parser.parseOptions(_65c,["weekNumberHeader",{firstDay:"number",fit:"boolean",border:"boolean",showWeek:"boolean"}])); -}; -$.fn.calendar.defaults={width:180,height:180,fit:false,border:true,showWeek:false,firstDay:0,weeks:["S","M","T","W","T","F","S"],months:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],year:new Date().getFullYear(),month:new Date().getMonth()+1,current:(function(){ -var d=new Date(); -return new Date(d.getFullYear(),d.getMonth(),d.getDate()); -})(),weekNumberHeader:"",getWeekNumber:function(date){ -var _65d=new Date(date.getTime()); -_65d.setDate(_65d.getDate()+4-(_65d.getDay()||7)); -var time=_65d.getTime(); -_65d.setMonth(0); -_65d.setDate(1); -return Math.floor(Math.round((time-_65d)/86400000)/7)+1; -},formatter:function(date){ -return date.getDate(); -},styler:function(date){ -return ""; -},validator:function(date){ -return true; -},onSelect:function(date){ -},onChange:function(_65e,_65f){ -},onNavigate:function(year,_660){ -}}; -})(jQuery); -(function($){ -function _661(_662){ -var _663=$.data(_662,"spinner"); -var opts=_663.options; -var _664=$.extend(true,[],opts.icons); -if(opts.spinAlign=="left"||opts.spinAlign=="right"){ -opts.spinArrow=true; -opts.iconAlign=opts.spinAlign; -var _665={iconCls:"spinner-button-updown",handler:function(e){ -var spin=$(e.target).closest(".spinner-arrow-up,.spinner-arrow-down"); -_66f(e.data.target,spin.hasClass("spinner-arrow-down")); -}}; -if(opts.spinAlign=="left"){ -_664.unshift(_665); -}else{ -_664.push(_665); -} -}else{ -opts.spinArrow=false; -if(opts.spinAlign=="vertical"){ -if(opts.buttonAlign!="top"){ -opts.buttonAlign="bottom"; -} -opts.clsLeft="textbox-button-bottom"; -opts.clsRight="textbox-button-top"; -}else{ -opts.clsLeft="textbox-button-left"; -opts.clsRight="textbox-button-right"; -} -} -$(_662).addClass("spinner-f").textbox($.extend({},opts,{icons:_664,doSize:false,onResize:function(_666,_667){ -if(!opts.spinArrow){ -var span=$(this).next(); -var btn=span.find(".textbox-button:not(.spinner-button)"); -if(btn.length){ -var _668=btn.outerWidth(); -var _669=btn.outerHeight(); -var _66a=span.find(".spinner-button."+opts.clsLeft); -var _66b=span.find(".spinner-button."+opts.clsRight); -if(opts.buttonAlign=="right"){ -_66b.css("marginRight",_668+"px"); -}else{ -if(opts.buttonAlign=="left"){ -_66a.css("marginLeft",_668+"px"); -}else{ -if(opts.buttonAlign=="top"){ -_66b.css("marginTop",_669+"px"); -}else{ -_66a.css("marginBottom",_669+"px"); -} -} -} -} -} -opts.onResize.call(this,_666,_667); -}})); -$(_662).attr("spinnerName",$(_662).attr("textboxName")); -_663.spinner=$(_662).next(); -_663.spinner.addClass("spinner"); -if(opts.spinArrow){ -var _66c=_663.spinner.find(".spinner-button-updown"); -_66c.append(""+""+""+""+""+""); -}else{ -var _66d=$("").addClass(opts.clsLeft).appendTo(_663.spinner); -var _66e=$("").addClass(opts.clsRight).appendTo(_663.spinner); -_66d.linkbutton({iconCls:opts.reversed?"spinner-button-up":"spinner-button-down",onClick:function(){ -_66f(_662,!opts.reversed); -}}); -_66e.linkbutton({iconCls:opts.reversed?"spinner-button-down":"spinner-button-up",onClick:function(){ -_66f(_662,opts.reversed); -}}); -if(opts.disabled){ -$(_662).spinner("disable"); -} -if(opts.readonly){ -$(_662).spinner("readonly"); -} -} -$(_662).spinner("resize"); -}; -function _66f(_670,down){ -var opts=$(_670).spinner("options"); -opts.spin.call(_670,down); -opts[down?"onSpinDown":"onSpinUp"].call(_670); -$(_670).spinner("validate"); -}; -$.fn.spinner=function(_671,_672){ -if(typeof _671=="string"){ -var _673=$.fn.spinner.methods[_671]; -if(_673){ -return _673(this,_672); -}else{ -return this.textbox(_671,_672); -} -} -_671=_671||{}; -return this.each(function(){ -var _674=$.data(this,"spinner"); -if(_674){ -$.extend(_674.options,_671); -}else{ -_674=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_671)}); -} -_661(this); -}); -}; -$.fn.spinner.methods={options:function(jq){ -var opts=jq.textbox("options"); -return $.extend($.data(jq[0],"spinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -}}; -$.fn.spinner.parseOptions=function(_675){ -return $.extend({},$.fn.textbox.parseOptions(_675),$.parser.parseOptions(_675,["min","max","spinAlign",{increment:"number",reversed:"boolean"}])); -}; -$.fn.spinner.defaults=$.extend({},$.fn.textbox.defaults,{min:null,max:null,increment:1,spinAlign:"right",reversed:false,spin:function(down){ -},onSpinUp:function(){ -},onSpinDown:function(){ -}}); -})(jQuery); -(function($){ -function _676(_677){ -$(_677).addClass("numberspinner-f"); -var opts=$.data(_677,"numberspinner").options; -$(_677).numberbox($.extend({},opts,{doSize:false})).spinner(opts); -$(_677).numberbox("setValue",opts.value); -}; -function _678(_679,down){ -var opts=$.data(_679,"numberspinner").options; -var v=parseFloat($(_679).numberbox("getValue")||opts.value)||0; -if(down){ -v-=opts.increment; -}else{ -v+=opts.increment; -} -$(_679).numberbox("setValue",v); -}; -$.fn.numberspinner=function(_67a,_67b){ -if(typeof _67a=="string"){ -var _67c=$.fn.numberspinner.methods[_67a]; -if(_67c){ -return _67c(this,_67b); -}else{ -return this.numberbox(_67a,_67b); -} -} -_67a=_67a||{}; -return this.each(function(){ -var _67d=$.data(this,"numberspinner"); -if(_67d){ -$.extend(_67d.options,_67a); -}else{ -$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_67a)}); -} -_676(this); -}); -}; -$.fn.numberspinner.methods={options:function(jq){ -var opts=jq.numberbox("options"); -return $.extend($.data(jq[0],"numberspinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -}}; -$.fn.numberspinner.parseOptions=function(_67e){ -return $.extend({},$.fn.spinner.parseOptions(_67e),$.fn.numberbox.parseOptions(_67e),{}); -}; -$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(down){ -_678(this,down); -}}); -})(jQuery); -(function($){ -function _67f(_680){ -var opts=$.data(_680,"timespinner").options; -$(_680).addClass("timespinner-f").spinner(opts); -var _681=opts.formatter.call(_680,opts.parser.call(_680,opts.value)); -$(_680).timespinner("initValue",_681); -}; -function _682(e){ -var _683=e.data.target; -var opts=$.data(_683,"timespinner").options; -var _684=$(_683).timespinner("getSelectionStart"); -for(var i=0;i=_685[0]&&_684<=_685[1]){ -_686(_683,i); -return; -} -} -}; -function _686(_687,_688){ -var opts=$.data(_687,"timespinner").options; -if(_688!=undefined){ -opts.highlight=_688; -} -var _689=opts.selections[opts.highlight]; -if(_689){ -var tb=$(_687).timespinner("textbox"); -$(_687).timespinner("setSelectionRange",{start:_689[0],end:_689[1]}); -tb.focus(); -} -}; -function _68a(_68b,_68c){ -var opts=$.data(_68b,"timespinner").options; -var _68c=opts.parser.call(_68b,_68c); -var text=opts.formatter.call(_68b,_68c); -$(_68b).spinner("setValue",text); -}; -function _68d(_68e,down){ -var opts=$.data(_68e,"timespinner").options; -var s=$(_68e).timespinner("getValue"); -var _68f=opts.selections[opts.highlight]; -var s1=s.substring(0,_68f[0]); -var s2=s.substring(_68f[0],_68f[1]); -var s3=s.substring(_68f[1]); -var v=s1+((parseInt(s2,10)||0)+opts.increment*(down?-1:1))+s3; -$(_68e).timespinner("setValue",v); -_686(_68e); -}; -$.fn.timespinner=function(_690,_691){ -if(typeof _690=="string"){ -var _692=$.fn.timespinner.methods[_690]; -if(_692){ -return _692(this,_691); -}else{ -return this.spinner(_690,_691); -} -} -_690=_690||{}; -return this.each(function(){ -var _693=$.data(this,"timespinner"); -if(_693){ -$.extend(_693.options,_690); -}else{ -$.data(this,"timespinner",{options:$.extend({},$.fn.timespinner.defaults,$.fn.timespinner.parseOptions(this),_690)}); -} -_67f(this); -}); -}; -$.fn.timespinner.methods={options:function(jq){ -var opts=jq.data("spinner")?jq.spinner("options"):{}; -return $.extend($.data(jq[0],"timespinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly}); -},setValue:function(jq,_694){ -return jq.each(function(){ -_68a(this,_694); -}); -},getHours:function(jq){ -var opts=$.data(jq[0],"timespinner").options; -var vv=jq.timespinner("getValue").split(opts.separator); -return parseInt(vv[0],10); -},getMinutes:function(jq){ -var opts=$.data(jq[0],"timespinner").options; -var vv=jq.timespinner("getValue").split(opts.separator); -return parseInt(vv[1],10); -},getSeconds:function(jq){ -var opts=$.data(jq[0],"timespinner").options; -var vv=jq.timespinner("getValue").split(opts.separator); -return parseInt(vv[2],10)||0; -}}; -$.fn.timespinner.parseOptions=function(_695){ -return $.extend({},$.fn.spinner.parseOptions(_695),$.parser.parseOptions(_695,["separator",{showSeconds:"boolean",highlight:"number"}])); -}; -$.fn.timespinner.defaults=$.extend({},$.fn.spinner.defaults,{inputEvents:$.extend({},$.fn.spinner.defaults.inputEvents,{click:function(e){ -_682.call(this,e); -},blur:function(e){ -var t=$(e.data.target); -t.timespinner("setValue",t.timespinner("getText")); -},keydown:function(e){ -if(e.keyCode==13){ -var t=$(e.data.target); -t.timespinner("setValue",t.timespinner("getText")); -} -}}),formatter:function(date){ -if(!date){ -return ""; -} -var opts=$(this).timespinner("options"); -var tt=[_696(date.getHours()),_696(date.getMinutes())]; -if(opts.showSeconds){ -tt.push(_696(date.getSeconds())); -} -return tt.join(opts.separator); -function _696(_697){ -return (_697<10?"0":"")+_697; -}; -},parser:function(s){ -var opts=$(this).timespinner("options"); -var date=_698(s); -if(date){ -var min=_698(opts.min); -var max=_698(opts.max); -if(min&&min>date){ -date=min; -} -if(max&&max"]; -for(var i=0;i<_6ad.length;i++){ -_6ac.cache[_6ad[i][0]]={width:_6ad[i][1]}; -} -var _6ae=0; -for(var s in _6ac.cache){ -var item=_6ac.cache[s]; -item.index=_6ae++; -ss.push(s+"{width:"+item.width+"}"); -} -ss.push(""); -$(ss.join("\n")).appendTo(cc); -cc.children("style[easyui]:not(:last)").remove(); -},getRule:function(_6af){ -var _6b0=cc.children("style[easyui]:last")[0]; -var _6b1=_6b0.styleSheet?_6b0.styleSheet:(_6b0.sheet||document.styleSheets[document.styleSheets.length-1]); -var _6b2=_6b1.cssRules||_6b1.rules; -return _6b2[_6af]; -},set:function(_6b3,_6b4){ -var item=_6ac.cache[_6b3]; -if(item){ -item.width=_6b4; -var rule=this.getRule(item.index); -if(rule){ -rule.style["width"]=_6b4; -} -} -},remove:function(_6b5){ -var tmp=[]; -for(var s in _6ac.cache){ -if(s.indexOf(_6b5)==-1){ -tmp.push([s,_6ac.cache[s].width]); -} -} -_6ac.cache={}; -this.add(tmp); -},dirty:function(_6b6){ -if(_6b6){ -_6ac.dirty.push(_6b6); -} -},clean:function(){ -for(var i=0;i<_6ac.dirty.length;i++){ -this.remove(_6ac.dirty[i]); -} -_6ac.dirty=[]; -}}; -}; -function _6b7(_6b8,_6b9){ -var _6ba=$.data(_6b8,"datagrid"); -var opts=_6ba.options; -var _6bb=_6ba.panel; -if(_6b9){ -$.extend(opts,_6b9); -} -if(opts.fit==true){ -var p=_6bb.panel("panel").parent(); -opts.width=p.width(); -opts.height=p.height(); -} -_6bb.panel("resize",opts); -}; -function _6bc(_6bd){ -var _6be=$.data(_6bd,"datagrid"); -var opts=_6be.options; -var dc=_6be.dc; -var wrap=_6be.panel; -var _6bf=wrap.width(); -var _6c0=wrap.height(); -var view=dc.view; -var _6c1=dc.view1; -var _6c2=dc.view2; -var _6c3=_6c1.children("div.datagrid-header"); -var _6c4=_6c2.children("div.datagrid-header"); -var _6c5=_6c3.find("table"); -var _6c6=_6c4.find("table"); -view.width(_6bf); -var _6c7=_6c3.children("div.datagrid-header-inner").show(); -_6c1.width(_6c7.find("table").width()); -if(!opts.showHeader){ -_6c7.hide(); -} -_6c2.width(_6bf-_6c1._outerWidth()); -_6c1.children()._outerWidth(_6c1.width()); -_6c2.children()._outerWidth(_6c2.width()); -var all=_6c3.add(_6c4).add(_6c5).add(_6c6); -all.css("height",""); -var hh=Math.max(_6c5.height(),_6c6.height()); -all._outerHeight(hh); -view.children(".datagrid-empty").css("top",hh+"px"); -dc.body1.add(dc.body2).children("table.datagrid-btable-frozen").css({position:"absolute",top:dc.header2._outerHeight()}); -var _6c8=dc.body2.children("table.datagrid-btable-frozen")._outerHeight(); -var _6c9=_6c8+_6c4._outerHeight()+_6c2.children(".datagrid-footer")._outerHeight(); -wrap.children(":not(.datagrid-view,.datagrid-mask,.datagrid-mask-msg)").each(function(){ -_6c9+=$(this)._outerHeight(); -}); -var _6ca=wrap.outerHeight()-wrap.height(); -var _6cb=wrap._size("minHeight")||""; -var _6cc=wrap._size("maxHeight")||""; -_6c1.add(_6c2).children("div.datagrid-body").css({marginTop:_6c8,height:(isNaN(parseInt(opts.height))?"":(_6c0-_6c9)),minHeight:(_6cb?_6cb-_6ca-_6c9:""),maxHeight:(_6cc?_6cc-_6ca-_6c9:"")}); -view.height(_6c2.height()); -}; -function _6cd(_6ce,_6cf,_6d0){ -var rows=$.data(_6ce,"datagrid").data.rows; -var opts=$.data(_6ce,"datagrid").options; -var dc=$.data(_6ce,"datagrid").dc; -if(!dc.body1.is(":empty")&&(!opts.nowrap||opts.autoRowHeight||_6d0)){ -if(_6cf!=undefined){ -var tr1=opts.finder.getTr(_6ce,_6cf,"body",1); -var tr2=opts.finder.getTr(_6ce,_6cf,"body",2); -_6d1(tr1,tr2); -}else{ -var tr1=opts.finder.getTr(_6ce,0,"allbody",1); -var tr2=opts.finder.getTr(_6ce,0,"allbody",2); -_6d1(tr1,tr2); -if(opts.showFooter){ -var tr1=opts.finder.getTr(_6ce,0,"allfooter",1); -var tr2=opts.finder.getTr(_6ce,0,"allfooter",2); -_6d1(tr1,tr2); -} -} -} -_6bc(_6ce); -if(opts.height=="auto"){ -var _6d2=dc.body1.parent(); -var _6d3=dc.body2; -var _6d4=_6d5(_6d3); -var _6d6=_6d4.height; -if(_6d4.width>_6d3.width()){ -_6d6+=18; -} -_6d6-=parseInt(_6d3.css("marginTop"))||0; -_6d2.height(_6d6); -_6d3.height(_6d6); -dc.view.height(dc.view2.height()); -} -dc.body2.triggerHandler("scroll"); -function _6d1(trs1,trs2){ -for(var i=0;i"); -} -_6de(true); -_6de(false); -_6bc(_6db); -function _6de(_6df){ -var _6e0=_6df?1:2; -var tr=opts.finder.getTr(_6db,_6dc,"body",_6e0); -(_6df?dc.body1:dc.body2).children("table.datagrid-btable-frozen").append(tr); -}; -}; -function _6e1(_6e2,_6e3){ -function _6e4(){ -var _6e5=[]; -var _6e6=[]; -$(_6e2).children("thead").each(function(){ -var opt=$.parser.parseOptions(this,[{frozen:"boolean"}]); -$(this).find("tr").each(function(){ -var cols=[]; -$(this).find("th").each(function(){ -var th=$(this); -var col=$.extend({},$.parser.parseOptions(this,["id","field","align","halign","order","width",{sortable:"boolean",checkbox:"boolean",resizable:"boolean",fixed:"boolean"},{rowspan:"number",colspan:"number"}]),{title:(th.html()||undefined),hidden:(th.attr("hidden")?true:undefined),formatter:(th.attr("formatter")?eval(th.attr("formatter")):undefined),styler:(th.attr("styler")?eval(th.attr("styler")):undefined),sorter:(th.attr("sorter")?eval(th.attr("sorter")):undefined)}); -if(col.width&&String(col.width).indexOf("%")==-1){ -col.width=parseInt(col.width); -} -if(th.attr("editor")){ -var s=$.trim(th.attr("editor")); -if(s.substr(0,1)=="{"){ -col.editor=eval("("+s+")"); -}else{ -col.editor=s; -} -} -cols.push(col); -}); -opt.frozen?_6e5.push(cols):_6e6.push(cols); -}); -}); -return [_6e5,_6e6]; -}; -var _6e7=$("
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+""+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+""+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        "+"
                                                                                                                                                        ").insertAfter(_6e2); -_6e7.panel({doSize:false,cls:"datagrid"}); -$(_6e2).addClass("datagrid-f").hide().appendTo(_6e7.children("div.datagrid-view")); -var cc=_6e4(); -var view=_6e7.children("div.datagrid-view"); -var _6e8=view.children("div.datagrid-view1"); -var _6e9=view.children("div.datagrid-view2"); -return {panel:_6e7,frozenColumns:cc[0],columns:cc[1],dc:{view:view,view1:_6e8,view2:_6e9,header1:_6e8.children("div.datagrid-header").children("div.datagrid-header-inner"),header2:_6e9.children("div.datagrid-header").children("div.datagrid-header-inner"),body1:_6e8.children("div.datagrid-body").children("div.datagrid-body-inner"),body2:_6e9.children("div.datagrid-body"),footer1:_6e8.children("div.datagrid-footer").children("div.datagrid-footer-inner"),footer2:_6e9.children("div.datagrid-footer").children("div.datagrid-footer-inner")}}; -}; -function _6ea(_6eb){ -var _6ec=$.data(_6eb,"datagrid"); -var opts=_6ec.options; -var dc=_6ec.dc; -var _6ed=_6ec.panel; -_6ec.ss=$(_6eb).datagrid("createStyleSheet"); -_6ed.panel($.extend({},opts,{id:null,doSize:false,onResize:function(_6ee,_6ef){ -if($.data(_6eb,"datagrid")){ -_6bc(_6eb); -$(_6eb).datagrid("fitColumns"); -opts.onResize.call(_6ed,_6ee,_6ef); -} -},onExpand:function(){ -if($.data(_6eb,"datagrid")){ -$(_6eb).datagrid("fixRowHeight").datagrid("fitColumns"); -opts.onExpand.call(_6ed); -} -}})); -_6ec.rowIdPrefix="datagrid-row-r"+(++_6a2); -_6ec.cellClassPrefix="datagrid-cell-c"+_6a2; -_6f0(dc.header1,opts.frozenColumns,true); -_6f0(dc.header2,opts.columns,false); -_6f1(); -dc.header1.add(dc.header2).css("display",opts.showHeader?"block":"none"); -dc.footer1.add(dc.footer2).css("display",opts.showFooter?"block":"none"); -if(opts.toolbar){ -if($.isArray(opts.toolbar)){ -$("div.datagrid-toolbar",_6ed).remove(); -var tb=$("
                                                                                                                                                        ").prependTo(_6ed); -var tr=tb.find("tr"); -for(var i=0;i
                                                                                                                                                        ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var tool=$("").appendTo(td); -tool[0].onclick=eval(btn.handler||function(){ -}); -tool.linkbutton($.extend({},btn,{plain:true})); -} -} -}else{ -$(opts.toolbar).addClass("datagrid-toolbar").prependTo(_6ed); -$(opts.toolbar).show(); -} -}else{ -$("div.datagrid-toolbar",_6ed).remove(); -} -$("div.datagrid-pager",_6ed).remove(); -if(opts.pagination){ -var _6f2=$("
                                                                                                                                                        "); -if(opts.pagePosition=="bottom"){ -_6f2.appendTo(_6ed); -}else{ -if(opts.pagePosition=="top"){ -_6f2.addClass("datagrid-pager-top").prependTo(_6ed); -}else{ -var ptop=$("
                                                                                                                                                        ").prependTo(_6ed); -_6f2.appendTo(_6ed); -_6f2=_6f2.add(ptop); -} -} -_6f2.pagination({total:0,pageNumber:opts.pageNumber,pageSize:opts.pageSize,pageList:opts.pageList,onSelectPage:function(_6f3,_6f4){ -opts.pageNumber=_6f3||1; -opts.pageSize=_6f4; -_6f2.pagination("refresh",{pageNumber:_6f3,pageSize:_6f4}); -_73c(_6eb); -}}); -opts.pageSize=_6f2.pagination("options").pageSize; -} -function _6f0(_6f5,_6f6,_6f7){ -if(!_6f6){ -return; -} -$(_6f5).show(); -$(_6f5).empty(); -var tmp=$("
                                                                                                                                                        ").appendTo("body"); -tmp._outerWidth(99); -var _6f8=100-parseInt(tmp[0].style.width); -tmp.remove(); -var _6f9=[]; -var _6fa=[]; -var _6fb=[]; -if(opts.sortName){ -_6f9=opts.sortName.split(","); -_6fa=opts.sortOrder.split(","); -} -var t=$("
                                                                                                                                                        ").appendTo(_6f5); -for(var i=0;i<_6f6.length;i++){ -var tr=$("").appendTo($("tbody",t)); -var cols=_6f6[i]; -for(var j=0;j").appendTo(tr); -if(col.checkbox){ -td.attr("field",col.field); -$("
                                                                                                                                                        ").html("").appendTo(td); -}else{ -if(col.field){ -td.attr("field",col.field); -td.append("
                                                                                                                                                        "); -td.find("span:first").html(col.title); -var cell=td.find("div.datagrid-cell"); -var pos=_6a3(_6f9,col.field); -if(pos>=0){ -cell.addClass("datagrid-sort-"+_6fa[pos]); -} -if(col.sortable){ -cell.addClass("datagrid-sort"); -} -if(col.resizable==false){ -cell.attr("resizable","false"); -} -if(col.width){ -var _6fc=$.parser.parseValue("width",col.width,dc.view,opts.scrollbarSize+(opts.rownumbers?opts.rownumberWidth:0)); -col.deltaWidth=_6f8; -col.boxWidth=_6fc-_6f8; -}else{ -col.auto=true; -} -cell.css("text-align",(col.halign||col.align||"")); -col.cellClass=_6ec.cellClassPrefix+"-"+col.field.replace(/[\.|\s]/g,"-"); -cell.addClass(col.cellClass); -}else{ -$("
                                                                                                                                                        ").html(col.title).appendTo(td); -} -} -if(col.hidden){ -td.hide(); -_6fb.push(col.field); -} -} -} -if(_6f7&&opts.rownumbers){ -var td=$("
                                                                                                                                                        "); -if($("tr",t).length==0){ -td.wrap("").parent().appendTo($("tbody",t)); -}else{ -td.prependTo($("tr:first",t)); -} -} -for(var i=0;i<_6fb.length;i++){ -_73e(_6eb,_6fb[i],-1); -} -}; -function _6f1(){ -var _6fd=[[".datagrid-header-rownumber",(opts.rownumberWidth-1)+"px"],[".datagrid-cell-rownumber",(opts.rownumberWidth-1)+"px"]]; -var _6fe=_6ff(_6eb,true).concat(_6ff(_6eb)); -for(var i=0;i<_6fe.length;i++){ -var col=_700(_6eb,_6fe[i]); -if(col&&!col.checkbox){ -_6fd.push(["."+col.cellClass,col.boxWidth?col.boxWidth+"px":"auto"]); -} -} -_6ec.ss.add(_6fd); -_6ec.ss.dirty(_6ec.cellSelectorPrefix); -_6ec.cellSelectorPrefix="."+_6ec.cellClassPrefix; -}; -}; -function _701(_702){ -var _703=$.data(_702,"datagrid"); -var _704=_703.panel; -var opts=_703.options; -var dc=_703.dc; -var _705=dc.header1.add(dc.header2); -_705.unbind(".datagrid"); -for(var _706 in opts.headerEvents){ -_705.bind(_706+".datagrid",opts.headerEvents[_706]); -} -var _707=_705.find("div.datagrid-cell"); -var _708=opts.resizeHandle=="right"?"e":(opts.resizeHandle=="left"?"w":"e,w"); -_707.each(function(){ -$(this).resizable({handles:_708,edge:opts.resizeEdge,disabled:($(this).attr("resizable")?$(this).attr("resizable")=="false":false),minWidth:25,onStartResize:function(e){ -_703.resizing=true; -_705.css("cursor",$("body").css("cursor")); -if(!_703.proxy){ -_703.proxy=$("
                                                                                                                                                        ").appendTo(dc.view); -} -if(e.data.dir=="e"){ -e.data.deltaEdge=$(this)._outerWidth()-(e.pageX-$(this).offset().left); -}else{ -e.data.deltaEdge=$(this).offset().left-e.pageX-1; -} -_703.proxy.css({left:e.pageX-$(_704).offset().left-1+e.data.deltaEdge,display:"none"}); -setTimeout(function(){ -if(_703.proxy){ -_703.proxy.show(); -} -},500); -},onResize:function(e){ -_703.proxy.css({left:e.pageX-$(_704).offset().left-1+e.data.deltaEdge,display:"block"}); -return false; -},onStopResize:function(e){ -_705.css("cursor",""); -$(this).css("height",""); -var _709=$(this).parent().attr("field"); -var col=_700(_702,_709); -col.width=$(this)._outerWidth()+1; -col.boxWidth=col.width-col.deltaWidth; -col.auto=undefined; -$(this).css("width",""); -$(_702).datagrid("fixColumnSize",_709); -_703.proxy.remove(); -_703.proxy=null; -if($(this).parents("div:first.datagrid-header").parent().hasClass("datagrid-view1")){ -_6bc(_702); -} -$(_702).datagrid("fitColumns"); -opts.onResizeColumn.call(_702,_709,col.width); -setTimeout(function(){ -_703.resizing=false; -},0); -}}); -}); -var bb=dc.body1.add(dc.body2); -bb.unbind(); -for(var _706 in opts.rowEvents){ -bb.bind(_706,opts.rowEvents[_706]); -} -dc.body1.bind("mousewheel DOMMouseScroll",function(e){ -e.preventDefault(); -var e1=e.originalEvent||window.event; -var _70a=e1.wheelDelta||e1.detail*(-1); -if("deltaY" in e1){ -_70a=e1.deltaY*-1; -} -var dg=$(e.target).closest("div.datagrid-view").children(".datagrid-f"); -var dc=dg.data("datagrid").dc; -dc.body2.scrollTop(dc.body2.scrollTop()-_70a); -}); -dc.body2.bind("scroll",function(){ -var b1=dc.view1.children("div.datagrid-body"); -b1.scrollTop($(this).scrollTop()); -var c1=dc.body1.children(":first"); -var c2=dc.body2.children(":first"); -if(c1.length&&c2.length){ -var top1=c1.offset().top; -var top2=c2.offset().top; -if(top1!=top2){ -b1.scrollTop(b1.scrollTop()+top1-top2); -} -} -dc.view2.children("div.datagrid-header,div.datagrid-footer")._scrollLeft($(this)._scrollLeft()); -dc.body2.children("table.datagrid-btable-frozen").css("left",-$(this)._scrollLeft()); -}); -}; -function _70b(_70c){ -return function(e){ -var td=$(e.target).closest("td[field]"); -if(td.length){ -var _70d=_70e(td); -if(!$(_70d).data("datagrid").resizing&&_70c){ -td.addClass("datagrid-header-over"); -}else{ -td.removeClass("datagrid-header-over"); -} -} -}; -}; -function _70f(e){ -var _710=_70e(e.target); -var opts=$(_710).datagrid("options"); -var ck=$(e.target).closest("input[type=checkbox]"); -if(ck.length){ -if(opts.singleSelect&&opts.selectOnCheck){ -return false; -} -if(ck.is(":checked")){ -_711(_710); -}else{ -_712(_710); -} -e.stopPropagation(); -}else{ -var cell=$(e.target).closest(".datagrid-cell"); -if(cell.length){ -var p1=cell.offset().left+5; -var p2=cell.offset().left+cell._outerWidth()-5; -if(e.pageXp1){ -_713(_710,cell.parent().attr("field")); -} -} -} -}; -function _714(e){ -var _715=_70e(e.target); -var opts=$(_715).datagrid("options"); -var cell=$(e.target).closest(".datagrid-cell"); -if(cell.length){ -var p1=cell.offset().left+5; -var p2=cell.offset().left+cell._outerWidth()-5; -var cond=opts.resizeHandle=="right"?(e.pageX>p2):(opts.resizeHandle=="left"?(e.pageXp2)); -if(cond){ -var _716=cell.parent().attr("field"); -var col=_700(_715,_716); -if(col.resizable==false){ -return; -} -$(_715).datagrid("autoSizeColumn",_716); -col.auto=false; -} -} -}; -function _717(e){ -var _718=_70e(e.target); -var opts=$(_718).datagrid("options"); -var td=$(e.target).closest("td[field]"); -opts.onHeaderContextMenu.call(_718,e,td.attr("field")); -}; -function _719(_71a){ -return function(e){ -var tr=_71b(e.target); -if(!tr){ -return; -} -var _71c=_70e(tr); -if($.data(_71c,"datagrid").resizing){ -return; -} -var _71d=_71e(tr); -if(_71a){ -_71f(_71c,_71d); -}else{ -var opts=$.data(_71c,"datagrid").options; -opts.finder.getTr(_71c,_71d).removeClass("datagrid-row-over"); -} -}; -}; -function _720(e){ -var tr=_71b(e.target); -if(!tr){ -return; -} -var _721=_70e(tr); -var opts=$.data(_721,"datagrid").options; -var _722=_71e(tr); -var tt=$(e.target); -if(tt.parent().hasClass("datagrid-cell-check")){ -if(opts.singleSelect&&opts.selectOnCheck){ -tt._propAttr("checked",!tt.is(":checked")); -_723(_721,_722); -}else{ -if(tt.is(":checked")){ -tt._propAttr("checked",false); -_723(_721,_722); -}else{ -tt._propAttr("checked",true); -_724(_721,_722); -} -} -}else{ -var row=opts.finder.getRow(_721,_722); -var td=tt.closest("td[field]",tr); -if(td.length){ -var _725=td.attr("field"); -opts.onClickCell.call(_721,_722,_725,row[_725]); -} -if(opts.singleSelect==true){ -_726(_721,_722); -}else{ -if(opts.ctrlSelect){ -if(e.metaKey||e.ctrlKey){ -if(tr.hasClass("datagrid-row-selected")){ -_727(_721,_722); -}else{ -_726(_721,_722); -} -}else{ -if(e.shiftKey){ -$(_721).datagrid("clearSelections"); -var _728=Math.min(opts.lastSelectedIndex||0,_722); -var _729=Math.max(opts.lastSelectedIndex||0,_722); -for(var i=_728;i<=_729;i++){ -_726(_721,i); -} -}else{ -$(_721).datagrid("clearSelections"); -_726(_721,_722); -opts.lastSelectedIndex=_722; -} -} -}else{ -if(tr.hasClass("datagrid-row-selected")){ -_727(_721,_722); -}else{ -_726(_721,_722); -} -} -} -opts.onClickRow.apply(_721,_6a6(_721,[_722,row])); -} -}; -function _72a(e){ -var tr=_71b(e.target); -if(!tr){ -return; -} -var _72b=_70e(tr); -var opts=$.data(_72b,"datagrid").options; -var _72c=_71e(tr); -var row=opts.finder.getRow(_72b,_72c); -var td=$(e.target).closest("td[field]",tr); -if(td.length){ -var _72d=td.attr("field"); -opts.onDblClickCell.call(_72b,_72c,_72d,row[_72d]); -} -opts.onDblClickRow.apply(_72b,_6a6(_72b,[_72c,row])); -}; -function _72e(e){ -var tr=_71b(e.target); -if(tr){ -var _72f=_70e(tr); -var opts=$.data(_72f,"datagrid").options; -var _730=_71e(tr); -var row=opts.finder.getRow(_72f,_730); -opts.onRowContextMenu.call(_72f,e,_730,row); -}else{ -var body=_71b(e.target,".datagrid-body"); -if(body){ -var _72f=_70e(body); -var opts=$.data(_72f,"datagrid").options; -opts.onRowContextMenu.call(_72f,e,-1,null); -} -} -}; -function _70e(t){ -return $(t).closest("div.datagrid-view").children(".datagrid-f")[0]; -}; -function _71b(t,_731){ -var tr=$(t).closest(_731||"tr.datagrid-row"); -if(tr.length&&tr.parent().length){ -return tr; -}else{ -return undefined; -} -}; -function _71e(tr){ -if(tr.attr("datagrid-row-index")){ -return parseInt(tr.attr("datagrid-row-index")); -}else{ -return tr.attr("node-id"); -} -}; -function _713(_732,_733){ -var _734=$.data(_732,"datagrid"); -var opts=_734.options; -_733=_733||{}; -var _735={sortName:opts.sortName,sortOrder:opts.sortOrder}; -if(typeof _733=="object"){ -$.extend(_735,_733); -} -var _736=[]; -var _737=[]; -if(_735.sortName){ -_736=_735.sortName.split(","); -_737=_735.sortOrder.split(","); -} -if(typeof _733=="string"){ -var _738=_733; -var col=_700(_732,_738); -if(!col.sortable||_734.resizing){ -return; -} -var _739=col.order||"asc"; -var pos=_6a3(_736,_738); -if(pos>=0){ -var _73a=_737[pos]=="asc"?"desc":"asc"; -if(opts.multiSort&&_73a==_739){ -_736.splice(pos,1); -_737.splice(pos,1); -}else{ -_737[pos]=_73a; -} -}else{ -if(opts.multiSort){ -_736.push(_738); -_737.push(_739); -}else{ -_736=[_738]; -_737=[_739]; -} -} -_735.sortName=_736.join(","); -_735.sortOrder=_737.join(","); -} -if(opts.onBeforeSortColumn.call(_732,_735.sortName,_735.sortOrder)==false){ -return; -} -$.extend(opts,_735); -var dc=_734.dc; -var _73b=dc.header1.add(dc.header2); -_73b.find("div.datagrid-cell").removeClass("datagrid-sort-asc datagrid-sort-desc"); -for(var i=0;i<_736.length;i++){ -var col=_700(_732,_736[i]); -_73b.find("div."+col.cellClass).addClass("datagrid-sort-"+_737[i]); -} -if(opts.remoteSort){ -_73c(_732); -}else{ -_73d(_732,$(_732).datagrid("getData")); -} -opts.onSortColumn.call(_732,opts.sortName,opts.sortOrder); -}; -function _73e(_73f,_740,_741){ -_742(true); -_742(false); -function _742(_743){ -var aa=_744(_73f,_743); -if(aa.length){ -var _745=aa[aa.length-1]; -var _746=_6a3(_745,_740); -if(_746>=0){ -for(var _747=0;_747=_74c.find("table").width()){ -dc.body2.css("overflow-x","hidden"); -} -function _74f(){ -if(!opts.fitColumns){ -return; -} -if(!_74b.leftWidth){ -_74b.leftWidth=0; -} -var _750=0; -var cc=[]; -var _751=_6ff(_74a,false); -for(var i=0;i<_751.length;i++){ -var col=_700(_74a,_751[i]); -if(_752(col)){ -_750+=col.width; -cc.push({field:col.field,col:col,addingWidth:0}); -} -} -if(!_750){ -return; -} -cc[cc.length-1].addingWidth-=_74b.leftWidth; -var _753=_74c.children("div.datagrid-header-inner").show(); -var _754=_74c.width()-_74c.find("table").width()-opts.scrollbarSize+_74b.leftWidth; -var rate=_754/_750; -if(!opts.showHeader){ -_753.hide(); -} -for(var i=0;i0){ -c.col.boxWidth+=c.addingWidth; -c.col.width+=c.addingWidth; -} -} -_74b.leftWidth=_754; -$(_74a).datagrid("fixColumnSize"); -}; -function _74e(){ -var _756=false; -var _757=_6ff(_74a,true).concat(_6ff(_74a,false)); -$.map(_757,function(_758){ -var col=_700(_74a,_758); -if(String(col.width||"").indexOf("%")>=0){ -var _759=$.parser.parseValue("width",col.width,dc.view,opts.scrollbarSize+(opts.rownumbers?opts.rownumberWidth:0))-col.deltaWidth; -if(_759>0){ -col.boxWidth=_759; -_756=true; -} -} -}); -if(_756){ -$(_74a).datagrid("fixColumnSize"); -} -}; -function _74d(fit){ -var _75a=dc.header1.add(dc.header2).find(".datagrid-cell-group"); -if(_75a.length){ -_75a.each(function(){ -$(this)._outerWidth(fit?$(this).parent().width():10); -}); -if(fit){ -_6bc(_74a); -} -} -}; -function _752(col){ -if(String(col.width||"").indexOf("%")>=0){ -return false; -} -if(!col.hidden&&!col.checkbox&&!col.auto&&!col.fixed){ -return true; -} -}; -}; -function _75b(_75c,_75d){ -var _75e=$.data(_75c,"datagrid"); -var opts=_75e.options; -var dc=_75e.dc; -var tmp=$("
                                                                                                                                                        ").appendTo("body"); -if(_75d){ -_6b7(_75d); -$(_75c).datagrid("fitColumns"); -}else{ -var _75f=false; -var _760=_6ff(_75c,true).concat(_6ff(_75c,false)); -for(var i=0;i<_760.length;i++){ -var _75d=_760[i]; -var col=_700(_75c,_75d); -if(col.auto){ -_6b7(_75d); -_75f=true; -} -} -if(_75f){ -$(_75c).datagrid("fitColumns"); -} -} -tmp.remove(); -function _6b7(_761){ -var _762=dc.view.find("div.datagrid-header td[field=\""+_761+"\"] div.datagrid-cell"); -_762.css("width",""); -var col=$(_75c).datagrid("getColumnOption",_761); -col.width=undefined; -col.boxWidth=undefined; -col.auto=true; -$(_75c).datagrid("fixColumnSize",_761); -var _763=Math.max(_764("header"),_764("allbody"),_764("allfooter"))+1; -_762._outerWidth(_763-1); -col.width=_763; -col.boxWidth=parseInt(_762[0].style.width); -col.deltaWidth=_763-col.boxWidth; -_762.css("width",""); -$(_75c).datagrid("fixColumnSize",_761); -opts.onResizeColumn.call(_75c,_761,col.width); -function _764(type){ -var _765=0; -if(type=="header"){ -_765=_766(_762); -}else{ -opts.finder.getTr(_75c,0,type).find("td[field=\""+_761+"\"] div.datagrid-cell").each(function(){ -var w=_766($(this)); -if(_7651){ -var col=_700(_76f,td.attr("field")); -var _771=col.boxWidth+col.deltaWidth-1; -for(var i=1;i<_770;i++){ -td=td.next(); -col=_700(_76f,td.attr("field")); -_771+=col.boxWidth+col.deltaWidth; -} -$(this).children("div.datagrid-cell")._outerWidth(_771); -} -}); -}; -function _76d(_772){ -var dc=$.data(_772,"datagrid").dc; -dc.view.find("div.datagrid-editable").each(function(){ -var cell=$(this); -var _773=cell.parent().attr("field"); -var col=$(_772).datagrid("getColumnOption",_773); -cell._outerWidth(col.boxWidth+col.deltaWidth-1); -var ed=$.data(this,"datagrid.editor"); -if(ed.actions.resize){ -ed.actions.resize(ed.target,cell.width()); -} -}); -}; -function _700(_774,_775){ -function find(_776){ -if(_776){ -for(var i=0;i<_776.length;i++){ -var cc=_776[i]; -for(var j=0;j=0){ -var _77f=col.field||col.id||""; -for(var c=0;c<(col.colspan||1);c++){ -for(var r=0;r<(col.rowspan||1);r++){ -aa[_77c+r][_77d]=_77f; -} -_77d++; -} -} -}); -} -return aa; -function _77b(){ -var _780=0; -$.map(_779[0]||[],function(col){ -_780+=col.colspan||1; -}); -return _780; -}; -function _77e(a){ -for(var i=0;ib?1:-1); -}; -r=_787(r1[sn],r2[sn])*(so=="asc"?1:-1); -if(r!=0){ -return r; -} -} -return r; -}); -} -if(opts.view.onBeforeRender){ -opts.view.onBeforeRender.call(opts.view,_783,data.rows); -} -opts.view.render.call(opts.view,_783,dc.body2,false); -opts.view.render.call(opts.view,_783,dc.body1,true); -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,_783,dc.footer2,false); -opts.view.renderFooter.call(opts.view,_783,dc.footer1,true); -} -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,_783); -} -_784.ss.clean(); -var _788=$(_783).datagrid("getPager"); -if(_788.length){ -var _789=_788.pagination("options"); -if(_789.total!=data.total){ -_788.pagination("refresh",{pageNumber:opts.pageNumber,total:data.total}); -if(opts.pageNumber!=_789.pageNumber&&_789.pageNumber>0){ -opts.pageNumber=_789.pageNumber; -_73c(_783); -} -} -} -_6cd(_783); -dc.body2.triggerHandler("scroll"); -$(_783).datagrid("setSelectionState"); -$(_783).datagrid("autoSizeColumn"); -opts.onLoadSuccess.call(_783,data); -}; -function _78a(_78b){ -var _78c=$.data(_78b,"datagrid"); -var opts=_78c.options; -var dc=_78c.dc; -dc.header1.add(dc.header2).find("input[type=checkbox]")._propAttr("checked",false); -if(opts.idField){ -var _78d=$.data(_78b,"treegrid")?true:false; -var _78e=opts.onSelect; -var _78f=opts.onCheck; -opts.onSelect=opts.onCheck=function(){ -}; -var rows=opts.finder.getRows(_78b); -for(var i=0;i_7a0.height()-_7a1){ -_7a0.scrollTop(_7a0.scrollTop()+top+tr._outerHeight()-_7a0.height()+_7a1); -} -} -} -}; -function _71f(_7a3,_7a4){ -var _7a5=$.data(_7a3,"datagrid"); -var opts=_7a5.options; -opts.finder.getTr(_7a3,_7a5.highlightIndex).removeClass("datagrid-row-over"); -opts.finder.getTr(_7a3,_7a4).addClass("datagrid-row-over"); -_7a5.highlightIndex=_7a4; -}; -function _726(_7a6,_7a7,_7a8,_7a9){ -var _7aa=$.data(_7a6,"datagrid"); -var opts=_7aa.options; -var row=opts.finder.getRow(_7a6,_7a7); -if(!row){ -return; -} -if(opts.onBeforeSelect.apply(_7a6,_6a6(_7a6,[_7a7,row]))==false){ -return; -} -if(opts.singleSelect){ -_7ab(_7a6,true); -_7aa.selectedRows=[]; -} -if(!_7a8&&opts.checkOnSelect){ -_723(_7a6,_7a7,true); -} -if(opts.idField){ -_6a5(_7aa.selectedRows,opts.idField,row); -} -opts.finder.getTr(_7a6,_7a7).addClass("datagrid-row-selected"); -opts.onSelect.apply(_7a6,_6a6(_7a6,[_7a7,row])); -if(!_7a9&&opts.scrollOnSelect){ -_79b(_7a6,_7a7); -} -}; -function _727(_7ac,_7ad,_7ae){ -var _7af=$.data(_7ac,"datagrid"); -var dc=_7af.dc; -var opts=_7af.options; -var row=opts.finder.getRow(_7ac,_7ad); -if(!row){ -return; -} -if(opts.onBeforeUnselect.apply(_7ac,_6a6(_7ac,[_7ad,row]))==false){ -return; -} -if(!_7ae&&opts.checkOnSelect){ -_724(_7ac,_7ad,true); -} -opts.finder.getTr(_7ac,_7ad).removeClass("datagrid-row-selected"); -if(opts.idField){ -_6a4(_7af.selectedRows,opts.idField,row[opts.idField]); -} -opts.onUnselect.apply(_7ac,_6a6(_7ac,[_7ad,row])); -}; -function _7b0(_7b1,_7b2){ -var _7b3=$.data(_7b1,"datagrid"); -var opts=_7b3.options; -var rows=opts.finder.getRows(_7b1); -var _7b4=$.data(_7b1,"datagrid").selectedRows; -if(!_7b2&&opts.checkOnSelect){ -_711(_7b1,true); -} -opts.finder.getTr(_7b1,"","allbody").addClass("datagrid-row-selected"); -if(opts.idField){ -for(var _7b5=0;_7b5"); -cell.children("table").bind("click dblclick contextmenu",function(e){ -e.stopPropagation(); -}); -$.data(cell[0],"datagrid.editor",{actions:_7ea,target:_7ea.init(cell.find("td"),$.extend({height:opts.editorHeight},_7e9)),field:_7e7,type:_7e8,oldHtml:_7eb}); -} -} -}); -_6cd(_7e5,_7e6,true); -}; -function _7dc(_7ed,_7ee){ -var opts=$.data(_7ed,"datagrid").options; -var tr=opts.finder.getTr(_7ed,_7ee); -tr.children("td").each(function(){ -var cell=$(this).find("div.datagrid-editable"); -if(cell.length){ -var ed=$.data(cell[0],"datagrid.editor"); -if(ed.actions.destroy){ -ed.actions.destroy(ed.target); -} -cell.html(ed.oldHtml); -$.removeData(cell[0],"datagrid.editor"); -cell.removeClass("datagrid-editable"); -cell.css("width",""); -} -}); -}; -function _7cf(_7ef,_7f0){ -var tr=$.data(_7ef,"datagrid").options.finder.getTr(_7ef,_7f0); -if(!tr.hasClass("datagrid-row-editing")){ -return true; -} -var vbox=tr.find(".validatebox-text"); -vbox.validatebox("validate"); -vbox.trigger("mouseleave"); -var _7f1=tr.find(".validatebox-invalid"); -return _7f1.length==0; -}; -function _7f2(_7f3,_7f4){ -var _7f5=$.data(_7f3,"datagrid").insertedRows; -var _7f6=$.data(_7f3,"datagrid").deletedRows; -var _7f7=$.data(_7f3,"datagrid").updatedRows; -if(!_7f4){ -var rows=[]; -rows=rows.concat(_7f5); -rows=rows.concat(_7f6); -rows=rows.concat(_7f7); -return rows; -}else{ -if(_7f4=="inserted"){ -return _7f5; -}else{ -if(_7f4=="deleted"){ -return _7f6; -}else{ -if(_7f4=="updated"){ -return _7f7; -} -} -} -} -return []; -}; -function _7f8(_7f9,_7fa){ -var _7fb=$.data(_7f9,"datagrid"); -var opts=_7fb.options; -var data=_7fb.data; -var _7fc=_7fb.insertedRows; -var _7fd=_7fb.deletedRows; -$(_7f9).datagrid("cancelEdit",_7fa); -var row=opts.finder.getRow(_7f9,_7fa); -if(_6a3(_7fc,row)>=0){ -_6a4(_7fc,row); -}else{ -_7fd.push(row); -} -_6a4(_7fb.selectedRows,opts.idField,row[opts.idField]); -_6a4(_7fb.checkedRows,opts.idField,row[opts.idField]); -opts.view.deleteRow.call(opts.view,_7f9,_7fa); -if(opts.height=="auto"){ -_6cd(_7f9); -} -$(_7f9).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _7fe(_7ff,_800){ -var data=$.data(_7ff,"datagrid").data; -var view=$.data(_7ff,"datagrid").options.view; -var _801=$.data(_7ff,"datagrid").insertedRows; -view.insertRow.call(view,_7ff,_800.index,_800.row); -_801.push(_800.row); -$(_7ff).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _802(_803,row){ -var data=$.data(_803,"datagrid").data; -var view=$.data(_803,"datagrid").options.view; -var _804=$.data(_803,"datagrid").insertedRows; -view.insertRow.call(view,_803,null,row); -_804.push(row); -$(_803).datagrid("getPager").pagination("refresh",{total:data.total}); -}; -function _805(_806,_807){ -var _808=$.data(_806,"datagrid"); -var opts=_808.options; -var row=opts.finder.getRow(_806,_807.index); -var _809=false; -_807.row=_807.row||{}; -for(var _80a in _807.row){ -if(row[_80a]!==_807.row[_80a]){ -_809=true; -break; -} -} -if(_809){ -if(_6a3(_808.insertedRows,row)==-1){ -if(_6a3(_808.updatedRows,row)==-1){ -_808.updatedRows.push(row); -} -} -opts.view.updateRow.call(opts.view,_806,_807.index,_807.row); -} -}; -function _80b(_80c){ -var _80d=$.data(_80c,"datagrid"); -var data=_80d.data; -var rows=data.rows; -var _80e=[]; -for(var i=0;i=0){ -(_81b=="s"?_726:_723)(_812,_81c,true); -} -} -}; -for(var i=0;i0){ -$(this).datagrid("loadData",data); -}else{ -$(this).datagrid("autoSizeColumn"); -} -} -_73c(this); -}); -}; -function _82c(_82d){ -var _82e={}; -$.map(_82d,function(name){ -_82e[name]=_82f(name); -}); -return _82e; -function _82f(name){ -function isA(_830){ -return $.data($(_830)[0],name)!=undefined; -}; -return {init:function(_831,_832){ -var _833=$("").appendTo(_831); -if(_833[name]&&name!="text"){ -return _833[name](_832); -}else{ -return _833; -} -},destroy:function(_834){ -if(isA(_834,name)){ -$(_834)[name]("destroy"); -} -},getValue:function(_835){ -if(isA(_835,name)){ -var opts=$(_835)[name]("options"); -if(opts.multiple){ -return $(_835)[name]("getValues").join(opts.separator); -}else{ -return $(_835)[name]("getValue"); -} -}else{ -return $(_835).val(); -} -},setValue:function(_836,_837){ -if(isA(_836,name)){ -var opts=$(_836)[name]("options"); -if(opts.multiple){ -if(_837){ -$(_836)[name]("setValues",_837.split(opts.separator)); -}else{ -$(_836)[name]("clear"); -} -}else{ -$(_836)[name]("setValue",_837); -} -}else{ -$(_836).val(_837); -} -},resize:function(_838,_839){ -if(isA(_838,name)){ -$(_838)[name]("resize",_839); -}else{ -$(_838)._size({width:_839,height:$.fn.datagrid.defaults.editorHeight}); -} -}}; -}; -}; -var _83a=$.extend({},_82c(["text","textbox","passwordbox","filebox","numberbox","numberspinner","combobox","combotree","combogrid","combotreegrid","datebox","datetimebox","timespinner","datetimespinner"]),{textarea:{init:function(_83b,_83c){ -var _83d=$("").appendTo(_83b); -_83d.css("vertical-align","middle")._outerHeight(_83c.height); -return _83d; -},getValue:function(_83e){ -return $(_83e).val(); -},setValue:function(_83f,_840){ -$(_83f).val(_840); -},resize:function(_841,_842){ -$(_841)._outerWidth(_842); -}},checkbox:{init:function(_843,_844){ -var _845=$("").appendTo(_843); -_845.val(_844.on); -_845.attr("offval",_844.off); -return _845; -},getValue:function(_846){ -if($(_846).is(":checked")){ -return $(_846).val(); -}else{ -return $(_846).attr("offval"); -} -},setValue:function(_847,_848){ -var _849=false; -if($(_847).val()==_848){ -_849=true; -} -$(_847)._propAttr("checked",_849); -}},validatebox:{init:function(_84a,_84b){ -var _84c=$("").appendTo(_84a); -_84c.validatebox(_84b); -return _84c; -},destroy:function(_84d){ -$(_84d).validatebox("destroy"); -},getValue:function(_84e){ -return $(_84e).val(); -},setValue:function(_84f,_850){ -$(_84f).val(_850); -},resize:function(_851,_852){ -$(_851)._outerWidth(_852)._outerHeight($.fn.datagrid.defaults.editorHeight); -}}}); -$.fn.datagrid.methods={options:function(jq){ -var _853=$.data(jq[0],"datagrid").options; -var _854=$.data(jq[0],"datagrid").panel.panel("options"); -var opts=$.extend(_853,{width:_854.width,height:_854.height,closed:_854.closed,collapsed:_854.collapsed,minimized:_854.minimized,maximized:_854.maximized}); -return opts; -},setSelectionState:function(jq){ -return jq.each(function(){ -_78a(this); -}); -},createStyleSheet:function(jq){ -return _6a8(jq[0]); -},getPanel:function(jq){ -return $.data(jq[0],"datagrid").panel; -},getPager:function(jq){ -return $.data(jq[0],"datagrid").panel.children("div.datagrid-pager"); -},getColumnFields:function(jq,_855){ -return _6ff(jq[0],_855); -},getColumnOption:function(jq,_856){ -return _700(jq[0],_856); -},resize:function(jq,_857){ -return jq.each(function(){ -_6b7(this,_857); -}); -},load:function(jq,_858){ -return jq.each(function(){ -var opts=$(this).datagrid("options"); -if(typeof _858=="string"){ -opts.url=_858; -_858=null; -} -opts.pageNumber=1; -var _859=$(this).datagrid("getPager"); -_859.pagination("refresh",{pageNumber:1}); -_73c(this,_858); -}); -},reload:function(jq,_85a){ -return jq.each(function(){ -var opts=$(this).datagrid("options"); -if(typeof _85a=="string"){ -opts.url=_85a; -_85a=null; -} -_73c(this,_85a); -}); -},reloadFooter:function(jq,_85b){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -var dc=$.data(this,"datagrid").dc; -if(_85b){ -$.data(this,"datagrid").footer=_85b; -} -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,this,dc.footer2,false); -opts.view.renderFooter.call(opts.view,this,dc.footer1,true); -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,this); -} -$(this).datagrid("fixRowHeight"); -} -}); -},loading:function(jq){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -$(this).datagrid("getPager").pagination("loading"); -if(opts.loadMsg){ -var _85c=$(this).datagrid("getPanel"); -if(!_85c.children("div.datagrid-mask").length){ -$("
                                                                                                                                                        ").appendTo(_85c); -var msg=$("
                                                                                                                                                        ").html(opts.loadMsg).appendTo(_85c); -msg._outerHeight(40); -msg.css({marginLeft:(-msg.outerWidth()/2),lineHeight:(msg.height()+"px")}); -} -} -}); -},loaded:function(jq){ -return jq.each(function(){ -$(this).datagrid("getPager").pagination("loaded"); -var _85d=$(this).datagrid("getPanel"); -_85d.children("div.datagrid-mask-msg").remove(); -_85d.children("div.datagrid-mask").remove(); -}); -},fitColumns:function(jq){ -return jq.each(function(){ -_749(this); -}); -},fixColumnSize:function(jq,_85e){ -return jq.each(function(){ -_767(this,_85e); -}); -},fixRowHeight:function(jq,_85f){ -return jq.each(function(){ -_6cd(this,_85f); -}); -},freezeRow:function(jq,_860){ -return jq.each(function(){ -_6da(this,_860); -}); -},autoSizeColumn:function(jq,_861){ -return jq.each(function(){ -_75b(this,_861); -}); -},loadData:function(jq,data){ -return jq.each(function(){ -_73d(this,data); -_80b(this); -}); -},getData:function(jq){ -return $.data(jq[0],"datagrid").data; -},getRows:function(jq){ -return $.data(jq[0],"datagrid").data.rows; -},getFooterRows:function(jq){ -return $.data(jq[0],"datagrid").footer; -},getRowIndex:function(jq,id){ -return _792(jq[0],id); -},getChecked:function(jq){ -return _798(jq[0]); -},getSelected:function(jq){ -var rows=_795(jq[0]); -return rows.length>0?rows[0]:null; -},getSelections:function(jq){ -return _795(jq[0]); -},clearSelections:function(jq){ -return jq.each(function(){ -var _862=$.data(this,"datagrid"); -var _863=_862.selectedRows; -var _864=_862.checkedRows; -_863.splice(0,_863.length); -_7ab(this); -if(_862.options.checkOnSelect){ -_864.splice(0,_864.length); -} -}); -},clearChecked:function(jq){ -return jq.each(function(){ -var _865=$.data(this,"datagrid"); -var _866=_865.selectedRows; -var _867=_865.checkedRows; -_867.splice(0,_867.length); -_712(this); -if(_865.options.selectOnCheck){ -_866.splice(0,_866.length); -} -}); -},scrollTo:function(jq,_868){ -return jq.each(function(){ -_79b(this,_868); -}); -},highlightRow:function(jq,_869){ -return jq.each(function(){ -_71f(this,_869); -_79b(this,_869); -}); -},selectAll:function(jq){ -return jq.each(function(){ -_7b0(this); -}); -},unselectAll:function(jq){ -return jq.each(function(){ -_7ab(this); -}); -},selectRow:function(jq,_86a){ -return jq.each(function(){ -_726(this,_86a); -}); -},selectRecord:function(jq,id){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -if(opts.idField){ -var _86b=_792(this,id); -if(_86b>=0){ -$(this).datagrid("selectRow",_86b); -} -} -}); -},unselectRow:function(jq,_86c){ -return jq.each(function(){ -_727(this,_86c); -}); -},checkRow:function(jq,_86d){ -return jq.each(function(){ -_723(this,_86d); -}); -},uncheckRow:function(jq,_86e){ -return jq.each(function(){ -_724(this,_86e); -}); -},checkAll:function(jq){ -return jq.each(function(){ -_711(this); -}); -},uncheckAll:function(jq){ -return jq.each(function(){ -_712(this); -}); -},beginEdit:function(jq,_86f){ -return jq.each(function(){ -_7ca(this,_86f); -}); -},endEdit:function(jq,_870){ -return jq.each(function(){ -_7d0(this,_870,false); -}); -},cancelEdit:function(jq,_871){ -return jq.each(function(){ -_7d0(this,_871,true); -}); -},getEditors:function(jq,_872){ -return _7dd(jq[0],_872); -},getEditor:function(jq,_873){ -return _7e1(jq[0],_873); -},refreshRow:function(jq,_874){ -return jq.each(function(){ -var opts=$.data(this,"datagrid").options; -opts.view.refreshRow.call(opts.view,this,_874); -}); -},validateRow:function(jq,_875){ -return _7cf(jq[0],_875); -},updateRow:function(jq,_876){ -return jq.each(function(){ -_805(this,_876); -}); -},appendRow:function(jq,row){ -return jq.each(function(){ -_802(this,row); -}); -},insertRow:function(jq,_877){ -return jq.each(function(){ -_7fe(this,_877); -}); -},deleteRow:function(jq,_878){ -return jq.each(function(){ -_7f8(this,_878); -}); -},getChanges:function(jq,_879){ -return _7f2(jq[0],_879); -},acceptChanges:function(jq){ -return jq.each(function(){ -_80f(this); -}); -},rejectChanges:function(jq){ -return jq.each(function(){ -_811(this); -}); -},mergeCells:function(jq,_87a){ -return jq.each(function(){ -_823(this,_87a); -}); -},showColumn:function(jq,_87b){ -return jq.each(function(){ -var col=$(this).datagrid("getColumnOption",_87b); -if(col.hidden){ -col.hidden=false; -$(this).datagrid("getPanel").find("td[field=\""+_87b+"\"]").show(); -_73e(this,_87b,1); -$(this).datagrid("fitColumns"); -} -}); -},hideColumn:function(jq,_87c){ -return jq.each(function(){ -var col=$(this).datagrid("getColumnOption",_87c); -if(!col.hidden){ -col.hidden=true; -$(this).datagrid("getPanel").find("td[field=\""+_87c+"\"]").hide(); -_73e(this,_87c,-1); -$(this).datagrid("fitColumns"); -} -}); -},sort:function(jq,_87d){ -return jq.each(function(){ -_713(this,_87d); -}); -},gotoPage:function(jq,_87e){ -return jq.each(function(){ -var _87f=this; -var page,cb; -if(typeof _87e=="object"){ -page=_87e.page; -cb=_87e.callback; -}else{ -page=_87e; -} -$(_87f).datagrid("options").pageNumber=page; -$(_87f).datagrid("getPager").pagination("refresh",{pageNumber:page}); -_73c(_87f,null,function(){ -if(cb){ -cb.call(_87f,page); -} -}); -}); -}}; -$.fn.datagrid.parseOptions=function(_880){ -var t=$(_880); -return $.extend({},$.fn.panel.parseOptions(_880),$.parser.parseOptions(_880,["url","toolbar","idField","sortName","sortOrder","pagePosition","resizeHandle",{sharedStyleSheet:"boolean",fitColumns:"boolean",autoRowHeight:"boolean",striped:"boolean",nowrap:"boolean"},{rownumbers:"boolean",singleSelect:"boolean",ctrlSelect:"boolean",checkOnSelect:"boolean",selectOnCheck:"boolean"},{pagination:"boolean",pageSize:"number",pageNumber:"number"},{multiSort:"boolean",remoteSort:"boolean",showHeader:"boolean",showFooter:"boolean"},{scrollbarSize:"number",scrollOnSelect:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined),loadMsg:(t.attr("loadMsg")!=undefined?t.attr("loadMsg"):undefined),rowStyler:(t.attr("rowStyler")?eval(t.attr("rowStyler")):undefined)}); -}; -$.fn.datagrid.parseData=function(_881){ -var t=$(_881); -var data={total:0,rows:[]}; -var _882=t.datagrid("getColumnFields",true).concat(t.datagrid("getColumnFields",false)); -t.find("tbody tr").each(function(){ -data.total++; -var row={}; -$.extend(row,$.parser.parseOptions(this,["iconCls","state"])); -for(var i=0;i<_882.length;i++){ -row[_882[i]]=$(this).find("td:eq("+i+")").html(); -} -data.rows.push(row); -}); -return data; -}; -var _883={render:function(_884,_885,_886){ -var rows=$(_884).datagrid("getRows"); -$(_885).empty().html(this.renderTable(_884,0,rows,_886)); -},renderFooter:function(_887,_888,_889){ -var opts=$.data(_887,"datagrid").options; -var rows=$.data(_887,"datagrid").footer||[]; -var _88a=$(_887).datagrid("getColumnFields",_889); -var _88b=[""]; -for(var i=0;i"); -_88b.push(this.renderRow.call(this,_887,_88a,_889,i,rows[i])); -_88b.push(""); -} -_88b.push("
                                                                                                                                                        "); -$(_888).html(_88b.join("")); -},renderTable:function(_88c,_88d,rows,_88e){ -var _88f=$.data(_88c,"datagrid"); -var opts=_88f.options; -if(_88e){ -if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){ -return ""; -} -} -var _890=$(_88c).datagrid("getColumnFields",_88e); -var _891=[""]; -for(var i=0;i"); -_891.push(this.renderRow.call(this,_88c,_890,_88e,_88d,row)); -_891.push(""); -_88d++; -} -_891.push("
                                                                                                                                                        "); -return _891.join(""); -},renderRow:function(_894,_895,_896,_897,_898){ -var opts=$.data(_894,"datagrid").options; -var cc=[]; -if(_896&&opts.rownumbers){ -var _899=_897+1; -if(opts.pagination){ -_899+=(opts.pageNumber-1)*opts.pageSize; -} -cc.push("
                                                                                                                                                        "+_899+"
                                                                                                                                                        "); -} -for(var i=0;i<_895.length;i++){ -var _89a=_895[i]; -var col=$(_894).datagrid("getColumnOption",_89a); -if(col){ -var _89b=_898[_89a]; -var css=col.styler?(col.styler.call(_894,_89b,_898,_897)||""):""; -var cs=this.getStyleValue(css); -var cls=cs.c?"class=\""+cs.c+"\"":""; -var _89c=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); -cc.push(""); -var _89c=""; -if(!col.checkbox){ -if(col.align){ -_89c+="text-align:"+col.align+";"; -} -if(!opts.nowrap){ -_89c+="white-space:normal;height:auto;"; -}else{ -if(opts.autoRowHeight){ -_89c+="height:auto;"; -} -} -} -cc.push("
                                                                                                                                                        "); -if(col.checkbox){ -cc.push(""); -}else{ -if(col.formatter){ -cc.push(col.formatter(_89b,_898,_897)); -}else{ -cc.push(_89b); -} -} -cc.push("
                                                                                                                                                        "); -cc.push(""); -} -} -return cc.join(""); -},getStyleValue:function(css){ -var _89d=""; -var _89e=""; -if(typeof css=="string"){ -_89e=css; -}else{ -if(css){ -_89d=css["class"]||""; -_89e=css["style"]||""; -} -} -return {c:_89d,s:_89e}; -},refreshRow:function(_89f,_8a0){ -this.updateRow.call(this,_89f,_8a0,{}); -},updateRow:function(_8a1,_8a2,row){ -var opts=$.data(_8a1,"datagrid").options; -var _8a3=opts.finder.getRow(_8a1,_8a2); -$.extend(_8a3,row); -var cs=_8a4.call(this,_8a2); -var _8a5=cs.s; -var cls="datagrid-row "+(_8a2%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c; -function _8a4(_8a6){ -var css=opts.rowStyler?opts.rowStyler.call(_8a1,_8a6,_8a3):""; -return this.getStyleValue(css); -}; -function _8a7(_8a8){ -var tr=opts.finder.getTr(_8a1,_8a2,"body",(_8a8?1:2)); -if(!tr.length){ -return; -} -var _8a9=$(_8a1).datagrid("getColumnFields",_8a8); -var _8aa=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); -tr.html(this.renderRow.call(this,_8a1,_8a9,_8a8,_8a2,_8a3)); -var _8ab=(tr.hasClass("datagrid-row-checked")?" datagrid-row-checked":"")+(tr.hasClass("datagrid-row-selected")?" datagrid-row-selected":""); -tr.attr("style",_8a5).attr("class",cls+_8ab); -if(_8aa){ -tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); -} -}; -_8a7.call(this,true); -_8a7.call(this,false); -$(_8a1).datagrid("fixRowHeight",_8a2); -},insertRow:function(_8ac,_8ad,row){ -var _8ae=$.data(_8ac,"datagrid"); -var opts=_8ae.options; -var dc=_8ae.dc; -var data=_8ae.data; -if(_8ad==undefined||_8ad==null){ -_8ad=data.rows.length; -} -if(_8ad>data.rows.length){ -_8ad=data.rows.length; -} -function _8af(_8b0){ -var _8b1=_8b0?1:2; -for(var i=data.rows.length-1;i>=_8ad;i--){ -var tr=opts.finder.getTr(_8ac,i,"body",_8b1); -tr.attr("datagrid-row-index",i+1); -tr.attr("id",_8ae.rowIdPrefix+"-"+_8b1+"-"+(i+1)); -if(_8b0&&opts.rownumbers){ -var _8b2=i+2; -if(opts.pagination){ -_8b2+=(opts.pageNumber-1)*opts.pageSize; -} -tr.find("div.datagrid-cell-rownumber").html(_8b2); -} -if(opts.striped){ -tr.removeClass("datagrid-row-alt").addClass((i+1)%2?"datagrid-row-alt":""); -} -} -}; -function _8b3(_8b4){ -var _8b5=_8b4?1:2; -var _8b6=$(_8ac).datagrid("getColumnFields",_8b4); -var _8b7=_8ae.rowIdPrefix+"-"+_8b5+"-"+_8ad; -var tr=""; -if(_8ad>=data.rows.length){ -if(data.rows.length){ -opts.finder.getTr(_8ac,"","last",_8b5).after(tr); -}else{ -var cc=_8b4?dc.body1:dc.body2; -cc.html(""+tr+"
                                                                                                                                                        "); -} -}else{ -opts.finder.getTr(_8ac,_8ad+1,"body",_8b5).before(tr); -} -}; -_8af.call(this,true); -_8af.call(this,false); -_8b3.call(this,true); -_8b3.call(this,false); -data.total+=1; -data.rows.splice(_8ad,0,row); -this.setEmptyMsg(_8ac); -this.refreshRow.call(this,_8ac,_8ad); -},deleteRow:function(_8b8,_8b9){ -var _8ba=$.data(_8b8,"datagrid"); -var opts=_8ba.options; -var data=_8ba.data; -function _8bb(_8bc){ -var _8bd=_8bc?1:2; -for(var i=_8b9+1;i
                                                                                                                                                        ").appendTo(_8c4.dc.view); -d.html(opts.emptyMsg).css("top",h+"px"); -} -} -},renderEmptyRow:function(_8c6){ -var cols=$.map($(_8c6).datagrid("getColumnFields"),function(_8c7){ -return $(_8c6).datagrid("getColumnOption",_8c7); -}); -$.map(cols,function(col){ -col.formatter1=col.formatter; -col.styler1=col.styler; -col.formatter=col.styler=undefined; -}); -var _8c8=$.data(_8c6,"datagrid").dc.body2; -_8c8.html(this.renderTable(_8c6,0,[{}],false)); -_8c8.find("tbody *").css({height:1,borderColor:"transparent",background:"transparent"}); -var tr=_8c8.find(".datagrid-row"); -tr.removeClass("datagrid-row").removeAttr("datagrid-row-index"); -tr.find(".datagrid-cell,.datagrid-cell-check").empty(); -$.map(cols,function(col){ -col.formatter=col.formatter1; -col.styler=col.styler1; -col.formatter1=col.styler1=undefined; -}); -}}; -$.fn.datagrid.defaults=$.extend({},$.fn.panel.defaults,{sharedStyleSheet:false,frozenColumns:undefined,columns:undefined,fitColumns:false,resizeHandle:"right",resizeEdge:5,autoRowHeight:true,toolbar:null,striped:false,method:"post",nowrap:true,idField:null,url:null,data:null,loadMsg:"Processing, please wait ...",emptyMsg:"",rownumbers:false,singleSelect:false,ctrlSelect:false,selectOnCheck:true,checkOnSelect:true,pagination:false,pagePosition:"bottom",pageNumber:1,pageSize:10,pageList:[10,20,30,40,50],queryParams:{},sortName:null,sortOrder:"asc",multiSort:false,remoteSort:true,showHeader:true,showFooter:false,scrollOnSelect:true,scrollbarSize:18,rownumberWidth:30,editorHeight:31,headerEvents:{mouseover:_70b(true),mouseout:_70b(false),click:_70f,dblclick:_714,contextmenu:_717},rowEvents:{mouseover:_719(true),mouseout:_719(false),click:_720,dblclick:_72a,contextmenu:_72e},rowStyler:function(_8c9,_8ca){ -},loader:function(_8cb,_8cc,_8cd){ -var opts=$(this).datagrid("options"); -if(!opts.url){ -return false; -} -$.ajax({type:opts.method,url:opts.url,data:_8cb,dataType:"json",success:function(data){ -_8cc(data); -},error:function(){ -_8cd.apply(this,arguments); -}}); -},loadFilter:function(data){ -return data; -},editors:_83a,finder:{getTr:function(_8ce,_8cf,type,_8d0){ -type=type||"body"; -_8d0=_8d0||0; -var _8d1=$.data(_8ce,"datagrid"); -var dc=_8d1.dc; -var opts=_8d1.options; -if(_8d0==0){ -var tr1=opts.finder.getTr(_8ce,_8cf,type,1); -var tr2=opts.finder.getTr(_8ce,_8cf,type,2); -return tr1.add(tr2); -}else{ -if(type=="body"){ -var tr=$("#"+_8d1.rowIdPrefix+"-"+_8d0+"-"+_8cf); -if(!tr.length){ -tr=(_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index="+_8cf+"]"); -} -return tr; -}else{ -if(type=="footer"){ -return (_8d0==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index="+_8cf+"]"); -}else{ -if(type=="selected"){ -return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-selected"); -}else{ -if(type=="highlight"){ -return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-over"); -}else{ -if(type=="checked"){ -return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-checked"); -}else{ -if(type=="editing"){ -return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-editing"); -}else{ -if(type=="last"){ -return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]:last"); -}else{ -if(type=="allbody"){ -return (_8d0==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]"); -}else{ -if(type=="allfooter"){ -return (_8d0==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index]"); -} -} -} -} -} -} -} -} -} -} -},getRow:function(_8d2,p){ -var _8d3=(typeof p=="object")?p.attr("datagrid-row-index"):p; -return $.data(_8d2,"datagrid").data.rows[parseInt(_8d3)]; -},getRows:function(_8d4){ -return $(_8d4).datagrid("getRows"); -}},view:_883,onBeforeLoad:function(_8d5){ -},onLoadSuccess:function(){ -},onLoadError:function(){ -},onClickRow:function(_8d6,_8d7){ -},onDblClickRow:function(_8d8,_8d9){ -},onClickCell:function(_8da,_8db,_8dc){ -},onDblClickCell:function(_8dd,_8de,_8df){ -},onBeforeSortColumn:function(sort,_8e0){ -},onSortColumn:function(sort,_8e1){ -},onResizeColumn:function(_8e2,_8e3){ -},onBeforeSelect:function(_8e4,_8e5){ -},onSelect:function(_8e6,_8e7){ -},onBeforeUnselect:function(_8e8,_8e9){ -},onUnselect:function(_8ea,_8eb){ -},onSelectAll:function(rows){ -},onUnselectAll:function(rows){ -},onBeforeCheck:function(_8ec,_8ed){ -},onCheck:function(_8ee,_8ef){ -},onBeforeUncheck:function(_8f0,_8f1){ -},onUncheck:function(_8f2,_8f3){ -},onCheckAll:function(rows){ -},onUncheckAll:function(rows){ -},onBeforeEdit:function(_8f4,_8f5){ -},onBeginEdit:function(_8f6,_8f7){ -},onEndEdit:function(_8f8,_8f9,_8fa){ -},onAfterEdit:function(_8fb,_8fc,_8fd){ -},onCancelEdit:function(_8fe,_8ff){ -},onHeaderContextMenu:function(e,_900){ -},onRowContextMenu:function(e,_901,_902){ -}}); -})(jQuery); -(function($){ -var _903; -$(document).unbind(".propertygrid").bind("mousedown.propertygrid",function(e){ -var p=$(e.target).closest("div.datagrid-view,div.combo-panel"); -if(p.length){ -return; -} -_904(_903); -_903=undefined; -}); -function _905(_906){ -var _907=$.data(_906,"propertygrid"); -var opts=$.data(_906,"propertygrid").options; -$(_906).datagrid($.extend({},opts,{cls:"propertygrid",view:(opts.showGroup?opts.groupView:opts.view),onBeforeEdit:function(_908,row){ -if(opts.onBeforeEdit.call(_906,_908,row)==false){ -return false; -} -var dg=$(this); -var row=dg.datagrid("getRows")[_908]; -var col=dg.datagrid("getColumnOption","value"); -col.editor=row.editor; -},onClickCell:function(_909,_90a,_90b){ -if(_903!=this){ -_904(_903); -_903=this; -} -if(opts.editIndex!=_909){ -_904(_903); -$(this).datagrid("beginEdit",_909); -var ed=$(this).datagrid("getEditor",{index:_909,field:_90a}); -if(!ed){ -ed=$(this).datagrid("getEditor",{index:_909,field:"value"}); -} -if(ed){ -var t=$(ed.target); -var _90c=t.data("textbox")?t.textbox("textbox"):t; -_90c.focus(); -opts.editIndex=_909; -} -} -opts.onClickCell.call(_906,_909,_90a,_90b); -},loadFilter:function(data){ -_904(this); -return opts.loadFilter.call(this,data); -}})); -}; -function _904(_90d){ -var t=$(_90d); -if(!t.length){ -return; -} -var opts=$.data(_90d,"propertygrid").options; -opts.finder.getTr(_90d,null,"editing").each(function(){ -var _90e=parseInt($(this).attr("datagrid-row-index")); -if(t.datagrid("validateRow",_90e)){ -t.datagrid("endEdit",_90e); -}else{ -t.datagrid("cancelEdit",_90e); -} -}); -opts.editIndex=undefined; -}; -$.fn.propertygrid=function(_90f,_910){ -if(typeof _90f=="string"){ -var _911=$.fn.propertygrid.methods[_90f]; -if(_911){ -return _911(this,_910); -}else{ -return this.datagrid(_90f,_910); -} -} -_90f=_90f||{}; -return this.each(function(){ -var _912=$.data(this,"propertygrid"); -if(_912){ -$.extend(_912.options,_90f); -}else{ -var opts=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_90f); -opts.frozenColumns=$.extend(true,[],opts.frozenColumns); -opts.columns=$.extend(true,[],opts.columns); -$.data(this,"propertygrid",{options:opts}); -} -_905(this); -}); -}; -$.fn.propertygrid.methods={options:function(jq){ -return $.data(jq[0],"propertygrid").options; -}}; -$.fn.propertygrid.parseOptions=function(_913){ -return $.extend({},$.fn.datagrid.parseOptions(_913),$.parser.parseOptions(_913,[{showGroup:"boolean"}])); -}; -var _914=$.extend({},$.fn.datagrid.defaults.view,{render:function(_915,_916,_917){ -var _918=[]; -var _919=this.groups; -for(var i=0;i<_919.length;i++){ -_918.push(this.renderGroup.call(this,_915,i,_919[i],_917)); -} -$(_916).html(_918.join("")); -},renderGroup:function(_91a,_91b,_91c,_91d){ -var _91e=$.data(_91a,"datagrid"); -var opts=_91e.options; -var _91f=$(_91a).datagrid("getColumnFields",_91d); -var _920=opts.frozenColumns&&opts.frozenColumns.length; -if(_91d){ -if(!(opts.rownumbers||_920)){ -return ""; -} -} -var _921=[]; -var css=opts.groupStyler.call(_91a,_91c.value,_91c.rows); -var cs=_922(css,"datagrid-group"); -_921.push("
                                                                                                                                                        "); -if((_91d&&(opts.rownumbers||opts.frozenColumns.length))||(!_91d&&!(opts.rownumbers||opts.frozenColumns.length))){ -_921.push(""); -_921.push(" "); -_921.push(""); -} -if((_91d&&_920)||(!_91d)){ -_921.push(""); -_921.push(opts.groupFormatter.call(_91a,_91c.value,_91c.rows)); -_921.push(""); -} -_921.push("
                                                                                                                                                        "); -_921.push(""); -var _923=_91c.startIndex; -for(var j=0;j<_91c.rows.length;j++){ -var css=opts.rowStyler?opts.rowStyler.call(_91a,_923,_91c.rows[j]):""; -var _924=""; -var _925=""; -if(typeof css=="string"){ -_925=css; -}else{ -if(css){ -_924=css["class"]||""; -_925=css["style"]||""; -} -} -var cls="class=\"datagrid-row "+(_923%2&&opts.striped?"datagrid-row-alt ":" ")+_924+"\""; -var _926=_925?"style=\""+_925+"\"":""; -var _927=_91e.rowIdPrefix+"-"+(_91d?1:2)+"-"+_923; -_921.push(""); -_921.push(this.renderRow.call(this,_91a,_91f,_91d,_923,_91c.rows[j])); -_921.push(""); -_923++; -} -_921.push("
                                                                                                                                                        "); -return _921.join(""); -function _922(css,cls){ -var _928=""; -var _929=""; -if(typeof css=="string"){ -_929=css; -}else{ -if(css){ -_928=css["class"]||""; -_929=css["style"]||""; -} -} -return "class=\""+cls+(_928?" "+_928:"")+"\" "+"style=\""+_929+"\""; -}; -},bindEvents:function(_92a){ -var _92b=$.data(_92a,"datagrid"); -var dc=_92b.dc; -var body=dc.body1.add(dc.body2); -var _92c=($.data(body[0],"events")||$._data(body[0],"events")).click[0].handler; -body.unbind("click").bind("click",function(e){ -var tt=$(e.target); -var _92d=tt.closest("span.datagrid-row-expander"); -if(_92d.length){ -var _92e=_92d.closest("div.datagrid-group").attr("group-index"); -if(_92d.hasClass("datagrid-row-collapse")){ -$(_92a).datagrid("collapseGroup",_92e); -}else{ -$(_92a).datagrid("expandGroup",_92e); -} -}else{ -_92c(e); -} -e.stopPropagation(); -}); -},onBeforeRender:function(_92f,rows){ -var _930=$.data(_92f,"datagrid"); -var opts=_930.options; -_931(); -var _932=[]; -for(var i=0;i"+".datagrid-group{height:"+opts.groupHeight+"px;overflow:hidden;font-weight:bold;border-bottom:1px solid #ccc;white-space:nowrap;word-break:normal;}"+".datagrid-group-title,.datagrid-group-expander{display:inline-block;vertical-align:bottom;height:100%;line-height:"+opts.groupHeight+"px;padding:0 4px;}"+".datagrid-group-title{position:relative;}"+".datagrid-group-expander{width:"+opts.expanderWidth+"px;text-align:center;padding:0}"+".datagrid-row-expander{margin:"+Math.floor((opts.groupHeight-16)/2)+"px 0;display:inline-block;width:16px;height:16px;cursor:pointer}"+""); -} -}; -},onAfterRender:function(_939){ -$.fn.datagrid.defaults.view.onAfterRender.call(this,_939); -var view=this; -var _93a=$.data(_939,"datagrid"); -var opts=_93a.options; -if(!_93a.onResizeColumn){ -_93a.onResizeColumn=opts.onResizeColumn; -} -if(!_93a.onResize){ -_93a.onResize=opts.onResize; -} -opts.onResizeColumn=function(_93b,_93c){ -view.resizeGroup(_939); -_93a.onResizeColumn.call(_939,_93b,_93c); -}; -opts.onResize=function(_93d,_93e){ -view.resizeGroup(_939); -_93a.onResize.call($(_939).datagrid("getPanel")[0],_93d,_93e); -}; -view.resizeGroup(_939); -}}); -$.extend($.fn.datagrid.methods,{groups:function(jq){ -return jq.datagrid("options").view.groups; -},expandGroup:function(jq,_93f){ -return jq.each(function(){ -var opts=$(this).datagrid("options"); -var view=$.data(this,"datagrid").dc.view; -var _940=view.find(_93f!=undefined?"div.datagrid-group[group-index=\""+_93f+"\"]":"div.datagrid-group"); -var _941=_940.find("span.datagrid-row-expander"); -if(_941.hasClass("datagrid-row-expand")){ -_941.removeClass("datagrid-row-expand").addClass("datagrid-row-collapse"); -_940.next("table").show(); -} -$(this).datagrid("fixRowHeight"); -if(opts.onExpandGroup){ -opts.onExpandGroup.call(this,_93f); -} -}); -},collapseGroup:function(jq,_942){ -return jq.each(function(){ -var opts=$(this).datagrid("options"); -var view=$.data(this,"datagrid").dc.view; -var _943=view.find(_942!=undefined?"div.datagrid-group[group-index=\""+_942+"\"]":"div.datagrid-group"); -var _944=_943.find("span.datagrid-row-expander"); -if(_944.hasClass("datagrid-row-collapse")){ -_944.removeClass("datagrid-row-collapse").addClass("datagrid-row-expand"); -_943.next("table").hide(); -} -$(this).datagrid("fixRowHeight"); -if(opts.onCollapseGroup){ -opts.onCollapseGroup.call(this,_942); -} -}); -},scrollToGroup:function(jq,_945){ -return jq.each(function(){ -var _946=$.data(this,"datagrid"); -var dc=_946.dc; -var grow=dc.body2.children("div.datagrid-group[group-index=\""+_945+"\"]"); -if(grow.length){ -var _947=grow.outerHeight(); -var _948=dc.view2.children("div.datagrid-header")._outerHeight(); -var _949=dc.body2.outerHeight(true)-dc.body2.outerHeight(); -var top=grow.position().top-_948-_949; -if(top<0){ -dc.body2.scrollTop(dc.body2.scrollTop()+top); -}else{ -if(top+_947>dc.body2.height()-18){ -dc.body2.scrollTop(dc.body2.scrollTop()+top+_947-dc.body2.height()+18); -} -} -} -}); -}}); -$.extend(_914,{refreshGroupTitle:function(_94a,_94b){ -var _94c=$.data(_94a,"datagrid"); -var opts=_94c.options; -var dc=_94c.dc; -var _94d=this.groups[_94b]; -var span=dc.body1.add(dc.body2).children("div.datagrid-group[group-index="+_94b+"]").find("span.datagrid-group-title"); -span.html(opts.groupFormatter.call(_94a,_94d.value,_94d.rows)); -},resizeGroup:function(_94e,_94f){ -var _950=$.data(_94e,"datagrid"); -var dc=_950.dc; -var ht=dc.header2.find("table"); -var fr=ht.find("tr.datagrid-filter-row").hide(); -var ww=ht.width(); -if(_94f==undefined){ -var _951=dc.body2.children("div.datagrid-group"); -}else{ -var _951=dc.body2.children("div.datagrid-group[group-index="+_94f+"]"); -} -_951._outerWidth(ww); -var opts=_950.options; -if(opts.frozenColumns&&opts.frozenColumns.length){ -var _952=dc.view1.width()-opts.expanderWidth; -var _953=dc.view1.css("direction").toLowerCase()=="rtl"; -_951.find(".datagrid-group-title").css(_953?"right":"left",-_952+"px"); -} -if(fr.length){ -if(opts.showFilterBar){ -fr.show(); -} -} -},insertRow:function(_954,_955,row){ -var _956=$.data(_954,"datagrid"); -var opts=_956.options; -var dc=_956.dc; -var _957=null; -var _958; -if(!_956.data.rows.length){ -$(_954).datagrid("loadData",[row]); -return; -} -for(var i=0;i_957.startIndex+_957.rows.length){ -_955=_957.startIndex+_957.rows.length; -} -} -$.fn.datagrid.defaults.view.insertRow.call(this,_954,_955,row); -if(_955>=_957.startIndex+_957.rows.length){ -_959(_955,true); -_959(_955,false); -} -_957.rows.splice(_955-_957.startIndex,0,row); -}else{ -_957={value:row[opts.groupField],rows:[row],startIndex:_956.data.rows.length}; -_958=this.groups.length; -dc.body1.append(this.renderGroup.call(this,_954,_958,_957,true)); -dc.body2.append(this.renderGroup.call(this,_954,_958,_957,false)); -this.groups.push(_957); -_956.data.rows.push(row); -} -this.setGroupIndex(_954); -this.refreshGroupTitle(_954,_958); -this.resizeGroup(_954); -function _959(_95a,_95b){ -var _95c=_95b?1:2; -var _95d=opts.finder.getTr(_954,_95a-1,"body",_95c); -var tr=opts.finder.getTr(_954,_95a,"body",_95c); -tr.insertAfter(_95d); -}; -},updateRow:function(_95e,_95f,row){ -var opts=$.data(_95e,"datagrid").options; -$.fn.datagrid.defaults.view.updateRow.call(this,_95e,_95f,row); -var tb=opts.finder.getTr(_95e,_95f,"body",2).closest("table.datagrid-btable"); -var _960=parseInt(tb.prev().attr("group-index")); -this.refreshGroupTitle(_95e,_960); -},deleteRow:function(_961,_962){ -var _963=$.data(_961,"datagrid"); -var opts=_963.options; -var dc=_963.dc; -var body=dc.body1.add(dc.body2); -var tb=opts.finder.getTr(_961,_962,"body",2).closest("table.datagrid-btable"); -var _964=parseInt(tb.prev().attr("group-index")); -$.fn.datagrid.defaults.view.deleteRow.call(this,_961,_962); -var _965=this.groups[_964]; -if(_965.rows.length>1){ -_965.rows.splice(_962-_965.startIndex,1); -this.refreshGroupTitle(_961,_964); -}else{ -body.children("div.datagrid-group[group-index="+_964+"]").remove(); -for(var i=_964+1;i").insertBefore(tr.find(".tree-title")); -} -if(row.checkState=="checked"){ -_98d(_9a1,_9a2,true,true); -}else{ -if(row.checkState=="unchecked"){ -_98d(_9a1,_9a2,false,true); -}else{ -var flag=_99f(row); -if(flag===0){ -_98d(_9a1,_9a2,false,true); -}else{ -if(flag===1){ -_98d(_9a1,_9a2,true,true); -} -} -} -} -}else{ -ck.remove(); -row.checkState=undefined; -row.checked=undefined; -_996(_9a1,row); -} -}; -function _9a3(_9a4,_9a5){ -var opts=$.data(_9a4,"treegrid").options; -var tr1=opts.finder.getTr(_9a4,_9a5,"body",1); -var tr2=opts.finder.getTr(_9a4,_9a5,"body",2); -var _9a6=$(_9a4).datagrid("getColumnFields",true).length+(opts.rownumbers?1:0); -var _9a7=$(_9a4).datagrid("getColumnFields",false).length; -_9a8(tr1,_9a6); -_9a8(tr2,_9a7); -function _9a8(tr,_9a9){ -$(""+""+"
                                                                                                                                                        "+""+"").insertAfter(tr); -}; -}; -function _9aa(_9ab,_9ac,data,_9ad,_9ae){ -var _9af=$.data(_9ab,"treegrid"); -var opts=_9af.options; -var dc=_9af.dc; -data=opts.loadFilter.call(_9ab,data,_9ac); -var node=find(_9ab,_9ac); -if(node){ -var _9b0=opts.finder.getTr(_9ab,_9ac,"body",1); -var _9b1=opts.finder.getTr(_9ab,_9ac,"body",2); -var cc1=_9b0.next("tr.treegrid-tr-tree").children("td").children("div"); -var cc2=_9b1.next("tr.treegrid-tr-tree").children("td").children("div"); -if(!_9ad){ -node.children=[]; -} -}else{ -var cc1=dc.body1; -var cc2=dc.body2; -if(!_9ad){ -_9af.data=[]; -} -} -if(!_9ad){ -cc1.empty(); -cc2.empty(); -} -if(opts.view.onBeforeRender){ -opts.view.onBeforeRender.call(opts.view,_9ab,_9ac,data); -} -opts.view.render.call(opts.view,_9ab,cc1,true); -opts.view.render.call(opts.view,_9ab,cc2,false); -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,_9ab,dc.footer1,true); -opts.view.renderFooter.call(opts.view,_9ab,dc.footer2,false); -} -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,_9ab); -} -if(!_9ac&&opts.pagination){ -var _9b2=$.data(_9ab,"treegrid").total; -var _9b3=$(_9ab).datagrid("getPager"); -if(_9b3.pagination("options").total!=_9b2){ -_9b3.pagination({total:_9b2}); -} -} -_97c(_9ab); -_984(_9ab); -$(_9ab).treegrid("showLines"); -$(_9ab).treegrid("setSelectionState"); -$(_9ab).treegrid("autoSizeColumn"); -if(!_9ae){ -opts.onLoadSuccess.call(_9ab,node,data); -} -}; -function _97b(_9b4,_9b5,_9b6,_9b7,_9b8){ -var opts=$.data(_9b4,"treegrid").options; -var body=$(_9b4).datagrid("getPanel").find("div.datagrid-body"); -if(_9b5==undefined&&opts.queryParams){ -opts.queryParams.id=undefined; -} -if(_9b6){ -opts.queryParams=_9b6; -} -var _9b9=$.extend({},opts.queryParams); -if(opts.pagination){ -$.extend(_9b9,{page:opts.pageNumber,rows:opts.pageSize}); -} -if(opts.sortName){ -$.extend(_9b9,{sort:opts.sortName,order:opts.sortOrder}); -} -var row=find(_9b4,_9b5); -if(opts.onBeforeLoad.call(_9b4,row,_9b9)==false){ -return; -} -var _9ba=body.find("tr[node-id=\""+_9b5+"\"] span.tree-folder"); -_9ba.addClass("tree-loading"); -$(_9b4).treegrid("loading"); -var _9bb=opts.loader.call(_9b4,_9b9,function(data){ -_9ba.removeClass("tree-loading"); -$(_9b4).treegrid("loaded"); -_9aa(_9b4,_9b5,data,_9b7); -if(_9b8){ -_9b8(); -} -},function(){ -_9ba.removeClass("tree-loading"); -$(_9b4).treegrid("loaded"); -opts.onLoadError.apply(_9b4,arguments); -if(_9b8){ -_9b8(); -} -}); -if(_9bb==false){ -_9ba.removeClass("tree-loading"); -$(_9b4).treegrid("loaded"); -} -}; -function _9bc(_9bd){ -var _9be=_9bf(_9bd); -return _9be.length?_9be[0]:null; -}; -function _9bf(_9c0){ -return $.data(_9c0,"treegrid").data; -}; -function _99e(_9c1,_9c2){ -var row=find(_9c1,_9c2); -if(row._parentId){ -return find(_9c1,row._parentId); -}else{ -return null; -} -}; -function _980(_9c3,_9c4){ -var data=$.data(_9c3,"treegrid").data; -if(_9c4){ -var _9c5=find(_9c3,_9c4); -data=_9c5?(_9c5.children||[]):[]; -} -var _9c6=[]; -$.easyui.forEach(data,true,function(node){ -_9c6.push(node); -}); -return _9c6; -}; -function _9c7(_9c8,_9c9){ -var opts=$.data(_9c8,"treegrid").options; -var tr=opts.finder.getTr(_9c8,_9c9); -var node=tr.children("td[field=\""+opts.treeField+"\"]"); -return node.find("span.tree-indent,span.tree-hit").length; -}; -function find(_9ca,_9cb){ -var _9cc=$.data(_9ca,"treegrid"); -var opts=_9cc.options; -var _9cd=null; -$.easyui.forEach(_9cc.data,true,function(node){ -if(node[opts.idField]==_9cb){ -_9cd=node; -return false; -} -}); -return _9cd; -}; -function _9ce(_9cf,_9d0){ -var opts=$.data(_9cf,"treegrid").options; -var row=find(_9cf,_9d0); -var tr=opts.finder.getTr(_9cf,_9d0); -var hit=tr.find("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-collapsed")){ -return; -} -if(opts.onBeforeCollapse.call(_9cf,row)==false){ -return; -} -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -hit.next().removeClass("tree-folder-open"); -row.state="closed"; -tr=tr.next("tr.treegrid-tr-tree"); -var cc=tr.children("td").children("div"); -if(opts.animate){ -cc.slideUp("normal",function(){ -$(_9cf).treegrid("autoSizeColumn"); -_97c(_9cf,_9d0); -opts.onCollapse.call(_9cf,row); -}); -}else{ -cc.hide(); -$(_9cf).treegrid("autoSizeColumn"); -_97c(_9cf,_9d0); -opts.onCollapse.call(_9cf,row); -} -}; -function _9d1(_9d2,_9d3){ -var opts=$.data(_9d2,"treegrid").options; -var tr=opts.finder.getTr(_9d2,_9d3); -var hit=tr.find("span.tree-hit"); -var row=find(_9d2,_9d3); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -return; -} -if(opts.onBeforeExpand.call(_9d2,row)==false){ -return; -} -hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); -hit.next().addClass("tree-folder-open"); -var _9d4=tr.next("tr.treegrid-tr-tree"); -if(_9d4.length){ -var cc=_9d4.children("td").children("div"); -_9d5(cc); -}else{ -_9a3(_9d2,row[opts.idField]); -var _9d4=tr.next("tr.treegrid-tr-tree"); -var cc=_9d4.children("td").children("div"); -cc.hide(); -var _9d6=$.extend({},opts.queryParams||{}); -_9d6.id=row[opts.idField]; -_97b(_9d2,row[opts.idField],_9d6,true,function(){ -if(cc.is(":empty")){ -_9d4.remove(); -}else{ -_9d5(cc); -} -}); -} -function _9d5(cc){ -row.state="open"; -if(opts.animate){ -cc.slideDown("normal",function(){ -$(_9d2).treegrid("autoSizeColumn"); -_97c(_9d2,_9d3); -opts.onExpand.call(_9d2,row); -}); -}else{ -cc.show(); -$(_9d2).treegrid("autoSizeColumn"); -_97c(_9d2,_9d3); -opts.onExpand.call(_9d2,row); -} -}; -}; -function _98c(_9d7,_9d8){ -var opts=$.data(_9d7,"treegrid").options; -var tr=opts.finder.getTr(_9d7,_9d8); -var hit=tr.find("span.tree-hit"); -if(hit.hasClass("tree-expanded")){ -_9ce(_9d7,_9d8); -}else{ -_9d1(_9d7,_9d8); -} -}; -function _9d9(_9da,_9db){ -var opts=$.data(_9da,"treegrid").options; -var _9dc=_980(_9da,_9db); -if(_9db){ -_9dc.unshift(find(_9da,_9db)); -} -for(var i=0;i<_9dc.length;i++){ -_9ce(_9da,_9dc[i][opts.idField]); -} -}; -function _9dd(_9de,_9df){ -var opts=$.data(_9de,"treegrid").options; -var _9e0=_980(_9de,_9df); -if(_9df){ -_9e0.unshift(find(_9de,_9df)); -} -for(var i=0;i<_9e0.length;i++){ -_9d1(_9de,_9e0[i][opts.idField]); -} -}; -function _9e1(_9e2,_9e3){ -var opts=$.data(_9e2,"treegrid").options; -var ids=[]; -var p=_99e(_9e2,_9e3); -while(p){ -var id=p[opts.idField]; -ids.unshift(id); -p=_99e(_9e2,id); -} -for(var i=0;i").insertBefore(_9e8); -if(hit.prev().length){ -hit.prev().remove(); -} -} -} -_9aa(_9e5,_9e6.parent,_9e6.data,_9e7.data.length>0,true); -}; -function _9e9(_9ea,_9eb){ -var ref=_9eb.before||_9eb.after; -var opts=$.data(_9ea,"treegrid").options; -var _9ec=_99e(_9ea,ref); -_9e4(_9ea,{parent:(_9ec?_9ec[opts.idField]:null),data:[_9eb.data]}); -var _9ed=_9ec?_9ec.children:$(_9ea).treegrid("getRoots"); -for(var i=0;i<_9ed.length;i++){ -if(_9ed[i][opts.idField]==ref){ -var _9ee=_9ed[_9ed.length-1]; -_9ed.splice(_9eb.before?i:(i+1),0,_9ee); -_9ed.splice(_9ed.length-1,1); -break; -} -} -_9ef(true); -_9ef(false); -_984(_9ea); -$(_9ea).treegrid("showLines"); -function _9ef(_9f0){ -var _9f1=_9f0?1:2; -var tr=opts.finder.getTr(_9ea,_9eb.data[opts.idField],"body",_9f1); -var _9f2=tr.closest("table.datagrid-btable"); -tr=tr.parent().children(); -var dest=opts.finder.getTr(_9ea,ref,"body",_9f1); -if(_9eb.before){ -tr.insertBefore(dest); -}else{ -var sub=dest.next("tr.treegrid-tr-tree"); -tr.insertAfter(sub.length?sub:dest); -} -_9f2.remove(); -}; -}; -function _9f3(_9f4,_9f5){ -var _9f6=$.data(_9f4,"treegrid"); -var opts=_9f6.options; -var prow=_99e(_9f4,_9f5); -$(_9f4).datagrid("deleteRow",_9f5); -$.easyui.removeArrayItem(_9f6.checkedRows,opts.idField,_9f5); -_984(_9f4); -if(prow){ -_9a0(_9f4,prow[opts.idField]); -} -_9f6.total-=1; -$(_9f4).datagrid("getPager").pagination("refresh",{total:_9f6.total}); -$(_9f4).treegrid("showLines"); -}; -function _9f7(_9f8){ -var t=$(_9f8); -var opts=t.treegrid("options"); -if(opts.lines){ -t.treegrid("getPanel").addClass("tree-lines"); -}else{ -t.treegrid("getPanel").removeClass("tree-lines"); -return; -} -t.treegrid("getPanel").find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); -t.treegrid("getPanel").find("div.datagrid-cell").removeClass("tree-node-last tree-root-first tree-root-one"); -var _9f9=t.treegrid("getRoots"); -if(_9f9.length>1){ -_9fa(_9f9[0]).addClass("tree-root-first"); -}else{ -if(_9f9.length==1){ -_9fa(_9f9[0]).addClass("tree-root-one"); -} -} -_9fb(_9f9); -_9fc(_9f9); -function _9fb(_9fd){ -$.map(_9fd,function(node){ -if(node.children&&node.children.length){ -_9fb(node.children); -}else{ -var cell=_9fa(node); -cell.find(".tree-icon").prev().addClass("tree-join"); -} -}); -if(_9fd.length){ -var cell=_9fa(_9fd[_9fd.length-1]); -cell.addClass("tree-node-last"); -cell.find(".tree-join").removeClass("tree-join").addClass("tree-joinbottom"); -} -}; -function _9fc(_9fe){ -$.map(_9fe,function(node){ -if(node.children&&node.children.length){ -_9fc(node.children); -} -}); -for(var i=0;i<_9fe.length-1;i++){ -var node=_9fe[i]; -var _9ff=t.treegrid("getLevel",node[opts.idField]); -var tr=opts.finder.getTr(_9f8,node[opts.idField]); -var cc=tr.next().find("tr.datagrid-row td[field=\""+opts.treeField+"\"] div.datagrid-cell"); -cc.find("span:eq("+(_9ff-1)+")").addClass("tree-line"); -} -}; -function _9fa(node){ -var tr=opts.finder.getTr(_9f8,node[opts.idField]); -var cell=tr.find("td[field=\""+opts.treeField+"\"] div.datagrid-cell"); -return cell; -}; -}; -$.fn.treegrid=function(_a00,_a01){ -if(typeof _a00=="string"){ -var _a02=$.fn.treegrid.methods[_a00]; -if(_a02){ -return _a02(this,_a01); -}else{ -return this.datagrid(_a00,_a01); -} -} -_a00=_a00||{}; -return this.each(function(){ -var _a03=$.data(this,"treegrid"); -if(_a03){ -$.extend(_a03.options,_a00); -}else{ -_a03=$.data(this,"treegrid",{options:$.extend({},$.fn.treegrid.defaults,$.fn.treegrid.parseOptions(this),_a00),data:[],checkedRows:[],tmpIds:[]}); -} -_96b(this); -if(_a03.options.data){ -$(this).treegrid("loadData",_a03.options.data); -} -_97b(this); -}); -}; -$.fn.treegrid.methods={options:function(jq){ -return $.data(jq[0],"treegrid").options; -},resize:function(jq,_a04){ -return jq.each(function(){ -$(this).datagrid("resize",_a04); -}); -},fixRowHeight:function(jq,_a05){ -return jq.each(function(){ -_97c(this,_a05); -}); -},loadData:function(jq,data){ -return jq.each(function(){ -_9aa(this,data.parent,data); -}); -},load:function(jq,_a06){ -return jq.each(function(){ -$(this).treegrid("options").pageNumber=1; -$(this).treegrid("getPager").pagination({pageNumber:1}); -$(this).treegrid("reload",_a06); -}); -},reload:function(jq,id){ -return jq.each(function(){ -var opts=$(this).treegrid("options"); -var _a07={}; -if(typeof id=="object"){ -_a07=id; -}else{ -_a07=$.extend({},opts.queryParams); -_a07.id=id; -} -if(_a07.id){ -var node=$(this).treegrid("find",_a07.id); -if(node.children){ -node.children.splice(0,node.children.length); -} -opts.queryParams=_a07; -var tr=opts.finder.getTr(this,_a07.id); -tr.next("tr.treegrid-tr-tree").remove(); -tr.find("span.tree-hit").removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -_9d1(this,_a07.id); -}else{ -_97b(this,null,_a07); -} -}); -},reloadFooter:function(jq,_a08){ -return jq.each(function(){ -var opts=$.data(this,"treegrid").options; -var dc=$.data(this,"datagrid").dc; -if(_a08){ -$.data(this,"treegrid").footer=_a08; -} -if(opts.showFooter){ -opts.view.renderFooter.call(opts.view,this,dc.footer1,true); -opts.view.renderFooter.call(opts.view,this,dc.footer2,false); -if(opts.view.onAfterRender){ -opts.view.onAfterRender.call(opts.view,this); -} -$(this).treegrid("fixRowHeight"); -} -}); -},getData:function(jq){ -return $.data(jq[0],"treegrid").data; -},getFooterRows:function(jq){ -return $.data(jq[0],"treegrid").footer; -},getRoot:function(jq){ -return _9bc(jq[0]); -},getRoots:function(jq){ -return _9bf(jq[0]); -},getParent:function(jq,id){ -return _99e(jq[0],id); -},getChildren:function(jq,id){ -return _980(jq[0],id); -},getLevel:function(jq,id){ -return _9c7(jq[0],id); -},find:function(jq,id){ -return find(jq[0],id); -},isLeaf:function(jq,id){ -var opts=$.data(jq[0],"treegrid").options; -var tr=opts.finder.getTr(jq[0],id); -var hit=tr.find("span.tree-hit"); -return hit.length==0; -},select:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("selectRow",id); -}); -},unselect:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("unselectRow",id); -}); -},collapse:function(jq,id){ -return jq.each(function(){ -_9ce(this,id); -}); -},expand:function(jq,id){ -return jq.each(function(){ -_9d1(this,id); -}); -},toggle:function(jq,id){ -return jq.each(function(){ -_98c(this,id); -}); -},collapseAll:function(jq,id){ -return jq.each(function(){ -_9d9(this,id); -}); -},expandAll:function(jq,id){ -return jq.each(function(){ -_9dd(this,id); -}); -},expandTo:function(jq,id){ -return jq.each(function(){ -_9e1(this,id); -}); -},append:function(jq,_a09){ -return jq.each(function(){ -_9e4(this,_a09); -}); -},insert:function(jq,_a0a){ -return jq.each(function(){ -_9e9(this,_a0a); -}); -},remove:function(jq,id){ -return jq.each(function(){ -_9f3(this,id); -}); -},pop:function(jq,id){ -var row=jq.treegrid("find",id); -jq.treegrid("remove",id); -return row; -},refresh:function(jq,id){ -return jq.each(function(){ -var opts=$.data(this,"treegrid").options; -opts.view.refreshRow.call(opts.view,this,id); -}); -},update:function(jq,_a0b){ -return jq.each(function(){ -var opts=$.data(this,"treegrid").options; -var row=_a0b.row; -opts.view.updateRow.call(opts.view,this,_a0b.id,row); -if(row.checked!=undefined){ -row=find(this,_a0b.id); -$.extend(row,{checkState:row.checked?"checked":(row.checked===false?"unchecked":undefined)}); -_9a0(this,_a0b.id); -} -}); -},beginEdit:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("beginEdit",id); -$(this).treegrid("fixRowHeight",id); -}); -},endEdit:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("endEdit",id); -}); -},cancelEdit:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("cancelEdit",id); -}); -},showLines:function(jq){ -return jq.each(function(){ -_9f7(this); -}); -},setSelectionState:function(jq){ -return jq.each(function(){ -$(this).datagrid("setSelectionState"); -var _a0c=$(this).data("treegrid"); -for(var i=0;i<_a0c.tmpIds.length;i++){ -_98d(this,_a0c.tmpIds[i],true,true); -} -_a0c.tmpIds=[]; -}); -},getCheckedNodes:function(jq,_a0d){ -_a0d=_a0d||"checked"; -var rows=[]; -$.easyui.forEach(jq.data("treegrid").checkedRows,false,function(row){ -if(row.checkState==_a0d){ -rows.push(row); -} -}); -return rows; -},checkNode:function(jq,id){ -return jq.each(function(){ -_98d(this,id,true); -}); -},uncheckNode:function(jq,id){ -return jq.each(function(){ -_98d(this,id,false); -}); -},clearChecked:function(jq){ -return jq.each(function(){ -var _a0e=this; -var opts=$(_a0e).treegrid("options"); -$(_a0e).datagrid("clearChecked"); -$.map($(_a0e).treegrid("getCheckedNodes"),function(row){ -_98d(_a0e,row[opts.idField],false,true); -}); -}); -}}; -$.fn.treegrid.parseOptions=function(_a0f){ -return $.extend({},$.fn.datagrid.parseOptions(_a0f),$.parser.parseOptions(_a0f,["treeField",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean"}])); -}; -var _a10=$.extend({},$.fn.datagrid.defaults.view,{render:function(_a11,_a12,_a13){ -var opts=$.data(_a11,"treegrid").options; -var _a14=$(_a11).datagrid("getColumnFields",_a13); -var _a15=$.data(_a11,"datagrid").rowIdPrefix; -if(_a13){ -if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){ -return; -} -} -var view=this; -if(this.treeNodes&&this.treeNodes.length){ -var _a16=_a17.call(this,_a13,this.treeLevel,this.treeNodes); -$(_a12).append(_a16.join("")); -} -function _a17(_a18,_a19,_a1a){ -var _a1b=$(_a11).treegrid("getParent",_a1a[0][opts.idField]); -var _a1c=(_a1b?_a1b.children.length:$(_a11).treegrid("getRoots").length)-_a1a.length; -var _a1d=[""]; -for(var i=0;i<_a1a.length;i++){ -var row=_a1a[i]; -if(row.state!="open"&&row.state!="closed"){ -row.state="open"; -} -var css=opts.rowStyler?opts.rowStyler.call(_a11,row):""; -var cs=this.getStyleValue(css); -var cls="class=\"datagrid-row "+(_a1c++%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c+"\""; -var _a1e=cs.s?"style=\""+cs.s+"\"":""; -var _a1f=_a15+"-"+(_a18?1:2)+"-"+row[opts.idField]; -_a1d.push(""); -_a1d=_a1d.concat(view.renderRow.call(view,_a11,_a14,_a18,_a19,row)); -_a1d.push(""); -if(row.children&&row.children.length){ -var tt=_a17.call(this,_a18,_a19+1,row.children); -var v=row.state=="closed"?"none":"block"; -_a1d.push(""); -} -} -_a1d.push("
                                                                                                                                                        "); -_a1d=_a1d.concat(tt); -_a1d.push("
                                                                                                                                                        "); -return _a1d; -}; -},renderFooter:function(_a20,_a21,_a22){ -var opts=$.data(_a20,"treegrid").options; -var rows=$.data(_a20,"treegrid").footer||[]; -var _a23=$(_a20).datagrid("getColumnFields",_a22); -var _a24=[""]; -for(var i=0;i"); -_a24.push(this.renderRow.call(this,_a20,_a23,_a22,0,row)); -_a24.push(""); -} -_a24.push("
                                                                                                                                                        "); -$(_a21).html(_a24.join("")); -},renderRow:function(_a25,_a26,_a27,_a28,row){ -var _a29=$.data(_a25,"treegrid"); -var opts=_a29.options; -var cc=[]; -if(_a27&&opts.rownumbers){ -cc.push("
                                                                                                                                                        0
                                                                                                                                                        "); -} -for(var i=0;i<_a26.length;i++){ -var _a2a=_a26[i]; -var col=$(_a25).datagrid("getColumnOption",_a2a); -if(col){ -var css=col.styler?(col.styler(row[_a2a],row)||""):""; -var cs=this.getStyleValue(css); -var cls=cs.c?"class=\""+cs.c+"\"":""; -var _a2b=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); -cc.push(""); -var _a2b=""; -if(!col.checkbox){ -if(col.align){ -_a2b+="text-align:"+col.align+";"; -} -if(!opts.nowrap){ -_a2b+="white-space:normal;height:auto;"; -}else{ -if(opts.autoRowHeight){ -_a2b+="height:auto;"; -} -} -} -cc.push("
                                                                                                                                                        "); -if(col.checkbox){ -if(row.checked){ -cc.push(""); -}else{ -var val=null; -if(col.formatter){ -val=col.formatter(row[_a2a],row); -}else{ -val=row[_a2a]; -} -if(_a2a==opts.treeField){ -for(var j=0;j<_a28;j++){ -cc.push(""); -} -if(row.state=="closed"){ -cc.push(""); -cc.push(""); -}else{ -if(row.children&&row.children.length){ -cc.push(""); -cc.push(""); -}else{ -cc.push(""); -cc.push(""); -} -} -if(this.hasCheckbox(_a25,row)){ -var flag=0; -var crow=$.easyui.getArrayItem(_a29.checkedRows,opts.idField,row[opts.idField]); -if(crow){ -flag=crow.checkState=="checked"?1:2; -row.checkState=crow.checkState; -row.checked=crow.checked; -$.easyui.addArrayItem(_a29.checkedRows,opts.idField,row); -}else{ -var prow=$.easyui.getArrayItem(_a29.checkedRows,opts.idField,row._parentId); -if(prow&&prow.checkState=="checked"&&opts.cascadeCheck){ -flag=1; -row.checked=true; -$.easyui.addArrayItem(_a29.checkedRows,opts.idField,row); -}else{ -if(row.checked){ -$.easyui.addArrayItem(_a29.tmpIds,row[opts.idField]); -} -} -row.checkState=flag?"checked":"unchecked"; -} -cc.push(""); -}else{ -row.checkState=undefined; -row.checked=undefined; -} -cc.push(""+val+""); -}else{ -cc.push(val); -} -} -cc.push("
                                                                                                                                                        "); -cc.push(""); -} -} -return cc.join(""); -},hasCheckbox:function(_a2c,row){ -var opts=$.data(_a2c,"treegrid").options; -if(opts.checkbox){ -if($.isFunction(opts.checkbox)){ -if(opts.checkbox.call(_a2c,row)){ -return true; -}else{ -return false; -} -}else{ -if(opts.onlyLeafCheck){ -if(row.state=="open"&&!(row.children&&row.children.length)){ -return true; -} -}else{ -return true; -} -} -} -return false; -},refreshRow:function(_a2d,id){ -this.updateRow.call(this,_a2d,id,{}); -},updateRow:function(_a2e,id,row){ -var opts=$.data(_a2e,"treegrid").options; -var _a2f=$(_a2e).treegrid("find",id); -$.extend(_a2f,row); -var _a30=$(_a2e).treegrid("getLevel",id)-1; -var _a31=opts.rowStyler?opts.rowStyler.call(_a2e,_a2f):""; -var _a32=$.data(_a2e,"datagrid").rowIdPrefix; -var _a33=_a2f[opts.idField]; -function _a34(_a35){ -var _a36=$(_a2e).treegrid("getColumnFields",_a35); -var tr=opts.finder.getTr(_a2e,id,"body",(_a35?1:2)); -var _a37=tr.find("div.datagrid-cell-rownumber").html(); -var _a38=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); -tr.html(this.renderRow(_a2e,_a36,_a35,_a30,_a2f)); -tr.attr("style",_a31||""); -tr.find("div.datagrid-cell-rownumber").html(_a37); -if(_a38){ -tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); -} -if(_a33!=id){ -tr.attr("id",_a32+"-"+(_a35?1:2)+"-"+_a33); -tr.attr("node-id",_a33); -} -}; -_a34.call(this,true); -_a34.call(this,false); -$(_a2e).treegrid("fixRowHeight",id); -},deleteRow:function(_a39,id){ -var opts=$.data(_a39,"treegrid").options; -var tr=opts.finder.getTr(_a39,id); -tr.next("tr.treegrid-tr-tree").remove(); -tr.remove(); -var _a3a=del(id); -if(_a3a){ -if(_a3a.children.length==0){ -tr=opts.finder.getTr(_a39,_a3a[opts.idField]); -tr.next("tr.treegrid-tr-tree").remove(); -var cell=tr.children("td[field=\""+opts.treeField+"\"]").children("div.datagrid-cell"); -cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); -cell.find(".tree-hit").remove(); -$("").prependTo(cell); -} -} -this.setEmptyMsg(_a39); -function del(id){ -var cc; -var _a3b=$(_a39).treegrid("getParent",id); -if(_a3b){ -cc=_a3b.children; -}else{ -cc=$(_a39).treegrid("getData"); -} -for(var i=0;ib?1:-1); -}; -r=_a46(r1[sn],r2[sn])*(so=="asc"?1:-1); -if(r!=0){ -return r; -} -} -return r; -}); -for(var i=0;i"); -if(!_a69){ -_a6c.push(""); -_a6c.push(opts.groupFormatter.call(_a66,_a68.value,_a68.rows)); -_a6c.push(""); -} -_a6c.push("
                                                                                                                                                        "); -_a6c.push(this.renderTable(_a66,_a68.startIndex,_a68.rows,_a69)); -return _a6c.join(""); -},groupRows:function(_a6d,rows){ -var _a6e=$.data(_a6d,"datagrid"); -var opts=_a6e.options; -var _a6f=[]; -for(var i=0;idiv.combo-p>div.combo-panel:visible").panel("close"); -}); -}); -function _a7f(_a80){ -var _a81=$.data(_a80,"combo"); -var opts=_a81.options; -if(!_a81.panel){ -_a81.panel=$("
                                                                                                                                                        ").appendTo("body"); -_a81.panel.panel({minWidth:opts.panelMinWidth,maxWidth:opts.panelMaxWidth,minHeight:opts.panelMinHeight,maxHeight:opts.panelMaxHeight,doSize:false,closed:true,cls:"combo-p",style:{position:"absolute",zIndex:10},onOpen:function(){ -var _a82=$(this).panel("options").comboTarget; -var _a83=$.data(_a82,"combo"); -if(_a83){ -_a83.options.onShowPanel.call(_a82); -} -},onBeforeClose:function(){ -_a7e($(this).parent()); -},onClose:function(){ -var _a84=$(this).panel("options").comboTarget; -var _a85=$(_a84).data("combo"); -if(_a85){ -_a85.options.onHidePanel.call(_a84); -} -}}); -} -var _a86=$.extend(true,[],opts.icons); -if(opts.hasDownArrow){ -_a86.push({iconCls:"combo-arrow",handler:function(e){ -_a8b(e.data.target); -}}); -} -$(_a80).addClass("combo-f").textbox($.extend({},opts,{icons:_a86,onChange:function(){ -}})); -$(_a80).attr("comboName",$(_a80).attr("textboxName")); -_a81.combo=$(_a80).next(); -_a81.combo.addClass("combo"); -_a81.panel.unbind(".combo"); -for(var _a87 in opts.panelEvents){ -_a81.panel.bind(_a87+".combo",{target:_a80},opts.panelEvents[_a87]); -} -}; -function _a88(_a89){ -var _a8a=$.data(_a89,"combo"); -var opts=_a8a.options; -var p=_a8a.panel; -if(p.is(":visible")){ -p.panel("close"); -} -if(!opts.cloned){ -p.panel("destroy"); -} -$(_a89).textbox("destroy"); -}; -function _a8b(_a8c){ -var _a8d=$.data(_a8c,"combo").panel; -if(_a8d.is(":visible")){ -var _a8e=_a8d.combo("combo"); -_a8f(_a8e); -if(_a8e!=_a8c){ -$(_a8c).combo("showPanel"); -} -}else{ -var p=$(_a8c).closest("div.combo-p").children(".combo-panel"); -$("div.combo-panel:visible").not(_a8d).not(p).panel("close"); -$(_a8c).combo("showPanel"); -} -$(_a8c).combo("textbox").focus(); -}; -function _a7e(_a90){ -$(_a90).find(".combo-f").each(function(){ -var p=$(this).combo("panel"); -if(p.is(":visible")){ -p.panel("close"); -} -}); -}; -function _a91(e){ -var _a92=e.data.target; -var _a93=$.data(_a92,"combo"); -var opts=_a93.options; -if(!opts.editable){ -_a8b(_a92); -}else{ -var p=$(_a92).closest("div.combo-p").children(".combo-panel"); -$("div.combo-panel:visible").not(p).each(function(){ -var _a94=$(this).combo("combo"); -if(_a94!=_a92){ -_a8f(_a94); -} -}); -} -}; -function _a95(e){ -var _a96=e.data.target; -var t=$(_a96); -var _a97=t.data("combo"); -var opts=t.combo("options"); -_a97.panel.panel("options").comboTarget=_a96; -switch(e.keyCode){ -case 38: -opts.keyHandler.up.call(_a96,e); -break; -case 40: -opts.keyHandler.down.call(_a96,e); -break; -case 37: -opts.keyHandler.left.call(_a96,e); -break; -case 39: -opts.keyHandler.right.call(_a96,e); -break; -case 13: -e.preventDefault(); -opts.keyHandler.enter.call(_a96,e); -return false; -case 9: -case 27: -_a8f(_a96); -break; -default: -if(opts.editable){ -if(_a97.timer){ -clearTimeout(_a97.timer); -} -_a97.timer=setTimeout(function(){ -var q=t.combo("getText"); -if(_a97.previousText!=q){ -_a97.previousText=q; -t.combo("showPanel"); -opts.keyHandler.query.call(_a96,q,e); -t.combo("validate"); -} -},opts.delay); -} -} -}; -function _a98(e){ -var _a99=e.data.target; -var _a9a=$(_a99).data("combo"); -if(_a9a.timer){ -clearTimeout(_a9a.timer); -} -}; -function _a9b(_a9c){ -var _a9d=$.data(_a9c,"combo"); -var _a9e=_a9d.combo; -var _a9f=_a9d.panel; -var opts=$(_a9c).combo("options"); -var _aa0=_a9f.panel("options"); -_aa0.comboTarget=_a9c; -if(_aa0.closed){ -_a9f.panel("panel").show().css({zIndex:($.fn.menu?$.fn.menu.defaults.zIndex++:($.fn.window?$.fn.window.defaults.zIndex++:99)),left:-999999}); -_a9f.panel("resize",{width:(opts.panelWidth?opts.panelWidth:_a9e._outerWidth()),height:opts.panelHeight}); -_a9f.panel("panel").hide(); -_a9f.panel("open"); -} -(function(){ -if(_aa0.comboTarget==_a9c&&_a9f.is(":visible")){ -_a9f.panel("move",{left:_aa1(),top:_aa2()}); -setTimeout(arguments.callee,200); -} -})(); -function _aa1(){ -var left=_a9e.offset().left; -if(opts.panelAlign=="right"){ -left+=_a9e._outerWidth()-_a9f._outerWidth(); -} -if(left+_a9f._outerWidth()>$(window)._outerWidth()+$(document).scrollLeft()){ -left=$(window)._outerWidth()+$(document).scrollLeft()-_a9f._outerWidth(); -} -if(left<0){ -left=0; -} -return left; -}; -function _aa2(){ -var top=_a9e.offset().top+_a9e._outerHeight(); -if(top+_a9f._outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ -top=_a9e.offset().top-_a9f._outerHeight(); -} -if(top<$(document).scrollTop()){ -top=_a9e.offset().top+_a9e._outerHeight(); -} -return top; -}; -}; -function _a8f(_aa3){ -var _aa4=$.data(_aa3,"combo").panel; -_aa4.panel("close"); -}; -function _aa5(_aa6,text){ -var _aa7=$.data(_aa6,"combo"); -var _aa8=$(_aa6).textbox("getText"); -if(_aa8!=text){ -$(_aa6).textbox("setText",text); -} -_aa7.previousText=text; -}; -function _aa9(_aaa){ -var _aab=$.data(_aaa,"combo"); -var opts=_aab.options; -var _aac=$(_aaa).next(); -var _aad=[]; -_aac.find(".textbox-value").each(function(){ -_aad.push($(this).val()); -}); -if(opts.multivalue){ -return _aad; -}else{ -return _aad.length?_aad[0].split(opts.separator):_aad; -} -}; -function _aae(_aaf,_ab0){ -var _ab1=$.data(_aaf,"combo"); -var _ab2=_ab1.combo; -var opts=$(_aaf).combo("options"); -if(!$.isArray(_ab0)){ -_ab0=_ab0.split(opts.separator); -} -var _ab3=_aa9(_aaf); -_ab2.find(".textbox-value").remove(); -if(_ab0.length){ -if(opts.multivalue){ -for(var i=0;i<_ab0.length;i++){ -_ab4(_ab0[i]); -} -}else{ -_ab4(_ab0.join(opts.separator)); -} -} -function _ab4(_ab5){ -var name=$(_aaf).attr("textboxName")||""; -var _ab6=$("").appendTo(_ab2); -_ab6.attr("name",name); -if(opts.disabled){ -_ab6.attr("disabled","disabled"); -} -_ab6.val(_ab5); -}; -var _ab7=(function(){ -if(_ab3.length!=_ab0.length){ -return true; -} -for(var i=0;i<_ab0.length;i++){ -if(_ab0[i]!=_ab3[i]){ -return true; -} -} -return false; -})(); -if(_ab7){ -$(_aaf).val(_ab0.join(opts.separator)); -if(opts.multiple){ -opts.onChange.call(_aaf,_ab0,_ab3); -}else{ -opts.onChange.call(_aaf,_ab0[0],_ab3[0]); -} -$(_aaf).closest("form").trigger("_change",[_aaf]); -} -}; -function _ab8(_ab9){ -var _aba=_aa9(_ab9); -return _aba[0]; -}; -function _abb(_abc,_abd){ -_aae(_abc,[_abd]); -}; -function _abe(_abf){ -var opts=$.data(_abf,"combo").options; -var _ac0=opts.onChange; -opts.onChange=function(){ -}; -if(opts.multiple){ -_aae(_abf,opts.value?opts.value:[]); -}else{ -_abb(_abf,opts.value); -} -opts.onChange=_ac0; -}; -$.fn.combo=function(_ac1,_ac2){ -if(typeof _ac1=="string"){ -var _ac3=$.fn.combo.methods[_ac1]; -if(_ac3){ -return _ac3(this,_ac2); -}else{ -return this.textbox(_ac1,_ac2); -} -} -_ac1=_ac1||{}; -return this.each(function(){ -var _ac4=$.data(this,"combo"); -if(_ac4){ -$.extend(_ac4.options,_ac1); -if(_ac1.value!=undefined){ -_ac4.options.originalValue=_ac1.value; -} -}else{ -_ac4=$.data(this,"combo",{options:$.extend({},$.fn.combo.defaults,$.fn.combo.parseOptions(this),_ac1),previousText:""}); -if(_ac4.options.multiple&&_ac4.options.value==""){ -_ac4.options.originalValue=[]; -}else{ -_ac4.options.originalValue=_ac4.options.value; -} -} -_a7f(this); -_abe(this); -}); -}; -$.fn.combo.methods={options:function(jq){ -var opts=jq.textbox("options"); -return $.extend($.data(jq[0],"combo").options,{width:opts.width,height:opts.height,disabled:opts.disabled,readonly:opts.readonly}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).textbox("cloneFrom",from); -$.data(this,"combo",{options:$.extend(true,{cloned:true},$(from).combo("options")),combo:$(this).next(),panel:$(from).combo("panel")}); -$(this).addClass("combo-f").attr("comboName",$(this).attr("textboxName")); -}); -},combo:function(jq){ -return jq.closest(".combo-panel").panel("options").comboTarget; -},panel:function(jq){ -return $.data(jq[0],"combo").panel; -},destroy:function(jq){ -return jq.each(function(){ -_a88(this); -}); -},showPanel:function(jq){ -return jq.each(function(){ -_a9b(this); -}); -},hidePanel:function(jq){ -return jq.each(function(){ -_a8f(this); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).textbox("setText",""); -var opts=$.data(this,"combo").options; -if(opts.multiple){ -$(this).combo("setValues",[]); -}else{ -$(this).combo("setValue",""); -} -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$.data(this,"combo").options; -if(opts.multiple){ -$(this).combo("setValues",opts.originalValue); -}else{ -$(this).combo("setValue",opts.originalValue); -} -}); -},setText:function(jq,text){ -return jq.each(function(){ -_aa5(this,text); -}); -},getValues:function(jq){ -return _aa9(jq[0]); -},setValues:function(jq,_ac5){ -return jq.each(function(){ -_aae(this,_ac5); -}); -},getValue:function(jq){ -return _ab8(jq[0]); -},setValue:function(jq,_ac6){ -return jq.each(function(){ -_abb(this,_ac6); -}); -}}; -$.fn.combo.parseOptions=function(_ac7){ -var t=$(_ac7); -return $.extend({},$.fn.textbox.parseOptions(_ac7),$.parser.parseOptions(_ac7,["separator","panelAlign",{panelWidth:"number",hasDownArrow:"boolean",delay:"number",reversed:"boolean",multivalue:"boolean",selectOnNavigation:"boolean"},{panelMinWidth:"number",panelMaxWidth:"number",panelMinHeight:"number",panelMaxHeight:"number"}]),{panelHeight:(t.attr("panelHeight")=="auto"?"auto":parseInt(t.attr("panelHeight"))||undefined),multiple:(t.attr("multiple")?true:undefined)}); -}; -$.fn.combo.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{click:_a91,keydown:_a95,paste:_a95,drop:_a95,blur:_a98},panelEvents:{mousedown:function(e){ -e.preventDefault(); -e.stopPropagation(); -}},panelWidth:null,panelHeight:300,panelMinWidth:null,panelMaxWidth:null,panelMinHeight:null,panelMaxHeight:null,panelAlign:"left",reversed:false,multiple:false,multivalue:true,selectOnNavigation:true,separator:",",hasDownArrow:true,delay:200,keyHandler:{up:function(e){ -},down:function(e){ -},left:function(e){ -},right:function(e){ -},enter:function(e){ -},query:function(q,e){ -}},onShowPanel:function(){ -},onHidePanel:function(){ -},onChange:function(_ac8,_ac9){ -}}); -})(jQuery); -(function($){ -function _aca(_acb,_acc){ -var _acd=$.data(_acb,"combobox"); -return $.easyui.indexOfArray(_acd.data,_acd.options.valueField,_acc); -}; -function _ace(_acf,_ad0){ -var opts=$.data(_acf,"combobox").options; -var _ad1=$(_acf).combo("panel"); -var item=opts.finder.getEl(_acf,_ad0); -if(item.length){ -if(item.position().top<=0){ -var h=_ad1.scrollTop()+item.position().top; -_ad1.scrollTop(h); -}else{ -if(item.position().top+item.outerHeight()>_ad1.height()){ -var h=_ad1.scrollTop()+item.position().top+item.outerHeight()-_ad1.height(); -_ad1.scrollTop(h); -} -} -} -_ad1.triggerHandler("scroll"); -}; -function nav(_ad2,dir){ -var opts=$.data(_ad2,"combobox").options; -var _ad3=$(_ad2).combobox("panel"); -var item=_ad3.children("div.combobox-item-hover"); -if(!item.length){ -item=_ad3.children("div.combobox-item-selected"); -} -item.removeClass("combobox-item-hover"); -var _ad4="div.combobox-item:visible:not(.combobox-item-disabled):first"; -var _ad5="div.combobox-item:visible:not(.combobox-item-disabled):last"; -if(!item.length){ -item=_ad3.children(dir=="next"?_ad4:_ad5); -}else{ -if(dir=="next"){ -item=item.nextAll(_ad4); -if(!item.length){ -item=_ad3.children(_ad4); -} -}else{ -item=item.prevAll(_ad4); -if(!item.length){ -item=_ad3.children(_ad5); -} -} -} -if(item.length){ -item.addClass("combobox-item-hover"); -var row=opts.finder.getRow(_ad2,item); -if(row){ -$(_ad2).combobox("scrollTo",row[opts.valueField]); -if(opts.selectOnNavigation){ -_ad6(_ad2,row[opts.valueField]); -} -} -} -}; -function _ad6(_ad7,_ad8,_ad9){ -var opts=$.data(_ad7,"combobox").options; -var _ada=$(_ad7).combo("getValues"); -if($.inArray(_ad8+"",_ada)==-1){ -if(opts.multiple){ -_ada.push(_ad8); -}else{ -_ada=[_ad8]; -} -_adb(_ad7,_ada,_ad9); -} -}; -function _adc(_add,_ade){ -var opts=$.data(_add,"combobox").options; -var _adf=$(_add).combo("getValues"); -var _ae0=$.inArray(_ade+"",_adf); -if(_ae0>=0){ -_adf.splice(_ae0,1); -_adb(_add,_adf); -} -}; -function _adb(_ae1,_ae2,_ae3){ -var opts=$.data(_ae1,"combobox").options; -var _ae4=$(_ae1).combo("panel"); -if(!$.isArray(_ae2)){ -_ae2=_ae2.split(opts.separator); -} -if(!opts.multiple){ -_ae2=_ae2.length?[_ae2[0]]:[""]; -} -var _ae5=$(_ae1).combo("getValues"); -if(_ae4.is(":visible")){ -_ae4.find(".combobox-item-selected").each(function(){ -var row=opts.finder.getRow(_ae1,$(this)); -if(row){ -if($.easyui.indexOfArray(_ae5,row[opts.valueField])==-1){ -$(this).removeClass("combobox-item-selected"); -} -} -}); -} -$.map(_ae5,function(v){ -if($.easyui.indexOfArray(_ae2,v)==-1){ -var el=opts.finder.getEl(_ae1,v); -if(el.hasClass("combobox-item-selected")){ -el.removeClass("combobox-item-selected"); -opts.onUnselect.call(_ae1,opts.finder.getRow(_ae1,v)); -} -} -}); -var _ae6=null; -var vv=[],ss=[]; -for(var i=0;i<_ae2.length;i++){ -var v=_ae2[i]; -var s=v; -var row=opts.finder.getRow(_ae1,v); -if(row){ -s=row[opts.textField]; -_ae6=row; -var el=opts.finder.getEl(_ae1,v); -if(!el.hasClass("combobox-item-selected")){ -el.addClass("combobox-item-selected"); -opts.onSelect.call(_ae1,row); -} -}else{ -s=_ae7(v,opts.mappingRows)||v; -} -vv.push(v); -ss.push(s); -} -if(!_ae3){ -$(_ae1).combo("setText",ss.join(opts.separator)); -} -if(opts.showItemIcon){ -var tb=$(_ae1).combobox("textbox"); -tb.removeClass("textbox-bgicon "+opts.textboxIconCls); -if(_ae6&&_ae6.iconCls){ -tb.addClass("textbox-bgicon "+_ae6.iconCls); -opts.textboxIconCls=_ae6.iconCls; -} -} -$(_ae1).combo("setValues",vv); -_ae4.triggerHandler("scroll"); -function _ae7(_ae8,a){ -var item=$.easyui.getArrayItem(a,opts.valueField,_ae8); -return item?item[opts.textField]:undefined; -}; -}; -function _ae9(_aea,data,_aeb){ -var _aec=$.data(_aea,"combobox"); -var opts=_aec.options; -_aec.data=opts.loadFilter.call(_aea,data); -opts.view.render.call(opts.view,_aea,$(_aea).combo("panel"),_aec.data); -var vv=$(_aea).combobox("getValues"); -$.easyui.forEach(_aec.data,false,function(row){ -if(row["selected"]){ -$.easyui.addArrayItem(vv,row[opts.valueField]+""); -} -}); -if(opts.multiple){ -_adb(_aea,vv,_aeb); -}else{ -_adb(_aea,vv.length?[vv[vv.length-1]]:[],_aeb); -} -opts.onLoadSuccess.call(_aea,data); -}; -function _aed(_aee,url,_aef,_af0){ -var opts=$.data(_aee,"combobox").options; -if(url){ -opts.url=url; -} -_aef=$.extend({},opts.queryParams,_aef||{}); -if(opts.onBeforeLoad.call(_aee,_aef)==false){ -return; -} -opts.loader.call(_aee,_aef,function(data){ -_ae9(_aee,data,_af0); -},function(){ -opts.onLoadError.apply(this,arguments); -}); -}; -function _af1(_af2,q){ -var _af3=$.data(_af2,"combobox"); -var opts=_af3.options; -var _af4=$(); -var qq=opts.multiple?q.split(opts.separator):[q]; -if(opts.mode=="remote"){ -_af5(qq); -_aed(_af2,null,{q:q},true); -}else{ -var _af6=$(_af2).combo("panel"); -_af6.find(".combobox-item-hover").removeClass("combobox-item-hover"); -_af6.find(".combobox-item,.combobox-group").hide(); -var data=_af3.data; -var vv=[]; -$.map(qq,function(q){ -q=$.trim(q); -var _af7=q; -var _af8=undefined; -_af4=$(); -for(var i=0;i=0){ -vv.push(v); -} -}); -t.combobox("setValues",vv); -if(!opts.multiple){ -t.combobox("hidePanel"); -} -}; -function _afd(_afe){ -var _aff=$.data(_afe,"combobox"); -var opts=_aff.options; -$(_afe).addClass("combobox-f"); -$(_afe).combo($.extend({},opts,{onShowPanel:function(){ -$(this).combo("panel").find("div.combobox-item:hidden,div.combobox-group:hidden").show(); -_adb(this,$(this).combobox("getValues"),true); -$(this).combobox("scrollTo",$(this).combobox("getValue")); -opts.onShowPanel.call(this); -}})); -}; -function _b00(e){ -$(this).children("div.combobox-item-hover").removeClass("combobox-item-hover"); -var item=$(e.target).closest("div.combobox-item"); -if(!item.hasClass("combobox-item-disabled")){ -item.addClass("combobox-item-hover"); -} -e.stopPropagation(); -}; -function _b01(e){ -$(e.target).closest("div.combobox-item").removeClass("combobox-item-hover"); -e.stopPropagation(); -}; -function _b02(e){ -var _b03=$(this).panel("options").comboTarget; -if(!_b03){ -return; -} -var opts=$(_b03).combobox("options"); -var item=$(e.target).closest("div.combobox-item"); -if(!item.length||item.hasClass("combobox-item-disabled")){ -return; -} -var row=opts.finder.getRow(_b03,item); -if(!row){ -return; -} -if(opts.blurTimer){ -clearTimeout(opts.blurTimer); -opts.blurTimer=null; -} -opts.onClick.call(_b03,row); -var _b04=row[opts.valueField]; -if(opts.multiple){ -if(item.hasClass("combobox-item-selected")){ -_adc(_b03,_b04); -}else{ -_ad6(_b03,_b04); -} -}else{ -$(_b03).combobox("setValue",_b04).combobox("hidePanel"); -} -e.stopPropagation(); -}; -function _b05(e){ -var _b06=$(this).panel("options").comboTarget; -if(!_b06){ -return; -} -var opts=$(_b06).combobox("options"); -if(opts.groupPosition=="sticky"){ -var _b07=$(this).children(".combobox-stick"); -if(!_b07.length){ -_b07=$("
                                                                                                                                                        ").appendTo(this); -} -_b07.hide(); -var _b08=$(_b06).data("combobox"); -$(this).children(".combobox-group:visible").each(function(){ -var g=$(this); -var _b09=opts.finder.getGroup(_b06,g); -var _b0a=_b08.data[_b09.startIndex+_b09.count-1]; -var last=opts.finder.getEl(_b06,_b0a[opts.valueField]); -if(g.position().top<0&&last.position().top>0){ -_b07.show().html(g.html()); -return false; -} -}); -} -}; -$.fn.combobox=function(_b0b,_b0c){ -if(typeof _b0b=="string"){ -var _b0d=$.fn.combobox.methods[_b0b]; -if(_b0d){ -return _b0d(this,_b0c); -}else{ -return this.combo(_b0b,_b0c); -} -} -_b0b=_b0b||{}; -return this.each(function(){ -var _b0e=$.data(this,"combobox"); -if(_b0e){ -$.extend(_b0e.options,_b0b); -}else{ -_b0e=$.data(this,"combobox",{options:$.extend({},$.fn.combobox.defaults,$.fn.combobox.parseOptions(this),_b0b),data:[]}); -} -_afd(this); -if(_b0e.options.data){ -_ae9(this,_b0e.options.data); -}else{ -var data=$.fn.combobox.parseData(this); -if(data.length){ -_ae9(this,data); -} -} -_aed(this); -}); -}; -$.fn.combobox.methods={options:function(jq){ -var _b0f=jq.combo("options"); -return $.extend($.data(jq[0],"combobox").options,{width:_b0f.width,height:_b0f.height,originalValue:_b0f.originalValue,disabled:_b0f.disabled,readonly:_b0f.readonly}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).combo("cloneFrom",from); -$.data(this,"combobox",$(from).data("combobox")); -$(this).addClass("combobox-f").attr("comboboxName",$(this).attr("textboxName")); -}); -},getData:function(jq){ -return $.data(jq[0],"combobox").data; -},setValues:function(jq,_b10){ -return jq.each(function(){ -var opts=$(this).combobox("options"); -if($.isArray(_b10)){ -_b10=$.map(_b10,function(_b11){ -if(_b11&&typeof _b11=="object"){ -$.easyui.addArrayItem(opts.mappingRows,opts.valueField,_b11); -return _b11[opts.valueField]; -}else{ -return _b11; -} -}); -} -_adb(this,_b10); -}); -},setValue:function(jq,_b12){ -return jq.each(function(){ -$(this).combobox("setValues",$.isArray(_b12)?_b12:[_b12]); -}); -},clear:function(jq){ -return jq.each(function(){ -_adb(this,[]); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).combobox("options"); -if(opts.multiple){ -$(this).combobox("setValues",opts.originalValue); -}else{ -$(this).combobox("setValue",opts.originalValue); -} -}); -},loadData:function(jq,data){ -return jq.each(function(){ -_ae9(this,data); -}); -},reload:function(jq,url){ -return jq.each(function(){ -if(typeof url=="string"){ -_aed(this,url); -}else{ -if(url){ -var opts=$(this).combobox("options"); -opts.queryParams=url; -} -_aed(this); -} -}); -},select:function(jq,_b13){ -return jq.each(function(){ -_ad6(this,_b13); -}); -},unselect:function(jq,_b14){ -return jq.each(function(){ -_adc(this,_b14); -}); -},scrollTo:function(jq,_b15){ -return jq.each(function(){ -_ace(this,_b15); -}); -}}; -$.fn.combobox.parseOptions=function(_b16){ -var t=$(_b16); -return $.extend({},$.fn.combo.parseOptions(_b16),$.parser.parseOptions(_b16,["valueField","textField","groupField","groupPosition","mode","method","url",{showItemIcon:"boolean",limitToList:"boolean"}])); -}; -$.fn.combobox.parseData=function(_b17){ -var data=[]; -var opts=$(_b17).combobox("options"); -$(_b17).children().each(function(){ -if(this.tagName.toLowerCase()=="optgroup"){ -var _b18=$(this).attr("label"); -$(this).children().each(function(){ -_b19(this,_b18); -}); -}else{ -_b19(this); -} -}); -return data; -function _b19(el,_b1a){ -var t=$(el); -var row={}; -row[opts.valueField]=t.attr("value")!=undefined?t.attr("value"):t.text(); -row[opts.textField]=t.text(); -row["iconCls"]=$.parser.parseOptions(el,["iconCls"]).iconCls; -row["selected"]=t.is(":selected"); -row["disabled"]=t.is(":disabled"); -if(_b1a){ -opts.groupField=opts.groupField||"group"; -row[opts.groupField]=_b1a; -} -data.push(row); -}; -}; -var _b1b=0; -var _b1c={render:function(_b1d,_b1e,data){ -var _b1f=$.data(_b1d,"combobox"); -var opts=_b1f.options; -_b1b++; -_b1f.itemIdPrefix="_easyui_combobox_i"+_b1b; -_b1f.groupIdPrefix="_easyui_combobox_g"+_b1b; -_b1f.groups=[]; -var dd=[]; -var _b20=undefined; -for(var i=0;i"); -dd.push(opts.groupFormatter?opts.groupFormatter.call(_b1d,g):g); -dd.push("
                                                                                                                                                        "); -}else{ -_b1f.groups[_b1f.groups.length-1].count++; -} -}else{ -_b20=undefined; -} -var cls="combobox-item"+(row.disabled?" combobox-item-disabled":"")+(g?" combobox-gitem":""); -dd.push("
                                                                                                                                                        "); -if(opts.showItemIcon&&row.iconCls){ -dd.push(""); -} -dd.push(opts.formatter?opts.formatter.call(_b1d,row):s); -dd.push("
                                                                                                                                                        "); -} -$(_b1e).html(dd.join("")); -}}; -$.fn.combobox.defaults=$.extend({},$.fn.combo.defaults,{valueField:"value",textField:"text",groupPosition:"static",groupField:null,groupFormatter:function(_b21){ -return _b21; -},mode:"local",method:"post",url:null,data:null,queryParams:{},showItemIcon:false,limitToList:false,unselectedValues:[],mappingRows:[],view:_b1c,keyHandler:{up:function(e){ -nav(this,"prev"); -e.preventDefault(); -},down:function(e){ -nav(this,"next"); -e.preventDefault(); -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_af9(this); -},query:function(q,e){ -_af1(this,q); -}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ -$.fn.combo.defaults.inputEvents.blur(e); -var _b22=e.data.target; -var opts=$(_b22).combobox("options"); -if(opts.reversed||opts.limitToList){ -if(opts.blurTimer){ -clearTimeout(opts.blurTimer); -} -opts.blurTimer=setTimeout(function(){ -var _b23=$(_b22).parent().length; -if(_b23){ -if(opts.reversed){ -$(_b22).combobox("setValues",$(_b22).combobox("getValues")); -}else{ -if(opts.limitToList){ -var vv=[]; -$.map($(_b22).combobox("getValues"),function(v){ -var _b24=$.easyui.indexOfArray($(_b22).combobox("getData"),opts.valueField,v); -if(_b24>=0){ -vv.push(v); -} -}); -$(_b22).combobox("setValues",vv); -} -} -opts.blurTimer=null; -} -},50); -} -}}),panelEvents:{mouseover:_b00,mouseout:_b01,mousedown:function(e){ -e.preventDefault(); -e.stopPropagation(); -},click:_b02,scroll:_b05},filter:function(q,row){ -var opts=$(this).combobox("options"); -return row[opts.textField].toLowerCase().indexOf(q.toLowerCase())>=0; -},formatter:function(row){ -var opts=$(this).combobox("options"); -return row[opts.textField]; -},loader:function(_b25,_b26,_b27){ -var opts=$(this).combobox("options"); -if(!opts.url){ -return false; -} -$.ajax({type:opts.method,url:opts.url,data:_b25,dataType:"json",success:function(data){ -_b26(data); -},error:function(){ -_b27.apply(this,arguments); -}}); -},loadFilter:function(data){ -return data; -},finder:{getEl:function(_b28,_b29){ -var _b2a=_aca(_b28,_b29); -var id=$.data(_b28,"combobox").itemIdPrefix+"_"+_b2a; -return $("#"+id); -},getGroupEl:function(_b2b,_b2c){ -var _b2d=$.data(_b2b,"combobox"); -var _b2e=$.easyui.indexOfArray(_b2d.groups,"value",_b2c); -var id=_b2d.groupIdPrefix+"_"+_b2e; -return $("#"+id); -},getGroup:function(_b2f,p){ -var _b30=$.data(_b2f,"combobox"); -var _b31=p.attr("id").substr(_b30.groupIdPrefix.length+1); -return _b30.groups[parseInt(_b31)]; -},getRow:function(_b32,p){ -var _b33=$.data(_b32,"combobox"); -var _b34=(p instanceof $)?p.attr("id").substr(_b33.itemIdPrefix.length+1):_aca(_b32,p); -return _b33.data[parseInt(_b34)]; -}},onBeforeLoad:function(_b35){ -},onLoadSuccess:function(data){ -},onLoadError:function(){ -},onSelect:function(_b36){ -},onUnselect:function(_b37){ -},onClick:function(_b38){ -}}); -})(jQuery); -(function($){ -function _b39(_b3a){ -var _b3b=$.data(_b3a,"combotree"); -var opts=_b3b.options; -var tree=_b3b.tree; -$(_b3a).addClass("combotree-f"); -$(_b3a).combo($.extend({},opts,{onShowPanel:function(){ -if(opts.editable){ -tree.tree("doFilter",""); -} -opts.onShowPanel.call(this); -}})); -var _b3c=$(_b3a).combo("panel"); -if(!tree){ -tree=$("
                                                                                                                                                          ").appendTo(_b3c); -_b3b.tree=tree; -} -tree.tree($.extend({},opts,{checkbox:opts.multiple,onLoadSuccess:function(node,data){ -var _b3d=$(_b3a).combotree("getValues"); -if(opts.multiple){ -$.map(tree.tree("getChecked"),function(node){ -$.easyui.addArrayItem(_b3d,node.id); -}); -} -_b42(_b3a,_b3d,_b3b.remainText); -opts.onLoadSuccess.call(this,node,data); -},onClick:function(node){ -if(opts.multiple){ -$(this).tree(node.checked?"uncheck":"check",node.target); -}else{ -$(_b3a).combo("hidePanel"); -} -_b3b.remainText=false; -_b3f(_b3a); -opts.onClick.call(this,node); -},onCheck:function(node,_b3e){ -_b3b.remainText=false; -_b3f(_b3a); -opts.onCheck.call(this,node,_b3e); -}})); -}; -function _b3f(_b40){ -var _b41=$.data(_b40,"combotree"); -var opts=_b41.options; -var tree=_b41.tree; -var vv=[]; -if(opts.multiple){ -vv=$.map(tree.tree("getChecked"),function(node){ -return node.id; -}); -}else{ -var node=tree.tree("getSelected"); -if(node){ -vv.push(node.id); -} -} -vv=vv.concat(opts.unselectedValues); -_b42(_b40,vv,_b41.remainText); -}; -function _b42(_b43,_b44,_b45){ -var _b46=$.data(_b43,"combotree"); -var opts=_b46.options; -var tree=_b46.tree; -var _b47=tree.tree("options"); -var _b48=_b47.onBeforeCheck; -var _b49=_b47.onCheck; -var _b4a=_b47.onSelect; -_b47.onBeforeCheck=_b47.onCheck=_b47.onSelect=function(){ -}; -if(!$.isArray(_b44)){ -_b44=_b44.split(opts.separator); -} -if(!opts.multiple){ -_b44=_b44.length?[_b44[0]]:[""]; -} -var vv=$.map(_b44,function(_b4b){ -return String(_b4b); -}); -tree.find("div.tree-node-selected").removeClass("tree-node-selected"); -$.map(tree.tree("getChecked"),function(node){ -if($.inArray(String(node.id),vv)==-1){ -tree.tree("uncheck",node.target); -} -}); -var ss=[]; -opts.unselectedValues=[]; -$.map(vv,function(v){ -var node=tree.tree("find",v); -if(node){ -tree.tree("check",node.target).tree("select",node.target); -ss.push(_b4c(node)); -}else{ -ss.push(_b4d(v,opts.mappingRows)||v); -opts.unselectedValues.push(v); -} -}); -if(opts.multiple){ -$.map(tree.tree("getChecked"),function(node){ -var id=String(node.id); -if($.inArray(id,vv)==-1){ -vv.push(id); -ss.push(_b4c(node)); -} -}); -} -_b47.onBeforeCheck=_b48; -_b47.onCheck=_b49; -_b47.onSelect=_b4a; -if(!_b45){ -var s=ss.join(opts.separator); -if($(_b43).combo("getText")!=s){ -$(_b43).combo("setText",s); -} -} -$(_b43).combo("setValues",vv); -function _b4d(_b4e,a){ -var item=$.easyui.getArrayItem(a,"id",_b4e); -return item?_b4c(item):undefined; -}; -function _b4c(node){ -return node[opts.textField||""]||node.text; -}; -}; -function _b4f(_b50,q){ -var _b51=$.data(_b50,"combotree"); -var opts=_b51.options; -var tree=_b51.tree; -_b51.remainText=true; -tree.tree("doFilter",opts.multiple?q.split(opts.separator):q); -}; -function _b52(_b53){ -var _b54=$.data(_b53,"combotree"); -_b54.remainText=false; -$(_b53).combotree("setValues",$(_b53).combotree("getValues")); -$(_b53).combotree("hidePanel"); -}; -$.fn.combotree=function(_b55,_b56){ -if(typeof _b55=="string"){ -var _b57=$.fn.combotree.methods[_b55]; -if(_b57){ -return _b57(this,_b56); -}else{ -return this.combo(_b55,_b56); -} -} -_b55=_b55||{}; -return this.each(function(){ -var _b58=$.data(this,"combotree"); -if(_b58){ -$.extend(_b58.options,_b55); -}else{ -$.data(this,"combotree",{options:$.extend({},$.fn.combotree.defaults,$.fn.combotree.parseOptions(this),_b55)}); -} -_b39(this); -}); -}; -$.fn.combotree.methods={options:function(jq){ -var _b59=jq.combo("options"); -return $.extend($.data(jq[0],"combotree").options,{width:_b59.width,height:_b59.height,originalValue:_b59.originalValue,disabled:_b59.disabled,readonly:_b59.readonly}); -},clone:function(jq,_b5a){ -var t=jq.combo("clone",_b5a); -t.data("combotree",{options:$.extend(true,{},jq.combotree("options")),tree:jq.combotree("tree")}); -return t; -},tree:function(jq){ -return $.data(jq[0],"combotree").tree; -},loadData:function(jq,data){ -return jq.each(function(){ -var opts=$.data(this,"combotree").options; -opts.data=data; -var tree=$.data(this,"combotree").tree; -tree.tree("loadData",data); -}); -},reload:function(jq,url){ -return jq.each(function(){ -var opts=$.data(this,"combotree").options; -var tree=$.data(this,"combotree").tree; -if(url){ -opts.url=url; -} -tree.tree({url:opts.url}); -}); -},setValues:function(jq,_b5b){ -return jq.each(function(){ -var opts=$(this).combotree("options"); -if($.isArray(_b5b)){ -_b5b=$.map(_b5b,function(_b5c){ -if(_b5c&&typeof _b5c=="object"){ -$.easyui.addArrayItem(opts.mappingRows,"id",_b5c); -return _b5c.id; -}else{ -return _b5c; -} -}); -} -_b42(this,_b5b); -}); -},setValue:function(jq,_b5d){ -return jq.each(function(){ -$(this).combotree("setValues",$.isArray(_b5d)?_b5d:[_b5d]); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).combotree("setValues",[]); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).combotree("options"); -if(opts.multiple){ -$(this).combotree("setValues",opts.originalValue); -}else{ -$(this).combotree("setValue",opts.originalValue); -} -}); -}}; -$.fn.combotree.parseOptions=function(_b5e){ -return $.extend({},$.fn.combo.parseOptions(_b5e),$.fn.tree.parseOptions(_b5e)); -}; -$.fn.combotree.defaults=$.extend({},$.fn.combo.defaults,$.fn.tree.defaults,{editable:false,textField:null,unselectedValues:[],mappingRows:[],keyHandler:{up:function(e){ -},down:function(e){ -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_b52(this); -},query:function(q,e){ -_b4f(this,q); -}}}); -})(jQuery); -(function($){ -function _b5f(_b60){ -var _b61=$.data(_b60,"combogrid"); -var opts=_b61.options; -var grid=_b61.grid; -$(_b60).addClass("combogrid-f").combo($.extend({},opts,{onShowPanel:function(){ -_b78(this,$(this).combogrid("getValues"),true); -var p=$(this).combogrid("panel"); -var _b62=p.outerHeight()-p.height(); -var _b63=p._size("minHeight"); -var _b64=p._size("maxHeight"); -var dg=$(this).combogrid("grid"); -dg.datagrid("resize",{width:"100%",height:(isNaN(parseInt(opts.panelHeight))?"auto":"100%"),minHeight:(_b63?_b63-_b62:""),maxHeight:(_b64?_b64-_b62:"")}); -var row=dg.datagrid("getSelected"); -if(row){ -dg.datagrid("scrollTo",dg.datagrid("getRowIndex",row)); -} -opts.onShowPanel.call(this); -}})); -var _b65=$(_b60).combo("panel"); -if(!grid){ -grid=$("
                                                                                                                                                          ").appendTo(_b65); -_b61.grid=grid; -} -grid.datagrid($.extend({},opts,{border:false,singleSelect:(!opts.multiple),onLoadSuccess:_b66,onClickRow:_b67,onSelect:_b68("onSelect"),onUnselect:_b68("onUnselect"),onSelectAll:_b68("onSelectAll"),onUnselectAll:_b68("onUnselectAll")})); -function _b69(dg){ -return $(dg).closest(".combo-panel").panel("options").comboTarget||_b60; -}; -function _b66(data){ -var _b6a=_b69(this); -var _b6b=$(_b6a).data("combogrid"); -var opts=_b6b.options; -var _b6c=$(_b6a).combo("getValues"); -_b78(_b6a,_b6c,_b6b.remainText); -opts.onLoadSuccess.call(this,data); -}; -function _b67(_b6d,row){ -var _b6e=_b69(this); -var _b6f=$(_b6e).data("combogrid"); -var opts=_b6f.options; -_b6f.remainText=false; -_b70.call(this); -if(!opts.multiple){ -$(_b6e).combo("hidePanel"); -} -opts.onClickRow.call(this,_b6d,row); -}; -function _b68(_b71){ -return function(_b72,row){ -var _b73=_b69(this); -var opts=$(_b73).combogrid("options"); -if(_b71=="onUnselectAll"){ -if(opts.multiple){ -_b70.call(this); -} -}else{ -_b70.call(this); -} -opts[_b71].call(this,_b72,row); -}; -}; -function _b70(){ -var dg=$(this); -var _b74=_b69(dg); -var _b75=$(_b74).data("combogrid"); -var opts=_b75.options; -var vv=$.map(dg.datagrid("getSelections"),function(row){ -return row[opts.idField]; -}); -vv=vv.concat(opts.unselectedValues); -var _b76=dg.data("datagrid").dc.body2; -var _b77=_b76.scrollTop(); -_b78(_b74,vv,_b75.remainText); -_b76.scrollTop(_b77); -}; -}; -function nav(_b79,dir){ -var _b7a=$.data(_b79,"combogrid"); -var opts=_b7a.options; -var grid=_b7a.grid; -var _b7b=grid.datagrid("getRows").length; -if(!_b7b){ -return; -} -var tr=opts.finder.getTr(grid[0],null,"highlight"); -if(!tr.length){ -tr=opts.finder.getTr(grid[0],null,"selected"); -} -var _b7c; -if(!tr.length){ -_b7c=(dir=="next"?0:_b7b-1); -}else{ -var _b7c=parseInt(tr.attr("datagrid-row-index")); -_b7c+=(dir=="next"?1:-1); -if(_b7c<0){ -_b7c=_b7b-1; -} -if(_b7c>=_b7b){ -_b7c=0; -} -} -grid.datagrid("highlightRow",_b7c); -if(opts.selectOnNavigation){ -_b7a.remainText=false; -grid.datagrid("selectRow",_b7c); -} -}; -function _b78(_b7d,_b7e,_b7f){ -var _b80=$.data(_b7d,"combogrid"); -var opts=_b80.options; -var grid=_b80.grid; -var _b81=$(_b7d).combo("getValues"); -var _b82=$(_b7d).combo("options"); -var _b83=_b82.onChange; -_b82.onChange=function(){ -}; -var _b84=grid.datagrid("options"); -var _b85=_b84.onSelect; -var _b86=_b84.onUnselectAll; -_b84.onSelect=_b84.onUnselectAll=function(){ -}; -if(!$.isArray(_b7e)){ -_b7e=_b7e.split(opts.separator); -} -if(!opts.multiple){ -_b7e=_b7e.length?[_b7e[0]]:[""]; -} -var vv=$.map(_b7e,function(_b87){ -return String(_b87); -}); -vv=$.grep(vv,function(v,_b88){ -return _b88===$.inArray(v,vv); -}); -var _b89=$.grep(grid.datagrid("getSelections"),function(row,_b8a){ -return $.inArray(String(row[opts.idField]),vv)>=0; -}); -grid.datagrid("clearSelections"); -grid.data("datagrid").selectedRows=_b89; -var ss=[]; -opts.unselectedValues=[]; -$.map(vv,function(v){ -var _b8b=grid.datagrid("getRowIndex",v); -if(_b8b>=0){ -grid.datagrid("selectRow",_b8b); -}else{ -opts.unselectedValues.push(v); -} -ss.push(_b8c(v,grid.datagrid("getRows"))||_b8c(v,_b89)||_b8c(v,opts.mappingRows)||v); -}); -$(_b7d).combo("setValues",_b81); -_b82.onChange=_b83; -_b84.onSelect=_b85; -_b84.onUnselectAll=_b86; -if(!_b7f){ -var s=ss.join(opts.separator); -if($(_b7d).combo("getText")!=s){ -$(_b7d).combo("setText",s); -} -} -$(_b7d).combo("setValues",_b7e); -function _b8c(_b8d,a){ -var item=$.easyui.getArrayItem(a,opts.idField,_b8d); -return item?item[opts.textField]:undefined; -}; -}; -function _b8e(_b8f,q){ -var _b90=$.data(_b8f,"combogrid"); -var opts=_b90.options; -var grid=_b90.grid; -_b90.remainText=true; -var qq=opts.multiple?q.split(opts.separator):[q]; -qq=$.grep(qq,function(q){ -return $.trim(q)!=""; -}); -if(opts.mode=="remote"){ -_b91(qq); -grid.datagrid("load",$.extend({},opts.queryParams,{q:q})); -}else{ -grid.datagrid("highlightRow",-1); -var rows=grid.datagrid("getRows"); -var vv=[]; -$.map(qq,function(q){ -q=$.trim(q); -var _b92=q; -_b93(opts.mappingRows,q); -_b93(grid.datagrid("getSelections"),q); -var _b94=_b93(rows,q); -if(_b94>=0){ -if(opts.reversed){ -grid.datagrid("highlightRow",_b94); -} -}else{ -$.map(rows,function(row,i){ -if(opts.filter.call(_b8f,q,row)){ -grid.datagrid("highlightRow",i); -} -}); -} -}); -_b91(vv); -} -function _b93(rows,q){ -for(var i=0;i=0){ -$.easyui.addArrayItem(vv,v); -} -}); -$(_b96).combogrid("setValues",vv); -if(!opts.multiple){ -$(_b96).combogrid("hidePanel"); -} -}; -$.fn.combogrid=function(_b99,_b9a){ -if(typeof _b99=="string"){ -var _b9b=$.fn.combogrid.methods[_b99]; -if(_b9b){ -return _b9b(this,_b9a); -}else{ -return this.combo(_b99,_b9a); -} -} -_b99=_b99||{}; -return this.each(function(){ -var _b9c=$.data(this,"combogrid"); -if(_b9c){ -$.extend(_b9c.options,_b99); -}else{ -_b9c=$.data(this,"combogrid",{options:$.extend({},$.fn.combogrid.defaults,$.fn.combogrid.parseOptions(this),_b99)}); -} -_b5f(this); -}); -}; -$.fn.combogrid.methods={options:function(jq){ -var _b9d=jq.combo("options"); -return $.extend($.data(jq[0],"combogrid").options,{width:_b9d.width,height:_b9d.height,originalValue:_b9d.originalValue,disabled:_b9d.disabled,readonly:_b9d.readonly}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).combo("cloneFrom",from); -$.data(this,"combogrid",{options:$.extend(true,{cloned:true},$(from).combogrid("options")),combo:$(this).next(),panel:$(from).combo("panel"),grid:$(from).combogrid("grid")}); -}); -},grid:function(jq){ -return $.data(jq[0],"combogrid").grid; -},setValues:function(jq,_b9e){ -return jq.each(function(){ -var opts=$(this).combogrid("options"); -if($.isArray(_b9e)){ -_b9e=$.map(_b9e,function(_b9f){ -if(_b9f&&typeof _b9f=="object"){ -$.easyui.addArrayItem(opts.mappingRows,opts.idField,_b9f); -return _b9f[opts.idField]; -}else{ -return _b9f; -} -}); -} -_b78(this,_b9e); -}); -},setValue:function(jq,_ba0){ -return jq.each(function(){ -$(this).combogrid("setValues",$.isArray(_ba0)?_ba0:[_ba0]); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).combogrid("setValues",[]); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).combogrid("options"); -if(opts.multiple){ -$(this).combogrid("setValues",opts.originalValue); -}else{ -$(this).combogrid("setValue",opts.originalValue); -} -}); -}}; -$.fn.combogrid.parseOptions=function(_ba1){ -var t=$(_ba1); -return $.extend({},$.fn.combo.parseOptions(_ba1),$.fn.datagrid.parseOptions(_ba1),$.parser.parseOptions(_ba1,["idField","textField","mode"])); -}; -$.fn.combogrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.datagrid.defaults,{loadMsg:null,idField:null,textField:null,unselectedValues:[],mappingRows:[],mode:"local",keyHandler:{up:function(e){ -nav(this,"prev"); -e.preventDefault(); -},down:function(e){ -nav(this,"next"); -e.preventDefault(); -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_b95(this); -},query:function(q,e){ -_b8e(this,q); -}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ -$.fn.combo.defaults.inputEvents.blur(e); -var _ba2=e.data.target; -var opts=$(_ba2).combogrid("options"); -if(opts.reversed){ -$(_ba2).combogrid("setValues",$(_ba2).combogrid("getValues")); -} -}}),panelEvents:{mousedown:function(e){ -}},filter:function(q,row){ -var opts=$(this).combogrid("options"); -return (row[opts.textField]||"").toLowerCase().indexOf(q.toLowerCase())>=0; -}}); -})(jQuery); -(function($){ -function _ba3(_ba4){ -var _ba5=$.data(_ba4,"combotreegrid"); -var opts=_ba5.options; -$(_ba4).addClass("combotreegrid-f").combo($.extend({},opts,{onShowPanel:function(){ -var p=$(this).combotreegrid("panel"); -var _ba6=p.outerHeight()-p.height(); -var _ba7=p._size("minHeight"); -var _ba8=p._size("maxHeight"); -var dg=$(this).combotreegrid("grid"); -dg.treegrid("resize",{width:"100%",height:(isNaN(parseInt(opts.panelHeight))?"auto":"100%"),minHeight:(_ba7?_ba7-_ba6:""),maxHeight:(_ba8?_ba8-_ba6:"")}); -var row=dg.treegrid("getSelected"); -if(row){ -dg.treegrid("scrollTo",row[opts.idField]); -} -opts.onShowPanel.call(this); -}})); -if(!_ba5.grid){ -var _ba9=$(_ba4).combo("panel"); -_ba5.grid=$("
                                                                                                                                                          ").appendTo(_ba9); -} -_ba5.grid.treegrid($.extend({},opts,{border:false,checkbox:opts.multiple,onLoadSuccess:function(row,data){ -var _baa=$(_ba4).combotreegrid("getValues"); -if(opts.multiple){ -$.map($(this).treegrid("getCheckedNodes"),function(row){ -$.easyui.addArrayItem(_baa,row[opts.idField]); -}); -} -_baf(_ba4,_baa); -opts.onLoadSuccess.call(this,row,data); -_ba5.remainText=false; -},onClickRow:function(row){ -if(opts.multiple){ -$(this).treegrid(row.checked?"uncheckNode":"checkNode",row[opts.idField]); -$(this).treegrid("unselect",row[opts.idField]); -}else{ -$(_ba4).combo("hidePanel"); -} -_bac(_ba4); -opts.onClickRow.call(this,row); -},onCheckNode:function(row,_bab){ -_bac(_ba4); -opts.onCheckNode.call(this,row,_bab); -}})); -}; -function _bac(_bad){ -var _bae=$.data(_bad,"combotreegrid"); -var opts=_bae.options; -var grid=_bae.grid; -var vv=[]; -if(opts.multiple){ -vv=$.map(grid.treegrid("getCheckedNodes"),function(row){ -return row[opts.idField]; -}); -}else{ -var row=grid.treegrid("getSelected"); -if(row){ -vv.push(row[opts.idField]); -} -} -vv=vv.concat(opts.unselectedValues); -_baf(_bad,vv); -}; -function _baf(_bb0,_bb1){ -var _bb2=$.data(_bb0,"combotreegrid"); -var opts=_bb2.options; -var grid=_bb2.grid; -if(!$.isArray(_bb1)){ -_bb1=_bb1.split(opts.separator); -} -if(!opts.multiple){ -_bb1=_bb1.length?[_bb1[0]]:[""]; -} -var vv=$.map(_bb1,function(_bb3){ -return String(_bb3); -}); -vv=$.grep(vv,function(v,_bb4){ -return _bb4===$.inArray(v,vv); -}); -var _bb5=grid.treegrid("getSelected"); -if(_bb5){ -grid.treegrid("unselect",_bb5[opts.idField]); -} -$.map(grid.treegrid("getCheckedNodes"),function(row){ -if($.inArray(String(row[opts.idField]),vv)==-1){ -grid.treegrid("uncheckNode",row[opts.idField]); -} -}); -var ss=[]; -opts.unselectedValues=[]; -$.map(vv,function(v){ -var row=grid.treegrid("find",v); -if(row){ -if(opts.multiple){ -grid.treegrid("checkNode",v); -}else{ -grid.treegrid("select",v); -} -ss.push(_bb6(row)); -}else{ -ss.push(_bb7(v,opts.mappingRows)||v); -opts.unselectedValues.push(v); -} -}); -if(opts.multiple){ -$.map(grid.treegrid("getCheckedNodes"),function(row){ -var id=String(row[opts.idField]); -if($.inArray(id,vv)==-1){ -vv.push(id); -ss.push(_bb6(row)); -} -}); -} -if(!_bb2.remainText){ -var s=ss.join(opts.separator); -if($(_bb0).combo("getText")!=s){ -$(_bb0).combo("setText",s); -} -} -$(_bb0).combo("setValues",vv); -function _bb7(_bb8,a){ -var item=$.easyui.getArrayItem(a,opts.idField,_bb8); -return item?_bb6(item):undefined; -}; -function _bb6(row){ -return row[opts.textField||""]||row[opts.treeField]; -}; -}; -function _bb9(_bba,q){ -var _bbb=$.data(_bba,"combotreegrid"); -var opts=_bbb.options; -var grid=_bbb.grid; -_bbb.remainText=true; -var qq=opts.multiple?q.split(opts.separator):[q]; -qq=$.grep(qq,function(q){ -return $.trim(q)!=""; -}); -grid.treegrid("clearSelections").treegrid("clearChecked").treegrid("highlightRow",-1); -if(opts.mode=="remote"){ -_bbc(qq); -grid.treegrid("load",$.extend({},opts.queryParams,{q:q})); -}else{ -if(q){ -var data=grid.treegrid("getData"); -var vv=[]; -$.map(qq,function(q){ -q=$.trim(q); -if(q){ -var v=undefined; -$.easyui.forEach(data,true,function(row){ -if(q.toLowerCase()==String(row[opts.treeField]).toLowerCase()){ -v=row[opts.idField]; -return false; -}else{ -if(opts.filter.call(_bba,q,row)){ -grid.treegrid("expandTo",row[opts.idField]); -grid.treegrid("highlightRow",row[opts.idField]); -return false; -} -} -}); -if(v==undefined){ -$.easyui.forEach(opts.mappingRows,false,function(row){ -if(q.toLowerCase()==String(row[opts.treeField])){ -v=row[opts.idField]; -return false; -} -}); -} -if(v!=undefined){ -vv.push(v); -}else{ -vv.push(q); -} -} -}); -_bbc(vv); -_bbb.remainText=false; -} -} -function _bbc(vv){ -if(!opts.reversed){ -$(_bba).combotreegrid("setValues",vv); -} -}; -}; -function _bbd(_bbe){ -var _bbf=$.data(_bbe,"combotreegrid"); -var opts=_bbf.options; -var grid=_bbf.grid; -var tr=opts.finder.getTr(grid[0],null,"highlight"); -_bbf.remainText=false; -if(tr.length){ -var id=tr.attr("node-id"); -if(opts.multiple){ -if(tr.hasClass("datagrid-row-selected")){ -grid.treegrid("uncheckNode",id); -}else{ -grid.treegrid("checkNode",id); -} -}else{ -grid.treegrid("selectRow",id); -} -} -var vv=[]; -if(opts.multiple){ -$.map(grid.treegrid("getCheckedNodes"),function(row){ -vv.push(row[opts.idField]); -}); -}else{ -var row=grid.treegrid("getSelected"); -if(row){ -vv.push(row[opts.idField]); -} -} -$.map(opts.unselectedValues,function(v){ -if($.easyui.indexOfArray(opts.mappingRows,opts.idField,v)>=0){ -$.easyui.addArrayItem(vv,v); -} -}); -$(_bbe).combotreegrid("setValues",vv); -if(!opts.multiple){ -$(_bbe).combotreegrid("hidePanel"); -} -}; -$.fn.combotreegrid=function(_bc0,_bc1){ -if(typeof _bc0=="string"){ -var _bc2=$.fn.combotreegrid.methods[_bc0]; -if(_bc2){ -return _bc2(this,_bc1); -}else{ -return this.combo(_bc0,_bc1); -} -} -_bc0=_bc0||{}; -return this.each(function(){ -var _bc3=$.data(this,"combotreegrid"); -if(_bc3){ -$.extend(_bc3.options,_bc0); -}else{ -_bc3=$.data(this,"combotreegrid",{options:$.extend({},$.fn.combotreegrid.defaults,$.fn.combotreegrid.parseOptions(this),_bc0)}); -} -_ba3(this); -}); -}; -$.fn.combotreegrid.methods={options:function(jq){ -var _bc4=jq.combo("options"); -return $.extend($.data(jq[0],"combotreegrid").options,{width:_bc4.width,height:_bc4.height,originalValue:_bc4.originalValue,disabled:_bc4.disabled,readonly:_bc4.readonly}); -},grid:function(jq){ -return $.data(jq[0],"combotreegrid").grid; -},setValues:function(jq,_bc5){ -return jq.each(function(){ -var opts=$(this).combotreegrid("options"); -if($.isArray(_bc5)){ -_bc5=$.map(_bc5,function(_bc6){ -if(_bc6&&typeof _bc6=="object"){ -$.easyui.addArrayItem(opts.mappingRows,opts.idField,_bc6); -return _bc6[opts.idField]; -}else{ -return _bc6; -} -}); -} -_baf(this,_bc5); -}); -},setValue:function(jq,_bc7){ -return jq.each(function(){ -$(this).combotreegrid("setValues",$.isArray(_bc7)?_bc7:[_bc7]); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).combotreegrid("setValues",[]); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).combotreegrid("options"); -if(opts.multiple){ -$(this).combotreegrid("setValues",opts.originalValue); -}else{ -$(this).combotreegrid("setValue",opts.originalValue); -} -}); -}}; -$.fn.combotreegrid.parseOptions=function(_bc8){ -var t=$(_bc8); -return $.extend({},$.fn.combo.parseOptions(_bc8),$.fn.treegrid.parseOptions(_bc8),$.parser.parseOptions(_bc8,["mode",{limitToGrid:"boolean"}])); -}; -$.fn.combotreegrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.treegrid.defaults,{editable:false,singleSelect:true,limitToGrid:false,unselectedValues:[],mappingRows:[],mode:"local",textField:null,keyHandler:{up:function(e){ -},down:function(e){ -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_bbd(this); -},query:function(q,e){ -_bb9(this,q); -}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ -$.fn.combo.defaults.inputEvents.blur(e); -var _bc9=e.data.target; -var opts=$(_bc9).combotreegrid("options"); -if(opts.limitToGrid){ -_bbd(_bc9); -} -}}),filter:function(q,row){ -var opts=$(this).combotreegrid("options"); -return (row[opts.treeField]||"").toLowerCase().indexOf(q.toLowerCase())>=0; -}}); -})(jQuery); -(function($){ -function _bca(_bcb){ -var _bcc=$.data(_bcb,"tagbox"); -var opts=_bcc.options; -$(_bcb).addClass("tagbox-f").combobox($.extend({},opts,{cls:"tagbox",reversed:true,onChange:function(_bcd,_bce){ -_bcf(); -$(this).combobox("hidePanel"); -opts.onChange.call(_bcb,_bcd,_bce); -},onResizing:function(_bd0,_bd1){ -var _bd2=$(this).combobox("textbox"); -var tb=$(this).data("textbox").textbox; -var _bd3=tb.outerWidth(); -tb.css({height:"",paddingLeft:_bd2.css("marginLeft"),paddingRight:_bd2.css("marginRight")}); -_bd2.css("margin",0); -tb._outerWidth(_bd3); -_be6(_bcb); -_bd8(this); -opts.onResizing.call(_bcb,_bd0,_bd1); -},onLoadSuccess:function(data){ -_bcf(); -opts.onLoadSuccess.call(_bcb,data); -}})); -_bcf(); -_be6(_bcb); -function _bcf(){ -$(_bcb).next().find(".tagbox-label").remove(); -var _bd4=$(_bcb).tagbox("textbox"); -var ss=[]; -$.map($(_bcb).tagbox("getValues"),function(_bd5,_bd6){ -var row=opts.finder.getRow(_bcb,_bd5); -var text=opts.tagFormatter.call(_bcb,_bd5,row); -var cs={}; -var css=opts.tagStyler.call(_bcb,_bd5,row)||""; -if(typeof css=="string"){ -cs={s:css}; -}else{ -cs={c:css["class"]||"",s:css["style"]||""}; -} -var _bd7=$("").insertBefore(_bd4).html(text); -_bd7.attr("tagbox-index",_bd6); -_bd7.attr("style",cs.s).addClass(cs.c); -$("").appendTo(_bd7); -}); -_bd8(_bcb); -$(_bcb).combobox("setText",""); -}; -}; -function _bd8(_bd9,_bda){ -var span=$(_bd9).next(); -var _bdb=_bda?$(_bda):span.find(".tagbox-label"); -if(_bdb.length){ -var _bdc=$(_bd9).tagbox("textbox"); -var _bdd=$(_bdb[0]); -var _bde=_bdd.outerHeight(true)-_bdd.outerHeight(); -var _bdf=_bdc.outerHeight()-_bde*2; -_bdb.css({height:_bdf+"px",lineHeight:_bdf+"px"}); -var _be0=span.find(".textbox-addon").css("height","100%"); -_be0.find(".textbox-icon").css("height","100%"); -span.find(".textbox-button").linkbutton("resize",{height:"100%"}); -} -}; -function _be1(_be2){ -var span=$(_be2).next(); -span.unbind(".tagbox").bind("click.tagbox",function(e){ -var opts=$(_be2).tagbox("options"); -if(opts.disabled||opts.readonly){ -return; -} -if($(e.target).hasClass("tagbox-remove")){ -var _be3=parseInt($(e.target).parent().attr("tagbox-index")); -var _be4=$(_be2).tagbox("getValues"); -if(opts.onBeforeRemoveTag.call(_be2,_be4[_be3])==false){ -return; -} -opts.onRemoveTag.call(_be2,_be4[_be3]); -_be4.splice(_be3,1); -$(_be2).tagbox("setValues",_be4); -}else{ -var _be5=$(e.target).closest(".tagbox-label"); -if(_be5.length){ -var _be3=parseInt(_be5.attr("tagbox-index")); -var _be4=$(_be2).tagbox("getValues"); -opts.onClickTag.call(_be2,_be4[_be3]); -} -} -$(this).find(".textbox-text").focus(); -}).bind("keyup.tagbox",function(e){ -_be6(_be2); -}).bind("mouseover.tagbox",function(e){ -if($(e.target).closest(".textbox-button,.textbox-addon,.tagbox-label").length){ -$(this).triggerHandler("mouseleave"); -}else{ -$(this).find(".textbox-text").triggerHandler("mouseenter"); -} -}).bind("mouseleave.tagbox",function(e){ -$(this).find(".textbox-text").triggerHandler("mouseleave"); -}); -}; -function _be6(_be7){ -var opts=$(_be7).tagbox("options"); -var _be8=$(_be7).tagbox("textbox"); -var span=$(_be7).next(); -var tmp=$("").appendTo("body"); -tmp.attr("style",_be8.attr("style")); -tmp.css({position:"absolute",top:-9999,left:-9999,width:"auto",fontFamily:_be8.css("fontFamily"),fontSize:_be8.css("fontSize"),fontWeight:_be8.css("fontWeight"),whiteSpace:"nowrap"}); -var _be9=_bea(_be8.val()); -var _beb=_bea(opts.prompt||""); -tmp.remove(); -var _bec=Math.min(Math.max(_be9,_beb)+20,span.width()); -_be8._outerWidth(_bec); -span.find(".textbox-button").linkbutton("resize",{height:"100%"}); -function _bea(val){ -var s=val.replace(/&/g,"&").replace(/\s/g," ").replace(//g,">"); -tmp.html(s); -return tmp.outerWidth(); -}; -}; -function _bed(_bee){ -var t=$(_bee); -var opts=t.tagbox("options"); -if(opts.limitToList){ -var _bef=t.tagbox("panel"); -var item=_bef.children("div.combobox-item-hover"); -if(item.length){ -item.removeClass("combobox-item-hover"); -var row=opts.finder.getRow(_bee,item); -var _bf0=row[opts.valueField]; -$(_bee).tagbox(item.hasClass("combobox-item-selected")?"unselect":"select",_bf0); -} -$(_bee).tagbox("hidePanel"); -}else{ -var v=$.trim($(_bee).tagbox("getText")); -if(v!==""){ -var _bf1=$(_bee).tagbox("getValues"); -_bf1.push(v); -$(_bee).tagbox("setValues",_bf1); -} -} -}; -function _bf2(_bf3,_bf4){ -$(_bf3).combobox("setText",""); -_be6(_bf3); -$(_bf3).combobox("setValues",_bf4); -$(_bf3).combobox("setText",""); -$(_bf3).tagbox("validate"); -}; -$.fn.tagbox=function(_bf5,_bf6){ -if(typeof _bf5=="string"){ -var _bf7=$.fn.tagbox.methods[_bf5]; -if(_bf7){ -return _bf7(this,_bf6); -}else{ -return this.combobox(_bf5,_bf6); -} -} -_bf5=_bf5||{}; -return this.each(function(){ -var _bf8=$.data(this,"tagbox"); -if(_bf8){ -$.extend(_bf8.options,_bf5); -}else{ -$.data(this,"tagbox",{options:$.extend({},$.fn.tagbox.defaults,$.fn.tagbox.parseOptions(this),_bf5)}); -} -_bca(this); -_be1(this); -}); -}; -$.fn.tagbox.methods={options:function(jq){ -var _bf9=jq.combobox("options"); -return $.extend($.data(jq[0],"tagbox").options,{width:_bf9.width,height:_bf9.height,originalValue:_bf9.originalValue,disabled:_bf9.disabled,readonly:_bf9.readonly}); -},setValues:function(jq,_bfa){ -return jq.each(function(){ -_bf2(this,_bfa); -}); -},reset:function(jq){ -return jq.each(function(){ -$(this).combobox("reset").combobox("setText",""); -}); -}}; -$.fn.tagbox.parseOptions=function(_bfb){ -return $.extend({},$.fn.combobox.parseOptions(_bfb),$.parser.parseOptions(_bfb,[])); -}; -$.fn.tagbox.defaults=$.extend({},$.fn.combobox.defaults,{hasDownArrow:false,multiple:true,reversed:true,selectOnNavigation:false,tipOptions:$.extend({},$.fn.textbox.defaults.tipOptions,{showDelay:200}),val:function(_bfc){ -var vv=$(_bfc).parent().prev().tagbox("getValues"); -if($(_bfc).is(":focus")){ -vv.push($(_bfc).val()); -} -return vv.join(","); -},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ -var _bfd=e.data.target; -var opts=$(_bfd).tagbox("options"); -if(opts.limitToList){ -_bed(_bfd); -} -}}),keyHandler:$.extend({},$.fn.combobox.defaults.keyHandler,{enter:function(e){ -_bed(this); -},query:function(q,e){ -var opts=$(this).tagbox("options"); -if(opts.limitToList){ -$.fn.combobox.defaults.keyHandler.query.call(this,q,e); -}else{ -$(this).combobox("hidePanel"); -} -}}),tagFormatter:function(_bfe,row){ -var opts=$(this).tagbox("options"); -return row?row[opts.textField]:_bfe; -},tagStyler:function(_bff,row){ -return ""; -},onClickTag:function(_c00){ -},onBeforeRemoveTag:function(_c01){ -},onRemoveTag:function(_c02){ -}}); -})(jQuery); -(function($){ -function _c03(_c04){ -var _c05=$.data(_c04,"datebox"); -var opts=_c05.options; -$(_c04).addClass("datebox-f").combo($.extend({},opts,{onShowPanel:function(){ -_c06(this); -_c07(this); -_c08(this); -_c16(this,$(this).datebox("getText"),true); -opts.onShowPanel.call(this); -}})); -if(!_c05.calendar){ -var _c09=$(_c04).combo("panel").css("overflow","hidden"); -_c09.panel("options").onBeforeDestroy=function(){ -var c=$(this).find(".calendar-shared"); -if(c.length){ -c.insertBefore(c[0].pholder); -} -}; -var cc=$("
                                                                                                                                                          ").prependTo(_c09); -if(opts.sharedCalendar){ -var c=$(opts.sharedCalendar); -if(!c[0].pholder){ -c[0].pholder=$("
                                                                                                                                                          ").insertAfter(c); -} -c.addClass("calendar-shared").appendTo(cc); -if(!c.hasClass("calendar")){ -c.calendar(); -} -_c05.calendar=c; -}else{ -_c05.calendar=$("
                                                                                                                                                          ").appendTo(cc).calendar(); -} -$.extend(_c05.calendar.calendar("options"),{fit:true,border:false,onSelect:function(date){ -var _c0a=this.target; -var opts=$(_c0a).datebox("options"); -opts.onSelect.call(_c0a,date); -_c16(_c0a,opts.formatter.call(_c0a,date)); -$(_c0a).combo("hidePanel"); -}}); -} -$(_c04).combo("textbox").parent().addClass("datebox"); -$(_c04).datebox("initValue",opts.value); -function _c06(_c0b){ -var opts=$(_c0b).datebox("options"); -var _c0c=$(_c0b).combo("panel"); -_c0c.unbind(".datebox").bind("click.datebox",function(e){ -if($(e.target).hasClass("datebox-button-a")){ -var _c0d=parseInt($(e.target).attr("datebox-button-index")); -opts.buttons[_c0d].handler.call(e.target,_c0b); -} -}); -}; -function _c07(_c0e){ -var _c0f=$(_c0e).combo("panel"); -if(_c0f.children("div.datebox-button").length){ -return; -} -var _c10=$("
                                                                                                                                                          ").appendTo(_c0f); -var tr=_c10.find("tr"); -for(var i=0;i").appendTo(tr); -var btn=opts.buttons[i]; -var t=$("").html($.isFunction(btn.text)?btn.text(_c0e):btn.text).appendTo(td); -t.attr("datebox-button-index",i); -} -tr.find("td").css("width",(100/opts.buttons.length)+"%"); -}; -function _c08(_c11){ -var _c12=$(_c11).combo("panel"); -var cc=_c12.children("div.datebox-calendar-inner"); -_c12.children()._outerWidth(_c12.width()); -_c05.calendar.appendTo(cc); -_c05.calendar[0].target=_c11; -if(opts.panelHeight!="auto"){ -var _c13=_c12.height(); -_c12.children().not(cc).each(function(){ -_c13-=$(this).outerHeight(); -}); -cc._outerHeight(_c13); -} -_c05.calendar.calendar("resize"); -}; -}; -function _c14(_c15,q){ -_c16(_c15,q,true); -}; -function _c17(_c18){ -var _c19=$.data(_c18,"datebox"); -var opts=_c19.options; -var _c1a=_c19.calendar.calendar("options").current; -if(_c1a){ -_c16(_c18,opts.formatter.call(_c18,_c1a)); -$(_c18).combo("hidePanel"); -} -}; -function _c16(_c1b,_c1c,_c1d){ -var _c1e=$.data(_c1b,"datebox"); -var opts=_c1e.options; -var _c1f=_c1e.calendar; -_c1f.calendar("moveTo",opts.parser.call(_c1b,_c1c)); -if(_c1d){ -$(_c1b).combo("setValue",_c1c); -}else{ -if(_c1c){ -_c1c=opts.formatter.call(_c1b,_c1f.calendar("options").current); -} -$(_c1b).combo("setText",_c1c).combo("setValue",_c1c); -} -}; -$.fn.datebox=function(_c20,_c21){ -if(typeof _c20=="string"){ -var _c22=$.fn.datebox.methods[_c20]; -if(_c22){ -return _c22(this,_c21); -}else{ -return this.combo(_c20,_c21); -} -} -_c20=_c20||{}; -return this.each(function(){ -var _c23=$.data(this,"datebox"); -if(_c23){ -$.extend(_c23.options,_c20); -}else{ -$.data(this,"datebox",{options:$.extend({},$.fn.datebox.defaults,$.fn.datebox.parseOptions(this),_c20)}); -} -_c03(this); -}); -}; -$.fn.datebox.methods={options:function(jq){ -var _c24=jq.combo("options"); -return $.extend($.data(jq[0],"datebox").options,{width:_c24.width,height:_c24.height,originalValue:_c24.originalValue,disabled:_c24.disabled,readonly:_c24.readonly}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).combo("cloneFrom",from); -$.data(this,"datebox",{options:$.extend(true,{},$(from).datebox("options")),calendar:$(from).datebox("calendar")}); -$(this).addClass("datebox-f"); -}); -},calendar:function(jq){ -return $.data(jq[0],"datebox").calendar; -},initValue:function(jq,_c25){ -return jq.each(function(){ -var opts=$(this).datebox("options"); -var _c26=opts.value; -if(_c26){ -_c26=opts.formatter.call(this,opts.parser.call(this,_c26)); -} -$(this).combo("initValue",_c26).combo("setText",_c26); -}); -},setValue:function(jq,_c27){ -return jq.each(function(){ -_c16(this,_c27); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).datebox("options"); -$(this).datebox("setValue",opts.originalValue); -}); -}}; -$.fn.datebox.parseOptions=function(_c28){ -return $.extend({},$.fn.combo.parseOptions(_c28),$.parser.parseOptions(_c28,["sharedCalendar"])); -}; -$.fn.datebox.defaults=$.extend({},$.fn.combo.defaults,{panelWidth:250,panelHeight:"auto",sharedCalendar:null,keyHandler:{up:function(e){ -},down:function(e){ -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_c17(this); -},query:function(q,e){ -_c14(this,q); -}},currentText:"Today",closeText:"Close",okText:"Ok",buttons:[{text:function(_c29){ -return $(_c29).datebox("options").currentText; -},handler:function(_c2a){ -var opts=$(_c2a).datebox("options"); -var now=new Date(); -var _c2b=new Date(now.getFullYear(),now.getMonth(),now.getDate()); -$(_c2a).datebox("calendar").calendar({year:_c2b.getFullYear(),month:_c2b.getMonth()+1,current:_c2b}); -opts.onSelect.call(_c2a,_c2b); -_c17(_c2a); -}},{text:function(_c2c){ -return $(_c2c).datebox("options").closeText; -},handler:function(_c2d){ -$(this).closest("div.combo-panel").panel("close"); -}}],formatter:function(date){ -var y=date.getFullYear(); -var m=date.getMonth()+1; -var d=date.getDate(); -return (m<10?("0"+m):m)+"/"+(d<10?("0"+d):d)+"/"+y; -},parser:function(s){ -if(!s){ -return new Date(); -} -var ss=s.split("/"); -var m=parseInt(ss[0],10); -var d=parseInt(ss[1],10); -var y=parseInt(ss[2],10); -if(!isNaN(y)&&!isNaN(m)&&!isNaN(d)){ -return new Date(y,m-1,d); -}else{ -return new Date(); -} -},onSelect:function(date){ -}}); -})(jQuery); -(function($){ -function _c2e(_c2f){ -var _c30=$.data(_c2f,"datetimebox"); -var opts=_c30.options; -$(_c2f).datebox($.extend({},opts,{onShowPanel:function(){ -var _c31=$(this).datetimebox("getValue"); -_c37(this,_c31,true); -opts.onShowPanel.call(this); -},formatter:$.fn.datebox.defaults.formatter,parser:$.fn.datebox.defaults.parser})); -$(_c2f).removeClass("datebox-f").addClass("datetimebox-f"); -$(_c2f).datebox("calendar").calendar({onSelect:function(date){ -opts.onSelect.call(this.target,date); -}}); -if(!_c30.spinner){ -var _c32=$(_c2f).datebox("panel"); -var p=$("
                                                                                                                                                          ").insertAfter(_c32.children("div.datebox-calendar-inner")); -_c30.spinner=p.children("input"); -} -_c30.spinner.timespinner({width:opts.spinnerWidth,showSeconds:opts.showSeconds,separator:opts.timeSeparator}); -$(_c2f).datetimebox("initValue",opts.value); -}; -function _c33(_c34){ -var c=$(_c34).datetimebox("calendar"); -var t=$(_c34).datetimebox("spinner"); -var date=c.calendar("options").current; -return new Date(date.getFullYear(),date.getMonth(),date.getDate(),t.timespinner("getHours"),t.timespinner("getMinutes"),t.timespinner("getSeconds")); -}; -function _c35(_c36,q){ -_c37(_c36,q,true); -}; -function _c38(_c39){ -var opts=$.data(_c39,"datetimebox").options; -var date=_c33(_c39); -_c37(_c39,opts.formatter.call(_c39,date)); -$(_c39).combo("hidePanel"); -}; -function _c37(_c3a,_c3b,_c3c){ -var opts=$.data(_c3a,"datetimebox").options; -$(_c3a).combo("setValue",_c3b); -if(!_c3c){ -if(_c3b){ -var date=opts.parser.call(_c3a,_c3b); -$(_c3a).combo("setText",opts.formatter.call(_c3a,date)); -$(_c3a).combo("setValue",opts.formatter.call(_c3a,date)); -}else{ -$(_c3a).combo("setText",_c3b); -} -} -var date=opts.parser.call(_c3a,_c3b); -$(_c3a).datetimebox("calendar").calendar("moveTo",date); -$(_c3a).datetimebox("spinner").timespinner("setValue",_c3d(date)); -function _c3d(date){ -function _c3e(_c3f){ -return (_c3f<10?"0":"")+_c3f; -}; -var tt=[_c3e(date.getHours()),_c3e(date.getMinutes())]; -if(opts.showSeconds){ -tt.push(_c3e(date.getSeconds())); -} -return tt.join($(_c3a).datetimebox("spinner").timespinner("options").separator); -}; -}; -$.fn.datetimebox=function(_c40,_c41){ -if(typeof _c40=="string"){ -var _c42=$.fn.datetimebox.methods[_c40]; -if(_c42){ -return _c42(this,_c41); -}else{ -return this.datebox(_c40,_c41); -} -} -_c40=_c40||{}; -return this.each(function(){ -var _c43=$.data(this,"datetimebox"); -if(_c43){ -$.extend(_c43.options,_c40); -}else{ -$.data(this,"datetimebox",{options:$.extend({},$.fn.datetimebox.defaults,$.fn.datetimebox.parseOptions(this),_c40)}); -} -_c2e(this); -}); -}; -$.fn.datetimebox.methods={options:function(jq){ -var _c44=jq.datebox("options"); -return $.extend($.data(jq[0],"datetimebox").options,{originalValue:_c44.originalValue,disabled:_c44.disabled,readonly:_c44.readonly}); -},cloneFrom:function(jq,from){ -return jq.each(function(){ -$(this).datebox("cloneFrom",from); -$.data(this,"datetimebox",{options:$.extend(true,{},$(from).datetimebox("options")),spinner:$(from).datetimebox("spinner")}); -$(this).removeClass("datebox-f").addClass("datetimebox-f"); -}); -},spinner:function(jq){ -return $.data(jq[0],"datetimebox").spinner; -},initValue:function(jq,_c45){ -return jq.each(function(){ -var opts=$(this).datetimebox("options"); -var _c46=opts.value; -if(_c46){ -_c46=opts.formatter.call(this,opts.parser.call(this,_c46)); -} -$(this).combo("initValue",_c46).combo("setText",_c46); -}); -},setValue:function(jq,_c47){ -return jq.each(function(){ -_c37(this,_c47); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).datetimebox("options"); -$(this).datetimebox("setValue",opts.originalValue); -}); -}}; -$.fn.datetimebox.parseOptions=function(_c48){ -var t=$(_c48); -return $.extend({},$.fn.datebox.parseOptions(_c48),$.parser.parseOptions(_c48,["timeSeparator","spinnerWidth",{showSeconds:"boolean"}])); -}; -$.fn.datetimebox.defaults=$.extend({},$.fn.datebox.defaults,{spinnerWidth:"100%",showSeconds:true,timeSeparator:":",panelEvents:{mousedown:function(e){ -}},keyHandler:{up:function(e){ -},down:function(e){ -},left:function(e){ -},right:function(e){ -},enter:function(e){ -_c38(this); -},query:function(q,e){ -_c35(this,q); -}},buttons:[{text:function(_c49){ -return $(_c49).datetimebox("options").currentText; -},handler:function(_c4a){ -var opts=$(_c4a).datetimebox("options"); -_c37(_c4a,opts.formatter.call(_c4a,new Date())); -$(_c4a).datetimebox("hidePanel"); -}},{text:function(_c4b){ -return $(_c4b).datetimebox("options").okText; -},handler:function(_c4c){ -_c38(_c4c); -}},{text:function(_c4d){ -return $(_c4d).datetimebox("options").closeText; -},handler:function(_c4e){ -$(_c4e).datetimebox("hidePanel"); -}}],formatter:function(date){ -var h=date.getHours(); -var M=date.getMinutes(); -var s=date.getSeconds(); -function _c4f(_c50){ -return (_c50<10?"0":"")+_c50; -}; -var _c51=$(this).datetimebox("spinner").timespinner("options").separator; -var r=$.fn.datebox.defaults.formatter(date)+" "+_c4f(h)+_c51+_c4f(M); -if($(this).datetimebox("options").showSeconds){ -r+=_c51+_c4f(s); -} -return r; -},parser:function(s){ -if($.trim(s)==""){ -return new Date(); -} -var dt=s.split(" "); -var d=$.fn.datebox.defaults.parser(dt[0]); -if(dt.length<2){ -return d; -} -var _c52=$(this).datetimebox("spinner").timespinner("options").separator; -var tt=dt[1].split(_c52); -var hour=parseInt(tt[0],10)||0; -var _c53=parseInt(tt[1],10)||0; -var _c54=parseInt(tt[2],10)||0; -return new Date(d.getFullYear(),d.getMonth(),d.getDate(),hour,_c53,_c54); -}}); -})(jQuery); -(function($){ -function init(_c55){ -var _c56=$("
                                                                                                                                                          "+"
                                                                                                                                                          "+""+""+"
                                                                                                                                                          "+"
                                                                                                                                                          "+"
                                                                                                                                                          "+"
                                                                                                                                                          "+""+"
                                                                                                                                                          ").insertAfter(_c55); -var t=$(_c55); -t.addClass("slider-f").hide(); -var name=t.attr("name"); -if(name){ -_c56.find("input.slider-value").attr("name",name); -t.removeAttr("name").attr("sliderName",name); -} -_c56.bind("_resize",function(e,_c57){ -if($(this).hasClass("easyui-fluid")||_c57){ -_c58(_c55); -} -return false; -}); -return _c56; -}; -function _c58(_c59,_c5a){ -var _c5b=$.data(_c59,"slider"); -var opts=_c5b.options; -var _c5c=_c5b.slider; -if(_c5a){ -if(_c5a.width){ -opts.width=_c5a.width; -} -if(_c5a.height){ -opts.height=_c5a.height; -} -} -_c5c._size(opts); -if(opts.mode=="h"){ -_c5c.css("height",""); -_c5c.children("div").css("height",""); -}else{ -_c5c.css("width",""); -_c5c.children("div").css("width",""); -_c5c.children("div.slider-rule,div.slider-rulelabel,div.slider-inner")._outerHeight(_c5c._outerHeight()); -} -_c5d(_c59); -}; -function _c5e(_c5f){ -var _c60=$.data(_c5f,"slider"); -var opts=_c60.options; -var _c61=_c60.slider; -var aa=opts.mode=="h"?opts.rule:opts.rule.slice(0).reverse(); -if(opts.reversed){ -aa=aa.slice(0).reverse(); -} -_c62(aa); -function _c62(aa){ -var rule=_c61.find("div.slider-rule"); -var _c63=_c61.find("div.slider-rulelabel"); -rule.empty(); -_c63.empty(); -for(var i=0;i").appendTo(rule); -span.css((opts.mode=="h"?"left":"top"),_c64); -if(aa[i]!="|"){ -span=$("").appendTo(_c63); -span.html(aa[i]); -if(opts.mode=="h"){ -span.css({left:_c64,marginLeft:-Math.round(span.outerWidth()/2)}); -}else{ -span.css({top:_c64,marginTop:-Math.round(span.outerHeight()/2)}); -} -} -} -}; -}; -function _c65(_c66){ -var _c67=$.data(_c66,"slider"); -var opts=_c67.options; -var _c68=_c67.slider; -_c68.removeClass("slider-h slider-v slider-disabled"); -_c68.addClass(opts.mode=="h"?"slider-h":"slider-v"); -_c68.addClass(opts.disabled?"slider-disabled":""); -var _c69=_c68.find(".slider-inner"); -_c69.html(""+""); -if(opts.range){ -_c69.append(""+""); -} -_c68.find("a.slider-handle").draggable({axis:opts.mode,cursor:"pointer",disabled:opts.disabled,onDrag:function(e){ -var left=e.data.left; -var _c6a=_c68.width(); -if(opts.mode!="h"){ -left=e.data.top; -_c6a=_c68.height(); -} -if(left<0||left>_c6a){ -return false; -}else{ -_c6b(left,this); -return false; -} -},onStartDrag:function(){ -_c67.isDragging=true; -opts.onSlideStart.call(_c66,opts.value); -},onStopDrag:function(e){ -_c6b(opts.mode=="h"?e.data.left:e.data.top,this); -opts.onSlideEnd.call(_c66,opts.value); -opts.onComplete.call(_c66,opts.value); -_c67.isDragging=false; -}}); -_c68.find("div.slider-inner").unbind(".slider").bind("mousedown.slider",function(e){ -if(_c67.isDragging||opts.disabled){ -return; -} -var pos=$(this).offset(); -_c6b(opts.mode=="h"?(e.pageX-pos.left):(e.pageY-pos.top)); -opts.onComplete.call(_c66,opts.value); -}); -function _c6c(_c6d){ -var dd=String(opts.step).split("."); -var dlen=dd.length>1?dd[1].length:0; -return parseFloat(_c6d.toFixed(dlen)); -}; -function _c6b(pos,_c6e){ -var _c6f=_c70(_c66,pos); -var s=Math.abs(_c6f%opts.step); -if(s0; -if(_c6f<=v2&&_c71){ -v1=_c6f; -}else{ -if(_c6f>=v1&&(!_c71)){ -v2=_c6f; -} -} -}else{ -if(_c6fv2){ -v2=_c6f; -}else{ -_c6fopts.max){ -_c79=opts.max; -} -var _c7a=$("").appendTo(_c76); -_c7a.attr("name",name); -_c7a.val(_c79); -_c78.push(_c79); -var _c7b=_c76.find(".slider-handle:eq("+i+")"); -var tip=_c7b.next(); -var pos=_c7c(_c73,_c79); -if(opts.showTip){ -tip.show(); -tip.html(opts.tipFormatter.call(_c73,_c79)); -}else{ -tip.hide(); -} -if(opts.mode=="h"){ -var _c7d="left:"+pos+"px;"; -_c7b.attr("style",_c7d); -tip.attr("style",_c7d+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px"); -}else{ -var _c7d="top:"+pos+"px;"; -_c7b.attr("style",_c7d); -tip.attr("style",_c7d+"margin-left:"+(-Math.round(tip.outerWidth()))+"px"); -} -} -opts.value=opts.range?_c78:_c78[0]; -$(_c73).val(opts.range?_c78.join(opts.separator):_c78[0]); -if(_c77.join(",")!=_c78.join(",")){ -opts.onChange.call(_c73,opts.value,(opts.range?_c77:_c77[0])); -} -}; -function _c5d(_c7e){ -var opts=$.data(_c7e,"slider").options; -var fn=opts.onChange; -opts.onChange=function(){ -}; -_c72(_c7e,opts.value); -opts.onChange=fn; -}; -function _c7c(_c7f,_c80){ -var _c81=$.data(_c7f,"slider"); -var opts=_c81.options; -var _c82=_c81.slider; -var size=opts.mode=="h"?_c82.width():_c82.height(); -var pos=opts.converter.toPosition.call(_c7f,_c80,size); -if(opts.mode=="v"){ -pos=_c82.height()-pos; -} -if(opts.reversed){ -pos=size-pos; -} -return pos; -}; -function _c70(_c83,pos){ -var _c84=$.data(_c83,"slider"); -var opts=_c84.options; -var _c85=_c84.slider; -var size=opts.mode=="h"?_c85.width():_c85.height(); -var pos=opts.mode=="h"?(opts.reversed?(size-pos):pos):(opts.reversed?pos:(size-pos)); -var _c86=opts.converter.toValue.call(_c83,pos,size); -return _c86; -}; -$.fn.slider=function(_c87,_c88){ -if(typeof _c87=="string"){ -return $.fn.slider.methods[_c87](this,_c88); -} -_c87=_c87||{}; -return this.each(function(){ -var _c89=$.data(this,"slider"); -if(_c89){ -$.extend(_c89.options,_c87); -}else{ -_c89=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_c87),slider:init(this)}); -$(this)._propAttr("disabled",false); -} -var opts=_c89.options; -opts.min=parseFloat(opts.min); -opts.max=parseFloat(opts.max); -if(opts.range){ -if(!$.isArray(opts.value)){ -opts.value=$.map(String(opts.value).split(opts.separator),function(v){ -return parseFloat(v); -}); -} -if(opts.value.length<2){ -opts.value.push(opts.max); -} -}else{ -opts.value=parseFloat(opts.value); -} -opts.step=parseFloat(opts.step); -opts.originalValue=opts.value; -_c65(this); -_c5e(this); -_c58(this); -}); -}; -$.fn.slider.methods={options:function(jq){ -return $.data(jq[0],"slider").options; -},destroy:function(jq){ -return jq.each(function(){ -$.data(this,"slider").slider.remove(); -$(this).remove(); -}); -},resize:function(jq,_c8a){ -return jq.each(function(){ -_c58(this,_c8a); -}); -},getValue:function(jq){ -return jq.slider("options").value; -},getValues:function(jq){ -return jq.slider("options").value; -},setValue:function(jq,_c8b){ -return jq.each(function(){ -_c72(this,[_c8b]); -}); -},setValues:function(jq,_c8c){ -return jq.each(function(){ -_c72(this,_c8c); -}); -},clear:function(jq){ -return jq.each(function(){ -var opts=$(this).slider("options"); -_c72(this,opts.range?[opts.min,opts.max]:[opts.min]); -}); -},reset:function(jq){ -return jq.each(function(){ -var opts=$(this).slider("options"); -$(this).slider(opts.range?"setValues":"setValue",opts.originalValue); -}); -},enable:function(jq){ -return jq.each(function(){ -$.data(this,"slider").options.disabled=false; -_c65(this); -}); -},disable:function(jq){ -return jq.each(function(){ -$.data(this,"slider").options.disabled=true; -_c65(this); -}); -}}; -$.fn.slider.parseOptions=function(_c8d){ -var t=$(_c8d); -return $.extend({},$.parser.parseOptions(_c8d,["width","height","mode",{reversed:"boolean",showTip:"boolean",range:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)}); -}; -$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,range:false,value:0,separator:",",min:0,max:100,step:1,rule:[],tipFormatter:function(_c8e){ -return _c8e; -},converter:{toPosition:function(_c8f,size){ -var opts=$(this).slider("options"); -var p=(_c8f-opts.min)/(opts.max-opts.min)*size; -return p; -},toValue:function(pos,size){ -var opts=$(this).slider("options"); -var v=opts.min+(opts.max-opts.min)*(pos/size); -return v; -}},onChange:function(_c90,_c91){ -},onSlideStart:function(_c92){ -},onSlideEnd:function(_c93){ -},onComplete:function(_c94){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.easyui.mobile.js b/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.easyui.mobile.js deleted file mode 100644 index e76d4c028..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.easyui.mobile.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -$.fn.navpanel=function(_1,_2){ -if(typeof _1=="string"){ -var _3=$.fn.navpanel.methods[_1]; -return _3?_3(this,_2):this.panel(_1,_2); -}else{ -_1=_1||{}; -return this.each(function(){ -var _4=$.data(this,"navpanel"); -if(_4){ -$.extend(_4.options,_1); -}else{ -_4=$.data(this,"navpanel",{options:$.extend({},$.fn.navpanel.defaults,$.fn.navpanel.parseOptions(this),_1)}); -} -$(this).panel(_4.options); -}); -} -}; -$.fn.navpanel.methods={options:function(jq){ -return $.data(jq[0],"navpanel").options; -}}; -$.fn.navpanel.parseOptions=function(_5){ -return $.extend({},$.fn.panel.parseOptions(_5),$.parser.parseOptions(_5,[])); -}; -$.fn.navpanel.defaults=$.extend({},$.fn.panel.defaults,{fit:true,border:false,cls:"navpanel"}); -$.parser.plugins.push("navpanel"); -})(jQuery); -(function($){ -$(function(){ -$.mobile.init(); -}); -$.mobile={defaults:{animation:"slide",direction:"left",reverseDirections:{up:"down",down:"up",left:"right",right:"left"}},panels:[],init:function(_6){ -$.mobile.panels=[]; -var _7=$(_6||"body").children(".navpanel:visible"); -if(_7.length){ -_7.not(":first").children(".panel-body").navpanel("close"); -var p=_7.eq(0).children(".panel-body"); -$.mobile.panels.push({panel:p,animation:$.mobile.defaults.animation,direction:$.mobile.defaults.direction}); -} -$(document).unbind(".mobile").bind("click.mobile",function(e){ -var a=$(e.target).closest("a"); -if(a.length){ -var _8=$.parser.parseOptions(a[0],["animation","direction",{back:"boolean"}]); -if(_8.back){ -$.mobile.back(); -e.preventDefault(); -}else{ -var _9=$.trim(a.attr("href")); -if(/^#/.test(_9)){ -var to=$(_9); -if(to.length&&to.hasClass("panel-body")){ -$.mobile.go(to,_8.animation,_8.direction); -e.preventDefault(); -} -} -} -} -}); -$(window).unbind(".mobile").bind("hashchange.mobile",function(){ -var _a=$.mobile.panels.length; -if(_a>1){ -var _b=location.hash; -var p=$.mobile.panels[_a-2]; -if(!_b||_b=="#&"+p.panel.attr("id")){ -$.mobile._back(); -} -} -}); -},nav:function(_c,to,_d,_e){ -if(window.WebKitAnimationEvent){ -_d=_d!=undefined?_d:$.mobile.defaults.animation; -_e=_e!=undefined?_e:$.mobile.defaults.direction; -var _f="m-"+_d+(_e?"-"+_e:""); -var p1=$(_c).panel("open").panel("resize").panel("panel"); -var p2=$(to).panel("open").panel("resize").panel("panel"); -p1.add(p2).bind("webkitAnimationEnd",function(){ -$(this).unbind("webkitAnimationEnd"); -var p=$(this).children(".panel-body"); -if($(this).hasClass("m-in")){ -p.panel("open").panel("resize"); -}else{ -p.panel("close"); -} -$(this).removeClass(_f+" m-in m-out"); -}); -p2.addClass(_f+" m-in"); -p1.addClass(_f+" m-out"); -}else{ -$(to).panel("open").panel("resize"); -$(_c).panel("close"); -} -},_go:function(_10,_11,_12){ -_11=_11!=undefined?_11:$.mobile.defaults.animation; -_12=_12!=undefined?_12:$.mobile.defaults.direction; -var _13=$.mobile.panels[$.mobile.panels.length-1].panel; -var to=$(_10); -if(_13[0]!=to[0]){ -$.mobile.nav(_13,to,_11,_12); -$.mobile.panels.push({panel:to,animation:_11,direction:_12}); -} -},_back:function(){ -if($.mobile.panels.length<2){ -return; -} -var p1=$.mobile.panels.pop(); -var p2=$.mobile.panels[$.mobile.panels.length-1]; -var _14=p1.animation; -var _15=$.mobile.defaults.reverseDirections[p1.direction]||""; -$.mobile.nav(p1.panel,p2.panel,_14,_15); -},go:function(_16,_17,_18){ -_17=_17!=undefined?_17:$.mobile.defaults.animation; -_18=_18!=undefined?_18:$.mobile.defaults.direction; -location.hash="#&"+$(_16).attr("id"); -$.mobile._go(_16,_17,_18); -},back:function(){ -history.go(-1); -}}; -$.map(["validatebox","textbox","passwordbox","filebox","searchbox","combo","combobox","combogrid","combotree","combotreegrid","datebox","datetimebox","numberbox","spinner","numberspinner","timespinner","datetimespinner"],function(_19){ -if($.fn[_19]){ -$.extend($.fn[_19].defaults,{iconWidth:28,tipPosition:"bottom"}); -} -}); -$.map(["spinner","numberspinner","timespinner","datetimespinner"],function(_1a){ -if($.fn[_1a]){ -$.extend($.fn[_1a].defaults,{iconWidth:56,spinAlign:"horizontal"}); -} -}); -if($.fn.menu){ -$.extend($.fn.menu.defaults,{itemHeight:30,noline:true}); -} -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.min.js b/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.min.js deleted file mode 100644 index e83647587..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/jquery.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; -}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
                                                                                                                                                          a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
                                                                                                                                                          ","
                                                                                                                                                          "],area:[1,"",""],param:[1,"",""],thead:[1,"","
                                                                                                                                                          "],tr:[2,"","
                                                                                                                                                          "],col:[2,"","
                                                                                                                                                          "],td:[3,"","
                                                                                                                                                          "],_default:l.htmlSerialize?[0,"",""]:[1,"X
                                                                                                                                                          ","
                                                                                                                                                          "]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("").appendTo("body"); -_e.attr("src",window.ActiveXObject?"javascript:false":"about:blank"); -_e.css({position:"absolute",top:-1000,left:-1000}); -_e.bind("load",cb); -_f(_b); -function _f(_10){ -var _11=$(_a); -if(_c.url){ -_11.attr("action",_c.url); -} -var t=_11.attr("target"),a=_11.attr("action"); -_11.attr("target",_d); -var _12=$(); -try{ -for(var n in _10){ -var _13=$("").val(_10[n]).appendTo(_11); -_12=_12.add(_13); -} -_14(); -_11[0].submit(); -} -finally{ -_11.attr("action",a); -t?_11.attr("target",t):_11.removeAttr("target"); -_12.remove(); -} -}; -function _14(){ -var f=$("#"+_d); -if(!f.length){ -return; -} -try{ -var s=f.contents()[0].readyState; -if(s&&s.toLowerCase()=="uninitialized"){ -setTimeout(_14,100); -} -} -catch(e){ -cb(); -} -}; -var _15=10; -function cb(){ -var f=$("#"+_d); -if(!f.length){ -return; -} -f.unbind(); -var _16=""; -try{ -var _17=f.contents().find("body"); -_16=_17.html(); -if(_16==""){ -if(--_15){ -setTimeout(cb,100); -return; -} -} -var ta=_17.find(">textarea"); -if(ta.length){ -_16=ta.val(); -}else{ -var pre=_17.find(">pre"); -if(pre.length){ -_16=pre.html(); -} -} -} -catch(e){ -} -_c.success.call(_a,_16); -setTimeout(function(){ -f.unbind(); -f.remove(); -},100); -}; -}; -function _9(_18,_19){ -var _1a=$.data(_18,"form").options; -var _1b=new FormData($(_18)[0]); -for(var _1c in _19){ -_1b.append(_1c,_19[_1c]); -} -$.ajax({url:_1a.url,type:"post",xhr:function(){ -var xhr=$.ajaxSettings.xhr(); -if(xhr.upload){ -xhr.upload.addEventListener("progress",function(e){ -if(e.lengthComputable){ -var _1d=e.total; -var _1e=e.loaded||e.position; -var _1f=Math.ceil(_1e*100/_1d); -_1a.onProgress.call(_18,_1f); -} -},false); -} -return xhr; -},data:_1b,dataType:"html",cache:false,contentType:false,processData:false,complete:function(res){ -_1a.success.call(_18,res.responseText); -}}); -}; -function _20(_21,_22){ -var _23=$.data(_21,"form").options; -if(typeof _22=="string"){ -var _24={}; -if(_23.onBeforeLoad.call(_21,_24)==false){ -return; -} -$.ajax({url:_22,data:_24,dataType:"json",success:function(_25){ -_26(_25); -},error:function(){ -_23.onLoadError.apply(_21,arguments); -}}); -}else{ -_26(_22); -} -function _26(_27){ -var _28=$(_21); -for(var _29 in _27){ -var val=_27[_29]; -if(!_2a(_29,val)){ -if(!_2b(_29,val)){ -_28.find("input[name=\""+_29+"\"]").val(val); -_28.find("textarea[name=\""+_29+"\"]").val(val); -_28.find("select[name=\""+_29+"\"]").val(val); -} -} -} -_23.onLoadSuccess.call(_21,_27); -_28.form("validate"); -}; -function _2a(_2c,val){ -var cc=$(_21).find("[switchbuttonName=\""+_2c+"\"]"); -if(cc.length){ -cc.switchbutton("uncheck"); -cc.each(function(){ -if(_2d($(this).switchbutton("options").value,val)){ -$(this).switchbutton("check"); -} -}); -return true; -} -cc=$(_21).find("input[name=\""+_2c+"\"][type=radio], input[name=\""+_2c+"\"][type=checkbox]"); -if(cc.length){ -cc._propAttr("checked",false); -cc.each(function(){ -if(_2d($(this).val(),val)){ -$(this)._propAttr("checked",true); -} -}); -return true; -} -return false; -}; -function _2d(v,val){ -if(v==String(val)||$.inArray(v,$.isArray(val)?val:[val])>=0){ -return true; -}else{ -return false; -} -}; -function _2b(_2e,val){ -var _2f=$(_21).find("[textboxName=\""+_2e+"\"],[sliderName=\""+_2e+"\"]"); -if(_2f.length){ -for(var i=0;i<_23.fieldTypes.length;i++){ -var _30=_23.fieldTypes[i]; -var _31=_2f.data(_30); -if(_31){ -if(_31.options.multiple||_31.options.range){ -_2f[_30]("setValues",val); -}else{ -_2f[_30]("setValue",val); -} -return true; -} -} -} -return false; -}; -}; -function _32(_33){ -$("input,select,textarea",_33).each(function(){ -if($(this).hasClass("textbox-value")){ -return; -} -var t=this.type,tag=this.tagName.toLowerCase(); -if(t=="text"||t=="hidden"||t=="password"||tag=="textarea"){ -this.value=""; -}else{ -if(t=="file"){ -var _34=$(this); -if(!_34.hasClass("textbox-value")){ -var _35=_34.clone().val(""); -_35.insertAfter(_34); -if(_34.data("validatebox")){ -_34.validatebox("destroy"); -_35.validatebox(); -}else{ -_34.remove(); -} -} -}else{ -if(t=="checkbox"||t=="radio"){ -this.checked=false; -}else{ -if(tag=="select"){ -this.selectedIndex=-1; -} -} -} -} -}); -var tmp=$(); -var _36=$(_33); -var _37=$.data(_33,"form").options; -for(var i=0;i<_37.fieldTypes.length;i++){ -var _38=_37.fieldTypes[i]; -var _39=_36.find("."+_38+"-f").not(tmp); -if(_39.length&&_39[_38]){ -_39[_38]("clear"); -tmp=tmp.add(_39); -} -} -_36.form("validate"); -}; -function _3a(_3b){ -_3b.reset(); -var _3c=$(_3b); -var _3d=$.data(_3b,"form").options; -for(var i=_3d.fieldTypes.length-1;i>=0;i--){ -var _3e=_3d.fieldTypes[i]; -var _3f=_3c.find("."+_3e+"-f"); -if(_3f.length&&_3f[_3e]){ -_3f[_3e]("reset"); -} -} -_3c.form("validate"); -}; -function _40(_41){ -var _42=$.data(_41,"form").options; -$(_41).unbind(".form"); -if(_42.ajax){ -$(_41).bind("submit.form",function(){ -setTimeout(function(){ -_1(_41,_42); -},0); -return false; -}); -} -$(_41).bind("_change.form",function(e,t){ -if($.inArray(t,_42.dirtyFields)==-1){ -_42.dirtyFields.push(t); -} -_42.onChange.call(this,t); -}).bind("change.form",function(e){ -var t=e.target; -if(!$(t).hasClass("textbox-text")){ -if($.inArray(t,_42.dirtyFields)==-1){ -_42.dirtyFields.push(t); -} -_42.onChange.call(this,t); -} -}); -_43(_41,_42.novalidate); -}; -function _44(_45,_46){ -_46=_46||{}; -var _47=$.data(_45,"form"); -if(_47){ -$.extend(_47.options,_46); -}else{ -$.data(_45,"form",{options:$.extend({},$.fn.form.defaults,$.fn.form.parseOptions(_45),_46)}); -} -}; -function _48(_49){ -if($.fn.validatebox){ -var t=$(_49); -t.find(".validatebox-text:not(:disabled)").validatebox("validate"); -var _4a=t.find(".validatebox-invalid"); -_4a.filter(":not(:disabled):first").focus(); -return _4a.length==0; -} -return true; -}; -function _43(_4b,_4c){ -var _4d=$.data(_4b,"form").options; -_4d.novalidate=_4c; -$(_4b).find(".validatebox-text:not(:disabled)").validatebox(_4c?"disableValidation":"enableValidation"); -}; -$.fn.form=function(_4e,_4f){ -if(typeof _4e=="string"){ -this.each(function(){ -_44(this); -}); -return $.fn.form.methods[_4e](this,_4f); -} -return this.each(function(){ -_44(this,_4e); -_40(this); -}); -}; -$.fn.form.methods={options:function(jq){ -return $.data(jq[0],"form").options; -},submit:function(jq,_50){ -return jq.each(function(){ -_1(this,_50); -}); -},load:function(jq,_51){ -return jq.each(function(){ -_20(this,_51); -}); -},clear:function(jq){ -return jq.each(function(){ -_32(this); -}); -},reset:function(jq){ -return jq.each(function(){ -_3a(this); -}); -},validate:function(jq){ -return _48(jq[0]); -},disableValidation:function(jq){ -return jq.each(function(){ -_43(this,true); -}); -},enableValidation:function(jq){ -return jq.each(function(){ -_43(this,false); -}); -},resetValidation:function(jq){ -return jq.each(function(){ -$(this).find(".validatebox-text:not(:disabled)").validatebox("resetValidation"); -}); -},resetDirty:function(jq){ -return jq.each(function(){ -$(this).form("options").dirtyFields=[]; -}); -}}; -$.fn.form.parseOptions=function(_52){ -var t=$(_52); -return $.extend({},$.parser.parseOptions(_52,[{ajax:"boolean",dirty:"boolean"}]),{url:(t.attr("action")?t.attr("action"):undefined)}); -}; -$.fn.form.defaults={fieldTypes:["tagbox","combobox","combotree","combogrid","combotreegrid","datetimebox","datebox","combo","datetimespinner","timespinner","numberspinner","spinner","slider","searchbox","numberbox","passwordbox","filebox","textbox","switchbutton"],novalidate:false,ajax:true,iframe:true,dirty:false,dirtyFields:[],url:null,queryParams:{},onSubmit:function(_53){ -return $(this).form("validate"); -},onProgress:function(_54){ -},success:function(_55){ -},onBeforeLoad:function(_56){ -},onLoadSuccess:function(_57){ -},onLoadError:function(){ -},onChange:function(_58){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.layout.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.layout.js deleted file mode 100755 index 0acc557b0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.layout.js +++ /dev/null @@ -1,519 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -var _1=false; -function _2(_3,_4){ -var _5=$.data(_3,"layout"); -var _6=_5.options; -var _7=_5.panels; -var cc=$(_3); -if(_4){ -$.extend(_6,{width:_4.width,height:_4.height}); -} -if(_3.tagName.toLowerCase()=="body"){ -cc._size("fit"); -}else{ -cc._size(_6); -} -var _8={top:0,left:0,width:cc.width(),height:cc.height()}; -_9(_a(_7.expandNorth)?_7.expandNorth:_7.north,"n"); -_9(_a(_7.expandSouth)?_7.expandSouth:_7.south,"s"); -_b(_a(_7.expandEast)?_7.expandEast:_7.east,"e"); -_b(_a(_7.expandWest)?_7.expandWest:_7.west,"w"); -_7.center.panel("resize",_8); -function _9(pp,_c){ -if(!pp.length||!_a(pp)){ -return; -} -var _d=pp.panel("options"); -pp.panel("resize",{width:cc.width(),height:_d.height}); -var _e=pp.panel("panel").outerHeight(); -pp.panel("move",{left:0,top:(_c=="n"?0:cc.height()-_e)}); -_8.height-=_e; -if(_c=="n"){ -_8.top+=_e; -if(!_d.split&&_d.border){ -_8.top--; -} -} -if(!_d.split&&_d.border){ -_8.height++; -} -}; -function _b(pp,_f){ -if(!pp.length||!_a(pp)){ -return; -} -var _10=pp.panel("options"); -pp.panel("resize",{width:_10.width,height:_8.height}); -var _11=pp.panel("panel").outerWidth(); -pp.panel("move",{left:(_f=="e"?cc.width()-_11:0),top:_8.top}); -_8.width-=_11; -if(_f=="w"){ -_8.left+=_11; -if(!_10.split&&_10.border){ -_8.left--; -} -} -if(!_10.split&&_10.border){ -_8.width++; -} -}; -}; -function _12(_13){ -var cc=$(_13); -cc.addClass("layout"); -function _14(el){ -var _15=$.fn.layout.parsePanelOptions(el); -if("north,south,east,west,center".indexOf(_15.region)>=0){ -_19(_13,_15,el); -} -}; -var _16=cc.layout("options"); -var _17=_16.onAdd; -_16.onAdd=function(){ -}; -cc.find(">div,>form>div").each(function(){ -_14(this); -}); -_16.onAdd=_17; -cc.append("
                                                                                                                                                          "); -cc.bind("_resize",function(e,_18){ -if($(this).hasClass("easyui-fluid")||_18){ -_2(_13); -} -return false; -}); -}; -function _19(_1a,_1b,el){ -_1b.region=_1b.region||"center"; -var _1c=$.data(_1a,"layout").panels; -var cc=$(_1a); -var dir=_1b.region; -if(_1c[dir].length){ -return; -} -var pp=$(el); -if(!pp.length){ -pp=$("
                                                                                                                                                          ").appendTo(cc); -} -var _1d=$.extend({},$.fn.layout.paneldefaults,{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),doSize:false,collapsible:true,onOpen:function(){ -var _1e=$(this).panel("header").children("div.panel-tool"); -_1e.children("a.panel-tool-collapse").hide(); -var _1f={north:"up",south:"down",east:"right",west:"left"}; -if(!_1f[dir]){ -return; -} -var _20="layout-button-"+_1f[dir]; -var t=_1e.children("a."+_20); -if(!t.length){ -t=$("").addClass(_20).appendTo(_1e); -t.bind("click",{dir:dir},function(e){ -_39(_1a,e.data.dir); -return false; -}); -} -$(this).panel("options").collapsible?t.show():t.hide(); -}},_1b,{cls:((_1b.cls||"")+" layout-panel layout-panel-"+dir),bodyCls:((_1b.bodyCls||"")+" layout-body")}); -pp.panel(_1d); -_1c[dir]=pp; -var _21={north:"s",south:"n",east:"w",west:"e"}; -var _22=pp.panel("panel"); -if(pp.panel("options").split){ -_22.addClass("layout-split-"+dir); -} -_22.resizable($.extend({},{handles:(_21[dir]||""),disabled:(!pp.panel("options").split),onStartResize:function(e){ -_1=true; -if(dir=="north"||dir=="south"){ -var _23=$(">div.layout-split-proxy-v",_1a); -}else{ -var _23=$(">div.layout-split-proxy-h",_1a); -} -var top=0,_24=0,_25=0,_26=0; -var pos={display:"block"}; -if(dir=="north"){ -pos.top=parseInt(_22.css("top"))+_22.outerHeight()-_23.height(); -pos.left=parseInt(_22.css("left")); -pos.width=_22.outerWidth(); -pos.height=_23.height(); -}else{ -if(dir=="south"){ -pos.top=parseInt(_22.css("top")); -pos.left=parseInt(_22.css("left")); -pos.width=_22.outerWidth(); -pos.height=_23.height(); -}else{ -if(dir=="east"){ -pos.top=parseInt(_22.css("top"))||0; -pos.left=parseInt(_22.css("left"))||0; -pos.width=_23.width(); -pos.height=_22.outerHeight(); -}else{ -if(dir=="west"){ -pos.top=parseInt(_22.css("top"))||0; -pos.left=_22.outerWidth()-_23.width(); -pos.width=_23.width(); -pos.height=_22.outerHeight(); -} -} -} -} -_23.css(pos); -$("
                                                                                                                                                          ").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc); -},onResize:function(e){ -if(dir=="north"||dir=="south"){ -var _27=_28(this); -$(this).resizable("options").maxHeight=_27; -var _29=$(">div.layout-split-proxy-v",_1a); -var top=dir=="north"?e.data.height-_29.height():$(_1a).height()-e.data.height; -_29.css("top",top); -}else{ -var _2a=_28(this); -$(this).resizable("options").maxWidth=_2a; -var _29=$(">div.layout-split-proxy-h",_1a); -var _2b=dir=="west"?e.data.width-_29.width():$(_1a).width()-e.data.width; -_29.css("left",_2b); -} -return false; -},onStopResize:function(e){ -cc.children("div.layout-split-proxy-v,div.layout-split-proxy-h").hide(); -pp.panel("resize",e.data); -_2(_1a); -_1=false; -cc.find(">div.layout-mask").remove(); -}},_1b)); -cc.layout("options").onAdd.call(_1a,dir); -function _28(p){ -var _2c="expand"+dir.substring(0,1).toUpperCase()+dir.substring(1); -var _2d=_1c["center"]; -var _2e=(dir=="north"||dir=="south")?"minHeight":"minWidth"; -var _2f=(dir=="north"||dir=="south")?"maxHeight":"maxWidth"; -var _30=(dir=="north"||dir=="south")?"_outerHeight":"_outerWidth"; -var _31=$.parser.parseValue(_2f,_1c[dir].panel("options")[_2f],$(_1a)); -var _32=$.parser.parseValue(_2e,_2d.panel("options")[_2e],$(_1a)); -var _33=_2d.panel("panel")[_30]()-_32; -if(_a(_1c[_2c])){ -_33+=_1c[_2c][_30]()-1; -}else{ -_33+=$(p)[_30](); -} -if(_33>_31){ -_33=_31; -} -return _33; -}; -}; -function _34(_35,_36){ -var _37=$.data(_35,"layout").panels; -if(_37[_36].length){ -_37[_36].panel("destroy"); -_37[_36]=$(); -var _38="expand"+_36.substring(0,1).toUpperCase()+_36.substring(1); -if(_37[_38]){ -_37[_38].panel("destroy"); -_37[_38]=undefined; -} -$(_35).layout("options").onRemove.call(_35,_36); -} -}; -function _39(_3a,_3b,_3c){ -if(_3c==undefined){ -_3c="normal"; -} -var _3d=$.data(_3a,"layout").panels; -var p=_3d[_3b]; -var _3e=p.panel("options"); -if(_3e.onBeforeCollapse.call(p)==false){ -return; -} -var _3f="expand"+_3b.substring(0,1).toUpperCase()+_3b.substring(1); -if(!_3d[_3f]){ -_3d[_3f]=_40(_3b); -var ep=_3d[_3f].panel("panel"); -if(!_3e.expandMode){ -ep.css("cursor","default"); -}else{ -ep.bind("click",function(){ -if(_3e.expandMode=="dock"){ -_4f(_3a,_3b); -}else{ -p.panel("expand",false).panel("open"); -var _41=_42(); -p.panel("resize",_41.collapse); -p.panel("panel").unbind(".layout").bind("mouseleave.layout",{region:_3b},function(e){ -$(this).stop(true,true); -if(_1==true){ -return; -} -if($("body>div.combo-p>div.combo-panel:visible").length){ -return; -} -_39(_3a,e.data.region); -}); -p.panel("panel").animate(_41.expand,function(){ -$(_3a).layout("options").onExpand.call(_3a,_3b); -}); -} -return false; -}); -} -} -var _43=_42(); -if(!_a(_3d[_3f])){ -_3d.center.panel("resize",_43.resizeC); -} -p.panel("panel").animate(_43.collapse,_3c,function(){ -p.panel("collapse",false).panel("close"); -_3d[_3f].panel("open").panel("resize",_43.expandP); -$(this).unbind(".layout"); -$(_3a).layout("options").onCollapse.call(_3a,_3b); -}); -function _40(dir){ -var _44={"east":"left","west":"right","north":"down","south":"up"}; -var _45=(_3e.region=="north"||_3e.region=="south"); -var _46="layout-button-"+_44[dir]; -var p=$("
                                                                                                                                                          ").appendTo(_3a); -p.panel($.extend({},$.fn.layout.paneldefaults,{cls:("layout-expand layout-expand-"+dir),title:" ",titleDirection:_3e.titleDirection,iconCls:(_3e.hideCollapsedContent?null:_3e.iconCls),closed:true,minWidth:0,minHeight:0,doSize:false,region:_3e.region,collapsedSize:_3e.collapsedSize,noheader:(!_45&&_3e.hideExpandTool),tools:((_45&&_3e.hideExpandTool)?null:[{iconCls:_46,handler:function(){ -_4f(_3a,_3b); -return false; -}}]),onResize:function(){ -var _47=$(this).children(".layout-expand-title"); -if(_47.length){ -_47._outerWidth($(this).height()); -var _48=($(this).width()-Math.min(_47._outerWidth(),_47._outerHeight()))/2; -var top=Math.max(_47._outerWidth(),_47._outerHeight()); -if(_47.hasClass("layout-expand-title-down")){ -_48+=Math.min(_47._outerWidth(),_47._outerHeight()); -top=0; -} -_47.css({left:(_48+"px"),top:(top+"px")}); -} -}})); -if(!_3e.hideCollapsedContent){ -var _49=typeof _3e.collapsedContent=="function"?_3e.collapsedContent.call(p[0],_3e.title):_3e.collapsedContent; -_45?p.panel("setTitle",_49):p.html(_49); -} -p.panel("panel").hover(function(){ -$(this).addClass("layout-expand-over"); -},function(){ -$(this).removeClass("layout-expand-over"); -}); -return p; -}; -function _42(){ -var cc=$(_3a); -var _4a=_3d.center.panel("options"); -var _4b=_3e.collapsedSize; -if(_3b=="east"){ -var _4c=p.panel("panel")._outerWidth(); -var _4d=_4a.width+_4c-_4b; -if(_3e.split||!_3e.border){ -_4d++; -} -return {resizeC:{width:_4d},expand:{left:cc.width()-_4c},expandP:{top:_4a.top,left:cc.width()-_4b,width:_4b,height:_4a.height},collapse:{left:cc.width(),top:_4a.top,height:_4a.height}}; -}else{ -if(_3b=="west"){ -var _4c=p.panel("panel")._outerWidth(); -var _4d=_4a.width+_4c-_4b; -if(_3e.split||!_3e.border){ -_4d++; -} -return {resizeC:{width:_4d,left:_4b-1},expand:{left:0},expandP:{left:0,top:_4a.top,width:_4b,height:_4a.height},collapse:{left:-_4c,top:_4a.top,height:_4a.height}}; -}else{ -if(_3b=="north"){ -var _4e=p.panel("panel")._outerHeight(); -var hh=_4a.height; -if(!_a(_3d.expandNorth)){ -hh+=_4e-_4b+((_3e.split||!_3e.border)?1:0); -} -_3d.east.add(_3d.west).add(_3d.expandEast).add(_3d.expandWest).panel("resize",{top:_4b-1,height:hh}); -return {resizeC:{top:_4b-1,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:_4b},collapse:{top:-_4e,width:cc.width()}}; -}else{ -if(_3b=="south"){ -var _4e=p.panel("panel")._outerHeight(); -var hh=_4a.height; -if(!_a(_3d.expandSouth)){ -hh+=_4e-_4b+((_3e.split||!_3e.border)?1:0); -} -_3d.east.add(_3d.west).add(_3d.expandEast).add(_3d.expandWest).panel("resize",{height:hh}); -return {resizeC:{height:hh},expand:{top:cc.height()-_4e},expandP:{top:cc.height()-_4b,left:0,width:cc.width(),height:_4b},collapse:{top:cc.height(),width:cc.width()}}; -} -} -} -} -}; -}; -function _4f(_50,_51){ -var _52=$.data(_50,"layout").panels; -var p=_52[_51]; -var _53=p.panel("options"); -if(_53.onBeforeExpand.call(p)==false){ -return; -} -var _54="expand"+_51.substring(0,1).toUpperCase()+_51.substring(1); -if(_52[_54]){ -_52[_54].panel("close"); -p.panel("panel").stop(true,true); -p.panel("expand",false).panel("open"); -var _55=_56(); -p.panel("resize",_55.collapse); -p.panel("panel").animate(_55.expand,function(){ -_2(_50); -$(_50).layout("options").onExpand.call(_50,_51); -}); -} -function _56(){ -var cc=$(_50); -var _57=_52.center.panel("options"); -if(_51=="east"&&_52.expandEast){ -return {collapse:{left:cc.width(),top:_57.top,height:_57.height},expand:{left:cc.width()-p.panel("panel")._outerWidth()}}; -}else{ -if(_51=="west"&&_52.expandWest){ -return {collapse:{left:-p.panel("panel")._outerWidth(),top:_57.top,height:_57.height},expand:{left:0}}; -}else{ -if(_51=="north"&&_52.expandNorth){ -return {collapse:{top:-p.panel("panel")._outerHeight(),width:cc.width()},expand:{top:0}}; -}else{ -if(_51=="south"&&_52.expandSouth){ -return {collapse:{top:cc.height(),width:cc.width()},expand:{top:cc.height()-p.panel("panel")._outerHeight()}}; -} -} -} -} -}; -}; -function _a(pp){ -if(!pp){ -return false; -} -if(pp.length){ -return pp.panel("panel").is(":visible"); -}else{ -return false; -} -}; -function _58(_59){ -var _5a=$.data(_59,"layout"); -var _5b=_5a.options; -var _5c=_5a.panels; -var _5d=_5b.onCollapse; -_5b.onCollapse=function(){ -}; -_5e("east"); -_5e("west"); -_5e("north"); -_5e("south"); -_5b.onCollapse=_5d; -function _5e(_5f){ -var p=_5c[_5f]; -if(p.length&&p.panel("options").collapsed){ -_39(_59,_5f,0); -} -}; -}; -function _60(_61,_62,_63){ -var p=$(_61).layout("panel",_62); -p.panel("options").split=_63; -var cls="layout-split-"+_62; -var _64=p.panel("panel").removeClass(cls); -if(_63){ -_64.addClass(cls); -} -_64.resizable({disabled:(!_63)}); -_2(_61); -}; -$.fn.layout=function(_65,_66){ -if(typeof _65=="string"){ -return $.fn.layout.methods[_65](this,_66); -} -_65=_65||{}; -return this.each(function(){ -var _67=$.data(this,"layout"); -if(_67){ -$.extend(_67.options,_65); -}else{ -var _68=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_65); -$.data(this,"layout",{options:_68,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}}); -_12(this); -} -_2(this); -_58(this); -}); -}; -$.fn.layout.methods={options:function(jq){ -return $.data(jq[0],"layout").options; -},resize:function(jq,_69){ -return jq.each(function(){ -_2(this,_69); -}); -},panel:function(jq,_6a){ -return $.data(jq[0],"layout").panels[_6a]; -},collapse:function(jq,_6b){ -return jq.each(function(){ -_39(this,_6b); -}); -},expand:function(jq,_6c){ -return jq.each(function(){ -_4f(this,_6c); -}); -},add:function(jq,_6d){ -return jq.each(function(){ -_19(this,_6d); -_2(this); -if($(this).layout("panel",_6d.region).panel("options").collapsed){ -_39(this,_6d.region,0); -} -}); -},remove:function(jq,_6e){ -return jq.each(function(){ -_34(this,_6e); -_2(this); -}); -},split:function(jq,_6f){ -return jq.each(function(){ -_60(this,_6f,true); -}); -},unsplit:function(jq,_70){ -return jq.each(function(){ -_60(this,_70,false); -}); -}}; -$.fn.layout.parseOptions=function(_71){ -return $.extend({},$.parser.parseOptions(_71,[{fit:"boolean"}])); -}; -$.fn.layout.defaults={fit:false,onExpand:function(_72){ -},onCollapse:function(_73){ -},onAdd:function(_74){ -},onRemove:function(_75){ -}}; -$.fn.layout.parsePanelOptions=function(_76){ -var t=$(_76); -return $.extend({},$.fn.panel.parseOptions(_76),$.parser.parseOptions(_76,["region",{split:"boolean",collpasedSize:"number",minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number"}])); -}; -$.fn.layout.paneldefaults=$.extend({},$.fn.panel.defaults,{region:null,split:false,collapsedSize:28,expandMode:"float",hideExpandTool:false,hideCollapsedContent:true,collapsedContent:function(_77){ -var p=$(this); -var _78=p.panel("options"); -if(_78.region=="north"||_78.region=="south"){ -return _77; -} -var cc=[]; -if(_78.iconCls){ -cc.push("
                                                                                                                                                          "); -} -cc.push("
                                                                                                                                                          "); -cc.push(_77); -cc.push("
                                                                                                                                                          "); -return cc.join(""); -},minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.linkbutton.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.linkbutton.js deleted file mode 100755 index 65d6fb8b1..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.linkbutton.js +++ /dev/null @@ -1,184 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2,_3){ -var _4=$.data(_2,"linkbutton").options; -if(_3){ -$.extend(_4,_3); -} -if(_4.width||_4.height||_4.fit){ -var _5=$(_2); -var _6=_5.parent(); -var _7=_5.is(":visible"); -if(!_7){ -var _8=$("
                                                                                                                                                          ").insertBefore(_2); -var _9={position:_5.css("position"),display:_5.css("display"),left:_5.css("left")}; -_5.appendTo("body"); -_5.css({position:"absolute",display:"inline-block",left:-20000}); -} -_5._size(_4,_6); -var _a=_5.find(".l-btn-left"); -_a.css("margin-top",0); -_a.css("margin-top",parseInt((_5.height()-_a.height())/2)+"px"); -if(!_7){ -_5.insertAfter(_8); -_5.css(_9); -_8.remove(); -} -} -}; -function _b(_c){ -var _d=$.data(_c,"linkbutton").options; -var t=$(_c).empty(); -t.addClass("l-btn").removeClass("l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline"); -t.removeClass("l-btn-small l-btn-medium l-btn-large").addClass("l-btn-"+_d.size); -if(_d.plain){ -t.addClass("l-btn-plain"); -} -if(_d.outline){ -t.addClass("l-btn-outline"); -} -if(_d.selected){ -t.addClass(_d.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); -} -t.attr("group",_d.group||""); -t.attr("id",_d.id||""); -var _e=$("").appendTo(t); -if(_d.text){ -$("").html(_d.text).appendTo(_e); -}else{ -$(" ").appendTo(_e); -} -if(_d.iconCls){ -$(" ").addClass(_d.iconCls).appendTo(_e); -_e.addClass("l-btn-icon-"+_d.iconAlign); -} -t.unbind(".linkbutton").bind("focus.linkbutton",function(){ -if(!_d.disabled){ -$(this).addClass("l-btn-focus"); -} -}).bind("blur.linkbutton",function(){ -$(this).removeClass("l-btn-focus"); -}).bind("click.linkbutton",function(){ -if(!_d.disabled){ -if(_d.toggle){ -if(_d.selected){ -$(this).linkbutton("unselect"); -}else{ -$(this).linkbutton("select"); -} -} -_d.onClick.call(this); -} -}); -_f(_c,_d.selected); -_10(_c,_d.disabled); -}; -function _f(_11,_12){ -var _13=$.data(_11,"linkbutton").options; -if(_12){ -if(_13.group){ -$("a.l-btn[group=\""+_13.group+"\"]").each(function(){ -var o=$(this).linkbutton("options"); -if(o.toggle){ -$(this).removeClass("l-btn-selected l-btn-plain-selected"); -o.selected=false; -} -}); -} -$(_11).addClass(_13.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected"); -_13.selected=true; -}else{ -if(!_13.group){ -$(_11).removeClass("l-btn-selected l-btn-plain-selected"); -_13.selected=false; -} -} -}; -function _10(_14,_15){ -var _16=$.data(_14,"linkbutton"); -var _17=_16.options; -$(_14).removeClass("l-btn-disabled l-btn-plain-disabled"); -if(_15){ -_17.disabled=true; -var _18=$(_14).attr("href"); -if(_18){ -_16.href=_18; -$(_14).attr("href","javascript:;"); -} -if(_14.onclick){ -_16.onclick=_14.onclick; -_14.onclick=null; -} -_17.plain?$(_14).addClass("l-btn-disabled l-btn-plain-disabled"):$(_14).addClass("l-btn-disabled"); -}else{ -_17.disabled=false; -if(_16.href){ -$(_14).attr("href",_16.href); -} -if(_16.onclick){ -_14.onclick=_16.onclick; -} -} -}; -$.fn.linkbutton=function(_19,_1a){ -if(typeof _19=="string"){ -return $.fn.linkbutton.methods[_19](this,_1a); -} -_19=_19||{}; -return this.each(function(){ -var _1b=$.data(this,"linkbutton"); -if(_1b){ -$.extend(_1b.options,_19); -}else{ -$.data(this,"linkbutton",{options:$.extend({},$.fn.linkbutton.defaults,$.fn.linkbutton.parseOptions(this),_19)}); -$(this)._propAttr("disabled",false); -$(this).bind("_resize",function(e,_1c){ -if($(this).hasClass("easyui-fluid")||_1c){ -_1(this); -} -return false; -}); -} -_b(this); -_1(this); -}); -}; -$.fn.linkbutton.methods={options:function(jq){ -return $.data(jq[0],"linkbutton").options; -},resize:function(jq,_1d){ -return jq.each(function(){ -_1(this,_1d); -}); -},enable:function(jq){ -return jq.each(function(){ -_10(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_10(this,true); -}); -},select:function(jq){ -return jq.each(function(){ -_f(this,true); -}); -},unselect:function(jq){ -return jq.each(function(){ -_f(this,false); -}); -}}; -$.fn.linkbutton.parseOptions=function(_1e){ -var t=$(_1e); -return $.extend({},$.parser.parseOptions(_1e,["id","iconCls","iconAlign","group","size","text",{plain:"boolean",toggle:"boolean",selected:"boolean",outline:"boolean"}]),{disabled:(t.attr("disabled")?true:undefined),text:($.trim(t.html())||undefined),iconCls:(t.attr("icon")||t.attr("iconCls"))}); -}; -$.fn.linkbutton.defaults={id:null,disabled:false,toggle:false,selected:false,outline:false,group:null,plain:false,text:"",iconCls:null,iconAlign:"left",size:"small",onClick:function(){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.maskedbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.maskedbox.js deleted file mode 100644 index 268b285b7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.maskedbox.js +++ /dev/null @@ -1,221 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$(_2).data("maskedbox"); -var _4=_3.options; -$(_2).textbox(_4); -$(_2).maskedbox("initValue",_4.value); -}; -function _5(_6,_7){ -var _8=$(_6).maskedbox("options"); -var tt=(_7||$(_6).maskedbox("getText")||"").split(""); -var vv=[]; -for(var i=0;i<_8.mask.length;i++){ -if(_8.masks[_8.mask[i]]){ -var t=tt[i]; -vv.push(t!=_8.promptChar?t:" "); -} -} -return vv.join(""); -}; -function _9(_a,_b){ -var _c=$(_a).maskedbox("options"); -var cc=_b.split(""); -var tt=[]; -for(var i=0;i<_c.mask.length;i++){ -var m=_c.mask[i]; -var r=_c.masks[m]; -if(r){ -var c=cc.shift(); -if(c!=undefined){ -var d=new RegExp(r,"i"); -if(d.test(c)){ -tt.push(c); -continue; -} -} -tt.push(_c.promptChar); -}else{ -tt.push(m); -} -} -return tt.join(""); -}; -function _d(_e,c){ -var _f=$(_e).maskedbox("options"); -var _10=$(_e).maskedbox("getSelectionRange"); -var _11=_12(_e,_10.start); -var end=_12(_e,_10.end); -if(_11!=-1){ -var r=new RegExp(_f.masks[_f.mask[_11]],"i"); -if(r.test(c)){ -var vv=_5(_e).split(""); -var _13=_11-_14(_e,_11); -var _15=end-_14(_e,end); -vv.splice(_13,_15-_13,c); -$(_e).maskedbox("setValue",_9(_e,vv.join(""))); -_11=_12(_e,++_11); -$(_e).maskedbox("setSelectionRange",{start:_11,end:_11}); -} -} -}; -function _16(_17,_18){ -var _19=$(_17).maskedbox("options"); -var vv=_5(_17).split(""); -var _1a=$(_17).maskedbox("getSelectionRange"); -if(_1a.start==_1a.end){ -if(_18){ -var _1b=_1c(_17,_1a.start); -}else{ -var _1b=_12(_17,_1a.start); -} -var _1d=_1b-_14(_17,_1b); -if(_1d>=0){ -vv.splice(_1d,1); -} -}else{ -var _1b=_12(_17,_1a.start); -var end=_1c(_17,_1a.end); -var _1d=_1b-_14(_17,_1b); -var _1e=end-_14(_17,end); -vv.splice(_1d,_1e-_1d+1); -} -$(_17).maskedbox("setValue",_9(_17,vv.join(""))); -$(_17).maskedbox("setSelectionRange",{start:_1b,end:_1b}); -}; -function _14(_1f,pos){ -var _20=$(_1f).maskedbox("options"); -var _21=0; -if(pos>=_20.mask.length){ -pos--; -} -for(var i=pos;i>=0;i--){ -if(_20.masks[_20.mask[i]]==undefined){ -_21++; -} -} -return _21; -}; -function _12(_22,pos){ -var _23=$(_22).maskedbox("options"); -var m=_23.mask[pos]; -var r=_23.masks[m]; -while(pos<_23.mask.length&&!r){ -pos++; -m=_23.mask[pos]; -r=_23.masks[m]; -} -return pos; -}; -function _1c(_24,pos){ -var _25=$(_24).maskedbox("options"); -var m=_25.mask[--pos]; -var r=_25.masks[m]; -while(pos>=0&&!r){ -pos--; -m=_25.mask[pos]; -r=_25.masks[m]; -} -return pos<0?0:pos; -}; -function _26(e){ -if(e.metaKey||e.ctrlKey){ -return; -} -var _27=e.data.target; -var _28=$(_27).maskedbox("options"); -var _29=[9,13,35,36,37,39]; -if($.inArray(e.keyCode,_29)!=-1){ -return true; -} -if(e.keyCode>=96&&e.keyCode<=105){ -e.keyCode-=48; -} -var c=String.fromCharCode(e.keyCode); -if(e.keyCode>=65&&e.keyCode<=90&&!e.shiftKey){ -c=c.toLowerCase(); -}else{ -if(e.keyCode==189){ -c="-"; -}else{ -if(e.keyCode==187){ -c="+"; -}else{ -if(e.keyCode==190){ -c="."; -} -} -} -} -if(e.keyCode==8){ -_16(_27,true); -}else{ -if(e.keyCode==46){ -_16(_27,false); -}else{ -_d(_27,c); -} -} -return false; -}; -$.extend($.fn.textbox.methods,{inputMask:function(jq,_2a){ -return jq.each(function(){ -var _2b=this; -var _2c=$.extend({},$.fn.maskedbox.defaults,_2a); -$.data(_2b,"maskedbox",{options:_2c}); -var _2d=$(_2b).textbox("textbox"); -_2d.unbind(".maskedbox"); -for(var _2e in _2c.inputEvents){ -_2d.bind(_2e+".maskedbox",{target:_2b},_2c.inputEvents[_2e]); -} -}); -}}); -$.fn.maskedbox=function(_2f,_30){ -if(typeof _2f=="string"){ -var _31=$.fn.maskedbox.methods[_2f]; -if(_31){ -return _31(this,_30); -}else{ -return this.textbox(_2f,_30); -} -} -_2f=_2f||{}; -return this.each(function(){ -var _32=$.data(this,"maskedbox"); -if(_32){ -$.extend(_32.options,_2f); -}else{ -$.data(this,"maskedbox",{options:$.extend({},$.fn.maskedbox.defaults,$.fn.maskedbox.parseOptions(this),_2f)}); -} -_1(this); -}); -}; -$.fn.maskedbox.methods={options:function(jq){ -var _33=jq.textbox("options"); -return $.extend($.data(jq[0],"maskedbox").options,{width:_33.width,value:_33.value,originalValue:_33.originalValue,disabled:_33.disabled,readonly:_33.readonly}); -},initValue:function(jq,_34){ -return jq.each(function(){ -_34=_9(this,_5(this,_34)); -$(this).textbox("initValue",_34); -}); -},setValue:function(jq,_35){ -return jq.each(function(){ -_35=_9(this,_5(this,_35)); -$(this).textbox("setValue",_35); -}); -}}; -$.fn.maskedbox.parseOptions=function(_36){ -var t=$(_36); -return $.extend({},$.fn.textbox.parseOptions(_36),$.parser.parseOptions(_36,["mask","promptChar"]),{}); -}; -$.fn.maskedbox.defaults=$.extend({},$.fn.textbox.defaults,{mask:"",promptChar:"_",masks:{"9":"[0-9]","a":"[a-zA-Z]","*":"[0-9a-zA-Z]"},inputEvents:{keydown:_26}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menu.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menu.js deleted file mode 100755 index 98fcf9b9c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menu.js +++ /dev/null @@ -1,502 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -$(function(){ -$(document).unbind(".menu").bind("mousedown.menu",function(e){ -var m=$(e.target).closest("div.menu,div.combo-p"); -if(m.length){ -return; -} -$("body>div.menu-top:visible").not(".menu-inline").menu("hide"); -_1($("body>div.menu:visible").not(".menu-inline")); -}); -}); -function _2(_3){ -var _4=$.data(_3,"menu").options; -$(_3).addClass("menu-top"); -_4.inline?$(_3).addClass("menu-inline"):$(_3).appendTo("body"); -$(_3).bind("_resize",function(e,_5){ -if($(this).hasClass("easyui-fluid")||_5){ -$(_3).menu("resize",_3); -} -return false; -}); -var _6=_7($(_3)); -for(var i=0;i<_6.length;i++){ -_b(_3,_6[i]); -} -function _7(_8){ -var _9=[]; -_8.addClass("menu"); -_9.push(_8); -if(!_8.hasClass("menu-content")){ -_8.children("div").each(function(){ -var _a=$(this).children("div"); -if(_a.length){ -_a.appendTo("body"); -this.submenu=_a; -var mm=_7(_a); -_9=_9.concat(mm); -} -}); -} -return _9; -}; -}; -function _b(_c,_d){ -var _e=$(_d).addClass("menu"); -if(!_e.data("menu")){ -_e.data("menu",{options:$.parser.parseOptions(_e[0],["width","height"])}); -} -if(!_e.hasClass("menu-content")){ -_e.children("div").each(function(){ -_f(_c,this); -}); -$("
                                                                                                                                                          ").prependTo(_e); -} -_10(_c,_e); -if(!_e.hasClass("menu-inline")){ -_e.hide(); -} -_11(_c,_e); -}; -function _f(_12,div,_13){ -var _14=$(div); -var _15=$.extend({},$.parser.parseOptions(_14[0],["id","name","iconCls","href",{separator:"boolean"}]),{disabled:(_14.attr("disabled")?true:undefined),text:$.trim(_14.html()),onclick:_14[0].onclick},_13||{}); -_15.onclick=_15.onclick||_15.handler||null; -_14.data("menuitem",{options:_15}); -if(_15.separator){ -_14.addClass("menu-sep"); -} -if(!_14.hasClass("menu-sep")){ -_14.addClass("menu-item"); -_14.empty().append($("
                                                                                                                                                          ").html(_15.text)); -if(_15.iconCls){ -$("
                                                                                                                                                          ").addClass(_15.iconCls).appendTo(_14); -} -if(_15.id){ -_14.attr("id",_15.id); -} -if(_15.onclick){ -if(typeof _15.onclick=="string"){ -_14.attr("onclick",_15.onclick); -}else{ -_14[0].onclick=eval(_15.onclick); -} -} -if(_15.disabled){ -_16(_12,_14[0],true); -} -if(_14[0].submenu){ -$("
                                                                                                                                                          ").appendTo(_14); -} -} -}; -function _10(_17,_18){ -var _19=$.data(_17,"menu").options; -var _1a=_18.attr("style")||""; -var _1b=_18.is(":visible"); -_18.css({display:"block",left:-10000,height:"auto",overflow:"hidden"}); -_18.find(".menu-item").each(function(){ -$(this)._outerHeight(_19.itemHeight); -$(this).find(".menu-text").css({height:(_19.itemHeight-2)+"px",lineHeight:(_19.itemHeight-2)+"px"}); -}); -_18.removeClass("menu-noline").addClass(_19.noline?"menu-noline":""); -var _1c=_18.data("menu").options; -var _1d=_1c.width; -var _1e=_1c.height; -if(isNaN(parseInt(_1d))){ -_1d=0; -_18.find("div.menu-text").each(function(){ -if(_1d<$(this).outerWidth()){ -_1d=$(this).outerWidth(); -} -}); -_1d=_1d?_1d+40:""; -} -var _1f=_18.outerHeight(); -if(isNaN(parseInt(_1e))){ -_1e=_1f; -if(_18.hasClass("menu-top")&&_19.alignTo){ -var at=$(_19.alignTo); -var h1=at.offset().top-$(document).scrollTop(); -var h2=$(window)._outerHeight()+$(document).scrollTop()-at.offset().top-at._outerHeight(); -_1e=Math.min(_1e,Math.max(h1,h2)); -}else{ -if(_1e>$(window)._outerHeight()){ -_1e=$(window).height(); -} -} -} -_18.attr("style",_1a); -_18.show(); -_18._size($.extend({},_1c,{width:_1d,height:_1e,minWidth:_1c.minWidth||_19.minWidth,maxWidth:_1c.maxWidth||_19.maxWidth})); -_18.find(".easyui-fluid").triggerHandler("_resize",[true]); -_18.css("overflow",_18.outerHeight()<_1f?"auto":"hidden"); -_18.children("div.menu-line")._outerHeight(_1f-2); -if(!_1b){ -_18.hide(); -} -}; -function _11(_20,_21){ -var _22=$.data(_20,"menu"); -var _23=_22.options; -_21.unbind(".menu"); -for(var _24 in _23.events){ -_21.bind(_24+".menu",{target:_20},_23.events[_24]); -} -}; -function _25(e){ -var _26=e.data.target; -var _27=$.data(_26,"menu"); -if(_27.timer){ -clearTimeout(_27.timer); -_27.timer=null; -} -}; -function _28(e){ -var _29=e.data.target; -var _2a=$.data(_29,"menu"); -if(_2a.options.hideOnUnhover){ -_2a.timer=setTimeout(function(){ -_2b(_29,$(_29).hasClass("menu-inline")); -},_2a.options.duration); -} -}; -function _2c(e){ -var _2d=e.data.target; -var _2e=$(e.target).closest(".menu-item"); -if(_2e.length){ -_2e.siblings().each(function(){ -if(this.submenu){ -_1(this.submenu); -} -$(this).removeClass("menu-active"); -}); -_2e.addClass("menu-active"); -if(_2e.hasClass("menu-item-disabled")){ -_2e.addClass("menu-active-disabled"); -return; -} -var _2f=_2e[0].submenu; -if(_2f){ -$(_2d).menu("show",{menu:_2f,parent:_2e}); -} -} -}; -function _30(e){ -var _31=$(e.target).closest(".menu-item"); -if(_31.length){ -_31.removeClass("menu-active menu-active-disabled"); -var _32=_31[0].submenu; -if(_32){ -if(e.pageX>=parseInt(_32.css("left"))){ -_31.addClass("menu-active"); -}else{ -_1(_32); -} -}else{ -_31.removeClass("menu-active"); -} -} -}; -function _33(e){ -var _34=e.data.target; -var _35=$(e.target).closest(".menu-item"); -if(_35.length){ -var _36=$(_34).data("menu").options; -var _37=_35.data("menuitem").options; -if(_37.disabled){ -return; -} -if(!_35[0].submenu){ -_2b(_34,_36.inline); -if(_37.href){ -location.href=_37.href; -} -} -_35.trigger("mouseenter"); -_36.onClick.call(_34,$(_34).menu("getItem",_35[0])); -} -}; -function _2b(_38,_39){ -var _3a=$.data(_38,"menu"); -if(_3a){ -if($(_38).is(":visible")){ -_1($(_38)); -if(_39){ -$(_38).show(); -}else{ -_3a.options.onHide.call(_38); -} -} -} -return false; -}; -function _3b(_3c,_3d){ -_3d=_3d||{}; -var _3e,top; -var _3f=$.data(_3c,"menu").options; -var _40=$(_3d.menu||_3c); -$(_3c).menu("resize",_40[0]); -if(_40.hasClass("menu-top")){ -$.extend(_3f,_3d); -_3e=_3f.left; -top=_3f.top; -if(_3f.alignTo){ -var at=$(_3f.alignTo); -_3e=at.offset().left; -top=at.offset().top+at._outerHeight(); -if(_3f.align=="right"){ -_3e+=at.outerWidth()-_40.outerWidth(); -} -} -if(_3e+_40.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ -_3e=$(window)._outerWidth()+$(document).scrollLeft()-_40.outerWidth()-5; -} -if(_3e<0){ -_3e=0; -} -top=_41(top,_3f.alignTo); -}else{ -var _42=_3d.parent; -_3e=_42.offset().left+_42.outerWidth()-2; -if(_3e+_40.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){ -_3e=_42.offset().left-_40.outerWidth()+2; -} -top=_41(_42.offset().top-3); -} -function _41(top,_43){ -if(top+_40.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){ -if(_43){ -top=$(_43).offset().top-_40._outerHeight(); -}else{ -top=$(window)._outerHeight()+$(document).scrollTop()-_40.outerHeight(); -} -} -if(top<0){ -top=0; -} -return top; -}; -_40.css(_3f.position.call(_3c,_40[0],_3e,top)); -_40.show(0,function(){ -if(!_40[0].shadow){ -_40[0].shadow=$("
                                                                                                                                                          ").insertAfter(_40); -} -_40[0].shadow.css({display:(_40.hasClass("menu-inline")?"none":"block"),zIndex:$.fn.menu.defaults.zIndex++,left:_40.css("left"),top:_40.css("top"),width:_40.outerWidth(),height:_40.outerHeight()}); -_40.css("z-index",$.fn.menu.defaults.zIndex++); -if(_40.hasClass("menu-top")){ -_3f.onShow.call(_3c); -} -}); -}; -function _1(_44){ -if(_44&&_44.length){ -_45(_44); -_44.find("div.menu-item").each(function(){ -if(this.submenu){ -_1(this.submenu); -} -$(this).removeClass("menu-active"); -}); -} -function _45(m){ -m.stop(true,true); -if(m[0].shadow){ -m[0].shadow.hide(); -} -m.hide(); -}; -}; -function _46(_47,_48){ -var _49=null; -var fn=$.isFunction(_48)?_48:function(_4a){ -for(var p in _48){ -if(_4a[p]!=_48[p]){ -return false; -} -} -return true; -}; -function _4b(_4c){ -_4c.children("div.menu-item").each(function(){ -var _4d=$(this).data("menuitem").options; -if(fn.call(_47,_4d)==true){ -_49=$(_47).menu("getItem",this); -}else{ -if(this.submenu&&!_49){ -_4b(this.submenu); -} -} -}); -}; -_4b($(_47)); -return _49; -}; -function _16(_4e,_4f,_50){ -var t=$(_4f); -if(t.hasClass("menu-item")){ -var _51=t.data("menuitem").options; -_51.disabled=_50; -if(_50){ -t.addClass("menu-item-disabled"); -t[0].onclick=null; -}else{ -t.removeClass("menu-item-disabled"); -t[0].onclick=_51.onclick; -} -} -}; -function _52(_53,_54){ -var _55=$.data(_53,"menu").options; -var _56=$(_53); -if(_54.parent){ -if(!_54.parent.submenu){ -var _57=$("
                                                                                                                                                          ").appendTo("body"); -_54.parent.submenu=_57; -$("
                                                                                                                                                          ").appendTo(_54.parent); -_b(_53,_57); -} -_56=_54.parent.submenu; -} -var div=$("
                                                                                                                                                          ").appendTo(_56); -_f(_53,div,_54); -}; -function _58(_59,_5a){ -function _5b(el){ -if(el.submenu){ -el.submenu.children("div.menu-item").each(function(){ -_5b(this); -}); -var _5c=el.submenu[0].shadow; -if(_5c){ -_5c.remove(); -} -el.submenu.remove(); -} -$(el).remove(); -}; -_5b(_5a); -}; -function _5d(_5e,_5f,_60){ -var _61=$(_5f).parent(); -if(_60){ -$(_5f).show(); -}else{ -$(_5f).hide(); -} -_10(_5e,_61); -}; -function _62(_63){ -$(_63).children("div.menu-item").each(function(){ -_58(_63,this); -}); -if(_63.shadow){ -_63.shadow.remove(); -} -$(_63).remove(); -}; -$.fn.menu=function(_64,_65){ -if(typeof _64=="string"){ -return $.fn.menu.methods[_64](this,_65); -} -_64=_64||{}; -return this.each(function(){ -var _66=$.data(this,"menu"); -if(_66){ -$.extend(_66.options,_64); -}else{ -_66=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_64)}); -_2(this); -} -$(this).css({left:_66.options.left,top:_66.options.top}); -}); -}; -$.fn.menu.methods={options:function(jq){ -return $.data(jq[0],"menu").options; -},show:function(jq,pos){ -return jq.each(function(){ -_3b(this,pos); -}); -},hide:function(jq){ -return jq.each(function(){ -_2b(this); -}); -},destroy:function(jq){ -return jq.each(function(){ -_62(this); -}); -},setText:function(jq,_67){ -return jq.each(function(){ -var _68=$(_67.target).data("menuitem").options; -_68.text=_67.text; -$(_67.target).children("div.menu-text").html(_67.text); -}); -},setIcon:function(jq,_69){ -return jq.each(function(){ -var _6a=$(_69.target).data("menuitem").options; -_6a.iconCls=_69.iconCls; -$(_69.target).children("div.menu-icon").remove(); -if(_69.iconCls){ -$("
                                                                                                                                                          ").addClass(_69.iconCls).appendTo(_69.target); -} -}); -},getItem:function(jq,_6b){ -var _6c=$(_6b).data("menuitem").options; -return $.extend({},_6c,{target:$(_6b)[0]}); -},findItem:function(jq,_6d){ -if(typeof _6d=="string"){ -return _46(jq[0],function(_6e){ -return $("
                                                                                                                                                          "+_6e.text+"
                                                                                                                                                          ").text()==_6d; -}); -}else{ -return _46(jq[0],_6d); -} -},appendItem:function(jq,_6f){ -return jq.each(function(){ -_52(this,_6f); -}); -},removeItem:function(jq,_70){ -return jq.each(function(){ -_58(this,_70); -}); -},enableItem:function(jq,_71){ -return jq.each(function(){ -_16(this,_71,false); -}); -},disableItem:function(jq,_72){ -return jq.each(function(){ -_16(this,_72,true); -}); -},showItem:function(jq,_73){ -return jq.each(function(){ -_5d(this,_73,true); -}); -},hideItem:function(jq,_74){ -return jq.each(function(){ -_5d(this,_74,false); -}); -},resize:function(jq,_75){ -return jq.each(function(){ -_10(this,_75?$(_75):$(this)); -}); -}}; -$.fn.menu.parseOptions=function(_76){ -return $.extend({},$.parser.parseOptions(_76,[{minWidth:"number",itemHeight:"number",duration:"number",hideOnUnhover:"boolean"},{fit:"boolean",inline:"boolean",noline:"boolean"}])); -}; -$.fn.menu.defaults={zIndex:110000,left:0,top:0,alignTo:null,align:"left",minWidth:150,itemHeight:32,duration:100,hideOnUnhover:true,inline:false,fit:false,noline:false,events:{mouseenter:_25,mouseleave:_28,mouseover:_2c,mouseout:_30,click:_33},position:function(_77,_78,top){ -return {left:_78,top:top}; -},onShow:function(){ -},onHide:function(){ -},onClick:function(_79){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menubutton.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menubutton.js deleted file mode 100755 index 6103f3684..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.menubutton.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$.data(_2,"menubutton").options; -var _4=$(_2); -_4.linkbutton(_3); -if(_3.hasDownArrow){ -_4.removeClass(_3.cls.btn1+" "+_3.cls.btn2).addClass("m-btn"); -_4.removeClass("m-btn-small m-btn-medium m-btn-large").addClass("m-btn-"+_3.size); -var _5=_4.find(".l-btn-left"); -$("").addClass(_3.cls.arrow).appendTo(_5); -$("").addClass("m-btn-line").appendTo(_5); -} -$(_2).menubutton("resize"); -if(_3.menu){ -$(_3.menu).menu({duration:_3.duration}); -var _6=$(_3.menu).menu("options"); -var _7=_6.onShow; -var _8=_6.onHide; -$.extend(_6,{onShow:function(){ -var _9=$(this).menu("options"); -var _a=$(_9.alignTo); -var _b=_a.menubutton("options"); -_a.addClass((_b.plain==true)?_b.cls.btn2:_b.cls.btn1); -_7.call(this); -},onHide:function(){ -var _c=$(this).menu("options"); -var _d=$(_c.alignTo); -var _e=_d.menubutton("options"); -_d.removeClass((_e.plain==true)?_e.cls.btn2:_e.cls.btn1); -_8.call(this); -}}); -} -}; -function _f(_10){ -var _11=$.data(_10,"menubutton").options; -var btn=$(_10); -var t=btn.find("."+_11.cls.trigger); -if(!t.length){ -t=btn; -} -t.unbind(".menubutton"); -var _12=null; -t.bind(_11.showEvent+".menubutton",function(){ -if(!_13()){ -_12=setTimeout(function(){ -_14(_10); -},_11.duration); -return false; -} -}).bind(_11.hideEvent+".menubutton",function(){ -if(_12){ -clearTimeout(_12); -} -$(_11.menu).triggerHandler("mouseleave"); -}); -function _13(){ -return $(_10).linkbutton("options").disabled; -}; -}; -function _14(_15){ -var _16=$(_15).menubutton("options"); -if(_16.disabled||!_16.menu){ -return; -} -$("body>div.menu-top").menu("hide"); -var btn=$(_15); -var mm=$(_16.menu); -if(mm.length){ -mm.menu("options").alignTo=btn; -mm.menu("show",{alignTo:btn,align:_16.menuAlign}); -} -btn.blur(); -}; -$.fn.menubutton=function(_17,_18){ -if(typeof _17=="string"){ -var _19=$.fn.menubutton.methods[_17]; -if(_19){ -return _19(this,_18); -}else{ -return this.linkbutton(_17,_18); -} -} -_17=_17||{}; -return this.each(function(){ -var _1a=$.data(this,"menubutton"); -if(_1a){ -$.extend(_1a.options,_17); -}else{ -$.data(this,"menubutton",{options:$.extend({},$.fn.menubutton.defaults,$.fn.menubutton.parseOptions(this),_17)}); -$(this)._propAttr("disabled",false); -} -_1(this); -_f(this); -}); -}; -$.fn.menubutton.methods={options:function(jq){ -var _1b=jq.linkbutton("options"); -return $.extend($.data(jq[0],"menubutton").options,{toggle:_1b.toggle,selected:_1b.selected,disabled:_1b.disabled}); -},destroy:function(jq){ -return jq.each(function(){ -var _1c=$(this).menubutton("options"); -if(_1c.menu){ -$(_1c.menu).menu("destroy"); -} -$(this).remove(); -}); -}}; -$.fn.menubutton.parseOptions=function(_1d){ -var t=$(_1d); -return $.extend({},$.fn.linkbutton.parseOptions(_1d),$.parser.parseOptions(_1d,["menu",{plain:"boolean",hasDownArrow:"boolean",duration:"number"}])); -}; -$.fn.menubutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,hasDownArrow:true,menu:null,menuAlign:"left",duration:100,showEvent:"mouseenter",hideEvent:"mouseleave",cls:{btn1:"m-btn-active",btn2:"m-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn"}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.messager.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.messager.js deleted file mode 100755 index 60ea45909..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.messager.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(){ -$(document).unbind(".messager").bind("keydown.messager",function(e){ -if(e.keyCode==27){ -$("body").children("div.messager-window").children("div.messager-body").each(function(){ -$(this).dialog("close"); -}); -}else{ -if(e.keyCode==9){ -var _2=$("body").children("div.messager-window"); -if(!_2.length){ -return; -} -var _3=_2.find(".messager-input,.messager-button .l-btn"); -for(var i=0;i<_3.length;i++){ -if($(_3[i]).is(":focus")){ -$(_3[i>=_3.length-1?0:i+1]).focus(); -return false; -} -} -}else{ -if(e.keyCode==13){ -var _4=$(e.target).closest("input.messager-input"); -if(_4.length){ -var _5=_4.closest(".messager-body"); -_6(_5,_4.val()); -} -} -} -} -}); -}; -function _7(){ -$(document).unbind(".messager"); -}; -function _8(_9){ -var _a=$.extend({},$.messager.defaults,{modal:false,shadow:false,draggable:false,resizable:false,closed:true,style:{left:"",top:"",right:0,zIndex:$.fn.window.defaults.zIndex++,bottom:-document.body.scrollTop-document.documentElement.scrollTop},title:"",width:300,height:150,minHeight:0,showType:"slide",showSpeed:600,content:_9.msg,timeout:4000},_9); -var _b=$("
                                                                                                                                                          ").appendTo("body"); -_b.dialog($.extend({},_a,{noheader:(_a.title?false:true),openAnimation:(_a.showType),closeAnimation:(_a.showType=="show"?"hide":_a.showType),openDuration:_a.showSpeed,closeDuration:_a.showSpeed,onOpen:function(){ -_b.dialog("dialog").hover(function(){ -if(_a.timer){ -clearTimeout(_a.timer); -} -},function(){ -_c(); -}); -_c(); -function _c(){ -if(_a.timeout>0){ -_a.timer=setTimeout(function(){ -if(_b.length&&_b.data("dialog")){ -_b.dialog("close"); -} -},_a.timeout); -} -}; -if(_9.onOpen){ -_9.onOpen.call(this); -}else{ -_a.onOpen.call(this); -} -},onClose:function(){ -if(_a.timer){ -clearTimeout(_a.timer); -} -if(_9.onClose){ -_9.onClose.call(this); -}else{ -_a.onClose.call(this); -} -_b.dialog("destroy"); -}})); -_b.dialog("dialog").css(_a.style); -_b.dialog("open"); -return _b; -}; -function _d(_e){ -_1(); -var _f=$("
                                                                                                                                                          ").appendTo("body"); -_f.dialog($.extend({},_e,{noheader:(_e.title?false:true),onClose:function(){ -_7(); -if(_e.onClose){ -_e.onClose.call(this); -} -_f.dialog("destroy"); -}})); -var win=_f.dialog("dialog").addClass("messager-window"); -win.find(".dialog-button").addClass("messager-button").find("a:first").focus(); -return _f; -}; -function _6(dlg,_10){ -var _11=dlg.dialog("options"); -dlg.dialog("close"); -_11.fn(_10); -}; -$.messager={show:function(_12){ -return _8(_12); -},alert:function(_13,msg,_14,fn){ -var _15=typeof _13=="object"?_13:{title:_13,msg:msg,icon:_14,fn:fn}; -var cls=_15.icon?"messager-icon messager-"+_15.icon:""; -_15=$.extend({},$.messager.defaults,{content:"
                                                                                                                                                          "+"
                                                                                                                                                          "+_15.msg+"
                                                                                                                                                          "+"
                                                                                                                                                          "},_15); -if(!_15.buttons){ -_15.buttons=[{text:_15.ok,onClick:function(){ -_6(dlg); -}}]; -} -var dlg=_d(_15); -return dlg; -},confirm:function(_16,msg,fn){ -var _17=typeof _16=="object"?_16:{title:_16,msg:msg,fn:fn}; -_17=$.extend({},$.messager.defaults,{content:"
                                                                                                                                                          "+"
                                                                                                                                                          "+_17.msg+"
                                                                                                                                                          "+"
                                                                                                                                                          "},_17); -if(!_17.buttons){ -_17.buttons=[{text:_17.ok,onClick:function(){ -_6(dlg,true); -}},{text:_17.cancel,onClick:function(){ -_6(dlg,false); -}}]; -} -var dlg=_d(_17); -return dlg; -},prompt:function(_18,msg,fn){ -var _19=typeof _18=="object"?_18:{title:_18,msg:msg,fn:fn}; -_19=$.extend({},$.messager.defaults,{content:"
                                                                                                                                                          "+"
                                                                                                                                                          "+_19.msg+"
                                                                                                                                                          "+"
                                                                                                                                                          "+"
                                                                                                                                                          "+"
                                                                                                                                                          "},_19); -if(!_19.buttons){ -_19.buttons=[{text:_19.ok,onClick:function(){ -_6(dlg,dlg.find(".messager-input").val()); -}},{text:_19.cancel,onClick:function(){ -_6(dlg); -}}]; -} -var dlg=_d(_19); -dlg.find(".messager-input").focus(); -return dlg; -},progress:function(_1a){ -var _1b={bar:function(){ -return $("body>div.messager-window").find("div.messager-p-bar"); -},close:function(){ -var dlg=$("body>div.messager-window>div.messager-body:has(div.messager-progress)"); -if(dlg.length){ -dlg.dialog("close"); -} -}}; -if(typeof _1a=="string"){ -var _1c=_1b[_1a]; -return _1c(); -} -_1a=_1a||{}; -var _1d=$.extend({},{title:"",minHeight:0,content:undefined,msg:"",text:undefined,interval:300},_1a); -var dlg=_d($.extend({},$.messager.defaults,{content:"
                                                                                                                                                          "+_1d.msg+"
                                                                                                                                                          ",closable:false,doSize:false},_1d,{onClose:function(){ -if(this.timer){ -clearInterval(this.timer); -} -if(_1a.onClose){ -_1a.onClose.call(this); -}else{ -$.messager.defaults.onClose.call(this); -} -}})); -var bar=dlg.find("div.messager-p-bar"); -bar.progressbar({text:_1d.text}); -dlg.dialog("resize"); -if(_1d.interval){ -dlg[0].timer=setInterval(function(){ -var v=bar.progressbar("getValue"); -v+=10; -if(v>100){ -v=0; -} -bar.progressbar("setValue",v); -},_1d.interval); -} -return dlg; -}}; -$.messager.defaults=$.extend({},$.fn.dialog.defaults,{ok:"Ok",cancel:"Cancel",width:300,height:"auto",minHeight:150,modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,fn:function(){ -}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.mobile.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.mobile.js deleted file mode 100644 index e76d4c028..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.mobile.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -$.fn.navpanel=function(_1,_2){ -if(typeof _1=="string"){ -var _3=$.fn.navpanel.methods[_1]; -return _3?_3(this,_2):this.panel(_1,_2); -}else{ -_1=_1||{}; -return this.each(function(){ -var _4=$.data(this,"navpanel"); -if(_4){ -$.extend(_4.options,_1); -}else{ -_4=$.data(this,"navpanel",{options:$.extend({},$.fn.navpanel.defaults,$.fn.navpanel.parseOptions(this),_1)}); -} -$(this).panel(_4.options); -}); -} -}; -$.fn.navpanel.methods={options:function(jq){ -return $.data(jq[0],"navpanel").options; -}}; -$.fn.navpanel.parseOptions=function(_5){ -return $.extend({},$.fn.panel.parseOptions(_5),$.parser.parseOptions(_5,[])); -}; -$.fn.navpanel.defaults=$.extend({},$.fn.panel.defaults,{fit:true,border:false,cls:"navpanel"}); -$.parser.plugins.push("navpanel"); -})(jQuery); -(function($){ -$(function(){ -$.mobile.init(); -}); -$.mobile={defaults:{animation:"slide",direction:"left",reverseDirections:{up:"down",down:"up",left:"right",right:"left"}},panels:[],init:function(_6){ -$.mobile.panels=[]; -var _7=$(_6||"body").children(".navpanel:visible"); -if(_7.length){ -_7.not(":first").children(".panel-body").navpanel("close"); -var p=_7.eq(0).children(".panel-body"); -$.mobile.panels.push({panel:p,animation:$.mobile.defaults.animation,direction:$.mobile.defaults.direction}); -} -$(document).unbind(".mobile").bind("click.mobile",function(e){ -var a=$(e.target).closest("a"); -if(a.length){ -var _8=$.parser.parseOptions(a[0],["animation","direction",{back:"boolean"}]); -if(_8.back){ -$.mobile.back(); -e.preventDefault(); -}else{ -var _9=$.trim(a.attr("href")); -if(/^#/.test(_9)){ -var to=$(_9); -if(to.length&&to.hasClass("panel-body")){ -$.mobile.go(to,_8.animation,_8.direction); -e.preventDefault(); -} -} -} -} -}); -$(window).unbind(".mobile").bind("hashchange.mobile",function(){ -var _a=$.mobile.panels.length; -if(_a>1){ -var _b=location.hash; -var p=$.mobile.panels[_a-2]; -if(!_b||_b=="#&"+p.panel.attr("id")){ -$.mobile._back(); -} -} -}); -},nav:function(_c,to,_d,_e){ -if(window.WebKitAnimationEvent){ -_d=_d!=undefined?_d:$.mobile.defaults.animation; -_e=_e!=undefined?_e:$.mobile.defaults.direction; -var _f="m-"+_d+(_e?"-"+_e:""); -var p1=$(_c).panel("open").panel("resize").panel("panel"); -var p2=$(to).panel("open").panel("resize").panel("panel"); -p1.add(p2).bind("webkitAnimationEnd",function(){ -$(this).unbind("webkitAnimationEnd"); -var p=$(this).children(".panel-body"); -if($(this).hasClass("m-in")){ -p.panel("open").panel("resize"); -}else{ -p.panel("close"); -} -$(this).removeClass(_f+" m-in m-out"); -}); -p2.addClass(_f+" m-in"); -p1.addClass(_f+" m-out"); -}else{ -$(to).panel("open").panel("resize"); -$(_c).panel("close"); -} -},_go:function(_10,_11,_12){ -_11=_11!=undefined?_11:$.mobile.defaults.animation; -_12=_12!=undefined?_12:$.mobile.defaults.direction; -var _13=$.mobile.panels[$.mobile.panels.length-1].panel; -var to=$(_10); -if(_13[0]!=to[0]){ -$.mobile.nav(_13,to,_11,_12); -$.mobile.panels.push({panel:to,animation:_11,direction:_12}); -} -},_back:function(){ -if($.mobile.panels.length<2){ -return; -} -var p1=$.mobile.panels.pop(); -var p2=$.mobile.panels[$.mobile.panels.length-1]; -var _14=p1.animation; -var _15=$.mobile.defaults.reverseDirections[p1.direction]||""; -$.mobile.nav(p1.panel,p2.panel,_14,_15); -},go:function(_16,_17,_18){ -_17=_17!=undefined?_17:$.mobile.defaults.animation; -_18=_18!=undefined?_18:$.mobile.defaults.direction; -location.hash="#&"+$(_16).attr("id"); -$.mobile._go(_16,_17,_18); -},back:function(){ -history.go(-1); -}}; -$.map(["validatebox","textbox","passwordbox","filebox","searchbox","combo","combobox","combogrid","combotree","combotreegrid","datebox","datetimebox","numberbox","spinner","numberspinner","timespinner","datetimespinner"],function(_19){ -if($.fn[_19]){ -$.extend($.fn[_19].defaults,{iconWidth:28,tipPosition:"bottom"}); -} -}); -$.map(["spinner","numberspinner","timespinner","datetimespinner"],function(_1a){ -if($.fn[_1a]){ -$.extend($.fn[_1a].defaults,{iconWidth:56,spinAlign:"horizontal"}); -} -}); -if($.fn.menu){ -$.extend($.fn.menu.defaults,{itemHeight:30,noline:true}); -} -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberbox.js deleted file mode 100755 index ecae9764a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberbox.js +++ /dev/null @@ -1,184 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$.data(_2,"numberbox"); -var _4=_3.options; -$(_2).addClass("numberbox-f").textbox(_4); -$(_2).textbox("textbox").css({imeMode:"disabled"}); -$(_2).attr("numberboxName",$(_2).attr("textboxName")); -_3.numberbox=$(_2).next(); -_3.numberbox.addClass("numberbox"); -var _5=_4.parser.call(_2,_4.value); -var _6=_4.formatter.call(_2,_5); -$(_2).numberbox("initValue",_5).numberbox("setText",_6); -}; -function _7(_8,_9){ -var _a=$.data(_8,"numberbox"); -var _b=_a.options; -_b.value=parseFloat(_9); -var _9=_b.parser.call(_8,_9); -var _c=_b.formatter.call(_8,_9); -_b.value=_9; -$(_8).textbox("setText",_c).textbox("setValue",_9); -_c=_b.formatter.call(_8,$(_8).textbox("getValue")); -$(_8).textbox("setText",_c); -}; -$.fn.numberbox=function(_d,_e){ -if(typeof _d=="string"){ -var _f=$.fn.numberbox.methods[_d]; -if(_f){ -return _f(this,_e); -}else{ -return this.textbox(_d,_e); -} -} -_d=_d||{}; -return this.each(function(){ -var _10=$.data(this,"numberbox"); -if(_10){ -$.extend(_10.options,_d); -}else{ -_10=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_d)}); -} -_1(this); -}); -}; -$.fn.numberbox.methods={options:function(jq){ -var _11=jq.data("textbox")?jq.textbox("options"):{}; -return $.extend($.data(jq[0],"numberbox").options,{width:_11.width,originalValue:_11.originalValue,disabled:_11.disabled,readonly:_11.readonly}); -},cloneFrom:function(jq,_12){ -return jq.each(function(){ -$(this).textbox("cloneFrom",_12); -$.data(this,"numberbox",{options:$.extend(true,{},$(_12).numberbox("options"))}); -$(this).addClass("numberbox-f"); -}); -},fix:function(jq){ -return jq.each(function(){ -var _13=$(this).numberbox("options"); -_13.value=null; -var _14=_13.parser.call(this,$(this).numberbox("getText")); -$(this).numberbox("setValue",_14); -}); -},setValue:function(jq,_15){ -return jq.each(function(){ -_7(this,_15); -}); -},clear:function(jq){ -return jq.each(function(){ -$(this).textbox("clear"); -$(this).numberbox("options").value=""; -}); -},reset:function(jq){ -return jq.each(function(){ -$(this).textbox("reset"); -$(this).numberbox("setValue",$(this).numberbox("getValue")); -}); -}}; -$.fn.numberbox.parseOptions=function(_16){ -var t=$(_16); -return $.extend({},$.fn.textbox.parseOptions(_16),$.parser.parseOptions(_16,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined)}); -}; -$.fn.numberbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{keypress:function(e){ -var _17=e.data.target; -var _18=$(_17).numberbox("options"); -return _18.filter.call(_17,e); -},blur:function(e){ -$(e.data.target).numberbox("fix"); -},keydown:function(e){ -if(e.keyCode==13){ -$(e.data.target).numberbox("fix"); -} -}},min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",filter:function(e){ -var _19=$(this).numberbox("options"); -var s=$(this).numberbox("getText"); -if(e.metaKey||e.ctrlKey){ -return true; -} -if($.inArray(String(e.which),["46","8","13","0"])>=0){ -return true; -} -var tmp=$(""); -tmp.html(String.fromCharCode(e.which)); -var c=tmp.text(); -tmp.remove(); -if(!c){ -return true; -} -if(c=="-"||c==_19.decimalSeparator){ -return (s.indexOf(c)==-1)?true:false; -}else{ -if(c==_19.groupSeparator){ -return true; -}else{ -if("0123456789".indexOf(c)>=0){ -return true; -}else{ -return false; -} -} -} -},formatter:function(_1a){ -if(!_1a){ -return _1a; -} -_1a=_1a+""; -var _1b=$(this).numberbox("options"); -var s1=_1a,s2=""; -var _1c=_1a.indexOf("."); -if(_1c>=0){ -s1=_1a.substring(0,_1c); -s2=_1a.substring(_1c+1,_1a.length); -} -if(_1b.groupSeparator){ -var p=/(\d+)(\d{3})/; -while(p.test(s1)){ -s1=s1.replace(p,"$1"+_1b.groupSeparator+"$2"); -} -} -if(s2){ -return _1b.prefix+s1+_1b.decimalSeparator+s2+_1b.suffix; -}else{ -return _1b.prefix+s1+_1b.suffix; -} -},parser:function(s){ -s=s+""; -var _1d=$(this).numberbox("options"); -if(_1d.prefix){ -s=$.trim(s.replace(new RegExp("\\"+$.trim(_1d.prefix),"g"),"")); -} -if(_1d.suffix){ -s=$.trim(s.replace(new RegExp("\\"+$.trim(_1d.suffix),"g"),"")); -} -if(parseFloat(s)!=_1d.value){ -if(_1d.groupSeparator){ -s=$.trim(s.replace(new RegExp("\\"+_1d.groupSeparator,"g"),"")); -} -if(_1d.decimalSeparator){ -s=$.trim(s.replace(new RegExp("\\"+_1d.decimalSeparator,"g"),".")); -} -s=s.replace(/\s/g,""); -} -var val=parseFloat(s).toFixed(_1d.precision); -if(isNaN(val)){ -val=""; -}else{ -if(typeof (_1d.min)=="number"&&val<_1d.min){ -val=_1d.min.toFixed(_1d.precision); -}else{ -if(typeof (_1d.max)=="number"&&val>_1d.max){ -val=_1d.max.toFixed(_1d.precision); -} -} -} -return val; -}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberspinner.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberspinner.js deleted file mode 100755 index f27138e47..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.numberspinner.js +++ /dev/null @@ -1,58 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -$(_2).addClass("numberspinner-f"); -var _3=$.data(_2,"numberspinner").options; -$(_2).numberbox($.extend({},_3,{doSize:false})).spinner(_3); -$(_2).numberbox("setValue",_3.value); -}; -function _4(_5,_6){ -var _7=$.data(_5,"numberspinner").options; -var v=parseFloat($(_5).numberbox("getValue")||_7.value)||0; -if(_6){ -v-=_7.increment; -}else{ -v+=_7.increment; -} -$(_5).numberbox("setValue",v); -}; -$.fn.numberspinner=function(_8,_9){ -if(typeof _8=="string"){ -var _a=$.fn.numberspinner.methods[_8]; -if(_a){ -return _a(this,_9); -}else{ -return this.numberbox(_8,_9); -} -} -_8=_8||{}; -return this.each(function(){ -var _b=$.data(this,"numberspinner"); -if(_b){ -$.extend(_b.options,_8); -}else{ -$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_8)}); -} -_1(this); -}); -}; -$.fn.numberspinner.methods={options:function(jq){ -var _c=jq.numberbox("options"); -return $.extend($.data(jq[0],"numberspinner").options,{width:_c.width,value:_c.value,originalValue:_c.originalValue,disabled:_c.disabled,readonly:_c.readonly}); -}}; -$.fn.numberspinner.parseOptions=function(_d){ -return $.extend({},$.fn.spinner.parseOptions(_d),$.fn.numberbox.parseOptions(_d),{}); -}; -$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(_e){ -_4(this,_e); -}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.pagination.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.pagination.js deleted file mode 100755 index 822a613c6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.pagination.js +++ /dev/null @@ -1,296 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$.data(_2,"pagination"); -var _4=_3.options; -var bb=_3.bb={}; -var _5=$(_2).addClass("pagination").html("
                                                                                                                                                          "); -var tr=_5.find("tr"); -var aa=$.extend([],_4.layout); -if(!_4.showPageList){ -_6(aa,"list"); -} -if(!_4.showPageInfo){ -_6(aa,"info"); -} -if(!_4.showRefresh){ -_6(aa,"refresh"); -} -if(aa[0]=="sep"){ -aa.shift(); -} -if(aa[aa.length-1]=="sep"){ -aa.pop(); -} -for(var _7=0;_7"); -ps.bind("change",function(){ -_4.pageSize=parseInt($(this).val()); -_4.onChangePageSize.call(_2,_4.pageSize); -_10(_2,_4.pageNumber); -}); -for(var i=0;i<_4.pageList.length;i++){ -$("").text(_4.pageList[i]).appendTo(ps); -} -$("").append(ps).appendTo(tr); -}else{ -if(_8=="sep"){ -$("
                                                                                                                                                          ").appendTo(tr); -}else{ -if(_8=="first"){ -bb.first=_9("first"); -}else{ -if(_8=="prev"){ -bb.prev=_9("prev"); -}else{ -if(_8=="next"){ -bb.next=_9("next"); -}else{ -if(_8=="last"){ -bb.last=_9("last"); -}else{ -if(_8=="manual"){ -$("").html(_4.beforePageText).appendTo(tr).wrap(""); -bb.num=$("").appendTo(tr).wrap(""); -bb.num.unbind(".pagination").bind("keydown.pagination",function(e){ -if(e.keyCode==13){ -var _a=parseInt($(this).val())||1; -_10(_2,_a); -return false; -} -}); -bb.after=$("").appendTo(tr).wrap(""); -}else{ -if(_8=="refresh"){ -bb.refresh=_9("refresh"); -}else{ -if(_8=="links"){ -$("").appendTo(tr); -}else{ -if(_8=="info"){ -if(_7==aa.length-1){ -$("
                                                                                                                                                          ").appendTo(_5); -}else{ -$("
                                                                                                                                                          ").appendTo(tr); -} -} -} -} -} -} -} -} -} -} -} -} -if(_4.buttons){ -$("
                                                                                                                                                          ").appendTo(tr); -if($.isArray(_4.buttons)){ -for(var i=0;i<_4.buttons.length;i++){ -var _b=_4.buttons[i]; -if(_b=="-"){ -$("
                                                                                                                                                          ").appendTo(tr); -}else{ -var td=$("").appendTo(tr); -var a=$("").appendTo(td); -a[0].onclick=eval(_b.handler||function(){ -}); -a.linkbutton($.extend({},_b,{plain:true})); -} -} -}else{ -var td=$("").appendTo(tr); -$(_4.buttons).appendTo(td).show(); -} -} -$("
                                                                                                                                                          ").appendTo(_5); -function _9(_c){ -var _d=_4.nav[_c]; -var a=$("").appendTo(tr); -a.wrap(""); -a.linkbutton({iconCls:_d.iconCls,plain:true}).unbind(".pagination").bind("click.pagination",function(){ -_d.handler.call(_2); -}); -return a; -}; -function _6(aa,_e){ -var _f=$.inArray(_e,aa); -if(_f>=0){ -aa.splice(_f,1); -} -return aa; -}; -}; -function _10(_11,_12){ -var _13=$.data(_11,"pagination").options; -_14(_11,{pageNumber:_12}); -_13.onSelectPage.call(_11,_13.pageNumber,_13.pageSize); -}; -function _14(_15,_16){ -var _17=$.data(_15,"pagination"); -var _18=_17.options; -var bb=_17.bb; -$.extend(_18,_16||{}); -var ps=$(_15).find("select.pagination-page-list"); -if(ps.length){ -ps.val(_18.pageSize+""); -_18.pageSize=parseInt(ps.val()); -} -var _19=Math.ceil(_18.total/_18.pageSize)||1; -if(_18.pageNumber<1){ -_18.pageNumber=1; -} -if(_18.pageNumber>_19){ -_18.pageNumber=_19; -} -if(_18.total==0){ -_18.pageNumber=0; -_19=0; -} -if(bb.num){ -bb.num.val(_18.pageNumber); -} -if(bb.after){ -bb.after.html(_18.afterPageText.replace(/{pages}/,_19)); -} -var td=$(_15).find("td.pagination-links"); -if(td.length){ -td.empty(); -var _1a=_18.pageNumber-Math.floor(_18.links/2); -if(_1a<1){ -_1a=1; -} -var _1b=_1a+_18.links-1; -if(_1b>_19){ -_1b=_19; -} -_1a=_1b-_18.links+1; -if(_1a<1){ -_1a=1; -} -for(var i=_1a;i<=_1b;i++){ -var a=$("").appendTo(td); -a.linkbutton({plain:true,text:i}); -if(i==_18.pageNumber){ -a.linkbutton("select"); -}else{ -a.unbind(".pagination").bind("click.pagination",{pageNumber:i},function(e){ -_10(_15,e.data.pageNumber); -}); -} -} -} -var _1c=_18.displayMsg; -_1c=_1c.replace(/{from}/,_18.total==0?0:_18.pageSize*(_18.pageNumber-1)+1); -_1c=_1c.replace(/{to}/,Math.min(_18.pageSize*(_18.pageNumber),_18.total)); -_1c=_1c.replace(/{total}/,_18.total); -$(_15).find("div.pagination-info").html(_1c); -if(bb.first){ -bb.first.linkbutton({disabled:((!_18.total)||_18.pageNumber==1)}); -} -if(bb.prev){ -bb.prev.linkbutton({disabled:((!_18.total)||_18.pageNumber==1)}); -} -if(bb.next){ -bb.next.linkbutton({disabled:(_18.pageNumber==_19)}); -} -if(bb.last){ -bb.last.linkbutton({disabled:(_18.pageNumber==_19)}); -} -_1d(_15,_18.loading); -}; -function _1d(_1e,_1f){ -var _20=$.data(_1e,"pagination"); -var _21=_20.options; -_21.loading=_1f; -if(_21.showRefresh&&_20.bb.refresh){ -_20.bb.refresh.linkbutton({iconCls:(_21.loading?"pagination-loading":"pagination-load")}); -} -}; -$.fn.pagination=function(_22,_23){ -if(typeof _22=="string"){ -return $.fn.pagination.methods[_22](this,_23); -} -_22=_22||{}; -return this.each(function(){ -var _24; -var _25=$.data(this,"pagination"); -if(_25){ -_24=$.extend(_25.options,_22); -}else{ -_24=$.extend({},$.fn.pagination.defaults,$.fn.pagination.parseOptions(this),_22); -$.data(this,"pagination",{options:_24}); -} -_1(this); -_14(this); -}); -}; -$.fn.pagination.methods={options:function(jq){ -return $.data(jq[0],"pagination").options; -},loading:function(jq){ -return jq.each(function(){ -_1d(this,true); -}); -},loaded:function(jq){ -return jq.each(function(){ -_1d(this,false); -}); -},refresh:function(jq,_26){ -return jq.each(function(){ -_14(this,_26); -}); -},select:function(jq,_27){ -return jq.each(function(){ -_10(this,_27); -}); -}}; -$.fn.pagination.parseOptions=function(_28){ -var t=$(_28); -return $.extend({},$.parser.parseOptions(_28,[{total:"number",pageSize:"number",pageNumber:"number",links:"number"},{loading:"boolean",showPageList:"boolean",showPageInfo:"boolean",showRefresh:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined)}); -}; -$.fn.pagination.defaults={total:1,pageSize:10,pageNumber:1,pageList:[10,20,30,50],loading:false,buttons:null,showPageList:true,showPageInfo:true,showRefresh:true,links:10,layout:["list","sep","first","prev","sep","manual","sep","next","last","sep","refresh","info"],onSelectPage:function(_29,_2a){ -},onBeforeRefresh:function(_2b,_2c){ -},onRefresh:function(_2d,_2e){ -},onChangePageSize:function(_2f){ -},beforePageText:"Page",afterPageText:"of {pages}",displayMsg:"Displaying {from} to {to} of {total} items",nav:{first:{iconCls:"pagination-first",handler:function(){ -var _30=$(this).pagination("options"); -if(_30.pageNumber>1){ -$(this).pagination("select",1); -} -}},prev:{iconCls:"pagination-prev",handler:function(){ -var _31=$(this).pagination("options"); -if(_31.pageNumber>1){ -$(this).pagination("select",_31.pageNumber-1); -} -}},next:{iconCls:"pagination-next",handler:function(){ -var _32=$(this).pagination("options"); -var _33=Math.ceil(_32.total/_32.pageSize); -if(_32.pageNumber<_33){ -$(this).pagination("select",_32.pageNumber+1); -} -}},last:{iconCls:"pagination-last",handler:function(){ -var _34=$(this).pagination("options"); -var _35=Math.ceil(_34.total/_34.pageSize); -if(_34.pageNumber<_35){ -$(this).pagination("select",_35); -} -}},refresh:{iconCls:"pagination-refresh",handler:function(){ -var _36=$(this).pagination("options"); -if(_36.onBeforeRefresh.call(this,_36.pageNumber,_36.pageSize)!=false){ -$(this).pagination("select",_36.pageNumber); -_36.onRefresh.call(this,_36.pageNumber,_36.pageSize); -} -}}}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.panel.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.panel.js deleted file mode 100755 index 74b25b1fd..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.panel.js +++ /dev/null @@ -1,691 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -$.fn._remove=function(){ -return this.each(function(){ -$(this).remove(); -try{ -this.outerHTML=""; -} -catch(err){ -} -}); -}; -function _1(_2){ -_2._remove(); -}; -function _3(_4,_5){ -var _6=$.data(_4,"panel"); -var _7=_6.options; -var _8=_6.panel; -var _9=_8.children(".panel-header"); -var _a=_8.children(".panel-body"); -var _b=_8.children(".panel-footer"); -var _c=(_7.halign=="left"||_7.halign=="right"); -if(_5){ -$.extend(_7,{width:_5.width,height:_5.height,minWidth:_5.minWidth,maxWidth:_5.maxWidth,minHeight:_5.minHeight,maxHeight:_5.maxHeight,left:_5.left,top:_5.top}); -_7.hasResized=false; -} -var _d=_8.outerWidth(); -var _e=_8.outerHeight(); -_8._size(_7); -var _f=_8.outerWidth(); -var _10=_8.outerHeight(); -if(_7.hasResized&&(_d==_f&&_e==_10)){ -return; -} -_7.hasResized=true; -if(!_c){ -_9._outerWidth(_8.width()); -} -_a._outerWidth(_8.width()); -if(!isNaN(parseInt(_7.height))){ -if(_c){ -if(_7.header){ -var _11=$(_7.header)._outerWidth(); -}else{ -_9.css("width",""); -var _11=_9._outerWidth(); -} -var _12=_9.find(".panel-title"); -_11+=Math.min(_12._outerWidth(),_12._outerHeight()); -var _13=_8.height(); -_9._outerWidth(_11)._outerHeight(_13); -_12._outerWidth(_9.height()); -_a._outerWidth(_8.width()-_11-_b._outerWidth())._outerHeight(_13); -_b._outerHeight(_13); -_a.css({left:"",right:""}).css(_7.halign,(_9.position()[_7.halign]+_11)+"px"); -_7.panelCssWidth=_8.css("width"); -if(_7.collapsed){ -_8._outerWidth(_11+_b._outerWidth()); -} -}else{ -_a._outerHeight(_8.height()-_9._outerHeight()-_b._outerHeight()); -} -}else{ -_a.css("height",""); -var min=$.parser.parseValue("minHeight",_7.minHeight,_8.parent()); -var max=$.parser.parseValue("maxHeight",_7.maxHeight,_8.parent()); -var _14=_9._outerHeight()+_b._outerHeight()+_8._outerHeight()-_8.height(); -_a._size("minHeight",min?(min-_14):""); -_a._size("maxHeight",max?(max-_14):""); -} -_8.css({height:(_c?undefined:""),minHeight:"",maxHeight:"",left:_7.left,top:_7.top}); -_7.onResize.apply(_4,[_7.width,_7.height]); -$(_4).panel("doLayout"); -}; -function _15(_16,_17){ -var _18=$.data(_16,"panel"); -var _19=_18.options; -var _1a=_18.panel; -if(_17){ -if(_17.left!=null){ -_19.left=_17.left; -} -if(_17.top!=null){ -_19.top=_17.top; -} -} -_1a.css({left:_19.left,top:_19.top}); -_1a.find(".tooltip-f").each(function(){ -$(this).tooltip("reposition"); -}); -_19.onMove.apply(_16,[_19.left,_19.top]); -}; -function _1b(_1c){ -$(_1c).addClass("panel-body")._size("clear"); -var _1d=$("
                                                                                                                                                          ").insertBefore(_1c); -_1d[0].appendChild(_1c); -_1d.bind("_resize",function(e,_1e){ -if($(this).hasClass("easyui-fluid")||_1e){ -_3(_1c,{}); -} -return false; -}); -return _1d; -}; -function _1f(_20){ -var _21=$.data(_20,"panel"); -var _22=_21.options; -var _23=_21.panel; -_23.css(_22.style); -_23.addClass(_22.cls); -_23.removeClass("panel-hleft panel-hright").addClass("panel-h"+_22.halign); -_24(); -_25(); -var _26=$(_20).panel("header"); -var _27=$(_20).panel("body"); -var _28=$(_20).siblings(".panel-footer"); -if(_22.border){ -_26.removeClass("panel-header-noborder"); -_27.removeClass("panel-body-noborder"); -_28.removeClass("panel-footer-noborder"); -}else{ -_26.addClass("panel-header-noborder"); -_27.addClass("panel-body-noborder"); -_28.addClass("panel-footer-noborder"); -} -_26.addClass(_22.headerCls); -_27.addClass(_22.bodyCls); -$(_20).attr("id",_22.id||""); -if(_22.content){ -$(_20).panel("clear"); -$(_20).html(_22.content); -$.parser.parse($(_20)); -} -function _24(){ -if(_22.noheader||(!_22.title&&!_22.header)){ -_1(_23.children(".panel-header")); -_23.children(".panel-body").addClass("panel-body-noheader"); -}else{ -if(_22.header){ -$(_22.header).addClass("panel-header").prependTo(_23); -}else{ -var _29=_23.children(".panel-header"); -if(!_29.length){ -_29=$("
                                                                                                                                                          ").prependTo(_23); -} -if(!$.isArray(_22.tools)){ -_29.find("div.panel-tool .panel-tool-a").appendTo(_22.tools); -} -_29.empty(); -var _2a=$("
                                                                                                                                                          ").html(_22.title).appendTo(_29); -if(_22.iconCls){ -_2a.addClass("panel-with-icon"); -$("
                                                                                                                                                          ").addClass(_22.iconCls).appendTo(_29); -} -if(_22.halign=="left"||_22.halign=="right"){ -_2a.addClass("panel-title-"+_22.titleDirection); -} -var _2b=$("
                                                                                                                                                          ").appendTo(_29); -_2b.bind("click",function(e){ -e.stopPropagation(); -}); -if(_22.tools){ -if($.isArray(_22.tools)){ -$.map(_22.tools,function(t){ -_2c(_2b,t.iconCls,eval(t.handler)); -}); -}else{ -$(_22.tools).children().each(function(){ -$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(_2b); -}); -} -} -if(_22.collapsible){ -_2c(_2b,"panel-tool-collapse",function(){ -if(_22.collapsed==true){ -_57(_20,true); -}else{ -_43(_20,true); -} -}); -} -if(_22.minimizable){ -_2c(_2b,"panel-tool-min",function(){ -_62(_20); -}); -} -if(_22.maximizable){ -_2c(_2b,"panel-tool-max",function(){ -if(_22.maximized==true){ -_66(_20); -}else{ -_42(_20); -} -}); -} -if(_22.closable){ -_2c(_2b,"panel-tool-close",function(){ -_44(_20); -}); -} -} -_23.children("div.panel-body").removeClass("panel-body-noheader"); -} -}; -function _2c(c,_2d,_2e){ -var a=$("").addClass(_2d).appendTo(c); -a.bind("click",_2e); -}; -function _25(){ -if(_22.footer){ -$(_22.footer).addClass("panel-footer").appendTo(_23); -$(_20).addClass("panel-body-nobottom"); -}else{ -_23.children(".panel-footer").remove(); -$(_20).removeClass("panel-body-nobottom"); -} -}; -}; -function _2f(_30,_31){ -var _32=$.data(_30,"panel"); -var _33=_32.options; -if(_34){ -_33.queryParams=_31; -} -if(!_33.href){ -return; -} -if(!_32.isLoaded||!_33.cache){ -var _34=$.extend({},_33.queryParams); -if(_33.onBeforeLoad.call(_30,_34)==false){ -return; -} -_32.isLoaded=false; -if(_33.loadingMessage){ -$(_30).panel("clear"); -$(_30).html($("
                                                                                                                                                          ").html(_33.loadingMessage)); -} -_33.loader.call(_30,_34,function(_35){ -var _36=_33.extractor.call(_30,_35); -$(_30).panel("clear"); -$(_30).html(_36); -$.parser.parse($(_30)); -_33.onLoad.apply(_30,arguments); -_32.isLoaded=true; -},function(){ -_33.onLoadError.apply(_30,arguments); -}); -} -}; -function _37(_38){ -var t=$(_38); -t.find(".combo-f").each(function(){ -$(this).combo("destroy"); -}); -t.find(".m-btn").each(function(){ -$(this).menubutton("destroy"); -}); -t.find(".s-btn").each(function(){ -$(this).splitbutton("destroy"); -}); -t.find(".tooltip-f").each(function(){ -$(this).tooltip("destroy"); -}); -t.children("div").each(function(){ -$(this)._size("unfit"); -}); -t.empty(); -}; -function _39(_3a){ -$(_3a).panel("doLayout",true); -}; -function _3b(_3c,_3d){ -var _3e=$.data(_3c,"panel"); -var _3f=_3e.options; -var _40=_3e.panel; -if(_3d!=true){ -if(_3f.onBeforeOpen.call(_3c)==false){ -return; -} -} -_40.stop(true,true); -if($.isFunction(_3f.openAnimation)){ -_3f.openAnimation.call(_3c,cb); -}else{ -switch(_3f.openAnimation){ -case "slide": -_40.slideDown(_3f.openDuration,cb); -break; -case "fade": -_40.fadeIn(_3f.openDuration,cb); -break; -case "show": -_40.show(_3f.openDuration,cb); -break; -default: -_40.show(); -cb(); -} -} -function cb(){ -_3f.closed=false; -_3f.minimized=false; -var _41=_40.children(".panel-header").find("a.panel-tool-restore"); -if(_41.length){ -_3f.maximized=true; -} -_3f.onOpen.call(_3c); -if(_3f.maximized==true){ -_3f.maximized=false; -_42(_3c); -} -if(_3f.collapsed==true){ -_3f.collapsed=false; -_43(_3c); -} -if(!_3f.collapsed){ -if(_3f.href&&(!_3e.isLoaded||!_3f.cache)){ -_2f(_3c); -_39(_3c); -_3f.doneLayout=true; -} -} -if(!_3f.doneLayout){ -_3f.doneLayout=true; -_39(_3c); -} -}; -}; -function _44(_45,_46){ -var _47=$.data(_45,"panel"); -var _48=_47.options; -var _49=_47.panel; -if(_46!=true){ -if(_48.onBeforeClose.call(_45)==false){ -return; -} -} -_49.find(".tooltip-f").each(function(){ -$(this).tooltip("hide"); -}); -_49.stop(true,true); -_49._size("unfit"); -if($.isFunction(_48.closeAnimation)){ -_48.closeAnimation.call(_45,cb); -}else{ -switch(_48.closeAnimation){ -case "slide": -_49.slideUp(_48.closeDuration,cb); -break; -case "fade": -_49.fadeOut(_48.closeDuration,cb); -break; -case "hide": -_49.hide(_48.closeDuration,cb); -break; -default: -_49.hide(); -cb(); -} -} -function cb(){ -_48.closed=true; -_48.onClose.call(_45); -}; -}; -function _4a(_4b,_4c){ -var _4d=$.data(_4b,"panel"); -var _4e=_4d.options; -var _4f=_4d.panel; -if(_4c!=true){ -if(_4e.onBeforeDestroy.call(_4b)==false){ -return; -} -} -$(_4b).panel("clear").panel("clear","footer"); -_1(_4f); -_4e.onDestroy.call(_4b); -}; -function _43(_50,_51){ -var _52=$.data(_50,"panel").options; -var _53=$.data(_50,"panel").panel; -var _54=_53.children(".panel-body"); -var _55=_53.children(".panel-header"); -var _56=_55.find("a.panel-tool-collapse"); -if(_52.collapsed==true){ -return; -} -_54.stop(true,true); -if(_52.onBeforeCollapse.call(_50)==false){ -return; -} -_56.addClass("panel-tool-expand"); -if(_51==true){ -if(_52.halign=="left"||_52.halign=="right"){ -_53.animate({width:_55._outerWidth()+_53.children(".panel-footer")._outerWidth()},function(){ -cb(); -}); -}else{ -_54.slideUp("normal",function(){ -cb(); -}); -} -}else{ -if(_52.halign=="left"||_52.halign=="right"){ -_53._outerWidth(_55._outerWidth()+_53.children(".panel-footer")._outerWidth()); -} -cb(); -} -function cb(){ -_54.hide(); -_52.collapsed=true; -_52.onCollapse.call(_50); -}; -}; -function _57(_58,_59){ -var _5a=$.data(_58,"panel").options; -var _5b=$.data(_58,"panel").panel; -var _5c=_5b.children(".panel-body"); -var _5d=_5b.children(".panel-header").find("a.panel-tool-collapse"); -if(_5a.collapsed==false){ -return; -} -_5c.stop(true,true); -if(_5a.onBeforeExpand.call(_58)==false){ -return; -} -_5d.removeClass("panel-tool-expand"); -if(_59==true){ -if(_5a.halign=="left"||_5a.halign=="right"){ -_5c.show(); -_5b.animate({width:_5a.panelCssWidth},function(){ -cb(); -}); -}else{ -_5c.slideDown("normal",function(){ -cb(); -}); -} -}else{ -if(_5a.halign=="left"||_5a.halign=="right"){ -_5b.css("width",_5a.panelCssWidth); -} -cb(); -} -function cb(){ -_5c.show(); -_5a.collapsed=false; -_5a.onExpand.call(_58); -_2f(_58); -_39(_58); -}; -}; -function _42(_5e){ -var _5f=$.data(_5e,"panel").options; -var _60=$.data(_5e,"panel").panel; -var _61=_60.children(".panel-header").find("a.panel-tool-max"); -if(_5f.maximized==true){ -return; -} -_61.addClass("panel-tool-restore"); -if(!$.data(_5e,"panel").original){ -$.data(_5e,"panel").original={width:_5f.width,height:_5f.height,left:_5f.left,top:_5f.top,fit:_5f.fit}; -} -_5f.left=0; -_5f.top=0; -_5f.fit=true; -_3(_5e); -_5f.minimized=false; -_5f.maximized=true; -_5f.onMaximize.call(_5e); -}; -function _62(_63){ -var _64=$.data(_63,"panel").options; -var _65=$.data(_63,"panel").panel; -_65._size("unfit"); -_65.hide(); -_64.minimized=true; -_64.maximized=false; -_64.onMinimize.call(_63); -}; -function _66(_67){ -var _68=$.data(_67,"panel").options; -var _69=$.data(_67,"panel").panel; -var _6a=_69.children(".panel-header").find("a.panel-tool-max"); -if(_68.maximized==false){ -return; -} -_69.show(); -_6a.removeClass("panel-tool-restore"); -$.extend(_68,$.data(_67,"panel").original); -_3(_67); -_68.minimized=false; -_68.maximized=false; -$.data(_67,"panel").original=null; -_68.onRestore.call(_67); -}; -function _6b(_6c,_6d){ -$.data(_6c,"panel").options.title=_6d; -$(_6c).panel("header").find("div.panel-title").html(_6d); -}; -var _6e=null; -$(window).unbind(".panel").bind("resize.panel",function(){ -if(_6e){ -clearTimeout(_6e); -} -_6e=setTimeout(function(){ -var _6f=$("body.layout"); -if(_6f.length){ -_6f.layout("resize"); -$("body").children(".easyui-fluid:visible").each(function(){ -$(this).triggerHandler("_resize"); -}); -}else{ -$("body").panel("doLayout"); -} -_6e=null; -},100); -}); -$.fn.panel=function(_70,_71){ -if(typeof _70=="string"){ -return $.fn.panel.methods[_70](this,_71); -} -_70=_70||{}; -return this.each(function(){ -var _72=$.data(this,"panel"); -var _73; -if(_72){ -_73=$.extend(_72.options,_70); -_72.isLoaded=false; -}else{ -_73=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_70); -$(this).attr("title",""); -_72=$.data(this,"panel",{options:_73,panel:_1b(this),isLoaded:false}); -} -_1f(this); -$(this).show(); -if(_73.doSize==true){ -_72.panel.css("display","block"); -_3(this); -} -if(_73.closed==true||_73.minimized==true){ -_72.panel.hide(); -}else{ -_3b(this); -} -}); -}; -$.fn.panel.methods={options:function(jq){ -return $.data(jq[0],"panel").options; -},panel:function(jq){ -return $.data(jq[0],"panel").panel; -},header:function(jq){ -return $.data(jq[0],"panel").panel.children(".panel-header"); -},footer:function(jq){ -return jq.panel("panel").children(".panel-footer"); -},body:function(jq){ -return $.data(jq[0],"panel").panel.children(".panel-body"); -},setTitle:function(jq,_74){ -return jq.each(function(){ -_6b(this,_74); -}); -},open:function(jq,_75){ -return jq.each(function(){ -_3b(this,_75); -}); -},close:function(jq,_76){ -return jq.each(function(){ -_44(this,_76); -}); -},destroy:function(jq,_77){ -return jq.each(function(){ -_4a(this,_77); -}); -},clear:function(jq,_78){ -return jq.each(function(){ -_37(_78=="footer"?$(this).panel("footer"):this); -}); -},refresh:function(jq,_79){ -return jq.each(function(){ -var _7a=$.data(this,"panel"); -_7a.isLoaded=false; -if(_79){ -if(typeof _79=="string"){ -_7a.options.href=_79; -}else{ -_7a.options.queryParams=_79; -} -} -_2f(this); -}); -},resize:function(jq,_7b){ -return jq.each(function(){ -_3(this,_7b||{}); -}); -},doLayout:function(jq,all){ -return jq.each(function(){ -_7c(this,"body"); -_7c($(this).siblings(".panel-footer")[0],"footer"); -function _7c(_7d,_7e){ -if(!_7d){ -return; -} -var _7f=_7d==$("body")[0]; -var s=$(_7d).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible,.easyui-fluid:visible").filter(function(_80,el){ -var p=$(el).parents(".panel-"+_7e+":first"); -return _7f?p.length==0:p[0]==_7d; -}); -s.each(function(){ -$(this).triggerHandler("_resize",[all||false]); -}); -}; -}); -},move:function(jq,_81){ -return jq.each(function(){ -_15(this,_81); -}); -},maximize:function(jq){ -return jq.each(function(){ -_42(this); -}); -},minimize:function(jq){ -return jq.each(function(){ -_62(this); -}); -},restore:function(jq){ -return jq.each(function(){ -_66(this); -}); -},collapse:function(jq,_82){ -return jq.each(function(){ -_43(this,_82); -}); -},expand:function(jq,_83){ -return jq.each(function(){ -_57(this,_83); -}); -}}; -$.fn.panel.parseOptions=function(_84){ -var t=$(_84); -var hh=t.children(".panel-header,header"); -var ff=t.children(".panel-footer,footer"); -return $.extend({},$.parser.parseOptions(_84,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href","method","header","footer","halign","titleDirection",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"},"openAnimation","closeAnimation",{openDuration:"number",closeDuration:"number"},]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined),header:(hh.length?hh.removeClass("panel-header"):undefined),footer:(ff.length?ff.removeClass("panel-footer"):undefined)}); -}; -$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,halign:"top",titleDirection:"down",collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,openAnimation:false,openDuration:400,closeAnimation:false,closeDuration:400,tools:null,footer:null,header:null,queryParams:{},method:"get",href:null,loadingMessage:"Loading...",loader:function(_85,_86,_87){ -var _88=$(this).panel("options"); -if(!_88.href){ -return false; -} -$.ajax({type:_88.method,url:_88.href,cache:false,data:_85,dataType:"html",success:function(_89){ -_86(_89); -},error:function(){ -_87.apply(this,arguments); -}}); -},extractor:function(_8a){ -var _8b=/]*>((.|[\n\r])*)<\/body>/im; -var _8c=_8b.exec(_8a); -if(_8c){ -return _8c[1]; -}else{ -return _8a; -} -},onBeforeLoad:function(_8d){ -},onLoad:function(){ -},onLoadError:function(){ -},onBeforeOpen:function(){ -},onOpen:function(){ -},onBeforeClose:function(){ -},onClose:function(){ -},onBeforeDestroy:function(){ -},onDestroy:function(){ -},onResize:function(_8e,_8f){ -},onMove:function(_90,top){ -},onMaximize:function(){ -},onRestore:function(){ -},onMinimize:function(){ -},onBeforeCollapse:function(){ -},onBeforeExpand:function(){ -},onCollapse:function(){ -},onExpand:function(){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.parser.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.parser.js deleted file mode 100755 index 2b121d415..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.parser.js +++ /dev/null @@ -1,386 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -$.easyui={indexOfArray:function(a,o,id){ -for(var i=0,_1=a.length;i<_1;i++){ -if(id==undefined){ -if(a[i]==o){ -return i; -} -}else{ -if(a[i][o]==id){ -return i; -} -} -} -return -1; -},removeArrayItem:function(a,o,id){ -if(typeof o=="string"){ -for(var i=0,_2=a.length;i<_2;i++){ -if(a[i][o]==id){ -a.splice(i,1); -return; -} -} -}else{ -var _3=this.indexOfArray(a,o); -if(_3!=-1){ -a.splice(_3,1); -} -} -},addArrayItem:function(a,o,r){ -var _4=this.indexOfArray(a,o,r?r[o]:undefined); -if(_4==-1){ -a.push(r?r:o); -}else{ -a[_4]=r?r:o; -} -},getArrayItem:function(a,o,id){ -var _5=this.indexOfArray(a,o,id); -return _5==-1?null:a[_5]; -},forEach:function(_6,_7,_8){ -var _9=[]; -for(var i=0;i<_6.length;i++){ -_9.push(_6[i]); -} -while(_9.length){ -var _a=_9.shift(); -if(_8(_a)==false){ -return; -} -if(_7&&_a.children){ -for(var i=_a.children.length-1;i>=0;i--){ -_9.unshift(_a.children[i]); -} -} -} -}}; -$.parser={auto:true,onComplete:function(_b){ -},plugins:["draggable","droppable","resizable","pagination","tooltip","linkbutton","menu","sidemenu","menubutton","splitbutton","switchbutton","progressbar","tree","textbox","passwordbox","maskedbox","filebox","combo","combobox","combotree","combogrid","combotreegrid","tagbox","numberbox","validatebox","searchbox","spinner","numberspinner","timespinner","datetimespinner","calendar","datebox","datetimebox","slider","layout","panel","datagrid","propertygrid","treegrid","datalist","tabs","accordion","window","dialog","form"],parse:function(_c){ -var aa=[]; -for(var i=0;i<$.parser.plugins.length;i++){ -var _d=$.parser.plugins[i]; -var r=$(".easyui-"+_d,_c); -if(r.length){ -if(r[_d]){ -r.each(function(){ -$(this)[_d]($.data(this,"options")||{}); -}); -}else{ -aa.push({name:_d,jq:r}); -} -} -} -if(aa.length&&window.easyloader){ -var _e=[]; -for(var i=0;i=0){ -v=Math.floor((_12.width()-_13)*v/100); -}else{ -v=Math.floor((_12.height()-_13)*v/100); -} -}else{ -v=parseInt(v)||undefined; -} -return v; -},parseOptions:function(_15,_16){ -var t=$(_15); -var _17={}; -var s=$.trim(t.attr("data-options")); -if(s){ -if(s.substring(0,1)!="{"){ -s="{"+s+"}"; -} -_17=(new Function("return "+s))(); -} -$.map(["width","height","left","top","minWidth","maxWidth","minHeight","maxHeight"],function(p){ -var pv=$.trim(_15.style[p]||""); -if(pv){ -if(pv.indexOf("%")==-1){ -pv=parseInt(pv); -if(isNaN(pv)){ -pv=undefined; -} -} -_17[p]=pv; -} -}); -if(_16){ -var _18={}; -for(var i=0;i<_16.length;i++){ -var pp=_16[i]; -if(typeof pp=="string"){ -_18[pp]=t.attr(pp); -}else{ -for(var _19 in pp){ -var _1a=pp[_19]; -if(_1a=="boolean"){ -_18[_19]=t.attr(_19)?(t.attr(_19)=="true"):undefined; -}else{ -if(_1a=="number"){ -_18[_19]=t.attr(_19)=="0"?0:parseFloat(t.attr(_19))||undefined; -} -} -} -} -} -$.extend(_17,_18); -} -return _17; -}}; -$(function(){ -var d=$("
                                                                                                                                                          ").appendTo("body"); -$._boxModel=d.outerWidth()!=100; -d.remove(); -d=$("
                                                                                                                                                          ").appendTo("body"); -$._positionFixed=(d.css("position")=="fixed"); -d.remove(); -if(!window.easyloader&&$.parser.auto){ -$.parser.parse(); -} -}); -$.fn._outerWidth=function(_1b){ -if(_1b==undefined){ -if(this[0]==window){ -return this.width()||document.body.clientWidth; -} -return this.outerWidth()||0; -} -return this._size("width",_1b); -}; -$.fn._outerHeight=function(_1c){ -if(_1c==undefined){ -if(this[0]==window){ -return this.height()||document.body.clientHeight; -} -return this.outerHeight()||0; -} -return this._size("height",_1c); -}; -$.fn._scrollLeft=function(_1d){ -if(_1d==undefined){ -return this.scrollLeft(); -}else{ -return this.each(function(){ -$(this).scrollLeft(_1d); -}); -} -}; -$.fn._propAttr=$.fn.prop||$.fn.attr; -$.fn._size=function(_1e,_1f){ -if(typeof _1e=="string"){ -if(_1e=="clear"){ -return this.each(function(){ -$(this).css({width:"",minWidth:"",maxWidth:"",height:"",minHeight:"",maxHeight:""}); -}); -}else{ -if(_1e=="fit"){ -return this.each(function(){ -_20(this,this.tagName=="BODY"?$("body"):$(this).parent(),true); -}); -}else{ -if(_1e=="unfit"){ -return this.each(function(){ -_20(this,$(this).parent(),false); -}); -}else{ -if(_1f==undefined){ -return _21(this[0],_1e); -}else{ -return this.each(function(){ -_21(this,_1e,_1f); -}); -} -} -} -} -}else{ -return this.each(function(){ -_1f=_1f||$(this).parent(); -$.extend(_1e,_20(this,_1f,_1e.fit)||{}); -var r1=_22(this,"width",_1f,_1e); -var r2=_22(this,"height",_1f,_1e); -if(r1||r2){ -$(this).addClass("easyui-fluid"); -}else{ -$(this).removeClass("easyui-fluid"); -} -}); -} -function _20(_23,_24,fit){ -if(!_24.length){ -return false; -} -var t=$(_23)[0]; -var p=_24[0]; -var _25=p.fcount||0; -if(fit){ -if(!t.fitted){ -t.fitted=true; -p.fcount=_25+1; -$(p).addClass("panel-noscroll"); -if(p.tagName=="BODY"){ -$("html").addClass("panel-fit"); -} -} -return {width:($(p).width()||1),height:($(p).height()||1)}; -}else{ -if(t.fitted){ -t.fitted=false; -p.fcount=_25-1; -if(p.fcount==0){ -$(p).removeClass("panel-noscroll"); -if(p.tagName=="BODY"){ -$("html").removeClass("panel-fit"); -} -} -} -return false; -} -}; -function _22(_26,_27,_28,_29){ -var t=$(_26); -var p=_27; -var p1=p.substr(0,1).toUpperCase()+p.substr(1); -var min=$.parser.parseValue("min"+p1,_29["min"+p1],_28); -var max=$.parser.parseValue("max"+p1,_29["max"+p1],_28); -var val=$.parser.parseValue(p,_29[p],_28); -var _2a=(String(_29[p]||"").indexOf("%")>=0?true:false); -if(!isNaN(val)){ -var v=Math.min(Math.max(val,min||0),max||99999); -if(!_2a){ -_29[p]=v; -} -t._size("min"+p1,""); -t._size("max"+p1,""); -t._size(p,v); -}else{ -t._size(p,""); -t._size("min"+p1,min); -t._size("max"+p1,max); -} -return _2a||_29.fit; -}; -function _21(_2b,_2c,_2d){ -var t=$(_2b); -if(_2d==undefined){ -_2d=parseInt(_2b.style[_2c]); -if(isNaN(_2d)){ -return undefined; -} -if($._boxModel){ -_2d+=_2e(); -} -return _2d; -}else{ -if(_2d===""){ -t.css(_2c,""); -}else{ -if($._boxModel){ -_2d-=_2e(); -if(_2d<0){ -_2d=0; -} -} -t.css(_2c,_2d+"px"); -} -} -function _2e(){ -if(_2c.toLowerCase().indexOf("width")>=0){ -return t.outerWidth()-t.width(); -}else{ -return t.outerHeight()-t.height(); -} -}; -}; -}; -})(jQuery); -(function($){ -var _2f=null; -var _30=null; -var _31=false; -function _32(e){ -if(e.touches.length!=1){ -return; -} -if(!_31){ -_31=true; -dblClickTimer=setTimeout(function(){ -_31=false; -},500); -}else{ -clearTimeout(dblClickTimer); -_31=false; -_33(e,"dblclick"); -} -_2f=setTimeout(function(){ -_33(e,"contextmenu",3); -},1000); -_33(e,"mousedown"); -if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ -e.preventDefault(); -} -}; -function _34(e){ -if(e.touches.length!=1){ -return; -} -if(_2f){ -clearTimeout(_2f); -} -_33(e,"mousemove"); -if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ -e.preventDefault(); -} -}; -function _35(e){ -if(_2f){ -clearTimeout(_2f); -} -_33(e,"mouseup"); -if($.fn.draggable.isDragging||$.fn.resizable.isResizing){ -e.preventDefault(); -} -}; -function _33(e,_36,_37){ -var _38=new $.Event(_36); -_38.pageX=e.changedTouches[0].pageX; -_38.pageY=e.changedTouches[0].pageY; -_38.which=_37||1; -$(e.target).trigger(_38); -}; -if(document.addEventListener){ -document.addEventListener("touchstart",_32,true); -document.addEventListener("touchmove",_34,true); -document.addEventListener("touchend",_35,true); -} -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.passwordbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.passwordbox.js deleted file mode 100644 index d28bb1018..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.passwordbox.js +++ /dev/null @@ -1,156 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$.data(_2,"passwordbox"); -var _4=_3.options; -var _5=$.extend(true,[],_4.icons); -if(_4.showEye){ -_5.push({iconCls:"passwordbox-open",handler:function(e){ -_4.revealed=!_4.revealed; -_6(_2); -}}); -} -$(_2).addClass("passwordbox-f").textbox($.extend({},_4,{icons:_5})); -_6(_2); -}; -function _7(_8,_9,_a){ -var t=$(_8); -var _b=t.passwordbox("options"); -if(_b.revealed){ -t.textbox("setValue",_9); -return; -} -var _c=unescape(_b.passwordChar); -var cc=_9.split(""); -var vv=t.passwordbox("getValue").split(""); -for(var i=0;i
                                                                                                                                                          "); -$(_2).bind("_resize",function(e,_3){ -if($(this).hasClass("easyui-fluid")||_3){ -_4(_2); -} -return false; -}); -return $(_2); -}; -function _4(_5,_6){ -var _7=$.data(_5,"progressbar").options; -var _8=$.data(_5,"progressbar").bar; -if(_6){ -_7.width=_6; -} -_8._size(_7); -_8.find("div.progressbar-text").css("width",_8.width()); -_8.find("div.progressbar-text,div.progressbar-value").css({height:_8.height()+"px",lineHeight:_8.height()+"px"}); -}; -$.fn.progressbar=function(_9,_a){ -if(typeof _9=="string"){ -var _b=$.fn.progressbar.methods[_9]; -if(_b){ -return _b(this,_a); -} -} -_9=_9||{}; -return this.each(function(){ -var _c=$.data(this,"progressbar"); -if(_c){ -$.extend(_c.options,_9); -}else{ -_c=$.data(this,"progressbar",{options:$.extend({},$.fn.progressbar.defaults,$.fn.progressbar.parseOptions(this),_9),bar:_1(this)}); -} -$(this).progressbar("setValue",_c.options.value); -_4(this); -}); -}; -$.fn.progressbar.methods={options:function(jq){ -return $.data(jq[0],"progressbar").options; -},resize:function(jq,_d){ -return jq.each(function(){ -_4(this,_d); -}); -},getValue:function(jq){ -return $.data(jq[0],"progressbar").options.value; -},setValue:function(jq,_e){ -if(_e<0){ -_e=0; -} -if(_e>100){ -_e=100; -} -return jq.each(function(){ -var _f=$.data(this,"progressbar").options; -var _10=_f.text.replace(/{value}/,_e); -var _11=_f.value; -_f.value=_e; -$(this).find("div.progressbar-value").width(_e+"%"); -$(this).find("div.progressbar-text").html(_10); -if(_11!=_e){ -_f.onChange.call(this,_e,_11); -} -}); -}}; -$.fn.progressbar.parseOptions=function(_12){ -return $.extend({},$.parser.parseOptions(_12,["width","height","text",{value:"number"}])); -}; -$.fn.progressbar.defaults={width:"auto",height:22,value:0,text:"{value}%",onChange:function(_13,_14){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.propertygrid.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.propertygrid.js deleted file mode 100755 index d8c47932a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.propertygrid.js +++ /dev/null @@ -1,427 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -var _1; -$(document).unbind(".propertygrid").bind("mousedown.propertygrid",function(e){ -var p=$(e.target).closest("div.datagrid-view,div.combo-panel"); -if(p.length){ -return; -} -_2(_1); -_1=undefined; -}); -function _3(_4){ -var _5=$.data(_4,"propertygrid"); -var _6=$.data(_4,"propertygrid").options; -$(_4).datagrid($.extend({},_6,{cls:"propertygrid",view:(_6.showGroup?_6.groupView:_6.view),onBeforeEdit:function(_7,_8){ -if(_6.onBeforeEdit.call(_4,_7,_8)==false){ -return false; -} -var dg=$(this); -var _8=dg.datagrid("getRows")[_7]; -var _9=dg.datagrid("getColumnOption","value"); -_9.editor=_8.editor; -},onClickCell:function(_a,_b,_c){ -if(_1!=this){ -_2(_1); -_1=this; -} -if(_6.editIndex!=_a){ -_2(_1); -$(this).datagrid("beginEdit",_a); -var ed=$(this).datagrid("getEditor",{index:_a,field:_b}); -if(!ed){ -ed=$(this).datagrid("getEditor",{index:_a,field:"value"}); -} -if(ed){ -var t=$(ed.target); -var _d=t.data("textbox")?t.textbox("textbox"):t; -_d.focus(); -_6.editIndex=_a; -} -} -_6.onClickCell.call(_4,_a,_b,_c); -},loadFilter:function(_e){ -_2(this); -return _6.loadFilter.call(this,_e); -}})); -}; -function _2(_f){ -var t=$(_f); -if(!t.length){ -return; -} -var _10=$.data(_f,"propertygrid").options; -_10.finder.getTr(_f,null,"editing").each(function(){ -var _11=parseInt($(this).attr("datagrid-row-index")); -if(t.datagrid("validateRow",_11)){ -t.datagrid("endEdit",_11); -}else{ -t.datagrid("cancelEdit",_11); -} -}); -_10.editIndex=undefined; -}; -$.fn.propertygrid=function(_12,_13){ -if(typeof _12=="string"){ -var _14=$.fn.propertygrid.methods[_12]; -if(_14){ -return _14(this,_13); -}else{ -return this.datagrid(_12,_13); -} -} -_12=_12||{}; -return this.each(function(){ -var _15=$.data(this,"propertygrid"); -if(_15){ -$.extend(_15.options,_12); -}else{ -var _16=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_12); -_16.frozenColumns=$.extend(true,[],_16.frozenColumns); -_16.columns=$.extend(true,[],_16.columns); -$.data(this,"propertygrid",{options:_16}); -} -_3(this); -}); -}; -$.fn.propertygrid.methods={options:function(jq){ -return $.data(jq[0],"propertygrid").options; -}}; -$.fn.propertygrid.parseOptions=function(_17){ -return $.extend({},$.fn.datagrid.parseOptions(_17),$.parser.parseOptions(_17,[{showGroup:"boolean"}])); -}; -var _18=$.extend({},$.fn.datagrid.defaults.view,{render:function(_19,_1a,_1b){ -var _1c=[]; -var _1d=this.groups; -for(var i=0;i<_1d.length;i++){ -_1c.push(this.renderGroup.call(this,_19,i,_1d[i],_1b)); -} -$(_1a).html(_1c.join("")); -},renderGroup:function(_1e,_1f,_20,_21){ -var _22=$.data(_1e,"datagrid"); -var _23=_22.options; -var _24=$(_1e).datagrid("getColumnFields",_21); -var _25=_23.frozenColumns&&_23.frozenColumns.length; -if(_21){ -if(!(_23.rownumbers||_25)){ -return ""; -} -} -var _26=[]; -var css=_23.groupStyler.call(_1e,_20.value,_20.rows); -var cs=_27(css,"datagrid-group"); -_26.push("
                                                                                                                                                          "); -if((_21&&(_23.rownumbers||_23.frozenColumns.length))||(!_21&&!(_23.rownumbers||_23.frozenColumns.length))){ -_26.push(""); -_26.push(" "); -_26.push(""); -} -if((_21&&_25)||(!_21)){ -_26.push(""); -_26.push(_23.groupFormatter.call(_1e,_20.value,_20.rows)); -_26.push(""); -} -_26.push("
                                                                                                                                                          "); -_26.push(""); -var _28=_20.startIndex; -for(var j=0;j<_20.rows.length;j++){ -var css=_23.rowStyler?_23.rowStyler.call(_1e,_28,_20.rows[j]):""; -var _29=""; -var _2a=""; -if(typeof css=="string"){ -_2a=css; -}else{ -if(css){ -_29=css["class"]||""; -_2a=css["style"]||""; -} -} -var cls="class=\"datagrid-row "+(_28%2&&_23.striped?"datagrid-row-alt ":" ")+_29+"\""; -var _2b=_2a?"style=\""+_2a+"\"":""; -var _2c=_22.rowIdPrefix+"-"+(_21?1:2)+"-"+_28; -_26.push(""); -_26.push(this.renderRow.call(this,_1e,_24,_21,_28,_20.rows[j])); -_26.push(""); -_28++; -} -_26.push("
                                                                                                                                                          "); -return _26.join(""); -function _27(css,cls){ -var _2d=""; -var _2e=""; -if(typeof css=="string"){ -_2e=css; -}else{ -if(css){ -_2d=css["class"]||""; -_2e=css["style"]||""; -} -} -return "class=\""+cls+(_2d?" "+_2d:"")+"\" "+"style=\""+_2e+"\""; -}; -},bindEvents:function(_2f){ -var _30=$.data(_2f,"datagrid"); -var dc=_30.dc; -var _31=dc.body1.add(dc.body2); -var _32=($.data(_31[0],"events")||$._data(_31[0],"events")).click[0].handler; -_31.unbind("click").bind("click",function(e){ -var tt=$(e.target); -var _33=tt.closest("span.datagrid-row-expander"); -if(_33.length){ -var _34=_33.closest("div.datagrid-group").attr("group-index"); -if(_33.hasClass("datagrid-row-collapse")){ -$(_2f).datagrid("collapseGroup",_34); -}else{ -$(_2f).datagrid("expandGroup",_34); -} -}else{ -_32(e); -} -e.stopPropagation(); -}); -},onBeforeRender:function(_35,_36){ -var _37=$.data(_35,"datagrid"); -var _38=_37.options; -_39(); -var _3a=[]; -for(var i=0;i<_36.length;i++){ -var row=_36[i]; -var _3b=_3c(row[_38.groupField]); -if(!_3b){ -_3b={value:row[_38.groupField],rows:[row]}; -_3a.push(_3b); -}else{ -_3b.rows.push(row); -} -} -var _3d=0; -var _3e=[]; -for(var i=0;i<_3a.length;i++){ -var _3b=_3a[i]; -_3b.startIndex=_3d; -_3d+=_3b.rows.length; -_3e=_3e.concat(_3b.rows); -} -_37.data.rows=_3e; -this.groups=_3a; -var _3f=this; -setTimeout(function(){ -_3f.bindEvents(_35); -},0); -function _3c(_40){ -for(var i=0;i<_3a.length;i++){ -var _41=_3a[i]; -if(_41.value==_40){ -return _41; -} -} -return null; -}; -function _39(){ -if(!$("#datagrid-group-style").length){ -$("head").append(""); -} -}; -},onAfterRender:function(_42){ -$.fn.datagrid.defaults.view.onAfterRender.call(this,_42); -var _43=this; -var _44=$.data(_42,"datagrid"); -var _45=_44.options; -if(!_44.onResizeColumn){ -_44.onResizeColumn=_45.onResizeColumn; -} -if(!_44.onResize){ -_44.onResize=_45.onResize; -} -_45.onResizeColumn=function(_46,_47){ -_43.resizeGroup(_42); -_44.onResizeColumn.call(_42,_46,_47); -}; -_45.onResize=function(_48,_49){ -_43.resizeGroup(_42); -_44.onResize.call($(_42).datagrid("getPanel")[0],_48,_49); -}; -_43.resizeGroup(_42); -}}); -$.extend($.fn.datagrid.methods,{groups:function(jq){ -return jq.datagrid("options").view.groups; -},expandGroup:function(jq,_4a){ -return jq.each(function(){ -var _4b=$(this).datagrid("options"); -var _4c=$.data(this,"datagrid").dc.view; -var _4d=_4c.find(_4a!=undefined?"div.datagrid-group[group-index=\""+_4a+"\"]":"div.datagrid-group"); -var _4e=_4d.find("span.datagrid-row-expander"); -if(_4e.hasClass("datagrid-row-expand")){ -_4e.removeClass("datagrid-row-expand").addClass("datagrid-row-collapse"); -_4d.next("table").show(); -} -$(this).datagrid("fixRowHeight"); -if(_4b.onExpandGroup){ -_4b.onExpandGroup.call(this,_4a); -} -}); -},collapseGroup:function(jq,_4f){ -return jq.each(function(){ -var _50=$(this).datagrid("options"); -var _51=$.data(this,"datagrid").dc.view; -var _52=_51.find(_4f!=undefined?"div.datagrid-group[group-index=\""+_4f+"\"]":"div.datagrid-group"); -var _53=_52.find("span.datagrid-row-expander"); -if(_53.hasClass("datagrid-row-collapse")){ -_53.removeClass("datagrid-row-collapse").addClass("datagrid-row-expand"); -_52.next("table").hide(); -} -$(this).datagrid("fixRowHeight"); -if(_50.onCollapseGroup){ -_50.onCollapseGroup.call(this,_4f); -} -}); -},scrollToGroup:function(jq,_54){ -return jq.each(function(){ -var _55=$.data(this,"datagrid"); -var dc=_55.dc; -var _56=dc.body2.children("div.datagrid-group[group-index=\""+_54+"\"]"); -if(_56.length){ -var _57=_56.outerHeight(); -var _58=dc.view2.children("div.datagrid-header")._outerHeight(); -var _59=dc.body2.outerHeight(true)-dc.body2.outerHeight(); -var top=_56.position().top-_58-_59; -if(top<0){ -dc.body2.scrollTop(dc.body2.scrollTop()+top); -}else{ -if(top+_57>dc.body2.height()-18){ -dc.body2.scrollTop(dc.body2.scrollTop()+top+_57-dc.body2.height()+18); -} -} -} -}); -}}); -$.extend(_18,{refreshGroupTitle:function(_5a,_5b){ -var _5c=$.data(_5a,"datagrid"); -var _5d=_5c.options; -var dc=_5c.dc; -var _5e=this.groups[_5b]; -var _5f=dc.body1.add(dc.body2).children("div.datagrid-group[group-index="+_5b+"]").find("span.datagrid-group-title"); -_5f.html(_5d.groupFormatter.call(_5a,_5e.value,_5e.rows)); -},resizeGroup:function(_60,_61){ -var _62=$.data(_60,"datagrid"); -var dc=_62.dc; -var ht=dc.header2.find("table"); -var fr=ht.find("tr.datagrid-filter-row").hide(); -var ww=ht.width(); -if(_61==undefined){ -var _63=dc.body2.children("div.datagrid-group"); -}else{ -var _63=dc.body2.children("div.datagrid-group[group-index="+_61+"]"); -} -_63._outerWidth(ww); -var _64=_62.options; -if(_64.frozenColumns&&_64.frozenColumns.length){ -var _65=dc.view1.width()-_64.expanderWidth; -var _66=dc.view1.css("direction").toLowerCase()=="rtl"; -_63.find(".datagrid-group-title").css(_66?"right":"left",-_65+"px"); -} -if(fr.length){ -if(_64.showFilterBar){ -fr.show(); -} -} -},insertRow:function(_67,_68,row){ -var _69=$.data(_67,"datagrid"); -var _6a=_69.options; -var dc=_69.dc; -var _6b=null; -var _6c; -if(!_69.data.rows.length){ -$(_67).datagrid("loadData",[row]); -return; -} -for(var i=0;i_6b.startIndex+_6b.rows.length){ -_68=_6b.startIndex+_6b.rows.length; -} -} -$.fn.datagrid.defaults.view.insertRow.call(this,_67,_68,row); -if(_68>=_6b.startIndex+_6b.rows.length){ -_6d(_68,true); -_6d(_68,false); -} -_6b.rows.splice(_68-_6b.startIndex,0,row); -}else{ -_6b={value:row[_6a.groupField],rows:[row],startIndex:_69.data.rows.length}; -_6c=this.groups.length; -dc.body1.append(this.renderGroup.call(this,_67,_6c,_6b,true)); -dc.body2.append(this.renderGroup.call(this,_67,_6c,_6b,false)); -this.groups.push(_6b); -_69.data.rows.push(row); -} -this.setGroupIndex(_67); -this.refreshGroupTitle(_67,_6c); -this.resizeGroup(_67); -function _6d(_6e,_6f){ -var _70=_6f?1:2; -var _71=_6a.finder.getTr(_67,_6e-1,"body",_70); -var tr=_6a.finder.getTr(_67,_6e,"body",_70); -tr.insertAfter(_71); -}; -},updateRow:function(_72,_73,row){ -var _74=$.data(_72,"datagrid").options; -$.fn.datagrid.defaults.view.updateRow.call(this,_72,_73,row); -var tb=_74.finder.getTr(_72,_73,"body",2).closest("table.datagrid-btable"); -var _75=parseInt(tb.prev().attr("group-index")); -this.refreshGroupTitle(_72,_75); -},deleteRow:function(_76,_77){ -var _78=$.data(_76,"datagrid"); -var _79=_78.options; -var dc=_78.dc; -var _7a=dc.body1.add(dc.body2); -var tb=_79.finder.getTr(_76,_77,"body",2).closest("table.datagrid-btable"); -var _7b=parseInt(tb.prev().attr("group-index")); -$.fn.datagrid.defaults.view.deleteRow.call(this,_76,_77); -var _7c=this.groups[_7b]; -if(_7c.rows.length>1){ -_7c.rows.splice(_77-_7c.startIndex,1); -this.refreshGroupTitle(_76,_7b); -}else{ -_7a.children("div.datagrid-group[group-index="+_7b+"]").remove(); -for(var i=_7b+1;i_e.top&&e.pageY<_e.top+_11){ -_d+="n"; -}else{ -if(e.pageY<_e.top+_10&&e.pageY>_e.top+_10-_11){ -_d+="s"; -} -} -if(e.pageX>_e.left&&e.pageX<_e.left+_11){ -_d+="w"; -}else{ -if(e.pageX<_e.left+_f&&e.pageX>_e.left+_f-_11){ -_d+="e"; -} -} -var _12=_c.handles.split(","); -_12=$.map(_12,function(h){ -return $.trim(h).toLowerCase(); -}); -if($.inArray("all",_12)>=0||$.inArray(_d,_12)>=0){ -return _d; -} -for(var i=0;i<_d.length;i++){ -var _13=$.inArray(_d.substr(i,1),_12); -if(_13>=0){ -return _12[_13]; -} -} -return ""; -}; -$.fn.resizable=function(_14,_15){ -if(typeof _14=="string"){ -return $.fn.resizable.methods[_14](this,_15); -} -return this.each(function(){ -var _16=null; -var _17=$.data(this,"resizable"); -if(_17){ -$(this).unbind(".resizable"); -_16=$.extend(_17.options,_14||{}); -}else{ -_16=$.extend({},$.fn.resizable.defaults,$.fn.resizable.parseOptions(this),_14||{}); -$.data(this,"resizable",{options:_16}); -} -if(_16.disabled==true){ -return; -} -$(this).bind("mousemove.resizable",{target:this},function(e){ -if($.fn.resizable.isResizing){ -return; -} -var dir=_b(e); -$(e.data.target).css("cursor",dir?dir+"-resize":""); -}).bind("mouseleave.resizable",{target:this},function(e){ -$(e.data.target).css("cursor",""); -}).bind("mousedown.resizable",{target:this},function(e){ -var dir=_b(e); -if(dir==""){ -return; -} -function _18(css){ -var val=parseInt($(e.data.target).css(css)); -if(isNaN(val)){ -return 0; -}else{ -return val; -} -}; -var _19={target:e.data.target,dir:dir,startLeft:_18("left"),startTop:_18("top"),left:_18("left"),top:_18("top"),startX:e.pageX,startY:e.pageY,startWidth:$(e.data.target).outerWidth(),startHeight:$(e.data.target).outerHeight(),width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),deltaWidth:$(e.data.target).outerWidth()-$(e.data.target).width(),deltaHeight:$(e.data.target).outerHeight()-$(e.data.target).height()}; -$(document).bind("mousedown.resizable",_19,_8); -$(document).bind("mousemove.resizable",_19,_9); -$(document).bind("mouseup.resizable",_19,_a); -$("body").css("cursor",dir+"-resize"); -}); -}); -}; -$.fn.resizable.methods={options:function(jq){ -return $.data(jq[0],"resizable").options; -},enable:function(jq){ -return jq.each(function(){ -$(this).resizable({disabled:false}); -}); -},disable:function(jq){ -return jq.each(function(){ -$(this).resizable({disabled:true}); -}); -}}; -$.fn.resizable.parseOptions=function(_1a){ -var t=$(_1a); -return $.extend({},$.parser.parseOptions(_1a,["handles",{minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number",edge:"number"}]),{disabled:(t.attr("disabled")?true:undefined)}); -}; -$.fn.resizable.defaults={disabled:false,handles:"n, e, s, w, ne, se, sw, nw, all",minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000,edge:5,onStartResize:function(e){ -},onResize:function(e){ -},onStopResize:function(e){ -}}; -$.fn.resizable.isResizing=false; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.searchbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.searchbox.js deleted file mode 100755 index ba2966ea7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.searchbox.js +++ /dev/null @@ -1,132 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$.data(_2,"searchbox"); -var _4=_3.options; -var _5=$.extend(true,[],_4.icons); -_5.push({iconCls:"searchbox-button",handler:function(e){ -var t=$(e.data.target); -var _6=t.searchbox("options"); -_6.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); -}}); -_7(); -var _8=_9(); -$(_2).addClass("searchbox-f").textbox($.extend({},_4,{icons:_5,buttonText:(_8?_8.text:"")})); -$(_2).attr("searchboxName",$(_2).attr("textboxName")); -_3.searchbox=$(_2).next(); -_3.searchbox.addClass("searchbox"); -_a(_8); -function _7(){ -if(_4.menu){ -_3.menu=$(_4.menu).menu(); -var _b=_3.menu.menu("options"); -var _c=_b.onClick; -_b.onClick=function(_d){ -_a(_d); -_c.call(this,_d); -}; -}else{ -if(_3.menu){ -_3.menu.menu("destroy"); -} -_3.menu=null; -} -}; -function _9(){ -if(_3.menu){ -var _e=_3.menu.children("div.menu-item:first"); -_3.menu.children("div.menu-item").each(function(){ -var _f=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)}); -if(_f.selected){ -_e=$(this); -return false; -} -}); -return _3.menu.menu("getItem",_e[0]); -}else{ -return null; -} -}; -function _a(_10){ -if(!_10){ -return; -} -$(_2).textbox("button").menubutton({text:_10.text,iconCls:(_10.iconCls||null),menu:_3.menu,menuAlign:_4.buttonAlign,plain:false}); -_3.searchbox.find("input.textbox-value").attr("name",_10.name||_10.text); -$(_2).searchbox("resize"); -}; -}; -$.fn.searchbox=function(_11,_12){ -if(typeof _11=="string"){ -var _13=$.fn.searchbox.methods[_11]; -if(_13){ -return _13(this,_12); -}else{ -return this.textbox(_11,_12); -} -} -_11=_11||{}; -return this.each(function(){ -var _14=$.data(this,"searchbox"); -if(_14){ -$.extend(_14.options,_11); -}else{ -$.data(this,"searchbox",{options:$.extend({},$.fn.searchbox.defaults,$.fn.searchbox.parseOptions(this),_11)}); -} -_1(this); -}); -}; -$.fn.searchbox.methods={options:function(jq){ -var _15=jq.textbox("options"); -return $.extend($.data(jq[0],"searchbox").options,{width:_15.width,value:_15.value,originalValue:_15.originalValue,disabled:_15.disabled,readonly:_15.readonly}); -},menu:function(jq){ -return $.data(jq[0],"searchbox").menu; -},getName:function(jq){ -return $.data(jq[0],"searchbox").searchbox.find("input.textbox-value").attr("name"); -},selectName:function(jq,_16){ -return jq.each(function(){ -var _17=$.data(this,"searchbox").menu; -if(_17){ -_17.children("div.menu-item").each(function(){ -var _18=_17.menu("getItem",this); -if(_18.name==_16){ -$(this).trigger("click"); -return false; -} -}); -} -}); -},destroy:function(jq){ -return jq.each(function(){ -var _19=$(this).searchbox("menu"); -if(_19){ -_19.menu("destroy"); -} -$(this).textbox("destroy"); -}); -}}; -$.fn.searchbox.parseOptions=function(_1a){ -var t=$(_1a); -return $.extend({},$.fn.textbox.parseOptions(_1a),$.parser.parseOptions(_1a,["menu"]),{searcher:(t.attr("searcher")?eval(t.attr("searcher")):undefined)}); -}; -$.fn.searchbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:$.extend({},$.fn.textbox.defaults.inputEvents,{keydown:function(e){ -if(e.keyCode==13){ -e.preventDefault(); -var t=$(e.data.target); -var _1b=t.searchbox("options"); -t.searchbox("setValue",$(this).val()); -_1b.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName")); -return false; -} -}}),buttonAlign:"left",menu:null,searcher:function(_1c,_1d){ -}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.sidemenu.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.sidemenu.js deleted file mode 100644 index 2a446874f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.sidemenu.js +++ /dev/null @@ -1,226 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -var _1=1; -function _2(_3){ -$(_3).addClass("sidemenu"); -}; -function _4(_5,_6){ -var _7=$(_5).sidemenu("options"); -if(_6){ -$.extend(_7,{width:_6.width,height:_6.height}); -} -$(_5)._size(_7); -$(_5).find(".accordion").accordion("resize"); -}; -function _8(_9,_a,_b){ -var _c=$(_9).sidemenu("options"); -var tt=$("
                                                                                                                                                            ").appendTo(_a); -tt.tree({data:_b,animate:_c.animate,onBeforeSelect:function(_d){ -if(_d.children){ -return false; -} -},onSelect:function(_e){ -_12(_9,_e.id); -},onExpand:function(_f){ -_22(_9,_f); -},onCollapse:function(_10){ -_22(_9,_10); -},onClick:function(_11){ -if(_11.children){ -if(_11.state=="open"){ -$(_11.target).addClass("tree-node-nonleaf-collapsed"); -}else{ -$(_11.target).removeClass("tree-node-nonleaf-collapsed"); -} -$(this).tree("toggle",_11.target); -} -}}); -tt.unbind(".sidemenu").bind("mouseleave.sidemenu",function(){ -$(_a).trigger("mouseleave"); -}); -_12(_9,_c.selectedItemId); -}; -function _13(_14,_15,_16){ -var _17=$(_14).sidemenu("options"); -$(_15).tooltip({content:$("
                                                                                                                                                            "),position:_17.floatMenuPosition,valign:"top",data:_16,onUpdate:function(_18){ -var _19=$(this).tooltip("options"); -var _1a=_19.data; -_18.accordion({width:_17.floatMenuWidth,multiple:false}).accordion("add",{title:_1a.text,iconCls:_1a.iconCls,collapsed:false,collapsible:false}); -_8(_14,_18.accordion("panels")[0],_1a.children); -},onShow:function(){ -var t=$(this); -var tip=t.tooltip("tip").addClass("sidemenu-tooltip"); -tip.children(".tooltip-content").addClass("sidemenu"); -tip.find(".accordion").accordion("resize"); -tip.unbind().bind("mouseenter",function(){ -t.tooltip("show"); -}).bind("mouseleave",function(){ -t.tooltip("hide"); -}); -},onPosition:function(){ -if(!_17.collapsed){ -$(this).tooltip("tip").css({left:-999999}); -} -}}); -}; -function _1b(_1c,_1d){ -$(_1c).find(".sidemenu-tree").each(function(){ -_1d($(this)); -}); -$(_1c).find(".tooltip-f").each(function(){ -var tip=$(this).tooltip("tip"); -if(tip){ -tip.find(".sidemenu-tree").each(function(){ -_1d($(this)); -}); -} -}); -}; -function _12(_1e,_1f){ -var _20=$(_1e).sidemenu("options"); -_1b(_1e,function(t){ -t.find("div.tree-node-selected").removeClass("tree-node-selected"); -var _21=t.tree("find",_1f); -if(_21){ -$(_21.target).addClass("tree-node-selected"); -_20.selectedItemId=_21.id; -t.trigger("mouseleave"); -_20.onSelect.call(_1e,_21); -} -}); -}; -function _22(_23,_24){ -_1b(_23,function(t){ -var _25=t.tree("find",_24.id); -if(_25){ -t.tree(_24.state=="open"?"expand":"collapse",_25.target); -} -}); -}; -function _26(_27){ -var _28=$(_27).sidemenu("options"); -$(_27).empty(); -if(_28.data){ -$.easyui.forEach(_28.data,true,function(_29){ -if(!_29.id){ -_29.id="_easyui_sidemenu_"+(_1++); -} -if(!_29.iconCls){ -_29.iconCls="sidemenu-default-icon"; -} -if(_29.children){ -_29.nodeCls="tree-node-nonleaf"; -if(!_29.state){ -_29.state="closed"; -} -if(_29.state=="open"){ -_29.nodeCls="tree-node-nonleaf"; -}else{ -_29.nodeCls="tree-node-nonleaf tree-node-nonleaf-collapsed"; -} -} -}); -var acc=$("
                                                                                                                                                            ").appendTo(_27); -acc.accordion({fit:_28.height=="auto"?false:true,border:_28.border,multiple:_28.multiple}); -for(var i=0;i"+"
                                                                                                                                                            "+""+""+"
                                                                                                                                                            "+"
                                                                                                                                                            "+"
                                                                                                                                                            "+"
                                                                                                                                                            "+""+"").insertAfter(_2); -var t=$(_2); -t.addClass("slider-f").hide(); -var _4=t.attr("name"); -if(_4){ -_3.find("input.slider-value").attr("name",_4); -t.removeAttr("name").attr("sliderName",_4); -} -_3.bind("_resize",function(e,_5){ -if($(this).hasClass("easyui-fluid")||_5){ -_6(_2); -} -return false; -}); -return _3; -}; -function _6(_7,_8){ -var _9=$.data(_7,"slider"); -var _a=_9.options; -var _b=_9.slider; -if(_8){ -if(_8.width){ -_a.width=_8.width; -} -if(_8.height){ -_a.height=_8.height; -} -} -_b._size(_a); -if(_a.mode=="h"){ -_b.css("height",""); -_b.children("div").css("height",""); -}else{ -_b.css("width",""); -_b.children("div").css("width",""); -_b.children("div.slider-rule,div.slider-rulelabel,div.slider-inner")._outerHeight(_b._outerHeight()); -} -_c(_7); -}; -function _d(_e){ -var _f=$.data(_e,"slider"); -var _10=_f.options; -var _11=_f.slider; -var aa=_10.mode=="h"?_10.rule:_10.rule.slice(0).reverse(); -if(_10.reversed){ -aa=aa.slice(0).reverse(); -} -_12(aa); -function _12(aa){ -var _13=_11.find("div.slider-rule"); -var _14=_11.find("div.slider-rulelabel"); -_13.empty(); -_14.empty(); -for(var i=0;i").appendTo(_13); -_16.css((_10.mode=="h"?"left":"top"),_15); -if(aa[i]!="|"){ -_16=$("").appendTo(_14); -_16.html(aa[i]); -if(_10.mode=="h"){ -_16.css({left:_15,marginLeft:-Math.round(_16.outerWidth()/2)}); -}else{ -_16.css({top:_15,marginTop:-Math.round(_16.outerHeight()/2)}); -} -} -} -}; -}; -function _17(_18){ -var _19=$.data(_18,"slider"); -var _1a=_19.options; -var _1b=_19.slider; -_1b.removeClass("slider-h slider-v slider-disabled"); -_1b.addClass(_1a.mode=="h"?"slider-h":"slider-v"); -_1b.addClass(_1a.disabled?"slider-disabled":""); -var _1c=_1b.find(".slider-inner"); -_1c.html(""+""); -if(_1a.range){ -_1c.append(""+""); -} -_1b.find("a.slider-handle").draggable({axis:_1a.mode,cursor:"pointer",disabled:_1a.disabled,onDrag:function(e){ -var _1d=e.data.left; -var _1e=_1b.width(); -if(_1a.mode!="h"){ -_1d=e.data.top; -_1e=_1b.height(); -} -if(_1d<0||_1d>_1e){ -return false; -}else{ -_1f(_1d,this); -return false; -} -},onStartDrag:function(){ -_19.isDragging=true; -_1a.onSlideStart.call(_18,_1a.value); -},onStopDrag:function(e){ -_1f(_1a.mode=="h"?e.data.left:e.data.top,this); -_1a.onSlideEnd.call(_18,_1a.value); -_1a.onComplete.call(_18,_1a.value); -_19.isDragging=false; -}}); -_1b.find("div.slider-inner").unbind(".slider").bind("mousedown.slider",function(e){ -if(_19.isDragging||_1a.disabled){ -return; -} -var pos=$(this).offset(); -_1f(_1a.mode=="h"?(e.pageX-pos.left):(e.pageY-pos.top)); -_1a.onComplete.call(_18,_1a.value); -}); -function _20(_21){ -var dd=String(_1a.step).split("."); -var _22=dd.length>1?dd[1].length:0; -return parseFloat(_21.toFixed(_22)); -}; -function _1f(pos,_23){ -var _24=_25(_18,pos); -var s=Math.abs(_24%_1a.step); -if(s<_1a.step/2){ -_24-=s; -}else{ -_24=_24-s+_1a.step; -} -_24=_20(_24); -if(_1a.range){ -var v1=_1a.value[0]; -var v2=_1a.value[1]; -var m=parseFloat((v1+v2)/2); -if(_23){ -var _26=$(_23).nextAll(".slider-handle").length>0; -if(_24<=v2&&_26){ -v1=_24; -}else{ -if(_24>=v1&&(!_26)){ -v2=_24; -} -} -}else{ -if(_24v2){ -v2=_24; -}else{ -_24_2b.max){ -_30=_2b.max; -} -var _31=$("").appendTo(_2c); -_31.attr("name",_2f); -_31.val(_30); -_2e.push(_30); -var _32=_2c.find(".slider-handle:eq("+i+")"); -var tip=_32.next(); -var pos=_33(_28,_30); -if(_2b.showTip){ -tip.show(); -tip.html(_2b.tipFormatter.call(_28,_30)); -}else{ -tip.hide(); -} -if(_2b.mode=="h"){ -var _34="left:"+pos+"px;"; -_32.attr("style",_34); -tip.attr("style",_34+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px"); -}else{ -var _34="top:"+pos+"px;"; -_32.attr("style",_34); -tip.attr("style",_34+"margin-left:"+(-Math.round(tip.outerWidth()))+"px"); -} -} -_2b.value=_2b.range?_2e:_2e[0]; -$(_28).val(_2b.range?_2e.join(_2b.separator):_2e[0]); -if(_2d.join(",")!=_2e.join(",")){ -_2b.onChange.call(_28,_2b.value,(_2b.range?_2d:_2d[0])); -} -}; -function _c(_35){ -var _36=$.data(_35,"slider").options; -var fn=_36.onChange; -_36.onChange=function(){ -}; -_27(_35,_36.value); -_36.onChange=fn; -}; -function _33(_37,_38){ -var _39=$.data(_37,"slider"); -var _3a=_39.options; -var _3b=_39.slider; -var _3c=_3a.mode=="h"?_3b.width():_3b.height(); -var pos=_3a.converter.toPosition.call(_37,_38,_3c); -if(_3a.mode=="v"){ -pos=_3b.height()-pos; -} -if(_3a.reversed){ -pos=_3c-pos; -} -return pos; -}; -function _25(_3d,pos){ -var _3e=$.data(_3d,"slider"); -var _3f=_3e.options; -var _40=_3e.slider; -var _41=_3f.mode=="h"?_40.width():_40.height(); -var pos=_3f.mode=="h"?(_3f.reversed?(_41-pos):pos):(_3f.reversed?pos:(_41-pos)); -var _42=_3f.converter.toValue.call(_3d,pos,_41); -return _42; -}; -$.fn.slider=function(_43,_44){ -if(typeof _43=="string"){ -return $.fn.slider.methods[_43](this,_44); -} -_43=_43||{}; -return this.each(function(){ -var _45=$.data(this,"slider"); -if(_45){ -$.extend(_45.options,_43); -}else{ -_45=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_43),slider:_1(this)}); -$(this)._propAttr("disabled",false); -} -var _46=_45.options; -_46.min=parseFloat(_46.min); -_46.max=parseFloat(_46.max); -if(_46.range){ -if(!$.isArray(_46.value)){ -_46.value=$.map(String(_46.value).split(_46.separator),function(v){ -return parseFloat(v); -}); -} -if(_46.value.length<2){ -_46.value.push(_46.max); -} -}else{ -_46.value=parseFloat(_46.value); -} -_46.step=parseFloat(_46.step); -_46.originalValue=_46.value; -_17(this); -_d(this); -_6(this); -}); -}; -$.fn.slider.methods={options:function(jq){ -return $.data(jq[0],"slider").options; -},destroy:function(jq){ -return jq.each(function(){ -$.data(this,"slider").slider.remove(); -$(this).remove(); -}); -},resize:function(jq,_47){ -return jq.each(function(){ -_6(this,_47); -}); -},getValue:function(jq){ -return jq.slider("options").value; -},getValues:function(jq){ -return jq.slider("options").value; -},setValue:function(jq,_48){ -return jq.each(function(){ -_27(this,[_48]); -}); -},setValues:function(jq,_49){ -return jq.each(function(){ -_27(this,_49); -}); -},clear:function(jq){ -return jq.each(function(){ -var _4a=$(this).slider("options"); -_27(this,_4a.range?[_4a.min,_4a.max]:[_4a.min]); -}); -},reset:function(jq){ -return jq.each(function(){ -var _4b=$(this).slider("options"); -$(this).slider(_4b.range?"setValues":"setValue",_4b.originalValue); -}); -},enable:function(jq){ -return jq.each(function(){ -$.data(this,"slider").options.disabled=false; -_17(this); -}); -},disable:function(jq){ -return jq.each(function(){ -$.data(this,"slider").options.disabled=true; -_17(this); -}); -}}; -$.fn.slider.parseOptions=function(_4c){ -var t=$(_4c); -return $.extend({},$.parser.parseOptions(_4c,["width","height","mode",{reversed:"boolean",showTip:"boolean",range:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)}); -}; -$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,range:false,value:0,separator:",",min:0,max:100,step:1,rule:[],tipFormatter:function(_4d){ -return _4d; -},converter:{toPosition:function(_4e,_4f){ -var _50=$(this).slider("options"); -var p=(_4e-_50.min)/(_50.max-_50.min)*_4f; -return p; -},toValue:function(pos,_51){ -var _52=$(this).slider("options"); -var v=_52.min+(_52.max-_52.min)*(pos/_51); -return v; -}},onChange:function(_53,_54){ -},onSlideStart:function(_55){ -},onSlideEnd:function(_56){ -},onComplete:function(_57){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.spinner.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.spinner.js deleted file mode 100755 index 0bb82369c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.spinner.js +++ /dev/null @@ -1,128 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$.data(_2,"spinner"); -var _4=_3.options; -var _5=$.extend(true,[],_4.icons); -if(_4.spinAlign=="left"||_4.spinAlign=="right"){ -_4.spinArrow=true; -_4.iconAlign=_4.spinAlign; -var _6={iconCls:"spinner-button-updown",handler:function(e){ -var _7=$(e.target).closest(".spinner-arrow-up,.spinner-arrow-down"); -_13(e.data.target,_7.hasClass("spinner-arrow-down")); -}}; -if(_4.spinAlign=="left"){ -_5.unshift(_6); -}else{ -_5.push(_6); -} -}else{ -_4.spinArrow=false; -if(_4.spinAlign=="vertical"){ -if(_4.buttonAlign!="top"){ -_4.buttonAlign="bottom"; -} -_4.clsLeft="textbox-button-bottom"; -_4.clsRight="textbox-button-top"; -}else{ -_4.clsLeft="textbox-button-left"; -_4.clsRight="textbox-button-right"; -} -} -$(_2).addClass("spinner-f").textbox($.extend({},_4,{icons:_5,doSize:false,onResize:function(_8,_9){ -if(!_4.spinArrow){ -var _a=$(this).next(); -var _b=_a.find(".textbox-button:not(.spinner-button)"); -if(_b.length){ -var _c=_b.outerWidth(); -var _d=_b.outerHeight(); -var _e=_a.find(".spinner-button."+_4.clsLeft); -var _f=_a.find(".spinner-button."+_4.clsRight); -if(_4.buttonAlign=="right"){ -_f.css("marginRight",_c+"px"); -}else{ -if(_4.buttonAlign=="left"){ -_e.css("marginLeft",_c+"px"); -}else{ -if(_4.buttonAlign=="top"){ -_f.css("marginTop",_d+"px"); -}else{ -_e.css("marginBottom",_d+"px"); -} -} -} -} -} -_4.onResize.call(this,_8,_9); -}})); -$(_2).attr("spinnerName",$(_2).attr("textboxName")); -_3.spinner=$(_2).next(); -_3.spinner.addClass("spinner"); -if(_4.spinArrow){ -var _10=_3.spinner.find(".spinner-button-updown"); -_10.append(""+""+""+""+""+""); -}else{ -var _11=$("").addClass(_4.clsLeft).appendTo(_3.spinner); -var _12=$("").addClass(_4.clsRight).appendTo(_3.spinner); -_11.linkbutton({iconCls:_4.reversed?"spinner-button-up":"spinner-button-down",onClick:function(){ -_13(_2,!_4.reversed); -}}); -_12.linkbutton({iconCls:_4.reversed?"spinner-button-down":"spinner-button-up",onClick:function(){ -_13(_2,_4.reversed); -}}); -if(_4.disabled){ -$(_2).spinner("disable"); -} -if(_4.readonly){ -$(_2).spinner("readonly"); -} -} -$(_2).spinner("resize"); -}; -function _13(_14,_15){ -var _16=$(_14).spinner("options"); -_16.spin.call(_14,_15); -_16[_15?"onSpinDown":"onSpinUp"].call(_14); -$(_14).spinner("validate"); -}; -$.fn.spinner=function(_17,_18){ -if(typeof _17=="string"){ -var _19=$.fn.spinner.methods[_17]; -if(_19){ -return _19(this,_18); -}else{ -return this.textbox(_17,_18); -} -} -_17=_17||{}; -return this.each(function(){ -var _1a=$.data(this,"spinner"); -if(_1a){ -$.extend(_1a.options,_17); -}else{ -_1a=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_17)}); -} -_1(this); -}); -}; -$.fn.spinner.methods={options:function(jq){ -var _1b=jq.textbox("options"); -return $.extend($.data(jq[0],"spinner").options,{width:_1b.width,value:_1b.value,originalValue:_1b.originalValue,disabled:_1b.disabled,readonly:_1b.readonly}); -}}; -$.fn.spinner.parseOptions=function(_1c){ -return $.extend({},$.fn.textbox.parseOptions(_1c),$.parser.parseOptions(_1c,["min","max","spinAlign",{increment:"number",reversed:"boolean"}])); -}; -$.fn.spinner.defaults=$.extend({},$.fn.textbox.defaults,{min:null,max:null,increment:1,spinAlign:"right",reversed:false,spin:function(_1d){ -},onSpinUp:function(){ -},onSpinDown:function(){ -}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.splitbutton.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.splitbutton.js deleted file mode 100755 index 5bb4e55e6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.splitbutton.js +++ /dev/null @@ -1,49 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$.data(_2,"splitbutton").options; -$(_2).menubutton(_3); -$(_2).addClass("s-btn"); -}; -$.fn.splitbutton=function(_4,_5){ -if(typeof _4=="string"){ -var _6=$.fn.splitbutton.methods[_4]; -if(_6){ -return _6(this,_5); -}else{ -return this.menubutton(_4,_5); -} -} -_4=_4||{}; -return this.each(function(){ -var _7=$.data(this,"splitbutton"); -if(_7){ -$.extend(_7.options,_4); -}else{ -$.data(this,"splitbutton",{options:$.extend({},$.fn.splitbutton.defaults,$.fn.splitbutton.parseOptions(this),_4)}); -$(this)._propAttr("disabled",false); -} -_1(this); -}); -}; -$.fn.splitbutton.methods={options:function(jq){ -var _8=jq.menubutton("options"); -var _9=$.data(jq[0],"splitbutton").options; -$.extend(_9,{disabled:_8.disabled,toggle:_8.toggle,selected:_8.selected}); -return _9; -}}; -$.fn.splitbutton.parseOptions=function(_a){ -var t=$(_a); -return $.extend({},$.fn.linkbutton.parseOptions(_a),$.parser.parseOptions(_a,["menu",{plain:"boolean",duration:"number"}])); -}; -$.fn.splitbutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100,cls:{btn1:"m-btn-active s-btn-active",btn2:"m-btn-plain-active s-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn-line"}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.switchbutton.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.switchbutton.js deleted file mode 100644 index 8a752c44c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.switchbutton.js +++ /dev/null @@ -1,193 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$(""+""+""+""+""+""+""+"").insertAfter(_2); -var t=$(_2); -t.addClass("switchbutton-f").hide(); -var _4=t.attr("name"); -if(_4){ -t.removeAttr("name").attr("switchbuttonName",_4); -_3.find(".switchbutton-value").attr("name",_4); -} -_3.bind("_resize",function(e,_5){ -if($(this).hasClass("easyui-fluid")||_5){ -_6(_2); -} -return false; -}); -return _3; -}; -function _6(_7,_8){ -var _9=$.data(_7,"switchbutton"); -var _a=_9.options; -var _b=_9.switchbutton; -if(_8){ -$.extend(_a,_8); -} -var _c=_b.is(":visible"); -if(!_c){ -_b.appendTo("body"); -} -_b._size(_a); -var w=_b.width(); -var h=_b.height(); -var w=_b.outerWidth(); -var h=_b.outerHeight(); -var _d=parseInt(_a.handleWidth)||_b.height(); -var _e=w*2-_d; -_b.find(".switchbutton-inner").css({width:_e+"px",height:h+"px",lineHeight:h+"px"}); -_b.find(".switchbutton-handle")._outerWidth(_d)._outerHeight(h).css({marginLeft:-_d/2+"px"}); -_b.find(".switchbutton-on").css({width:(w-_d/2)+"px",textIndent:(_a.reversed?"":"-")+_d/2+"px"}); -_b.find(".switchbutton-off").css({width:(w-_d/2)+"px",textIndent:(_a.reversed?"-":"")+_d/2+"px"}); -_a.marginWidth=w-_d; -_f(_7,_a.checked,false); -if(!_c){ -_b.insertAfter(_7); -} -}; -function _10(_11){ -var _12=$.data(_11,"switchbutton"); -var _13=_12.options; -var _14=_12.switchbutton; -var _15=_14.find(".switchbutton-inner"); -var on=_15.find(".switchbutton-on").html(_13.onText); -var off=_15.find(".switchbutton-off").html(_13.offText); -var _16=_15.find(".switchbutton-handle").html(_13.handleText); -if(_13.reversed){ -off.prependTo(_15); -on.insertAfter(_16); -}else{ -on.prependTo(_15); -off.insertAfter(_16); -} -_14.find(".switchbutton-value")._propAttr("checked",_13.checked); -_14.removeClass("switchbutton-disabled").addClass(_13.disabled?"switchbutton-disabled":""); -_14.removeClass("switchbutton-reversed").addClass(_13.reversed?"switchbutton-reversed":""); -_f(_11,_13.checked); -_17(_11,_13.readonly); -$(_11).switchbutton("setValue",_13.value); -}; -function _f(_18,_19,_1a){ -var _1b=$.data(_18,"switchbutton"); -var _1c=_1b.options; -_1c.checked=_19; -var _1d=_1b.switchbutton.find(".switchbutton-inner"); -var _1e=_1d.find(".switchbutton-on"); -var _1f=_1c.reversed?(_1c.checked?_1c.marginWidth:0):(_1c.checked?0:_1c.marginWidth); -var dir=_1e.css("float").toLowerCase(); -var css={}; -css["margin-"+dir]=-_1f+"px"; -_1a?_1d.animate(css,200):_1d.css(css); -var _20=_1d.find(".switchbutton-value"); -var ck=_20.is(":checked"); -$(_18).add(_20)._propAttr("checked",_1c.checked); -if(ck!=_1c.checked){ -_1c.onChange.call(_18,_1c.checked); -} -}; -function _21(_22,_23){ -var _24=$.data(_22,"switchbutton"); -var _25=_24.options; -var _26=_24.switchbutton; -var _27=_26.find(".switchbutton-value"); -if(_23){ -_25.disabled=true; -$(_22).add(_27)._propAttr("disabled",true); -_26.addClass("switchbutton-disabled"); -}else{ -_25.disabled=false; -$(_22).add(_27)._propAttr("disabled",false); -_26.removeClass("switchbutton-disabled"); -} -}; -function _17(_28,_29){ -var _2a=$.data(_28,"switchbutton"); -var _2b=_2a.options; -_2b.readonly=_29==undefined?true:_29; -_2a.switchbutton.removeClass("switchbutton-readonly").addClass(_2b.readonly?"switchbutton-readonly":""); -}; -function _2c(_2d){ -var _2e=$.data(_2d,"switchbutton"); -var _2f=_2e.options; -_2e.switchbutton.unbind(".switchbutton").bind("click.switchbutton",function(){ -if(!_2f.disabled&&!_2f.readonly){ -_f(_2d,_2f.checked?false:true,true); -} -}); -}; -$.fn.switchbutton=function(_30,_31){ -if(typeof _30=="string"){ -return $.fn.switchbutton.methods[_30](this,_31); -} -_30=_30||{}; -return this.each(function(){ -var _32=$.data(this,"switchbutton"); -if(_32){ -$.extend(_32.options,_30); -}else{ -_32=$.data(this,"switchbutton",{options:$.extend({},$.fn.switchbutton.defaults,$.fn.switchbutton.parseOptions(this),_30),switchbutton:_1(this)}); -} -_32.options.originalChecked=_32.options.checked; -_10(this); -_6(this); -_2c(this); -}); -}; -$.fn.switchbutton.methods={options:function(jq){ -var _33=jq.data("switchbutton"); -return $.extend(_33.options,{value:_33.switchbutton.find(".switchbutton-value").val()}); -},resize:function(jq,_34){ -return jq.each(function(){ -_6(this,_34); -}); -},enable:function(jq){ -return jq.each(function(){ -_21(this,false); -}); -},disable:function(jq){ -return jq.each(function(){ -_21(this,true); -}); -},readonly:function(jq,_35){ -return jq.each(function(){ -_17(this,_35); -}); -},check:function(jq){ -return jq.each(function(){ -_f(this,true); -}); -},uncheck:function(jq){ -return jq.each(function(){ -_f(this,false); -}); -},clear:function(jq){ -return jq.each(function(){ -_f(this,false); -}); -},reset:function(jq){ -return jq.each(function(){ -var _36=$(this).switchbutton("options"); -_f(this,_36.originalChecked); -}); -},setValue:function(jq,_37){ -return jq.each(function(){ -$(this).val(_37); -$.data(this,"switchbutton").switchbutton.find(".switchbutton-value").val(_37); -}); -}}; -$.fn.switchbutton.parseOptions=function(_38){ -var t=$(_38); -return $.extend({},$.parser.parseOptions(_38,["onText","offText","handleText",{handleWidth:"number",reversed:"boolean"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)}); -}; -$.fn.switchbutton.defaults={handleWidth:"auto",width:60,height:30,checked:false,disabled:false,readonly:false,reversed:false,onText:"ON",offText:"OFF",handleText:"",value:"on",onChange:function(_39){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tabs.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tabs.js deleted file mode 100755 index 4dc74d913..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tabs.js +++ /dev/null @@ -1,716 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(c){ -var w=0; -$(c).children().each(function(){ -w+=$(this).outerWidth(true); -}); -return w; -}; -function _2(_3){ -var _4=$.data(_3,"tabs").options; -if(!_4.showHeader){ -return; -} -var _5=$(_3).children("div.tabs-header"); -var _6=_5.children("div.tabs-tool:not(.tabs-tool-hidden)"); -var _7=_5.children("div.tabs-scroller-left"); -var _8=_5.children("div.tabs-scroller-right"); -var _9=_5.children("div.tabs-wrap"); -if(_4.tabPosition=="left"||_4.tabPosition=="right"){ -if(!_6.length){ -return; -} -_6._outerWidth(_5.width()); -var _a={left:_4.tabPosition=="left"?"auto":0,right:_4.tabPosition=="left"?0:"auto",top:_4.toolPosition=="top"?0:"auto",bottom:_4.toolPosition=="top"?"auto":0}; -var _b={marginTop:_4.toolPosition=="top"?_6.outerHeight():0}; -_6.css(_a); -_9.css(_b); -return; -} -var _c=_5.outerHeight(); -if(_4.plain){ -_c-=_c-_5.height(); -} -_6._outerHeight(_c); -var _d=_1(_5.find("ul.tabs")); -var _e=_5.width()-_6._outerWidth(); -if(_d>_e){ -_7.add(_8).show()._outerHeight(_c); -if(_4.toolPosition=="left"){ -_6.css({left:_7.outerWidth(),right:""}); -_9.css({marginLeft:_7.outerWidth()+_6._outerWidth(),marginRight:_8._outerWidth(),width:_e-_7.outerWidth()-_8.outerWidth()}); -}else{ -_6.css({left:"",right:_8.outerWidth()}); -_9.css({marginLeft:_7.outerWidth(),marginRight:_8.outerWidth()+_6._outerWidth(),width:_e-_7.outerWidth()-_8.outerWidth()}); -} -}else{ -_7.add(_8).hide(); -if(_4.toolPosition=="left"){ -_6.css({left:0,right:""}); -_9.css({marginLeft:_6._outerWidth(),marginRight:0,width:_e}); -}else{ -_6.css({left:"",right:0}); -_9.css({marginLeft:0,marginRight:_6._outerWidth(),width:_e}); -} -} -}; -function _f(_10){ -var _11=$.data(_10,"tabs").options; -var _12=$(_10).children("div.tabs-header"); -if(_11.tools){ -if(typeof _11.tools=="string"){ -$(_11.tools).addClass("tabs-tool").appendTo(_12); -$(_11.tools).show(); -}else{ -_12.children("div.tabs-tool").remove(); -var _13=$("
                                                                                                                                                            ").appendTo(_12); -var tr=_13.find("tr"); -for(var i=0;i<_11.tools.length;i++){ -var td=$("").appendTo(tr); -var _14=$("").appendTo(td); -_14[0].onclick=eval(_11.tools[i].handler||function(){ -}); -_14.linkbutton($.extend({},_11.tools[i],{plain:true})); -} -} -}else{ -_12.children("div.tabs-tool").remove(); -} -}; -function _15(_16,_17){ -var _18=$.data(_16,"tabs"); -var _19=_18.options; -var cc=$(_16); -if(!_19.doSize){ -return; -} -if(_17){ -$.extend(_19,{width:_17.width,height:_17.height}); -} -cc._size(_19); -var _1a=cc.children("div.tabs-header"); -var _1b=cc.children("div.tabs-panels"); -var _1c=_1a.find("div.tabs-wrap"); -var ul=_1c.find(".tabs"); -ul.children("li").removeClass("tabs-first tabs-last"); -ul.children("li:first").addClass("tabs-first"); -ul.children("li:last").addClass("tabs-last"); -if(_19.tabPosition=="left"||_19.tabPosition=="right"){ -_1a._outerWidth(_19.showHeader?_19.headerWidth:0); -_1b._outerWidth(cc.width()-_1a.outerWidth()); -_1a.add(_1b)._size("height",isNaN(parseInt(_19.height))?"":cc.height()); -_1c._outerWidth(_1a.width()); -ul._outerWidth(_1c.width()).css("height",""); -}else{ -_1a.children("div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)").css("display",_19.showHeader?"block":"none"); -_1a._outerWidth(cc.width()).css("height",""); -if(_19.showHeader){ -_1a.css("background-color",""); -_1c.css("height",""); -}else{ -_1a.css("background-color","transparent"); -_1a._outerHeight(0); -_1c._outerHeight(0); -} -ul._outerHeight(_19.tabHeight).css("width",""); -ul._outerHeight(ul.outerHeight()-ul.height()-1+_19.tabHeight).css("width",""); -_1b._size("height",isNaN(parseInt(_19.height))?"":(cc.height()-_1a.outerHeight())); -_1b._size("width",cc.width()); -} -if(_18.tabs.length){ -var d1=ul.outerWidth(true)-ul.width(); -var li=ul.children("li:first"); -var d2=li.outerWidth(true)-li.width(); -var _1d=_1a.width()-_1a.children(".tabs-tool:not(.tabs-tool-hidden)")._outerWidth(); -var _1e=Math.floor((_1d-d1-d2*_18.tabs.length)/_18.tabs.length); -$.map(_18.tabs,function(p){ -_1f(p,(_19.justified&&$.inArray(_19.tabPosition,["top","bottom"])>=0)?_1e:undefined); -}); -if(_19.justified&&$.inArray(_19.tabPosition,["top","bottom"])>=0){ -var _20=_1d-d1-_1(ul); -_1f(_18.tabs[_18.tabs.length-1],_1e+_20); -} -} -_2(_16); -function _1f(p,_21){ -var _22=p.panel("options"); -var p_t=_22.tab.find("a.tabs-inner"); -var _21=_21?_21:(parseInt(_22.tabWidth||_19.tabWidth||undefined)); -if(_21){ -p_t._outerWidth(_21); -}else{ -p_t.css("width",""); -} -p_t._outerHeight(_19.tabHeight); -p_t.css("lineHeight",p_t.height()+"px"); -p_t.find(".easyui-fluid:visible").triggerHandler("_resize"); -}; -}; -function _23(_24){ -var _25=$.data(_24,"tabs").options; -var tab=_26(_24); -if(tab){ -var _27=$(_24).children("div.tabs-panels"); -var _28=_25.width=="auto"?"auto":_27.width(); -var _29=_25.height=="auto"?"auto":_27.height(); -tab.panel("resize",{width:_28,height:_29}); -} -}; -function _2a(_2b){ -var _2c=$.data(_2b,"tabs").tabs; -var cc=$(_2b).addClass("tabs-container"); -var _2d=$("
                                                                                                                                                            ").insertBefore(cc); -cc.children("div").each(function(){ -_2d[0].appendChild(this); -}); -cc[0].appendChild(_2d[0]); -$("
                                                                                                                                                            "+"
                                                                                                                                                            "+"
                                                                                                                                                            "+"
                                                                                                                                                            "+"
                                                                                                                                                              "+"
                                                                                                                                                              "+"
                                                                                                                                                              ").prependTo(_2b); -cc.children("div.tabs-panels").children("div").each(function(i){ -var _2e=$.extend({},$.parser.parseOptions(this),{disabled:($(this).attr("disabled")?true:undefined),selected:($(this).attr("selected")?true:undefined)}); -_3e(_2b,_2e,$(this)); -}); -cc.children("div.tabs-header").find(".tabs-scroller-left, .tabs-scroller-right").hover(function(){ -$(this).addClass("tabs-scroller-over"); -},function(){ -$(this).removeClass("tabs-scroller-over"); -}); -cc.bind("_resize",function(e,_2f){ -if($(this).hasClass("easyui-fluid")||_2f){ -_15(_2b); -_23(_2b); -} -return false; -}); -}; -function _30(_31){ -var _32=$.data(_31,"tabs"); -var _33=_32.options; -$(_31).children("div.tabs-header").unbind().bind("click",function(e){ -if($(e.target).hasClass("tabs-scroller-left")){ -$(_31).tabs("scrollBy",-_33.scrollIncrement); -}else{ -if($(e.target).hasClass("tabs-scroller-right")){ -$(_31).tabs("scrollBy",_33.scrollIncrement); -}else{ -var li=$(e.target).closest("li"); -if(li.hasClass("tabs-disabled")){ -return false; -} -var a=$(e.target).closest("a.tabs-close"); -if(a.length){ -_5d(_31,_34(li)); -}else{ -if(li.length){ -var _35=_34(li); -var _36=_32.tabs[_35].panel("options"); -if(_36.collapsible){ -_36.closed?_53(_31,_35):_7b(_31,_35); -}else{ -_53(_31,_35); -} -} -} -return false; -} -} -}).bind("contextmenu",function(e){ -var li=$(e.target).closest("li"); -if(li.hasClass("tabs-disabled")){ -return; -} -if(li.length){ -_33.onContextMenu.call(_31,e,li.find("span.tabs-title").html(),_34(li)); -} -}); -function _34(li){ -var _37=0; -li.parent().children("li").each(function(i){ -if(li[0]==this){ -_37=i; -return false; -} -}); -return _37; -}; -}; -function _38(_39){ -var _3a=$.data(_39,"tabs").options; -var _3b=$(_39).children("div.tabs-header"); -var _3c=$(_39).children("div.tabs-panels"); -_3b.removeClass("tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right"); -_3c.removeClass("tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right"); -if(_3a.tabPosition=="top"){ -_3b.insertBefore(_3c); -}else{ -if(_3a.tabPosition=="bottom"){ -_3b.insertAfter(_3c); -_3b.addClass("tabs-header-bottom"); -_3c.addClass("tabs-panels-top"); -}else{ -if(_3a.tabPosition=="left"){ -_3b.addClass("tabs-header-left"); -_3c.addClass("tabs-panels-right"); -}else{ -if(_3a.tabPosition=="right"){ -_3b.addClass("tabs-header-right"); -_3c.addClass("tabs-panels-left"); -} -} -} -} -if(_3a.plain==true){ -_3b.addClass("tabs-header-plain"); -}else{ -_3b.removeClass("tabs-header-plain"); -} -_3b.removeClass("tabs-header-narrow").addClass(_3a.narrow?"tabs-header-narrow":""); -var _3d=_3b.find(".tabs"); -_3d.removeClass("tabs-pill").addClass(_3a.pill?"tabs-pill":""); -_3d.removeClass("tabs-narrow").addClass(_3a.narrow?"tabs-narrow":""); -_3d.removeClass("tabs-justified").addClass(_3a.justified?"tabs-justified":""); -if(_3a.border==true){ -_3b.removeClass("tabs-header-noborder"); -_3c.removeClass("tabs-panels-noborder"); -}else{ -_3b.addClass("tabs-header-noborder"); -_3c.addClass("tabs-panels-noborder"); -} -_3a.doSize=true; -}; -function _3e(_3f,_40,pp){ -_40=_40||{}; -var _41=$.data(_3f,"tabs"); -var _42=_41.tabs; -if(_40.index==undefined||_40.index>_42.length){ -_40.index=_42.length; -} -if(_40.index<0){ -_40.index=0; -} -var ul=$(_3f).children("div.tabs-header").find("ul.tabs"); -var _43=$(_3f).children("div.tabs-panels"); -var tab=$("
                                                                                                                                                            • "+""+""+""+""+"
                                                                                                                                                            • "); -if(!pp){ -pp=$("
                                                                                                                                                              "); -} -if(_40.index>=_42.length){ -tab.appendTo(ul); -pp.appendTo(_43); -_42.push(pp); -}else{ -tab.insertBefore(ul.children("li:eq("+_40.index+")")); -pp.insertBefore(_43.children("div.panel:eq("+_40.index+")")); -_42.splice(_40.index,0,pp); -} -pp.panel($.extend({},_40,{tab:tab,border:false,noheader:true,closed:true,doSize:false,iconCls:(_40.icon?_40.icon:undefined),onLoad:function(){ -if(_40.onLoad){ -_40.onLoad.apply(this,arguments); -} -_41.options.onLoad.call(_3f,$(this)); -},onBeforeOpen:function(){ -if(_40.onBeforeOpen){ -if(_40.onBeforeOpen.call(this)==false){ -return false; -} -} -var p=$(_3f).tabs("getSelected"); -if(p){ -if(p[0]!=this){ -$(_3f).tabs("unselect",_4d(_3f,p)); -p=$(_3f).tabs("getSelected"); -if(p){ -return false; -} -}else{ -_23(_3f); -return false; -} -} -var _44=$(this).panel("options"); -_44.tab.addClass("tabs-selected"); -var _45=$(_3f).find(">div.tabs-header>div.tabs-wrap"); -var _46=_44.tab.position().left; -var _47=_46+_44.tab.outerWidth(); -if(_46<0||_47>_45.width()){ -var _48=_46-(_45.width()-_44.tab.width())/2; -$(_3f).tabs("scrollBy",_48); -}else{ -$(_3f).tabs("scrollBy",0); -} -var _49=$(this).panel("panel"); -_49.css("display","block"); -_23(_3f); -_49.css("display","none"); -},onOpen:function(){ -if(_40.onOpen){ -_40.onOpen.call(this); -} -var _4a=$(this).panel("options"); -var _4b=_4d(_3f,this); -_41.selectHis.push(_4b); -_41.options.onSelect.call(_3f,_4a.title,_4b); -},onBeforeClose:function(){ -if(_40.onBeforeClose){ -if(_40.onBeforeClose.call(this)==false){ -return false; -} -} -$(this).panel("options").tab.removeClass("tabs-selected"); -},onClose:function(){ -if(_40.onClose){ -_40.onClose.call(this); -} -var _4c=$(this).panel("options"); -_41.options.onUnselect.call(_3f,_4c.title,_4d(_3f,this)); -}})); -$(_3f).tabs("update",{tab:pp,options:pp.panel("options"),type:"header"}); -}; -function _4e(_4f,_50){ -var _51=$.data(_4f,"tabs"); -var _52=_51.options; -if(_50.selected==undefined){ -_50.selected=true; -} -_3e(_4f,_50); -_52.onAdd.call(_4f,_50.title,_50.index); -if(_50.selected){ -_53(_4f,_50.index); -} -}; -function _54(_55,_56){ -_56.type=_56.type||"all"; -var _57=$.data(_55,"tabs").selectHis; -var pp=_56.tab; -var _58=pp.panel("options"); -var _59=_58.title; -$.extend(_58,_56.options,{iconCls:(_56.options.icon?_56.options.icon:undefined)}); -if(_56.type=="all"||_56.type=="body"){ -pp.panel(); -} -if(_56.type=="all"||_56.type=="header"){ -var tab=_58.tab; -if(_58.header){ -tab.find(".tabs-inner").html($(_58.header)); -}else{ -var _5a=tab.find("span.tabs-title"); -var _5b=tab.find("span.tabs-icon"); -_5a.html(_58.title); -_5b.attr("class","tabs-icon"); -tab.find("a.tabs-close").remove(); -if(_58.closable){ -_5a.addClass("tabs-closable"); -$("").appendTo(tab); -}else{ -_5a.removeClass("tabs-closable"); -} -if(_58.iconCls){ -_5a.addClass("tabs-with-icon"); -_5b.addClass(_58.iconCls); -}else{ -_5a.removeClass("tabs-with-icon"); -} -if(_58.tools){ -var _5c=tab.find("span.tabs-p-tool"); -if(!_5c.length){ -var _5c=$("").insertAfter(tab.find("a.tabs-inner")); -} -if($.isArray(_58.tools)){ -_5c.empty(); -for(var i=0;i<_58.tools.length;i++){ -var t=$("").appendTo(_5c); -t.addClass(_58.tools[i].iconCls); -if(_58.tools[i].handler){ -t.bind("click",{handler:_58.tools[i].handler},function(e){ -if($(this).parents("li").hasClass("tabs-disabled")){ -return; -} -e.data.handler.call(this); -}); -} -} -}else{ -$(_58.tools).children().appendTo(_5c); -} -var pr=_5c.children().length*12; -if(_58.closable){ -pr+=8; -_5c.css("right",""); -}else{ -pr-=3; -_5c.css("right","5px"); -} -_5a.css("padding-right",pr+"px"); -}else{ -tab.find("span.tabs-p-tool").remove(); -_5a.css("padding-right",""); -} -} -} -if(_58.disabled){ -_58.tab.addClass("tabs-disabled"); -}else{ -_58.tab.removeClass("tabs-disabled"); -} -_15(_55); -$.data(_55,"tabs").options.onUpdate.call(_55,_58.title,_4d(_55,pp)); -}; -function _5d(_5e,_5f){ -var _60=$.data(_5e,"tabs"); -var _61=_60.options; -var _62=_60.tabs; -var _63=_60.selectHis; -if(!_64(_5e,_5f)){ -return; -} -var tab=_65(_5e,_5f); -var _66=tab.panel("options").title; -var _67=_4d(_5e,tab); -if(_61.onBeforeClose.call(_5e,_66,_67)==false){ -return; -} -var tab=_65(_5e,_5f,true); -tab.panel("options").tab.remove(); -tab.panel("destroy"); -_61.onClose.call(_5e,_66,_67); -_15(_5e); -var his=[]; -for(var i=0;i<_63.length;i++){ -var _68=_63[i]; -if(_68!=_67){ -his.push(_68>_67?_68-1:_68); -} -} -_60.selectHis=his; -var _69=$(_5e).tabs("getSelected"); -if(!_69&&his.length){ -_67=_60.selectHis.pop(); -$(_5e).tabs("select",_67); -} -}; -function _65(_6a,_6b,_6c){ -var _6d=$.data(_6a,"tabs").tabs; -var tab=null; -if(typeof _6b=="number"){ -if(_6b>=0&&_6b<_6d.length){ -tab=_6d[_6b]; -if(_6c){ -_6d.splice(_6b,1); -} -} -}else{ -var tmp=$(""); -for(var i=0;i<_6d.length;i++){ -var p=_6d[i]; -tmp.html(p.panel("options").title); -var _6e=tmp.text(); -tmp.html(_6b); -_6b=tmp.text(); -if(_6e==_6b){ -tab=p; -if(_6c){ -_6d.splice(i,1); -} -break; -} -} -tmp.remove(); -} -return tab; -}; -function _4d(_6f,tab){ -var _70=$.data(_6f,"tabs").tabs; -for(var i=0;i<_70.length;i++){ -if(_70[i][0]==$(tab)[0]){ -return i; -} -} -return -1; -}; -function _26(_71){ -var _72=$.data(_71,"tabs").tabs; -for(var i=0;i<_72.length;i++){ -var tab=_72[i]; -if(tab.panel("options").tab.hasClass("tabs-selected")){ -return tab; -} -} -return null; -}; -function _73(_74){ -var _75=$.data(_74,"tabs"); -var _76=_75.tabs; -for(var i=0;i<_76.length;i++){ -var _77=_76[i].panel("options"); -if(_77.selected&&!_77.disabled){ -_53(_74,i); -return; -} -} -_53(_74,_75.options.selected); -}; -function _53(_78,_79){ -var p=_65(_78,_79); -if(p&&!p.is(":visible")){ -_7a(_78); -if(!p.panel("options").disabled){ -p.panel("open"); -} -} -}; -function _7b(_7c,_7d){ -var p=_65(_7c,_7d); -if(p&&p.is(":visible")){ -_7a(_7c); -p.panel("close"); -} -}; -function _7a(_7e){ -$(_7e).children("div.tabs-panels").each(function(){ -$(this).stop(true,true); -}); -}; -function _64(_7f,_80){ -return _65(_7f,_80)!=null; -}; -function _81(_82,_83){ -var _84=$.data(_82,"tabs").options; -_84.showHeader=_83; -$(_82).tabs("resize"); -}; -function _85(_86,_87){ -var _88=$(_86).find(">.tabs-header>.tabs-tool"); -if(_87){ -_88.removeClass("tabs-tool-hidden").show(); -}else{ -_88.addClass("tabs-tool-hidden").hide(); -} -$(_86).tabs("resize").tabs("scrollBy",0); -}; -$.fn.tabs=function(_89,_8a){ -if(typeof _89=="string"){ -return $.fn.tabs.methods[_89](this,_8a); -} -_89=_89||{}; -return this.each(function(){ -var _8b=$.data(this,"tabs"); -if(_8b){ -$.extend(_8b.options,_89); -}else{ -$.data(this,"tabs",{options:$.extend({},$.fn.tabs.defaults,$.fn.tabs.parseOptions(this),_89),tabs:[],selectHis:[]}); -_2a(this); -} -_f(this); -_38(this); -_15(this); -_30(this); -_73(this); -}); -}; -$.fn.tabs.methods={options:function(jq){ -var cc=jq[0]; -var _8c=$.data(cc,"tabs").options; -var s=_26(cc); -_8c.selected=s?_4d(cc,s):-1; -return _8c; -},tabs:function(jq){ -return $.data(jq[0],"tabs").tabs; -},resize:function(jq,_8d){ -return jq.each(function(){ -_15(this,_8d); -_23(this); -}); -},add:function(jq,_8e){ -return jq.each(function(){ -_4e(this,_8e); -}); -},close:function(jq,_8f){ -return jq.each(function(){ -_5d(this,_8f); -}); -},getTab:function(jq,_90){ -return _65(jq[0],_90); -},getTabIndex:function(jq,tab){ -return _4d(jq[0],tab); -},getSelected:function(jq){ -return _26(jq[0]); -},select:function(jq,_91){ -return jq.each(function(){ -_53(this,_91); -}); -},unselect:function(jq,_92){ -return jq.each(function(){ -_7b(this,_92); -}); -},exists:function(jq,_93){ -return _64(jq[0],_93); -},update:function(jq,_94){ -return jq.each(function(){ -_54(this,_94); -}); -},enableTab:function(jq,_95){ -return jq.each(function(){ -var _96=$(this).tabs("getTab",_95).panel("options"); -_96.tab.removeClass("tabs-disabled"); -_96.disabled=false; -}); -},disableTab:function(jq,_97){ -return jq.each(function(){ -var _98=$(this).tabs("getTab",_97).panel("options"); -_98.tab.addClass("tabs-disabled"); -_98.disabled=true; -}); -},showHeader:function(jq){ -return jq.each(function(){ -_81(this,true); -}); -},hideHeader:function(jq){ -return jq.each(function(){ -_81(this,false); -}); -},showTool:function(jq){ -return jq.each(function(){ -_85(this,true); -}); -},hideTool:function(jq){ -return jq.each(function(){ -_85(this,false); -}); -},scrollBy:function(jq,_99){ -return jq.each(function(){ -var _9a=$(this).tabs("options"); -var _9b=$(this).find(">div.tabs-header>div.tabs-wrap"); -var pos=Math.min(_9b._scrollLeft()+_99,_9c()); -_9b.animate({scrollLeft:pos},_9a.scrollDuration); -function _9c(){ -var w=0; -var ul=_9b.children("ul"); -ul.children("li").each(function(){ -w+=$(this).outerWidth(true); -}); -return w-_9b.width()+(ul.outerWidth()-ul.width()); -}; -}); -}}; -$.fn.tabs.parseOptions=function(_9d){ -return $.extend({},$.parser.parseOptions(_9d,["tools","toolPosition","tabPosition",{fit:"boolean",border:"boolean",plain:"boolean"},{headerWidth:"number",tabWidth:"number",tabHeight:"number",selected:"number"},{showHeader:"boolean",justified:"boolean",narrow:"boolean",pill:"boolean"}])); -}; -$.fn.tabs.defaults={width:"auto",height:"auto",headerWidth:150,tabWidth:"auto",tabHeight:32,selected:0,showHeader:true,plain:false,fit:false,border:true,justified:false,narrow:false,pill:false,tools:null,toolPosition:"right",tabPosition:"top",scrollIncrement:100,scrollDuration:400,onLoad:function(_9e){ -},onSelect:function(_9f,_a0){ -},onUnselect:function(_a1,_a2){ -},onBeforeClose:function(_a3,_a4){ -},onClose:function(_a5,_a6){ -},onAdd:function(_a7,_a8){ -},onUpdate:function(_a9,_aa){ -},onContextMenu:function(e,_ab,_ac){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tagbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tagbox.js deleted file mode 100644 index d08e02fe6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tagbox.js +++ /dev/null @@ -1,223 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$.data(_2,"tagbox"); -var _4=_3.options; -$(_2).addClass("tagbox-f").combobox($.extend({},_4,{cls:"tagbox",reversed:true,onChange:function(_5,_6){ -_7(); -$(this).combobox("hidePanel"); -_4.onChange.call(_2,_5,_6); -},onResizing:function(_8,_9){ -var _a=$(this).combobox("textbox"); -var tb=$(this).data("textbox").textbox; -var _b=tb.outerWidth(); -tb.css({height:"",paddingLeft:_a.css("marginLeft"),paddingRight:_a.css("marginRight")}); -_a.css("margin",0); -tb._outerWidth(_b); -_23(_2); -_12(this); -_4.onResizing.call(_2,_8,_9); -},onLoadSuccess:function(_c){ -_7(); -_4.onLoadSuccess.call(_2,_c); -}})); -_7(); -_23(_2); -function _7(){ -$(_2).next().find(".tagbox-label").remove(); -var _d=$(_2).tagbox("textbox"); -var ss=[]; -$.map($(_2).tagbox("getValues"),function(_e,_f){ -var row=_4.finder.getRow(_2,_e); -var _10=_4.tagFormatter.call(_2,_e,row); -var cs={}; -var css=_4.tagStyler.call(_2,_e,row)||""; -if(typeof css=="string"){ -cs={s:css}; -}else{ -cs={c:css["class"]||"",s:css["style"]||""}; -} -var _11=$("").insertBefore(_d).html(_10); -_11.attr("tagbox-index",_f); -_11.attr("style",cs.s).addClass(cs.c); -$("").appendTo(_11); -}); -_12(_2); -$(_2).combobox("setText",""); -}; -}; -function _12(_13,_14){ -var _15=$(_13).next(); -var _16=_14?$(_14):_15.find(".tagbox-label"); -if(_16.length){ -var _17=$(_13).tagbox("textbox"); -var _18=$(_16[0]); -var _19=_18.outerHeight(true)-_18.outerHeight(); -var _1a=_17.outerHeight()-_19*2; -_16.css({height:_1a+"px",lineHeight:_1a+"px"}); -var _1b=_15.find(".textbox-addon").css("height","100%"); -_1b.find(".textbox-icon").css("height","100%"); -_15.find(".textbox-button").linkbutton("resize",{height:"100%"}); -} -}; -function _1c(_1d){ -var _1e=$(_1d).next(); -_1e.unbind(".tagbox").bind("click.tagbox",function(e){ -var _1f=$(_1d).tagbox("options"); -if(_1f.disabled||_1f.readonly){ -return; -} -if($(e.target).hasClass("tagbox-remove")){ -var _20=parseInt($(e.target).parent().attr("tagbox-index")); -var _21=$(_1d).tagbox("getValues"); -if(_1f.onBeforeRemoveTag.call(_1d,_21[_20])==false){ -return; -} -_1f.onRemoveTag.call(_1d,_21[_20]); -_21.splice(_20,1); -$(_1d).tagbox("setValues",_21); -}else{ -var _22=$(e.target).closest(".tagbox-label"); -if(_22.length){ -var _20=parseInt(_22.attr("tagbox-index")); -var _21=$(_1d).tagbox("getValues"); -_1f.onClickTag.call(_1d,_21[_20]); -} -} -$(this).find(".textbox-text").focus(); -}).bind("keyup.tagbox",function(e){ -_23(_1d); -}).bind("mouseover.tagbox",function(e){ -if($(e.target).closest(".textbox-button,.textbox-addon,.tagbox-label").length){ -$(this).triggerHandler("mouseleave"); -}else{ -$(this).find(".textbox-text").triggerHandler("mouseenter"); -} -}).bind("mouseleave.tagbox",function(e){ -$(this).find(".textbox-text").triggerHandler("mouseleave"); -}); -}; -function _23(_24){ -var _25=$(_24).tagbox("options"); -var _26=$(_24).tagbox("textbox"); -var _27=$(_24).next(); -var tmp=$("").appendTo("body"); -tmp.attr("style",_26.attr("style")); -tmp.css({position:"absolute",top:-9999,left:-9999,width:"auto",fontFamily:_26.css("fontFamily"),fontSize:_26.css("fontSize"),fontWeight:_26.css("fontWeight"),whiteSpace:"nowrap"}); -var _28=_29(_26.val()); -var _2a=_29(_25.prompt||""); -tmp.remove(); -var _2b=Math.min(Math.max(_28,_2a)+20,_27.width()); -_26._outerWidth(_2b); -_27.find(".textbox-button").linkbutton("resize",{height:"100%"}); -function _29(val){ -var s=val.replace(/&/g,"&").replace(/\s/g," ").replace(//g,">"); -tmp.html(s); -return tmp.outerWidth(); -}; -}; -function _2c(_2d){ -var t=$(_2d); -var _2e=t.tagbox("options"); -if(_2e.limitToList){ -var _2f=t.tagbox("panel"); -var _30=_2f.children("div.combobox-item-hover"); -if(_30.length){ -_30.removeClass("combobox-item-hover"); -var row=_2e.finder.getRow(_2d,_30); -var _31=row[_2e.valueField]; -$(_2d).tagbox(_30.hasClass("combobox-item-selected")?"unselect":"select",_31); -} -$(_2d).tagbox("hidePanel"); -}else{ -var v=$.trim($(_2d).tagbox("getText")); -if(v!==""){ -var _32=$(_2d).tagbox("getValues"); -_32.push(v); -$(_2d).tagbox("setValues",_32); -} -} -}; -function _33(_34,_35){ -$(_34).combobox("setText",""); -_23(_34); -$(_34).combobox("setValues",_35); -$(_34).combobox("setText",""); -$(_34).tagbox("validate"); -}; -$.fn.tagbox=function(_36,_37){ -if(typeof _36=="string"){ -var _38=$.fn.tagbox.methods[_36]; -if(_38){ -return _38(this,_37); -}else{ -return this.combobox(_36,_37); -} -} -_36=_36||{}; -return this.each(function(){ -var _39=$.data(this,"tagbox"); -if(_39){ -$.extend(_39.options,_36); -}else{ -$.data(this,"tagbox",{options:$.extend({},$.fn.tagbox.defaults,$.fn.tagbox.parseOptions(this),_36)}); -} -_1(this); -_1c(this); -}); -}; -$.fn.tagbox.methods={options:function(jq){ -var _3a=jq.combobox("options"); -return $.extend($.data(jq[0],"tagbox").options,{width:_3a.width,height:_3a.height,originalValue:_3a.originalValue,disabled:_3a.disabled,readonly:_3a.readonly}); -},setValues:function(jq,_3b){ -return jq.each(function(){ -_33(this,_3b); -}); -},reset:function(jq){ -return jq.each(function(){ -$(this).combobox("reset").combobox("setText",""); -}); -}}; -$.fn.tagbox.parseOptions=function(_3c){ -return $.extend({},$.fn.combobox.parseOptions(_3c),$.parser.parseOptions(_3c,[])); -}; -$.fn.tagbox.defaults=$.extend({},$.fn.combobox.defaults,{hasDownArrow:false,multiple:true,reversed:true,selectOnNavigation:false,tipOptions:$.extend({},$.fn.textbox.defaults.tipOptions,{showDelay:200}),val:function(_3d){ -var vv=$(_3d).parent().prev().tagbox("getValues"); -if($(_3d).is(":focus")){ -vv.push($(_3d).val()); -} -return vv.join(","); -},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){ -var _3e=e.data.target; -var _3f=$(_3e).tagbox("options"); -if(_3f.limitToList){ -_2c(_3e); -} -}}),keyHandler:$.extend({},$.fn.combobox.defaults.keyHandler,{enter:function(e){ -_2c(this); -},query:function(q,e){ -var _40=$(this).tagbox("options"); -if(_40.limitToList){ -$.fn.combobox.defaults.keyHandler.query.call(this,q,e); -}else{ -$(this).combobox("hidePanel"); -} -}}),tagFormatter:function(_41,row){ -var _42=$(this).tagbox("options"); -return row?row[_42.textField]:_41; -},tagStyler:function(_43,row){ -return ""; -},onClickTag:function(_44){ -},onBeforeRemoveTag:function(_45){ -},onRemoveTag:function(_46){ -}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.textbox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.textbox.js deleted file mode 100644 index c3a57164d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.textbox.js +++ /dev/null @@ -1,566 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -var _1=0; -function _2(_3){ -$(_3).addClass("textbox-f").hide(); -var _4=$(""+""+""+"").insertAfter(_3); -var _5=$(_3).attr("name"); -if(_5){ -_4.find("input.textbox-value").attr("name",_5); -$(_3).removeAttr("name").attr("textboxName",_5); -} -return _4; -}; -function _6(_7){ -var _8=$.data(_7,"textbox"); -var _9=_8.options; -var tb=_8.textbox; -var _a="_easyui_textbox_input"+(++_1); -tb.addClass(_9.cls); -tb.find(".textbox-text").remove(); -if(_9.multiline){ -$("").prependTo(tb); -}else{ -$("").prependTo(tb); -} -$("#"+_a).attr("tabindex",$(_7).attr("tabindex")||"").css("text-align",_7.style.textAlign||""); -tb.find(".textbox-addon").remove(); -var bb=_9.icons?$.extend(true,[],_9.icons):[]; -if(_9.iconCls){ -bb.push({iconCls:_9.iconCls,disabled:true}); -} -if(bb.length){ -var bc=$("").prependTo(tb); -bc.addClass("textbox-addon-"+_9.iconAlign); -for(var i=0;i"); -} -} -tb.find(".textbox-button").remove(); -if(_9.buttonText||_9.buttonIcon){ -var _b=$("").prependTo(tb); -_b.addClass("textbox-button-"+_9.buttonAlign).linkbutton({text:_9.buttonText,iconCls:_9.buttonIcon,onClick:function(){ -var t=$(this).parent().prev(); -t.textbox("options").onClickButton.call(t[0]); -}}); -} -if(_9.label){ -if(typeof _9.label=="object"){ -_8.label=$(_9.label); -_8.label.attr("for",_a); -}else{ -$(_8.label).remove(); -_8.label=$("").html(_9.label); -_8.label.css("textAlign",_9.labelAlign).attr("for",_a); -if(_9.labelPosition=="after"){ -_8.label.insertAfter(tb); -}else{ -_8.label.insertBefore(_7); -} -_8.label.removeClass("textbox-label-left textbox-label-right textbox-label-top"); -_8.label.addClass("textbox-label-"+_9.labelPosition); -} -}else{ -$(_8.label).remove(); -} -_c(_7); -_d(_7,_9.disabled); -_e(_7,_9.readonly); -}; -function _f(_10){ -var _11=$.data(_10,"textbox"); -var tb=_11.textbox; -tb.find(".textbox-text").validatebox("destroy"); -tb.remove(); -$(_11.label).remove(); -$(_10).remove(); -}; -function _12(_13,_14){ -var _15=$.data(_13,"textbox"); -var _16=_15.options; -var tb=_15.textbox; -var _17=tb.parent(); -if(_14){ -if(typeof _14=="object"){ -$.extend(_16,_14); -}else{ -_16.width=_14; -} -} -if(isNaN(parseInt(_16.width))){ -var c=$(_13).clone(); -c.css("visibility","hidden"); -c.insertAfter(_13); -_16.width=c.outerWidth(); -c.remove(); -} -var _18=tb.is(":visible"); -if(!_18){ -tb.appendTo("body"); -} -var _19=tb.find(".textbox-text"); -var btn=tb.find(".textbox-button"); -var _1a=tb.find(".textbox-addon"); -var _1b=_1a.find(".textbox-icon"); -if(_16.height=="auto"){ -_19.css({margin:"",paddingTop:"",paddingBottom:"",height:"",lineHeight:""}); -} -tb._size(_16,_17); -if(_16.label&&_16.labelPosition){ -if(_16.labelPosition=="top"){ -_15.label._size({width:_16.labelWidth=="auto"?tb.outerWidth():_16.labelWidth},tb); -if(_16.height!="auto"){ -tb._size("height",tb.outerHeight()-_15.label.outerHeight()); -} -}else{ -_15.label._size({width:_16.labelWidth,height:tb.outerHeight()},tb); -if(!_16.multiline){ -_15.label.css("lineHeight",_15.label.height()+"px"); -} -tb._size("width",tb.outerWidth()-_15.label.outerWidth()); -} -} -if(_16.buttonAlign=="left"||_16.buttonAlign=="right"){ -btn.linkbutton("resize",{height:tb.height()}); -}else{ -btn.linkbutton("resize",{width:"100%"}); -} -var _1c=tb.width()-_1b.length*_16.iconWidth-_1d("left")-_1d("right"); -var _1e=_16.height=="auto"?_19.outerHeight():(tb.height()-_1d("top")-_1d("bottom")); -_1a.css(_16.iconAlign,_1d(_16.iconAlign)+"px"); -_1a.css("top",_1d("top")+"px"); -_1b.css({width:_16.iconWidth+"px",height:_1e+"px"}); -_19.css({paddingLeft:(_13.style.paddingLeft||""),paddingRight:(_13.style.paddingRight||""),marginLeft:_1f("left"),marginRight:_1f("right"),marginTop:_1d("top"),marginBottom:_1d("bottom")}); -if(_16.multiline){ -_19.css({paddingTop:(_13.style.paddingTop||""),paddingBottom:(_13.style.paddingBottom||"")}); -_19._outerHeight(_1e); -}else{ -_19.css({paddingTop:0,paddingBottom:0,height:_1e+"px",lineHeight:_1e+"px"}); -} -_19._outerWidth(_1c); -_16.onResizing.call(_13,_16.width,_16.height); -if(!_18){ -tb.insertAfter(_13); -} -_16.onResize.call(_13,_16.width,_16.height); -function _1f(_20){ -return (_16.iconAlign==_20?_1a._outerWidth():0)+_1d(_20); -}; -function _1d(_21){ -var w=0; -btn.filter(".textbox-button-"+_21).each(function(){ -if(_21=="left"||_21=="right"){ -w+=$(this).outerWidth(); -}else{ -w+=$(this).outerHeight(); -} -}); -return w; -}; -}; -function _c(_22){ -var _23=$(_22).textbox("options"); -var _24=$(_22).textbox("textbox"); -_24.validatebox($.extend({},_23,{deltaX:function(_25){ -return $(_22).textbox("getTipX",_25); -},deltaY:function(_26){ -return $(_22).textbox("getTipY",_26); -},onBeforeValidate:function(){ -_23.onBeforeValidate.call(_22); -var box=$(this); -if(!box.is(":focus")){ -if(box.val()!==_23.value){ -_23.oldInputValue=box.val(); -box.val(_23.value); -} -} -},onValidate:function(_27){ -var box=$(this); -if(_23.oldInputValue!=undefined){ -box.val(_23.oldInputValue); -_23.oldInputValue=undefined; -} -var tb=box.parent(); -if(_27){ -tb.removeClass("textbox-invalid"); -}else{ -tb.addClass("textbox-invalid"); -} -_23.onValidate.call(_22,_27); -}})); -}; -function _28(_29){ -var _2a=$.data(_29,"textbox"); -var _2b=_2a.options; -var tb=_2a.textbox; -var _2c=tb.find(".textbox-text"); -_2c.attr("placeholder",_2b.prompt); -_2c.unbind(".textbox"); -$(_2a.label).unbind(".textbox"); -if(!_2b.disabled&&!_2b.readonly){ -if(_2a.label){ -$(_2a.label).bind("click.textbox",function(e){ -if(!_2b.hasFocusMe){ -_2c.focus(); -$(_29).textbox("setSelectionRange",{start:0,end:_2c.val().length}); -} -}); -} -_2c.bind("blur.textbox",function(e){ -if(!tb.hasClass("textbox-focused")){ -return; -} -_2b.value=$(this).val(); -if(_2b.value==""){ -$(this).val(_2b.prompt).addClass("textbox-prompt"); -}else{ -$(this).removeClass("textbox-prompt"); -} -tb.removeClass("textbox-focused"); -tb.closest(".form-field").removeClass("form-field-focused"); -}).bind("focus.textbox",function(e){ -_2b.hasFocusMe=true; -if(tb.hasClass("textbox-focused")){ -return; -} -if($(this).val()!=_2b.value){ -$(this).val(_2b.value); -} -$(this).removeClass("textbox-prompt"); -tb.addClass("textbox-focused"); -tb.closest(".form-field").addClass("form-field-focused"); -}); -for(var _2d in _2b.inputEvents){ -_2c.bind(_2d+".textbox",{target:_29},_2b.inputEvents[_2d]); -} -} -var _2e=tb.find(".textbox-addon"); -_2e.unbind().bind("click",{target:_29},function(e){ -var _2f=$(e.target).closest("a.textbox-icon:not(.textbox-icon-disabled)"); -if(_2f.length){ -var _30=parseInt(_2f.attr("icon-index")); -var _31=_2b.icons[_30]; -if(_31&&_31.handler){ -_31.handler.call(_2f[0],e); -} -_2b.onClickIcon.call(_29,_30); -} -}); -_2e.find(".textbox-icon").each(function(_32){ -var _33=_2b.icons[_32]; -var _34=$(this); -if(!_33||_33.disabled||_2b.disabled||_2b.readonly){ -_34.addClass("textbox-icon-disabled"); -}else{ -_34.removeClass("textbox-icon-disabled"); -} -}); -var btn=tb.find(".textbox-button"); -btn.linkbutton((_2b.disabled||_2b.readonly)?"disable":"enable"); -tb.unbind(".textbox").bind("_resize.textbox",function(e,_35){ -if($(this).hasClass("easyui-fluid")||_35){ -_12(_29); -} -return false; -}); -}; -function _d(_36,_37){ -var _38=$.data(_36,"textbox"); -var _39=_38.options; -var tb=_38.textbox; -var _3a=tb.find(".textbox-text"); -var ss=$(_36).add(tb.find(".textbox-value")); -_39.disabled=_37; -if(_39.disabled){ -_3a.blur(); -_3a.validatebox("disable"); -tb.addClass("textbox-disabled"); -ss._propAttr("disabled",true); -$(_38.label).addClass("textbox-label-disabled"); -}else{ -_3a.validatebox("enable"); -tb.removeClass("textbox-disabled"); -ss._propAttr("disabled",false); -$(_38.label).removeClass("textbox-label-disabled"); -} -}; -function _e(_3b,_3c){ -var _3d=$.data(_3b,"textbox"); -var _3e=_3d.options; -var tb=_3d.textbox; -var _3f=tb.find(".textbox-text"); -_3e.readonly=_3c==undefined?true:_3c; -if(_3e.readonly){ -_3f.triggerHandler("blur.textbox"); -} -_3f.validatebox("readonly",_3e.readonly); -tb.removeClass("textbox-readonly").addClass(_3e.readonly?"textbox-readonly":""); -}; -$.fn.textbox=function(_40,_41){ -if(typeof _40=="string"){ -var _42=$.fn.textbox.methods[_40]; -if(_42){ -return _42(this,_41); -}else{ -return this.each(function(){ -var _43=$(this).textbox("textbox"); -_43.validatebox(_40,_41); -}); -} -} -_40=_40||{}; -return this.each(function(){ -var _44=$.data(this,"textbox"); -if(_44){ -$.extend(_44.options,_40); -if(_40.value!=undefined){ -_44.options.originalValue=_40.value; -} -}else{ -_44=$.data(this,"textbox",{options:$.extend({},$.fn.textbox.defaults,$.fn.textbox.parseOptions(this),_40),textbox:_2(this)}); -_44.options.originalValue=_44.options.value; -} -_6(this); -_28(this); -if(_44.options.doSize){ -_12(this); -} -var _45=_44.options.value; -_44.options.value=""; -$(this).textbox("initValue",_45); -}); -}; -$.fn.textbox.methods={options:function(jq){ -return $.data(jq[0],"textbox").options; -},cloneFrom:function(jq,_46){ -return jq.each(function(){ -var t=$(this); -if(t.data("textbox")){ -return; -} -if(!$(_46).data("textbox")){ -$(_46).textbox(); -} -var _47=$.extend(true,{},$(_46).textbox("options")); -var _48=t.attr("name")||""; -t.addClass("textbox-f").hide(); -t.removeAttr("name").attr("textboxName",_48); -var _49=$(_46).next().clone().insertAfter(t); -var _4a="_easyui_textbox_input"+(++_1); -_49.find(".textbox-value").attr("name",_48); -_49.find(".textbox-text").attr("id",_4a); -var _4b=$($(_46).textbox("label")).clone(); -if(_4b.length){ -_4b.attr("for",_4a); -if(_47.labelPosition=="after"){ -_4b.insertAfter(t.next()); -}else{ -_4b.insertBefore(t); -} -} -$.data(this,"textbox",{options:_47,textbox:_49,label:(_4b.length?_4b:undefined)}); -var _4c=$(_46).textbox("button"); -if(_4c.length){ -t.textbox("button").linkbutton($.extend(true,{},_4c.linkbutton("options"))); -} -_28(this); -_c(this); -}); -},textbox:function(jq){ -return $.data(jq[0],"textbox").textbox.find(".textbox-text"); -},button:function(jq){ -return $.data(jq[0],"textbox").textbox.find(".textbox-button"); -},label:function(jq){ -return $.data(jq[0],"textbox").label; -},destroy:function(jq){ -return jq.each(function(){ -_f(this); -}); -},resize:function(jq,_4d){ -return jq.each(function(){ -_12(this,_4d); -}); -},disable:function(jq){ -return jq.each(function(){ -_d(this,true); -_28(this); -}); -},enable:function(jq){ -return jq.each(function(){ -_d(this,false); -_28(this); -}); -},readonly:function(jq,_4e){ -return jq.each(function(){ -_e(this,_4e); -_28(this); -}); -},isValid:function(jq){ -return jq.textbox("textbox").validatebox("isValid"); -},clear:function(jq){ -return jq.each(function(){ -$(this).textbox("setValue",""); -}); -},setText:function(jq,_4f){ -return jq.each(function(){ -var _50=$(this).textbox("options"); -var _51=$(this).textbox("textbox"); -_4f=_4f==undefined?"":String(_4f); -if($(this).textbox("getText")!=_4f){ -_51.val(_4f); -} -_50.value=_4f; -if(!_51.is(":focus")){ -if(_4f){ -_51.removeClass("textbox-prompt"); -}else{ -_51.val(_50.prompt).addClass("textbox-prompt"); -} -} -if(_50.value){ -$(this).closest(".form-field").removeClass("form-field-empty"); -}else{ -$(this).closest(".form-field").addClass("form-field-empty"); -} -$(this).textbox("validate"); -}); -},initValue:function(jq,_52){ -return jq.each(function(){ -var _53=$.data(this,"textbox"); -$(this).textbox("setText",_52); -_53.textbox.find(".textbox-value").val(_52); -$(this).val(_52); -}); -},setValue:function(jq,_54){ -return jq.each(function(){ -var _55=$.data(this,"textbox").options; -var _56=$(this).textbox("getValue"); -$(this).textbox("initValue",_54); -if(_56!=_54){ -_55.onChange.call(this,_54,_56); -$(this).closest("form").trigger("_change",[this]); -} -}); -},getText:function(jq){ -var _57=jq.textbox("textbox"); -if(_57.is(":focus")){ -return _57.val(); -}else{ -return jq.textbox("options").value; -} -},getValue:function(jq){ -return jq.data("textbox").textbox.find(".textbox-value").val(); -},reset:function(jq){ -return jq.each(function(){ -var _58=$(this).textbox("options"); -$(this).textbox("textbox").val(_58.originalValue); -$(this).textbox("setValue",_58.originalValue); -}); -},getIcon:function(jq,_59){ -return jq.data("textbox").textbox.find(".textbox-icon:eq("+_59+")"); -},getTipX:function(jq,_5a){ -var _5b=jq.data("textbox"); -var _5c=_5b.options; -var tb=_5b.textbox; -var _5d=tb.find(".textbox-text"); -var _5a=_5a||_5c.tipPosition; -var p1=tb.offset(); -var p2=_5d.offset(); -var w1=tb.outerWidth(); -var w2=_5d.outerWidth(); -if(_5a=="right"){ -return w1-w2-p2.left+p1.left; -}else{ -if(_5a=="left"){ -return p1.left-p2.left; -}else{ -return (w1-w2-p2.left+p1.left)/2-(p2.left-p1.left)/2; -} -} -},getTipY:function(jq,_5e){ -var _5f=jq.data("textbox"); -var _60=_5f.options; -var tb=_5f.textbox; -var _61=tb.find(".textbox-text"); -var _5e=_5e||_60.tipPosition; -var p1=tb.offset(); -var p2=_61.offset(); -var h1=tb.outerHeight(); -var h2=_61.outerHeight(); -if(_5e=="left"||_5e=="right"){ -return (h1-h2-p2.top+p1.top)/2-(p2.top-p1.top)/2; -}else{ -if(_5e=="bottom"){ -return (h1-h2-p2.top+p1.top); -}else{ -return (p1.top-p2.top); -} -} -},getSelectionStart:function(jq){ -return jq.textbox("getSelectionRange").start; -},getSelectionRange:function(jq){ -var _62=jq.textbox("textbox")[0]; -var _63=0; -var end=0; -if(typeof _62.selectionStart=="number"){ -_63=_62.selectionStart; -end=_62.selectionEnd; -}else{ -if(_62.createTextRange){ -var s=document.selection.createRange(); -var _64=_62.createTextRange(); -_64.setEndPoint("EndToStart",s); -_63=_64.text.length; -end=_63+s.text.length; -} -} -return {start:_63,end:end}; -},setSelectionRange:function(jq,_65){ -return jq.each(function(){ -var _66=$(this).textbox("textbox")[0]; -var _67=_65.start; -var end=_65.end; -if(_66.setSelectionRange){ -_66.setSelectionRange(_67,end); -}else{ -if(_66.createTextRange){ -var _68=_66.createTextRange(); -_68.collapse(); -_68.moveEnd("character",end); -_68.moveStart("character",_67); -_68.select(); -} -} -}); -}}; -$.fn.textbox.parseOptions=function(_69){ -var t=$(_69); -return $.extend({},$.fn.validatebox.parseOptions(_69),$.parser.parseOptions(_69,["prompt","iconCls","iconAlign","buttonText","buttonIcon","buttonAlign","label","labelPosition","labelAlign",{multiline:"boolean",iconWidth:"number",labelWidth:"number"}]),{value:(t.val()||undefined),type:(t.attr("type")?t.attr("type"):undefined)}); -}; -$.fn.textbox.defaults=$.extend({},$.fn.validatebox.defaults,{doSize:true,width:"auto",height:"auto",cls:null,prompt:"",value:"",type:"text",multiline:false,icons:[],iconCls:null,iconAlign:"right",iconWidth:26,buttonText:"",buttonIcon:null,buttonAlign:"right",label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",inputEvents:{blur:function(e){ -var t=$(e.data.target); -var _6a=t.textbox("options"); -if(t.textbox("getValue")!=_6a.value){ -t.textbox("setValue",_6a.value); -} -},keydown:function(e){ -if(e.keyCode==13){ -var t=$(e.data.target); -t.textbox("setValue",t.textbox("getText")); -} -}},onChange:function(_6b,_6c){ -},onResizing:function(_6d,_6e){ -},onResize:function(_6f,_70){ -},onClickButton:function(){ -},onClickIcon:function(_71){ -}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.timespinner.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.timespinner.js deleted file mode 100755 index a956b446e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.timespinner.js +++ /dev/null @@ -1,149 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$.data(_2,"timespinner").options; -$(_2).addClass("timespinner-f").spinner(_3); -var _4=_3.formatter.call(_2,_3.parser.call(_2,_3.value)); -$(_2).timespinner("initValue",_4); -}; -function _5(e){ -var _6=e.data.target; -var _7=$.data(_6,"timespinner").options; -var _8=$(_6).timespinner("getSelectionStart"); -for(var i=0;i<_7.selections.length;i++){ -var _9=_7.selections[i]; -if(_8>=_9[0]&&_8<=_9[1]){ -_a(_6,i); -return; -} -} -}; -function _a(_b,_c){ -var _d=$.data(_b,"timespinner").options; -if(_c!=undefined){ -_d.highlight=_c; -} -var _e=_d.selections[_d.highlight]; -if(_e){ -var tb=$(_b).timespinner("textbox"); -$(_b).timespinner("setSelectionRange",{start:_e[0],end:_e[1]}); -tb.focus(); -} -}; -function _f(_10,_11){ -var _12=$.data(_10,"timespinner").options; -var _11=_12.parser.call(_10,_11); -var _13=_12.formatter.call(_10,_11); -$(_10).spinner("setValue",_13); -}; -function _14(_15,_16){ -var _17=$.data(_15,"timespinner").options; -var s=$(_15).timespinner("getValue"); -var _18=_17.selections[_17.highlight]; -var s1=s.substring(0,_18[0]); -var s2=s.substring(_18[0],_18[1]); -var s3=s.substring(_18[1]); -var v=s1+((parseInt(s2,10)||0)+_17.increment*(_16?-1:1))+s3; -$(_15).timespinner("setValue",v); -_a(_15); -}; -$.fn.timespinner=function(_19,_1a){ -if(typeof _19=="string"){ -var _1b=$.fn.timespinner.methods[_19]; -if(_1b){ -return _1b(this,_1a); -}else{ -return this.spinner(_19,_1a); -} -} -_19=_19||{}; -return this.each(function(){ -var _1c=$.data(this,"timespinner"); -if(_1c){ -$.extend(_1c.options,_19); -}else{ -$.data(this,"timespinner",{options:$.extend({},$.fn.timespinner.defaults,$.fn.timespinner.parseOptions(this),_19)}); -} -_1(this); -}); -}; -$.fn.timespinner.methods={options:function(jq){ -var _1d=jq.data("spinner")?jq.spinner("options"):{}; -return $.extend($.data(jq[0],"timespinner").options,{width:_1d.width,value:_1d.value,originalValue:_1d.originalValue,disabled:_1d.disabled,readonly:_1d.readonly}); -},setValue:function(jq,_1e){ -return jq.each(function(){ -_f(this,_1e); -}); -},getHours:function(jq){ -var _1f=$.data(jq[0],"timespinner").options; -var vv=jq.timespinner("getValue").split(_1f.separator); -return parseInt(vv[0],10); -},getMinutes:function(jq){ -var _20=$.data(jq[0],"timespinner").options; -var vv=jq.timespinner("getValue").split(_20.separator); -return parseInt(vv[1],10); -},getSeconds:function(jq){ -var _21=$.data(jq[0],"timespinner").options; -var vv=jq.timespinner("getValue").split(_21.separator); -return parseInt(vv[2],10)||0; -}}; -$.fn.timespinner.parseOptions=function(_22){ -return $.extend({},$.fn.spinner.parseOptions(_22),$.parser.parseOptions(_22,["separator",{showSeconds:"boolean",highlight:"number"}])); -}; -$.fn.timespinner.defaults=$.extend({},$.fn.spinner.defaults,{inputEvents:$.extend({},$.fn.spinner.defaults.inputEvents,{click:function(e){ -_5.call(this,e); -},blur:function(e){ -var t=$(e.data.target); -t.timespinner("setValue",t.timespinner("getText")); -},keydown:function(e){ -if(e.keyCode==13){ -var t=$(e.data.target); -t.timespinner("setValue",t.timespinner("getText")); -} -}}),formatter:function(_23){ -if(!_23){ -return ""; -} -var _24=$(this).timespinner("options"); -var tt=[_25(_23.getHours()),_25(_23.getMinutes())]; -if(_24.showSeconds){ -tt.push(_25(_23.getSeconds())); -} -return tt.join(_24.separator); -function _25(_26){ -return (_26<10?"0":"")+_26; -}; -},parser:function(s){ -var _27=$(this).timespinner("options"); -var _28=_29(s); -if(_28){ -var min=_29(_27.min); -var max=_29(_27.max); -if(min&&min>_28){ -_28=min; -} -if(max&&max<_28){ -_28=max; -} -} -return _28; -function _29(s){ -if(!s){ -return null; -} -var tt=s.split(_27.separator); -return new Date(1900,0,0,parseInt(tt[0],10)||0,parseInt(tt[1],10)||0,parseInt(tt[2],10)||0); -}; -},selections:[[0,2],[3,5],[6,8]],separator:":",showSeconds:false,highlight:0,spin:function(_2a){ -_14(this,_2a); -}}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tooltip.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tooltip.js deleted file mode 100755 index c15686578..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tooltip.js +++ /dev/null @@ -1,238 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -$(_2).addClass("tooltip-f"); -}; -function _3(_4){ -var _5=$.data(_4,"tooltip").options; -$(_4).unbind(".tooltip").bind(_5.showEvent+".tooltip",function(e){ -$(_4).tooltip("show",e); -}).bind(_5.hideEvent+".tooltip",function(e){ -$(_4).tooltip("hide",e); -}).bind("mousemove.tooltip",function(e){ -if(_5.trackMouse){ -_5.trackMouseX=e.pageX; -_5.trackMouseY=e.pageY; -$(_4).tooltip("reposition"); -} -}); -}; -function _6(_7){ -var _8=$.data(_7,"tooltip"); -if(_8.showTimer){ -clearTimeout(_8.showTimer); -_8.showTimer=null; -} -if(_8.hideTimer){ -clearTimeout(_8.hideTimer); -_8.hideTimer=null; -} -}; -function _9(_a){ -var _b=$.data(_a,"tooltip"); -if(!_b||!_b.tip){ -return; -} -var _c=_b.options; -var _d=_b.tip; -var _e={left:-100000,top:-100000}; -if($(_a).is(":visible")){ -_e=_f(_c.position); -if(_c.position=="top"&&_e.top<0){ -_e=_f("bottom"); -}else{ -if((_c.position=="bottom")&&(_e.top+_d._outerHeight()>$(window)._outerHeight()+$(document).scrollTop())){ -_e=_f("top"); -} -} -if(_e.left<0){ -if(_c.position=="left"){ -_e=_f("right"); -}else{ -$(_a).tooltip("arrow").css("left",_d._outerWidth()/2+_e.left); -_e.left=0; -} -}else{ -if(_e.left+_d._outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){ -if(_c.position=="right"){ -_e=_f("left"); -}else{ -var _10=_e.left; -_e.left=$(window)._outerWidth()+$(document)._scrollLeft()-_d._outerWidth(); -$(_a).tooltip("arrow").css("left",_d._outerWidth()/2-(_e.left-_10)); -} -} -} -} -_d.css({left:_e.left,top:_e.top,zIndex:(_c.zIndex!=undefined?_c.zIndex:($.fn.window?$.fn.window.defaults.zIndex++:""))}); -_c.onPosition.call(_a,_e.left,_e.top); -function _f(_11){ -_c.position=_11||"bottom"; -_d.removeClass("tooltip-top tooltip-bottom tooltip-left tooltip-right").addClass("tooltip-"+_c.position); -var _12,top; -var _13=$.isFunction(_c.deltaX)?_c.deltaX.call(_a,_c.position):_c.deltaX; -var _14=$.isFunction(_c.deltaY)?_c.deltaY.call(_a,_c.position):_c.deltaY; -if(_c.trackMouse){ -t=$(); -_12=_c.trackMouseX+_13; -top=_c.trackMouseY+_14; -}else{ -var t=$(_a); -_12=t.offset().left+_13; -top=t.offset().top+_14; -} -switch(_c.position){ -case "right": -_12+=t._outerWidth()+12+(_c.trackMouse?12:0); -if(_c.valign=="middle"){ -top-=(_d._outerHeight()-t._outerHeight())/2; -} -break; -case "left": -_12-=_d._outerWidth()+12+(_c.trackMouse?12:0); -if(_c.valign=="middle"){ -top-=(_d._outerHeight()-t._outerHeight())/2; -} -break; -case "top": -_12-=(_d._outerWidth()-t._outerWidth())/2; -top-=_d._outerHeight()+12+(_c.trackMouse?12:0); -break; -case "bottom": -_12-=(_d._outerWidth()-t._outerWidth())/2; -top+=t._outerHeight()+12+(_c.trackMouse?12:0); -break; -} -return {left:_12,top:top}; -}; -}; -function _15(_16,e){ -var _17=$.data(_16,"tooltip"); -var _18=_17.options; -var tip=_17.tip; -if(!tip){ -tip=$("
                                                                                                                                                              "+"
                                                                                                                                                              "+"
                                                                                                                                                              "+"
                                                                                                                                                              "+"
                                                                                                                                                              ").appendTo("body"); -_17.tip=tip; -_19(_16); -} -_6(_16); -_17.showTimer=setTimeout(function(){ -$(_16).tooltip("reposition"); -tip.show(); -_18.onShow.call(_16,e); -var _1a=tip.children(".tooltip-arrow-outer"); -var _1b=tip.children(".tooltip-arrow"); -var bc="border-"+_18.position+"-color"; -_1a.add(_1b).css({borderTopColor:"",borderBottomColor:"",borderLeftColor:"",borderRightColor:""}); -_1a.css(bc,tip.css(bc)); -_1b.css(bc,tip.css("backgroundColor")); -},_18.showDelay); -}; -function _1c(_1d,e){ -var _1e=$.data(_1d,"tooltip"); -if(_1e&&_1e.tip){ -_6(_1d); -_1e.hideTimer=setTimeout(function(){ -_1e.tip.hide(); -_1e.options.onHide.call(_1d,e); -},_1e.options.hideDelay); -} -}; -function _19(_1f,_20){ -var _21=$.data(_1f,"tooltip"); -var _22=_21.options; -if(_20){ -_22.content=_20; -} -if(!_21.tip){ -return; -} -var cc=typeof _22.content=="function"?_22.content.call(_1f):_22.content; -_21.tip.children(".tooltip-content").html(cc); -_22.onUpdate.call(_1f,cc); -}; -function _23(_24){ -var _25=$.data(_24,"tooltip"); -if(_25){ -_6(_24); -var _26=_25.options; -if(_25.tip){ -_25.tip.remove(); -} -if(_26._title){ -$(_24).attr("title",_26._title); -} -$.removeData(_24,"tooltip"); -$(_24).unbind(".tooltip").removeClass("tooltip-f"); -_26.onDestroy.call(_24); -} -}; -$.fn.tooltip=function(_27,_28){ -if(typeof _27=="string"){ -return $.fn.tooltip.methods[_27](this,_28); -} -_27=_27||{}; -return this.each(function(){ -var _29=$.data(this,"tooltip"); -if(_29){ -$.extend(_29.options,_27); -}else{ -$.data(this,"tooltip",{options:$.extend({},$.fn.tooltip.defaults,$.fn.tooltip.parseOptions(this),_27)}); -_1(this); -} -_3(this); -_19(this); -}); -}; -$.fn.tooltip.methods={options:function(jq){ -return $.data(jq[0],"tooltip").options; -},tip:function(jq){ -return $.data(jq[0],"tooltip").tip; -},arrow:function(jq){ -return jq.tooltip("tip").children(".tooltip-arrow-outer,.tooltip-arrow"); -},show:function(jq,e){ -return jq.each(function(){ -_15(this,e); -}); -},hide:function(jq,e){ -return jq.each(function(){ -_1c(this,e); -}); -},update:function(jq,_2a){ -return jq.each(function(){ -_19(this,_2a); -}); -},reposition:function(jq){ -return jq.each(function(){ -_9(this); -}); -},destroy:function(jq){ -return jq.each(function(){ -_23(this); -}); -}}; -$.fn.tooltip.parseOptions=function(_2b){ -var t=$(_2b); -var _2c=$.extend({},$.parser.parseOptions(_2b,["position","showEvent","hideEvent","content",{trackMouse:"boolean",deltaX:"number",deltaY:"number",showDelay:"number",hideDelay:"number"}]),{_title:t.attr("title")}); -t.attr("title",""); -if(!_2c.content){ -_2c.content=_2c._title; -} -return _2c; -}; -$.fn.tooltip.defaults={position:"bottom",valign:"middle",content:null,trackMouse:false,deltaX:0,deltaY:0,showEvent:"mouseenter",hideEvent:"mouseleave",showDelay:200,hideDelay:100,onShow:function(e){ -},onHide:function(e){ -},onUpdate:function(_2d){ -},onPosition:function(_2e,top){ -},onDestroy:function(){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tree.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tree.js deleted file mode 100755 index e6fcf1d26..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.tree.js +++ /dev/null @@ -1,1247 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$(_2); -_3.addClass("tree"); -return _3; -}; -function _4(_5){ -var _6=$.data(_5,"tree").options; -$(_5).unbind().bind("mouseover",function(e){ -var tt=$(e.target); -var _7=tt.closest("div.tree-node"); -if(!_7.length){ -return; -} -_7.addClass("tree-node-hover"); -if(tt.hasClass("tree-hit")){ -if(tt.hasClass("tree-expanded")){ -tt.addClass("tree-expanded-hover"); -}else{ -tt.addClass("tree-collapsed-hover"); -} -} -e.stopPropagation(); -}).bind("mouseout",function(e){ -var tt=$(e.target); -var _8=tt.closest("div.tree-node"); -if(!_8.length){ -return; -} -_8.removeClass("tree-node-hover"); -if(tt.hasClass("tree-hit")){ -if(tt.hasClass("tree-expanded")){ -tt.removeClass("tree-expanded-hover"); -}else{ -tt.removeClass("tree-collapsed-hover"); -} -} -e.stopPropagation(); -}).bind("click",function(e){ -var tt=$(e.target); -var _9=tt.closest("div.tree-node"); -if(!_9.length){ -return; -} -if(tt.hasClass("tree-hit")){ -_85(_5,_9[0]); -return false; -}else{ -if(tt.hasClass("tree-checkbox")){ -_34(_5,_9[0]); -return false; -}else{ -_d9(_5,_9[0]); -_6.onClick.call(_5,_c(_5,_9[0])); -} -} -e.stopPropagation(); -}).bind("dblclick",function(e){ -var _a=$(e.target).closest("div.tree-node"); -if(!_a.length){ -return; -} -_d9(_5,_a[0]); -_6.onDblClick.call(_5,_c(_5,_a[0])); -e.stopPropagation(); -}).bind("contextmenu",function(e){ -var _b=$(e.target).closest("div.tree-node"); -if(!_b.length){ -return; -} -_6.onContextMenu.call(_5,e,_c(_5,_b[0])); -e.stopPropagation(); -}); -}; -function _d(_e){ -var _f=$.data(_e,"tree").options; -_f.dnd=false; -var _10=$(_e).find("div.tree-node"); -_10.draggable("disable"); -_10.css("cursor","pointer"); -}; -function _11(_12){ -var _13=$.data(_12,"tree"); -var _14=_13.options; -var _15=_13.tree; -_13.disabledNodes=[]; -_14.dnd=true; -_15.find("div.tree-node").draggable({disabled:false,revert:true,cursor:"pointer",proxy:function(_16){ -var p=$("
                                                                                                                                                              ").appendTo("body"); -p.html(" "+$(_16).find(".tree-title").html()); -p.hide(); -return p; -},deltaX:15,deltaY:15,onBeforeDrag:function(e){ -if(_14.onBeforeDrag.call(_12,_c(_12,this))==false){ -return false; -} -if($(e.target).hasClass("tree-hit")||$(e.target).hasClass("tree-checkbox")){ -return false; -} -if(e.which!=1){ -return false; -} -var _17=$(this).find("span.tree-indent"); -if(_17.length){ -e.data.offsetWidth-=_17.length*_17.width(); -} -},onStartDrag:function(e){ -$(this).next("ul").find("div.tree-node").each(function(){ -$(this).droppable("disable"); -_13.disabledNodes.push(this); -}); -$(this).draggable("proxy").css({left:-10000,top:-10000}); -_14.onStartDrag.call(_12,_c(_12,this)); -var _18=_c(_12,this); -if(_18.id==undefined){ -_18.id="easyui_tree_node_id_temp"; -_60(_12,_18); -} -_13.draggingNodeId=_18.id; -},onDrag:function(e){ -var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY; -var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); -if(d>3){ -$(this).draggable("proxy").show(); -} -this.pageY=e.pageY; -},onStopDrag:function(){ -for(var i=0;i<_13.disabledNodes.length;i++){ -$(_13.disabledNodes[i]).droppable("enable"); -} -_13.disabledNodes=[]; -var _19=_d0(_12,_13.draggingNodeId); -if(_19&&_19.id=="easyui_tree_node_id_temp"){ -_19.id=""; -_60(_12,_19); -} -_14.onStopDrag.call(_12,_19); -}}).droppable({accept:"div.tree-node",onDragEnter:function(e,_1a){ -if(_14.onDragEnter.call(_12,this,_1b(_1a))==false){ -_1c(_1a,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -$(this).droppable("disable"); -_13.disabledNodes.push(this); -} -},onDragOver:function(e,_1d){ -if($(this).droppable("options").disabled){ -return; -} -var _1e=_1d.pageY; -var top=$(this).offset().top; -var _1f=top+$(this).outerHeight(); -_1c(_1d,true); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -if(_1e>top+(_1f-top)/2){ -if(_1f-_1e<5){ -$(this).addClass("tree-node-bottom"); -}else{ -$(this).addClass("tree-node-append"); -} -}else{ -if(_1e-top<5){ -$(this).addClass("tree-node-top"); -}else{ -$(this).addClass("tree-node-append"); -} -} -if(_14.onDragOver.call(_12,this,_1b(_1d))==false){ -_1c(_1d,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -$(this).droppable("disable"); -_13.disabledNodes.push(this); -} -},onDragLeave:function(e,_20){ -_1c(_20,false); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -_14.onDragLeave.call(_12,this,_1b(_20)); -},onDrop:function(e,_21){ -var _22=this; -var _23,_24; -if($(this).hasClass("tree-node-append")){ -_23=_25; -_24="append"; -}else{ -_23=_26; -_24=$(this).hasClass("tree-node-top")?"top":"bottom"; -} -if(_14.onBeforeDrop.call(_12,_22,_1b(_21),_24)==false){ -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -return; -} -_23(_21,_22,_24); -$(this).removeClass("tree-node-append tree-node-top tree-node-bottom"); -}}); -function _1b(_27,pop){ -return $(_27).closest("ul.tree").tree(pop?"pop":"getData",_27); -}; -function _1c(_28,_29){ -var _2a=$(_28).draggable("proxy").find("span.tree-dnd-icon"); -_2a.removeClass("tree-dnd-yes tree-dnd-no").addClass(_29?"tree-dnd-yes":"tree-dnd-no"); -}; -function _25(_2b,_2c){ -if(_c(_12,_2c).state=="closed"){ -_79(_12,_2c,function(){ -_2d(); -}); -}else{ -_2d(); -} -function _2d(){ -var _2e=_1b(_2b,true); -$(_12).tree("append",{parent:_2c,data:[_2e]}); -_14.onDrop.call(_12,_2c,_2e,"append"); -}; -}; -function _26(_2f,_30,_31){ -var _32={}; -if(_31=="top"){ -_32.before=_30; -}else{ -_32.after=_30; -} -var _33=_1b(_2f,true); -_32.data=_33; -$(_12).tree("insert",_32); -_14.onDrop.call(_12,_30,_33,_31); -}; -}; -function _34(_35,_36,_37,_38){ -var _39=$.data(_35,"tree"); -var _3a=_39.options; -if(!_3a.checkbox){ -return; -} -var _3b=_c(_35,_36); -if(!_3b.checkState){ -return; -} -var ck=$(_36).find(".tree-checkbox"); -if(_37==undefined){ -if(ck.hasClass("tree-checkbox1")){ -_37=false; -}else{ -if(ck.hasClass("tree-checkbox0")){ -_37=true; -}else{ -if(_3b._checked==undefined){ -_3b._checked=$(_36).find(".tree-checkbox").hasClass("tree-checkbox1"); -} -_37=!_3b._checked; -} -} -} -_3b._checked=_37; -if(_37){ -if(ck.hasClass("tree-checkbox1")){ -return; -} -}else{ -if(ck.hasClass("tree-checkbox0")){ -return; -} -} -if(!_38){ -if(_3a.onBeforeCheck.call(_35,_3b,_37)==false){ -return; -} -} -if(_3a.cascadeCheck){ -_3c(_35,_3b,_37); -_3d(_35,_3b); -}else{ -_3e(_35,_3b,_37?"1":"0"); -} -if(!_38){ -_3a.onCheck.call(_35,_3b,_37); -} -}; -function _3c(_3f,_40,_41){ -var _42=$.data(_3f,"tree").options; -var _43=_41?1:0; -_3e(_3f,_40,_43); -if(_42.deepCheck){ -$.easyui.forEach(_40.children||[],true,function(n){ -_3e(_3f,n,_43); -}); -}else{ -var _44=[]; -if(_40.children&&_40.children.length){ -_44.push(_40); -} -$.easyui.forEach(_40.children||[],true,function(n){ -if(!n.hidden){ -_3e(_3f,n,_43); -if(n.children&&n.children.length){ -_44.push(n); -} -} -}); -for(var i=_44.length-1;i>=0;i--){ -var _45=_44[i]; -_3e(_3f,_45,_46(_45)); -} -} -}; -function _3e(_47,_48,_49){ -var _4a=$.data(_47,"tree").options; -if(!_48.checkState||_49==undefined){ -return; -} -if(_48.hidden&&!_4a.deepCheck){ -return; -} -var ck=$("#"+_48.domId).find(".tree-checkbox"); -_48.checkState=["unchecked","checked","indeterminate"][_49]; -_48.checked=(_48.checkState=="checked"); -ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); -ck.addClass("tree-checkbox"+_49); -}; -function _3d(_4b,_4c){ -var pd=_4d(_4b,$("#"+_4c.domId)[0]); -if(pd){ -_3e(_4b,pd,_46(pd)); -_3d(_4b,pd); -} -}; -function _46(row){ -var c0=0; -var c1=0; -var len=0; -$.easyui.forEach(row.children||[],false,function(r){ -if(r.checkState){ -len++; -if(r.checkState=="checked"){ -c1++; -}else{ -if(r.checkState=="unchecked"){ -c0++; -} -} -} -}); -if(len==0){ -return undefined; -} -var _4e=0; -if(c0==len){ -_4e=0; -}else{ -if(c1==len){ -_4e=1; -}else{ -_4e=2; -} -} -return _4e; -}; -function _4f(_50,_51){ -var _52=$.data(_50,"tree").options; -if(!_52.checkbox){ -return; -} -var _53=$(_51); -var ck=_53.find(".tree-checkbox"); -var _54=_c(_50,_51); -if(_52.view.hasCheckbox(_50,_54)){ -if(!ck.length){ -_54.checkState=_54.checkState||"unchecked"; -$("").insertBefore(_53.find(".tree-title")); -} -if(_54.checkState=="checked"){ -_34(_50,_51,true,true); -}else{ -if(_54.checkState=="unchecked"){ -_34(_50,_51,false,true); -}else{ -var _55=_46(_54); -if(_55===0){ -_34(_50,_51,false,true); -}else{ -if(_55===1){ -_34(_50,_51,true,true); -} -} -} -} -}else{ -ck.remove(); -_54.checkState=undefined; -_54.checked=undefined; -_3d(_50,_54); -} -}; -function _56(_57,ul,_58,_59,_5a){ -var _5b=$.data(_57,"tree"); -var _5c=_5b.options; -var _5d=$(ul).prevAll("div.tree-node:first"); -_58=_5c.loadFilter.call(_57,_58,_5d[0]); -var _5e=_5f(_57,"domId",_5d.attr("id")); -if(!_59){ -_5e?_5e.children=_58:_5b.data=_58; -$(ul).empty(); -}else{ -if(_5e){ -_5e.children?_5e.children=_5e.children.concat(_58):_5e.children=_58; -}else{ -_5b.data=_5b.data.concat(_58); -} -} -_5c.view.render.call(_5c.view,_57,ul,_58); -if(_5c.dnd){ -_11(_57); -} -if(_5e){ -_60(_57,_5e); -} -for(var i=0;i<_5b.tmpIds.length;i++){ -_34(_57,$("#"+_5b.tmpIds[i])[0],true,true); -} -_5b.tmpIds=[]; -setTimeout(function(){ -_61(_57,_57); -},0); -if(!_5a){ -_5c.onLoadSuccess.call(_57,_5e,_58); -} -}; -function _61(_62,ul,_63){ -var _64=$.data(_62,"tree").options; -if(_64.lines){ -$(_62).addClass("tree-lines"); -}else{ -$(_62).removeClass("tree-lines"); -return; -} -if(!_63){ -_63=true; -$(_62).find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); -$(_62).find("div.tree-node").removeClass("tree-node-last tree-root-first tree-root-one"); -var _65=$(_62).tree("getRoots"); -if(_65.length>1){ -$(_65[0].target).addClass("tree-root-first"); -}else{ -if(_65.length==1){ -$(_65[0].target).addClass("tree-root-one"); -} -} -} -$(ul).children("li").each(function(){ -var _66=$(this).children("div.tree-node"); -var ul=_66.next("ul"); -if(ul.length){ -if($(this).next().length){ -_67(_66); -} -_61(_62,ul,_63); -}else{ -_68(_66); -} -}); -var _69=$(ul).children("li:last").children("div.tree-node").addClass("tree-node-last"); -_69.children("span.tree-join").removeClass("tree-join").addClass("tree-joinbottom"); -function _68(_6a,_6b){ -var _6c=_6a.find("span.tree-icon"); -_6c.prev("span.tree-indent").addClass("tree-join"); -}; -function _67(_6d){ -var _6e=_6d.find("span.tree-indent, span.tree-hit").length; -_6d.next().find("div.tree-node").each(function(){ -$(this).children("span:eq("+(_6e-1)+")").addClass("tree-line"); -}); -}; -}; -function _6f(_70,ul,_71,_72){ -var _73=$.data(_70,"tree").options; -_71=$.extend({},_73.queryParams,_71||{}); -var _74=null; -if(_70!=ul){ -var _75=$(ul).prev(); -_74=_c(_70,_75[0]); -} -if(_73.onBeforeLoad.call(_70,_74,_71)==false){ -return; -} -var _76=$(ul).prev().children("span.tree-folder"); -_76.addClass("tree-loading"); -var _77=_73.loader.call(_70,_71,function(_78){ -_76.removeClass("tree-loading"); -_56(_70,ul,_78); -if(_72){ -_72(); -} -},function(){ -_76.removeClass("tree-loading"); -_73.onLoadError.apply(_70,arguments); -if(_72){ -_72(); -} -}); -if(_77==false){ -_76.removeClass("tree-loading"); -} -}; -function _79(_7a,_7b,_7c){ -var _7d=$.data(_7a,"tree").options; -var hit=$(_7b).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -return; -} -var _7e=_c(_7a,_7b); -if(_7d.onBeforeExpand.call(_7a,_7e)==false){ -return; -} -hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); -hit.next().addClass("tree-folder-open"); -var ul=$(_7b).next(); -if(ul.length){ -if(_7d.animate){ -ul.slideDown("normal",function(){ -_7e.state="open"; -_7d.onExpand.call(_7a,_7e); -if(_7c){ -_7c(); -} -}); -}else{ -ul.css("display","block"); -_7e.state="open"; -_7d.onExpand.call(_7a,_7e); -if(_7c){ -_7c(); -} -} -}else{ -var _7f=$("
                                                                                                                                                                ").insertAfter(_7b); -_6f(_7a,_7f[0],{id:_7e.id},function(){ -if(_7f.is(":empty")){ -_7f.remove(); -} -if(_7d.animate){ -_7f.slideDown("normal",function(){ -_7e.state="open"; -_7d.onExpand.call(_7a,_7e); -if(_7c){ -_7c(); -} -}); -}else{ -_7f.css("display","block"); -_7e.state="open"; -_7d.onExpand.call(_7a,_7e); -if(_7c){ -_7c(); -} -} -}); -} -}; -function _80(_81,_82){ -var _83=$.data(_81,"tree").options; -var hit=$(_82).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-collapsed")){ -return; -} -var _84=_c(_81,_82); -if(_83.onBeforeCollapse.call(_81,_84)==false){ -return; -} -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -hit.next().removeClass("tree-folder-open"); -var ul=$(_82).next(); -if(_83.animate){ -ul.slideUp("normal",function(){ -_84.state="closed"; -_83.onCollapse.call(_81,_84); -}); -}else{ -ul.css("display","none"); -_84.state="closed"; -_83.onCollapse.call(_81,_84); -} -}; -function _85(_86,_87){ -var hit=$(_87).children("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -_80(_86,_87); -}else{ -_79(_86,_87); -} -}; -function _88(_89,_8a){ -var _8b=_8c(_89,_8a); -if(_8a){ -_8b.unshift(_c(_89,_8a)); -} -for(var i=0;i<_8b.length;i++){ -_79(_89,_8b[i].target); -} -}; -function _8d(_8e,_8f){ -var _90=[]; -var p=_4d(_8e,_8f); -while(p){ -_90.unshift(p); -p=_4d(_8e,p.target); -} -for(var i=0;i<_90.length;i++){ -_79(_8e,_90[i].target); -} -}; -function _91(_92,_93){ -var c=$(_92).parent(); -while(c[0].tagName!="BODY"&&c.css("overflow-y")!="auto"){ -c=c.parent(); -} -var n=$(_93); -var _94=n.offset().top; -if(c[0].tagName!="BODY"){ -var _95=c.offset().top; -if(_94<_95){ -c.scrollTop(c.scrollTop()+_94-_95); -}else{ -if(_94+n.outerHeight()>_95+c.outerHeight()-18){ -c.scrollTop(c.scrollTop()+_94+n.outerHeight()-_95-c.outerHeight()+18); -} -} -}else{ -c.scrollTop(_94); -} -}; -function _96(_97,_98){ -var _99=_8c(_97,_98); -if(_98){ -_99.unshift(_c(_97,_98)); -} -for(var i=0;i<_99.length;i++){ -_80(_97,_99[i].target); -} -}; -function _9a(_9b,_9c){ -var _9d=$(_9c.parent); -var _9e=_9c.data; -if(!_9e){ -return; -} -_9e=$.isArray(_9e)?_9e:[_9e]; -if(!_9e.length){ -return; -} -var ul; -if(_9d.length==0){ -ul=$(_9b); -}else{ -if(_9f(_9b,_9d[0])){ -var _a0=_9d.find("span.tree-icon"); -_a0.removeClass("tree-file").addClass("tree-folder tree-folder-open"); -var hit=$("").insertBefore(_a0); -if(hit.prev().length){ -hit.prev().remove(); -} -} -ul=_9d.next(); -if(!ul.length){ -ul=$("
                                                                                                                                                                  ").insertAfter(_9d); -} -} -_56(_9b,ul[0],_9e,true,true); -}; -function _a1(_a2,_a3){ -var ref=_a3.before||_a3.after; -var _a4=_4d(_a2,ref); -var _a5=_a3.data; -if(!_a5){ -return; -} -_a5=$.isArray(_a5)?_a5:[_a5]; -if(!_a5.length){ -return; -} -_9a(_a2,{parent:(_a4?_a4.target:null),data:_a5}); -var _a6=_a4?_a4.children:$(_a2).tree("getRoots"); -for(var i=0;i<_a6.length;i++){ -if(_a6[i].domId==$(ref).attr("id")){ -for(var j=_a5.length-1;j>=0;j--){ -_a6.splice((_a3.before?i:(i+1)),0,_a5[j]); -} -_a6.splice(_a6.length-_a5.length,_a5.length); -break; -} -} -var li=$(); -for(var i=0;i<_a5.length;i++){ -li=li.add($("#"+_a5[i].domId).parent()); -} -if(_a3.before){ -li.insertBefore($(ref).parent()); -}else{ -li.insertAfter($(ref).parent()); -} -}; -function _a7(_a8,_a9){ -var _aa=del(_a9); -$(_a9).parent().remove(); -if(_aa){ -if(!_aa.children||!_aa.children.length){ -var _ab=$(_aa.target); -_ab.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); -_ab.find(".tree-hit").remove(); -$("").prependTo(_ab); -_ab.next().remove(); -} -_60(_a8,_aa); -} -_61(_a8,_a8); -function del(_ac){ -var id=$(_ac).attr("id"); -var _ad=_4d(_a8,_ac); -var cc=_ad?_ad.children:$.data(_a8,"tree").data; -for(var i=0;i").appendTo(nt); -_e6.val(_e4.text).focus(); -_e6.width(_e5+20); -_e6._outerHeight(_e3.editorHeight); -_e6.bind("click",function(e){ -return false; -}).bind("mousedown",function(e){ -e.stopPropagation(); -}).bind("mousemove",function(e){ -e.stopPropagation(); -}).bind("keydown",function(e){ -if(e.keyCode==13){ -_e7(_e1,_e2); -return false; -}else{ -if(e.keyCode==27){ -_ed(_e1,_e2); -return false; -} -} -}).bind("blur",function(e){ -e.stopPropagation(); -_e7(_e1,_e2); -}); -}; -function _e7(_e8,_e9){ -var _ea=$.data(_e8,"tree").options; -$(_e9).css("position",""); -var _eb=$(_e9).find("input.tree-editor"); -var val=_eb.val(); -_eb.remove(); -var _ec=_c(_e8,_e9); -_ec.text=val; -_60(_e8,_ec); -_ea.onAfterEdit.call(_e8,_ec); -}; -function _ed(_ee,_ef){ -var _f0=$.data(_ee,"tree").options; -$(_ef).css("position",""); -$(_ef).find("input.tree-editor").remove(); -var _f1=_c(_ee,_ef); -_60(_ee,_f1); -_f0.onCancelEdit.call(_ee,_f1); -}; -function _f2(_f3,q){ -var _f4=$.data(_f3,"tree"); -var _f5=_f4.options; -var ids={}; -$.easyui.forEach(_f4.data,true,function(_f6){ -if(_f5.filter.call(_f3,q,_f6)){ -$("#"+_f6.domId).removeClass("tree-node-hidden"); -ids[_f6.domId]=1; -_f6.hidden=false; -}else{ -$("#"+_f6.domId).addClass("tree-node-hidden"); -_f6.hidden=true; -} -}); -for(var id in ids){ -_f7(id); -} -function _f7(_f8){ -var p=$(_f3).tree("getParent",$("#"+_f8)[0]); -while(p){ -$(p.target).removeClass("tree-node-hidden"); -p.hidden=false; -p=$(_f3).tree("getParent",p.target); -} -}; -}; -$.fn.tree=function(_f9,_fa){ -if(typeof _f9=="string"){ -return $.fn.tree.methods[_f9](this,_fa); -} -var _f9=_f9||{}; -return this.each(function(){ -var _fb=$.data(this,"tree"); -var _fc; -if(_fb){ -_fc=$.extend(_fb.options,_f9); -_fb.options=_fc; -}else{ -_fc=$.extend({},$.fn.tree.defaults,$.fn.tree.parseOptions(this),_f9); -$.data(this,"tree",{options:_fc,tree:_1(this),data:[],tmpIds:[]}); -var _fd=$.fn.tree.parseData(this); -if(_fd.length){ -_56(this,this,_fd); -} -} -_4(this); -if(_fc.data){ -_56(this,this,$.extend(true,[],_fc.data)); -} -_6f(this,this); -}); -}; -$.fn.tree.methods={options:function(jq){ -return $.data(jq[0],"tree").options; -},loadData:function(jq,_fe){ -return jq.each(function(){ -_56(this,this,_fe); -}); -},getNode:function(jq,_ff){ -return _c(jq[0],_ff); -},getData:function(jq,_100){ -return _c9(jq[0],_100); -},reload:function(jq,_101){ -return jq.each(function(){ -if(_101){ -var node=$(_101); -var hit=node.children("span.tree-hit"); -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -node.next().remove(); -_79(this,_101); -}else{ -$(this).empty(); -_6f(this,this); -} -}); -},getRoot:function(jq,_102){ -return _b3(jq[0],_102); -},getRoots:function(jq){ -return _b7(jq[0]); -},getParent:function(jq,_103){ -return _4d(jq[0],_103); -},getChildren:function(jq,_104){ -return _8c(jq[0],_104); -},getChecked:function(jq,_105){ -return _c2(jq[0],_105); -},getSelected:function(jq){ -return _c6(jq[0]); -},isLeaf:function(jq,_106){ -return _9f(jq[0],_106); -},find:function(jq,id){ -return _d0(jq[0],id); -},select:function(jq,_107){ -return jq.each(function(){ -_d9(this,_107); -}); -},check:function(jq,_108){ -return jq.each(function(){ -_34(this,_108,true); -}); -},uncheck:function(jq,_109){ -return jq.each(function(){ -_34(this,_109,false); -}); -},collapse:function(jq,_10a){ -return jq.each(function(){ -_80(this,_10a); -}); -},expand:function(jq,_10b){ -return jq.each(function(){ -_79(this,_10b); -}); -},collapseAll:function(jq,_10c){ -return jq.each(function(){ -_96(this,_10c); -}); -},expandAll:function(jq,_10d){ -return jq.each(function(){ -_88(this,_10d); -}); -},expandTo:function(jq,_10e){ -return jq.each(function(){ -_8d(this,_10e); -}); -},scrollTo:function(jq,_10f){ -return jq.each(function(){ -_91(this,_10f); -}); -},toggle:function(jq,_110){ -return jq.each(function(){ -_85(this,_110); -}); -},append:function(jq,_111){ -return jq.each(function(){ -_9a(this,_111); -}); -},insert:function(jq,_112){ -return jq.each(function(){ -_a1(this,_112); -}); -},remove:function(jq,_113){ -return jq.each(function(){ -_a7(this,_113); -}); -},pop:function(jq,_114){ -var node=jq.tree("getData",_114); -jq.tree("remove",_114); -return node; -},update:function(jq,_115){ -return jq.each(function(){ -_60(this,$.extend({},_115,{checkState:_115.checked?"checked":(_115.checked===false?"unchecked":undefined)})); -}); -},enableDnd:function(jq){ -return jq.each(function(){ -_11(this); -}); -},disableDnd:function(jq){ -return jq.each(function(){ -_d(this); -}); -},beginEdit:function(jq,_116){ -return jq.each(function(){ -_e0(this,_116); -}); -},endEdit:function(jq,_117){ -return jq.each(function(){ -_e7(this,_117); -}); -},cancelEdit:function(jq,_118){ -return jq.each(function(){ -_ed(this,_118); -}); -},doFilter:function(jq,q){ -return jq.each(function(){ -_f2(this,q); -}); -}}; -$.fn.tree.parseOptions=function(_119){ -var t=$(_119); -return $.extend({},$.parser.parseOptions(_119,["url","method",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean",lines:"boolean",dnd:"boolean"}])); -}; -$.fn.tree.parseData=function(_11a){ -var data=[]; -_11b(data,$(_11a)); -return data; -function _11b(aa,tree){ -tree.children("li").each(function(){ -var node=$(this); -var item=$.extend({},$.parser.parseOptions(this,["id","iconCls","state"]),{checked:(node.attr("checked")?true:undefined)}); -item.text=node.children("span").html(); -if(!item.text){ -item.text=node.html(); -} -var _11c=node.children("ul"); -if(_11c.length){ -item.children=[]; -_11b(item.children,_11c); -} -aa.push(item); -}); -}; -}; -var _11d=1; -var _11e={render:function(_11f,ul,data){ -var _120=$.data(_11f,"tree"); -var opts=_120.options; -var _121=$(ul).prev(".tree-node"); -var _122=_121.length?$(_11f).tree("getNode",_121[0]):null; -var _123=_121.find("span.tree-indent, span.tree-hit").length; -var cc=_124.call(this,_123,data); -$(ul).append(cc.join("")); -function _124(_125,_126){ -var cc=[]; -for(var i=0;i<_126.length;i++){ -var item=_126[i]; -if(item.state!="open"&&item.state!="closed"){ -item.state="open"; -} -item.domId="_easyui_tree_"+_11d++; -cc.push("
                                                                                                                                                                • "); -cc.push("
                                                                                                                                                                  "); -for(var j=0;j<_125;j++){ -cc.push(""); -} -if(item.state=="closed"){ -cc.push(""); -cc.push(""); -}else{ -if(item.children&&item.children.length){ -cc.push(""); -cc.push(""); -}else{ -cc.push(""); -cc.push(""); -} -} -if(this.hasCheckbox(_11f,item)){ -var flag=0; -if(_122&&_122.checkState=="checked"&&opts.cascadeCheck){ -flag=1; -item.checked=true; -}else{ -if(item.checked){ -$.easyui.addArrayItem(_120.tmpIds,item.domId); -} -} -item.checkState=flag?"checked":"unchecked"; -cc.push(""); -}else{ -item.checkState=undefined; -item.checked=undefined; -} -cc.push(""+opts.formatter.call(_11f,item)+""); -cc.push("
                                                                                                                                                                  "); -if(item.children&&item.children.length){ -var tmp=_124.call(this,_125+1,item.children); -cc.push("
                                                                                                                                                                    "); -cc=cc.concat(tmp); -cc.push("
                                                                                                                                                                  "); -} -cc.push("
                                                                                                                                                                • "); -} -return cc; -}; -},hasCheckbox:function(_127,item){ -var _128=$.data(_127,"tree"); -var opts=_128.options; -if(opts.checkbox){ -if($.isFunction(opts.checkbox)){ -if(opts.checkbox.call(_127,item)){ -return true; -}else{ -return false; -} -}else{ -if(opts.onlyLeafCheck){ -if(item.state=="open"&&!(item.children&&item.children.length)){ -return true; -} -}else{ -return true; -} -} -} -return false; -}}; -$.fn.tree.defaults={url:null,method:"post",animate:false,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,dnd:false,editorHeight:26,data:null,queryParams:{},formatter:function(node){ -return node.text; -},filter:function(q,node){ -var qq=[]; -$.map($.isArray(q)?q:[q],function(q){ -q=$.trim(q); -if(q){ -qq.push(q); -} -}); -for(var i=0;i=0){ -return true; -} -} -return !qq.length; -},loader:function(_12a,_12b,_12c){ -var opts=$(this).tree("options"); -if(!opts.url){ -return false; -} -$.ajax({type:opts.method,url:opts.url,data:_12a,dataType:"json",success:function(data){ -_12b(data); -},error:function(){ -_12c.apply(this,arguments); -}}); -},loadFilter:function(data,_12d){ -return data; -},view:_11e,onBeforeLoad:function(node,_12e){ -},onLoadSuccess:function(node,data){ -},onLoadError:function(){ -},onClick:function(node){ -},onDblClick:function(node){ -},onBeforeExpand:function(node){ -},onExpand:function(node){ -},onBeforeCollapse:function(node){ -},onCollapse:function(node){ -},onBeforeCheck:function(node,_12f){ -},onCheck:function(node,_130){ -},onBeforeSelect:function(node){ -},onSelect:function(node){ -},onContextMenu:function(e,node){ -},onBeforeDrag:function(node){ -},onStartDrag:function(node){ -},onStopDrag:function(node){ -},onDragEnter:function(_131,_132){ -},onDragOver:function(_133,_134){ -},onDragLeave:function(_135,_136){ -},onBeforeDrop:function(_137,_138,_139){ -},onDrop:function(_13a,_13b,_13c){ -},onBeforeEdit:function(node){ -},onAfterEdit:function(node){ -},onCancelEdit:function(node){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.treegrid.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.treegrid.js deleted file mode 100755 index 1f0bb30a2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.treegrid.js +++ /dev/null @@ -1,1353 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2){ -var _3=$.data(_2,"treegrid"); -var _4=_3.options; -$(_2).datagrid($.extend({},_4,{url:null,data:null,loader:function(){ -return false; -},onBeforeLoad:function(){ -return false; -},onLoadSuccess:function(){ -},onResizeColumn:function(_5,_6){ -_16(_2); -_4.onResizeColumn.call(_2,_5,_6); -},onBeforeSortColumn:function(_7,_8){ -if(_4.onBeforeSortColumn.call(_2,_7,_8)==false){ -return false; -} -},onSortColumn:function(_9,_a){ -_4.sortName=_9; -_4.sortOrder=_a; -if(_4.remoteSort){ -_15(_2); -}else{ -var _b=$(_2).treegrid("getData"); -_56(_2,null,_b); -} -_4.onSortColumn.call(_2,_9,_a); -},onClickCell:function(_c,_d){ -_4.onClickCell.call(_2,_d,_37(_2,_c)); -},onDblClickCell:function(_e,_f){ -_4.onDblClickCell.call(_2,_f,_37(_2,_e)); -},onRowContextMenu:function(e,_10){ -_4.onContextMenu.call(_2,e,_37(_2,_10)); -}})); -var _11=$.data(_2,"datagrid").options; -_4.columns=_11.columns; -_4.frozenColumns=_11.frozenColumns; -_3.dc=$.data(_2,"datagrid").dc; -if(_4.pagination){ -var _12=$(_2).datagrid("getPager"); -_12.pagination({pageNumber:_4.pageNumber,pageSize:_4.pageSize,pageList:_4.pageList,onSelectPage:function(_13,_14){ -_4.pageNumber=_13; -_4.pageSize=_14; -_15(_2); -}}); -_4.pageSize=_12.pagination("options").pageSize; -} -}; -function _16(_17,_18){ -var _19=$.data(_17,"datagrid").options; -var dc=$.data(_17,"datagrid").dc; -if(!dc.body1.is(":empty")&&(!_19.nowrap||_19.autoRowHeight)){ -if(_18!=undefined){ -var _1a=_1b(_17,_18); -for(var i=0;i<_1a.length;i++){ -_1c(_1a[i][_19.idField]); -} -} -} -$(_17).datagrid("fixRowHeight",_18); -function _1c(_1d){ -var tr1=_19.finder.getTr(_17,_1d,"body",1); -var tr2=_19.finder.getTr(_17,_1d,"body",2); -tr1.css("height",""); -tr2.css("height",""); -var _1e=Math.max(tr1.height(),tr2.height()); -tr1.css("height",_1e); -tr2.css("height",_1e); -}; -}; -function _1f(_20){ -var dc=$.data(_20,"datagrid").dc; -var _21=$.data(_20,"treegrid").options; -if(!_21.rownumbers){ -return; -} -dc.body1.find("div.datagrid-cell-rownumber").each(function(i){ -$(this).html(i+1); -}); -}; -function _22(_23){ -return function(e){ -$.fn.datagrid.defaults.rowEvents[_23?"mouseover":"mouseout"](e); -var tt=$(e.target); -var fn=_23?"addClass":"removeClass"; -if(tt.hasClass("tree-hit")){ -tt.hasClass("tree-expanded")?tt[fn]("tree-expanded-hover"):tt[fn]("tree-collapsed-hover"); -} -}; -}; -function _24(e){ -var tt=$(e.target); -var tr=tt.closest("tr.datagrid-row"); -if(!tr.length||!tr.parent().length){ -return; -} -var _25=tr.attr("node-id"); -var _26=_27(tr); -if(tt.hasClass("tree-hit")){ -_28(_26,_25); -}else{ -if(tt.hasClass("tree-checkbox")){ -_29(_26,_25); -}else{ -var _2a=$(_26).datagrid("options"); -if(!tt.parent().hasClass("datagrid-cell-check")&&!_2a.singleSelect&&e.shiftKey){ -var _2b=$(_26).treegrid("getChildren"); -var _2c=$.easyui.indexOfArray(_2b,_2a.idField,_2a.lastSelectedIndex); -var _2d=$.easyui.indexOfArray(_2b,_2a.idField,_25); -var _2e=Math.min(Math.max(_2c,0),_2d); -var to=Math.max(_2c,_2d); -var row=_2b[_2d]; -var td=tt.closest("td[field]",tr); -if(td.length){ -var _2f=td.attr("field"); -_2a.onClickCell.call(_26,_25,_2f,row[_2f]); -} -$(_26).treegrid("clearSelections"); -for(var i=_2e;i<=to;i++){ -$(_26).treegrid("selectRow",_2b[i][_2a.idField]); -} -_2a.onClickRow.call(_26,row); -}else{ -$.fn.datagrid.defaults.rowEvents.click(e); -} -} -} -}; -function _27(t){ -return $(t).closest("div.datagrid-view").children(".datagrid-f")[0]; -}; -function _29(_30,_31,_32,_33){ -var _34=$.data(_30,"treegrid"); -var _35=_34.checkedRows; -var _36=_34.options; -if(!_36.checkbox){ -return; -} -var row=_37(_30,_31); -if(!row.checkState){ -return; -} -var tr=_36.finder.getTr(_30,_31); -var ck=tr.find(".tree-checkbox"); -if(_32==undefined){ -if(ck.hasClass("tree-checkbox1")){ -_32=false; -}else{ -if(ck.hasClass("tree-checkbox0")){ -_32=true; -}else{ -if(row._checked==undefined){ -row._checked=ck.hasClass("tree-checkbox1"); -} -_32=!row._checked; -} -} -} -row._checked=_32; -if(_32){ -if(ck.hasClass("tree-checkbox1")){ -return; -} -}else{ -if(ck.hasClass("tree-checkbox0")){ -return; -} -} -if(!_33){ -if(_36.onBeforeCheckNode.call(_30,row,_32)==false){ -return; -} -} -if(_36.cascadeCheck){ -_38(_30,row,_32); -_39(_30,row); -}else{ -_3a(_30,row,_32?"1":"0"); -} -if(!_33){ -_36.onCheckNode.call(_30,row,_32); -} -}; -function _3a(_3b,row,_3c){ -var _3d=$.data(_3b,"treegrid"); -var _3e=_3d.checkedRows; -var _3f=_3d.options; -if(!row.checkState||_3c==undefined){ -return; -} -var tr=_3f.finder.getTr(_3b,row[_3f.idField]); -var ck=tr.find(".tree-checkbox"); -if(!ck.length){ -return; -} -row.checkState=["unchecked","checked","indeterminate"][_3c]; -row.checked=(row.checkState=="checked"); -ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2"); -ck.addClass("tree-checkbox"+_3c); -if(_3c==0){ -$.easyui.removeArrayItem(_3e,_3f.idField,row[_3f.idField]); -}else{ -$.easyui.addArrayItem(_3e,_3f.idField,row); -} -}; -function _38(_40,row,_41){ -var _42=_41?1:0; -_3a(_40,row,_42); -$.easyui.forEach(row.children||[],true,function(r){ -_3a(_40,r,_42); -}); -}; -function _39(_43,row){ -var _44=$.data(_43,"treegrid").options; -var _45=_46(_43,row[_44.idField]); -if(_45){ -_3a(_43,_45,_47(_45)); -_39(_43,_45); -} -}; -function _47(row){ -var len=0; -var c0=0; -var c1=0; -$.easyui.forEach(row.children||[],false,function(r){ -if(r.checkState){ -len++; -if(r.checkState=="checked"){ -c1++; -}else{ -if(r.checkState=="unchecked"){ -c0++; -} -} -} -}); -if(len==0){ -return undefined; -} -var _48=0; -if(c0==len){ -_48=0; -}else{ -if(c1==len){ -_48=1; -}else{ -_48=2; -} -} -return _48; -}; -function _49(_4a,_4b){ -var _4c=$.data(_4a,"treegrid").options; -if(!_4c.checkbox){ -return; -} -var row=_37(_4a,_4b); -var tr=_4c.finder.getTr(_4a,_4b); -var ck=tr.find(".tree-checkbox"); -if(_4c.view.hasCheckbox(_4a,row)){ -if(!ck.length){ -row.checkState=row.checkState||"unchecked"; -$("").insertBefore(tr.find(".tree-title")); -} -if(row.checkState=="checked"){ -_29(_4a,_4b,true,true); -}else{ -if(row.checkState=="unchecked"){ -_29(_4a,_4b,false,true); -}else{ -var _4d=_47(row); -if(_4d===0){ -_29(_4a,_4b,false,true); -}else{ -if(_4d===1){ -_29(_4a,_4b,true,true); -} -} -} -} -}else{ -ck.remove(); -row.checkState=undefined; -row.checked=undefined; -_39(_4a,row); -} -}; -function _4e(_4f,_50){ -var _51=$.data(_4f,"treegrid").options; -var tr1=_51.finder.getTr(_4f,_50,"body",1); -var tr2=_51.finder.getTr(_4f,_50,"body",2); -var _52=$(_4f).datagrid("getColumnFields",true).length+(_51.rownumbers?1:0); -var _53=$(_4f).datagrid("getColumnFields",false).length; -_54(tr1,_52); -_54(tr2,_53); -function _54(tr,_55){ -$(""+""+"
                                                                                                                                                                  "+""+"").insertAfter(tr); -}; -}; -function _56(_57,_58,_59,_5a,_5b){ -var _5c=$.data(_57,"treegrid"); -var _5d=_5c.options; -var dc=_5c.dc; -_59=_5d.loadFilter.call(_57,_59,_58); -var _5e=_37(_57,_58); -if(_5e){ -var _5f=_5d.finder.getTr(_57,_58,"body",1); -var _60=_5d.finder.getTr(_57,_58,"body",2); -var cc1=_5f.next("tr.treegrid-tr-tree").children("td").children("div"); -var cc2=_60.next("tr.treegrid-tr-tree").children("td").children("div"); -if(!_5a){ -_5e.children=[]; -} -}else{ -var cc1=dc.body1; -var cc2=dc.body2; -if(!_5a){ -_5c.data=[]; -} -} -if(!_5a){ -cc1.empty(); -cc2.empty(); -} -if(_5d.view.onBeforeRender){ -_5d.view.onBeforeRender.call(_5d.view,_57,_58,_59); -} -_5d.view.render.call(_5d.view,_57,cc1,true); -_5d.view.render.call(_5d.view,_57,cc2,false); -if(_5d.showFooter){ -_5d.view.renderFooter.call(_5d.view,_57,dc.footer1,true); -_5d.view.renderFooter.call(_5d.view,_57,dc.footer2,false); -} -if(_5d.view.onAfterRender){ -_5d.view.onAfterRender.call(_5d.view,_57); -} -if(!_58&&_5d.pagination){ -var _61=$.data(_57,"treegrid").total; -var _62=$(_57).datagrid("getPager"); -if(_62.pagination("options").total!=_61){ -_62.pagination({total:_61}); -} -} -_16(_57); -_1f(_57); -$(_57).treegrid("showLines"); -$(_57).treegrid("setSelectionState"); -$(_57).treegrid("autoSizeColumn"); -if(!_5b){ -_5d.onLoadSuccess.call(_57,_5e,_59); -} -}; -function _15(_63,_64,_65,_66,_67){ -var _68=$.data(_63,"treegrid").options; -var _69=$(_63).datagrid("getPanel").find("div.datagrid-body"); -if(_64==undefined&&_68.queryParams){ -_68.queryParams.id=undefined; -} -if(_65){ -_68.queryParams=_65; -} -var _6a=$.extend({},_68.queryParams); -if(_68.pagination){ -$.extend(_6a,{page:_68.pageNumber,rows:_68.pageSize}); -} -if(_68.sortName){ -$.extend(_6a,{sort:_68.sortName,order:_68.sortOrder}); -} -var row=_37(_63,_64); -if(_68.onBeforeLoad.call(_63,row,_6a)==false){ -return; -} -var _6b=_69.find("tr[node-id=\""+_64+"\"] span.tree-folder"); -_6b.addClass("tree-loading"); -$(_63).treegrid("loading"); -var _6c=_68.loader.call(_63,_6a,function(_6d){ -_6b.removeClass("tree-loading"); -$(_63).treegrid("loaded"); -_56(_63,_64,_6d,_66); -if(_67){ -_67(); -} -},function(){ -_6b.removeClass("tree-loading"); -$(_63).treegrid("loaded"); -_68.onLoadError.apply(_63,arguments); -if(_67){ -_67(); -} -}); -if(_6c==false){ -_6b.removeClass("tree-loading"); -$(_63).treegrid("loaded"); -} -}; -function _6e(_6f){ -var _70=_71(_6f); -return _70.length?_70[0]:null; -}; -function _71(_72){ -return $.data(_72,"treegrid").data; -}; -function _46(_73,_74){ -var row=_37(_73,_74); -if(row._parentId){ -return _37(_73,row._parentId); -}else{ -return null; -} -}; -function _1b(_75,_76){ -var _77=$.data(_75,"treegrid").data; -if(_76){ -var _78=_37(_75,_76); -_77=_78?(_78.children||[]):[]; -} -var _79=[]; -$.easyui.forEach(_77,true,function(_7a){ -_79.push(_7a); -}); -return _79; -}; -function _7b(_7c,_7d){ -var _7e=$.data(_7c,"treegrid").options; -var tr=_7e.finder.getTr(_7c,_7d); -var _7f=tr.children("td[field=\""+_7e.treeField+"\"]"); -return _7f.find("span.tree-indent,span.tree-hit").length; -}; -function _37(_80,_81){ -var _82=$.data(_80,"treegrid"); -var _83=_82.options; -var _84=null; -$.easyui.forEach(_82.data,true,function(_85){ -if(_85[_83.idField]==_81){ -_84=_85; -return false; -} -}); -return _84; -}; -function _86(_87,_88){ -var _89=$.data(_87,"treegrid").options; -var row=_37(_87,_88); -var tr=_89.finder.getTr(_87,_88); -var hit=tr.find("span.tree-hit"); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-collapsed")){ -return; -} -if(_89.onBeforeCollapse.call(_87,row)==false){ -return; -} -hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -hit.next().removeClass("tree-folder-open"); -row.state="closed"; -tr=tr.next("tr.treegrid-tr-tree"); -var cc=tr.children("td").children("div"); -if(_89.animate){ -cc.slideUp("normal",function(){ -$(_87).treegrid("autoSizeColumn"); -_16(_87,_88); -_89.onCollapse.call(_87,row); -}); -}else{ -cc.hide(); -$(_87).treegrid("autoSizeColumn"); -_16(_87,_88); -_89.onCollapse.call(_87,row); -} -}; -function _8a(_8b,_8c){ -var _8d=$.data(_8b,"treegrid").options; -var tr=_8d.finder.getTr(_8b,_8c); -var hit=tr.find("span.tree-hit"); -var row=_37(_8b,_8c); -if(hit.length==0){ -return; -} -if(hit.hasClass("tree-expanded")){ -return; -} -if(_8d.onBeforeExpand.call(_8b,row)==false){ -return; -} -hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded"); -hit.next().addClass("tree-folder-open"); -var _8e=tr.next("tr.treegrid-tr-tree"); -if(_8e.length){ -var cc=_8e.children("td").children("div"); -_8f(cc); -}else{ -_4e(_8b,row[_8d.idField]); -var _8e=tr.next("tr.treegrid-tr-tree"); -var cc=_8e.children("td").children("div"); -cc.hide(); -var _90=$.extend({},_8d.queryParams||{}); -_90.id=row[_8d.idField]; -_15(_8b,row[_8d.idField],_90,true,function(){ -if(cc.is(":empty")){ -_8e.remove(); -}else{ -_8f(cc); -} -}); -} -function _8f(cc){ -row.state="open"; -if(_8d.animate){ -cc.slideDown("normal",function(){ -$(_8b).treegrid("autoSizeColumn"); -_16(_8b,_8c); -_8d.onExpand.call(_8b,row); -}); -}else{ -cc.show(); -$(_8b).treegrid("autoSizeColumn"); -_16(_8b,_8c); -_8d.onExpand.call(_8b,row); -} -}; -}; -function _28(_91,_92){ -var _93=$.data(_91,"treegrid").options; -var tr=_93.finder.getTr(_91,_92); -var hit=tr.find("span.tree-hit"); -if(hit.hasClass("tree-expanded")){ -_86(_91,_92); -}else{ -_8a(_91,_92); -} -}; -function _94(_95,_96){ -var _97=$.data(_95,"treegrid").options; -var _98=_1b(_95,_96); -if(_96){ -_98.unshift(_37(_95,_96)); -} -for(var i=0;i<_98.length;i++){ -_86(_95,_98[i][_97.idField]); -} -}; -function _99(_9a,_9b){ -var _9c=$.data(_9a,"treegrid").options; -var _9d=_1b(_9a,_9b); -if(_9b){ -_9d.unshift(_37(_9a,_9b)); -} -for(var i=0;i<_9d.length;i++){ -_8a(_9a,_9d[i][_9c.idField]); -} -}; -function _9e(_9f,_a0){ -var _a1=$.data(_9f,"treegrid").options; -var ids=[]; -var p=_46(_9f,_a0); -while(p){ -var id=p[_a1.idField]; -ids.unshift(id); -p=_46(_9f,id); -} -for(var i=0;i").insertBefore(_a8); -if(hit.prev().length){ -hit.prev().remove(); -} -} -} -_56(_a3,_a4.parent,_a4.data,_a5.data.length>0,true); -}; -function _a9(_aa,_ab){ -var ref=_ab.before||_ab.after; -var _ac=$.data(_aa,"treegrid").options; -var _ad=_46(_aa,ref); -_a2(_aa,{parent:(_ad?_ad[_ac.idField]:null),data:[_ab.data]}); -var _ae=_ad?_ad.children:$(_aa).treegrid("getRoots"); -for(var i=0;i<_ae.length;i++){ -if(_ae[i][_ac.idField]==ref){ -var _af=_ae[_ae.length-1]; -_ae.splice(_ab.before?i:(i+1),0,_af); -_ae.splice(_ae.length-1,1); -break; -} -} -_b0(true); -_b0(false); -_1f(_aa); -$(_aa).treegrid("showLines"); -function _b0(_b1){ -var _b2=_b1?1:2; -var tr=_ac.finder.getTr(_aa,_ab.data[_ac.idField],"body",_b2); -var _b3=tr.closest("table.datagrid-btable"); -tr=tr.parent().children(); -var _b4=_ac.finder.getTr(_aa,ref,"body",_b2); -if(_ab.before){ -tr.insertBefore(_b4); -}else{ -var sub=_b4.next("tr.treegrid-tr-tree"); -tr.insertAfter(sub.length?sub:_b4); -} -_b3.remove(); -}; -}; -function _b5(_b6,_b7){ -var _b8=$.data(_b6,"treegrid"); -var _b9=_b8.options; -var _ba=_46(_b6,_b7); -$(_b6).datagrid("deleteRow",_b7); -$.easyui.removeArrayItem(_b8.checkedRows,_b9.idField,_b7); -_1f(_b6); -if(_ba){ -_49(_b6,_ba[_b9.idField]); -} -_b8.total-=1; -$(_b6).datagrid("getPager").pagination("refresh",{total:_b8.total}); -$(_b6).treegrid("showLines"); -}; -function _bb(_bc){ -var t=$(_bc); -var _bd=t.treegrid("options"); -if(_bd.lines){ -t.treegrid("getPanel").addClass("tree-lines"); -}else{ -t.treegrid("getPanel").removeClass("tree-lines"); -return; -} -t.treegrid("getPanel").find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom"); -t.treegrid("getPanel").find("div.datagrid-cell").removeClass("tree-node-last tree-root-first tree-root-one"); -var _be=t.treegrid("getRoots"); -if(_be.length>1){ -_bf(_be[0]).addClass("tree-root-first"); -}else{ -if(_be.length==1){ -_bf(_be[0]).addClass("tree-root-one"); -} -} -_c0(_be); -_c1(_be); -function _c0(_c2){ -$.map(_c2,function(_c3){ -if(_c3.children&&_c3.children.length){ -_c0(_c3.children); -}else{ -var _c4=_bf(_c3); -_c4.find(".tree-icon").prev().addClass("tree-join"); -} -}); -if(_c2.length){ -var _c5=_bf(_c2[_c2.length-1]); -_c5.addClass("tree-node-last"); -_c5.find(".tree-join").removeClass("tree-join").addClass("tree-joinbottom"); -} -}; -function _c1(_c6){ -$.map(_c6,function(_c7){ -if(_c7.children&&_c7.children.length){ -_c1(_c7.children); -} -}); -for(var i=0;i<_c6.length-1;i++){ -var _c8=_c6[i]; -var _c9=t.treegrid("getLevel",_c8[_bd.idField]); -var tr=_bd.finder.getTr(_bc,_c8[_bd.idField]); -var cc=tr.next().find("tr.datagrid-row td[field=\""+_bd.treeField+"\"] div.datagrid-cell"); -cc.find("span:eq("+(_c9-1)+")").addClass("tree-line"); -} -}; -function _bf(_ca){ -var tr=_bd.finder.getTr(_bc,_ca[_bd.idField]); -var _cb=tr.find("td[field=\""+_bd.treeField+"\"] div.datagrid-cell"); -return _cb; -}; -}; -$.fn.treegrid=function(_cc,_cd){ -if(typeof _cc=="string"){ -var _ce=$.fn.treegrid.methods[_cc]; -if(_ce){ -return _ce(this,_cd); -}else{ -return this.datagrid(_cc,_cd); -} -} -_cc=_cc||{}; -return this.each(function(){ -var _cf=$.data(this,"treegrid"); -if(_cf){ -$.extend(_cf.options,_cc); -}else{ -_cf=$.data(this,"treegrid",{options:$.extend({},$.fn.treegrid.defaults,$.fn.treegrid.parseOptions(this),_cc),data:[],checkedRows:[],tmpIds:[]}); -} -_1(this); -if(_cf.options.data){ -$(this).treegrid("loadData",_cf.options.data); -} -_15(this); -}); -}; -$.fn.treegrid.methods={options:function(jq){ -return $.data(jq[0],"treegrid").options; -},resize:function(jq,_d0){ -return jq.each(function(){ -$(this).datagrid("resize",_d0); -}); -},fixRowHeight:function(jq,_d1){ -return jq.each(function(){ -_16(this,_d1); -}); -},loadData:function(jq,_d2){ -return jq.each(function(){ -_56(this,_d2.parent,_d2); -}); -},load:function(jq,_d3){ -return jq.each(function(){ -$(this).treegrid("options").pageNumber=1; -$(this).treegrid("getPager").pagination({pageNumber:1}); -$(this).treegrid("reload",_d3); -}); -},reload:function(jq,id){ -return jq.each(function(){ -var _d4=$(this).treegrid("options"); -var _d5={}; -if(typeof id=="object"){ -_d5=id; -}else{ -_d5=$.extend({},_d4.queryParams); -_d5.id=id; -} -if(_d5.id){ -var _d6=$(this).treegrid("find",_d5.id); -if(_d6.children){ -_d6.children.splice(0,_d6.children.length); -} -_d4.queryParams=_d5; -var tr=_d4.finder.getTr(this,_d5.id); -tr.next("tr.treegrid-tr-tree").remove(); -tr.find("span.tree-hit").removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed"); -_8a(this,_d5.id); -}else{ -_15(this,null,_d5); -} -}); -},reloadFooter:function(jq,_d7){ -return jq.each(function(){ -var _d8=$.data(this,"treegrid").options; -var dc=$.data(this,"datagrid").dc; -if(_d7){ -$.data(this,"treegrid").footer=_d7; -} -if(_d8.showFooter){ -_d8.view.renderFooter.call(_d8.view,this,dc.footer1,true); -_d8.view.renderFooter.call(_d8.view,this,dc.footer2,false); -if(_d8.view.onAfterRender){ -_d8.view.onAfterRender.call(_d8.view,this); -} -$(this).treegrid("fixRowHeight"); -} -}); -},getData:function(jq){ -return $.data(jq[0],"treegrid").data; -},getFooterRows:function(jq){ -return $.data(jq[0],"treegrid").footer; -},getRoot:function(jq){ -return _6e(jq[0]); -},getRoots:function(jq){ -return _71(jq[0]); -},getParent:function(jq,id){ -return _46(jq[0],id); -},getChildren:function(jq,id){ -return _1b(jq[0],id); -},getLevel:function(jq,id){ -return _7b(jq[0],id); -},find:function(jq,id){ -return _37(jq[0],id); -},isLeaf:function(jq,id){ -var _d9=$.data(jq[0],"treegrid").options; -var tr=_d9.finder.getTr(jq[0],id); -var hit=tr.find("span.tree-hit"); -return hit.length==0; -},select:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("selectRow",id); -}); -},unselect:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("unselectRow",id); -}); -},collapse:function(jq,id){ -return jq.each(function(){ -_86(this,id); -}); -},expand:function(jq,id){ -return jq.each(function(){ -_8a(this,id); -}); -},toggle:function(jq,id){ -return jq.each(function(){ -_28(this,id); -}); -},collapseAll:function(jq,id){ -return jq.each(function(){ -_94(this,id); -}); -},expandAll:function(jq,id){ -return jq.each(function(){ -_99(this,id); -}); -},expandTo:function(jq,id){ -return jq.each(function(){ -_9e(this,id); -}); -},append:function(jq,_da){ -return jq.each(function(){ -_a2(this,_da); -}); -},insert:function(jq,_db){ -return jq.each(function(){ -_a9(this,_db); -}); -},remove:function(jq,id){ -return jq.each(function(){ -_b5(this,id); -}); -},pop:function(jq,id){ -var row=jq.treegrid("find",id); -jq.treegrid("remove",id); -return row; -},refresh:function(jq,id){ -return jq.each(function(){ -var _dc=$.data(this,"treegrid").options; -_dc.view.refreshRow.call(_dc.view,this,id); -}); -},update:function(jq,_dd){ -return jq.each(function(){ -var _de=$.data(this,"treegrid").options; -var row=_dd.row; -_de.view.updateRow.call(_de.view,this,_dd.id,row); -if(row.checked!=undefined){ -row=_37(this,_dd.id); -$.extend(row,{checkState:row.checked?"checked":(row.checked===false?"unchecked":undefined)}); -_49(this,_dd.id); -} -}); -},beginEdit:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("beginEdit",id); -$(this).treegrid("fixRowHeight",id); -}); -},endEdit:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("endEdit",id); -}); -},cancelEdit:function(jq,id){ -return jq.each(function(){ -$(this).datagrid("cancelEdit",id); -}); -},showLines:function(jq){ -return jq.each(function(){ -_bb(this); -}); -},setSelectionState:function(jq){ -return jq.each(function(){ -$(this).datagrid("setSelectionState"); -var _df=$(this).data("treegrid"); -for(var i=0;i<_df.tmpIds.length;i++){ -_29(this,_df.tmpIds[i],true,true); -} -_df.tmpIds=[]; -}); -},getCheckedNodes:function(jq,_e0){ -_e0=_e0||"checked"; -var _e1=[]; -$.easyui.forEach(jq.data("treegrid").checkedRows,false,function(row){ -if(row.checkState==_e0){ -_e1.push(row); -} -}); -return _e1; -},checkNode:function(jq,id){ -return jq.each(function(){ -_29(this,id,true); -}); -},uncheckNode:function(jq,id){ -return jq.each(function(){ -_29(this,id,false); -}); -},clearChecked:function(jq){ -return jq.each(function(){ -var _e2=this; -var _e3=$(_e2).treegrid("options"); -$(_e2).datagrid("clearChecked"); -$.map($(_e2).treegrid("getCheckedNodes"),function(row){ -_29(_e2,row[_e3.idField],false,true); -}); -}); -}}; -$.fn.treegrid.parseOptions=function(_e4){ -return $.extend({},$.fn.datagrid.parseOptions(_e4),$.parser.parseOptions(_e4,["treeField",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean"}])); -}; -var _e5=$.extend({},$.fn.datagrid.defaults.view,{render:function(_e6,_e7,_e8){ -var _e9=$.data(_e6,"treegrid").options; -var _ea=$(_e6).datagrid("getColumnFields",_e8); -var _eb=$.data(_e6,"datagrid").rowIdPrefix; -if(_e8){ -if(!(_e9.rownumbers||(_e9.frozenColumns&&_e9.frozenColumns.length))){ -return; -} -} -var _ec=this; -if(this.treeNodes&&this.treeNodes.length){ -var _ed=_ee.call(this,_e8,this.treeLevel,this.treeNodes); -$(_e7).append(_ed.join("")); -} -function _ee(_ef,_f0,_f1){ -var _f2=$(_e6).treegrid("getParent",_f1[0][_e9.idField]); -var _f3=(_f2?_f2.children.length:$(_e6).treegrid("getRoots").length)-_f1.length; -var _f4=[""]; -for(var i=0;i<_f1.length;i++){ -var row=_f1[i]; -if(row.state!="open"&&row.state!="closed"){ -row.state="open"; -} -var css=_e9.rowStyler?_e9.rowStyler.call(_e6,row):""; -var cs=this.getStyleValue(css); -var cls="class=\"datagrid-row "+(_f3++%2&&_e9.striped?"datagrid-row-alt ":" ")+cs.c+"\""; -var _f5=cs.s?"style=\""+cs.s+"\"":""; -var _f6=_eb+"-"+(_ef?1:2)+"-"+row[_e9.idField]; -_f4.push(""); -_f4=_f4.concat(_ec.renderRow.call(_ec,_e6,_ea,_ef,_f0,row)); -_f4.push(""); -if(row.children&&row.children.length){ -var tt=_ee.call(this,_ef,_f0+1,row.children); -var v=row.state=="closed"?"none":"block"; -_f4.push(""); -} -} -_f4.push("
                                                                                                                                                                  "); -_f4=_f4.concat(tt); -_f4.push("
                                                                                                                                                                  "); -return _f4; -}; -},renderFooter:function(_f7,_f8,_f9){ -var _fa=$.data(_f7,"treegrid").options; -var _fb=$.data(_f7,"treegrid").footer||[]; -var _fc=$(_f7).datagrid("getColumnFields",_f9); -var _fd=[""]; -for(var i=0;i<_fb.length;i++){ -var row=_fb[i]; -row[_fa.idField]=row[_fa.idField]||("foot-row-id"+i); -_fd.push(""); -_fd.push(this.renderRow.call(this,_f7,_fc,_f9,0,row)); -_fd.push(""); -} -_fd.push("
                                                                                                                                                                  "); -$(_f8).html(_fd.join("")); -},renderRow:function(_fe,_ff,_100,_101,row){ -var _102=$.data(_fe,"treegrid"); -var opts=_102.options; -var cc=[]; -if(_100&&opts.rownumbers){ -cc.push("
                                                                                                                                                                  0
                                                                                                                                                                  "); -} -for(var i=0;i<_ff.length;i++){ -var _103=_ff[i]; -var col=$(_fe).datagrid("getColumnOption",_103); -if(col){ -var css=col.styler?(col.styler(row[_103],row)||""):""; -var cs=this.getStyleValue(css); -var cls=cs.c?"class=\""+cs.c+"\"":""; -var _104=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":""); -cc.push(""); -var _104=""; -if(!col.checkbox){ -if(col.align){ -_104+="text-align:"+col.align+";"; -} -if(!opts.nowrap){ -_104+="white-space:normal;height:auto;"; -}else{ -if(opts.autoRowHeight){ -_104+="height:auto;"; -} -} -} -cc.push("
                                                                                                                                                                  "); -if(col.checkbox){ -if(row.checked){ -cc.push(""); -}else{ -var val=null; -if(col.formatter){ -val=col.formatter(row[_103],row); -}else{ -val=row[_103]; -} -if(_103==opts.treeField){ -for(var j=0;j<_101;j++){ -cc.push(""); -} -if(row.state=="closed"){ -cc.push(""); -cc.push(""); -}else{ -if(row.children&&row.children.length){ -cc.push(""); -cc.push(""); -}else{ -cc.push(""); -cc.push(""); -} -} -if(this.hasCheckbox(_fe,row)){ -var flag=0; -var crow=$.easyui.getArrayItem(_102.checkedRows,opts.idField,row[opts.idField]); -if(crow){ -flag=crow.checkState=="checked"?1:2; -row.checkState=crow.checkState; -row.checked=crow.checked; -$.easyui.addArrayItem(_102.checkedRows,opts.idField,row); -}else{ -var prow=$.easyui.getArrayItem(_102.checkedRows,opts.idField,row._parentId); -if(prow&&prow.checkState=="checked"&&opts.cascadeCheck){ -flag=1; -row.checked=true; -$.easyui.addArrayItem(_102.checkedRows,opts.idField,row); -}else{ -if(row.checked){ -$.easyui.addArrayItem(_102.tmpIds,row[opts.idField]); -} -} -row.checkState=flag?"checked":"unchecked"; -} -cc.push(""); -}else{ -row.checkState=undefined; -row.checked=undefined; -} -cc.push(""+val+""); -}else{ -cc.push(val); -} -} -cc.push("
                                                                                                                                                                  "); -cc.push(""); -} -} -return cc.join(""); -},hasCheckbox:function(_105,row){ -var opts=$.data(_105,"treegrid").options; -if(opts.checkbox){ -if($.isFunction(opts.checkbox)){ -if(opts.checkbox.call(_105,row)){ -return true; -}else{ -return false; -} -}else{ -if(opts.onlyLeafCheck){ -if(row.state=="open"&&!(row.children&&row.children.length)){ -return true; -} -}else{ -return true; -} -} -} -return false; -},refreshRow:function(_106,id){ -this.updateRow.call(this,_106,id,{}); -},updateRow:function(_107,id,row){ -var opts=$.data(_107,"treegrid").options; -var _108=$(_107).treegrid("find",id); -$.extend(_108,row); -var _109=$(_107).treegrid("getLevel",id)-1; -var _10a=opts.rowStyler?opts.rowStyler.call(_107,_108):""; -var _10b=$.data(_107,"datagrid").rowIdPrefix; -var _10c=_108[opts.idField]; -function _10d(_10e){ -var _10f=$(_107).treegrid("getColumnFields",_10e); -var tr=opts.finder.getTr(_107,id,"body",(_10e?1:2)); -var _110=tr.find("div.datagrid-cell-rownumber").html(); -var _111=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); -tr.html(this.renderRow(_107,_10f,_10e,_109,_108)); -tr.attr("style",_10a||""); -tr.find("div.datagrid-cell-rownumber").html(_110); -if(_111){ -tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true); -} -if(_10c!=id){ -tr.attr("id",_10b+"-"+(_10e?1:2)+"-"+_10c); -tr.attr("node-id",_10c); -} -}; -_10d.call(this,true); -_10d.call(this,false); -$(_107).treegrid("fixRowHeight",id); -},deleteRow:function(_112,id){ -var opts=$.data(_112,"treegrid").options; -var tr=opts.finder.getTr(_112,id); -tr.next("tr.treegrid-tr-tree").remove(); -tr.remove(); -var _113=del(id); -if(_113){ -if(_113.children.length==0){ -tr=opts.finder.getTr(_112,_113[opts.idField]); -tr.next("tr.treegrid-tr-tree").remove(); -var cell=tr.children("td[field=\""+opts.treeField+"\"]").children("div.datagrid-cell"); -cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file"); -cell.find(".tree-hit").remove(); -$("").prependTo(cell); -} -} -this.setEmptyMsg(_112); -function del(id){ -var cc; -var _114=$(_112).treegrid("getParent",id); -if(_114){ -cc=_114.children; -}else{ -cc=$(_112).treegrid("getData"); -} -for(var i=0;ib?1:-1); -}; -r=_11f(r1[sn],r2[sn])*(so=="asc"?1:-1); -if(r!=0){ -return r; -} -} -return r; -}); -for(var i=0;i=_45[0]&&len<=_45[1]; -},message:"Please enter a value between {0} and {1}."},remote:{validator:function(_46,_47){ -var _48={}; -_48[_47[1]]=_46; -var _49=$.ajax({url:_47[0],dataType:"json",data:_48,async:false,cache:false,type:"post"}).responseText; -return _49=="true"; -},message:"Please fix this field."}},onBeforeValidate:function(){ -},onValidate:function(_4a){ -}}; -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.window.js b/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.window.js deleted file mode 100755 index 09e7cde1f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/plugins/jquery.window.js +++ /dev/null @@ -1,311 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -(function($){ -function _1(_2,_3){ -var _4=$.data(_2,"window"); -if(_3){ -if(_3.left!=null){ -_4.options.left=_3.left; -} -if(_3.top!=null){ -_4.options.top=_3.top; -} -} -$(_2).panel("move",_4.options); -if(_4.shadow){ -_4.shadow.css({left:_4.options.left,top:_4.options.top}); -} -}; -function _5(_6,_7){ -var _8=$.data(_6,"window").options; -var pp=$(_6).window("panel"); -var _9=pp._outerWidth(); -if(_8.inline){ -var _a=pp.parent(); -_8.left=Math.ceil((_a.width()-_9)/2+_a.scrollLeft()); -}else{ -_8.left=Math.ceil(($(window)._outerWidth()-_9)/2+$(document).scrollLeft()); -} -if(_7){ -_1(_6); -} -}; -function _b(_c,_d){ -var _e=$.data(_c,"window").options; -var pp=$(_c).window("panel"); -var _f=pp._outerHeight(); -if(_e.inline){ -var _10=pp.parent(); -_e.top=Math.ceil((_10.height()-_f)/2+_10.scrollTop()); -}else{ -_e.top=Math.ceil(($(window)._outerHeight()-_f)/2+$(document).scrollTop()); -} -if(_d){ -_1(_c); -} -}; -function _11(_12){ -var _13=$.data(_12,"window"); -var _14=_13.options; -var win=$(_12).panel($.extend({},_13.options,{border:false,doSize:true,closed:true,cls:"window "+(!_14.border?"window-thinborder window-noborder ":(_14.border=="thin"?"window-thinborder ":""))+(_14.cls||""),headerCls:"window-header "+(_14.headerCls||""),bodyCls:"window-body "+(_14.noheader?"window-body-noheader ":" ")+(_14.bodyCls||""),onBeforeDestroy:function(){ -if(_14.onBeforeDestroy.call(_12)==false){ -return false; -} -if(_13.shadow){ -_13.shadow.remove(); -} -if(_13.mask){ -_13.mask.remove(); -} -},onClose:function(){ -if(_13.shadow){ -_13.shadow.hide(); -} -if(_13.mask){ -_13.mask.hide(); -} -_14.onClose.call(_12); -},onOpen:function(){ -if(_13.mask){ -_13.mask.css($.extend({display:"block",zIndex:$.fn.window.defaults.zIndex++},$.fn.window.getMaskSize(_12))); -} -if(_13.shadow){ -_13.shadow.css({display:"block",zIndex:$.fn.window.defaults.zIndex++,left:_14.left,top:_14.top,width:_13.window._outerWidth(),height:_13.window._outerHeight()}); -} -_13.window.css("z-index",$.fn.window.defaults.zIndex++); -_14.onOpen.call(_12); -},onResize:function(_15,_16){ -var _17=$(this).panel("options"); -$.extend(_14,{width:_17.width,height:_17.height,left:_17.left,top:_17.top}); -if(_13.shadow){ -_13.shadow.css({left:_14.left,top:_14.top,width:_13.window._outerWidth(),height:_13.window._outerHeight()}); -} -_14.onResize.call(_12,_15,_16); -},onMinimize:function(){ -if(_13.shadow){ -_13.shadow.hide(); -} -if(_13.mask){ -_13.mask.hide(); -} -_13.options.onMinimize.call(_12); -},onBeforeCollapse:function(){ -if(_14.onBeforeCollapse.call(_12)==false){ -return false; -} -if(_13.shadow){ -_13.shadow.hide(); -} -},onExpand:function(){ -if(_13.shadow){ -_13.shadow.show(); -} -_14.onExpand.call(_12); -}})); -_13.window=win.panel("panel"); -if(_13.mask){ -_13.mask.remove(); -} -if(_14.modal){ -_13.mask=$("
                                                                                                                                                                  ").insertAfter(_13.window); -} -if(_13.shadow){ -_13.shadow.remove(); -} -if(_14.shadow){ -_13.shadow=$("
                                                                                                                                                                  ").insertAfter(_13.window); -} -var _18=_14.closed; -if(_14.left==null){ -_5(_12); -} -if(_14.top==null){ -_b(_12); -} -_1(_12); -if(!_18){ -win.window("open"); -} -}; -function _19(_1a,top,_1b,_1c){ -var _1d=this; -var _1e=$.data(_1d,"window"); -var _1f=_1e.options; -if(!_1f.constrain){ -return {}; -} -if($.isFunction(_1f.constrain)){ -return _1f.constrain.call(_1d,_1a,top,_1b,_1c); -} -var win=$(_1d).window("window"); -var _20=_1f.inline?win.parent():$(window); -if(_1a<0){ -_1a=0; -} -if(top<_20.scrollTop()){ -top=_20.scrollTop(); -} -if(_1a+_1b>_20.width()){ -if(_1b==win.outerWidth()){ -_1a=_20.width()-_1b; -}else{ -_1b=_20.width()-_1a; -} -} -if(top-_20.scrollTop()+_1c>_20.height()){ -if(_1c==win.outerHeight()){ -top=_20.height()-_1c+_20.scrollTop(); -}else{ -_1c=_20.height()-top+_20.scrollTop(); -} -} -return {left:_1a,top:top,width:_1b,height:_1c}; -}; -function _21(_22){ -var _23=$.data(_22,"window"); -_23.window.draggable({handle:">div.panel-header>div.panel-title",disabled:_23.options.draggable==false,onBeforeDrag:function(e){ -if(_23.mask){ -_23.mask.css("z-index",$.fn.window.defaults.zIndex++); -} -if(_23.shadow){ -_23.shadow.css("z-index",$.fn.window.defaults.zIndex++); -} -_23.window.css("z-index",$.fn.window.defaults.zIndex++); -},onStartDrag:function(e){ -_24(e); -},onDrag:function(e){ -_25(e); -return false; -},onStopDrag:function(e){ -_26(e,"move"); -}}); -_23.window.resizable({disabled:_23.options.resizable==false,onStartResize:function(e){ -_24(e); -},onResize:function(e){ -_25(e); -return false; -},onStopResize:function(e){ -_26(e,"resize"); -}}); -function _24(e){ -if(_23.pmask){ -_23.pmask.remove(); -} -_23.pmask=$("
                                                                                                                                                                  ").insertAfter(_23.window); -_23.pmask.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top,width:_23.window._outerWidth(),height:_23.window._outerHeight()}); -if(_23.proxy){ -_23.proxy.remove(); -} -_23.proxy=$("
                                                                                                                                                                  ").insertAfter(_23.window); -_23.proxy.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top}); -_23.proxy._outerWidth(e.data.width)._outerHeight(e.data.height); -_23.proxy.hide(); -setTimeout(function(){ -if(_23.pmask){ -_23.pmask.show(); -} -if(_23.proxy){ -_23.proxy.show(); -} -},500); -}; -function _25(e){ -$.extend(e.data,_19.call(_22,e.data.left,e.data.top,e.data.width,e.data.height)); -_23.pmask.show(); -_23.proxy.css({display:"block",left:e.data.left,top:e.data.top}); -_23.proxy._outerWidth(e.data.width); -_23.proxy._outerHeight(e.data.height); -}; -function _26(e,_27){ -$.extend(e.data,_19.call(_22,e.data.left,e.data.top,e.data.width+0.1,e.data.height+0.1)); -$(_22).window(_27,e.data); -_23.pmask.remove(); -_23.pmask=null; -_23.proxy.remove(); -_23.proxy=null; -}; -}; -$(function(){ -if(!$._positionFixed){ -$(window).resize(function(){ -$("body>div.window-mask:visible").css({width:"",height:""}); -setTimeout(function(){ -$("body>div.window-mask:visible").css($.fn.window.getMaskSize()); -},50); -}); -} -}); -$.fn.window=function(_28,_29){ -if(typeof _28=="string"){ -var _2a=$.fn.window.methods[_28]; -if(_2a){ -return _2a(this,_29); -}else{ -return this.panel(_28,_29); -} -} -_28=_28||{}; -return this.each(function(){ -var _2b=$.data(this,"window"); -if(_2b){ -$.extend(_2b.options,_28); -}else{ -_2b=$.data(this,"window",{options:$.extend({},$.fn.window.defaults,$.fn.window.parseOptions(this),_28)}); -if(!_2b.options.inline){ -document.body.appendChild(this); -} -} -_11(this); -_21(this); -}); -}; -$.fn.window.methods={options:function(jq){ -var _2c=jq.panel("options"); -var _2d=$.data(jq[0],"window").options; -return $.extend(_2d,{closed:_2c.closed,collapsed:_2c.collapsed,minimized:_2c.minimized,maximized:_2c.maximized}); -},window:function(jq){ -return $.data(jq[0],"window").window; -},move:function(jq,_2e){ -return jq.each(function(){ -_1(this,_2e); -}); -},hcenter:function(jq){ -return jq.each(function(){ -_5(this,true); -}); -},vcenter:function(jq){ -return jq.each(function(){ -_b(this,true); -}); -},center:function(jq){ -return jq.each(function(){ -_5(this); -_b(this); -_1(this); -}); -}}; -$.fn.window.getMaskSize=function(_2f){ -var _30=$(_2f).data("window"); -if(_30&&_30.options.inline){ -return {}; -}else{ -if($._positionFixed){ -return {position:"fixed"}; -}else{ -return {width:$(document).width(),height:$(document).height()}; -} -} -}; -$.fn.window.parseOptions=function(_31){ -return $.extend({},$.fn.panel.parseOptions(_31),$.parser.parseOptions(_31,[{draggable:"boolean",resizable:"boolean",shadow:"boolean",modal:"boolean",inline:"boolean"}])); -}; -$.fn.window.defaults=$.extend({},$.fn.panel.defaults,{zIndex:9000,draggable:true,resizable:true,shadow:true,modal:false,border:true,inline:false,title:"New Window",collapsible:true,minimizable:true,maximizable:true,closable:true,closed:false,constrain:false}); -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/readme.txt b/testapps/ResourceLoaderTest/src/main/resources/asset/readme.txt deleted file mode 100755 index 2088b75c4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -Current Version: 1.5.5.5 -======================== -This software is allowed to use under freeware license or you need to buy commercial license for better support or other purpose. -Please contact us at info@jeasyui.com diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/easyloader.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/easyloader.js deleted file mode 100644 index 38d53844c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/easyloader.js +++ /dev/null @@ -1,439 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * easyloader - EasyUI for jQuery - * - */ -(function(){ - var modules = { - draggable:{ - js:'jquery.draggable.js' - }, - droppable:{ - js:'jquery.droppable.js' - }, - resizable:{ - js:'jquery.resizable.js' - }, - linkbutton:{ - js:'jquery.linkbutton.js', - css:'linkbutton.css' - }, - progressbar:{ - js:'jquery.progressbar.js', - css:'progressbar.css' - }, - tooltip:{ - js:'jquery.tooltip.js', - css:'tooltip.css' - }, - pagination:{ - js:'jquery.pagination.js', - css:'pagination.css', - dependencies:['linkbutton'] - }, - datagrid:{ - js:'jquery.datagrid.js', - css:'datagrid.css', - dependencies:['panel','resizable','linkbutton','pagination'] - }, - treegrid:{ - js:'jquery.treegrid.js', - css:'tree.css', - dependencies:['datagrid'] - }, - propertygrid:{ - js:'jquery.propertygrid.js', - css:'propertygrid.css', - dependencies:['datagrid'] - }, - datalist:{ - js:'jquery.datalist.js', - css:'datalist.css', - dependencies:['datagrid'] - }, - panel: { - js:'jquery.panel.js', - css:'panel.css' - }, - window:{ - js:'jquery.window.js', - css:'window.css', - dependencies:['resizable','draggable','panel'] - }, - dialog:{ - js:'jquery.dialog.js', - css:'dialog.css', - dependencies:['linkbutton','window'] - }, - messager:{ - js:'jquery.messager.js', - css:'messager.css', - dependencies:['linkbutton','dialog','progressbar'] - }, - layout:{ - js:'jquery.layout.js', - css:'layout.css', - dependencies:['resizable','panel'] - }, - form:{ - js:'jquery.form.js' - }, - menu:{ - js:'jquery.menu.js', - css:'menu.css' - }, - tabs:{ - js:'jquery.tabs.js', - css:'tabs.css', - dependencies:['panel','linkbutton'] - }, - menubutton:{ - js:'jquery.menubutton.js', - css:'menubutton.css', - dependencies:['linkbutton','menu'] - }, - splitbutton:{ - js:'jquery.splitbutton.js', - css:'splitbutton.css', - dependencies:['menubutton'] - }, - switchbutton:{ - js:'jquery.switchbutton.js', - css:'switchbutton.css' - }, - accordion:{ - js:'jquery.accordion.js', - css:'accordion.css', - dependencies:['panel'] - }, - calendar:{ - js:'jquery.calendar.js', - css:'calendar.css' - }, - textbox:{ - js:'jquery.textbox.js', - css:'textbox.css', - dependencies:['validatebox','linkbutton'] - }, - passwordbox:{ - js:'jquery.passwordbox.js', - css:'passwordbox.css', - dependencies:['textbox'] - }, - filebox:{ - js:'jquery.filebox.js', - css:'filebox.css', - dependencies:['textbox'] - }, - combo:{ - js:'jquery.combo.js', - css:'combo.css', - dependencies:['panel','textbox'] - }, - combobox:{ - js:'jquery.combobox.js', - css:'combobox.css', - dependencies:['combo'] - }, - combotree:{ - js:'jquery.combotree.js', - dependencies:['combo','tree'] - }, - combogrid:{ - js:'jquery.combogrid.js', - dependencies:['combo','datagrid'] - }, - combotreegrid:{ - js:'jquery.combotreegrid.js', - dependencies:['combo','treegrid'] - }, - tagbox:{ - js:'jquery.tagbox.js', - dependencies:['combobox'] - }, - validatebox:{ - js:'jquery.validatebox.js', - css:'validatebox.css', - dependencies:['tooltip'] - }, - numberbox:{ - js:'jquery.numberbox.js', - dependencies:['textbox'] - }, - searchbox:{ - js:'jquery.searchbox.js', - css:'searchbox.css', - dependencies:['menubutton','textbox'] - }, - spinner:{ - js:'jquery.spinner.js', - css:'spinner.css', - dependencies:['textbox'] - }, - numberspinner:{ - js:'jquery.numberspinner.js', - dependencies:['spinner','numberbox'] - }, - timespinner:{ - js:'jquery.timespinner.js', - dependencies:['spinner'] - }, - tree:{ - js:'jquery.tree.js', - css:'tree.css', - dependencies:['draggable','droppable'] - }, - datebox:{ - js:'jquery.datebox.js', - css:'datebox.css', - dependencies:['calendar','combo'] - }, - datetimebox:{ - js:'jquery.datetimebox.js', - dependencies:['datebox','timespinner'] - }, - slider:{ - js:'jquery.slider.js', - dependencies:['draggable'] - }, - parser:{ - js:'jquery.parser.js' - }, - mobile:{ - js:'jquery.mobile.js' - } - }; - - var locales = { - 'af':'easyui-lang-af.js', - 'ar':'easyui-lang-ar.js', - 'bg':'easyui-lang-bg.js', - 'ca':'easyui-lang-ca.js', - 'cs':'easyui-lang-cs.js', - 'cz':'easyui-lang-cz.js', - 'da':'easyui-lang-da.js', - 'de':'easyui-lang-de.js', - 'el':'easyui-lang-el.js', - 'en':'easyui-lang-en.js', - 'es':'easyui-lang-es.js', - 'fr':'easyui-lang-fr.js', - 'it':'easyui-lang-it.js', - 'jp':'easyui-lang-jp.js', - 'nl':'easyui-lang-nl.js', - 'pl':'easyui-lang-pl.js', - 'pt_BR':'easyui-lang-pt_BR.js', - 'ru':'easyui-lang-ru.js', - 'sv_SE':'easyui-lang-sv_SE.js', - 'tr':'easyui-lang-tr.js', - 'zh_CN':'easyui-lang-zh_CN.js', - 'zh_TW':'easyui-lang-zh_TW.js' - }; - - var queues = {}; - - function loadJs(url, callback){ - var done = false; - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.language = 'javascript'; - script.src = url; - script.onload = script.onreadystatechange = function(){ - if (!done && (!script.readyState || script.readyState == 'loaded' || script.readyState == 'complete')){ - done = true; - script.onload = script.onreadystatechange = null; - if (callback){ - callback.call(script); - } - } - } - document.getElementsByTagName("head")[0].appendChild(script); - } - - function runJs(url, callback){ - loadJs(url, function(){ - document.getElementsByTagName("head")[0].removeChild(this); - if (callback){ - callback(); - } - }); - } - - function loadCss(url, callback){ - var link = document.createElement('link'); - link.rel = 'stylesheet'; - link.type = 'text/css'; - link.media = 'screen'; - link.href = url; - document.getElementsByTagName('head')[0].appendChild(link); - if (callback){ - callback.call(link); - } - } - - function loadSingle(name, callback){ - queues[name] = 'loading'; - - var module = modules[name]; - var jsStatus = 'loading'; - var cssStatus = (easyloader.css && module['css']) ? 'loading' : 'loaded'; - - if (easyloader.css && module['css']){ - if (/^http/i.test(module['css'])){ - var url = module['css']; - } else { - var url = easyloader.base + 'themes/' + easyloader.theme + '/' + module['css']; - } - loadCss(url, function(){ - cssStatus = 'loaded'; - if (jsStatus == 'loaded' && cssStatus == 'loaded'){ - finish(); - } - }); - } - - if (/^http/i.test(module['js'])){ - var url = module['js']; - } else { - var url = easyloader.base + 'plugins/' + module['js']; - } - loadJs(url, function(){ - jsStatus = 'loaded'; - if (jsStatus == 'loaded' && cssStatus == 'loaded'){ - finish(); - } - }); - - function finish(){ - queues[name] = 'loaded'; - easyloader.onProgress(name); - if (callback){ - callback(); - } - } - } - - function loadModule(name, callback){ - var mm = []; - var doLoad = false; - - if (typeof name == 'string'){ - add(name); - } else { - for(var i=0; i.panel>.accordion-header'); - // if (headers.length){ - // headerHeight = $(headers[0]).css('height', '')._outerHeight(); - // } - // if (!isNaN(parseInt(opts.height))){ - // bodyHeight = cc.height() - headerHeight*headers.length; - // } - - // _resize(true, bodyHeight - _resize(false) + 1); - - // function _resize(collapsible, height){ - // var totalHeight = 0; - // for(var i=0; i.panel>.accordion-header'); - if (headers.length){ - if (isHorizontal){ - $(panels[0]).panel('resize', {width:cc.width(),height:cc.height()}); - headerHeight = $(headers[0])._outerWidth(); - } else { - headerHeight = $(headers[0]).css('height', '')._outerHeight(); - } - } - if (!isNaN(parseInt(opts.height))){ - if (isHorizontal){ - bodyHeight = cc.width() - headerHeight*headers.length; - } else { - bodyHeight = cc.height() - headerHeight*headers.length; - } - } - - // _resize(true, bodyHeight - _resize(false) + 1); - _resize(true, bodyHeight - _resize(false)); - - function _resize(collapsible, height){ - var totalHeight = 0; - for(var i=0; i= panels.length){ - return null; - } else { - return panels[which]; - } - } - return findBy(container, 'title', which); - } - - function setProperties(container){ - var opts = $.data(container, 'accordion').options; - var cc = $(container); - if (opts.border){ - cc.removeClass('accordion-noborder'); - } else { - cc.addClass('accordion-noborder'); - } - } - - function init(container){ - var state = $.data(container, 'accordion'); - var cc = $(container); - cc.addClass('accordion'); - - state.panels = []; - cc.children('div').each(function(){ - var opts = $.extend({}, $.parser.parseOptions(this), { - selected: ($(this).attr('selected') ? true : undefined) - }); - var pp = $(this); - state.panels.push(pp); - createPanel(container, pp, opts); - }); - - cc.bind('_resize', function(e,force){ - if ($(this).hasClass('easyui-fluid') || force){ - setSize(container); - } - return false; - }); - } - - function createPanel(container, pp, options){ - var opts = $.data(container, 'accordion').options; - pp.panel($.extend({}, { - collapsible: true, - minimizable: false, - maximizable: false, - closable: false, - doSize: false, - collapsed: true, - headerCls: 'accordion-header', - bodyCls: 'accordion-body', - halign: opts.halign - }, options, { - onBeforeExpand: function(){ - if (options.onBeforeExpand){ - if (options.onBeforeExpand.call(this) == false){return false} - } - if (!opts.multiple){ - // get all selected panel - var all = $.grep(getSelections(container), function(p){ - return p.panel('options').collapsible; - }); - for(var i=0; i.panel-last>.accordion-header').removeClass('accordion-header-border'); - if (options.onExpand){options.onExpand.call(this)} - opts.onSelect.call(container, $(this).panel('options').title, getPanelIndex(container, this)); - }, - onBeforeCollapse: function(){ - if (options.onBeforeCollapse){ - if (options.onBeforeCollapse.call(this) == false){return false} - } - $(container).find('>.panel-last>.accordion-header').addClass('accordion-header-border'); - var header = $(this).panel('header'); - header.removeClass('accordion-header-selected'); - header.find('.accordion-collapse').addClass('accordion-expand'); - }, - onCollapse: function(){ - if (isNaN(parseInt(opts.height))){ - $(container).find('>.panel-last>.accordion-header').removeClass('accordion-header-border'); - } - if (options.onCollapse){options.onCollapse.call(this)} - opts.onUnselect.call(container, $(this).panel('options').title, getPanelIndex(container, this)); - } - })); - - var header = pp.panel('header'); - var tool = header.children('div.panel-tool'); - tool.children('a.panel-tool-collapse').hide(); // hide the old collapse button - var t = $('').addClass('accordion-collapse accordion-expand').appendTo(tool); - t.bind('click', function(){ - togglePanel(pp); - return false; - }); - pp.panel('options').collapsible ? t.show() : t.hide(); - if (opts.halign=='left' || opts.halign=='right'){ - t.hide(); - } - - header.click(function(){ - togglePanel(pp); - return false; - }); - - function togglePanel(p){ - var popts = p.panel('options'); - if (popts.collapsible){ - var index = getPanelIndex(container, p); - if (popts.collapsed){ - select(container, index); - } else { - unselect(container, index); - } - } - } - } - - /** - * select and set the specified panel active - */ - function select(container, which){ - var p = getPanel(container, which); - if (!p){return} - stopAnimate(container); - var opts = $.data(container, 'accordion').options; - p.panel('expand', opts.animate); - } - - function unselect(container, which){ - var p = getPanel(container, which); - if (!p){return} - stopAnimate(container); - var opts = $.data(container, 'accordion').options; - p.panel('collapse', opts.animate); - } - - function doFirstSelect(container){ - var opts = $.data(container, 'accordion').options; - $(container).find('>.panel-last>.accordion-header').addClass('accordion-header-border'); - - var p = findBy(container, 'selected', true); - if (p){ - _select(getPanelIndex(container, p)); - } else { - _select(opts.selected); - } - - function _select(index){ - var animate = opts.animate; - opts.animate = false; - select(container, index); - opts.animate = animate; - } - } - - /** - * stop the animation of all panels - */ - function stopAnimate(container){ - var panels = $.data(container, 'accordion').panels; - for(var i=0; i').appendTo(container); - panels.push(pp); - createPanel(container, pp, options); - setSize(container); - - opts.onAdd.call(container, options.title, panels.length-1); - - if (options.selected){ - select(container, panels.length-1); - } - } - - function remove(container, which){ - var state = $.data(container, 'accordion'); - var opts = state.options; - var panels = state.panels; - - stopAnimate(container); - - var panel = getPanel(container, which); - var title = panel.panel('options').title; - var index = getPanelIndex(container, panel); - - if (!panel){return} - if (opts.onBeforeRemove.call(container, title, index) == false){return} - - panels.splice(index, 1); - panel.panel('destroy'); - if (panels.length){ - setSize(container); - var curr = getSelected(container); - if (!curr){ - select(container, 0); - } - } - - opts.onRemove.call(container, title, index); - } - - $.fn.accordion = function(options, param){ - if (typeof options == 'string'){ - return $.fn.accordion.methods[options](this, param); - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'accordion'); - if (state){ - $.extend(state.options, options); - } else { - $.data(this, 'accordion', { - options: $.extend({}, $.fn.accordion.defaults, $.fn.accordion.parseOptions(this), options), - accordion: $(this).addClass('accordion'), - panels: [] - }); - init(this); - } - - setProperties(this); - setSize(this); - doFirstSelect(this); - }); - }; - - $.fn.accordion.methods = { - options: function(jq){ - return $.data(jq[0], 'accordion').options; - }, - panels: function(jq){ - return $.data(jq[0], 'accordion').panels; - }, - resize: function(jq, param){ - return jq.each(function(){ - setSize(this, param); - }); - }, - getSelections: function(jq){ - return getSelections(jq[0]); - }, - getSelected: function(jq){ - return getSelected(jq[0]); - }, - getPanel: function(jq, which){ - return getPanel(jq[0], which); - }, - getPanelIndex: function(jq, panel){ - return getPanelIndex(jq[0], panel); - }, - select: function(jq, which){ - return jq.each(function(){ - select(this, which); - }); - }, - unselect: function(jq, which){ - return jq.each(function(){ - unselect(this, which); - }); - }, - add: function(jq, options){ - return jq.each(function(){ - add(this, options); - }); - }, - remove: function(jq, which){ - return jq.each(function(){ - remove(this, which); - }); - } - }; - - $.fn.accordion.parseOptions = function(target){ - var t = $(target); - return $.extend({}, $.parser.parseOptions(target, [ - 'width','height','halign', - {fit:'boolean',border:'boolean',animate:'boolean',multiple:'boolean',selected:'number'} - ])); - }; - - $.fn.accordion.defaults = { - width: 'auto', - height: 'auto', - fit: false, - border: true, - animate: true, - multiple: false, - selected: 0, - halign: 'top', // the header alignment: 'top','left','right' - - onSelect: function(title, index){}, - onUnselect: function(title, index){}, - onAdd: function(title, index){}, - onBeforeRemove: function(title, index){}, - onRemove: function(title, index){} - }; -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.calendar.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.calendar.js deleted file mode 100644 index ab40eaa49..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.calendar.js +++ /dev/null @@ -1,455 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * calendar - EasyUI for jQuery - * - */ -(function($){ - - function setSize(target, param){ - var opts = $.data(target, 'calendar').options; - var t = $(target); - if (param){ - $.extend(opts, { - width: param.width, - height: param.height - }); - } - t._size(opts, t.parent()); - t.find('.calendar-body')._outerHeight(t.height() - t.find('.calendar-header')._outerHeight()); - if (t.find('.calendar-menu').is(':visible')){ - showSelectMenus(target); - } - } - - function init(target){ - $(target).addClass('calendar').html( - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '' + - '' + - '' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' - ); - - - $(target).bind('_resize', function(e,force){ - if ($(this).hasClass('easyui-fluid') || force){ - setSize(target); - } - return false; - }); - } - - function bindEvents(target){ - var opts = $.data(target, 'calendar').options; - var menu = $(target).find('.calendar-menu'); - menu.find('.calendar-menu-year').unbind('.calendar').bind('keypress.calendar', function(e){ - if (e.keyCode == 13){ - setDate(true); - } - }); - $(target).unbind('.calendar').bind('mouseover.calendar', function(e){ - var t = toTarget(e.target); - if (t.hasClass('calendar-nav') || t.hasClass('calendar-text') || (t.hasClass('calendar-day') && !t.hasClass('calendar-disabled'))){ - t.addClass('calendar-nav-hover'); - } - }).bind('mouseout.calendar', function(e){ - var t = toTarget(e.target); - if (t.hasClass('calendar-nav') || t.hasClass('calendar-text') || (t.hasClass('calendar-day') && !t.hasClass('calendar-disabled'))){ - t.removeClass('calendar-nav-hover'); - } - }).bind('click.calendar', function(e){ - var t = toTarget(e.target); - if (t.hasClass('calendar-menu-next') || t.hasClass('calendar-nextyear')){ - showYear(1); - } else if (t.hasClass('calendar-menu-prev') || t.hasClass('calendar-prevyear')){ - showYear(-1); - } else if (t.hasClass('calendar-menu-month')){ - menu.find('.calendar-selected').removeClass('calendar-selected'); - t.addClass('calendar-selected'); - setDate(true); - } else if (t.hasClass('calendar-prevmonth')){ - showMonth(-1); - } else if (t.hasClass('calendar-nextmonth')){ - showMonth(1); - } else if (t.hasClass('calendar-text')){ - if (menu.is(':visible')){ - menu.hide(); - } else { - showSelectMenus(target); - } - } else if (t.hasClass('calendar-day')){ - if (t.hasClass('calendar-disabled')){return} - var oldValue = opts.current; - t.closest('div.calendar-body').find('.calendar-selected').removeClass('calendar-selected'); - t.addClass('calendar-selected'); - var parts = t.attr('abbr').split(','); - var y = parseInt(parts[0]); - var m = parseInt(parts[1]); - var d = parseInt(parts[2]); - opts.current = new Date(y, m-1, d); - opts.onSelect.call(target, opts.current); - if (!oldValue || oldValue.getTime() != opts.current.getTime()){ - opts.onChange.call(target, opts.current, oldValue); - } - if (opts.year != y || opts.month != m){ - opts.year = y; - opts.month = m; - show(target); - } - } - }); - function toTarget(t){ - var day = $(t).closest('.calendar-day'); - if (day.length){ - return day; - } else { - return $(t); - } - } - function setDate(hideMenu){ - var menu = $(target).find('.calendar-menu'); - var year = menu.find('.calendar-menu-year').val(); - var month = menu.find('.calendar-selected').attr('abbr'); - if (!isNaN(year)){ - opts.year = parseInt(year); - opts.month = parseInt(month); - show(target); - } - if (hideMenu){menu.hide()} - } - function showYear(delta){ - opts.year += delta; - show(target); - menu.find('.calendar-menu-year').val(opts.year); - } - function showMonth(delta){ - opts.month += delta; - if (opts.month > 12){ - opts.year++; - opts.month = 1; - } else if (opts.month < 1){ - opts.year--; - opts.month = 12; - } - show(target); - - menu.find('td.calendar-selected').removeClass('calendar-selected'); - menu.find('td:eq(' + (opts.month-1) + ')').addClass('calendar-selected'); - } - } - - /** - * show the select menu that can change year or month, if the menu is not be created then create it. - */ - function showSelectMenus(target){ - var opts = $.data(target, 'calendar').options; - $(target).find('.calendar-menu').show(); - - if ($(target).find('.calendar-menu-month-inner').is(':empty')){ - $(target).find('.calendar-menu-month-inner').empty(); - var t = $('
                                                                                                                                                                  ').appendTo($(target).find('.calendar-menu-month-inner')); - var idx = 0; - for(var i=0; i<3; i++){ - var tr = $('').appendTo(t); - for(var j=0; j<4; j++){ - $('').html(opts.months[idx++]).attr('abbr',idx).appendTo(tr); - } - } - } - - var body = $(target).find('.calendar-body'); - var sele = $(target).find('.calendar-menu'); - var seleYear = sele.find('.calendar-menu-year-inner'); - var seleMonth = sele.find('.calendar-menu-month-inner'); - - seleYear.find('input').val(opts.year).focus(); - seleMonth.find('td.calendar-selected').removeClass('calendar-selected'); - seleMonth.find('td:eq('+(opts.month-1)+')').addClass('calendar-selected'); - - sele._outerWidth(body._outerWidth()); - sele._outerHeight(body._outerHeight()); - seleMonth._outerHeight(sele.height() - seleYear._outerHeight()); - } - - /** - * get weeks data. - */ - function getWeeks(target, year, month){ - var opts = $.data(target, 'calendar').options; - var dates = []; - var lastDay = new Date(year, month, 0).getDate(); - for(var i=1; i<=lastDay; i++) dates.push([year,month,i]); - - // group date by week - var weeks = [], week = []; - var memoDay = -1; - while(dates.length > 0){ - var date = dates.shift(); - week.push(date); - var day = new Date(date[0],date[1]-1,date[2]).getDay(); - if (memoDay == day){ - day = 0; - } else if (day == (opts.firstDay==0 ? 7 : opts.firstDay) - 1){ - weeks.push(week); - week = []; - } - memoDay = day; - } - if (week.length){ - weeks.push(week); - } - - var firstWeek = weeks[0]; - if (firstWeek.length < 7){ - while(firstWeek.length < 7){ - var firstDate = firstWeek[0]; - var date = new Date(firstDate[0],firstDate[1]-1,firstDate[2]-1) - firstWeek.unshift([date.getFullYear(), date.getMonth()+1, date.getDate()]); - } - } else { - var firstDate = firstWeek[0]; - var week = []; - for(var i=1; i<=7; i++){ - var date = new Date(firstDate[0], firstDate[1]-1, firstDate[2]-i); - week.unshift([date.getFullYear(), date.getMonth()+1, date.getDate()]); - } - weeks.unshift(week); - } - - var lastWeek = weeks[weeks.length-1]; - while(lastWeek.length < 7){ - var lastDate = lastWeek[lastWeek.length-1]; - var date = new Date(lastDate[0], lastDate[1]-1, lastDate[2]+1); - lastWeek.push([date.getFullYear(), date.getMonth()+1, date.getDate()]); - } - if (weeks.length < 6){ - var lastDate = lastWeek[lastWeek.length-1]; - var week = []; - for(var i=1; i<=7; i++){ - var date = new Date(lastDate[0], lastDate[1]-1, lastDate[2]+i); - week.push([date.getFullYear(), date.getMonth()+1, date.getDate()]); - } - weeks.push(week); - } - - return weeks; - } - - /** - * show the calendar day. - */ - function show(target){ - var opts = $.data(target, 'calendar').options; - if (opts.current && !opts.validator.call(target, opts.current)){ - opts.current = null; - } - - var now = new Date(); - var todayInfo = now.getFullYear()+','+(now.getMonth()+1)+','+now.getDate(); - var currentInfo = opts.current ? (opts.current.getFullYear()+','+(opts.current.getMonth()+1)+','+opts.current.getDate()) : ''; - // calulate the saturday and sunday index - var saIndex = 6 - opts.firstDay; - var suIndex = saIndex + 1; - if (saIndex >= 7) saIndex -= 7; - if (suIndex >= 7) suIndex -= 7; - - $(target).find('.calendar-title span').html(opts.months[opts.month-1] + ' ' + opts.year); - - var body = $(target).find('div.calendar-body'); - body.children('table').remove(); - - var data = ['']; - data.push(''); - if (opts.showWeek){ - data.push(''); - } - for(var i=opts.firstDay; i'+opts.weeks[i]+''); - } - for(var i=0; i'+opts.weeks[i]+''); - } - data.push(''); - - data.push(''); - var weeks = getWeeks(target, opts.year, opts.month); - for(var i=0; i'); - if (opts.showWeek){ - var weekNumber = opts.getWeekNumber(new Date(week[0][0], parseInt(week[0][1])-1, week[0][2])); - data.push(''); - } - for(var j=0; j' + d + ''); - } - data.push(''); - } - data.push(''); - data.push('
                                                                                                                                                                  '+opts.weekNumberHeader+'
                                                                                                                                                                  '+weekNumber+'
                                                                                                                                                                  '); - - body.append(data.join('')); - body.children('table.calendar-dtable').prependTo(body); - - opts.onNavigate.call(target, opts.year, opts.month); - } - - $.fn.calendar = function(options, param){ - if (typeof options == 'string'){ - return $.fn.calendar.methods[options](this, param); - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'calendar'); - if (state){ - $.extend(state.options, options); - } else { - state = $.data(this, 'calendar', { - options:$.extend({}, $.fn.calendar.defaults, $.fn.calendar.parseOptions(this), options) - }); - init(this); - } - if (state.options.border == false){ - $(this).addClass('calendar-noborder'); - } - setSize(this); - bindEvents(this); - show(this); - $(this).find('div.calendar-menu').hide(); // hide the calendar menu - }); - }; - - $.fn.calendar.methods = { - options: function(jq){ - return $.data(jq[0], 'calendar').options; - }, - resize: function(jq, param){ - return jq.each(function(){ - setSize(this, param); - }); - }, - moveTo: function(jq, date){ - return jq.each(function(){ - if (!date){ - var now = new Date(); - $(this).calendar({ - year: now.getFullYear(), - month: now.getMonth()+1, - current: date - }); - return; - } - var opts = $(this).calendar('options'); - if (opts.validator.call(this, date)){ - var oldValue = opts.current; - $(this).calendar({ - year: date.getFullYear(), - month: date.getMonth()+1, - current: date - }); - if (!oldValue || oldValue.getTime() != date.getTime()){ - opts.onChange.call(this, opts.current, oldValue); - } - } - }); - } - }; - - $.fn.calendar.parseOptions = function(target){ - var t = $(target); - return $.extend({}, $.parser.parseOptions(target, [ - 'weekNumberHeader',{firstDay:'number',fit:'boolean',border:'boolean',showWeek:'boolean'} - ])); - }; - - $.fn.calendar.defaults = { - width:180, - height:180, - fit:false, - border:true, - showWeek:false, - firstDay:0, - weeks:['S','M','T','W','T','F','S'], - months:['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - year:new Date().getFullYear(), - month:new Date().getMonth()+1, - current:(function(){ - var d = new Date(); - return new Date(d.getFullYear(), d.getMonth(), d.getDate()); - })(), - weekNumberHeader:'', - getWeekNumber: function(date){ - var checkDate = new Date(date.getTime()); - checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); - var time = checkDate.getTime(); - checkDate.setMonth(0); - checkDate.setDate(1); - return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; - }, - - formatter:function(date){return date.getDate()}, - styler:function(date){return ''}, - validator:function(date){return true}, - - onSelect: function(date){}, - onChange: function(newDate, oldDate){}, - onNavigate: function(year, month){} - }; -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.combobox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.combobox.js deleted file mode 100644 index fda617698..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.combobox.js +++ /dev/null @@ -1,742 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * combobox - EasyUI for jQuery - * - * Dependencies: - * combo - * - */ -(function($){ - function getRowIndex(target, value){ - var state = $.data(target, 'combobox'); - return $.easyui.indexOfArray(state.data, state.options.valueField, value); - } - - /** - * scroll panel to display the specified item - */ - function scrollTo(target, value){ - var opts = $.data(target, 'combobox').options; - var panel = $(target).combo('panel'); - var item = opts.finder.getEl(target, value); - if (item.length){ - if (item.position().top <= 0){ - var h = panel.scrollTop() + item.position().top; - panel.scrollTop(h); - } else if (item.position().top + item.outerHeight() > panel.height()){ - var h = panel.scrollTop() + item.position().top + item.outerHeight() - panel.height(); - panel.scrollTop(h); - } - } - panel.triggerHandler('scroll'); // trigger the group sticking - } - - function nav(target, dir){ - var opts = $.data(target, 'combobox').options; - var panel = $(target).combobox('panel'); - var item = panel.children('div.combobox-item-hover'); - if (!item.length){ - item = panel.children('div.combobox-item-selected'); - } - item.removeClass('combobox-item-hover'); - var firstSelector = 'div.combobox-item:visible:not(.combobox-item-disabled):first'; - var lastSelector = 'div.combobox-item:visible:not(.combobox-item-disabled):last'; - if (!item.length){ - item = panel.children(dir=='next' ? firstSelector : lastSelector); - } else { - if (dir == 'next'){ - item = item.nextAll(firstSelector); - if (!item.length){ - item = panel.children(firstSelector); - } - } else { - item = item.prevAll(firstSelector); - if (!item.length){ - item = panel.children(lastSelector); - } - } - } - if (item.length){ - item.addClass('combobox-item-hover'); - var row = opts.finder.getRow(target, item); - if (row){ - $(target).combobox('scrollTo', row[opts.valueField]); - if (opts.selectOnNavigation){ - select(target, row[opts.valueField]); - } - } - } - } - - /** - * select the specified value - */ - function select(target, value, remainText){ - var opts = $.data(target, 'combobox').options; - var values = $(target).combo('getValues'); - if ($.inArray(value+'', values) == -1){ - if (opts.multiple){ - values.push(value); - } else { - values = [value]; - } - setValues(target, values, remainText); - } - } - - /** - * unselect the specified value - */ - function unselect(target, value){ - var opts = $.data(target, 'combobox').options; - var values = $(target).combo('getValues'); - var index = $.inArray(value+'', values); - if (index >= 0){ - values.splice(index, 1); - setValues(target, values); - } - } - - /** - * set values - */ - function setValues(target, values, remainText){ - var opts = $.data(target, 'combobox').options; - var panel = $(target).combo('panel'); - - if (!$.isArray(values)){ - values = values.split(opts.separator); - } - if (!opts.multiple){ - values = values.length ? [values[0]] : ['']; - } - - // unselect the old rows - var oldValues = $(target).combo('getValues'); - if (panel.is(':visible')){ - panel.find('.combobox-item-selected').each(function(){ - var row = opts.finder.getRow(target, $(this)); - if (row){ - if ($.easyui.indexOfArray(oldValues, row[opts.valueField]) == -1){ - $(this).removeClass('combobox-item-selected'); - } - } - }); - } - $.map(oldValues, function(v){ - if ($.easyui.indexOfArray(values, v) == -1){ - var el = opts.finder.getEl(target, v); - if (el.hasClass('combobox-item-selected')){ - el.removeClass('combobox-item-selected'); - opts.onUnselect.call(target, opts.finder.getRow(target, v)); - } - } - }); - - var theRow = null; - var vv = [], ss = []; - for(var i=0; i= 0){ - vv.push(v); - } - }); - t.combobox('setValues', vv); - if (!opts.multiple){ - t.combobox('hidePanel'); - } - } - - /** - * create the component - */ - function create(target){ - var state = $.data(target, 'combobox'); - var opts = state.options; - - $(target).addClass('combobox-f'); - $(target).combo($.extend({}, opts, { - onShowPanel: function(){ - $(this).combo('panel').find('div.combobox-item:hidden,div.combobox-group:hidden').show(); - setValues(this, $(this).combobox('getValues'), true); - $(this).combobox('scrollTo', $(this).combobox('getValue')); - opts.onShowPanel.call(this); - } - })); - - // var p = $(target).combo('panel'); - // p.unbind('.combobox'); - // for(var event in opts.panelEvents){ - // p.bind(event+'.combobox', {target:target}, opts.panelEvents[event]); - // } - } - - function mouseoverHandler(e){ - $(this).children('div.combobox-item-hover').removeClass('combobox-item-hover'); - var item = $(e.target).closest('div.combobox-item'); - if (!item.hasClass('combobox-item-disabled')){ - item.addClass('combobox-item-hover'); - } - e.stopPropagation(); - } - function mouseoutHandler(e){ - $(e.target).closest('div.combobox-item').removeClass('combobox-item-hover'); - e.stopPropagation(); - } - function clickHandler(e){ - var target = $(this).panel('options').comboTarget; - if (!target){return;} - var opts = $(target).combobox('options'); - var item = $(e.target).closest('div.combobox-item'); - if (!item.length || item.hasClass('combobox-item-disabled')){return} - var row = opts.finder.getRow(target, item); - if (!row){return;} - if (opts.blurTimer){ - clearTimeout(opts.blurTimer); - opts.blurTimer = null; - } - opts.onClick.call(target, row); - var value = row[opts.valueField]; - if (opts.multiple){ - if (item.hasClass('combobox-item-selected')){ - unselect(target, value); - } else { - select(target, value); - } - } else { - $(target).combobox('setValue', value).combobox('hidePanel'); - } - e.stopPropagation(); - } - function scrollHandler(e){ - var target = $(this).panel('options').comboTarget; - if (!target){return;} - var opts = $(target).combobox('options'); - if (opts.groupPosition == 'sticky'){ - var stick = $(this).children('.combobox-stick'); - if (!stick.length){ - stick = $('
                                                                                                                                                                  ').appendTo(this); - } - stick.hide(); - var state = $(target).data('combobox'); - $(this).children('.combobox-group:visible').each(function(){ - var g = $(this); - var groupData = opts.finder.getGroup(target, g); - var rowData = state.data[groupData.startIndex + groupData.count - 1]; - var last = opts.finder.getEl(target, rowData[opts.valueField]); - if (g.position().top < 0 && last.position().top > 0){ - stick.show().html(g.html()); - return false; - } - }); - } - } - - $.fn.combobox = function(options, param){ - if (typeof options == 'string'){ - var method = $.fn.combobox.methods[options]; - if (method){ - return method(this, param); - } else { - return this.combo(options, param); - } - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'combobox'); - if (state){ - $.extend(state.options, options); - } else { - state = $.data(this, 'combobox', { - options: $.extend({}, $.fn.combobox.defaults, $.fn.combobox.parseOptions(this), options), - data: [] - }); - } - create(this); - if (state.options.data){ - loadData(this, state.options.data); - } else { - var data = $.fn.combobox.parseData(this); - if (data.length){ - loadData(this, data); - } - } - request(this); - }); - }; - - - $.fn.combobox.methods = { - options: function(jq){ - var copts = jq.combo('options'); - return $.extend($.data(jq[0], 'combobox').options, { - width: copts.width, - height: copts.height, - originalValue: copts.originalValue, - disabled: copts.disabled, - readonly: copts.readonly - }); - }, - cloneFrom: function(jq, from){ - return jq.each(function(){ - $(this).combo('cloneFrom', from); - $.data(this, 'combobox', $(from).data('combobox')); - $(this).addClass('combobox-f').attr('comboboxName', $(this).attr('textboxName')); - }); - }, - getData: function(jq){ - return $.data(jq[0], 'combobox').data; - }, - setValues: function(jq, values){ - return jq.each(function(){ - var opts = $(this).combobox('options'); - if ($.isArray(values)){ - values = $.map(values, function(value){ - if (value && typeof value == 'object'){ - $.easyui.addArrayItem(opts.mappingRows, opts.valueField, value); - return value[opts.valueField]; - } else { - return value; - } - }); - } - setValues(this, values); - }); - }, - setValue: function(jq, value){ - return jq.each(function(){ - $(this).combobox('setValues', $.isArray(value)?value:[value]); - }); - }, - clear: function(jq){ - return jq.each(function(){ - setValues(this, []); - }); - }, - reset: function(jq){ - return jq.each(function(){ - var opts = $(this).combobox('options'); - if (opts.multiple){ - $(this).combobox('setValues', opts.originalValue); - } else { - $(this).combobox('setValue', opts.originalValue); - } - }); - }, - loadData: function(jq, data){ - return jq.each(function(){ - loadData(this, data); - }); - }, - reload: function(jq, url){ - return jq.each(function(){ - if (typeof url == 'string'){ - request(this, url); - } else { - if (url){ - var opts = $(this).combobox('options'); - opts.queryParams = url; - } - request(this); - } - }); - }, - select: function(jq, value){ - return jq.each(function(){ - select(this, value); - }); - }, - unselect: function(jq, value){ - return jq.each(function(){ - unselect(this, value); - }); - }, - scrollTo: function(jq, value){ - return jq.each(function(){ - scrollTo(this, value); - }); - } - }; - - $.fn.combobox.parseOptions = function(target){ - var t = $(target); - return $.extend({}, $.fn.combo.parseOptions(target), $.parser.parseOptions(target,[ - 'valueField','textField','groupField','groupPosition','mode','method','url', - {showItemIcon:'boolean',limitToList:'boolean'} - ])); - }; - - $.fn.combobox.parseData = function(target){ - var data = []; - var opts = $(target).combobox('options'); - $(target).children().each(function(){ - if (this.tagName.toLowerCase() == 'optgroup'){ - var group = $(this).attr('label'); - $(this).children().each(function(){ - _parseItem(this, group); - }); - } else { - _parseItem(this); - } - }); - return data; - - function _parseItem(el, group){ - var t = $(el); - var row = {}; - row[opts.valueField] = t.attr('value')!=undefined ? t.attr('value') : t.text(); - row[opts.textField] = t.text(); - row['iconCls'] = $.parser.parseOptions(el, ['iconCls']).iconCls; - row['selected'] = t.is(':selected'); - row['disabled'] = t.is(':disabled'); - if (group){ - opts.groupField = opts.groupField || 'group'; - row[opts.groupField] = group; - } - data.push(row); - } - }; - - var COMBOBOX_SERNO = 0; - var defaultView = { - render: function(target, container, data){ - var state = $.data(target, 'combobox'); - var opts = state.options; - - COMBOBOX_SERNO++; - state.itemIdPrefix = '_easyui_combobox_i' + COMBOBOX_SERNO; - state.groupIdPrefix = '_easyui_combobox_g' + COMBOBOX_SERNO; - state.groups = []; - - var dd = []; - var group = undefined; - for(var i=0; i'); - dd.push(opts.groupFormatter ? opts.groupFormatter.call(target, g) : g); - dd.push(''); - } else { - state.groups[state.groups.length-1].count++; - } - } else { - group = undefined; - } - - var cls = 'combobox-item' + (row.disabled ? ' combobox-item-disabled' : '') + (g ? ' combobox-gitem' : ''); - dd.push('
                                                                                                                                                                  '); - if (opts.showItemIcon && row.iconCls){ - dd.push(''); - } - dd.push(opts.formatter ? opts.formatter.call(target, row) : s); - dd.push('
                                                                                                                                                                  '); - } - $(container).html(dd.join('')); - } - }; - - $.fn.combobox.defaults = $.extend({}, $.fn.combo.defaults, { - valueField: 'value', - textField: 'text', - groupPosition: 'static', // or 'sticky' - groupField: null, - groupFormatter: function(group){return group;}, - mode: 'local', // or 'remote' - method: 'post', - url: null, - data: null, - queryParams: {}, - showItemIcon: false, - limitToList: false, // limit the inputed values to the listed items - unselectedValues: [], - mappingRows: [], - view: defaultView, - - keyHandler: { - up: function(e){nav(this,'prev');e.preventDefault()}, - down: function(e){nav(this,'next');e.preventDefault()}, - left: function(e){}, - right: function(e){}, - enter: function(e){doEnter(this)}, - query: function(q,e){doQuery(this, q)} - }, - inputEvents: $.extend({}, $.fn.combo.defaults.inputEvents, { - blur: function(e){ - $.fn.combo.defaults.inputEvents.blur(e); - var target = e.data.target; - var opts = $(target).combobox('options'); - if (opts.reversed || opts.limitToList){ - if (opts.blurTimer){ - clearTimeout(opts.blurTimer); - } - opts.blurTimer = setTimeout(function(){ - var existing = $(target).parent().length; - if (existing){ - if (opts.reversed){ - $(target).combobox('setValues', $(target).combobox('getValues')); - } else if (opts.limitToList){ - //doEnter(target); - var vv = []; - $.map($(target).combobox('getValues'), function(v){ - var index = $.easyui.indexOfArray($(target).combobox('getData'), opts.valueField, v); - if (index >= 0){ - vv.push(v); - } - }); - $(target).combobox('setValues', vv); - } - opts.blurTimer = null; - } - },50); - } - } - }), - panelEvents: { - mouseover: mouseoverHandler, - mouseout: mouseoutHandler, - mousedown: function(e){ - e.preventDefault(); - e.stopPropagation(); - }, - click: clickHandler, - scroll: scrollHandler - }, - filter: function(q, row){ - var opts = $(this).combobox('options'); - return row[opts.textField].toLowerCase().indexOf(q.toLowerCase()) >= 0; - }, - formatter: function(row){ - var opts = $(this).combobox('options'); - return row[opts.textField]; - }, - loader: function(param, success, error){ - var opts = $(this).combobox('options'); - if (!opts.url) return false; - $.ajax({ - type: opts.method, - url: opts.url, - data: param, - dataType: 'json', - success: function(data){ - success(data); - }, - error: function(){ - error.apply(this, arguments); - } - }); - }, - loadFilter: function(data){ - return data; - }, - finder:{ - getEl:function(target, value){ - var index = getRowIndex(target, value); - var id = $.data(target, 'combobox').itemIdPrefix + '_' + index; - return $('#'+id); - }, - getGroupEl:function(target, gvalue){ - var state = $.data(target, 'combobox'); - var index = $.easyui.indexOfArray(state.groups, 'value', gvalue); - var id = state.groupIdPrefix + '_' + index; - return $('#'+id); - }, - getGroup:function(target, p){ - var state = $.data(target, 'combobox'); - var index = p.attr('id').substr(state.groupIdPrefix.length+1); - return state.groups[parseInt(index)]; - }, - getRow:function(target, p){ - var state = $.data(target, 'combobox'); - var index = (p instanceof $) ? p.attr('id').substr(state.itemIdPrefix.length+1) : getRowIndex(target, p); - return state.data[parseInt(index)]; - } - }, - - onBeforeLoad: function(param){}, - onLoadSuccess: function(data){}, - onLoadError: function(){}, - onSelect: function(record){}, - onUnselect: function(record){}, - onClick: function(record){} - }); -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.datebox.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.datebox.js deleted file mode 100644 index 6ab1741ef..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.datebox.js +++ /dev/null @@ -1,288 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * datebox - EasyUI for jQuery - * - * Dependencies: - * calendar - * combo - * - */ -(function($){ - /** - * create date box - */ - function createBox(target){ - var state = $.data(target, 'datebox'); - var opts = state.options; - - $(target).addClass('datebox-f').combo($.extend({}, opts, { - onShowPanel:function(){ - bindEvents(this); - setButtons(this); - setCalendar(this); - setValue(this, $(this).datebox('getText'), true); - opts.onShowPanel.call(this); - } - })); - - /** - * if the calendar isn't created, create it. - */ - if (!state.calendar){ - var panel = $(target).combo('panel').css('overflow','hidden'); - panel.panel('options').onBeforeDestroy = function(){ - var c = $(this).find('.calendar-shared'); - if (c.length){ - c.insertBefore(c[0].pholder); - } - }; - var cc = $('
                                                                                                                                                                  ').prependTo(panel); - if (opts.sharedCalendar){ - var c = $(opts.sharedCalendar); - if (!c[0].pholder){ - c[0].pholder = $('').insertAfter(c); - } - c.addClass('calendar-shared').appendTo(cc); - if (!c.hasClass('calendar')){ - c.calendar(); - } - state.calendar = c; - } else { - state.calendar = $('
                                                                                                                                                                  ').appendTo(cc).calendar(); - } - - $.extend(state.calendar.calendar('options'), { - fit:true, - border:false, - onSelect:function(date){ - var target = this.target; - var opts = $(target).datebox('options'); - opts.onSelect.call(target, date); - setValue(target, opts.formatter.call(target, date)); - $(target).combo('hidePanel'); - } - }); - } - - $(target).combo('textbox').parent().addClass('datebox'); - $(target).datebox('initValue', opts.value); - - function bindEvents(target){ - var opts = $(target).datebox('options'); - var panel = $(target).combo('panel'); - panel.unbind('.datebox').bind('click.datebox', function(e){ - if ($(e.target).hasClass('datebox-button-a')){ - var index = parseInt($(e.target).attr('datebox-button-index')); - opts.buttons[index].handler.call(e.target, target); - } - }); - } - function setButtons(target){ - var panel = $(target).combo('panel'); - if (panel.children('div.datebox-button').length){return} - var button = $('
                                                                                                                                                                  ').appendTo(panel); - var tr = button.find('tr'); - for(var i=0; i').appendTo(tr); - var btn = opts.buttons[i]; - var t = $('').html($.isFunction(btn.text) ? btn.text(target) : btn.text).appendTo(td); - t.attr('datebox-button-index', i); - } - tr.find('td').css('width', (100/opts.buttons.length)+'%'); - } - function setCalendar(target){ - var panel = $(target).combo('panel'); - var cc = panel.children('div.datebox-calendar-inner'); - panel.children()._outerWidth(panel.width()); - state.calendar.appendTo(cc); - state.calendar[0].target = target; - if (opts.panelHeight != 'auto'){ - var height = panel.height(); - panel.children().not(cc).each(function(){ - height -= $(this).outerHeight(); - }); - cc._outerHeight(height); - } - state.calendar.calendar('resize'); - } - } - - /** - * called when user inputs some value in text box - */ - function doQuery(target, q){ - setValue(target, q, true); - } - - /** - * called when user press enter key - */ - function doEnter(target){ - var state = $.data(target, 'datebox'); - var opts = state.options; - var current = state.calendar.calendar('options').current; - if (current){ - setValue(target, opts.formatter.call(target, current)); - $(target).combo('hidePanel'); - } - } - - function setValue(target, value, remainText){ - var state = $.data(target, 'datebox'); - var opts = state.options; - var calendar = state.calendar; - calendar.calendar('moveTo', opts.parser.call(target, value)); - if (remainText){ - $(target).combo('setValue', value); - } else { - if (value){ - value = opts.formatter.call(target, calendar.calendar('options').current); - } - $(target).combo('setText', value).combo('setValue', value); - } - } - - $.fn.datebox = function(options, param){ - if (typeof options == 'string'){ - var method = $.fn.datebox.methods[options]; - if (method){ - return method(this, param); - } else { - return this.combo(options, param); - } - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'datebox'); - if (state){ - $.extend(state.options, options); - } else { - $.data(this, 'datebox', { - options: $.extend({}, $.fn.datebox.defaults, $.fn.datebox.parseOptions(this), options) - }); - } - createBox(this); - }); - }; - - $.fn.datebox.methods = { - options: function(jq){ - var copts = jq.combo('options'); - return $.extend($.data(jq[0], 'datebox').options, { - width: copts.width, - height: copts.height, - originalValue: copts.originalValue, - disabled: copts.disabled, - readonly: copts.readonly - }); - }, - cloneFrom: function(jq, from){ - return jq.each(function(){ - $(this).combo('cloneFrom', from); - $.data(this, 'datebox', { - options: $.extend(true, {}, $(from).datebox('options')), - calendar: $(from).datebox('calendar') - }); - $(this).addClass('datebox-f'); - }); - }, - calendar: function(jq){ // get the calendar object - return $.data(jq[0], 'datebox').calendar; - }, - initValue: function(jq, value){ - return jq.each(function(){ - var opts = $(this).datebox('options'); - var value = opts.value; - if (value){ - value = opts.formatter.call(this, opts.parser.call(this, value)); - } - $(this).combo('initValue', value).combo('setText', value); - }); - }, - setValue: function(jq, value){ - return jq.each(function(){ - setValue(this, value); - }); - }, - reset: function(jq){ - return jq.each(function(){ - var opts = $(this).datebox('options'); - $(this).datebox('setValue', opts.originalValue); - }); - } - }; - - $.fn.datebox.parseOptions = function(target){ - return $.extend({}, $.fn.combo.parseOptions(target), $.parser.parseOptions(target, ['sharedCalendar'])); - }; - - $.fn.datebox.defaults = $.extend({}, $.fn.combo.defaults, { - panelWidth:250, - panelHeight:'auto', - sharedCalendar:null, - - keyHandler: { - up:function(e){}, - down:function(e){}, - left: function(e){}, - right: function(e){}, - enter:function(e){doEnter(this)}, - query:function(q,e){doQuery(this, q)} - }, - - currentText:'Today', - closeText:'Close', - okText:'Ok', - - buttons:[{ - text: function(target){return $(target).datebox('options').currentText;}, - handler: function(target){ - var opts = $(target).datebox('options'); - var now = new Date(); - var current = new Date(now.getFullYear(), now.getMonth(), now.getDate()); - $(target).datebox('calendar').calendar({ - year:current.getFullYear(), - month:current.getMonth()+1, - current:current - }); - opts.onSelect.call(target, current); - doEnter(target); - } - },{ - text: function(target){return $(target).datebox('options').closeText;}, - handler: function(target){ - $(this).closest('div.combo-panel').panel('close'); - } - }], - - formatter:function(date){ - var y = date.getFullYear(); - var m = date.getMonth()+1; - var d = date.getDate(); - return (m<10?('0'+m):m)+'/'+(d<10?('0'+d):d)+'/'+y; - }, - parser:function(s){ - if (!s) return new Date(); - var ss = s.split('/'); - var m = parseInt(ss[0],10); - var d = parseInt(ss[1],10); - var y = parseInt(ss[2],10); - if (!isNaN(y) && !isNaN(m) && !isNaN(d)){ - return new Date(y,m-1,d); - } else { - return new Date(); - } - }, - - onSelect:function(date){} - }); -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.draggable.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.draggable.js deleted file mode 100644 index 8187c8c80..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.draggable.js +++ /dev/null @@ -1,399 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * draggable - EasyUI for jQuery - * - */ -(function($){ - function drag(e){ - var state = $.data(e.data.target, 'draggable'); - var opts = state.options; - var proxy = state.proxy; - - var dragData = e.data; - var left = dragData.startLeft + e.pageX - dragData.startX; - var top = dragData.startTop + e.pageY - dragData.startY; - - if (proxy){ - if (proxy.parent()[0] == document.body){ - if (opts.deltaX != null && opts.deltaX != undefined){ - left = e.pageX + opts.deltaX; - } else { - left = e.pageX - e.data.offsetWidth; - } - if (opts.deltaY != null && opts.deltaY != undefined){ - top = e.pageY + opts.deltaY; - } else { - top = e.pageY - e.data.offsetHeight; - } - } else { - if (opts.deltaX != null && opts.deltaX != undefined){ - left += e.data.offsetWidth + opts.deltaX; - } - if (opts.deltaY != null && opts.deltaY != undefined){ - top += e.data.offsetHeight + opts.deltaY; - } - } - } - - if (e.data.parent != document.body) { - left += $(e.data.parent).scrollLeft(); - top += $(e.data.parent).scrollTop(); - } - - if (opts.axis == 'h') { - dragData.left = left; - } else if (opts.axis == 'v') { - dragData.top = top; - } else { - dragData.left = left; - dragData.top = top; - } - } - - function applyDrag(e){ - var state = $.data(e.data.target, 'draggable'); - var opts = state.options; - var proxy = state.proxy; - if (!proxy){ - proxy = $(e.data.target); - } - proxy.css({ - left:e.data.left, - top:e.data.top - }); - $('body').css('cursor', opts.cursor); - } - - function doDown(e){ - if (!$.fn.draggable.isDragging){return false;} - - var state = $.data(e.data.target, 'draggable'); - var opts = state.options; - - var droppables = $('.droppable:visible').filter(function(){ - return e.data.target != this; - }).filter(function(){ - var accept = $.data(this, 'droppable').options.accept; - if (accept){ - return $(accept).filter(function(){ - return this == e.data.target; - }).length > 0; - } else { - return true; - } - }); - state.droppables = droppables; - - var proxy = state.proxy; - if (!proxy){ - if (opts.proxy){ - if (opts.proxy == 'clone'){ - proxy = $(e.data.target).clone().insertAfter(e.data.target); - } else { - proxy = opts.proxy.call(e.data.target, e.data.target); - } - state.proxy = proxy; - } else { - proxy = $(e.data.target); - } - } - - proxy.css('position', 'absolute'); - drag(e); - applyDrag(e); - - opts.onStartDrag.call(e.data.target, e); - return false; - } - - function doMove(e){ - if (!$.fn.draggable.isDragging){return false;} - - var state = $.data(e.data.target, 'draggable'); - drag(e); - if (state.options.onDrag.call(e.data.target, e) != false){ - applyDrag(e); - } - - var source = e.data.target; - state.droppables.each(function(){ - var dropObj = $(this); - if (dropObj.droppable('options').disabled){return;} - - var p2 = dropObj.offset(); - if (e.pageX > p2.left && e.pageX < p2.left + dropObj.outerWidth() - && e.pageY > p2.top && e.pageY < p2.top + dropObj.outerHeight()){ - if (!this.entered){ - $(this).trigger('_dragenter', [source]); - this.entered = true; - } - $(this).trigger('_dragover', [source]); - } else { - if (this.entered){ - $(this).trigger('_dragleave', [source]); - this.entered = false; - } - } - }); - - return false; - } - - function doUp(e){ - if (!$.fn.draggable.isDragging){ - clearDragging(); - return false; - } - - doMove(e); - - var state = $.data(e.data.target, 'draggable'); - var proxy = state.proxy; - var opts = state.options; - opts.onEndDrag.call(e.data.target, e); - if (opts.revert){ - if (checkDrop() == true){ - $(e.data.target).css({ - position:e.data.startPosition, - left:e.data.startLeft, - top:e.data.startTop - }); - } else { - if (proxy){ - var left, top; - if (proxy.parent()[0] == document.body){ - left = e.data.startX - e.data.offsetWidth; - top = e.data.startY - e.data.offsetHeight; - } else { - left = e.data.startLeft; - top = e.data.startTop; - } - proxy.animate({ - left: left, - top: top - }, function(){ - removeProxy(); - }); - } else { - $(e.data.target).animate({ - left:e.data.startLeft, - top:e.data.startTop - }, function(){ - $(e.data.target).css('position', e.data.startPosition); - }); - } - } - } else { - $(e.data.target).css({ - position:'absolute', - left:e.data.left, - top:e.data.top - }); - checkDrop(); - } - - opts.onStopDrag.call(e.data.target, e); - - clearDragging(); - - function removeProxy(){ - if (proxy){ - proxy.remove(); - } - state.proxy = null; - } - - function checkDrop(){ - var dropped = false; - state.droppables.each(function(){ - var dropObj = $(this); - if (dropObj.droppable('options').disabled){return;} - - var p2 = dropObj.offset(); - if (e.pageX > p2.left && e.pageX < p2.left + dropObj.outerWidth() - && e.pageY > p2.top && e.pageY < p2.top + dropObj.outerHeight()){ - if (opts.revert){ - $(e.data.target).css({ - position:e.data.startPosition, - left:e.data.startLeft, - top:e.data.startTop - }); - } - $(this).triggerHandler('_drop', [e.data.target]); - removeProxy(); - dropped = true; - this.entered = false; - return false; - } - }); - if (!dropped && !opts.revert){ - removeProxy(); - } - return dropped; - } - - return false; - } - - function clearDragging(){ - if ($.fn.draggable.timer){ - clearTimeout($.fn.draggable.timer); - $.fn.draggable.timer = undefined; - } - $(document).unbind('.draggable'); - $.fn.draggable.isDragging = false; - setTimeout(function(){ - $('body').css('cursor',''); - },100); - } - - $.fn.draggable = function(options, param){ - if (typeof options == 'string'){ - return $.fn.draggable.methods[options](this, param); - } - - return this.each(function(){ - var opts; - var state = $.data(this, 'draggable'); - if (state) { - state.handle.unbind('.draggable'); - opts = $.extend(state.options, options); - } else { - opts = $.extend({}, $.fn.draggable.defaults, $.fn.draggable.parseOptions(this), options || {}); - } - var handle = opts.handle ? (typeof opts.handle=='string' ? $(opts.handle, this) : opts.handle) : $(this); - - $.data(this, 'draggable', { - options: opts, - handle: handle - }); - - if (opts.disabled) { - $(this).css('cursor', ''); - return; - } - - handle.unbind('.draggable').bind('mousemove.draggable', {target:this}, function(e){ - if ($.fn.draggable.isDragging){return} - var opts = $.data(e.data.target, 'draggable').options; - if (checkArea(e)){ - $(this).css('cursor', opts.cursor); - } else { - $(this).css('cursor', ''); - } - }).bind('mouseleave.draggable', {target:this}, function(e){ - $(this).css('cursor', ''); - }).bind('mousedown.draggable', {target:this}, function(e){ - if (checkArea(e) == false) return; - $(this).css('cursor', ''); - - var position = $(e.data.target).position(); - var offset = $(e.data.target).offset(); - var data = { - startPosition: $(e.data.target).css('position'), - startLeft: position.left, - startTop: position.top, - left: position.left, - top: position.top, - startX: e.pageX, - startY: e.pageY, - width: $(e.data.target).outerWidth(), - height: $(e.data.target).outerHeight(), - offsetWidth: (e.pageX - offset.left), - offsetHeight: (e.pageY - offset.top), - target: e.data.target, - parent: $(e.data.target).parent()[0] - }; - - $.extend(e.data, data); - var opts = $.data(e.data.target, 'draggable').options; - if (opts.onBeforeDrag.call(e.data.target, e) == false) return; - - $(document).bind('mousedown.draggable', e.data, doDown); - $(document).bind('mousemove.draggable', e.data, doMove); - $(document).bind('mouseup.draggable', e.data, doUp); - - $.fn.draggable.timer = setTimeout(function(){ - $.fn.draggable.isDragging = true; - doDown(e); - }, opts.delay); - return false; - }); - - // check if the handle can be dragged - function checkArea(e) { - var state = $.data(e.data.target, 'draggable'); - var handle = state.handle; - var offset = $(handle).offset(); - var width = $(handle).outerWidth(); - var height = $(handle).outerHeight(); - var t = e.pageY - offset.top; - var r = offset.left + width - e.pageX; - var b = offset.top + height - e.pageY; - var l = e.pageX - offset.left; - - return Math.min(t,r,b,l) > state.options.edge; - } - - }); - }; - - $.fn.draggable.methods = { - options: function(jq){ - return $.data(jq[0], 'draggable').options; - }, - proxy: function(jq){ - return $.data(jq[0], 'draggable').proxy; - }, - enable: function(jq){ - return jq.each(function(){ - $(this).draggable({disabled:false}); - }); - }, - disable: function(jq){ - return jq.each(function(){ - $(this).draggable({disabled:true}); - }); - } - }; - - $.fn.draggable.parseOptions = function(target){ - var t = $(target); - return $.extend({}, - $.parser.parseOptions(target, ['cursor','handle','axis', - {'revert':'boolean','deltaX':'number','deltaY':'number','edge':'number','delay':'number'}]), { - disabled: (t.attr('disabled') ? true : undefined) - }); - }; - - $.fn.draggable.defaults = { - proxy:null, // 'clone' or a function that will create the proxy object, - // the function has the source parameter that indicate the source object dragged. - revert:false, - cursor:'move', - deltaX:null, - deltaY:null, - handle: null, - disabled: false, - edge:0, - axis:null, // v or h - delay:100, - - onBeforeDrag: function(e){}, - onStartDrag: function(e){}, - onDrag: function(e){}, - onEndDrag: function(e){}, - onStopDrag: function(e){} - }; - - $.fn.draggable.isDragging = false; - -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.droppable.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.droppable.js deleted file mode 100644 index 33ce6301c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.droppable.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * droppable - EasyUI for jQuery - * - */ -(function($){ - function init(target){ - $(target).addClass('droppable'); - $(target).bind('_dragenter', function(e, source){ - $.data(target, 'droppable').options.onDragEnter.apply(target, [e, source]); - }); - $(target).bind('_dragleave', function(e, source){ - $.data(target, 'droppable').options.onDragLeave.apply(target, [e, source]); - }); - $(target).bind('_dragover', function(e, source){ - $.data(target, 'droppable').options.onDragOver.apply(target, [e, source]); - }); - $(target).bind('_drop', function(e, source){ - $.data(target, 'droppable').options.onDrop.apply(target, [e, source]); - }); - } - - $.fn.droppable = function(options, param){ - if (typeof options == 'string'){ - return $.fn.droppable.methods[options](this, param); - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'droppable'); - if (state){ - $.extend(state.options, options); - } else { - init(this); - $.data(this, 'droppable', { - options: $.extend({}, $.fn.droppable.defaults, $.fn.droppable.parseOptions(this), options) - }); - } - }); - }; - - $.fn.droppable.methods = { - options: function(jq){ - return $.data(jq[0], 'droppable').options; - }, - enable: function(jq){ - return jq.each(function(){ - $(this).droppable({disabled:false}); - }); - }, - disable: function(jq){ - return jq.each(function(){ - $(this).droppable({disabled:true}); - }); - } - }; - - $.fn.droppable.parseOptions = function(target){ - var t = $(target); - return $.extend({}, $.parser.parseOptions(target, ['accept']), { - disabled: (t.attr('disabled') ? true : undefined) - }); - }; - - $.fn.droppable.defaults = { - accept:null, - disabled:false, - onDragEnter:function(e, source){}, - onDragOver:function(e, source){}, - onDragLeave:function(e, source){}, - onDrop:function(e, source){} - }; -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.form.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.form.js deleted file mode 100644 index 7a2b3fae1..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.form.js +++ /dev/null @@ -1,492 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * form - EasyUI for jQuery - * - */ -(function($){ - /** - * submit the form - */ - function ajaxSubmit(target, options){ - var opts = $.data(target, 'form').options; - $.extend(opts, options||{}); - - var param = $.extend({}, opts.queryParams); - if (opts.onSubmit.call(target, param) == false){return;} - - // $(target).find('.textbox-text:focus').blur(); - var input = $(target).find('.textbox-text:focus'); - input.triggerHandler('blur'); - input.focus(); - - var disabledFields = null; // the fields to be disabled - if (opts.dirty){ - var ff = []; // all the dirty fields - $.map(opts.dirtyFields, function(f){ - if ($(f).hasClass('textbox-f')){ - $(f).next().find('.textbox-value').each(function(){ - ff.push(this); - }); - } else { - ff.push(f); - } - }); - disabledFields = $(target).find('input[name]:enabled,textarea[name]:enabled,select[name]:enabled').filter(function(){ - return $.inArray(this, ff) == -1; - }); - // disabledFields.attr('disabled', 'disabled'); - disabledFields._propAttr('disabled', true); - } - - if (opts.ajax){ - if (opts.iframe){ - submitIframe(target, param); - } else { - if (window.FormData !== undefined){ - submitXhr(target, param); - } else { - submitIframe(target, param); - } - } - } else { - $(target).submit(); - } - - if (opts.dirty){ - // disabledFields.removeAttr('disabled'); - disabledFields._propAttr('disabled', false); - } - } - - function submitIframe(target, param){ - var opts = $.data(target, 'form').options; - var frameId = 'easyui_frame_' + (new Date().getTime()); - var frame = $('').appendTo('body') - frame.attr('src', window.ActiveXObject ? 'javascript:false' : 'about:blank'); - frame.css({ - position:'absolute', - top:-1000, - left:-1000 - }); - frame.bind('load', cb); - - submit(param); - - function submit(param){ - var form = $(target); - if (opts.url){ - form.attr('action', opts.url); - } - var t = form.attr('target'), a = form.attr('action'); - form.attr('target', frameId); - var paramFields = $(); - try { - for(var n in param){ - var field = $('').val(param[n]).appendTo(form); - paramFields = paramFields.add(field); - } - checkState(); - form[0].submit(); - } finally { - form.attr('action', a); - t ? form.attr('target', t) : form.removeAttr('target'); - paramFields.remove(); - } - } - - function checkState(){ - var f = $('#'+frameId); - if (!f.length){return} - try{ - var s = f.contents()[0].readyState; - if (s && s.toLowerCase() == 'uninitialized'){ - setTimeout(checkState, 100); - } - } catch(e){ - cb(); - } - } - - var checkCount = 10; - function cb(){ - var f = $('#'+frameId); - if (!f.length){return} - f.unbind(); - var data = ''; - try{ - var body = f.contents().find('body'); - data = body.html(); - if (data == ''){ - if (--checkCount){ - setTimeout(cb, 100); - return; - } - } - var ta = body.find('>textarea'); - if (ta.length){ - data = ta.val(); - } else { - var pre = body.find('>pre'); - if (pre.length){ - data = pre.html(); - } - } - } catch(e){ - } - opts.success.call(target, data); - setTimeout(function(){ - f.unbind(); - f.remove(); - }, 100); - } - } - - function submitXhr(target, param){ - var opts = $.data(target, 'form').options; - var formData = new FormData($(target)[0]); - for(var name in param){ - formData.append(name, param[name]); - } - $.ajax({ - url: opts.url, - type: 'post', - xhr: function(){ - var xhr = $.ajaxSettings.xhr(); - if (xhr.upload) { - xhr.upload.addEventListener('progress', function(e){ - if (e.lengthComputable) { - var total = e.total; - var position = e.loaded || e.position; - var percent = Math.ceil(position * 100 / total); - opts.onProgress.call(target, percent); - } - }, false); - } - return xhr; - }, - data: formData, - dataType: 'html', - cache: false, - contentType: false, - processData: false, - complete: function(res){ - opts.success.call(target, res.responseText); - } - }); - } - - - /** - * load form data - * if data is a URL string type load from remote site, - * otherwise load from local data object. - */ - function load(target, data){ - var opts = $.data(target, 'form').options; - - if (typeof data == 'string'){ - var param = {}; - if (opts.onBeforeLoad.call(target, param) == false) return; - - $.ajax({ - url: data, - data: param, - dataType: 'json', - success: function(data){ - _load(data); - }, - error: function(){ - opts.onLoadError.apply(target, arguments); - } - }); - } else { - _load(data); - } - - function _load(data){ - var form = $(target); - for(var name in data){ - var val = data[name]; - if (!_checkField(name, val)){ - if (!_loadBox(name, val)){ - form.find('input[name="'+name+'"]').val(val); - form.find('textarea[name="'+name+'"]').val(val); - form.find('select[name="'+name+'"]').val(val); - } - } - } - opts.onLoadSuccess.call(target, data); - form.form('validate'); - } - - /** - * check the checkbox and radio fields - */ - function _checkField(name, val){ - var cc = $(target).find('[switchbuttonName="'+name+'"]'); - if (cc.length){ - cc.switchbutton('uncheck'); - cc.each(function(){ - if (_isChecked($(this).switchbutton('options').value, val)){ - $(this).switchbutton('check'); - } - }); - return true; - } - cc = $(target).find('input[name="'+name+'"][type=radio], input[name="'+name+'"][type=checkbox]'); - if (cc.length){ - cc._propAttr('checked', false); - cc.each(function(){ - if (_isChecked($(this).val(), val)){ - $(this)._propAttr('checked', true); - } - }); - return true; - } - return false; - } - function _isChecked(v, val){ - if (v == String(val) || $.inArray(v, $.isArray(val)?val:[val]) >= 0){ - return true; - } else { - return false; - } - } - - function _loadBox(name, val){ - var field = $(target).find('[textboxName="'+name+'"],[sliderName="'+name+'"]'); - if (field.length){ - for(var i=0; i=0; i--){ - var type = opts.fieldTypes[i]; - var field = form.find('.'+type+'-f'); - if (field.length && field[type]){ - field[type]('reset'); - } - } - form.form('validate'); - } - - /** - * set the form to make it can submit with ajax. - */ - function setForm(target){ - var options = $.data(target, 'form').options; - $(target).unbind('.form'); - if (options.ajax){ - $(target).bind('submit.form', function(){ - setTimeout(function(){ - ajaxSubmit(target, options); - }, 0); - return false; - }); - } - $(target).bind('_change.form', function(e, t){ - if ($.inArray(t, options.dirtyFields) == -1){ - options.dirtyFields.push(t); - } - options.onChange.call(this, t); - }).bind('change.form', function(e){ - var t = e.target; - if (!$(t).hasClass('textbox-text')){ - if ($.inArray(t, options.dirtyFields) == -1){ - options.dirtyFields.push(t); - } - options.onChange.call(this, t); - } - }); - setValidation(target, options.novalidate); - } - - function initForm(target, options){ - options = options || {}; - var state = $.data(target, 'form'); - if (state){ - $.extend(state.options, options); - } else { - $.data(target, 'form', { - options: $.extend({}, $.fn.form.defaults, $.fn.form.parseOptions(target), options) - }); - } - } - - function validate(target){ - if ($.fn.validatebox){ - var t = $(target); - t.find('.validatebox-text:not(:disabled)').validatebox('validate'); - var invalidbox = t.find('.validatebox-invalid'); - invalidbox.filter(':not(:disabled):first').focus(); - return invalidbox.length == 0; - } - return true; - } - - function setValidation(target, novalidate){ - var opts = $.data(target, 'form').options; - opts.novalidate = novalidate; - $(target).find('.validatebox-text:not(:disabled)').validatebox(novalidate ? 'disableValidation' : 'enableValidation'); - } - - $.fn.form = function(options, param){ - if (typeof options == 'string'){ - this.each(function(){ - initForm(this); - }); - return $.fn.form.methods[options](this, param); - } - - return this.each(function(){ - initForm(this, options); - setForm(this); - }); - }; - - $.fn.form.methods = { - options: function(jq){ - return $.data(jq[0], 'form').options; - }, - submit: function(jq, options){ - return jq.each(function(){ - ajaxSubmit(this, options); - }); - }, - load: function(jq, data){ - return jq.each(function(){ - load(this, data); - }); - }, - clear: function(jq){ - return jq.each(function(){ - clear(this); - }); - }, - reset: function(jq){ - return jq.each(function(){ - reset(this); - }); - }, - validate: function(jq){ - return validate(jq[0]); - }, - disableValidation: function(jq){ - return jq.each(function(){ - setValidation(this, true); - }); - }, - enableValidation: function(jq){ - return jq.each(function(){ - setValidation(this, false); - }); - }, - resetValidation: function(jq){ - return jq.each(function(){ - $(this).find('.validatebox-text:not(:disabled)').validatebox('resetValidation'); - }); - }, - resetDirty: function(jq){ - return jq.each(function(){ - $(this).form('options').dirtyFields = []; - }); - } - }; - - $.fn.form.parseOptions = function(target){ - var t = $(target); - return $.extend({}, $.parser.parseOptions(target, [ - {ajax:'boolean',dirty:'boolean'} - ]), { - url: (t.attr('action') ? t.attr('action') : undefined) - }); - }; - - $.fn.form.defaults = { - fieldTypes: ['tagbox','combobox','combotree','combogrid','combotreegrid','datetimebox','datebox','combo', - 'datetimespinner','timespinner','numberspinner','spinner', - 'slider','searchbox','numberbox','passwordbox','filebox','textbox','switchbutton'], - novalidate: false, - ajax: true, - iframe: true, - dirty: false, - dirtyFields: [], - url: null, - queryParams: {}, - onSubmit: function(param){return $(this).form('validate');}, - onProgress: function(percent){}, - success: function(data){}, - onBeforeLoad: function(param){}, - onLoadSuccess: function(data){}, - onLoadError: function(){}, - onChange: function(target){} - }; -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.linkbutton.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.linkbutton.js deleted file mode 100644 index 471751561..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.linkbutton.js +++ /dev/null @@ -1,243 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * linkbutton - EasyUI for jQuery - * - */ -(function($){ - function setSize(target, param){ - var opts = $.data(target, 'linkbutton').options; - if (param){ - $.extend(opts, param); - } - if (opts.width || opts.height || opts.fit){ - var btn = $(target); - var parent = btn.parent(); - var isVisible = btn.is(':visible'); - if (!isVisible){ - var spacer = $('
                                                                                                                                                                  ').insertBefore(target); - var style = { - position: btn.css('position'), - display: btn.css('display'), - left: btn.css('left') - }; - btn.appendTo('body'); - btn.css({ - position: 'absolute', - display: 'inline-block', - left: -20000 - }); - } - btn._size(opts, parent); - var left = btn.find('.l-btn-left'); - left.css('margin-top', 0); - left.css('margin-top', parseInt((btn.height()-left.height())/2)+'px'); - if (!isVisible){ - btn.insertAfter(spacer); - btn.css(style); - spacer.remove(); - } - } - } - - function createButton(target) { - var opts = $.data(target, 'linkbutton').options; - var t = $(target).empty(); - - t.addClass('l-btn').removeClass('l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline'); - t.removeClass('l-btn-small l-btn-medium l-btn-large').addClass('l-btn-'+opts.size); - if (opts.plain){t.addClass('l-btn-plain')} - if (opts.outline){t.addClass('l-btn-outline')} - if (opts.selected){ - t.addClass(opts.plain ? 'l-btn-selected l-btn-plain-selected' : 'l-btn-selected'); - } - t.attr('group', opts.group || ''); - t.attr('id', opts.id || ''); - - var inner = $('').appendTo(t); - if (opts.text){ - $('').html(opts.text).appendTo(inner); - } else { - $(' ').appendTo(inner); - } - if (opts.iconCls){ - $(' ').addClass(opts.iconCls).appendTo(inner); - inner.addClass('l-btn-icon-'+opts.iconAlign); - } - - t.unbind('.linkbutton').bind('focus.linkbutton',function(){ - if (!opts.disabled){ - $(this).addClass('l-btn-focus'); - } - }).bind('blur.linkbutton',function(){ - $(this).removeClass('l-btn-focus'); - }).bind('click.linkbutton',function(){ - if (!opts.disabled){ - if (opts.toggle){ - if (opts.selected){ - $(this).linkbutton('unselect'); - } else { - $(this).linkbutton('select'); - } - } - opts.onClick.call(this); - } -// return false; - }); -// if (opts.toggle && !opts.disabled){ -// t.bind('click.linkbutton', function(){ -// if (opts.selected){ -// $(this).linkbutton('unselect'); -// } else { -// $(this).linkbutton('select'); -// } -// }); -// } - - setSelected(target, opts.selected) - setDisabled(target, opts.disabled); - } - - function setSelected(target, selected){ - var opts = $.data(target, 'linkbutton').options; - if (selected){ - if (opts.group){ - $('a.l-btn[group="'+opts.group+'"]').each(function(){ - var o = $(this).linkbutton('options'); - if (o.toggle){ - $(this).removeClass('l-btn-selected l-btn-plain-selected'); - o.selected = false; - } - }); - } - $(target).addClass(opts.plain ? 'l-btn-selected l-btn-plain-selected' : 'l-btn-selected'); - opts.selected = true; - } else { - if (!opts.group){ - $(target).removeClass('l-btn-selected l-btn-plain-selected'); - opts.selected = false; - } - } - } - - function setDisabled(target, disabled){ - var state = $.data(target, 'linkbutton'); - var opts = state.options; - $(target).removeClass('l-btn-disabled l-btn-plain-disabled'); - if (disabled){ - opts.disabled = true; - var href = $(target).attr('href'); - if (href){ - state.href = href; - $(target).attr('href', 'javascript:;'); - } - if (target.onclick){ - state.onclick = target.onclick; - target.onclick = null; - } - opts.plain ? $(target).addClass('l-btn-disabled l-btn-plain-disabled') : $(target).addClass('l-btn-disabled'); - } else { - opts.disabled = false; - if (state.href) { - $(target).attr('href', state.href); - } - if (state.onclick) { - target.onclick = state.onclick; - } - } - } - - $.fn.linkbutton = function(options, param){ - if (typeof options == 'string'){ - return $.fn.linkbutton.methods[options](this, param); - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'linkbutton'); - if (state){ - $.extend(state.options, options); - } else { - $.data(this, 'linkbutton', { - options: $.extend({}, $.fn.linkbutton.defaults, $.fn.linkbutton.parseOptions(this), options) - }); - // $(this).removeAttr('disabled'); - $(this)._propAttr('disabled', false); - $(this).bind('_resize', function(e, force){ - if ($(this).hasClass('easyui-fluid') || force){ - setSize(this); - } - return false; - }); - } - - createButton(this); - setSize(this); - }); - }; - - $.fn.linkbutton.methods = { - options: function(jq){ - return $.data(jq[0], 'linkbutton').options; - }, - resize: function(jq, param){ - return jq.each(function(){ - setSize(this, param); - }); - }, - enable: function(jq){ - return jq.each(function(){ - setDisabled(this, false); - }); - }, - disable: function(jq){ - return jq.each(function(){ - setDisabled(this, true); - }); - }, - select: function(jq){ - return jq.each(function(){ - setSelected(this, true); - }); - }, - unselect: function(jq){ - return jq.each(function(){ - setSelected(this, false); - }); - } - }; - - $.fn.linkbutton.parseOptions = function(target){ - var t = $(target); - return $.extend({}, $.parser.parseOptions(target, - ['id','iconCls','iconAlign','group','size','text',{plain:'boolean',toggle:'boolean',selected:'boolean',outline:'boolean'}] - ), { - disabled: (t.attr('disabled') ? true : undefined), - text: ($.trim(t.html()) || undefined), - iconCls: (t.attr('icon') || t.attr('iconCls')) - }); - }; - - $.fn.linkbutton.defaults = { - id: null, - disabled: false, - toggle: false, - selected: false, - outline: false, - group: null, - plain: false, - text: '', - iconCls: null, - iconAlign: 'left', - size: 'small', // small,large - onClick: function(){} - }; - -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.menu.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.menu.js deleted file mode 100644 index 76f083a05..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.menu.js +++ /dev/null @@ -1,648 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * menu - EasyUI for jQuery - * - */ -(function($){ - $(function(){ - $(document).unbind('.menu').bind('mousedown.menu', function(e){ - var m = $(e.target).closest('div.menu,div.combo-p'); - if (m.length){return} - $('body>div.menu-top:visible').not('.menu-inline').menu('hide'); - hideMenu($('body>div.menu:visible').not('.menu-inline')); - }); - }); - - /** - * initialize the target menu, the function can be invoked only once - */ - function init(target){ - var opts = $.data(target, 'menu').options; - $(target).addClass('menu-top'); // the top menu - opts.inline ? $(target).addClass('menu-inline') : $(target).appendTo('body'); - $(target).bind('_resize', function(e, force){ - if ($(this).hasClass('easyui-fluid') || force){ - $(target).menu('resize', target); - } - return false; - }); - - var menus = splitMenu($(target)); - for(var i=0; i').prependTo(menu); - } - setMenuSize(target, menu); - if (!menu.hasClass('menu-inline')){ - menu.hide(); - } - bindMenuEvent(target, menu); - } - - /** - * create the menu item - */ - function createItem(target, div, options){ - var item = $(div); - var itemOpts = $.extend({}, $.parser.parseOptions(item[0], ['id','name','iconCls','href',{separator:'boolean'}]), { - disabled: (item.attr('disabled') ? true : undefined), - text: $.trim(item.html()), - onclick: item[0].onclick - }, options||{}); - itemOpts.onclick = itemOpts.onclick || itemOpts.handler || null; - item.data('menuitem', { - options: itemOpts - }); - if (itemOpts.separator){ - item.addClass('menu-sep'); - } - if (!item.hasClass('menu-sep')){ - item.addClass('menu-item'); - item.empty().append($('').html(itemOpts.text)); - if (itemOpts.iconCls){ - $('').addClass(itemOpts.iconCls).appendTo(item); - } - if (itemOpts.id){ - item.attr('id', itemOpts.id); - } - if (itemOpts.onclick){ - if (typeof itemOpts.onclick == 'string'){ - item.attr('onclick', itemOpts.onclick); - } else { - item[0].onclick = eval(itemOpts.onclick); - } - } - if (itemOpts.disabled){ - setDisabled(target, item[0], true); - } - if (item[0].submenu){ - $('').appendTo(item); // has sub menu - } - } - } - - function setMenuSize(target, menu){ - var opts = $.data(target, 'menu').options; - var style = menu.attr('style') || ''; - var isVisible = menu.is(':visible'); - menu.css({ - display: 'block', - left: -10000, - height: 'auto', - overflow: 'hidden' - }); - menu.find('.menu-item').each(function(){ - $(this)._outerHeight(opts.itemHeight); - $(this).find('.menu-text').css({ - height: (opts.itemHeight-2)+'px', - lineHeight: (opts.itemHeight-2)+'px' - }); - }); - menu.removeClass('menu-noline').addClass(opts.noline?'menu-noline':''); - - var mopts = menu.data('menu').options; - var width = mopts.width; - var height = mopts.height; - if (isNaN(parseInt(width))){ - width = 0; - menu.find('div.menu-text').each(function(){ - if (width < $(this).outerWidth()){ - width = $(this).outerWidth(); - } - }); - // width += 40; - width = width ? width+40 : ''; - } - var autoHeight = menu.outerHeight(); - if (isNaN(parseInt(height))){ - height = autoHeight; - if (menu.hasClass('menu-top') && opts.alignTo){ - var at = $(opts.alignTo); - var h1 = at.offset().top - $(document).scrollTop(); - var h2 = $(window)._outerHeight() + $(document).scrollTop() - at.offset().top - at._outerHeight(); - height = Math.min(height, Math.max(h1, h2)); - } else if (height > $(window)._outerHeight()){ - height = $(window).height(); - } - } - - menu.attr('style', style); // restore the original style - menu.show(); - menu._size($.extend({}, mopts, { - width: width, - height: height, - minWidth: mopts.minWidth || opts.minWidth, - maxWidth: mopts.maxWidth || opts.maxWidth - })); - menu.find('.easyui-fluid').triggerHandler('_resize', [true]); - menu.css('overflow', menu.outerHeight() < autoHeight ? 'auto' : 'hidden'); - menu.children('div.menu-line')._outerHeight(autoHeight-2); - if (!isVisible){ - menu.hide(); - } - } - - /** - * bind menu event - */ - function bindMenuEvent(target, menu){ - var state = $.data(target, 'menu'); - var opts = state.options; - menu.unbind('.menu'); - for(var event in opts.events){ - menu.bind(event+'.menu', {target:target}, opts.events[event]); - } - } - function mouseenterHandler(e){ - var target = e.data.target; - var state = $.data(target, 'menu'); - if (state.timer){ - clearTimeout(state.timer); - state.timer = null; - } - } - function mouseleaveHandler(e){ - var target = e.data.target; - var state = $.data(target, 'menu'); - if (state.options.hideOnUnhover){ - state.timer = setTimeout(function(){ - hideAll(target, $(target).hasClass('menu-inline')); - }, state.options.duration); - } - } - function mouseoverHandler(e){ - var target = e.data.target; - var item = $(e.target).closest('.menu-item'); - if (item.length){ - item.siblings().each(function(){ - if (this.submenu){ - hideMenu(this.submenu); - } - $(this).removeClass('menu-active'); - }); - // show this menu - item.addClass('menu-active'); - - if (item.hasClass('menu-item-disabled')){ - item.addClass('menu-active-disabled'); - return; - } - - var submenu = item[0].submenu; - if (submenu){ - $(target).menu('show', { - menu: submenu, - parent: item - }); - } - } - } - function mouseoutHandler(e){ - var item = $(e.target).closest('.menu-item'); - if (item.length){ - item.removeClass('menu-active menu-active-disabled'); - var submenu = item[0].submenu; - if (submenu){ - if (e.pageX>=parseInt(submenu.css('left'))){ - item.addClass('menu-active'); - } else { - hideMenu(submenu); - } - } else { - item.removeClass('menu-active'); - } - } - } - function clickHandler(e){ - var target = e.data.target; - var item = $(e.target).closest('.menu-item'); - if (item.length){ - var opts = $(target).data('menu').options; - var itemOpts = item.data('menuitem').options; - if (itemOpts.disabled){return;} - if (!item[0].submenu){ - hideAll(target, opts.inline); - if (itemOpts.href){ - location.href = itemOpts.href; - } - } - item.trigger('mouseenter'); - opts.onClick.call(target, $(target).menu('getItem', item[0])); - } - } - - /** - * hide top menu and it's all sub menus - */ - function hideAll(target, inline){ - var state = $.data(target, 'menu'); - if (state){ - if ($(target).is(':visible')){ - hideMenu($(target)); - if (inline){ - $(target).show(); - } else { - state.options.onHide.call(target); - } - } - } - return false; - } - - /** - * show the menu, the 'param' object has one or more properties: - * left: the left position to display - * top: the top position to display - * menu: the menu to display, if not defined, the 'target menu' is used - * parent: the parent menu item to align to - * alignTo: the element object to align to - */ - function showMenu(target, param){ - param = param || {}; - var left,top; - var opts = $.data(target, 'menu').options; - var menu = $(param.menu || target); - $(target).menu('resize', menu[0]); - if (menu.hasClass('menu-top')){ - $.extend(opts, param); - left = opts.left; - top = opts.top; - if (opts.alignTo){ - var at = $(opts.alignTo); - left = at.offset().left; - top = at.offset().top + at._outerHeight(); - if (opts.align == 'right'){ - left += at.outerWidth() - menu.outerWidth(); - } - } - if (left + menu.outerWidth() > $(window)._outerWidth() + $(document)._scrollLeft()){ - left = $(window)._outerWidth() + $(document).scrollLeft() - menu.outerWidth() - 5; - } - if (left < 0){left = 0;} - top = _fixTop(top, opts.alignTo); - } else { - var parent = param.parent; // the parent menu item - left = parent.offset().left + parent.outerWidth() - 2; - if (left + menu.outerWidth() + 5 > $(window)._outerWidth() + $(document).scrollLeft()){ - left = parent.offset().left - menu.outerWidth() + 2; - } - top = _fixTop(parent.offset().top - 3); - } - - function _fixTop(top, alignTo){ - if (top + menu.outerHeight() > $(window)._outerHeight() + $(document).scrollTop()){ - if (alignTo){ - top = $(alignTo).offset().top - menu._outerHeight(); - } else { - top = $(window)._outerHeight() + $(document).scrollTop() - menu.outerHeight(); - } - } - if (top < 0){top = 0;} - return top; - } - - menu.css(opts.position.call(target, menu[0], left, top)); - menu.show(0, function(){ - if (!menu[0].shadow){ - menu[0].shadow = $('').insertAfter(menu); - } - menu[0].shadow.css({ - display:(menu.hasClass('menu-inline')?'none':'block'), - zIndex:$.fn.menu.defaults.zIndex++, - left:menu.css('left'), - top:menu.css('top'), - width:menu.outerWidth(), - height:menu.outerHeight() - }); - menu.css('z-index', $.fn.menu.defaults.zIndex++); - if (menu.hasClass('menu-top')){ - opts.onShow.call(target); - } - }); - } - - function hideMenu(menu){ - if (menu && menu.length){ - hideit(menu); - menu.find('div.menu-item').each(function(){ - if (this.submenu){ - hideMenu(this.submenu); - } - $(this).removeClass('menu-active'); - }); - } - - function hideit(m){ - m.stop(true,true); - if (m[0].shadow){ - m[0].shadow.hide(); - } - m.hide(); - } - } - - function findItem(target, param){ - var result = null; - var fn = $.isFunction(param) ? param : function(item){ - for(var p in param){ - if (item[p] != param[p]){ - return false;; - } - } - return true; - } - function find(menu){ - menu.children('div.menu-item').each(function(){ - var opts = $(this).data('menuitem').options; - if (fn.call(target, opts) == true){ - result = $(target).menu('getItem', this); - } else if (this.submenu && !result){ - find(this.submenu); - } - }); - } - find($(target)); - return result; - } - - function setDisabled(target, itemEl, disabled){ - var t = $(itemEl); - if (t.hasClass('menu-item')){ - var opts = t.data('menuitem').options; - opts.disabled = disabled; - if (disabled){ - t.addClass('menu-item-disabled'); - t[0].onclick = null; - } else { - t.removeClass('menu-item-disabled'); - t[0].onclick = opts.onclick; - } - } - } - - function appendItem(target, param){ - var opts = $.data(target, 'menu').options; - var menu = $(target); - if (param.parent){ - if (!param.parent.submenu){ - var submenu = $('
                                                                                                                                                                  ').appendTo('body'); - param.parent.submenu = submenu; - $('').appendTo(param.parent); - createMenu(target, submenu); - } - menu = param.parent.submenu; - } - var div = $('
                                                                                                                                                                  ').appendTo(menu); - createItem(target, div, param); - } - - function removeItem(target, itemEl){ - function removeit(el){ - if (el.submenu){ - el.submenu.children('div.menu-item').each(function(){ - removeit(this); - }); - var shadow = el.submenu[0].shadow; - if (shadow) shadow.remove(); - el.submenu.remove(); - } - $(el).remove(); - } - removeit(itemEl); - } - - function setVisible(target, itemEl, visible){ - var menu = $(itemEl).parent(); - if (visible){ - $(itemEl).show(); - } else { - $(itemEl).hide(); - } - setMenuSize(target, menu); - } - - function destroyMenu(target){ - $(target).children('div.menu-item').each(function(){ - removeItem(target, this); - }); - if (target.shadow) target.shadow.remove(); - $(target).remove(); - } - - $.fn.menu = function(options, param){ - if (typeof options == 'string'){ - return $.fn.menu.methods[options](this, param); - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'menu'); - if (state){ - $.extend(state.options, options); - } else { - state = $.data(this, 'menu', { - options: $.extend({}, $.fn.menu.defaults, $.fn.menu.parseOptions(this), options) - }); - init(this); - } - $(this).css({ - left: state.options.left, - top: state.options.top - }); - }); - }; - - $.fn.menu.methods = { - options: function(jq){ - return $.data(jq[0], 'menu').options; - }, - show: function(jq, pos){ - return jq.each(function(){ - showMenu(this, pos); - }); - }, - hide: function(jq){ - return jq.each(function(){ - hideAll(this); - }); - }, - destroy: function(jq){ - return jq.each(function(){ - destroyMenu(this); - }); - }, - /** - * set the menu item text - * param: { - * target: DOM object, indicate the menu item - * text: string, the new text - * } - */ - setText: function(jq, param){ - return jq.each(function(){ - var item = $(param.target).data('menuitem').options; - item.text = param.text; - $(param.target).children('div.menu-text').html(param.text); - }); - }, - /** - * set the menu icon class - * param: { - * target: DOM object, indicate the menu item - * iconCls: the menu item icon class - * } - */ - setIcon: function(jq, param){ - return jq.each(function(){ - var item = $(param.target).data('menuitem').options; - item.iconCls = param.iconCls; - $(param.target).children('div.menu-icon').remove(); - if (param.iconCls){ - $('').addClass(param.iconCls).appendTo(param.target); - } - }); - }, - /** - * get the menu item data that contains the following property: - * { - * target: DOM object, the menu item - * id: the menu id - * text: the menu item text - * iconCls: the icon class - * href: a remote address to redirect to - * onclick: a function to be called when the item is clicked - * } - */ - getItem: function(jq, itemEl){ - var item = $(itemEl).data('menuitem').options; - return $.extend({}, item, { - target: $(itemEl)[0] - }); - }, - findItem: function(jq, text){ - if (typeof text == 'string'){ - return findItem(jq[0], function(item){ - return $('
                                                                                                                                                                  '+item.text+'
                                                                                                                                                                  ').text() == text; - }); - } else { - return findItem(jq[0], text); - } - }, - /** - * append menu item, the param contains following properties: - * parent,id,text,iconCls,href,onclick - * when parent property is assigned, append menu item to it - */ - appendItem: function(jq, param){ - return jq.each(function(){ - appendItem(this, param); - }); - }, - removeItem: function(jq, itemEl){ - return jq.each(function(){ - removeItem(this, itemEl); - }); - }, - enableItem: function(jq, itemEl){ - return jq.each(function(){ - setDisabled(this, itemEl, false); - }); - }, - disableItem: function(jq, itemEl){ - return jq.each(function(){ - setDisabled(this, itemEl, true); - }); - }, - showItem: function(jq, itemEl){ - return jq.each(function(){ - setVisible(this, itemEl, true); - }); - }, - hideItem: function(jq, itemEl){ - return jq.each(function(){ - setVisible(this, itemEl, false); - }); - }, - resize: function(jq, menuEl){ - return jq.each(function(){ - setMenuSize(this, menuEl ? $(menuEl) : $(this)); - }); - } - }; - - $.fn.menu.parseOptions = function(target){ - return $.extend({}, $.parser.parseOptions(target, [ - {minWidth:'number',itemHeight:'number',duration:'number',hideOnUnhover:'boolean'}, - {fit:'boolean',inline:'boolean',noline:'boolean'} - ])); - }; - - $.fn.menu.defaults = { - zIndex:110000, - left: 0, - top: 0, - alignTo: null, - align: 'left', - minWidth: 150, - // itemHeight: 22, - itemHeight: 32, - duration: 100, // Defines duration time in milliseconds to hide when the mouse leaves the menu. - hideOnUnhover: true, // Automatically hides the menu when mouse exits it - inline: false, // true to stay inside its parent, false to go on top of all elements - fit: false, - noline: false, - events: { - mouseenter: mouseenterHandler, - mouseleave: mouseleaveHandler, - mouseover: mouseoverHandler, - mouseout: mouseoutHandler, - click: clickHandler - }, - position: function(target, left, top){ - return {left:left,top:top} - }, - onShow: function(){}, - onHide: function(){}, - onClick: function(item){} - }; -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.parser.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.parser.js deleted file mode 100644 index a15646346..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.parser.js +++ /dev/null @@ -1,431 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * parser - EasyUI for jQuery - * - */ - -(function($){ - $.easyui = { - /** - * Get the index of array item, return -1 when the item is not found. - */ - indexOfArray: function(a, o, id){ - for(var i=0,len=a.length; i=0; i--){ - nodes.unshift(node.children[i]); - } - } - } - } - }; - - $.parser = { - auto: true, - onComplete: function(context){}, - plugins:['draggable','droppable','resizable','pagination','tooltip', - 'linkbutton','menu','sidemenu','menubutton','splitbutton','switchbutton','progressbar', - 'tree','textbox','passwordbox','maskedbox','filebox','combo','combobox','combotree','combogrid','combotreegrid','tagbox','numberbox','validatebox','searchbox', - 'spinner','numberspinner','timespinner','datetimespinner','calendar','datebox','datetimebox','slider', - 'layout','panel','datagrid','propertygrid','treegrid','datalist','tabs','accordion','window','dialog','form' - ], - parse: function(context){ - var aa = []; - for(var i=0; i<$.parser.plugins.length; i++){ - var name = $.parser.plugins[i]; - var r = $('.easyui-' + name, context); - if (r.length){ - if (r[name]){ - r.each(function(){ - $(this)[name]($.data(this, 'options')||{}); - }); - } else { - aa.push({name:name,jq:r}); - } - } - } - if (aa.length && window.easyloader){ - var names = []; - for(var i=0; i= 0){ - v = Math.floor((parent.width()-delta) * v / 100.0); - } else { - v = Math.floor((parent.height()-delta) * v / 100.0); - } - } else { - v = parseInt(v) || undefined; - } - return v; - }, - - /** - * parse options, including standard 'data-options' attribute. - * - * calling examples: - * $.parser.parseOptions(target); - * $.parser.parseOptions(target, ['id','title','width',{fit:'boolean',border:'boolean'},{min:'number'}]); - */ - parseOptions: function(target, properties){ - var t = $(target); - var options = {}; - - var s = $.trim(t.attr('data-options')); - if (s){ - if (s.substring(0, 1) != '{'){ - s = '{' + s + '}'; - } - options = (new Function('return ' + s))(); - } - $.map(['width','height','left','top','minWidth','maxWidth','minHeight','maxHeight'], function(p){ - var pv = $.trim(target.style[p] || ''); - if (pv){ - if (pv.indexOf('%') == -1){ - pv = parseInt(pv); - if (isNaN(pv)){ - pv = undefined; - } - } - options[p] = pv; - } - }); - - if (properties){ - var opts = {}; - for(var i=0; i').appendTo('body'); - $._boxModel = d.outerWidth()!=100; - d.remove(); - d = $('
                                                                                                                                                                  ').appendTo('body'); - $._positionFixed = (d.css('position') == 'fixed'); - d.remove(); - - if (!window.easyloader && $.parser.auto){ - $.parser.parse(); - } - }); - - /** - * extend plugin to set box model width - */ - $.fn._outerWidth = function(width){ - if (width == undefined){ - if (this[0] == window){ - return this.width() || document.body.clientWidth; - } - return this.outerWidth()||0; - } - return this._size('width', width); - }; - - /** - * extend plugin to set box model height - */ - $.fn._outerHeight = function(height){ - if (height == undefined){ - if (this[0] == window){ - return this.height() || document.body.clientHeight; - } - return this.outerHeight()||0; - } - return this._size('height', height); - }; - - $.fn._scrollLeft = function(left){ - if (left == undefined){ - return this.scrollLeft(); - } else { - return this.each(function(){$(this).scrollLeft(left)}); - } - }; - - $.fn._propAttr = $.fn.prop || $.fn.attr; - - $.fn._size = function(options, parent){ - if (typeof options == 'string'){ - if (options == 'clear'){ - return this.each(function(){ - $(this).css({width:'',minWidth:'',maxWidth:'',height:'',minHeight:'',maxHeight:''}); - }); - } else if (options == 'fit'){ - return this.each(function(){ - _fit(this, this.tagName=='BODY' ? $('body') : $(this).parent(), true); - }); - } else if (options == 'unfit'){ - return this.each(function(){ - _fit(this, $(this).parent(), false); - }); - } else { - if (parent == undefined){ - return _css(this[0], options); - } else { - return this.each(function(){ - _css(this, options, parent); - }); - } - } - } else { - return this.each(function(){ - parent = parent || $(this).parent(); - $.extend(options, _fit(this, parent, options.fit)||{}); - var r1 = _setSize(this, 'width', parent, options); - var r2 = _setSize(this, 'height', parent, options); - if (r1 || r2){ - $(this).addClass('easyui-fluid'); - } else { - $(this).removeClass('easyui-fluid'); - } - }); - } - - function _fit(target, parent, fit){ - if (!parent.length){return false;} - var t = $(target)[0]; - var p = parent[0]; - var fcount = p.fcount || 0; - if (fit){ - if (!t.fitted){ - t.fitted = true; - p.fcount = fcount + 1; - $(p).addClass('panel-noscroll'); - if (p.tagName == 'BODY'){ - $('html').addClass('panel-fit'); - } - } - return { - width: ($(p).width()||1), - height: ($(p).height()||1) - }; - } else { - if (t.fitted){ - t.fitted = false; - p.fcount = fcount - 1; - if (p.fcount == 0){ - $(p).removeClass('panel-noscroll'); - if (p.tagName == 'BODY'){ - $('html').removeClass('panel-fit'); - } - } - } - return false; - } - } - function _setSize(target, property, parent, options){ - var t = $(target); - var p = property; - var p1 = p.substr(0,1).toUpperCase() + p.substr(1); - var min = $.parser.parseValue('min'+p1, options['min'+p1], parent);// || 0; - var max = $.parser.parseValue('max'+p1, options['max'+p1], parent);// || 99999; - var val = $.parser.parseValue(p, options[p], parent); - var fluid = (String(options[p]||'').indexOf('%') >= 0 ? true : false); - - if (!isNaN(val)){ - var v = Math.min(Math.max(val, min||0), max||99999); - if (!fluid){ - options[p] = v; - } - t._size('min'+p1, ''); - t._size('max'+p1, ''); - t._size(p, v); - } else { - t._size(p, ''); - t._size('min'+p1, min); - t._size('max'+p1, max); - } - return fluid || options.fit; - } - function _css(target, property, value){ - var t = $(target); - if (value == undefined){ - value = parseInt(target.style[property]); - if (isNaN(value)){return undefined;} - if ($._boxModel){ - value += getDeltaSize(); - } - return value; - } else if (value === ''){ - t.css(property, ''); - } else { - if ($._boxModel){ - value -= getDeltaSize(); - if (value < 0){value = 0;} - } - t.css(property, value+'px'); - } - function getDeltaSize(){ - if (property.toLowerCase().indexOf('width') >= 0){ - return t.outerWidth() - t.width(); - } else { - return t.outerHeight() - t.height(); - } - } - } - }; - -})(jQuery); - -/** - * support for mobile devices - */ -(function($){ - var longTouchTimer = null; - var dblTouchTimer = null; - var isDblClick = false; - - function onTouchStart(e){ - if (e.touches.length != 1){return} - if (!isDblClick){ - isDblClick = true; - dblClickTimer = setTimeout(function(){ - isDblClick = false; - }, 500); - } else { - clearTimeout(dblClickTimer); - isDblClick = false; - fire(e, 'dblclick'); -// e.preventDefault(); - } - longTouchTimer = setTimeout(function(){ - fire(e, 'contextmenu', 3); - }, 1000); - fire(e, 'mousedown'); - if ($.fn.draggable.isDragging || $.fn.resizable.isResizing){ - e.preventDefault(); - } - } - function onTouchMove(e){ - if (e.touches.length != 1){return} - if (longTouchTimer){ - clearTimeout(longTouchTimer); - } - fire(e, 'mousemove'); - if ($.fn.draggable.isDragging || $.fn.resizable.isResizing){ - e.preventDefault(); - } - } - function onTouchEnd(e){ -// if (e.touches.length > 0){return} - if (longTouchTimer){ - clearTimeout(longTouchTimer); - } - fire(e, 'mouseup'); - if ($.fn.draggable.isDragging || $.fn.resizable.isResizing){ - e.preventDefault(); - } - } - - function fire(e, name, which){ - var event = new $.Event(name); - event.pageX = e.changedTouches[0].pageX; - event.pageY = e.changedTouches[0].pageY; - event.which = which || 1; - $(e.target).trigger(event); - } - - if (document.addEventListener){ - document.addEventListener("touchstart", onTouchStart, true); - document.addEventListener("touchmove", onTouchMove, true); - document.addEventListener("touchend", onTouchEnd, true); - } -})(jQuery); - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.progressbar.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.progressbar.js deleted file mode 100644 index d9e644cab..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.progressbar.js +++ /dev/null @@ -1,107 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * progressbar - EasyUI for jQuery - * - * Dependencies: - * none - * - */ -(function($){ - function init(target){ - $(target).addClass('progressbar'); - $(target).html('
                                                                                                                                                                  '); - $(target).bind('_resize', function(e,force){ - if ($(this).hasClass('easyui-fluid') || force){ - setSize(target); - } - return false; - }); - return $(target); - } - - function setSize(target,width){ - var opts = $.data(target, 'progressbar').options; - var bar = $.data(target, 'progressbar').bar; - if (width) opts.width = width; - bar._size(opts); - - bar.find('div.progressbar-text').css('width', bar.width()); - bar.find('div.progressbar-text,div.progressbar-value').css({ - height: bar.height()+'px', - lineHeight: bar.height()+'px' - }); - } - - $.fn.progressbar = function(options, param){ - if (typeof options == 'string'){ - var method = $.fn.progressbar.methods[options]; - if (method){ - return method(this, param); - } - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'progressbar'); - if (state){ - $.extend(state.options, options); - } else { - state = $.data(this, 'progressbar', { - options: $.extend({}, $.fn.progressbar.defaults, $.fn.progressbar.parseOptions(this), options), - bar: init(this) - }); - } - $(this).progressbar('setValue', state.options.value); - setSize(this); - }); - }; - - $.fn.progressbar.methods = { - options: function(jq){ - return $.data(jq[0], 'progressbar').options; - }, - resize: function(jq, width){ - return jq.each(function(){ - setSize(this, width); - }); - }, - getValue: function(jq){ - return $.data(jq[0], 'progressbar').options.value; - }, - setValue: function(jq, value){ - if (value < 0) value = 0; - if (value > 100) value = 100; - return jq.each(function(){ - var opts = $.data(this, 'progressbar').options; - var text = opts.text.replace(/{value}/, value); - var oldValue = opts.value; - opts.value = value; - $(this).find('div.progressbar-value').width(value+'%'); - $(this).find('div.progressbar-text').html(text); - if (oldValue != value){ - opts.onChange.call(this, value, oldValue); - } - }); - } - }; - - $.fn.progressbar.parseOptions = function(target){ - return $.extend({}, $.parser.parseOptions(target, ['width','height','text',{value:'number'}])); - }; - - $.fn.progressbar.defaults = { - width: 'auto', - height: 22, - value: 0, // percentage value - text: '{value}%', - onChange:function(newValue,oldValue){} - }; -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.propertygrid.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.propertygrid.js deleted file mode 100644 index 508a223ce..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.propertygrid.js +++ /dev/null @@ -1,525 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * propertygrid - EasyUI for jQuery - * - * Dependencies: - * datagrid - * - */ -(function($){ - var currTarget; - $(document).unbind('.propertygrid').bind('mousedown.propertygrid', function(e){ - var p = $(e.target).closest('div.datagrid-view,div.combo-panel'); - if (p.length){return;} - stopEditing(currTarget); - currTarget = undefined; - }); - - function buildGrid(target){ - var state = $.data(target, 'propertygrid'); - var opts = $.data(target, 'propertygrid').options; - $(target).datagrid($.extend({}, opts, { - cls:'propertygrid', - view:(opts.showGroup ? opts.groupView : opts.view), - onBeforeEdit:function(index, row){ - if (opts.onBeforeEdit.call(target, index, row) == false){return false;} - var dg = $(this); - var row = dg.datagrid('getRows')[index]; - var col = dg.datagrid('getColumnOption', 'value'); - col.editor = row.editor; - }, - onClickCell:function(index, field, value){ - if (currTarget != this){ - stopEditing(currTarget); - currTarget = this; - } - if (opts.editIndex != index){ - stopEditing(currTarget); - $(this).datagrid('beginEdit', index); - var ed = $(this).datagrid('getEditor', {index:index,field:field}); - if (!ed){ - ed = $(this).datagrid('getEditor', {index:index,field:'value'}); - } - if (ed){ - var t = $(ed.target); - var input = t.data('textbox') ? t.textbox('textbox') : t; - input.focus(); - opts.editIndex = index; - } - } - opts.onClickCell.call(target, index, field, value); - }, - loadFilter:function(data){ - stopEditing(this); - return opts.loadFilter.call(this, data); - } - })); - } - - function stopEditing(target){ - var t = $(target); - if (!t.length){return} - var opts = $.data(target, 'propertygrid').options; - opts.finder.getTr(target, null, 'editing').each(function(){ - var index = parseInt($(this).attr('datagrid-row-index')); - if (t.datagrid('validateRow', index)){ - t.datagrid('endEdit', index); - } else { - t.datagrid('cancelEdit', index); - } - }); - opts.editIndex = undefined; - } - - $.fn.propertygrid = function(options, param){ - if (typeof options == 'string'){ - var method = $.fn.propertygrid.methods[options]; - if (method){ - return method(this, param); - } else { - return this.datagrid(options, param); - } - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'propertygrid'); - if (state){ - $.extend(state.options, options); - } else { - var opts = $.extend({}, $.fn.propertygrid.defaults, $.fn.propertygrid.parseOptions(this), options); - opts.frozenColumns = $.extend(true, [], opts.frozenColumns); - opts.columns = $.extend(true, [], opts.columns); - $.data(this, 'propertygrid', { - options: opts - }); - } - buildGrid(this); - }); - } - - $.fn.propertygrid.methods = { - options: function(jq){ - return $.data(jq[0], 'propertygrid').options; - } - }; - - $.fn.propertygrid.parseOptions = function(target){ - return $.extend({}, $.fn.datagrid.parseOptions(target), $.parser.parseOptions(target,[{showGroup:'boolean'}])); - }; - - // the group view definition - var groupview = $.extend({}, $.fn.datagrid.defaults.view, { - render: function(target, container, frozen){ - var table = []; - var groups = this.groups; - for(var i=0; i'); - if ((frozen && (opts.rownumbers || opts.frozenColumns.length)) || - (!frozen && !(opts.rownumbers || opts.frozenColumns.length))){ - table.push(''); - table.push(' '); - table.push(''); - } - if ((frozen && hasFrozen) || (!frozen)){ - table.push(''); - table.push(opts.groupFormatter.call(target, group.value, group.rows)); - table.push(''); - } - table.push(''); - - table.push(''); - var index = group.startIndex; - for(var j=0; j'); - table.push(this.renderRow.call(this, target, fields, frozen, index, group.rows[j])); - table.push(''); - index++; - } - table.push('
                                                                                                                                                                  '); - return table.join(''); - - function parseCss(css, cls){ - var classValue = ''; - var styleValue = ''; - if (typeof css == 'string'){ - styleValue = css; - } else if (css){ - classValue = css['class'] || ''; - styleValue = css['style'] || ''; - } - return 'class="' + cls + (classValue ? ' '+classValue : '') + '" ' + - 'style="' + styleValue + '"'; - } - }, - - bindEvents: function(target){ - var state = $.data(target, 'datagrid'); - var dc = state.dc; - var body = dc.body1.add(dc.body2); - var clickHandler = ($.data(body[0],'events')||$._data(body[0],'events')).click[0].handler; - body.unbind('click').bind('click', function(e){ - var tt = $(e.target); - var expander = tt.closest('span.datagrid-row-expander'); - if (expander.length){ - var gindex = expander.closest('div.datagrid-group').attr('group-index'); - if (expander.hasClass('datagrid-row-collapse')){ - $(target).datagrid('collapseGroup', gindex); - } else { - $(target).datagrid('expandGroup', gindex); - } - } else { - clickHandler(e); - } - e.stopPropagation(); - }); - }, - - onBeforeRender: function(target, rows){ - var state = $.data(target, 'datagrid'); - var opts = state.options; - - initCss(); - - var groups = []; - for(var i=0; i' + - '.datagrid-group{height:'+opts.groupHeight+'px;overflow:hidden;font-weight:bold;border-bottom:1px solid #ccc;white-space:nowrap;word-break:normal;}' + - '.datagrid-group-title,.datagrid-group-expander{display:inline-block;vertical-align:bottom;height:100%;line-height:'+opts.groupHeight+'px;padding:0 4px;}' + - '.datagrid-group-title{position:relative;}' + - '.datagrid-group-expander{width:'+opts.expanderWidth+'px;text-align:center;padding:0}' + - '.datagrid-row-expander{margin:'+Math.floor((opts.groupHeight-16)/2)+'px 0;display:inline-block;width:16px;height:16px;cursor:pointer}' + - '' - ); - } - } - }, - onAfterRender: function(target){ - $.fn.datagrid.defaults.view.onAfterRender.call(this, target); - - var view = this; - var state = $.data(target, 'datagrid'); - var opts = state.options; - if (!state.onResizeColumn){ - state.onResizeColumn = opts.onResizeColumn; - } - if (!state.onResize){ - state.onResize = opts.onResize; - } - opts.onResizeColumn = function(field, width){ - view.resizeGroup(target); - state.onResizeColumn.call(target, field, width); - } - opts.onResize = function(width, height){ - view.resizeGroup(target); - state.onResize.call($(target).datagrid('getPanel')[0], width, height); - } - view.resizeGroup(target); - } - }); - - $.extend($.fn.datagrid.methods, { - groups:function(jq){ - return jq.datagrid('options').view.groups; - }, - expandGroup:function(jq, groupIndex){ - return jq.each(function(){ - var opts = $(this).datagrid('options'); - var view = $.data(this, 'datagrid').dc.view; - var group = view.find(groupIndex!=undefined ? 'div.datagrid-group[group-index="'+groupIndex+'"]' : 'div.datagrid-group'); - var expander = group.find('span.datagrid-row-expander'); - if (expander.hasClass('datagrid-row-expand')){ - expander.removeClass('datagrid-row-expand').addClass('datagrid-row-collapse'); - group.next('table').show(); - } - $(this).datagrid('fixRowHeight'); - if (opts.onExpandGroup){ - opts.onExpandGroup.call(this, groupIndex); - } - }); - }, - collapseGroup:function(jq, groupIndex){ - return jq.each(function(){ - var opts = $(this).datagrid('options'); - var view = $.data(this, 'datagrid').dc.view; - var group = view.find(groupIndex!=undefined ? 'div.datagrid-group[group-index="'+groupIndex+'"]' : 'div.datagrid-group'); - var expander = group.find('span.datagrid-row-expander'); - if (expander.hasClass('datagrid-row-collapse')){ - expander.removeClass('datagrid-row-collapse').addClass('datagrid-row-expand'); - group.next('table').hide(); - } - $(this).datagrid('fixRowHeight'); - if (opts.onCollapseGroup){ - opts.onCollapseGroup.call(this, groupIndex); - } - }); - }, - scrollToGroup: function(jq, groupIndex){ - return jq.each(function(){ - var state = $.data(this, 'datagrid'); - var dc = state.dc; - var grow = dc.body2.children('div.datagrid-group[group-index="'+groupIndex+'"]'); - if (grow.length){ - var groupHeight = grow.outerHeight(); - var headerHeight = dc.view2.children('div.datagrid-header')._outerHeight(); - var frozenHeight = dc.body2.outerHeight(true) - dc.body2.outerHeight(); - var top = grow.position().top - headerHeight - frozenHeight; - if (top < 0){ - dc.body2.scrollTop(dc.body2.scrollTop() + top); - } else if (top + groupHeight > dc.body2.height() - 18){ - dc.body2.scrollTop(dc.body2.scrollTop() + top + groupHeight - dc.body2.height() + 18); - } - } - }); - } - }); - - $.extend(groupview, { - refreshGroupTitle: function(target, groupIndex){ - var state = $.data(target, 'datagrid'); - var opts = state.options; - var dc = state.dc; - var group = this.groups[groupIndex]; - var span = dc.body1.add(dc.body2).children('div.datagrid-group[group-index=' + groupIndex + ']').find('span.datagrid-group-title'); - span.html(opts.groupFormatter.call(target, group.value, group.rows)); - }, - resizeGroup: function(target, groupIndex){ - var state = $.data(target, 'datagrid'); - var dc = state.dc; - var ht = dc.header2.find('table'); - var fr = ht.find('tr.datagrid-filter-row').hide(); - var ww = ht.width(); - if (groupIndex == undefined){ - var groupHeader = dc.body2.children('div.datagrid-group'); - } else { - var groupHeader = dc.body2.children('div.datagrid-group[group-index=' + groupIndex + ']'); - } - groupHeader._outerWidth(ww); - var opts = state.options; - if (opts.frozenColumns && opts.frozenColumns.length){ - var width = dc.view1.width() - opts.expanderWidth; - var isRtl = dc.view1.css('direction').toLowerCase()=='rtl'; - groupHeader.find('.datagrid-group-title').css(isRtl?'right':'left', -width+'px'); - } - if (fr.length){ - if (opts.showFilterBar){ - fr.show(); - } - } - // fr.show(); - }, - - insertRow: function(target, index, row){ - var state = $.data(target, 'datagrid'); - var opts = state.options; - var dc = state.dc; - var group = null; - var groupIndex; - - if (!state.data.rows.length){ - $(target).datagrid('loadData', [row]); - return; - } - - for(var i=0; i group.startIndex + group.rows.length){ - index = group.startIndex + group.rows.length; - } - $.fn.datagrid.defaults.view.insertRow.call(this, target, index, row); - - if (index >= group.startIndex + group.rows.length){ - _moveTr(index, true); - _moveTr(index, false); - } - group.rows.splice(index - group.startIndex, 0, row); - } else { - group = { - value: row[opts.groupField], - rows: [row], - startIndex: state.data.rows.length - } - groupIndex = this.groups.length; - dc.body1.append(this.renderGroup.call(this, target, groupIndex, group, true)); - dc.body2.append(this.renderGroup.call(this, target, groupIndex, group, false)); - this.groups.push(group); - state.data.rows.push(row); - } - - this.setGroupIndex(target); - this.refreshGroupTitle(target, groupIndex); - this.resizeGroup(target); - - function _moveTr(index,frozen){ - var serno = frozen?1:2; - var prevTr = opts.finder.getTr(target, index-1, 'body', serno); - var tr = opts.finder.getTr(target, index, 'body', serno); - tr.insertAfter(prevTr); - } - }, - - updateRow: function(target, index, row){ - var opts = $.data(target, 'datagrid').options; - $.fn.datagrid.defaults.view.updateRow.call(this, target, index, row); - var tb = opts.finder.getTr(target, index, 'body', 2).closest('table.datagrid-btable'); - var groupIndex = parseInt(tb.prev().attr('group-index')); - this.refreshGroupTitle(target, groupIndex); - }, - - deleteRow: function(target, index){ - var state = $.data(target, 'datagrid'); - var opts = state.options; - var dc = state.dc; - var body = dc.body1.add(dc.body2); - - var tb = opts.finder.getTr(target, index, 'body', 2).closest('table.datagrid-btable'); - var groupIndex = parseInt(tb.prev().attr('group-index')); - - $.fn.datagrid.defaults.view.deleteRow.call(this, target, index); - - var group = this.groups[groupIndex]; - if (group.rows.length > 1){ - group.rows.splice(index-group.startIndex, 1); - this.refreshGroupTitle(target, groupIndex); - } else { - body.children('div.datagrid-group[group-index='+groupIndex+']').remove(); - for(var i=groupIndex+1; i offset.top && e.pageY < offset.top + edge) { - dir += 'n'; - } else if (e.pageY < offset.top + height && e.pageY > offset.top + height - edge) { - dir += 's'; - } - if (e.pageX > offset.left && e.pageX < offset.left + edge) { - dir += 'w'; - } else if (e.pageX < offset.left + width && e.pageX > offset.left + width - edge) { - dir += 'e'; - } - - var handles = opts.handles.split(','); - handles = $.map(handles, function(h){return $.trim(h).toLowerCase();}); - if ($.inArray('all', handles) >= 0 || $.inArray(dir, handles) >= 0){ - return dir; - } - for(var i=0; i= 0){ - return handles[index]; - } - } - return ''; - } - - $.fn.resizable = function(options, param){ - if (typeof options == 'string'){ - return $.fn.resizable.methods[options](this, param); - } - - return this.each(function(){ - var opts = null; - var state = $.data(this, 'resizable'); - if (state) { - $(this).unbind('.resizable'); - opts = $.extend(state.options, options || {}); - } else { - opts = $.extend({}, $.fn.resizable.defaults, $.fn.resizable.parseOptions(this), options || {}); - $.data(this, 'resizable', { - options:opts - }); - } - - if (opts.disabled == true) { - return; - } - $(this).bind('mousemove.resizable', {target:this}, function(e){ - if ($.fn.resizable.isResizing){return} - var dir = getDirection(e); - $(e.data.target).css('cursor', dir ? dir+'-resize' : ''); - }).bind('mouseleave.resizable', {target:this}, function(e){ - $(e.data.target).css('cursor', ''); - }).bind('mousedown.resizable', {target:this}, function(e){ - var dir = getDirection(e); - if (dir == ''){return;} - - function getCssValue(css) { - var val = parseInt($(e.data.target).css(css)); - if (isNaN(val)) { - return 0; - } else { - return val; - } - } - - var data = { - target: e.data.target, - dir: dir, - startLeft: getCssValue('left'), - startTop: getCssValue('top'), - left: getCssValue('left'), - top: getCssValue('top'), - startX: e.pageX, - startY: e.pageY, - startWidth: $(e.data.target).outerWidth(), - startHeight: $(e.data.target).outerHeight(), - width: $(e.data.target).outerWidth(), - height: $(e.data.target).outerHeight(), - deltaWidth: $(e.data.target).outerWidth() - $(e.data.target).width(), - deltaHeight: $(e.data.target).outerHeight() - $(e.data.target).height() - }; - $(document).bind('mousedown.resizable', data, doDown); - $(document).bind('mousemove.resizable', data, doMove); - $(document).bind('mouseup.resizable', data, doUp); - $('body').css('cursor', dir+'-resize'); - }); - }); - }; - - $.fn.resizable.methods = { - options: function(jq){ - return $.data(jq[0], 'resizable').options; - }, - enable: function(jq){ - return jq.each(function(){ - $(this).resizable({disabled:false}); - }); - }, - disable: function(jq){ - return jq.each(function(){ - $(this).resizable({disabled:true}); - }); - } - }; - - $.fn.resizable.parseOptions = function(target){ - var t = $(target); - return $.extend({}, - $.parser.parseOptions(target, [ - 'handles',{minWidth:'number',minHeight:'number',maxWidth:'number',maxHeight:'number',edge:'number'} - ]), { - disabled: (t.attr('disabled') ? true : undefined) - }) - }; - - $.fn.resizable.defaults = { - disabled:false, - handles:'n, e, s, w, ne, se, sw, nw, all', - minWidth: 10, - minHeight: 10, - maxWidth: 10000,//$(document).width(), - maxHeight: 10000,//$(document).height(), - edge:5, - onStartResize: function(e){}, - onResize: function(e){}, - onStopResize: function(e){} - }; - - $.fn.resizable.isResizing = false; - -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.slider.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.slider.js deleted file mode 100644 index dc9b8142e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.slider.js +++ /dev/null @@ -1,455 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * slider - EasyUI for jQuery - * - * Dependencies: - * draggable - * - */ -(function($){ - function init(target){ - var slider = $('
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '' + - '' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '
                                                                                                                                                                  ' + - '' + - '
                                                                                                                                                                  ').insertAfter(target); - var t = $(target); - t.addClass('slider-f').hide(); - var name = t.attr('name'); - if (name){ - slider.find('input.slider-value').attr('name', name); - t.removeAttr('name').attr('sliderName', name); - } - slider.bind('_resize', function(e,force){ - if ($(this).hasClass('easyui-fluid') || force){ - setSize(target); - } - return false; - }); - return slider; - } - - /** - * set the slider size, for vertical slider, the height property is required - */ - function setSize(target, param){ - var state = $.data(target, 'slider'); - var opts = state.options; - var slider = state.slider; - - if (param){ - if (param.width) opts.width = param.width; - if (param.height) opts.height = param.height; - } - slider._size(opts); - if (opts.mode == 'h'){ - slider.css('height', ''); - slider.children('div').css('height', ''); - } else { - slider.css('width', ''); - slider.children('div').css('width', ''); - slider.children('div.slider-rule,div.slider-rulelabel,div.slider-inner')._outerHeight(slider._outerHeight()); - } - initValue(target); - } - - /** - * show slider rule if needed - */ - function showRule(target){ - var state = $.data(target, 'slider'); - var opts = state.options; - var slider = state.slider; - - var aa = opts.mode == 'h' ? opts.rule : opts.rule.slice(0).reverse(); - if (opts.reversed){ - aa = aa.slice(0).reverse(); - } - _build(aa); - - function _build(aa){ - var rule = slider.find('div.slider-rule'); - var label = slider.find('div.slider-rulelabel'); - rule.empty(); - label.empty(); - for(var i=0; i').appendTo(rule); - span.css((opts.mode=='h'?'left':'top'), distance); - - // show the labels - if (aa[i] != '|'){ - span = $('').appendTo(label); - span.html(aa[i]); - if (opts.mode == 'h'){ - span.css({ - left: distance, - marginLeft: -Math.round(span.outerWidth()/2) - }); - } else { - span.css({ - top: distance, - marginTop: -Math.round(span.outerHeight()/2) - }); - } - } - } - } - } - - /** - * build the slider and set some properties - */ - function buildSlider(target){ - var state = $.data(target, 'slider'); - var opts = state.options; - var slider = state.slider; - - slider.removeClass('slider-h slider-v slider-disabled'); - slider.addClass(opts.mode == 'h' ? 'slider-h' : 'slider-v'); - slider.addClass(opts.disabled ? 'slider-disabled' : ''); - - var inner = slider.find('.slider-inner'); - inner.html( - '' + - '' - ); - if (opts.range){ - inner.append( - '' + - '' - ); - } - - slider.find('a.slider-handle').draggable({ - axis:opts.mode, - cursor:'pointer', - disabled: opts.disabled, - onDrag:function(e){ - var left = e.data.left; - var width = slider.width(); - if (opts.mode!='h'){ - left = e.data.top; - width = slider.height(); - } - if (left < 0 || left > width) { - return false; - } else { - setPos(left, this); - return false; - } - }, - onStartDrag:function(){ - state.isDragging = true; - opts.onSlideStart.call(target, opts.value); - }, - onStopDrag:function(e){ - setPos(opts.mode=='h'?e.data.left:e.data.top, this); - opts.onSlideEnd.call(target, opts.value); - opts.onComplete.call(target, opts.value); - state.isDragging = false; - } - }); - slider.find('div.slider-inner').unbind('.slider').bind('mousedown.slider', function(e){ - if (state.isDragging || opts.disabled){return} - var pos = $(this).offset(); - setPos(opts.mode=='h'?(e.pageX-pos.left):(e.pageY-pos.top)); - opts.onComplete.call(target, opts.value); - }); - - function fixVal(value){ - var dd = String(opts.step).split('.'); - var dlen = dd.length>1 ? dd[1].length : 0; - return parseFloat(value.toFixed(dlen)); - } - - function setPos(pos, handle){ - var value = pos2value(target, pos); - var s = Math.abs(value % opts.step); - if (s < opts.step/2){ - value -= s; - } else { - value = value - s + opts.step; - } - value = fixVal(value); - if (opts.range){ - var v1 = opts.value[0]; - var v2 = opts.value[1]; - var m = parseFloat((v1+v2)/2); - if (handle){ - var isLeft = $(handle).nextAll('.slider-handle').length > 0; - if (value <= v2 && isLeft){ - v1 = value; - } else if (value >= v1 && (!isLeft)){ - v2 = value; - } - } else { - if (value < v1){ - v1 = value; - } else if (value > v2){ - v2 = value; - } else { - value < m ? v1 = value : v2 = value; - } - } - $(target).slider('setValues', [v1,v2]); - } else { - $(target).slider('setValue', value); - } - } - } - - /** - * set a specified value to slider - */ - function setValues(target, values){ - var state = $.data(target, 'slider'); - var opts = state.options; - var slider = state.slider; - var oldValues = $.isArray(opts.value) ? opts.value : [opts.value]; - var newValues = []; - - if (!$.isArray(values)){ - values = $.map(String(values).split(opts.separator), function(v){ - return parseFloat(v); - }); - } - - slider.find('.slider-value').remove(); - var name = $(target).attr('sliderName') || ''; - for(var i=0; i opts.max) value = opts.max; - - var input = $('').appendTo(slider); - input.attr('name', name); - input.val(value); - newValues.push(value); - - var handle = slider.find('.slider-handle:eq('+i+')'); - var tip = handle.next(); - var pos = value2pos(target, value); - if (opts.showTip){ - tip.show(); - tip.html(opts.tipFormatter.call(target, value)); - } else { - tip.hide(); - } - - if (opts.mode == 'h'){ - var style = 'left:'+pos+'px;'; - handle.attr('style', style); - tip.attr('style', style + 'margin-left:' + (-Math.round(tip.outerWidth()/2)) + 'px'); - } else { - var style = 'top:' + pos + 'px;'; - handle.attr('style', style); - tip.attr('style', style + 'margin-left:' + (-Math.round(tip.outerWidth())) + 'px'); - } - } - opts.value = opts.range ? newValues : newValues[0]; - $(target).val(opts.range ? newValues.join(opts.separator) : newValues[0]); - - if (oldValues.join(',') != newValues.join(',')){ - opts.onChange.call(target, opts.value, (opts.range?oldValues:oldValues[0])); - } - } - - function initValue(target){ - var opts = $.data(target, 'slider').options; - var fn = opts.onChange; - opts.onChange = function(){}; - setValues(target, opts.value); - opts.onChange = fn; - } - - /** - * translate value to slider position - */ - function value2pos(target, value){ - var state = $.data(target, 'slider'); - var opts = state.options; - var slider = state.slider; - var size = opts.mode == 'h' ? slider.width() : slider.height(); - var pos = opts.converter.toPosition.call(target, value, size); - if (opts.mode == 'v'){ - pos = slider.height() - pos; - } - if (opts.reversed){ - pos = size - pos; - } - return pos; - // return pos.toFixed(0); - } - - /** - * translate slider position to value - */ - function pos2value(target, pos){ - var state = $.data(target, 'slider'); - var opts = state.options; - var slider = state.slider; - var size = opts.mode == 'h' ? slider.width() : slider.height(); - var pos = opts.mode=='h' ? (opts.reversed?(size-pos):pos) : (opts.reversed?pos:(size-pos)); - var value = opts.converter.toValue.call(target, pos, size); - return value; - // return value.toFixed(0); - } - - $.fn.slider = function(options, param){ - if (typeof options == 'string'){ - return $.fn.slider.methods[options](this, param); - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'slider'); - if (state){ - $.extend(state.options, options); - } else { - state = $.data(this, 'slider', { - options: $.extend({}, $.fn.slider.defaults, $.fn.slider.parseOptions(this), options), - slider: init(this) - }); - // $(this).removeAttr('disabled'); - $(this)._propAttr('disabled', false); - } - - var opts = state.options; - opts.min = parseFloat(opts.min); - opts.max = parseFloat(opts.max); - if (opts.range){ - if (!$.isArray(opts.value)){ - opts.value = $.map(String(opts.value).split(opts.separator), function(v){ - return parseFloat(v); - }); - } - if (opts.value.length < 2){ - opts.value.push(opts.max); - } - } else { - opts.value = parseFloat(opts.value); - } - opts.step = parseFloat(opts.step); - opts.originalValue = opts.value; - - buildSlider(this); - showRule(this); - setSize(this); - }); - }; - - $.fn.slider.methods = { - options: function(jq){ - return $.data(jq[0], 'slider').options; - }, - destroy: function(jq){ - return jq.each(function(){ - $.data(this, 'slider').slider.remove(); - $(this).remove(); - }); - }, - resize: function(jq, param){ - return jq.each(function(){ - setSize(this, param); - }); - }, - getValue: function(jq){ - return jq.slider('options').value; - }, - getValues: function(jq){ - return jq.slider('options').value; - }, - setValue: function(jq, value){ - return jq.each(function(){ - setValues(this, [value]); - }); - }, - setValues: function(jq, values){ - return jq.each(function(){ - setValues(this, values); - }); - }, - clear: function(jq){ - return jq.each(function(){ - var opts = $(this).slider('options'); - setValues(this, opts.range?[opts.min,opts.max]:[opts.min]); - }); - }, - reset: function(jq){ - return jq.each(function(){ - var opts = $(this).slider('options'); - $(this).slider(opts.range?'setValues':'setValue', opts.originalValue); - }); - }, - enable: function(jq){ - return jq.each(function(){ - $.data(this, 'slider').options.disabled = false; - buildSlider(this); - }); - }, - disable: function(jq){ - return jq.each(function(){ - $.data(this, 'slider').options.disabled = true; - buildSlider(this); - }); - } - }; - - $.fn.slider.parseOptions = function(target){ - var t = $(target); - return $.extend({}, $.parser.parseOptions(target, [ - 'width','height','mode',{reversed:'boolean',showTip:'boolean',range:'boolean',min:'number',max:'number',step:'number'} - ]), { - value: (t.val() || undefined), - disabled: (t.attr('disabled') ? true : undefined), - rule: (t.attr('rule') ? eval(t.attr('rule')) : undefined) - }); - }; - - $.fn.slider.defaults = { - width: 'auto', - height: 'auto', - mode: 'h', // 'h'(horizontal) or 'v'(vertical) - reversed: false, - showTip: false, - disabled: false, - range: false, - value: 0, - separator: ',', - min: 0, - max: 100, - step: 1, - rule: [], // [0,'|',100] - tipFormatter: function(value){return value}, - converter:{ - toPosition:function(value, size){ - var opts = $(this).slider('options'); - var p = (value-opts.min)/(opts.max-opts.min)*size; - return p; - }, - toValue:function(pos, size){ - var opts = $(this).slider('options'); - var v = opts.min + (opts.max-opts.min)*(pos/size); - return v; - } - }, - onChange: function(value, oldValue){}, - onSlideStart: function(value){}, - onSlideEnd: function(value){}, - onComplete: function(value){} - }; -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.tabs.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.tabs.js deleted file mode 100644 index 1037a23fb..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.tabs.js +++ /dev/null @@ -1,927 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * tabs - EasyUI for jQuery - * - * Dependencies: - * panel - * linkbutton - * - */ -(function($){ - function getContentWidth(c){ - var w = 0; - $(c).children().each(function(){ - w += $(this).outerWidth(true); - }); - return w; - } - /** - * set the tabs scrollers to show or not, - * dependent on the tabs count and width - */ - function setScrollers(container) { - var opts = $.data(container, 'tabs').options; - if (!opts.showHeader){return} - - var header = $(container).children('div.tabs-header'); - var tool = header.children('div.tabs-tool:not(.tabs-tool-hidden)'); - var sLeft = header.children('div.tabs-scroller-left'); - var sRight = header.children('div.tabs-scroller-right'); - var wrap = header.children('div.tabs-wrap'); - - if (opts.tabPosition == 'left' || opts.tabPosition == 'right'){ - if (!tool.length){return} - tool._outerWidth(header.width()); - var toolCss = { - left: opts.tabPosition == 'left' ? 'auto':0, - right: opts.tabPosition == 'left' ? 0 : 'auto', - top: opts.toolPosition == 'top' ? 0 : 'auto', - bottom: opts.toolPosition == 'top' ? 'auto' : 0 - }; - var wrapCss = { - marginTop: opts.toolPosition == 'top' ? tool.outerHeight() : 0 - }; - tool.css(toolCss); - wrap.css(wrapCss); - return; - } - - // set the tool height - var tHeight = header.outerHeight(); - if (opts.plain){ - tHeight -= tHeight - header.height(); - } - tool._outerHeight(tHeight); - - var tabsWidth = getContentWidth(header.find('ul.tabs')); - var cWidth = header.width() - tool._outerWidth(); - - if (tabsWidth > cWidth) { - sLeft.add(sRight).show()._outerHeight(tHeight); - if (opts.toolPosition == 'left'){ - tool.css({ - left: sLeft.outerWidth(), - right: '' - }); - wrap.css({ - marginLeft: sLeft.outerWidth() + tool._outerWidth(), - marginRight: sRight._outerWidth(), - width: cWidth - sLeft.outerWidth() - sRight.outerWidth() - }); - } else { - tool.css({ - left: '', - right: sRight.outerWidth() - }); - wrap.css({ - marginLeft: sLeft.outerWidth(), - marginRight: sRight.outerWidth() + tool._outerWidth(), - width: cWidth - sLeft.outerWidth() - sRight.outerWidth() - }); - } - } else { - sLeft.add(sRight).hide(); - if (opts.toolPosition == 'left'){ - tool.css({ - left: 0, - right: '' - }); - wrap.css({ - marginLeft: tool._outerWidth(), - marginRight: 0, - width: cWidth - }); - } else { - tool.css({ - left: '', - right: 0 - }); - wrap.css({ - marginLeft: 0, - marginRight: tool._outerWidth(), - width: cWidth - }); - } - } - } - - function addTools(container){ - var opts = $.data(container, 'tabs').options; - var header = $(container).children('div.tabs-header'); - if (opts.tools) { - if (typeof opts.tools == 'string'){ - $(opts.tools).addClass('tabs-tool').appendTo(header); - $(opts.tools).show(); - } else { - header.children('div.tabs-tool').remove(); - var tools = $('
                                                                                                                                                                  ').appendTo(header); - var tr = tools.find('tr'); - for(var i=0; i').appendTo(tr); - var tool = $('').appendTo(td); - tool[0].onclick = eval(opts.tools[i].handler || function(){}); - tool.linkbutton($.extend({}, opts.tools[i], { - plain: true - })); - } - } - } else { - header.children('div.tabs-tool').remove(); - } - } - - function setSize(container, param) { - var state = $.data(container, 'tabs'); - var opts = state.options; - var cc = $(container); - - if (!opts.doSize){return} - if (param){ - $.extend(opts, { - width: param.width, - height: param.height - }); - } - cc._size(opts); - - var header = cc.children('div.tabs-header'); - var panels = cc.children('div.tabs-panels'); - var wrap = header.find('div.tabs-wrap'); - var ul = wrap.find('.tabs'); - ul.children('li').removeClass('tabs-first tabs-last'); - ul.children('li:first').addClass('tabs-first'); - ul.children('li:last').addClass('tabs-last'); - - if (opts.tabPosition == 'left' || opts.tabPosition == 'right'){ - header._outerWidth(opts.showHeader ? opts.headerWidth : 0); - panels._outerWidth(cc.width() - header.outerWidth()); - header.add(panels)._size('height', isNaN(parseInt(opts.height)) ? '' : cc.height()); - wrap._outerWidth(header.width()); - ul._outerWidth(wrap.width()).css('height',''); - } else { - header.children('div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)').css('display', opts.showHeader?'block':'none'); - header._outerWidth(cc.width()).css('height',''); - if (opts.showHeader){ - header.css('background-color',''); - wrap.css('height',''); - } else { - header.css('background-color','transparent'); - header._outerHeight(0); - wrap._outerHeight(0); - } - ul._outerHeight(opts.tabHeight).css('width',''); - ul._outerHeight(ul.outerHeight()-ul.height()-1+opts.tabHeight).css('width',''); - - panels._size('height', isNaN(parseInt(opts.height)) ? '' : (cc.height()-header.outerHeight())); - panels._size('width', cc.width()); - } - - if (state.tabs.length){ - var d1 = ul.outerWidth(true) - ul.width(); - var li = ul.children('li:first'); - var d2 = li.outerWidth(true) - li.width(); - var hwidth = header.width() - header.children('.tabs-tool:not(.tabs-tool-hidden)')._outerWidth(); - var justifiedWidth = Math.floor((hwidth-d1-d2*state.tabs.length)/state.tabs.length); - - $.map(state.tabs, function(p){ - setTabSize(p, (opts.justified && $.inArray(opts.tabPosition,['top','bottom'])>=0) ? justifiedWidth : undefined); - }); - if (opts.justified && $.inArray(opts.tabPosition,['top','bottom'])>=0){ - var deltaWidth = hwidth - d1 - getContentWidth(ul); - setTabSize(state.tabs[state.tabs.length-1], justifiedWidth+deltaWidth); - } - } - setScrollers(container); - - function setTabSize(p, width){ - var p_opts = p.panel('options'); - var p_t = p_opts.tab.find('a.tabs-inner'); - var width = width ? width : (parseInt(p_opts.tabWidth||opts.tabWidth||undefined)); - if (width){ - p_t._outerWidth(width); - } else { - p_t.css('width', ''); - } - p_t._outerHeight(opts.tabHeight); - p_t.css('lineHeight', p_t.height()+'px'); - p_t.find('.easyui-fluid:visible').triggerHandler('_resize'); - } - } - - /** - * set selected tab panel size - */ - function setSelectedSize(container){ - var opts = $.data(container, 'tabs').options; - var tab = getSelectedTab(container); - if (tab){ - var panels = $(container).children('div.tabs-panels'); - var width = opts.width=='auto' ? 'auto' : panels.width(); - var height = opts.height=='auto' ? 'auto' : panels.height(); - tab.panel('resize', { - width: width, - height: height - }); - } - } - - /** - * wrap the tabs header and body - */ - function wrapTabs(container) { - var tabs = $.data(container, 'tabs').tabs; - var cc = $(container).addClass('tabs-container'); - var panels = $('
                                                                                                                                                                  ').insertBefore(cc); - cc.children('div').each(function(){ - panels[0].appendChild(this); - }); - cc[0].appendChild(panels[0]); - $('
                                                                                                                                                                  ' - + '
                                                                                                                                                                  ' - + '
                                                                                                                                                                  ' - + '
                                                                                                                                                                  ' - + '
                                                                                                                                                                    ' - + '
                                                                                                                                                                    ' - + '
                                                                                                                                                                    ').prependTo(container); - - cc.children('div.tabs-panels').children('div').each(function(i){ - var opts = $.extend({}, $.parser.parseOptions(this), { - disabled: ($(this).attr('disabled') ? true : undefined), - selected: ($(this).attr('selected') ? true : undefined) - }); - createTab(container, opts, $(this)); - }); - - cc.children('div.tabs-header').find('.tabs-scroller-left, .tabs-scroller-right').hover( - function(){$(this).addClass('tabs-scroller-over');}, - function(){$(this).removeClass('tabs-scroller-over');} - ); - cc.bind('_resize', function(e,force){ - if ($(this).hasClass('easyui-fluid') || force){ - setSize(container); - setSelectedSize(container); - } - return false; - }); - } - - function bindEvents(container){ - var state = $.data(container, 'tabs') - var opts = state.options; - $(container).children('div.tabs-header').unbind().bind('click', function(e){ - if ($(e.target).hasClass('tabs-scroller-left')){ - $(container).tabs('scrollBy', -opts.scrollIncrement); - } else if ($(e.target).hasClass('tabs-scroller-right')){ - $(container).tabs('scrollBy', opts.scrollIncrement); - } else { - var li = $(e.target).closest('li'); - if (li.hasClass('tabs-disabled')){return false;} - var a = $(e.target).closest('a.tabs-close'); - if (a.length){ - closeTab(container, getLiIndex(li)); - } else if (li.length){ -// selectTab(container, getLiIndex(li)); - var index = getLiIndex(li); - var popts = state.tabs[index].panel('options'); - if (popts.collapsible){ - popts.closed ? selectTab(container, index) : unselectTab(container, index); - } else { - selectTab(container, index); - } - } - return false; - } - }).bind('contextmenu', function(e){ - var li = $(e.target).closest('li'); - if (li.hasClass('tabs-disabled')){return;} - if (li.length){ - opts.onContextMenu.call(container, e, li.find('span.tabs-title').html(), getLiIndex(li)); - } - }); - - function getLiIndex(li){ - var index = 0; - li.parent().children('li').each(function(i){ - if (li[0] == this){ - index = i; - return false; - } - }); - return index; - } - } - - function setProperties(container){ - var opts = $.data(container, 'tabs').options; - var header = $(container).children('div.tabs-header'); - var panels = $(container).children('div.tabs-panels'); - - header.removeClass('tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right'); - panels.removeClass('tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right'); - if (opts.tabPosition == 'top'){ - header.insertBefore(panels); - } else if (opts.tabPosition == 'bottom'){ - header.insertAfter(panels); - header.addClass('tabs-header-bottom'); - panels.addClass('tabs-panels-top'); - } else if (opts.tabPosition == 'left'){ - header.addClass('tabs-header-left'); - panels.addClass('tabs-panels-right'); - } else if (opts.tabPosition == 'right'){ - header.addClass('tabs-header-right'); - panels.addClass('tabs-panels-left'); - } - - if (opts.plain == true) { - header.addClass('tabs-header-plain'); - } else { - header.removeClass('tabs-header-plain'); - } - header.removeClass('tabs-header-narrow').addClass(opts.narrow?'tabs-header-narrow':''); - var tabs = header.find('.tabs'); - tabs.removeClass('tabs-pill').addClass(opts.pill?'tabs-pill':''); - tabs.removeClass('tabs-narrow').addClass(opts.narrow?'tabs-narrow':''); - tabs.removeClass('tabs-justified').addClass(opts.justified?'tabs-justified':''); - if (opts.border == true){ - header.removeClass('tabs-header-noborder'); - panels.removeClass('tabs-panels-noborder'); - } else { - header.addClass('tabs-header-noborder'); - panels.addClass('tabs-panels-noborder'); - } - opts.doSize = true; - } - - function createTab(container, options, pp) { - options = options || {}; - var state = $.data(container, 'tabs'); - var tabs = state.tabs; - if (options.index == undefined || options.index > tabs.length){options.index = tabs.length} - if (options.index < 0){options.index = 0} - - var ul = $(container).children('div.tabs-header').find('ul.tabs'); - var panels = $(container).children('div.tabs-panels'); - var tab = $( - '
                                                                                                                                                                  • ' + - '' + - '' + - '' + - '' + - '
                                                                                                                                                                  • '); - if (!pp){pp = $('
                                                                                                                                                                    ');} - if (options.index >= tabs.length){ - tab.appendTo(ul); - pp.appendTo(panels); - tabs.push(pp); - } else { - tab.insertBefore(ul.children('li:eq('+options.index+')')); - pp.insertBefore(panels.children('div.panel:eq('+options.index+')')); - tabs.splice(options.index, 0, pp); - } - - // create panel - pp.panel($.extend({}, options, { - tab: tab, - border: false, - noheader: true, - closed: true, - doSize: false, - iconCls: (options.icon ? options.icon : undefined), - onLoad: function(){ - if (options.onLoad){ - options.onLoad.apply(this, arguments); - } - state.options.onLoad.call(container, $(this)); - }, - onBeforeOpen: function(){ - if (options.onBeforeOpen){ - if (options.onBeforeOpen.call(this) == false){return false;} - } - var p = $(container).tabs('getSelected'); - if (p){ - if (p[0] != this){ - $(container).tabs('unselect', getTabIndex(container, p)); - p = $(container).tabs('getSelected'); - if (p){ - return false; - } - } else { - setSelectedSize(container); - return false; - } - } - - var popts = $(this).panel('options'); - popts.tab.addClass('tabs-selected'); - // scroll the tab to center position if required. - var wrap = $(container).find('>div.tabs-header>div.tabs-wrap'); - var left = popts.tab.position().left; - var right = left + popts.tab.outerWidth(); - if (left < 0 || right > wrap.width()){ - var deltaX = left - (wrap.width()-popts.tab.width()) / 2; - $(container).tabs('scrollBy', deltaX); - } else { - $(container).tabs('scrollBy', 0); - } - - var panel = $(this).panel('panel'); - panel.css('display','block'); - setSelectedSize(container); - panel.css('display','none'); - }, - onOpen: function(){ - if (options.onOpen){ - options.onOpen.call(this); - } - var popts = $(this).panel('options'); - var index = getTabIndex(container, this); - // state.selectHis.push(popts.title); - state.selectHis.push(index); - state.options.onSelect.call(container, popts.title, index); - }, - onBeforeClose: function(){ - if (options.onBeforeClose){ - if (options.onBeforeClose.call(this) == false){return false;} - } - $(this).panel('options').tab.removeClass('tabs-selected'); - }, - onClose: function(){ - if (options.onClose){ - options.onClose.call(this); - } - var popts = $(this).panel('options'); - state.options.onUnselect.call(container, popts.title, getTabIndex(container, this)); - } - })); - - // only update the tab header - $(container).tabs('update', { - tab: pp, - options: pp.panel('options'), - type: 'header' - }); - } - - function addTab(container, options) { - var state = $.data(container, 'tabs'); - var opts = state.options; - if (options.selected == undefined) options.selected = true; - - createTab(container, options); - opts.onAdd.call(container, options.title, options.index); - if (options.selected){ - selectTab(container, options.index); // select the added tab panel - } - } - - /** - * update tab panel, param has following properties: - * tab: the tab panel to be updated - * options: the tab panel options - * type: the update type, possible values are: 'header','body','all' - */ - function updateTab(container, param){ - param.type = param.type || 'all'; - var selectHis = $.data(container, 'tabs').selectHis; - var pp = param.tab; // the tab panel - var opts = pp.panel('options'); // get the tab panel options - var oldTitle = opts.title; - $.extend(opts, param.options, { - iconCls: (param.options.icon ? param.options.icon : undefined) - }); - - if (param.type == 'all' || param.type == 'body'){ - pp.panel(); - } - if (param.type == 'all' || param.type == 'header'){ - var tab = opts.tab; - - if (opts.header){ - tab.find('.tabs-inner').html($(opts.header)); - } else { - var s_title = tab.find('span.tabs-title'); - var s_icon = tab.find('span.tabs-icon'); - s_title.html(opts.title); - s_icon.attr('class', 'tabs-icon'); - - tab.find('a.tabs-close').remove(); - if (opts.closable){ - s_title.addClass('tabs-closable'); - $('').appendTo(tab); - } else{ - s_title.removeClass('tabs-closable'); - } - if (opts.iconCls){ - s_title.addClass('tabs-with-icon'); - s_icon.addClass(opts.iconCls); - } else { - s_title.removeClass('tabs-with-icon'); - } - if (opts.tools){ - var p_tool = tab.find('span.tabs-p-tool'); - if (!p_tool.length){ - var p_tool = $('').insertAfter(tab.find('a.tabs-inner')); - } - if ($.isArray(opts.tools)){ - p_tool.empty(); - for(var i=0; i').appendTo(p_tool); - t.addClass(opts.tools[i].iconCls); - if (opts.tools[i].handler){ - t.bind('click', {handler:opts.tools[i].handler}, function(e){ - if ($(this).parents('li').hasClass('tabs-disabled')){return;} - e.data.handler.call(this); - }); - } - } - } else { - $(opts.tools).children().appendTo(p_tool); - } - var pr = p_tool.children().length * 12; - if (opts.closable) { - pr += 8; - p_tool.css('right', ''); - } else { - pr -= 3; - p_tool.css('right','5px'); - } - s_title.css('padding-right', pr+'px'); - } else { - tab.find('span.tabs-p-tool').remove(); - s_title.css('padding-right', ''); - } - } - // if (oldTitle != opts.title){ - // for(var i=0; i index ? tindex-1 : tindex); - } - } - state.selectHis = his; - var selected = $(container).tabs('getSelected'); - if (!selected && his.length){ - index = state.selectHis.pop(); - $(container).tabs('select', index); - } - - // for(var i=0; i=0 && which < tabs.length){ - tab = tabs[which]; - if (removeit){ - tabs.splice(which, 1); - } - } - } else { - var tmp = $(''); - for(var i=0; i.tabs-header>.tabs-tool'); - if (visible){ - tool.removeClass('tabs-tool-hidden').show(); - } else { - tool.addClass('tabs-tool-hidden').hide(); - } - $(container).tabs('resize').tabs('scrollBy', 0); - } - - - $.fn.tabs = function(options, param){ - if (typeof options == 'string') { - return $.fn.tabs.methods[options](this, param); - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'tabs'); - if (state) { - $.extend(state.options, options); - } else { - $.data(this, 'tabs', { - options: $.extend({},$.fn.tabs.defaults, $.fn.tabs.parseOptions(this), options), - tabs: [], - selectHis: [] - }); - wrapTabs(this); - } - - addTools(this); - setProperties(this); - setSize(this); - bindEvents(this); - - doFirstSelect(this); - }); - }; - - $.fn.tabs.methods = { - options: function(jq){ - var cc = jq[0]; - var opts = $.data(cc, 'tabs').options; - var s = getSelectedTab(cc); - opts.selected = s ? getTabIndex(cc, s) : -1; - return opts; - }, - tabs: function(jq){ - return $.data(jq[0], 'tabs').tabs; - }, - resize: function(jq, param){ - return jq.each(function(){ - setSize(this, param); - setSelectedSize(this); - }); - }, - add: function(jq, options){ - return jq.each(function(){ - addTab(this, options); - }); - }, - close: function(jq, which){ - return jq.each(function(){ - closeTab(this, which); - }); - }, - getTab: function(jq, which){ - return getTab(jq[0], which); - }, - getTabIndex: function(jq, tab){ - return getTabIndex(jq[0], tab); - }, - getSelected: function(jq){ - return getSelectedTab(jq[0]); - }, - select: function(jq, which){ - return jq.each(function(){ - selectTab(this, which); - }); - }, - unselect: function(jq, which){ - return jq.each(function(){ - unselectTab(this, which); - }); - }, - exists: function(jq, which){ - return exists(jq[0], which); - }, - update: function(jq, options){ - return jq.each(function(){ - updateTab(this, options); - }); - }, - enableTab: function(jq, which){ - return jq.each(function(){ - var opts = $(this).tabs('getTab', which).panel('options'); - opts.tab.removeClass('tabs-disabled'); - opts.disabled = false; - }); - }, - disableTab: function(jq, which){ - return jq.each(function(){ - var opts = $(this).tabs('getTab', which).panel('options'); - opts.tab.addClass('tabs-disabled'); - opts.disabled = true; - }); - }, - showHeader: function(jq){ - return jq.each(function(){ - showHeader(this, true); - }); - }, - hideHeader: function(jq){ - return jq.each(function(){ - showHeader(this, false); - }); - }, - showTool: function(jq){ - return jq.each(function(){ - showTool(this, true); - }); - }, - hideTool: function(jq){ - return jq.each(function(){ - showTool(this, false); - }); - }, - scrollBy: function(jq, deltaX){ // scroll the tab header by the specified amount of pixels - return jq.each(function(){ - var opts = $(this).tabs('options'); - var wrap = $(this).find('>div.tabs-header>div.tabs-wrap'); - var pos = Math.min(wrap._scrollLeft() + deltaX, getMaxScrollWidth()); - wrap.animate({scrollLeft: pos}, opts.scrollDuration); - - function getMaxScrollWidth(){ - var w = 0; - var ul = wrap.children('ul'); - ul.children('li').each(function(){ - w += $(this).outerWidth(true); - }); - return w - wrap.width() + (ul.outerWidth() - ul.width()); - } - }); - } - }; - - $.fn.tabs.parseOptions = function(target){ - return $.extend({}, $.parser.parseOptions(target, [ - 'tools','toolPosition','tabPosition', - {fit:'boolean',border:'boolean',plain:'boolean'}, - {headerWidth:'number',tabWidth:'number',tabHeight:'number',selected:'number'}, - {showHeader:'boolean',justified:'boolean',narrow:'boolean',pill:'boolean'} - ])); - }; - - $.fn.tabs.defaults = { - width: 'auto', - height: 'auto', - headerWidth: 150, // the tab header width, it is valid only when tabPosition set to 'left' or 'right' - tabWidth: 'auto', // the tab width - // tabHeight: 27, // the tab height - tabHeight: 32, // the tab height - selected: 0, // the initialized selected tab index - showHeader: true, - plain: false, - fit: false, - border: true, - justified: false, - narrow: false, - pill: false, - tools: null, - toolPosition: 'right', // left,right,top,bottom - tabPosition: 'top', // possible values: top,bottom - scrollIncrement: 100, - scrollDuration: 400, - onLoad: function(panel){}, - onSelect: function(title, index){}, - onUnselect: function(title, index){}, - onBeforeClose: function(title, index){}, - onClose: function(title, index){}, - onAdd: function(title, index){}, - onUpdate: function(title, index){}, - onContextMenu: function(e, title, index){} - }; -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.window.js b/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.window.js deleted file mode 100644 index fb9bbf8d8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/src/jquery.window.js +++ /dev/null @@ -1,417 +0,0 @@ -/** - * EasyUI for jQuery 1.5.5.5 - * - * Copyright (c) 2009-2018 www.jeasyui.com. All rights reserved. - * - * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php - * To use it on other terms please contact us: info@jeasyui.com - * - */ -/** - * window - EasyUI for jQuery - * - * Dependencies: - * panel - * draggable - * resizable - * - */ -(function($){ - function moveWindow(target, param){ - var state = $.data(target, 'window'); - if (param){ - if (param.left != null) state.options.left = param.left; - if (param.top != null) state.options.top = param.top; - } - $(target).panel('move', state.options); - if (state.shadow){ - state.shadow.css({ - left: state.options.left, - top: state.options.top - }); - } - } - - /** - * center the window only horizontally - */ - function hcenter(target, tomove){ - var opts = $.data(target, 'window').options; - var pp = $(target).window('panel'); - var width = pp._outerWidth(); - if (opts.inline){ - var parent = pp.parent(); - opts.left = Math.ceil((parent.width() - width) / 2 + parent.scrollLeft()); - } else { - opts.left = Math.ceil(($(window)._outerWidth() - width) / 2 + $(document).scrollLeft()); - } - if (tomove){moveWindow(target);} - } - - /** - * center the window only vertically - */ - function vcenter(target, tomove){ - var opts = $.data(target, 'window').options; - var pp = $(target).window('panel'); - var height = pp._outerHeight(); - if (opts.inline){ - var parent = pp.parent(); - opts.top = Math.ceil((parent.height() - height) / 2 + parent.scrollTop()); - } else { - opts.top = Math.ceil(($(window)._outerHeight() - height) / 2 + $(document).scrollTop()); - } - if (tomove){moveWindow(target);} - } - - function create(target){ - var state = $.data(target, 'window'); - var opts = state.options; - var win = $(target).panel($.extend({}, state.options, { - border: false, - doSize: true, // size the panel, the property undefined in window component - closed: true, // close the panel - cls: 'window ' + (!opts.border?'window-thinborder window-noborder ':(opts.border=='thin'?'window-thinborder ':'')) + (opts.cls || ''), - headerCls: 'window-header ' + (opts.headerCls || ''), - bodyCls: 'window-body ' + (opts.noheader ? 'window-body-noheader ' : ' ') + (opts.bodyCls||''), - - onBeforeDestroy: function(){ - if (opts.onBeforeDestroy.call(target) == false){return false;} - if (state.shadow){state.shadow.remove();} - if (state.mask){state.mask.remove();} - }, - onClose: function(){ - if (state.shadow){state.shadow.hide();} - if (state.mask){state.mask.hide();} - opts.onClose.call(target); - }, - onOpen: function(){ - if (state.mask){ - state.mask.css($.extend({ - display:'block', - zIndex: $.fn.window.defaults.zIndex++ - }, $.fn.window.getMaskSize(target))); - } - if (state.shadow){ - state.shadow.css({ - display:'block', - zIndex: $.fn.window.defaults.zIndex++, - left: opts.left, - top: opts.top, - width: state.window._outerWidth(), - height: state.window._outerHeight() - }); - } - state.window.css('z-index', $.fn.window.defaults.zIndex++); - - opts.onOpen.call(target); - }, - onResize: function(width, height){ - var popts = $(this).panel('options'); - $.extend(opts, { - width: popts.width, - height: popts.height, - left: popts.left, - top: popts.top - }); - if (state.shadow){ - state.shadow.css({ - left: opts.left, - top: opts.top, - width: state.window._outerWidth(), - height: state.window._outerHeight() - }); - } - opts.onResize.call(target, width, height); - }, - onMinimize: function(){ - if (state.shadow){state.shadow.hide();} - if (state.mask){state.mask.hide();} - state.options.onMinimize.call(target); - }, - onBeforeCollapse: function(){ - if (opts.onBeforeCollapse.call(target) == false){return false;} - if (state.shadow){state.shadow.hide();} - }, - onExpand: function(){ - if (state.shadow){state.shadow.show();} - opts.onExpand.call(target); - } - })); - - state.window = win.panel('panel'); - - // create mask - if (state.mask){state.mask.remove();} - if (opts.modal){ - state.mask = $('').insertAfter(state.window); - } - - // create shadow - if (state.shadow){state.shadow.remove();} - if (opts.shadow){ - state.shadow = $('').insertAfter(state.window); - } - - // center and open the window - var closed = opts.closed; - if (opts.left == null){hcenter(target);} - if (opts.top == null){vcenter(target);} - moveWindow(target); - if (!closed){win.window('open');} - } - - function constrain(left, top, width, height){ - var target = this; - var state = $.data(target, 'window'); - var opts = state.options; - if (!opts.constrain){return {};} - if ($.isFunction(opts.constrain)){ - return opts.constrain.call(target, left, top, width, height); - } - var win = $(target).window('window'); - var parent = opts.inline ? win.parent() : $(window); - if (left < 0){left = 0;} - if (top < parent.scrollTop()){top = parent.scrollTop();} - if (left + width > parent.width()){ - if (width == win.outerWidth()){ // moving - left = parent.width() - width; - } else { // resizing - width = parent.width() - left; - } - } - if (top - parent.scrollTop() + height > parent.height()){ - if (height == win.outerHeight()){ // moving - top = parent.height() - height + parent.scrollTop(); - } else { // resizing - height = parent.height() - top + parent.scrollTop(); - } - } - - return { - left:left, - top:top, - width:width, - height:height - }; - } - - - /** - * set window drag and resize property - */ - function setProperties(target){ - var state = $.data(target, 'window'); - - state.window.draggable({ - handle: '>div.panel-header>div.panel-title', - disabled: state.options.draggable == false, - onBeforeDrag: function(e){ - if (state.mask) state.mask.css('z-index', $.fn.window.defaults.zIndex++); - if (state.shadow) state.shadow.css('z-index', $.fn.window.defaults.zIndex++); - state.window.css('z-index', $.fn.window.defaults.zIndex++); - }, - onStartDrag: function(e){ - start1(e); - }, - onDrag: function(e){ - proc1(e); - return false; - }, - onStopDrag: function(e){ - stop1(e, 'move'); - } - }); - - state.window.resizable({ - disabled: state.options.resizable == false, - onStartResize:function(e){ - start1(e); - }, - onResize: function(e){ - proc1(e); - return false; - }, - onStopResize: function(e){ - stop1(e, 'resize'); - } - }); - - function start1(e){ - if (state.pmask){state.pmask.remove();} - state.pmask = $('
                                                                                                                                                                    ').insertAfter(state.window); - state.pmask.css({ - display: 'none', - zIndex: $.fn.window.defaults.zIndex++, - left: e.data.left, - top: e.data.top, - width: state.window._outerWidth(), - height: state.window._outerHeight() - }); - if (state.proxy){state.proxy.remove();} - state.proxy = $('
                                                                                                                                                                    ').insertAfter(state.window); - state.proxy.css({ - display: 'none', - zIndex: $.fn.window.defaults.zIndex++, - left: e.data.left, - top: e.data.top - }); - state.proxy._outerWidth(e.data.width)._outerHeight(e.data.height); - state.proxy.hide(); - setTimeout(function(){ - if (state.pmask){state.pmask.show();} - if (state.proxy){state.proxy.show();} - }, 500); - } - function proc1(e){ - $.extend(e.data, constrain.call(target, e.data.left, e.data.top, e.data.width, e.data.height)); - state.pmask.show(); - state.proxy.css({ - display: 'block', - left: e.data.left, - top: e.data.top - }); - state.proxy._outerWidth(e.data.width); - state.proxy._outerHeight(e.data.height); - } - function stop1(e, method){ - $.extend(e.data, constrain.call(target, e.data.left, e.data.top, e.data.width+0.1, e.data.height+0.1)); - $(target).window(method, e.data); - state.pmask.remove(); - state.pmask = null; - state.proxy.remove(); - state.proxy = null; - } - } - - // when window resize, reset the width and height of the window's mask - $(function(){ - if (!$._positionFixed){ - $(window).resize(function(){ - $('body>div.window-mask:visible').css({ - width: '', - height: '' - }); - setTimeout(function(){ - $('body>div.window-mask:visible').css($.fn.window.getMaskSize()); - }, 50); - }); - } - }); - - $.fn.window = function(options, param){ - if (typeof options == 'string'){ - var method = $.fn.window.methods[options]; - if (method){ - return method(this, param); - } else { - return this.panel(options, param); - } - } - - options = options || {}; - return this.each(function(){ - var state = $.data(this, 'window'); - if (state){ - $.extend(state.options, options); - } else { - state = $.data(this, 'window', { - options: $.extend({}, $.fn.window.defaults, $.fn.window.parseOptions(this), options) - }); - if (!state.options.inline){ - document.body.appendChild(this); - } - } - create(this); - setProperties(this); - }); - }; - - $.fn.window.methods = { - options: function(jq){ - var popts = jq.panel('options'); - var wopts = $.data(jq[0], 'window').options; - return $.extend(wopts, { - closed: popts.closed, - collapsed: popts.collapsed, - minimized: popts.minimized, - maximized: popts.maximized - }); - }, - window: function(jq){ - return $.data(jq[0], 'window').window; - }, - move: function(jq, param){ - return jq.each(function(){ - moveWindow(this, param); - }); - }, - hcenter: function(jq){ - return jq.each(function(){ - hcenter(this, true); - }); - }, - vcenter: function(jq){ - return jq.each(function(){ - vcenter(this, true); - }); - }, - center: function(jq){ - return jq.each(function(){ - hcenter(this); - vcenter(this); - moveWindow(this); - }); - } - }; - - $.fn.window.getMaskSize = function(target){ - var state = $(target).data('window'); - if (state && state.options.inline){ - return {}; - } else if ($._positionFixed){ - return {position: 'fixed'}; - } else { - return { - width: $(document).width(), - height: $(document).height() - }; - } - }; - - $.fn.window.parseOptions = function(target){ - return $.extend({}, $.fn.panel.parseOptions(target), $.parser.parseOptions(target, [ - {draggable:'boolean',resizable:'boolean',shadow:'boolean',modal:'boolean',inline:'boolean'} - ])); - }; - - // Inherited from $.fn.panel.defaults - $.fn.window.defaults = $.extend({}, $.fn.panel.defaults, { - zIndex: 9000, - draggable: true, - resizable: true, - shadow: true, - modal: false, - border: true, // possible values are: true,false,'thin','thick' - inline: false, // true to stay inside its parent, false to go on top of all elements - - // window's property which difference from panel - title: 'New Window', - collapsible: true, - minimizable: true, - maximizable: true, - closable: true, - closed: false, - constrain: false - /* - constrain: function(left,top,width,height){ - return { - left:left, - top:top, - width:width, - height:height - }; - } - */ - }); -})(jQuery); diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/angular.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/angular.css deleted file mode 100644 index b2ea7d48a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/angular.css +++ /dev/null @@ -1,639 +0,0 @@ -*{ - box-sizing: border-box; -} -.f-block{ - display: block; - position: relative; -} -.f-row{ - display: -webkit-box; - display: -webkit-flex; - display: -moz-flex; - display: -ms-flexbox; - display: flex; - position: relative; -} -.f-column{ - display: -webkit-box; - display: -webkit-flex; - display: -moz-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-direction: normal; - -webkit-box-orient: vertical; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - position: relative; -} -.f-inline-row{ - white-space: nowrap; - display: -webkit-inline-box; - display: -ms-inline-box; - display: inline-flex; - vertical-align: middle; - position: relative; - align-items: stretch; - -webkit-tap-highlight-color: transparent; -} -.f-content-center{ - -webkit-box-pack: center; - -ms-flex-pack: center; - -webkit-justify-content: center; - -moz-justify-content: center; - justify-content: center; - -webkit-box-align: center; - -ms-flex-align: center; - -webkit-align-items: center; - -moz-align-items: center; - align-items: center; -} -.f-full{ - -webkit-box-flex: 1 1 auto; - -ms-flex: 1 1 auto; - flex: 1 1 auto; -} -.f-hide{ - display: none; -} -.f-order0{ - order: 0; -} -.f-order1{ - order: 1; -} -.f-order2{ - order: 2; -} -.f-order3{ - order: 3; -} -.f-order4{ - order: 4; -} -.f-order5{ - order: 5; -} -.f-order6{ - order: 6; -} -.f-order7{ - order: 7; -} -.f-order8{ - order: 8; -} -.f-noshrink{ - -webkit-flex-shrink: 0; - -moz-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} -.f-animate{ - transition: all .3s; -} - -.scroll-body{ - overflow: auto; - position: relative; -} - -.textbox .textbox-text{ - width: 100%; - height: auto; - overflow: hidden; -} -.textbox-addon{ - align-items: center; -} -.textbox-disabled>.textbox-addon .textbox-icon, -.textbox-readonly>.textbox-addon .textbox-icon{ - cursor: default; -} -.textbox-disabled>.textbox-addon .textbox-icon:hover, -.textbox-readonly>.textbox-addon .textbox-icon:hover{ - opacity: 0.6; - cursor: default; -} -.textbox-addon .textbox-icon{ - width: 26px; - height: 18px; -} - -.spinner .textbox-text{ - height: auto; -} -.spinner-button-left,.spinner-button-right{ - width: 26px; -} -.spinner-button-updown{ - width: 26px; -} -.spinner-button-top,.spinner-button-bottom{ - position: absolute; - width: 100%; - height: 26px; -} -.spinner-button-top{ - top: 0; -} -.spinner-button-bottom{ - top: auto; - bottom: 0; -} -.spinner-button{ - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - left: 50%; - margin-left: -8px; - top: 50%; - margin-top: -8px; -} -.spinner-arrow{ - cursor: pointer; - opacity: 0.6; -} - -.textbox-disabled .spinner-arrow:hover, -.textbox-readonly .spinner-arrow:hover -{ - opacity: 0.6; - cursor: default; -} -.textbox-readonly .spinner-arrow .spinner-arrow-up:hover, -.textbox-disabled .spinner-arrow .spinner-arrow-up:hover, -.textbox-readonly .spinner-arrow .spinner-arrow-down:hover, -.textbox-disabled .spinner-arrow .spinner-arrow-down:hover -{ - cursor: default; -} - -.l-btn{ - width: 100%; -} -.l-btn-empty{ - height: 28px; -} -.l-btn-large .l-btn-empty{ - height: 44px; -} -.l-btn-left{ - overflow: visible; -} -.m-btn .l-btn-left .m-btn-line{ - top: -100px; - width: 36px; - right: -20px; -} -eui-button-group eui-linkbutton.f-inline-row{ - margin-left: -1px; -} -eui-button-group .l-btn:hover{ - z-index: 99; -} -eui-button-group eui-linkbutton:not(:first-child):not(:last-child) .l-btn{ - border-radius: 0; -} -eui-button-group eui-linkbutton:first-child .l-btn{ - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -eui-button-group eui-linkbutton:last-child .l-btn{ - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.switchbutton-on,.switchbutton-off{ - position: absolute; - left: 0; - width: calc(100% - 15px); - height: 100%; -} -.switchbutton-on span,.switchbutton-off span,.switchbutton-handle span{ - height: 100%; -} -.switchbutton-on span{ - text-indent: -15px; -} -.switchbutton-off span{ - text-indent: 15px; -} -.switchbutton-off{ - left: calc(100% - 15px); -} -.switchbutton-handle{ - width: 30px; - left: auto; - right: 0; - z-index: 9; -} -.switchbutton-inner{ - transition: all 200ms ease-out; - overflow: visible; - position: absolute; - width: 100%; - top: -1px; - bottom: -1px; - left: calc(-100% + 30px); - right: auto; -} -.switchbutton-checked .switchbutton-inner{ - left: 0; -} -.draggable-reverting{ - transition: all 200ms ease-out; -} -.slider-h .slider-tip{ - transform: translateX(-50%); -} -.slider-h .slider-rulelabel span{ - transform: translateX(-50%); -} -.slider-v .slider-tip{ - margin-top: 0; - transform: translate(-100%,-50%); -} -.slider-v .slider-rulelabel span{ - transform: translateY(-50%); -} -.slider-v .slider-inner{ - height: auto; -} - - -.panel{ - position:relative; -} -.panel-title{ - height: 20px; - line-height: 20px; -} -.panel-footer-fixed{ - position:absolute; - width:100%; - bottom:0; -} -.window{ - position: absolute; -} -.window-mask{ - position: fixed; -} -.window .window-footer{ - top: 0; -} -.dialog-toolbar{ - border-width: 0 0 1px 0; -} -.dialog-button{ - border-width: 1px 0 0 0; - top: 0; -} - -.tabs{ - width: 100%; - height: auto; -} -.tabs-scrollable{ - transition: left 400ms, right 400ms; - position: absolute; - width: auto; - height: 100%; - left: 0; - top: 0; -} -.tabs li{ - display: inherit; -} -.tabs li a.tabs-inner{ - height: auto; - line-height: normal; - display: inherit; - overflow: hidden; -} -.tabs-title{ - display: inherit; - align-items: center; - line-height: normal; -} -.tabs-close{ - outline: none; -} -.tabs-scroller-left,.tabs-scroller-right{ - position: relative; - display: block; - width: 21px; - height: 100%; -} -.tabs-header-left .tabs li{ - right: -1px; -} -.tabs-header-left .tabs li,.tabs-header-right .tabs li, -.tabs-header-left .tabs li a.tabs-inner, -.tabs-header-right .tabs li a.tabs-inner{ - display: inherit; -} - -.combo-panel{ - position: absolute; - height: 200px; - z-index: 9999; -} -.combo-panel eui-virtual-scroll, -.combo-panel eui-datagrid, -.combo-panel eui-treegrid{ - width: 100%; - height: 100%; -} -.combobox-item{ - padding: 6px 4px; - line-height: 20px; -} -.tagbox-labels{ - padding-bottom: 4px; -} -.tagbox-label{ - height: 20px; - line-height: 20px; -} -.tagbox .textbox-text{ - width: 50px; - max-width: 100%; - margin-top: 4px; - padding-top: 0; - padding-bottom: 0; - height: 20px; - line-height: 20px; -} - -.datagrid,eui-datagrid, -eui-datagrid-view,eui-datagrid-body, -eui-treegrid-view,eui-treegrid-body{ - overflow: hidden; -} -.datagrid-view,.datagrid-view1,.datagrid-view2{ - position: relative; -} -.datagrid-vbody{ - overflow: hidden; -} -.datagrid-view3{ - margin-left: -1px; -} -.datagrid-view3 .datagrid-body{ - overflow: hidden; -} -.datagrid-view3 .datagrid-body-inner{ - padding-bottom: 20px; -} -.datagrid-view3 .datagrid-header td, -.datagrid-view3 .datagrid-body td, -.datagrid-view3 .datagrid-footer td { - border-width: 0 0 1px 1px; -} -.datagrid-htable,.datagrid-btable,.datagrid-ftable{ - table-layout: fixed; - width: 100%; -} -.datagrid-htable{ - height: 100%; -} -.datagrid-header .datagrid-header, -.datagrid-footer .datagrid-header{ - border-width: 0 0 0 1px; -} -.datagrid-header-inner,.datagrid-footer-inner{ - overflow: hidden; -} -.datagrid-header-row, .datagrid-row{ - height: 32px; -} -.datagrid-cell{ - text-align: left; - height: auto; - font-size: inherit; -} -.datagrid-cell-group{ - text-align: center; -} -.datagrid .datagrid-pager{ - padding: 2px 4px; - display: inherit; -} -.datagrid-loading{ - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - justify-content: center; - align-items: center; -} -.datagrid-mask{ - display: block; -} -.datagrid-mask-msg{ - display: block; - position: static; - line-height: 36px; - height: 40px; - margin: 0; - padding: 0 5px 0 30px; - z-index: 9; -} -.datagrid-body .datagrid-td-group{ - border-left-color: transparent; - border-right-color: transparent; -} -.datagrid-group-expander{ - cursor: pointer; -} -.datagrid-row-expander{ - display: inline-block; - width: 16px; - height: 18px; - cursor: pointer; -} -.datagrid-group-title{ - align-self: center; - padding: 0 4px; - white-space: nowrap; - word-break: normal; - position: relative; -} -.datagrid-editable> .f-field, -.datagrid-editable> *{ - width: 100%; - height: 31px; -} -.datagrid-editable .textbox, .datagrid-editable .textbox-text{ - border-radius: 0; -} -.datagrid-filter-row .textbox{ - border-radius: 0; -} -.datagrid-filter-c{ - padding: 4px; - height: 38px; -} -.datagrid-filter-c> .f-field, -.datagrid-filter-c> *{ - height: 30px; -} -.datagrid-filter-c .datagrid-editable-input{ - width: 100%; -} -.datagrid-filter-btn{ - width: 30px; -} -.datagrid-filter-btn .textbox-icon{ - width: 28px; -} -.datagrid-filter-btn .textbox{ - background-color: transparent; -} -.datagrid-filter-btn-left{ - margin-right: 4px; -} -.datagrid-filter-btn-right{ - margin-left: 4px; -} - -eui-menu.menu-inline{ - position: relative; - display: inline; - margin: 0; - padding: 0; -} -eui-menu> .menu-container{ - position: relative; -} -.menu-container{ - position: absolute; - left: 0; - top: 0; - min-width: 200px; -} -.menu{ - overflow: visible; -} -.menu-shadow{ - width: 100%; - height: 100%; - left: 0; - top: 0; -} -.menu-item{ - overflow: visible; -} -.menu-text{ - height: 32px; - line-height: 32px; - float: none; -} -.menu-line{ - z-index: 9999999; - height: 100%; -} -.menu-active{ - z-index: 99999999; -} - -.progressbar-value{ - overflow: visible; -} - -.searchbox .textbox-button, -.searchbox .textbox-button:hover{ - position: inherit; -} - -.calendar-content{ - position: absolute; - width: 100%; - height: 100%; - left: 0; - top: 0; -} -.calendar-menu{ - position: absolute; - width: 100%; - height: 100%; -} -.calendar-menu-month-inner{ - position: relative; -} - -.f-field{ - width: 12em; - height: 30px; -} -eui-tagbox{ - width: 12em; - height: auto; - min-height: 30px; -} -eui-switchbutton{ - width: 70px; - height: 30px; -} -eui-radiobutton{ - width: 20px; - height: 20px; -} -eui-checkbox{ - width: 20px; - height: 20px; -} -eui-progressbar{ - height: 24px; -} -eui-pagination{ - height: 34px; - padding: 2px; -} -eui-layout{ - display: block; -} -.layout{ - height: 100%; -} -.layout-animate{ - transition: transform 400ms; -} -.layout-panel-north,.layout-panel-south{ - position: absolute; - width: 100%; - left: 0; - top: 0; -} -.layout-panel-south{ - top: auto; - bottom: 0; -} -.layout-panel-west,.layout-panel-east{ - position: absolute; - left: 0; - top: 0; - bottom: 0; -} -.layout-panel-east{ - left: auto; - right: 0; -} -.layout-panel-west.layout-collapsed{ - transform: translate3d(-100%, 0, 0); -} -.layout-panel-east.layout-collapsed{ - transform: translate3d(100%, 0, 0) -} -.layout-panel-north.layout-collapsed{ - transform: translate3d(0, -100%, 0) -} -.layout-panel-south.layout-collapsed{ - transform: translate3d(0, 100%, 0) -} - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/accordion.css deleted file mode 100644 index b2dba5200..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/accordion.css +++ /dev/null @@ -1,89 +0,0 @@ -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #666; - border-color: #000; -} -.accordion .accordion-header { - background: #3d3d3d; - filter: none; -} -.accordion .accordion-header-selected { - background: #0052A3; -} -.accordion .accordion-header-selected .panel-title { - color: #fff; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #3d3d3d; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #666; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #000; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #3d3d3d; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #666; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #000; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #3d3d3d; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #666; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/calendar.css deleted file mode 100644 index eed5a4b4b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/calendar.css +++ /dev/null @@ -1,203 +0,0 @@ -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-body th, -.calendar-menu-month { - color: #ffffff; -} -.calendar-day { - color: #fff; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #000; -} -.calendar { - border-color: #000; -} -.calendar-header { - background: #3d3d3d; -} -.calendar-body, -.calendar-menu { - background: #666; -} -.calendar-body th { - background: #555; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #777; - color: #fff; -} -.calendar-hover { - border: 1px solid #555; - padding: 0; -} -.calendar-selected { - background-color: #0052A3; - color: #fff; - border: 1px solid #00458a; - padding: 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/checkbox.css deleted file mode 100644 index e84e80dd9..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/checkbox.css +++ /dev/null @@ -1,31 +0,0 @@ -.checkbox { - position: relative; - border: 2px solid #00458a; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.checkbox-checked { - border: 0; - background: #00458a; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combo.css deleted file mode 100644 index 0798ce198..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combo.css +++ /dev/null @@ -1,35 +0,0 @@ -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #666; -} -.combo-arrow { - background-color: #3d3d3d; -} -.combo-arrow-hover { - background-color: #777; -} -.combo-arrow:hover { - background-color: #777; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combobox.css deleted file mode 100644 index 6415d08a0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/combobox.css +++ /dev/null @@ -1,40 +0,0 @@ -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #777; - color: #fff; -} -.combobox-item-selected { - background-color: #0052A3; - color: #fff; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datagrid.css deleted file mode 100644 index 376206d83..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datagrid.css +++ /dev/null @@ -1,291 +0,0 @@ -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #444; - border-right: 1px solid #777; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #000; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #666 url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #444; - background: -webkit-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); - background: -moz-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); - background: -o-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); - background: linear-gradient(to bottom,#4c4c4c 0,#3f3f3f 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4c4c4c,endColorstr=#3f3f3f,GradientType=0); -} -.datagrid-cell-rownumber { - color: #fff; -} -.datagrid-resize-proxy { - background: #cccccc; -} -.datagrid-mask { - background: #000; -} -.datagrid-mask-msg { - border-color: #000; -} -.datagrid-toolbar, -.datagrid-pager { - background: #555; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #222; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #222; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #fff; - border-collapse: separate; -} -.datagrid-row-alt { - background: #555; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #777; - color: #fff; - cursor: default; -} -.datagrid-row-selected { - background: #0052A3; - color: #fff; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datalist.css deleted file mode 100644 index 94dd67e5f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datalist.css +++ /dev/null @@ -1,95 +0,0 @@ -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #444; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #222; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #fff; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #222; -} -.m-list li>a:hover { - background: #777; - color: #fff; -} -.m-list .m-list-group { - padding: 0 4px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datebox.css deleted file mode 100644 index ae25037df..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/datebox.css +++ /dev/null @@ -1,36 +0,0 @@ -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #555; -} -.datebox-button a { - color: #fff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/dialog.css deleted file mode 100644 index 4a6f36eb2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/dialog.css +++ /dev/null @@ -1,47 +0,0 @@ -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #444; - border-right: 1px solid #777; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #555; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #000 #000 #222 #000; -} -.dialog-button { - border-color: #222 #000 #000 #000; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #555; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/easyui.css deleted file mode 100644 index 2e1d4ccd7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/easyui.css +++ /dev/null @@ -1,3427 +0,0 @@ -.panel { - overflow: hidden; - text-align: left; - margin: 0; - border: 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.panel-header, -.panel-body { - border-width: 1px; - border-style: solid; -} -.panel-header { - padding: 5px; - position: relative; -} -.panel-title { - background: url('images/blank.gif') no-repeat; -} -.panel-header-noborder { - border-width: 0 0 1px 0; -} -.panel-body { - overflow: auto; - border-top-width: 0; - padding: 0; -} -.panel-body-noheader { - border-top-width: 1px; -} -.panel-body-noborder { - border-width: 0px; -} -.panel-body-nobottom { - border-bottom-width: 0; -} -.panel-with-icon { - padding-left: 18px; -} -.panel-icon, -.panel-tool { - position: absolute; - top: 50%; - margin-top: -8px; - height: 16px; - overflow: hidden; -} -.panel-icon { - left: 5px; - width: 16px; -} -.panel-tool { - right: 5px; - width: auto; -} -.panel-tool a { - display: inline-block; - width: 16px; - height: 16px; - opacity: 0.6; - filter: alpha(opacity=60); - margin: 0 0 0 2px; - vertical-align: top; -} -.panel-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - background-color: #777; - -moz-border-radius: 3px 3px 3px 3px; - -webkit-border-radius: 3px 3px 3px 3px; - border-radius: 3px 3px 3px 3px; -} -.panel-loading { - padding: 11px 0px 10px 30px; -} -.panel-noscroll { - overflow: hidden; -} -.panel-fit, -.panel-fit body { - height: 100%; - margin: 0; - padding: 0; - border: 0; - overflow: hidden; -} -.panel-loading { - background: url('images/loading.gif') no-repeat 10px 10px; -} -.panel-tool-close { - background: url('images/panel_tools.png') no-repeat -16px 0px; -} -.panel-tool-min { - background: url('images/panel_tools.png') no-repeat 0px 0px; -} -.panel-tool-max { - background: url('images/panel_tools.png') no-repeat 0px -16px; -} -.panel-tool-restore { - background: url('images/panel_tools.png') no-repeat -16px -16px; -} -.panel-tool-collapse { - background: url('images/panel_tools.png') no-repeat -32px 0; -} -.panel-tool-expand { - background: url('images/panel_tools.png') no-repeat -32px -16px; -} -.panel-header, -.panel-body { - border-color: #000; -} -.panel-header { - background-color: #3d3d3d; - background: -webkit-linear-gradient(top,#454545 0,#383838 100%); - background: -moz-linear-gradient(top,#454545 0,#383838 100%); - background: -o-linear-gradient(top,#454545 0,#383838 100%); - background: linear-gradient(to bottom,#454545 0,#383838 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); -} -.panel-body { - background-color: #666; - color: #fff; - font-size: 14px; -} -.panel-title { - font-size: 14px; - font-weight: bold; - color: #fff; - height: 20px; - line-height: 20px; -} -.panel-footer { - border: 1px solid #000; - overflow: hidden; - background: #555; -} -.panel-footer-noborder { - border-width: 1px 0 0 0; -} -.panel-hleft, -.panel-hright { - position: relative; -} -.panel-hleft>.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #666; - border-color: #000; -} -.accordion .accordion-header { - background: #3d3d3d; - filter: none; -} -.accordion .accordion-header-selected { - background: #0052A3; -} -.accordion .accordion-header-selected .panel-title { - color: #fff; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #3d3d3d; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #666; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #000; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #3d3d3d; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #666; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #000; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #3d3d3d; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #666; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #000; -} -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.window-shadow { - background: #777; - -moz-box-shadow: 2px 2px 3px #787878; - -webkit-box-shadow: 2px 2px 3px #787878; - box-shadow: 2px 2px 3px #787878; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #000; -} -.window { - background-color: #3d3d3d; - background: -webkit-linear-gradient(top,#454545 0,#383838 20%); - background: -moz-linear-gradient(top,#454545 0,#383838 20%); - background: -o-linear-gradient(top,#454545 0,#383838 20%); - background: linear-gradient(to bottom,#454545 0,#383838 20%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); -} -.window-proxy { - border: 1px dashed #000; -} -.window-proxy-mask, -.window-mask { - background: #000; -} -.window .panel-footer { - border: 1px solid #000; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #444; - border-right: 1px solid #777; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #555; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #000 #000 #222 #000; -} -.dialog-button { - border-color: #222 #000 #000 #000; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #555; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.l-btn { - text-decoration: none; - display: inline-block; - overflow: hidden; - margin: 0; - padding: 0; - cursor: pointer; - outline: none; - text-align: center; - vertical-align: middle; - line-height: normal; -} -.l-btn-plain { - border-width: 0; - padding: 1px; -} -.l-btn-left { - display: inline-block; - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - vertical-align: top; -} -.l-btn-text { - display: inline-block; - vertical-align: top; - width: auto; - line-height: 28px; - font-size: 14px; - padding: 0; - margin: 0 6px; -} -.l-btn-icon { - display: inline-block; - width: 16px; - height: 16px; - line-height: 16px; - position: absolute; - top: 50%; - margin-top: -8px; - font-size: 1px; -} -.l-btn span span .l-btn-empty { - display: inline-block; - margin: 0; - width: 16px; - height: 24px; - font-size: 1px; - vertical-align: top; -} -.l-btn span .l-btn-icon-left { - padding: 0 0 0 20px; - background-position: left center; -} -.l-btn span .l-btn-icon-right { - padding: 0 20px 0 0; - background-position: right center; -} -.l-btn-icon-left .l-btn-text { - margin: 0 6px 0 26px; -} -.l-btn-icon-left .l-btn-icon { - left: 6px; -} -.l-btn-icon-right .l-btn-text { - margin: 0 26px 0 6px; -} -.l-btn-icon-right .l-btn-icon { - right: 6px; -} -.l-btn-icon-top .l-btn-text { - margin: 20px 4px 0 4px; -} -.l-btn-icon-top .l-btn-icon { - top: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-icon-bottom .l-btn-text { - margin: 0 4px 20px 4px; -} -.l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-left .l-btn-empty { - margin: 0 6px; - width: 16px; -} -.l-btn-plain:hover { - padding: 0; -} -.l-btn-focus { - outline: #0000FF dotted thin; -} -.l-btn-large .l-btn-text { - line-height: 44px; -} -.l-btn-large .l-btn-icon { - width: 32px; - height: 32px; - line-height: 32px; - margin-top: -16px; -} -.l-btn-large .l-btn-icon-left .l-btn-text { - margin-left: 40px; -} -.l-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.l-btn-large .l-btn-icon-top .l-btn-text { - margin-top: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-top .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-left .l-btn-empty { - margin: 0 6px; - width: 32px; -} -.l-btn { - color: #fff; - background: #777; - background-repeat: repeat-x; - border: 1px solid #555; - background: -webkit-linear-gradient(top,#919191 0,#6a6a6a 100%); - background: -moz-linear-gradient(top,#919191 0,#6a6a6a 100%); - background: -o-linear-gradient(top,#919191 0,#6a6a6a 100%); - background: linear-gradient(to bottom,#919191 0,#6a6a6a 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#919191,endColorstr=#6a6a6a,GradientType=0); - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.l-btn:hover { - background: #777; - color: #fff; - border: 1px solid #555; - filter: none; -} -.l-btn-plain { - background: transparent; - border-width: 0; - filter: none; -} -.l-btn-outline { - border-width: 1px; - border-color: #555; - padding: 0; -} -.l-btn-plain:hover { - background: #777; - color: #fff; - border: 1px solid #555; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.l-btn-disabled, -.l-btn-disabled:hover { - opacity: 0.5; - cursor: default; - background: #777; - color: #fff; - background: -webkit-linear-gradient(top,#919191 0,#6a6a6a 100%); - background: -moz-linear-gradient(top,#919191 0,#6a6a6a 100%); - background: -o-linear-gradient(top,#919191 0,#6a6a6a 100%); - background: linear-gradient(to bottom,#919191 0,#6a6a6a 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#919191,endColorstr=#6a6a6a,GradientType=0); -} -.l-btn-disabled .l-btn-text, -.l-btn-disabled .l-btn-icon { - filter: alpha(opacity=50); -} -.l-btn-plain-disabled, -.l-btn-plain-disabled:hover { - background: transparent; - filter: alpha(opacity=50); -} -.l-btn-selected, -.l-btn-selected:hover { - background: #000; - filter: none; -} -.l-btn-plain-selected, -.l-btn-plain-selected:hover { - background: #000; -} -.textbox { - position: relative; - border: 1px solid #000; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #000000; - -moz-box-shadow: 0 0 3px 0 #000; - -webkit-box-shadow: 0 0 3px 0 #000; - box-shadow: 0 0 3px 0 #000; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; -} -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #666; -} -.combo-arrow { - background-color: #3d3d3d; -} -.combo-arrow-hover { - background-color: #777; -} -.combo-arrow:hover { - background-color: #777; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #777; - color: #fff; -} -.combobox-item-selected { - background-color: #0052A3; - color: #fff; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #777; - color: #fff; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} -.layout { - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - z-index: 0; -} -.layout-panel { - position: absolute; - overflow: hidden; -} -.layout-body { - min-width: 1px; - min-height: 1px; -} -.layout-panel-east, -.layout-panel-west { - z-index: 2; -} -.layout-panel-north, -.layout-panel-south { - z-index: 3; -} -.layout-expand { - position: absolute; - padding: 0px; - font-size: 1px; - cursor: pointer; - z-index: 1; -} -.layout-expand .panel-header, -.layout-expand .panel-body { - background: transparent; - filter: none; - overflow: hidden; -} -.layout-expand .panel-header { - border-bottom-width: 0px; -} -.layout-expand .panel-body { - position: relative; -} -.layout-expand .panel-body .panel-icon { - margin-top: 0; - top: 0; - left: 50%; - margin-left: -8px; -} -.layout-expand-west .panel-header .panel-icon, -.layout-expand-east .panel-header .panel-icon { - display: none; -} -.layout-expand-title { - position: absolute; - top: 0; - left: 21px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.layout-expand-title-up { - position: absolute; - top: 0; - left: 0; - text-align: right; - padding-left: 5px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 0; -} -.layout-expand-with-icon { - top: 18px; -} -.layout-expand .panel-body-noheader .layout-expand-title, -.layout-expand .panel-body-noheader .panel-icon { - top: 5px; -} -.layout-expand .panel-body-noheader .layout-expand-with-icon { - top: 23px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - position: absolute; - font-size: 1px; - display: none; - z-index: 5; -} -.layout-split-proxy-h { - width: 5px; - cursor: e-resize; -} -.layout-split-proxy-v { - height: 5px; - cursor: n-resize; -} -.layout-mask { - position: absolute; - background: #fafafa; - filter: alpha(opacity=10); - opacity: 0.10; - z-index: 4; -} -.layout-button-up { - background: url('images/layout_arrows.png') no-repeat -16px -16px; -} -.layout-button-down { - background: url('images/layout_arrows.png') no-repeat -16px 0; -} -.layout-button-left { - background: url('images/layout_arrows.png') no-repeat 0 0; -} -.layout-button-right { - background: url('images/layout_arrows.png') no-repeat 0 -16px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - background-color: #cccccc; -} -.layout-split-north { - border-bottom: 5px solid #444; -} -.layout-split-south { - border-top: 5px solid #444; -} -.layout-split-east { - border-left: 5px solid #444; -} -.layout-split-west { - border-right: 5px solid #444; -} -.layout-expand { - background-color: #3d3d3d; -} -.layout-expand-over { - background-color: #3d3d3d; -} -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 5px 5px; - -webkit-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #3d3d3d url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #3d3d3d url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #777; - color: #fff; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #666; - color: #fff; - background: -webkit-linear-gradient(top,#454545 0,#666 100%); - background: -moz-linear-gradient(top,#454545 0,#666 100%); - background: -o-linear-gradient(top,#454545 0,#666 100%); - background: linear-gradient(to bottom,#454545 0,#666 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=0); -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(top,#666 0,#454545 100%); - background: -moz-linear-gradient(top,#666 0,#454545 100%); - background: -o-linear-gradient(top,#666 0,#454545 100%); - background: linear-gradient(to bottom,#666 0,#454545 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=0); -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#454545 0,#666 100%); - background: -moz-linear-gradient(left,#454545 0,#666 100%); - background: -o-linear-gradient(left,#454545 0,#666 100%); - background: linear-gradient(to right,#454545 0,#666 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=1); -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#666 0,#454545 100%); - background: -moz-linear-gradient(left,#666 0,#454545 100%); - background: -o-linear-gradient(left,#666 0,#454545 100%); - background: linear-gradient(to right,#666 0,#454545 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=1); -} -.tabs li a.tabs-inner { - color: #fff; - background-color: #3d3d3d; - background: -webkit-linear-gradient(top,#454545 0,#383838 100%); - background: -moz-linear-gradient(top,#454545 0,#383838 100%); - background: -o-linear-gradient(top,#454545 0,#383838 100%); - background: linear-gradient(to bottom,#454545 0,#383838 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); -} -.tabs-header, -.tabs-tool { - background-color: #3d3d3d; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #000; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #777; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #666; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #666; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #666; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #666; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #0052A3; - color: #fff; - filter: none; - border-color: #000; -} -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #444; - border-right: 1px solid #777; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #000; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #666 url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #444; - background: -webkit-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); - background: -moz-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); - background: -o-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%); - background: linear-gradient(to bottom,#4c4c4c 0,#3f3f3f 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4c4c4c,endColorstr=#3f3f3f,GradientType=0); -} -.datagrid-cell-rownumber { - color: #fff; -} -.datagrid-resize-proxy { - background: #cccccc; -} -.datagrid-mask { - background: #000; -} -.datagrid-mask-msg { - border-color: #000; -} -.datagrid-toolbar, -.datagrid-pager { - background: #555; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #222; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #222; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #fff; - border-collapse: separate; -} -.datagrid-row-alt { - background: #555; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #777; - color: #fff; - cursor: default; -} -.datagrid-row-selected { - background: #0052A3; - color: #fff; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #222; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #3d3d3d; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #222; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #3d3d3d; -} -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #444; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #222; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #fff; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #222; -} -.m-list li>a:hover { - background: #777; - color: #fff; -} -.m-list .m-list-group { - padding: 0 4px; -} -.pagination { - zoom: 1; - padding: 2px; -} -.pagination table { - float: left; - height: 30px; -} -.pagination td { - border: 0; -} -.pagination-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #444; - border-right: 1px solid #777; - margin: 3px 1px; -} -.pagination .pagination-num { - border-width: 1px; - border-style: solid; - margin: 0 2px; - padding: 2px; - width: 3em; - height: auto; - text-align: center; - font-size: 14px; -} -.pagination-page-list { - margin: 0px 6px; - padding: 1px 2px; - width: auto; - height: auto; - border-width: 1px; - border-style: solid; -} -.pagination-info { - float: right; - margin: 0 6px; - padding: 0; - height: 30px; - line-height: 30px; - font-size: 14px; -} -.pagination span { - font-size: 14px; -} -.pagination-link .l-btn-text { - box-sizing: border-box; - text-align: center; - margin: 0; - padding: 0 .5em; - width: auto; - min-width: 28px; -} -.pagination-first { - background: url('images/pagination_icons.png') no-repeat 0 center; -} -.pagination-prev { - background: url('images/pagination_icons.png') no-repeat -16px center; -} -.pagination-next { - background: url('images/pagination_icons.png') no-repeat -32px center; -} -.pagination-last { - background: url('images/pagination_icons.png') no-repeat -48px center; -} -.pagination-load { - background: url('images/pagination_icons.png') no-repeat -64px center; -} -.pagination-loading { - background: url('images/loading.gif') no-repeat center center; -} -.pagination-page-list, -.pagination .pagination-num { - border-color: #000; -} -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-body th, -.calendar-menu-month { - color: #ffffff; -} -.calendar-day { - color: #fff; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #000; -} -.calendar { - border-color: #000; -} -.calendar-header { - background: #3d3d3d; -} -.calendar-body, -.calendar-menu { - background: #666; -} -.calendar-body th { - background: #555; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #777; - color: #fff; -} -.calendar-hover { - border: 1px solid #555; - padding: 0; -} -.calendar-selected { - background-color: #0052A3; - color: #fff; - border: 1px solid #00458a; - padding: 0; -} -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #555; -} -.datebox-button a { - color: #fff; -} -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #3d3d3d; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #fff; - outline-style: none; - background-color: #3d3d3d; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #777; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #777; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #3d3d3d; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #3d3d3d; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #3d3d3d; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.progressbar { - border-color: #000; -} -.progressbar-text { - color: #fff; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #0052A3; - color: #fff; -} -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #3d3d3d; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 5px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #000; - background: #3d3d3d; -} -.slider-rule span { - border-color: #000; -} -.slider-rulelabel span { - color: #fff; -} -.menu { - position: absolute; - margin: 0; - padding: 2px; - border-width: 1px; - border-style: solid; - overflow: hidden; -} -.menu-inline { - position: relative; -} -.menu-item { - position: relative; - margin: 0; - padding: 0; - overflow: hidden; - white-space: nowrap; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.menu-text { - height: 20px; - line-height: 20px; - float: left; - padding-left: 28px; -} -.menu-icon { - position: absolute; - width: 16px; - height: 16px; - left: 2px; - top: 50%; - margin-top: -8px; -} -.menu-rightarrow { - position: absolute; - width: 16px; - height: 16px; - right: 0; - top: 50%; - margin-top: -8px; -} -.menu-line { - position: absolute; - left: 26px; - top: 0; - height: 2000px; - font-size: 1px; -} -.menu-sep { - margin: 3px 0px 3px 25px; - font-size: 1px; -} -.menu-noline .menu-line { - display: none; -} -.menu-noline .menu-sep { - margin-left: 0; - margin-right: 0; -} -.menu-active { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.menu-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); - cursor: default; -} -.menu-text, -.menu-text span { - font-size: 14px; -} -.menu-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #777; - -moz-box-shadow: 2px 2px 3px #787878; - -webkit-box-shadow: 2px 2px 3px #787878; - box-shadow: 2px 2px 3px #787878; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.menu-rightarrow { - background: url('images/menu_arrows.png') no-repeat -32px center; -} -.menu-line { - border-left: 1px solid #444; - border-right: 1px solid #777; -} -.menu-sep { - border-top: 1px solid #444; - border-bottom: 1px solid #777; -} -.menu { - background-color: #666; - border-color: #444; - color: #fff; -} -.menu-content { - background: #666; -} -.menu-item { - border-color: transparent; - _border-color: #666; -} -.menu-active { - border-color: #555; - color: #fff; - background: #777; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #fff; -} -.m-btn-downarrow, -.s-btn-downarrow { - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - font-size: 1px; - right: 0; - top: 50%; - margin-top: -8px; -} -.m-btn-active, -.s-btn-active { - background: #777; - color: #fff; - border: 1px solid #555; - filter: none; -} -.m-btn-plain-active, -.s-btn-plain-active { - background: transparent; - padding: 0; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.m-btn .l-btn-left .l-btn-text { - margin-right: 20px; -} -.m-btn .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.m-btn .l-btn-icon-right .l-btn-icon { - right: 20px; -} -.m-btn .l-btn-icon-top .l-btn-text { - margin-right: 4px; - margin-bottom: 14px; -} -.m-btn .l-btn-icon-bottom .l-btn-text { - margin-right: 4px; - margin-bottom: 34px; -} -.m-btn .l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 20px; -} -.m-btn .l-btn-icon-top .m-btn-downarrow, -.m-btn .l-btn-icon-bottom .m-btn-downarrow { - top: auto; - bottom: 0px; - left: 50%; - margin-left: -8px; -} -.m-btn-line { - display: inline-block; - position: absolute; - font-size: 1px; - display: none; -} -.m-btn .l-btn-left .m-btn-line { - right: 0; - width: 16px; - height: 500px; - border-style: solid; - border-color: #cccccc; - border-width: 0 0 0 1px; -} -.m-btn .l-btn-icon-top .m-btn-line, -.m-btn .l-btn-icon-bottom .m-btn-line { - left: 0; - bottom: 0; - width: 500px; - height: 16px; - border-width: 1px 0 0 0; -} -.m-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 56px; -} -.m-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 50px; -} -.m-btn-downarrow, -.s-btn-downarrow { - background: url('images/menu_arrows.png') no-repeat 0 center; -} -.m-btn-plain-active, -.s-btn-plain-active { - border-color: #555; - background-color: #777; - color: #fff; -} -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #cccccc; - border-width: 0 0 0 1px; -} -.messager-body { - padding: 10px 10px 30px 10px; - overflow: auto; -} -.messager-button { - text-align: center; - padding: 5px; -} -.messager-button .l-btn { - width: 70px; -} -.messager-icon { - float: left; - width: 32px; - height: 32px; - margin: 0 10px 10px 0; -} -.messager-error { - background: url('images/messager_icons.png') no-repeat scroll -64px 0; -} -.messager-info { - background: url('images/messager_icons.png') no-repeat scroll 0 0; -} -.messager-question { - background: url('images/messager_icons.png') no-repeat scroll -32px 0; -} -.messager-warning { - background: url('images/messager_icons.png') no-repeat scroll -96px 0; -} -.messager-progress { - padding: 10px; -} -.messager-p-msg { - margin-bottom: 5px; -} -.messager-body .messager-input { - width: 100%; - padding: 4px 0; - outline-style: none; - border: 1px solid #000; -} -.window-thinborder .messager-button { - padding-bottom: 8px; -} -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #000; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #666; - color: #fff; - border-color: #000; -} -.tree-node-hover { - background: #777; - color: #fff; -} -.tree-node-selected { - background: #0052A3; - color: #fff; -} -.tree-node-hidden { - display: none; -} -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #666; - border-color: #000; - color: #fff; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #000; -} -.tooltip-right .tooltip-arrow { - border-right-color: #666; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #000; -} -.tooltip-left .tooltip-arrow { - border-left-color: #666; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #000; -} -.tooltip-top .tooltip-arrow { - border-top-color: #666; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #000; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #666; -} -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #555; - border: 1px solid #555; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-on { - background: #0052A3; - color: #fff; -} -.switchbutton-off { - background-color: #666; - color: #fff; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #666; - color: #fff; - border: 1px solid #555; - -moz-box-shadow: 0 0 3px 0 #555; - -webkit-box-shadow: 0 0 3px 0 #555; - box-shadow: 0 0 3px 0 #555; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} -.radiobutton { - position: relative; - border: 2px solid #00458a; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #00458a; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.checkbox { - position: relative; - border: 2px solid #00458a; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.checkbox-checked { - border: 0; - background: #00458a; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #fff; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #fff; -} -.sidemenu .accordion-header:hover { - background: #777; - color: #fff; -} -.sidemenu .tree-node-hover { - background: #777; - color: #fff; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #00458a; - color: #fff; - background: #0052A3; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/filebox.css deleted file mode 100644 index c6bac6631..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/filebox.css +++ /dev/null @@ -1,20 +0,0 @@ -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/accordion_arrows.png deleted file mode 100755 index 45fd44aa30476e107428feeea74273a354d3b003..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel%uDMV@SoVN1z5L3B> xDW~hhNx=}0EonJY9@lzK3(R79rLjPWf#H~1{zPk!fAK(V44$rjF6*2Ung9evL?JRtAPgomjiGH|9{f$n(B`$j zEeb&pg!EKZW!#K$4@xNm$yT6c41rc&wh}>_*7}p71!8&8673tn-QQiFh646*YwHT+ z)EV#dB}QIviTL0tB!=YS+5%Rf3nh>uG`~OIR&I9Pb&1#X>AvnQFNH)(9OKtKv|Z?jXgA8=g#}$o8PwWf~s)v4TOWbIh-FayvCIQ*!i4(A|Z*a`pRGU y`z_2`-mf|ief_$wXW7b|3Y(^xL#4%pFkRlNzMe3nx0Htf00005OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$f3kcwMx!yWk;1b9CG_kXOx zmzFK*Ssi^NN-27((w?4M8@u`^_qP=9nfy4m{lwb6;U^wS@qDtp9?C45@HGEwayQ3S z%Ua=ZSB3W+c`gDw6;3c4*f@AGFEUxQKH4x2D*a5)78&qol`;+03qN((f|Me diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/linkbutton_bg.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/linkbutton_bg.png deleted file mode 100755 index fc66bd2cd24047b8377342365a1df3846327ecde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmVc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/loading.gif deleted file mode 100755 index 68f01d04813c1f622810864a3aaa04b4a17ac8f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/menu_arrows.png deleted file mode 100755 index 2a984941d6590c78d67ee68d2087d8cc88efbac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQof!pjv*Dd-d;V(%b>u);`l3H z>g53sy@tf+`c*Dhco^6|8Eg#8WENqsU-wu%RB=*I5D$X7F_Nb6Mw<&;$S;RV&B< diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/messager_icons.png deleted file mode 100755 index 62c18c135860351063ebaabe8c0f4df7664b8f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000P2Jv3>80t+5#NSCz>DdY1?+6=lRq-0N)F#H;wIQi`C_sJ!SVT`Wft}8_wH~Q%XA*9t9fT|c lGy-mR diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/panel_tools.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/panel_tools.png deleted file mode 100755 index f97761eb393def3b5f61774142413e740fe8fe8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^20*O9!3HEluKbn(QuUrLjv*Dd-p+93Yfuni{`r6T z$48CLf{EOzXU|M@xy0GMavBpu(5ti8zb3QZ+Tfp^siO37?WI*8%sM?7u5w1XttgAw z*Z5axHOr-aZj1~Mw;UHx3vIVCg!0FXpSG5`Po diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_close.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_close.png deleted file mode 100644 index 276b57974284d1449250e362644dd7416632d92c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/passwordbox_open.png deleted file mode 100644 index 0f25d535e05b22b406fd72647611aace9cfa6249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/searchbox_button.png deleted file mode 100755 index 6dd1931589b453f6cc9772fd1851d8705d6b6631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/spinner_arrows.png deleted file mode 100755 index 349d7d9d1dd5757fe673c74779ca4397b3ac9880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQo)`sjv*Dd-cGgTVld!f`TKvl zx$i261Imkz%njSa<|ydo5x!wz!%F5U-;Ot$9v8}1XAs{bw8eCRinje8hmeGw4b#=% p?40+0pF;`bK1VJIy@m-jV#fsL6&$#pdj@DcgQu&X%Q~loCIE{>Fhc+U diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tabs_icons.png deleted file mode 100755 index 732b1237a14cf6c525dee8646f322d5603664866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2O2978H@B_~L*E^a7$U@!3C zaj-Z4S(*MEORM>}ezCPaUb%ArQw1m64&Nzopr0N{TzyZ`_I diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tagbox_icons.png deleted file mode 100644 index faddd10cab63488000e766ca3cb10a4a21671c10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoV($fFg z6O)c!JXo)x5GJ#nd4ld?HMbLtC#EF|E8h}a647_oX_D^oryN0xCn=p~zr)BZ#mYR7 hgWX2DuSt-dVWQ=IMMbkYnLu+HJYD@<);T3K0RXNJC2Rly diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/tree_icons.png deleted file mode 100755 index 2b4fd2025c7588c84df27d89466b470e273f5c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3086 zcmV+p4Ds`cP)~TesqeqN>v{0t!Gi}6eg)$W;^97jYuB!YrL@_X1+wAp+no|T zcDh$_O7P%eqeu&X29&AWo<{PPpCRe9F=#J60RjkzE?U3Z3?eJo?8kQd7R}F@guc7` zUhkAAqN4FO%Cs%*PXFraYFJ9He{gzxb|BR7?~fB=#%+2M*65p>Z;2^ae-9wWQ(T@F zZaqY%vR>>jE}y>~JsP`eXW;4mkGHVp>~)jt(@xyDaic>lTycF1-p_49Lgg*AH$eFE zj$3Ze&Lbx(M9AM5$q=0S$KyD$&JR&*2I1S)190S{e)xKo4_d<`!brlRUWo%SbRteO zom2t_`k39pxnAR4*7f;5=sSNzH_gT5Z^wcKvw3DU5(x_n3vF`Jqobq6&y%xm{>>Kj zkJn;UvKH#nW}AHfS7l8I$ZkYwo$1dr{DB*8Z+kbepW64^s{^4fhtfE-(i_>?*|=XH zVJ2Ja&!0aJV-Ca+7RKC&r1RZ4sNQ?spiK6fS3e`W=E&ad9q7AxaQ)`ecaYUGA5)Hw z2m6!DDvJk&HuC!Q>*B_0G#c0f9&!P4`Nk~~Apg1Agi%Ra>}?}N_7yjZpGSG+CI^VU z0K{H`#w&Djf z0_%Bqr)Ccx*8RPK2Pa29i~m*!A)_T2(~dunu7LwK$~q|0kEf!dLfnMP%1X2a9y4al zkPVQFcL0)J*^I9UB7zf1tg@~MNRGi!Ht0)U&-vq9$5%ux$@vHGzdJn%P78(}5M7B9fKZf| zmqT(S*1|&(Kx*y*B&(_!N6K}LKkJ6Ffz^F_@Q?sfP|F<%cObTngil848mDXr5ssbj zIo$<_Jogfg%V&ag>t9?W>Wu?LnFD#`Rn-$C)<3IFY}$gLn0IbF&mU4eYW>){Ems1O zqTPfubt^F^b}HQGJsHKkz1?LWl(sq$LwG0w$fY|Dgy8XYSu;ip4kSsT1EDbweRxO! zDdJt2pA10SYYc>DO2o!lwO(Ed>;5~aduxDL=(cF9*Nf}7d><_8ZQ($K=;kqN)b_Bn zKx8)Tz|z#;Vt4U!oU8d1N2^z2;kjR<*Zgr=%zt!$MF+2~V<4smkK|}`YjprQBEW;X zFZ-`59|NHQQ)%2oN_wxXUOqthay|2cG59Ot>ZbYDi2oTcWg@{G)sFA!= zg~B5*iF&IXh>@w>o>L~gI&Q;rw~th;!`Yh6I9mR99RBfr1gE@?KJ#DDF#icdn6&_~ z)hvvXD6G@X!i-MR;=onw22g3Xg$7J%%!9fu|2B0O>b=n%7ga-Yl3N_dLcf zo7$*)?u}Wz1@Pd}jzK`6Zi$@Khldmd1nQQ^Nqu-o08x_0wtw{G>1#*Ke5+~rb8o-T z&n6GMx`OlV=fQ&q4<0=DRjl*uKd%YGg9i^DJh%hl4utC;)(B;6_(4Cvw6g(ovBT5z z+sTZ1NXuSf%ypBS+u^8y0DLxL#Kl0y#&I(6;9sSot@S$Hy(BGVW#u(7 zNn=cZVCc~E)t3Z#M67{!SZ}nPJcN?ebbR9Fb!xqf%Qu?1v#5;ZdAF?usn#Ms$_ImDpe_KFM#mn9k<+`9f+L9UsrciY{0b4)_OVcsIRYU zrH`NU2ee$x6X4MU)xHeZ20KCyx8)2 zq~~CiJOpPLq@$;DtvxAJjf@_qqvv9%N|_QZJqtq*&(Tx4Z2<^>B9~VslM4_zjbE#+ zhqSIzz3K}U8XB|~^m%w}_fQN}`(el)Kk?OX&k!*Q9uh$G^*elhkCzB8gPg~;!H=L+ zfQY8ABdWeRgzKlH1bDb2*_9#IxeJPSY{!-Kbc78WlxX&V&=a`&Pvlw)5NjbqRmi9s z8C4}CfKZh(C3Vj~9*e5{j$$`j$M`L4y8334vha7;AR<%bZfE|)#9q!{3TatMm4M)F3z5tKQUJTiToN<1j8&cc^cnI#J@bj%G7P>lN zDpl%K;VVrZ466M>LA5}P{fLwRM5+U#1R_*@jGPBmBcq~11c8eR0YXpV>Q^FDn}CR6 zbt$D)z1pfb)xg?I-_iTu)~aJ|br81terl9*;9;x*8|n!Z#^6C|PA_#^BnLtuA%IAK zlh%~}7mT@o+@r?{&DnTVMSdy3!wne%L{dB%;=Q^FgYtdpZW!Pke*SfgVVCRDeehhSNQrpgFJ?IZ4S_ z=HU_TEx^X?!LYRhQ3?^NK1Nl@s2UkTgc|=Pg$|_XX0y?XWR}K6I6!z+GHb^`J~RyBVNNd%nCf?32q01y#+07i2Tj!$#Kr3dOnqFDEOcAqdph8ZXLlU$#t_-v z0l9m2BR3-hON8!@ztHVzw=ocFs*+I^GU~=qRWfS$RHaPGcT@2oQ&q|MEC`>4c@Pdn z4m`{Oz+AUQj$WE=(RUtFH-_FbrQg)E*WtXACvoFU6teob>c%{r88ka01n032k&X^H zEHvl6j*hsbRwFwu4#9o9CqmsB8WW*`RdfF@ zjPwKN_i^y5WY#zkIq)zC0DV0TmKuYHIlcZ=tu$aNM;{e12Tj7?8Qva9e1rx}yP_~6 z9QlIVxSW`XoV{x7b8x^;0V3hux}ivTUmX%6@3?mKeIQhojP3)WDrJlZk524B)&TBElF4`cdm!-wZo=4(*!!4kx}yPbN~PV07*qoM6N<$fk diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/images/validatebox_warning.png deleted file mode 100755 index 2b3d4f05babf3f82b146350e96570fac02075de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/passwordbox.css deleted file mode 100644 index 92c9ce586..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/passwordbox.css +++ /dev/null @@ -1,6 +0,0 @@ -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/progressbar.css deleted file mode 100644 index e89cb3a35..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/progressbar.css +++ /dev/null @@ -1,33 +0,0 @@ -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.progressbar { - border-color: #000; -} -.progressbar-text { - color: #fff; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #0052A3; - color: #fff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/propertygrid.css deleted file mode 100644 index 871c585e5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/propertygrid.css +++ /dev/null @@ -1,27 +0,0 @@ -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #222; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #3d3d3d; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #222; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #3d3d3d; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/radiobutton.css deleted file mode 100644 index a31bc36e5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/radiobutton.css +++ /dev/null @@ -1,25 +0,0 @@ -.radiobutton { - position: relative; - border: 2px solid #00458a; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #00458a; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/searchbox.css deleted file mode 100644 index 01f669742..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/searchbox.css +++ /dev/null @@ -1,61 +0,0 @@ -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #3d3d3d; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/sidemenu.css deleted file mode 100644 index 396db6350..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/sidemenu.css +++ /dev/null @@ -1,69 +0,0 @@ -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #fff; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #fff; -} -.sidemenu .accordion-header:hover { - background: #777; - color: #fff; -} -.sidemenu .tree-node-hover { - background: #777; - color: #fff; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #00458a; - color: #fff; - background: #0052A3; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/slider.css deleted file mode 100644 index 22d97447c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/slider.css +++ /dev/null @@ -1,101 +0,0 @@ -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 5px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #000; - background: #3d3d3d; -} -.slider-rule span { - border-color: #000; -} -.slider-rulelabel span { - color: #fff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/spinner.css deleted file mode 100644 index 9d8010293..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/spinner.css +++ /dev/null @@ -1,114 +0,0 @@ -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #3d3d3d; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #fff; - outline-style: none; - background-color: #3d3d3d; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #777; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #777; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #3d3d3d; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #3d3d3d; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #3d3d3d; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/splitbutton.css deleted file mode 100644 index b42e3963f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/splitbutton.css +++ /dev/null @@ -1,12 +0,0 @@ -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #cccccc; - border-width: 0 0 0 1px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/switchbutton.css deleted file mode 100644 index 0e78b569b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/switchbutton.css +++ /dev/null @@ -1,77 +0,0 @@ -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #555; - border: 1px solid #555; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-on { - background: #0052A3; - color: #fff; -} -.switchbutton-off { - background-color: #666; - color: #fff; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #666; - color: #fff; - border: 1px solid #555; - -moz-box-shadow: 0 0 3px 0 #555; - -webkit-box-shadow: 0 0 3px 0 #555; - box-shadow: 0 0 3px 0 #555; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tabs.css deleted file mode 100644 index 65a465c13..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tabs.css +++ /dev/null @@ -1,413 +0,0 @@ -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 5px 5px; - -webkit-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #3d3d3d url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #3d3d3d url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #777; - color: #fff; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #666; - color: #fff; - background: -webkit-linear-gradient(top,#454545 0,#666 100%); - background: -moz-linear-gradient(top,#454545 0,#666 100%); - background: -o-linear-gradient(top,#454545 0,#666 100%); - background: linear-gradient(to bottom,#454545 0,#666 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=0); -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(top,#666 0,#454545 100%); - background: -moz-linear-gradient(top,#666 0,#454545 100%); - background: -o-linear-gradient(top,#666 0,#454545 100%); - background: linear-gradient(to bottom,#666 0,#454545 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=0); -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#454545 0,#666 100%); - background: -moz-linear-gradient(left,#454545 0,#666 100%); - background: -o-linear-gradient(left,#454545 0,#666 100%); - background: linear-gradient(to right,#454545 0,#666 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=1); -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#666 0,#454545 100%); - background: -moz-linear-gradient(left,#666 0,#454545 100%); - background: -o-linear-gradient(left,#666 0,#454545 100%); - background: linear-gradient(to right,#666 0,#454545 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=1); -} -.tabs li a.tabs-inner { - color: #fff; - background-color: #3d3d3d; - background: -webkit-linear-gradient(top,#454545 0,#383838 100%); - background: -moz-linear-gradient(top,#454545 0,#383838 100%); - background: -o-linear-gradient(top,#454545 0,#383838 100%); - background: linear-gradient(to bottom,#454545 0,#383838 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); -} -.tabs-header, -.tabs-tool { - background-color: #3d3d3d; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #000; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #777; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #666; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #666; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #666; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #666; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #0052A3; - color: #fff; - filter: none; - border-color: #000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tagbox.css deleted file mode 100644 index e08ec87b4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tagbox.css +++ /dev/null @@ -1,44 +0,0 @@ -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #777; - color: #fff; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/textbox.css deleted file mode 100644 index 1d18ad9fe..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/textbox.css +++ /dev/null @@ -1,144 +0,0 @@ -.textbox { - position: relative; - border: 1px solid #000; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #000000; - -moz-box-shadow: 0 0 3px 0 #000; - -webkit-box-shadow: 0 0 3px 0 #000; - box-shadow: 0 0 3px 0 #000; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tooltip.css deleted file mode 100644 index 13e310d06..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tooltip.css +++ /dev/null @@ -1,103 +0,0 @@ -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #666; - border-color: #000; - color: #fff; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #000; -} -.tooltip-right .tooltip-arrow { - border-right-color: #666; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #000; -} -.tooltip-left .tooltip-arrow { - border-left-color: #666; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #000; -} -.tooltip-top .tooltip-arrow { - border-top-color: #666; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #000; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #666; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tree.css deleted file mode 100644 index 08e484951..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/tree.css +++ /dev/null @@ -1,164 +0,0 @@ -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #000; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #666; - color: #fff; - border-color: #000; -} -.tree-node-hover { - background: #777; - color: #fff; -} -.tree-node-selected { - background: #0052A3; - color: #fff; -} -.tree-node-hidden { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/validatebox.css deleted file mode 100644 index 1fc3ad64e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/validatebox.css +++ /dev/null @@ -1,5 +0,0 @@ -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/window.css deleted file mode 100644 index 03695899d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/black/window.css +++ /dev/null @@ -1,188 +0,0 @@ -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.window-shadow { - background: #777; - -moz-box-shadow: 2px 2px 3px #787878; - -webkit-box-shadow: 2px 2px 3px #787878; - box-shadow: 2px 2px 3px #787878; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #000; -} -.window { - background-color: #3d3d3d; - background: -webkit-linear-gradient(top,#454545 0,#383838 20%); - background: -moz-linear-gradient(top,#454545 0,#383838 20%); - background: -o-linear-gradient(top,#454545 0,#383838 20%); - background: linear-gradient(to bottom,#454545 0,#383838 20%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0); -} -.window-proxy { - border: 1px dashed #000; -} -.window-proxy-mask, -.window-mask { - background: #000; -} -.window .panel-footer { - border: 1px solid #000; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/accordion.css deleted file mode 100644 index 9d268c023..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/accordion.css +++ /dev/null @@ -1,89 +0,0 @@ -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #D4D4D4; -} -.accordion .accordion-header { - background: #F2F2F2; - filter: none; -} -.accordion .accordion-header-selected { - background: #0081c2; -} -.accordion .accordion-header-selected .panel-title { - color: #fff; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #F2F2F2; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #D4D4D4; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #F2F2F2; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #D4D4D4; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #F2F2F2; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #D4D4D4; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/calendar.css deleted file mode 100644 index b3c749516..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/calendar.css +++ /dev/null @@ -1,203 +0,0 @@ -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 12px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 12px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 12px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 12px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 12px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-body th, -.calendar-menu-month { - color: #808080; -} -.calendar-day { - color: #333; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #D4D4D4; -} -.calendar { - border-color: #D4D4D4; -} -.calendar-header { - background: #F2F2F2; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #F5F5F5; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #e6e6e6; - color: #00438a; -} -.calendar-hover { - border: 1px solid #ddd; - padding: 0; -} -.calendar-selected { - background-color: #0081c2; - color: #fff; - border: 1px solid #0070a9; - padding: 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/checkbox.css deleted file mode 100644 index 0edec673f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/checkbox.css +++ /dev/null @@ -1,31 +0,0 @@ -.checkbox { - position: relative; - border: 2px solid #0070a9; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.checkbox-checked { - border: 0; - background: #0070a9; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combo.css deleted file mode 100644 index fc9030d8b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combo.css +++ /dev/null @@ -1,35 +0,0 @@ -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #ffffff; -} -.combo-arrow { - background-color: #F2F2F2; -} -.combo-arrow-hover { - background-color: #e6e6e6; -} -.combo-arrow:hover { - background-color: #e6e6e6; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combobox.css deleted file mode 100644 index f490811a4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/combobox.css +++ /dev/null @@ -1,40 +0,0 @@ -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 12px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #e6e6e6; - color: #00438a; -} -.combobox-item-selected { - background-color: #0081c2; - color: #fff; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datagrid.css deleted file mode 100644 index 8c67b1735..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datagrid.css +++ /dev/null @@ -1,291 +0,0 @@ -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 12px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 12px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #D4D4D4; - font-size: 12px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.datagrid-cell-rownumber { - color: #333; -} -.datagrid-resize-proxy { - background: #bbb; -} -.datagrid-mask { - background: #ccc; -} -.datagrid-mask-msg { - border-color: #D4D4D4; -} -.datagrid-toolbar, -.datagrid-pager { - background: #F5F5F5; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #e6e6e6; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ccc; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #333; - border-collapse: separate; -} -.datagrid-row-alt { - background: #F5F5F5; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #e6e6e6; - color: #00438a; - cursor: default; -} -.datagrid-row-selected { - background: #0081c2; - color: #fff; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datalist.css deleted file mode 100644 index 68e8df6f4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datalist.css +++ /dev/null @@ -1,95 +0,0 @@ -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #F2F2F2; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #333; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.m-list li>a:hover { - background: #e6e6e6; - color: #00438a; -} -.m-list .m-list-group { - padding: 0 4px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datebox.css deleted file mode 100644 index 34e376f2e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/datebox.css +++ /dev/null @@ -1,36 +0,0 @@ -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 12px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #F5F5F5; -} -.datebox-button a { - color: #444; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/dialog.css deleted file mode 100644 index b44497f82..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/dialog.css +++ /dev/null @@ -1,47 +0,0 @@ -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #F5F5F5; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #D4D4D4 #D4D4D4 #e6e6e6 #D4D4D4; -} -.dialog-button { - border-color: #e6e6e6 #D4D4D4 #D4D4D4 #D4D4D4; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #F5F5F5; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/easyui.css deleted file mode 100644 index 4f57b93f6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/easyui.css +++ /dev/null @@ -1,3446 +0,0 @@ -.panel { - overflow: hidden; - text-align: left; - margin: 0; - border: 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.panel-header, -.panel-body { - border-width: 1px; - border-style: solid; -} -.panel-header { - padding: 5px; - position: relative; -} -.panel-title { - background: url('images/blank.gif') no-repeat; -} -.panel-header-noborder { - border-width: 0 0 1px 0; -} -.panel-body { - overflow: auto; - border-top-width: 0; - padding: 0; -} -.panel-body-noheader { - border-top-width: 1px; -} -.panel-body-noborder { - border-width: 0px; -} -.panel-body-nobottom { - border-bottom-width: 0; -} -.panel-with-icon { - padding-left: 18px; -} -.panel-icon, -.panel-tool { - position: absolute; - top: 50%; - margin-top: -8px; - height: 16px; - overflow: hidden; -} -.panel-icon { - left: 5px; - width: 16px; -} -.panel-tool { - right: 5px; - width: auto; -} -.panel-tool a { - display: inline-block; - width: 16px; - height: 16px; - opacity: 0.6; - filter: alpha(opacity=60); - margin: 0 0 0 2px; - vertical-align: top; -} -.panel-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - background-color: #e6e6e6; - -moz-border-radius: 3px 3px 3px 3px; - -webkit-border-radius: 3px 3px 3px 3px; - border-radius: 3px 3px 3px 3px; -} -.panel-loading { - padding: 11px 0px 10px 30px; -} -.panel-noscroll { - overflow: hidden; -} -.panel-fit, -.panel-fit body { - height: 100%; - margin: 0; - padding: 0; - border: 0; - overflow: hidden; -} -.panel-loading { - background: url('images/loading.gif') no-repeat 10px 10px; -} -.panel-tool-close { - background: url('images/panel_tools.png') no-repeat -16px 0px; -} -.panel-tool-min { - background: url('images/panel_tools.png') no-repeat 0px 0px; -} -.panel-tool-max { - background: url('images/panel_tools.png') no-repeat 0px -16px; -} -.panel-tool-restore { - background: url('images/panel_tools.png') no-repeat -16px -16px; -} -.panel-tool-collapse { - background: url('images/panel_tools.png') no-repeat -32px 0; -} -.panel-tool-expand { - background: url('images/panel_tools.png') no-repeat -32px -16px; -} -.panel-header, -.panel-body { - border-color: #D4D4D4; -} -.panel-header { - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.panel-body { - background-color: #ffffff; - color: #333; - font-size: 12px; -} -.panel-title { - font-size: 12px; - font-weight: bold; - color: #777; - height: 20px; - line-height: 20px; -} -.panel-footer { - border: 1px solid #D4D4D4; - overflow: hidden; - background: #F5F5F5; -} -.panel-footer-noborder { - border-width: 1px 0 0 0; -} -.panel-hleft, -.panel-hright { - position: relative; -} -.panel-hleft>.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #D4D4D4; -} -.accordion .accordion-header { - background: #F2F2F2; - filter: none; -} -.accordion .accordion-header-selected { - background: #0081c2; -} -.accordion .accordion-header-selected .panel-title { - color: #fff; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #F2F2F2; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #D4D4D4; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #F2F2F2; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #D4D4D4; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #F2F2F2; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #D4D4D4; -} -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.window-shadow { - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #D4D4D4; -} -.window { - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 20%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 20%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 20%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 20%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.window-proxy { - border: 1px dashed #D4D4D4; -} -.window-proxy-mask, -.window-mask { - background: #ccc; -} -.window .panel-footer { - border: 1px solid #D4D4D4; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #F5F5F5; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #D4D4D4 #D4D4D4 #e6e6e6 #D4D4D4; -} -.dialog-button { - border-color: #e6e6e6 #D4D4D4 #D4D4D4 #D4D4D4; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #F5F5F5; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.l-btn { - text-decoration: none; - display: inline-block; - overflow: hidden; - margin: 0; - padding: 0; - cursor: pointer; - outline: none; - text-align: center; - vertical-align: middle; - line-height: normal; -} -.l-btn-plain { - border-width: 0; - padding: 1px; -} -.l-btn-left { - display: inline-block; - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - vertical-align: top; -} -.l-btn-text { - display: inline-block; - vertical-align: top; - width: auto; - line-height: 28px; - font-size: 12px; - padding: 0; - margin: 0 6px; -} -.l-btn-icon { - display: inline-block; - width: 16px; - height: 16px; - line-height: 16px; - position: absolute; - top: 50%; - margin-top: -8px; - font-size: 1px; -} -.l-btn span span .l-btn-empty { - display: inline-block; - margin: 0; - width: 16px; - height: 24px; - font-size: 1px; - vertical-align: top; -} -.l-btn span .l-btn-icon-left { - padding: 0 0 0 20px; - background-position: left center; -} -.l-btn span .l-btn-icon-right { - padding: 0 20px 0 0; - background-position: right center; -} -.l-btn-icon-left .l-btn-text { - margin: 0 6px 0 26px; -} -.l-btn-icon-left .l-btn-icon { - left: 6px; -} -.l-btn-icon-right .l-btn-text { - margin: 0 26px 0 6px; -} -.l-btn-icon-right .l-btn-icon { - right: 6px; -} -.l-btn-icon-top .l-btn-text { - margin: 20px 4px 0 4px; -} -.l-btn-icon-top .l-btn-icon { - top: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-icon-bottom .l-btn-text { - margin: 0 4px 20px 4px; -} -.l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-left .l-btn-empty { - margin: 0 6px; - width: 16px; -} -.l-btn-plain:hover { - padding: 0; -} -.l-btn-focus { - outline: #0000FF dotted thin; -} -.l-btn-large .l-btn-text { - line-height: 44px; -} -.l-btn-large .l-btn-icon { - width: 32px; - height: 32px; - line-height: 32px; - margin-top: -16px; -} -.l-btn-large .l-btn-icon-left .l-btn-text { - margin-left: 40px; -} -.l-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.l-btn-large .l-btn-icon-top .l-btn-text { - margin-top: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-top .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-left .l-btn-empty { - margin: 0 6px; - width: 32px; -} -.l-btn { - color: #444; - background: #f5f5f5; - background-repeat: repeat-x; - border: 1px solid #bbb; - background: -webkit-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: -moz-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: -o-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: linear-gradient(to bottom,#ffffff 0,#e6e6e6 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0); - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.l-btn:hover { - background: #e6e6e6; - color: #00438a; - border: 1px solid #ddd; - filter: none; -} -.l-btn-plain { - background: transparent; - border-width: 0; - filter: none; -} -.l-btn-outline { - border-width: 1px; - border-color: #ddd; - padding: 0; -} -.l-btn-plain:hover { - background: #e6e6e6; - color: #00438a; - border: 1px solid #ddd; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.l-btn-disabled, -.l-btn-disabled:hover { - opacity: 0.5; - cursor: default; - background: #f5f5f5; - color: #444; - background: -webkit-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: -moz-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: -o-linear-gradient(top,#ffffff 0,#e6e6e6 100%); - background: linear-gradient(to bottom,#ffffff 0,#e6e6e6 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#e6e6e6,GradientType=0); -} -.l-btn-disabled .l-btn-text, -.l-btn-disabled .l-btn-icon { - filter: alpha(opacity=50); -} -.l-btn-plain-disabled, -.l-btn-plain-disabled:hover { - background: transparent; - filter: alpha(opacity=50); -} -.l-btn-selected, -.l-btn-selected:hover { - background: #ddd; - filter: none; -} -.l-btn-plain-selected, -.l-btn-plain-selected:hover { - background: #ddd; -} -.textbox { - position: relative; - border: 1px solid #D4D4D4; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.textbox .textbox-text { - font-size: 12px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 12px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #bbbbbb; - -moz-box-shadow: 0 0 3px 0 #D4D4D4; - -webkit-box-shadow: 0 0 3px 0 #D4D4D4; - box-shadow: 0 0 3px 0 #D4D4D4; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; -} -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #ffffff; -} -.combo-arrow { - background-color: #F2F2F2; -} -.combo-arrow-hover { - background-color: #e6e6e6; -} -.combo-arrow:hover { - background-color: #e6e6e6; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 12px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #e6e6e6; - color: #00438a; -} -.combobox-item-selected { - background-color: #0081c2; - color: #fff; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #e6e6e6; - color: #00438a; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} -.layout { - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - z-index: 0; -} -.layout-panel { - position: absolute; - overflow: hidden; -} -.layout-body { - min-width: 1px; - min-height: 1px; -} -.layout-panel-east, -.layout-panel-west { - z-index: 2; -} -.layout-panel-north, -.layout-panel-south { - z-index: 3; -} -.layout-expand { - position: absolute; - padding: 0px; - font-size: 1px; - cursor: pointer; - z-index: 1; -} -.layout-expand .panel-header, -.layout-expand .panel-body { - background: transparent; - filter: none; - overflow: hidden; -} -.layout-expand .panel-header { - border-bottom-width: 0px; -} -.layout-expand .panel-body { - position: relative; -} -.layout-expand .panel-body .panel-icon { - margin-top: 0; - top: 0; - left: 50%; - margin-left: -8px; -} -.layout-expand-west .panel-header .panel-icon, -.layout-expand-east .panel-header .panel-icon { - display: none; -} -.layout-expand-title { - position: absolute; - top: 0; - left: 21px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.layout-expand-title-up { - position: absolute; - top: 0; - left: 0; - text-align: right; - padding-left: 5px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 0; -} -.layout-expand-with-icon { - top: 18px; -} -.layout-expand .panel-body-noheader .layout-expand-title, -.layout-expand .panel-body-noheader .panel-icon { - top: 5px; -} -.layout-expand .panel-body-noheader .layout-expand-with-icon { - top: 23px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - position: absolute; - font-size: 1px; - display: none; - z-index: 5; -} -.layout-split-proxy-h { - width: 5px; - cursor: e-resize; -} -.layout-split-proxy-v { - height: 5px; - cursor: n-resize; -} -.layout-mask { - position: absolute; - background: #fafafa; - filter: alpha(opacity=10); - opacity: 0.10; - z-index: 4; -} -.layout-button-up { - background: url('images/layout_arrows.png') no-repeat -16px -16px; -} -.layout-button-down { - background: url('images/layout_arrows.png') no-repeat -16px 0; -} -.layout-button-left { - background: url('images/layout_arrows.png') no-repeat 0 0; -} -.layout-button-right { - background: url('images/layout_arrows.png') no-repeat 0 -16px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - background-color: #bbb; -} -.layout-split-north { - border-bottom: 5px solid #eee; -} -.layout-split-south { - border-top: 5px solid #eee; -} -.layout-split-east { - border-left: 5px solid #eee; -} -.layout-split-west { - border-right: 5px solid #eee; -} -.layout-expand { - background-color: #F2F2F2; -} -.layout-expand-over { - background-color: #F2F2F2; -} -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 12px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 5px 5px; - -webkit-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #F2F2F2 url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #F2F2F2 url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #e6e6e6; - color: #00438a; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #777; - background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: linear-gradient(to right,#ffffff 0,#ffffff 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: linear-gradient(to right,#ffffff 0,#ffffff 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); -} -.tabs li a.tabs-inner { - color: #777; - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.tabs-header, -.tabs-tool { - background-color: #F2F2F2; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #D4D4D4; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #e6e6e6; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #0081c2; - color: #fff; - filter: none; - border-color: #D4D4D4; -} -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 12px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 12px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #D4D4D4; - font-size: 12px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.datagrid-cell-rownumber { - color: #333; -} -.datagrid-resize-proxy { - background: #bbb; -} -.datagrid-mask { - background: #ccc; -} -.datagrid-mask-msg { - border-color: #D4D4D4; -} -.datagrid-toolbar, -.datagrid-pager { - background: #F5F5F5; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #e6e6e6; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ccc; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #333; - border-collapse: separate; -} -.datagrid-row-alt { - background: #F5F5F5; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #e6e6e6; - color: #00438a; - cursor: default; -} -.datagrid-row-selected { - background: #0081c2; - color: #fff; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #e6e6e6; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #F2F2F2; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #e6e6e6; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #F2F2F2; -} -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #F2F2F2; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #333; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.m-list li>a:hover { - background: #e6e6e6; - color: #00438a; -} -.m-list .m-list-group { - padding: 0 4px; -} -.pagination { - zoom: 1; - padding: 2px; -} -.pagination table { - float: left; - height: 30px; -} -.pagination td { - border: 0; -} -.pagination-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 3px 1px; -} -.pagination .pagination-num { - border-width: 1px; - border-style: solid; - margin: 0 2px; - padding: 2px; - width: 3em; - height: auto; - text-align: center; - font-size: 12px; -} -.pagination-page-list { - margin: 0px 6px; - padding: 1px 2px; - width: auto; - height: auto; - border-width: 1px; - border-style: solid; -} -.pagination-info { - float: right; - margin: 0 6px; - padding: 0; - height: 30px; - line-height: 30px; - font-size: 12px; -} -.pagination span { - font-size: 12px; -} -.pagination-link .l-btn-text { - box-sizing: border-box; - text-align: center; - margin: 0; - padding: 0 .5em; - width: auto; - min-width: 28px; -} -.pagination-first { - background: url('images/pagination_icons.png') no-repeat 0 center; -} -.pagination-prev { - background: url('images/pagination_icons.png') no-repeat -16px center; -} -.pagination-next { - background: url('images/pagination_icons.png') no-repeat -32px center; -} -.pagination-last { - background: url('images/pagination_icons.png') no-repeat -48px center; -} -.pagination-load { - background: url('images/pagination_icons.png') no-repeat -64px center; -} -.pagination-loading { - background: url('images/loading.gif') no-repeat center center; -} -.pagination-page-list, -.pagination .pagination-num { - border-color: #D4D4D4; -} -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 12px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 12px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 12px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 12px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 12px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-body th, -.calendar-menu-month { - color: #808080; -} -.calendar-day { - color: #333; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #D4D4D4; -} -.calendar { - border-color: #D4D4D4; -} -.calendar-header { - background: #F2F2F2; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #F5F5F5; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #e6e6e6; - color: #00438a; -} -.calendar-hover { - border: 1px solid #ddd; - padding: 0; -} -.calendar-selected { - background-color: #0081c2; - color: #fff; - border: 1px solid #0070a9; - padding: 0; -} -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 12px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #F5F5F5; -} -.datebox-button a { - color: #444; -} -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #F2F2F2; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #444; - outline-style: none; - background-color: #F2F2F2; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #e6e6e6; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #e6e6e6; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #F2F2F2; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #F2F2F2; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #F2F2F2; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.progressbar { - border-color: #D4D4D4; -} -.progressbar-text { - color: #333; - font-size: 12px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #0081c2; - color: #fff; -} -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #F2F2F2; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 5px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 12px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 12px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #D4D4D4; - background: #F2F2F2; -} -.slider-rule span { - border-color: #D4D4D4; -} -.slider-rulelabel span { - color: #333; -} -.menu { - position: absolute; - margin: 0; - padding: 2px; - border-width: 1px; - border-style: solid; - overflow: hidden; -} -.menu-inline { - position: relative; -} -.menu-item { - position: relative; - margin: 0; - padding: 0; - overflow: hidden; - white-space: nowrap; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.menu-text { - height: 20px; - line-height: 20px; - float: left; - padding-left: 28px; -} -.menu-icon { - position: absolute; - width: 16px; - height: 16px; - left: 2px; - top: 50%; - margin-top: -8px; -} -.menu-rightarrow { - position: absolute; - width: 16px; - height: 16px; - right: 0; - top: 50%; - margin-top: -8px; -} -.menu-line { - position: absolute; - left: 26px; - top: 0; - height: 2000px; - font-size: 1px; -} -.menu-sep { - margin: 3px 0px 3px 25px; - font-size: 1px; -} -.menu-noline .menu-line { - display: none; -} -.menu-noline .menu-sep { - margin-left: 0; - margin-right: 0; -} -.menu-active { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.menu-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); - cursor: default; -} -.menu-text, -.menu-text span { - font-size: 12px; -} -.menu-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.menu-rightarrow { - background: url('images/menu_arrows.png') no-repeat -32px center; -} -.menu-line { - border-left: 1px solid #ccc; - border-right: 1px solid #fff; -} -.menu-sep { - border-top: 1px solid #ccc; - border-bottom: 1px solid #fff; -} -.menu { - background-color: #fff; - border-color: #e6e6e6; - color: #333; -} -.menu-content { - background: #ffffff; -} -.menu-item { - border-color: transparent; - _border-color: #fff; -} -.menu-active { - border-color: #ddd; - color: #00438a; - background: #e6e6e6; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #333; -} -.m-btn-downarrow, -.s-btn-downarrow { - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - font-size: 1px; - right: 0; - top: 50%; - margin-top: -8px; -} -.m-btn-active, -.s-btn-active { - background: #e6e6e6; - color: #00438a; - border: 1px solid #ddd; - filter: none; -} -.m-btn-plain-active, -.s-btn-plain-active { - background: transparent; - padding: 0; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.m-btn .l-btn-left .l-btn-text { - margin-right: 20px; -} -.m-btn .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.m-btn .l-btn-icon-right .l-btn-icon { - right: 20px; -} -.m-btn .l-btn-icon-top .l-btn-text { - margin-right: 4px; - margin-bottom: 14px; -} -.m-btn .l-btn-icon-bottom .l-btn-text { - margin-right: 4px; - margin-bottom: 34px; -} -.m-btn .l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 20px; -} -.m-btn .l-btn-icon-top .m-btn-downarrow, -.m-btn .l-btn-icon-bottom .m-btn-downarrow { - top: auto; - bottom: 0px; - left: 50%; - margin-left: -8px; -} -.m-btn-line { - display: inline-block; - position: absolute; - font-size: 1px; - display: none; -} -.m-btn .l-btn-left .m-btn-line { - right: 0; - width: 16px; - height: 500px; - border-style: solid; - border-color: #bbb; - border-width: 0 0 0 1px; -} -.m-btn .l-btn-icon-top .m-btn-line, -.m-btn .l-btn-icon-bottom .m-btn-line { - left: 0; - bottom: 0; - width: 500px; - height: 16px; - border-width: 1px 0 0 0; -} -.m-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 56px; -} -.m-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 50px; -} -.m-btn-downarrow, -.s-btn-downarrow { - background: url('images/menu_arrows.png') no-repeat 0 center; -} -.m-btn-plain-active, -.s-btn-plain-active { - border-color: #ddd; - background-color: #e6e6e6; - color: #00438a; -} -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #bbb; - border-width: 0 0 0 1px; -} -.messager-body { - padding: 10px 10px 30px 10px; - overflow: auto; -} -.messager-button { - text-align: center; - padding: 5px; -} -.messager-button .l-btn { - width: 70px; -} -.messager-icon { - float: left; - width: 32px; - height: 32px; - margin: 0 10px 10px 0; -} -.messager-error { - background: url('images/messager_icons.png') no-repeat scroll -64px 0; -} -.messager-info { - background: url('images/messager_icons.png') no-repeat scroll 0 0; -} -.messager-question { - background: url('images/messager_icons.png') no-repeat scroll -32px 0; -} -.messager-warning { - background: url('images/messager_icons.png') no-repeat scroll -96px 0; -} -.messager-progress { - padding: 10px; -} -.messager-p-msg { - margin-bottom: 5px; -} -.messager-body .messager-input { - width: 100%; - padding: 4px 0; - outline-style: none; - border: 1px solid #D4D4D4; -} -.window-thinborder .messager-button { - padding-bottom: 8px; -} -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 12px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 12px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #D4D4D4; - font-size: 12px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #333; - border-color: #D4D4D4; -} -.tree-node-hover { - background: #e6e6e6; - color: #00438a; -} -.tree-node-selected { - background: #0081c2; - color: #fff; -} -.tree-node-hidden { - display: none; -} -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tooltip-content { - font-size: 12px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #D4D4D4; - color: #333; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #D4D4D4; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #D4D4D4; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #D4D4D4; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #D4D4D4; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #bbb; - border: 1px solid #bbb; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 12px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-on { - background: #0081c2; - color: #fff; -} -.switchbutton-off { - background-color: #ffffff; - color: #333; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #ffffff; - color: #333; - border: 1px solid #bbb; - -moz-box-shadow: 0 0 3px 0 #bbb; - -webkit-box-shadow: 0 0 3px 0 #bbb; - box-shadow: 0 0 3px 0 #bbb; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} -.radiobutton { - position: relative; - border: 2px solid #0070a9; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #0070a9; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.checkbox { - position: relative; - border: 2px solid #0070a9; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.checkbox-checked { - border: 0; - background: #0070a9; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #777; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #777; -} -.sidemenu .accordion-header:hover { - background: #e6e6e6; - color: #777; -} -.sidemenu .tree-node-hover { - background: #e6e6e6; - color: #777; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #0070a9; - color: #fff; - background: #0081c2; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} -.tabs-panels { - border-color: transparent; -} -.tabs li a.tabs-inner { - border-color: transparent; - background: transparent; - filter: none; - color: #0088CC; -} -.menu-active { - background-color: #0081C2; - border-color: #0081C2; - color: #fff; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #333; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/filebox.css deleted file mode 100644 index c6bac6631..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/filebox.css +++ /dev/null @@ -1,20 +0,0 @@ -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/accordion_arrows.png deleted file mode 100755 index 720835f69c96c17ec32a20b03ac9753aa59b7f4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYeRK2H*V@SoVUT_Y-nKxaI`{RC0WjSLJ&w^R(C-|JQTojLXc1&{d*_z{$ jW+oTMdQ(F|jDg|L>K${_)^zO#I)%a0)z4*}Q$iB}_fAN- diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/blank.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/blank.gif deleted file mode 100755 index 1d11fa9ada9e93505b3d736acb204083f45d5fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/calendar_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/calendar_arrows.png deleted file mode 100755 index 430c4ad685b8c0068ecb7e3cbef74f493a84ad0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQYD@)jv*Dd-cCEn)nLHm{QbZE z+q@uWwandfr?Jb4eDYYmB3UAt=OO2Vt+MMT&+KD%&6hZDt!FBpej;sEpMN69^tKl% zp6y<4_lG^P z=;=eQ4Vs74-2)Ua&f1tcVdk$#{GPKe@&?ZMHmT&SMw?IV&w7)}ixLbB3d$Zg{&KGb P8OPx1>gTe~DWM4fp>5!O@Gl{c zHXr?)EMpjkiI0?0nVI4ps;W|uWCd!b5UAxPD-onMP4mgv0vV&Ul|KA@T-G#0QTd(IpSp7SIAsd;)#A=FjzgW9D>i*LbaNyX|0kF(mrr z;o92b6Zp@36nqs7kw}pT2qBaieQ3N+owvm{e=N(DufonR5DseQ_ISSW8dV0M=To{w zToOt35OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fRl}UZ@-Co%Cq`k{wEj}Dr>ShP9AQ|IKKA30{ejJboVoF`C-z@6mZMY&%Wiz%6S}#zb4u?o?9Mi=ECopVxzz+sNviAA!DK)mm8xe zgY9ZT9jlddc^&y2^u9XqDeU4{8s^AS#8C7TXsxEJW@uLu(3Whc35-X6v}jEgEb{G` z!{)$uKzw<~%0A6PhNHYfSuTvOzD8LpPF>PVr=&QqGC936QlPgc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/loading.gif deleted file mode 100755 index 68f01d04813c1f622810864a3aaa04b4a17ac8f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/menu_arrows.png deleted file mode 100755 index b986842e7e4044caed18edbcb4b376a4bb915623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/messager_icons.png deleted file mode 100755 index 62c18c135860351063ebaabe8c0f4df7664b8f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000zI<5nO~0)=fnxErNrCA`WgM*1^R=&_zX)CMr1T;-rJKi{RhT zwTRWWFSbznW6?ZwYBk2xccxEVa`0%4(Yva@;pbF0^9S2uAKfle(?qtbyxJ(2%kiF>CHXa` zwdcneqDH8s8`O=^Z;G*FoH3bGkRlewXgRMPCtCR>olp$6SSk2LaLtdk735GTeS6JrtWdjq}ZZs34}bF$p9qsdLBnIC+J1{xF!;M>5@n5YI? z&4z;cHjvE$_V&)MtT*$6579tEVTAaOu<<1(%cR!^622ph;K0g-9AQF(O3vhYiNJ*b z7Xuat7f#qV!aOb!Q6;pKF~UjxbnQ*DOwWIpHq-OqgFQe0fa`fz9oUMD0Z9VV1d9Q= z5#TIiB5HxD12dV7Jd)hJ_=qt$xd^NA4nEk!Bp@qUu0k4c(cRlRc0Y)25Z^q7^m|=T zEPSa{>fbuK*p?QKGWOF9-+|Bne}*tPWtM~)t<`EXu;7__@_h5{U+e{vTT29oHFe~Ze6XJ(Q>Kb zHH)*`i>&-o-mMNlRLeM*)b=tl9I*eiXO{b+PdrTgTX%D4@ZRav{vE&cqCShv#9g;J tE!>t@mbeRM^gTGoKdYo(nL%h1<2#QP_cRaf4g@-i!PC{xWt~$(697v`TRe8 z#G%R{$NfX%tci2`Gda4n1O70V3HltacN37lc`VT21_Oig(wY*}T!mDijSQZyelF{r G5}E*M5;#5p diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/passwordbox_open.png deleted file mode 100644 index d328891f6a18ea703fd25a47b228df9cb13b4744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fh6C~y}*jFF6I{2&m zf8fW~lSf{d9=Ouc<(SoRr6$ox=6dW5rxOB`TRe8 z#G%R{$Nj@Z)5m5kM@2RMITi_;Npmte=_#;rBych_7F`xqKKy}=f%DM}Q4`(M(}DIf Nc)I$ztaD0e0su|qH(3Ax diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/searchbox_button.png deleted file mode 100755 index 6dd1931589b453f6cc9772fd1851d8705d6b6631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/spinner_arrows.png deleted file mode 100755 index 7c2df483dbb30dfb3a51332c03fe6f0c229c0547..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4Dgeh3R zJz6gy$J;RRRRiNz`7}$-z5~nWg=}UsVYp!HpQ#{_&8An~S<1fjm*zKyrHmF27#+^4 x`1rk&EZfSkR8C?on>%wt3;O{L3Dzy_3@=Og7TEqO`UJFx!PC{xWt~$(69D$UE$jdQ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tabs_icons.png deleted file mode 100755 index 4d29966d7154338a9e2e358821a5f72655eba43e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq+&f?978H@B_~L*E^a7uNPG49 z|BoM6E;$_tDnm{r-UW|t3f!- diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tagbox_icons.png deleted file mode 100644 index bd02e2d817c6b7c4e2a105919e9a89cc0a1d577f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel&`0YV@SoV>_0CQASS diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/tree_icons.png deleted file mode 100755 index e9be4f3a9965e49a4e4078f8c53f486d761a7468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/images/validatebox_warning.png deleted file mode 100755 index 2b3d4f05babf3f82b146350e96570fac02075de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/passwordbox.css deleted file mode 100644 index 92c9ce586..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/passwordbox.css +++ /dev/null @@ -1,6 +0,0 @@ -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/progressbar.css deleted file mode 100644 index 73f0de06e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/progressbar.css +++ /dev/null @@ -1,33 +0,0 @@ -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.progressbar { - border-color: #D4D4D4; -} -.progressbar-text { - color: #333; - font-size: 12px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #0081c2; - color: #fff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/propertygrid.css deleted file mode 100644 index 4b37fa61c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/propertygrid.css +++ /dev/null @@ -1,27 +0,0 @@ -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #e6e6e6; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #F2F2F2; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #e6e6e6; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #F2F2F2; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/radiobutton.css deleted file mode 100644 index 341e570fd..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/radiobutton.css +++ /dev/null @@ -1,25 +0,0 @@ -.radiobutton { - position: relative; - border: 2px solid #0070a9; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #0070a9; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/searchbox.css deleted file mode 100644 index bf615de03..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/searchbox.css +++ /dev/null @@ -1,61 +0,0 @@ -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #F2F2F2; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/sidemenu.css deleted file mode 100644 index e9460591d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/sidemenu.css +++ /dev/null @@ -1,69 +0,0 @@ -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #777; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #777; -} -.sidemenu .accordion-header:hover { - background: #e6e6e6; - color: #777; -} -.sidemenu .tree-node-hover { - background: #e6e6e6; - color: #777; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #0070a9; - color: #fff; - background: #0081c2; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/slider.css deleted file mode 100644 index b58d8de55..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/slider.css +++ /dev/null @@ -1,101 +0,0 @@ -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 5px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 12px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 12px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #D4D4D4; - background: #F2F2F2; -} -.slider-rule span { - border-color: #D4D4D4; -} -.slider-rulelabel span { - color: #333; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/spinner.css deleted file mode 100644 index 6a6e6fca5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/spinner.css +++ /dev/null @@ -1,114 +0,0 @@ -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #F2F2F2; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #444; - outline-style: none; - background-color: #F2F2F2; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #e6e6e6; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #e6e6e6; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #F2F2F2; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #F2F2F2; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #F2F2F2; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/splitbutton.css deleted file mode 100644 index bf8645332..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/splitbutton.css +++ /dev/null @@ -1,12 +0,0 @@ -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #bbb; - border-width: 0 0 0 1px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/switchbutton.css deleted file mode 100644 index 38803aa0d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/switchbutton.css +++ /dev/null @@ -1,77 +0,0 @@ -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #bbb; - border: 1px solid #bbb; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 12px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-on { - background: #0081c2; - color: #fff; -} -.switchbutton-off { - background-color: #ffffff; - color: #333; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #ffffff; - color: #333; - border: 1px solid #bbb; - -moz-box-shadow: 0 0 3px 0 #bbb; - -webkit-box-shadow: 0 0 3px 0 #bbb; - box-shadow: 0 0 3px 0 #bbb; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tabs.css deleted file mode 100644 index c06a4aab4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tabs.css +++ /dev/null @@ -1,413 +0,0 @@ -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 12px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 5px 5px; - -webkit-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #F2F2F2 url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #F2F2F2 url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #e6e6e6; - color: #00438a; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #777; - background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: linear-gradient(to right,#ffffff 0,#ffffff 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(left,#ffffff 0,#ffffff 100%); - background: linear-gradient(to right,#ffffff 0,#ffffff 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=1); -} -.tabs li a.tabs-inner { - color: #777; - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 100%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.tabs-header, -.tabs-tool { - background-color: #F2F2F2; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #D4D4D4; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #e6e6e6; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #0081c2; - color: #fff; - filter: none; - border-color: #D4D4D4; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tagbox.css deleted file mode 100644 index 7e98a0a31..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tagbox.css +++ /dev/null @@ -1,44 +0,0 @@ -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #e6e6e6; - color: #00438a; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/textbox.css deleted file mode 100644 index a708ce34f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/textbox.css +++ /dev/null @@ -1,144 +0,0 @@ -.textbox { - position: relative; - border: 1px solid #D4D4D4; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.textbox .textbox-text { - font-size: 12px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 12px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #bbbbbb; - -moz-box-shadow: 0 0 3px 0 #D4D4D4; - -webkit-box-shadow: 0 0 3px 0 #D4D4D4; - box-shadow: 0 0 3px 0 #D4D4D4; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tooltip.css deleted file mode 100644 index ed9fe1c25..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tooltip.css +++ /dev/null @@ -1,103 +0,0 @@ -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tooltip-content { - font-size: 12px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #D4D4D4; - color: #333; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #D4D4D4; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #D4D4D4; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #D4D4D4; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #D4D4D4; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tree.css deleted file mode 100644 index 87d2474cb..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/tree.css +++ /dev/null @@ -1,164 +0,0 @@ -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 12px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 12px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #D4D4D4; - font-size: 12px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #333; - border-color: #D4D4D4; -} -.tree-node-hover { - background: #e6e6e6; - color: #00438a; -} -.tree-node-selected { - background: #0081c2; - color: #fff; -} -.tree-node-hidden { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/validatebox.css deleted file mode 100644 index 1fc3ad64e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/validatebox.css +++ /dev/null @@ -1,5 +0,0 @@ -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/window.css deleted file mode 100644 index a544a4e81..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/bootstrap/window.css +++ /dev/null @@ -1,188 +0,0 @@ -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.window-shadow { - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #D4D4D4; -} -.window { - background-color: #F2F2F2; - background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 20%); - background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 20%); - background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 20%); - background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 20%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0); -} -.window-proxy { - border: 1px dashed #D4D4D4; -} -.window-proxy-mask, -.window-mask { - background: #ccc; -} -.window .panel-footer { - border: 1px solid #D4D4D4; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/color.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/color.css deleted file mode 100755 index 2985680f3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/color.css +++ /dev/null @@ -1,210 +0,0 @@ -.c1,.c1:hover,.c1>.panel-header{ - color: #fff; - border-color: #3c8b3c; - background: #4cae4c; - background: -webkit-linear-gradient(top,#4cae4c 0,#449d44 100%); - background: -moz-linear-gradient(top,#4cae4c 0,#449d44 100%); - background: -o-linear-gradient(top,#4cae4c 0,#449d44 100%); - background: linear-gradient(to bottom,#4cae4c 0,#449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4cae4c,endColorstr=#449d44,GradientType=0); -} -a.c1:hover{ - background: #449d44; - filter: none; -} -.c1>.panel-body{ - border-color: #3c8b3c; -} -.c1>.dialog-toolbar,.c1>.dialog-button{ - border-left-color: #3c8b3c; - border-right-color: #3c8b3c; -} -.c1>.dialog-button{ - border-bottom-color: #3c8b3c; -} -.c2,.c2:hover,.c2>.panel-header{ - color: #fff; - border-color: #5f5f5f; - background: #747474; - background: -webkit-linear-gradient(top,#747474 0,#676767 100%); - background: -moz-linear-gradient(top,#747474 0,#676767 100%); - background: -o-linear-gradient(top,#747474 0,#676767 100%); - background: linear-gradient(to bottom,#747474 0,#676767 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#747474,endColorstr=#676767,GradientType=0); -} -a.c2:hover{ - background: #676767; - filter: none; -} -.c2>.panel-body{ - border-color: #5f5f5f; -} -.c2>.dialog-toolbar,.c2>.dialog-button{ - border-left-color: #5f5f5f; - border-right-color: #5f5f5f; -} -.c2>.dialog-button{ - border-bottom-color: #5f5f5f; -} -.c3,.c3:hover,.c3>.panel-header{ - color: #333; - border-color: #ff8080; - background: #ffb3b3; - background: -webkit-linear-gradient(top,#ffb3b3 0,#ff9999 100%); - background: -moz-linear-gradient(top,#ffb3b3 0,#ff9999 100%); - background: -o-linear-gradient(top,#ffb3b3 0,#ff9999 100%); - background: linear-gradient(to bottom,#ffb3b3 0,#ff9999 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffb3b3,endColorstr=#ff9999,GradientType=0); -} -a.c3:hover{ - background: #ff9999; - filter: none; -} -.c3>.panel-body{ - border-color: #ff8080; -} -.c3>.dialog-toolbar,.c3>.dialog-button{ - border-left-color: #ff8080; - border-right-color: #ff8080; -} -.c3>.dialog-button{ - border-bottom-color: #ff8080; -} -.c4,.c4:hover,.c4>.panel-header{ - color: #333; - border-color: #52d689; - background: #b8eecf; - background: -webkit-linear-gradient(top,#b8eecf 0,#a4e9c1 100%); - background: -moz-linear-gradient(top,#b8eecf 0,#a4e9c1 100%); - background: -o-linear-gradient(top,#b8eecf 0,#a4e9c1 100%); - background: linear-gradient(to bottom,#b8eecf 0,#a4e9c1 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#b8eecf,endColorstr=#a4e9c1,GradientType=0); -} -a.c4:hover{ - background: #a4e9c1; - filter: none; -} -.c4>.panel-body{ - border-color: #52d689; -} -.c4>.dialog-toolbar,.c4>.dialog-button{ - border-left-color: #52d689; - border-right-color: #52d689; -} -.c4>.dialog-button{ - border-bottom-color: #52d689; -} -.c5,.c5:hover,.c5>.panel-header{ - color: #fff; - border-color: #b52b27; - background: #d84f4b; - background: -webkit-linear-gradient(top,#d84f4b 0,#c9302c 100%); - background: -moz-linear-gradient(top,#d84f4b 0,#c9302c 100%); - background: -o-linear-gradient(top,#d84f4b 0,#c9302c 100%); - background: linear-gradient(to bottom,#d84f4b 0,#c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#d84f4b,endColorstr=#c9302c,GradientType=0); -} -a.c5:hover{ - background: #c9302c; - filter: none; -} -.c5>.panel-body{ - border-color: #b52b27; -} -.c5>.dialog-toolbar,.c5>.dialog-button{ - border-left-color: #b52b27; - border-right-color: #b52b27; -} -.c5>.dialog-button{ - border-bottom-color: #b52b27; -} -.c6,.c6:hover,.c6>.panel-header{ - color: #fff; - border-color: #1f637b; - background: #2984a4; - background: -webkit-linear-gradient(top,#2984a4 0,#24748f 100%); - background: -moz-linear-gradient(top,#2984a4 0,#24748f 100%); - background: -o-linear-gradient(top,#2984a4 0,#24748f 100%); - background: linear-gradient(to bottom,#2984a4 0,#24748f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#2984a4,endColorstr=#24748f,GradientType=0); -} -a.c6:hover{ - background: #24748f; - filter: none; -} -.c6>.panel-body{ - border-color: #1f637b; -} -.c6>.dialog-toolbar,.c6>.dialog-button{ - border-left-color: #1f637b; - border-right-color: #1f637b; -} -.c6>.dialog-button{ - border-bottom-color: #1f637b; -} -.c7,.c7:hover,.c7>.panel-header{ - color: #333; - border-color: #e68900; - background: #ffab2e; - background: -webkit-linear-gradient(top,#ffab2e 0,#ff9900 100%); - background: -moz-linear-gradient(top,#ffab2e 0,#ff9900 100%); - background: -o-linear-gradient(top,#ffab2e 0,#ff9900 100%); - background: linear-gradient(to bottom,#ffab2e 0,#ff9900 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffab2e,endColorstr=#ff9900,GradientType=0); -} -a.c7:hover{ - background: #ff9900; - filter: none; -} -.c7>.panel-body{ - border-color: #e68900; -} -.c7>.dialog-toolbar,.c7>.dialog-button{ - border-left-color: #e68900; - border-right-color: #e68900; -} -.c7>.dialog-button{ - border-bottom-color: #e68900; -} -.c8,.c8:hover,.c8>.panel-header{ - color: #fff; - border-color: #4b72a4; - background: #698cba; - background: -webkit-linear-gradient(top,#698cba 0,#577eb2 100%); - background: -moz-linear-gradient(top,#698cba 0,#577eb2 100%); - background: -o-linear-gradient(top,#698cba 0,#577eb2 100%); - background: linear-gradient(to bottom,#698cba 0,#577eb2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#698cba,endColorstr=#577eb2,GradientType=0); -} -a.c8:hover{ - background: #577eb2; - filter: none; -} -.c8>.panel-body{ - border-color: #4b72a4; -} -.c8>.dialog-toolbar,.c8>.dialog-button{ - border-left-color: #4b72a4; - border-right-color: #4b72a4; -} -.c8>.dialog-button{ - border-bottom-color: #4b72a4; -} -.c1>.panel-header>.panel-title,.c2>.panel-header>.panel-title, -.c5>.panel-header>.panel-title,.c6>.panel-header>.panel-title,.c8>.panel-header>.panel-title{ - color: #fff; -} -.c-plain{ - border-color: #fff; - background: #fff; -} -.c-plain>.panel-header, -.c-plain>.panel-body, -.c-plain>.dialog-button, -.c-plain>.dialog-toolbar{ - border-color: transparent; - background: transparent; -} -.c-raised{ - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/accordion.css deleted file mode 100644 index 9d60531f6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/accordion.css +++ /dev/null @@ -1,89 +0,0 @@ -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #95B8E7; -} -.accordion .accordion-header { - background: #E0ECFF; - filter: none; -} -.accordion .accordion-header-selected { - background: #ffe48d; -} -.accordion .accordion-header-selected .panel-title { - color: #000000; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #E0ECFF; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #95B8E7; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #E0ECFF; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #95B8E7; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #E0ECFF; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #95B8E7; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/calendar.css deleted file mode 100644 index f25a45849..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/calendar.css +++ /dev/null @@ -1,203 +0,0 @@ -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-body th, -.calendar-menu-month { - color: #4d4d4d; -} -.calendar-day { - color: #000000; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #95B8E7; -} -.calendar { - border-color: #95B8E7; -} -.calendar-header { - background: #E0ECFF; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #F4F4F4; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #eaf2ff; - color: #000000; -} -.calendar-hover { - border: 1px solid #b7d2ff; - padding: 0; -} -.calendar-selected { - background-color: #ffe48d; - color: #000000; - border: 1px solid #ffab3f; - padding: 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/checkbox.css deleted file mode 100644 index 61c5351b9..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/checkbox.css +++ /dev/null @@ -1,31 +0,0 @@ -.checkbox { - position: relative; - border: 2px solid #ffab3f; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.checkbox-checked { - border: 0; - background: #ffab3f; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combo.css deleted file mode 100644 index a51638652..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combo.css +++ /dev/null @@ -1,35 +0,0 @@ -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #ffffff; -} -.combo-arrow { - background-color: #E0ECFF; -} -.combo-arrow-hover { - background-color: #eaf2ff; -} -.combo-arrow:hover { - background-color: #eaf2ff; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combobox.css deleted file mode 100644 index c315199e5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/combobox.css +++ /dev/null @@ -1,40 +0,0 @@ -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #eaf2ff; - color: #000000; -} -.combobox-item-selected { - background-color: #ffe48d; - color: #000000; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datagrid.css deleted file mode 100644 index f86aa1484..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datagrid.css +++ /dev/null @@ -1,291 +0,0 @@ -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #95B8E7; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #efefef; - background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%); - background: -moz-linear-gradient(top,#F9F9F9 0,#efefef 100%); - background: -o-linear-gradient(top,#F9F9F9 0,#efefef 100%); - background: linear-gradient(to bottom,#F9F9F9 0,#efefef 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F9F9F9,endColorstr=#efefef,GradientType=0); -} -.datagrid-cell-rownumber { - color: #000000; -} -.datagrid-resize-proxy { - background: #aac5e7; -} -.datagrid-mask { - background: #ccc; -} -.datagrid-mask-msg { - border-color: #95B8E7; -} -.datagrid-toolbar, -.datagrid-pager { - background: #F4F4F4; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #dddddd; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ccc; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #000000; - border-collapse: separate; -} -.datagrid-row-alt { - background: #fafafa; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #eaf2ff; - color: #000000; - cursor: default; -} -.datagrid-row-selected { - background: #ffe48d; - color: #000000; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datalist.css deleted file mode 100644 index eedd25bc0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datalist.css +++ /dev/null @@ -1,95 +0,0 @@ -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #efefef; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #000000; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.m-list li>a:hover { - background: #eaf2ff; - color: #000000; -} -.m-list .m-list-group { - padding: 0 4px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datebox.css deleted file mode 100644 index 61093f08f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/datebox.css +++ /dev/null @@ -1,36 +0,0 @@ -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #F4F4F4; -} -.datebox-button a { - color: #444; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/dialog.css deleted file mode 100644 index ff5538774..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/dialog.css +++ /dev/null @@ -1,47 +0,0 @@ -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #F4F4F4; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #95B8E7 #95B8E7 #dddddd #95B8E7; -} -.dialog-button { - border-color: #dddddd #95B8E7 #95B8E7 #95B8E7; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #F4F4F4; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/easyui.css deleted file mode 100644 index fabb4be5f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/easyui.css +++ /dev/null @@ -1,3427 +0,0 @@ -.panel { - overflow: hidden; - text-align: left; - margin: 0; - border: 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.panel-header, -.panel-body { - border-width: 1px; - border-style: solid; -} -.panel-header { - padding: 5px; - position: relative; -} -.panel-title { - background: url('images/blank.gif') no-repeat; -} -.panel-header-noborder { - border-width: 0 0 1px 0; -} -.panel-body { - overflow: auto; - border-top-width: 0; - padding: 0; -} -.panel-body-noheader { - border-top-width: 1px; -} -.panel-body-noborder { - border-width: 0px; -} -.panel-body-nobottom { - border-bottom-width: 0; -} -.panel-with-icon { - padding-left: 18px; -} -.panel-icon, -.panel-tool { - position: absolute; - top: 50%; - margin-top: -8px; - height: 16px; - overflow: hidden; -} -.panel-icon { - left: 5px; - width: 16px; -} -.panel-tool { - right: 5px; - width: auto; -} -.panel-tool a { - display: inline-block; - width: 16px; - height: 16px; - opacity: 0.6; - filter: alpha(opacity=60); - margin: 0 0 0 2px; - vertical-align: top; -} -.panel-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - background-color: #eaf2ff; - -moz-border-radius: 3px 3px 3px 3px; - -webkit-border-radius: 3px 3px 3px 3px; - border-radius: 3px 3px 3px 3px; -} -.panel-loading { - padding: 11px 0px 10px 30px; -} -.panel-noscroll { - overflow: hidden; -} -.panel-fit, -.panel-fit body { - height: 100%; - margin: 0; - padding: 0; - border: 0; - overflow: hidden; -} -.panel-loading { - background: url('images/loading.gif') no-repeat 10px 10px; -} -.panel-tool-close { - background: url('images/panel_tools.png') no-repeat -16px 0px; -} -.panel-tool-min { - background: url('images/panel_tools.png') no-repeat 0px 0px; -} -.panel-tool-max { - background: url('images/panel_tools.png') no-repeat 0px -16px; -} -.panel-tool-restore { - background: url('images/panel_tools.png') no-repeat -16px -16px; -} -.panel-tool-collapse { - background: url('images/panel_tools.png') no-repeat -32px 0; -} -.panel-tool-expand { - background: url('images/panel_tools.png') no-repeat -32px -16px; -} -.panel-header, -.panel-body { - border-color: #95B8E7; -} -.panel-header { - background-color: #E0ECFF; - background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); - background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); - background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); - background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); -} -.panel-body { - background-color: #ffffff; - color: #000000; - font-size: 14px; -} -.panel-title { - font-size: 14px; - font-weight: bold; - color: #0E2D5F; - height: 20px; - line-height: 20px; -} -.panel-footer { - border: 1px solid #95B8E7; - overflow: hidden; - background: #F4F4F4; -} -.panel-footer-noborder { - border-width: 1px 0 0 0; -} -.panel-hleft, -.panel-hright { - position: relative; -} -.panel-hleft>.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #95B8E7; -} -.accordion .accordion-header { - background: #E0ECFF; - filter: none; -} -.accordion .accordion-header-selected { - background: #ffe48d; -} -.accordion .accordion-header-selected .panel-title { - color: #000000; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #E0ECFF; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #95B8E7; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #E0ECFF; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #95B8E7; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #E0ECFF; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #95B8E7; -} -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.window-shadow { - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #95B8E7; -} -.window { - background-color: #E0ECFF; - background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); - background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); - background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); - background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); -} -.window-proxy { - border: 1px dashed #95B8E7; -} -.window-proxy-mask, -.window-mask { - background: #ccc; -} -.window .panel-footer { - border: 1px solid #95B8E7; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #F4F4F4; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #95B8E7 #95B8E7 #dddddd #95B8E7; -} -.dialog-button { - border-color: #dddddd #95B8E7 #95B8E7 #95B8E7; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #F4F4F4; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.l-btn { - text-decoration: none; - display: inline-block; - overflow: hidden; - margin: 0; - padding: 0; - cursor: pointer; - outline: none; - text-align: center; - vertical-align: middle; - line-height: normal; -} -.l-btn-plain { - border-width: 0; - padding: 1px; -} -.l-btn-left { - display: inline-block; - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - vertical-align: top; -} -.l-btn-text { - display: inline-block; - vertical-align: top; - width: auto; - line-height: 28px; - font-size: 14px; - padding: 0; - margin: 0 6px; -} -.l-btn-icon { - display: inline-block; - width: 16px; - height: 16px; - line-height: 16px; - position: absolute; - top: 50%; - margin-top: -8px; - font-size: 1px; -} -.l-btn span span .l-btn-empty { - display: inline-block; - margin: 0; - width: 16px; - height: 24px; - font-size: 1px; - vertical-align: top; -} -.l-btn span .l-btn-icon-left { - padding: 0 0 0 20px; - background-position: left center; -} -.l-btn span .l-btn-icon-right { - padding: 0 20px 0 0; - background-position: right center; -} -.l-btn-icon-left .l-btn-text { - margin: 0 6px 0 26px; -} -.l-btn-icon-left .l-btn-icon { - left: 6px; -} -.l-btn-icon-right .l-btn-text { - margin: 0 26px 0 6px; -} -.l-btn-icon-right .l-btn-icon { - right: 6px; -} -.l-btn-icon-top .l-btn-text { - margin: 20px 4px 0 4px; -} -.l-btn-icon-top .l-btn-icon { - top: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-icon-bottom .l-btn-text { - margin: 0 4px 20px 4px; -} -.l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-left .l-btn-empty { - margin: 0 6px; - width: 16px; -} -.l-btn-plain:hover { - padding: 0; -} -.l-btn-focus { - outline: #0000FF dotted thin; -} -.l-btn-large .l-btn-text { - line-height: 44px; -} -.l-btn-large .l-btn-icon { - width: 32px; - height: 32px; - line-height: 32px; - margin-top: -16px; -} -.l-btn-large .l-btn-icon-left .l-btn-text { - margin-left: 40px; -} -.l-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.l-btn-large .l-btn-icon-top .l-btn-text { - margin-top: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-top .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-left .l-btn-empty { - margin: 0 6px; - width: 32px; -} -.l-btn { - color: #444; - background: #fafafa; - background-repeat: repeat-x; - border: 1px solid #bbb; - background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.l-btn:hover { - background: #eaf2ff; - color: #000000; - border: 1px solid #b7d2ff; - filter: none; -} -.l-btn-plain { - background: transparent; - border-width: 0; - filter: none; -} -.l-btn-outline { - border-width: 1px; - border-color: #b7d2ff; - padding: 0; -} -.l-btn-plain:hover { - background: #eaf2ff; - color: #000000; - border: 1px solid #b7d2ff; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.l-btn-disabled, -.l-btn-disabled:hover { - opacity: 0.5; - cursor: default; - background: #fafafa; - color: #444; - background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); -} -.l-btn-disabled .l-btn-text, -.l-btn-disabled .l-btn-icon { - filter: alpha(opacity=50); -} -.l-btn-plain-disabled, -.l-btn-plain-disabled:hover { - background: transparent; - filter: alpha(opacity=50); -} -.l-btn-selected, -.l-btn-selected:hover { - background: #ddd; - filter: none; -} -.l-btn-plain-selected, -.l-btn-plain-selected:hover { - background: #ddd; -} -.textbox { - position: relative; - border: 1px solid #95B8E7; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #6b9cde; - -moz-box-shadow: 0 0 3px 0 #95B8E7; - -webkit-box-shadow: 0 0 3px 0 #95B8E7; - box-shadow: 0 0 3px 0 #95B8E7; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; -} -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #ffffff; -} -.combo-arrow { - background-color: #E0ECFF; -} -.combo-arrow-hover { - background-color: #eaf2ff; -} -.combo-arrow:hover { - background-color: #eaf2ff; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #eaf2ff; - color: #000000; -} -.combobox-item-selected { - background-color: #ffe48d; - color: #000000; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #eaf2ff; - color: #000000; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} -.layout { - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - z-index: 0; -} -.layout-panel { - position: absolute; - overflow: hidden; -} -.layout-body { - min-width: 1px; - min-height: 1px; -} -.layout-panel-east, -.layout-panel-west { - z-index: 2; -} -.layout-panel-north, -.layout-panel-south { - z-index: 3; -} -.layout-expand { - position: absolute; - padding: 0px; - font-size: 1px; - cursor: pointer; - z-index: 1; -} -.layout-expand .panel-header, -.layout-expand .panel-body { - background: transparent; - filter: none; - overflow: hidden; -} -.layout-expand .panel-header { - border-bottom-width: 0px; -} -.layout-expand .panel-body { - position: relative; -} -.layout-expand .panel-body .panel-icon { - margin-top: 0; - top: 0; - left: 50%; - margin-left: -8px; -} -.layout-expand-west .panel-header .panel-icon, -.layout-expand-east .panel-header .panel-icon { - display: none; -} -.layout-expand-title { - position: absolute; - top: 0; - left: 21px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.layout-expand-title-up { - position: absolute; - top: 0; - left: 0; - text-align: right; - padding-left: 5px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 0; -} -.layout-expand-with-icon { - top: 18px; -} -.layout-expand .panel-body-noheader .layout-expand-title, -.layout-expand .panel-body-noheader .panel-icon { - top: 5px; -} -.layout-expand .panel-body-noheader .layout-expand-with-icon { - top: 23px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - position: absolute; - font-size: 1px; - display: none; - z-index: 5; -} -.layout-split-proxy-h { - width: 5px; - cursor: e-resize; -} -.layout-split-proxy-v { - height: 5px; - cursor: n-resize; -} -.layout-mask { - position: absolute; - background: #fafafa; - filter: alpha(opacity=10); - opacity: 0.10; - z-index: 4; -} -.layout-button-up { - background: url('images/layout_arrows.png') no-repeat -16px -16px; -} -.layout-button-down { - background: url('images/layout_arrows.png') no-repeat -16px 0; -} -.layout-button-left { - background: url('images/layout_arrows.png') no-repeat 0 0; -} -.layout-button-right { - background: url('images/layout_arrows.png') no-repeat 0 -16px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - background-color: #aac5e7; -} -.layout-split-north { - border-bottom: 5px solid #E6EEF8; -} -.layout-split-south { - border-top: 5px solid #E6EEF8; -} -.layout-split-east { - border-left: 5px solid #E6EEF8; -} -.layout-split-west { - border-right: 5px solid #E6EEF8; -} -.layout-expand { - background-color: #E0ECFF; -} -.layout-expand-over { - background-color: #E0ECFF; -} -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 5px 5px; - -webkit-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #E0ECFF url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #E0ECFF url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #eaf2ff; - color: #000000; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #0E2D5F; - background: -webkit-linear-gradient(top,#EFF5FF 0,#ffffff 100%); - background: -moz-linear-gradient(top,#EFF5FF 0,#ffffff 100%); - background: -o-linear-gradient(top,#EFF5FF 0,#ffffff 100%); - background: linear-gradient(to bottom,#EFF5FF 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=0); -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(top,#ffffff 0,#EFF5FF 100%); - background: -moz-linear-gradient(top,#ffffff 0,#EFF5FF 100%); - background: -o-linear-gradient(top,#ffffff 0,#EFF5FF 100%); - background: linear-gradient(to bottom,#ffffff 0,#EFF5FF 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=0); -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#EFF5FF 0,#ffffff 100%); - background: -moz-linear-gradient(left,#EFF5FF 0,#ffffff 100%); - background: -o-linear-gradient(left,#EFF5FF 0,#ffffff 100%); - background: linear-gradient(to right,#EFF5FF 0,#ffffff 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=1); -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#ffffff 0,#EFF5FF 100%); - background: -moz-linear-gradient(left,#ffffff 0,#EFF5FF 100%); - background: -o-linear-gradient(left,#ffffff 0,#EFF5FF 100%); - background: linear-gradient(to right,#ffffff 0,#EFF5FF 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=1); -} -.tabs li a.tabs-inner { - color: #0E2D5F; - background-color: #E0ECFF; - background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); - background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); - background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); - background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); -} -.tabs-header, -.tabs-tool { - background-color: #E0ECFF; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #95B8E7; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #eaf2ff; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #ffe48d; - color: #000000; - filter: none; - border-color: #95B8E7; -} -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #95B8E7; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #efefef; - background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%); - background: -moz-linear-gradient(top,#F9F9F9 0,#efefef 100%); - background: -o-linear-gradient(top,#F9F9F9 0,#efefef 100%); - background: linear-gradient(to bottom,#F9F9F9 0,#efefef 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F9F9F9,endColorstr=#efefef,GradientType=0); -} -.datagrid-cell-rownumber { - color: #000000; -} -.datagrid-resize-proxy { - background: #aac5e7; -} -.datagrid-mask { - background: #ccc; -} -.datagrid-mask-msg { - border-color: #95B8E7; -} -.datagrid-toolbar, -.datagrid-pager { - background: #F4F4F4; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #dddddd; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ccc; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #000000; - border-collapse: separate; -} -.datagrid-row-alt { - background: #fafafa; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #eaf2ff; - color: #000000; - cursor: default; -} -.datagrid-row-selected { - background: #ffe48d; - color: #000000; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #dddddd; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #E0ECFF; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #dddddd; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #E0ECFF; -} -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #efefef; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #000000; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.m-list li>a:hover { - background: #eaf2ff; - color: #000000; -} -.m-list .m-list-group { - padding: 0 4px; -} -.pagination { - zoom: 1; - padding: 2px; -} -.pagination table { - float: left; - height: 30px; -} -.pagination td { - border: 0; -} -.pagination-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 3px 1px; -} -.pagination .pagination-num { - border-width: 1px; - border-style: solid; - margin: 0 2px; - padding: 2px; - width: 3em; - height: auto; - text-align: center; - font-size: 14px; -} -.pagination-page-list { - margin: 0px 6px; - padding: 1px 2px; - width: auto; - height: auto; - border-width: 1px; - border-style: solid; -} -.pagination-info { - float: right; - margin: 0 6px; - padding: 0; - height: 30px; - line-height: 30px; - font-size: 14px; -} -.pagination span { - font-size: 14px; -} -.pagination-link .l-btn-text { - box-sizing: border-box; - text-align: center; - margin: 0; - padding: 0 .5em; - width: auto; - min-width: 28px; -} -.pagination-first { - background: url('images/pagination_icons.png') no-repeat 0 center; -} -.pagination-prev { - background: url('images/pagination_icons.png') no-repeat -16px center; -} -.pagination-next { - background: url('images/pagination_icons.png') no-repeat -32px center; -} -.pagination-last { - background: url('images/pagination_icons.png') no-repeat -48px center; -} -.pagination-load { - background: url('images/pagination_icons.png') no-repeat -64px center; -} -.pagination-loading { - background: url('images/loading.gif') no-repeat center center; -} -.pagination-page-list, -.pagination .pagination-num { - border-color: #95B8E7; -} -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-body th, -.calendar-menu-month { - color: #4d4d4d; -} -.calendar-day { - color: #000000; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #95B8E7; -} -.calendar { - border-color: #95B8E7; -} -.calendar-header { - background: #E0ECFF; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #F4F4F4; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #eaf2ff; - color: #000000; -} -.calendar-hover { - border: 1px solid #b7d2ff; - padding: 0; -} -.calendar-selected { - background-color: #ffe48d; - color: #000000; - border: 1px solid #ffab3f; - padding: 0; -} -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #F4F4F4; -} -.datebox-button a { - color: #444; -} -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #E0ECFF; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #444; - outline-style: none; - background-color: #E0ECFF; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #eaf2ff; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #eaf2ff; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #E0ECFF; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #E0ECFF; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #E0ECFF; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.progressbar { - border-color: #95B8E7; -} -.progressbar-text { - color: #000000; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #ffe48d; - color: #000000; -} -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #E0ECFF; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 5px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #95B8E7; - background: #E0ECFF; -} -.slider-rule span { - border-color: #95B8E7; -} -.slider-rulelabel span { - color: #000000; -} -.menu { - position: absolute; - margin: 0; - padding: 2px; - border-width: 1px; - border-style: solid; - overflow: hidden; -} -.menu-inline { - position: relative; -} -.menu-item { - position: relative; - margin: 0; - padding: 0; - overflow: hidden; - white-space: nowrap; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.menu-text { - height: 20px; - line-height: 20px; - float: left; - padding-left: 28px; -} -.menu-icon { - position: absolute; - width: 16px; - height: 16px; - left: 2px; - top: 50%; - margin-top: -8px; -} -.menu-rightarrow { - position: absolute; - width: 16px; - height: 16px; - right: 0; - top: 50%; - margin-top: -8px; -} -.menu-line { - position: absolute; - left: 26px; - top: 0; - height: 2000px; - font-size: 1px; -} -.menu-sep { - margin: 3px 0px 3px 25px; - font-size: 1px; -} -.menu-noline .menu-line { - display: none; -} -.menu-noline .menu-sep { - margin-left: 0; - margin-right: 0; -} -.menu-active { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.menu-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); - cursor: default; -} -.menu-text, -.menu-text span { - font-size: 14px; -} -.menu-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.menu-rightarrow { - background: url('images/menu_arrows.png') no-repeat -32px center; -} -.menu-line { - border-left: 1px solid #ccc; - border-right: 1px solid #fff; -} -.menu-sep { - border-top: 1px solid #ccc; - border-bottom: 1px solid #fff; -} -.menu { - background-color: #fafafa; - border-color: #ddd; - color: #444; -} -.menu-content { - background: #ffffff; -} -.menu-item { - border-color: transparent; - _border-color: #fafafa; -} -.menu-active { - border-color: #b7d2ff; - color: #000000; - background: #eaf2ff; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #444; -} -.m-btn-downarrow, -.s-btn-downarrow { - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - font-size: 1px; - right: 0; - top: 50%; - margin-top: -8px; -} -.m-btn-active, -.s-btn-active { - background: #eaf2ff; - color: #000000; - border: 1px solid #b7d2ff; - filter: none; -} -.m-btn-plain-active, -.s-btn-plain-active { - background: transparent; - padding: 0; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.m-btn .l-btn-left .l-btn-text { - margin-right: 20px; -} -.m-btn .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.m-btn .l-btn-icon-right .l-btn-icon { - right: 20px; -} -.m-btn .l-btn-icon-top .l-btn-text { - margin-right: 4px; - margin-bottom: 14px; -} -.m-btn .l-btn-icon-bottom .l-btn-text { - margin-right: 4px; - margin-bottom: 34px; -} -.m-btn .l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 20px; -} -.m-btn .l-btn-icon-top .m-btn-downarrow, -.m-btn .l-btn-icon-bottom .m-btn-downarrow { - top: auto; - bottom: 0px; - left: 50%; - margin-left: -8px; -} -.m-btn-line { - display: inline-block; - position: absolute; - font-size: 1px; - display: none; -} -.m-btn .l-btn-left .m-btn-line { - right: 0; - width: 16px; - height: 500px; - border-style: solid; - border-color: #aac5e7; - border-width: 0 0 0 1px; -} -.m-btn .l-btn-icon-top .m-btn-line, -.m-btn .l-btn-icon-bottom .m-btn-line { - left: 0; - bottom: 0; - width: 500px; - height: 16px; - border-width: 1px 0 0 0; -} -.m-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 56px; -} -.m-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 50px; -} -.m-btn-downarrow, -.s-btn-downarrow { - background: url('images/menu_arrows.png') no-repeat 0 center; -} -.m-btn-plain-active, -.s-btn-plain-active { - border-color: #b7d2ff; - background-color: #eaf2ff; - color: #000000; -} -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #aac5e7; - border-width: 0 0 0 1px; -} -.messager-body { - padding: 10px 10px 30px 10px; - overflow: auto; -} -.messager-button { - text-align: center; - padding: 5px; -} -.messager-button .l-btn { - width: 70px; -} -.messager-icon { - float: left; - width: 32px; - height: 32px; - margin: 0 10px 10px 0; -} -.messager-error { - background: url('images/messager_icons.png') no-repeat scroll -64px 0; -} -.messager-info { - background: url('images/messager_icons.png') no-repeat scroll 0 0; -} -.messager-question { - background: url('images/messager_icons.png') no-repeat scroll -32px 0; -} -.messager-warning { - background: url('images/messager_icons.png') no-repeat scroll -96px 0; -} -.messager-progress { - padding: 10px; -} -.messager-p-msg { - margin-bottom: 5px; -} -.messager-body .messager-input { - width: 100%; - padding: 4px 0; - outline-style: none; - border: 1px solid #95B8E7; -} -.window-thinborder .messager-button { - padding-bottom: 8px; -} -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #95B8E7; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #000000; - border-color: #95B8E7; -} -.tree-node-hover { - background: #eaf2ff; - color: #000000; -} -.tree-node-selected { - background: #ffe48d; - color: #000000; -} -.tree-node-hidden { - display: none; -} -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #95B8E7; - color: #000000; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #95B8E7; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #95B8E7; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #95B8E7; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #95B8E7; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #bbb; - border: 1px solid #bbb; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-on { - background: #ffe48d; - color: #000000; -} -.switchbutton-off { - background-color: #ffffff; - color: #000000; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #ffffff; - color: #000000; - border: 1px solid #bbb; - -moz-box-shadow: 0 0 3px 0 #bbb; - -webkit-box-shadow: 0 0 3px 0 #bbb; - box-shadow: 0 0 3px 0 #bbb; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} -.radiobutton { - position: relative; - border: 2px solid #ffab3f; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #ffab3f; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.checkbox { - position: relative; - border: 2px solid #ffab3f; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.checkbox-checked { - border: 0; - background: #ffab3f; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #0E2D5F; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #0E2D5F; -} -.sidemenu .accordion-header:hover { - background: #eaf2ff; - color: #0E2D5F; -} -.sidemenu .tree-node-hover { - background: #eaf2ff; - color: #0E2D5F; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #ffab3f; - color: #000000; - background: #ffe48d; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/filebox.css deleted file mode 100644 index c6bac6631..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/filebox.css +++ /dev/null @@ -1,20 +0,0 @@ -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/accordion_arrows.png deleted file mode 100755 index 720835f69c96c17ec32a20b03ac9753aa59b7f4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYeRK2H*V@SoVUT_Y-nKxaI`{RC0WjSLJ&w^R(C-|JQTojLXc1&{d*_z{$ jW+oTMdQ(F|jDg|L>K${_)^zO#I)%a0)z4*}Q$iB}_fAN- diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/blank.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/blank.gif deleted file mode 100755 index 1d11fa9ada9e93505b3d736acb204083f45d5fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/calendar_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/calendar_arrows.png deleted file mode 100755 index 430c4ad685b8c0068ecb7e3cbef74f493a84ad0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQYD@)jv*Dd-cCEn)nLHm{QbZE z+q@uWwandfr?Jb4eDYYmB3UAt=OO2Vt+MMT&+KD%&6hZDt!FBpej;sEpMN69^tKl% zp6y<4_lG^P z=;=eQ4Vs74-2)Ua&f1tcVdk$#{GPKe@&?ZMHmT&SMw?IV&w7)}ixLbB3d$Zg{&KGb P8OPx1>gTe~DWM4fp>5!O@Gl{c zHXr?)EMpjkiI0?0nVI4ps;W|uWCd!b5UAxPD-onMP4mgv0vV&Ul|KA@T-G#0QTd(IpSp7SIAsd;)#A=FjzgW9D>i*LbaNyX|0kF(mrr z;o92b6Zp@36nqs7kw}pT2qBaieQ3N+owvm{e=N(DufonR5DseQ_ISSW8dV0M=To{w zToOt35OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fRl}UZ@-Co%Cq`k{wEj}Dr>ShP9AQ|IKKA30{ejJboVoF`C-z@6mZMY&%Wiz%6S}#zb4u?o?9Mi=ECopVxzz+sNviAA!DK)mm8xe zgY9ZT9jlddc^&y2^u9XqDeU4{8s^AS#8C7TXsxEJW@uLu(3Whc35-X6v}jEgEb{G` z!{)$uKzw<~%0A6PhNHYfSuTvOzD8LpPF>PVr=&QqGC936QlPgc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/loading.gif deleted file mode 100755 index 68f01d04813c1f622810864a3aaa04b4a17ac8f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/menu_arrows.png deleted file mode 100755 index b986842e7e4044caed18edbcb4b376a4bb915623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/messager_icons.png deleted file mode 100755 index 62c18c135860351063ebaabe8c0f4df7664b8f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000zI<5nO~0)=fnxErNrCA`WgM*1^R=&_zX)CMr1T;-rJKi{RhT zwTRWWFSbznW6?ZwYBk2xccxEVa`0%4(Yva@;pbF0^9S2uAKfle(?qtbyxJ(2%kiF>CHXa` zwdcneqDH8s8`O=^Z;G*FoH3bGkRlewXgRMPCtCR>olp$6SSk2LaLtdk735GTeS6JrtWdjq}ZZs34}bF$p9qsdLBnIC+J1{xF!;M>5@n5YI? z&4z;cHjvE$_V&)MtT*$6579tEVTAaOu<<1(%cR!^622ph;K0g-9AQF(O3vhYiNJ*b z7Xuat7f#qV!aOb!Q6;pKF~UjxbnQ*DOwWIpHq-OqgFQe0fa`fz9oUMD0Z9VV1d9Q= z5#TIiB5HxD12dV7Jd)hJ_=qt$xd^NA4nEk!Bp@qUu0k4c(cRlRc0Y)25Z^q7^m|=T zEPSa{>fbuK*p?QKGWOF9-+|Bne}*tPWtM~)t<`EXu;7__@_h5{U+e{v=r+F-NMp}oB#0F&Ath1Z0fB%h<+sXzP;6TCwIF) z=XWKASa=$lA2eqle32Vdi_T3x4Qu>yxA*?om5;I#SWP5^#D2B6W$V>}P2w$`U+8H@ z0Ci?&Wu5GGc(Ia9{_CO5k{E>dTE6S>md@Y8z9L=77KeNpc;t7B)#8uV-B0>e^*5VwvF24Q#~Lh^WJDN!=N)I%V_ z3gc!>Fya-lLcclypp#1paq!SzI)AUI+cGqr6pX%dy3^@MQaM7bubeKKUmk$ssBS+{ z+D{bs1Nc(Z?FVcB@Meu!ev3HfXH1NcL_ z+>=<>Hi(2XX;)F{S;fEtv9G)w*hwlY~kM zCZMZPpFad1^A}a4J^;=P&LDat|`y57>Sp=A%yET$ajG`}@`p^xNM^J>GAB eBlUQ{{Qm&YJg{HE_Fe7(0000`TRe8 z#G%R{$NfX%tci2`Gda4n1O70V3HltacN37lc`VT21_Oig(wY*}T!mDijSQZyelF{r G5}E*M5;#5p diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/passwordbox_open.png deleted file mode 100644 index d328891f6a18ea703fd25a47b228df9cb13b4744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fh6C~y}*jFF6I{2&m zf8fW~lSf{d9=Ouc<(SoRr6$ox=6dW5rxOB`TRe8 z#G%R{$Nj@Z)5m5kM@2RMITi_;Npmte=_#;rBych_7F`xqKKy}=f%DM}Q4`(M(}DIf Nc)I$ztaD0e0su|qH(3Ax diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/searchbox_button.png deleted file mode 100755 index 6dd1931589b453f6cc9772fd1851d8705d6b6631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/spinner_arrows.png deleted file mode 100755 index 7c2df483dbb30dfb3a51332c03fe6f0c229c0547..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4Dgeh3R zJz6gy$J;RRRRiNz`7}$-z5~nWg=}UsVYp!HpQ#{_&8An~S<1fjm*zKyrHmF27#+^4 x`1rk&EZfSkR8C?on>%wt3;O{L3Dzy_3@=Og7TEqO`UJFx!PC{xWt~$(69D$UE$jdQ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tabs_icons.png deleted file mode 100755 index 4d29966d7154338a9e2e358821a5f72655eba43e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq+&f?978H@B_~L*E^a7uNPG49 z|BoM6E;$_tDnm{r-UW|t3f!- diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tagbox_icons.png deleted file mode 100644 index bd02e2d817c6b7c4e2a105919e9a89cc0a1d577f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel&`0YV@SoV>_0CQASS diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/tree_icons.png deleted file mode 100755 index e9be4f3a9965e49a4e4078f8c53f486d761a7468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/images/validatebox_warning.png deleted file mode 100755 index 2b3d4f05babf3f82b146350e96570fac02075de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/passwordbox.css deleted file mode 100644 index 92c9ce586..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/passwordbox.css +++ /dev/null @@ -1,6 +0,0 @@ -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/progressbar.css deleted file mode 100644 index 9fbcb3a20..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/progressbar.css +++ /dev/null @@ -1,33 +0,0 @@ -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.progressbar { - border-color: #95B8E7; -} -.progressbar-text { - color: #000000; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #ffe48d; - color: #000000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/propertygrid.css deleted file mode 100644 index 3b6f419e3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/propertygrid.css +++ /dev/null @@ -1,27 +0,0 @@ -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #dddddd; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #E0ECFF; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #dddddd; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #E0ECFF; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/radiobutton.css deleted file mode 100644 index 82533c8b5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/radiobutton.css +++ /dev/null @@ -1,25 +0,0 @@ -.radiobutton { - position: relative; - border: 2px solid #ffab3f; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #ffab3f; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/searchbox.css deleted file mode 100644 index ada5ce39a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/searchbox.css +++ /dev/null @@ -1,61 +0,0 @@ -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #E0ECFF; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/sidemenu.css deleted file mode 100644 index 2111e5b8d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/sidemenu.css +++ /dev/null @@ -1,69 +0,0 @@ -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #0E2D5F; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #0E2D5F; -} -.sidemenu .accordion-header:hover { - background: #eaf2ff; - color: #0E2D5F; -} -.sidemenu .tree-node-hover { - background: #eaf2ff; - color: #0E2D5F; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #ffab3f; - color: #000000; - background: #ffe48d; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/slider.css deleted file mode 100644 index 8721832cf..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/slider.css +++ /dev/null @@ -1,101 +0,0 @@ -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 5px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #95B8E7; - background: #E0ECFF; -} -.slider-rule span { - border-color: #95B8E7; -} -.slider-rulelabel span { - color: #000000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/spinner.css deleted file mode 100644 index 9e163f9e7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/spinner.css +++ /dev/null @@ -1,114 +0,0 @@ -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #E0ECFF; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #444; - outline-style: none; - background-color: #E0ECFF; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #eaf2ff; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #eaf2ff; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #E0ECFF; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #E0ECFF; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #E0ECFF; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/splitbutton.css deleted file mode 100644 index 86d6da58e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/splitbutton.css +++ /dev/null @@ -1,12 +0,0 @@ -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #aac5e7; - border-width: 0 0 0 1px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/switchbutton.css deleted file mode 100644 index 4b5d4ad71..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/switchbutton.css +++ /dev/null @@ -1,77 +0,0 @@ -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #bbb; - border: 1px solid #bbb; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-on { - background: #ffe48d; - color: #000000; -} -.switchbutton-off { - background-color: #ffffff; - color: #000000; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #ffffff; - color: #000000; - border: 1px solid #bbb; - -moz-box-shadow: 0 0 3px 0 #bbb; - -webkit-box-shadow: 0 0 3px 0 #bbb; - box-shadow: 0 0 3px 0 #bbb; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tabs.css deleted file mode 100644 index e3e97c78b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tabs.css +++ /dev/null @@ -1,413 +0,0 @@ -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 5px 5px; - -webkit-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #E0ECFF url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #E0ECFF url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #eaf2ff; - color: #000000; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #0E2D5F; - background: -webkit-linear-gradient(top,#EFF5FF 0,#ffffff 100%); - background: -moz-linear-gradient(top,#EFF5FF 0,#ffffff 100%); - background: -o-linear-gradient(top,#EFF5FF 0,#ffffff 100%); - background: linear-gradient(to bottom,#EFF5FF 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=0); -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(top,#ffffff 0,#EFF5FF 100%); - background: -moz-linear-gradient(top,#ffffff 0,#EFF5FF 100%); - background: -o-linear-gradient(top,#ffffff 0,#EFF5FF 100%); - background: linear-gradient(to bottom,#ffffff 0,#EFF5FF 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=0); -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#EFF5FF 0,#ffffff 100%); - background: -moz-linear-gradient(left,#EFF5FF 0,#ffffff 100%); - background: -o-linear-gradient(left,#EFF5FF 0,#ffffff 100%); - background: linear-gradient(to right,#EFF5FF 0,#ffffff 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=1); -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#ffffff 0,#EFF5FF 100%); - background: -moz-linear-gradient(left,#ffffff 0,#EFF5FF 100%); - background: -o-linear-gradient(left,#ffffff 0,#EFF5FF 100%); - background: linear-gradient(to right,#ffffff 0,#EFF5FF 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=1); -} -.tabs li a.tabs-inner { - color: #0E2D5F; - background-color: #E0ECFF; - background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); - background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); - background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%); - background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); -} -.tabs-header, -.tabs-tool { - background-color: #E0ECFF; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #95B8E7; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #eaf2ff; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #ffe48d; - color: #000000; - filter: none; - border-color: #95B8E7; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tagbox.css deleted file mode 100644 index 67d51a367..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tagbox.css +++ /dev/null @@ -1,44 +0,0 @@ -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #eaf2ff; - color: #000000; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/textbox.css deleted file mode 100644 index 71b154aa0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/textbox.css +++ /dev/null @@ -1,144 +0,0 @@ -.textbox { - position: relative; - border: 1px solid #95B8E7; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #6b9cde; - -moz-box-shadow: 0 0 3px 0 #95B8E7; - -webkit-box-shadow: 0 0 3px 0 #95B8E7; - box-shadow: 0 0 3px 0 #95B8E7; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tooltip.css deleted file mode 100644 index 8ce21b40e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tooltip.css +++ /dev/null @@ -1,103 +0,0 @@ -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #95B8E7; - color: #000000; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #95B8E7; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #95B8E7; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #95B8E7; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #95B8E7; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tree.css deleted file mode 100644 index 4a1bce0a0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/tree.css +++ /dev/null @@ -1,164 +0,0 @@ -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #95B8E7; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #000000; - border-color: #95B8E7; -} -.tree-node-hover { - background: #eaf2ff; - color: #000000; -} -.tree-node-selected { - background: #ffe48d; - color: #000000; -} -.tree-node-hidden { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/validatebox.css deleted file mode 100644 index 1fc3ad64e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/validatebox.css +++ /dev/null @@ -1,5 +0,0 @@ -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/window.css deleted file mode 100644 index 25a4bee98..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/default/window.css +++ /dev/null @@ -1,188 +0,0 @@ -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.window-shadow { - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #95B8E7; -} -.window { - background-color: #E0ECFF; - background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); - background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); - background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%); - background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0); -} -.window-proxy { - border: 1px dashed #95B8E7; -} -.window-proxy-mask, -.window-mask { - background: #ccc; -} -.window .panel-footer { - border: 1px solid #95B8E7; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/accordion.css deleted file mode 100644 index 3226cb381..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/accordion.css +++ /dev/null @@ -1,89 +0,0 @@ -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #D3D3D3; -} -.accordion .accordion-header { - background: #f3f3f3; - filter: none; -} -.accordion .accordion-header-selected { - background: #0092DC; -} -.accordion .accordion-header-selected .panel-title { - color: #fff; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #f3f3f3; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #D3D3D3; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #f3f3f3; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #D3D3D3; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #f3f3f3; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #D3D3D3; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/calendar.css deleted file mode 100644 index c647dcd31..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/calendar.css +++ /dev/null @@ -1,203 +0,0 @@ -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-body th, -.calendar-menu-month { - color: #4d4d4d; -} -.calendar-day { - color: #000000; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #D3D3D3; -} -.calendar { - border-color: #D3D3D3; -} -.calendar-header { - background: #f3f3f3; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #fafafa; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #e2e2e2; - color: #000000; -} -.calendar-hover { - border: 1px solid #ccc; - padding: 0; -} -.calendar-selected { - background-color: #0092DC; - color: #fff; - border: 1px solid #0070a9; - padding: 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/checkbox.css deleted file mode 100644 index 0edec673f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/checkbox.css +++ /dev/null @@ -1,31 +0,0 @@ -.checkbox { - position: relative; - border: 2px solid #0070a9; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.checkbox-checked { - border: 0; - background: #0070a9; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combo.css deleted file mode 100644 index 6ebdf5ee7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combo.css +++ /dev/null @@ -1,35 +0,0 @@ -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #ffffff; -} -.combo-arrow { - background-color: #f3f3f3; -} -.combo-arrow-hover { - background-color: #e2e2e2; -} -.combo-arrow:hover { - background-color: #e2e2e2; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combobox.css deleted file mode 100644 index 06613c144..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/combobox.css +++ /dev/null @@ -1,40 +0,0 @@ -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #e2e2e2; - color: #000000; -} -.combobox-item-selected { - background-color: #0092DC; - color: #fff; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datagrid.css deleted file mode 100644 index f5e39b43a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datagrid.css +++ /dev/null @@ -1,291 +0,0 @@ -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #D3D3D3; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #fafafa; - background: -webkit-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); - background: -moz-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); - background: -o-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); - background: linear-gradient(to bottom,#fdfdfd 0,#f5f5f5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#fdfdfd,endColorstr=#f5f5f5,GradientType=0); -} -.datagrid-cell-rownumber { - color: #000000; -} -.datagrid-resize-proxy { - background: #bfbfbf; -} -.datagrid-mask { - background: #ccc; -} -.datagrid-mask-msg { - border-color: #D3D3D3; -} -.datagrid-toolbar, -.datagrid-pager { - background: #fafafa; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #ddd; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ccc; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #000000; - border-collapse: separate; -} -.datagrid-row-alt { - background: #fafafa; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #e2e2e2; - color: #000000; - cursor: default; -} -.datagrid-row-selected { - background: #0092DC; - color: #fff; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datalist.css deleted file mode 100644 index de149ef05..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datalist.css +++ /dev/null @@ -1,95 +0,0 @@ -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #fafafa; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #000000; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.m-list li>a:hover { - background: #e2e2e2; - color: #000000; -} -.m-list .m-list-group { - padding: 0 4px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datebox.css deleted file mode 100644 index 36281af1b..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/datebox.css +++ /dev/null @@ -1,36 +0,0 @@ -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #fafafa; -} -.datebox-button a { - color: #444; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/dialog.css deleted file mode 100644 index 2850ca1dc..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/dialog.css +++ /dev/null @@ -1,47 +0,0 @@ -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #fafafa; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #D3D3D3 #D3D3D3 #ddd #D3D3D3; -} -.dialog-button { - border-color: #ddd #D3D3D3 #D3D3D3 #D3D3D3; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #fafafa; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/easyui.css deleted file mode 100644 index 43bc780b8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/easyui.css +++ /dev/null @@ -1,3427 +0,0 @@ -.panel { - overflow: hidden; - text-align: left; - margin: 0; - border: 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.panel-header, -.panel-body { - border-width: 1px; - border-style: solid; -} -.panel-header { - padding: 5px; - position: relative; -} -.panel-title { - background: url('images/blank.gif') no-repeat; -} -.panel-header-noborder { - border-width: 0 0 1px 0; -} -.panel-body { - overflow: auto; - border-top-width: 0; - padding: 0; -} -.panel-body-noheader { - border-top-width: 1px; -} -.panel-body-noborder { - border-width: 0px; -} -.panel-body-nobottom { - border-bottom-width: 0; -} -.panel-with-icon { - padding-left: 18px; -} -.panel-icon, -.panel-tool { - position: absolute; - top: 50%; - margin-top: -8px; - height: 16px; - overflow: hidden; -} -.panel-icon { - left: 5px; - width: 16px; -} -.panel-tool { - right: 5px; - width: auto; -} -.panel-tool a { - display: inline-block; - width: 16px; - height: 16px; - opacity: 0.6; - filter: alpha(opacity=60); - margin: 0 0 0 2px; - vertical-align: top; -} -.panel-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - background-color: #e2e2e2; - -moz-border-radius: 3px 3px 3px 3px; - -webkit-border-radius: 3px 3px 3px 3px; - border-radius: 3px 3px 3px 3px; -} -.panel-loading { - padding: 11px 0px 10px 30px; -} -.panel-noscroll { - overflow: hidden; -} -.panel-fit, -.panel-fit body { - height: 100%; - margin: 0; - padding: 0; - border: 0; - overflow: hidden; -} -.panel-loading { - background: url('images/loading.gif') no-repeat 10px 10px; -} -.panel-tool-close { - background: url('images/panel_tools.png') no-repeat -16px 0px; -} -.panel-tool-min { - background: url('images/panel_tools.png') no-repeat 0px 0px; -} -.panel-tool-max { - background: url('images/panel_tools.png') no-repeat 0px -16px; -} -.panel-tool-restore { - background: url('images/panel_tools.png') no-repeat -16px -16px; -} -.panel-tool-collapse { - background: url('images/panel_tools.png') no-repeat -32px 0; -} -.panel-tool-expand { - background: url('images/panel_tools.png') no-repeat -32px -16px; -} -.panel-header, -.panel-body { - border-color: #D3D3D3; -} -.panel-header { - background-color: #f3f3f3; - background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); - background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); - background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); - background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); -} -.panel-body { - background-color: #ffffff; - color: #000000; - font-size: 14px; -} -.panel-title { - font-size: 14px; - font-weight: bold; - color: #575765; - height: 20px; - line-height: 20px; -} -.panel-footer { - border: 1px solid #D3D3D3; - overflow: hidden; - background: #fafafa; -} -.panel-footer-noborder { - border-width: 1px 0 0 0; -} -.panel-hleft, -.panel-hright { - position: relative; -} -.panel-hleft>.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #D3D3D3; -} -.accordion .accordion-header { - background: #f3f3f3; - filter: none; -} -.accordion .accordion-header-selected { - background: #0092DC; -} -.accordion .accordion-header-selected .panel-title { - color: #fff; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #f3f3f3; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #D3D3D3; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #f3f3f3; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #D3D3D3; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #f3f3f3; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #D3D3D3; -} -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.window-shadow { - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #D3D3D3; -} -.window { - background-color: #f3f3f3; - background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); - background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); - background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); - background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 20%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); -} -.window-proxy { - border: 1px dashed #D3D3D3; -} -.window-proxy-mask, -.window-mask { - background: #ccc; -} -.window .panel-footer { - border: 1px solid #D3D3D3; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #fafafa; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #D3D3D3 #D3D3D3 #ddd #D3D3D3; -} -.dialog-button { - border-color: #ddd #D3D3D3 #D3D3D3 #D3D3D3; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #fafafa; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.l-btn { - text-decoration: none; - display: inline-block; - overflow: hidden; - margin: 0; - padding: 0; - cursor: pointer; - outline: none; - text-align: center; - vertical-align: middle; - line-height: normal; -} -.l-btn-plain { - border-width: 0; - padding: 1px; -} -.l-btn-left { - display: inline-block; - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - vertical-align: top; -} -.l-btn-text { - display: inline-block; - vertical-align: top; - width: auto; - line-height: 28px; - font-size: 14px; - padding: 0; - margin: 0 6px; -} -.l-btn-icon { - display: inline-block; - width: 16px; - height: 16px; - line-height: 16px; - position: absolute; - top: 50%; - margin-top: -8px; - font-size: 1px; -} -.l-btn span span .l-btn-empty { - display: inline-block; - margin: 0; - width: 16px; - height: 24px; - font-size: 1px; - vertical-align: top; -} -.l-btn span .l-btn-icon-left { - padding: 0 0 0 20px; - background-position: left center; -} -.l-btn span .l-btn-icon-right { - padding: 0 20px 0 0; - background-position: right center; -} -.l-btn-icon-left .l-btn-text { - margin: 0 6px 0 26px; -} -.l-btn-icon-left .l-btn-icon { - left: 6px; -} -.l-btn-icon-right .l-btn-text { - margin: 0 26px 0 6px; -} -.l-btn-icon-right .l-btn-icon { - right: 6px; -} -.l-btn-icon-top .l-btn-text { - margin: 20px 4px 0 4px; -} -.l-btn-icon-top .l-btn-icon { - top: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-icon-bottom .l-btn-text { - margin: 0 4px 20px 4px; -} -.l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-left .l-btn-empty { - margin: 0 6px; - width: 16px; -} -.l-btn-plain:hover { - padding: 0; -} -.l-btn-focus { - outline: #0000FF dotted thin; -} -.l-btn-large .l-btn-text { - line-height: 44px; -} -.l-btn-large .l-btn-icon { - width: 32px; - height: 32px; - line-height: 32px; - margin-top: -16px; -} -.l-btn-large .l-btn-icon-left .l-btn-text { - margin-left: 40px; -} -.l-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.l-btn-large .l-btn-icon-top .l-btn-text { - margin-top: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-top .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-left .l-btn-empty { - margin: 0 6px; - width: 32px; -} -.l-btn { - color: #444; - background: #fafafa; - background-repeat: repeat-x; - border: 1px solid #bbb; - background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.l-btn:hover { - background: #e2e2e2; - color: #000000; - border: 1px solid #ccc; - filter: none; -} -.l-btn-plain { - background: transparent; - border-width: 0; - filter: none; -} -.l-btn-outline { - border-width: 1px; - border-color: #ccc; - padding: 0; -} -.l-btn-plain:hover { - background: #e2e2e2; - color: #000000; - border: 1px solid #ccc; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.l-btn-disabled, -.l-btn-disabled:hover { - opacity: 0.5; - cursor: default; - background: #fafafa; - color: #444; - background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%); - background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0); -} -.l-btn-disabled .l-btn-text, -.l-btn-disabled .l-btn-icon { - filter: alpha(opacity=50); -} -.l-btn-plain-disabled, -.l-btn-plain-disabled:hover { - background: transparent; - filter: alpha(opacity=50); -} -.l-btn-selected, -.l-btn-selected:hover { - background: #ddd; - filter: none; -} -.l-btn-plain-selected, -.l-btn-plain-selected:hover { - background: #ddd; -} -.textbox { - position: relative; - border: 1px solid #D3D3D3; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #bababa; - -moz-box-shadow: 0 0 3px 0 #D3D3D3; - -webkit-box-shadow: 0 0 3px 0 #D3D3D3; - box-shadow: 0 0 3px 0 #D3D3D3; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; -} -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #ffffff; -} -.combo-arrow { - background-color: #f3f3f3; -} -.combo-arrow-hover { - background-color: #e2e2e2; -} -.combo-arrow:hover { - background-color: #e2e2e2; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #e2e2e2; - color: #000000; -} -.combobox-item-selected { - background-color: #0092DC; - color: #fff; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #e2e2e2; - color: #000000; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} -.layout { - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - z-index: 0; -} -.layout-panel { - position: absolute; - overflow: hidden; -} -.layout-body { - min-width: 1px; - min-height: 1px; -} -.layout-panel-east, -.layout-panel-west { - z-index: 2; -} -.layout-panel-north, -.layout-panel-south { - z-index: 3; -} -.layout-expand { - position: absolute; - padding: 0px; - font-size: 1px; - cursor: pointer; - z-index: 1; -} -.layout-expand .panel-header, -.layout-expand .panel-body { - background: transparent; - filter: none; - overflow: hidden; -} -.layout-expand .panel-header { - border-bottom-width: 0px; -} -.layout-expand .panel-body { - position: relative; -} -.layout-expand .panel-body .panel-icon { - margin-top: 0; - top: 0; - left: 50%; - margin-left: -8px; -} -.layout-expand-west .panel-header .panel-icon, -.layout-expand-east .panel-header .panel-icon { - display: none; -} -.layout-expand-title { - position: absolute; - top: 0; - left: 21px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.layout-expand-title-up { - position: absolute; - top: 0; - left: 0; - text-align: right; - padding-left: 5px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 0; -} -.layout-expand-with-icon { - top: 18px; -} -.layout-expand .panel-body-noheader .layout-expand-title, -.layout-expand .panel-body-noheader .panel-icon { - top: 5px; -} -.layout-expand .panel-body-noheader .layout-expand-with-icon { - top: 23px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - position: absolute; - font-size: 1px; - display: none; - z-index: 5; -} -.layout-split-proxy-h { - width: 5px; - cursor: e-resize; -} -.layout-split-proxy-v { - height: 5px; - cursor: n-resize; -} -.layout-mask { - position: absolute; - background: #fafafa; - filter: alpha(opacity=10); - opacity: 0.10; - z-index: 4; -} -.layout-button-up { - background: url('images/layout_arrows.png') no-repeat -16px -16px; -} -.layout-button-down { - background: url('images/layout_arrows.png') no-repeat -16px 0; -} -.layout-button-left { - background: url('images/layout_arrows.png') no-repeat 0 0; -} -.layout-button-right { - background: url('images/layout_arrows.png') no-repeat 0 -16px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - background-color: #bfbfbf; -} -.layout-split-north { - border-bottom: 5px solid #efefef; -} -.layout-split-south { - border-top: 5px solid #efefef; -} -.layout-split-east { - border-left: 5px solid #efefef; -} -.layout-split-west { - border-right: 5px solid #efefef; -} -.layout-expand { - background-color: #f3f3f3; -} -.layout-expand-over { - background-color: #f3f3f3; -} -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 5px 5px; - -webkit-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #f3f3f3 url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #f3f3f3 url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #e2e2e2; - color: #000000; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #575765; - background: -webkit-linear-gradient(top,#F8F8F8 0,#ffffff 100%); - background: -moz-linear-gradient(top,#F8F8F8 0,#ffffff 100%); - background: -o-linear-gradient(top,#F8F8F8 0,#ffffff 100%); - background: linear-gradient(to bottom,#F8F8F8 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=0); -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(top,#ffffff 0,#F8F8F8 100%); - background: -moz-linear-gradient(top,#ffffff 0,#F8F8F8 100%); - background: -o-linear-gradient(top,#ffffff 0,#F8F8F8 100%); - background: linear-gradient(to bottom,#ffffff 0,#F8F8F8 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=0); -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#F8F8F8 0,#ffffff 100%); - background: -moz-linear-gradient(left,#F8F8F8 0,#ffffff 100%); - background: -o-linear-gradient(left,#F8F8F8 0,#ffffff 100%); - background: linear-gradient(to right,#F8F8F8 0,#ffffff 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=1); -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#ffffff 0,#F8F8F8 100%); - background: -moz-linear-gradient(left,#ffffff 0,#F8F8F8 100%); - background: -o-linear-gradient(left,#ffffff 0,#F8F8F8 100%); - background: linear-gradient(to right,#ffffff 0,#F8F8F8 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=1); -} -.tabs li a.tabs-inner { - color: #575765; - background-color: #f3f3f3; - background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); - background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); - background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); - background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); -} -.tabs-header, -.tabs-tool { - background-color: #f3f3f3; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #D3D3D3; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #e2e2e2; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #0092DC; - color: #fff; - filter: none; - border-color: #D3D3D3; -} -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #D3D3D3; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #fafafa; - background: -webkit-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); - background: -moz-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); - background: -o-linear-gradient(top,#fdfdfd 0,#f5f5f5 100%); - background: linear-gradient(to bottom,#fdfdfd 0,#f5f5f5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#fdfdfd,endColorstr=#f5f5f5,GradientType=0); -} -.datagrid-cell-rownumber { - color: #000000; -} -.datagrid-resize-proxy { - background: #bfbfbf; -} -.datagrid-mask { - background: #ccc; -} -.datagrid-mask-msg { - border-color: #D3D3D3; -} -.datagrid-toolbar, -.datagrid-pager { - background: #fafafa; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #ddd; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ccc; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #000000; - border-collapse: separate; -} -.datagrid-row-alt { - background: #fafafa; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #e2e2e2; - color: #000000; - cursor: default; -} -.datagrid-row-selected { - background: #0092DC; - color: #fff; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #ddd; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #f3f3f3; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #ddd; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #f3f3f3; -} -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #fafafa; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #000000; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ccc; -} -.m-list li>a:hover { - background: #e2e2e2; - color: #000000; -} -.m-list .m-list-group { - padding: 0 4px; -} -.pagination { - zoom: 1; - padding: 2px; -} -.pagination table { - float: left; - height: 30px; -} -.pagination td { - border: 0; -} -.pagination-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ccc; - border-right: 1px solid #fff; - margin: 3px 1px; -} -.pagination .pagination-num { - border-width: 1px; - border-style: solid; - margin: 0 2px; - padding: 2px; - width: 3em; - height: auto; - text-align: center; - font-size: 14px; -} -.pagination-page-list { - margin: 0px 6px; - padding: 1px 2px; - width: auto; - height: auto; - border-width: 1px; - border-style: solid; -} -.pagination-info { - float: right; - margin: 0 6px; - padding: 0; - height: 30px; - line-height: 30px; - font-size: 14px; -} -.pagination span { - font-size: 14px; -} -.pagination-link .l-btn-text { - box-sizing: border-box; - text-align: center; - margin: 0; - padding: 0 .5em; - width: auto; - min-width: 28px; -} -.pagination-first { - background: url('images/pagination_icons.png') no-repeat 0 center; -} -.pagination-prev { - background: url('images/pagination_icons.png') no-repeat -16px center; -} -.pagination-next { - background: url('images/pagination_icons.png') no-repeat -32px center; -} -.pagination-last { - background: url('images/pagination_icons.png') no-repeat -48px center; -} -.pagination-load { - background: url('images/pagination_icons.png') no-repeat -64px center; -} -.pagination-loading { - background: url('images/loading.gif') no-repeat center center; -} -.pagination-page-list, -.pagination .pagination-num { - border-color: #D3D3D3; -} -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.calendar-body th, -.calendar-menu-month { - color: #4d4d4d; -} -.calendar-day { - color: #000000; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #D3D3D3; -} -.calendar { - border-color: #D3D3D3; -} -.calendar-header { - background: #f3f3f3; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #fafafa; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #e2e2e2; - color: #000000; -} -.calendar-hover { - border: 1px solid #ccc; - padding: 0; -} -.calendar-selected { - background-color: #0092DC; - color: #fff; - border: 1px solid #0070a9; - padding: 0; -} -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #fafafa; -} -.datebox-button a { - color: #444; -} -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #f3f3f3; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #444; - outline-style: none; - background-color: #f3f3f3; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #e2e2e2; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #e2e2e2; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #f3f3f3; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #f3f3f3; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #f3f3f3; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.progressbar { - border-color: #D3D3D3; -} -.progressbar-text { - color: #000000; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #0092DC; - color: #fff; -} -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #f3f3f3; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 5px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #D3D3D3; - background: #f3f3f3; -} -.slider-rule span { - border-color: #D3D3D3; -} -.slider-rulelabel span { - color: #000000; -} -.menu { - position: absolute; - margin: 0; - padding: 2px; - border-width: 1px; - border-style: solid; - overflow: hidden; -} -.menu-inline { - position: relative; -} -.menu-item { - position: relative; - margin: 0; - padding: 0; - overflow: hidden; - white-space: nowrap; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.menu-text { - height: 20px; - line-height: 20px; - float: left; - padding-left: 28px; -} -.menu-icon { - position: absolute; - width: 16px; - height: 16px; - left: 2px; - top: 50%; - margin-top: -8px; -} -.menu-rightarrow { - position: absolute; - width: 16px; - height: 16px; - right: 0; - top: 50%; - margin-top: -8px; -} -.menu-line { - position: absolute; - left: 26px; - top: 0; - height: 2000px; - font-size: 1px; -} -.menu-sep { - margin: 3px 0px 3px 25px; - font-size: 1px; -} -.menu-noline .menu-line { - display: none; -} -.menu-noline .menu-sep { - margin-left: 0; - margin-right: 0; -} -.menu-active { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.menu-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); - cursor: default; -} -.menu-text, -.menu-text span { - font-size: 14px; -} -.menu-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.menu-rightarrow { - background: url('images/menu_arrows.png') no-repeat -32px center; -} -.menu-line { - border-left: 1px solid #ccc; - border-right: 1px solid #fff; -} -.menu-sep { - border-top: 1px solid #ccc; - border-bottom: 1px solid #fff; -} -.menu { - background-color: #f3f3f3; - border-color: #D3D3D3; - color: #444; -} -.menu-content { - background: #ffffff; -} -.menu-item { - border-color: transparent; - _border-color: #f3f3f3; -} -.menu-active { - border-color: #ccc; - color: #000000; - background: #e2e2e2; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #444; -} -.m-btn-downarrow, -.s-btn-downarrow { - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - font-size: 1px; - right: 0; - top: 50%; - margin-top: -8px; -} -.m-btn-active, -.s-btn-active { - background: #e2e2e2; - color: #000000; - border: 1px solid #ccc; - filter: none; -} -.m-btn-plain-active, -.s-btn-plain-active { - background: transparent; - padding: 0; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.m-btn .l-btn-left .l-btn-text { - margin-right: 20px; -} -.m-btn .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.m-btn .l-btn-icon-right .l-btn-icon { - right: 20px; -} -.m-btn .l-btn-icon-top .l-btn-text { - margin-right: 4px; - margin-bottom: 14px; -} -.m-btn .l-btn-icon-bottom .l-btn-text { - margin-right: 4px; - margin-bottom: 34px; -} -.m-btn .l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 20px; -} -.m-btn .l-btn-icon-top .m-btn-downarrow, -.m-btn .l-btn-icon-bottom .m-btn-downarrow { - top: auto; - bottom: 0px; - left: 50%; - margin-left: -8px; -} -.m-btn-line { - display: inline-block; - position: absolute; - font-size: 1px; - display: none; -} -.m-btn .l-btn-left .m-btn-line { - right: 0; - width: 16px; - height: 500px; - border-style: solid; - border-color: #bfbfbf; - border-width: 0 0 0 1px; -} -.m-btn .l-btn-icon-top .m-btn-line, -.m-btn .l-btn-icon-bottom .m-btn-line { - left: 0; - bottom: 0; - width: 500px; - height: 16px; - border-width: 1px 0 0 0; -} -.m-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 56px; -} -.m-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 50px; -} -.m-btn-downarrow, -.s-btn-downarrow { - background: url('images/menu_arrows.png') no-repeat 0 center; -} -.m-btn-plain-active, -.s-btn-plain-active { - border-color: #ccc; - background-color: #e2e2e2; - color: #000000; -} -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #bfbfbf; - border-width: 0 0 0 1px; -} -.messager-body { - padding: 10px 10px 30px 10px; - overflow: auto; -} -.messager-button { - text-align: center; - padding: 5px; -} -.messager-button .l-btn { - width: 70px; -} -.messager-icon { - float: left; - width: 32px; - height: 32px; - margin: 0 10px 10px 0; -} -.messager-error { - background: url('images/messager_icons.png') no-repeat scroll -64px 0; -} -.messager-info { - background: url('images/messager_icons.png') no-repeat scroll 0 0; -} -.messager-question { - background: url('images/messager_icons.png') no-repeat scroll -32px 0; -} -.messager-warning { - background: url('images/messager_icons.png') no-repeat scroll -96px 0; -} -.messager-progress { - padding: 10px; -} -.messager-p-msg { - margin-bottom: 5px; -} -.messager-body .messager-input { - width: 100%; - padding: 4px 0; - outline-style: none; - border: 1px solid #D3D3D3; -} -.window-thinborder .messager-button { - padding-bottom: 8px; -} -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #D3D3D3; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #000000; - border-color: #D3D3D3; -} -.tree-node-hover { - background: #e2e2e2; - color: #000000; -} -.tree-node-selected { - background: #0092DC; - color: #fff; -} -.tree-node-hidden { - display: none; -} -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #D3D3D3; - color: #000000; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #D3D3D3; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #D3D3D3; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #D3D3D3; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #D3D3D3; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #bbb; - border: 1px solid #bbb; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-on { - background: #0092DC; - color: #fff; -} -.switchbutton-off { - background-color: #ffffff; - color: #000000; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #ffffff; - color: #000000; - border: 1px solid #bbb; - -moz-box-shadow: 0 0 3px 0 #bbb; - -webkit-box-shadow: 0 0 3px 0 #bbb; - box-shadow: 0 0 3px 0 #bbb; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} -.radiobutton { - position: relative; - border: 2px solid #0070a9; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #0070a9; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.checkbox { - position: relative; - border: 2px solid #0070a9; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.checkbox-checked { - border: 0; - background: #0070a9; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #575765; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #575765; -} -.sidemenu .accordion-header:hover { - background: #e2e2e2; - color: #575765; -} -.sidemenu .tree-node-hover { - background: #e2e2e2; - color: #575765; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #0070a9; - color: #fff; - background: #0092DC; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/filebox.css deleted file mode 100644 index c6bac6631..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/filebox.css +++ /dev/null @@ -1,20 +0,0 @@ -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/accordion_arrows.png deleted file mode 100755 index a0b8769cc5091d81760c7ed555ac3c3453febbfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#8c}V@SoVHq8x z8Mn?6aTf^k-V*tOYvn_ZO}fk5lvg|}E|PI9vs&aPwII@?XO4*juRBlIrj#un@>dub Yl7)&6CQe}74m6L!)78&qol`;+0Id=veEh?7!oT zn93bYIb9!43Wj)WNz0M)xYl!8U>3_OjRiss3@1j_Zvlb#iD~jUnsR3em#t_3WtUHqj%c^0} zFSrhZpjU$)YHUS-lsMx)nN8pghWK6h!524#*oXjC@NjHF9H1y2K%G?c=lr%4eY%ue zT+7R9Pld<2<$C}OAU0HZIJPqD0RA&Sip042zF(tA4uaUhZ>jL`*HN0POocjDIidNRbTZ#@zvW7@I c5>Ct23v;ttA1D3-v;Y7A07*qoM6N<$f&+eyE&u=k diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/datebox_arrow.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/datebox_arrow.png deleted file mode 100755 index 783c83357fdf90a1c7c024358e1d768b5c09c135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fWs*_M~|PZK4f_B}P-f8$r|z#h zE+)9D_?OzcE{A)9cRCb`94D|RR5VOsbIEjx-=1{JpsQ;^Px3ZX?(@vc^nEOU2KU{_ gJ$cDa*@;a`BkgHpqSBTGpgR~mUHx3vIVCg!07Oqo9{>OV diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/linkbutton_bg.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/linkbutton_bg.png deleted file mode 100755 index fc66bd2cd24047b8377342365a1df3846327ecde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmVc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/loading.gif deleted file mode 100755 index 68f01d04813c1f622810864a3aaa04b4a17ac8f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/menu_arrows.png deleted file mode 100755 index b986842e7e4044caed18edbcb4b376a4bb915623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/messager_icons.png deleted file mode 100755 index 62c18c135860351063ebaabe8c0f4df7664b8f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000_$JYFBpo`sqZyU339@ZwM6gi$;Pr>w&6M&T1N3Q$b?ahk3>@EL9`+1-BwzvH4 z=V<*uH!1ee(Sv*K$aVm^9zxbfZU9nZC#eDGVQ*&XXK(qpy{>x2j~_q0QX@ky?B2S$ z`TO_pb_Ho^lHPWf$3SXG3P5TF!a(UIB>)3m?2n~HhFtml`Lhm)4-7>2Cr_RTgV@`) zZDWrM_B#twLv#R=>k(}FC=EbL>?Sq<16=LCHdYi*!X*!q1F0DeKpY^*)!|!SNr;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/passwordbox_open.png deleted file mode 100644 index 0f25d535e05b22b406fd72647611aace9cfa6249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/searchbox_button.png deleted file mode 100755 index 6dd1931589b453f6cc9772fd1851d8705d6b6631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/spinner_arrows.png deleted file mode 100755 index b1773c24b20b30318e38c4b84690e3d0010c9c43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4DgeBzU z{E=^QXHHmRmEiEUJ<_jB`NK-}t7{l}8A{FvOK}{T)p$BC>8|6-x-MIXOa{IRh5%#E x$&;(vVs#x>vb(K5c#%QkA)^788{=C>2L8QE5AM%P*8@KmF984m diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tabs_icons.png deleted file mode 100755 index dfa10f7d78b3dc6965ef86957a0e4345ec000bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2O2978H@B_~L*E^a70aO1`g zdpoacw*Y(&nwsF2UyID`n8m&$nZ<^krzppre_*0C6=+@buQ_y%c^L~IL^<_ t&+}8oM91jk1`W4%S64GGH^xE+hOnLmClB8dn+LRl!PC{xWt~$(69Df$H1z-g diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tagbox_icons.png deleted file mode 100644 index 8ec64360884b3fdb81255ad6074bc08ed183232c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoVtb9vwNkrdSr%AfUpK=5(o}_e|{SG6u6f5&Q g4t5*qz9vC-hN^}472i&@1{u%b>FVdQ&MBb@08Zm4@c;k- diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/tree_icons.png deleted file mode 100755 index e9be4f3a9965e49a4e4078f8c53f486d761a7468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/images/validatebox_warning.png deleted file mode 100755 index 2b3d4f05babf3f82b146350e96570fac02075de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/passwordbox.css deleted file mode 100644 index 92c9ce586..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/passwordbox.css +++ /dev/null @@ -1,6 +0,0 @@ -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/progressbar.css deleted file mode 100644 index ca49e9404..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/progressbar.css +++ /dev/null @@ -1,33 +0,0 @@ -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.progressbar { - border-color: #D3D3D3; -} -.progressbar-text { - color: #000000; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #0092DC; - color: #fff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/propertygrid.css deleted file mode 100644 index e9f98ee57..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/propertygrid.css +++ /dev/null @@ -1,27 +0,0 @@ -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #ddd; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #f3f3f3; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #ddd; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #f3f3f3; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/radiobutton.css deleted file mode 100644 index 341e570fd..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/radiobutton.css +++ /dev/null @@ -1,25 +0,0 @@ -.radiobutton { - position: relative; - border: 2px solid #0070a9; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #0070a9; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/searchbox.css deleted file mode 100644 index 7b15815d2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/searchbox.css +++ /dev/null @@ -1,61 +0,0 @@ -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #f3f3f3; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/sidemenu.css deleted file mode 100644 index 43e137260..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/sidemenu.css +++ /dev/null @@ -1,69 +0,0 @@ -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #575765; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #575765; -} -.sidemenu .accordion-header:hover { - background: #e2e2e2; - color: #575765; -} -.sidemenu .tree-node-hover { - background: #e2e2e2; - color: #575765; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #0070a9; - color: #fff; - background: #0092DC; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/slider.css deleted file mode 100644 index 11c8b2682..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/slider.css +++ /dev/null @@ -1,101 +0,0 @@ -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 5px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #D3D3D3; - background: #f3f3f3; -} -.slider-rule span { - border-color: #D3D3D3; -} -.slider-rulelabel span { - color: #000000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/spinner.css deleted file mode 100644 index 391f22780..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/spinner.css +++ /dev/null @@ -1,114 +0,0 @@ -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #f3f3f3; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #444; - outline-style: none; - background-color: #f3f3f3; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #e2e2e2; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #e2e2e2; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #f3f3f3; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #f3f3f3; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #f3f3f3; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/splitbutton.css deleted file mode 100644 index bb2b6daaf..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/splitbutton.css +++ /dev/null @@ -1,12 +0,0 @@ -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #bfbfbf; - border-width: 0 0 0 1px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/switchbutton.css deleted file mode 100644 index a5bf61f75..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/switchbutton.css +++ /dev/null @@ -1,77 +0,0 @@ -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #bbb; - border: 1px solid #bbb; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.switchbutton-on { - background: #0092DC; - color: #fff; -} -.switchbutton-off { - background-color: #ffffff; - color: #000000; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #ffffff; - color: #000000; - border: 1px solid #bbb; - -moz-box-shadow: 0 0 3px 0 #bbb; - -webkit-box-shadow: 0 0 3px 0 #bbb; - box-shadow: 0 0 3px 0 #bbb; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tabs.css deleted file mode 100644 index 2767fc0da..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tabs.css +++ /dev/null @@ -1,413 +0,0 @@ -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 5px 5px; - -webkit-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; - border-radius: 5px 0 0 5px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; - border-radius: 0 5px 5px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #f3f3f3 url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #f3f3f3 url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #e2e2e2; - color: #000000; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #575765; - background: -webkit-linear-gradient(top,#F8F8F8 0,#ffffff 100%); - background: -moz-linear-gradient(top,#F8F8F8 0,#ffffff 100%); - background: -o-linear-gradient(top,#F8F8F8 0,#ffffff 100%); - background: linear-gradient(to bottom,#F8F8F8 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=0); -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(top,#ffffff 0,#F8F8F8 100%); - background: -moz-linear-gradient(top,#ffffff 0,#F8F8F8 100%); - background: -o-linear-gradient(top,#ffffff 0,#F8F8F8 100%); - background: linear-gradient(to bottom,#ffffff 0,#F8F8F8 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=0); -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#F8F8F8 0,#ffffff 100%); - background: -moz-linear-gradient(left,#F8F8F8 0,#ffffff 100%); - background: -o-linear-gradient(left,#F8F8F8 0,#ffffff 100%); - background: linear-gradient(to right,#F8F8F8 0,#ffffff 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#ffffff,GradientType=1); -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - background: -webkit-linear-gradient(left,#ffffff 0,#F8F8F8 100%); - background: -moz-linear-gradient(left,#ffffff 0,#F8F8F8 100%); - background: -o-linear-gradient(left,#ffffff 0,#F8F8F8 100%); - background: linear-gradient(to right,#ffffff 0,#F8F8F8 100%); - background-repeat: repeat-y; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F8F8F8,GradientType=1); -} -.tabs li a.tabs-inner { - color: #575765; - background-color: #f3f3f3; - background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); - background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); - background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 100%); - background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); -} -.tabs-header, -.tabs-tool { - background-color: #f3f3f3; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #D3D3D3; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #e2e2e2; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #0092DC; - color: #fff; - filter: none; - border-color: #D3D3D3; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tagbox.css deleted file mode 100644 index 46cbd333d..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tagbox.css +++ /dev/null @@ -1,44 +0,0 @@ -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - background: #e2e2e2; - color: #000000; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/textbox.css deleted file mode 100644 index 2705ebcf9..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/textbox.css +++ /dev/null @@ -1,144 +0,0 @@ -.textbox { - position: relative; - border: 1px solid #D3D3D3; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #bababa; - -moz-box-shadow: 0 0 3px 0 #D3D3D3; - -webkit-box-shadow: 0 0 3px 0 #D3D3D3; - box-shadow: 0 0 3px 0 #D3D3D3; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tooltip.css deleted file mode 100644 index fee263f7f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tooltip.css +++ /dev/null @@ -1,103 +0,0 @@ -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #D3D3D3; - color: #000000; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #D3D3D3; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #D3D3D3; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #D3D3D3; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #D3D3D3; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tree.css deleted file mode 100644 index 1cc4f2d3a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/tree.css +++ /dev/null @@ -1,164 +0,0 @@ -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #D3D3D3; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #000000; - border-color: #D3D3D3; -} -.tree-node-hover { - background: #e2e2e2; - color: #000000; -} -.tree-node-selected { - background: #0092DC; - color: #fff; -} -.tree-node-hidden { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/validatebox.css deleted file mode 100644 index 1fc3ad64e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/validatebox.css +++ /dev/null @@ -1,5 +0,0 @@ -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/window.css deleted file mode 100644 index 0e522cd88..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/gray/window.css +++ /dev/null @@ -1,188 +0,0 @@ -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border-radius: 5px 5px 5px 5px; -} -.window-shadow { - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #D3D3D3; -} -.window { - background-color: #f3f3f3; - background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); - background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); - background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 20%); - background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 20%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0); -} -.window-proxy { - border: 1px dashed #D3D3D3; -} -.window-proxy-mask, -.window-mask { - background: #ccc; -} -.window .panel-footer { - border: 1px solid #D3D3D3; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icon.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icon.css deleted file mode 100755 index 50d4f1b65..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icon.css +++ /dev/null @@ -1,96 +0,0 @@ -.icon-blank{ - background:url('icons/blank.gif') no-repeat center center; -} -.icon-add{ - background:url('icons/edit_add.png') no-repeat center center; -} -.icon-edit{ - background:url('icons/pencil.png') no-repeat center center; -} -.icon-clear{ - background:url('icons/clear.png') no-repeat center center; -} -.icon-remove{ - background:url('icons/edit_remove.png') no-repeat center center; -} -.icon-save{ - background:url('icons/filesave.png') no-repeat center center; -} -.icon-cut{ - background:url('icons/cut.png') no-repeat center center; -} -.icon-ok{ - background:url('icons/ok.png') no-repeat center center; -} -.icon-no{ - background:url('icons/no.png') no-repeat center center; -} -.icon-cancel{ - background:url('icons/cancel.png') no-repeat center center; -} -.icon-reload{ - background:url('icons/reload.png') no-repeat center center; -} -.icon-search{ - background:url('icons/search.png') no-repeat center center; -} -.icon-print{ - background:url('icons/print.png') no-repeat center center; -} -.icon-help{ - background:url('icons/help.png') no-repeat center center; -} -.icon-undo{ - background:url('icons/undo.png') no-repeat center center; -} -.icon-redo{ - background:url('icons/redo.png') no-repeat center center; -} -.icon-back{ - background:url('icons/back.png') no-repeat center center; -} -.icon-sum{ - background:url('icons/sum.png') no-repeat center center; -} -.icon-tip{ - background:url('icons/tip.png') no-repeat center center; -} -.icon-filter{ - background:url('icons/filter.png') no-repeat center center; -} -.icon-man{ - background:url('icons/man.png') no-repeat center center; -} -.icon-lock{ - background:url('icons/lock.png') no-repeat center center; -} -.icon-more{ - background:url('icons/more.png') no-repeat center center; -} - - -.icon-mini-add{ - background:url('icons/mini_add.png') no-repeat center center; -} -.icon-mini-edit{ - background:url('icons/mini_edit.png') no-repeat center center; -} -.icon-mini-refresh{ - background:url('icons/mini_refresh.png') no-repeat center center; -} - -.icon-large-picture{ - background:url('icons/large_picture.png') no-repeat center center; -} -.icon-large-clipart{ - background:url('icons/large_clipart.png') no-repeat center center; -} -.icon-large-shapes{ - background:url('icons/large_shapes.png') no-repeat center center; -} -.icon-large-smartart{ - background:url('icons/large_smartart.png') no-repeat center center; -} -.icon-large-chart{ - background:url('icons/large_chart.png') no-repeat center center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/back.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/back.png deleted file mode 100755 index 3fe8b178ec9eb9fdbfefe0f2c81c8d4acf0dc275..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 912 zcmV;B18@9^P)DPbufGfoO#dy!l?7(~R{rJuB|Ic3( zr2qlMf}#2UUndb!-U*#ucDjkNIt+}=Obow%{r$o4^UqfXE*6k;foc%S0Rjlgfd4?5 zf5px&s!cN{J9F|ViZCp>{+}U8Tk|V?U_iPMphZz_IS$;9h@%hJaXH%3`;KjXZQ*9FFVV3hN%aCGjMUR1HHn+ z@a^MI26o0j4AJ(Y49b$+;J^R~Ag}?Z#!~g|?RE?+ZZR?}IQyT0vRH6Gfp6#Aq|XXnD!yol{GeUeEH15z{&iNK}>*+ff=Ho0U&_D2K@WS)Y#U3 zL<*QjlG@v>7^K*LF;uO1$H33~kD)O@mf_`_pA4@*{$OBc;sM6se}=oyzcD<1{hb-4 z7a)M3fynfS;s3w1j*cU*?%aD#}SqhQ+&{GkpB3~WDG86SXj0t66JI$#2Z>i^0$tFE0td*)?Zf4{AAccL7__n-e5zW@IF`Rlho zISk)^-(&#U%K~&i4@4_K0AWeW%&YF-``{WFx_xe1-VuhUFTXRebF#1lJi_@W|M}sAhw_srY>W~TKsPfouoxLJNIief_Uq!sAfaEsA{^Y@xOjmE zgETUH_`vZ0)G3BDOP2h+bm&kaKmak@u(Mx&^y$-mrq{2%AP9OrSt~`cWMBe}Df@WdXVtAb^-{fqrKM zhBm{WKbK$p{CV}~>(@b&Z{ISrfec|{VqpC9hvEOnj||^|n$Pav|M&czJ4yfk{hPxK ziXor@00G3p|Me>aP=MhdQ1O2@wh#Zfxc+?xI`hkm7YtzU0Ks3N8c+cLWnuXTwCn>L zPz;1Y=>#Bvm|a;}8UBK7;o$HwmX%#&_3Ev z8Du=HOuX z4|L&Apeyv`#@8bfBxE!U^>5?3)J&j7~IN0z^T7prh^aQ_9m=nqi-_p@gVCMG7_z;K%h5I{^nzkYr61?WsB zppBr|;1UpEcqk91j^EtPTT1|U8QuVY?eYHqKSSK zP3o7x#7F%IgmygBVw*mDl7H^Z{OA78x#wJf^N>g+(A}*)`QG z5RTB`_EMce+Rq7v1K^?@u()CXf6xoz7!8!yDW$`H4viiQVXJBa++G(roc6hNHhJa` zc)tgNK1C=T#LYg4#zR25R*jil>eLtT{GdaAuGwmA2T&d-c>V5!!d9NyEp9Qmxe|`j ziex$g4vI7tOS{$FMw-cFlc$u|)oH@xv;lB4TdF3p9zS6L`{g|*5)D-xF1xRMSgLOC z7MSARP8Hv+kyxnx2--m{*z6VvMS>8Zy#!`G*)JEFkDm^i! z57&EQSe~y>rx{P4Jq8WqI_>n@dK|C^u()ifPp27dDGN*U z^*)3m0U({Lwv9rzno6%R=}dwtY~>hiY=vzs3$T+mn9{vzjZvdfBXyxZ39Q1lxt*_O za!Cf)+FBy^2Uli$r+^So1&^UvC9Uv!asn@3M*|?0O5yp7r!a4LH=D=I>FhdY&DZp^ zI_lx02LqV>=f-B1VTE_&n|?;e8M}28xLj@nAnp)D|3JTRN;i4Tjw+i=)$ZND8$(OU zO0JNPx!jIl*?fw5pNO9Is(T6ipVtD2MW9ltL~^<8_V~oBFC(MFPBbrJi4vhmDCP_J z3YkoHXME!2*U=lJE*_6}vFCCRm&4&S04zz3eYkpUkW2Ite1g#M`uYfvc1r7BSCpMy$Yx?I diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/cut.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/cut.png deleted file mode 100755 index 21fdb4dc3c8ee79a0ce59a981c336538bb334442..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmV+b1poVqP)KUssI7R0t_;S-$0W-{rMx#%*eo)+e?%RfoV-A` z?ccwj;n}liPhDMIlit34>!qu!Yo(>7CAn+YuBQM2#PSp96fq8t;>8MTUb14+5!+ zh1}fS`vC%oB~w|slAW3PZ_cGlj@4{z(`tBmEnEc!mA;smFnr?YXSj9d48xmOul_%M z{`}=lpp}mwKc2(K$G039!2g(mVFeICEJ7?SLUQ8b%?bbpD{3O`OVC%+UevppX=w(zf+GMz2w2fBr5aagUt~(wq2b6{=H%aCSg#% z;Q+?Mw_m@&E&&K2CXiWwfX;daOnK_U!VcEb(%ehWpTE%h^=r=l|Nr0dGcxisGXPUK z$TlG61Zw>H_%XwOp!#1x0|5dEoRGc&4FEao?Uyf)o&i%`p`f6d>(i&31V4QeYY`CW z`^e6IpfT9{;&=|5oFFCgx5C zCdU5^zkvGwFf#xI5F^9@Mj&PZ>i;XIDz1EIW7#HNO(``7Wbpj`D~6DkIEG`Fj~g>E zv7BT0%MMh}%m5HTKwUu1|AE&0`w6t2L0CglgBzr|=0G*WndfI1m|2+_WcXznrnpXK zFxRwXICk!k9K(Oca|}%X!CCZghWKjC@{mZ}K|9&$aet3l8(A`4} z3_y#NM3or6{{6!6{l|9(hVS2X7}(iA0KNK@fra@tKmf4-8BwZIYO@XHj5z=N`2F8h z!HkKOiG_iOjfa7mgPDPijg5hqofqgzMg|KtBZgP5QB79zkL@az9?F#YcPyZ^3>T>rDQvi#@l=KQZeU;qEDcej8t|Nj34Vi0)x=H-9m zRJUIM0mPyts?4V;rOD8+yMbZvjlB#koIpo0{bjiO@h$^58#ge#m>6Dvd(DusJA;9f zos;1k5E_WURn1feKaiAuu1|BaZK*xijMU?6_J&-MoG9!s-C zzdQA+U}|%2STXXENpkw6Jq=WB#30h**Zqx80G7xg2LKoZVN&=1FEccT3xQkve43;n zjZvX^?*P{BPNoA(9dqA2RbK$HFf%bTgA}R?sWRwG>M<~LvjC&_AH(x+&l!FKqZXu* zgNcJdK|q0lm5r6*+rMuN%KXYeyO>(c-8{PO?x|MdU-|N8&%^z#2WXiNJ7h~@6v zdzJqE0h7#>E!qD3`omx(tIv?@mCeAx!U6Ut*b6}K$qC3ZY&&|8VcW@F4D1|S3|H@7 z|9AS=o?ccaRt6&pBZl99|1dDI zGBU^m{m;e1#lXV}Oi-MhCxK>dW&i~p&}9Gt!~zOUV9)~%0Wtr6y!+zLuZM3QbN0IR zG5i5SP>3@F;m5C^8P4814U9_G7Yt0G+{*~gyZ`~j$dJs4lARg<{>{>s*6r4l)n@}` z=l}m08CV!u816i~$8h@Qg}#6P7^{HU`5(hCMsRip2rvLwO?vxoke4F>0000k-9#K@4yU?IRNuvAG{MT+4+!{7h^fL{8`$iM*d**|6= z4P^fVVJ0wUWME=o`p?At@cFZEuRncB1qdJpzI47ba}Uk?|Kr!s|G$3!`TyhRum9hF zK=JqAK>Q1Wzk%@Y|3AL{`Tz6B-~ZcB?f)+or2iBkfLOGob+i+#;~6f!yu|SE{X+(J z7B&V3CZLTV1o9vwBM<>GNC3$H3xvX)LJS_J4h&{mrV;=F#KOtK@sEj#iJ^O6H^aK~ z>lj$LSr{0AW-tI<&&a~az|73dz{Cu6HVXuQ`~Qu>M#h?9tM@hrPBzZJ00F2XV-x^j z7z9cv`TuhRA=;X)qu}73hnoGd)hHEGiI`W8Wd+4gnzL6}5;?d6hzTh;Al{IJA|HldbA>qGJ3W z(Akj0gy6FuMFMs&||L0%d|AW9UApQ!(pZ@&+|Lq@y|Mx!xy!-m`f6?aW|CJIi zgSZR;0Vo`U6o5e(2o6=NC;k67TPnoF(0CnomdWR}+}Y*TYj=gwum!e34a6bEszh3= z!9Qg_5-j;~e*pwG;QznB|Ns7DWME)o1UvLUBgD}l>Nil}H_*V}Ob~(JKmlGpK?W`k zuzm)B0AgW)14af$paG0PMQqGK9!Q=Us_72{I7~pU0)`4Wj6lu@0e}Dk8vxV?mSALJ zf(SB0Y-eDC7z8r(H&F8*sH6WgGBGeRL#zb|Ah-*dfU4M-L8kr%^O=DPIDxwV0X6*r zc?B39|Nnu!_Y-I?Cj%2yA3y*>0ujjj`kRsA*aK#UKmY##Z39LlQ0L#je}VLWhQA;$ z03i$WUxq(F{xf{~!^yw`jbDHO0vo{2@}J?wcLs(tS6LbUeES7<^Pj&!!+?SC_b(&` z`~X_;?h`WuhX6AJJ3lZ+SRe)f1Q6H&W}qLx0b`K!=QoB7%dZUL;!F%*zcDiW`~?XM z77j*++Yf#-Kmb7k5$NBaKxeYD{AG|5`NuGK?Oz55Qziy; zeKv;gK$mfHGBNIfE{W8Kmb9!05tU%&_vdFGjGd1eqWv00a=k1&oZ$Yy|!NK66*5ZHhV+bRpY|MBzx zeXpJ~@NlyNT?C9qXd+?)M%h=O&F_E~aC~8Ako(8TcyI5es|*dw3;+Sd2uqUW0)PMm Y07EoBQ)jr0B>(^b07*qoM6N<$g57L=!vFvP diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/filter.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/filter.png deleted file mode 100755 index 1fedf7ae66f9512c8991a91f606e33926210dfd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmV-10nYx3P)i;JxOiC&m|MyN^@V~Zu%6~m0)Bj`zY(-tqe_OBM|76EZZDa3$M~@)# z4XCPX|L^4POMwARE&rW8d?@fjbNzpNXSe?h!y5nqPb`Zh>Gjmx00000NkvXXu0mjf D9Yd^C diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/help.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/help.png deleted file mode 100755 index 28a0f9e5e6a24fe2cc3d842d0708e70512dbf84b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1187 zcmXX`YfMuI6h6Hzx2+Ut1EjYq1A-3cSfq4{Is$g`oXj!QjiG^7TiBdhXGlOZxm1@9 zS*DOla3bRT0cHN_rJ;^5DgN)q2ZN z|EAt&1z&5w`m%mvX&4t+@c4Ki)zj^n9Qtq}u-Kkgm|S+sG2Fc6RK?X36?YJhP0dA}?VOU?JP&>G6klO2uGz08Gy=gKR?}h(b{K&aenodIzi% z2f@MJp01+RY|(6BJziiDpcm1+C)f4BSg6zCdpJmKRiimi){G4(q} z1^PxxRYp%IvSXi?q6Z{WU1=c||G9fvjNOV8M5eGC9+9=$-Km*DQ5AV*WII_(dnpARZKp%77uh;KZ$z~72R!)*N`!~x=0M8DAMel@xO((;7NkGYln^j z>m@53+D`)q@q?T2z|AfKr0Wq7@&V%3vEWE%IJj2*@I~|AQ1|l-SXw1vg>V7oa|8I- z0PP3HCDVWP3>La6dZtL>>2W$NTXeTeE3}I*#OEs`#HLvXE;&}!k}!JOU8}8G*^*;= zPjSv0_%M5yo+6j0Lw14m9`2dn-mf1NjIPg)Vw7)%a0o9zj^>|q#+Vv13MJSTT;}7h z4Zfq*P7G=k-K=j!InVUNj9wh!)4I~ern6^GUXtfu4!SZ`QB}@5t|WV`n%8=*ErSn) zGjYM$*~Vxc9q@=I`#Q~!`<=w&Se+$ud=Pk1O*Brwau1*M?WFKRth>8iTZJdIQgn~v zCzI($b7!BT>3&ZqyhH4&mz1-ow|8KFVjY;l(ti5lghhYge-hacl;-uimIqemZ0Qjj zBEs2%Kv-FHfq7&Jo><&)%Bjgdi{^SdvbB+` z{s9&)87BY$ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_chart.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_chart.png deleted file mode 100644 index 527608ee94683724de57fac1ed7593714ac41be4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1669 zcmV;027394P)OoL=dNpfT{jDe$P=9Ivhqz^iKm@S3IrUXvM(0iptmQ@N;^Xr`2l z>4!e;MtyMJ3@@+P z*cta0P;qWNgQ5t%kIIj;1wLh)>WhuhRMihnmHnENfO~VPJZBe!rXUHBxK2!dnjp`y z(`>y!X!;Ed4J}m4t$ZUqDz_on(tKFP<=Z=Rs60EC!Cg-WdZizNtwDlZX0M^Vz;da) zRk?SP0@rg5(0I-o4d?oDoM&fiyuRg4U;@stq2@8HW2l!$}hO{43f| zkRR=*CN3~#OC`C|Iv#~EN98>g3S3CjgZzXU!JJQyrc1M^d~XB;xx@+$vxiXb(Hu;2 zFkVG15abzF9mEABn@ce}UQW15nZ?ctSFs`YA(b2XNb$S02Wm1+P?Kd!R)b`wDdkb6 zCzU6LGN^U6z@3>6xI=D6HtT0{`DdiBAW!S7q=4(sCGh;Unj`KKp_&pQYoKyNuN0h3 z>4uAkjZtyfh~o%1H-B;Tyx`6PO>T7N03V` zRm26HLyu!xbTQ#9Pcfzv)@CTEytl`8oQ&&CR-qS4QuImc^K&oUE}l;1F@X$9N9*IV zt0kqDPnO3&c?t4VOC>Ad6r2G`;c zZL$jAAUCcD$!6rIrcrt1d7v}p0A*tdPKG=NXjthX$oHBn*@BUalQ2H`5S$6` z=j!BAD(~+66VldeLAJFU$F}YQwYk%%Jlu!D>47@<&9NuWwLl;BLGFS)*|eRw!0-ie za0*Js*mo@Da%Dm>mFtdK4rzo2jz;S?v#Be|uBeu|QF-WW1}FM!qG)(`6n)FmjZ1QT zD{!hH-)-`>xWHha&2U__1EVQB;porJD|X~jx$a1R>xdQ@kmMRh^?hR)nfvf`+O z%7Z-_$ZXV*Kcq8G59xyZ!8~ME1WXp>iN;C_IDEeWBj(2tw(!JIf?{P<-f74@B!zT< zbe#^N6Q4RbKqyO}MCB`HFgRwVijxkV$WJf1UsxQp=`3I5BFGbr+K3C-O%KIT?T?T-@#dA#9Q z;sUmAt1xJ0IEN>jVHikqadaA$YuV30+)`ES3DG2Ik=5Xmr9?W3%2^JXwn3&%2M%i% zH8QK=vahos-)X311*~0{V8FCs!YV!q?!oZixSz_^ZQSt75)~w@)IcI3VHJxeJuXgl z5elRlllOu?D&(=NLi0!;Rg$Wxo;OaAr}+IKF3`u>4|bBJu$#P;roAMHWDxu!_E7ma z?={#K&<>Oq`+Z|wn+bg3ZL(&JZbVMWEEBYkyTWk)Z(So z!f8HiUHo|hg!B!M$GACb=$E$mwIkcmQAGak2~^IWlW0V?!K{sl3*KXpx^l@oc}8YI z#pD*RYzcN>l)?XzF!)U82=c!Hwib{lHNGh0 P00000NkvXXu0mjf#2YXZ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_clipart.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_clipart.png deleted file mode 100644 index 9c9c44002b6f76fcddea75aad020f5f58e91d10f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1727 zcmV;w20;0VP)x*u^o!J%G8Go5#Sw4Cl=Gy7nFjGX+6p^{qM5 z(mrROv)2Cizt&#=dFY|fu88YsK_y|UCd*MlMq#B`Ia$u|+!1FrnT0iE+ROFxIagbZ z*u&b#QAI{Ujm(#m>8uF*IBWF1ilh9FIxj@|tpboCFB!ZBvjgBC6C1_SV?ero`zVd409F^ZnVytEzj z+IIM8J67)xU|=f@Jq7(+nHr4d z0U&f+D!PDBi@zS9KwR8w?BBni`1p8IQ&aKJ&TEz;{no63;7Qqi@sn8RHxaD=A$0u$ zx_>0Qm$~8Z5R`FZD2KgiCqD_K@~Rk6R3AE&#=d>~Nli(^mYhgcRTcU9c}(4##uOGJ z{no4j|JzS6SFnZ2(_3iT`#2pLKOxYv4WnZ#!T!z6k3PZp$XmQ}a3xSyVU=b;Hpr{5 zyv$3xcH?$mr=__Sm#dM4ghVDMd<2cfD8E$z6qSMe&G;RgxoiJ6P4Sy>$34zq;ZK=u zeHQ=7_nDgf6(d8Hyqxm(3IkGvAr^JvH8ft~#a(--tGmei^|cf@3VFkph|lN4FpMa_ zHBwN`Oxm}Y%l#(Csc%5_*P-zdEcYhNq2~w=KZkELmb*Rg@~5QZQ7KS4P%JE(2JNja z#O>a}fxR!1{fDP1%R7wk{v->A73H@k0Pk-erEA9{4DI;+?@~A?bnf;fzNL4t^Nn0~#vfY&ASrkdzf}NKdsJ;weekJlsii)s z-&z13RxcE~Ph-oX@}Pcev|^=bqJ%=J8dYb^5(QL^M$vraRJop0->Gpqkosm>^^~3{ zZBRWW+ff~kuiWVroYEkX6=#icGj;%1T3}S9!12t5+O=>M!0#K?! zD6@G=H6ybV?=Uyv&;b5h4bMpm%EkWKDBb%Oc<-2ahhWTS=!It%1WaH9HOwif2rt@F zrm61iI;C^2c7EgExsu3gsfk*q#@>8L>*7}-+H@GPvZhS1(%f@PWMW~-1b70MvV)`!#h+IbRoX|`pxyy9^705_c zQ_LN!GRdh7ka>QAjC1pxcZ0i6F%aT27~oqPO8>F_$_6ol(Q+4B2H zRa1@Y&3FAAE}fyUF`R!-4_xaB;qHd!?(lPq*t%+{s8pvwQLPr48_(4D`e-iA+ggNy z>;H;UHN`+qr9pK&T=9x^T71|6m(|#XwoBfS9@kYv)jl6Y)l|#PXAXGiP${ng8#1mU}|Zo%=uhJ*(?ORjUPT&oV7T@4iq1#kIXS z>pwEh!}dHSP*~HAq;&3nO#JJFPUWA*kVU3>ISzyYsesrOhcfc zvI7a}3{qggjZq)|mazaZE|~}dlRLnSPelvA4FU`uTiT#!;BH$smhNLmGU3GsO(z7pa&TA zLbbzQT|(cA3CSb{WF_A3Brq=kjWbv9s2_g zHe9csPs=!tXKj}-$Rg7a$b3?#7H)Gd22$I06FGEDdVeIrD&H7H_40VmpCR8OQOg?F_{fi%dh{ zR$i6bJ!j|y#f|UKyatsPN$Ywl?VBl)PJL?zct9m@yh#BhFupA?UtGzsDY zTIBPPetZ7*Af>@JgVkW15N}yLAbfHPa{?SVrqcYDGGA z5p_@nGN22w?bo-fM?X)mC9F*bS!5al=~*W1Nv9)ljQrYhR4>Cw$z%lg%ZK6Ljbc3% zMenE+&j(h}>`b8f)H!+0Ga|`tU%^jVX51*Xqh{emiMC0aWgA(W46?{H1TNouh7eyK z|1lm_TTvw!+Y3q2_yPVfS+V9jL?o7kSMK@nNfLKzW>GSM3~ z4LUL7ioxoPA^n*RCH51wg$)wcCW9<84S}@GB6WSt`;L(N!h%YH=UYO!S7w1L7)3;& z>%kZ*`h6(v+Lrg(t0YXeeblYUHmxLZC4Ug6&Mj<36PQ}lVCo5@VLXaUMOKu~#!xG= ztW5@4WEuh&Za;)54$}IzO)@hAe=xrn#BH50__uFnB+1jmh~)>Xi%dh{hieZZmlf=ukGNmb{aHf> zS!5al-=#l*Tv+%ZugF=1EHVv&Z?9yjZ}4^bE;x&jMW!L}_2v6;^FJc_XW=YD7MX^? zS7~?Q(tj76MaUx45IBD^Q+1wY$TS4LypVzaB8C8erSgX&JI*x1{1Z}+=L?a2m%RW0 N002ovPDHLkV1luY1RVeX diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_shapes.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_shapes.png deleted file mode 100644 index 90a0dcacd8d8b851262102fbbd9f99e23404da11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1318 zcmV+>1=;$EP)9s!&kf1?`{(nr_nL4ijp z@Q59_AEy-e%+o#ZJ=sso=F5O#0npiiBF!K&3p5uYxXhffFJlfWXEo!=YI0RFHj|7W z&H(1NBtX7zVpRehUIYfo{O?&edZ&-@i=qNGe+_v<@V;`X*;FshvcF;T88V-8p>5(AZNn>gl#-9;-jVL6Zqt{a0Jynq z=d$e|UqepKAj-6p7_e+%Y4Zq2$EP^I+-^6v4_uhEA3$qbL2-*2*?;t+e{vhTc{lps zyU|0LcUUCzma!wWo44>?RMtg+^*yP4@*ZZC^RgtE6sv5dFQ1Brbbj=2NJS70%oFl<4p8eh$siTIRu^T?<{w4o zO=R3)cB1v26SpHX{{@gzDCU}*i#0~06P{d1)GpdTw`eE^IVH2hW2ryhkXf6>4UOp# zRk|J0HfjvJl%W&1!qN%;80}=O&W=zzH!cA1_^~mI4a1TO(K6ve z?<_6=*!%$084n2hL;y(UQs(uhebgHEQKjF7vU&gsFDiWikiolUNjzeqNd@?G()}L* zxB$S=w?dza%-LLHI-ttz3G;^GJw&FyhN`l|8z3UNK#ZSRo^4V{Vt@eSC-^$#iIh2& zy_QVXdIx>(Kz4Z_VxN`K88EW#bq<6luOHzqnF*auL*&S>Jxa^#HoxuSGW$xFUS7_o(5!A3KNgoUV^#B8C2JFaD4^28?_+<%y_grD6z~>!07Bw^NBr{&sH!?HH|NF8(A;BIaA(R2wgPNQaZIAy zso^etBH|Aig2zHuumB$OaE=wwGvPG=oXvS4>p?=k_etpRK8oMk&H$u2_nv~F0q)1= z`33l#F$@~uhhJ49*yRA;Q^42P2Jmx6849&?=&_ywoSa@>fm-^tE9siYou3rJ190ai zDb^faoa~#vtuJo{>G47$b(*}il2nl)ZxD%s9IQ=WSaMlM1aFb`3 z193JPDm9|h@^P24;|Gp!!_sg!T7jrk71ETISDX8*K*;AqW8dg)8OE1{Dc=+5++PL8 cmjX5Y2jT&te&o4V^Z)<=07*qoM6N<$f=jV;pa1{> diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_smartart.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/large_smartart.png deleted file mode 100644 index b47da08fa7ff9b56f6abb2517cb6c2177029faf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1336 zcmV-81;_e{P)pBh)O^%3AYgtAK>fS=bS`B3ob2ygd+n1+_U!rp`nRtOoyGX4 z=(KTP5eZuwP_)XRw^g9SUyshotLT2$geTLtU<+8$8*JY(&u4BU|8g?AY}~;uO)!@y z>wkj2Plaovm1yv2ah0#c4PJ+vZatdah8=NjxDqu^B~rEDZ*79zU=O5Q_QT*TLmht} zwVWEYLlv+Ll%uADk^-pOgQdid1!+XCm|3L0E>AWS|%q`)HvTg}BgDAjS}svlza|@=dV0YH3{6 zlZT?;5|LSXFg_DGEyrMdDaVDrLR8!HQDr-gs^@uODs6dD`NlaRe|~z?Tn_SS-8^HO zU}CG+Gl3mS)#Gevp5;KhOEeN}tbCY(<8&VG+4;sTzoc?ne#H5wCtc4@QF? z8cVQTnB(CM;}OWMQX}i!QL5g(8gmDdE#IO1!7org&JZwKo8epZkf0|V$L4v74MG7o zJcM^+9+U|181awbSYB>Oyz{eXAknlJC0$8SK1!oriRi62Nth>L9^(s4)GaU?ieYgV zJaaBVj2Fgk@RYj=*9-@zyBDWaMz-}_mz__EdJB@w-=eVNXR1C0G$ibX+|Vviq-%pr(~4|WBhpIhalD`wM{`U#l%)eVbHj>odMUZ zi>l_pO^={|bO3{14*t0nOwO%F8_?aWhOCXmyOUAvI0e&iVHD<$R!ppni;K(T>4rEm0?aX^j%&w4$RTOCJA`P6-9ma{O zACRd&6cbHd132F>F(fcNK7^q$k-^bdR3Sz0t1tr|#vu9$-@C17zr@~VMVO#}j;dx*^?pe_mVpFjf=$HYdWRi><#o(0 zeIOGbkS;e7227I?h2al@VqH55G;KIp(Ta?c8%Qp!$FbZ?IGk-HQ)>bff`R(azXe-e z*V}s$T>gl_(nm6}PA1l+U0B1rAR!4%(oQg@NXRcSF}o`CpNa3nfIYT>`7av?@4)O1 z4P0$!E%+$5V3EWb)Qai(55f*ig$Nm$TNA~Jx2$>+enXM5GXr;DKyA4#e3((VOSWww uo;PJ%&{}NG?HKsto3b6^`p5L2x&8(W8B7jWgRVFL0000P$7bO0Bg$#2^g^4GL=P|t$hNq6Wo3a*(T;p z0vQVx+}+~^FZg$7F5mpj8TfC>dxjeSoPQ1VOMaA_u^ZnVr5#t%}HrnH>ScvMk452cyww4>){z4m<+~ zz$VYjod;A^<#YL=rT|^%{p!C3c<0*i002ov JPDHLkV1n}aiueEk diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/man.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/man.png deleted file mode 100644 index a8cafcb9a1bc9fafbc429093084aa2e5b37103b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmVC_BI~?$baTUM>r&7#gjkN^eHIi#o0SqI#KDxPp zw@9vyR-*q#A1*f^_CI2jYYrM;0TvR|rdBA|{&P?5Vul}=KM*D;@QW`DQsz%=+`fM~ u3QS{w?+kN@RWQ}B0CTJ}SKVj!J=PhX&@(3LQ}*Qm0000>$j+3?x7IEPn{3BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%xd!-zxLTAQhakJ^Q+73{+?&sPG@tVTk}cBH8-FbMA2gTIwZ$R1rnqZ!{LQN5dZW*_A98)a hcb&}1B^+S+>+nau>-9y|=gz9{lr;}c=wVN)Q*o7; z#1rt#{)*L{NuLvUInMbWz@F$~q+t2X*32`7HA0n}1B^+RR-Z*1Eqt_euNB=!4?3hCYmYkCBcssH5 zPdnEk2K$~yJ;tQ}=`B*K3`ckaI0gPP&VH(3X7A9z$Z+9+&@?^iN_(Jb44$rjF6*2U FngA=BGHCz+ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/more.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/more.png deleted file mode 100755 index 94922a2c86cb6b1cd2a7085e055073226ad591ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar-fh6Atj!H2mNcuy5Mr z$>!hq!(QaR^6>_B54Jn1#~Jije3o~(=`7H5>`;cz1${9F%W##sAI~(r1scHM>FVdQ I&MBb@08~pNrT_o{ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/no.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/no.png deleted file mode 100755 index 37a7c7497782dadcf14a765051a62dd5616200c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922 zcmV;L17-Y)P)~H)FpGiVA+maa075~P;^Ost z%FF+My>{*Y{|_Jj|9|)H|Nl2{{{Mgd`v2FHC;#tBN%>zXAW)C22Oxl$VT=}a_4z4N zrW6=>dNQ#7{ma1c;R6H1`}YhCZ{IR7ym`aG`ujJ7l8z38nu>}8%kkq1$A10V2+{`- zKwtwZB_!%oy1NTx6%`p6K7NE?kmh&qz?vCezh+=~@q&Tj`Ev$7py4W#k_H^-&M_Qi zU^oa6K+Hft^Ls=_t}xct=3w~ph2g@XLkuqj1Q@RF*ukL03^f1MD~7#5#lI~rfyxgu zaNW7Xz<&Nb!`D}@41jje0SF)#Adz5aXehvN>=*+B8yf?swKapfn;XM72M30|Sy>DW zKpQP*⪼M8hY&JO$LjiB8ETz{xN7UFbD`TFvI`^5R0b1z5^G~7O=A!85y{?ZDaUm zW(L+^Ic*v^d_e5S7cMYxwYD<+1#12S6ypJ6X$A&ofB<6R;@}Wqc=-|@XtF@Rz6ILy z4af&+glT^3?aiPM6a#4n;om^~pMgONAb^+{fF?40{tPhyif@4oL;}JJ3Jh;0B^mw# zW8x=}{|jLN13&;Vy?*uT0mILqkWdF|-uwSQgXPktaGPN+vD~wV;i$eo!w;Y)5C$0p zwDt}_05Ls!`0&8vU%%kCa{`?TcealY!&?szxFJjd0dNCeK=2WO00KL4xwZBE|LW@h z|4T~#eCJ-NHV0gBdfguHGz&s%LFGwFi05M|8lxzVE3}(QD5+KCD wpazO6V0O9-%njRjGcW*?E5jFL#Q*^Y0M({d4SP?a6aWAK07*qoM6N<$f&>VU5C8xG diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/ok.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/ok.png deleted file mode 100755 index 5b0f6a6174f67879d89b8c970d88734cd6f9f844..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 883 zcmV-(1C0EMP)wF51aIxG|t0o~WeTux?(*f!J?S`!vJrWM3^ z)v?u>(g^>@;xO#mkNlu=e*%b!BkO=S9U%&s|{QUTj4;ur+Qxv`b{1=&{q{_{@=tdkKKPJjPv{N-R+ z=H{q0b!wOgrI|?`QkZ(!{_7i9LV-VtRJx`%DQ2F^23wD{DqBhIRk` zF);r5{m+$GoMl&Put7+Jt2=`@4-Z4{!AlI=w!d7({+qd+0V(7F0suh(zW)OTFd63V z^!sFSNlF9<4gMd;*WzU&Dh*+FS2`3*A~OK^{__Bz$W0R(*Uum z?9l=80a*nF0_+3*1ONs71^@>82>=H93IGBCK>)u00}wAF|NZm@`|<(rTQ4UU0WcOM z00aL60Pp?k0KeVV0IsF+;Q#FbO$G-6;062!00#UB00{XE00{OE015OE00M|vNJE=} z^$*A6FQ5Ne@vDAS;$dfD`1Jo3!|5mY7`86`{^s{nmH;M>-&g)K|ATm%5g73x%=8b8 z0Ro7L;}<&v=RdZejL-PCo<9Aa;W^_ShKsN6GwfXY>&vg(Trted45#rWFn|DJV*bm{ z0Ky#q*cZJ%!~O8Y?dJ?fS26$kepw(JsCg%$6bcYP%o1uwz$j&AU}9wa&h(8#?9FW+ ziyzl{>lm2-O#9FFhv6UdZ-)OYzzhWT0wab200G2EX?6w(FaS`kAv2YZ@FM^K002ov JPDHLkV1n^7jC=q9 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/pencil.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/pencil.png deleted file mode 100755 index 5b8cc893d0e50c0e15cf10fbbb08706f81ec224a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 713 zcmV;)0yh1LP)R)!_m*FeI9eJ0Gxq#H zf0_XxfS9lv%LmkKB8}kx16siJFV!*nd7pOS69ERhSDg(18DcA(#PsQ(DfoWDDC{a=@>nto>xWzb;o zP$*;Aa%nq5TlT(fKhM4o2P*mk(g_ei5CcqsHvff2=RY9k`aMC~Kn&o76a{330bLQrJ&U26`M=Sy3)uqGxWf%F0d5QMO1 v>|l^)2n34pz-1YUGXNlf7%9!p009O71V-RMzjpE=00000NkvXXu0mjfxvf2L diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/print.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/print.png deleted file mode 100755 index fdf67a1e2771c1481d4fdf3c3bb219904cdde434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1057 zcmV++1m63JP)z1G?hxZ;&`ED+>cNGYingzZn1m zi0SLs4-79~-etIOVGqOe=l2>Z%BAk7f^KhW_13_pMU`pwSH#-O94%^)f& z3N-K^13&;VLHzfh;p^8g3^#9{H2wblqZrJ9KS1%{Kv(?!`4i~P{|ua*91=XdJgT6; z`St4;*p&bQ!~(?P!otFnEG?~V1q1{|M1_S}KY#tr@b%YUh9AFvGyDPKzd*%*zcVld z`Ugr`TiaZI_Ty@A>nW=<)yo#7xKlEh(vj1xwlt7#MgWzP$bT0%*uZWO;x9 z!fSwov9Uh~14Beagrk7ItviRhqIkg9=T8*)ge4C=e*XL?NDV*$F=Er`Vr(4mXr?g1 z)x}1@)Y^!FfsqM{nHgR`f5y<=G55mJn=cZMojrRIAb>Coh_o}9pPyizU~Z|yz`(=; z#6U+fLTM=f>$l$wi{@|tuwv(>V1NKZ@j|4%et%nvY=(}S5Cg-n4-5>yKLTkW{__dQ z{tTo)gT>g`J~N1_^Ko3f_)G{OfLLIf9gU6cqmAAaD6jz)zkJHTz{3~O8o!7fdBvhJL&&7 zEzS8KWN)@fPg66=+sNqB{}Vy~Up;L5Ul8klLse1H6FK$(0tk$}jE(!hOym0h|8~m% zDNRwIbd{B3fWmAbIX`3L{U`QU{to~eC?zhgj2`F!0R%=(K`Q6}?=tznbY|Lr4LLb~ zWE+4{s&A&Qo(5!cV$%x{Kwva8UiSa1o0b3Vw6&)alRA+BKmf4-{V&fa#mul`<-^an zUcH*g01htV0YCr&lNW=6vZVpTfxUMQymyyFg$$D!0_P3$1SAV4gvrH q1Tx^k^5vIKzWDHAF9R6>Aiw}@kj85RTB}e10000VP)p|3y6O+Fnsy(*G|dGwA8_{sE@0VD?kY)l*s511}8@N@DpuwT|nH_3V>hx1ODQ%gn&~@8_@IOt#8aVhL_V%$IK8 zWk{S+eg652N7)Q)9AE25ELv$HybnO!M{I#uKD}#=M;vYf7lrQFmo`l@cj9I@ZL*+0D=T!0-G4a z_us4x|CxR%P+4O z%=m19E(1m6KcMkUz;yA2;myD24DM`^3=_Jyz22~IyVL&*H?9B#5X1$4SsA{6|NY{@ z(^>zp*f|F>^Eg`1=E%Jp>r!82Fy*Fx0GG_T{`ts%Hw-;|-9sl#=*HT~_cnLQ6 zZwyY1jNAqP|1re_1K>S4TZ6MV5dUL@_zCI)fB*vkslXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32dEcNn4H`bJ0C+qr9t=q z3IB5(AiS{sSlm!hKmUK){R9C#j!Zc}`+sBs9tE)p5$}U$;ZzVK5OzQCHlA<@UGIO! zvj@U9`H!I>IKl6{$7vAD0_aTr_h<@&41C_Zzj3U$sW?P)s`^}rT?-9$gz_!>OcE=Nf062l+NnAOE%LIKMeUciG zG5@4$#o>#0(^REaszX( z@Br;Y1jl>uI&DD}m2Idxq%!Gwkr0;PT_BnCf*VQmb@KBW^WVSl?z4#ixOz4Ke!ssk zy+~qx3HN1Lmf_*JwldghDRx~#Huv5AzuyA9NNmE;P!yvrh(>!r*9CAQI{gJZ77+*H z@%Rxtk;~ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/undo.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/icons/undo.png deleted file mode 100755 index 6129fa0c77eb1d2100ed1c99b5643ab8990a9566..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 707 zcmV;!0zCbRP)gx00G1Zv_aomR`x(qRh0l2FE0bbpFa!?fB$08 zkFQ)|s9L!2z&&2xfMaLReuNnS5I{^UzkfRf$Hoe9fp{-pGBCV;4WVDWU|@Lm41ym& zW{~CPX6X0xb5MHuav8D<00M~l)~8P=@1HyOnT?gzU0Y6$f#K#&28Oq985rKZgBbSe z6~w?NPZ+p>wDzArsy8?}Ki_-*{y4}0fB<3!5w|~mI{y0k^X(5GJqk7R^5S3xY54Gg z;V@9{y|_37pRO(g>+jzT438c$h_JFUeEIar>Y2FstQW6ee+LL4W|&hReEj(I13UYi znbkhd^K)@A%v-naX4mP{i91)X{{CA+!pI;bgn{AeRR)QlKiRi``0yC0=M+Ey zVT~0JdHJSom6iV+{r%6t#LV>djcY9}FMXXe=l_3O+y7ZoQhPw+00D#(*(oWx*+@tv zp{LLZetz%&x3v79qNw;ED8va6Kn$b;P{O)4dGi0A+S>nhH8gAh0*IMZ1Ma+ke^KiH z{{%~Qb%Axyo~;K6ASMPf!11eBC%hFCV_^OEO$;D_$THxanAm~S7cMXefB&up5J1f2 p81VS{^OpjgoMw-I|K0`=U;x^&`B18C?@a&z002ovPDHLkV1f|(PF(;1 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/accordion.css deleted file mode 100644 index 5f104a441..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/accordion.css +++ /dev/null @@ -1,89 +0,0 @@ -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #dfdfdf; -} -.accordion .accordion-header { - background: #fafafa; - filter: none; -} -.accordion .accordion-header-selected { - background: #eee; -} -.accordion .accordion-header-selected .panel-title { - color: #39c; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #fafafa; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #dfdfdf; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #fafafa; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #dfdfdf; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #fafafa; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #dfdfdf; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/calendar.css deleted file mode 100644 index 194f6f65f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/calendar.css +++ /dev/null @@ -1,203 +0,0 @@ -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-body th, -.calendar-menu-month { - color: #8d8d8d; -} -.calendar-day { - color: #404040; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #dfdfdf; -} -.calendar { - border-color: #dfdfdf; -} -.calendar-header { - background: #fafafa; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #fafafa; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #eee; - color: #404040; -} -.calendar-hover { - border: 1px solid #ccc; - padding: 0; -} -.calendar-selected { - background-color: #eee; - color: #39c; - border: 1px solid #39c; - padding: 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/checkbox.css deleted file mode 100644 index 8cd106b60..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/checkbox.css +++ /dev/null @@ -1,31 +0,0 @@ -.checkbox { - position: relative; - border: 2px solid #39c; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.checkbox-checked { - border: 0; - background: #39c; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combo.css deleted file mode 100644 index cbe460bfa..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combo.css +++ /dev/null @@ -1,35 +0,0 @@ -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #ffffff; -} -.combo-arrow { - background-color: #fafafa; -} -.combo-arrow-hover { - background-color: #eee; -} -.combo-arrow:hover { - background-color: #eee; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combobox.css deleted file mode 100644 index bacfda06a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/combobox.css +++ /dev/null @@ -1,40 +0,0 @@ -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #eee; - color: #404040; -} -.combobox-item-selected { - background-color: #eee; - color: #39c; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datagrid.css deleted file mode 100644 index 5f73ebe79..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datagrid.css +++ /dev/null @@ -1,285 +0,0 @@ -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #dfdfdf; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #dfdfdf; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #fff; -} -.datagrid-cell-rownumber { - color: #404040; -} -.datagrid-resize-proxy { - background: #ccc; -} -.datagrid-mask { - background: #eee; -} -.datagrid-mask-msg { - border-color: #dfdfdf; -} -.datagrid-toolbar, -.datagrid-pager { - background: #fafafa; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #dfdfdf; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #dfdfdf; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #404040; - border-collapse: separate; -} -.datagrid-row-alt { - background: #fafafa; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #eee; - color: #404040; - cursor: default; -} -.datagrid-row-selected { - background: #eee; - color: #39c; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datalist.css deleted file mode 100644 index 308548293..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datalist.css +++ /dev/null @@ -1,95 +0,0 @@ -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #fff; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #dfdfdf; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #404040; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #dfdfdf; -} -.m-list li>a:hover { - background: #eee; - color: #404040; -} -.m-list .m-list-group { - padding: 0 4px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datebox.css deleted file mode 100644 index 392b779d3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/datebox.css +++ /dev/null @@ -1,36 +0,0 @@ -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #fafafa; -} -.datebox-button a { - color: #404040; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/dialog.css deleted file mode 100644 index c962c42a9..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/dialog.css +++ /dev/null @@ -1,47 +0,0 @@ -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #dfdfdf; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #fafafa; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; -} -.dialog-button { - border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #fafafa; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/easyui.css deleted file mode 100644 index 420e8f55e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/easyui.css +++ /dev/null @@ -1,3549 +0,0 @@ -.panel { - overflow: hidden; - text-align: left; - margin: 0; - border: 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.panel-header, -.panel-body { - border-width: 1px; - border-style: solid; -} -.panel-header { - padding: 5px; - position: relative; -} -.panel-title { - background: url('images/blank.gif') no-repeat; -} -.panel-header-noborder { - border-width: 0 0 1px 0; -} -.panel-body { - overflow: auto; - border-top-width: 0; - padding: 0; -} -.panel-body-noheader { - border-top-width: 1px; -} -.panel-body-noborder { - border-width: 0px; -} -.panel-body-nobottom { - border-bottom-width: 0; -} -.panel-with-icon { - padding-left: 18px; -} -.panel-icon, -.panel-tool { - position: absolute; - top: 50%; - margin-top: -8px; - height: 16px; - overflow: hidden; -} -.panel-icon { - left: 5px; - width: 16px; -} -.panel-tool { - right: 5px; - width: auto; -} -.panel-tool a { - display: inline-block; - width: 16px; - height: 16px; - opacity: 0.6; - filter: alpha(opacity=60); - margin: 0 0 0 2px; - vertical-align: top; -} -.panel-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - background-color: #eee; - -moz-border-radius: 2px 2px 2px 2px; - -webkit-border-radius: 2px 2px 2px 2px; - border-radius: 2px 2px 2px 2px; -} -.panel-loading { - padding: 11px 0px 10px 30px; -} -.panel-noscroll { - overflow: hidden; -} -.panel-fit, -.panel-fit body { - height: 100%; - margin: 0; - padding: 0; - border: 0; - overflow: hidden; -} -.panel-loading { - background: url('images/loading.gif') no-repeat 10px 10px; -} -.panel-tool-close { - background: url('images/panel_tools.png') no-repeat -16px 0px; -} -.panel-tool-min { - background: url('images/panel_tools.png') no-repeat 0px 0px; -} -.panel-tool-max { - background: url('images/panel_tools.png') no-repeat 0px -16px; -} -.panel-tool-restore { - background: url('images/panel_tools.png') no-repeat -16px -16px; -} -.panel-tool-collapse { - background: url('images/panel_tools.png') no-repeat -32px 0; -} -.panel-tool-expand { - background: url('images/panel_tools.png') no-repeat -32px -16px; -} -.panel-header, -.panel-body { - border-color: #dfdfdf; -} -.panel-header { - background-color: #fafafa; -} -.panel-body { - background-color: #ffffff; - color: #404040; - font-size: 14px; -} -.panel-title { - font-size: 14px; - font-weight: bold; - color: #404040; - height: 20px; - line-height: 20px; -} -.panel-footer { - border: 1px solid #dfdfdf; - overflow: hidden; - background: #fafafa; -} -.panel-footer-noborder { - border-width: 1px 0 0 0; -} -.panel-hleft, -.panel-hright { - position: relative; -} -.panel-hleft>.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #dfdfdf; -} -.accordion .accordion-header { - background: #fafafa; - filter: none; -} -.accordion .accordion-header-selected { - background: #eee; -} -.accordion .accordion-header-selected .panel-title { - color: #39c; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #fafafa; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #dfdfdf; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #fafafa; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #dfdfdf; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #fafafa; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #dfdfdf; -} -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.window-shadow { - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #dfdfdf; -} -.window { - background-color: #fafafa; -} -.window-proxy { - border: 1px dashed #dfdfdf; -} -.window-proxy-mask, -.window-mask { - background: #eee; -} -.window .panel-footer { - border: 1px solid #dfdfdf; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #dfdfdf; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #fafafa; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; -} -.dialog-button { - border-color: #dfdfdf #dfdfdf #dfdfdf #dfdfdf; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #fafafa; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.l-btn { - text-decoration: none; - display: inline-block; - overflow: hidden; - margin: 0; - padding: 0; - cursor: pointer; - outline: none; - text-align: center; - vertical-align: middle; - line-height: normal; -} -.l-btn-plain { - border-width: 0; - padding: 1px; -} -.l-btn-left { - display: inline-block; - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - vertical-align: top; -} -.l-btn-text { - display: inline-block; - vertical-align: top; - width: auto; - line-height: 28px; - font-size: 14px; - padding: 0; - margin: 0 6px; -} -.l-btn-icon { - display: inline-block; - width: 16px; - height: 16px; - line-height: 16px; - position: absolute; - top: 50%; - margin-top: -8px; - font-size: 1px; -} -.l-btn span span .l-btn-empty { - display: inline-block; - margin: 0; - width: 16px; - height: 24px; - font-size: 1px; - vertical-align: top; -} -.l-btn span .l-btn-icon-left { - padding: 0 0 0 20px; - background-position: left center; -} -.l-btn span .l-btn-icon-right { - padding: 0 20px 0 0; - background-position: right center; -} -.l-btn-icon-left .l-btn-text { - margin: 0 6px 0 26px; -} -.l-btn-icon-left .l-btn-icon { - left: 6px; -} -.l-btn-icon-right .l-btn-text { - margin: 0 26px 0 6px; -} -.l-btn-icon-right .l-btn-icon { - right: 6px; -} -.l-btn-icon-top .l-btn-text { - margin: 20px 4px 0 4px; -} -.l-btn-icon-top .l-btn-icon { - top: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-icon-bottom .l-btn-text { - margin: 0 4px 20px 4px; -} -.l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-left .l-btn-empty { - margin: 0 6px; - width: 16px; -} -.l-btn-plain:hover { - padding: 0; -} -.l-btn-focus { - outline: #0000FF dotted thin; -} -.l-btn-large .l-btn-text { - line-height: 44px; -} -.l-btn-large .l-btn-icon { - width: 32px; - height: 32px; - line-height: 32px; - margin-top: -16px; -} -.l-btn-large .l-btn-icon-left .l-btn-text { - margin-left: 40px; -} -.l-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.l-btn-large .l-btn-icon-top .l-btn-text { - margin-top: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-top .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-left .l-btn-empty { - margin: 0 6px; - width: 32px; -} -.l-btn { - color: #404040; - background: #fafafa; - background-repeat: repeat-x; - border: 1px solid #dfdfdf; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.l-btn:hover { - background: #eee; - color: #404040; - border: 1px solid #ccc; - filter: none; -} -.l-btn-plain { - background: transparent; - border-width: 0; - filter: none; -} -.l-btn-outline { - border-width: 1px; - border-color: #ccc; - padding: 0; -} -.l-btn-plain:hover { - background: #eee; - color: #404040; - border: 1px solid #ccc; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.l-btn-disabled, -.l-btn-disabled:hover { - opacity: 0.5; - cursor: default; - background: #fafafa; - color: #404040; -} -.l-btn-disabled .l-btn-text, -.l-btn-disabled .l-btn-icon { - filter: alpha(opacity=50); -} -.l-btn-plain-disabled, -.l-btn-plain-disabled:hover { - background: transparent; - filter: alpha(opacity=50); -} -.l-btn-selected, -.l-btn-selected:hover { - background: #39c; - filter: none; -} -.l-btn-plain-selected, -.l-btn-plain-selected:hover { - background: #39c; -} -.textbox { - position: relative; - border: 1px solid #dfdfdf; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #c6c6c6; - -moz-box-shadow: 0 0 3px 0 #dfdfdf; - -webkit-box-shadow: 0 0 3px 0 #dfdfdf; - box-shadow: 0 0 3px 0 #dfdfdf; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff; -} -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #ffffff; -} -.combo-arrow { - background-color: #fafafa; -} -.combo-arrow-hover { - background-color: #eee; -} -.combo-arrow:hover { - background-color: #eee; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #eee; - color: #404040; -} -.combobox-item-selected { - background-color: #eee; - color: #39c; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - background: #eee; - color: #404040; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} -.layout { - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - z-index: 0; -} -.layout-panel { - position: absolute; - overflow: hidden; -} -.layout-body { - min-width: 1px; - min-height: 1px; -} -.layout-panel-east, -.layout-panel-west { - z-index: 2; -} -.layout-panel-north, -.layout-panel-south { - z-index: 3; -} -.layout-expand { - position: absolute; - padding: 0px; - font-size: 1px; - cursor: pointer; - z-index: 1; -} -.layout-expand .panel-header, -.layout-expand .panel-body { - background: transparent; - filter: none; - overflow: hidden; -} -.layout-expand .panel-header { - border-bottom-width: 0px; -} -.layout-expand .panel-body { - position: relative; -} -.layout-expand .panel-body .panel-icon { - margin-top: 0; - top: 0; - left: 50%; - margin-left: -8px; -} -.layout-expand-west .panel-header .panel-icon, -.layout-expand-east .panel-header .panel-icon { - display: none; -} -.layout-expand-title { - position: absolute; - top: 0; - left: 21px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.layout-expand-title-up { - position: absolute; - top: 0; - left: 0; - text-align: right; - padding-left: 5px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 0; -} -.layout-expand-with-icon { - top: 18px; -} -.layout-expand .panel-body-noheader .layout-expand-title, -.layout-expand .panel-body-noheader .panel-icon { - top: 5px; -} -.layout-expand .panel-body-noheader .layout-expand-with-icon { - top: 23px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - position: absolute; - font-size: 1px; - display: none; - z-index: 5; -} -.layout-split-proxy-h { - width: 5px; - cursor: e-resize; -} -.layout-split-proxy-v { - height: 5px; - cursor: n-resize; -} -.layout-mask { - position: absolute; - background: #fafafa; - filter: alpha(opacity=10); - opacity: 0.10; - z-index: 4; -} -.layout-button-up { - background: url('images/layout_arrows.png') no-repeat -16px -16px; -} -.layout-button-down { - background: url('images/layout_arrows.png') no-repeat -16px 0; -} -.layout-button-left { - background: url('images/layout_arrows.png') no-repeat 0 0; -} -.layout-button-right { - background: url('images/layout_arrows.png') no-repeat 0 -16px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - background-color: #ccc; -} -.layout-split-north { - border-bottom: 5px solid #ffffff; -} -.layout-split-south { - border-top: 5px solid #ffffff; -} -.layout-split-east { - border-left: 5px solid #ffffff; -} -.layout-split-west { - border-right: 5px solid #ffffff; -} -.layout-expand { - background-color: #fafafa; -} -.layout-expand-over { - background-color: #fafafa; -} -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 4px 4px 0 0; - -webkit-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 4px 4px; - -webkit-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 4px 4px 0; - -webkit-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #fafafa url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #fafafa url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #eee; - color: #404040; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #404040; -} -.tabs li a.tabs-inner { - color: #404040; - background-color: #fafafa; -} -.tabs-header, -.tabs-tool { - background-color: #fafafa; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #dfdfdf; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #eee; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #eee; - color: #39c; - filter: none; - border-color: #dfdfdf; -} -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #dfdfdf; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #dfdfdf; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #fff; -} -.datagrid-cell-rownumber { - color: #404040; -} -.datagrid-resize-proxy { - background: #ccc; -} -.datagrid-mask { - background: #eee; -} -.datagrid-mask-msg { - border-color: #dfdfdf; -} -.datagrid-toolbar, -.datagrid-pager { - background: #fafafa; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #dfdfdf; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #dfdfdf; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #404040; - border-collapse: separate; -} -.datagrid-row-alt { - background: #fafafa; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #eee; - color: #404040; - cursor: default; -} -.datagrid-row-selected { - background: #eee; - color: #39c; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #dfdfdf; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #fafafa; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #dfdfdf; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #fafafa; -} -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #fff; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #dfdfdf; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #404040; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #dfdfdf; -} -.m-list li>a:hover { - background: #eee; - color: #404040; -} -.m-list .m-list-group { - padding: 0 4px; -} -.pagination { - zoom: 1; - padding: 2px; -} -.pagination table { - float: left; - height: 30px; -} -.pagination td { - border: 0; -} -.pagination-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #dfdfdf; - border-right: 1px solid #fff; - margin: 3px 1px; -} -.pagination .pagination-num { - border-width: 1px; - border-style: solid; - margin: 0 2px; - padding: 2px; - width: 3em; - height: auto; - text-align: center; - font-size: 14px; -} -.pagination-page-list { - margin: 0px 6px; - padding: 1px 2px; - width: auto; - height: auto; - border-width: 1px; - border-style: solid; -} -.pagination-info { - float: right; - margin: 0 6px; - padding: 0; - height: 30px; - line-height: 30px; - font-size: 14px; -} -.pagination span { - font-size: 14px; -} -.pagination-link .l-btn-text { - box-sizing: border-box; - text-align: center; - margin: 0; - padding: 0 .5em; - width: auto; - min-width: 28px; -} -.pagination-first { - background: url('images/pagination_icons.png') no-repeat 0 center; -} -.pagination-prev { - background: url('images/pagination_icons.png') no-repeat -16px center; -} -.pagination-next { - background: url('images/pagination_icons.png') no-repeat -32px center; -} -.pagination-last { - background: url('images/pagination_icons.png') no-repeat -48px center; -} -.pagination-load { - background: url('images/pagination_icons.png') no-repeat -64px center; -} -.pagination-loading { - background: url('images/loading.gif') no-repeat center center; -} -.pagination-page-list, -.pagination .pagination-num { - border-color: #dfdfdf; -} -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-body th, -.calendar-menu-month { - color: #8d8d8d; -} -.calendar-day { - color: #404040; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #dfdfdf; -} -.calendar { - border-color: #dfdfdf; -} -.calendar-header { - background: #fafafa; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #fafafa; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #eee; - color: #404040; -} -.calendar-hover { - border: 1px solid #ccc; - padding: 0; -} -.calendar-selected { - background-color: #eee; - color: #39c; - border: 1px solid #39c; - padding: 0; -} -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #fafafa; -} -.datebox-button a { - color: #404040; -} -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #fafafa; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #404040; - outline-style: none; - background-color: #fafafa; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #eee; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #eee; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #fafafa; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #fafafa; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #fafafa; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.progressbar { - border-color: #dfdfdf; -} -.progressbar-text { - color: #404040; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #eee; - color: #39c; -} -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #fafafa; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 4px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #dfdfdf; - background: #fafafa; -} -.slider-rule span { - border-color: #dfdfdf; -} -.slider-rulelabel span { - color: #404040; -} -.menu { - position: absolute; - margin: 0; - padding: 2px; - border-width: 1px; - border-style: solid; - overflow: hidden; -} -.menu-inline { - position: relative; -} -.menu-item { - position: relative; - margin: 0; - padding: 0; - overflow: hidden; - white-space: nowrap; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.menu-text { - height: 20px; - line-height: 20px; - float: left; - padding-left: 28px; -} -.menu-icon { - position: absolute; - width: 16px; - height: 16px; - left: 2px; - top: 50%; - margin-top: -8px; -} -.menu-rightarrow { - position: absolute; - width: 16px; - height: 16px; - right: 0; - top: 50%; - margin-top: -8px; -} -.menu-line { - position: absolute; - left: 26px; - top: 0; - height: 2000px; - font-size: 1px; -} -.menu-sep { - margin: 3px 0px 3px 25px; - font-size: 1px; -} -.menu-noline .menu-line { - display: none; -} -.menu-noline .menu-sep { - margin-left: 0; - margin-right: 0; -} -.menu-active { - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.menu-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); - cursor: default; -} -.menu-text, -.menu-text span { - font-size: 14px; -} -.menu-shadow { - position: absolute; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.menu-rightarrow { - background: url('images/menu_arrows.png') no-repeat -32px center; -} -.menu-line { - border-left: 1px solid #dfdfdf; - border-right: 1px solid #fff; -} -.menu-sep { - border-top: 1px solid #dfdfdf; - border-bottom: 1px solid #fff; -} -.menu { - background-color: #fff; - border-color: #eee; - color: #404040; -} -.menu-content { - background: #ffffff; -} -.menu-item { - border-color: transparent; - _border-color: #fff; -} -.menu-active { - border-color: #ccc; - color: #404040; - background: #eee; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #404040; -} -.m-btn-downarrow, -.s-btn-downarrow { - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - font-size: 1px; - right: 0; - top: 50%; - margin-top: -8px; -} -.m-btn-active, -.s-btn-active { - background: #eee; - color: #404040; - border: 1px solid #ccc; - filter: none; -} -.m-btn-plain-active, -.s-btn-plain-active { - background: transparent; - padding: 0; - border-width: 1px; - border-style: solid; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.m-btn .l-btn-left .l-btn-text { - margin-right: 20px; -} -.m-btn .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.m-btn .l-btn-icon-right .l-btn-icon { - right: 20px; -} -.m-btn .l-btn-icon-top .l-btn-text { - margin-right: 4px; - margin-bottom: 14px; -} -.m-btn .l-btn-icon-bottom .l-btn-text { - margin-right: 4px; - margin-bottom: 34px; -} -.m-btn .l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 20px; -} -.m-btn .l-btn-icon-top .m-btn-downarrow, -.m-btn .l-btn-icon-bottom .m-btn-downarrow { - top: auto; - bottom: 0px; - left: 50%; - margin-left: -8px; -} -.m-btn-line { - display: inline-block; - position: absolute; - font-size: 1px; - display: none; -} -.m-btn .l-btn-left .m-btn-line { - right: 0; - width: 16px; - height: 500px; - border-style: solid; - border-color: #ccc; - border-width: 0 0 0 1px; -} -.m-btn .l-btn-icon-top .m-btn-line, -.m-btn .l-btn-icon-bottom .m-btn-line { - left: 0; - bottom: 0; - width: 500px; - height: 16px; - border-width: 1px 0 0 0; -} -.m-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 56px; -} -.m-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 50px; -} -.m-btn-downarrow, -.s-btn-downarrow { - background: url('images/menu_arrows.png') no-repeat 0 center; -} -.m-btn-plain-active, -.s-btn-plain-active { - border-color: #ccc; - background-color: #eee; - color: #404040; -} -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #ccc; - border-width: 0 0 0 1px; -} -.messager-body { - padding: 10px 10px 30px 10px; - overflow: auto; -} -.messager-button { - text-align: center; - padding: 5px; -} -.messager-button .l-btn { - width: 70px; -} -.messager-icon { - float: left; - width: 32px; - height: 32px; - margin: 0 10px 10px 0; -} -.messager-error { - background: url('images/messager_icons.png') no-repeat scroll -64px 0; -} -.messager-info { - background: url('images/messager_icons.png') no-repeat scroll 0 0; -} -.messager-question { - background: url('images/messager_icons.png') no-repeat scroll -32px 0; -} -.messager-warning { - background: url('images/messager_icons.png') no-repeat scroll -96px 0; -} -.messager-progress { - padding: 10px; -} -.messager-p-msg { - margin-bottom: 5px; -} -.messager-body .messager-input { - width: 100%; - padding: 4px 0; - outline-style: none; - border: 1px solid #dfdfdf; -} -.window-thinborder .messager-button { - padding-bottom: 8px; -} -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #dfdfdf; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #404040; - border-color: #dfdfdf; -} -.tree-node-hover { - background: #eee; - color: #404040; -} -.tree-node-selected { - background: #eee; - color: #39c; -} -.tree-node-hidden { - display: none; -} -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff; - color: #404040; -} -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #dfdfdf; - color: #404040; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #dfdfdf; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #dfdfdf; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #dfdfdf; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #dfdfdf; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #dfdfdf; - border: 1px solid #dfdfdf; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.switchbutton-on { - background: #eee; - color: #39c; -} -.switchbutton-off { - background-color: #ffffff; - color: #404040; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 4px 4px 0; - -webkit-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #ffffff; - color: #404040; - border: 1px solid #dfdfdf; - -moz-box-shadow: 0 0 3px 0 #dfdfdf; - -webkit-box-shadow: 0 0 3px 0 #dfdfdf; - box-shadow: 0 0 3px 0 #dfdfdf; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} -.radiobutton { - position: relative; - border: 2px solid #39c; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #39c; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.checkbox { - position: relative; - border: 2px solid #39c; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.checkbox-checked { - border: 0; - background: #39c; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #404040; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #404040; -} -.sidemenu .accordion-header:hover { - background: #eee; - color: #404040; -} -.sidemenu .tree-node-hover { - background: #eee; - color: #404040; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #39c; - color: #39c; - background: #eee; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} -.textbox { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; - border-top-color: transparent; - border-left-color: transparent; - border-right-color: transparent; -} -.textbox-focused { - border-color: #39c; - border-top-color: transparent; - border-left-color: transparent; - border-right-color: transparent; - -moz-box-shadow: 0 0 3px 0 transparent; - -webkit-box-shadow: 0 0 3px 0 transparent; - box-shadow: 0 0 3px 0 transparent; -} -.textbox .textbox-button { - background-color: transparent; -} -.textbox .textbox-button-left, -.textbox .textbox-button-right, -.textbox .textbox-button-top, -.textbox .textbox-button-bottom { - border-color: transparent; -} -.combo-arrow, -.combo-arrow:hover, -.spinner-arrow-up, -.spinner-arrow-up:hover, -.spinner-arrow-down, -.spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom { - background-color: transparent; -} -.datagrid-header .datagrid-cell, -.datagrid-cell-group { - color: #a6a6a6; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; -} -.datagrid-row-alt .datagrid-td-rownumber { - background-color: #fafafa; -} -.datagrid-row-over .datagrid-td-rownumber { - background-color: #eee; -} -.datagrid-row-selected .datagrid-td-rownumber { - background-color: #eee; -} -.datagrid-row-selected .datagrid-cell-rownumber { - color: #39c; -} -.datagrid-filter-row .textbox, -.datagrid-editable .textbox { - border: 1px solid #dfdfdf; -} -.tree-node { - border-left: 2px solid transparent; -} -.tree-node-selected { - border-left: 2px solid #39c; -} -.calendar-header, -.calendar-body th { - background: transparent; -} -.calendar-selected { - background: #39c; - color: #fff; - border-color: transparent; -} -.calendar-selected.calendar-saturday { - background: #00ee00; -} -.calendar-selected.calendar-sunday { - background: #CC2222; -} -.tabs-header, -.tabs-tool { - padding-top: 0; -} -.tabs li { - margin-bottom: 0; -} -.tabs li a.tabs-inner, -.tabs li a:hover.tabs-inner { - color: #404040; - background: transparent; - border-color: transparent; - border-left-width: 0; - border-right-width: 0; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.tabs li.tabs-selected a.tabs-inner { - background: transparent; - border-color: transparent; - color: #39c; - border-bottom: 2px solid #39c; - border-radius: 0; - font-weight: normal; -} -.tabs-header-bottom .tabs li a.tabs-inner { - border-top: 2px solid transparent; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 2px solid #39c; - border-bottom: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - border-right: 2px solid transparent; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 2px solid #39c; - border-top-color: transparent; - border-bottom-color: transparent; -} -.tabs-header-right .tabs li a.tabs-inner { - border-left: 2px solid transparent; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 2px solid #39c; - border-top-color: transparent; - border-bottom-color: transparent; -} -.l-btn-selected, -.l-btn-selected:hover { - color: #fff; -} -.slider-handle { - background: #39c; - -moz-border-radius: 50% 50% 50% 50%; - -webkit-border-radius: 50% 50% 50% 50%; - border-radius: 50% 50% 50% 50%; -} -.menu-shadow, -.combo-p { - -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); - -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); - box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); - filter: none; -} -.menu { - padding: 3px 0; - border: 0; -} -.menu-icon { - left: 4px; -} -.menu-active { - border-color: transparent; - color: #39c; - background: #eee; - border-radius: 0; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #404040; -} -.window { - background-color: #fff; -} -.window-proxy { - border-color: #ccc; -} -.window-shadow { - -moz-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); - -webkit-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); - box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); - filter: none; -} -.window-mask { - background: #000; -} -.sidemenu .tree-node-selected { - border-right: 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/filebox.css deleted file mode 100644 index c6bac6631..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/filebox.css +++ /dev/null @@ -1,20 +0,0 @@ -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/Thumbs.db b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/Thumbs.db deleted file mode 100755 index 5f257a2a49959543d36e2641d352572547e40e63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35328 zcmeI52|QI>`}ns^Wu7Hd10{saWN1RTQWRxO2$?d=bTp}qsi+Xi6q1?D^PJ3N4ozl9 zhLhp=KfB?*b>Dm6Pw&0&@Avz6-xlAqj&s&p&t7}4^{i*D{p_W=iS}i5`lcb|H$e^| zMDS}H5R$JxCxG`T9|H}7tb;d10Df(4?bC+{0&jnYALtCM!m+N0i%0+YS`tHyUUO1l z0|1v9Ap^((3V;%z0;mC6U=u(GFaX;DMt})m1~vjL04u-^umS7<2fztz2DSiOfo%X6 zumji)NCG^-PJkES1NebmfB+x}2m!)?3?KrC0%CwTAOT1LXxo&Acn=`^`ENOh<$=Ax zK43p^06^3Jw*?Kv7JeMzS|}hk5Zfc?;Y@sgU_yxh(dW_j@~=X(mahm#t)74o679A9 zloGwxej=KSX5U*@DtZtQ4j@KQYa_%8&Vt#ekN&M!8qk9Ou6(rb_@W&R0@{B6 zNJd~Ad{6&J+YfpUzx02!yf6J9)gh=3_|pGTJ%Q?g zKkEMn;X5?HBE(9-AwU^W0aSrs05#w+pbnsEk3y^gXadK8*a7x{1KYG71WEGIDZCDmofUDq1RXavCNYT6zXXMn(#1=8a4Y8|fGr8PGxq z2q6y<@djez4GfgzlnnoNSSv+n*TcATijZI{vW}L3kd|Pr5*60Rd6M2{L$d&2h!5iK#@mfibE=#LtaZna|&z7QO}e%t=^GDeM- z87`62_7^vhF)?ps*~Gnl2hUDkQ894|Nh#?A2Ne{R4k@c>9y_k3ed45!v5Dy!Gjofx z4vtRFF0SX@E?vIjbM@MF-h%hDTn#e)IO-=oohP{oMS*BJRTyS}y{G@Kd$^QM2FFix%p&j);hm zh!m|C!8#X!kd}ye%We|7eMd=+?C7@&Us%tuKR7zQY{NDYjTy$%_AO*gT%tqVShQ*% zYxaE=yZEPS_K%AFTCX02f{*|%9w99Zz^e>Tu}-0Pc686Px|>haoL0}Wrl`q#`$#UE zb7e=5;G*anvOLO1H?8b5@aAAq_$vSI_sVtL1rb3yeiNH8D+`>94VWv4Bj-$%c}ZW} z8ZsRlgQuTlUJk>o&V@9sUQ%B}A}jD8Y-eKrCdn~t-Cx@HKVllN)L7uJQ=dU~-p8K6 zV>ckrUr%rvG>IW-7$?vUj-WMc;4cTz97ga?0KT*MsBJ#!P;?wX4wg*(Q9h$@a-h~0 z;Xm|8*$<*Wgb=!)`s1Ts{PFdN_!@GVwL-s8K8|pVe}weIam%7jw$wX%=7e8w+Y{f$ zvA?ChXr=I0`i$`IvUf^S6!^i#m}Sg>w}iEr`=0SbHb!{?5AQJ@+*8A=sPz6}v2_P) zC3WI}Sm+v(elMcTf25($8GrYo_nv*jo*Olf{8p#dY3;BeVt-0=qpL(OaQ!gW9u{$b% z;O@)C@i1h8Rc-6@>Q+{B>zEVK3IQZ#_q&(2_z1BLdnCKzcR z!iJK})kpZIh2*H2;CD*#=?S;q3EYT!t6664Fs#V5q$6`~cV+(N;E+RI#m|E72U(qy zzE!=R^p<`QO-g%t8>X8u?J7(4vz3x~p47NWQNKN`hpeM>0#09H5@jVNBO#rA=q>*{ z+67ez|2llJ9|~b;{SoX3Flv7G|F8N#YB&Ft@Mq>nfv==m>qsU(gsC*cDKCV}Q znfzVzA9Ri28JYG`F@mJ-OKmq7n?R)Eg1k#p#uK$m0KPqKs zVRJTLa*J%`tjVq(ryIcrFi zYsvHl&6fX(&lQ|ZZ9?0G%VK6 zt5x{pVhF=gg>PV_e7oYNjvvABhD8^yAwkM(NT2QNy~I%~Zu{_11^74 zm=Dv;s|!5q&hm2R^sXUIaCy^}zAF9KGx2K~zGG7)+4r=}>v;AOT$MRO`lp7zkKOjm z_*eSV{{13quE|5t(HtHEvz9$h)vJg1((hn zeH9L@3c~!?Tmp~z2fbDB=uMKiW~f>0$ao}tX-C*sN>V`3uB)V#u z-t1Afu_}9(qmgH7I-M!i1Lp7C^nc3ywft!Qp8f;#w?Bw>7nr}#mNz@k+C^A3H7uR> zUD9bgl$oC8)5B`s$#c|rU)s3`r!c%cgnv#4eChu;U_Ad3>|a)d;HUljmHqo8+dr!B zSKmFxZ_xGM z$j~*!to>9@AeMw{dEb#|?vZYn#*eNc<(?1M5C>SoExws%Op`?FVFZWb$zbC&_{2FKP?`7HP#WJ z_h->|@V)g9gtRw5%m3fLf5-LH{`h=f^2gWTr1<9?mu4U4%Vz}5@}#=-X1>Kg36Rf> z+NWSRtHAi`ePqoRS%#x0*#Fh^`iuT*g8uj;*w34h&3`NV`2y$y)W6^o#Fv39fDdpL zxCUGYd;vee9|!=@^g$5c0D^&=z%Af55CVh(cYwP9nl=pLa3BJ>4@3e{zylx}cnHJ* zXxcc4Wg;3& zk#YmU)?#J_!K)q)(fhJi!0hqrYJ?VK;l zx3&%baEGhs?c2oyOZU~zk|wMahR|HZtJ!5!++@|lJ?vK~9F<700k7;g4MHd)jKWnp3XapGuJSX$^Xo(a81-S-r`AaXGtO zA{!-B3lFoA6!nGR_PJehHT$x|YqXiBja}U14?kWiFw)v-aveG0yV-iy%%<;FHtlgt zU~vlZ;RVczlEsqnHAH0%sXLD;#8|Alz3?-T*UTAsJG;7aXAQ~CD|zbPTrREK|n1{*&dx3lbbZjR#f!hW6l3Z2zUa04 zU`{VadyhKFXg;P&UtXnsUTrI-;mMLfz7%ckyk@FoUY0F_c^9L%s0Qt#p-Fmx2xW6t zS`!||X(wQ8Tumo-iTO!R#rsUvRMaTvWk;?bzQITG;l93^etm`I&dokVzHbWYu?#C5 zZPOmRhQ;%m=fmwRZS5#@$}PHRvo>s<=UE=X2niX@rjeE2u#hntsgn~O(6f*hdzIfA zhp}9ZO0cj@Bp+q;CugzpCnid`w=Lv2Tc{*UwC1C9=8`Fm*-WkF$yCS3*9&C>vYm9_ z=esPINI3tVuL`Piej6y@15iUq1K6WK!uY=)A^%&A|Nq7Me_6wjz=DG`SQJCkk9)6O zeD{N!?CU%JVi%VxP6cl`>YT_}?|t%phPZ;o?T1`-M9ItijY&b-gDYydfEfM8_i|AW zU5l}kyH@EWo(gVzd5Zb81Y6pnvh{Hc1mCyx_OUB`Y5zVyNc(5{Ie+`x%-?=lKJ+k6 zKFhO;fuQk2)9MJ^PX1R@wco1lZ`$wA`yW51|M2er!1@y-v;-yqrYRq%6~Eh1zWVSU zy#M0=BK#kaPY&hL0^ch?7Si^CzD0w`e?UGnl(P}|UioQ|)|CWaAc+14aDna zjEz-E`e!?xXNw+BQ}~GACOPu%07anW*8HWR;vHiPOqs5_>XEbSZBxaP4_I5x5^(i$ zX?Z5MPqIZg#^(|$;TZ>Dfk-}o5l=l`f}7v5!q+H>$2d)|a1LUyW21HP^m_BWvlG?9 z^(&IXN|sM_iW(cAX@zCY?C)}+mhs!zvwzzD#K?|Bv92!aneh{CQ)0FoEz$=}AHt*;iw;g~10{_OLhD zY%bU`-cFYHGU%GK8{=C)(dBWA;H%f26q%0(ynHiST0cLucQi7j+QSPgkms~LSpJd~ zH!VErVO2zjR9!2SaqG^dOiCrt0kKRKP)Y^|W0Y_Tgf*^R@-_%^hIFvfbny z7S~8y5!(IXxVtCkuxv}E0TY(cJ)C9lN^NTUNaw74(nH(U+)@8bd!dK;ZmVT3w_y`W&Di1uYk;!VQR{7@_vKy z^8Ch@wlkTX0tQ1Vrl$rDrWM}1vD4(m@w*q<4^>OeV!E%0O;eoZ*e16-GfF8la)6#( zKREA|md(10x{}5{MM{+e!fn~I2P!(XnBJ@C8n!m|aOq#Lb7wjy9VxuWDfQWVe+nVV z`loIhn*Pof@%LNZQ$$~^itMb?s(v}zmCB(kIu*HCR3i8+!c``S9oJKLgGB!q!w2{| zZQ5j?rSpEmtH-*o)-3N?Ig0J7Ox-9NDcmWuCwd=mohiwECwlMH`^i}mg7tYdhIie% zdZpKpi*vSgdP)wMGX`U#yHlRg6$)Q|?mQh3a;-`7xrm;Ux9!B7ASF>~jc!gsL8NNl zaFj}M*g<};L*37;PQ)6~OUXM97aBN^7ii1Q(NT+&6uZp|9< zMLZv_a@E9p4Vmbe*BjWJbt~5G(HioUdvOh6Nzy#4H9Mz&1k*>gyoUI<8pOyQy0d`6 zMGdL5xyrc=fWv<-)&@Vo{?`bcl+ou~kHfrFySq?Lv}$Mt0>_i-TXrpB}JBe~v#tpFjQG z2W$U_{AcNL3!*3$ius<^(Lc9wRm3jD&4 zOdX9b#&SHksL1!;zPzgvlU6fH?-Vzh-Z$uKsL|MX|3(9)Rw?b>Tb)zAk_NNeJ7hAf z%To+Z+Avg24Y{@RX_A7e)p645i;4PzZ&Zg>m+Q{nITkk1waWXj*e!e^B)mpi!6$l% z#j&4!e|yZJ>Em&KuBQbo)u%GGHArJr-Z`ugIlT|!^w?iAGf{g7&yUqgPkL6+xlxS3 zcq2=-N^cS|8=L1yjaT;D$MuX@yM~!#uXQq)g|yvloqLo8QVIm(>B^-=Id;&C9VUMq zHSh8&TkhGzV%{0j>Ol^Ruq$0J1g6E>voF}hwumK%JbgdRb#Y7Hi&VA*$jtcT`Iz@2N3Cs|T#2q+n1tZvj&ZIWQWcW86aQG<)gXXk}NP7i6_&wDuO=_(Q9EMC^E&Z|xDOjH?^o z{FKWq=q?rCkZXx>^{Gc~ahC!<^oLIb#nz5ii^&#E3{Tyk=*Umqv(SZ=Bc6G4$u8A3 zWv(|qt7STJdBUyZ{;))dnTOZwO4YzEd2=uM6LRl9@H~EgW~3sF`6B;mtZ1DBm7kT% zSeM4eFfkUcDbg)UrH5&&;%rvufRr?X@1YHh5C!k(J(3 z)t+HR$$LU3bnIrg=pFZNt}K_yq9!}+^yLTG!Anj7>xQ*22u}7eM#`6v&nq*p#+`aB zTbdf^wG9_DjHwc&d*LD4lI1r@F+R0pq;d94!+X!UY)=zo4DA8+NJjdXfn3@i^za0N&p;ez# zy(3OSn5o~st*?sTFY?|of6fPwsW*CX<1EaESyS09rAeYV;t0d*oHjIApLF&%?Y6<7MUruH4Plib9hTKlm8ZvXr%+#?ICZmCba|9D85C^{T z)@|h}Jwk#!E+N55D9c|KHw!hzsNkf0i%#ACON6^Hh>9W1~vjLz$SndU<23z4gmHy zK{f+hfUN*3XE(&$z;<8AfNy!0!qLkKp9X0(0so@tOgtg)PW;VVB z5pV*W0T;j(I1ji1?tlm233ve*z#I54zW=|fnYs-dG-))GS?aa5xOqN`u7M-Yct?l> z`;(CK&cVvwDlA*Bw4I~K(|cuNLRPk#T4F(t>0TZh31^A6WgNSP9c_`LzVX0gQJ|

                                                                                                                                                                    NA+ZcC>&vv>@9CR4VtY9M(_F}@-1%;|KR!4iA9GaQ>eBDX}J`#J5%ao~~20i!d=uaWnN2JTaCZc`4~#{=ltA0#Q#aZrz(q zm2=*?xv736TAM|Kl=3M&Bw@D{zAUxk)aE6-BAe5h;+@@bY7J3ppPMZ$$}S~5x2U-o zQjkbmI-tbu1yQUt@EkZA~%UI zDZD8leyDP5!{b&)XQ9#uFDH9gW$d3%xV`jLCJ9x3F0V2d)ngzpp)j-GseibEU`g3< zw}%EUZ+MWvwLm-Q7ya#T)zZw{CR~~&&pg|?W$Qs3suK&ceD9y{sA%;Opo@4M*1u@g znZR5@5PCE*P%q8zm0o(U;?z=6wp(T+e$R@;(;1Fz%BlMdZ+|I1y-SO}lFDmEUy{9g z52kCkf!%6wO6Kj{)_KL<5&Jc^my)u))<)PCMw=Fy$?)Oz3))h2DG<`)a!XVo!GVvb4v6F8sz76QAYsC7a~r9%a{jt!y*OGU7Jj4X z(9=811A`MM28COelk{3Li>H^EEZF?%V6sKoc z$$2S~5*L?H6m`8&-ZV+E;%exYBK1c$50<-9BTR0;Hwh2-4~cS$#zjhB7Gc|3)?u?# z&ZKj+rzassXEGtN$?Lg}?F&4$>rRysInFfp-D?OxUHC&B{m>dxs=L$niP(v`Yb@-P zoq0*t3R+w4@;I-TB788Zcf4sLbJ&xk)O>&zS2P?&?P|MOAo9$~Fd{Z0Uo*|Ef@xM{ zK@}xwS1TG+=i65f^#u9PTfI&dD@b^1@AX*CjbWzaxPi4`=Ae=-PNp|hD%!Rs_`jbA(=v(l-y%-aTAId{wnS->smC-as|g_-m8iYF5Wyx}LxR_Nz03 zJ?v~@?>WPddrf`XS5W|Vo3i=5x1umuDMSF$-N7s%gzirD^}bX_A9t!U`(~G^y^xp~ z%@HN4w`L zny3<+N2lRPO+d<*T_O!(w?1?yEk}@szW#G=QOLa>Kq6_qS0#U&8{LP?7LMHEo0`f% z@(pO7XL?R?;%FZ0kL5c-`Jc`zT1z9SpFQMu`6jP8WFtfK9w)rU4`=D?yy!6+LH(?t zG?Q=64SF?D--$2h_Ul}~e>Tyxg3j2G6`#s>v2W$r!x=JztAL)5-#^NOkdYG2Z9uk( z?>9$@o=b<1dCx#O=&_!IdZJg>@tb4b57|+F2ZUtM_K(XjgSrtTfN6-J)Z3)eZ`dJ_?D@j?u)DxiX`^)@Q4ea?JVf~s0q4|0L z^zU*1bg5v3BzuJV${^j!zG2H0L)|tC7H}k)t#&+yc6{dHq`^nGF=%S6suv5)R&xZ=w;qF ztRy%*-py=vj%lM2(fM+db0=P3dw!UTZ#v!8DnC^7a6GT&IGwNEkuFt>rrt)k?p^A) zq77Lzg(7$qmKg>`Lc<0P4Dg26zaC%E9`}dgH1ux6kDB6>?)h5t{MzS*AV2CMhMb7w zIIZ-l=YGohrT=dKLHaNGPyh43i~sFX>acn>;gG&YJ#kudw#Bq)vU@>8-C3CX*!;)R1mi=YZGeN)Y zn8q+x+d>~iN6KG!6GiPGbX5xJ3$K}0`MSUT)*AWJ|9%wz;mtq&-~TTCZ&iF*fie6| zlpA0Bf*JGfd)MWQ*O2>+4)qW7^PYWB|7}Z0oAW=1FYWi}4>ErI*8Y?F53E1KlH?ld zPL0O@e1`t{6Ioby)Q9th2BE*W13v73@KG)*8x5aI{nxLmAV2uC|M%|y1NmAY|H{Wn zExPYAIt%;r;m_3H8ssy5md^?9&p-E1{~`BJU!EQwoFt9)kh(dpl6ELNh;F~{Y_Ci? zt1e9i@1nzvgM0mHyhVe8v)4;;7|&Q5U|p)@uWzEho|1jv@_5TGv!}O?w-?s&XPq1o zpH*Vaj(akpnxmyHEWYqT>fE`QLfrJS01h+4@3P6C?ml_tRLrUzcRyvz@t%io_%CcH zLF}#`K`1X=dS#dycmeA$L|v64UnZS%$Jv9Kx9M#YgPL3v4eg#9F5wF~!q1c94);yH zcJN8fFC9t~v(L}0XoUGm-pL$!u#>IrRkC!-ga}TQSg^YJ7f0Mc zWVG5}Xq-maTAbB|XL4m-n43|^^;=0>N$Vzta$5=`h?|-q*+A*o{>izW!H0V z96$byUEPfPS&m>)OAbLwdhXSEY2oV2MD{m zjXKE_TQ2IzBpvXKlyV^V59HW(`;=$RYeN%!V^r2aIJUL?t$INqyGT_ip@i1%^w~Fu zTPtoJ9z4z!B3rvT>Kg#u0NO_$arONx5{BjEk#B4Vw--;$spzxt(mJU^fg2CQ5R+S*mHfowhnHb%I1^_ z-bCnMC*Hcgw)P;YR8>#9;~61{m>anf3# zA^mN03Q-4sg&1Y`_VA3``6^4|h1t2GxvT4NN5z>sfi>j2?2JFM(7)(!vL94`Ux2v)>QizF;>+l~1n>c_0@r}+fG^+& z_yYkzAP@xH0D^&=z%Af55CWj(-GTTna1RIr!hs0jJ`f2+0S|y^;2{tL!~$_ZJdgl9 z0uq5F04?(|#3{fNAQeah(t!*h6UYLx0W@tc#7}`dARj0I3IX)HpW)Xt@N@q6AH?@VW)C8=k4+SU=9=WROuEwe9?yh?+j!tCH!;nvoGyk6SNx`&#fe;3+=Qtugt+4b`@0Qz_DXN( zbSt*;Ue~g$RGJ=hodQDcHyZWt2@XC<4h>kg-E2d=mqNlw+k$aqFjMe)Hl^i)Jo6P zWKpwl9}%jhB02W*eWRuKGvlifreaBMa#6y&C3hZEE1Pb9iDy2$C{H9uXCb!{>(qIh zYi2bq$7ia1G)yX*<<#u70&Uv!^~4vd?L{t>;D<&iY_??EM`qPBsCS#r_FBdesxRMkWjb4=R=8e%s%v#*pY^*PKY z_DQTmYI6I$*k?LJhS;~WizudDQfnL97&y=`p46o%&%W{b(Tg49USSKuWkakgv4aiG z|IUE=W&ErJw~(Lnpa1>mzeN5I)*mmzINbcv4G7);;(verGZf_S`n>)r_J1Hh8RUQQ zzy2e;^56OV*U|j@*1x|l`@eYpySm$2OW$V6(p~wW^N|}Iu62EtPRIhwNZ`|P-`OT# zOcu3|7d>vIB9bV*#SAMLP`E#3S7-=PTB%HW0VP*!M$!~dnG*N4ZH%orPMwn;66B;5 z&uSb9JD*1RdC|>?Wxw~(>ME28i@GMWEuqfI!ZEI}G;Qi01J7pqr#T}10q!S$5oK4H z)UTyMx7hxk@ARgirxO}D!etGZEZ-^YbWCO!IWm*$n`L8@HM#G&sRDIc{-Mhk z8LO%HZ(wsU$d1Dmk0@Z-q^YuZ+*^prsh{yC7vdc2Z4a)M{g4_`Vj|exiMg`qGDusf z;A~ih=gF~n!aq_IVxHOXHm!E7n^!i?({*kz$Y6&WU&TV#vUfqYqdB$xa&^awI%8W< z+0g_ol}m*hE7mDdmUoA+4mb6dGt?RT20fUuGUG06H(k#x?O#~jY--H4S}jY!dF9+1 z!cnL@9L3}z64^B5Twt4k3)8*3FI1V9i)p#Ub(?^=&uCYU-E+S2eqE)EE-RCa_Fcw> z**A=aL+s-V4J$DjSAE#I^P7o!OvkpE8!4aIZZa^ z%gxm@t|BT?lOhHg>~}O$`wq?@m$}s(LD7+lcu7mh9>3qu#30y@g2gy5_;0X=(=+DcHH4GWx2uVjWWA#CQ5wk z7Ws8A`{Vat#=k8;%>0q_r~laB!+#9+-=MG5>AO?B_2%=PD!Sc|xM8D#2F=T~LwX+LnXo=$#qqL7p96d&*L^utqX+2&Q^p<&C7x`#Wv zBO~de_)V|f%r}f$A)KxvR19K79@>;Dg zDi{@-lSW#`N>aBq$Z?G~JjVI%;+5z(i^ngFkow#XWS$|N7kkN>_5A(=+?}#82DvR* zrl6sxLs*U|cgE^W410tFud3g*ko(?eEL|e3*xfiN&#ow7C%ei^=m#vq@ZpK-P7d4j zQaa-AJ2)_mDOYUR7I0z7Y+I4X8iE~bD2>XJ8DO|o>Fl-L+tqFCrK($CK z4Z+*%n?moJo@#h5CB=E6foGVa%XcK)SZMxT+uQsIi^CqlK@}#U1zeLwy>dmWYa_m*xmxZ$29_qb#ex1u@^RN`cQ?ne)AygWSYv;_kb1mvXMrSe8;Ik%|A+3|5 z3AbM-w3>4DMl9~8nUN?wwa7T+W?PfOtkgE~*jhBeZr8-izyTUZ-QoRPujobXc!DHJ zD^=~nR1RjTduOY!!)a@mwC|eC-k7cYB&*j?SJRS9_vViCjP@R{lsK+#!v(kxY6Y%%dYhXeg8nww^h5XRu4PXhrR`QT+2#)Av3em{YO-^d^B;cyG14#k z^QZsNkGcQgkG%gJ;jHYV6vK?8V7?t4nPtToFNkWD1WzisM!uNKqyD~G@UK3q=#vWQ zQ>+M;KY8|N@A6MRs;D>o8SsPuecx6A$bvroi7>hy@KOHOpB?qfJNJzbJ1Pa;uMy#i zpt*9Wo&fc6cYq%w@ZLk8oiP0Piaue0K1cDZM<4ox0lLTIALm1T_0K@QuXCZ#3!u9r z{&6llcmm{;=f4Hy{q}#7qfbPj`zro%ZkLbe#OC930^dHrfzB$?=aP}Q%W~g(AR56F T0gjLZeOBaa?|wA#e_!~27*z{8 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/accordion_arrows.png deleted file mode 100755 index b6368d636e2ff36501ff9c6b14f7ce09997f3743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel!K>>V@SoV?_1tQrr|vg#{&FxgXS!5MW?fq8aJ< T>6BX`&@2W|S3j3^P6h?7!oT zn93bYIb9!43Wj)WNz0M)xYl!8U>3_OjRiss3@1j_Zvlb#iD~jUnsR3em#t_3WtUHqj%c^0} zFSrhZpjU$)YHUS-lsMx)nN8pghWK6h!524#*oXjC@NjHF9H1y2K%G?c=lr%4eY%ue zT+7R9Pld<2<$C}OAU0HZIJPqD0RA&Sip042zF(tA4uaUhZ>jL`*HN0POocjDIidNRbTZ#@zvW7@I c5>Ct23v;ttA1D3-v;Y7A07*qoM6N<$f&+eyE&u=k diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/datebox_arrow.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/datebox_arrow.png deleted file mode 100755 index 783c83357fdf90a1c7c024358e1d768b5c09c135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$f|L1?c z_O8;7?=$$OZE)N^=kf)!wu_8{hTkWuP3Lf!{Qqt%*U6B7qRbydZ`F0T{#^CG?%493 zHc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/loading.gif deleted file mode 100755 index 68f01d04813c1f622810864a3aaa04b4a17ac8f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/menu_arrows.png deleted file mode 100755 index b986842e7e4044caed18edbcb4b376a4bb915623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/messager_icons.png deleted file mode 100755 index 62c18c135860351063ebaabe8c0f4df7664b8f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000_$JYFBpo`sqZyU339@ZwM6gi$;Pr>w&6M&T1N3Q$b?ahk3>@EL9`+1-BwzvH4 z=V<*uH!1ee(Sv*K$aVm^9zxbfZU9nZC#eDGVQ*&XXK(qpy{>x2j~_q0QX@ky?B2S$ z`TO_pb_Ho^lHPWf$3SXG3P5TF!a(UIB>)3m?2n~HhFtml`Lhm)4-7>2Cr_RTgV@`) zZDWrM_B#twLv#R=>k(}FC=EbL>?Sq<16=LCHdYi*!X*!q1F0DeKpY^*)!|!SNr;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/passwordbox_open.png deleted file mode 100644 index 0f25d535e05b22b406fd72647611aace9cfa6249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/searchbox_button.png deleted file mode 100755 index 6dd1931589b453f6cc9772fd1851d8705d6b6631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/spinner_arrows.png deleted file mode 100755 index b1773c24b20b30318e38c4b84690e3d0010c9c43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4DgeBzU z{E=^QXHHmRmEiEUJ<_jB`NK-}t7{l}8A{FvOK}{T)p$BC>8|6-x-MIXOa{IRh5%#E x$&;(vVs#x>vb(K5c#%QkA)^788{=C>2L8QE5AM%P*8@KmF984m diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tabs_icons.png deleted file mode 100755 index 4dbacce18ec1310d22dc4de8ff895f597b0d61eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2L1978H@B_~L*E^hdC;Kq#~ z_8gbJY-45o``Fp;2v4zS5!xHXwo~JmL(T+=yD|FVdQ&MBb@0IQ}mHUIzs diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tagbox_icons.png deleted file mode 100644 index 8ec64360884b3fdb81255ad6074bc08ed183232c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoVtb9vwNkrdSr%AfUpK=5(o}_e|{SG6u6f5&Q g4t5*qz9vC-hN^}472i&@1{u%b>FVdQ&MBb@08Zm4@c;k- diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/tree_icons.png deleted file mode 100755 index e9be4f3a9965e49a4e4078f8c53f486d761a7468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/images/validatebox_warning.png deleted file mode 100755 index 2b3d4f05babf3f82b146350e96570fac02075de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/passwordbox.css deleted file mode 100644 index 92c9ce586..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/passwordbox.css +++ /dev/null @@ -1,6 +0,0 @@ -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/progressbar.css deleted file mode 100644 index 1acc690b8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/progressbar.css +++ /dev/null @@ -1,33 +0,0 @@ -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.progressbar { - border-color: #dfdfdf; -} -.progressbar-text { - color: #404040; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #eee; - color: #39c; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/propertygrid.css deleted file mode 100644 index 03e222b40..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/propertygrid.css +++ /dev/null @@ -1,27 +0,0 @@ -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #dfdfdf; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #fafafa; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #dfdfdf; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #fafafa; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/radiobutton.css deleted file mode 100644 index 8e439eeae..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/radiobutton.css +++ /dev/null @@ -1,25 +0,0 @@ -.radiobutton { - position: relative; - border: 2px solid #39c; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #39c; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/searchbox.css deleted file mode 100644 index fc3cb1043..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/searchbox.css +++ /dev/null @@ -1,61 +0,0 @@ -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #fafafa; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/sidemenu.css deleted file mode 100644 index 3bcfe92d0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/sidemenu.css +++ /dev/null @@ -1,69 +0,0 @@ -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #404040; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #404040; -} -.sidemenu .accordion-header:hover { - background: #eee; - color: #404040; -} -.sidemenu .tree-node-hover { - background: #eee; - color: #404040; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #39c; - color: #39c; - background: #eee; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/slider.css deleted file mode 100644 index 7e4a91c35..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/slider.css +++ /dev/null @@ -1,101 +0,0 @@ -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 4px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #dfdfdf; - background: #fafafa; -} -.slider-rule span { - border-color: #dfdfdf; -} -.slider-rulelabel span { - color: #404040; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/spinner.css deleted file mode 100644 index f81643cfe..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/spinner.css +++ /dev/null @@ -1,114 +0,0 @@ -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #fafafa; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #404040; - outline-style: none; - background-color: #fafafa; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #eee; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #eee; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #fafafa; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #fafafa; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #fafafa; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/splitbutton.css deleted file mode 100644 index 2ad86f774..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/splitbutton.css +++ /dev/null @@ -1,12 +0,0 @@ -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #ccc; - border-width: 0 0 0 1px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/switchbutton.css deleted file mode 100644 index 701657ab2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/switchbutton.css +++ /dev/null @@ -1,77 +0,0 @@ -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #dfdfdf; - border: 1px solid #dfdfdf; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.switchbutton-on { - background: #eee; - color: #39c; -} -.switchbutton-off { - background-color: #ffffff; - color: #404040; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 4px 4px 0; - -webkit-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #ffffff; - color: #404040; - border: 1px solid #dfdfdf; - -moz-box-shadow: 0 0 3px 0 #dfdfdf; - -webkit-box-shadow: 0 0 3px 0 #dfdfdf; - box-shadow: 0 0 3px 0 #dfdfdf; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tabs.css deleted file mode 100644 index e438b0b05..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tabs.css +++ /dev/null @@ -1,377 +0,0 @@ -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 4px 4px 0 0; - -webkit-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 4px 4px; - -webkit-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 4px 4px 0; - -webkit-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #fafafa url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #fafafa url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #eee; - color: #404040; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #404040; -} -.tabs li a.tabs-inner { - color: #404040; - background-color: #fafafa; -} -.tabs-header, -.tabs-tool { - background-color: #fafafa; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #dfdfdf; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #eee; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #eee; - color: #39c; - filter: none; - border-color: #dfdfdf; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tagbox.css deleted file mode 100644 index 16ff41475..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tagbox.css +++ /dev/null @@ -1,44 +0,0 @@ -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - background: #eee; - color: #404040; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/textbox.css deleted file mode 100644 index 60f5ce29a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/textbox.css +++ /dev/null @@ -1,144 +0,0 @@ -.textbox { - position: relative; - border: 1px solid #dfdfdf; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #c6c6c6; - -moz-box-shadow: 0 0 3px 0 #dfdfdf; - -webkit-box-shadow: 0 0 3px 0 #dfdfdf; - box-shadow: 0 0 3px 0 #dfdfdf; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tooltip.css deleted file mode 100644 index 8f1055d64..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tooltip.css +++ /dev/null @@ -1,103 +0,0 @@ -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #dfdfdf; - color: #404040; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #dfdfdf; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #dfdfdf; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #dfdfdf; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #dfdfdf; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tree.css deleted file mode 100644 index 51d1ee069..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/tree.css +++ /dev/null @@ -1,164 +0,0 @@ -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #dfdfdf; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #404040; - border-color: #dfdfdf; -} -.tree-node-hover { - background: #eee; - color: #404040; -} -.tree-node-selected { - background: #eee; - color: #39c; -} -.tree-node-hidden { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/validatebox.css deleted file mode 100644 index 5911752fe..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/validatebox.css +++ /dev/null @@ -1,5 +0,0 @@ -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff; - color: #404040; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/window.css deleted file mode 100644 index 542f0710f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material-teal/window.css +++ /dev/null @@ -1,182 +0,0 @@ -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.window-shadow { - background: #ccc; - -moz-box-shadow: 2px 2px 3px #cccccc; - -webkit-box-shadow: 2px 2px 3px #cccccc; - box-shadow: 2px 2px 3px #cccccc; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #dfdfdf; -} -.window { - background-color: #fafafa; -} -.window-proxy { - border: 1px dashed #dfdfdf; -} -.window-proxy-mask, -.window-mask { - background: #eee; -} -.window .panel-footer { - border: 1px solid #dfdfdf; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/accordion.css deleted file mode 100644 index 51d0c7010..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/accordion.css +++ /dev/null @@ -1,89 +0,0 @@ -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #ddd; -} -.accordion .accordion-header { - background: #f5f5f5; - filter: none; -} -.accordion .accordion-header-selected { - background: #00bbee; -} -.accordion .accordion-header-selected .panel-title { - color: #fff; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #f5f5f5; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #ddd; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #f5f5f5; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #ddd; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #f5f5f5; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #ddd; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/calendar.css deleted file mode 100644 index cd206276f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/calendar.css +++ /dev/null @@ -1,203 +0,0 @@ -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-body th, -.calendar-menu-month { - color: #8d8d8d; -} -.calendar-day { - color: #404040; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #ddd; -} -.calendar { - border-color: #ddd; -} -.calendar-header { - background: #f5f5f5; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #fafafa; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #eee; - color: #404040; -} -.calendar-hover { - border: 1px solid #ccc; - padding: 0; -} -.calendar-selected { - background-color: #00bbee; - color: #fff; - border: 1px solid #00bbee; - padding: 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/checkbox.css deleted file mode 100644 index 5180d4305..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/checkbox.css +++ /dev/null @@ -1,31 +0,0 @@ -.checkbox { - position: relative; - border: 2px solid #00bbee; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.checkbox-checked { - border: 0; - background: #00bbee; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combo.css deleted file mode 100644 index 622d7c2db..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combo.css +++ /dev/null @@ -1,35 +0,0 @@ -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #ffffff; -} -.combo-arrow { - background-color: #f5f5f5; -} -.combo-arrow-hover { - background-color: #eee; -} -.combo-arrow:hover { - background-color: #eee; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combobox.css deleted file mode 100644 index 619efd43e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/combobox.css +++ /dev/null @@ -1,40 +0,0 @@ -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #eee; - color: #404040; -} -.combobox-item-selected { - background-color: #00bbee; - color: #fff; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datagrid.css deleted file mode 100644 index bbc719af3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datagrid.css +++ /dev/null @@ -1,285 +0,0 @@ -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ddd; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #ddd; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #fafafa; -} -.datagrid-cell-rownumber { - color: #404040; -} -.datagrid-resize-proxy { - background: #ccc; -} -.datagrid-mask { - background: #eee; -} -.datagrid-mask-msg { - border-color: #ddd; -} -.datagrid-toolbar, -.datagrid-pager { - background: #fafafa; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #eee; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ebebeb; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #404040; - border-collapse: separate; -} -.datagrid-row-alt { - background: #f9f9f9; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #eee; - color: #404040; - cursor: default; -} -.datagrid-row-selected { - background: #00bbee; - color: #fff; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datalist.css deleted file mode 100644 index 27617f0b5..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datalist.css +++ /dev/null @@ -1,95 +0,0 @@ -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #fafafa; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ebebeb; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #404040; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ebebeb; -} -.m-list li>a:hover { - background: #eee; - color: #404040; -} -.m-list .m-list-group { - padding: 0 4px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datebox.css deleted file mode 100644 index 392b779d3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/datebox.css +++ /dev/null @@ -1,36 +0,0 @@ -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #fafafa; -} -.datebox-button a { - color: #404040; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/dialog.css deleted file mode 100644 index 82a1bb881..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/dialog.css +++ /dev/null @@ -1,47 +0,0 @@ -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ddd; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #fafafa; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #ddd #ddd #eee #ddd; -} -.dialog-button { - border-color: #eee #ddd #ddd #ddd; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #fafafa; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/easyui.css deleted file mode 100644 index 6bccaaee2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/easyui.css +++ /dev/null @@ -1,3436 +0,0 @@ -.panel { - overflow: hidden; - text-align: left; - margin: 0; - border: 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.panel-header, -.panel-body { - border-width: 1px; - border-style: solid; -} -.panel-header { - padding: 5px; - position: relative; -} -.panel-title { - background: url('images/blank.gif') no-repeat; -} -.panel-header-noborder { - border-width: 0 0 1px 0; -} -.panel-body { - overflow: auto; - border-top-width: 0; - padding: 0; -} -.panel-body-noheader { - border-top-width: 1px; -} -.panel-body-noborder { - border-width: 0px; -} -.panel-body-nobottom { - border-bottom-width: 0; -} -.panel-with-icon { - padding-left: 18px; -} -.panel-icon, -.panel-tool { - position: absolute; - top: 50%; - margin-top: -8px; - height: 16px; - overflow: hidden; -} -.panel-icon { - left: 5px; - width: 16px; -} -.panel-tool { - right: 5px; - width: auto; -} -.panel-tool a { - display: inline-block; - width: 16px; - height: 16px; - opacity: 0.6; - filter: alpha(opacity=60); - margin: 0 0 0 2px; - vertical-align: top; -} -.panel-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - background-color: #eee; - -moz-border-radius: 2px 2px 2px 2px; - -webkit-border-radius: 2px 2px 2px 2px; - border-radius: 2px 2px 2px 2px; -} -.panel-loading { - padding: 11px 0px 10px 30px; -} -.panel-noscroll { - overflow: hidden; -} -.panel-fit, -.panel-fit body { - height: 100%; - margin: 0; - padding: 0; - border: 0; - overflow: hidden; -} -.panel-loading { - background: url('images/loading.gif') no-repeat 10px 10px; -} -.panel-tool-close { - background: url('images/panel_tools.png') no-repeat -16px 0px; -} -.panel-tool-min { - background: url('images/panel_tools.png') no-repeat 0px 0px; -} -.panel-tool-max { - background: url('images/panel_tools.png') no-repeat 0px -16px; -} -.panel-tool-restore { - background: url('images/panel_tools.png') no-repeat -16px -16px; -} -.panel-tool-collapse { - background: url('images/panel_tools.png') no-repeat -32px 0; -} -.panel-tool-expand { - background: url('images/panel_tools.png') no-repeat -32px -16px; -} -.panel-header, -.panel-body { - border-color: #ddd; -} -.panel-header { - background-color: #f5f5f5; -} -.panel-body { - background-color: #ffffff; - color: #404040; - font-size: 14px; -} -.panel-title { - font-size: 14px; - font-weight: bold; - color: #000000; - height: 20px; - line-height: 20px; -} -.panel-footer { - border: 1px solid #ddd; - overflow: hidden; - background: #fafafa; -} -.panel-footer-noborder { - border-width: 1px 0 0 0; -} -.panel-hleft, -.panel-hright { - position: relative; -} -.panel-hleft>.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #ffffff; - border-color: #ddd; -} -.accordion .accordion-header { - background: #f5f5f5; - filter: none; -} -.accordion .accordion-header-selected { - background: #00bbee; -} -.accordion .accordion-header-selected .panel-title { - color: #fff; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #f5f5f5; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #ddd; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #f5f5f5; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #ddd; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #f5f5f5; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #ddd; -} -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.window-shadow { - background: #fafafa; - -moz-box-shadow: 2px 2px 3px #fafafa; - -webkit-box-shadow: 2px 2px 3px #fafafa; - box-shadow: 2px 2px 3px #fafafa; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #ddd; -} -.window { - background-color: #f5f5f5; -} -.window-proxy { - border: 1px dashed #ddd; -} -.window-proxy-mask, -.window-mask { - background: #eee; -} -.window .panel-footer { - border: 1px solid #ddd; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ddd; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #fafafa; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #ddd #ddd #eee #ddd; -} -.dialog-button { - border-color: #eee #ddd #ddd #ddd; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #fafafa; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.l-btn { - text-decoration: none; - display: inline-block; - overflow: hidden; - margin: 0; - padding: 0; - cursor: pointer; - outline: none; - text-align: center; - vertical-align: middle; - line-height: normal; -} -.l-btn-plain { - border-width: 0; - padding: 1px; -} -.l-btn-left { - display: inline-block; - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - vertical-align: top; -} -.l-btn-text { - display: inline-block; - vertical-align: top; - width: auto; - line-height: 28px; - font-size: 14px; - padding: 0; - margin: 0 6px; -} -.l-btn-icon { - display: inline-block; - width: 16px; - height: 16px; - line-height: 16px; - position: absolute; - top: 50%; - margin-top: -8px; - font-size: 1px; -} -.l-btn span span .l-btn-empty { - display: inline-block; - margin: 0; - width: 16px; - height: 24px; - font-size: 1px; - vertical-align: top; -} -.l-btn span .l-btn-icon-left { - padding: 0 0 0 20px; - background-position: left center; -} -.l-btn span .l-btn-icon-right { - padding: 0 20px 0 0; - background-position: right center; -} -.l-btn-icon-left .l-btn-text { - margin: 0 6px 0 26px; -} -.l-btn-icon-left .l-btn-icon { - left: 6px; -} -.l-btn-icon-right .l-btn-text { - margin: 0 26px 0 6px; -} -.l-btn-icon-right .l-btn-icon { - right: 6px; -} -.l-btn-icon-top .l-btn-text { - margin: 20px 4px 0 4px; -} -.l-btn-icon-top .l-btn-icon { - top: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-icon-bottom .l-btn-text { - margin: 0 4px 20px 4px; -} -.l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-left .l-btn-empty { - margin: 0 6px; - width: 16px; -} -.l-btn-plain:hover { - padding: 0; -} -.l-btn-focus { - outline: #0000FF dotted thin; -} -.l-btn-large .l-btn-text { - line-height: 44px; -} -.l-btn-large .l-btn-icon { - width: 32px; - height: 32px; - line-height: 32px; - margin-top: -16px; -} -.l-btn-large .l-btn-icon-left .l-btn-text { - margin-left: 40px; -} -.l-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.l-btn-large .l-btn-icon-top .l-btn-text { - margin-top: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-top .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-left .l-btn-empty { - margin: 0 6px; - width: 32px; -} -.l-btn { - color: #404040; - background: #fafafa; - background-repeat: repeat-x; - border: 1px solid #d9d9d9; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.l-btn:hover { - background: #eee; - color: #404040; - border: 1px solid #ccc; - filter: none; -} -.l-btn-plain { - background: transparent; - border-width: 0; - filter: none; -} -.l-btn-outline { - border-width: 1px; - border-color: #ccc; - padding: 0; -} -.l-btn-plain:hover { - background: #eee; - color: #404040; - border: 1px solid #ccc; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.l-btn-disabled, -.l-btn-disabled:hover { - opacity: 0.5; - cursor: default; - background: #fafafa; - color: #404040; -} -.l-btn-disabled .l-btn-text, -.l-btn-disabled .l-btn-icon { - filter: alpha(opacity=50); -} -.l-btn-plain-disabled, -.l-btn-plain-disabled:hover { - background: transparent; - filter: alpha(opacity=50); -} -.l-btn-selected, -.l-btn-selected:hover { - background: #00bbee; - filter: none; -} -.l-btn-plain-selected, -.l-btn-plain-selected:hover { - background: #00bbee; -} -.textbox { - position: relative; - border: 1px solid #ddd; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #c4c4c4; - -moz-box-shadow: 0 0 3px 0 #ddd; - -webkit-box-shadow: 0 0 3px 0 #ddd; - box-shadow: 0 0 3px 0 #ddd; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff; -} -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #ffffff; -} -.combo-arrow { - background-color: #f5f5f5; -} -.combo-arrow-hover { - background-color: #eee; -} -.combo-arrow:hover { - background-color: #eee; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #eee; - color: #404040; -} -.combobox-item-selected { - background-color: #00bbee; - color: #fff; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - background: #eee; - color: #404040; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} -.layout { - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - z-index: 0; -} -.layout-panel { - position: absolute; - overflow: hidden; -} -.layout-body { - min-width: 1px; - min-height: 1px; -} -.layout-panel-east, -.layout-panel-west { - z-index: 2; -} -.layout-panel-north, -.layout-panel-south { - z-index: 3; -} -.layout-expand { - position: absolute; - padding: 0px; - font-size: 1px; - cursor: pointer; - z-index: 1; -} -.layout-expand .panel-header, -.layout-expand .panel-body { - background: transparent; - filter: none; - overflow: hidden; -} -.layout-expand .panel-header { - border-bottom-width: 0px; -} -.layout-expand .panel-body { - position: relative; -} -.layout-expand .panel-body .panel-icon { - margin-top: 0; - top: 0; - left: 50%; - margin-left: -8px; -} -.layout-expand-west .panel-header .panel-icon, -.layout-expand-east .panel-header .panel-icon { - display: none; -} -.layout-expand-title { - position: absolute; - top: 0; - left: 21px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.layout-expand-title-up { - position: absolute; - top: 0; - left: 0; - text-align: right; - padding-left: 5px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 0; -} -.layout-expand-with-icon { - top: 18px; -} -.layout-expand .panel-body-noheader .layout-expand-title, -.layout-expand .panel-body-noheader .panel-icon { - top: 5px; -} -.layout-expand .panel-body-noheader .layout-expand-with-icon { - top: 23px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - position: absolute; - font-size: 1px; - display: none; - z-index: 5; -} -.layout-split-proxy-h { - width: 5px; - cursor: e-resize; -} -.layout-split-proxy-v { - height: 5px; - cursor: n-resize; -} -.layout-mask { - position: absolute; - background: #fafafa; - filter: alpha(opacity=10); - opacity: 0.10; - z-index: 4; -} -.layout-button-up { - background: url('images/layout_arrows.png') no-repeat -16px -16px; -} -.layout-button-down { - background: url('images/layout_arrows.png') no-repeat -16px 0; -} -.layout-button-left { - background: url('images/layout_arrows.png') no-repeat 0 0; -} -.layout-button-right { - background: url('images/layout_arrows.png') no-repeat 0 -16px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - background-color: #ccc; -} -.layout-split-north { - border-bottom: 5px solid #ffffff; -} -.layout-split-south { - border-top: 5px solid #ffffff; -} -.layout-split-east { - border-left: 5px solid #ffffff; -} -.layout-split-west { - border-right: 5px solid #ffffff; -} -.layout-expand { - background-color: #f5f5f5; -} -.layout-expand-over { - background-color: #f5f5f5; -} -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 4px 4px 0 0; - -webkit-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 4px 4px; - -webkit-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 4px 4px 0; - -webkit-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #f5f5f5 url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #f5f5f5 url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #eee; - color: #404040; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #000000; -} -.tabs li a.tabs-inner { - color: #000000; - background-color: #f5f5f5; -} -.tabs-header, -.tabs-tool { - background-color: #f5f5f5; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #ddd; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #eee; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #00bbee; - color: #fff; - filter: none; - border-color: #ddd; -} -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ddd; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #ddd; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #ffffff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #fafafa; -} -.datagrid-cell-rownumber { - color: #404040; -} -.datagrid-resize-proxy { - background: #ccc; -} -.datagrid-mask { - background: #eee; -} -.datagrid-mask-msg { - border-color: #ddd; -} -.datagrid-toolbar, -.datagrid-pager { - background: #fafafa; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #eee; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ebebeb; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #404040; - border-collapse: separate; -} -.datagrid-row-alt { - background: #f9f9f9; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #eee; - color: #404040; - cursor: default; -} -.datagrid-row-selected { - background: #00bbee; - color: #fff; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #eee; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #f5f5f5; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #eee; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #f5f5f5; -} -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #fafafa; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ebebeb; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #404040; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ebebeb; -} -.m-list li>a:hover { - background: #eee; - color: #404040; -} -.m-list .m-list-group { - padding: 0 4px; -} -.pagination { - zoom: 1; - padding: 2px; -} -.pagination table { - float: left; - height: 30px; -} -.pagination td { - border: 0; -} -.pagination-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ddd; - border-right: 1px solid #fff; - margin: 3px 1px; -} -.pagination .pagination-num { - border-width: 1px; - border-style: solid; - margin: 0 2px; - padding: 2px; - width: 3em; - height: auto; - text-align: center; - font-size: 14px; -} -.pagination-page-list { - margin: 0px 6px; - padding: 1px 2px; - width: auto; - height: auto; - border-width: 1px; - border-style: solid; -} -.pagination-info { - float: right; - margin: 0 6px; - padding: 0; - height: 30px; - line-height: 30px; - font-size: 14px; -} -.pagination span { - font-size: 14px; -} -.pagination-link .l-btn-text { - box-sizing: border-box; - text-align: center; - margin: 0; - padding: 0 .5em; - width: auto; - min-width: 28px; -} -.pagination-first { - background: url('images/pagination_icons.png') no-repeat 0 center; -} -.pagination-prev { - background: url('images/pagination_icons.png') no-repeat -16px center; -} -.pagination-next { - background: url('images/pagination_icons.png') no-repeat -32px center; -} -.pagination-last { - background: url('images/pagination_icons.png') no-repeat -48px center; -} -.pagination-load { - background: url('images/pagination_icons.png') no-repeat -64px center; -} -.pagination-loading { - background: url('images/loading.gif') no-repeat center center; -} -.pagination-page-list, -.pagination .pagination-num { - border-color: #ddd; -} -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.calendar-body th, -.calendar-menu-month { - color: #8d8d8d; -} -.calendar-day { - color: #404040; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #ddd; -} -.calendar { - border-color: #ddd; -} -.calendar-header { - background: #f5f5f5; -} -.calendar-body, -.calendar-menu { - background: #ffffff; -} -.calendar-body th { - background: #fafafa; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #eee; - color: #404040; -} -.calendar-hover { - border: 1px solid #ccc; - padding: 0; -} -.calendar-selected { - background-color: #00bbee; - color: #fff; - border: 1px solid #00bbee; - padding: 0; -} -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #fafafa; -} -.datebox-button a { - color: #404040; -} -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #f5f5f5; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #404040; - outline-style: none; - background-color: #f5f5f5; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #eee; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #eee; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #f5f5f5; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #f5f5f5; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #f5f5f5; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.progressbar { - border-color: #ddd; -} -.progressbar-text { - color: #404040; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #00bbee; - color: #fff; -} -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #f5f5f5; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 4px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #ddd; - background: #f5f5f5; -} -.slider-rule span { - border-color: #ddd; -} -.slider-rulelabel span { - color: #404040; -} -.menu { - position: absolute; - margin: 0; - padding: 2px; - border-width: 1px; - border-style: solid; - overflow: hidden; -} -.menu-inline { - position: relative; -} -.menu-item { - position: relative; - margin: 0; - padding: 0; - overflow: hidden; - white-space: nowrap; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.menu-text { - height: 20px; - line-height: 20px; - float: left; - padding-left: 28px; -} -.menu-icon { - position: absolute; - width: 16px; - height: 16px; - left: 2px; - top: 50%; - margin-top: -8px; -} -.menu-rightarrow { - position: absolute; - width: 16px; - height: 16px; - right: 0; - top: 50%; - margin-top: -8px; -} -.menu-line { - position: absolute; - left: 26px; - top: 0; - height: 2000px; - font-size: 1px; -} -.menu-sep { - margin: 3px 0px 3px 25px; - font-size: 1px; -} -.menu-noline .menu-line { - display: none; -} -.menu-noline .menu-sep { - margin-left: 0; - margin-right: 0; -} -.menu-active { - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.menu-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); - cursor: default; -} -.menu-text, -.menu-text span { - font-size: 14px; -} -.menu-shadow { - position: absolute; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - background: #fafafa; - -moz-box-shadow: 2px 2px 3px #fafafa; - -webkit-box-shadow: 2px 2px 3px #fafafa; - box-shadow: 2px 2px 3px #fafafa; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.menu-rightarrow { - background: url('images/menu_arrows.png') no-repeat -32px center; -} -.menu-line { - border-left: 1px solid #ddd; - border-right: 1px solid #fff; -} -.menu-sep { - border-top: 1px solid #ddd; - border-bottom: 1px solid #fff; -} -.menu { - background-color: #fff; - border-color: #eee; - color: #404040; -} -.menu-content { - background: #ffffff; -} -.menu-item { - border-color: transparent; - _border-color: #fff; -} -.menu-active { - border-color: #ccc; - color: #404040; - background: #eee; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #404040; -} -.m-btn-downarrow, -.s-btn-downarrow { - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - font-size: 1px; - right: 0; - top: 50%; - margin-top: -8px; -} -.m-btn-active, -.s-btn-active { - background: #eee; - color: #404040; - border: 1px solid #ccc; - filter: none; -} -.m-btn-plain-active, -.s-btn-plain-active { - background: transparent; - padding: 0; - border-width: 1px; - border-style: solid; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.m-btn .l-btn-left .l-btn-text { - margin-right: 20px; -} -.m-btn .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.m-btn .l-btn-icon-right .l-btn-icon { - right: 20px; -} -.m-btn .l-btn-icon-top .l-btn-text { - margin-right: 4px; - margin-bottom: 14px; -} -.m-btn .l-btn-icon-bottom .l-btn-text { - margin-right: 4px; - margin-bottom: 34px; -} -.m-btn .l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 20px; -} -.m-btn .l-btn-icon-top .m-btn-downarrow, -.m-btn .l-btn-icon-bottom .m-btn-downarrow { - top: auto; - bottom: 0px; - left: 50%; - margin-left: -8px; -} -.m-btn-line { - display: inline-block; - position: absolute; - font-size: 1px; - display: none; -} -.m-btn .l-btn-left .m-btn-line { - right: 0; - width: 16px; - height: 500px; - border-style: solid; - border-color: #ccc; - border-width: 0 0 0 1px; -} -.m-btn .l-btn-icon-top .m-btn-line, -.m-btn .l-btn-icon-bottom .m-btn-line { - left: 0; - bottom: 0; - width: 500px; - height: 16px; - border-width: 1px 0 0 0; -} -.m-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 56px; -} -.m-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 50px; -} -.m-btn-downarrow, -.s-btn-downarrow { - background: url('images/menu_arrows.png') no-repeat 0 center; -} -.m-btn-plain-active, -.s-btn-plain-active { - border-color: #ccc; - background-color: #eee; - color: #404040; -} -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #ccc; - border-width: 0 0 0 1px; -} -.messager-body { - padding: 10px 10px 30px 10px; - overflow: auto; -} -.messager-button { - text-align: center; - padding: 5px; -} -.messager-button .l-btn { - width: 70px; -} -.messager-icon { - float: left; - width: 32px; - height: 32px; - margin: 0 10px 10px 0; -} -.messager-error { - background: url('images/messager_icons.png') no-repeat scroll -64px 0; -} -.messager-info { - background: url('images/messager_icons.png') no-repeat scroll 0 0; -} -.messager-question { - background: url('images/messager_icons.png') no-repeat scroll -32px 0; -} -.messager-warning { - background: url('images/messager_icons.png') no-repeat scroll -96px 0; -} -.messager-progress { - padding: 10px; -} -.messager-p-msg { - margin-bottom: 5px; -} -.messager-body .messager-input { - width: 100%; - padding: 4px 0; - outline-style: none; - border: 1px solid #ddd; -} -.window-thinborder .messager-button { - padding-bottom: 8px; -} -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #ddd; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #404040; - border-color: #ddd; -} -.tree-node-hover { - background: #eee; - color: #404040; -} -.tree-node-selected { - background: #00bbee; - color: #fff; -} -.tree-node-hidden { - display: none; -} -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff; - color: #404040; -} -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #ddd; - color: #404040; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #ddd; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #ddd; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #ddd; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #ddd; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #d9d9d9; - border: 1px solid #d9d9d9; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.switchbutton-on { - background: #00bbee; - color: #fff; -} -.switchbutton-off { - background-color: #ffffff; - color: #404040; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 4px 4px 0; - -webkit-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #ffffff; - color: #404040; - border: 1px solid #d9d9d9; - -moz-box-shadow: 0 0 3px 0 #d9d9d9; - -webkit-box-shadow: 0 0 3px 0 #d9d9d9; - box-shadow: 0 0 3px 0 #d9d9d9; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} -.radiobutton { - position: relative; - border: 2px solid #00bbee; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #00bbee; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.checkbox { - position: relative; - border: 2px solid #00bbee; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.checkbox-checked { - border: 0; - background: #00bbee; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #000000; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #000000; -} -.sidemenu .accordion-header:hover { - background: #eee; - color: #000000; -} -.sidemenu .tree-node-hover { - background: #eee; - color: #000000; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #00bbee; - color: #fff; - background: #00bbee; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} -.l-btn { - box-shadow: 0 1px 2px rgba(0,0,0,0.2), 0 1px 1px rgba(0,0,0,0.05); -} -.l-btn:active { - box-shadow: 0 6px 17px 0 rgba(235,235,235,0.3); -} -.l-btn-selected { - box-shadow: 0 1px 2px rgba(89,205,226,0.2), 0 1px 1px rgba(89,205,226,0.05); -} -.l-btn-plain, -.l-btn-disabled, -.l-btn-disabled:active, -.textbox-button { - box-shadow: none; -} -.l-btn-selected, -.l-btn-selected:hover { - background: #00bbee; - color: #fff; -} -.l-btn-plain-selected, -.l-btn-plain-selected:hover { - background: #00bbee; -} -.m-btn-active, -.m-btn-plain-active, -.s-btn-active, -.s-btn-plain-active { - background: #00bbee; - color: #fff; -} -.menu-shadow, -.combo-p { - -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); - -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); - box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); - filter: none; -} -.menu-active { - border-color: transparent; - color: #fff; - background: #00bbee; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #404040; -} -.window { - background-color: #fff; -} -.window-proxy { - border-color: #ccc; -} -.window-shadow { - -moz-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); - -webkit-box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); - box-shadow: 0 7px 8px -4px rgba(0,0,0,0.2), 0 13px 19px 2px rgba(0,0,0,0.14), 0 5px 24px 4px rgba(0,0,0,0.12); - filter: none; -} -.window-mask { - background: #000; -} -.datagrid-header .datagrid-cell, -.datagrid-header .datagrid-cell-group { - color: #666; - font-weight: bold; - filter: alpha(opacity=80); - opacity: 0.80; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-style: solid; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/filebox.css deleted file mode 100644 index c6bac6631..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/filebox.css +++ /dev/null @@ -1,20 +0,0 @@ -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/Thumbs.db b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/Thumbs.db deleted file mode 100755 index 5f257a2a49959543d36e2641d352572547e40e63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35328 zcmeI52|QI>`}ns^Wu7Hd10{saWN1RTQWRxO2$?d=bTp}qsi+Xi6q1?D^PJ3N4ozl9 zhLhp=KfB?*b>Dm6Pw&0&@Avz6-xlAqj&s&p&t7}4^{i*D{p_W=iS}i5`lcb|H$e^| zMDS}H5R$JxCxG`T9|H}7tb;d10Df(4?bC+{0&jnYALtCM!m+N0i%0+YS`tHyUUO1l z0|1v9Ap^((3V;%z0;mC6U=u(GFaX;DMt})m1~vjL04u-^umS7<2fztz2DSiOfo%X6 zumji)NCG^-PJkES1NebmfB+x}2m!)?3?KrC0%CwTAOT1LXxo&Acn=`^`ENOh<$=Ax zK43p^06^3Jw*?Kv7JeMzS|}hk5Zfc?;Y@sgU_yxh(dW_j@~=X(mahm#t)74o679A9 zloGwxej=KSX5U*@DtZtQ4j@KQYa_%8&Vt#ekN&M!8qk9Ou6(rb_@W&R0@{B6 zNJd~Ad{6&J+YfpUzx02!yf6J9)gh=3_|pGTJ%Q?g zKkEMn;X5?HBE(9-AwU^W0aSrs05#w+pbnsEk3y^gXadK8*a7x{1KYG71WEGIDZCDmofUDq1RXavCNYT6zXXMn(#1=8a4Y8|fGr8PGxq z2q6y<@djez4GfgzlnnoNSSv+n*TcATijZI{vW}L3kd|Pr5*60Rd6M2{L$d&2h!5iK#@mfibE=#LtaZna|&z7QO}e%t=^GDeM- z87`62_7^vhF)?ps*~Gnl2hUDkQ894|Nh#?A2Ne{R4k@c>9y_k3ed45!v5Dy!Gjofx z4vtRFF0SX@E?vIjbM@MF-h%hDTn#e)IO-=oohP{oMS*BJRTyS}y{G@Kd$^QM2FFix%p&j);hm zh!m|C!8#X!kd}ye%We|7eMd=+?C7@&Us%tuKR7zQY{NDYjTy$%_AO*gT%tqVShQ*% zYxaE=yZEPS_K%AFTCX02f{*|%9w99Zz^e>Tu}-0Pc686Px|>haoL0}Wrl`q#`$#UE zb7e=5;G*anvOLO1H?8b5@aAAq_$vSI_sVtL1rb3yeiNH8D+`>94VWv4Bj-$%c}ZW} z8ZsRlgQuTlUJk>o&V@9sUQ%B}A}jD8Y-eKrCdn~t-Cx@HKVllN)L7uJQ=dU~-p8K6 zV>ckrUr%rvG>IW-7$?vUj-WMc;4cTz97ga?0KT*MsBJ#!P;?wX4wg*(Q9h$@a-h~0 z;Xm|8*$<*Wgb=!)`s1Ts{PFdN_!@GVwL-s8K8|pVe}weIam%7jw$wX%=7e8w+Y{f$ zvA?ChXr=I0`i$`IvUf^S6!^i#m}Sg>w}iEr`=0SbHb!{?5AQJ@+*8A=sPz6}v2_P) zC3WI}Sm+v(elMcTf25($8GrYo_nv*jo*Olf{8p#dY3;BeVt-0=qpL(OaQ!gW9u{$b% z;O@)C@i1h8Rc-6@>Q+{B>zEVK3IQZ#_q&(2_z1BLdnCKzcR z!iJK})kpZIh2*H2;CD*#=?S;q3EYT!t6664Fs#V5q$6`~cV+(N;E+RI#m|E72U(qy zzE!=R^p<`QO-g%t8>X8u?J7(4vz3x~p47NWQNKN`hpeM>0#09H5@jVNBO#rA=q>*{ z+67ez|2llJ9|~b;{SoX3Flv7G|F8N#YB&Ft@Mq>nfv==m>qsU(gsC*cDKCV}Q znfzVzA9Ri28JYG`F@mJ-OKmq7n?R)Eg1k#p#uK$m0KPqKs zVRJTLa*J%`tjVq(ryIcrFi zYsvHl&6fX(&lQ|ZZ9?0G%VK6 zt5x{pVhF=gg>PV_e7oYNjvvABhD8^yAwkM(NT2QNy~I%~Zu{_11^74 zm=Dv;s|!5q&hm2R^sXUIaCy^}zAF9KGx2K~zGG7)+4r=}>v;AOT$MRO`lp7zkKOjm z_*eSV{{13quE|5t(HtHEvz9$h)vJg1((hn zeH9L@3c~!?Tmp~z2fbDB=uMKiW~f>0$ao}tX-C*sN>V`3uB)V#u z-t1Afu_}9(qmgH7I-M!i1Lp7C^nc3ywft!Qp8f;#w?Bw>7nr}#mNz@k+C^A3H7uR> zUD9bgl$oC8)5B`s$#c|rU)s3`r!c%cgnv#4eChu;U_Ad3>|a)d;HUljmHqo8+dr!B zSKmFxZ_xGM z$j~*!to>9@AeMw{dEb#|?vZYn#*eNc<(?1M5C>SoExws%Op`?FVFZWb$zbC&_{2FKP?`7HP#WJ z_h->|@V)g9gtRw5%m3fLf5-LH{`h=f^2gWTr1<9?mu4U4%Vz}5@}#=-X1>Kg36Rf> z+NWSRtHAi`ePqoRS%#x0*#Fh^`iuT*g8uj;*w34h&3`NV`2y$y)W6^o#Fv39fDdpL zxCUGYd;vee9|!=@^g$5c0D^&=z%Af55CVh(cYwP9nl=pLa3BJ>4@3e{zylx}cnHJ* zXxcc4Wg;3& zk#YmU)?#J_!K)q)(fhJi!0hqrYJ?VK;l zx3&%baEGhs?c2oyOZU~zk|wMahR|HZtJ!5!++@|lJ?vK~9F<700k7;g4MHd)jKWnp3XapGuJSX$^Xo(a81-S-r`AaXGtO zA{!-B3lFoA6!nGR_PJehHT$x|YqXiBja}U14?kWiFw)v-aveG0yV-iy%%<;FHtlgt zU~vlZ;RVczlEsqnHAH0%sXLD;#8|Alz3?-T*UTAsJG;7aXAQ~CD|zbPTrREK|n1{*&dx3lbbZjR#f!hW6l3Z2zUa04 zU`{VadyhKFXg;P&UtXnsUTrI-;mMLfz7%ckyk@FoUY0F_c^9L%s0Qt#p-Fmx2xW6t zS`!||X(wQ8Tumo-iTO!R#rsUvRMaTvWk;?bzQITG;l93^etm`I&dokVzHbWYu?#C5 zZPOmRhQ;%m=fmwRZS5#@$}PHRvo>s<=UE=X2niX@rjeE2u#hntsgn~O(6f*hdzIfA zhp}9ZO0cj@Bp+q;CugzpCnid`w=Lv2Tc{*UwC1C9=8`Fm*-WkF$yCS3*9&C>vYm9_ z=esPINI3tVuL`Piej6y@15iUq1K6WK!uY=)A^%&A|Nq7Me_6wjz=DG`SQJCkk9)6O zeD{N!?CU%JVi%VxP6cl`>YT_}?|t%phPZ;o?T1`-M9ItijY&b-gDYydfEfM8_i|AW zU5l}kyH@EWo(gVzd5Zb81Y6pnvh{Hc1mCyx_OUB`Y5zVyNc(5{Ie+`x%-?=lKJ+k6 zKFhO;fuQk2)9MJ^PX1R@wco1lZ`$wA`yW51|M2er!1@y-v;-yqrYRq%6~Eh1zWVSU zy#M0=BK#kaPY&hL0^ch?7Si^CzD0w`e?UGnl(P}|UioQ|)|CWaAc+14aDna zjEz-E`e!?xXNw+BQ}~GACOPu%07anW*8HWR;vHiPOqs5_>XEbSZBxaP4_I5x5^(i$ zX?Z5MPqIZg#^(|$;TZ>Dfk-}o5l=l`f}7v5!q+H>$2d)|a1LUyW21HP^m_BWvlG?9 z^(&IXN|sM_iW(cAX@zCY?C)}+mhs!zvwzzD#K?|Bv92!aneh{CQ)0FoEz$=}AHt*;iw;g~10{_OLhD zY%bU`-cFYHGU%GK8{=C)(dBWA;H%f26q%0(ynHiST0cLucQi7j+QSPgkms~LSpJd~ zH!VErVO2zjR9!2SaqG^dOiCrt0kKRKP)Y^|W0Y_Tgf*^R@-_%^hIFvfbny z7S~8y5!(IXxVtCkuxv}E0TY(cJ)C9lN^NTUNaw74(nH(U+)@8bd!dK;ZmVT3w_y`W&Di1uYk;!VQR{7@_vKy z^8Ch@wlkTX0tQ1Vrl$rDrWM}1vD4(m@w*q<4^>OeV!E%0O;eoZ*e16-GfF8la)6#( zKREA|md(10x{}5{MM{+e!fn~I2P!(XnBJ@C8n!m|aOq#Lb7wjy9VxuWDfQWVe+nVV z`loIhn*Pof@%LNZQ$$~^itMb?s(v}zmCB(kIu*HCR3i8+!c``S9oJKLgGB!q!w2{| zZQ5j?rSpEmtH-*o)-3N?Ig0J7Ox-9NDcmWuCwd=mohiwECwlMH`^i}mg7tYdhIie% zdZpKpi*vSgdP)wMGX`U#yHlRg6$)Q|?mQh3a;-`7xrm;Ux9!B7ASF>~jc!gsL8NNl zaFj}M*g<};L*37;PQ)6~OUXM97aBN^7ii1Q(NT+&6uZp|9< zMLZv_a@E9p4Vmbe*BjWJbt~5G(HioUdvOh6Nzy#4H9Mz&1k*>gyoUI<8pOyQy0d`6 zMGdL5xyrc=fWv<-)&@Vo{?`bcl+ou~kHfrFySq?Lv}$Mt0>_i-TXrpB}JBe~v#tpFjQG z2W$U_{AcNL3!*3$ius<^(Lc9wRm3jD&4 zOdX9b#&SHksL1!;zPzgvlU6fH?-Vzh-Z$uKsL|MX|3(9)Rw?b>Tb)zAk_NNeJ7hAf z%To+Z+Avg24Y{@RX_A7e)p645i;4PzZ&Zg>m+Q{nITkk1waWXj*e!e^B)mpi!6$l% z#j&4!e|yZJ>Em&KuBQbo)u%GGHArJr-Z`ugIlT|!^w?iAGf{g7&yUqgPkL6+xlxS3 zcq2=-N^cS|8=L1yjaT;D$MuX@yM~!#uXQq)g|yvloqLo8QVIm(>B^-=Id;&C9VUMq zHSh8&TkhGzV%{0j>Ol^Ruq$0J1g6E>voF}hwumK%JbgdRb#Y7Hi&VA*$jtcT`Iz@2N3Cs|T#2q+n1tZvj&ZIWQWcW86aQG<)gXXk}NP7i6_&wDuO=_(Q9EMC^E&Z|xDOjH?^o z{FKWq=q?rCkZXx>^{Gc~ahC!<^oLIb#nz5ii^&#E3{Tyk=*Umqv(SZ=Bc6G4$u8A3 zWv(|qt7STJdBUyZ{;))dnTOZwO4YzEd2=uM6LRl9@H~EgW~3sF`6B;mtZ1DBm7kT% zSeM4eFfkUcDbg)UrH5&&;%rvufRr?X@1YHh5C!k(J(3 z)t+HR$$LU3bnIrg=pFZNt}K_yq9!}+^yLTG!Anj7>xQ*22u}7eM#`6v&nq*p#+`aB zTbdf^wG9_DjHwc&d*LD4lI1r@F+R0pq;d94!+X!UY)=zo4DA8+NJjdXfn3@i^za0N&p;ez# zy(3OSn5o~st*?sTFY?|of6fPwsW*CX<1EaESyS09rAeYV;t0d*oHjIApLF&%?Y6<7MUruH4Plib9hTKlm8ZvXr%+#?ICZmCba|9D85C^{T z)@|h}Jwk#!E+N55D9c|KHw!hzsNkf0i%#ACON6^Hh>9W1~vjLz$SndU<23z4gmHy zK{f+hfUN*3XE(&$z;<8AfNy!0!qLkKp9X0(0so@tOgtg)PW;VVB z5pV*W0T;j(I1ji1?tlm233ve*z#I54zW=|fnYs-dG-))GS?aa5xOqN`u7M-Yct?l> z`;(CK&cVvwDlA*Bw4I~K(|cuNLRPk#T4F(t>0TZh31^A6WgNSP9c_`LzVX0gQJ|

                                                                                                                                                                    NA+ZcC>&vv>@9CR4VtY9M(_F}@-1%;|KR!4iA9GaQ>eBDX}J`#J5%ao~~20i!d=uaWnN2JTaCZc`4~#{=ltA0#Q#aZrz(q zm2=*?xv736TAM|Kl=3M&Bw@D{zAUxk)aE6-BAe5h;+@@bY7J3ppPMZ$$}S~5x2U-o zQjkbmI-tbu1yQUt@EkZA~%UI zDZD8leyDP5!{b&)XQ9#uFDH9gW$d3%xV`jLCJ9x3F0V2d)ngzpp)j-GseibEU`g3< zw}%EUZ+MWvwLm-Q7ya#T)zZw{CR~~&&pg|?W$Qs3suK&ceD9y{sA%;Opo@4M*1u@g znZR5@5PCE*P%q8zm0o(U;?z=6wp(T+e$R@;(;1Fz%BlMdZ+|I1y-SO}lFDmEUy{9g z52kCkf!%6wO6Kj{)_KL<5&Jc^my)u))<)PCMw=Fy$?)Oz3))h2DG<`)a!XVo!GVvb4v6F8sz76QAYsC7a~r9%a{jt!y*OGU7Jj4X z(9=811A`MM28COelk{3Li>H^EEZF?%V6sKoc z$$2S~5*L?H6m`8&-ZV+E;%exYBK1c$50<-9BTR0;Hwh2-4~cS$#zjhB7Gc|3)?u?# z&ZKj+rzassXEGtN$?Lg}?F&4$>rRysInFfp-D?OxUHC&B{m>dxs=L$niP(v`Yb@-P zoq0*t3R+w4@;I-TB788Zcf4sLbJ&xk)O>&zS2P?&?P|MOAo9$~Fd{Z0Uo*|Ef@xM{ zK@}xwS1TG+=i65f^#u9PTfI&dD@b^1@AX*CjbWzaxPi4`=Ae=-PNp|hD%!Rs_`jbA(=v(l-y%-aTAId{wnS->smC-as|g_-m8iYF5Wyx}LxR_Nz03 zJ?v~@?>WPddrf`XS5W|Vo3i=5x1umuDMSF$-N7s%gzirD^}bX_A9t!U`(~G^y^xp~ z%@HN4w`L zny3<+N2lRPO+d<*T_O!(w?1?yEk}@szW#G=QOLa>Kq6_qS0#U&8{LP?7LMHEo0`f% z@(pO7XL?R?;%FZ0kL5c-`Jc`zT1z9SpFQMu`6jP8WFtfK9w)rU4`=D?yy!6+LH(?t zG?Q=64SF?D--$2h_Ul}~e>Tyxg3j2G6`#s>v2W$r!x=JztAL)5-#^NOkdYG2Z9uk( z?>9$@o=b<1dCx#O=&_!IdZJg>@tb4b57|+F2ZUtM_K(XjgSrtTfN6-J)Z3)eZ`dJ_?D@j?u)DxiX`^)@Q4ea?JVf~s0q4|0L z^zU*1bg5v3BzuJV${^j!zG2H0L)|tC7H}k)t#&+yc6{dHq`^nGF=%S6suv5)R&xZ=w;qF ztRy%*-py=vj%lM2(fM+db0=P3dw!UTZ#v!8DnC^7a6GT&IGwNEkuFt>rrt)k?p^A) zq77Lzg(7$qmKg>`Lc<0P4Dg26zaC%E9`}dgH1ux6kDB6>?)h5t{MzS*AV2CMhMb7w zIIZ-l=YGohrT=dKLHaNGPyh43i~sFX>acn>;gG&YJ#kudw#Bq)vU@>8-C3CX*!;)R1mi=YZGeN)Y zn8q+x+d>~iN6KG!6GiPGbX5xJ3$K}0`MSUT)*AWJ|9%wz;mtq&-~TTCZ&iF*fie6| zlpA0Bf*JGfd)MWQ*O2>+4)qW7^PYWB|7}Z0oAW=1FYWi}4>ErI*8Y?F53E1KlH?ld zPL0O@e1`t{6Ioby)Q9th2BE*W13v73@KG)*8x5aI{nxLmAV2uC|M%|y1NmAY|H{Wn zExPYAIt%;r;m_3H8ssy5md^?9&p-E1{~`BJU!EQwoFt9)kh(dpl6ELNh;F~{Y_Ci? zt1e9i@1nzvgM0mHyhVe8v)4;;7|&Q5U|p)@uWzEho|1jv@_5TGv!}O?w-?s&XPq1o zpH*Vaj(akpnxmyHEWYqT>fE`QLfrJS01h+4@3P6C?ml_tRLrUzcRyvz@t%io_%CcH zLF}#`K`1X=dS#dycmeA$L|v64UnZS%$Jv9Kx9M#YgPL3v4eg#9F5wF~!q1c94);yH zcJN8fFC9t~v(L}0XoUGm-pL$!u#>IrRkC!-ga}TQSg^YJ7f0Mc zWVG5}Xq-maTAbB|XL4m-n43|^^;=0>N$Vzta$5=`h?|-q*+A*o{>izW!H0V z96$byUEPfPS&m>)OAbLwdhXSEY2oV2MD{m zjXKE_TQ2IzBpvXKlyV^V59HW(`;=$RYeN%!V^r2aIJUL?t$INqyGT_ip@i1%^w~Fu zTPtoJ9z4z!B3rvT>Kg#u0NO_$arONx5{BjEk#B4Vw--;$spzxt(mJU^fg2CQ5R+S*mHfowhnHb%I1^_ z-bCnMC*Hcgw)P;YR8>#9;~61{m>anf3# zA^mN03Q-4sg&1Y`_VA3``6^4|h1t2GxvT4NN5z>sfi>j2?2JFM(7)(!vL94`Ux2v)>QizF;>+l~1n>c_0@r}+fG^+& z_yYkzAP@xH0D^&=z%Af55CWj(-GTTna1RIr!hs0jJ`f2+0S|y^;2{tL!~$_ZJdgl9 z0uq5F04?(|#3{fNAQeah(t!*h6UYLx0W@tc#7}`dARj0I3IX)HpW)Xt@N@q6AH?@VW)C8=k4+SU=9=WROuEwe9?yh?+j!tCH!;nvoGyk6SNx`&#fe;3+=Qtugt+4b`@0Qz_DXN( zbSt*;Ue~g$RGJ=hodQDcHyZWt2@XC<4h>kg-E2d=mqNlw+k$aqFjMe)Hl^i)Jo6P zWKpwl9}%jhB02W*eWRuKGvlifreaBMa#6y&C3hZEE1Pb9iDy2$C{H9uXCb!{>(qIh zYi2bq$7ia1G)yX*<<#u70&Uv!^~4vd?L{t>;D<&iY_??EM`qPBsCS#r_FBdesxRMkWjb4=R=8e%s%v#*pY^*PKY z_DQTmYI6I$*k?LJhS;~WizudDQfnL97&y=`p46o%&%W{b(Tg49USSKuWkakgv4aiG z|IUE=W&ErJw~(Lnpa1>mzeN5I)*mmzINbcv4G7);;(verGZf_S`n>)r_J1Hh8RUQQ zzy2e;^56OV*U|j@*1x|l`@eYpySm$2OW$V6(p~wW^N|}Iu62EtPRIhwNZ`|P-`OT# zOcu3|7d>vIB9bV*#SAMLP`E#3S7-=PTB%HW0VP*!M$!~dnG*N4ZH%orPMwn;66B;5 z&uSb9JD*1RdC|>?Wxw~(>ME28i@GMWEuqfI!ZEI}G;Qi01J7pqr#T}10q!S$5oK4H z)UTyMx7hxk@ARgirxO}D!etGZEZ-^YbWCO!IWm*$n`L8@HM#G&sRDIc{-Mhk z8LO%HZ(wsU$d1Dmk0@Z-q^YuZ+*^prsh{yC7vdc2Z4a)M{g4_`Vj|exiMg`qGDusf z;A~ih=gF~n!aq_IVxHOXHm!E7n^!i?({*kz$Y6&WU&TV#vUfqYqdB$xa&^awI%8W< z+0g_ol}m*hE7mDdmUoA+4mb6dGt?RT20fUuGUG06H(k#x?O#~jY--H4S}jY!dF9+1 z!cnL@9L3}z64^B5Twt4k3)8*3FI1V9i)p#Ub(?^=&uCYU-E+S2eqE)EE-RCa_Fcw> z**A=aL+s-V4J$DjSAE#I^P7o!OvkpE8!4aIZZa^ z%gxm@t|BT?lOhHg>~}O$`wq?@m$}s(LD7+lcu7mh9>3qu#30y@g2gy5_;0X=(=+DcHH4GWx2uVjWWA#CQ5wk z7Ws8A`{Vat#=k8;%>0q_r~laB!+#9+-=MG5>AO?B_2%=PD!Sc|xM8D#2F=T~LwX+LnXo=$#qqL7p96d&*L^utqX+2&Q^p<&C7x`#Wv zBO~de_)V|f%r}f$A)KxvR19K79@>;Dg zDi{@-lSW#`N>aBq$Z?G~JjVI%;+5z(i^ngFkow#XWS$|N7kkN>_5A(=+?}#82DvR* zrl6sxLs*U|cgE^W410tFud3g*ko(?eEL|e3*xfiN&#ow7C%ei^=m#vq@ZpK-P7d4j zQaa-AJ2)_mDOYUR7I0z7Y+I4X8iE~bD2>XJ8DO|o>Fl-L+tqFCrK($CK z4Z+*%n?moJo@#h5CB=E6foGVa%XcK)SZMxT+uQsIi^CqlK@}#U1zeLwy>dmWYa_m*xmxZ$29_qb#ex1u@^RN`cQ?ne)AygWSYv;_kb1mvXMrSe8;Ik%|A+3|5 z3AbM-w3>4DMl9~8nUN?wwa7T+W?PfOtkgE~*jhBeZr8-izyTUZ-QoRPujobXc!DHJ zD^=~nR1RjTduOY!!)a@mwC|eC-k7cYB&*j?SJRS9_vViCjP@R{lsK+#!v(kxY6Y%%dYhXeg8nww^h5XRu4PXhrR`QT+2#)Av3em{YO-^d^B;cyG14#k z^QZsNkGcQgkG%gJ;jHYV6vK?8V7?t4nPtToFNkWD1WzisM!uNKqyD~G@UK3q=#vWQ zQ>+M;KY8|N@A6MRs;D>o8SsPuecx6A$bvroi7>hy@KOHOpB?qfJNJzbJ1Pa;uMy#i zpt*9Wo&fc6cYq%w@ZLk8oiP0Piaue0K1cDZM<4ox0lLTIALm1T_0K@QuXCZ#3!u9r z{&6llcmm{;=f4Hy{q}#7qfbPj`zro%ZkLbe#OC930^dHrfzB$?=aP}Q%W~g(AR56F T0gjLZeOBaa?|wA#e_!~27*z{8 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/accordion_arrows.png deleted file mode 100755 index b6368d636e2ff36501ff9c6b14f7ce09997f3743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel!K>>V@SoV?_1tQrr|vg#{&FxgXS!5MW?fq8aJ< T>6BX`&@2W|S3j3^P6h?7!oT zn93bYIb9!43Wj)WNz0M)xYl!8U>3_OjRiss3@1j_Zvlb#iD~jUnsR3em#t_3WtUHqj%c^0} zFSrhZpjU$)YHUS-lsMx)nN8pghWK6h!524#*oXjC@NjHF9H1y2K%G?c=lr%4eY%ue zT+7R9Pld<2<$C}OAU0HZIJPqD0RA&Sip042zF(tA4uaUhZ>jL`*HN0POocjDIidNRbTZ#@zvW7@I c5>Ct23v;ttA1D3-v;Y7A07*qoM6N<$f&+eyE&u=k diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/datebox_arrow.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/datebox_arrow.png deleted file mode 100755 index 783c83357fdf90a1c7c024358e1d768b5c09c135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$f|L1?c z_O8;7?=$$OZE)N^=kf)!wu_8{hTkWuP3Lf!{Qqt%*U6B7qRbydZ`F0T{#^CG?%493 zHc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/loading.gif deleted file mode 100755 index 68f01d04813c1f622810864a3aaa04b4a17ac8f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/menu_arrows.png deleted file mode 100755 index b986842e7e4044caed18edbcb4b376a4bb915623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/messager_icons.png deleted file mode 100755 index 62c18c135860351063ebaabe8c0f4df7664b8f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000_$JYFBpo`sqZyU339@ZwM6gi$;Pr>w&6M&T1N3Q$b?ahk3>@EL9`+1-BwzvH4 z=V<*uH!1ee(Sv*K$aVm^9zxbfZU9nZC#eDGVQ*&XXK(qpy{>x2j~_q0QX@ky?B2S$ z`TO_pb_Ho^lHPWf$3SXG3P5TF!a(UIB>)3m?2n~HhFtml`Lhm)4-7>2Cr_RTgV@`) zZDWrM_B#twLv#R=>k(}FC=EbL>?Sq<16=LCHdYi*!X*!q1F0DeKpY^*)!|!SNr;4yl-<@d?s6;P338s2Hlg>#j0uWN8C(aFPJB{e^6h1c5$jHyQsD5--fSz=3o~iS wnLdu+*z}wOVj6h@O#h^}NFFlaV$)<`u-+3C6wY^M3(y`0Pgg&ebxsLQ04X#uG5`Po diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/passwordbox_open.png deleted file mode 100644 index 0f25d535e05b22b406fd72647611aace9cfa6249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C~yxIB_Cl)5eV- z>r;4yl-<@d?s6;P338s2rmQ?!Qz1HW#so#C46Xx7Cq5}K`Svo!h;^q;DRB5^Z?=`` zg<12Qetm(ByO<;&a5^L{7TnL>!KiVsAxlibJl4>NC!c|#Jtt+3rSZgWpp^`su6{1- HoD!M<3i~r2 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/searchbox_button.png deleted file mode 100755 index 6dd1931589b453f6cc9772fd1851d8705d6b6631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/spinner_arrows.png deleted file mode 100755 index b1773c24b20b30318e38c4b84690e3d0010c9c43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4DgeBzU z{E=^QXHHmRmEiEUJ<_jB`NK-}t7{l}8A{FvOK}{T)p$BC>8|6-x-MIXOa{IRh5%#E x$&;(vVs#x>vb(K5c#%QkA)^788{=C>2L8QE5AM%P*8@KmF984m diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tabs_icons.png deleted file mode 100755 index 4dbacce18ec1310d22dc4de8ff895f597b0d61eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq{2L1978H@B_~L*E^hdC;Kq#~ z_8gbJY-45o``Fp;2v4zS5!xHXwo~JmL(T+=yD|FVdQ&MBb@0IQ}mHUIzs diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tagbox_icons.png deleted file mode 100644 index 8ec64360884b3fdb81255ad6074bc08ed183232c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel#i#2V@SoVtb9vwNkrdSr%AfUpK=5(o}_e|{SG6u6f5&Q g4t5*qz9vC-hN^}472i&@1{u%b>FVdQ&MBb@08Zm4@c;k- diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/tree_icons.png deleted file mode 100755 index e9be4f3a9965e49a4e4078f8c53f486d761a7468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/images/validatebox_warning.png deleted file mode 100755 index 2b3d4f05babf3f82b146350e96570fac02075de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/passwordbox.css deleted file mode 100644 index 92c9ce586..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/passwordbox.css +++ /dev/null @@ -1,6 +0,0 @@ -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/progressbar.css deleted file mode 100644 index 3eb2e0bc4..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/progressbar.css +++ /dev/null @@ -1,33 +0,0 @@ -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.progressbar { - border-color: #ddd; -} -.progressbar-text { - color: #404040; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #00bbee; - color: #fff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/propertygrid.css deleted file mode 100644 index 1d7a39211..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/propertygrid.css +++ /dev/null @@ -1,27 +0,0 @@ -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #eee; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #f5f5f5; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #eee; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #f5f5f5; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/radiobutton.css deleted file mode 100644 index 8dda45fd3..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/radiobutton.css +++ /dev/null @@ -1,25 +0,0 @@ -.radiobutton { - position: relative; - border: 2px solid #00bbee; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #00bbee; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/searchbox.css deleted file mode 100644 index 54ad88517..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/searchbox.css +++ /dev/null @@ -1,61 +0,0 @@ -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #f5f5f5; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/sidemenu.css deleted file mode 100644 index cc1a99b61..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/sidemenu.css +++ /dev/null @@ -1,69 +0,0 @@ -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #000000; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #000000; -} -.sidemenu .accordion-header:hover { - background: #eee; - color: #000000; -} -.sidemenu .tree-node-hover { - background: #eee; - color: #000000; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #00bbee; - color: #fff; - background: #00bbee; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/slider.css deleted file mode 100644 index 43658ddbe..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/slider.css +++ /dev/null @@ -1,101 +0,0 @@ -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 4px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #ddd; - background: #f5f5f5; -} -.slider-rule span { - border-color: #ddd; -} -.slider-rulelabel span { - color: #404040; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/spinner.css deleted file mode 100644 index 55580b341..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/spinner.css +++ /dev/null @@ -1,114 +0,0 @@ -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #f5f5f5; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #404040; - outline-style: none; - background-color: #f5f5f5; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #eee; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #eee; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #f5f5f5; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #f5f5f5; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #f5f5f5; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/splitbutton.css deleted file mode 100644 index 2ad86f774..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/splitbutton.css +++ /dev/null @@ -1,12 +0,0 @@ -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #ccc; - border-width: 0 0 0 1px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/switchbutton.css deleted file mode 100644 index 4c628cf40..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/switchbutton.css +++ /dev/null @@ -1,77 +0,0 @@ -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #d9d9d9; - border: 1px solid #d9d9d9; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.switchbutton-on { - background: #00bbee; - color: #fff; -} -.switchbutton-off { - background-color: #ffffff; - color: #404040; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 4px 4px 0; - -webkit-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #ffffff; - color: #404040; - border: 1px solid #d9d9d9; - -moz-box-shadow: 0 0 3px 0 #d9d9d9; - -webkit-box-shadow: 0 0 3px 0 #d9d9d9; - box-shadow: 0 0 3px 0 #d9d9d9; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tabs.css deleted file mode 100644 index a44d914c7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tabs.css +++ /dev/null @@ -1,377 +0,0 @@ -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 4px 4px 0 0; - -webkit-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 4px 4px; - -webkit-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 4px 0 0 4px; - -webkit-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 4px 4px 0; - -webkit-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #f5f5f5 url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #f5f5f5 url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #eee; - color: #404040; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #ffffff; - color: #000000; -} -.tabs li a.tabs-inner { - color: #000000; - background-color: #f5f5f5; -} -.tabs-header, -.tabs-tool { - background-color: #f5f5f5; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #ddd; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #eee; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #ffffff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #ffffff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #ffffff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #ffffff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #00bbee; - color: #fff; - filter: none; - border-color: #ddd; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tagbox.css deleted file mode 100644 index 16ff41475..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tagbox.css +++ /dev/null @@ -1,44 +0,0 @@ -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - background: #eee; - color: #404040; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/textbox.css deleted file mode 100644 index 488e6b7d2..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/textbox.css +++ /dev/null @@ -1,144 +0,0 @@ -.textbox { - position: relative; - border: 1px solid #ddd; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #c4c4c4; - -moz-box-shadow: 0 0 3px 0 #ddd; - -webkit-box-shadow: 0 0 3px 0 #ddd; - box-shadow: 0 0 3px 0 #ddd; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tooltip.css deleted file mode 100644 index a00004879..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tooltip.css +++ /dev/null @@ -1,103 +0,0 @@ -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #ffffff; - border-color: #ddd; - color: #404040; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #ddd; -} -.tooltip-right .tooltip-arrow { - border-right-color: #ffffff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #ddd; -} -.tooltip-left .tooltip-arrow { - border-left-color: #ffffff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #ddd; -} -.tooltip-top .tooltip-arrow { - border-top-color: #ffffff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #ddd; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #ffffff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tree.css deleted file mode 100644 index ccb900b96..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/tree.css +++ /dev/null @@ -1,164 +0,0 @@ -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #ddd; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #ffffff; - color: #404040; - border-color: #ddd; -} -.tree-node-hover { - background: #eee; - color: #404040; -} -.tree-node-selected { - background: #00bbee; - color: #fff; -} -.tree-node-hidden { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/validatebox.css deleted file mode 100644 index 5911752fe..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/validatebox.css +++ /dev/null @@ -1,5 +0,0 @@ -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff; - color: #404040; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/window.css deleted file mode 100644 index 8f1851ec7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/material/window.css +++ /dev/null @@ -1,182 +0,0 @@ -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 4px 4px 4px 4px; - -webkit-border-radius: 4px 4px 4px 4px; - border-radius: 4px 4px 4px 4px; -} -.window-shadow { - background: #fafafa; - -moz-box-shadow: 2px 2px 3px #fafafa; - -webkit-box-shadow: 2px 2px 3px #fafafa; - box-shadow: 2px 2px 3px #fafafa; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #ddd; -} -.window { - background-color: #f5f5f5; -} -.window-proxy { - border: 1px dashed #ddd; -} -.window-proxy-mask, -.window-mask { - background: #eee; -} -.window .panel-footer { - border: 1px solid #ddd; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/accordion.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/accordion.css deleted file mode 100644 index fb9f85e46..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/accordion.css +++ /dev/null @@ -1,89 +0,0 @@ -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #fff; - border-color: #ddd; -} -.accordion .accordion-header { - background: #ffffff; - filter: none; -} -.accordion .accordion-header-selected { - background: #CCE6FF; -} -.accordion .accordion-header-selected .panel-title { - color: #000; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #fff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #ddd; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #fff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #ddd; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #fff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #ddd; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/calendar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/calendar.css deleted file mode 100644 index 3f32d30b6..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/calendar.css +++ /dev/null @@ -1,203 +0,0 @@ -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-body th, -.calendar-menu-month { - color: #919191; -} -.calendar-day { - color: #444; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #ddd; -} -.calendar { - border-color: #ddd; -} -.calendar-header { - background: #ffffff; -} -.calendar-body, -.calendar-menu { - background: #fff; -} -.calendar-body th { - background: #fff; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #E6E6E6; - color: #444; -} -.calendar-hover { - border: 1px solid #ddd; - padding: 0; -} -.calendar-selected { - background-color: #CCE6FF; - color: #000; - border: 1px solid #99cdff; - padding: 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/checkbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/checkbox.css deleted file mode 100644 index 5c8ebdd41..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/checkbox.css +++ /dev/null @@ -1,31 +0,0 @@ -.checkbox { - position: relative; - border: 2px solid #99cdff; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.checkbox-checked { - border: 0; - background: #99cdff; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combo.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combo.css deleted file mode 100644 index 2e8907183..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combo.css +++ /dev/null @@ -1,35 +0,0 @@ -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #fff; -} -.combo-arrow { - background-color: #ffffff; -} -.combo-arrow-hover { - background-color: #E6E6E6; -} -.combo-arrow:hover { - background-color: #E6E6E6; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combobox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combobox.css deleted file mode 100644 index 115192c0e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/combobox.css +++ /dev/null @@ -1,40 +0,0 @@ -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #E6E6E6; - color: #444; -} -.combobox-item-selected { - background-color: #CCE6FF; - color: #000; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datagrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datagrid.css deleted file mode 100644 index 220e6a97a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datagrid.css +++ /dev/null @@ -1,285 +0,0 @@ -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ddd; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #ddd; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #fff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #ffffff; -} -.datagrid-cell-rownumber { - color: #444; -} -.datagrid-resize-proxy { - background: #b3b3b3; -} -.datagrid-mask { - background: #eee; -} -.datagrid-mask-msg { - border-color: #ddd; -} -.datagrid-toolbar, -.datagrid-pager { - background: #fff; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #ddd; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ddd; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #444; - border-collapse: separate; -} -.datagrid-row-alt { - background: #f5f5f5; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #E6E6E6; - color: #444; - cursor: default; -} -.datagrid-row-selected { - background: #CCE6FF; - color: #000; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datalist.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datalist.css deleted file mode 100644 index 8a7f94989..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datalist.css +++ /dev/null @@ -1,95 +0,0 @@ -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #ffffff; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ddd; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #444; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ddd; -} -.m-list li>a:hover { - background: #E6E6E6; - color: #444; -} -.m-list .m-list-group { - padding: 0 4px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datebox.css deleted file mode 100644 index 931b825e1..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/datebox.css +++ /dev/null @@ -1,36 +0,0 @@ -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #fff; -} -.datebox-button a { - color: #777; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/dialog.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/dialog.css deleted file mode 100644 index 373747925..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/dialog.css +++ /dev/null @@ -1,47 +0,0 @@ -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ddd; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #fff; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #ddd #ddd #ddd #ddd; -} -.dialog-button { - border-color: #ddd #ddd #ddd #ddd; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #fff; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/easyui.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/easyui.css deleted file mode 100644 index 7deea709f..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/easyui.css +++ /dev/null @@ -1,3373 +0,0 @@ -.panel { - overflow: hidden; - text-align: left; - margin: 0; - border: 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.panel-header, -.panel-body { - border-width: 1px; - border-style: solid; -} -.panel-header { - padding: 5px; - position: relative; -} -.panel-title { - background: url('images/blank.gif') no-repeat; -} -.panel-header-noborder { - border-width: 0 0 1px 0; -} -.panel-body { - overflow: auto; - border-top-width: 0; - padding: 0; -} -.panel-body-noheader { - border-top-width: 1px; -} -.panel-body-noborder { - border-width: 0px; -} -.panel-body-nobottom { - border-bottom-width: 0; -} -.panel-with-icon { - padding-left: 18px; -} -.panel-icon, -.panel-tool { - position: absolute; - top: 50%; - margin-top: -8px; - height: 16px; - overflow: hidden; -} -.panel-icon { - left: 5px; - width: 16px; -} -.panel-tool { - right: 5px; - width: auto; -} -.panel-tool a { - display: inline-block; - width: 16px; - height: 16px; - opacity: 0.6; - filter: alpha(opacity=60); - margin: 0 0 0 2px; - vertical-align: top; -} -.panel-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - background-color: #E6E6E6; - -moz-border-radius: -2px -2px -2px -2px; - -webkit-border-radius: -2px -2px -2px -2px; - border-radius: -2px -2px -2px -2px; -} -.panel-loading { - padding: 11px 0px 10px 30px; -} -.panel-noscroll { - overflow: hidden; -} -.panel-fit, -.panel-fit body { - height: 100%; - margin: 0; - padding: 0; - border: 0; - overflow: hidden; -} -.panel-loading { - background: url('images/loading.gif') no-repeat 10px 10px; -} -.panel-tool-close { - background: url('images/panel_tools.png') no-repeat -16px 0px; -} -.panel-tool-min { - background: url('images/panel_tools.png') no-repeat 0px 0px; -} -.panel-tool-max { - background: url('images/panel_tools.png') no-repeat 0px -16px; -} -.panel-tool-restore { - background: url('images/panel_tools.png') no-repeat -16px -16px; -} -.panel-tool-collapse { - background: url('images/panel_tools.png') no-repeat -32px 0; -} -.panel-tool-expand { - background: url('images/panel_tools.png') no-repeat -32px -16px; -} -.panel-header, -.panel-body { - border-color: #ddd; -} -.panel-header { - background-color: #ffffff; -} -.panel-body { - background-color: #fff; - color: #444; - font-size: 14px; -} -.panel-title { - font-size: 14px; - font-weight: bold; - color: #777; - height: 20px; - line-height: 20px; -} -.panel-footer { - border: 1px solid #ddd; - overflow: hidden; - background: #fff; -} -.panel-footer-noborder { - border-width: 1px 0 0 0; -} -.panel-hleft, -.panel-hright { - position: relative; -} -.panel-hleft>.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} -.accordion { - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.accordion .accordion-header { - border-width: 0 0 1px; - cursor: pointer; -} -.accordion .accordion-body { - border-width: 0 0 1px; -} -.accordion-noborder { - border-width: 0; -} -.accordion-noborder .accordion-header { - border-width: 0 0 1px; -} -.accordion-noborder .accordion-body { - border-width: 0 0 1px; -} -.accordion-collapse { - background: url('images/accordion_arrows.png') no-repeat 0 0; -} -.accordion-expand { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.accordion { - background: #fff; - border-color: #ddd; -} -.accordion .accordion-header { - background: #ffffff; - filter: none; -} -.accordion .accordion-header-selected { - background: #CCE6FF; -} -.accordion .accordion-header-selected .panel-title { - color: #000; -} -.accordion .panel-last > .accordion-header { - border-bottom-color: #ffffff; -} -.accordion .panel-last > .accordion-body { - border-bottom-color: #fff; -} -.accordion .panel-last > .accordion-header-selected, -.accordion .panel-last > .accordion-header-border { - border-bottom-color: #ddd; -} -.accordion> .panel-hleft { - float: left; -} -.accordion> .panel-hleft>.panel-header { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft> .panel-body { - border-width: 0 1px 0 0; -} -.accordion> .panel-hleft.panel-last > .accordion-header { - border-right-color: #ffffff; -} -.accordion> .panel-hleft.panel-last > .accordion-body { - border-right-color: #fff; -} -.accordion> .panel-hleft.panel-last > .accordion-header-selected, -.accordion> .panel-hleft.panel-last > .accordion-header-border { - border-right-color: #ddd; -} -.accordion> .panel-hright { - float: right; -} -.accordion> .panel-hright>.panel-header { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright> .panel-body { - border-width: 0 0 0 1px; -} -.accordion> .panel-hright.panel-last > .accordion-header { - border-left-color: #ffffff; -} -.accordion> .panel-hright.panel-last > .accordion-body { - border-left-color: #fff; -} -.accordion> .panel-hright.panel-last > .accordion-header-selected, -.accordion> .panel-hright.panel-last > .accordion-header-border { - border-left-color: #ddd; -} -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.window-shadow { - background: #eee; - -moz-box-shadow: 2px 2px 3px #ededed; - -webkit-box-shadow: 2px 2px 3px #ededed; - box-shadow: 2px 2px 3px #ededed; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #ddd; -} -.window { - background-color: #ffffff; -} -.window-proxy { - border: 1px dashed #ddd; -} -.window-proxy-mask, -.window-mask { - background: #eee; -} -.window .panel-footer { - border: 1px solid #ddd; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} -.dialog-content { - overflow: auto; -} -.dialog-toolbar { - position: relative; - padding: 2px 5px; -} -.dialog-tool-separator { - float: left; - height: 24px; - border-left: 1px solid #ddd; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.dialog-button { - position: relative; - top: -1px; - padding: 5px; - text-align: right; -} -.dialog-button .l-btn { - margin-left: 5px; -} -.dialog-toolbar, -.dialog-button { - background: #fff; - border-width: 1px; - border-style: solid; -} -.dialog-toolbar { - border-color: #ddd #ddd #ddd #ddd; -} -.dialog-button { - border-color: #ddd #ddd #ddd #ddd; -} -.window-thinborder .dialog-toolbar { - border-left: transparent; - border-right: transparent; - border-top-color: #fff; -} -.window-thinborder .dialog-button { - top: 0px; - padding: 5px 8px 8px 8px; - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.l-btn { - text-decoration: none; - display: inline-block; - overflow: hidden; - margin: 0; - padding: 0; - cursor: pointer; - outline: none; - text-align: center; - vertical-align: middle; - line-height: normal; -} -.l-btn-plain { - border-width: 0; - padding: 1px; -} -.l-btn-left { - display: inline-block; - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - vertical-align: top; -} -.l-btn-text { - display: inline-block; - vertical-align: top; - width: auto; - line-height: 28px; - font-size: 14px; - padding: 0; - margin: 0 6px; -} -.l-btn-icon { - display: inline-block; - width: 16px; - height: 16px; - line-height: 16px; - position: absolute; - top: 50%; - margin-top: -8px; - font-size: 1px; -} -.l-btn span span .l-btn-empty { - display: inline-block; - margin: 0; - width: 16px; - height: 24px; - font-size: 1px; - vertical-align: top; -} -.l-btn span .l-btn-icon-left { - padding: 0 0 0 20px; - background-position: left center; -} -.l-btn span .l-btn-icon-right { - padding: 0 20px 0 0; - background-position: right center; -} -.l-btn-icon-left .l-btn-text { - margin: 0 6px 0 26px; -} -.l-btn-icon-left .l-btn-icon { - left: 6px; -} -.l-btn-icon-right .l-btn-text { - margin: 0 26px 0 6px; -} -.l-btn-icon-right .l-btn-icon { - right: 6px; -} -.l-btn-icon-top .l-btn-text { - margin: 20px 4px 0 4px; -} -.l-btn-icon-top .l-btn-icon { - top: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-icon-bottom .l-btn-text { - margin: 0 4px 20px 4px; -} -.l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 4px; - left: 50%; - margin: 0 0 0 -8px; -} -.l-btn-left .l-btn-empty { - margin: 0 6px; - width: 16px; -} -.l-btn-plain:hover { - padding: 0; -} -.l-btn-focus { - outline: #0000FF dotted thin; -} -.l-btn-large .l-btn-text { - line-height: 44px; -} -.l-btn-large .l-btn-icon { - width: 32px; - height: 32px; - line-height: 32px; - margin-top: -16px; -} -.l-btn-large .l-btn-icon-left .l-btn-text { - margin-left: 40px; -} -.l-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.l-btn-large .l-btn-icon-top .l-btn-text { - margin-top: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-top .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 36px; - line-height: 24px; - min-width: 32px; -} -.l-btn-large .l-btn-icon-bottom .l-btn-icon { - margin: 0 0 0 -16px; -} -.l-btn-large .l-btn-left .l-btn-empty { - margin: 0 6px; - width: 32px; -} -.l-btn { - color: #777; - background: #ffffff; - background-repeat: repeat-x; - border: 1px solid #dddddd; - background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.l-btn:hover { - background: #E6E6E6; - color: #444; - border: 1px solid #ddd; - filter: none; -} -.l-btn-plain { - background: transparent; - border-width: 0; - filter: none; -} -.l-btn-outline { - border-width: 1px; - border-color: #ddd; - padding: 0; -} -.l-btn-plain:hover { - background: #E6E6E6; - color: #444; - border: 1px solid #ddd; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.l-btn-disabled, -.l-btn-disabled:hover { - opacity: 0.5; - cursor: default; - background: #ffffff; - color: #777; - background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%); - background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0); -} -.l-btn-disabled .l-btn-text, -.l-btn-disabled .l-btn-icon { - filter: alpha(opacity=50); -} -.l-btn-plain-disabled, -.l-btn-plain-disabled:hover { - background: transparent; - filter: alpha(opacity=50); -} -.l-btn-selected, -.l-btn-selected:hover { - background: #ddd; - filter: none; -} -.l-btn-plain-selected, -.l-btn-plain-selected:hover { - background: #ddd; -} -.textbox { - position: relative; - border: 1px solid #ddd; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #c4c4c4; - -moz-box-shadow: 0 0 3px 0 #ddd; - -webkit-box-shadow: 0 0 3px 0 #ddd; - box-shadow: 0 0 3px 0 #ddd; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; -} -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} -.combo-arrow { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.combo-arrow-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.combo-panel { - overflow: auto; -} -.combo-arrow { - background: url('images/combo_arrow.png') no-repeat center center; -} -.combo-panel { - background-color: #fff; -} -.combo-arrow { - background-color: #ffffff; -} -.combo-arrow-hover { - background-color: #E6E6E6; -} -.combo-arrow:hover { - background-color: #E6E6E6; -} -.combo .textbox-icon-disabled:hover { - cursor: default; -} -.combobox-item, -.combobox-group, -.combobox-stick { - font-size: 14px; - padding: 6px 4px; - line-height: 20px; -} -.combobox-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.combobox-gitem { - padding-left: 10px; -} -.combobox-group, -.combobox-stick { - font-weight: bold; -} -.combobox-stick { - position: absolute; - top: 1px; - left: 1px; - right: 1px; - background: inherit; -} -.combobox-item-hover { - background-color: #E6E6E6; - color: #444; -} -.combobox-item-selected { - background-color: #CCE6FF; - color: #000; -} -.combobox-icon { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - margin-right: 2px; -} -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; - background: #E6E6E6; - color: #444; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} -.layout { - position: relative; - overflow: hidden; - margin: 0; - padding: 0; - z-index: 0; -} -.layout-panel { - position: absolute; - overflow: hidden; -} -.layout-body { - min-width: 1px; - min-height: 1px; -} -.layout-panel-east, -.layout-panel-west { - z-index: 2; -} -.layout-panel-north, -.layout-panel-south { - z-index: 3; -} -.layout-expand { - position: absolute; - padding: 0px; - font-size: 1px; - cursor: pointer; - z-index: 1; -} -.layout-expand .panel-header, -.layout-expand .panel-body { - background: transparent; - filter: none; - overflow: hidden; -} -.layout-expand .panel-header { - border-bottom-width: 0px; -} -.layout-expand .panel-body { - position: relative; -} -.layout-expand .panel-body .panel-icon { - margin-top: 0; - top: 0; - left: 50%; - margin-left: -8px; -} -.layout-expand-west .panel-header .panel-icon, -.layout-expand-east .panel-header .panel-icon { - display: none; -} -.layout-expand-title { - position: absolute; - top: 0; - left: 21px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.layout-expand-title-up { - position: absolute; - top: 0; - left: 0; - text-align: right; - padding-left: 5px; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 0; -} -.layout-expand-with-icon { - top: 18px; -} -.layout-expand .panel-body-noheader .layout-expand-title, -.layout-expand .panel-body-noheader .panel-icon { - top: 5px; -} -.layout-expand .panel-body-noheader .layout-expand-with-icon { - top: 23px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - position: absolute; - font-size: 1px; - display: none; - z-index: 5; -} -.layout-split-proxy-h { - width: 5px; - cursor: e-resize; -} -.layout-split-proxy-v { - height: 5px; - cursor: n-resize; -} -.layout-mask { - position: absolute; - background: #fafafa; - filter: alpha(opacity=10); - opacity: 0.10; - z-index: 4; -} -.layout-button-up { - background: url('images/layout_arrows.png') no-repeat -16px -16px; -} -.layout-button-down { - background: url('images/layout_arrows.png') no-repeat -16px 0; -} -.layout-button-left { - background: url('images/layout_arrows.png') no-repeat 0 0; -} -.layout-button-right { - background: url('images/layout_arrows.png') no-repeat 0 -16px; -} -.layout-split-proxy-h, -.layout-split-proxy-v { - background-color: #b3b3b3; -} -.layout-split-north { - border-bottom: 5px solid #fff; -} -.layout-split-south { - border-top: 5px solid #fff; -} -.layout-split-east { - border-left: 5px solid #fff; -} -.layout-split-west { - border-right: 5px solid #fff; -} -.layout-expand { - background-color: #ffffff; -} -.layout-expand-over { - background-color: #ffffff; -} -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 0px 0px 0 0; - -webkit-border-radius: 0px 0px 0 0; - border-radius: 0px 0px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 0px 0px; - -webkit-border-radius: 0 0 0px 0px; - border-radius: 0 0 0px 0px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0px 0 0 0px; - -webkit-border-radius: 0px 0 0 0px; - border-radius: 0px 0 0 0px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 0px 0px 0; - -webkit-border-radius: 0 0px 0px 0; - border-radius: 0 0px 0px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #ffffff url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #ffffff url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #E6E6E6; - color: #444; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #fff; - color: #777; -} -.tabs li a.tabs-inner { - color: #777; - background-color: #ffffff; -} -.tabs-header, -.tabs-tool { - background-color: #ffffff; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #ddd; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #E6E6E6; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #fff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #fff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #fff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #fff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #CCE6FF; - color: #000; - filter: none; - border-color: #ddd; -} -.datagrid .panel-body { - overflow: hidden; - position: relative; -} -.datagrid-view { - position: relative; - overflow: hidden; -} -.datagrid-view1, -.datagrid-view2 { - position: absolute; - overflow: hidden; - top: 0; -} -.datagrid-view1 { - left: 0; -} -.datagrid-view2 { - right: 0; -} -.datagrid-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0.3; - filter: alpha(opacity=30); - display: none; -} -.datagrid-mask-msg { - position: absolute; - top: 50%; - margin-top: -20px; - padding: 10px 5px 10px 30px; - width: auto; - height: 16px; - border-width: 2px; - border-style: solid; - display: none; -} -.datagrid-empty { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 25px; - line-height: 25px; - text-align: center; -} -.datagrid-sort-icon { - padding: 0; - display: none; -} -.datagrid-toolbar { - height: auto; - padding: 1px 2px; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ddd; - border-right: 1px solid #fff; - margin: 2px 1px; -} -.datagrid .datagrid-pager { - display: block; - margin: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.datagrid .datagrid-pager-top { - border-width: 0 0 1px 0; -} -.datagrid-header { - overflow: hidden; - cursor: default; - border-width: 0 0 1px 0; - border-style: solid; -} -.datagrid-header-inner { - float: left; - width: 10000px; -} -.datagrid-header-row, -.datagrid-row { - height: 32px; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-width: 0 1px 1px 0; - border-style: dotted; - margin: 0; - padding: 0; -} -.datagrid-cell, -.datagrid-cell-group, -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - margin: 0; - padding: 0 4px; - white-space: nowrap; - word-wrap: normal; - overflow: hidden; - height: 18px; - line-height: 18px; - font-size: 14px; -} -.datagrid-header .datagrid-cell { - height: auto; -} -.datagrid-header .datagrid-cell span { - font-size: 14px; -} -.datagrid-cell-group { - text-align: center; - text-overflow: ellipsis; -} -.datagrid-header-rownumber, -.datagrid-cell-rownumber { - width: 30px; - text-align: center; - margin: 0; - padding: 0; -} -.datagrid-body { - margin: 0; - padding: 0; - overflow: auto; - zoom: 1; -} -.datagrid-view1 .datagrid-body-inner { - padding-bottom: 20px; -} -.datagrid-view1 .datagrid-body { - overflow: hidden; -} -.datagrid-footer { - overflow: hidden; -} -.datagrid-footer-inner { - border-width: 1px 0 0 0; - border-style: solid; - width: 10000px; - float: left; -} -.datagrid-row-editing .datagrid-cell { - height: auto; -} -.datagrid-header-check, -.datagrid-cell-check { - padding: 0; - width: 27px; - height: 18px; - font-size: 1px; - text-align: center; - overflow: hidden; -} -.datagrid-header-check input, -.datagrid-cell-check input { - margin: 0; - padding: 0; - width: 15px; - height: 18px; -} -.datagrid-resize-proxy { - position: absolute; - width: 1px; - height: 10000px; - top: 0; - cursor: e-resize; - display: none; -} -.datagrid-body .datagrid-editable { - margin: 0; - padding: 0; -} -.datagrid-body .datagrid-editable table { - width: 100%; - height: 100%; -} -.datagrid-body .datagrid-editable td { - border: 0; - margin: 0; - padding: 0; -} -.datagrid-view .datagrid-editable-input { - margin: 0; - padding: 2px 4px; - border: 1px solid #ddd; - font-size: 14px; - outline-style: none; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-view .validatebox-invalid { - border-color: #ffa8a8; -} -.datagrid-sort .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -64px center; -} -.datagrid-sort-desc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat -16px center; -} -.datagrid-sort-asc .datagrid-sort-icon { - display: inline; - padding: 0 13px 0 0; - background: url('images/datagrid_icons.png') no-repeat 0px center; -} -.datagrid-row-collapse { - background: url('images/datagrid_icons.png') no-repeat -48px center; -} -.datagrid-row-expand { - background: url('images/datagrid_icons.png') no-repeat -32px center; -} -.datagrid-mask-msg { - background: #fff url('images/loading.gif') no-repeat scroll 5px center; -} -.datagrid-header, -.datagrid-td-rownumber { - background-color: #ffffff; -} -.datagrid-cell-rownumber { - color: #444; -} -.datagrid-resize-proxy { - background: #b3b3b3; -} -.datagrid-mask { - background: #eee; -} -.datagrid-mask-msg { - border-color: #ddd; -} -.datagrid-toolbar, -.datagrid-pager { - background: #fff; -} -.datagrid-header, -.datagrid-toolbar, -.datagrid-pager, -.datagrid-footer-inner { - border-color: #ddd; -} -.datagrid-header td, -.datagrid-body td, -.datagrid-footer td { - border-color: #ddd; -} -.datagrid-htable, -.datagrid-btable, -.datagrid-ftable { - color: #444; - border-collapse: separate; -} -.datagrid-row-alt { - background: #f5f5f5; -} -.datagrid-row-over, -.datagrid-header td.datagrid-header-over { - background: #E6E6E6; - color: #444; - cursor: default; -} -.datagrid-row-selected { - background: #CCE6FF; - color: #000; -} -.datagrid-row-editing .textbox, -.datagrid-row-editing .textbox-text { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.datagrid-header .datagrid-filter-row td.datagrid-header-over { - background: inherit; -} -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #ddd; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #ffffff; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #ddd; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #ffffff; -} -.datalist .datagrid-header { - border-width: 0; -} -.datalist .datagrid-group, -.m-list .m-list-group { - height: 25px; - line-height: 25px; - font-weight: bold; - overflow: hidden; - background-color: #ffffff; - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ddd; -} -.datalist .datagrid-group-expander { - display: none; -} -.datalist .datagrid-group-title { - padding: 0 4px; -} -.datalist .datagrid-btable { - width: 100%; - table-layout: fixed; -} -.datalist .datagrid-row td { - border-style: solid; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-width: 0; -} -.datalist-lines .datagrid-row td { - border-bottom-width: 1px; -} -.datalist .datagrid-cell, -.m-list li { - width: auto; - height: auto; - padding: 2px 4px; - line-height: 18px; - position: relative; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link, -.m-list li>a { - display: block; - position: relative; - cursor: pointer; - color: #444; - text-decoration: none; - overflow: hidden; - margin: -2px -4px; - padding: 2px 4px; - padding-right: 16px; - line-height: 18px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.datalist-link::after, -.m-list li>a::after { - position: absolute; - display: block; - width: 8px; - height: 8px; - content: ''; - right: 6px; - top: 50%; - margin-top: -4px; - border-style: solid; - border-width: 1px 1px 0 0; - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.m-list { - margin: 0; - padding: 0; - list-style: none; -} -.m-list li { - border-style: solid; - border-width: 0 0 1px 0; - border-color: #ddd; -} -.m-list li>a:hover { - background: #E6E6E6; - color: #444; -} -.m-list .m-list-group { - padding: 0 4px; -} -.pagination { - zoom: 1; - padding: 2px; -} -.pagination table { - float: left; - height: 30px; -} -.pagination td { - border: 0; -} -.pagination-btn-separator { - float: left; - height: 24px; - border-left: 1px solid #ddd; - border-right: 1px solid #fff; - margin: 3px 1px; -} -.pagination .pagination-num { - border-width: 1px; - border-style: solid; - margin: 0 2px; - padding: 2px; - width: 3em; - height: auto; - text-align: center; - font-size: 14px; -} -.pagination-page-list { - margin: 0px 6px; - padding: 1px 2px; - width: auto; - height: auto; - border-width: 1px; - border-style: solid; -} -.pagination-info { - float: right; - margin: 0 6px; - padding: 0; - height: 30px; - line-height: 30px; - font-size: 14px; -} -.pagination span { - font-size: 14px; -} -.pagination-link .l-btn-text { - box-sizing: border-box; - text-align: center; - margin: 0; - padding: 0 .5em; - width: auto; - min-width: 28px; -} -.pagination-first { - background: url('images/pagination_icons.png') no-repeat 0 center; -} -.pagination-prev { - background: url('images/pagination_icons.png') no-repeat -16px center; -} -.pagination-next { - background: url('images/pagination_icons.png') no-repeat -32px center; -} -.pagination-last { - background: url('images/pagination_icons.png') no-repeat -48px center; -} -.pagination-load { - background: url('images/pagination_icons.png') no-repeat -64px center; -} -.pagination-loading { - background: url('images/loading.gif') no-repeat center center; -} -.pagination-page-list, -.pagination .pagination-num { - border-color: #ddd; -} -.calendar { - border-width: 1px; - border-style: solid; - padding: 1px; - overflow: hidden; -} -.calendar table { - table-layout: fixed; - border-collapse: separate; - font-size: 14px; - width: 100%; - height: 100%; -} -.calendar table td, -.calendar table th { - font-size: 14px; -} -.calendar-noborder { - border: 0; -} -.calendar-header { - position: relative; - height: 28px; -} -.calendar-title { - text-align: center; - height: 28px; -} -.calendar-title span { - position: relative; - display: inline-block; - top: 0px; - padding: 0 3px; - height: 28px; - line-height: 28px; - font-size: 14px; - cursor: pointer; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-prevmonth, -.calendar-nextmonth, -.calendar-prevyear, -.calendar-nextyear { - position: absolute; - top: 50%; - margin-top: -8px; - width: 16px; - height: 16px; - cursor: pointer; - font-size: 1px; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-prevmonth { - left: 20px; - background: url('images/calendar_arrows.png') no-repeat -16px 0; -} -.calendar-nextmonth { - right: 20px; - background: url('images/calendar_arrows.png') no-repeat -32px 0; -} -.calendar-prevyear { - left: 3px; - background: url('images/calendar_arrows.png') no-repeat 0px 0; -} -.calendar-nextyear { - right: 3px; - background: url('images/calendar_arrows.png') no-repeat -48px 0; -} -.calendar-body { - position: relative; -} -.calendar-body th, -.calendar-body td { - text-align: center; -} -.calendar-day { - border: 0; - padding: 1px; - cursor: pointer; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-other-month { - opacity: 0.3; - filter: alpha(opacity=30); -} -.calendar-disabled { - opacity: 0.6; - filter: alpha(opacity=60); - cursor: default; -} -.calendar-menu { - position: absolute; - top: 0; - left: 0; - width: 180px; - height: 150px; - padding: 5px; - font-size: 14px; - display: none; - overflow: hidden; -} -.calendar-menu-year-inner { - text-align: center; - padding-bottom: 5px; -} -.calendar-menu-year { - width: 80px; - line-height: 26px; - text-align: center; - border-width: 1px; - border-style: solid; - outline-style: none; - resize: none; - margin: 0; - padding: 0; - font-weight: bold; - font-size: 14px; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-menu-prev, -.calendar-menu-next { - display: inline-block; - width: 25px; - height: 28px; - vertical-align: top; - cursor: pointer; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-menu-prev { - margin-right: 10px; - background: url('images/calendar_arrows.png') no-repeat 5px center; -} -.calendar-menu-next { - margin-left: 10px; - background: url('images/calendar_arrows.png') no-repeat -44px center; -} -.calendar-menu-month { - text-align: center; - cursor: pointer; - font-weight: bold; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.calendar-body th, -.calendar-menu-month { - color: #919191; -} -.calendar-day { - color: #444; -} -.calendar-sunday { - color: #CC2222; -} -.calendar-saturday { - color: #00ee00; -} -.calendar-today { - color: #0000ff; -} -.calendar-menu-year { - border-color: #ddd; -} -.calendar { - border-color: #ddd; -} -.calendar-header { - background: #ffffff; -} -.calendar-body, -.calendar-menu { - background: #fff; -} -.calendar-body th { - background: #fff; - padding: 4px 0; -} -.calendar-hover, -.calendar-nav-hover, -.calendar-menu-hover { - background-color: #E6E6E6; - color: #444; -} -.calendar-hover { - border: 1px solid #ddd; - padding: 0; -} -.calendar-selected { - background-color: #CCE6FF; - color: #000; - border: 1px solid #99cdff; - padding: 0; -} -.datebox-calendar-inner { - height: 250px; -} -.datebox-button { - padding: 4px 0; - text-align: center; -} -.datebox-button a { - line-height: 22px; - font-size: 14px; - font-weight: bold; - text-decoration: none; - opacity: 0.6; - filter: alpha(opacity=60); -} -.datebox-button a:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.datebox-current, -.datebox-close { - float: left; -} -.datebox-close { - float: right; -} -.datebox .combo-arrow { - background-image: url('images/datebox_arrow.png'); - background-position: center center; -} -.datebox-button { - background-color: #fff; -} -.datebox-button a { - color: #777; -} -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #ffffff; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #777; - outline-style: none; - background-color: #ffffff; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #E6E6E6; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #E6E6E6; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #ffffff; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #ffffff; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #ffffff; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 0px 0 0 0px; - -webkit-border-radius: 0px 0 0 0px; - border-radius: 0px 0 0 0px; -} -.progressbar { - border-color: #ddd; -} -.progressbar-text { - color: #444; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #CCE6FF; - color: #000; -} -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #ffffff; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 0px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #ddd; - background: #ffffff; -} -.slider-rule span { - border-color: #ddd; -} -.slider-rulelabel span { - color: #444; -} -.menu { - position: absolute; - margin: 0; - padding: 2px; - border-width: 1px; - border-style: solid; - overflow: hidden; -} -.menu-inline { - position: relative; -} -.menu-item { - position: relative; - margin: 0; - padding: 0; - overflow: hidden; - white-space: nowrap; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.menu-text { - height: 20px; - line-height: 20px; - float: left; - padding-left: 28px; -} -.menu-icon { - position: absolute; - width: 16px; - height: 16px; - left: 2px; - top: 50%; - margin-top: -8px; -} -.menu-rightarrow { - position: absolute; - width: 16px; - height: 16px; - right: 0; - top: 50%; - margin-top: -8px; -} -.menu-line { - position: absolute; - left: 26px; - top: 0; - height: 2000px; - font-size: 1px; -} -.menu-sep { - margin: 3px 0px 3px 25px; - font-size: 1px; -} -.menu-noline .menu-line { - display: none; -} -.menu-noline .menu-sep { - margin-left: 0; - margin-right: 0; -} -.menu-active { - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.menu-item-disabled { - opacity: 0.5; - filter: alpha(opacity=50); - cursor: default; -} -.menu-text, -.menu-text span { - font-size: 14px; -} -.menu-shadow { - position: absolute; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; - background: #eee; - -moz-box-shadow: 2px 2px 3px #ededed; - -webkit-box-shadow: 2px 2px 3px #ededed; - box-shadow: 2px 2px 3px #ededed; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.menu-rightarrow { - background: url('images/menu_arrows.png') no-repeat -32px center; -} -.menu-line { - border-left: 1px solid #ddd; - border-right: 1px solid #fff; -} -.menu-sep { - border-top: 1px solid #ddd; - border-bottom: 1px solid #fff; -} -.menu { - background-color: #ffffff; - border-color: #ddd; - color: #444; -} -.menu-content { - background: #fff; -} -.menu-item { - border-color: transparent; - _border-color: #ffffff; -} -.menu-active { - border-color: #ddd; - color: #444; - background: #E6E6E6; -} -.menu-active-disabled { - border-color: transparent; - background: transparent; - color: #444; -} -.m-btn-downarrow, -.s-btn-downarrow { - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - font-size: 1px; - right: 0; - top: 50%; - margin-top: -8px; -} -.m-btn-active, -.s-btn-active { - background: #E6E6E6; - color: #444; - border: 1px solid #ddd; - filter: none; -} -.m-btn-plain-active, -.s-btn-plain-active { - background: transparent; - padding: 0; - border-width: 1px; - border-style: solid; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.m-btn .l-btn-left .l-btn-text { - margin-right: 20px; -} -.m-btn .l-btn-icon-right .l-btn-text { - margin-right: 40px; -} -.m-btn .l-btn-icon-right .l-btn-icon { - right: 20px; -} -.m-btn .l-btn-icon-top .l-btn-text { - margin-right: 4px; - margin-bottom: 14px; -} -.m-btn .l-btn-icon-bottom .l-btn-text { - margin-right: 4px; - margin-bottom: 34px; -} -.m-btn .l-btn-icon-bottom .l-btn-icon { - top: auto; - bottom: 20px; -} -.m-btn .l-btn-icon-top .m-btn-downarrow, -.m-btn .l-btn-icon-bottom .m-btn-downarrow { - top: auto; - bottom: 0px; - left: 50%; - margin-left: -8px; -} -.m-btn-line { - display: inline-block; - position: absolute; - font-size: 1px; - display: none; -} -.m-btn .l-btn-left .m-btn-line { - right: 0; - width: 16px; - height: 500px; - border-style: solid; - border-color: #b3b3b3; - border-width: 0 0 0 1px; -} -.m-btn .l-btn-icon-top .m-btn-line, -.m-btn .l-btn-icon-bottom .m-btn-line { - left: 0; - bottom: 0; - width: 500px; - height: 16px; - border-width: 1px 0 0 0; -} -.m-btn-large .l-btn-icon-right .l-btn-text { - margin-right: 56px; -} -.m-btn-large .l-btn-icon-bottom .l-btn-text { - margin-bottom: 50px; -} -.m-btn-downarrow, -.s-btn-downarrow { - background: url('images/menu_arrows.png') no-repeat 0 center; -} -.m-btn-plain-active, -.s-btn-plain-active { - border-color: #ddd; - background-color: #E6E6E6; - color: #444; -} -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #b3b3b3; - border-width: 0 0 0 1px; -} -.messager-body { - padding: 10px 10px 30px 10px; - overflow: auto; -} -.messager-button { - text-align: center; - padding: 5px; -} -.messager-button .l-btn { - width: 70px; -} -.messager-icon { - float: left; - width: 32px; - height: 32px; - margin: 0 10px 10px 0; -} -.messager-error { - background: url('images/messager_icons.png') no-repeat scroll -64px 0; -} -.messager-info { - background: url('images/messager_icons.png') no-repeat scroll 0 0; -} -.messager-question { - background: url('images/messager_icons.png') no-repeat scroll -32px 0; -} -.messager-warning { - background: url('images/messager_icons.png') no-repeat scroll -96px 0; -} -.messager-progress { - padding: 10px; -} -.messager-p-msg { - margin-bottom: 5px; -} -.messager-body .messager-input { - width: 100%; - padding: 4px 0; - outline-style: none; - border: 1px solid #ddd; -} -.window-thinborder .messager-button { - padding-bottom: 8px; -} -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #ddd; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #fff; - color: #444; - border-color: #ddd; -} -.tree-node-hover { - background: #E6E6E6; - color: #444; -} -.tree-node-selected { - background: #CCE6FF; - color: #000; -} -.tree-node-hidden { - display: none; -} -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #fff; - border-color: #ddd; - color: #444; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #ddd; -} -.tooltip-right .tooltip-arrow { - border-right-color: #fff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #ddd; -} -.tooltip-left .tooltip-arrow { - border-left-color: #fff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #ddd; -} -.tooltip-top .tooltip-arrow { - border-top-color: #fff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #ddd; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #fff; -} -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #dddddd; - border: 1px solid #dddddd; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.switchbutton-on { - background: #CCE6FF; - color: #000; -} -.switchbutton-off { - background-color: #fff; - color: #444; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 0px 0 0 0px; - -webkit-border-radius: 0px 0 0 0px; - border-radius: 0px 0 0 0px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 0px 0px 0; - -webkit-border-radius: 0 0px 0px 0; - border-radius: 0 0px 0px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #fff; - color: #444; - border: 1px solid #dddddd; - -moz-box-shadow: 0 0 3px 0 #dddddd; - -webkit-box-shadow: 0 0 3px 0 #dddddd; - box-shadow: 0 0 3px 0 #dddddd; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} -.radiobutton { - position: relative; - border: 2px solid #99cdff; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #99cdff; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.checkbox { - position: relative; - border: 2px solid #99cdff; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.checkbox-checked { - border: 0; - background: #99cdff; -} -.checkbox-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} -.checkbox path { - stroke-width: 2px; -} -.checkbox-disabled { - opacity: 0.6; -} -.checkbox-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #777; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #777; -} -.sidemenu .accordion-header:hover { - background: #E6E6E6; - color: #777; -} -.sidemenu .tree-node-hover { - background: #E6E6E6; - color: #777; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #99cdff; - color: #000; - background: #CCE6FF; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/filebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/filebox.css deleted file mode 100644 index c6bac6631..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/filebox.css +++ /dev/null @@ -1,20 +0,0 @@ -.filebox .textbox-value { - vertical-align: top; - position: absolute; - top: 0; - left: -5000px; -} -.filebox-label { - display: inline-block; - position: absolute; - width: 100%; - height: 100%; - cursor: pointer; - left: 0; - top: 0; - z-index: 10; - background: url('images/blank.gif') no-repeat; -} -.l-btn-disabled .filebox-label { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/accordion_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/accordion_arrows.png deleted file mode 100755 index 720835f69c96c17ec32a20b03ac9753aa59b7f4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYeRK2H*V@SoVUT_Y-nKxaI`{RC0WjSLJ&w^R(C-|JQTojLXc1&{d*_z{$ jW+oTMdQ(F|jDg|L>K${_)^zO#I)%a0)z4*}Q$iB}_fAN- diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/blank.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/blank.gif deleted file mode 100755 index 1d11fa9ada9e93505b3d736acb204083f45d5fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/calendar_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/calendar_arrows.png deleted file mode 100755 index 430c4ad685b8c0068ecb7e3cbef74f493a84ad0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQYD@)jv*Dd-cCEn)nLHm{QbZE z+q@uWwandfr?Jb4eDYYmB3UAt=OO2Vt+MMT&+KD%&6hZDt!FBpej;sEpMN69^tKl% zp6y<4_lG^P z=;=eQ4Vs74-2)Ua&f1tcVdk$#{GPKe@&?ZMHmT&SMw?IV&w7)}ixLbB3d$Zg{&KGb P8OPx1>gTe~DWM4fp>5!O@Gl{c zHXr?)EMpjkiI0?0nVI4ps;W|uWCd!b5UAxPD-onMP4mgv0vV&Ul|KA@T-G#0QTd(IpSp7SIAsd;)#A=FjzgW9D>i*LbaNyX|0kF(mrr z;o92b6Zp@36nqs7kw}pT2qBaieQ3N+owvm{e=N(DufonR5DseQ_ISSW8dV0M=To{w zToOt35OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fRl}UZ@-Co%Cq`k{wEj}Dr>ShP9AQ|IKKA30{ejJboVoF`C-z@6mZMY&%Wiz%6S}#zb4u?o?9Mi=ECopVxzz+sNviAA!DK)mm8xe zgY9ZT9jlddc^&y2^u9XqDeU4{8s^AS#8C7TXsxEJW@uLu(3Whc35-X6v}jEgEb{G` z!{)$uKzw<~%0A6PhNHYfSuTvOzD8LpPF>PVr=&QqGC936QlPgc6j2;SWMDuL>F^vlqEUI{oOgO!xNf*11TukM z6kTZ3V2qd3<~<$H&Lrt?SpXUxF5Zb^}(={r!EHE+$QMdH|XZ zSYbMyc0tQc3qbP$tG{U_Jyg>I(0srOscEGU?-T)4AzuS$_2J>6`+BJ50YDY<^>2vV z+uI880P2ui(hyHiPrK$)CkbHg=kD&V3^8pD z0v3QOB&8eT@87?rgaGPrb#+ySxU;jP=nkL`nZ_{0e*BD+1Tc5b&d$oLo}8R$90gF1 z^ij>~#>R%HIRNUB_kgpQ+Lg!80Gbb2saY8>1EBeUm7A3TegK*dSciv)Wqp0!h-3im z1+1f^qq4iZ+ZEMUS63~e0I+zh`2rwd0l@!F(!7sM%_`|&0+*B!z{1(u+A9BIU&~T- z2he=L>dmc7TLXZFkeTeCHMcE|qX51{z>0ZC=xGjss*FaXGOMX+dHf8Z8hL6ntGQ_z zF9V<&dwY9jh`D7czyqj4g3S=~)zFA!0980RI4DC*Ez1%L09D8%=OHF&S@Q*;3bRfe zeL2-ZzyeT(Av4`$>R3`j096>WH7BOELD3yR70%Dk%Mk4)1W=73OH{L_UgIc$YFu7k zmRaq`&NxK?Rk*skDzlhL4IV!OsLJ*Ab@{BRT^TO}pgQC6xO~R6G8o_oU?C)>`xlc2 zriH~zU-;g$PyPA_&X!OBSU6SIeB~eKNAhF&(fs&F|1n9<+Yj^2T+4Dj%UFjr zZ%rnX^7Qmn0ANwP308gILtaQfK0Z1j0Br`Wq<=~Ka+?BxW&>7kRtZ+q>C~wJXg6S` zW|cJ1%?d#C0V@Ue)T{uY>425ig?tTsczEc(0+M8_c7^t|!sm-1Nw(}#nnLr?FgGlc zY}ut0+w(d)Uk6FDWtY;*aCdjteIX>tmhA#o+8PqHNU~+SlrTfyKRaNHBx~Ch-FJ3& z%B(Y&NwStp{rH$6Yj{YqhR=Gk~Mtw_&K$#yeTBf z7JV~bCN(VwL$c|B^>Topn-X{+7;S!yV~2^ zBgv-iMkME}U;-COwrsbABDvwg!2wA&ZMWttf5^jTl5E*7V41=|@=Hu>NJ^O8(7b4p z&ChgC(LF5>Md#{+4LgS{%KA|H(Xv`l4P^KdiBKB*_;1&m|Q7!{|O$ k%vVK{T!hwqk^D0L0mO==@4IV9lK=n!07*qoM6N<$f|Ge;n*aa+ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/loading.gif b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/loading.gif deleted file mode 100755 index 68f01d04813c1f622810864a3aaa04b4a17ac8f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/menu_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/menu_arrows.png deleted file mode 100755 index b986842e7e4044caed18edbcb4b376a4bb915623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQt6&9jv*Dd-cB{-J7B=U{PTZ! zWrKV9%Z3|Wt5t$(gq+#d+-OocB$0fsr9DfRx52vPhSu$$+yXuy+69hDZ54DDTxx#r zL7>-12UT01v)>tZ+;HI4pDNf?@KK~EC$@35ykmXyu^HJF3})N>8P9Uwo&~g$!PC{x JWt~$(697!FIeGv9 diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/messager_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/messager_icons.png deleted file mode 100755 index 62c18c135860351063ebaabe8c0f4df7664b8f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6116 zcmV4ipNH~GQlZq-E3cpkxw(Z%$u2@caXAbn6(}n&uLHV9 zeNxi1kd>9kQ0nnzI23^L1q<=Vn6aoDF%s3ohok!Aj~SQ$`x!2NI~x~v?M6;^e!bq; z(yQQH2Fglz{=N4)aWWYxXLE7&Y9;>o<2T&6UWHrL)n-B0%fq!al> zED?O^kKb{*@(M0j-NawFs_P!l&x5Wsy=;C-LD_2Cr$+B z%mHj|RV-S>@98`V;?`TeQT5tuFpQgkwCK3MjU2=Ia8%!VQb0jfRbQMvlUu*{%FZul z*Gp2(5g!~LhrI`mu{iYSiF~~fJP$_Teq5hp&=D_4mPFqP)bF>;RV)Phj>y;)76J+C zUjBw+Pw%?KuU!kcxdHC(DyU88NC?xX1EWWCB9IU&+qOmg-0x8T&d*0>rGgt(3JZV` z7xx@CtUvnT_d1tvz-bZnB^NHR<4wtx=sSGAxY^r`hVB1rRv?$E{$x-)Fe)8~L+|Ve z8TE$qMNB?9`ff-!hq5cTSOiouf@3of6c&HiX+Tkb>(y78OeU5Hc51fL8ag5}E(J=lGyh8qk97Jwwr6mcmOH~pcs z{ZYUk%0meJKHGY(VY!oZsN-8;rXppImH-+?cddEOU*=taVXX;1q%Fey7;& z=F;GN`DHE%p{KIp=N}~EGW)jwq>8E2jpVcQiF_iN1Rx<@uay8vKKIuIK*@ogJy`^a z0>?s*qkihX!oW2vA%Lks^tHgk(n>$?n(v1DeuGaLGNswE5g^zn9vsnZ=+2`u~kwiWv5INS=`Im31M-s&s z-}^v$ei>dK=80EE?t#*7E|jOg#1pUDVA6I6BVh~Q_RMc9eR2NFSf$s`mND7aK61aPaJ z5P-G7v&M2TV894Wn6&-g?~!z-5ZO6-T=(_lOX3N1UJ|=9Y~k#Sf1$^4XDFTK zKavmknc%QWrF1UzurWAT;hF;pwys%aN|lN9t4v6QQaBU zS5*NV4|)cVJ@Gx_V$*R?b)RBAH}{+|t|g(ej#Hb+(>q)CF-N}Pat&l35&+?3W;twr zaKY)M49MuG5j)2}x&NjK`7{6&Mkn^+G(et*~p*dI{2}J5cUA{+ySJtu!-Wub{*IoTnIRRJzA_boPa3iM!eI`%biy*%z zx!^MPg{Ncd{xJCZ_!&z=CKKf)NQp?k53cKm9b;KhYfSyFBhm0Qvd(knXR(q!+^N2}jUepB8y!+?z(Z6v8xHFLZcgCSDn^0@g!T;>n&iP+APZ zPg_IP0iQ-bk(_<8+6X#NpHD8n#UeOxG7n$Ou;+CGa->lJCZwBU>Z%ZQ9_EYQGvYCS zb3D7-!6U9l03sP)8tlqM6Y=DFf)qhg@t-&tl?mTt$=K|&4KdO2ssOrnV*yYC$k^T? z>i(g#XHhMLPB>9ez#`BSFWW@^tj|7U@@0R|j0_x~JsVZco1;Jof!u#eAW|g7Ga*Nk(3#}L2*uv`@K9{&}TI~0z=_*swgh0B6#=RPcd`WU8ca1@C3C4Xf;|N;j%3S zuzE)f8og=@<*`NT44|U}l%_WL!TAIWz?67GYMBayCIBh{At^<8qrVLg2m_;1xCBs* z){`$ITn{2MIK2{)IaS=I{$m#H<>-I-%`Gf~&ld+7`w~)1YeYcpu=G+EfYbK9@E3Le zTv!x4lLerQ?ToL!LU>*tt_XigQt3UV0uf%Sk)I;kKa3fR-NN;HJRTih$V#{EP(p{dec9If%ipss2u&;)R3Pe-(DwG64LS-2|!M8&5gtGKdG z{gyGVujhn+eCPz_g^fHDpy}YkEwQx(AW7GQu95qRd_o87(XiX-iGZ*KL?mXi08ELe z*eBxT(Nqu=^=<*Y}O2!g82BRO<4eh z4dT0J%&@tuWn*%GQCjWVuR8xJST%TG9RH1>Z@;3g42pr_MO7&8z4IC7&G)-I0ffe6 zFgYXueeI?r5lZcxOE8LH(AT@vbpV|JC?WLZliTG{w&TuMBQWti3!qKcPw}JuPF|p) zGC%_~B2^MDT`SwBpld7KQ=t4~DXhnbV|~Ci#GkKA{HYQ!s7=@P0$93iCA*Z|$tfTP zag`E}Kdw5we}ANwm)8Vsp5b0`HCAVpaguNB+Z!blGMC$|yo_vH%ED0F(ff4kK{&9sYfS;V*G5?3fNcv|lj%5-7MRnPePcq242Ccp) zzWsI`5l~zI-WdC077_o@Lo5IyULrya6p8%9k30f@an1UL7ep=hzAZUr=a#7M&l2Qb z{XgT#|MS7k#OJ!A!y^MZ1w7V0X`B(z0@0sEY6^7gJ|0V#@4vkOypP22QZ232S*qU> zJfO2609oVdA5Bh=)Bf@Lc4Ss14ksAkbFvUtua0B^?D;j0#{qF!6}KhZ6f_o~nm>MZ zjIq8;!Yv^p=Q;~uTRd}h;G-O1walZw-WIZGUf>h@4d$&FeO|sh`a#>c#$t_U@kQ72=fM+rE-HrH<^^{E3Y-o_=W-Rc@o5r~Wy${K)P5kXZi9z=#_kZW$g~^krVUL#&j)}paQ3OPoF1GdL6N!Fyb||}c z&1?e1I5}}2OQ6`_C&+hi)QD4n1h9U+qeWs$Qd+S9IR1&yvc`ZG?L_p8tvh4d=palS z+Cz0ekzb^xfDpmWJXI9VYhJ_iudKAZWlVE%uM-(8g2S=-OroB6>1Y|_G!8H)06H(p z4lPvM!MV4%O~<{l7x+FK52vA1pBd=+?@2rjq#3{_?@%rU6wg$r^~CE*m+mHP*q@E* zcE@=jNJ7w)eY^k+Ixmkt@#Xj>_zc$WOTg%Fe#G3l^LR-(%(@3VlU!*Ofq-5Bbd6R6 zX+g+R3CO;31-or+xvyFB1?e7|0Je+wZNxakk^o9`*QxHOXfIOTPi|&{wG{aDKOMwp z7s1EzX*B@~G!!>hr-ULku4k*~I=?sx>((8#oB|s>!{B)|oDUr{7NZtLSwUnB8EwkcHd&tjurEao~N!N-G#!FiJlKPM0)W&yG; zOY&shmgIjob}W3NqAZfHpCWD&(?a<@K^jN^6#Yaz!A`VWw{DHin}0S-N=51us{7N) z#Vu6#OM;730jyovUVL^s68)N}2~eaH0qqnD+{kFaf{`hZlXK3z2xuvI#jfLU^$W*t z;Y4yPjo8fz;K=k)@hqa^?5BdKsYcnWjePT=v*!_c+w zM7V6*Z`>86hc=eE9p)sEA~1Ee-rfKF)Rou&d0(K@96V~h7~ZF@))GKK)-48+zcpCY zeeWnN+!2ocBgb+4A3qkx;!9q(oTp_Z0)LHgS<9*Y&8Sgk7kOxAaAxRG;}}4mr*(t% zHa5oZqSz<$cM7;_BCrwY(4hmiZmqj>SIhkcP1N|$Ra9sMQyDnv+YApYA8|jf{{>1- zKS}}GB%;sfszQ3@)$!Q4@mI?!Ku_-2`$WQdUj*C^#dEzpdiJVO0I8MW(LSyGDKEOA z&EQaU`6_`y?S|dgW7(c8WAyJ$xe52kB943_fBr8gIr^#g+bnRZ^|%;q2>Av?un0DK zg>apw`%~T4$GD94e$&;}zbD?=iM9iMc{;c^xvCcN`%-RTceHS1z*#1L(bfb+(2} zbL^OWc7J{|HU5drObz-Z5TqX8(XuA`b9H?(we&z2!0;%l)7A4Yb(sif=Rn+cYuM4% z4-;1T8q;8-Ujj!s)o&>V5&)$G5idc+Zx2%)Z@)L5vBEnJqn7SP^A|_3^G8lt4sX9u zvk!!DDH6o|yu%yc*n4pr5P4L$X~&OZd{?-EBc0q%AhM+}s03^eFNU)a-dew8qw6Qz z@58{)zh>vtw2wA`OrH<*7ozaj>hn&`wcg#j;Y310EmFz(rsT`feL%l{yh5lK%l;lc zn0Ru&opv0d)&C_+meu(mltnkjg(wBrk{SXPt(ZI``FastRE#Tr?EVs^wooK4TdAvq zDXK`eujzv4Ut4|q6d-c8dj#-q-30qXJT@RP5a?kGB9+KpdnlC&r>OTlRmqMgvCuW@ z_l4b2c73x>L(r+`XiWQVJq`wh^Mfb1Tl}CTpr>|bE_Z>Ay$_SP@)s5Ky(_&FcqC8J zPK1*Pyb`aly@6HRwO|Gko#Ycx>CYg9m-44}!>-?{l450IpiSCir&g zViW*5pU&;mL6R?H{z(7+M)E0D9CYLpYz3MLyxqGG_WRWym6v4NpvFxyM*p#^(dUa*7_-Ek%Yy_9Ly)~SvVvi^KaHdQo$>4N(nkyNu+{s#;WK#jLf-TV zi%7WZ-7l)oG)SY(nsGC2@zs1M7Q+IUKrRtSmXY+88u8SALv#PU z@4m0|P)J2w2Na)Ba4A+0XJ{@Q-NZ;_4WX(4I$O!@U@P7YT<~Qlbtf>rE>J3xaA?r-5JSGa1$c=VI0df1?0)#a+cRk3?AY zn!t6QM)}mAR{8>iqWFQ6`*}i{NFyQqvSSx-+}O;s#iW@FF>S#b76Q55ImEyMpkx?1 zWdT0^Xb_L`iTJ=@gSg(`?bETfe{*yH^5n573{(X`L=kCb-K-_Rptqjk?cmmp zC*as2AaL6dbugG|Aq7}ajd3+b?epp2!RYD2cl;uT#2|n6MfIHK^(%dnu=zwO=Il&n0gyoMhj{%xei|~AN!PpC&O{K7 zy7zWwh_}@+L?gfJYhB^6b{#U$=G6Jyile$9@34ZRAl0E)qcy~6(AqcRq^lMDIIR=D zA2$mAE`9hMT{G>k2Yv7FC)Cfco!1jho|uK;poIJ9Y0usuCY%O)I}v!ttqJjTZnpSr zcP;kG`Sx}WIFn&M5la)NB7L8NtOE)QA@7i7oYRCtg#RU`i>tE-?`>+7wJsRTF zZl&Il;iHPdcE;;y)^ZNocbs-_;{c04C`rl?gR)KNJ$@4>0tvvZHh0orCbulT#ax#_r5?!&GEF%OHcePw_U-5*t@-#r`Hkm z{@2&A?lzXUaqA1#-N&L=k1u%&_;{XKtbAL0?o7LV}O;_fHn3fykv;@7Aq5*LFJ6dpbX5@>H(%M~{XeC+FV(!O_tf q*!=TRhMQYZy@Oouu{+c_4g7y7m@TUq;8eW;0000zI<5nO~0)=fnxErNrCA`WgM*1^R=&_zX)CMr1T;-rJKi{RhT zwTRWWFSbznW6?ZwYBk2xccxEVa`0%4(Yva@;pbF0^9S2uAKfle(?qtbyxJ(2%kiF>CHXa` zwdcneqDH8s8`O=^Z;G*FoH3bGkRlewXgRMPCtCR>olp$6SSk2LaLtdk735GTeS6JrtWdjq}ZZs34}bF$p9qsdLBnIC+J1{xF!;M>5@n5YI? z&4z;cHjvE$_V&)MtT*$6579tEVTAaOu<<1(%cR!^622ph;K0g-9AQF(O3vhYiNJ*b z7Xuat7f#qV!aOb!Q6;pKF~UjxbnQ*DOwWIpHq-OqgFQe0fa`fz9oUMD0Z9VV1d9Q= z5#TIiB5HxD12dV7Jd)hJ_=qt$xd^NA4nEk!Bp@qUu0k4c(cRlRc0Y)25Z^q7^m|=T zEPSa{>fbuK*p?QKGWOF9-+|Bne}*tPWtM~)t<`EXu;7__@_h5{U+e{vTT29oHFe~Ze6XJ(Q>Kb zHH)*`i>&-o-mMNlRLeM*)b=tl9I*eiXO{b+PdrTgTX%D4@ZRav{vE&cqCShv#9g;J tE!>t@mbeRM^gTGoKdYo(nL%h1<2#QP_cRaf4g@-i!PC{xWt~$(697v`TRe8 z#G%R{$NfX%tci2`Gda4n1O70V3HltacN37lc`VT21_Oig(wY*}T!mDijSQZyelF{r G5}E*M5;#5p diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/passwordbox_open.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/passwordbox_open.png deleted file mode 100644 index d328891f6a18ea703fd25a47b228df9cb13b4744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fh6C~y}*jFF6I{2&m zf8fW~lSf{d9=Ouc<(SoRr6$ox=6dW5rxOB`TRe8 z#G%R{$Nj@Z)5m5kM@2RMITi_;Npmte=_#;rBych_7F`xqKKy}=f%DM}Q4`(M(}DIf Nc)I$ztaD0e0su|qH(3Ax diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/searchbox_button.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/searchbox_button.png deleted file mode 100755 index 6dd1931589b453f6cc9772fd1851d8705d6b6631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32yJ3i0hJ2BS=^}@sXzH{F9Iq&OW375;I7CG-}Vr|aF#l<(fySwu2>`YdxRW*W0f#2un=W5Jmvoe`XCK%I_Y++#`fwE+= zSd{sEULGDE%A=#BOW<6gP*6VfMa^fr8qe`5w%)P0a^Y9WGTw! zvI^|$>l@1Da^Ke1*T3RdY7KqM%gaBb(P+oP!GW;b?ZRfW3Bxc1H@GCaHK#XhZ*Lc= zRBC@>V&W#x&B5%(#>OW5`};d6I5Qw218EG_q@1gtr!Nl*v7yn?(MPMRt4SNy%--JK zanm#f^bw^}Nr7b(EUg}TUi(2;)deX10lAo=83+VA(QksJI6(zwptET-y~avN=J9w$ zI2`W5lG|aOkjY7(&!@;Jx*nUA>~J`Q)9L&(G8y=g$3a4YgD7z)5>gXQNKhw=uR0zF z#jHruh)gDv=bj|2ZES4(fEM?I!JyKqo=}sj-fBYTcDt4KXq)eFQH}wW`vh%Mla}#@ z@Mb`C)x@YkK{xd2>8ZLg+E!Lps$Q@6DY-~!0=Gs+Mm~_JnW1EbX2uxClEdN>Y@I78 z=ke_9?7sX@o0*x}M{JB77MIXj_MmNE%+1Xe{*{crh)9={dR(U;y-{jrxUXmG%Gt002ovPDHLkV1hy(sXhPz diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/spinner_arrows.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/spinner_arrows.png deleted file mode 100755 index 7c2df483dbb30dfb3a51332c03fe6f0c229c0547..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3HFkJ+IURQZb$`jv*Ddk`p9Y7bl4Dgeh3R zJz6gy$J;RRRRiNz`7}$-z5~nWg=}UsVYp!HpQ#{_&8An~S<1fjm*zKyrHmF27#+^4 x`1rk&EZfSkR8C?on>%wt3;O{L3Dzy_3@=Og7TEqO`UJFx!PC{xWt~$(69D$UE$jdQ diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tabs_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tabs_icons.png deleted file mode 100755 index 4d29966d7154338a9e2e358821a5f72655eba43e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq+&f?978H@B_~L*E^a7uNPG49 z|BoM6E;$_tDnm{r-UW|t3f!- diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tagbox_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tagbox_icons.png deleted file mode 100644 index bd02e2d817c6b7c4e2a105919e9a89cc0a1d577f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYel&`0YV@SoV>_0CQASS diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tree_icons.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/tree_icons.png deleted file mode 100755 index e9be4f3a9965e49a4e4078f8c53f486d761a7468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 zcmV+`4Ak?9P)g24+u&k_UG+WCVnOW0FwMG}(2wGOI!IUx6nn{~p zK+GuW#mGkun)pBk1bIKq2~!>yc`1oJM7TV}|D1iU2d{7+=iGY*Zhd>Ly{>T1|31#) z``!Py&-u2D@h}=|*RDlx>VNK^-`@2+c<|uCg9rZx;|}7def~CV*Z^~Bvlk0y6WzaX zO7)0#uj7>9!NW$89WfP@S>cZ$8!Q+fgf5CL6uf3z7yRUM87*26} zc7){+S-^&{P?s;BN|=J}jRBY%>({~FW^;}1pOKM)t5>h~iiN9a?!cQxZAh)Xj-Cbx z-`;!M?b&%0#)k;`qJa#-vG>Q}$a}tsUq2e(hTV((>qg+4HQwkBk0=8Pvw9^Cq^lEg zdeuqA0@yH%5C8TbQ7FAuPv)$7}<1EDF0(%7?l zFbWC^aJxRrM0VGoK7AU797tDK7;+<$&S&$O=E0jr=dtI#Mi}^Lj%@MJAfHcF&7V~L z9{C-M@yx;LV9VXsm^~;2kSkZNAUZl48jS|l!o$zcPfR)cpTBxt1jyGH+b}s@ix?{* zva6z1d_Kwx*Em4z1t9hkRIktt&M27~fn9HSAUiu7xAa1^d@L`8=OBG*YAWP95Muxt z_tB*4MY&JFGt@VQ&0vE%Kh&Zz69xp2+C4k&QT(@l8FD*tj#rt$qJ}_46BhKjt3qv;#5snD)toChHG|az}_Ova+&pD$++$mLMTL8(gYsda--Qdr^s;scOOAj6rKuR0A1K|$D zwvqa;$-2QQ+d)KN+h3hJ0V2=6MBx01WxD;(t{3%&0iw)-+&xz{e$xAoYSY?2!)r+k zZ#XX*S26khN18sn5QI$aW}IkRjhB<2h5O?Bsf!mj*3+{)$lP6*009WQ@_QKCDZbm|CEu64xY6& z5Gt5Tbq^`!7Ey~DbpY8fz=NhQUtUyR1EGScRQHgQes`%^5kUBM?m)~&;y)+o24}@P z@>1A0D#$?u2K9l9?LjKVz)ogJSEeFiN7VNp}@yO1c)Y7cDEG($y9!m{QGyrY+<=2p)AU z*G&S1-^bB+?gOzG2SS%w#lczlhP)K^ja<^NJ3z>Vm;{d+XAk)!Z@ZtUSL{Ht4LT5U zCNpZ0f5KZi0f?K5I7Aer^o`C=v>eLmnr)!Qs)%VeL0~SXdbB`TZ-=>)+tD?{7n~`)x0Lx#}LM zSGtQ=OsMEdbqkt$(BMx@OvITpXKn)s?b|hXu5iQlV3*tUGQoF{PPQ?3zHwiBdeZmRsDM2OMC?I;L(FYK%i-foYaSh6a)mCmdHtcct`+I zl7`;@l&2SNnDo+uwuv(rzRAxf54-vX=kK2f4<0;t@ZjHKedqJ@o*+DU@ZiCNI}q+b zxc;Xae`jps9$(+=lYy^bo2Tcu3mEf|wmr?5>lQb+z43v8`22wf&Ms$c8Ycq}9yW}T z^VdR2QuG!5CIKE_Pk#7^y7TAIQCWr0=;?W=_}Fo@mlmQ{Q;djT zJzg4QPY|K*WHmi>UkJaOly@bwL{EdVsOYSiWo5-emY}k-43{odqNb)Ab#*mpXsAPD zV}m$=>Cx7Do$gkWma?|?vY4bXq~Go5ce?(Z0FS8k&`ubNj-z`}nU#Z&y}XWn;No&X zlYA15Nr#a)YzQu_S&1Jnlw$J(lZs^>K)M^1?n><~cu-d|x+|5sl=TJ6&bRaRFs1-v zZtyoXT@wc|ZL_sr4m_Hho4V;!UVarF7mEdW3`D&T!{srK(8ljZ>B&?S9Xp1G*;#RCMe;#Qa46TRJU)rxEXz?7a%C+>QP&YDKOh@Zts7sj=Ev<#2 z#dEYO*Gho!6}i0#5PNbUat6Ov+YD)6rFvDg3N0;KGx}oOx5E#k)V>(I(^q`--8oiF zf`uB8BxR^eI#5$Zxl-N>jb83Ba4lqu2ELON*`F7*ZB0I^Si*pma1 z1CQ3$783w44G%d0A+2hsN(6^$`%QSLM~VL?c(k{-bt3MB$O z&U-NwjCRK9QEtd|6W}4ZkFqa5M};ueS*KEEy(qk-(St#~Kd1)?^#TzGvlRf5`hX~b z2z4JL=Rw`bsHqS^;H*M`&?;R0PGo8$5HZo^N>*1dYxO1uSdZv?`}14db<9>%QfptI z2BjQ$7#hG`^#lq-@SrrMm!>U}10j$QK%}2ZYfL|vG53!K4m_ecnS#2wuLO9wAy+gbS0xM zWHgPTu4FXusY{uX*QVw{#=4U6t04R;%$;x`a^PVK0H&rba`e*G7JcU-O=IYH#`IeT z4cS|K^eC>Lh)4b~S6$7+nL)EPN^l;#5a;NCy}}nsjH4sYsnsY*PDaS^;m7XyRTyi7 zx{*;=G8*{QrA&#II*$=V$cfN&hH4^IST*(k!bpGM{5}remCOXAH=Ez7K@DlF@x2)TNB^;L(R2h#YvB1Aqh%N=x+S;9*D~IdNiPZHWe@p(~N( z?uLr35hyPxz&j&HX1?L&b)qOMOLQLLuC6#57>IIVb`m;$dWGGb9O_O+UCQ{MY0n4m z2_oNtC`m&A=q-H+V^hOt&eU8k)u1sy7Z>vK5T;UPQJuqwF&Ca| z&YY@+jQR7?!Gnj5g1*_w0nn9@uD6sM%f6&v%GfVAPnz^YTyO~1d3z^6&sgVwb-9SK zdxAYZ52=?gN9aQjmHvjYS^SLi;10wN-aii>Jb3(M`wpy diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/validatebox_warning.png b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/images/validatebox_warning.png deleted file mode 100755 index 2b3d4f05babf3f82b146350e96570fac02075de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmV;K17`e*P)nRv1_mBsMY*-M^XCf)eflW5 z|MC^)Hw+AW{sHCCF+cz@{fF8J!+#-kxoSv=7^|!zgOQUngSQ}mDo|J)n+pH}hzZ#= zr~y18$_m-?9v%$;?mu8);}>9vFgFvDXJDwrW&l6{p}625M66yTFhGz^K$w9^O$BHi zFN2Ym7DIple*#cW4BY^L0Al(Jbv6k9U|^6IQBp{hx3XdQ&CJ4Z_|YSVr@XujY(PVT zlok1<85nBO4FCurumK>O|A07*jFlSRUcxLAQVcIR*co#3@)&jj4Pj7KXRri%#h;fa z4ya5O*#Lk5Vq!q}T~=CGH(uV-hJk^fkAYoGjN#AMuMF($>N=giWG}IXse|=+c=i>7HEg>%*E%fLD!-uy|85n^6W?^Dt(9zXp5EB&z+w>_knBmdiKMbzi z?A!`WOl>e100a=&05*1xZdFls?*HtZ48H?o7=HW%ivIu45E2~BASWx!@DIpmv9e}h zaPwji|L}pqor@y`=yxrU0RRES^qYY}O;TRcU+DKIhL4`%3_nyf8U6tS<<-ZJ40D$( zWjJ%`G6NIPHNP2{7am*Fp% z{>ShK#0G`~kjd~57_BU.panel-body, -.panel-hright>.panel-body { - position: absolute; -} -.panel-hleft>.panel-header { - float: left; -} -.panel-hright>.panel-header { - float: right; -} -.panel-hleft>.panel-body { - border-top-width: 1px; - border-left-width: 0; -} -.panel-hright>.panel-body { - border-top-width: 1px; - border-right-width: 0; -} -.panel-hleft>.panel-body-nobottom { - border-bottom-width: 1px; - border-right-width: 0; -} -.panel-hright>.panel-body-nobottom { - border-bottom-width: 1px; - border-left-width: 0; -} -.panel-hleft>.panel-footer { - position: absolute; - right: 0; -} -.panel-hright>.panel-footer { - position: absolute; - left: 0; -} -.panel-hleft>.panel-header-noborder { - border-width: 0 1px 0 0; -} -.panel-hright>.panel-header-noborder { - border-width: 0 0 0 1px; -} -.panel-hleft>.panel-body-noborder { - border-width: 0; -} -.panel-hright>.panel-body-noborder { - border-width: 0; -} -.panel-hleft>.panel-body-noheader { - border-left-width: 1px; -} -.panel-hright>.panel-body-noheader { - border-right-width: 1px; -} -.panel-hleft>.panel-footer-noborder { - border-width: 0 0 0 1px; -} -.panel-hright>.panel-footer-noborder { - border-width: 0 1px 0 0; -} -.panel-hleft>.panel-header .panel-icon, -.panel-hright>.panel-header .panel-icon { - margin-top: 0; - top: 5px; - left: 50%; - margin-left: -8px; -} -.panel-hleft>.panel-header .panel-title, -.panel-hright>.panel-header .panel-title { - position: absolute; - min-width: 16px; - left: 25px; - top: 5px; - bottom: auto; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(90deg); - -o-transform-origin: 0 0; - transform: rotate(90deg); - transform-origin: 0 0; -} -.panel-hleft>.panel-header .panel-title-up, -.panel-hright>.panel-header .panel-title-up { - position: absolute; - min-width: 16px; - left: 21px; - top: auto; - bottom: 0px; - text-align: right; - white-space: nowrap; - word-wrap: normal; - -webkit-transform: rotate(-90deg); - -webkit-transform-origin: 0 0; - -moz-transform: rotate(-90deg); - -moz-transform-origin: 0 0; - -o-transform: rotate(-90deg); - -o-transform-origin: 0 0; - transform: rotate(-90deg); - transform-origin: 0 16px; -} -.panel-hleft>.panel-header .panel-with-icon.panel-title-up, -.panel-hright>.panel-header .panel-with-icon.panel-title-up { - padding-left: 0; - padding-right: 18px; -} -.panel-hleft>.panel-header .panel-tool, -.panel-hright>.panel-header .panel-tool { - top: auto; - bottom: 5px; - width: 16px; - height: auto; - left: 50%; - margin-left: -8px; - margin-top: 0; -} -.panel-hleft>.panel-header .panel-tool a, -.panel-hright>.panel-header .panel-tool a { - margin: 2px 0 0 0; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/passwordbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/passwordbox.css deleted file mode 100644 index 92c9ce586..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/passwordbox.css +++ /dev/null @@ -1,6 +0,0 @@ -.passwordbox-open { - background: url('images/passwordbox_open.png') no-repeat center center; -} -.passwordbox-close { - background: url('images/passwordbox_close.png') no-repeat center center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/progressbar.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/progressbar.css deleted file mode 100644 index 77512af86..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/progressbar.css +++ /dev/null @@ -1,33 +0,0 @@ -.progressbar { - border-width: 1px; - border-style: solid; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; - overflow: hidden; - position: relative; -} -.progressbar-text { - text-align: center; - position: absolute; -} -.progressbar-value { - position: relative; - overflow: hidden; - width: 0; - -moz-border-radius: 0px 0 0 0px; - -webkit-border-radius: 0px 0 0 0px; - border-radius: 0px 0 0 0px; -} -.progressbar { - border-color: #ddd; -} -.progressbar-text { - color: #444; - font-size: 14px; -} -.progressbar-value, -.progressbar-value .progressbar-text { - background-color: #CCE6FF; - color: #000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/propertygrid.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/propertygrid.css deleted file mode 100644 index 9c859b192..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/propertygrid.css +++ /dev/null @@ -1,27 +0,0 @@ -.propertygrid .datagrid-view1 .datagrid-body td { - padding-bottom: 1px; - border-width: 0 1px 0 0; -} -.propertygrid .datagrid-group { - overflow: hidden; - border-width: 0 0 1px 0; - border-style: solid; -} -.propertygrid .datagrid-group span { - font-weight: bold; -} -.propertygrid .datagrid-view1 .datagrid-body td { - border-color: #ddd; -} -.propertygrid .datagrid-view1 .datagrid-group { - border-color: #ffffff; -} -.propertygrid .datagrid-view2 .datagrid-group { - border-color: #ddd; -} -.propertygrid .datagrid-group, -.propertygrid .datagrid-view1 .datagrid-body, -.propertygrid .datagrid-view1 .datagrid-row-over, -.propertygrid .datagrid-view1 .datagrid-row-selected { - background: #ffffff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/radiobutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/radiobutton.css deleted file mode 100644 index d1b61ce44..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/radiobutton.css +++ /dev/null @@ -1,25 +0,0 @@ -.radiobutton { - position: relative; - border: 2px solid #99cdff; - border-radius: 50%; -} -.radiobutton-inner { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: #99cdff; - border-radius: 50%; - transform: scale(.6); -} -.radiobutton-disabled { - opacity: 0.6; -} -.radiobutton-value { - position: absolute; - overflow: hidden; - width: 1px; - height: 1px; - left: -999px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/searchbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/searchbox.css deleted file mode 100644 index 2d3af1c15..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/searchbox.css +++ /dev/null @@ -1,61 +0,0 @@ -.searchbox-button { - width: 18px; - height: 20px; - overflow: hidden; - display: inline-block; - vertical-align: top; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.searchbox-button-hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.searchbox .l-btn-plain { - border: 0; - padding: 0; - vertical-align: top; - opacity: 0.6; - filter: alpha(opacity=60); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .l-btn-plain:hover { - border: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox a.m-btn-plain-active { - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .m-btn-active { - border-width: 0 1px 0 0; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.searchbox .textbox-button-right { - border-width: 0 0 0 1px; -} -.searchbox .textbox-button-left { - border-width: 0 1px 0 0; -} -.searchbox-button { - background: url('images/searchbox_button.png') no-repeat center center; -} -.searchbox .l-btn-plain { - background: #ffffff; -} -.searchbox .l-btn-plain-disabled, -.searchbox .l-btn-plain-disabled:hover { - opacity: 0.5; - filter: alpha(opacity=50); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/sidemenu.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/sidemenu.css deleted file mode 100644 index 4165e46d0..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/sidemenu.css +++ /dev/null @@ -1,69 +0,0 @@ -.sidemenu .tree-hit { - background-image: none; -} -.sidemenu-default-icon { - background-image: none; - width: 0; -} -.sidemenu .accordion .accordion-header, -.sidemenu .accordion .accordion-body { - border-bottom-color: transparent; - background: transparent; -} -.sidemenu .accordion .accordion-header { - color: #777; -} -.sidemenu .accordion-header .panel-title { - height: 30px; - line-height: 30px; - color: #777; -} -.sidemenu .accordion-header:hover { - background: #E6E6E6; - color: #777; -} -.sidemenu .tree-node-hover { - background: #E6E6E6; - color: #777; -} -.sidemenu .tree-node-selected { - border-right: 2px solid #99cdff; - color: #000; - background: #CCE6FF; -} -.sidemenu .tree-node { - height: 40px; -} -.sidemenu .tree-title { - margin: 11px 0; -} -.sidemenu .tree-node-nonleaf { - position: relative; -} -.sidemenu .tree-node-nonleaf::after { - display: inline-block; - content: ''; - position: absolute; - top: 50%; - margin-top: -8px; - background: url('images/accordion_arrows.png') no-repeat 0 0; - width: 16px; - height: 16px; - right: 5px; -} -.sidemenu .tree-node-nonleaf-collapsed::after { - background: url('images/accordion_arrows.png') no-repeat -16px 0; -} -.sidemenu-collapsed .panel-icon { - left: 50%; - margin-left: -8px; -} -.sidemenu-tooltip { - padding: 0; - margin: 0 -12px; - border: 0; -} -.sidemenu-tooltip .tooltip-arrow-outer, -.sidemenu-tooltip .tooltip-arrow { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/slider.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/slider.css deleted file mode 100644 index 7f841034e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/slider.css +++ /dev/null @@ -1,101 +0,0 @@ -.slider-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.slider-h { - height: 22px; -} -.slider-v { - width: 22px; -} -.slider-inner { - position: relative; - height: 6px; - top: 7px; - border-width: 1px; - border-style: solid; - border-radius: 0px; -} -.slider-handle { - position: absolute; - display: block; - outline: none; - width: 20px; - height: 20px; - top: 50%; - margin-top: -10px; - margin-left: -10px; -} -.slider-tip { - position: absolute; - display: inline-block; - line-height: 12px; - font-size: 14px; - white-space: nowrap; - top: -22px; -} -.slider-rule { - position: relative; - top: 15px; -} -.slider-rule span { - position: absolute; - display: inline-block; - font-size: 0; - height: 5px; - border-width: 0 0 0 1px; - border-style: solid; -} -.slider-rulelabel { - position: relative; - top: 20px; -} -.slider-rulelabel span { - position: absolute; - display: inline-block; - font-size: 14px; -} -.slider-v .slider-inner { - width: 6px; - left: 7px; - top: 0; - float: left; -} -.slider-v .slider-handle { - left: 50%; - margin-top: -10px; -} -.slider-v .slider-tip { - left: -10px; - margin-top: -6px; -} -.slider-v .slider-rule { - float: left; - top: 0; - left: 16px; -} -.slider-v .slider-rule span { - width: 5px; - height: 'auto'; - border-left: 0; - border-width: 1px 0 0 0; - border-style: solid; -} -.slider-v .slider-rulelabel { - float: left; - top: 0; - left: 23px; -} -.slider-handle { - background: url('images/slider_handle.png') no-repeat; -} -.slider-inner { - border-color: #ddd; - background: #ffffff; -} -.slider-rule span { - border-color: #ddd; -} -.slider-rulelabel span { - color: #444; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/spinner.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/spinner.css deleted file mode 100644 index cbc7e591a..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/spinner.css +++ /dev/null @@ -1,114 +0,0 @@ -.spinner-arrow { - display: inline-block; - overflow: hidden; - vertical-align: top; - margin: 0; - padding: 0; - opacity: 1.0; - filter: alpha(opacity=100); - width: 18px; -} -.spinner-arrow.spinner-button-top, -.spinner-arrow.spinner-button-bottom, -.spinner-arrow.spinner-button-left, -.spinner-arrow.spinner-button-right { - background-color: #ffffff; -} -.spinner-arrow-up, -.spinner-arrow-down { - opacity: 0.6; - filter: alpha(opacity=60); - display: block; - font-size: 1px; - width: 18px; - height: 10px; - width: 100%; - height: 50%; - color: #777; - outline-style: none; - background-color: #ffffff; -} -.spinner-button-updown { - opacity: 1.0; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - position: relative; - display: block; - width: 100%; - height: 50%; -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down { - opacity: 1.0; - filter: alpha(opacity=100); - cursor: pointer; - width: 16px; - height: 16px; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; - position: absolute; -} -.spinner-button-updown .spinner-button-top, -.spinner-button-updown .spinner-button-bottom { - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-button-updown .spinner-button-top:hover, -.spinner-button-updown .spinner-button-bottom:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-updown .spinner-arrow-up, -.spinner-button-updown .spinner-arrow-down, -.spinner-button-updown .spinner-arrow-up:hover, -.spinner-button-updown .spinner-arrow-down:hover { - background-color: transparent; -} -.spinner-arrow-hover { - background-color: #E6E6E6; - opacity: 1.0; - filter: alpha(opacity=100); -} -.spinner-button-top:hover, -.spinner-button-bottom:hover, -.spinner-button-left:hover, -.spinner-button-right:hover, -.spinner-arrow-up:hover, -.spinner-arrow-down:hover { - opacity: 1.0; - filter: alpha(opacity=100); - background-color: #E6E6E6; -} -.textbox-disabled .spinner-button-top:hover, -.textbox-disabled .spinner-button-bottom:hover, -.textbox-disabled .spinner-button-left:hover, -.textbox-disabled .spinner-button-right:hover, -.textbox-icon-disabled .spinner-arrow-up:hover, -.textbox-icon-disabled .spinner-arrow-down:hover { - opacity: 0.6; - filter: alpha(opacity=60); - background-color: #ffffff; - cursor: default; -} -.spinner .textbox-icon-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.spinner-arrow-up { - background: url('images/spinner_arrows.png') no-repeat 1px center; - background-color: #ffffff; -} -.spinner-arrow-down { - background: url('images/spinner_arrows.png') no-repeat -15px center; - background-color: #ffffff; -} -.spinner-button-up { - background: url('images/spinner_arrows.png') no-repeat -32px center; -} -.spinner-button-down { - background: url('images/spinner_arrows.png') no-repeat -48px center; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/splitbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/splitbutton.css deleted file mode 100644 index 3451138c7..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/splitbutton.css +++ /dev/null @@ -1,12 +0,0 @@ -.s-btn:hover .m-btn-line, -.s-btn-active .m-btn-line, -.s-btn-plain-active .m-btn-line { - display: inline-block; -} -.l-btn:hover .s-btn-downarrow, -.s-btn-active .s-btn-downarrow, -.s-btn-plain-active .s-btn-downarrow { - border-style: solid; - border-color: #b3b3b3; - border-width: 0 0 0 1px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/switchbutton.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/switchbutton.css deleted file mode 100644 index 057bf5587..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/switchbutton.css +++ /dev/null @@ -1,77 +0,0 @@ -.switchbutton { - text-decoration: none; - display: inline-block; - overflow: hidden; - vertical-align: middle; - margin: 0; - padding: 0; - cursor: pointer; - background: #dddddd; - border: 1px solid #dddddd; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.switchbutton-inner { - display: inline-block; - overflow: hidden; - position: relative; - top: -1px; - left: -1px; -} -.switchbutton-on, -.switchbutton-off, -.switchbutton-handle { - display: inline-block; - text-align: center; - height: 100%; - float: left; - font-size: 14px; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.switchbutton-on { - background: #CCE6FF; - color: #000; -} -.switchbutton-off { - background-color: #fff; - color: #444; -} -.switchbutton-on, -.switchbutton-reversed .switchbutton-off { - -moz-border-radius: 0px 0 0 0px; - -webkit-border-radius: 0px 0 0 0px; - border-radius: 0px 0 0 0px; -} -.switchbutton-off, -.switchbutton-reversed .switchbutton-on { - -moz-border-radius: 0 0px 0px 0; - -webkit-border-radius: 0 0px 0px 0; - border-radius: 0 0px 0px 0; -} -.switchbutton-handle { - position: absolute; - top: 0; - left: 50%; - background-color: #fff; - color: #444; - border: 1px solid #dddddd; - -moz-box-shadow: 0 0 3px 0 #dddddd; - -webkit-box-shadow: 0 0 3px 0 #dddddd; - box-shadow: 0 0 3px 0 #dddddd; -} -.switchbutton-value { - position: absolute; - top: 0; - left: -5000px; -} -.switchbutton-disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} -.switchbutton-disabled, -.switchbutton-readonly { - cursor: default; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tabs.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tabs.css deleted file mode 100644 index cc1500ea9..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tabs.css +++ /dev/null @@ -1,377 +0,0 @@ -.tabs-container { - overflow: hidden; -} -.tabs-header { - border-width: 1px; - border-style: solid; - border-bottom-width: 0; - position: relative; - padding: 0; - padding-top: 2px; - overflow: hidden; -} -.tabs-scroller-left, -.tabs-scroller-right { - position: absolute; - top: auto; - bottom: 0; - width: 18px; - font-size: 1px; - display: none; - cursor: pointer; - border-width: 1px; - border-style: solid; -} -.tabs-scroller-left { - left: 0; -} -.tabs-scroller-right { - right: 0; -} -.tabs-tool { - position: absolute; - bottom: 0; - padding: 1px; - overflow: hidden; - border-width: 1px; - border-style: solid; -} -.tabs-header-plain .tabs-tool { - padding: 0 1px; -} -.tabs-wrap { - position: relative; - left: 0; - overflow: hidden; - width: 100%; - margin: 0; - padding: 0; -} -.tabs-scrolling { - margin-left: 18px; - margin-right: 18px; -} -.tabs-disabled { - opacity: 0.3; - filter: alpha(opacity=30); -} -.tabs { - list-style-type: none; - height: 26px; - margin: 0px; - padding: 0px; - padding-left: 4px; - width: 50000px; - border-style: solid; - border-width: 0 0 1px 0; -} -.tabs li { - float: left; - display: inline-block; - margin: 0 4px -1px 0; - padding: 0; - position: relative; - border: 0; -} -.tabs li a.tabs-inner { - display: inline-block; - text-decoration: none; - margin: 0; - padding: 0 10px; - height: 25px; - line-height: 25px; - text-align: center; - white-space: nowrap; - border-width: 1px; - border-style: solid; - -moz-border-radius: 0px 0px 0 0; - -webkit-border-radius: 0px 0px 0 0; - border-radius: 0px 0px 0 0; -} -.tabs li.tabs-selected a.tabs-inner { - font-weight: bold; - outline: none; -} -.tabs li.tabs-selected a:hover.tabs-inner { - cursor: default; - pointer: default; -} -.tabs li a.tabs-close, -.tabs-p-tool { - position: absolute; - font-size: 1px; - display: block; - height: 12px; - padding: 0; - top: 50%; - margin-top: -6px; - overflow: hidden; -} -.tabs li a.tabs-close { - width: 12px; - right: 5px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs-p-tool { - right: 16px; -} -.tabs-p-tool a { - display: inline-block; - font-size: 1px; - width: 12px; - height: 12px; - margin: 0; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tabs li a:hover.tabs-close, -.tabs-p-tool a:hover { - opacity: 1; - filter: alpha(opacity=100); - cursor: hand; - cursor: pointer; -} -.tabs-with-icon { - padding-left: 18px; -} -.tabs-icon { - position: absolute; - width: 16px; - height: 16px; - left: 10px; - top: 50%; - margin-top: -8px; -} -.tabs-title { - font-size: 14px; -} -.tabs-closable { - padding-right: 8px; -} -.tabs-panels { - margin: 0px; - padding: 0px; - border-width: 1px; - border-style: solid; - border-top-width: 0; - overflow: hidden; -} -.tabs-header-bottom { - border-width: 0 1px 1px 1px; - padding: 0 0 2px 0; -} -.tabs-header-bottom .tabs { - border-width: 1px 0 0 0; -} -.tabs-header-bottom .tabs li { - margin: -1px 4px 0 0; -} -.tabs-header-bottom .tabs li a.tabs-inner { - -moz-border-radius: 0 0 0px 0px; - -webkit-border-radius: 0 0 0px 0px; - border-radius: 0 0 0px 0px; -} -.tabs-header-bottom .tabs-tool { - top: 0; -} -.tabs-header-bottom .tabs-scroller-left, -.tabs-header-bottom .tabs-scroller-right { - top: 0; - bottom: auto; -} -.tabs-panels-top { - border-width: 1px 1px 0 1px; -} -.tabs-header-left { - float: left; - border-width: 1px 0 1px 1px; - padding: 0; -} -.tabs-header-right { - float: right; - border-width: 1px 1px 1px 0; - padding: 0; -} -.tabs-header-left .tabs-wrap, -.tabs-header-right .tabs-wrap { - height: 100%; -} -.tabs-header-left .tabs { - height: 100%; - padding: 4px 0 0 2px; - border-width: 0 1px 0 0; -} -.tabs-header-right .tabs { - height: 100%; - padding: 4px 2px 0 0; - border-width: 0 0 0 1px; -} -.tabs-header-left .tabs li, -.tabs-header-right .tabs li { - display: block; - width: 100%; - position: relative; -} -.tabs-header-left .tabs li { - left: auto; - right: 0; - margin: 0 -1px 4px 0; - float: right; -} -.tabs-header-right .tabs li { - left: 0; - right: auto; - margin: 0 0 4px -1px; - float: left; -} -.tabs-justified li a.tabs-inner { - padding-left: 0; - padding-right: 0; -} -.tabs-header-left .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0px 0 0 0px; - -webkit-border-radius: 0px 0 0 0px; - border-radius: 0px 0 0 0px; -} -.tabs-header-right .tabs li a.tabs-inner { - display: block; - text-align: left; - padding-left: 10px; - padding-right: 10px; - -moz-border-radius: 0 0px 0px 0; - -webkit-border-radius: 0 0px 0px 0; - border-radius: 0 0px 0px 0; -} -.tabs-panels-right { - float: right; - border-width: 1px 1px 1px 0; -} -.tabs-panels-left { - float: left; - border-width: 1px 0 1px 1px; -} -.tabs-header-noborder, -.tabs-panels-noborder { - border: 0px; -} -.tabs-header-plain { - border: 0px; - background: transparent; -} -.tabs-pill { - padding-bottom: 3px; -} -.tabs-header-bottom .tabs-pill { - padding-top: 3px; - padding-bottom: 0; -} -.tabs-header-left .tabs-pill { - padding-right: 3px; -} -.tabs-header-right .tabs-pill { - padding-left: 3px; -} -.tabs-header .tabs-pill li a.tabs-inner { - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.tabs-header-narrow, -.tabs-header-narrow .tabs-narrow { - padding: 0; -} -.tabs-narrow li, -.tabs-header-bottom .tabs-narrow li { - margin-left: 0; - margin-right: -1px; -} -.tabs-narrow li.tabs-last, -.tabs-header-bottom .tabs-narrow li.tabs-last { - margin-right: 0; -} -.tabs-header-left .tabs-narrow, -.tabs-header-right .tabs-narrow { - padding-top: 0; -} -.tabs-header-left .tabs-narrow li { - margin-bottom: -1px; - margin-right: -1px; -} -.tabs-header-left .tabs-narrow li.tabs-last, -.tabs-header-right .tabs-narrow li.tabs-last { - margin-bottom: 0; -} -.tabs-header-right .tabs-narrow li { - margin-bottom: -1px; - margin-left: -1px; -} -.tabs-scroller-left { - background: #ffffff url('images/tabs_icons.png') no-repeat 1px center; -} -.tabs-scroller-right { - background: #ffffff url('images/tabs_icons.png') no-repeat -15px center; -} -.tabs li a.tabs-close { - background: url('images/tabs_icons.png') no-repeat -34px center; -} -.tabs li a.tabs-inner:hover { - background: #E6E6E6; - color: #444; - filter: none; -} -.tabs li.tabs-selected a.tabs-inner { - background-color: #fff; - color: #777; -} -.tabs li a.tabs-inner { - color: #777; - background-color: #ffffff; -} -.tabs-header, -.tabs-tool { - background-color: #ffffff; -} -.tabs-header-plain { - background: transparent; -} -.tabs-header, -.tabs-scroller-left, -.tabs-scroller-right, -.tabs-tool, -.tabs, -.tabs-panels, -.tabs li a.tabs-inner, -.tabs li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner, -.tabs-header-left .tabs li.tabs-selected a.tabs-inner, -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-color: #ddd; -} -.tabs-p-tool a:hover, -.tabs li a:hover.tabs-close, -.tabs-scroller-over { - background-color: #E6E6E6; -} -.tabs li.tabs-selected a.tabs-inner { - border-bottom: 1px solid #fff; -} -.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner { - border-top: 1px solid #fff; -} -.tabs-header-left .tabs li.tabs-selected a.tabs-inner { - border-right: 1px solid #fff; -} -.tabs-header-right .tabs li.tabs-selected a.tabs-inner { - border-left: 1px solid #fff; -} -.tabs-header .tabs-pill li.tabs-selected a.tabs-inner { - background: #CCE6FF; - color: #000; - filter: none; - border-color: #ddd; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tagbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tagbox.css deleted file mode 100644 index 7c6fd15f8..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tagbox.css +++ /dev/null @@ -1,44 +0,0 @@ -.tagbox { - cursor: text; -} -.tagbox .textbox-text { - float: left; -} -.tagbox-label { - position: relative; - display: block; - margin: 4px 0 0 4px; - padding: 0 20px 0 4px; - float: left; - vertical-align: top; - text-decoration: none; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; - background: #E6E6E6; - color: #444; -} -.tagbox-remove { - background: url('images/tagbox_icons.png') no-repeat -16px center; - position: absolute; - display: block; - width: 16px; - height: 16px; - right: 2px; - top: 50%; - margin-top: -8px; - opacity: 0.6; - filter: alpha(opacity=60); -} -.tagbox-remove:hover { - opacity: 1; - filter: alpha(opacity=100); -} -.textbox-disabled .tagbox-label { - cursor: default; -} -.textbox-disabled .tagbox-remove:hover { - cursor: default; - opacity: 0.6; - filter: alpha(opacity=60); -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/textbox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/textbox.css deleted file mode 100644 index 55dc50348..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/textbox.css +++ /dev/null @@ -1,144 +0,0 @@ -.textbox { - position: relative; - border: 1px solid #ddd; - background-color: #fff; - vertical-align: middle; - display: inline-block; - overflow: hidden; - white-space: nowrap; - margin: 0; - padding: 0; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.textbox .textbox-text { - font-size: 14px; - border: 0; - margin: 0; - padding: 0 4px; - white-space: normal; - vertical-align: top; - outline-style: none; - resize: none; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; - height: 28px; - line-height: 28px; -} -.textbox textarea.textbox-text { - line-height: normal; -} -.textbox .textbox-text::-ms-clear, -.textbox .textbox-text::-ms-reveal { - display: none; -} -.textbox textarea.textbox-text { - white-space: pre-wrap; -} -.textbox .textbox-prompt { - font-size: 14px; - color: #aaa; -} -.textbox .textbox-bgicon { - background-position: 3px center; - padding-left: 21px; -} -.textbox .textbox-button, -.textbox .textbox-button:hover { - position: absolute; - top: 0; - padding: 0; - vertical-align: top; - -moz-border-radius: 0 0 0 0; - -webkit-border-radius: 0 0 0 0; - border-radius: 0 0 0 0; -} -.textbox .textbox-button-right, -.textbox .textbox-button-right:hover { - right: 0; - border-width: 0 0 0 1px; -} -.textbox .textbox-button-left, -.textbox .textbox-button-left:hover { - left: 0; - border-width: 0 1px 0 0; -} -.textbox .textbox-button-top, -.textbox .textbox-button-top:hover { - left: 0; - border-width: 0 0 1px 0; -} -.textbox .textbox-button-bottom, -.textbox .textbox-button-bottom:hover { - top: auto; - bottom: 0; - left: 0; - border-width: 1px 0 0 0; -} -.textbox-addon { - position: absolute; - top: 0; -} -.textbox-label { - display: inline-block; - width: 80px; - height: 30px; - line-height: 30px; - vertical-align: middle; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - padding-right: 5px; -} -.textbox-label-after { - padding-left: 5px; - padding-right: 0; -} -.textbox-label-top { - display: block; - width: auto; - padding: 0; -} -.textbox-disabled, -.textbox-label-disabled { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-icon { - display: inline-block; - width: 18px; - height: 20px; - overflow: hidden; - vertical-align: top; - background-position: center center; - cursor: pointer; - opacity: 0.6; - filter: alpha(opacity=60); - text-decoration: none; - outline-style: none; -} -.textbox-icon-disabled, -.textbox-icon-readonly { - cursor: default; -} -.textbox-icon:hover { - opacity: 1.0; - filter: alpha(opacity=100); -} -.textbox-icon-disabled:hover { - opacity: 0.6; - filter: alpha(opacity=60); -} -.textbox-focused { - border-color: #c4c4c4; - -moz-box-shadow: 0 0 3px 0 #ddd; - -webkit-box-shadow: 0 0 3px 0 #ddd; - box-shadow: 0 0 3px 0 #ddd; -} -.textbox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tooltip.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tooltip.css deleted file mode 100644 index 21ae21180..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tooltip.css +++ /dev/null @@ -1,103 +0,0 @@ -.tooltip { - position: absolute; - display: none; - z-index: 9900000; - outline: none; - opacity: 1; - filter: alpha(opacity=100); - padding: 5px; - border-width: 1px; - border-style: solid; - border-radius: 5px; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.tooltip-content { - font-size: 14px; -} -.tooltip-arrow-outer, -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - line-height: 0; - font-size: 0; - border-style: solid; - border-width: 6px; - border-color: transparent; - _border-color: tomato; - _filter: chroma(color=tomato); -} -.tooltip-arrow { - display: none \9; -} -.tooltip-right .tooltip-arrow-outer { - left: 0; - top: 50%; - margin: -6px 0 0 -13px; -} -.tooltip-right .tooltip-arrow { - left: 0; - top: 50%; - margin: -6px 0 0 -12px; -} -.tooltip-left .tooltip-arrow-outer { - right: 0; - top: 50%; - margin: -6px -13px 0 0; -} -.tooltip-left .tooltip-arrow { - right: 0; - top: 50%; - margin: -6px -12px 0 0; -} -.tooltip-top .tooltip-arrow-outer { - bottom: 0; - left: 50%; - margin: 0 0 -13px -6px; -} -.tooltip-top .tooltip-arrow { - bottom: 0; - left: 50%; - margin: 0 0 -12px -6px; -} -.tooltip-bottom .tooltip-arrow-outer { - top: 0; - left: 50%; - margin: -13px 0 0 -6px; -} -.tooltip-bottom .tooltip-arrow { - top: 0; - left: 50%; - margin: -12px 0 0 -6px; -} -.tooltip { - background-color: #fff; - border-color: #ddd; - color: #444; -} -.tooltip-right .tooltip-arrow-outer { - border-right-color: #ddd; -} -.tooltip-right .tooltip-arrow { - border-right-color: #fff; -} -.tooltip-left .tooltip-arrow-outer { - border-left-color: #ddd; -} -.tooltip-left .tooltip-arrow { - border-left-color: #fff; -} -.tooltip-top .tooltip-arrow-outer { - border-top-color: #ddd; -} -.tooltip-top .tooltip-arrow { - border-top-color: #fff; -} -.tooltip-bottom .tooltip-arrow-outer { - border-bottom-color: #ddd; -} -.tooltip-bottom .tooltip-arrow { - border-bottom-color: #fff; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tree.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tree.css deleted file mode 100644 index ab4efa62c..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/tree.css +++ /dev/null @@ -1,164 +0,0 @@ -.tree { - margin: 0; - padding: 0; - list-style-type: none; -} -.tree li { - white-space: nowrap; -} -.tree li ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.tree-node { - height: 26px; - white-space: nowrap; - cursor: pointer; -} -.tree-hit { - cursor: pointer; -} -.tree-expanded, -.tree-collapsed, -.tree-folder, -.tree-file, -.tree-checkbox, -.tree-indent { - display: inline-block; - width: 16px; - height: 18px; - margin: 4px 0; - vertical-align: middle; - overflow: hidden; -} -.tree-expanded { - background: url('images/tree_icons.png') no-repeat -18px 0px; -} -.tree-expanded-hover { - background: url('images/tree_icons.png') no-repeat -50px 0px; -} -.tree-collapsed { - background: url('images/tree_icons.png') no-repeat 0px 0px; -} -.tree-collapsed-hover { - background: url('images/tree_icons.png') no-repeat -32px 0px; -} -.tree-lines .tree-expanded, -.tree-lines .tree-root-first .tree-expanded { - background: url('images/tree_icons.png') no-repeat -144px 0; -} -.tree-lines .tree-collapsed, -.tree-lines .tree-root-first .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -128px 0; -} -.tree-lines .tree-node-last .tree-expanded, -.tree-lines .tree-root-one .tree-expanded { - background: url('images/tree_icons.png') no-repeat -80px 0; -} -.tree-lines .tree-node-last .tree-collapsed, -.tree-lines .tree-root-one .tree-collapsed { - background: url('images/tree_icons.png') no-repeat -64px 0; -} -.tree-line { - background: url('images/tree_icons.png') no-repeat -176px 0; -} -.tree-join { - background: url('images/tree_icons.png') no-repeat -192px 0; -} -.tree-joinbottom { - background: url('images/tree_icons.png') no-repeat -160px 0; -} -.tree-folder { - background: url('images/tree_icons.png') no-repeat -208px 0; -} -.tree-folder-open { - background: url('images/tree_icons.png') no-repeat -224px 0; -} -.tree-file { - background: url('images/tree_icons.png') no-repeat -240px 0; -} -.tree-loading { - background: url('images/loading.gif') no-repeat center center; -} -.tree-checkbox0 { - background: url('images/tree_icons.png') no-repeat -208px -18px; -} -.tree-checkbox1 { - background: url('images/tree_icons.png') no-repeat -224px -18px; -} -.tree-checkbox2 { - background: url('images/tree_icons.png') no-repeat -240px -18px; -} -.tree-title { - font-size: 14px; - display: inline-block; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - padding: 0 2px; - margin: 4px 0; - height: 18px; - line-height: 18px; -} -.tree-node-proxy { - font-size: 14px; - line-height: 20px; - padding: 0 2px 0 20px; - border-width: 1px; - border-style: solid; - z-index: 9900000; -} -.tree-dnd-icon { - display: inline-block; - position: absolute; - width: 16px; - height: 18px; - left: 2px; - top: 50%; - margin-top: -9px; -} -.tree-dnd-yes { - background: url('images/tree_icons.png') no-repeat -256px 0; -} -.tree-dnd-no { - background: url('images/tree_icons.png') no-repeat -256px -18px; -} -.tree-node-top { - border-top: 1px dotted red; -} -.tree-node-bottom { - border-bottom: 1px dotted red; -} -.tree-node-append .tree-title { - border: 1px dotted red; -} -.tree-editor { - border: 1px solid #ddd; - font-size: 14px; - height: 26px; - line-height: 26px; - padding: 0 4px; - margin: 0; - width: 80px; - outline-style: none; - vertical-align: middle; - position: absolute; - top: 0; -} -.tree-node-proxy { - background-color: #fff; - color: #444; - border-color: #ddd; -} -.tree-node-hover { - background: #E6E6E6; - color: #444; -} -.tree-node-selected { - background: #CCE6FF; - color: #000; -} -.tree-node-hidden { - display: none; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/validatebox.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/validatebox.css deleted file mode 100644 index 1fc3ad64e..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/validatebox.css +++ /dev/null @@ -1,5 +0,0 @@ -.validatebox-invalid { - border-color: #ffa8a8; - background-color: #fff3f3; - color: #000; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/window.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/window.css deleted file mode 100644 index 9602f67d1..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/metro/window.css +++ /dev/null @@ -1,182 +0,0 @@ -.window { - overflow: hidden; - padding: 5px; - border-width: 1px; - border-style: solid; -} -.window .window-header { - background: transparent; - padding: 0px 0px 6px 0px; -} -.window .window-body { - border-width: 1px; - border-style: solid; - border-top-width: 0px; -} -.window .window-body-noheader { - border-top-width: 1px; -} -.window .panel-body-nobottom { - border-bottom-width: 0; -} -.window .window-header .panel-icon, -.window .window-header .panel-tool { - top: 50%; - margin-top: -11px; -} -.window .window-header .panel-icon { - left: 1px; -} -.window .window-header .panel-tool { - right: 1px; -} -.window .window-header .panel-with-icon { - padding-left: 18px; -} -.window-proxy { - position: absolute; - overflow: hidden; -} -.window-proxy-mask { - position: absolute; - filter: alpha(opacity=5); - opacity: 0.05; -} -.window-mask { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - filter: alpha(opacity=40); - opacity: 0.40; - font-size: 1px; - overflow: hidden; -} -.window, -.window-shadow { - position: absolute; - -moz-border-radius: 0px 0px 0px 0px; - -webkit-border-radius: 0px 0px 0px 0px; - border-radius: 0px 0px 0px 0px; -} -.window-shadow { - background: #eee; - -moz-box-shadow: 2px 2px 3px #ededed; - -webkit-box-shadow: 2px 2px 3px #ededed; - box-shadow: 2px 2px 3px #ededed; - filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2); -} -.window, -.window .window-body { - border-color: #ddd; -} -.window { - background-color: #ffffff; -} -.window-proxy { - border: 1px dashed #ddd; -} -.window-proxy-mask, -.window-mask { - background: #eee; -} -.window .panel-footer { - border: 1px solid #ddd; - position: relative; - top: -1px; -} -.window-thinborder { - padding: 0; -} -.window-thinborder .window-header { - padding: 5px 5px 6px 5px; -} -.window-thinborder .window-body { - border-width: 0px; -} -.window-thinborder .window-footer { - border-left: transparent; - border-right: transparent; - border-bottom: transparent; -} -.window-thinborder .window-header .panel-icon, -.window-thinborder .window-header .panel-tool { - margin-top: -9px; - margin-left: 5px; - margin-right: 5px; -} -.window-noborder { - border: 0; -} -.window.panel-hleft .window-header { - padding: 0 6px 0 0; -} -.window.panel-hright .window-header { - padding: 0 0 0 6px; -} -.window.panel-hleft>.panel-header .panel-title { - top: auto; - left: 16px; -} -.window.panel-hright>.panel-header .panel-title { - top: auto; - right: 16px; -} -.window.panel-hleft>.panel-header .panel-title-up, -.window.panel-hright>.panel-header .panel-title-up { - bottom: 0; -} -.window.panel-hleft .window-body { - border-width: 1px 1px 1px 0; -} -.window.panel-hright .window-body { - border-width: 1px 0 1px 1px; -} -.window.panel-hleft .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: 0; -} -.window.panel-hright .window-header .panel-icon { - top: 1px; - margin-top: 0; - left: auto; - right: 1px; -} -.window.panel-hleft .window-header .panel-tool, -.window.panel-hright .window-header .panel-tool { - margin-top: 0; - top: auto; - bottom: 1px; - right: auto; - margin-right: 0; - left: 50%; - margin-left: -11px; -} -.window.panel-hright .window-header .panel-tool { - left: auto; - right: 1px; -} -.window-thinborder.panel-hleft .window-header { - padding: 5px 6px 5px 5px; -} -.window-thinborder.panel-hright .window-header { - padding: 5px 5px 5px 6px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title { - left: 21px; -} -.window-thinborder.panel-hleft>.panel-header .panel-title-up, -.window-thinborder.panel-hright>.panel-header .panel-title-up { - bottom: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-icon, -.window-thinborder.panel-hright .window-header .panel-icon { - margin-top: 5px; -} -.window-thinborder.panel-hleft .window-header .panel-tool, -.window-thinborder.panel-hright .window-header .panel-tool { - left: 16px; - bottom: 5px; -} diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/mobile.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/mobile.css deleted file mode 100644 index ff5724521..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/mobile.css +++ /dev/null @@ -1,355 +0,0 @@ -*{ - box-sizing: border-box; -} -.m-toolbar{ - position: relative; - text-align: center; - min-height: 34px; -} -.m-toolbar .m-title{ - line-height: 34px; - font-size: 16px; - font-weight: bold; - text-align: center; -} -.m-left{ - position: absolute; - height: 100%; - vertical-align: middle; - top:0; - left:0; - z-index: 1; -} -.m-right{ - position: absolute; - height: 100%; - vertical-align: middle; - top:0; - right:0; - z-index: 1; -} -.m-left>.l-btn,.m-right>.l-btn, -.m-left>.switchbutton,.m-right>.switchbutton{ - position: relative; - vertical-align: top; - top: 50%; - margin-top: -15px; -} -.m-back::before,.m-next::after{ - display: inline-block; - box-sizing: border-box; - vertical-align: top; - border-style: solid; - -webkit-transform:rotate(45deg); - transform:rotate(45deg); - width: 12px; - height: 12px; - content: ''; - position: absolute; - top: 50%; - margin-top: -6px; -} -.m-back::before{ - border-width: 0 0 1px 1px; - left: 8px; -} -.m-next::after{ - border-width: 1px 1px 0 0; - right: 8px; -} -.m-back .l-btn-text{ - padding-left: 12px; -} -.m-next .l-btn-text{ - padding-right: 12px; -} -.m-buttongroup{ - display: inline-block; - margin: 0; - padding: 0; - overflow: hidden; - vertical-align: middle; -} -.m-buttongroup .l-btn{ - float: left; - margin-left: -1px; -} -.m-buttongroup .l-btn:last-child::after{ - content: ''; - clear: both; -} -.m-buttongroup .l-btn:not(:first-child):not(:last-child){ - border-radius: 0; -} -.m-buttongroup .l-btn:first-child{ - border-top-right-radius: 0; - border-bottom-right-radius: 0; - margin-left: 0; -} -.m-buttongroup .l-btn:last-child{ - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.m-buttongroup-justified{ - display: table; - table-layout: fixed; -} -.m-buttongroup-justified .l-btn{ - float: none; - display: table-cell; -} -.m-badge:not(.l-btn), -.l-btn.m-badge::after{ - display: inline-block; - min-width: 10px; - line-height: 1; - font-size: 12px; - text-align: center; - white-space: nowrap; - border-radius: 10px; - padding: 2px 4px; - border-style: solid; - border-width: 0px; - background-color: #d9534f; - color: #fff; - z-index: 99999; -} -.l-btn.m-badge::after, -.l-btn .m-badge{ - position: absolute; - top: -10px; - right: -10px; -} -.tabs-inner .m-badge{ - position: absolute; - top: 1px; - right: -10px; -} -.tabs-inner>.tabs-title>.m-badge{ - top: 0; - right: 0; -} -.tabs-header-bottom .tabs-inner>.tabs-title>.m-badge{ - top: auto; - bottom: 0; - right: 0; -} -.panel-footer .l-btn .l-btn-icon-top .m-badge, -.panel-footer .l-btn .l-btn-icon-bottom .m-badge{ - top: 0; - right: -10px; -} -.l-btn.m-badge::after{ - content: attr(data-badge); -} -.l-btn,.l-btn-left{ - overflow: visible; - position: relative; -} - -.m-in{ - -webkit-animation-timing-function: ease-out; - -webkit-animation-duration: 250ms; -} -.m-out{ - -webkit-animation-timing-function: ease-in; - -webkit-animation-duration: 250ms; -} -.m-slide-left.m-in{ - -webkit-animation-name: slideLeftIn; -} -.m-slide-left.m-out{ - -webkit-animation-name: slideLeftOut; -} -.m-slide-right.m-in{ - -webkit-animation-name: slideRightIn; -} -.m-slide-right.m-out{ - -webkit-animation-name: slideRightOut; -} -.m-slide-up.m-in{ - -webkit-animation-name: slideUpIn; -} -.m-slide-up.m-out{ - -webkit-animation-name: slideUpOut; -} -.m-slide-down.m-in{ - -webkit-animation-name: slideDownIn; -} -.m-slide-down.m-out{ - -webkit-animation-name: slideDownOut; -} - -@-webkit-keyframes slideLeftIn{ - from {-webkit-transform: translateX(100%);} - to {-webkit-transform: translateX(0);} -} -@-webkit-keyframes slideLeftOut{ - from {-webkit-transform: translateX(0);} - to {-webkit-transform: translateX(-100%);} -} -@-webkit-keyframes slideRightIn{ - from {-webkit-transform: translateX(-100%);} - to {-webkit-transform: translateX(0);} -} -@-webkit-keyframes slideRightOut{ - from {-webkit-transform: translateX(0);} - to {-webkit-transform: translateX(100%);} -} -@-webkit-keyframes slideUpIn{ - from {-webkit-transform: translateY(100%);} - to {-webkit-transform: translateY(0);} -} -@-webkit-keyframes slideUpOut{ - from {-webkit-transform: translateY(0);} - to {-webkit-transform: translateY(-100%);} -} -@-webkit-keyframes slideDownIn{ - from {-webkit-transform: translateY(-100%);} - to {-webkit-transform: translateY(0);} -} -@-webkit-keyframes slideDownOut{ - from {-webkit-transform: translateY(0);} - to {-webkit-transform: translateY(100%);} -} - -.m-fade.m-in{ - -webkit-animation-name: fadeIn; -} -.m-fade.m-out{ - -webkit-animation-name: fadeOut; -} - -@-webkit-keyframes fadeIn{ - from {opacity: 0;} - to {opacity: 1} -} -@-webkit-keyframes fadeOut{ - from {opacity: 1;} - to {opacity: 0;} -} - -.m-pop.m-in{ - -webkit-animation-name: popIn; -} -.m-pop.m-out{ - -webkit-animation-name: popOut; -} -@-webkit-keyframes popIn{ - from { - opacity: 0; - -webkit-transform: scale(.2); - } - to { - opacity: 1; - -webkit-transform: scale(1); - } -} -@-webkit-keyframes popOut{ - from { - opacity: 1; - -webkit-transform: scale(1); - } - to { - opacity: 0; - -webkit-transform: scale(0); - } -} - -.navpanel{ - position: absolute; -} -.textbox .textbox-text{ - padding: 0 4px; - height: 30px; - line-height: 30px; -} -.calendar-header,.calendar-title{ - height: 30px; -} -.calendar-title span{ - height: 30px; - line-height: 30px -} -.datebox-button{ - height: 24px; -} -.datebox-button a{ - line-height: 24px; -} -.tree-node{ - box-sizing: border-box; - height: 32px; - padding: 3px 0; -} - -.panel-title{ - height: 26px; - line-height: 26px; -} -.window{ - padding: 5px 0 0 0; -} -.window-shadow{ - -moz-box-shadow: 0 0 30px 0 #D3D3D3; - -webkit-box-shadow: 0 0 30px 0 #D3D3D3; - box-shadow: 0 0 30px 0 #D3D3D3; -} -.window-header .panel-title{ - height: 26px; - line-height: 26px; - text-align: center; -} -.window-header .panel-tool{ - display: none; -} -.window .window-body{ - border: 0; -} -.dialog-button{ - border-color: transparent; - overflow: hidden; -} -.dialog-button .l-btn{ - margin: 0; -} - -.tabs-justified, -.tabs-justified .l-btn, -.tabs-justified li a.tabs-inner, -.tabs-justified li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs-justified li.tabs-selected a.tabs-inner, -.tabs-header-bottom .tabs-justified li a.tabs-inner{ - -moz-border-radius:0; - -webkit-border-radius:0; - border-radius:0; -} - -.datagrid-row,.datagrid-header-row{ - height: 32px; -} -.datalist .datagrid-group-title, -.m-list .m-list-group{ - padding: 0 10px; -} -.datalist .datagrid-cell, -.m-list li{ - padding: 10px; -} -.m-list li .m-right{ - right: 10px; -} -.datalist .datalist-link, -.m-list li>a{ - margin: -10px; - padding: 10px; - padding-right: 24px; -} -.m-list li>a .m-right{ - right: 24px; -} -.datalist .datalist-link::after, -.m-list li>a::after{ - right: 12px; -} - diff --git a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/vue.css b/testapps/ResourceLoaderTest/src/main/resources/asset/themes/vue.css deleted file mode 100644 index da5e52cea..000000000 --- a/testapps/ResourceLoaderTest/src/main/resources/asset/themes/vue.css +++ /dev/null @@ -1,650 +0,0 @@ -*{ - box-sizing: border-box; -} -.f-block{ - display: block; - position: relative; -} -.f-row{ - display: -webkit-box; - display: -webkit-flex; - display: -moz-flex; - display: -ms-flexbox; - display: flex; - position: relative; -} -.f-column{ - display: -webkit-box; - display: -webkit-flex; - display: -moz-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-direction: normal; - -webkit-box-orient: vertical; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - position: relative; -} -.f-inline-row{ - white-space: nowrap; - display: -webkit-inline-box; - display: -ms-inline-box; - display: inline-flex; - vertical-align: middle; - position: relative; - align-items: stretch; - -webkit-tap-highlight-color: transparent; -} -.f-content-center{ - -webkit-box-pack: center; - -ms-flex-pack: center; - -webkit-justify-content: center; - -moz-justify-content: center; - justify-content: center; - -webkit-box-align: center; - -ms-flex-align: center; - -webkit-align-items: center; - -moz-align-items: center; - align-items: center; -} -.f-full{ - -webkit-box-flex: 1 1 auto; - -ms-flex: 1 1 auto; - flex: 1 1 auto; -} -.f-hide{ - display: none; -} -.f-order0{ - order: 0; -} -.f-order1{ - order: 1; -} -.f-order2{ - order: 2; -} -.f-order3{ - order: 3; -} -.f-order4{ - order: 4; -} -.f-order5{ - order: 5; -} -.f-order6{ - order: 6; -} -.f-order7{ - order: 7; -} -.f-order8{ - order: 8; -} -.f-noshrink{ - -webkit-flex-shrink: 0; - -moz-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} -.f-animate{ - transition: all .3s; -} -.f-field{ - width: 12em; - height: 30px; -} - -.scroll-body{ - overflow: auto; - position: relative; -} - -.textbox .textbox-text{ - width: 100%; - height: auto; - overflow: hidden; -} -.textbox-addon{ - align-items: center; -} -.textbox textarea.textbox-text{ - height: auto; - overflow: auto; -} -.textbox-disabled>.textbox-addon .textbox-icon, -.textbox-readonly>.textbox-addon .textbox-icon{ - cursor: default; -} -.textbox-disabled>.textbox-addon .textbox-icon:hover, -.textbox-readonly>.textbox-addon .textbox-icon:hover{ - opacity: 0.6; - cursor: default; -} -.textbox-addon .textbox-icon{ - width: 26px; - height: 18px; -} - -.spinner .textbox-text{ - height: auto; -} -.spinner-button-left,.spinner-button-right{ - width: 26px; -} -.spinner-button-updown{ - width: 26px; -} -.spinner-button-top,.spinner-button-bottom{ - position: absolute; - width: 100%; - height: 26px; -} -.spinner-button-top{ - top: 0; -} -.spinner-button-bottom{ - top: auto; - bottom: 0; -} -.spinner-button{ - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - left: 50%; - margin-left: -8px; - top: 50%; - margin-top: -8px; -} -.spinner-arrow{ - cursor: pointer; - opacity: 0.6; -} - -.textbox-disabled .spinner-arrow:hover, -.textbox-readonly .spinner-arrow:hover -{ - opacity: 0.6; - cursor: default; -} -.textbox-readonly .spinner-arrow .spinner-arrow-up:hover, -.textbox-disabled .spinner-arrow .spinner-arrow-up:hover, -.textbox-readonly .spinner-arrow .spinner-arrow-down:hover, -.textbox-disabled .spinner-arrow .spinner-arrow-down:hover -{ - cursor: default; -} - -.l-btn{ - width1: 100%; -} -.l-btn-empty{ - height: 28px; -} -.l-btn-large .l-btn-empty{ - height: 44px; -} -.l-btn-left{ - overflow: visible; -} -.m-btn .l-btn-left .m-btn-line{ - top: -100px; - width: 36px; - right: -20px; -} -.button-group .l-btn.f-inline-row{ - margin-left: -1px; -} -.button-group .l-btn:hover{ - z-index: 99; -} -.button-group .l-btn:not(:first-child):not(:last-child){ - border-radius: 0; -} -.button-group .l-btn:first-child{ - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.button-group .l-btn:last-child{ - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.switchbutton{ - width: 70px; - height: 30px; -} -.switchbutton-on,.switchbutton-off{ - position: absolute; - left: 0; - width: calc(100% - 15px); - height: 100%; -} -.switchbutton-on span,.switchbutton-off span,.switchbutton-handle span{ - height: 100%; -} -.switchbutton-on span{ - text-indent: -15px; -} -.switchbutton-off span{ - text-indent: 15px; -} -.switchbutton-off{ - left: calc(100% - 15px); -} -.switchbutton-handle{ - width: 30px; - left: auto; - right: 0; - z-index: 9; -} -.switchbutton-inner{ - transition: all 200ms ease-out; - overflow: visible; - position: absolute; - width: 100%; - top: -1px; - bottom: -1px; - left: calc(-100% + 30px); - right: auto; -} -.switchbutton-checked .switchbutton-inner{ - left: 0; -} -.draggable-reverting{ - transition: all 200ms ease-out; -} -.slider-h .slider-tip{ - transform: translateX(-50%); -} -.slider-h .slider-rulelabel span{ - transform: translateX(-50%); -} -.slider-v .slider-tip{ - margin-top: 0; - transform: translate(-100%,-50%); -} -.slider-v .slider-rulelabel span{ - transform: translateY(-50%); -} -.slider-v .slider-inner{ - height: auto; -} - - -.panel{ - position:relative; -} -.panel-title{ - height: 20px; - line-height: 20px; -} -.panel-footer-fixed{ - position:absolute; - width:100%; - bottom:0; -} -.window{ - position: absolute; -} -.window-mask{ - position: fixed; -} -.window .window-footer{ - top: 0; -} -.dialog-toolbar{ - border-width: 0 0 1px 0; -} -.dialog-button{ - border-width: 1px 0 0 0; - top: 0; -} - -.tabs{ - width: 100%; - height: auto; -} -.tabs-scrollable{ - transition: left 400ms, right 400ms; - position: absolute; - width: auto; - height: 100%; - left: 0; - top: 0; -} -.tabs li{ - display: inherit; -} -.tabs li a.tabs-inner{ - height: auto; - line-height: normal; - display: inherit; - overflow: hidden; -} -.tabs-title{ - display: inherit; - align-items: center; - line-height: normal; -} -.tabs-close{ - outline: none; -} -.tabs-scroller-left,.tabs-scroller-right{ - position: relative; - display: block; - width: 21px; - height: 100%; -} -.tabs-header-left .tabs li{ - right: -1px; -} -.tabs-header-left .tabs li,.tabs-header-right .tabs li, -.tabs-header-left .tabs li a.tabs-inner, -.tabs-header-right .tabs li a.tabs-inner{ - display: inherit; -} - -.combo-panel{ - position: absolute; - height: 200px; - z-index: 9999; -} -.combo-panel eui-virtual-scroll, -.combo-panel eui-datagrid, -.combo-panel eui-treegrid{ - width: 100%; - height: 100%; -} -.combobox-item{ - padding: 6px 4px; - line-height: 20px; -} -.tagbox-labels{ - padding-bottom: 4px; -} -.tagbox-label{ - height: 20px; - line-height: 20px; -} -.tagbox .textbox-text{ - width: 50px; - max-width: 100%; - margin-top: 4px; - padding-top: 0; - padding-bottom: 0; - height: 20px; - line-height: 20px; -} - -.datagrid,eui-datagrid, -eui-datagrid-view,eui-datagrid-body, -eui-treegrid-view,eui-treegrid-body{ - overflow: hidden; -} -.datagrid-view,.datagrid-view1,.datagrid-view2{ - position: relative; -} -.datagrid-vbody{ - overflow: hidden; -} -.datagrid-view3{ - margin-left: -1px; -} -.datagrid-view3 .datagrid-body{ - overflow: hidden; -} -.datagrid-view3 .datagrid-body-inner{ - padding-bottom: 20px; -} -.datagrid-view3 .datagrid-header td, -.datagrid-view3 .datagrid-body td, -.datagrid-view3 .datagrid-footer td { - border-width: 0 0 1px 1px; -} -.datagrid-htable,.datagrid-btable,.datagrid-ftable{ - table-layout: fixed; - width: 100%; -} -.datagrid-htable{ - height: 100%; -} -.datagrid-header .datagrid-header, -.datagrid-footer .datagrid-header{ - border-width: 0 0 0 1px; -} -.datagrid-header-inner,.datagrid-footer-inner{ - overflow: hidden; -} -.datagrid-header-row, .datagrid-row{ - height: 32px; -} -.datagrid-header td.datagrid-field-td{ - border-bottom: 0; -} -.datagrid-cell{ - text-align: left; - height: auto; - font-size: inherit; -} -.datagrid-cell-group{ - text-align: center; -} -.datagrid .datagrid-pager{ - padding: 2px 4px; - display: inherit; -} -.datagrid-loading{ - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - justify-content: center; - align-items: center; -} -.datagrid-mask{ - display: block; -} -.datagrid-mask-msg{ - display: block; - position: static; - line-height: 36px; - height: 40px; - margin: 0; - padding: 0 5px 0 30px; - z-index: 9; -} -.datagrid-body .datagrid-td-group{ - border-left-color: transparent; - border-right-color: transparent; -} -.datagrid-group-expander{ - cursor: pointer; -} -.datagrid-row-expander{ - display: inline-block; - width: 16px; - height: 18px; - cursor: pointer; -} -.datagrid-group-title{ - align-self: center; - padding: 0 4px; - white-space: nowrap; - word-break: normal; - position: relative; -} -.datagrid-editable> .f-field, -.datagrid-editable> *{ - width: 100%; - height: 31px; -} -.datagrid-editable .textbox, .datagrid-editable .textbox-text{ - border-radius: 0; -} -.datagrid-filter-row .textbox{ - border-radius: 0; -} -.datagrid-filter-c{ - padding: 4px; - height: 38px; -} -.datagrid-filter-c> .f-field, -.datagrid-filter-c> *{ - height: 30px; -} -.datagrid-filter-c .datagrid-editable-input{ - width: 100%; -} -.datagrid-filter-btn{ - width: 30px; -} -.datagrid-filter-btn .textbox-icon{ - width: 28px; -} -.datagrid-filter-btn .textbox{ - background-color: transparent; -} -.datagrid-filter-btn-left{ - margin-right: 4px; -} -.datagrid-filter-btn-right{ - margin-left: 4px; -} - -.menu-inline{ - position: relative; - display: inline; - margin: 0; - padding: 0; -} -.menu-inline> .menu-container{ - position: relative; -} -.menu-container{ - position: absolute; - left: 0; - top: 0; - min-width: 200px; -} -.menu{ - overflow: visible; -} -.menu-shadow{ - width: 100%; - height: 100%; - left: 0; - top: 0; -} -.menu-item{ - overflow: visible; -} -.menu-text{ - height: 32px; - line-height: 32px; - float: none; -} -.menu-line{ - z-index: 9999999; - height: 100%; -} -.menu-active{ - z-index: 99999999; -} - -.progressbar-value{ - overflow: visible; -} - -.searchbox .textbox-button, -.searchbox .textbox-button:hover{ - position: inherit; -} - -.calendar-content{ - position: absolute; - width: 100%; - height: 100%; - left: 0; - top: 0; -} -.calendar-menu{ - position: absolute; - width: 100%; - height: 100%; -} -.calendar-menu-month-inner{ - position: relative; -} - -eui-tagbox{ - width: 12em; - height: auto; - min-height: 30px; -} -eui-switchbutton{ - width: 70px; - height: 30px; -} -.radiobutton{ - width: 20px; - height: 20px; -} -.checkbox{ - width: 20px; - height: 20px; -} -.progressbar{ - height: 24px; -} -.pagination1{ - height: 34px; - padding: 2px; -} -eui-layout{ - display: block; -} -.layout{ - height: 100%; -} -.layout-animate{ - transition: transform 400ms; -} -.layout-panel-north,.layout-panel-south{ - position: absolute; - width: 100%; - left: 0; - top: 0; -} -.layout-panel-south{ - top: auto; - bottom: 0; -} -.layout-panel-west,.layout-panel-east{ - position: absolute; - left: 0; - top: 0; - bottom: 0; -} -.layout-panel-east{ - left: auto; - right: 0; -} -.layout-panel-west.layout-collapsed{ - transform: translate3d(-100%, 0, 0); -} -.layout-panel-east.layout-collapsed{ - transform: translate3d(100%, 0, 0) -} -.layout-panel-north.layout-collapsed{ - transform: translate3d(0, -100%, 0) -} -.layout-panel-south.layout-collapsed{ - transform: translate3d(0, 100%, 0) -} - From a9bb6ede5682d99aa6042b68a62f5cb04bda89bc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 16 Aug 2018 07:03:21 +1000 Subject: [PATCH 063/730] Controller.Util.download API completeness; attachmentName inferring logic improvement --- src/main/java/act/app/ActionContext.java | 20 ++++++++++++++++++++ src/main/java/act/controller/Controller.java | 16 +++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index b010101ce..8cd32baf9 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -51,7 +51,9 @@ import org.osgl.util.*; import org.osgl.web.util.UserAgent; +import java.io.File; import java.lang.annotation.Annotation; +import java.net.URL; import java.util.*; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; @@ -286,6 +288,24 @@ public String attachmentName() { return s + "." + accept().name(); } + public String attachmentName(URL url) { + String path = url.getPath(); + String name = path.contains("/") ? S.cut(path).afterLast("/") : path; + if (!name.contains(".")) { + name = name + "." + accept().name(); + } + return name; + } + + public String attachmentName(File file) { + String path = file.getName(); + String name = path.contains("/") ? S.cut(path).afterLast("/") : path; + if (!name.contains(".")) { + name = name + "." + accept().name(); + } + return name; + } + public void markAsRequireCaptcha() { this.requireCaptcha = true; } diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 07fa3d9bd..cd4547f81 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1383,15 +1383,19 @@ public static RenderBinary renderBinary(byte[] blob, String attachmentName) { } /** - * Returns a {@link RenderBinary} result with a URL. The result will render - * the binary using "attachment" content disposition. + * Returns a {@link RenderBinary} result with a URL. + * + * The result will render the binary using "attachment" content disposition. + * + * The name of the attachment is inferred from URL. + * * * @param url * the URL to be rendered * @return a `RenderBinary` result as described above */ public static RenderBinary download(URL url) { - return new RenderBinary(IO.is(url), ActionContext.current().attachmentName(), false); + return new RenderBinary(IO.inputStream(url), ActionContext.current().attachmentName(url), false); } /** @@ -1405,19 +1409,21 @@ public static RenderBinary download(URL url) { * @return a `RenderBinary` result as described above */ public static RenderBinary download(URL url, String attachmentName) { - return new RenderBinary(IO.is(url), attachmentName, false); + return new RenderBinary(IO.inputStream(url), attachmentName, false); } /** * Returns a {@link RenderBinary} result with a file. The result will render * the binary using "attachment" content disposition. * + * The name of the attachment is inferred from file + * * @param file * the file to be rendered * @return a `RenderBinary` result as described above */ public static RenderBinary download(File file) { - return new RenderBinary(file, file.getName(), false); + return new RenderBinary(file, ActionContext.current().attachmentName(file), false); } /** From ab503b3c3e4704cc64ce64d9ffabfcf6813e20e6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 16 Aug 2018 10:49:50 +1000 Subject: [PATCH 064/730] fix stateless infer logic issue that breaks UND CI --- src/main/java/act/util/ReflectedInvokerHelper.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 37daab4ce..625dcde1e 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -65,6 +65,9 @@ public static boolean isGlobalOrStateless(Field field) { } private static boolean isGlobalOrStateless(Class type, Set circularReferenceDetector) { + if ($.isSimpleType(type)) { + return false; + } if (Act.app().isSingleton(type) || AppServiceBase.class.isAssignableFrom(type) || _hasGlobalOrStatelessAnnotations(type)) { return true; } @@ -90,9 +93,6 @@ private static boolean _isGlobalOrStateless(Class type, Set circularRefer private static boolean isGlobalOrStateless(Field field, Set circularReferenceDetector) { Class fieldType = field.getType(); - if ($.isSimpleType(fieldType)) { - return false; - } if (_hasGlobalOrStatelessAnnotations(field)) { return true; } From 9565ed73a96602dba621bcbecf34f3e4f5ac5960 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 16 Aug 2018 21:36:53 +1000 Subject: [PATCH 065/730] fix 796 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 2 +- src/main/java/act/controller/Controller.java | 1 - src/main/java/act/util/JsonUtilConfig.java | 2 +- src/main/java/act/util/PropertySpec.java | 9 +++++++-- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b445fcf7..1049408bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `@PropertySpec` annotation now cause `NullPointerException` on JSON output #796 * Add `renderBinary(byte[])` and `renderBinary(byte[], String)` method to `Controller.Util` #793 * Attach `PropertySpec` info to `ActionContext` #792 * Resource loader - allow loading from excel file #790 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 8cd32baf9..9f6cd6f69 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -428,7 +428,7 @@ public String urlContext() { */ public UrlPath urlPath() { if (null == urlPath) { - urlPath = UrlPath.of(req().path()); + urlPath = UrlPath.of(null == processedUrl ? req().url() : processedUrl); } return urlPath; } diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index cd4547f81..15bc628db 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1791,7 +1791,6 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } else { boolean isArray = vCls.isArray(); PropertySpec.MetaInfo propertySpec = PropertySpec.MetaInfo.withCurrent(meta, context); - context.propertySpec(propertySpec); return inferPrimitiveResult(v, context, false, requireXML, isArray, isDateTimeType); } } diff --git a/src/main/java/act/util/JsonUtilConfig.java b/src/main/java/act/util/JsonUtilConfig.java index 03109f41f..c75332bb7 100644 --- a/src/main/java/act/util/JsonUtilConfig.java +++ b/src/main/java/act/util/JsonUtilConfig.java @@ -87,7 +87,7 @@ public JsonWriter(Object v, PropertySpec.MetaInfo spec, boolean format, ActConte } else { this.dateFormat = new SimpleDateFormat(dateFormatPattern, locale); } - this.disableCircularReferenceDetect = context.isDisableCircularReferenceDetect(); + this.disableCircularReferenceDetect = null == spec && context.isDisableCircularReferenceDetect(); this.filters = initFilters(v, spec, context); this.features = initFeatures(format, context); } diff --git a/src/main/java/act/util/PropertySpec.java b/src/main/java/act/util/PropertySpec.java index 1c16453af..b09582c04 100644 --- a/src/main/java/act/util/PropertySpec.java +++ b/src/main/java/act/util/PropertySpec.java @@ -276,6 +276,7 @@ private Spec spec(ActContext context) { } public static MetaInfo withCurrent(MetaInfo builtIn, ActContext context) { + MetaInfo retVal = builtIn; String s = PropertySpec.current.get(); if (S.notBlank(s)) { PropertySpec.MetaInfo spec = new PropertySpec.MetaInfo(); @@ -284,9 +285,13 @@ public static MetaInfo withCurrent(MetaInfo builtIn, ActContext context) { } else { spec.onHttp(s); } - return spec; + retVal = spec; } - return builtIn; + if (context instanceof ActionContext) { + ActionContext actionContext = (ActionContext) context; + actionContext.propertySpec(retVal); + } + return retVal; } public static MetaInfo withCurrent(HandlerMethodMetaInfo methodMetaInfo, ActContext context) { From 5c0b412080e76a74e5ad2cae8a3efee189091fc8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 17 Aug 2018 18:20:21 +1000 Subject: [PATCH 066/730] fxi #797 --- CHANGELOG.md | 1 + src/main/java/act/e2e/Scenario.java | 25 ++++++++++++++++-- src/main/java/act/e2e/func/Func.java | 26 +++++++++++++++++++ src/main/java/act/util/ActContext.java | 6 ++++- .../src/main/java/ghissues/Gh797.java | 23 ++++++++++++++++ .../src/main/java/ghissues/Gh798.java | 25 ++++++++++++++++++ .../src/main/resources/e2e/scenarios/797.yml | 9 +++++++ .../src/main/resources/e2e/scenarios/798.yml | 8 ++++++ 8 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh797.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh798.java create mode 100644 testapps/GHIssues/src/main/resources/e2e/scenarios/797.yml create mode 100644 testapps/GHIssues/src/main/resources/e2e/scenarios/798.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 1049408bd..f7281b477 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* JSON output: default format for `java.util.Date` missing time part #797 * `@PropertySpec` annotation now cause `NullPointerException` on JSON output #796 * Add `renderBinary(byte[])` and `renderBinary(byte[], String)` method to `Controller.Util` #793 * Attach `PropertySpec` info to `ActionContext` #792 diff --git a/src/main/java/act/e2e/Scenario.java b/src/main/java/act/e2e/Scenario.java index 09fb36dbf..50128e61d 100644 --- a/src/main/java/act/e2e/Scenario.java +++ b/src/main/java/act/e2e/Scenario.java @@ -603,8 +603,29 @@ void verifyList(String name, List array, Map spec) { void verifyJsonObject(JSONObject obj, Map jsonSpec) { for (Map.Entry entry : jsonSpec.entrySet()) { String key = entry.getKey(); - Object value = $.getProperty(obj, key); - verifyValue(key, value, entry.getValue()); + // ${sizeOf(date)} + if (key.startsWith("${")) { + // sizeOf(date)} + String s = key.substring(2); + + // sizeOf(date) + s = s.substring(0, s.length() - 1); + + // sizeOf + String funcName = s.substring(0, s.indexOf("(")); + + // date) + s = s.substring(s.indexOf("(") + 1); + // date + String varName = s.substring(0, s.length() - 1); + + Object val = $.getProperty(obj, varName); + val = evalFunc(funcName + "(" + val + ")"); + verifyValue(key, val, entry.getValue()); + } else { + Object val = $.getProperty(obj, key); + verifyValue(key, val, entry.getValue()); + } } } diff --git a/src/main/java/act/e2e/func/Func.java b/src/main/java/act/e2e/func/Func.java index 1753101f4..4142b878f 100644 --- a/src/main/java/act/e2e/func/Func.java +++ b/src/main/java/act/e2e/func/Func.java @@ -27,6 +27,8 @@ import org.osgl.util.*; import org.osgl.util.converter.TypeConverterRegistry; +import java.lang.reflect.Array; +import java.util.Collection; import java.util.List; public abstract class Func extends NamedLogic { @@ -53,6 +55,30 @@ protected List aliases() { } } + public static class SizeOf extends Func { + + int size; + + @Override + public void init(Object param) { + if (param instanceof Collection) { + Collection collection = $.cast(param); + size = collection.size(); + } else if (param instanceof CharSequence) { + CharSequence charSequence = $.cast(param); + size = charSequence.length(); + } else if (param.getClass().isArray()) { + size = Array.getLength(param); + } else { + throw new UnsupportedOperationException("SizeOf cannot be applied to " + param.getClass()); + } + } + + @Override + public Object apply() { + return size; + } + } public static class AfterLast extends Func { diff --git a/src/main/java/act/util/ActContext.java b/src/main/java/act/util/ActContext.java index 46c342ba2..f29c233ba 100644 --- a/src/main/java/act/util/ActContext.java +++ b/src/main/java/act/util/ActContext.java @@ -380,8 +380,12 @@ public CTX dateFormatPattern(String pattern) { } public String dateFormatPattern() { + return dateFormatPattern(false); + } + + public String dateFormatPattern(boolean required) { String ptn = this.dateFormatPattern; - return null == ptn ? config().datePattern() : ptn; + return null == ptn && required ? config().datePattern() : ptn; } @Override diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh797.java b/testapps/GHIssues/src/main/java/ghissues/Gh797.java new file mode 100644 index 000000000..dddc0ec0a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh797.java @@ -0,0 +1,23 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import act.util.LogSupport; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Date; + +@UrlContext("797") +@JsonView +public class Gh797 extends LogSupport { + + public static class Foo { + public Date date = new Date(); + } + + @GetAction + public Foo foo() { + return new Foo(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh798.java b/testapps/GHIssues/src/main/java/ghissues/Gh798.java new file mode 100644 index 000000000..c21c3838c --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh798.java @@ -0,0 +1,25 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import act.util.LogSupport; +import com.alibaba.fastjson.annotation.JSONField; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Date; + +@UrlContext("798") +@JsonView +public class Gh798 extends LogSupport { + + public static class Foo { + @JSONField(format = "yyyy-MM") + public Date date = new Date(); + } + + @GetAction + public Foo foo() { + return new Foo(); + } + +} diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/797.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios/797.yml new file mode 100644 index 000000000..bac6c1773 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/e2e/scenarios/797.yml @@ -0,0 +1,9 @@ +Scenario(GH797): + interactions: + - description: Test + request: + get: 797 + response: + json: + ${sizeOf(date)}: + - gt: 15 diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/798.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios/798.yml new file mode 100644 index 000000000..ed65637a7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/e2e/scenarios/798.yml @@ -0,0 +1,8 @@ +Scenario(GH798): + interactions: + - description: Test + request: + get: 798 + response: + json: + ${sizeOf(date)}: 7 From a5ac8a6f182b66260a8842e5a8badeb914ca3212 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 17 Aug 2018 19:01:44 +1000 Subject: [PATCH 067/730] fix #798 --- src/main/java/act/app/ActionContext.java | 10 ++++++++ .../impl/ReflectedHandlerInvoker.java | 23 +++++++++++++++++++ src/main/java/act/util/JsonUtilConfig.java | 13 +++++++---- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 9f6cd6f69..eae7057b7 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -115,6 +115,7 @@ public class ActionContext extends ActContext.Base implements Des private boolean readyForDestroy; private int resultHash = Integer.MIN_VALUE; private PropertySpec.MetaInfo propSpec; + private boolean suppressJsonDateFormat; // see https://github.com/actframework/actframework/issues/492 public String encodedSessionToken; @@ -306,6 +307,15 @@ public String attachmentName(File file) { return name; } + public boolean shouldSuppressJsonDateFormat() { + return suppressJsonDateFormat; + } + + public ActionContext suppressJsonDateFormat() { + this.suppressJsonDateFormat = true; + return this; + } + public void markAsRequireCaptcha() { this.requireCaptcha = true; } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 39c587c5e..76e4d19f9 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -63,6 +63,7 @@ import act.ws.WebSocketConnectionManager; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.serializer.SerializeFilter; import com.alibaba.fastjson.serializer.SerializerFeature; import com.esotericsoftware.reflectasm.MethodAccess; @@ -162,6 +163,8 @@ public void visit(H.Format format) throws $.Break { private boolean returnString; private boolean fullJsonStringChecked; private boolean fullJsonStringCheckFailure; + // See https://github.com/actframework/actframework/issues/797 + private boolean suppressJsonDateFormat; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -202,6 +205,8 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.requireCaptcha = true; } + this.suppressJsonDateFormat = shouldSuppressJsonDateFormat(); + Throttled throttleControl = method.getAnnotation(Throttled.class); if (null != throttleControl) { int throttle = throttleControl.value(); @@ -410,6 +415,10 @@ public Result handle(final ActionContext context) { return result; } + if (suppressJsonDateFormat) { + context.suppressJsonDateFormat(); + } + if (requireCaptcha) { context.markAsRequireCaptcha(); } @@ -945,6 +954,20 @@ public boolean hasAnnotation(Class annoType) { return (null != method.getAnnotation(annoType)) || null != controllerClass.getAnnotation(annoType); } + private boolean shouldSuppressJsonDateFormat() { + Class returnType = method.getReturnType(); + List fields = $.fieldsOf(returnType); + for (Field field : fields) { + JSONField jsonField = field.getAnnotation(JSONField.class); + if (null != jsonField) { + if (S.notBlank(jsonField.format())) { + return true; + } + } + } + return false; + } + public static ControllerAction createControllerAction(ActionMethodMetaInfo meta, App app) { return new ControllerAction(new ReflectedHandlerInvoker(meta, app)); } diff --git a/src/main/java/act/util/JsonUtilConfig.java b/src/main/java/act/util/JsonUtilConfig.java index c75332bb7..8da13039e 100644 --- a/src/main/java/act/util/JsonUtilConfig.java +++ b/src/main/java/act/util/JsonUtilConfig.java @@ -23,6 +23,7 @@ import static com.alibaba.fastjson.JSON.DEFAULT_GENERATE_FEATURE; import act.Act; +import act.app.ActionContext; import act.app.App; import act.cli.util.MappedFastJsonNameFilter; import act.conf.AppConfig; @@ -78,11 +79,15 @@ public JsonWriter(Object v, PropertySpec.MetaInfo spec, boolean format, ActConte Locale locale = null == context ? config.locale() : context.locale(true); String dateFormatPattern = null == context ? null : context.dateFormatPattern(); if (S.blank(dateFormatPattern)) { - if (!config.i18nEnabled() || locale.equals(config.locale())) { - this.dateFormat = config.dateTimeFormat(); + if (context instanceof ActionContext && ((ActionContext) context).shouldSuppressJsonDateFormat()) { + this.dateFormat = null; } else { - dateFormatPattern = config.localizedDateTimePattern(locale); - this.dateFormat = new SimpleDateFormat(dateFormatPattern, locale); + if (!config.i18nEnabled() || locale.equals(config.locale())) { + this.dateFormat = config.dateTimeFormat(); + } else { + dateFormatPattern = config.localizedDateTimePattern(locale); + this.dateFormat = new SimpleDateFormat(dateFormatPattern, locale); + } } } else { this.dateFormat = new SimpleDateFormat(dateFormatPattern, locale); From d3dd29ec585110e8f57d597d2edcdab7e7e6a555 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 18 Aug 2018 06:51:19 +1000 Subject: [PATCH 068/730] fix #798 --- CHANGELOG.md | 1 + src/main/java/act/e2e/Scenario.java | 2 +- .../src/main/java/ghissues/Gh796.java | 24 +++++++++++++++++++ .../src/main/resources/e2e/scenarios/796.yml | 11 +++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh796.java create mode 100644 testapps/GHIssues/src/main/resources/e2e/scenarios/796.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index f7281b477..c01b3d2f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `@JSONField(format = "yyyy-MM")` setting not work #798 * JSON output: default format for `java.util.Date` missing time part #797 * `@PropertySpec` annotation now cause `NullPointerException` on JSON output #796 * Add `renderBinary(byte[])` and `renderBinary(byte[], String)` method to `Controller.Util` #793 diff --git a/src/main/java/act/e2e/Scenario.java b/src/main/java/act/e2e/Scenario.java index 50128e61d..137f67cbd 100644 --- a/src/main/java/act/e2e/Scenario.java +++ b/src/main/java/act/e2e/Scenario.java @@ -481,7 +481,7 @@ private boolean run(Interaction interaction) { String ref = entry.getValue(); Object value = ref.contains("${") ? processStringSubstitution(ref) : getLastVal(ref); if (null != value) { - cache.put(entry.getKey(), value); + cache(entry.getKey(), value); } } return true; diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh796.java b/testapps/GHIssues/src/main/java/ghissues/Gh796.java new file mode 100644 index 000000000..96bb7b9b5 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh796.java @@ -0,0 +1,24 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.*; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.N; +import org.osgl.util.S; + +@UrlContext("796") +@JsonView +public class Gh796 extends LogSupport { + + public static class Foo { + public String text = S.random(); + public int id = N.randInt(); + } + + @GetAction + @PropertySpec("-id") + public Foo foo() { + return new Foo(); + } + +} diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/796.yml b/testapps/GHIssues/src/main/resources/e2e/scenarios/796.yml new file mode 100644 index 000000000..f74ba4554 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/e2e/scenarios/796.yml @@ -0,0 +1,11 @@ +Scenario(GH796): + interactions: + - description: Test + request: + get: 796 + response: + json: + text: + - exists: true + id: + - exists: false \ No newline at end of file From 322aefc525496929f17f76f13811f6935123b162 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 18 Aug 2018 08:21:53 +1000 Subject: [PATCH 069/730] fix #799 --- CHANGELOG.md | 1 + src/main/java/act/e2e/func/Func.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c01b3d2f2..3cb0dea9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* e2e function: It generated invalid email #799 * `@JSONField(format = "yyyy-MM")` setting not work #798 * JSON output: default format for `java.util.Date` missing time part #797 * `@PropertySpec` annotation now cause `NullPointerException` on JSON output #796 diff --git a/src/main/java/act/e2e/func/Func.java b/src/main/java/act/e2e/func/Func.java index 4142b878f..2e2be93a5 100644 --- a/src/main/java/act/e2e/func/Func.java +++ b/src/main/java/act/e2e/func/Func.java @@ -46,7 +46,7 @@ public Object apply() { String email = Act.getInstance(Inbox.class).account; S.Pair pair = S.binarySplit(email, '@'); String username = pair.left(); - return S.concat(username, "+", S.random(N.randInt(5) + 2), "@", pair.right()); + return S.concat(username, "+", S.shortUrlSafeRandom(), "@", pair.right()); } @Override @@ -229,7 +229,7 @@ public Object apply() { if (length < 1) { length = 5 + N.randInt(10); } - return S.random(length); + return S.urlSafeRandom(length); } @Override From 73904b7861fa2c4d236bb6ee78933aa258274f3c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 18 Aug 2018 14:20:14 +1000 Subject: [PATCH 070/730] fix #801 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/Endpoint.java | 29 ++++++++++++++++--- .../act/apidoc/SampleDataProviderManager.java | 2 +- .../act/apidoc/sampledata/EmailProvider.java | 2 +- .../sampledata/StringListStringProvider.java | 10 ++++++- 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cb0dea9c..b9046c6b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* APIDoc - make sample email matches sample firstname and lastname #801 * e2e function: It generated invalid email #799 * `@JSONField(format = "yyyy-MM")` setting not work #798 * JSON output: default format for `java.util.Date` missing time part #797 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 269e99a4a..8dbf655bb 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -20,6 +20,8 @@ * #L% */ +import static act.apidoc.SampleDataCategory.EMAIL; + import act.Act; import act.app.data.StringValueResolverManager; import act.conf.AppConfig; @@ -650,6 +652,7 @@ private Object generateSampleData(BeanSpec spec, Map typeParamLoo obj = Act.getInstance(classType); List fields = $.fieldsOf(classType); Injector injector = Act.injector(); + Field emailField = null; for (Field field : fields) { if (Modifier.isStatic(field.getModifiers())) { continue; @@ -671,15 +674,23 @@ private Object generateSampleData(BeanSpec spec, Map typeParamLoo fieldType = field.getType(); } BeanSpec fieldSpec = BeanSpec.of(fieldType, annotations, fieldName, injector, field.getModifiers(), typeParamLookup); - val = generateSampleData(fieldSpec, typeParamLookup, C.newSet(typeChain), C.newList(nameChain)); - Class valType = null == val ? null : val.getClass(); - if (null != valType && fieldClass.isAssignableFrom(valType)) { - field.set(obj, val); + if (null == emailField && isEmail(fieldSpec)) { + emailField = field; + } else { + val = generateSampleData(fieldSpec, typeParamLookup, C.newSet(typeChain), C.newList(nameChain)); + Class valType = null == val ? null : val.getClass(); + if (null != valType && fieldClass.isAssignableFrom(valType)) { + field.set(obj, val); + } } } catch (Exception e) { LOGGER.warn("Error setting value[%s] to field[%s.%s]", val, classType.getSimpleName(), field.getName()); } } + if (null != emailField) { + String mockEmail = sampleDataProviderManager.getSampleData(SampleDataCategory.EMAIL, name, String.class); + $.setFieldValue(obj, emailField, mockEmail); + } return obj; } catch (Exception e) { LOGGER.warn("error generating sample data for type: %s", classType); @@ -690,6 +701,16 @@ private Object generateSampleData(BeanSpec spec, Map typeParamLoo } } + private boolean isEmail(BeanSpec spec) { + SampleData.Category anno = spec.getAnnotation(SampleData.Category.class); + SampleDataCategory category = null != anno ? anno.value() : null; + if (null != category && category != EMAIL) { + return false; + } + category = SampleDataCategory.of(spec.name()); + return category == EMAIL; + } + private static StringValueResolver stringValueResolver(Class type) { return Act.app().resolverManager().resolver(type); } diff --git a/src/main/java/act/apidoc/SampleDataProviderManager.java b/src/main/java/act/apidoc/SampleDataProviderManager.java index c38d41185..47e2196f8 100644 --- a/src/main/java/act/apidoc/SampleDataProviderManager.java +++ b/src/main/java/act/apidoc/SampleDataProviderManager.java @@ -162,7 +162,7 @@ private SampleDataProvider getProvider(Key key) { return provider; } - private static SampleDataCategory categoryOf(SampleDataCategory category, String name) { + static SampleDataCategory categoryOf(SampleDataCategory category, String name) { return null != category ? category : SampleDataCategory.of(name); } } diff --git a/src/main/java/act/apidoc/sampledata/EmailProvider.java b/src/main/java/act/apidoc/sampledata/EmailProvider.java index 2e67137cc..90c2e8813 100644 --- a/src/main/java/act/apidoc/sampledata/EmailProvider.java +++ b/src/main/java/act/apidoc/sampledata/EmailProvider.java @@ -42,6 +42,6 @@ public class EmailProvider extends SampleDataProvider { @Override public String get() { - return S.fmt("%s.%s@%s", firstNameProvider.get(), lastNameProvider.get(), hostProvider.get()).toLowerCase(); + return S.fmt("%s.%s@%s", firstNameProvider.getLast(), lastNameProvider.getLast(), hostProvider.get()).toLowerCase(); } } diff --git a/src/main/java/act/apidoc/sampledata/StringListStringProvider.java b/src/main/java/act/apidoc/sampledata/StringListStringProvider.java index 56757ce03..7214cb373 100644 --- a/src/main/java/act/apidoc/sampledata/StringListStringProvider.java +++ b/src/main/java/act/apidoc/sampledata/StringListStringProvider.java @@ -21,8 +21,16 @@ */ public abstract class StringListStringProvider extends StringListProvider { + + private String last; + @Override public String get() { - return randomStr(); + last = randomStr(); + return last; + } + + public String getLast() { + return null == last ? get() : last; } } From 8949acd7b2b54be611562ee083e7cb4c01783725 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 19 Aug 2018 14:40:05 +1000 Subject: [PATCH 071/730] fix #800 and #801 --- CHANGELOG.md | 2 + src/main/java/act/apidoc/Endpoint.java | 54 +++++++++++++------ .../java/act/apidoc/SampleDataCategory.java | 1 + .../act/apidoc/SampleDataProviderManager.java | 35 ++++++++---- .../apidoc/sampledata/PasswordProvider.java | 35 ++++++++++++ .../apidoc/sampledata/PasswordProvider2.java | 39 ++++++++++++++ src/main/java/act/data/ClassResolver.java | 31 +++++++++++ src/main/java/act/e2e/E2E.java | 29 +++++++++- src/main/java/act/e2e/RequestSpec.java | 9 ++++ src/main/java/act/e2e/Scenario.java | 33 ++++++++++-- .../e2e/func/SampleDataProviderAdaptor.java | 3 +- src/main/java/act/util/JsonUtilConfig.java | 19 +++++-- 12 files changed, 253 insertions(+), 37 deletions(-) create mode 100644 src/main/java/act/apidoc/sampledata/PasswordProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/PasswordProvider2.java create mode 100644 src/main/java/act/data/ClassResolver.java diff --git a/CHANGELOG.md b/CHANGELOG.md index b9046c6b4..33cd714a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ # ActFramework Change Log **1.8.8** +* JSON request resolving - binding String to class issue #802 * APIDoc - make sample email matches sample firstname and lastname #801 +* e2e - random model data generation #800 * e2e function: It generated invalid email #799 * `@JSONField(format = "yyyy-MM")` setting not work #798 * JSON output: default format for `java.util.Date` missing time part #797 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 8dbf655bb..455585a85 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -198,7 +198,6 @@ public enum Scheme { private String sampleJsonPost; private String sampleQuery; private Class controllerClass; - private Locale defLocale; private transient SampleDataProviderManager sampleDataProviderManager; Endpoint(int port, H.Method httpMethod, String path, RequestHandler handler) { @@ -208,7 +207,6 @@ public enum Scheme { this.path = null == urlContext || path.startsWith("/~/") ? $.requireNotNull(path) : S.concat(urlContext, $.requireNotNull(path)); this.handler = handler.toString(); this.port = port; - this.defLocale = conf.locale(); this.sampleDataProviderManager = Act.app().sampleDataProviderManager(); explore(handler); } @@ -324,7 +322,7 @@ private void explore(RequestHandler handler) { if (controllerClass != method.getDeclaringClass()) { typeParamLookup = Generics.buildTypeParamImplLookup(controllerClass); } - returnSample = generateSampleJson(BeanSpec.of(returnType, null, Act.injector(), typeParamLookup), typeParamLookup); + returnSample = void.class == returnType ? null : generateSampleJson(BeanSpec.of(returnType, null, Act.injector(), typeParamLookup), typeParamLookup); Description descAnno = method.getAnnotation(Description.class); this.description = null == descAnno ? id(controllerClass, method) : descAnno.value(); exploreParamInfo(method, typeParamLookup); @@ -445,7 +443,7 @@ private boolean isLoginUser(Annotation[] annos) { private String generateSampleJson(BeanSpec spec, Map typeParamLookup) { Class type = spec.rawType(); - if (Result.class.isAssignableFrom(type)) { + if (Result.class.isAssignableFrom(type) || void.class == type) { return null; } Object sample = generateSampleData(spec, typeParamLookup, new HashSet(), new ArrayList()); @@ -538,7 +536,18 @@ private static boolean isCollection(Type type) { } private Object generateSampleData(BeanSpec spec, Map typeParamLookup, Set typeChain, List nameChain) { + return generateSampleData(spec, typeParamLookup, typeChain, nameChain, fastJsonPropertyPreFilter); + } + + public static Object generateSampleData( + BeanSpec spec, Map typeParamLookup, + Set typeChain, List nameChain, + FastJsonPropertyPreFilter fastJsonPropertyPreFilter + ) { Type type = spec.type(); + if (void.class == type) { + return null; + } if (typeChain.contains(type) && !isCollection(type)) { return S.concat(spec.name(), ":", type); // circular reference detected } @@ -560,6 +569,11 @@ private Object generateSampleData(BeanSpec spec, Map typeParamLoo SampleData.Category anno = spec.getAnnotation(SampleData.Category.class); SampleDataCategory category = null != anno ? anno.value() : null; Class classType = spec.rawType(); + SampleDataProviderManager sampleDataProviderManager = Act.app().sampleDataProviderManager(); + Object o = sampleDataProviderManager.getSampleData(category, name, classType, false); + if (null != o) { + return o; + } try { if (void.class == classType || Void.class == classType || Result.class.isAssignableFrom(classType)) { return null; @@ -573,7 +587,7 @@ private Object generateSampleData(BeanSpec spec, Map typeParamLoo int len = ea.length; return 0 < len ? ea[N.randInt(len)] : null; } else if (Locale.class == classType) { - return (defLocale); + return (Act.appConfig().locale()); } else if (String.class == classType) { String mockValue = sampleDataProviderManager.getSampleData(category, name, String.class); if (spec.hasAnnotation(Sensitive.class)) { @@ -582,8 +596,8 @@ private Object generateSampleData(BeanSpec spec, Map typeParamLoo return mockValue; } else if (classType.isArray()) { Object sample = Array.newInstance(classType.getComponentType(), 2); - Array.set(sample, 0, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain))); - Array.set(sample, 1, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain))); + Array.set(sample, 0, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); + Array.set(sample, 1, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); return sample; } else if ($.isSimpleType(classType)) { if (Enum.class == classType) { @@ -622,11 +636,11 @@ private Object generateSampleData(BeanSpec spec, Map typeParamLoo Type keyType = typeParams.get(0); Type valType = typeParams.get(1); map.put( - generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain)), - generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain))); + generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter), + generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); map.put( - generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain)), - generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain))); + generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter), + generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); } } else if (Iterable.class.isAssignableFrom(classType)) { Collection col = $.cast(Act.getInstance(classType)); @@ -638,8 +652,8 @@ private Object generateSampleData(BeanSpec spec, Map typeParamLoo col.add(S.random()); } else { Type componentType = typeParams.get(0); - col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain))); - col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain))); + col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); + col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); } return col; } @@ -677,9 +691,15 @@ private Object generateSampleData(BeanSpec spec, Map typeParamLoo if (null == emailField && isEmail(fieldSpec)) { emailField = field; } else { - val = generateSampleData(fieldSpec, typeParamLookup, C.newSet(typeChain), C.newList(nameChain)); - Class valType = null == val ? null : val.getClass(); - if (null != valType && fieldClass.isAssignableFrom(valType)) { + val = generateSampleData(fieldSpec, typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter); + if (null == val) { + continue; + } + Class valType = val.getClass(); + if (!fieldClass.isAssignableFrom(valType)) { + val = $.convert(val).to(fieldClass); + } + if (null != val) { field.set(obj, val); } } @@ -701,7 +721,7 @@ private Object generateSampleData(BeanSpec spec, Map typeParamLoo } } - private boolean isEmail(BeanSpec spec) { + private static boolean isEmail(BeanSpec spec) { SampleData.Category anno = spec.getAnnotation(SampleData.Category.class); SampleDataCategory category = null != anno ? anno.value() : null; if (null != category && category != EMAIL) { diff --git a/src/main/java/act/apidoc/SampleDataCategory.java b/src/main/java/act/apidoc/SampleDataCategory.java index 0e95b893c..e7cbf579b 100644 --- a/src/main/java/act/apidoc/SampleDataCategory.java +++ b/src/main/java/act/apidoc/SampleDataCategory.java @@ -43,6 +43,7 @@ public enum SampleDataCategory { MOBILE("mobilePhone", "cellularPhone", "mobileNo", "mobileNumber"), STATE("province"), COMPANY_NAME("clientName", "client", "company", "organizationName", "organisationName", "organization", "organisation"), + PASSWORD, PERMISSION, PERMISSIONS, ROLE("roleName"), diff --git a/src/main/java/act/apidoc/SampleDataProviderManager.java b/src/main/java/act/apidoc/SampleDataProviderManager.java index 47e2196f8..5d3a1d387 100644 --- a/src/main/java/act/apidoc/SampleDataProviderManager.java +++ b/src/main/java/act/apidoc/SampleDataProviderManager.java @@ -85,6 +85,7 @@ List broaderKeys() { } private Map repo = new HashMap<>(); + private Map repoWithBroderKey = new HashMap<>(); public SampleDataProviderManager(App app) { super(app); @@ -93,16 +94,17 @@ public SampleDataProviderManager(App app) { @Override protected void releaseResources() { repo.clear(); + repoWithBroderKey.clear(); } @OnSysEvent(SysEventId.EVENT_BUS_INITIALIZED) public void reset() { - repo.clear(); + releaseResources(); } @SubClassFinder public void foundSampleDataProvider(SampleDataProvider provider) { - Class targetType = provider.targetType(); + Class targetType = provider.targetType(); if (targetType == NamedListProvider.class) { return; } @@ -126,8 +128,8 @@ public void foundSampleDataProvider(SampleDataProvider provider) { } private void registerForBroaderKey(Key key, SampleDataProvider provider) { - if (!repo.containsKey(key)) { - repo.put(key, provider); + if (!repoWithBroderKey.containsKey(key)) { + repoWithBroderKey.put(key, provider); } for (Key k2 : key.broaderKeys()) { registerForBroaderKey(k2, provider); @@ -135,25 +137,40 @@ private void registerForBroaderKey(Key key, SampleDataProvider provider) { } public T getSampleData(SampleDataCategory category, String fieldName, Class type) { - return getSampleData(category, fieldName, null, type); + return getSampleData(category, fieldName, type, true); + } + + public T getSampleData(SampleDataCategory category, String fieldName, Class type, boolean useBroaderKey) { + return getSampleData(category, fieldName, null, type, useBroaderKey); } public T getSampleData(SampleDataCategory category, String fieldName, Locale locale, Class type) { + return getSampleData(category, fieldName, locale, type, true); + } + + public T getSampleData(SampleDataCategory category, String fieldName, Locale locale, Class type, boolean useBroaderKey) { Key key = new Key(type, categoryOf(category, fieldName), locale); - return getSampleData(key); + return getSampleData(key, useBroaderKey); } - private T getSampleData(Key key) { + private T getSampleData(Key key, boolean useBroderKey) { SampleDataProvider provider = getProvider(key); + if (null == provider && useBroderKey) { + provider = getProviderFromBroderKeyRepo(key); + } return null == provider ? null : provider.get(); } private SampleDataProvider getProvider(Key key) { - SampleDataProvider provider = repo.get(key); + return repo.get(key); + } + + private SampleDataProvider getProviderFromBroderKeyRepo(Key key) { + SampleDataProvider provider = repoWithBroderKey.get(key); if (null == provider) { List keys = key.broaderKeys(); for (Key k2 : keys) { - provider = getProvider(k2); + provider = getProviderFromBroderKeyRepo(k2); if (null != provider) { return provider; } diff --git a/src/main/java/act/apidoc/sampledata/PasswordProvider.java b/src/main/java/act/apidoc/sampledata/PasswordProvider.java new file mode 100644 index 000000000..6d125cddf --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/PasswordProvider.java @@ -0,0 +1,35 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.*; +import org.osgl.util.S; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.PASSWORD) +public class PasswordProvider extends SampleDataProvider { + @Override + public String get() { + return S.mediumRandom() + "^%)91Ab"; + } +} diff --git a/src/main/java/act/apidoc/sampledata/PasswordProvider2.java b/src/main/java/act/apidoc/sampledata/PasswordProvider2.java new file mode 100644 index 000000000..d2f98cb0d --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/PasswordProvider2.java @@ -0,0 +1,39 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.*; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.PASSWORD) +public class PasswordProvider2 extends SampleDataProvider { + + @Inject + private PasswordProvider passwordProvider; + + @Override + public char[] get() { + return passwordProvider.get().toCharArray(); + } +} diff --git a/src/main/java/act/data/ClassResolver.java b/src/main/java/act/data/ClassResolver.java new file mode 100644 index 000000000..bae21a891 --- /dev/null +++ b/src/main/java/act/data/ClassResolver.java @@ -0,0 +1,31 @@ +package act.data; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import org.osgl.util.StringValueResolver; + +public class ClassResolver extends StringValueResolver { + @Override + public Class resolve(String value) { + return Act.appClassForName(value); + } +} diff --git a/src/main/java/act/e2e/E2E.java b/src/main/java/act/e2e/E2E.java index 5023cb429..7b2ea17c3 100644 --- a/src/main/java/act/e2e/E2E.java +++ b/src/main/java/act/e2e/E2E.java @@ -21,9 +21,9 @@ */ import act.Act; +import act.apidoc.Endpoint; import act.app.App; import act.app.DbServiceManager; -import act.app.conf.AutoConfig; import act.db.Dao; import act.db.DbService; import act.e2e.func.Func; @@ -32,16 +32,19 @@ import act.e2e.util.*; import act.e2e.verifier.Verifier; import act.event.EventBus; +import act.inject.DefaultValue; import act.job.OnAppStart; import act.sys.Env; import act.util.LogSupport; import org.osgl.$; +import org.osgl.inject.BeanSpec; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.mvc.annotation.DeleteAction; import org.osgl.mvc.annotation.PostAction; import org.osgl.util.*; +import java.lang.reflect.Type; import java.net.URL; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -100,6 +103,25 @@ public void loadFixtures(List fixtures) { } } + /** + * Generate testing data for specified model types + * @param modelType + * the model type + * @param number + * the number of records to be generated + */ + @PostAction("e2e/generateTestData") + public void generateSampleData(Class modelType, @DefaultValue("100") Integer number) { + E.illegalArgumentIf(number < 1); + Dao dao = dbServiceManager.dao(modelType); + E.illegalStateIf(null == dao); + List list = new ArrayList(); + for (int i = 0; i < number; ++i) { + list.add(generateSampleData_(modelType)); + } + dao.save(list); + } + /** * Clear fixture data. * @@ -240,6 +262,11 @@ private void printFooter() { println(); } + private Object generateSampleData_(Class modelType) { + BeanSpec spec = BeanSpec.of(modelType, Act.injector()); + return Endpoint.generateSampleData(spec, C.Map(), new HashSet(), new ArrayList(), null); + } + public static String constant(String name) { return ConstantPool.get(name); } diff --git a/src/main/java/act/e2e/RequestSpec.java b/src/main/java/act/e2e/RequestSpec.java index 1e2894d8c..c904e2a88 100644 --- a/src/main/java/act/e2e/RequestSpec.java +++ b/src/main/java/act/e2e/RequestSpec.java @@ -159,4 +159,13 @@ public static RequestSpec loadFixtures(List fixtures) { rs.json = JSON.toJSONString(C.Map("fixtures", fixtures)); return rs; } + + public static RequestSpec generateTestData(String modelType, int number) { + RequestSpec rs = new RequestSpec(); + rs.method = H.Method.POST; + rs.headers.put(CONTENT_TYPE, H.Format.JSON.contentType()); + rs.url = "/~/e2e/generateTestData"; + rs.json = JSON.toJSONString(C.Map("modelType", modelType, "number", number)); + return rs; + } } diff --git a/src/main/java/act/e2e/Scenario.java b/src/main/java/act/e2e/Scenario.java index 137f67cbd..4e94a47a2 100644 --- a/src/main/java/act/e2e/Scenario.java +++ b/src/main/java/act/e2e/Scenario.java @@ -235,6 +235,7 @@ private String verifyJsonBody(Object jsonBody) { public String name; public String description; public List fixtures = new ArrayList<>(); + public Object generateTestData; public List depends = new ArrayList<>(); public List interactions = new ArrayList<>(); public Map constants = new HashMap<>(); @@ -285,7 +286,6 @@ public String errorMessageOf(Interaction interaction) { @Override public void validate(Scenario scenario) throws UnexpectedException { errorIf(S.blank(name), "Scenario name not defined"); - errorIf(interactions.isEmpty(), "No interactions defined in Scenario[%s]", scenario.name); for (Interaction interaction : interactions) { interaction.validate(scenario); } @@ -393,6 +393,33 @@ private boolean createFixtures() { return verify(req, "creating fixtures"); } + private boolean generateTestData() { + if (null == generateTestData) { + return true; + } + boolean ok; + if (generateTestData instanceof Map) { + Map map = $.cast(generateTestData); + for (Map.Entry entry : map.entrySet()) { + RequestSpec req = RequestSpec.generateTestData(entry.getKey(), entry.getValue()); + ok = verify(req, "generate test data for " + entry.getKey()); + if (!ok) { + return false; + } + } + } else if (generateTestData instanceof List) { + List list = $.cast(generateTestData); + for (String modelType: list) { + RequestSpec req = RequestSpec.generateTestData(modelType, 100); + ok = verify(req, "generate test data for " + modelType); + if (!ok) { + return false; + } + } + } + return true; + } + private boolean verify(RequestSpec req, String operation) { boolean pass = true; Response resp = null; @@ -426,9 +453,9 @@ private boolean reset() { errorMessage = null; clearSession(); if (depends.isEmpty()) { - return clearFixtures() && createFixtures(); + return clearFixtures() && createFixtures() && generateTestData(); } - return true; + return createFixtures() && generateTestData(); } private boolean run() { diff --git a/src/main/java/act/e2e/func/SampleDataProviderAdaptor.java b/src/main/java/act/e2e/func/SampleDataProviderAdaptor.java index f79c341d0..67e040a78 100644 --- a/src/main/java/act/e2e/func/SampleDataProviderAdaptor.java +++ b/src/main/java/act/e2e/func/SampleDataProviderAdaptor.java @@ -82,8 +82,7 @@ public static void found(SampleDataProvider provider) { } } SampleDataProviderAdaptor adaptor = new SampleDataProviderAdaptor(provider, category){}; - boolean forceRegister = Act.app().wasStarted(); - adaptor.register(forceRegister); + adaptor.register(true); Act.app().registerSingleton(adaptor); } diff --git a/src/main/java/act/util/JsonUtilConfig.java b/src/main/java/act/util/JsonUtilConfig.java index 8da13039e..cb7afb5fc 100644 --- a/src/main/java/act/util/JsonUtilConfig.java +++ b/src/main/java/act/util/JsonUtilConfig.java @@ -20,20 +20,21 @@ * #L% */ +import static act.app.event.SysEventId.CLASS_LOADER_INITIALIZED; import static com.alibaba.fastjson.JSON.DEFAULT_GENERATE_FEATURE; import act.Act; import act.app.ActionContext; import act.app.App; +import act.app.event.AppClassLoaderInitialized; import act.cli.util.MappedFastJsonNameFilter; import act.conf.AppConfig; import act.data.DataPropertyRepository; +import act.event.SysEventListenerBase; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.*; -import org.joda.time.DateTime; -import org.joda.time.LocalDate; -import org.joda.time.LocalDateTime; -import org.joda.time.LocalTime; +import com.alibaba.fastjson.util.TypeUtils; +import org.joda.time.*; import org.osgl.$; import org.osgl.exception.NotAppliedException; import org.osgl.mvc.MvcConfig; @@ -200,7 +201,7 @@ public static void configure(final App app) { config.put(KV.class, FastJsonKvCodec.INSTANCE); config.put(KVStore.class, FastJsonKvCodec.INSTANCE); - ParserConfig parserConfig = ParserConfig.getGlobalInstance(); + final ParserConfig parserConfig = ParserConfig.getGlobalInstance(); parserConfig.putDeserializer(DateTime.class, jodaDateCodec); parserConfig.putDeserializer(LocalDate.class, jodaDateCodec); parserConfig.putDeserializer(LocalTime.class, jodaDateCodec); @@ -219,6 +220,14 @@ public Void apply(Writer writer, Object v) throws NotAppliedException, $.Break { return null; } }); + + app.eventBus().bind(CLASS_LOADER_INITIALIZED, new SysEventListenerBase() { + @Override + public void on(AppClassLoaderInitialized event) { + parserConfig.setDefaultClassLoader(app.classLoader()); + TypeUtils.clearClassMapping(); + } + }); } // FastJSON does not provide the API so we have to create our own From 92a285062fb88450a19813217e4110817ed8111c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 20 Aug 2018 08:56:36 +1000 Subject: [PATCH 072/730] fix #803 and #804 --- CHANGELOG.md | 2 + src/main/java/act/Act.java | 2 +- src/main/java/act/db/util/Page.java | 41 +++++++++++++++++++ src/main/java/act/e2e/E2E.java | 25 +++++++++-- src/main/java/act/e2e/Scenario.java | 35 ++++++++++++---- .../impl/ReflectedHandlerInvoker.java | 4 +- src/main/java/act/mail/MailerConfig.java | 12 ++---- src/main/resources/act.scan.list | 1 + 8 files changed, 100 insertions(+), 22 deletions(-) create mode 100644 src/main/java/act/db/util/Page.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 33cd714a5..82a180e43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Add `Page` data structure for db list operation #804 +* E2E - `NullPointerException` with interdependent scenarios #803 * JSON request resolving - binding String to class issue #802 * APIDoc - make sample email matches sample firstname and lastname #801 * e2e - random model data generation #800 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 5bc8c9c6e..ee7ad5335 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -442,7 +442,7 @@ public static Version appVersion() { * * @return the app config */ - public static AppConfig appConfig() { + public static AppConfig appConfig() { return App.instance().config(); } diff --git a/src/main/java/act/db/util/Page.java b/src/main/java/act/db/util/Page.java new file mode 100644 index 000000000..441321fc8 --- /dev/null +++ b/src/main/java/act/db/util/Page.java @@ -0,0 +1,41 @@ +package act.db.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.data.annotation.Data; +import act.util.SimpleBean; + +import java.util.List; + +@Data +public class Page implements SimpleBean { + public List list; + public long total; + + public Page(List list, long total) { + this.list = list; + this.total = total; + } + + public static Page of(List models, long total) { + return new Page<>(models, total); + } +} diff --git a/src/main/java/act/e2e/E2E.java b/src/main/java/act/e2e/E2E.java index 7b2ea17c3..9cc90c8b9 100644 --- a/src/main/java/act/e2e/E2E.java +++ b/src/main/java/act/e2e/E2E.java @@ -111,13 +111,29 @@ public void loadFixtures(List fixtures) { * the number of records to be generated */ @PostAction("e2e/generateTestData") - public void generateSampleData(Class modelType, @DefaultValue("100") Integer number) { + public void generateSampleData(String modelType, @DefaultValue("100") Integer number) { E.illegalArgumentIf(number < 1); - Dao dao = dbServiceManager.dao(modelType); + Class modelClass = null; + if (modelType.contains(".")) { + modelClass = Act.appClassForName(modelType); + } else { + String modelPackages = Act.appConfig().get("e2e.model-packages"); + E.illegalArgumentIf(S.blank(modelPackages), "Unknown model type: " + modelType); + for (String pkg : S.fastSplit(modelPackages, ",")) { + String type = S.concat(pkg, ".", modelType); + try { + modelClass = Act.appClassForName(type); + } catch (Exception e) { + // ignore + } + } + E.illegalArgumentIf(null == modelClass, "Unknown model type: " + modelType); + } + Dao dao = dbServiceManager.dao(modelClass); E.illegalStateIf(null == dao); List list = new ArrayList(); for (int i = 0; i < number; ++i) { - list.add(generateSampleData_(modelType)); + list.add(generateSampleData_(modelClass)); } dao.save(list); } @@ -206,7 +222,8 @@ public List run(App app, boolean shutdownApp) { try { scenario.start(scenarioManager, requestTemplateManager); } catch (Exception e) { - scenario.errorMessage = e.getMessage(); + String message = e.getMessage(); + scenario.errorMessage = S.blank(message) ? e.getClass().getName() : message; scenario.cause = e.getCause(); scenario.status = E2EStatus.FAIL; } diff --git a/src/main/java/act/e2e/Scenario.java b/src/main/java/act/e2e/Scenario.java index 4e94a47a2..1ac5f1ff6 100644 --- a/src/main/java/act/e2e/Scenario.java +++ b/src/main/java/act/e2e/Scenario.java @@ -350,13 +350,19 @@ private Object evalFunc(String funcExpr) { } public void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager) { + start(scenarioManager, requestTemplateManager, true); + } + + private void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, boolean reset) { this.scenarioManager = $.requireNotNull(scenarioManager); this.requestTemplateManager = $.requireNotNull(requestTemplateManager); this.status = PENDING; current.set(this); validate(this); - prepareHttp(); - boolean pass = reset() && run(); + if (null == http) { + prepareHttp(); + } + boolean pass = (!reset || reset()) && run(); this.status = E2EStatus.of(pass); } @@ -458,6 +464,15 @@ private boolean reset() { return createFixtures() && generateTestData(); } + private boolean run(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager) { + if (null == this.scenarioManager) { + this.start(scenarioManager, requestTemplateManager, false); + return this.status.pass(); + } else { + return run(); + } + } + private boolean run() { if (status.finished()) { return status.pass(); @@ -468,11 +483,17 @@ private boolean run() { private boolean runDependents() { for (String dependent : depends) { Scenario scenario = scenarioManager.get(dependent); - if (!scenario.run()) { - errorMessage = "dependency failure: " + dependent; - return false; + errorIf(null == scenario, "Dependent not found: " + dependent); + Scenario old = current.get(); + try { + if (!scenario.run(scenarioManager, requestTemplateManager)) { + errorMessage = "dependency failure: " + dependent; + return false; + } + inheritFrom(scenario); + } finally { + current.set(old); } - inheritFrom(scenario); } return true; } @@ -582,7 +603,7 @@ void verifyList(String name, List array, Map spec) { value = array.size(); } else if ("toString".equals(key) || "string".equals(key) || "str".equals(key)) { value = JSON.toJSONString(array); - } else if ("?".equals(key) || "".equalsIgnoreCase(sKey)) { + } else if ("?".equals(key) || (sKey.toLowerCase().startsWith(""))) { for (Object arrayElement : array) { try { verifyValue(name, arrayElement, test); diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 76e4d19f9..a29c34027 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -261,7 +261,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { paramCount = handler.paramCount(); paramSpecs = jsonDTOClassManager.beanSpecs(controllerClass, method); fieldsAndParamsCount = paramSpecs.size(); - if (fieldsAndParamsCount == 1) { + if (1 == fieldsAndParamsCount) { singleJsonFieldName = paramSpecs.get(0).name(); } @@ -430,7 +430,7 @@ public Result handle(final ActionContext context) { context.setReflectedHandlerInvoker(this); app.eventBus().emit(new ReflectedHandlerInvokerInvoke(this, context)); - if (fieldsAndParamsCount == 1) { + if (1 == fieldsAndParamsCount(context)) { context.allowIgnoreParamNamespace(); } else { context.disallowIgnoreParamNamespace(); diff --git a/src/main/java/act/mail/MailerConfig.java b/src/main/java/act/mail/MailerConfig.java index 6750e0f13..04260d02e 100644 --- a/src/main/java/act/mail/MailerConfig.java +++ b/src/main/java/act/mail/MailerConfig.java @@ -26,16 +26,12 @@ import org.osgl.http.H; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.util.*; -import javax.mail.Authenticator; -import javax.mail.PasswordAuthentication; -import javax.mail.Session; +import java.util.*; +import javax.mail.*; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; -import java.util.*; public class MailerConfig extends AppHolderBase { @@ -97,7 +93,7 @@ public MailerConfig(String id, Map properties, App app) { } } if (!mock) { - this.useTls = getBooleanConfig(SMTP_TLS, properties) || S.eq("smtp.gmail.com", this.host); + this.useTls = getBooleanConfig(SMTP_TLS, properties) || S.eq("smtp.gmail.com", this.host) || S.eq("smtp-mail.outlook.com", this.host); this.useSsl = !this.useTls && getBooleanConfig(SMTP_SSL, properties); this.port = getPortConfig(properties); this.password = getProperty(SMTP_PASSWORD, properties); diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 87ee166f5..0826cb640 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -7,6 +7,7 @@ act.app.conf.AppConfigPlugin act.controller.builtin.CliOverHttp act.controller.captcha.CaptchaService act.db.DbBind +act.db.util.Page act.e2e.E2E act.e2e.inbox.Inbox act.e2e.ScenarioDebugHelper From a8c6425d238049025c196f644b7a8aa9661a55f6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 20 Aug 2018 21:19:49 +1000 Subject: [PATCH 073/730] fix #794 --- CHANGELOG.md | 1 + .../java/act/controller/CacheChannel.java | 25 +++++++++++++++ src/main/java/act/controller/OutputCache.java | 31 +++++++++---------- .../act/controller/OutputStreamCache.java | 28 +++++++++-------- .../java/act/controller/ResponseCache.java | 20 ++++++++++-- src/main/java/act/controller/WriterCache.java | 21 ++++++++----- .../controller/RequestHandlerProxy.java | 2 +- .../act/xio/undertow/UndertowResponse.java | 2 +- 8 files changed, 89 insertions(+), 41 deletions(-) create mode 100644 src/main/java/act/controller/CacheChannel.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 82a180e43..9441ebf45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * `@JSONField(format = "yyyy-MM")` setting not work #798 * JSON output: default format for `java.util.Date` missing time part #797 * `@PropertySpec` annotation now cause `NullPointerException` on JSON output #796 +* `@CacheFor` annotation cause incomplete response in PROD mode * Add `renderBinary(byte[])` and `renderBinary(byte[], String)` method to `Controller.Util` #793 * Attach `PropertySpec` info to `ActionContext` #792 * Resource loader - allow loading from excel file #790 diff --git a/src/main/java/act/controller/CacheChannel.java b/src/main/java/act/controller/CacheChannel.java new file mode 100644 index 000000000..33ea363da --- /dev/null +++ b/src/main/java/act/controller/CacheChannel.java @@ -0,0 +1,25 @@ +package act.controller; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +public interface CacheChannel { + boolean isClosed(); +} diff --git a/src/main/java/act/controller/OutputCache.java b/src/main/java/act/controller/OutputCache.java index 560a54f30..077be0f60 100644 --- a/src/main/java/act/controller/OutputCache.java +++ b/src/main/java/act/controller/OutputCache.java @@ -21,6 +21,7 @@ */ import act.ActResponse; +import org.osgl.util.IO; import org.osgl.util.Output; import java.io.ByteArrayOutputStream; @@ -28,11 +29,12 @@ import java.io.Writer; import java.nio.ByteBuffer; -public class OutputCache implements Output { +public class OutputCache implements Output, CacheChannel { private ByteArrayOutputStream baos = new ByteArrayOutputStream(); private Output tee = Output.Adaptors.of(baos); private Output out; private ByteBuffer buffer; + private boolean closed; public OutputCache(Output out) { this.out = out; @@ -44,71 +46,66 @@ public void open() { @Override public void close() { - if (null == buffer) { - flush(); - } - } - - @Override - public void flush() { byte[] ba = baos.toByteArray(); ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); buffer.put(ba); buffer.flip(); this.buffer = buffer; - // out already closed - //out.close(); + out.append(ba); + IO.close(out); + closed = true; + } + + @Override + public void flush() { } @Override public Output append(CharSequence csq) { tee.append(csq); - out.append(csq); return this; } @Override public Output append(CharSequence csq, int start, int end) { tee.append(csq, start, end); - out.append(csq, start, end); return this; } @Override public Output append(char c) { tee.append(c); - out.append(c); return this; } @Override public Output append(byte[] bytes) { tee.append(bytes); - out.append(bytes); return this; } @Override public Output append(byte[] bytes, int start, int end) { tee.append(bytes, start, end); - out.append(bytes, start, end); return this; } @Override public Output append(byte b) { tee.append(b); - out.append(b); return this; } @Override public Output append(ByteBuffer buffer) { tee.append(buffer); - out.append(buffer); return this; } + public boolean isClosed() { + return closed; + } + @Override public OutputStream asOutputStream() { return Output.Adaptors.asOutputStream(this); diff --git a/src/main/java/act/controller/OutputStreamCache.java b/src/main/java/act/controller/OutputStreamCache.java index f1fbe70a5..cac4c0520 100644 --- a/src/main/java/act/controller/OutputStreamCache.java +++ b/src/main/java/act/controller/OutputStreamCache.java @@ -21,52 +21,54 @@ */ import act.ActResponse; +import org.osgl.util.IO; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import java.io.*; import java.nio.ByteBuffer; -class OutputStreamCache extends OutputStream { +class OutputStreamCache extends OutputStream implements CacheChannel { private ByteArrayOutputStream tee = new ByteArrayOutputStream(); private OutputStream out; private ByteBuffer buffer; + private boolean closed; public OutputStreamCache(OutputStream os) { this.out = os; } @Override - public void write(int b) throws IOException { - out.write(b); + public void write(int b) { tee.write(b); } @Override public void write(byte[] b) throws IOException { - out.write(b); tee.write(b); } @Override - public void write(byte[] b, int off, int len) throws IOException { - out.write(b, off, len); + public void write(byte[] b, int off, int len) { tee.write(b, off, len); } @Override - public void flush() throws IOException { - out.flush(); + public void flush() { } @Override - public void close() throws IOException { + public void close() { byte[] ba = tee.toByteArray(); ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); buffer.put(ba); buffer.flip(); this.buffer = buffer; - out.close(); + IO.write(ba).ensureCloseSink().to(out); + closed = true; + } + + @Override + public boolean isClosed() { + return closed; } void apply(ActResponse resp) { diff --git a/src/main/java/act/controller/ResponseCache.java b/src/main/java/act/controller/ResponseCache.java index a2165bb78..2db5743b8 100644 --- a/src/main/java/act/controller/ResponseCache.java +++ b/src/main/java/act/controller/ResponseCache.java @@ -47,6 +47,7 @@ public class ResponseCache extends ActResponse implements Serializable { private OutputStreamCache osCache; private WriterCache writerCache; private OutputCache outputCache; + private boolean wroteDirectly; private transient ActResponse realResponse; @@ -94,6 +95,19 @@ public void applyTo(ActResponse response) { } } + public boolean isValid() { + if (wroteDirectly) { + return true; + } else if (null != osCache) { + return osCache.isClosed(); + } else if (null != writerCache) { + return writerCache.isClosed(); + } else if (null != outputCache) { + return outputCache.isClosed(); + } + return false; + } + @Override public H.Response context(Object context) { realResponse.context(context); @@ -216,23 +230,25 @@ public H.Response addHeaderIfNotAdded(String name, String value) { @Override public H.Response writeBinary(ISObject binary) { - realResponse.writeBinary(binary); byte[] ba = binary.asByteArray(); ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); buffer.put(ba); buffer.flip(); this.buffer = buffer; + realResponse.writeBinary(binary); + this.wroteDirectly = true; return this; } @Override public H.Response writeContent(String s) { - realResponse.writeContent(s); byte[] ba = s.getBytes(Charsets.UTF_8); ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); buffer.put(ba); buffer.flip(); this.buffer = buffer; + realResponse.writeContent(s); + this.wroteDirectly = true; return this; } diff --git a/src/main/java/act/controller/WriterCache.java b/src/main/java/act/controller/WriterCache.java index f30b776fb..7cc261195 100644 --- a/src/main/java/act/controller/WriterCache.java +++ b/src/main/java/act/controller/WriterCache.java @@ -22,16 +22,18 @@ import act.ActResponse; import org.osgl.util.Charsets; +import org.osgl.util.IO; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.nio.ByteBuffer; -public class WriterCache extends Writer { +public class WriterCache extends Writer implements CacheChannel { private StringWriter tee = new StringWriter(); private Writer out; private ByteBuffer buffer; + private boolean closed; public WriterCache(Writer out) { this.out = out; @@ -39,23 +41,28 @@ public WriterCache(Writer out) { @Override public void write(char[] cbuf, int off, int len) throws IOException { - tee.write(cbuf, off, len); out.write(cbuf, off, len); } @Override - public void flush() throws IOException { - out.flush(); + public void flush() { } @Override - public void close() throws IOException { - byte[] ba = tee.toString().getBytes(Charsets.UTF_8); + public void close() { + String content = tee.toString(); + byte[] ba = content.getBytes(Charsets.UTF_8); ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); buffer.put(ba); buffer.flip(); this.buffer = buffer; - out.close(); + IO.write(content).ensureCloseSink().to(out); + closed = true; + } + + @Override + public boolean isClosed() { + return closed; } void apply(ActResponse resp) { diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index e3391e191..900d51ea9 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -187,7 +187,7 @@ public void handle(ActionContext context) { if (supportCache) { cacheKey = cacheSupport.cacheKey(context); ResponseCache cached = this.cache.get(cacheKey); - if (null != cached) { + if (null != cached && cached.isValid()) { String etag = cached.etag(); if (null != etag && context.req().etagMatches(etag)) { NotModified.of(etag).apply(context.req(), context.resp()); diff --git a/src/main/java/act/xio/undertow/UndertowResponse.java b/src/main/java/act/xio/undertow/UndertowResponse.java index 08b01249f..953008f91 100644 --- a/src/main/java/act/xio/undertow/UndertowResponse.java +++ b/src/main/java/act/xio/undertow/UndertowResponse.java @@ -186,7 +186,7 @@ public Locale locale() { @Override public void commit() { if (null != this.output) { - output.flush(); + IO.close(output); } else if (null != this.outputStream) { IO.close(outputStream); } else if (null != this.writer) { From 697c1680619aa7a20840155ea9c667280ff0378f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 21 Aug 2018 07:31:17 +1000 Subject: [PATCH 074/730] #794 fix --- CHANGELOG.md | 2 +- src/main/java/act/app/ActionContext.java | 20 +++++++++-- .../java/act/controller/CacheChannel.java | 3 +- src/main/java/act/controller/Controller.java | 18 ++++++++-- src/main/java/act/controller/OutputCache.java | 29 +++++++++------- .../act/controller/OutputStreamCache.java | 27 +++++++++------ .../java/act/controller/ResponseCache.java | 13 ++++++-- src/main/java/act/controller/WriterCache.java | 33 +++++++++++-------- 8 files changed, 100 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9441ebf45..99940289e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ * `@JSONField(format = "yyyy-MM")` setting not work #798 * JSON output: default format for `java.util.Date` missing time part #797 * `@PropertySpec` annotation now cause `NullPointerException` on JSON output #796 -* `@CacheFor` annotation cause incomplete response in PROD mode +* `@CacheFor` annotation cause incomplete response in PROD mode #794 * Add `renderBinary(byte[])` and `renderBinary(byte[], String)` method to `Controller.Util` #793 * Attach `PropertySpec` info to `ActionContext` #792 * Resource loader - allow loading from excel file #790 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index eae7057b7..f5a47fa83 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -443,17 +443,31 @@ public UrlPath urlPath() { return urlPath; } - public void forward(String url) { + /** + * Implement Java Servlet's `RequestDispatcher.forward(String)` semantic. + * + * This method has the following restrictions: + * + * 1. the URL must be started with single `/`. i.e. it must be absolute PATH of current service. + * 2. the request method must be `GET`. + * + * @param url + * the url template + * @param args + * the url argument + */ + public void forward(String url, Object ... args) { E.illegalArgumentIfNot(url.startsWith("/"), "forward URL must starts with single '/'"); E.illegalArgumentIf(url.startsWith("//"), "forward URL must starts with single `/`"); E.unexpectedIfNot(H.Method.GET == req().method(), "forward only support on HTTP GET request"); uploads.clear(); extraParams.clear(); bodyParams = null; - urlPath = UrlPath.of(url); + String target = S.fmt(url, args); + urlPath = UrlPath.of(target); UndertowRequest req = $.cast(req()); state = State.CREATED; - req.forward(url); + req.forward(target); final RequestHandler requestHandler = router.getInvoker(H.Method.GET, url, this); requestHandler.handle(this); } diff --git a/src/main/java/act/controller/CacheChannel.java b/src/main/java/act/controller/CacheChannel.java index 33ea363da..f33cb5523 100644 --- a/src/main/java/act/controller/CacheChannel.java +++ b/src/main/java/act/controller/CacheChannel.java @@ -21,5 +21,6 @@ */ public interface CacheChannel { - boolean isClosed(); + boolean isCommitted(); + void commit(); } diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 15bc628db..7d0307074 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -975,9 +975,23 @@ public static void forbiddenIfNot(boolean test, int code, String msg, Object... forbiddenIf(!test, code, msg, args); } - public static void forward(String url) { + /** + * Implement `RequestDispatcher.forward(String)` semantic. Calling this API is equivalent to + * + * ```java + * ActionContext ctx = ActionContext.current(); + * ctx.forward(url, args); + * ``` + * + * @param url + * the url template + * @param args + * the url argument + * @see ActionContext#forward(String, Object...) + */ + public static void forward(String url, Object... args) { ActionContext ctx = ActionContext.current(); - ctx.forward(url); + ctx.forward(url, args); } public static Redirect redirect(String url, Object... args) { diff --git a/src/main/java/act/controller/OutputCache.java b/src/main/java/act/controller/OutputCache.java index 077be0f60..ccc18fdb1 100644 --- a/src/main/java/act/controller/OutputCache.java +++ b/src/main/java/act/controller/OutputCache.java @@ -34,7 +34,7 @@ public class OutputCache implements Output, CacheChannel { private Output tee = Output.Adaptors.of(baos); private Output out; private ByteBuffer buffer; - private boolean closed; + private boolean committed; public OutputCache(Output out) { this.out = out; @@ -46,14 +46,7 @@ public void open() { @Override public void close() { - byte[] ba = baos.toByteArray(); - ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); - buffer.put(ba); - buffer.flip(); - this.buffer = buffer; - out.append(ba); - IO.close(out); - closed = true; + commit(); } @Override @@ -102,8 +95,22 @@ public Output append(ByteBuffer buffer) { return this; } - public boolean isClosed() { - return closed; + public boolean isCommitted() { + return committed; + } + + @Override + public void commit() { + if (!committed) { + byte[] ba = baos.toByteArray(); + ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); + buffer.put(ba); + buffer.flip(); + this.buffer = buffer; + out.append(ba); + IO.close(out); + committed = true; + } } @Override diff --git a/src/main/java/act/controller/OutputStreamCache.java b/src/main/java/act/controller/OutputStreamCache.java index cac4c0520..455a8e2a5 100644 --- a/src/main/java/act/controller/OutputStreamCache.java +++ b/src/main/java/act/controller/OutputStreamCache.java @@ -30,7 +30,7 @@ class OutputStreamCache extends OutputStream implements CacheChannel { private ByteArrayOutputStream tee = new ByteArrayOutputStream(); private OutputStream out; private ByteBuffer buffer; - private boolean closed; + private boolean committed; public OutputStreamCache(OutputStream os) { this.out = os; @@ -57,18 +57,25 @@ public void flush() { @Override public void close() { - byte[] ba = tee.toByteArray(); - ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); - buffer.put(ba); - buffer.flip(); - this.buffer = buffer; - IO.write(ba).ensureCloseSink().to(out); - closed = true; + commit(); } @Override - public boolean isClosed() { - return closed; + public boolean isCommitted() { + return committed; + } + + @Override + public void commit() { + if (!committed) { + byte[] ba = tee.toByteArray(); + ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); + buffer.put(ba); + buffer.flip(); + this.buffer = buffer; + IO.write(ba).ensureCloseSink().to(out); + committed = true; + } } void apply(ActResponse resp) { diff --git a/src/main/java/act/controller/ResponseCache.java b/src/main/java/act/controller/ResponseCache.java index 2db5743b8..04feb05e4 100644 --- a/src/main/java/act/controller/ResponseCache.java +++ b/src/main/java/act/controller/ResponseCache.java @@ -99,11 +99,11 @@ public boolean isValid() { if (wroteDirectly) { return true; } else if (null != osCache) { - return osCache.isClosed(); + return osCache.isCommitted(); } else if (null != writerCache) { - return writerCache.isClosed(); + return writerCache.isCommitted(); } else if (null != outputCache) { - return outputCache.isClosed(); + return outputCache.isCommitted(); } return false; } @@ -386,6 +386,13 @@ public H.Response writeContent(ByteBuffer buffer) { @Override public void commit() { + if (null != outputCache) { + outputCache.commit(); + } else if (null != osCache) { + osCache.commit(); + } else if (null != writerCache) { + writerCache.commit(); + } realResponse.commit(); } diff --git a/src/main/java/act/controller/WriterCache.java b/src/main/java/act/controller/WriterCache.java index 7cc261195..272dec2f5 100644 --- a/src/main/java/act/controller/WriterCache.java +++ b/src/main/java/act/controller/WriterCache.java @@ -24,16 +24,14 @@ import org.osgl.util.Charsets; import org.osgl.util.IO; -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; +import java.io.*; import java.nio.ByteBuffer; public class WriterCache extends Writer implements CacheChannel { private StringWriter tee = new StringWriter(); private Writer out; private ByteBuffer buffer; - private boolean closed; + private boolean committed; public WriterCache(Writer out) { this.out = out; @@ -50,19 +48,26 @@ public void flush() { @Override public void close() { - String content = tee.toString(); - byte[] ba = content.getBytes(Charsets.UTF_8); - ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); - buffer.put(ba); - buffer.flip(); - this.buffer = buffer; - IO.write(content).ensureCloseSink().to(out); - closed = true; + commit(); } @Override - public boolean isClosed() { - return closed; + public void commit() { + if (!committed) { + String content = tee.toString(); + byte[] ba = content.getBytes(Charsets.UTF_8); + ByteBuffer buffer = ByteBuffer.allocateDirect(ba.length); + buffer.put(ba); + buffer.flip(); + this.buffer = buffer; + IO.write(content).ensureCloseSink().to(out); + committed = true; + } + } + + @Override + public boolean isCommitted() { + return committed; } void apply(ActResponse resp) { From 8a193f0dee5bdcfb5d1e78f1e403111e9b9713bc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 22 Aug 2018 06:57:34 +1000 Subject: [PATCH 075/730] fix #805 --- CHANGELOG.md | 1 + src/main/java/act/e2e/Scenario.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99940289e..5a581c1df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* e2e: Allow suppress fixture clearing #805 * Add `Page` data structure for db list operation #804 * E2E - `NullPointerException` with interdependent scenarios #803 * JSON request resolving - binding String to class issue #802 diff --git a/src/main/java/act/e2e/Scenario.java b/src/main/java/act/e2e/Scenario.java index 1ac5f1ff6..e4f28f992 100644 --- a/src/main/java/act/e2e/Scenario.java +++ b/src/main/java/act/e2e/Scenario.java @@ -242,6 +242,7 @@ private String verifyJsonBody(Object jsonBody) { public E2EStatus status = PENDING; public String errorMessage; public Throwable cause; + public boolean clearFixtures = true; $.Var lastData = $.var(); $.Var lastHeaders = $.var(); @@ -373,6 +374,9 @@ public void clearSession() { } public boolean clearFixtures() { + if (!clearFixtures) { + return true; + } return verify(RequestSpec.RS_CLEAR_FIXTURE, "clearing fixtures"); } From 0bfee271dd4fa0fb0f8adb15ea97084fa1b81590 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 22 Aug 2018 21:13:20 +1000 Subject: [PATCH 076/730] fix #806 and #807 --- CHANGELOG.md | 2 + src/main/java/act/app/util/EnvMatcher.java | 24 ++++++- src/main/java/act/e2e/util/YamlLoader.java | 63 +++++++++++++++++-- src/main/java/act/sys/Env.java | 38 +++++++---- .../act/sys/meta/EnvAnnotationVisitor.java | 37 ++++++++--- 5 files changed, 137 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a581c1df..5edfe93ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Environment assert - support multiple values #807 +* e2e - allow loading fixtures from JSON file #806 * e2e: Allow suppress fixture clearing #805 * Add `Page` data structure for db list operation #804 * E2E - `NullPointerException` with interdependent scenarios #803 diff --git a/src/main/java/act/app/util/EnvMatcher.java b/src/main/java/act/app/util/EnvMatcher.java index 2c1431eed..569d94fc6 100644 --- a/src/main/java/act/app/util/EnvMatcher.java +++ b/src/main/java/act/app/util/EnvMatcher.java @@ -26,6 +26,10 @@ import act.sys.Env; import act.util.ByteCodeVisitor; import org.osgl.util.E; +import org.rythmengine.utils.S; + +import java.util.ArrayList; +import java.util.List; /** * Detect if a class has `Env` annotations and check if @@ -51,12 +55,12 @@ enum Type { Profile() { @Override boolean matches(EnvAnnotationVisitor visitor) { - return Env.profileMatches(visitor.value, visitor.except); + return Env.profileMatches(visitor.arrayValue.toArray(new String[visitor.arrayValue.size()]), visitor.except); } }, Group() { @Override boolean matches(EnvAnnotationVisitor visitor) { - return Env.groupMatches(visitor.value, visitor.except); + return Env.groupMatches(visitor.arrayValue.toArray(new String[visitor.arrayValue.size()]), visitor.except); } }, Mode() { @Override @@ -69,6 +73,7 @@ boolean matches(EnvAnnotationVisitor visitor) { } private Type type; + private List arrayValue = new ArrayList<>(); private String value; private boolean except; @@ -87,6 +92,21 @@ public void visit(String name, Object value) { super.visit(name, value); } + @Override + public AnnotationVisitor visitArray(String name) { + AnnotationVisitor av = super.visitArray(name); + if ("value".equals(name)) { + return new AnnotationVisitor(ASM5, av) { + @Override + public void visit(String name, Object value) { + arrayValue.add(S.string(value)); + super.visit(name, value); + } + }; + } + return av; + } + @Override public void visitEnum(String name, String desc, String value) { if ("value".equals(name)) { diff --git a/src/main/java/act/e2e/util/YamlLoader.java b/src/main/java/act/e2e/util/YamlLoader.java index fe03a4f7b..c0527fe9c 100644 --- a/src/main/java/act/e2e/util/YamlLoader.java +++ b/src/main/java/act/e2e/util/YamlLoader.java @@ -27,7 +27,7 @@ import act.db.Dao; import act.e2e.E2E; import act.util.LogSupport; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.*; import org.osgl.$; import org.osgl.Lang; import org.osgl.OsglConfig; @@ -39,10 +39,7 @@ import org.yaml.snakeyaml.Yaml; import java.net.URL; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -114,11 +111,61 @@ private void addModelPackage(String packageSpec) { public Map loadFixture(String fixtureName, DaoLocator daoLocator) { + boolean isJson = fixtureName.endsWith(".json"); + boolean isYaml = !isJson && (fixtureName.endsWith(".yaml") || fixtureName.endsWith(".yml")); + E.unsupportedIfNot(isJson || isYaml, "fixture resource file type not supported: " + fixtureName); String content = getResourceAsString(fixtureName); if (null == content) { return C.Map(); } - return parse(content, daoLocator); + return isJson ? parseJson(content, daoLocator) : parse(content, daoLocator); + } + + private Map parseJson(String content, DaoLocator daoLocator) { + if (S.blank(content)) { + return C.Map(); + } + if (content.startsWith("[")) { + // MongoDB exported data list variation + JSONArray array = JSON.parseArray(content); + int len = array.size(); + Map retVal = new LinkedHashMap<>(); + for (int i = 0; i < len; ++i) { + JSONObject obj = array.getJSONObject(i); + String className = obj.getString("className"); + E.unsupportedIf(S.isBlank(className), "Unsupported JSON resource, className required"); + String key = obj.getString("key"); + if (null == key) { + key = obj.getString("name"); + } + if (null == key) { + key = obj.getString("id"); + } + if (null == key) { + key = S.mediumRandom(); + } + Class modelType = loadModelType(className); + Dao dao = null == daoLocator ? null : daoLocator.dao(modelType); + Object entity = OsglConfig.INSTANCE_FACTORY.apply(modelType); + $.map(obj).to(entity); + if (null != dao) { + TxScope.enter(); + try { + dao.save(entity); + TxScope.commit(); + } catch (Exception e) { + TxScope.rollback(e); + } finally { + TxScope.clear(); + } + } + retVal.put(key, entity); + } + return retVal; + } else { + JSONObject obj = JSON.parseObject(content); + return resolve((Map) obj, daoLocator); + } } /** @@ -137,6 +184,10 @@ public Map parse(String yaml, DaoLocator daoLocator) { return C.Map(); } Map> objects = $.cast(o); + return resolve(objects, daoLocator); + } + + private Map resolve(Map> objects, DaoLocator daoLocator) { resolveConstants(objects); Map> mapCache = C.newMap(); Map entityCache = new LinkedHashMap<>(); diff --git a/src/main/java/act/sys/Env.java b/src/main/java/act/sys/Env.java index 7fb1a9663..0f8250958 100644 --- a/src/main/java/act/sys/Env.java +++ b/src/main/java/act/sys/Env.java @@ -55,7 +55,7 @@ private Env() {} /** * The profile specification */ - String value(); + String[] value(); /** * If `except` is `true` then the module should be load @@ -81,7 +81,7 @@ private Env() {} /** * The profile specification */ - String value(); + String[] value(); /** * If unless is `true` then the module should be load @@ -104,7 +104,7 @@ private Env() {} /** * The node group specification */ - String value(); + String[] value(); /** * If `except` is `true` then the module should be load @@ -131,7 +131,7 @@ private Env() {} /** * The node group specification */ - String value(); + String[] value(); /** * If unless is `true` then the module should be load @@ -164,6 +164,9 @@ private Env() {} } /** + * This annotation is obsolete, please use {@link RequireMode} + * instead + * * Used to mark a dependency injector module * that should be load only in specified mode * @@ -172,6 +175,7 @@ private Env() {} */ @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) + @Deprecated public @interface Mode { /** @@ -218,11 +222,17 @@ public static boolean matches(Profile profileTag) { return profileMatches(profileTag.value(), profileTag.unless()); } - public static boolean profileMatches(String profile) { - return S.eq(profile, Act.profile(), S.IGNORECASE); + public static boolean profileMatches(String[] profiles) { + final String actProfile = Act.profile(); + for (String profile : profiles) { + if (S.eq(profile, actProfile)) { + return true; + } + } + return false; } - public static boolean profileMatches(String profile, boolean unless) { + public static boolean profileMatches(String[] profile, boolean unless) { return unless ^ profileMatches(profile); } @@ -246,12 +256,18 @@ public static boolean matches(Group groupTag) { return groupMatches(groupTag.value(), groupTag.unless()); } - public static boolean groupMatches(String group) { - return S.eq(group, Act.nodeGroup(), S.IGNORECASE); + public static boolean groupMatches(String[] groups) { + final String actGroup = Act.nodeGroup(); + for (String group : groups) { + if (S.eq(group, actGroup, S.IGNORECASE)) { + return true; + } + } + return false; } - public static boolean groupMatches(String group, boolean unless) { - return unless ^ groupMatches(group); + public static boolean groupMatches(String[] groups, boolean unless) { + return unless ^ groupMatches(groups); } private static final C.Set> ENV_ANNOTATION_TYPES = C.set( diff --git a/src/main/java/act/sys/meta/EnvAnnotationVisitor.java b/src/main/java/act/sys/meta/EnvAnnotationVisitor.java index bb2ad6e7f..8a1f6c08c 100644 --- a/src/main/java/act/sys/meta/EnvAnnotationVisitor.java +++ b/src/main/java/act/sys/meta/EnvAnnotationVisitor.java @@ -21,12 +21,13 @@ */ import act.Act; -import act.asm.AnnotationVisitor; -import act.asm.Opcodes; -import act.asm.Type; +import act.asm.*; import act.sys.Env; import org.osgl.util.S; +import java.util.ArrayList; +import java.util.List; + /** * Scan `@Env.Mode`, `@Env.Profile`, `@Env.Group` */ @@ -39,6 +40,7 @@ public class EnvAnnotationVisitor extends AnnotationVisitor implements Opcodes { public static final String DESC_GROUP = Type.getType(Env.Group.class).getDescriptor(); public static final String DESC_REQUIRE_GROUP = Type.getType(Env.RequireGroup.class).getDescriptor(); + private List arrayValue = new ArrayList<>(); private boolean matched = true; private boolean except = false; private String desc; @@ -52,11 +54,7 @@ public EnvAnnotationVisitor(AnnotationVisitor annotationVisitor, String descript public void visit(String name, Object value) { if ("value".equals(name)) { String s = S.string(value); - if (S.eq(desc, DESC_REQUIRE_PROFILE) || S.eq(desc, DESC_PROFILE)) { - matched = Env.profileMatches(s); - } else if (S.eq(desc, DESC_REQUIRE_MODE) || S.eq(desc, DESC_MODE)) { - matched = Env.groupMatches(s); - } else if (S.eq(desc, DESC_REQUIRE_GROUP) || S.eq(desc, DESC_GROUP)) { + if (S.eq(desc, DESC_REQUIRE_MODE) || S.eq(desc, DESC_MODE)) { matched = Env.modeMatches(s); } } else if ("except".equals(name)) { @@ -65,6 +63,21 @@ public void visit(String name, Object value) { super.visit(name, value); } + @Override + public AnnotationVisitor visitArray(String name) { + AnnotationVisitor av = super.visitArray(name); + if ("value".equals(name)) { + return new AnnotationVisitor(ASM5, av) { + @Override + public void visit(String name, Object value) { + arrayValue.add(S.string(value)); + super.visit(name, value); + } + }; + } + return av; + } + @Override public void visitEnum(String name, String desc, String value) { if ("value".equals(name) && desc.contains("Mode")) { @@ -78,6 +91,14 @@ public void visitEnum(String name, String desc, String value) { @Override public void visitEnd() { + int arrayValueSize = arrayValue.size(); + if (arrayValueSize > 0) { + if (S.eq(desc, DESC_REQUIRE_PROFILE) || S.eq(desc, DESC_PROFILE)) { + matched = Env.profileMatches(arrayValue.toArray(new String[arrayValueSize])); + } else if (S.eq(desc, DESC_REQUIRE_GROUP) || S.eq(desc, DESC_GROUP)) { + matched = Env.groupMatches(arrayValue.toArray(new String[arrayValueSize])); + } + } matched = except ^ matched; super.visitEnd(); } From ade3780b956ae07875fe2f0c2ed0d82711782381 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 25 Aug 2018 07:45:00 +1000 Subject: [PATCH 077/730] fix #808, #809 and #810 --- CHANGELOG.md | 3 + src/main/java/act/Act.java | 14 +++- src/main/java/act/app/App.java | 2 +- .../controller/bytecode/HandlerEnhancer.java | 18 ++--- src/main/java/act/job/Job.java | 28 ++++---- .../java/act/job/JobAnnotationProcessor.java | 3 + src/main/java/act/job/JobManager.java | 26 ++++--- .../act/job/bytecode/JobByteCodeScanner.java | 7 +- .../act/job/bytecode/ReflectedJobInvoker.java | 4 ++ .../java/act/job/meta/JobClassMetaInfo.java | 14 ++-- src/main/java/act/mail/MailerContext.java | 6 +- .../java/act/{e2e => test}/AcceptType.java | 4 +- src/main/java/act/test/FixtureLoader.java | 41 +++++++++++ .../java/act/{e2e => test}/Interaction.java | 16 ++--- .../act/{e2e => test}/InteractionPart.java | 4 +- .../java/act/{e2e => test}/RequestSpec.java | 14 ++-- .../java/act/{e2e => test}/ResponseSpec.java | 4 +- src/main/java/act/{e2e => test}/Scenario.java | 38 +++++----- .../{e2e => test}/ScenarioDebugHelper.java | 32 ++++----- .../java/act/{e2e => test}/ScenarioPart.java | 4 +- .../java/act/{e2e/E2E.java => test/Test.java} | 56 ++++++++------- .../{e2e/E2EStop.java => test/TestStart.java} | 8 +-- .../E2EStatus.java => test/TestStatus.java} | 8 +-- .../{e2e/E2EStart.java => test/TestStop.java} | 8 +-- .../java/act/{e2e => test}/func/Func.java | 8 +-- .../func/SampleDataProviderAdaptor.java | 4 +- .../{e2e => test}/inbox/ImapInboxReader.java | 2 +- .../java/act/{e2e => test}/inbox/Inbox.java | 12 ++-- .../java/act/{e2e => test}/macro/Macro.java | 8 +-- .../req_modifier/RequestModifier.java | 6 +- .../act/{e2e => test}/util/CookieStore.java | 4 +- .../act/{e2e => test}/util/ErrorMessage.java | 4 +- .../act/{e2e => test}/util/JSONTraverser.java | 4 +- .../act/{e2e => test}/util/NamedLogic.java | 4 +- .../{e2e => test}/util/NullDaoLocator.java | 4 +- .../util/RequestTemplateManager.java | 12 ++-- .../util/ScenarioComparator.java | 6 +- .../{e2e => test}/util/ScenarioManager.java | 20 +++--- .../java/act/{e2e => test}/util/TxScope.java | 6 +- .../{e2e => test}/util/TxScopeProvider.java | 4 +- .../act/{e2e => test}/util/YamlLoader.java | 14 ++-- .../act/{e2e => test}/verifier/After.java | 4 +- .../act/{e2e => test}/verifier/Before.java | 4 +- .../act/{e2e => test}/verifier/Compare.java | 4 +- .../act/{e2e => test}/verifier/Contains.java | 4 +- .../verifier/DateTimeVerifier.java | 4 +- .../java/act/{e2e => test}/verifier/Ends.java | 4 +- .../java/act/{e2e => test}/verifier/Eq.java | 4 +- .../{e2e => test}/verifier/EqIgnoreCase.java | 4 +- .../act/{e2e => test}/verifier/Exists.java | 4 +- .../java/act/{e2e => test}/verifier/Gt.java | 4 +- .../java/act/{e2e => test}/verifier/Gte.java | 4 +- .../java/act/{e2e => test}/verifier/Lt.java | 4 +- .../java/act/{e2e => test}/verifier/Lte.java | 4 +- .../java/act/{e2e => test}/verifier/Neq.java | 4 +- .../act/{e2e => test}/verifier/Starts.java | 4 +- .../act/{e2e => test}/verifier/Verifier.java | 6 +- .../java/act/util/AnnotatedClassFinder.java | 2 +- .../java/act/util/AnnotatedMethodFinder.java | 71 +++++++++++++++++++ src/main/java/act/util/AsmType.java | 22 ++++++ .../java/act/util/ClassInfoRepository.java | 38 ++++++++-- .../act/util/MethodAnnotationDetector.java | 68 ++++++++++++++++++ src/main/resources/aaa.authenticate.list | 2 +- src/main/resources/act.scan.list | 12 ++-- .../resources/rythm/{~e2e.html => ~test.html} | 13 +++- .../controller/CourseService.java | 4 +- .../java/act/{e2e => test}/model/Course.java | 2 +- .../java/act/{e2e => test}/model/User.java | 2 +- .../act/{e2e => test}/util/AssertTest.java | 4 +- .../{e2e => test}/util/CompareTypeTest.java | 4 +- .../act/{e2e => test}/util/ExistsTest.java | 4 +- .../java/act/{e2e => test}/util/FuncTest.java | 4 +- .../{e2e => test}/util/JSONTraverserTest.java | 4 +- .../util/RequestTemplateManagerTest.java | 6 +- .../util/ScenarioManagerTest.java | 19 +++-- .../util/TestTestBase.java} | 6 +- .../{e2e => test}/util/YamlLoaderTest.java | 8 +-- .../utils/SeparateClassloaderTestRunner.java | 2 +- .../{e2e => test}/fixtures/init-data.yml | 2 +- src/test/resources/{e2e => test}/requests.yml | 0 .../resources/{e2e => test}/scenarios.yml | 0 .../resources/{e2e => test}/scenarios/a.yml | 0 .../resources/{e2e => test}/scenarios/b.yml | 0 .../resources/{e2e => test}/scenarios/c.yml | 0 .../src/main/java/ghissues/Gh809.java | 19 +++++ .../GHIssues/src/main/resources/logback.xml | 2 +- .../resources/rythm/ghissues/Gh809/index.html | 6 ++ .../resources/{e2e => test}/scenarios/784.yml | 1 + .../resources/{e2e => test}/scenarios/786.yml | 1 + .../scenarios/787-left-as-blank.yml | 0 .../resources/{e2e => test}/scenarios/790.yml | 1 + .../resources/{e2e => test}/scenarios/796.yml | 1 + .../resources/{e2e => test}/scenarios/797.yml | 1 + .../resources/{e2e => test}/scenarios/798.yml | 1 + .../src/main/resources/test/scenarios/809.yml | 9 +++ .../src/main/resources/logback.xml | 2 +- 96 files changed, 604 insertions(+), 289 deletions(-) rename src/main/java/act/{e2e => test}/AcceptType.java (95%) create mode 100644 src/main/java/act/test/FixtureLoader.java rename src/main/java/act/{e2e => test}/Interaction.java (95%) rename src/main/java/act/{e2e => test}/InteractionPart.java (96%) rename src/main/java/act/{e2e => test}/RequestSpec.java (95%) rename src/main/java/act/{e2e => test}/ResponseSpec.java (98%) rename src/main/java/act/{e2e => test}/Scenario.java (97%) rename src/main/java/act/{e2e => test}/ScenarioDebugHelper.java (78%) rename src/main/java/act/{e2e => test}/ScenarioPart.java (96%) rename src/main/java/act/{e2e/E2E.java => test/Test.java} (86%) rename src/main/java/act/{e2e/E2EStop.java => test/TestStart.java} (82%) rename src/main/java/act/{e2e/E2EStatus.java => test/TestStatus.java} (88%) rename src/main/java/act/{e2e/E2EStart.java => test/TestStop.java} (82%) rename src/main/java/act/{e2e => test}/func/Func.java (99%) rename src/main/java/act/{e2e => test}/func/SampleDataProviderAdaptor.java (98%) rename src/main/java/act/{e2e => test}/inbox/ImapInboxReader.java (99%) rename src/main/java/act/{e2e => test}/inbox/Inbox.java (86%) rename src/main/java/act/{e2e => test}/macro/Macro.java (97%) rename src/main/java/act/{e2e => test}/req_modifier/RequestModifier.java (96%) rename src/main/java/act/{e2e => test}/util/CookieStore.java (97%) rename src/main/java/act/{e2e => test}/util/ErrorMessage.java (97%) rename src/main/java/act/{e2e => test}/util/JSONTraverser.java (97%) rename src/main/java/act/{e2e => test}/util/NamedLogic.java (99%) rename src/main/java/act/{e2e => test}/util/NullDaoLocator.java (95%) rename src/main/java/act/{e2e => test}/util/RequestTemplateManager.java (94%) rename src/main/java/act/{e2e => test}/util/ScenarioComparator.java (96%) rename src/main/java/act/{e2e => test}/util/ScenarioManager.java (92%) rename src/main/java/act/{e2e => test}/util/TxScope.java (91%) rename src/main/java/act/{e2e => test}/util/TxScopeProvider.java (96%) rename src/main/java/act/{e2e => test}/util/YamlLoader.java (98%) rename src/main/java/act/{e2e => test}/verifier/After.java (94%) rename src/main/java/act/{e2e => test}/verifier/Before.java (94%) rename src/main/java/act/{e2e => test}/verifier/Compare.java (98%) rename src/main/java/act/{e2e => test}/verifier/Contains.java (97%) rename src/main/java/act/{e2e => test}/verifier/DateTimeVerifier.java (98%) rename src/main/java/act/{e2e => test}/verifier/Ends.java (95%) rename src/main/java/act/{e2e => test}/verifier/Eq.java (95%) rename src/main/java/act/{e2e => test}/verifier/EqIgnoreCase.java (95%) rename src/main/java/act/{e2e => test}/verifier/Exists.java (96%) rename src/main/java/act/{e2e => test}/verifier/Gt.java (95%) rename src/main/java/act/{e2e => test}/verifier/Gte.java (95%) rename src/main/java/act/{e2e => test}/verifier/Lt.java (95%) rename src/main/java/act/{e2e => test}/verifier/Lte.java (95%) rename src/main/java/act/{e2e => test}/verifier/Neq.java (95%) rename src/main/java/act/{e2e => test}/verifier/Starts.java (95%) rename src/main/java/act/{e2e => test}/verifier/Verifier.java (93%) create mode 100644 src/main/java/act/util/AnnotatedMethodFinder.java create mode 100644 src/main/java/act/util/MethodAnnotationDetector.java rename src/main/resources/rythm/{~e2e.html => ~test.html} (87%) rename src/test/java/act/{e2e => test}/controller/CourseService.java (94%) rename src/test/java/act/{e2e => test}/model/Course.java (97%) rename src/test/java/act/{e2e => test}/model/User.java (97%) rename src/test/java/act/{e2e => test}/util/AssertTest.java (95%) rename src/test/java/act/{e2e => test}/util/CompareTypeTest.java (95%) rename src/test/java/act/{e2e => test}/util/ExistsTest.java (96%) rename src/test/java/act/{e2e => test}/util/FuncTest.java (98%) rename src/test/java/act/{e2e => test}/util/JSONTraverserTest.java (96%) rename src/test/java/act/{e2e => test}/util/RequestTemplateManagerTest.java (91%) rename src/test/java/act/{e2e => test}/util/ScenarioManagerTest.java (88%) rename src/test/java/act/{e2e/util/E2ETestBase.java => test/util/TestTestBase.java} (84%) rename src/test/java/act/{e2e => test}/util/YamlLoaderTest.java (93%) rename src/test/resources/{e2e => test}/fixtures/init-data.yml (93%) rename src/test/resources/{e2e => test}/requests.yml (100%) rename src/test/resources/{e2e => test}/scenarios.yml (100%) rename src/test/resources/{e2e => test}/scenarios/a.yml (100%) rename src/test/resources/{e2e => test}/scenarios/b.yml (100%) rename src/test/resources/{e2e => test}/scenarios/c.yml (100%) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh809.java create mode 100644 testapps/GHIssues/src/main/resources/rythm/ghissues/Gh809/index.html rename testapps/GHIssues/src/main/resources/{e2e => test}/scenarios/784.yml (63%) rename testapps/GHIssues/src/main/resources/{e2e => test}/scenarios/786.yml (77%) rename testapps/GHIssues/src/main/resources/{e2e => test}/scenarios/787-left-as-blank.yml (100%) rename testapps/GHIssues/src/main/resources/{e2e => test}/scenarios/790.yml (83%) rename testapps/GHIssues/src/main/resources/{e2e => test}/scenarios/796.yml (65%) rename testapps/GHIssues/src/main/resources/{e2e => test}/scenarios/797.yml (62%) rename testapps/GHIssues/src/main/resources/{e2e => test}/scenarios/798.yml (65%) create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/809.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 5edfe93ac..d075843e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.8.8** +* Rename "e2e" to "test" #810 +* Bytecode enhanement error on App start #809 +* e2e - support customised fixture loading logic #808 * Environment assert - support multiple values #807 * e2e - allow loading fixtures from JSON file #806 * e2e: Allow suppress fixture clearing #805 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index ee7ad5335..92e7ffdce 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -521,10 +521,22 @@ public static DI injector() { * @param className the class name * @return the class corresponding to the name specified */ - public static Class appClassForName(String className) { + public static Class appClassForName(String className) { return app().classForName(className); } + public static Class classForName(String className) { + ClassLoader cl = null; + App app = app(); + if (null != app) { + cl = app.classLoader(); + } + if (null == cl) { + cl = Act.class.getClassLoader(); + } + return $.classForName(className, cl); + } + /** * Return an instance with give class name * diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 2fe955c67..3ae692e3d 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -1077,7 +1077,7 @@ public Set createSet() { * @param className the name of the class to be loaded * @return the class as described above */ - public Class classForName(String className) { + public Class classForName(String className) { return $.classForName(className, classLoader()); } diff --git a/src/main/java/act/controller/bytecode/HandlerEnhancer.java b/src/main/java/act/controller/bytecode/HandlerEnhancer.java index 362b3da7b..4b7b9795b 100644 --- a/src/main/java/act/controller/bytecode/HandlerEnhancer.java +++ b/src/main/java/act/controller/bytecode/HandlerEnhancer.java @@ -20,25 +20,20 @@ * #L% */ +import static act.asm.tree.AbstractInsnNode.*; + import act.app.ActionContext; import act.asm.*; -import act.asm.tree.AbstractInsnNode; import act.asm.tree.*; -import act.controller.meta.HandlerMethodMetaInfo; -import act.controller.meta.HandlerParamMetaInfo; -import act.controller.meta.LocalVariableMetaInfo; +import act.controller.meta.*; import act.util.AsmTypes; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.mvc.result.Result; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.util.*; import java.util.*; -import static act.asm.tree.AbstractInsnNode.*; - public class HandlerEnhancer extends MethodVisitor implements Opcodes { private static final Logger logger = LogManager.get(HandlerEnhancer.class); @@ -164,15 +159,16 @@ private InsnList mergeRenderLineBreaks(InsnList list) { } private void mergeRenderLineBreaks(AbstractInsnNode renderLine, InsnList list) { - AbstractInsnNode node = renderLine; + AbstractInsnNode node = renderLine.getPrevious(); while (null != node) { - node = node.getPrevious(); if (node.getOpcode() == ANEWARRAY) { return; } else if (node instanceof LabelNode) { AbstractInsnNode node0 = node.getPrevious(); list.remove(node); node = node0; + } else { + node = node.getPrevious(); } } } diff --git a/src/main/java/act/job/Job.java b/src/main/java/act/job/Job.java index 895a322fc..4778ac23b 100644 --- a/src/main/java/act/job/Job.java +++ b/src/main/java/act/job/Job.java @@ -26,21 +26,16 @@ import act.Act; import act.app.App; import act.app.event.SysEventId; -import act.event.EventBus; import act.event.SysEventListenerBase; +import act.job.bytecode.ReflectedJobInvoker; import act.route.DuplicateRouteMappingException; -import act.util.DestroyableBase; -import act.util.ProgressGauge; -import act.util.SimpleProgressGauge; +import act.util.*; import act.ws.WebSocketConnectionManager; import org.osgl.$; -import org.osgl.exception.ConfigurationException; -import org.osgl.exception.NotAppliedException; -import org.osgl.exception.UnexpectedException; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.exception.*; +import org.osgl.util.*; +import java.lang.reflect.Method; import java.util.*; import java.util.concurrent.Callable; @@ -121,11 +116,11 @@ public void run() { private boolean oneTime; private boolean executed; private JobManager manager; - private final EventBus eventBus; private JobTrigger trigger; private $.Func0 worker; Object callableResult; Exception callableException; + private Method method; // progress percentage private SimpleProgressGauge progress = new SimpleProgressGauge(); private LockableJobList parallelJobs = new LockableJobList(this); @@ -135,7 +130,6 @@ public void run() { private Job(String id) { this.id = id; this.jobProgressTag = wsJobProgressTag(id); - this.eventBus = Act.eventBus(); } Job(String id, JobManager manager) { @@ -149,7 +143,6 @@ private Job(String id) { this.app = manager.app(); this.jobProgressTag = wsJobProgressTag(id); this.manager.addJob(this); - this.eventBus = app.eventBus(); this.worker = new F0() { @Override public Object apply() throws NotAppliedException, $.Break { @@ -173,9 +166,11 @@ public Object apply() throws NotAppliedException, $.Break { this.worker = worker; this.oneTime = oneTime; this.app = manager.app(); - this.eventBus = app.eventBus(); this.jobProgressTag = wsJobProgressTag(id); this.manager.addJob(this); + if (worker instanceof ReflectedJobInvoker) { + this.method = ((ReflectedJobInvoker) worker).method(); + } } Job(String id, JobManager manager, $.Function worker) { @@ -189,7 +184,6 @@ public Object apply() throws NotAppliedException, $.Break { this.worker = f1.curry(progress); this.oneTime = oneTime; this.app = manager.app(); - this.eventBus = app.eventBus(); this.jobProgressTag = wsJobProgressTag(id); this.manager.addJob(this); } @@ -237,6 +231,10 @@ public String toString() { return sb.toString(); } + public Method method() { + return method; + } + private static void printSubJobs(Collection subJobs, String label, S.Buffer sb) { if (null != subJobs && !subJobs.isEmpty()) { sb.append("\n").append(label); diff --git a/src/main/java/act/job/JobAnnotationProcessor.java b/src/main/java/act/job/JobAnnotationProcessor.java index 83e75b0a4..3c8115dd2 100644 --- a/src/main/java/act/job/JobAnnotationProcessor.java +++ b/src/main/java/act/job/JobAnnotationProcessor.java @@ -23,6 +23,7 @@ import act.app.App; import act.app.AppHolderBase; import act.app.event.SysEventId; +import act.test.FixtureLoader; import act.job.bytecode.JobAnnoInfo; import act.job.bytecode.ReflectedJobInvoker; import act.job.meta.JobClassMetaInfo; @@ -86,6 +87,8 @@ public void run() { registerOnAppStop(job, async); } else if (OnSysEvent.class.isAssignableFrom(anno)) { registerOnSysEvent(job, info.sysEventId, info.async); + } else if (FixtureLoader.class.isAssignableFrom(anno)) { + // fixture loader job already registered; } else { throw E.unsupport("Unknown job annotation class: %s", anno.getName()); } diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 7110ddfd2..3c2a3f27c 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -22,9 +22,7 @@ import act.Act; import act.Destroyable; -import act.app.App; -import act.app.AppServiceBase; -import act.app.AppThreadFactory; +import act.app.*; import act.app.event.SysEventId; import act.event.OnceEventListenerBase; import act.event.SysEventListenerBase; @@ -37,11 +35,10 @@ import org.osgl.exception.NotAppliedException; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.util.*; import org.rythmengine.utils.Time; +import java.lang.reflect.Method; import java.util.EventObject; import java.util.Map; import java.util.concurrent.*; @@ -52,6 +49,7 @@ public class JobManager extends AppServiceBase { private ScheduledThreadPoolExecutor executor; private ConcurrentMap jobs = new ConcurrentHashMap(); + private ConcurrentMap methodIndex = new ConcurrentHashMap<>(); private ConcurrentMap scheduled = new ConcurrentHashMap<>(); static String sysEventJobId(SysEventId eventId) { @@ -324,6 +322,10 @@ public void beforeAppStop(final Runnable runnable) { on(SysEventId.STOP, runnable); } + public Job forMethod(Method method) { + return methodIndex.get(method); + } + public SimpleProgressGauge progressGauge(String jobId) { return jobById(jobId).progress(); } @@ -355,11 +357,11 @@ void futureScheduled(String id, ScheduledFuture future) { scheduled.putIfAbsent(id, future); } - Job jobById(String id) { + public Job jobById(String id) { return jobById(id, true); } - Job jobById(String id, boolean warn) { + public Job jobById(String id, boolean warn) { Job job = jobs.get(id); if (null == job) { ScheduledFuture future = scheduled.get(id); @@ -377,6 +379,10 @@ void addJob(Job job) { String id = job.id(); E.illegalStateIf(jobs.containsKey(id), "job already registered: %s", id); jobs.put(id, job); + Method method = job.method(); + if (null != method) { + methodIndex.put(method, job); + } } void removeJob(Job job) { @@ -386,6 +392,10 @@ void removeJob(Job job) { if (null != future) { future.cancel(true); } + Method method = job.method(); + if (null != method) { + methodIndex.remove(method); + } } ScheduledThreadPoolExecutor executor() { diff --git a/src/main/java/act/job/bytecode/JobByteCodeScanner.java b/src/main/java/act/job/bytecode/JobByteCodeScanner.java index 3bbe7b015..f5d8d8015 100644 --- a/src/main/java/act/job/bytecode/JobByteCodeScanner.java +++ b/src/main/java/act/job/bytecode/JobByteCodeScanner.java @@ -26,6 +26,7 @@ import act.asm.MethodVisitor; import act.asm.Opcodes; import act.asm.Type; +import act.test.FixtureLoader; import act.job.JobAnnotationProcessor; import act.job.meta.JobClassMetaInfo; import act.job.meta.JobClassMetaInfoManager; @@ -221,7 +222,11 @@ public void visitEnum(String name, String desc, String value) { @Override public void visit(String name, Object value) { if ("value".equals(name)) { - this.currentInfo.value = value.toString(); + if (this.currentInfo.annotationType == FixtureLoader.class) { + method.id(S.string(value)); + } else { + this.currentInfo.value = value.toString(); + } } else if ("async".equals(name)) { this.currentInfo.async = $.bool(value); } else if ("id".equals(name)) { diff --git a/src/main/java/act/job/bytecode/ReflectedJobInvoker.java b/src/main/java/act/job/bytecode/ReflectedJobInvoker.java index 3bfebc931..ce98988f1 100644 --- a/src/main/java/act/job/bytecode/ReflectedJobInvoker.java +++ b/src/main/java/act/job/bytecode/ReflectedJobInvoker.java @@ -112,6 +112,10 @@ public Object apply() throws NotAppliedException, $.Break { return invoke(job, ctx); } + public Method method() { + return method; + } + private Class[] paramTypes() { List paramTypes = methodInfo.paramTypes(); int sz = null == paramTypes ? 0 : paramTypes.size(); diff --git a/src/main/java/act/job/meta/JobClassMetaInfo.java b/src/main/java/act/job/meta/JobClassMetaInfo.java index aff662784..cba9eec3e 100644 --- a/src/main/java/act/job/meta/JobClassMetaInfo.java +++ b/src/main/java/act/job/meta/JobClassMetaInfo.java @@ -20,20 +20,18 @@ * #L% */ +import static act.Destroyable.Util.destroyAll; + import act.asm.Type; +import act.test.FixtureLoader; import act.job.*; import act.util.DestroyableBase; import org.osgl.util.C; import org.osgl.util.S; -import javax.enterprise.context.ApplicationScoped; import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static act.Destroyable.Util.destroyAll; +import java.util.*; +import javax.enterprise.context.ApplicationScoped; /** * Stores all class level information to support generating of @@ -127,7 +125,7 @@ private void buildActionLookup() { private static final C.Set> ACTION_ANNOTATION_TYPES = C.set( AlongWith.class, Cron.class, Every.class, FixedDelay.class, InvokeAfter.class, InvokeBefore.class, - OnAppStart.class, OnAppStop.class, OnSysEvent.class); + OnAppStart.class, OnAppStop.class, OnSysEvent.class, FixtureLoader.class); public static boolean isActionAnnotation(Class type) { return ACTION_ANNOTATION_TYPES.contains(type); diff --git a/src/main/java/act/mail/MailerContext.java b/src/main/java/act/mail/MailerContext.java index 6e68f281d..b7bf0bb6b 100644 --- a/src/main/java/act/mail/MailerContext.java +++ b/src/main/java/act/mail/MailerContext.java @@ -23,7 +23,7 @@ import act.Act; import act.app.ActionContext; import act.app.App; -import act.e2e.E2E; +import act.test.Test; import act.event.ActEvent; import act.event.SystemEvent; import act.util.ActContext; @@ -196,9 +196,9 @@ public String subject() { } public MailerContext subject(String subject, Object ... args) { - String emailId = E2E.generateEmailId(); + String emailId = Test.generateEmailId(); if (null != emailId) { - emailId = "[e2e-" + emailId + "]"; + emailId = "[test-" + emailId + "]"; } if (S.blank(subject)) { if (null != emailId) { diff --git a/src/main/java/act/e2e/AcceptType.java b/src/main/java/act/test/AcceptType.java similarity index 95% rename from src/main/java/act/e2e/AcceptType.java rename to src/main/java/act/test/AcceptType.java index 082530114..df3add236 100644 --- a/src/main/java/act/e2e/AcceptType.java +++ b/src/main/java/act/test/AcceptType.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/test/FixtureLoader.java b/src/main/java/act/test/FixtureLoader.java new file mode 100644 index 000000000..d0ce40aae --- /dev/null +++ b/src/main/java/act/test/FixtureLoader.java @@ -0,0 +1,41 @@ +package act.test; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Mark a method as fixture loader, which can be invoked to load + * fixtures for test + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface FixtureLoader { + + /** + * Specify the ID of the fixture loader. It can + * be omitted if the method has been annotated + * with any Job annotation. In which case it + * will use the Job ID as fixture Loader ID + */ + String value() default ""; + +} diff --git a/src/main/java/act/e2e/Interaction.java b/src/main/java/act/test/Interaction.java similarity index 95% rename from src/main/java/act/e2e/Interaction.java rename to src/main/java/act/test/Interaction.java index 72525eafa..e85f21293 100644 --- a/src/main/java/act/e2e/Interaction.java +++ b/src/main/java/act/test/Interaction.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -20,12 +20,12 @@ * #L% */ -import static act.e2e.E2EStatus.PENDING; -import static act.e2e.util.ErrorMessage.error; +import static act.test.TestStatus.PENDING; +import static act.test.util.ErrorMessage.error; import act.Act; -import act.e2e.inbox.Inbox; -import act.e2e.macro.Macro; +import act.test.inbox.Inbox; +import act.test.macro.Macro; import okhttp3.Response; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; @@ -42,7 +42,7 @@ public class Interaction implements ScenarioPart { public Map cache = new LinkedHashMap<>(); public String errorMessage; public Throwable cause; - public E2EStatus status = PENDING; + public TestStatus status = PENDING; @Override public void validate(Scenario scenario) throws UnexpectedException { @@ -64,7 +64,7 @@ public String toString() { public boolean run() { boolean pass = run(preActions) && verify() && run(postActions); - status = E2EStatus.of(pass); + status = TestStatus.of(pass); return pass; } diff --git a/src/main/java/act/e2e/InteractionPart.java b/src/main/java/act/test/InteractionPart.java similarity index 96% rename from src/main/java/act/e2e/InteractionPart.java rename to src/main/java/act/test/InteractionPart.java index 1ffb21e5a..ff0cc27e1 100644 --- a/src/main/java/act/e2e/InteractionPart.java +++ b/src/main/java/act/test/InteractionPart.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/RequestSpec.java b/src/main/java/act/test/RequestSpec.java similarity index 95% rename from src/main/java/act/e2e/RequestSpec.java rename to src/main/java/act/test/RequestSpec.java index c904e2a88..0f46dbc18 100644 --- a/src/main/java/act/e2e/RequestSpec.java +++ b/src/main/java/act/test/RequestSpec.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -22,8 +22,8 @@ import static org.osgl.http.H.Header.Names.CONTENT_TYPE; -import act.e2e.req_modifier.RequestModifier; -import act.e2e.util.RequestTemplateManager; +import act.test.req_modifier.RequestModifier; +import act.test.util.RequestTemplateManager; import com.alibaba.fastjson.JSON; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; @@ -147,7 +147,7 @@ private void extendsParent(RequestSpec parent) { private static RequestSpec clearFixture() { RequestSpec rs = new RequestSpec(); rs.method = H.Method.DELETE; - rs.url = "/~/e2e/fixtures"; + rs.url = "/~/test/fixtures"; return rs; } @@ -155,7 +155,7 @@ public static RequestSpec loadFixtures(List fixtures) { RequestSpec rs = new RequestSpec(); rs.method = H.Method.POST; rs.headers.put(CONTENT_TYPE, H.Format.JSON.contentType()); - rs.url = "/~/e2e/fixtures"; + rs.url = "/~/test/fixtures"; rs.json = JSON.toJSONString(C.Map("fixtures", fixtures)); return rs; } @@ -164,7 +164,7 @@ public static RequestSpec generateTestData(String modelType, int number) { RequestSpec rs = new RequestSpec(); rs.method = H.Method.POST; rs.headers.put(CONTENT_TYPE, H.Format.JSON.contentType()); - rs.url = "/~/e2e/generateTestData"; + rs.url = "/~/test/generateTestData"; rs.json = JSON.toJSONString(C.Map("modelType", modelType, "number", number)); return rs; } diff --git a/src/main/java/act/e2e/ResponseSpec.java b/src/main/java/act/test/ResponseSpec.java similarity index 98% rename from src/main/java/act/e2e/ResponseSpec.java rename to src/main/java/act/test/ResponseSpec.java index ff7e663ff..3577fae10 100644 --- a/src/main/java/act/e2e/ResponseSpec.java +++ b/src/main/java/act/test/ResponseSpec.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/Scenario.java b/src/main/java/act/test/Scenario.java similarity index 97% rename from src/main/java/act/e2e/Scenario.java rename to src/main/java/act/test/Scenario.java index e4f28f992..6712ef05a 100644 --- a/src/main/java/act/e2e/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -20,21 +20,21 @@ * #L% */ -import static act.e2e.E2EStatus.PENDING; -import static act.e2e.util.ErrorMessage.*; +import static act.test.TestStatus.PENDING; +import static act.test.util.ErrorMessage.*; import static org.osgl.http.H.Header.Names.ACCEPT; import static org.osgl.http.H.Header.Names.X_REQUESTED_WITH; import static org.osgl.http.H.Method.POST; import act.Act; import act.app.App; -import act.e2e.func.Func; -import act.e2e.req_modifier.RequestModifier; -import act.e2e.util.CookieStore; -import act.e2e.util.JSONTraverser; -import act.e2e.util.RequestTemplateManager; -import act.e2e.util.ScenarioManager; -import act.e2e.verifier.Verifier; +import act.test.func.Func; +import act.test.req_modifier.RequestModifier; +import act.test.util.CookieStore; +import act.test.util.JSONTraverser; +import act.test.util.RequestTemplateManager; +import act.test.util.ScenarioManager; +import act.test.verifier.Verifier; import act.handler.builtin.FileGetter; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -61,7 +61,7 @@ public class Scenario implements ScenarioPart { - private static final Logger LOGGER = E2E.LOGGER; + private static final Logger LOGGER = Test.LOGGER; private static final ThreadLocal current = new ThreadLocal<>(); @@ -155,7 +155,7 @@ private class RequestBuilder { for (Map.Entry entry : requestSpec.parts.entrySet()) { String key = entry.getKey(); String val = S.string(entry.getValue()); - String path = S.pathConcat("e2e/upload", '/', val); + String path = S.pathConcat("test/upload", '/', val); URL fileUrl = Act.getResource(path); if (null != fileUrl) { String filePath = fileUrl.getFile(); @@ -239,7 +239,7 @@ private String verifyJsonBody(Object jsonBody) { public List depends = new ArrayList<>(); public List interactions = new ArrayList<>(); public Map constants = new HashMap<>(); - public E2EStatus status = PENDING; + public TestStatus status = PENDING; public String errorMessage; public Throwable cause; public boolean clearFixtures = true; @@ -276,7 +276,7 @@ public Object cached(String name) { return cache.get(name); } - public E2EStatus statusOf(Interaction interaction) { + public TestStatus statusOf(Interaction interaction) { return interaction.status; } @@ -318,7 +318,7 @@ private Object eval(String expr) { } String key = S.underscore(expr); Object o = constants.get(key); - return null == o ? E2E.constant(key) : o; + return null == o ? Test.constant(key) : o; } private Object evalFunc(String funcExpr) { @@ -364,7 +364,7 @@ private void start(ScenarioManager scenarioManager, RequestTemplateManager reque prepareHttp(); } boolean pass = (!reset || reset()) && run(); - this.status = E2EStatus.of(pass); + this.status = TestStatus.of(pass); } public void clearSession() { @@ -450,7 +450,7 @@ private boolean verify(RequestSpec req, String operation) { } private void prepareHttp() { - long timeout = "e2e".equalsIgnoreCase(Act.profile()) ? 10 : 60 * 60; + long timeout = ("e2e".equalsIgnoreCase(Act.profile()) || "test".equalsIgnoreCase(Act.profile())) ? 10 : 60 * 60; http = new OkHttpClient.Builder() .cookieJar(cookieStore()) .connectTimeout(timeout, TimeUnit.SECONDS) @@ -914,7 +914,7 @@ private Object getVal(String key) { if (null != o) { return o; } - o = E2E.constant(key); + o = Test.constant(key); if (null != o) { return o; } diff --git a/src/main/java/act/e2e/ScenarioDebugHelper.java b/src/main/java/act/test/ScenarioDebugHelper.java similarity index 78% rename from src/main/java/act/e2e/ScenarioDebugHelper.java rename to src/main/java/act/test/ScenarioDebugHelper.java index cc456005b..b40ae9376 100644 --- a/src/main/java/act/e2e/ScenarioDebugHelper.java +++ b/src/main/java/act/test/ScenarioDebugHelper.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -39,8 +39,8 @@ /** * Allows debug scenario file via: - * 1. provide a command to launch e2e test - * 2. register e2e built-in services even when it is not in e2e profile + * 1. provide a command to launch test + * 2. register test built-in services even when it is not in test profile */ @Singleton @Env.RequireMode(Act.Mode.DEV) @@ -48,17 +48,17 @@ public class ScenarioDebugHelper { public static class LoadFixtures extends RequestHandlerBase { - private E2E e2e; + private Test test; - public LoadFixtures(E2E e2e) { - this.e2e = e2e; + public LoadFixtures(Test test) { + this.test = test; } @Override public void handle(ActionContext context) { JSONObject json = JSON.parseObject(context.body()); JSONArray fixtures = json.getJSONArray("fixtures"); - e2e.loadFixtures((List) fixtures); + test.loadFixtures((List) fixtures); H.Response resp = context.resp(); resp.status(H.Status.OK); resp.commit(); @@ -71,15 +71,15 @@ public void prepareAuthentication(ActionContext context) { } public static class ClearFixtures extends RequestHandlerBase { - private E2E e2e; + private Test test; - public ClearFixtures(E2E e2e) { - this.e2e = e2e; + public ClearFixtures(Test test) { + this.test = test; } @Override public void handle(ActionContext context) { - e2e.clearFixtures(); + test.clearFixtures(); H.Response resp = context.resp(); resp.status(H.Status.NO_CONTENT); resp.commit(); @@ -93,12 +93,12 @@ public void prepareAuthentication(ActionContext context) { @Inject - private E2E e2e; + private Test test; - @GetAction("e2e") + @GetAction({"e2e", "test"}) public void run(App app) { - List scenarios = e2e.run(app, false); - renderTemplate("/~e2e.html", scenarios); + List scenarios = test.run(app, false); + renderTemplate("/~test.html", scenarios); } } diff --git a/src/main/java/act/e2e/ScenarioPart.java b/src/main/java/act/test/ScenarioPart.java similarity index 96% rename from src/main/java/act/e2e/ScenarioPart.java rename to src/main/java/act/test/ScenarioPart.java index f224dd3a8..96180206c 100644 --- a/src/main/java/act/e2e/ScenarioPart.java +++ b/src/main/java/act/test/ScenarioPart.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/E2E.java b/src/main/java/act/test/Test.java similarity index 86% rename from src/main/java/act/e2e/E2E.java rename to src/main/java/act/test/Test.java index 9cc90c8b9..50ecf2d97 100644 --- a/src/main/java/act/e2e/E2E.java +++ b/src/main/java/act/test/Test.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -26,14 +26,14 @@ import act.app.DbServiceManager; import act.db.Dao; import act.db.DbService; -import act.e2e.func.Func; -import act.e2e.macro.Macro; -import act.e2e.req_modifier.RequestModifier; -import act.e2e.util.*; -import act.e2e.verifier.Verifier; +import act.test.func.Func; +import act.test.macro.Macro; +import act.test.req_modifier.RequestModifier; +import act.test.util.*; +import act.test.verifier.Verifier; import act.event.EventBus; import act.inject.DefaultValue; -import act.job.OnAppStart; +import act.job.*; import act.sys.Env; import act.util.LogSupport; import org.osgl.$; @@ -51,10 +51,10 @@ import javax.inject.Inject; @Env.RequireMode(Act.Mode.DEV) -public class E2E extends LogSupport { +public class Test extends LogSupport { - static final Logger LOGGER = LogManager.get(E2E.class); + static final Logger LOGGER = LogManager.get(Test.class); private static final AtomicBoolean STARTED = new AtomicBoolean(false); @@ -69,7 +69,7 @@ public static class ConstantPool { load(); } private static void load() { - URL url = Act.getResource("e2e/constants.properties"); + URL url = Act.getResource("test/constants.properties"); if (null != url) { Properties p = IO.loadProperties(url); for (Map.Entry entry : p.entrySet()) { @@ -90,16 +90,24 @@ public static String get(String name) { @Inject private YamlLoader yamlLoader; + @Inject + private JobManager jobManager; + /** * Load fixture data for testing. * - * Requested by e2e executor and executed on test host to + * Requested by test executor and executed on test host to * setup testing data */ - @PostAction("e2e/fixtures") + @PostAction({"e2e/fixtures", "test/fixtures"}) public void loadFixtures(List fixtures) { for (String fixture : fixtures) { - yamlLoader.loadFixture(fixture, dbServiceManager); + Job fixtureLoader = jobManager.jobById(fixture, false); + if (null != fixtureLoader) { + fixtureLoader.run(); + } else { + yamlLoader.loadFixture(fixture, dbServiceManager); + } } } @@ -110,14 +118,14 @@ public void loadFixtures(List fixtures) { * @param number * the number of records to be generated */ - @PostAction("e2e/generateTestData") + @PostAction({"e2e/generateTestData", "test/generateTestData"}) public void generateSampleData(String modelType, @DefaultValue("100") Integer number) { E.illegalArgumentIf(number < 1); Class modelClass = null; if (modelType.contains(".")) { modelClass = Act.appClassForName(modelType); } else { - String modelPackages = Act.appConfig().get("e2e.model-packages"); + String modelPackages = Act.appConfig().get("test.model-packages"); E.illegalArgumentIf(S.blank(modelPackages), "Unknown model type: " + modelType); for (String pkg : S.fastSplit(modelPackages, ",")) { String type = S.concat(pkg, ".", modelType); @@ -141,10 +149,10 @@ public void generateSampleData(String modelType, @DefaultValue("100") Integer nu /** * Clear fixture data. * - * Requested by e2e executor and executed on test host to + * Requested by test executor and executed on test host to * setup testing data */ - @DeleteAction("e2e/fixtures") + @DeleteAction({"e2e/fixtures", "test/fixtures"}) public void clearFixtures() { List toBeDeleted = new ArrayList<>(); for (DbService svc : dbServiceManager.registeredServices()) { @@ -194,7 +202,7 @@ public void clearFixtures() { // wait 1 seconds to allow app setup the network @OnAppStart(delayInSeconds = 1) public void run(App app) { - boolean run = $.bool(app.config().get("e2e.run")) || "e2e".equalsIgnoreCase(Act.profile()); + boolean run = $.bool(app.config().get("test.run")) || $.bool(app.config().get("e2e.run")) || "test".equalsIgnoreCase(Act.profile()) || "e2e".equalsIgnoreCase(Act.profile()); if (run) { run(app, true); } @@ -202,12 +210,12 @@ public void run(App app) { public List run(App app, boolean shutdownApp) { E.illegalStateIf(inProgress()); - info("Start running E2E test scenarios\n"); + info("Start running test scenarios\n"); int exitCode = 0; EventBus eventBus = app.eventBus(); STARTED.set(true); try { - eventBus.trigger(E2EStart.INSTANCE); + eventBus.trigger(TestStart.INSTANCE); app.captchaManager().disable(); registerTypeConverters(); RequestTemplateManager requestTemplateManager = new RequestTemplateManager(); @@ -225,7 +233,7 @@ public List run(App app, boolean shutdownApp) { String message = e.getMessage(); scenario.errorMessage = S.blank(message) ? e.getClass().getName() : message; scenario.cause = e.getCause(); - scenario.status = E2EStatus.FAIL; + scenario.status = TestStatus.FAIL; } } } @@ -252,7 +260,7 @@ public List run(App app, boolean shutdownApp) { } else { app.captchaManager().enable(); } - eventBus.trigger(E2EStop.INSTANCE); + eventBus.trigger(TestStop.INSTANCE); } } @@ -300,7 +308,7 @@ public static boolean inProgress() { } public static String generateEmailId() { - if (!E2E.inProgress()) { + if (!Test.inProgress()) { return null; } lastEmailId = S.random(8); diff --git a/src/main/java/act/e2e/E2EStop.java b/src/main/java/act/test/TestStart.java similarity index 82% rename from src/main/java/act/e2e/E2EStop.java rename to src/main/java/act/test/TestStart.java index 5b43b7155..b8f3b54fd 100644 --- a/src/main/java/act/e2e/E2EStop.java +++ b/src/main/java/act/test/TestStart.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -22,6 +22,6 @@ import act.event.ActEvent; -public class E2EStop extends ActEvent { - public static final E2EStop INSTANCE = new E2EStop(); +public class TestStart extends ActEvent { + public static final TestStart INSTANCE = new TestStart(); } diff --git a/src/main/java/act/e2e/E2EStatus.java b/src/main/java/act/test/TestStatus.java similarity index 88% rename from src/main/java/act/e2e/E2EStatus.java rename to src/main/java/act/test/TestStatus.java index f565c7e75..efc5dd5d4 100644 --- a/src/main/java/act/e2e/E2EStatus.java +++ b/src/main/java/act/test/TestStatus.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -20,10 +20,10 @@ * #L% */ -public enum E2EStatus { +public enum TestStatus { PENDING, PASS, FAIL; - public static E2EStatus of(boolean result) { + public static TestStatus of(boolean result) { return result ? PASS : FAIL; } diff --git a/src/main/java/act/e2e/E2EStart.java b/src/main/java/act/test/TestStop.java similarity index 82% rename from src/main/java/act/e2e/E2EStart.java rename to src/main/java/act/test/TestStop.java index a98ed5edb..726f0431b 100644 --- a/src/main/java/act/e2e/E2EStart.java +++ b/src/main/java/act/test/TestStop.java @@ -1,8 +1,8 @@ -package act.e2e; +package act.test; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -22,6 +22,6 @@ import act.event.ActEvent; -public class E2EStart extends ActEvent { - public static final E2EStart INSTANCE = new E2EStart(); +public class TestStop extends ActEvent { + public static final TestStop INSTANCE = new TestStop(); } diff --git a/src/main/java/act/e2e/func/Func.java b/src/main/java/act/test/func/Func.java similarity index 99% rename from src/main/java/act/e2e/func/Func.java rename to src/main/java/act/test/func/Func.java index 2e2be93a5..e2899177c 100644 --- a/src/main/java/act/e2e/func/Func.java +++ b/src/main/java/act/test/func/Func.java @@ -1,8 +1,8 @@ -package act.e2e.func; +package act.test.func; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -21,8 +21,8 @@ */ import act.Act; -import act.e2e.inbox.Inbox; -import act.e2e.util.NamedLogic; +import act.test.inbox.Inbox; +import act.test.util.NamedLogic; import org.osgl.$; import org.osgl.util.*; import org.osgl.util.converter.TypeConverterRegistry; diff --git a/src/main/java/act/e2e/func/SampleDataProviderAdaptor.java b/src/main/java/act/test/func/SampleDataProviderAdaptor.java similarity index 98% rename from src/main/java/act/e2e/func/SampleDataProviderAdaptor.java rename to src/main/java/act/test/func/SampleDataProviderAdaptor.java index 67e040a78..21b562af4 100644 --- a/src/main/java/act/e2e/func/SampleDataProviderAdaptor.java +++ b/src/main/java/act/test/func/SampleDataProviderAdaptor.java @@ -1,8 +1,8 @@ -package act.e2e.func; +package act.test.func; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/inbox/ImapInboxReader.java b/src/main/java/act/test/inbox/ImapInboxReader.java similarity index 99% rename from src/main/java/act/e2e/inbox/ImapInboxReader.java rename to src/main/java/act/test/inbox/ImapInboxReader.java index fe9d0db74..6fecee856 100644 --- a/src/main/java/act/e2e/inbox/ImapInboxReader.java +++ b/src/main/java/act/test/inbox/ImapInboxReader.java @@ -1,4 +1,4 @@ -package act.e2e.inbox; +package act.test.inbox; /*- * #%L diff --git a/src/main/java/act/e2e/inbox/Inbox.java b/src/main/java/act/test/inbox/Inbox.java similarity index 86% rename from src/main/java/act/e2e/inbox/Inbox.java rename to src/main/java/act/test/inbox/Inbox.java index e5b2f933e..d9d6f87f7 100644 --- a/src/main/java/act/e2e/inbox/Inbox.java +++ b/src/main/java/act/test/inbox/Inbox.java @@ -1,4 +1,4 @@ -package act.e2e.inbox; +package act.test.inbox; /*- * #%L @@ -30,19 +30,19 @@ @Singleton public class Inbox { - @Configuration("e2e.inbox.account") + @Configuration("test.inbox.account") public String account; - @Configuration("e2e.inbox.password") + @Configuration("test.inbox.password") String password; - @Configuration("e2e.inbox.protocol") + @Configuration("test.inbox.protocol") String protocol; - @Configuration("e2e.inbox.host") + @Configuration("test.inbox.host") String host; - @Configuration("e2e.inbox.port") + @Configuration("test.inbox.port") int port; public interface Reader { diff --git a/src/main/java/act/e2e/macro/Macro.java b/src/main/java/act/test/macro/Macro.java similarity index 97% rename from src/main/java/act/e2e/macro/Macro.java rename to src/main/java/act/test/macro/Macro.java index f95a02ea1..9870888f2 100644 --- a/src/main/java/act/e2e/macro/Macro.java +++ b/src/main/java/act/test/macro/Macro.java @@ -1,8 +1,8 @@ -package act.e2e.macro; +package act.test.macro; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -21,8 +21,8 @@ */ import act.app.App; -import act.e2e.Scenario; -import act.e2e.util.NamedLogic; +import act.test.Scenario; +import act.test.util.NamedLogic; import org.osgl.$; import org.osgl.util.C; import org.osgl.util.E; diff --git a/src/main/java/act/e2e/req_modifier/RequestModifier.java b/src/main/java/act/test/req_modifier/RequestModifier.java similarity index 96% rename from src/main/java/act/e2e/req_modifier/RequestModifier.java rename to src/main/java/act/test/req_modifier/RequestModifier.java index 5e9541edf..e07122b55 100644 --- a/src/main/java/act/e2e/req_modifier/RequestModifier.java +++ b/src/main/java/act/test/req_modifier/RequestModifier.java @@ -1,8 +1,8 @@ -package act.e2e.req_modifier; +package act.test.req_modifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -22,7 +22,7 @@ import static org.osgl.http.H.Header.Names.*; -import act.e2e.util.NamedLogic; +import act.test.util.NamedLogic; import okhttp3.Request; import org.osgl.util.C; import org.osgl.util.S; diff --git a/src/main/java/act/e2e/util/CookieStore.java b/src/main/java/act/test/util/CookieStore.java similarity index 97% rename from src/main/java/act/e2e/util/CookieStore.java rename to src/main/java/act/test/util/CookieStore.java index 908ec1faf..a8bab349d 100644 --- a/src/main/java/act/e2e/util/CookieStore.java +++ b/src/main/java/act/test/util/CookieStore.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/util/ErrorMessage.java b/src/main/java/act/test/util/ErrorMessage.java similarity index 97% rename from src/main/java/act/e2e/util/ErrorMessage.java rename to src/main/java/act/test/util/ErrorMessage.java index 6917cf00c..794bc9abf 100644 --- a/src/main/java/act/e2e/util/ErrorMessage.java +++ b/src/main/java/act/test/util/ErrorMessage.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/util/JSONTraverser.java b/src/main/java/act/test/util/JSONTraverser.java similarity index 97% rename from src/main/java/act/e2e/util/JSONTraverser.java rename to src/main/java/act/test/util/JSONTraverser.java index 72258eecd..015d835dc 100644 --- a/src/main/java/act/e2e/util/JSONTraverser.java +++ b/src/main/java/act/test/util/JSONTraverser.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/util/NamedLogic.java b/src/main/java/act/test/util/NamedLogic.java similarity index 99% rename from src/main/java/act/e2e/util/NamedLogic.java rename to src/main/java/act/test/util/NamedLogic.java index 11d0c6815..e161ef255 100644 --- a/src/main/java/act/e2e/util/NamedLogic.java +++ b/src/main/java/act/test/util/NamedLogic.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/util/NullDaoLocator.java b/src/main/java/act/test/util/NullDaoLocator.java similarity index 95% rename from src/main/java/act/e2e/util/NullDaoLocator.java rename to src/main/java/act/test/util/NullDaoLocator.java index 4a101973d..1502fe02c 100644 --- a/src/main/java/act/e2e/util/NullDaoLocator.java +++ b/src/main/java/act/test/util/NullDaoLocator.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/util/RequestTemplateManager.java b/src/main/java/act/test/util/RequestTemplateManager.java similarity index 94% rename from src/main/java/act/e2e/util/RequestTemplateManager.java rename to src/main/java/act/test/util/RequestTemplateManager.java index 68364e06d..a99b32b25 100644 --- a/src/main/java/act/e2e/util/RequestTemplateManager.java +++ b/src/main/java/act/test/util/RequestTemplateManager.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -23,7 +23,7 @@ import act.Act; import act.app.App; import act.app.DaoLocator; -import act.e2e.RequestSpec; +import act.test.RequestSpec; import org.osgl.$; import org.osgl.util.E; import org.osgl.util.Keyword; @@ -41,8 +41,8 @@ public class RequestTemplateManager extends YamlLoader { private Map store = new HashMap<>(); public RequestTemplateManager() { - super("act.e2e"); - setFixtureFolder("/e2e/"); + super("act.test"); + setFixtureFolder("/test/"); } public void load() { @@ -96,7 +96,7 @@ private void addGlobal() { if (S.notBlank(sessionHeader)) { spec.headers.put(sessionHeader, "last:"); } - if ($.bool(app.config().get("act.e2e.json"))) { + if ($.bool(app.config().get("act.test.json"))) { spec.accept = "json"; } } diff --git a/src/main/java/act/e2e/util/ScenarioComparator.java b/src/main/java/act/test/util/ScenarioComparator.java similarity index 96% rename from src/main/java/act/e2e/util/ScenarioComparator.java rename to src/main/java/act/test/util/ScenarioComparator.java index 2abe95882..793049fb8 100644 --- a/src/main/java/act/e2e/util/ScenarioComparator.java +++ b/src/main/java/act/test/util/ScenarioComparator.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -20,7 +20,7 @@ * #L% */ -import act.e2e.Scenario; +import act.test.Scenario; import org.osgl.$; import java.util.ArrayList; diff --git a/src/main/java/act/e2e/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java similarity index 92% rename from src/main/java/act/e2e/util/ScenarioManager.java rename to src/main/java/act/test/util/ScenarioManager.java index 7ea4a64df..3b20e30f2 100644 --- a/src/main/java/act/e2e/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -24,7 +24,7 @@ import act.app.App; import act.app.DaoLocator; import act.app.RuntimeDirs; -import act.e2e.Scenario; +import act.test.Scenario; import org.osgl.$; import org.osgl.util.C; import org.osgl.util.IO; @@ -48,16 +48,16 @@ public class ScenarioManager extends YamlLoader { private Map store = new LinkedHashMap<>(); public ScenarioManager() { - super("act.e2e"); - setFixtureFolder("/e2e/"); + super("act.test"); + setFixtureFolder("/test"); configure(); } public ScenarioManager(String modelPackage, String... modelPackages) { super(); - addModelPackages("act.e2e"); + addModelPackages("act.test"); addModelPackages(modelPackage, modelPackages); - setFixtureFolder("/e2e"); + setFixtureFolder("/test"); configure(); } @@ -95,7 +95,7 @@ private void searchScenarioFolder() { if (null != app) { searchWhenInAppContext(app); } else { - URL url = ScenarioManager.class.getResource("/e2e/scenarios"); + URL url = ScenarioManager.class.getResource("/test/scenarios"); if (null != url) { File file = new File(url.getFile()); if (file.exists()) { @@ -122,7 +122,7 @@ private void loadFromDir(File resourceDir) { if (!resourceDir.exists()) { return; } - File scenariosDir = new File(resourceDir, "e2e/scenarios"); + File scenariosDir = new File(resourceDir, "test/scenarios"); if (!scenariosDir.exists()) { return; } @@ -170,7 +170,7 @@ private void loadFromJar(File jarFile) { } private boolean isScenarioFile(String name) { - return name.startsWith("e2e/scenarios/") && name.endsWith(".yml"); + return name.startsWith("test/scenarios/") && name.endsWith(".yml"); } private void parseOne(String content) { diff --git a/src/main/java/act/e2e/util/TxScope.java b/src/main/java/act/test/util/TxScope.java similarity index 91% rename from src/main/java/act/e2e/util/TxScope.java rename to src/main/java/act/test/util/TxScope.java index e6bba7284..8a0d65f63 100644 --- a/src/main/java/act/e2e/util/TxScope.java +++ b/src/main/java/act/test/util/TxScope.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -27,7 +27,7 @@ public class TxScope { private static TxScopeProvider provider; static { try { - provider = Act.getInstance("act.act.e2e.util.SqlTxScope"); + provider = Act.getInstance("act.db.sql.test.SqlTxScope"); } catch (Throwable e) { provider = new TxScopeProvider.DumbProvider(); } diff --git a/src/main/java/act/e2e/util/TxScopeProvider.java b/src/main/java/act/test/util/TxScopeProvider.java similarity index 96% rename from src/main/java/act/e2e/util/TxScopeProvider.java rename to src/main/java/act/test/util/TxScopeProvider.java index 2321c7ec8..945c22277 100644 --- a/src/main/java/act/e2e/util/TxScopeProvider.java +++ b/src/main/java/act/test/util/TxScopeProvider.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/util/YamlLoader.java b/src/main/java/act/test/util/YamlLoader.java similarity index 98% rename from src/main/java/act/e2e/util/YamlLoader.java rename to src/main/java/act/test/util/YamlLoader.java index c0527fe9c..135379ff7 100644 --- a/src/main/java/act/e2e/util/YamlLoader.java +++ b/src/main/java/act/test/util/YamlLoader.java @@ -1,8 +1,8 @@ -package act.e2e.util; +package act.test.util; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -25,7 +25,7 @@ import act.app.DaoLocator; import act.conf.AppConfig; import act.db.Dao; -import act.e2e.E2E; +import act.test.Test; import act.util.LogSupport; import com.alibaba.fastjson.*; import org.osgl.$; @@ -50,7 +50,7 @@ public class YamlLoader extends LogSupport { private List modelPackages = new ArrayList<>(); - private String fixtureFolder = "/e2e/fixtures/"; + private String fixtureFolder = "/test/fixtures/"; private ClassLoader classLoader = appClassLoader(); @@ -260,7 +260,7 @@ private void resolveConstants(Map entityValue) { if (s.startsWith("${") && s.endsWith("}")) { s = s.substring(2); s = s.substring(0, s.length() - 1); - String constant = E2E.constant(s); + String constant = Test.constant(s); if (null != constant) { entry.setValue(constant); } @@ -397,11 +397,11 @@ private void loadConfig() { if (null == config) { return; } - String modelPackages = config.get("e2e.model-packages"); + String modelPackages = config.get("test.model-packages"); if (S.notBlank(modelPackages)) { addModelPackage(modelPackages); } - String fixtureFolder = config.get("e2e.fixture-folder"); + String fixtureFolder = config.get("test.fixture-folder"); setFixtureFolder(fixtureFolder); } diff --git a/src/main/java/act/e2e/verifier/After.java b/src/main/java/act/test/verifier/After.java similarity index 94% rename from src/main/java/act/e2e/verifier/After.java rename to src/main/java/act/test/verifier/After.java index 03fd8d767..d7971c5be 100644 --- a/src/main/java/act/e2e/verifier/After.java +++ b/src/main/java/act/test/verifier/After.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Before.java b/src/main/java/act/test/verifier/Before.java similarity index 94% rename from src/main/java/act/e2e/verifier/Before.java rename to src/main/java/act/test/verifier/Before.java index 580df296f..9179522dd 100644 --- a/src/main/java/act/e2e/verifier/Before.java +++ b/src/main/java/act/test/verifier/Before.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Compare.java b/src/main/java/act/test/verifier/Compare.java similarity index 98% rename from src/main/java/act/e2e/verifier/Compare.java rename to src/main/java/act/test/verifier/Compare.java index 1386787b3..ec4ae0267 100644 --- a/src/main/java/act/e2e/verifier/Compare.java +++ b/src/main/java/act/test/verifier/Compare.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Contains.java b/src/main/java/act/test/verifier/Contains.java similarity index 97% rename from src/main/java/act/e2e/verifier/Contains.java rename to src/main/java/act/test/verifier/Contains.java index 86f09ad84..7fadfa387 100644 --- a/src/main/java/act/e2e/verifier/Contains.java +++ b/src/main/java/act/test/verifier/Contains.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/DateTimeVerifier.java b/src/main/java/act/test/verifier/DateTimeVerifier.java similarity index 98% rename from src/main/java/act/e2e/verifier/DateTimeVerifier.java rename to src/main/java/act/test/verifier/DateTimeVerifier.java index 0d8d5a504..01c3844ee 100644 --- a/src/main/java/act/e2e/verifier/DateTimeVerifier.java +++ b/src/main/java/act/test/verifier/DateTimeVerifier.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Ends.java b/src/main/java/act/test/verifier/Ends.java similarity index 95% rename from src/main/java/act/e2e/verifier/Ends.java rename to src/main/java/act/test/verifier/Ends.java index 476c5757c..8b96d21e6 100644 --- a/src/main/java/act/e2e/verifier/Ends.java +++ b/src/main/java/act/test/verifier/Ends.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Eq.java b/src/main/java/act/test/verifier/Eq.java similarity index 95% rename from src/main/java/act/e2e/verifier/Eq.java rename to src/main/java/act/test/verifier/Eq.java index fc1de6ea8..c436ed76d 100644 --- a/src/main/java/act/e2e/verifier/Eq.java +++ b/src/main/java/act/test/verifier/Eq.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/EqIgnoreCase.java b/src/main/java/act/test/verifier/EqIgnoreCase.java similarity index 95% rename from src/main/java/act/e2e/verifier/EqIgnoreCase.java rename to src/main/java/act/test/verifier/EqIgnoreCase.java index 00984a727..b9dea0789 100644 --- a/src/main/java/act/e2e/verifier/EqIgnoreCase.java +++ b/src/main/java/act/test/verifier/EqIgnoreCase.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Exists.java b/src/main/java/act/test/verifier/Exists.java similarity index 96% rename from src/main/java/act/e2e/verifier/Exists.java rename to src/main/java/act/test/verifier/Exists.java index c4eb8977e..851145674 100644 --- a/src/main/java/act/e2e/verifier/Exists.java +++ b/src/main/java/act/test/verifier/Exists.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Gt.java b/src/main/java/act/test/verifier/Gt.java similarity index 95% rename from src/main/java/act/e2e/verifier/Gt.java rename to src/main/java/act/test/verifier/Gt.java index ab8f469f1..0014d54a5 100644 --- a/src/main/java/act/e2e/verifier/Gt.java +++ b/src/main/java/act/test/verifier/Gt.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Gte.java b/src/main/java/act/test/verifier/Gte.java similarity index 95% rename from src/main/java/act/e2e/verifier/Gte.java rename to src/main/java/act/test/verifier/Gte.java index 9a5c9f821..3d9ce332c 100644 --- a/src/main/java/act/e2e/verifier/Gte.java +++ b/src/main/java/act/test/verifier/Gte.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Lt.java b/src/main/java/act/test/verifier/Lt.java similarity index 95% rename from src/main/java/act/e2e/verifier/Lt.java rename to src/main/java/act/test/verifier/Lt.java index 82a41affe..24ef90a78 100644 --- a/src/main/java/act/e2e/verifier/Lt.java +++ b/src/main/java/act/test/verifier/Lt.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Lte.java b/src/main/java/act/test/verifier/Lte.java similarity index 95% rename from src/main/java/act/e2e/verifier/Lte.java rename to src/main/java/act/test/verifier/Lte.java index e81080d90..0ba6299c6 100644 --- a/src/main/java/act/e2e/verifier/Lte.java +++ b/src/main/java/act/test/verifier/Lte.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Neq.java b/src/main/java/act/test/verifier/Neq.java similarity index 95% rename from src/main/java/act/e2e/verifier/Neq.java rename to src/main/java/act/test/verifier/Neq.java index a7a08dff9..f31b827db 100644 --- a/src/main/java/act/e2e/verifier/Neq.java +++ b/src/main/java/act/test/verifier/Neq.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Starts.java b/src/main/java/act/test/verifier/Starts.java similarity index 95% rename from src/main/java/act/e2e/verifier/Starts.java rename to src/main/java/act/test/verifier/Starts.java index d32ba347a..50f38ce38 100644 --- a/src/main/java/act/e2e/verifier/Starts.java +++ b/src/main/java/act/test/verifier/Starts.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% diff --git a/src/main/java/act/e2e/verifier/Verifier.java b/src/main/java/act/test/verifier/Verifier.java similarity index 93% rename from src/main/java/act/e2e/verifier/Verifier.java rename to src/main/java/act/test/verifier/Verifier.java index c112c724f..238f4e25c 100644 --- a/src/main/java/act/e2e/verifier/Verifier.java +++ b/src/main/java/act/test/verifier/Verifier.java @@ -1,8 +1,8 @@ -package act.e2e.verifier; +package act.test.verifier; /*- * #%L - * ACT E2E Plugin + * ACT Framework * %% * Copyright (C) 2018 ActFramework * %% @@ -20,7 +20,7 @@ * #L% */ -import act.e2e.util.NamedLogic; +import act.test.util.NamedLogic; import org.osgl.util.converter.TypeConverterRegistry; public abstract class Verifier extends NamedLogic { diff --git a/src/main/java/act/util/AnnotatedClassFinder.java b/src/main/java/act/util/AnnotatedClassFinder.java index 1174cee2c..87f71979e 100644 --- a/src/main/java/act/util/AnnotatedClassFinder.java +++ b/src/main/java/act/util/AnnotatedClassFinder.java @@ -39,7 +39,7 @@ * * @return the annotation class used to find the target classes */ - Class value(); + Class value(); /** * Should I collect only public classes? diff --git a/src/main/java/act/util/AnnotatedMethodFinder.java b/src/main/java/act/util/AnnotatedMethodFinder.java new file mode 100644 index 000000000..a29769bcb --- /dev/null +++ b/src/main/java/act/util/AnnotatedMethodFinder.java @@ -0,0 +1,71 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.event.SysEventId; + +import java.lang.annotation.*; + +/** + * The annotation is used on a certain method to mark it + * as a callback method when a certain method has been found + * by annotation class specified + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface AnnotatedMethodFinder { + + /** + * Specify the "What" to find the class, i.e. the annotation + * class that has been used to tag the target class + * + * @return the annotation class used to find the target classes + */ + Class value(); + + /** + * Should I collect only public method? + * + * default value is `true` + * + * @return `true` if only public class shall be collected, `false` otherwise + */ + boolean publicOnly() default true; + + /** + * Should I collect abstract classes? + * + * default value is `false` + * + * @return `true` if abstract classes shall be excluded, `false` otherwise + */ + boolean noAbstract() default true; + + /** + * Specify when to execute the call back for a certain found class. + * + * By default the value of `callOn` is {@link SysEventId#DEPENDENCY_INJECTOR_PROVISIONED} + * + * @return the "When" to execute the callback logic + */ + SysEventId callOn() default SysEventId.DEPENDENCY_INJECTOR_PROVISIONED; + +} diff --git a/src/main/java/act/util/AsmType.java b/src/main/java/act/util/AsmType.java index efe6406d3..119c65014 100644 --- a/src/main/java/act/util/AsmType.java +++ b/src/main/java/act/util/AsmType.java @@ -50,6 +50,10 @@ public String desc() { return type.getDescriptor(); } + public static String classNameForDesc(String description) { + return Type.getType(description).getClassName(); + } + public static Class classForDesc(String desc) { Type type = Type.getType(desc); return classForType(type); @@ -60,4 +64,22 @@ public static Class classForType(Type type) { return $.classForName(className, AsmType.class.getClassLoader()); } + public static String classNameForInternalName(String internalName) { + return Type.getObjectType(internalName).getClassName(); + } + + public static Class classForInternalName(String internalName) { + return classForType(Type.getObjectType(internalName)); + } + + public static Class[] methodArgumentTypesForDesc(String methodDesc) { + Type[] types = Type.getArgumentTypes(methodDesc); + int len = types.length; + Class[] argumentTypes = new Class[len]; + for (int i = 0; i < types.length; ++i) { + argumentTypes[i] = classForType(types[i]); + } + return argumentTypes; + } + } diff --git a/src/main/java/act/util/ClassInfoRepository.java b/src/main/java/act/util/ClassInfoRepository.java index 2641eda07..e00f2b886 100644 --- a/src/main/java/act/util/ClassInfoRepository.java +++ b/src/main/java/act/util/ClassInfoRepository.java @@ -21,15 +21,16 @@ */ import act.Act; +import act.app.event.SysEventId; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import org.osgl.$; import org.osgl.util.C; +import org.osgl.util.E; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import javax.enterprise.context.ApplicationScoped; @@ -45,6 +46,8 @@ public ClassInfoRepository() { protected ConcurrentMap classes = new ConcurrentHashMap(); + protected ConcurrentMap, Set> methodAnnotationLookup = new ConcurrentHashMap<>(); + public boolean has(String className) { return classes.containsKey(className); } @@ -75,6 +78,33 @@ public ClassNode node(String name, String canonicalName) { return node; } + public Set methodsWithAnnotation(Class annoType) { + Set set = methodAnnotationLookup.get(annoType); + return null == set ? C.Set() : set; + } + + public void registerMethodAnnotationLookup(final String annotationDesc, final String classInternalName, final String methodName, final String methodDesc) { + Act.app().jobManager().on(SysEventId.CLASS_LOADED, new Runnable() { + @Override + public void run() { + Class annoType = AsmType.classForDesc(annotationDesc); + Class methodHost = AsmType.classForInternalName(classInternalName); + Class[] methodArgumentTypes = AsmType.methodArgumentTypesForDesc(methodDesc); + try { + Method method = methodHost.getDeclaredMethod(methodName, methodArgumentTypes); + Set set = methodAnnotationLookup.get(annoType); + if (null == set) { + set = new HashSet<>(); + } + set.add(method); + methodAnnotationLookup.put(annoType, set); + } catch (NoSuchMethodException e) { + throw E.unexpected(e); + } + } + }); + } + public ClassNode findNode(Class type) { return classes.get(canonicalName(type.getName())); } diff --git a/src/main/java/act/util/MethodAnnotationDetector.java b/src/main/java/act/util/MethodAnnotationDetector.java new file mode 100644 index 000000000..737cc6658 --- /dev/null +++ b/src/main/java/act/util/MethodAnnotationDetector.java @@ -0,0 +1,68 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.App; +import act.app.AppByteCodeScannerBase; +import act.asm.AnnotationVisitor; +import act.asm.MethodVisitor; + +public class MethodAnnotationDetector extends AppByteCodeScannerBase { + + @Override + protected boolean shouldScan(String className) { + return true; + } + + @Override + public ByteCodeVisitor byteCodeVisitor() { + final ClassInfoRepository classInfoRepository = App.instance().classLoader().classInfoRepository(); + return new ByteCodeVisitor() { + + private String classInternalName; + + @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { + classInternalName = name; + super.visit(version, access, name, signature, superName, interfaces); + } + + @Override + public MethodVisitor visitMethod(int access, final String name, final String desc, String signature, String[] exceptions) { + MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); + if (!AsmTypes.isPublic(access)) { + return mv; + } + return new MethodVisitor(ASM5, mv) { + @Override + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + classInfoRepository.registerMethodAnnotationLookup(desc, classInternalName, name, desc); + return super.visitAnnotation(desc, visible); + } + }; + } + }; + } + + @Override + public void scanFinished(String className) { + } +} diff --git a/src/main/resources/aaa.authenticate.list b/src/main/resources/aaa.authenticate.list index c2a586b6a..33c6ad641 100644 --- a/src/main/resources/aaa.authenticate.list +++ b/src/main/resources/aaa.authenticate.list @@ -1,4 +1,4 @@ --act.e2e. +-act.test. -act.i18n.LocaleResolver -act.i18n.TimeZoneResolver -act.i18n.EnumService diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 0826cb640..14af96e14 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -8,12 +8,12 @@ act.controller.builtin.CliOverHttp act.controller.captcha.CaptchaService act.db.DbBind act.db.util.Page -act.e2e.E2E -act.e2e.inbox.Inbox -act.e2e.ScenarioDebugHelper -act.e2e.ScenarioDebugHelper$LoadFixtures -act.e2e.ScenarioDebugHelper$ClearFixtures -act.e2e.func.SampleDataProviderAdaptor +act.test.Test +act.test.inbox.Inbox +act.test.ScenarioDebugHelper +act.test.ScenarioDebugHelper$LoadFixtures +act.test.ScenarioDebugHelper$ClearFixtures +act.test.func.SampleDataProviderAdaptor act.handler.builtin.controller.RequestHandlerProxy act.i18n.TimeZoneResolver act.i18n.LocaleResolver diff --git a/src/main/resources/rythm/~e2e.html b/src/main/resources/rythm/~test.html similarity index 87% rename from src/main/resources/rythm/~e2e.html rename to src/main/resources/rythm/~test.html index 04ba952cc..3e82472f4 100644 --- a/src/main/resources/rythm/~e2e.html +++ b/src/main/resources/rythm/~test.html @@ -1,6 +1,6 @@ -@import act.e2e.Scenario -@import act.e2e.Interaction +@import act.test.Scenario +@import act.test.Interaction @args List scenarios @@ -27,7 +27,12 @@ font-size: 28px; } h4 { - font-size: 21px; + font-size: 16px; + font-weight: 600; + margin-bottom: 5px; + margin-top: 30px; + border-bottom: 1px dotted #888; + padding-bottom: 8px; } h5 { font-size: 18px; @@ -42,6 +47,8 @@ .interactions { list-style: none; padding-left: 0; + margin-top: 10px; + padding-bottom: 10px; } .PASS { color: #00ee00; diff --git a/src/test/java/act/e2e/controller/CourseService.java b/src/test/java/act/test/controller/CourseService.java similarity index 94% rename from src/test/java/act/e2e/controller/CourseService.java rename to src/test/java/act/test/controller/CourseService.java index 7f3c257c6..3fb313d80 100644 --- a/src/test/java/act/e2e/controller/CourseService.java +++ b/src/test/java/act/test/controller/CourseService.java @@ -1,4 +1,4 @@ -package act.e2e.controller; +package act.test.controller; /*- * #%L @@ -21,7 +21,7 @@ */ import act.controller.annotation.UrlContext; -import act.e2e.model.Course; +import act.test.model.Course; import org.osgl.mvc.annotation.PostAction; import org.osgl.util.N; diff --git a/src/test/java/act/e2e/model/Course.java b/src/test/java/act/test/model/Course.java similarity index 97% rename from src/test/java/act/e2e/model/Course.java rename to src/test/java/act/test/model/Course.java index bd275553f..9cba434b6 100644 --- a/src/test/java/act/e2e/model/Course.java +++ b/src/test/java/act/test/model/Course.java @@ -1,4 +1,4 @@ -package act.e2e.model; +package act.test.model; /*- * #%L diff --git a/src/test/java/act/e2e/model/User.java b/src/test/java/act/test/model/User.java similarity index 97% rename from src/test/java/act/e2e/model/User.java rename to src/test/java/act/test/model/User.java index bb8ee0f28..1e26b7356 100644 --- a/src/test/java/act/e2e/model/User.java +++ b/src/test/java/act/test/model/User.java @@ -1,4 +1,4 @@ -package act.e2e.model; +package act.test.model; /*- * #%L diff --git a/src/test/java/act/e2e/util/AssertTest.java b/src/test/java/act/test/util/AssertTest.java similarity index 95% rename from src/test/java/act/e2e/util/AssertTest.java rename to src/test/java/act/test/util/AssertTest.java index 0bca4dc2d..e96513cf3 100644 --- a/src/test/java/act/e2e/util/AssertTest.java +++ b/src/test/java/act/test/util/AssertTest.java @@ -1,4 +1,4 @@ -package act.e2e.util; +package act.test.util; /*- * #%L @@ -20,7 +20,7 @@ * #L% */ -import act.e2e.verifier.Eq; +import act.test.verifier.Eq; import org.junit.Test; import org.osgl.$; import org.rythmengine.utils.S; diff --git a/src/test/java/act/e2e/util/CompareTypeTest.java b/src/test/java/act/test/util/CompareTypeTest.java similarity index 95% rename from src/test/java/act/e2e/util/CompareTypeTest.java rename to src/test/java/act/test/util/CompareTypeTest.java index f5edc1be4..593208f55 100644 --- a/src/test/java/act/e2e/util/CompareTypeTest.java +++ b/src/test/java/act/test/util/CompareTypeTest.java @@ -1,4 +1,4 @@ -package act.e2e.util; +package act.test.util; /*- * #%L @@ -20,7 +20,7 @@ * #L% */ -import static act.e2e.verifier.Compare.Type.*; +import static act.test.verifier.Compare.Type.*; import org.junit.Test; import osgl.ut.TestBase; diff --git a/src/test/java/act/e2e/util/ExistsTest.java b/src/test/java/act/test/util/ExistsTest.java similarity index 96% rename from src/test/java/act/e2e/util/ExistsTest.java rename to src/test/java/act/test/util/ExistsTest.java index 62a3b996f..2a180e97e 100644 --- a/src/test/java/act/e2e/util/ExistsTest.java +++ b/src/test/java/act/test/util/ExistsTest.java @@ -1,4 +1,4 @@ -package act.e2e.util; +package act.test.util; /*- * #%L @@ -20,7 +20,7 @@ * #L% */ -import act.e2e.verifier.Exists; +import act.test.verifier.Exists; import org.junit.Test; import osgl.ut.TestBase; diff --git a/src/test/java/act/e2e/util/FuncTest.java b/src/test/java/act/test/util/FuncTest.java similarity index 98% rename from src/test/java/act/e2e/util/FuncTest.java rename to src/test/java/act/test/util/FuncTest.java index b7e098538..e06516d2a 100644 --- a/src/test/java/act/e2e/util/FuncTest.java +++ b/src/test/java/act/test/util/FuncTest.java @@ -1,4 +1,4 @@ -package act.e2e.util; +package act.test.util; /*- * #%L @@ -20,7 +20,7 @@ * #L% */ -import act.e2e.func.Func; +import act.test.func.Func; import org.junit.Test; import org.osgl.util.C; import org.osgl.util.S; diff --git a/src/test/java/act/e2e/util/JSONTraverserTest.java b/src/test/java/act/test/util/JSONTraverserTest.java similarity index 96% rename from src/test/java/act/e2e/util/JSONTraverserTest.java rename to src/test/java/act/test/util/JSONTraverserTest.java index 020e47e33..b8ba517af 100644 --- a/src/test/java/act/e2e/util/JSONTraverserTest.java +++ b/src/test/java/act/test/util/JSONTraverserTest.java @@ -1,4 +1,4 @@ -package act.e2e.util; +package act.test.util; /*- * #%L @@ -20,7 +20,7 @@ * #L% */ -import static act.e2e.util.JSONTraverser.traverse; +import static act.test.util.JSONTraverser.traverse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; diff --git a/src/test/java/act/e2e/util/RequestTemplateManagerTest.java b/src/test/java/act/test/util/RequestTemplateManagerTest.java similarity index 91% rename from src/test/java/act/e2e/util/RequestTemplateManagerTest.java rename to src/test/java/act/test/util/RequestTemplateManagerTest.java index 7de3e57cb..cc2f1ac6e 100644 --- a/src/test/java/act/e2e/util/RequestTemplateManagerTest.java +++ b/src/test/java/act/test/util/RequestTemplateManagerTest.java @@ -1,4 +1,4 @@ -package act.e2e.util; +package act.test.util; /*- * #%L @@ -20,10 +20,10 @@ * #L% */ -import act.e2e.RequestSpec; +import act.test.RequestSpec; import org.junit.Test; -public class RequestTemplateManagerTest extends E2ETestBase { +public class RequestTemplateManagerTest extends TestTestBase { @Test public void test() { diff --git a/src/test/java/act/e2e/util/ScenarioManagerTest.java b/src/test/java/act/test/util/ScenarioManagerTest.java similarity index 88% rename from src/test/java/act/e2e/util/ScenarioManagerTest.java rename to src/test/java/act/test/util/ScenarioManagerTest.java index 7d2670011..29d37f15e 100644 --- a/src/test/java/act/e2e/util/ScenarioManagerTest.java +++ b/src/test/java/act/test/util/ScenarioManagerTest.java @@ -1,4 +1,4 @@ -package act.e2e.util; +package act.test.util; /*- * #%L @@ -20,19 +20,18 @@ * #L% */ -import act.e2e.*; -import act.e2e.macro.Macro; -import act.e2e.req_modifier.RequestModifier; -import act.e2e.verifier.*; +import act.test.*; +import act.test.macro.Macro; +import act.test.req_modifier.RequestModifier; +import act.test.verifier.*; import org.junit.BeforeClass; -import org.junit.Test; import org.osgl.http.H; import java.util.Map; -public class ScenarioManagerTest extends E2ETestBase { +public class ScenarioManagerTest extends TestTestBase { - private ScenarioManager loader = new ScenarioManager("act.e2e.model"); + private ScenarioManager loader = new ScenarioManager("act.test.model"); @BeforeClass public static void prepare() { @@ -40,12 +39,12 @@ public static void prepare() { new Eq().register(); new Exists().register(); new Gt().register(); - E2E.registerTypeConverters(); + Test.registerTypeConverters(); RequestModifier.registerModifiers(); Macro.registerActions(); } - @Test + @org.junit.Test public void test() { Map map = loader.load(); no(map.isEmpty()); diff --git a/src/test/java/act/e2e/util/E2ETestBase.java b/src/test/java/act/test/util/TestTestBase.java similarity index 84% rename from src/test/java/act/e2e/util/E2ETestBase.java rename to src/test/java/act/test/util/TestTestBase.java index d1b9d082d..46c37d4bf 100644 --- a/src/test/java/act/e2e/util/E2ETestBase.java +++ b/src/test/java/act/test/util/TestTestBase.java @@ -1,4 +1,4 @@ -package act.e2e.util; +package act.test.util; /*- * #%L @@ -25,12 +25,12 @@ import org.osgl.$; import osgl.ut.TestBase; -public class E2ETestBase extends TestBase { +public class TestTestBase extends TestBase { @Before public void clearActMockup() { $.setFieldValue("INST", App.class, null); - Thread.currentThread().setContextClassLoader(E2ETestBase.class.getClassLoader()); + Thread.currentThread().setContextClassLoader(TestTestBase.class.getClassLoader()); } } diff --git a/src/test/java/act/e2e/util/YamlLoaderTest.java b/src/test/java/act/test/util/YamlLoaderTest.java similarity index 93% rename from src/test/java/act/e2e/util/YamlLoaderTest.java rename to src/test/java/act/test/util/YamlLoaderTest.java index e9e96ea5d..70cb9603c 100644 --- a/src/test/java/act/e2e/util/YamlLoaderTest.java +++ b/src/test/java/act/test/util/YamlLoaderTest.java @@ -1,4 +1,4 @@ -package act.e2e.util; +package act.test.util; /*- * #%L @@ -23,14 +23,14 @@ import act.Act; import act.app.DaoLocator; import act.db.Dao; -import act.e2e.model.User; +import act.test.model.User; import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; import java.util.Map; -public class YamlLoaderTest extends E2ETestBase { +public class YamlLoaderTest extends TestTestBase { YamlLoader loader; DaoLocator daoLocator; @@ -38,7 +38,7 @@ public class YamlLoaderTest extends E2ETestBase { @Before public void prepareLoader() { Act.registerTypeConverters(); - loader = new YamlLoader("act.e2e.model"); + loader = new YamlLoader("act.test.model"); } @Before diff --git a/src/test/java/utils/SeparateClassloaderTestRunner.java b/src/test/java/utils/SeparateClassloaderTestRunner.java index a63196101..2556a609c 100644 --- a/src/test/java/utils/SeparateClassloaderTestRunner.java +++ b/src/test/java/utils/SeparateClassloaderTestRunner.java @@ -47,7 +47,7 @@ public TestClassLoader() { @Override public Class loadClass(String name) throws ClassNotFoundException { - if (name.startsWith("e2e.") || name.startsWith("act.e2e.")) { + if (name.startsWith("test.") || name.startsWith("act.test.")) { return super.findClass(name); } return super.loadClass(name); diff --git a/src/test/resources/e2e/fixtures/init-data.yml b/src/test/resources/test/fixtures/init-data.yml similarity index 93% rename from src/test/resources/e2e/fixtures/init-data.yml rename to src/test/resources/test/fixtures/init-data.yml index 02a32d4e0..61d76cad5 100644 --- a/src/test/resources/e2e/fixtures/init-data.yml +++ b/src/test/resources/test/fixtures/init-data.yml @@ -10,7 +10,7 @@ User(green): birthday: 1919-01-01 courses: - embed:math -act.e2e.model.User(black): +act.test.model.User(black): id: 2 name: Black Smith birthday: 1818-02-02 diff --git a/src/test/resources/e2e/requests.yml b/src/test/resources/test/requests.yml similarity index 100% rename from src/test/resources/e2e/requests.yml rename to src/test/resources/test/requests.yml diff --git a/src/test/resources/e2e/scenarios.yml b/src/test/resources/test/scenarios.yml similarity index 100% rename from src/test/resources/e2e/scenarios.yml rename to src/test/resources/test/scenarios.yml diff --git a/src/test/resources/e2e/scenarios/a.yml b/src/test/resources/test/scenarios/a.yml similarity index 100% rename from src/test/resources/e2e/scenarios/a.yml rename to src/test/resources/test/scenarios/a.yml diff --git a/src/test/resources/e2e/scenarios/b.yml b/src/test/resources/test/scenarios/b.yml similarity index 100% rename from src/test/resources/e2e/scenarios/b.yml rename to src/test/resources/test/scenarios/b.yml diff --git a/src/test/resources/e2e/scenarios/c.yml b/src/test/resources/test/scenarios/c.yml similarity index 100% rename from src/test/resources/e2e/scenarios/c.yml rename to src/test/resources/test/scenarios/c.yml diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh809.java b/testapps/GHIssues/src/main/java/ghissues/Gh809.java new file mode 100644 index 000000000..70ceb7a02 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh809.java @@ -0,0 +1,19 @@ +package ghissues; + +import static act.controller.Controller.Util.template; + +import act.Act; +import act.controller.annotation.UrlContext; +import act.util.LogSupport; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("809") +public class Gh809 extends LogSupport { + + @GetAction + public void index() { + System.out.println(!Act.isDev()); + template(); + } + +} diff --git a/testapps/GHIssues/src/main/resources/logback.xml b/testapps/GHIssues/src/main/resources/logback.xml index 6b65d6b02..83909e662 100644 --- a/testapps/GHIssues/src/main/resources/logback.xml +++ b/testapps/GHIssues/src/main/resources/logback.xml @@ -94,7 +94,7 @@ - + diff --git a/testapps/GHIssues/src/main/resources/rythm/ghissues/Gh809/index.html b/testapps/GHIssues/src/main/resources/rythm/ghissues/Gh809/index.html new file mode 100644 index 000000000..a5ffdafda --- /dev/null +++ b/testapps/GHIssues/src/main/resources/rythm/ghissues/Gh809/index.html @@ -0,0 +1,6 @@ + + + +

                                                                                                                                                                    GH809

                                                                                                                                                                    + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/784.yml b/testapps/GHIssues/src/main/resources/test/scenarios/784.yml similarity index 63% rename from testapps/GHIssues/src/main/resources/e2e/scenarios/784.yml rename to testapps/GHIssues/src/main/resources/test/scenarios/784.yml index 5485f24e4..aa932905f 100644 --- a/testapps/GHIssues/src/main/resources/e2e/scenarios/784.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/784.yml @@ -1,4 +1,5 @@ Scenario(GH784): + description: "[784] `@Data` enhancement error when Model class has no fields" interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/786.yml b/testapps/GHIssues/src/main/resources/test/scenarios/786.yml similarity index 77% rename from testapps/GHIssues/src/main/resources/e2e/scenarios/786.yml rename to testapps/GHIssues/src/main/resources/test/scenarios/786.yml index ca2058c93..ae2d1a2d9 100644 --- a/testapps/GHIssues/src/main/resources/e2e/scenarios/786.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/786.yml @@ -1,4 +1,5 @@ Scenario(GH786): + description: "[786] `@Data` enhancement shall call super by default for Map/AdaptiveMap types" interactions: - description: test case A - app shall specify call super request: diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/787-left-as-blank.yml b/testapps/GHIssues/src/main/resources/test/scenarios/787-left-as-blank.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/e2e/scenarios/787-left-as-blank.yml rename to testapps/GHIssues/src/main/resources/test/scenarios/787-left-as-blank.yml diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/790.yml b/testapps/GHIssues/src/main/resources/test/scenarios/790.yml similarity index 83% rename from testapps/GHIssues/src/main/resources/e2e/scenarios/790.yml rename to testapps/GHIssues/src/main/resources/test/scenarios/790.yml index ab8e01a94..61b34eb43 100644 --- a/testapps/GHIssues/src/main/resources/e2e/scenarios/790.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/790.yml @@ -1,4 +1,5 @@ Scenario(GH790): + description: "[790] Resource loader - allow loading from excel file" interactions: - description: retreive all students request: diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/796.yml b/testapps/GHIssues/src/main/resources/test/scenarios/796.yml similarity index 65% rename from testapps/GHIssues/src/main/resources/e2e/scenarios/796.yml rename to testapps/GHIssues/src/main/resources/test/scenarios/796.yml index f74ba4554..5934cb2a2 100644 --- a/testapps/GHIssues/src/main/resources/e2e/scenarios/796.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/796.yml @@ -1,4 +1,5 @@ Scenario(GH796): + description: "[796] `@PropertySpec` annotation now cause `NullPointerException` on JSON output" interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/797.yml b/testapps/GHIssues/src/main/resources/test/scenarios/797.yml similarity index 62% rename from testapps/GHIssues/src/main/resources/e2e/scenarios/797.yml rename to testapps/GHIssues/src/main/resources/test/scenarios/797.yml index bac6c1773..6b41cc623 100644 --- a/testapps/GHIssues/src/main/resources/e2e/scenarios/797.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/797.yml @@ -1,4 +1,5 @@ Scenario(GH797): + description: "[797] JSON output: default format for `java.util.Date` missing time part" interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/e2e/scenarios/798.yml b/testapps/GHIssues/src/main/resources/test/scenarios/798.yml similarity index 65% rename from testapps/GHIssues/src/main/resources/e2e/scenarios/798.yml rename to testapps/GHIssues/src/main/resources/test/scenarios/798.yml index ed65637a7..d961cf0e2 100644 --- a/testapps/GHIssues/src/main/resources/e2e/scenarios/798.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/798.yml @@ -1,4 +1,5 @@ Scenario(GH798): + description: "[798] `@JSONField(format = 'yyyy-MM')` setting not work" interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/809.yml b/testapps/GHIssues/src/main/resources/test/scenarios/809.yml new file mode 100644 index 000000000..27bb9d606 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/809.yml @@ -0,0 +1,9 @@ +Scenario(GH809): + description: "[809] Bytecode enhanement error on App start" + interactions: + - description: Test + request: + get: 809 + response: + html: + h1: GH809 diff --git a/testapps/ResourceLoaderTest/src/main/resources/logback.xml b/testapps/ResourceLoaderTest/src/main/resources/logback.xml index 6b65d6b02..83909e662 100644 --- a/testapps/ResourceLoaderTest/src/main/resources/logback.xml +++ b/testapps/ResourceLoaderTest/src/main/resources/logback.xml @@ -94,7 +94,7 @@
                                                                                                                                                                    - + From 000936149ddd0e4e815495cf12f3a37e87183fbd Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 25 Aug 2018 08:39:45 +1000 Subject: [PATCH 078/730] improve test report template --- .../java/act/test/ScenarioDebugHelper.java | 2 +- src/main/resources/rythm/~test.html | 20 ++++++------------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/act/test/ScenarioDebugHelper.java b/src/main/java/act/test/ScenarioDebugHelper.java index b40ae9376..42ff2f4b3 100644 --- a/src/main/java/act/test/ScenarioDebugHelper.java +++ b/src/main/java/act/test/ScenarioDebugHelper.java @@ -98,7 +98,7 @@ public void prepareAuthentication(ActionContext context) { @GetAction({"e2e", "test"}) public void run(App app) { List scenarios = test.run(app, false); - renderTemplate("/~test.html", scenarios); + renderTemplate("/~test.html", scenarios, app); } } diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html index 3e82472f4..be713e025 100644 --- a/src/main/resources/rythm/~test.html +++ b/src/main/resources/rythm/~test.html @@ -16,16 +16,6 @@ h1,h2,h3,h4,h5 { font-family: "Franklin Gothic Medium", "Franklin Gothic", "ITC Franklin Gothic", Arial, sans-serif; } - h1 { - font-weight: bold; - font-size: 42px; - } - h2 { - font-size: 36px; - } - h3 { - font-size: 28px; - } h4 { font-size: 16px; font-weight: 600; @@ -34,9 +24,6 @@ border-bottom: 1px dotted #888; padding-bottom: 8px; } - h5 { - font-size: 18px; - } #act-version { position:fixed; bottom:0; @@ -62,11 +49,16 @@ .error-message { margin-left: 2em; } + .version { + font-weight: 600; + } @render(head) -

                                                                                                                                                                    End To End Test Result

                                                                                                                                                                    +@args act.app.App app +

                                                                                                                                                                    Test Report

                                                                                                                                                                    +
                                                                                                                                                                    @(app.name().capFirst())-@(app.version().getVersion())
                                                                                                                                                                    @for(Scenario scenario: scenarios) {

                                                                                                                                                                    @if(scenario.description) { From ea49fd9d088d562f051f201f72031ce300ee7233 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 25 Aug 2018 20:45:25 +1000 Subject: [PATCH 079/730] fix #811 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d075843e3..f9838a5af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Report error when app's package starts with `act` #811 * Rename "e2e" to "test" #810 * Bytecode enhanement error on App start #809 * e2e - support customised fixture loading logic #808 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 3ae692e3d..bddbc8fa2 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -93,6 +93,7 @@ import act.ws.WebSocketConnectionManager; import org.osgl.$; import org.osgl.cache.CacheService; +import org.osgl.exception.ConfigurationException; import org.osgl.http.HttpConfig; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; @@ -1454,6 +1455,9 @@ private void initScanList() { String suffix = S.cut(scanPackage).afterLast("*"); scanSuffixList.add(suffix); } else { + if (scanPackage.startsWith("act.") || "act".equals(scanPackage)) { + throw new ConfigurationException("Scan package cannot be 'act' or starts with 'act.'"); + } scanList.add(scanPackage); } } From 88ec6429c58b53519f23b8d738cb4bc24cc504c6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 27 Aug 2018 06:23:02 +1000 Subject: [PATCH 080/730] #811 - last fix not working --- src/main/java/act/app/App.java | 40 ++++++--------------------- src/main/java/act/conf/AppConfig.java | 6 ++++ 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index bddbc8fa2..e7cb7a03d 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -36,10 +36,7 @@ import act.boot.app.BlockIssueSignal; import act.cli.CliDispatcher; import act.cli.bytecode.CommanderByteCodeScanner; -import act.conf.AppConfLoader; -import act.conf.AppConfig; -import act.conf.AppConfigKey; -import act.conf.ConfigurationByteCodeScanner; +import act.conf.*; import act.controller.bytecode.ControllerByteCodeScanner; import act.controller.captcha.CaptchaManager; import act.crypto.AppCrypto; @@ -56,16 +53,9 @@ import act.handler.builtin.controller.FastRequestHandler; import act.httpclient.HttpClientService; import act.i18n.I18n; -import act.inject.ActProviders; -import act.inject.DependencyInjectionBinder; -import act.inject.DependencyInjector; -import act.inject.genie.GenieFactoryFinder; -import act.inject.genie.GenieInjector; -import act.inject.genie.GenieModuleScanner; -import act.inject.param.JsonDtoClassManager; -import act.inject.param.ParamValueLoaderManager; -import act.inject.param.ParamValueLoaderService; -import act.inject.param.ProvidedValueLoader; +import act.inject.*; +import act.inject.genie.*; +import act.inject.param.*; import act.job.JobManager; import act.job.bytecode.JobByteCodeScanner; import act.mail.MailerConfigManager; @@ -74,26 +64,17 @@ import act.meta.ClassMetaInfoManager; import act.metric.*; import act.plugin.PrincipalProvider; -import act.route.RouteSource; -import act.route.RouteTableRouterBuilder; -import act.route.Router; -import act.route.UrlPath; +import act.route.*; import act.session.CookieSessionMapper; import act.session.SessionManager; import act.util.*; import act.validation.Password; import act.view.ActErrorResult; import act.view.ImplicitVariableProvider; -import act.view.rythm.JodaDateTimeFormatter; -import act.view.rythm.JodaTransformers; -import act.view.rythm.RythmTransformerScanner; -import act.view.rythm.RythmView; -import act.ws.SecureTicketCodec; -import act.ws.SecureTicketHandler; -import act.ws.WebSocketConnectionManager; +import act.view.rythm.*; +import act.ws.*; import org.osgl.$; import org.osgl.cache.CacheService; -import org.osgl.exception.ConfigurationException; import org.osgl.http.HttpConfig; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; @@ -103,9 +84,7 @@ import org.rythmengine.utils.I18N; import osgl.version.Version; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.lang.annotation.Annotation; import java.net.URL; import java.util.*; @@ -1455,9 +1434,6 @@ private void initScanList() { String suffix = S.cut(scanPackage).afterLast("*"); scanSuffixList.add(suffix); } else { - if (scanPackage.startsWith("act.") || "act".equals(scanPackage)) { - throw new ConfigurationException("Scan package cannot be 'act' or starts with 'act.'"); - } scanList.add(scanPackage); } } diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 9ea1155b8..e60613524 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -2308,6 +2308,12 @@ public boolean test(String s) { } else { final String[] sp = scanPackage.trim().split(Constants.LIST_SEPARATOR); final int len = sp.length; + for (int i = 0; i < len; ++i) { + String pkg = sp[i]; + if (pkg.startsWith("act.") || "act".equals(pkg)) { + throw new ConfigurationException("Scan package cannot be 'act' or starts with 'act.'"); + } + } if (1 == len) { APP_CLASS_TESTER = S.F.startsWith(sp[0]).or(SYSTEM_SCAN_LIST); } else { From 3170850e04ba7efe00e9e6f6f021f51b07f12c24 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 29 Aug 2018 08:46:50 +1000 Subject: [PATCH 081/730] fix #812 and #813, testing project for resource loading updates --- CHANGELOG.md | 2 + pom.xml | 12 +++--- src/main/java/act/controller/Controller.java | 2 - src/main/java/act/job/JobTrigger.java | 5 ++- .../main/java/resourceloader/AppEntry.java | 2 + .../main/java/resourceloader/JsonLoader.java | 35 +++++++++++++++++ .../main/java/resourceloader/ListLoader.java | 22 +++++++++++ .../main/java/resourceloader/MapLoader.java | 38 +++++++++++++++++++ .../java/resourceloader/PropertiesLoader.java | 26 +++++++++++++ .../main/java/resourceloader/YamlLoader.java | 35 +++++++++++++++++ .../src/main/resources/characters.json | 14 +++++++ .../src/main/resources/characters.yml | 6 +++ .../src/main/resources/foo.properties | 2 + .../src/main/resources/int.list | 5 +++ .../src/main/resources/int_values.properties | 2 + .../src/main/resources/one_line.list | 1 + .../src/main/resources/short_values.txt | 2 + .../main/resources/test/scenarios/json.yml | 32 ++++++++++++++++ .../main/resources/test/scenarios/list.yml | 10 +++++ .../src/main/resources/test/scenarios/map.yml | 23 +++++++++++ .../main/resources/test/scenarios/yaml.yml | 32 ++++++++++++++++ 21 files changed, 300 insertions(+), 8 deletions(-) create mode 100644 testapps/ResourceLoaderTest/src/main/java/resourceloader/JsonLoader.java create mode 100644 testapps/ResourceLoaderTest/src/main/java/resourceloader/ListLoader.java create mode 100644 testapps/ResourceLoaderTest/src/main/java/resourceloader/MapLoader.java create mode 100644 testapps/ResourceLoaderTest/src/main/java/resourceloader/PropertiesLoader.java create mode 100644 testapps/ResourceLoaderTest/src/main/java/resourceloader/YamlLoader.java create mode 100644 testapps/ResourceLoaderTest/src/main/resources/characters.json create mode 100644 testapps/ResourceLoaderTest/src/main/resources/characters.yml create mode 100644 testapps/ResourceLoaderTest/src/main/resources/foo.properties create mode 100644 testapps/ResourceLoaderTest/src/main/resources/int.list create mode 100644 testapps/ResourceLoaderTest/src/main/resources/int_values.properties create mode 100644 testapps/ResourceLoaderTest/src/main/resources/one_line.list create mode 100644 testapps/ResourceLoaderTest/src/main/resources/short_values.txt create mode 100644 testapps/ResourceLoaderTest/src/main/resources/test/scenarios/json.yml create mode 100644 testapps/ResourceLoaderTest/src/main/resources/test/scenarios/list.yml create mode 100644 testapps/ResourceLoaderTest/src/main/resources/test/scenarios/map.yml create mode 100644 testapps/ResourceLoaderTest/src/main/resources/test/scenarios/yaml.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index f9838a5af..52b3dcc61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Cannot render Excel when return value is `Map` type #813 +* `java.lang.IllegalStateException`: job already registered: __act_sys__start-delay-1 #812 * Report error when app's package starts with `act` #811 * Rename "e2e" to "test" #810 * Bytecode enhanement error on App start #809 diff --git a/pom.xml b/pom.xml index cbeaa029b..ca469fb09 100644 --- a/pom.xml +++ b/pom.xml @@ -95,15 +95,17 @@ **/*.version **/*.properties - **/*.xml - **/*.csv - **/*.list - **/*.txt **/*.css + **/*.csv + **/*.html **/*.js **/*.json - **/*.html + **/*.list **/*.tag + **/*.txt + **/*.xml + **/*.yml + **/*.yaml rythm/** *.flf diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 7d0307074..a48dd50fb 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1778,8 +1778,6 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon return inferResult((File) v, context); } else if (v instanceof ISObject) { return inferResult((ISObject) v, context); - } else if (v instanceof Map) { - return RenderJSON.of(status, v); } else { if (requireJSON || H.Format.UNKNOWN == context.req().accept()) { boolean isIterable = v instanceof Iterable; diff --git a/src/main/java/act/job/JobTrigger.java b/src/main/java/act/job/JobTrigger.java index dc5fcd71b..528933e09 100644 --- a/src/main/java/act/job/JobTrigger.java +++ b/src/main/java/act/job/JobTrigger.java @@ -43,6 +43,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; /** * A `JobTrigger` triggers a {@link Job} to be executed @@ -465,6 +466,8 @@ void associate(Job theJob, Job toJob) { private static class _DelayAfter extends _AssociatedTo { + private static final AtomicInteger seq = new AtomicInteger(); + private int delayInSeconds; _DelayAfter(String targetId, int delayInSeconds) { @@ -479,7 +482,7 @@ public String toString() { @Override void associate(final Job theJob, final Job toJob) { - toJob.addPrecedenceJob(new Job(toJob.id() + "-delay-" + delayInSeconds, toJob.manager()) { + toJob.addPrecedenceJob(new Job(toJob.id() + "-delay-" + delayInSeconds + "-" + seq.getAndIncrement(), toJob.manager()) { @Override public void run() { toJob.manager().delay(theJob, delayInSeconds, TimeUnit.SECONDS); diff --git a/testapps/ResourceLoaderTest/src/main/java/resourceloader/AppEntry.java b/testapps/ResourceLoaderTest/src/main/java/resourceloader/AppEntry.java index 0598796cc..1a009706c 100644 --- a/testapps/ResourceLoaderTest/src/main/java/resourceloader/AppEntry.java +++ b/testapps/ResourceLoaderTest/src/main/java/resourceloader/AppEntry.java @@ -5,6 +5,8 @@ @SuppressWarnings("unused") public class AppEntry { + + public static void main(String[] args) throws Exception { Act.start(); } diff --git a/testapps/ResourceLoaderTest/src/main/java/resourceloader/JsonLoader.java b/testapps/ResourceLoaderTest/src/main/java/resourceloader/JsonLoader.java new file mode 100644 index 000000000..fca5d7da6 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/java/resourceloader/JsonLoader.java @@ -0,0 +1,35 @@ +package resourceloader; + +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.inject.util.LoadResource; +import act.util.SimpleBean; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; +import java.util.Map; + +@UrlContext("json") +public class JsonLoader { + @Data + public static class Character implements SimpleBean { + public String username; + public int level; + } + + @LoadResource("characters.json") + private List pojoList; + + @LoadResource("characters.json") + private List> mapList; + + @GetAction("pojo") + public List getPojoList() { + return pojoList; + } + + @GetAction("map") + public List> getMapList() { + return mapList; + } +} diff --git a/testapps/ResourceLoaderTest/src/main/java/resourceloader/ListLoader.java b/testapps/ResourceLoaderTest/src/main/java/resourceloader/ListLoader.java new file mode 100644 index 000000000..d3ecb87d0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/java/resourceloader/ListLoader.java @@ -0,0 +1,22 @@ +package resourceloader; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; +import javax.inject.Singleton; + +@UrlContext("list") +@Singleton +public class ListLoader { + + @LoadResource("int.list") + private List intList; + + @GetAction("int") + public List getIntList() { + return intList; + } + +} diff --git a/testapps/ResourceLoaderTest/src/main/java/resourceloader/MapLoader.java b/testapps/ResourceLoaderTest/src/main/java/resourceloader/MapLoader.java new file mode 100644 index 000000000..b4c02a71e --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/java/resourceloader/MapLoader.java @@ -0,0 +1,38 @@ +package resourceloader; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Map; +import javax.inject.Singleton; + +@UrlContext("map") +@Singleton +public class MapLoader { + + @LoadResource("foo.properties") + private Map generalMap; + + @LoadResource("int_values.properties") + private Map integerMap; + + @LoadResource("short_values.txt") + private Map shortMap; + + @GetAction("general") + public Map getGeneralMap() { + return generalMap; + } + + @GetAction("integer") + public Map getIntegerMap() { + return integerMap; + } + + @GetAction("short") + public Map getShortMap() { + return shortMap; + } + +} diff --git a/testapps/ResourceLoaderTest/src/main/java/resourceloader/PropertiesLoader.java b/testapps/ResourceLoaderTest/src/main/java/resourceloader/PropertiesLoader.java new file mode 100644 index 000000000..11ed051cb --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/java/resourceloader/PropertiesLoader.java @@ -0,0 +1,26 @@ +package resourceloader; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import act.util.JsonView; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Map; +import java.util.Properties; + +@UrlContext("properties") +@JsonView +public class PropertiesLoader { + + @LoadResource("foo.properties") + private Properties foo; + + @LoadResource("foo.properties") + private Map fooMap; + + @GetAction("foo") + public Properties getFoo() { + return foo; + } + +} diff --git a/testapps/ResourceLoaderTest/src/main/java/resourceloader/YamlLoader.java b/testapps/ResourceLoaderTest/src/main/java/resourceloader/YamlLoader.java new file mode 100644 index 000000000..735a738ff --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/java/resourceloader/YamlLoader.java @@ -0,0 +1,35 @@ +package resourceloader; + +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.inject.util.LoadResource; +import act.util.SimpleBean; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; +import java.util.Map; + +@UrlContext("yaml") +public class YamlLoader { + @Data + public static class Character implements SimpleBean { + public String username; + public int level; + } + + @LoadResource("characters.yml") + private List pojoList; + + @LoadResource("characters.yml") + private List> mapList; + + @GetAction("pojo") + public List getPojoList() { + return pojoList; + } + + @GetAction("map") + public List> getMapList() { + return mapList; + } +} diff --git a/testapps/ResourceLoaderTest/src/main/resources/characters.json b/testapps/ResourceLoaderTest/src/main/resources/characters.json new file mode 100644 index 000000000..92ace34d0 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/characters.json @@ -0,0 +1,14 @@ +[ + { + "username": "jamesbond", + "level": 32 + }, + { + "username": "ethanhunt", + "level": 30 + }, + { + "username": "jasonbourne", + "level": 29 + } +] diff --git a/testapps/ResourceLoaderTest/src/main/resources/characters.yml b/testapps/ResourceLoaderTest/src/main/resources/characters.yml new file mode 100644 index 000000000..8bfddbad4 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/characters.yml @@ -0,0 +1,6 @@ +- username: jamesbond + level: 32 +- username: ethanhunt + level: 30 +- username: jasonbourne + level: 29 diff --git a/testapps/ResourceLoaderTest/src/main/resources/foo.properties b/testapps/ResourceLoaderTest/src/main/resources/foo.properties new file mode 100644 index 000000000..086677c04 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/foo.properties @@ -0,0 +1,2 @@ +foo=bar +id=3 \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/int.list b/testapps/ResourceLoaderTest/src/main/resources/int.list new file mode 100644 index 000000000..85954eabc --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/int.list @@ -0,0 +1,5 @@ +1 +2 +3 +4 +5 \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/int_values.properties b/testapps/ResourceLoaderTest/src/main/resources/int_values.properties new file mode 100644 index 000000000..88af89c13 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/int_values.properties @@ -0,0 +1,2 @@ +one=1 +two=2 \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/one_line.list b/testapps/ResourceLoaderTest/src/main/resources/one_line.list new file mode 100644 index 000000000..6b95540da --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/one_line.list @@ -0,0 +1 @@ +1,2,3,4,5 \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/short_values.txt b/testapps/ResourceLoaderTest/src/main/resources/short_values.txt new file mode 100644 index 000000000..88af89c13 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/short_values.txt @@ -0,0 +1,2 @@ +one=1 +two=2 \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/json.yml b/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/json.yml new file mode 100644 index 000000000..12acd577b --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/json.yml @@ -0,0 +1,32 @@ +Scenario(JSON): + interactions: + - description: test load JSON into POJO + request: + get: /json/pojo + response: + json: + size: 3 + 0: + username: jamesbond + level: 32 + 1: + username: ethanhunt + level: 30 + 2: + username: jasonbourne + level: 29 + - description: test load JSON into Map + request: + get: /json/map + response: + json: + size: 3 + 0: + username: jamesbond + level: 32 + 1: + username: ethanhunt + level: 30 + 2: + username: jasonbourne + level: 29 \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/list.yml b/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/list.yml new file mode 100644 index 000000000..054215a54 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/list.yml @@ -0,0 +1,10 @@ +Scenario(List): + interactions: + - description: test load into int list + request: + get: /list/int + response: + json: + size: 5 + 0: 1 + 4: 5 diff --git a/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/map.yml b/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/map.yml new file mode 100644 index 000000000..6b71247be --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/map.yml @@ -0,0 +1,23 @@ +Scenario(Map): + interactions: + - description: test load into general Map + request: + get: /map/general + response: + json: + foo: bar + id: 3 + - description: test load into integer value Map + request: + get: /map/integer + response: + json: + one: 1 + two: 2 + - description: test load into short value Map + request: + get: /map/short + response: + json: + one: 1 + two: 2 diff --git a/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/yaml.yml b/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/yaml.yml new file mode 100644 index 000000000..9fa92699c --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/yaml.yml @@ -0,0 +1,32 @@ +Scenario(YAML): + interactions: + - description: test load JSON into POJO + request: + get: /yaml/pojo + response: + json: + size: 3 + 0: + username: jamesbond + level: 32 + 1: + username: ethanhunt + level: 30 + 2: + username: jasonbourne + level: 29 + - description: test load JSON into Map + request: + get: /yaml/map + response: + json: + size: 3 + 0: + username: jamesbond + level: 32 + 1: + username: ethanhunt + level: 30 + 2: + username: jasonbourne + level: 29 \ No newline at end of file From 119d2d01f1e32f0e8cec748878827e24e73bf5ae Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 29 Aug 2018 19:25:14 +1000 Subject: [PATCH 082/730] fix #814 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/ApiManager.java | 58 ++++++-- src/main/java/act/apidoc/Endpoint.java | 18 +++ src/main/java/act/apidoc/Module.java | 37 +++++ .../resources/asset/~act/apibook/apibook.tag | 4 +- .../asset/~act/apibook/endpoint_list.tag | 48 +++--- .../resources/asset/~act/apibook/index.html | 1 + .../asset/~act/apibook/module_list.tag | 139 ++++++++++++++++++ src/main/resources/asset/~act/apibook/toc.tag | 33 +++-- 9 files changed, 295 insertions(+), 44 deletions(-) create mode 100644 src/main/java/act/apidoc/Module.java create mode 100644 src/main/resources/asset/~act/apibook/module_list.tag diff --git a/CHANGELOG.md b/CHANGELOG.md index 52b3dcc61..19adf51c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* API doc - support module #814 * Cannot render Excel when return value is `Map` type #813 * `java.lang.IllegalStateException`: job already registered: __act_sys__start-delay-1 #812 * Report error when app's package starts with `act` #811 diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index 34e378255..995d4924c 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -24,9 +24,7 @@ import act.Act; import act.apidoc.Endpoint.ParamInfo; -import act.apidoc.javadoc.Javadoc; -import act.apidoc.javadoc.JavadocBlockTag; -import act.apidoc.javadoc.JavadocParser; +import act.apidoc.javadoc.*; import act.app.*; import act.app.event.SysEventId; import act.app.util.NamedPort; @@ -39,9 +37,7 @@ import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.Node; -import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; -import com.github.javaparser.ast.body.MethodDeclaration; -import com.github.javaparser.ast.body.TypeDeclaration; +import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.comments.Comment; import com.github.javaparser.ast.comments.JavadocComment; import com.github.javaparser.ast.expr.AnnotationExpr; @@ -49,9 +45,7 @@ import org.osgl.http.H; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; -import org.osgl.util.C; -import org.osgl.util.IO; -import org.osgl.util.S; +import org.osgl.util.*; import java.util.*; @@ -67,6 +61,8 @@ public class ApiManager extends AppServiceBase { */ SortedSet endpoints = new TreeSet<>(); + SortedMap> moduleLookup = new TreeMap<>(); + public ApiManager(final App app) { super(app); @@ -79,7 +75,8 @@ public void run() { load(app); } }); - app.router().addMapping(H.Method.GET, "/~/apibook/endpoint", new GetEndpointsHandler(this)); + app.router().addMapping(H.Method.GET, "/~/apibook/endpoints", new GetEndpointsHandler(this)); + app.router().addMapping(H.Method.GET, "/~/apibook/modules", new GetModulesHandler(this)); ResourceGetter apidocHandler = new ResourceGetter("asset/~act/apibook/index.html"); app.router().addMapping(H.Method.GET, "/~/apibook", apidocHandler); app.router().addMapping(H.Method.GET, "/~/apidoc", apidocHandler); @@ -88,6 +85,7 @@ public void run() { @Override protected void releaseResources() { endpoints.clear(); + moduleLookup.clear(); } public void load(App app) { @@ -103,9 +101,22 @@ public void load(App app) { if (Act.isDev()) { exploreDescriptions(controllerClasses); } + buildModuleLookup(); LOGGER.info("API book compiled"); } + private void buildModuleLookup() { + for (Endpoint endpoint : endpoints) { + String module = endpoint.getModule(); + List list = moduleLookup.get(module); + if (null == list) { + list = new ArrayList<>(); + moduleLookup.put(module, list); + } + list.add(endpoint); + } + } + private void load(Router router, NamedPort port, AppConfig config, final Set controllerClasses) { final int portNumber = null == port ? config.httpExternalPort() : port.port(); final boolean isDev = Act.isDev(); @@ -223,7 +234,9 @@ public GetEndpointsHandler(ApiManager api) { @Override public void handle(ActionContext context) { - renderJson(api.endpoints).apply(context.req(), context.prepareRespForResultEvaluation()); + String module = context.paramVal("module"); + Collection endpoints = S.notBlank(module) ? api.moduleLookup.get(module) : api.endpoints; + renderJson(endpoints).apply(context.req(), context.prepareRespForResultEvaluation()); } @Override @@ -237,5 +250,28 @@ public String toString() { } } + private class GetModulesHandler extends RequestHandlerBase { + + private ApiManager api; + + public GetModulesHandler(ApiManager api) { + this.api = api; + } + + @Override + public void handle(ActionContext context) { + renderJson(api.moduleLookup.keySet()).apply(context.req(), context.prepareRespForResultEvaluation()); + } + + @Override + public void prepareAuthentication(ActionContext context) { + + } + @Override + public String toString() { + return "API doc module index"; + } + } + } diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 455585a85..6434c4b26 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -183,6 +183,8 @@ public enum Scheme { */ private String description; + private String module; + private Class returnType; private String returnSample; @@ -263,6 +265,14 @@ public void setDescription(String description) { this.description = description; } + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module; + } + public List getParams() { return params; } @@ -316,6 +326,8 @@ private void explore(RequestHandler handler) { } // just ignore cli value here } + Module classModule = controllerClass.getAnnotation(Module.class); + String classModuleText = null == classModule ? inferModule(controllerClass) : classModule.value(); this.id = id(controllerClass, method); Type returnType = method.getGenericReturnType(); Map typeParamLookup = C.Map(); @@ -325,6 +337,8 @@ private void explore(RequestHandler handler) { returnSample = void.class == returnType ? null : generateSampleJson(BeanSpec.of(returnType, null, Act.injector(), typeParamLookup), typeParamLookup); Description descAnno = method.getAnnotation(Description.class); this.description = null == descAnno ? id(controllerClass, method) : descAnno.value(); + Module methodModule = method.getAnnotation(Module.class); + this.module = null == methodModule ? classModuleText : methodModule.value(); exploreParamInfo(method, typeParamLookup); if (!Modifier.isStatic(method.getModifiers())) { exploreParamInfo(controllerClass, typeParamLookup); @@ -332,6 +346,10 @@ private void explore(RequestHandler handler) { this.controllerClass = controllerClass; } + private String inferModule(Class controllerClass) { + return controllerClass.getSimpleName(); + } + private String id(Class controllerClass, Method method) { return className(controllerClass) + "." + method.getName(); } diff --git a/src/main/java/act/apidoc/Module.java b/src/main/java/act/apidoc/Module.java new file mode 100644 index 000000000..5a8b5a4b9 --- /dev/null +++ b/src/main/java/act/apidoc/Module.java @@ -0,0 +1,37 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * The `@Module` annotation can be used by developer to mark + * a class's module, which will be used to organise the + * API book. + * + * If a controller/service class has no module annotation then + * the module will be inferred from the class's simple name. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface Module { + String value(); +} diff --git a/src/main/resources/asset/~act/apibook/apibook.tag b/src/main/resources/asset/~act/apibook/apibook.tag index 11b99da04..42bb40dc5 100644 --- a/src/main/resources/asset/~act/apibook/apibook.tag +++ b/src/main/resources/asset/~act/apibook/apibook.tag @@ -3,6 +3,7 @@

                                                                                                                                                                    API Book - { sysInfo.appName }

                                                                                                                                                                    +
                                                                                                                                                                    @@ -25,7 +26,8 @@ padding-left: 10px; } endpoint-list { - width: 75%; + width: 60%; + left: 15%; overflow-x: hidden; position: absolute; } diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index b2ee14b39..10c574158 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -1,15 +1,15 @@ -
                                                                                                                                                                    -   -
                                                                                                                                                                    [{ httpMethod }] { path }
                                                                                                                                                                    -
                                                                                                                                                                    +
                                                                                                                                                                    +   +
                                                                                                                                                                    [{ endpoint.httpMethod }] { endpoint.path }
                                                                                                                                                                    +

                                                                                                                                                                    Parameters

                                                                                                                                                                    -
                                                                                                                                                                    +
                                                                                                                                                                    N/A
                                                                                                                                                                    - 0 }> +
                                                                                                                                                                    0 }> @@ -20,32 +20,32 @@ - - - - + + + + - +
                                                                                                                                                                    name
                                                                                                                                                                    { name }{ type }{ required }
                                                                                                                                                                    { endpoint.name }{ endpoint.type }{ endpoint.required } - { defaultValue } - N/A + { endpoint.defaultValue } + N/A { description }{ endpoint.description }
                                                                                                                                                                    -
                                                                                                                                                                    +

                                                                                                                                                                    Query example

                                                                                                                                                                    -
                                                                                                                                                                    { sampleQuery }
                                                                                                                                                                    +
                                                                                                                                                                    { endpoint.sampleQuery }
                                                                                                                                                                    -
                                                                                                                                                                    +

                                                                                                                                                                    Json body example

                                                                                                                                                                    -
                                                                                                                                                                    { sampleJsonPost }
                                                                                                                                                                    +
                                                                                                                                                                    { endpoint.sampleJsonPost }
                                                                                                                                                                    -
                                                                                                                                                                    +

                                                                                                                                                                    Return value sample

                                                                                                                                                                    -
                                                                                                                                                                    { returnSample }
                                                                                                                                                                    +
                                                                                                                                                                    { endpoint.returnSample }
                                                                                                                                                                     
                                                                                                                                                                    @@ -182,8 +182,9 @@ self.on('mount', function () { self.fetchEndpoints() }) + self.selectedModules = [] fetchEndpoints() { - $.getJSON('/~/apibook/endpoint', function(endpoints) { + $.getJSON('/~/apibook/endpoints', function(endpoints) { for(var i = 0, j = endpoints.length; i < j; ++i) { var endpoint = endpoints[i]; endpoint.richDesc = riot.md.render(endpoint.description); @@ -193,5 +194,12 @@ riot.store.trigger('endpoints-fetched', endpoints); }) } + riot.store.on('module-selected', function(modules) { + self.selectedModules = modules; + self.update() + }) + show(endpoint) { + return self.selectedModules.indexOf(endpoint.module) > -1; + } \ No newline at end of file diff --git a/src/main/resources/asset/~act/apibook/index.html b/src/main/resources/asset/~act/apibook/index.html index ce8d6dfe4..da6a88bfc 100644 --- a/src/main/resources/asset/~act/apibook/index.html +++ b/src/main/resources/asset/~act/apibook/index.html @@ -65,6 +65,7 @@ + + \ No newline at end of file diff --git a/src/main/resources/asset/~act/apibook/toc.tag b/src/main/resources/asset/~act/apibook/toc.tag index a4f2d08a7..d2adc9fd7 100644 --- a/src/main/resources/asset/~act/apibook/toc.tag +++ b/src/main/resources/asset/~act/apibook/toc.tag @@ -3,27 +3,27 @@
                                                                                                                                                                    @@ -86,6 +86,7 @@ self.POST = [] self.PUT = [] self.DELETE = [] + self.selectedModules = [] self.buildTree = function(endpoints) { for (var i = 0, j = endpoints.length; i < j; ++i) { var endpoint = endpoints[i] @@ -105,5 +106,13 @@ self.buildTree(endpoints) self.update() }) + riot.store.on('module-selected', function(modules) { + self.selectedModules = modules; + self.update() + }) + show(endpoint) { + var show = self.selectedModules.indexOf(endpoint.module) > -1 + return show + } \ No newline at end of file From 453db0dfa86f3d3bf6364efaa3c35ab7b0c51637 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 29 Aug 2018 19:25:42 +1000 Subject: [PATCH 083/730] add testapps files into version control --- .../src/main/resources/test/scenarios/properties.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 testapps/ResourceLoaderTest/src/main/resources/test/scenarios/properties.yml diff --git a/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/properties.yml b/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/properties.yml new file mode 100644 index 000000000..0801d0953 --- /dev/null +++ b/testapps/ResourceLoaderTest/src/main/resources/test/scenarios/properties.yml @@ -0,0 +1,9 @@ +Scenario(Properties): + interactions: + - description: test load into Properties + request: + get: /properties/foo + response: + json: + foo: bar + id: 3 From 3dea97ba33ead2173d23e072b817b6bd222dd4b2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 29 Aug 2018 19:30:20 +1000 Subject: [PATCH 084/730] #814 switch dblclick and click handler for module list click --- src/main/resources/asset/~act/apibook/module_list.tag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/asset/~act/apibook/module_list.tag b/src/main/resources/asset/~act/apibook/module_list.tag index 4d911b2c4..533ad9a4d 100644 --- a/src/main/resources/asset/~act/apibook/module_list.tag +++ b/src/main/resources/asset/~act/apibook/module_list.tag @@ -2,7 +2,7 @@
                                                                                                                                                                      -
                                                                                                                                                                    • {module.name}
                                                                                                                                                                    • +
                                                                                                                                                                    • {module.name}
                                                                                                                                                                    From c0f289227192b0a078c332e17e6d735889a2831e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 30 Aug 2018 10:22:23 +1000 Subject: [PATCH 085/730] #814 - keep improving user experience: support ctrl-click to multi select modules --- .../asset/~act/apibook/module_list.tag | 6 +++++- src/main/resources/asset/~act/apibook/toc.tag | 19 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/resources/asset/~act/apibook/module_list.tag b/src/main/resources/asset/~act/apibook/module_list.tag index 533ad9a4d..edd31bc2e 100644 --- a/src/main/resources/asset/~act/apibook/module_list.tag +++ b/src/main/resources/asset/~act/apibook/module_list.tag @@ -2,7 +2,7 @@
                                                                                                                                                                      -
                                                                                                                                                                    • {module.name}
                                                                                                                                                                    • +
                                                                                                                                                                    • {module.name}
                                                                                                                                                                    @@ -82,6 +82,10 @@ }) } forceSelect(e) { + if (e.ctrlKey) { + self.toggleSelect(e) + return + } var selected = [] var module = e.item.module; for (var i = 0, j = self.modules.length; i < j; ++i) { diff --git a/src/main/resources/asset/~act/apibook/toc.tag b/src/main/resources/asset/~act/apibook/toc.tag index d2adc9fd7..57d94db74 100644 --- a/src/main/resources/asset/~act/apibook/toc.tag +++ b/src/main/resources/asset/~act/apibook/toc.tag @@ -2,25 +2,25 @@
                                                                                                                                                                      -
                                                                                                                                                                    • GET
                                                                                                                                                                    • +
                                                                                                                                                                    • GET
                                                                                                                                                                    • {endpoint.path}
                                                                                                                                                                    • -
                                                                                                                                                                    • POST
                                                                                                                                                                    • +
                                                                                                                                                                    • POST
                                                                                                                                                                    • {endpoint.path}
                                                                                                                                                                    • -
                                                                                                                                                                    • PUT
                                                                                                                                                                    • +
                                                                                                                                                                    • PUT
                                                                                                                                                                    • {endpoint.path}
                                                                                                                                                                    • -
                                                                                                                                                                    • DELETE
                                                                                                                                                                    • +
                                                                                                                                                                    • DELETE
                                                                                                                                                                    • {endpoint.path} @@ -102,6 +102,17 @@ }) } } + showList(endpoints) { + if (endpoints.length == 0) { + return false + } + for (var i = 0, j = endpoints.length; i < j; ++i) { + if (self.show(endpoints[i])) { + return true + } + } + return false + } riot.store.on('endpoints-fetched', function(endpoints) { self.buildTree(endpoints) self.update() From 6bcc11867b2946f842afadfa130e7506b847bb01 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 30 Aug 2018 10:29:06 +1000 Subject: [PATCH 086/730] update riotjs to 3.11.2 --- src/main/resources/asset/~act/js/riotjs.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/asset/~act/js/riotjs.js b/src/main/resources/asset/~act/js/riotjs.js index 6bcf0531b..6bd7d1a4e 100644 --- a/src/main/resources/asset/~act/js/riotjs.js +++ b/src/main/resources/asset/~act/js/riotjs.js @@ -1,2 +1,2 @@ -/* Riot v3.10.0, @license MIT */ -var e,t;e=this,t=function(){"use strict";function s(e,t){return(t||document).querySelector(e)}var t,r,x=[],P={},a="yield",y="__global_mixin",w="riot-",u=["ref","data-ref"],p="data-is",f="if",d="each",n="no-reorder",_="show",A="hide",i="key",b="__riot-events__",l="string",$="object",o="undefined",c="function",h="http://www.w3.org/1999/xlink",m="http://www.w3.org/2000/svg",g=/^xlink:(\w+)/,v=typeof window===o?void 0:window,O=/^on/,N=/([-\w]+) ?= ?(?:"([^"]*)|'([^']*)|({[^}]*}))/g,E={viewbox:"viewBox",preserveaspectratio:"preserveAspectRatio"},C=/^(?:disabled|checked|readonly|required|allowfullscreen|auto(?:focus|play)|compact|controls|default|formnovalidate|hidden|ismap|itemscope|loop|multiple|muted|no(?:resize|shade|validate|wrap)?|open|reversed|seamless|selected|sortable|truespeed|typemustmatch)$/,j=0|(v&&v.document||{}).documentMode;function S(e){return"svg"===e?document.createElementNS(m,e):document.createElement(e)}function k(e,t,r){var n=g.exec(t);n&&n[1]?e.setAttributeNS(h,n[1],r):e.setAttribute(t,r)}var e,T,L={},I=!1;v&&(e=S("style"),T=s("style[type=riot]"),k(e,"type","text/css"),T?(T.id&&(e.id=T.id),T.parentNode.replaceChild(e,T)):document.head.appendChild(e),r=(t=e).styleSheet);var R={styleNode:t,add:function(e,t){L[t]=e,I=!0},inject:function(){if(v&&I){I=!1;var e=Object.keys(L).map(function(e){return L[e]}).join("\n");r?r.cssText=e:t.innerHTML=e}},remove:function(e){delete L[e],I=!0}},M=function(){var u="[{(,;:?=|&!^~>%*/",l=["case","default","do","else","in","instanceof","prefix","return","typeof","void","yield"],c=l.reduce(function(e,t){return e+t.slice(-1)},""),p=/^\/(?=[^*>/])[^[/\\]*(?:(?:\\.|\[(?:\\.|[^\]\\]*)*\])[^[\\/]*)*?\/[gimuy]*/,f=/[$\w]/;function d(e,t){for(;0<=--t&&/\s/.test(e[t]););return t}return function(e,t){var r=/.*/g,n=r.lastIndex=t++,i=r.exec(e)[0].match(p);if(i){var o=n+i[0].length,s=e[n=d(e,n)];if(n<0||~u.indexOf(s))return o;if("."===s)"."===e[n-1]&&(t=o);else if("+"===s||"-"===s)(e[--n]!==s||(n=d(e,n))<0||!f.test(e[n]))&&(t=o);else if(~c.indexOf(s)){for(var a=n+1;0<=--n&&f.test(e[n]););~l.indexOf(e.slice(n+1,a))&&(t=o)}}return t}}(),F=function(e){var t,r,n="g",i=/"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|`[^`\\]*(?:\\[\S\s][^`\\]*)*`/g,o=i.source+"|"+/(?:\breturn\s+|(?:[$\w\)\]]|\+\+|--)\s*(\/)(?![*\/]))/.source+"|"+/\/(?=[^*\/])[^[\/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[\/\\]*)*?([^<]\/)[gim]*/.source,s=RegExp("[\\x00-\\x1F<>a-zA-Z0-9'\",;\\\\]"),a=/(?=[[\]()*+?.^$|])/g,u=i.source+"|"+/(\/)(?![*\/])/.source,x={"(":RegExp("([()])|"+u,n),"[":RegExp("([[\\]])|"+u,n),"{":RegExp("([{}])|"+u,n)},l="{ }",c=["{","}","{","}",/{[^}]*}/,/\\([{}])/g,/\\({)|{/g,RegExp("\\\\(})|([[({])|(})|"+u,n),l,/^\s*{\^?\s*([$\w]+)(?:\s*,\s*(\S+))?\s+in\s+(\S.*)\s*}/,/(^|[^\\]){=[\S\s]*?}/],p=void 0,y=[];function f(e){return e}function d(e,t){return t||(t=y),new RegExp(e.source.replace(/{/g,t[2]).replace(/}/g,t[3]),e.global?n:"")}function h(e){if(e===l)return c;var t=e.split(" ");if(2!==t.length||s.test(e))throw new Error('Unsupported brackets "'+e+'"');return(t=t.concat(e.replace(a,"\\").split(" ")))[4]=d(1 %s",e.riotData.tagName||"Unknown tag",this.tmpl),console.log(this.data))}.bind({data:t,tmpl:e})):e}n.hasExpr=F.hasExpr,n.loopKeys=F.loopKeys,n.clearCache=function(){r={}},n.errorHandler=null;var a=/\u2057/g,u=/\u2057(\d+)~/g;var c=/^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/,p={"(":/[()]/g,"[":/[[\]]/g,"{":/[{}]/g};function l(o,e,t){if(o=o.replace(/\s+/g," ").trim().replace(/\ ?([[\({},?\.:])\ ?/g,"$1")){for(var r,n=[],i=0;o&&(r=o.match(c))&&!r.index;){var s,a,u=/,|([[{(])|$/g;for(o=RegExp.rightContext,s=r[2]?t[r[2]].slice(1,-1).trim().replace(/\s+/g," "):r[1];a=(r=u.exec(o))[1];)l(a,u);a=o.slice(0,r.index),o=RegExp.rightContext,n[i++]=d(a,1,s)}o=i?1'+t+"","application/xml").documentElement,!0);e.appendChild(n)}else e.innerHTML=t}function Y(e,t){if(e)for(var r;r=N.exec(e);)t(r[1].toLowerCase(),r[2]||r[3]||r[4])}function ee(){return document.createDocumentFragment()}function te(e,t,r){e.insertBefore(t,r.parentNode&&r)}function re(r){return Object.keys(r).reduce(function(e,t){return e+" "+t+": "+r[t]+";"},"")}function ne(e,t,r){if(e){var n,i=t(e,r);if(!1===i)return;for(e=e.firstChild;e;)n=e.nextSibling,ne(e,t,i),e=n}}var ie=Object.freeze({$$:G,$:s,createDOMPlaceholder:K,mkEl:S,setAttr:k,toggleVisibility:W,getAttr:J,remAttr:Q,setInnerHTML:X,walkAttrs:Y,createFrag:ee,safeInsert:te,styleObjectToString:re,walkNodes:ne});function oe(e){return V(e)||null===e}function se(e){return oe(e)||""===e}function ae(e){return typeof e===c}function ue(e){return e&&typeof e===$}function le(e){var t=e.ownerSVGElement;return!!t||null===t}function ce(e){return Array.isArray(e)||e instanceof Array}function pe(e){return C.test(e)}function fe(e){return typeof e===l}var de=Object.freeze({isBlank:se,isFunction:ae,isObject:ue,isSvg:le,isWritable:B,isArray:ce,isBoolAttr:pe,isNil:oe,isString:fe,isUndefined:V});function he(e,t){return-1!==e.indexOf(t)}function me(e,t){for(var r=e?e.length:0,n=0;n|>([\S\s]*?)<\/yield\s*>|>)/gi,Se=/]*)['"]\s*>([\S\s]*?)<\/yield\s*>/gi,ke=/|>([\S\s]*?)<\/yield\s*>)/gi,Te={tr:"tbody",th:"tr",td:"tr",col:"colgroup"},Le=j&&j<10?/^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?|opt(?:ion|group))$/:/^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?)$/,Ie="div",Re="svg";function Me(e,t,r){var n=e&&e.match(/^\s*<([-\w]+)/),i=n&&n[1].toLowerCase(),o=S(r?Re:Ie);return e=function(e,r){if(!Ce.test(e))return e;var n={};return r=r&&r.replace(Se,function(e,t,r){return n[t]=n[t]||r,""}).trim(),e.replace(ke,function(e,t,r){return n[t]||r||""}).replace(je,function(e,t){return r||t||""})}(e,t),Le.test(i)?o=function(e,t,r){var n="o"===r[0],i=n?"select>":"table>";if(e.innerHTML="<"+i+t.trim()+"=M.length,h=u&&c||!u&&!f;h?((f=gt(j,{parent:_,isLoop:!0,isAnonymous:I,tagName:C,root:w.cloneNode(I),item:r,index:t},L)).mount(),d?function(e,t){t?He.call(this,e):e.appendChild(this.root)}.apply(f,[g||v,R]):function(e,t,r){r?He.apply(this,[e,t]):te(e,this.root,t.root)}.apply(f,[v,T[t],R]),d||M.splice(t,0,r),T.splice(t,0,f),S&&Ae(_.tags,C,f,!0)):p!==t&&u&&((N||he(m,M[p]))&&(function(e,t,r){r?it.apply(this,[e,t]):te(e,this.root,t.root)}.apply(f,[v,T[t],R]),T.splice(t,0,T.splice(p,1)[0]),M.splice(t,0,M.splice(p,1)[0])),A.pos&&(f[A.pos]=t),!S&&f.tags&&function(t){var r=this;me(Object.keys(this.tags),function(e){nt.apply(r.tags[e],[e,t])})}.call(f,t)),q(f.__,{item:r,index:t,parent:_}),x[t]=a,h||f.update(r)}else b++}),function(e,t,r){for(var n=t.length,i=e.length-r;i)[\S\s]*?-->/.source+"|"+Ft,"g"),Vt=/<(-?[A-Za-z][-\w\xA0-\xFF]*)(?:\s+([^"'/>]*(?:(?:"[^"]*"|'[^']*'|\/[^>])[^'"/>]*)*)|\s*)(\/?)>/g,Bt=/>[ \t]+<(-?[A-Za-z]|\/[-A-Za-z])/g,qt=["style","src","d","value"],Dt=/^(?:input|img|br|wbr|hr|area|base|col|embed|keygen|link|meta|param|source|track)$/,Zt=/]*|"[^"]*")*)?>([\S\s]+?)<\/pre\s*>/gi,Gt=/^"(?:number|date(?:time)?|time|month|email|color)\b/i,Kt=/^\s*import(?!\w)(?:(?:\s|[^\s'"])*)['|"].*\n?/gm,Wt=/[ \t]+$/gm,Jt=Tt(/@#\d/,"x01"),Qt=Tt(/@#(\d+)/g,"x01"),Xt="#",Yt="⁗",er='"',tr="'";function rr(e){var t,r=Ut;for(1!==e.indexOf("\r")&&(e=e.replace(/\r\n?/g,"\n")),r.lastIndex=0;t=r.exec(e);)"<"===t[0][0]&&(e=RegExp.leftContext+RegExp.rightContext,r.lastIndex=t[3]+1);return e}function nr(e,t){var r,n,i,o=[];for(Ht.lastIndex=0,e=e.replace(/\s+/g," ");r=Ht.exec(e);){var s=r[1].toLowerCase(),a=r[2];a?(a[0]!==er&&(a=er+(a[0]===tr?a.slice(1,-1):a)+er),"type"===s&&Gt.test(a)?n=a:(Jt.test(a)&&("value"===s&&(i=1),-1!==qt.indexOf(s)&&(s="riot-"+s)),o.push(s+"="+a))):o.push(s)}return n&&(i&&(n=er+t._bp[0]+tr+n.slice(1,-1)+tr+t._bp[1]+er),o.push("type="+n)),o.join(" ")}function ir(e,t,r){var n=r._bp;if(e&&n[4].test(e)){for(var i,o=t.expr&&(t.parser||t.type)?lr:0,s=F.split(e,0,n),a=1;a"}),!t.whitespace){var r=[];/]/.test(e)&&(e=e.replace(Zt,function(e){return r.push(e),""})),e=e.trim().replace(/\s+/g," "),r.length&&(e=e.replace(/\u0002/g,function(){return r.shift()}))}return t.compact&&(e=e.replace(Bt,"><$1")),or(e,i).replace(Wt,"")}var ar=/^[ \t]*(((?:async|\*)\s*)?([$_A-Za-z][$\w]*))\s*\([^()]*\)\s*{/m;function ur(e){var t,r,n,i,o,s,a=[],u=RegExp,l=function(e,t){for(var r,n,i,o,s,a,u=new RegExp(Rt,"g"),l=F.skipRegex,c=0|t,p=[[]],f=[],d=u,h=d.lastIndex=c;a=d.exec(e);){if(o=a.index,s=d.lastIndex,n="",i=a[1]){if("{"===i)f.push("}");else if("}"===i){if(f.pop()!==i)throw new Error("Unexpected '}'");"`"===f[f.length-1]&&(i=f.pop())}else"/"===i&&o+1<(s=l(e,o))&&(n=e.slice(o,s));"`"===i&&(s=Pt(e,s,f),n=e.slice(o,s),d=f.length?r||(r=new RegExp(Mt,"g")):u)}else"/"===(n=a[0])[0]?(n="*"===n[1]?" ":"",e=e.slice(c,o)+n+e.slice(s),s=o+n.length,n=""):2===n.length&&(n="");n&&(p[0].push(e.slice(h,o)),p.push(n),h=s),d.lastIndex=s}return p[0].push(e.slice(h)),p}(e);for(e=l.shift().join("<%>");t=e.match(ar);)a.push(u.leftContext),n=c(e=u.rightContext),i=t[1],o=t[2]||"",s=t[3],s=(r=!/^(?:if|while|for|switch|catch|function)$/.test(s))?t[0].replace(i,"this."+s+" ="+o+" function"):t[0],a.push(s,e.slice(0,n)),e=e.slice(n),r&&!/^\s*.\s*bind\b/.test(e)&&a.push(".bind(this)");return a.length&&(e=a.join("")+e),l.length&&(e=e.replace(/<%>/g,function(){return l.shift()})),e;function c(e){for(var t=/[{}]/g,r=1;r&&t.exec(e);)"{"===e[t.lastIndex-1]?++r:--r;return r?e.length:t.lastIndex}}function lr(e,t,r,n,i){return/\S/.test(e)?(r||(r=t.type),(t.parser||r&&Lt._req("js."+r,!0)||ur)(e,n,i).replace(/\r\n?/g,"\n").replace(Wt,"")):""}var cr=RegExp("([{}]|^)[; ]*((?:[^@ ;{}][^{}]*)?[^@ ;{}:] ?)(?={)|"+Ft,"g");function pr(e,t,r,n){var i,o;(n=n||{},r)&&("css"!==r&&(e=Lt._req("css."+r,!0)(t,e,n.parserOpts||{},n.url)));return e=e.replace(F.R_MLCOMMS,"").replace(/\s+/g," ").trim(),t&&(i=t,o=":scope",e=e.replace(cr,function(e,t,r){return r?(r=r.replace(/[^,]+/g,function(e){var t=e.trim();return 0===t.indexOf(i)?e:t&&"from"!==t&&"to"!==t&&"%"!==t.slice(-1)?t=t.indexOf(o)<0?i+" "+t+',[data-is="'+i+'"] '+t:t.replace(o,i)+","+t.replace(o,'[data-is="'+i+'"]'):e}),t?t+" "+r:r):e})),e}var fr=/\stype\s*=\s*(?:(['"])(.+?)\1|(\S+))/i,dr="\\s*=\\s*("+zt+"|{[^}]+}|\\S+)",hr=/\/>\n|^<(?:\/?-?[A-Za-z][-\w\xA0-\xFF]*\s*|-?[A-Za-z][-\w\xA0-\xFF]*\s+[-\w:\xA0-\xFF][\S\s]*?)>\n/;function mr(e,t){return e?(e=tr+e.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+tr,t&&-1!==e.indexOf("\n")?e.replace(/\n/g,"\\n"):e):"''"}function gr(e){if(e){var t=e.match(fr);if(t=t&&(t[2]||t[3]))return t.replace("text/","")}return""}function vr(e,t){if(e){var r=e.match(RegExp("\\s"+t+dr,"i"));if(r=r&&r[1])return/^['"]/.test(r)?r.slice(1,-1):r}return""}function xr(e){var t=vr(e,"options").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'");return t?JSON.parse(t):null}var yr=RegExp(/^([ \t]*)<(-?[A-Za-z][-\w\xA0-\xFF]*)(?:\s+([^'"/>]+(?:(?:@|\/[^>])[^'"/>]*)*)|\s*)?(?:\/>|>[ \t]*\n?([\S\s]*)^\1<\/\2\s*>|>(.*)<\/\2\s*>)/.source.replace("@",zt),"gim"),br=/]*)?>\n?([\S\s]*?)<\/script\s*>/gi,wr=/]*)?>\n?([\S\s]*?)<\/style\s*>/gi;var _r,Ar,Or={compile:function(e,b,w){var _,A=[],t=e;b||(b={}),b.parserOptions=$t({template:{},js:{},style:{}},b.parserOptions||{}),_=b.exclude?function(e){return b.exclude.indexOf(e)<0}:function(){return 1},w||(w="");var r,n,i,o,O=F.array(b.brackets);return b.template&&(r=t,n=w,i=b.template,o=b.parserOptions.template,t=Lt._req("html."+i,!0)(r,o,n)),t=rr(t).replace(yr,function(e,t,c,r,n,i){var o,s,a,u,l,p,f,d,h="",m="",g="",v="",x=[];if(x._bp=O,c=c.toLowerCase(),r=r&&_("attribs")?or(nr(ir(r,b,x),x),x):"",(n||(n=i))&&/\S/.test(n))if(i)_("html")&&(g=sr(i,b,x));else{var y=function(e){if(/<[-\w]/.test(e))for(var t,r=e.lastIndexOf("<"),n=e.length;-1!==r;){if(t=e.slice(r,n).match(hr))return r+=t.index+t[0].length,"<-/>\n"===(t=e.slice(0,r)).slice(-5)&&(t=t.slice(0,-5)),[t,e.slice(r)];n=r,r=e.lastIndexOf("<",r-1)}return["",e]}((n=(n=(n=n.replace(RegExp("^"+t,"gm"),"")).replace(br,function(e,t,r){if(_("js")){var n=(i=r,o=b,a=w,u=gr(s=t),l=vr(s,"src"),c=$t({},o.parserOptions.js),!l&&lr(i,o,u,$t(c,xr(s)),a));n&&(h+=(h?"\n":"")+n)}var i,o,s,a,u,l,c;return""})).replace(wr,function(e,t,r){var n,i,o,s,a,u,l;return _("css")&&(m+=(m?" ":"")+(n=r,o=t,s=w,a=c,u=$t({},(i=b).parserOptions.style),l={parserOpts:$t(u,xr(o)),url:s},pr(n,a,gr(o)||i.style,l))),""})).replace(Wt,""));_("html")&&(g=sr(y[0],b,x)),_("js")&&((n=lr(y[1],b,null,null,w))&&(h+=(h?"\n":"")+n),h=h.replace(Kt,function(e){return v+=e.trim()+"\n",""}))}return h=/\S/.test(h)?h.replace(/\n{3,}/g,"\n\n"):"",b.entities?(A.push({tagName:c,html:g,css:m,attribs:r,js:h,imports:v}),""):(o=c,s=g,a=m,u=r,l=h,p=v,f=b.debug?",\n ":", ",d="});",l&&"\n"!==l.slice(-1)&&(d="\n"+d),p+"riot.tag2('"+o+tr+f+mr(s,1)+f+mr(a)+f+mr(u)+", function(opts) {\n"+l+d)}),b.entities?A:t},compileHTML:function(e,t,r){return Array.isArray(t)?(r=t,t={}):(r||(r=[]),t||(t={})),r._bp=F.array(t.brackets),sr(rr(e),t,r)},compileCSS:function(e,t,r){return t&&"object"==typeof t?(r=t,t=""):r||(r={}),pr(e,r.tagName,t,r)},compileJS:function(e,t,r,n){return"string"==typeof t&&(n=r,r=t,t={}),r&&"object"==typeof r&&(n=r,r=""),n||(n={}),lr(e,t||{},r,n.parserOptions,n.url)},parsers:Lt,version:"v3.4.0"};function Nr(e,t,r){var n=new XMLHttpRequest;n.onreadystatechange=function(){4===n.readyState&&(200===n.status||!n.status&&n.responseText.length?t(n.responseText,r,e):jr.error('"'+e+'" not found'))},n.onerror=function(e){return jr.error(e)},n.open("GET",e,!0),n.send("")}function Er(e,t){if(typeof e===l){var r=S("script"),n=document.documentElement;t&&(e+="\n//# sourceURL="+t+".js"),r.text=e,n.appendChild(r),n.removeChild(r)}}var Cr=Or.parsers;function jr(e,i,t){if(typeof e===l){if(ue(i)&&(t=i,i=!1),/^\s*/])[^[/\\]*(?:(?:\\.|\[(?:\\.|[^\]\\]*)*\])[^[\\/]*)*?\/[gimuy]*/,p=/[$\w]/;function f(e,t){for(;0<=--t&&/\s/.test(e[t]););return t}return function(e,t){var r=/.*/g,n=r.lastIndex=t++,i=r.exec(e)[0].match(l);if(i){var o=n+i[0].length,s=e[n=f(e,n)];if(n<0||~"[{(,;:?=|&!^~>%*/".indexOf(s))return o;if("."===s)"."===e[n-1]&&(t=o);else if("+"===s||"-"===s)(e[--n]!==s||(n=f(e,n))<0||!p.test(e[n]))&&(t=o);else if(~c.indexOf(s)){for(var a=n+1;0<=--n&&p.test(e[n]););~u.indexOf(e.slice(n+1,a))&&(t=o)}}return t}}(),$=function(e){var t,r,n="g",i=/"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|`[^`\\]*(?:\\[\S\s][^`\\]*)*`/g,o=i.source+"|"+/(?:\breturn\s+|(?:[$\w\)\]]|\+\+|--)\s*(\/)(?![*\/]))/.source+"|"+/\/(?=[^*\/])[^[\/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[\/\\]*)*?([^<]\/)[gim]*/.source,s=RegExp("[\\x00-\\x1F<>a-zA-Z0-9'\",;\\\\]"),a=/(?=[[\]()*+?.^$|])/g,u=i.source+"|"+/(\/)(?![*\/])/.source,x={"(":RegExp("([()])|"+u,n),"[":RegExp("([[\\]])|"+u,n),"{":RegExp("([{}])|"+u,n)},c="{ }",l=["{","}","{","}",/{[^}]*}/,/\\([{}])/g,/\\({)|{/g,RegExp("\\\\(})|([[({])|(})|"+u,n),c,/^\s*{\^?\s*([$\w]+)(?:\s*,\s*(\S+))?\s+in\s+(\S.*)\s*}/,/(^|[^\\]){=[\S\s]*?}/],p=void 0,y=[];function f(e){return e}function d(e,t){return t||(t=y),new RegExp(e.source.replace(/{/g,t[2]).replace(/}/g,t[3]),e.global?n:"")}function h(e){if(e===c)return l;var t=e.split(" ");if(2!==t.length||s.test(e))throw new Error('Unsupported brackets "'+e+'"');return(t=t.concat(e.replace(a,"\\").split(" ")))[4]=d(1 %s",e.riotData.tagName||"Unknown tag",this.tmpl),console.log(this.data))}.bind({data:t,tmpl:e})):e}n.hasExpr=$.hasExpr,n.loopKeys=$.loopKeys,n.clearCache=function(){r={}},n.errorHandler=null;var a=/\u2057/g,u=/\u2057(\d+)~/g;var l=/^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/,p={"(":/[()]/g,"[":/[[\]]/g,"{":/[{}]/g};function c(o,e,t){if(o=o.replace(/\s+/g," ").trim().replace(/\ ?([[\({},?\.:])\ ?/g,"$1")){for(var r,n=[],i=0;o&&(r=o.match(l))&&!r.index;){var s,a,u=/,|([[{(])|$/g;for(o=RegExp.rightContext,s=r[2]?t[r[2]].slice(1,-1).trim().replace(/\s+/g," "):r[1];a=(r=u.exec(o))[1];)c(a,u);a=o.slice(0,r.index),o=RegExp.rightContext,n[i++]=d(a,1,s)}o=i?1'+t+"","application/xml").documentElement,!0);e.appendChild(n)}else e.innerHTML=t}function Y(e,t){if(e)for(var r;r=E.exec(e);)t(r[1].toLowerCase(),r[2]||r[3]||r[4])}function ee(){return document.createDocumentFragment()}function te(e,t,r){e.insertBefore(t,r.parentNode&&r)}function re(r){return Object.keys(r).reduce(function(e,t){return e+" "+t+": "+r[t]+";"},"")}function ne(e,t,r){if(e){var n,i=t(e,r);if(!1===i)return;for(e=e.firstChild;e;)n=e.nextSibling,ne(e,t,i),e=n}}var ie=Object.freeze({$$:G,$:s,createDOMPlaceholder:K,mkEl:k,setAttr:T,toggleVisibility:W,getAttr:J,remAttr:Q,setInnerHTML:X,walkAttrs:Y,createFrag:ee,safeInsert:te,styleObjectToString:re,walkNodes:ne});function oe(e){return V(e)||null===e}function se(e){return oe(e)||""===e}function ae(e){return typeof e===l}function ue(e){return e&&typeof e===F}function ce(e){var t=e.ownerSVGElement;return!!t||null===t}function le(e){return Array.isArray(e)||e instanceof Array}function pe(e){return j.test(e)}function fe(e){return typeof e===c}var de=Object.freeze({isBlank:se,isFunction:ae,isObject:ue,isSvg:ce,isWritable:B,isArray:le,isBoolAttr:pe,isNil:oe,isString:fe,isUndefined:V});function he(e,t){return-1!==e.indexOf(t)}function me(e,t){for(var r=e?e.length:0,n=0;n|>([\S\s]*?)<\/yield\s*>|>)/gi,Se=/]*)['"]\s*>([\S\s]*?)<\/yield\s*>/gi,ke=/|>([\S\s]*?)<\/yield\s*>)/gi,Te={tr:"tbody",th:"tr",td:"tr",col:"colgroup"},Le=S&&S<10?/^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?|opt(?:ion|group))$/:/^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?)$/,Ie="div",Re="svg";function Me(e,t,r){var n=e&&e.match(/^\s*<([-\w]+)/),i=n&&n[1].toLowerCase(),o=k(r?Re:Ie);return e=function(e,r){if(!Ce.test(e))return e;var n={};return r=r&&r.replace(Se,function(e,t,r){return n[t]=n[t]||r,""}).trim(),e.replace(ke,function(e,t,r){return n[t]||r||""}).replace(je,function(e,t){return r||t||""})}(e,t),Le.test(i)?o=function(e,t,r){var n="o"===r[0],i=n?"select>":"table>";if(e.innerHTML="<"+i+t.trim()+"=$.length,m=c&&p||!c&&!d||!I[r];m?((d=vt(k,{parent:O,isLoop:!0,isAnonymous:M,tagName:S,root:A.cloneNode(M),item:n,index:r},R)).mount(),h?function(e,t){t?Ue.call(this,e):e.appendChild(this.root)}.apply(d,[v||y,P]):function(e,t,r){r?Ue.apply(this,[e,t]):te(e,this.root,t.root)}.apply(d,[y,I[r],P]),h||$.splice(r,0,n),I.splice(r,0,d),T&&Ae(O.tags,S,d,!0)):f!==r&&c&&((C||he(g,$[f]))&&(function(e,t,r){r?ot.apply(this,[e,t]):te(e,this.root,t.root)}.apply(d,[y,I[r],P]),I.splice(r,0,I.splice(f,1)[0]),$.splice(r,0,$.splice(f,1)[0])),N.pos&&(d[N.pos]=r),!T&&d.tags&&function(t){var r=this;me(Object.keys(this.tags),function(e){it.apply(r.tags[e],[e,t])})}.call(d,r)),q(d.__,{item:n,index:r,parent:O}),b[r]=u,m||d.update(n)}else _++}),function(e,t,r){for(var n=t.length,i=e.length-r;i)[\S\s]*?-->/.source+"|"+zt,"g"),Bt=/<(-?[A-Za-z][-\w\xA0-\xFF]*)(?:\s+([^"'/>]*(?:(?:"[^"]*"|'[^']*'|\/[^>])[^'"/>]*)*)|\s*)(\/?)>/g,qt=/>[ \t]+<(-?[A-Za-z]|\/[-A-Za-z])/g,Dt=["style","src","d","value"],Zt=/^(?:input|img|br|wbr|hr|area|base|col|embed|keygen|link|meta|param|source|track)$/,Gt=/]*|"[^"]*")*)?>([\S\s]+?)<\/pre\s*>/gi,Kt=/^"(?:number|date(?:time)?|time|month|email|color)\b/i,Wt=/^\s*import(?!\w)(?:(?:\s|[^\s'"])*)['|"].*\n?/gm,Jt=/[ \t]+$/gm,Qt=Lt(/@#\d/,"x01"),Xt=Lt(/@#(\d+)/g,"x01"),Yt="#",er="⁗",tr='"',rr="'";function nr(e){var t,r=Vt;for(1!==e.indexOf("\r")&&(e=e.replace(/\r\n?/g,"\n")),r.lastIndex=0;t=r.exec(e);)"<"===t[0][0]&&(e=RegExp.leftContext+RegExp.rightContext,r.lastIndex=t[3]+1);return e}function ir(e,t){var r,n,i,o=[];for(Ut.lastIndex=0,e=e.replace(/\s+/g," ");r=Ut.exec(e);){var s=r[1].toLowerCase(),a=r[2];a?(a[0]!==tr&&(a=tr+(a[0]===rr?a.slice(1,-1):a)+tr),"type"===s&&Kt.test(a)?n=a:(Qt.test(a)&&("value"===s&&(i=1),-1!==Dt.indexOf(s)&&(s="riot-"+s)),o.push(s+"="+a))):o.push(s)}return n&&(i&&(n=tr+t._bp[0]+rr+n.slice(1,-1)+rr+t._bp[1]+tr),o.push("type="+n)),o.join(" ")}function or(e,t,r){var n=r._bp;if(e&&n[4].test(e)){for(var i,o=t.expr&&(t.parser||t.type)?lr:0,s=$.split(e,0,n),a=1;a"}),!t.whitespace){var r=[];/]/.test(e)&&(e=e.replace(Gt,function(e){return r.push(e),""})),e=e.trim().replace(/\s+/g," "),r.length&&(e=e.replace(/\u0002/g,function(){return r.shift()}))}return t.compact&&(e=e.replace(qt,"><$1")),sr(e,i).replace(Jt,"")}var ur=/^[ \t]*(((?:async|\*)\s*)?([$_A-Za-z][$\w]*))\s*\([^()]*\)\s*{/m;function cr(e){var t,r,n,i,o,s,a=[],u=RegExp,c=function(e,t){for(var r,n,i,o,s,a,u=new RegExp(Mt,"g"),c=$.skipRegex,l=0|t,p=[[]],f=[],d=u,h=d.lastIndex=l;a=d.exec(e);){if(o=a.index,s=d.lastIndex,n="",i=a[1]){if("{"===i)f.push("}");else if("}"===i){if(f.pop()!==i)throw new Error("Unexpected '}'");"`"===f[f.length-1]&&(i=f.pop())}else"/"===i&&o+1<(s=c(e,o))&&(n=e.slice(o,s));"`"===i&&(s=$t(e,s,f),n=e.slice(o,s),d=f.length?r||(r=new RegExp(Pt,"g")):u)}else"/"===(n=a[0])[0]?(n="*"===n[1]?" ":"",e=e.slice(l,o)+n+e.slice(s),s=o+n.length,n=""):2===n.length&&(n="");n&&(p[0].push(e.slice(h,o)),p.push(n),h=s),d.lastIndex=s}return p[0].push(e.slice(h)),p}(e);for(e=c.shift().join("<%>");t=e.match(ur);)a.push(u.leftContext),n=l(e=u.rightContext),i=t[1],o=t[2]||"",s=t[3],s=(r=!/^(?:if|while|for|switch|catch|function)$/.test(s))?t[0].replace(i,"this."+s+" ="+o+" function"):t[0],a.push(s,e.slice(0,n)),e=e.slice(n),r&&!/^\s*.\s*bind\b/.test(e)&&a.push(".bind(this)");return a.length&&(e=a.join("")+e),c.length&&(e=e.replace(/<%>/g,function(){return c.shift()})),e;function l(e){for(var t=/[{}]/g,r=1;r&&t.exec(e);)"{"===e[t.lastIndex-1]?++r:--r;return r?e.length:t.lastIndex}}function lr(e,t,r,n,i){return/\S/.test(e)?(r||(r=t.type),(t.parser||r&&It._req("js."+r,!0)||cr)(e,n,i).replace(/\r\n?/g,"\n").replace(Jt,"")):""}var pr=RegExp("([{}]|^)[; ]*((?:[^@ ;{}][^{}]*)?[^@ ;{}:] ?)(?={)|"+zt,"g");function fr(e,t,r,n){var i,o;(n=n||{},r)&&("css"!==r&&(e=It._req("css."+r,!0)(t,e,n.parserOpts||{},n.url)));return e=e.replace($.R_MLCOMMS,"").replace(/\s+/g," ").trim(),t&&(i=t,o=":scope",e=e.replace(pr,function(e,t,r){return r?(r=r.replace(/[^,]+/g,function(e){var t=e.trim();return 0===t.indexOf(i)?e:t&&"from"!==t&&"to"!==t&&"%"!==t.slice(-1)?t=t.indexOf(o)<0?i+" "+t+',[data-is="'+i+'"] '+t:t.replace(o,i)+","+t.replace(o,'[data-is="'+i+'"]'):e}),t?t+" "+r:r):e})),e}var dr=/\stype\s*=\s*(?:(['"])(.+?)\1|(\S+))/i,hr="\\s*=\\s*("+Ht+"|{[^}]+}|\\S+)",mr=/\/>\n|^<(?:\/?-?[A-Za-z][-\w\xA0-\xFF]*\s*|-?[A-Za-z][-\w\xA0-\xFF]*\s+[-\w:\xA0-\xFF][\S\s]*?)>\n/;function gr(e,t){return e?(e=rr+e.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+rr,t&&-1!==e.indexOf("\n")?e.replace(/\n/g,"\\n"):e):"''"}function vr(e){if(e){var t=e.match(dr);if(t=t&&(t[2]||t[3]))return t.replace("text/","")}return""}function xr(e,t){if(e){var r=e.match(RegExp("\\s"+t+hr,"i"));if(r=r&&r[1])return/^['"]/.test(r)?r.slice(1,-1):r}return""}function yr(e){var t=xr(e,"options").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'");return t?JSON.parse(t):null}var br=RegExp(/^([ \t]*)<(-?[A-Za-z][-\w\xA0-\xFF]*)(?:\s+([^'"/>]+(?:(?:@|\/[^>])[^'"/>]*)*)|\s*)?(?:\/>|>[ \t]*\n?([\S\s]*)^\1<\/\2\s*>|>(.*)<\/\2\s*>)/.source.replace("@",Ht),"gim"),wr=/]*)?>\n?([\S\s]*?)<\/script\s*>/gi,_r=/]*)?>\n?([\S\s]*?)<\/style\s*>/gi;var Ar,Or,Nr={compile:function(e,b,w){var _,A=[],t=e;b||(b={}),b.parserOptions=Ft({template:{},js:{},style:{}},b.parserOptions||{}),_=b.exclude?function(e){return b.exclude.indexOf(e)<0}:function(){return 1},w||(w="");var r,n,i,o,O=$.array(b.brackets);return b.template&&(r=t,n=w,i=b.template,o=b.parserOptions.template,t=It._req("html."+i,!0)(r,o,n)),t=nr(t).replace(br,function(e,t,l,r,n,i){var o,s,a,u,c,p,f,d,h="",m="",g="",v="",x=[];if(x._bp=O,l=l.toLowerCase(),r=r&&_("attribs")?sr(ir(or(r,b,x),x),x):"",(n||(n=i))&&/\S/.test(n))if(i)_("html")&&(g=ar(i,b,x));else{var y=function(e){if(/<[-\w]/.test(e))for(var t,r=e.lastIndexOf("<"),n=e.length;-1!==r;){if(t=e.slice(r,n).match(mr))return r+=t.index+t[0].length,"<-/>\n"===(t=e.slice(0,r)).slice(-5)&&(t=t.slice(0,-5)),[t,e.slice(r)];n=r,r=e.lastIndexOf("<",r-1)}return["",e]}((n=(n=(n=n.replace(RegExp("^"+t,"gm"),"")).replace(wr,function(e,t,r){if(_("js")){var n=(i=r,o=b,a=w,u=vr(s=t),c=xr(s,"src"),l=Ft({},o.parserOptions.js),!c&&lr(i,o,u,Ft(l,yr(s)),a));n&&(h+=(h?"\n":"")+n)}var i,o,s,a,u,c,l;return""})).replace(_r,function(e,t,r){var n,i,o,s,a,u,c;return _("css")&&(m+=(m?" ":"")+(n=r,o=t,s=w,a=l,u=Ft({},(i=b).parserOptions.style),c={parserOpts:Ft(u,yr(o)),url:s},fr(n,a,vr(o)||i.style,c))),""})).replace(Jt,""));_("html")&&(g=ar(y[0],b,x)),_("js")&&((n=lr(y[1],b,null,null,w))&&(h+=(h?"\n":"")+n),h=h.replace(Wt,function(e){return v+=e.trim()+"\n",""}))}return h=/\S/.test(h)?h.replace(/\n{3,}/g,"\n\n"):"",b.entities?(A.push({tagName:l,html:g,css:m,attribs:r,js:h,imports:v}),""):(o=l,s=g,a=m,u=r,c=h,p=v,f=b.debug?",\n ":", ",d="});",c&&"\n"!==c.slice(-1)&&(d="\n"+d),p+"riot.tag2('"+o+rr+f+gr(s,1)+f+gr(a)+f+gr(u)+", function(opts) {\n"+c+d)}),b.entities?A:t},compileHTML:function(e,t,r){return Array.isArray(t)?(r=t,t={}):(r||(r=[]),t||(t={})),r._bp=$.array(t.brackets),ar(nr(e),t,r)},compileCSS:function(e,t,r){return t&&"object"==typeof t?(r=t,t=""):r||(r={}),fr(e,r.tagName,t,r)},compileJS:function(e,t,r,n){return"string"==typeof t&&(n=r,r=t,t={}),r&&"object"==typeof r&&(n=r,r=""),n||(n={}),lr(e,t||{},r,n.parserOptions,n.url)},parsers:It,version:"v3.5.1"};function Er(e,t,r){var n=new XMLHttpRequest;n.onreadystatechange=function(){4===n.readyState&&(200===n.status||!n.status&&n.responseText.length?t(n.responseText,r,e):Sr.error('"'+e+'" not found'))},n.onerror=function(e){return Sr.error(e)},n.open("GET",e,!0),n.send("")}function Cr(e,t){if(typeof e===c){var r=k("script"),n=document.documentElement;t&&(e+="\n//# sourceURL="+t+".js"),r.text=e,n.appendChild(r),n.removeChild(r)}}var jr=Nr.parsers;function Sr(e,i,t){if(typeof e===c){if(ue(i)&&(t=i,i=!1),/^\s* Date: Mon, 3 Sep 2018 07:58:08 +1000 Subject: [PATCH 087/730] fix #815, #816 and #817 --- CHANGELOG.md | 3 +++ pom.xml | 9 +++++++++ src/main/java/act/conf/AppConfig.java | 2 +- src/main/java/act/controller/Controller.java | 2 +- src/main/resources/asset/~act/js/jquery.ext.js | 2 +- 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19adf51c9..cb8629917 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.8.8** +* mavn pom: It shall add `.tag` file into resource filtering list #817 +* `Controller.renderHtml()` method signature error #816 +* `jquery.ext.js` - undefined error checking ajax redirect when there is no content in body #815 * API doc - support module #814 * Cannot render Excel when return value is `Map` type #813 * `java.lang.IllegalStateException`: job already registered: __act_sys__start-delay-1 #812 diff --git a/pom.xml b/pom.xml index ca469fb09..6eab0e19a 100644 --- a/pom.xml +++ b/pom.xml @@ -106,6 +106,7 @@ **/*.xml **/*.yml **/*.yaml + **/*.tag rythm/** *.flf @@ -117,6 +118,14 @@ **/*.gif **/*.png **/*.jpg + **/*.jpeg + **/*.doc + **/*.docx + **/*.xls + **/*.xlsx + **/*.ppt + **/*.pptx + **/*.pdf diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index e60613524..0f585eefc 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -1631,7 +1631,7 @@ protected T httpExternalPort(int port) { public int httpExternalPort() { if (-1 == httpExternalPort) { - httpExternalPort = get(HTTP_EXTERNAL_PORT, httpExternal() ? 80 : httpPort()); + httpExternalPort = getInteger(HTTP_EXTERNAL_PORT, httpExternal() ? 80 : httpPort()); } return httpExternalPort; } diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index a48dd50fb..8cd9d7e6d 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1159,7 +1159,7 @@ public static RenderHtml html(String msg, Object... args) { * the message format arguments * @return the result */ - public static RenderHtml renderHtml(String msg, Object args) { + public static RenderHtml renderHtml(String msg, Object ... args) { return html(msg, args); } diff --git a/src/main/resources/asset/~act/js/jquery.ext.js b/src/main/resources/asset/~act/js/jquery.ext.js index a4ffd8ad9..b9da8cd7a 100644 --- a/src/main/resources/asset/~act/js/jquery.ext.js +++ b/src/main/resources/asset/~act/js/jquery.ext.js @@ -17,7 +17,7 @@ jQuery.createWebSocket = function(path) { } var checkAjaxRedirect = function(data, testStatus, jqXHR) { - if (data.status === 278) { + if (data && data.status === 278) { window.location = data.getResponseHeader("Location"); } } From 702ccefa335128ef0b5ca987fb69ce87ab19b919 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 3 Sep 2018 09:56:35 +1000 Subject: [PATCH 088/730] fix APIbook issue introduced in module support: param info lost --- .../resources/asset/~act/apibook/endpoint_list.tag | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index 10c574158..46a9fc078 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -21,14 +21,14 @@ - { endpoint.name } - { endpoint.type } - { endpoint.required } + { name } + { type } + { required } - { endpoint.defaultValue } - N/A + { defaultValue } + N/A - { endpoint.description } + { description } From 47003773aa23b009b3774fd3e809b04d2bfecd82 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 7 Sep 2018 22:06:35 +1000 Subject: [PATCH 089/730] fix #819 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/ApiManager.java | 146 +++++++++++++++++- src/main/java/act/app/App.java | 1 + .../meta/InterceptorMethodMetaInfo.java | 4 +- .../act/inject/param/JsonDtoClassManager.java | 8 +- .../inject/param/ParamValueLoaderService.java | 2 +- .../java/act/util/ReflectedInvokerHelper.java | 55 ++++++- .../src/main/java/ghissues/Gh819.java | 31 ++++ .../src/main/resources/test/scenarios/819.yml | 12 ++ 9 files changed, 248 insertions(+), 12 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh819.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/819.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index cb8629917..f90d4d773 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Extended request handler method's param not enhanced with `@Named` annotation #819 * mavn pom: It shall add `.tag` file into resource filtering list #817 * `Controller.renderHtml()` method signature error #816 * `jquery.ext.js` - undefined error checking ajax redirect when there is no content in body #815 diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index 995d4924c..edeb20f81 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -22,7 +22,7 @@ import static act.controller.Controller.Util.renderJson; -import act.Act; +import act.*; import act.apidoc.Endpoint.ParamInfo; import act.apidoc.javadoc.*; import act.app.*; @@ -47,6 +47,9 @@ import org.osgl.logging.Logger; import org.osgl.util.*; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; import java.util.*; /** @@ -63,6 +66,139 @@ public class ApiManager extends AppServiceBase { SortedMap> moduleLookup = new TreeMap<>(); + private static final H.Request MOCK_REQ = new RequestImplBase(Act.appConfig()) { + @Override + protected String methodName() { + return "GET"; + } + + @Override + public void receiveFullBytesAndProceed(ActionContext context, RequestHandler handler) { + + } + + @Override + protected Class _impl() { + return null; + } + + @Override + public String header(String name) { + return null; + } + + @Override + public Iterable headers(String name) { + return null; + } + + @Override + public String path() { + return null; + } + + @Override + public String query() { + return null; + } + + @Override + protected String _ip() { + return null; + } + + @Override + protected void _initCookieMap() { + + } + + @Override + protected InputStream createInputStream() { + return null; + } + + @Override + public String paramVal(String name) { + return null; + } + + @Override + public String[] paramVals(String name) { + return new String[0]; + } + + @Override + public Iterable paramNames() { + return null; + } + }; + + private static final ActResponse MOCK_RESP = new ActResponse() { + @Override + protected void _setStatusCode(int sc) { + + } + + @Override + protected Class _impl() { + return null; + } + + @Override + protected OutputStream createOutputStream() { + return null; + } + + @Override + protected Output createOutput() { + return null; + } + + @Override + public H.Response contentLength(long len) { + return null; + } + + @Override + protected void _setLocale(Locale loc) { + + } + + @Override + public Locale locale() { + return null; + } + + @Override + public void addCookie(H.Cookie cookie) { + + } + + @Override + public boolean containsHeader(String name) { + return false; + } + + @Override + public H.Response header(String name, String value) { + return null; + } + + @Override + public H.Response addHeader(String name, String value) { + return null; + } + + @Override + public H.Response writeContent(ByteBuffer buffer) { + return null; + } + + @Override + public void commit() { + + } + }; public ApiManager(final App app) { super(app); @@ -72,7 +208,13 @@ public ApiManager(final App app) { app.jobManager().alongWith(SysEventId.POST_START, "compile-api-book", new Runnable() { @Override public void run() { - load(app); + ActionContext ctx = ActionContext.create(Act.app(), MOCK_REQ, MOCK_RESP); + ctx.saveLocal(); + try { + load(app); + } finally { + ActionContext.clearCurrent(); + } } }); app.router().addMapping(H.Method.GET, "/~/apibook/endpoints", new GetEndpointsHandler(this)); diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index e7cb7a03d..9caf0f528 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -610,6 +610,7 @@ public synchronized void refresh() { managedCollectionService = new ManagedCollectionService(this); I18n.classInit(this); + ReflectedInvokerHelper.classInit(this); ParamValueLoaderService.classInit(this); JodaTransformers.classInit(this); FastJsonPropertyPreFilter.classInit(this); diff --git a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java index 7d0fce89f..e9a4de782 100644 --- a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java +++ b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java @@ -82,11 +82,11 @@ public int priority() { } public Set whiteList() { - return C.set(whiteList); + return C.Set(whiteList); } public Set blackList() { - return C.set(blackList); + return C.Set(blackList); } void mergeInto(C.List list, String targetName) { diff --git a/src/main/java/act/inject/param/JsonDtoClassManager.java b/src/main/java/act/inject/param/JsonDtoClassManager.java index 3d6aea6b7..22c9655ff 100644 --- a/src/main/java/act/inject/param/JsonDtoClassManager.java +++ b/src/main/java/act/inject/param/JsonDtoClassManager.java @@ -203,7 +203,8 @@ private void extractBeanSpec(List beanSpecs, Method method, Class host if (0 == sz) { return; } - Annotation[][] annotations = method.getParameterAnnotations(); + List newSpecs = new ArrayList<>(); + Annotation[][] annotations = ReflectedInvokerHelper.requestHandlerMethodParamAnnotations(method); for (int i = 0; i < sz; ++i) { Type type = paramTypes[i]; if (type instanceof TypeVariable && !Modifier.isStatic(method.getModifiers())) { @@ -224,11 +225,12 @@ private void extractBeanSpec(List beanSpecs, Method method, Class host } String dbBindName = dbBindName(spec); if (null != dbBindName) { - beanSpecs.add(BeanSpec.of(String.class, new Annotation[0], dbBindName, injector)); + newSpecs.add(BeanSpec.of(String.class, new Annotation[0], dbBindName, injector)); } else { - beanSpecs.add(spec); + newSpecs.add(spec); } } + beanSpecs.addAll(newSpecs); } private static String dbBindName(BeanSpec spec) { diff --git a/src/main/java/act/inject/param/ParamValueLoaderService.java b/src/main/java/act/inject/param/ParamValueLoaderService.java index 2555c5b3f..61ca262ae 100644 --- a/src/main/java/act/inject/param/ParamValueLoaderService.java +++ b/src/main/java/act/inject/param/ParamValueLoaderService.java @@ -326,7 +326,7 @@ protected ParamValueLoader[] findMethodParamLoaders( return DUMB; } ParamValueLoader[] loaders = new ParamValueLoader[sz]; - Annotation[][] annotations = method.getParameterAnnotations(); + Annotation[][] annotations = ReflectedInvokerHelper.requestHandlerMethodParamAnnotations(method); for (int i = 0; i < sz; ++i) { String name = paramName(i); Type type = types[i]; diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 625dcde1e..07eb0abcb 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -21,21 +21,25 @@ */ import act.Act; -import act.app.App; -import act.app.AppServiceBase; +import act.app.*; import act.inject.util.LoadResource; import org.osgl.$; import org.osgl.inject.annotation.Configuration; +import org.osgl.mvc.annotation.*; import org.osgl.util.C; +import org.osgl.util.E; import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Field; +import java.lang.reflect.*; import java.util.*; import javax.inject.Singleton; public class ReflectedInvokerHelper { + public static void classInit(App app) { + requestHandlerMethodParamAnnotationCache = new IdentityHashMap<>(); + } + /** * If the `invokerClass` specified is singleton, or without field or all fields are * stateless, then return an instance of the invoker class. Otherwise, return null @@ -56,6 +60,49 @@ public static Object tryGetSingleton(Class invokerClass, App app) { return singleton; } + private static Set> ACTION_ANNO_TYPES = C.set( + Action.class, GetAction.class, PostAction.class, PutAction.class, + DeleteAction.class, PatchAction.class, WsAction.class + ); + + private static Map requestHandlerMethodParamAnnotationCache; + + public static Annotation[][] requestHandlerMethodParamAnnotations(Method method) { + if (null == ActionContext.current()) { + return method.getParameterAnnotations(); + } + Annotation[][] paramAnnotations = requestHandlerMethodParamAnnotationCache.get(method); + if (null == paramAnnotations) { + if (!hasActionAnnotation(method)) { + paramAnnotations = requestHandlerMethodParamAnnotations(overwrittenMethodOf(method)); + } else { + paramAnnotations = method.getParameterAnnotations(); + } + requestHandlerMethodParamAnnotationCache.put(method, paramAnnotations); + } + return paramAnnotations; + } + + public static Method overwrittenMethodOf(Method method) { + Class host = method.getDeclaringClass(); + Class base = host.getSuperclass(); + try { + return base.getMethod(method.getName(), method.getParameterTypes()); + } catch (NoSuchMethodException e) { + throw E.unexpected("Unable to find the overwritten method of " + method); + } + } + + private static boolean hasActionAnnotation(Method method) { + Annotation[] aa = method.getDeclaredAnnotations(); + for (Annotation a: aa) { + if (ACTION_ANNO_TYPES.contains(a.annotationType())) { + return true; + } + } + return false; + } + public static boolean isGlobalOrStateless(Class type) { return isGlobalOrStateless(type, new HashSet()); } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh819.java b/testapps/GHIssues/src/main/java/ghissues/Gh819.java new file mode 100644 index 000000000..549ca6ba2 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh819.java @@ -0,0 +1,31 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import act.util.LogSupport; +import org.osgl.mvc.annotation.PostAction; + +public abstract class Gh819 extends LogSupport { + + public static class Foo { + public String name; + } + + @PostAction + public Foo test(Foo foo) { + return foo; + } + + @UrlContext("819") + public static class Extended extends Gh819 { + + @JsonView + @Override + public Foo test(Foo foo) { + foo.name = "[extended]" + foo.name; + return foo; + } + } + + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/819.yml b/testapps/GHIssues/src/main/resources/test/scenarios/819.yml new file mode 100644 index 000000000..580c5c226 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/819.yml @@ -0,0 +1,12 @@ +Scenario(GH819): + description: "[819] Extended request handler method's param not enhanced with `@Named` annotation" + interactions: + - description: Test + request: + post: 819 + json: + foo: + name: foo + response: + json: + name: "[extended]foo" From f3a80ef36802d698de7ad261955af86c254ca9f5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 7 Sep 2018 22:45:19 +1000 Subject: [PATCH 090/730] #819 - fix logic error when ApiManager is exploring endpoints --- src/main/java/act/apidoc/ApiManager.java | 147 +----------------- .../java/act/util/ReflectedInvokerHelper.java | 9 +- 2 files changed, 15 insertions(+), 141 deletions(-) diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index edeb20f81..fdda6a79c 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -22,7 +22,7 @@ import static act.controller.Controller.Util.renderJson; -import act.*; +import act.Act; import act.apidoc.Endpoint.ParamInfo; import act.apidoc.javadoc.*; import act.app.*; @@ -47,10 +47,8 @@ import org.osgl.logging.Logger; import org.osgl.util.*; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; /** * Keep track endpoints defined in the system @@ -66,139 +64,11 @@ public class ApiManager extends AppServiceBase { SortedMap> moduleLookup = new TreeMap<>(); - private static final H.Request MOCK_REQ = new RequestImplBase(Act.appConfig()) { - @Override - protected String methodName() { - return "GET"; - } - - @Override - public void receiveFullBytesAndProceed(ActionContext context, RequestHandler handler) { - - } - - @Override - protected Class _impl() { - return null; - } - - @Override - public String header(String name) { - return null; - } - - @Override - public Iterable headers(String name) { - return null; - } - - @Override - public String path() { - return null; - } - - @Override - public String query() { - return null; - } - - @Override - protected String _ip() { - return null; - } - - @Override - protected void _initCookieMap() { - - } - - @Override - protected InputStream createInputStream() { - return null; - } - - @Override - public String paramVal(String name) { - return null; - } - - @Override - public String[] paramVals(String name) { - return new String[0]; - } - - @Override - public Iterable paramNames() { - return null; - } - }; - - private static final ActResponse MOCK_RESP = new ActResponse() { - @Override - protected void _setStatusCode(int sc) { + private static final AtomicBoolean IN_PROGRESS = new AtomicBoolean(false); - } - - @Override - protected Class _impl() { - return null; - } - - @Override - protected OutputStream createOutputStream() { - return null; - } - - @Override - protected Output createOutput() { - return null; - } - - @Override - public H.Response contentLength(long len) { - return null; - } - - @Override - protected void _setLocale(Locale loc) { - - } - - @Override - public Locale locale() { - return null; - } - - @Override - public void addCookie(H.Cookie cookie) { - - } - - @Override - public boolean containsHeader(String name) { - return false; - } - - @Override - public H.Response header(String name, String value) { - return null; - } - - @Override - public H.Response addHeader(String name, String value) { - return null; - } - - @Override - public H.Response writeContent(ByteBuffer buffer) { - return null; - } - - @Override - public void commit() { - - } - }; + public static boolean inProgress() { + return IN_PROGRESS.get(); + } public ApiManager(final App app) { super(app); @@ -208,12 +78,11 @@ public ApiManager(final App app) { app.jobManager().alongWith(SysEventId.POST_START, "compile-api-book", new Runnable() { @Override public void run() { - ActionContext ctx = ActionContext.create(Act.app(), MOCK_REQ, MOCK_RESP); - ctx.saveLocal(); + IN_PROGRESS.set(true); try { load(app); } finally { - ActionContext.clearCurrent(); + IN_PROGRESS.set(false); } } }); diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 07eb0abcb..64144cf37 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -21,6 +21,7 @@ */ import act.Act; +import act.apidoc.ApiManager; import act.app.*; import act.inject.util.LoadResource; import org.osgl.$; @@ -68,13 +69,14 @@ public static Object tryGetSingleton(Class invokerClass, App app) { private static Map requestHandlerMethodParamAnnotationCache; public static Annotation[][] requestHandlerMethodParamAnnotations(Method method) { - if (null == ActionContext.current()) { + if (!ApiManager.inProgress() && null == ActionContext.current()) { return method.getParameterAnnotations(); } Annotation[][] paramAnnotations = requestHandlerMethodParamAnnotationCache.get(method); if (null == paramAnnotations) { if (!hasActionAnnotation(method)) { - paramAnnotations = requestHandlerMethodParamAnnotations(overwrittenMethodOf(method)); + Method overwrittenMethod = overwrittenMethodOf(method); + paramAnnotations = overwrittenMethod == method ? method.getParameterAnnotations() : requestHandlerMethodParamAnnotations(overwrittenMethod); } else { paramAnnotations = method.getParameterAnnotations(); } @@ -89,6 +91,9 @@ public static Method overwrittenMethodOf(Method method) { try { return base.getMethod(method.getName(), method.getParameterTypes()); } catch (NoSuchMethodException e) { + if (ApiManager.inProgress()) { + return method; + } throw E.unexpected("Unable to find the overwritten method of " + method); } } From f3f78e8e87ccc9bf7525095f22a6fcc8bbea6f51 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 8 Sep 2018 07:47:06 +1000 Subject: [PATCH 091/730] fix #821; add test case for #820 and #821 --- CHANGELOG.md | 1 + src/main/java/act/controller/Controller.java | 24 ++++++++++----- .../src/main/java/ghissues/Gh820.java | 29 +++++++++++++++++++ .../src/main/java/ghissues/Gh821.java | 20 +++++++++++++ .../java/ghissues/gh820/Gh820IntService.java | 8 +++++ .../java/ghissues/gh820/Gh820Service.java | 5 ++++ .../ghissues/gh820/Gh820ServiceLoader.java | 23 +++++++++++++++ .../ghissues/gh820/Gh820StringService.java | 8 +++++ .../src/main/resources/test/scenarios/820.yml | 15 ++++++++++ .../src/main/resources/test/scenarios/821.yml | 15 ++++++++++ 10 files changed, 140 insertions(+), 8 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh820.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh821.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/Gh820IntService.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/Gh820Service.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/Gh820ServiceLoader.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/Gh820StringService.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/820.yml create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/821.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index f90d4d773..003e1356c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* When returning String is not a valid JSON, it shall be encapsulated with `result` #821 * Extended request handler method's param not enhanced with `@Named` annotation #819 * mavn pom: It shall add `.tag` file into resource filtering list #817 * `Controller.renderHtml()` method signature error #816 diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 8cd9d7e6d..aa183bc8a 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -28,23 +28,19 @@ import act.controller.meta.HandlerMethodMetaInfo; import act.data.Versioned; import act.route.Router; -import act.util.$$; -import act.util.FastJsonIterable; +import act.util.*; import act.util.JsonUtilConfig.JsonWriter; -import act.util.PropertySpec; import act.view.*; import org.osgl.$; import org.osgl.http.H; import org.osgl.mvc.result.*; import org.osgl.storage.ISObject; import org.osgl.util.*; +import org.osgl.util.Output; import java.io.File; import java.io.InputStream; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; import java.net.URL; import java.util.Map; import javax.inject.Inject; @@ -1619,7 +1615,19 @@ public static Result inferPrimitiveResult(Object v, ActionContext actionContext, if (isArray) { return RenderJSON.of(status, $.toString2(v)); } - return RenderJSON.of(status, v instanceof String ? v : C.Map("result", v)); + if (v instanceof String) { + String s = (String) v; + if (S.blank(s)) { + return RenderJSON.of(status, "{}"); + } else { + s = s.trim(); + char c = s.charAt(0); + if ('{' == c || '[' == c) { + return RenderJSON.of(status, s); + } + } + } + return RenderJSON.of(status, C.Map("result", v)); } else if (requireXML) { return RenderXML.of(status, S.concat("", S.string(v), "")); } else if (v instanceof byte[]) { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh820.java b/testapps/GHIssues/src/main/java/ghissues/Gh820.java new file mode 100644 index 000000000..8802d1530 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh820.java @@ -0,0 +1,29 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.LogSupport; +import ghissues.gh820.Gh820Service; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; + +@UrlContext("820") +public class Gh820 extends LogSupport { + + @Inject + private Gh820Service stringService; + + @Inject + private Gh820Service intService; + + @GetAction("string") + public String getString() { + return stringService.get(); + } + + @GetAction("int") + public int getInt() { + return intService.get(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh821.java b/testapps/GHIssues/src/main/java/ghissues/Gh821.java new file mode 100644 index 000000000..59501d139 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh821.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.LogSupport; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("821") +public class Gh821 extends LogSupport { + + @GetAction("invalid_json") + public String getInvalidJSON() { + return "abc"; + } + + @GetAction("valid_json") + public String getValidJSON() { + return "{\"foo\": 123}"; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820IntService.java b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820IntService.java new file mode 100644 index 000000000..3ccb138b9 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820IntService.java @@ -0,0 +1,8 @@ +package ghissues.gh820; + +public class Gh820IntService implements Gh820Service { + @Override + public Integer get() { + return 123; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820Service.java b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820Service.java new file mode 100644 index 000000000..dcd46f335 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820Service.java @@ -0,0 +1,5 @@ +package ghissues.gh820; + +public interface Gh820Service { + ENTITY_TYPE get(); +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820ServiceLoader.java b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820ServiceLoader.java new file mode 100644 index 000000000..375c57421 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820ServiceLoader.java @@ -0,0 +1,23 @@ +package ghissues.gh820; + +import org.osgl.inject.BeanSpec; +import org.osgl.inject.GenericTypedBeanLoader; +import org.osgl.util.E; + +import java.lang.reflect.Type; +import java.util.List; + +public class Gh820ServiceLoader implements GenericTypedBeanLoader { + @Override + public Gh820Service load(BeanSpec spec) { + List typeParams = spec.typeParams(); + E.illegalArgumentIf(typeParams.isEmpty(), "Expected type parameters in " + spec); + Type type = typeParams.get(0); + if (type == String.class) { + return new Gh820StringService(); + } else if (type == Integer.class) { + return new Gh820IntService(); + } + throw E.unsupport("Unsupported type: " + type); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820StringService.java b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820StringService.java new file mode 100644 index 000000000..7948a5e1a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820StringService.java @@ -0,0 +1,8 @@ +package ghissues.gh820; + +public class Gh820StringService implements Gh820Service { + @Override + public String get() { + return "abc"; + } +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/820.yml b/testapps/GHIssues/src/main/resources/test/scenarios/820.yml new file mode 100644 index 000000000..2c35862da --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/820.yml @@ -0,0 +1,15 @@ +Scenario(GH820): + description: "[820] Using generic typed injection in Controller cause `UnexpectedException`" + interactions: + - description: Access String Service + request: + get: /820/string + response: + json: + result: abc + - description: Access Int Service + request: + get: /820/int + response: + json: + result: 123 diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/821.yml b/testapps/GHIssues/src/main/resources/test/scenarios/821.yml new file mode 100644 index 000000000..9ab2084b1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/821.yml @@ -0,0 +1,15 @@ +Scenario(GH821): + description: "[821] When returning String is not a valid JSON, it shall be encapsulated with `result`" + interactions: + - description: Get invalid JSON + request: + get: /821/invalid_json + response: + json: + result: abc + - description: Get valid JSON + request: + get: /821/valid_json + response: + json: + foo: 123 From 8b215afac49915022a5d2ee0e51218f6da336d76 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 8 Sep 2018 19:40:10 +1000 Subject: [PATCH 092/730] fix #823 --- CHANGELOG.md | 1 + .../impl/ReflectedHandlerInvoker.java | 27 +++++---- testapps/GHIssues/pom.xml | 4 ++ .../src/main/java/ghissues/Gh823.java | 57 ++++++++++++++++++ .../main/java/ghissues/gh823/Gh823User.java | 14 +++++ .../src/main/resources/test/scenarios/823.yml | 59 +++++++++++++++++++ 6 files changed, 151 insertions(+), 11 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh823.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh823/Gh823User.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/823.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 003e1356c..2f7e40db4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Apply new scope for implicit transaction #823 * When returning String is not a valid JSON, it shall be encapsulated with `result` #821 * Extended request handler method's param not enhanced with `@Named` annotation #819 * mavn pom: It shall add `.tag` file into resource filtering list #817 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index a29c34027..973260247 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -845,41 +845,46 @@ private void initOutputVariables() { } private Result invoke(M handlerMetaInfo, ActionContext context, Object controller, Object[] params) { - Object result; + Object retVal; String invocationInfo = null; try { if (traceHandler) { invocationInfo = S.fmt("%s(%s)", handlerMetaInfo.fullName(), $.toString2(params)); Trace.LOGGER_HANDLER.trace(invocationInfo); } - result = null == methodAccess ? $.invokeStatic(method, params) : methodAccess.invoke(controller, handlerIndex, params); + retVal = null == methodAccess ? $.invokeStatic(method, params) : methodAccess.invoke(controller, handlerIndex, params); if (returnString && context.acceptJson()) { - result = null == result ? null : ensureValidJson(S.string(result)); + retVal = null == retVal ? null : ensureValidJson(S.string(retVal)); } - context.calcResultHashForEtag(result); + context.calcResultHashForEtag(retVal); } catch (Result r) { - result = r; + retVal = r; } catch (Exception e) { if (traceHandler) { Trace.LOGGER_HANDLER.trace(e, "error invoking %s", invocationInfo); } throw e; } + return transform(retVal, this, context); + } + + public static Result transform(Object retVal, ReflectedHandlerInvoker invoker, ActionContext context) { if (context.resp().isClosed()) { return null; } - if (null == result && handler.hasReturn() && !handler.returnTypeInfo().isResult()) { + HandlerMethodMetaInfo handlerMetaInfo = invoker.handler; + if (null == retVal && handlerMetaInfo.hasReturn() && !handlerMetaInfo.returnTypeInfo().isResult()) { // ActFramework respond 404 Not Found when // handler invoker return `null` // and there are return type of the action method signature // and the return type is **NOT** Result return ActNotFound.create(); } - boolean hasTemplate = checkTemplate(context); - if (hasTemplate && result instanceof RenderAny) { - result = RenderTemplate.INSTANCE; + boolean hasTemplate = invoker.checkTemplate(context); + if (hasTemplate && retVal instanceof RenderAny) { + retVal = RenderTemplate.INSTANCE; } - return Controller.Util.inferResult(handlerMetaInfo, result, context, hasTemplate); + return Controller.Util.inferResult(handlerMetaInfo, retVal, context, hasTemplate); } private String ensureValidJson(String result) { @@ -903,7 +908,7 @@ private String ensureValidJson(String result) { return result; } - public boolean checkTemplate(ActionContext context) { + private boolean checkTemplate(ActionContext context) { if (!context.state().isHandling()) { //we don't check template on interceptors return false; diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 58f1d5cda..a0ed3c215 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -27,6 +27,10 @@ org.actframework act-excel + + org.actframework + act-eclipselink + diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh823.java b/testapps/GHIssues/src/main/java/ghissues/Gh823.java new file mode 100644 index 000000000..4625e2f27 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh823.java @@ -0,0 +1,57 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.db.DbBind; +import act.db.jpa.JPADao; +import act.db.sql.tx.Transactional; +import act.util.LogSupport; +import act.util.PropertySpec; +import ghissues.gh823.Gh823User; +import org.osgl.$; +import org.osgl.mvc.annotation.*; + +import javax.inject.Inject; + +@UrlContext("823") +public class Gh823 extends LogSupport { + + @Inject + private JPADao userDao; + + @GetAction("users") + public Iterable list() { + return userDao.findAll(); + } + + @GetAction("users/{user}") + public Gh823User get(@DbBind Gh823User user) { + return user; + } + + @PostAction("users") + @PropertySpec("id") + public Gh823User createUser(Gh823User user) { + return userDao.save(user); + } + + @PostAction("users2") + @PropertySpec("id") + @Transactional + public Gh823User createUser2(Gh823User user) { + return userDao.save(user); + } + + @PutAction("users/{user}") + public Gh823User update(@DbBind Gh823User user, Gh823User data) { + $.merge(data).to(user); + return userDao.save(user); + } + + @PutAction("users2/{user}") + @Transactional + public Gh823User updateWithExplicitTransaction(@DbBind Gh823User user, Gh823User data) { + $.merge(data).to(user); + return userDao.save(user); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh823/Gh823User.java b/testapps/GHIssues/src/main/java/ghissues/gh823/Gh823User.java new file mode 100644 index 000000000..c77a326f6 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh823/Gh823User.java @@ -0,0 +1,14 @@ +package ghissues.gh823; + +import act.util.SimpleBean; + +import javax.persistence.*; + +@Entity(name = "user_823") +public class Gh823User implements SimpleBean { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + + public String name; +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/823.yml b/testapps/GHIssues/src/main/resources/test/scenarios/823.yml new file mode 100644 index 000000000..6d5fd66ea --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/823.yml @@ -0,0 +1,59 @@ +Scenario(GH823): + description: "[823] Apply new scope for implicit transaction" + interactions: + - description: Create an new User + request: + post: /823/users + params: + user.name: Jack Smith + response: + json: + name: + - exists: false + id: + - gte: 0 + - description: verify new user + request: + get: /823/users/${last:id} + response: + json: + name: Jack Smith + - description: Create an new User with explicit transaction + request: + post: /823/users2 + params: + user.name: Mary Potland + response: + json: + name: + - exists: false + id: + - gte: 0 + - description: verify new user created with explicit transaction + request: + get: /823/users/${last:id} + response: + json: + name: Mary Potland + - description: Update last fetched user + request: + put: /823/users/${last:id} + params: + name: Jen Smith + response: + json: + name: Jen Smith + - description: Update last operated user with explicit transaction + request: + put: /823/users2/${last:id} + params: + name: Julia Smith + response: + json: + name: Julia Smith + - description: Verify last update + request: + get: /823/users/${last:id} + response: + json: + name: Julia Smith From d8d0dfd64783856793b6a3be9760d93a09f7deca Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 10 Sep 2018 10:37:01 +1000 Subject: [PATCH 093/730] fix interceptor IllegalArgumentException issue - caused by changes done for #819 --- CHANGELOG.md | 2 +- src/main/java/act/util/ReflectedInvokerHelper.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f7e40db4..d7f3a6272 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ * Apply new scope for implicit transaction #823 * When returning String is not a valid JSON, it shall be encapsulated with `result` #821 * Extended request handler method's param not enhanced with `@Named` annotation #819 -* mavn pom: It shall add `.tag` file into resource filtering list #817 +* maven pom: It shall add `.tag` file into resource filtering list #817 * `Controller.renderHtml()` method signature error #816 * `jquery.ext.js` - undefined error checking ajax redirect when there is no content in body #815 * API doc - support module #814 diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 64144cf37..51b4bd2fb 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -63,7 +63,8 @@ public static Object tryGetSingleton(Class invokerClass, App app) { private static Set> ACTION_ANNO_TYPES = C.set( Action.class, GetAction.class, PostAction.class, PutAction.class, - DeleteAction.class, PatchAction.class, WsAction.class + DeleteAction.class, PatchAction.class, WsAction.class, + Catch.class, Before.class, After.class, Finally.class ); private static Map requestHandlerMethodParamAnnotationCache; From 136efc8b60ebf98e77337af1be424fef1a88b909 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 10 Sep 2018 11:10:42 +1000 Subject: [PATCH 094/730] Force response status not working when response type is JSON #825 --- src/main/java/act/controller/Controller.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index aa183bc8a..27d105ecb 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1794,14 +1794,14 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } // no need to check string case as it is already checked above if (v instanceof $.Visitor) { - return RenderJSON.of(($.Visitor) v); + return RenderJSON.of(status, ($.Visitor) v); } else if (v instanceof $.Func0) { - return RenderJSON.of(($.Func0) v); + return RenderJSON.of(status, ($.Func0) v); } PropertySpec.MetaInfo propertySpec = PropertySpec.MetaInfo.withCurrent(meta, context); boolean possibleLargeResponse = context.isLargeResponse(); JsonWriter jsonWriter = new JsonWriter(v, propertySpec, false, context); - return possibleLargeResponse ? RenderJSON.of(jsonWriter) : RenderJSON.of(jsonWriter.asContentProducer()); + return possibleLargeResponse ? RenderJSON.of(status, jsonWriter) : RenderJSON.of(status, jsonWriter.asContentProducer()); } else if (context.acceptXML()) { PropertySpec.MetaInfo propertySpec = PropertySpec.MetaInfo.withCurrent(meta, context); return new FilteredRenderXML(status, v, propertySpec, context); From 73d1a0c0738aef61992f2d013f725e3610f22536 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 10 Sep 2018 22:13:06 +1000 Subject: [PATCH 095/730] fix #826 and #827 --- CHANGELOG.md | 3 + .../app/FullStackAppBootstrapClassLoader.java | 16 ++--- src/main/java/act/controller/Controller.java | 29 +++++----- .../impl/ReflectedHandlerInvoker.java | 4 +- src/main/java/act/inject/param/MapLoader.java | 58 ++++++++++++------- src/main/java/act/inject/param/ParamKey.java | 2 + src/main/java/act/inject/param/ParamTree.java | 14 +++++ .../java/act/inject/param/ParamTreeNode.java | 11 ++-- src/main/java/act/util/$$.java | 46 +++++---------- .../java/testapp/model/VersionedModel.java | 10 +++- .../test/java/testapp/endpoint/ETagTest.java | 5 +- .../ByteArrayActionParameterBindingTest.java | 1 + ...peArrayActionParameterBindingTestBase.java | 1 - ...peArrayActionParameterBindingTestBase.java | 12 ++-- ...iveTypeActionParameterBindingTestBase.java | 2 - 15 files changed, 115 insertions(+), 99 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7f3a6272..4606c56d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.8.8** +* `ActionContext.allowIgnoreParamNamespace()` overlooked by `MapLoader` #827 +* Use `JSON.toJSONString()` to replace `Object.toString()` whenever it is used to render response body #826 +* Force response status not working when response type is JSON #825 * Apply new scope for implicit transaction #823 * When returning String is not a valid JSON, it shall be encapsulated with `result` #821 * Extended request handler method's param not enhanced with `@Named` annotation #819 diff --git a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java index 5f2d72b8d..af37d46a1 100644 --- a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java +++ b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java @@ -20,12 +20,11 @@ * #L% */ +import static act.util.ClassInfoRepository.canonicalName; + import act.Constants; import act.boot.BootstrapClassLoader; -import act.util.ActClassLoader; -import act.util.ClassInfoRepository; -import act.util.ClassNode; -import act.util.Jars; +import act.util.*; import org.osgl.$; import org.osgl.util.*; @@ -33,12 +32,7 @@ import java.lang.reflect.Modifier; import java.net.URL; import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static act.util.ClassInfoRepository.canonicalName; +import java.util.*; /** * This class loader is responsible for loading Act classes @@ -221,7 +215,7 @@ private void savePluginClasses() { private void saveToFile(String name, String content) { File file = new File(name); String fileContent = S.concat("#", S.string(jarsChecksum), lineSeparator, content); - IO.writeContent(fileContent, file); + IO.write(fileContent, file); } private void restoreClassInfoRegistry() { diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 27d105ecb..87a24d6ff 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -20,8 +20,6 @@ * #L% */ -import static org.osgl.http.H.Format.HTML; - import act.Act; import act.app.ActionContext; import act.conf.AppConfigKey; @@ -31,6 +29,7 @@ import act.util.*; import act.util.JsonUtilConfig.JsonWriter; import act.view.*; +import com.alibaba.fastjson.JSON; import org.osgl.$; import org.osgl.http.H; import org.osgl.mvc.result.*; @@ -1609,11 +1608,17 @@ public static Result inferResult(Result r, ActionContext actionContext) { return r; } - public static Result inferPrimitiveResult(Object v, ActionContext actionContext, boolean requireJSON, boolean requireXML, boolean isArray, boolean isDateTime) { + public static Result inferPrimitiveResult( + Object v, ActionContext actionContext, boolean requireJSON, + boolean requireXML, boolean isArray, boolean shouldUseToString) { H.Status status = actionContext.successStatus(); if (requireJSON) { if (isArray) { - return RenderJSON.of(status, $.toString2(v)); + if (byte[].class == v.getClass()) { + // otherwise it get encoded with base64 + return RenderJSON.of(JSON.toJSON(v).toString()); + } + return RenderJSON.of(status, v); } if (v instanceof String) { String s = (String) v; @@ -1638,12 +1643,9 @@ public static Result inferPrimitiveResult(Object v, ActionContext actionContext, return new RenderBinary((byte[]) v); } else { H.Format fmt = actionContext.accept(); - String s = $$.toString(v, isDateTime, isArray); - if (HTML == fmt) { - return RenderHtml.of(status, s); - } + String s = v instanceof String ? (String) v : $$.toString(v, shouldUseToString); if (fmt.isText()) { - return RenderText.of(status, fmt, s, status.toString()); + return RenderText.of(status, fmt, s); } DirectRender dr = Act.viewManager().loadDirectRender(actionContext); if (null == dr) { @@ -1776,10 +1778,10 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon return null; } Class vCls = v.getClass(); - boolean isDateTimeType = $$.isDateTimeType(vCls); - if ($.isSimpleType(vCls) || isDateTimeType) { + boolean shouldUseToString = $$.shouldUseToString(vCls); + if ($.isSimpleType(vCls) || shouldUseToString) { boolean isArray = vCls.isArray(); - return inferPrimitiveResult(v, context, requireJSON, requireXML, isArray, isDateTimeType); + return inferPrimitiveResult(v, context, requireJSON, requireXML, isArray, shouldUseToString); } else if (v instanceof InputStream) { return inferResult((InputStream) v, context); } else if (v instanceof File) { @@ -1810,8 +1812,7 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon return RenderCSV.of(status, v, propertySpec, context); } else { boolean isArray = vCls.isArray(); - PropertySpec.MetaInfo propertySpec = PropertySpec.MetaInfo.withCurrent(meta, context); - return inferPrimitiveResult(v, context, false, requireXML, isArray, isDateTimeType); + return inferPrimitiveResult(v, context, false, requireXML, isArray, shouldUseToString); } } } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 973260247..5035c8ab6 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -428,7 +428,9 @@ public Result handle(final ActionContext context) { } context.setReflectedHandlerInvoker(this); - app.eventBus().emit(new ReflectedHandlerInvokerInvoke(this, context)); + if (!context.skipEvents()) { + app.eventBus().emit(new ReflectedHandlerInvokerInvoke(this, context)); + } if (1 == fieldsAndParamsCount(context)) { context.allowIgnoreParamNamespace(); diff --git a/src/main/java/act/inject/param/MapLoader.java b/src/main/java/act/inject/param/MapLoader.java index 933373a9c..920415e25 100644 --- a/src/main/java/act/inject/param/MapLoader.java +++ b/src/main/java/act/inject/param/MapLoader.java @@ -20,6 +20,7 @@ * #L% */ +import act.app.ActionContext; import act.app.App; import act.app.data.StringValueResolverManager; import act.inject.DependencyInjector; @@ -28,9 +29,7 @@ import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.mvc.result.BadRequest; -import org.osgl.util.E; -import org.osgl.util.S; -import org.osgl.util.StringValueResolver; +import org.osgl.util.*; import java.lang.reflect.Type; import java.util.*; @@ -47,6 +46,7 @@ class MapLoader extends LogSupport implements ParamValueLoader { private final Map childLoaders = new HashMap(); private final ParamValueLoaderService manager; private final BeanSpec targetSpec; + private final boolean valTypeIsObject; MapLoader( ParamKey key, @@ -61,20 +61,25 @@ class MapLoader extends LogSupport implements ParamValueLoader { this.mapClass = mapClass; this.keyClass = BeanSpec.rawTypeOf(keyType); this.valType = valType; + this.valTypeIsObject = Object.class == valType; this.injector = injector; this.manager = manager; this.targetSpec = targetSpec; StringValueResolverManager resolverManager = App.instance().resolverManager(); BeanSpec valSpec = BeanSpec.of(valType, injector); Class valClass = valSpec.rawType(); - if (Collection.class.isAssignableFrom(valClass)) { - Class colClass = $.cast(valClass); - this.valueResolver = resolverManager.collectionResolver(colClass, (Class)valSpec.typeParams().get(0), ','); + if (!this.valTypeIsObject) { + if (Collection.class.isAssignableFrom(valClass)) { + Class colClass = $.cast(valClass); + this.valueResolver = resolverManager.collectionResolver(colClass, (Class)valSpec.typeParams().get(0), ','); + } else { + this.valueResolver = resolverManager.resolver(valClass, BeanSpec.of(valType, injector)); + } + if (null == valueResolver) { + warn("Map value type not resolvable: " + valClass.getName()); + } } else { - this.valueResolver = resolverManager.resolver(valClass, BeanSpec.of(valType, injector)); - } - if (null == valueResolver) { - warn("Map value type not resolvable: " + valClass.getName()); + valueResolver = null; } this.keyResolver = resolverManager.resolver(this.keyClass, BeanSpec.of(this.keyClass, injector)); if (null == keyResolver) { @@ -86,8 +91,13 @@ class MapLoader extends LogSupport implements ParamValueLoader { public Object load(Object bean, ActContext context, boolean noDefaultValue) { ParamTree tree = ParamValueLoaderService.ensureParamTree(context); ParamTreeNode node = tree.node(key); + ActionContext actionContext = context instanceof ActionContext ? (ActionContext) context : null; if (null == node) { - return noDefaultValue ? null : injector.get(mapClass); + if (null != actionContext && actionContext.isAllowIgnoreParamNamespace()) { + node = tree.asRootNode(); + } else { + return noDefaultValue ? null : injector.get(mapClass); + } } Map map = null == bean ? injector.get(mapClass) : (Map) bean; if (node.isList()) { @@ -100,11 +110,14 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (!elementNode.isLeaf()) { throw new BadRequest("cannot parse param: expect leaf node, found: \n%s", node.debug()); } - if (null == valueResolver) { + if (valTypeIsObject) { + map.put(i, elementNode.value()); + } else if (null == valueResolver) { throw E.unexpected("Component type not resolvable: %s", valType); - } - if (null != elementNode.value()) { - map.put(i, valueResolver.resolve(elementNode.value())); + } else { + if (null != elementNode.value()) { + map.put(i, valueResolver.resolve(elementNode.value())); + } } } } else if (node.isMap()) { @@ -117,21 +130,24 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { key = keyResolver.resolve(s); } if (child.isLeaf()) { - if (null == valueResolver) { - throw E.unexpected("Component type not resolvable: %s", valType); - } String sval = child.value(); if (null == sval) { continue; } - if (valClass != String.class) { + if (valTypeIsObject || String.class == valClass) { + if (null != actionContext && actionContext.isPathVar(s)) { + continue; + } + map.put(key, sval); + } else { + if (null == valueResolver) { + throw E.unexpected("Component type not resolvable: %s", valType); + } Object value = valueResolver.resolve(sval); if (!valClass.isInstance(value)) { throw new BadRequest("Cannot load parameter, expected type: %s, found: %s", valClass, value.getClass()); } map.put(key, value); - } else { - map.put(key, sval); } } else { ParamValueLoader childLoader = childLoader(child.key()); diff --git a/src/main/java/act/inject/param/ParamKey.java b/src/main/java/act/inject/param/ParamKey.java index fa6436174..0d1334165 100644 --- a/src/main/java/act/inject/param/ParamKey.java +++ b/src/main/java/act/inject/param/ParamKey.java @@ -31,6 +31,8 @@ */ class ParamKey { + static final ParamKey ROOT_KEY = new ParamKey(new String[0]); + private String[] seq; private int hc; private int size; diff --git a/src/main/java/act/inject/param/ParamTree.java b/src/main/java/act/inject/param/ParamTree.java index 00e6e8f77..9b847d480 100644 --- a/src/main/java/act/inject/param/ParamTree.java +++ b/src/main/java/act/inject/param/ParamTree.java @@ -36,6 +36,12 @@ class ParamTree { void build(ActContext context) { Set paramKeys = context.paramKeys(); for (String key : paramKeys) { + if ("_body".equals(key)) { + continue; + } + if ("_method".equals(key)) { + continue; + } String[] vals = context.paramVals(key); buildNode(key, vals); } @@ -69,6 +75,14 @@ ParamTreeNode node(ParamKey key) { return allNodes.get(key); } + ParamTreeNode asRootNode() { + ParamTreeNode root = ParamTreeNode.map(ParamKey.ROOT_KEY); + for (Map.Entry entry : allNodes.entrySet()) { + root.addChild(entry.getKey().name(), entry.getValue()); + } + return root; + } + private void ensureParent(ParamKey childKey, ParamTreeNode child) { ParamKey parentKey = childKey.parent(); if (null == parentKey) { diff --git a/src/main/java/act/inject/param/ParamTreeNode.java b/src/main/java/act/inject/param/ParamTreeNode.java index 1470a390d..f7e73196e 100644 --- a/src/main/java/act/inject/param/ParamTreeNode.java +++ b/src/main/java/act/inject/param/ParamTreeNode.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -31,7 +31,7 @@ class ParamTreeNode implements TreeNode { private String leafVal; private Map map; - private List list; + private List list; private ParamTreeNode(ParamKey path) { this.key = path; @@ -119,13 +119,14 @@ static ParamTreeNode leaf(ParamKey key, String value) { static ParamTreeNode map(ParamKey key) { ParamTreeNode node = new ParamTreeNode(key); - node.map = new HashMap(); + node.map = new HashMap<>(); return node; } static ParamTreeNode list(ParamKey key) { ParamTreeNode node = new ParamTreeNode(key); - node.list = new ArrayList(); + node.list = new ArrayList<>(); return node; } + } diff --git a/src/main/java/act/util/$$.java b/src/main/java/act/util/$$.java index 00ca5504b..5b6d93a04 100644 --- a/src/main/java/act/util/$$.java +++ b/src/main/java/act/util/$$.java @@ -21,24 +21,14 @@ */ import act.Act; -import act.data.JodaDateTimeCodec; -import act.data.JodaLocalDateCodec; -import act.data.JodaLocalDateTimeCodec; -import act.data.JodaLocalTimeCodec; -import org.joda.time.DateTime; -import org.joda.time.LocalDate; -import org.joda.time.LocalDateTime; -import org.joda.time.LocalTime; +import act.data.*; +import com.alibaba.fastjson.JSON; +import org.joda.time.*; import org.osgl.$; -import org.osgl.util.C; -import org.osgl.util.S; -import org.osgl.util.ValueObject; +import org.osgl.util.*; -import java.lang.reflect.Array; import java.sql.Time; -import java.util.Date; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * An extension to osgl $ class @@ -58,26 +48,12 @@ public static boolean isDateTimeType(Class type) { return dateTimeTypes.contains(type); } - public static String toString(Object v, boolean isDateTimeType, boolean isArray) { - if (isArray) { - int len = Array.getLength(v); - if (0 == len) { - return "[]"; - } - S.Buffer buf = S.buffer(); - buf.append("["); - buf.append(toString(Array.get(v, 0))); - for (int i = 1; i < len; ++i) { - buf.append(", "); - buf.append(toString(Array.get(v, i))); - } - buf.append("]"); - return buf.toString(); - } else if (isDateTimeType) { + public static String toString(Object v, boolean directToString) { + if (directToString) { ValueObject.Codec codec = codecs.get(v.getClass()); return null == codec ? v.toString() : codec.toString(v); } - return v.toString(); + return JSON.toJSONString(v); } public static String toString(Object v) { @@ -85,7 +61,11 @@ public static String toString(Object v) { return ""; } Class c = v.getClass(); - return toString(v, isDateTimeType(c), c.isArray()); + return toString(v, shouldUseToString(c)); + } + + public static boolean shouldUseToString(Class type) { + return ($.isSimpleType(type) && !type.isArray()) || isDateTimeType(type); } } diff --git a/testapp-legacy/src/main/java/testapp/model/VersionedModel.java b/testapp-legacy/src/main/java/testapp/model/VersionedModel.java index a18b76dd7..d4eeb7b33 100644 --- a/testapp-legacy/src/main/java/testapp/model/VersionedModel.java +++ b/testapp-legacy/src/main/java/testapp/model/VersionedModel.java @@ -8,19 +8,23 @@ */ public class VersionedModel implements Versioned { - private String id; + private String version; public VersionedModel() { this(S.random()); } public VersionedModel(String id) { - this.id = S.blank(id) ? S.random() : id; + this.version = S.blank(id) ? S.random() : id; + } + + public String getVersion() { + return version; } @Override public String _version() { - return id; + return version; } public static VersionedModel getNew() { diff --git a/testapp-legacy/src/test/java/testapp/endpoint/ETagTest.java b/testapp-legacy/src/test/java/testapp/endpoint/ETagTest.java index ddf08c2f9..e510d765c 100644 --- a/testapp-legacy/src/test/java/testapp/endpoint/ETagTest.java +++ b/testapp-legacy/src/test/java/testapp/endpoint/ETagTest.java @@ -1,5 +1,7 @@ package testapp.endpoint; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import org.junit.Test; import org.osgl.$; import org.osgl.mvc.result.NotModified; @@ -19,7 +21,8 @@ public void itShallReturnNotModifiedIfETagMatches() throws IOException { public String retrieveETag($.Var version) throws IOException { url("/etag"); - version.set(resp().body().string()); + JSONObject obj = JSON.parseObject(resp().body().string()); + version.set(obj.getString("version")); return resp().header("Etag"); } diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java index 3944b5e3a..297cf8491 100644 --- a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java +++ b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java @@ -34,4 +34,5 @@ protected List nonEmptyList() { private byte b(int i) { return (byte) i; } + } diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java index 5eecba116..0fb1f890d 100644 --- a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java +++ b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java @@ -1,6 +1,5 @@ package testapp.endpoint.binding.collection; -import org.junit.Ignore; import org.junit.Test; import org.osgl.util.C; import testapp.endpoint.EndPointTestContext; diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java index 9a178c102..ad36c8b15 100644 --- a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java +++ b/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java @@ -1,17 +1,15 @@ package testapp.endpoint.binding.collection; +import com.alibaba.fastjson.JSON; import org.junit.Test; import org.osgl.util.C; import org.osgl.util.Generics; -import testapp.endpoint.binding.ActionParameterBindingTestBase; import testapp.endpoint.EndPointTestContext.RequestMethod; import testapp.endpoint.ParamEncoding; +import testapp.endpoint.binding.ActionParameterBindingTestBase; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; public abstract class SimpleTypeArrayActionParameterBindingTestBase extends ActionParameterBindingTestBase { @@ -42,11 +40,11 @@ public SimpleTypeArrayActionParameterBindingTestBase() { protected abstract List nonEmptyList(); protected String expectedRespForNonEmptyList() { - return nonEmptyList().toString(); + return JSON.toJSONString(nonEmptyList()); } protected String expectedRespForNonEmptySet() { - return new TreeSet(nonEmptyList()).toString(); + return JSON.toJSONString(new TreeSet(nonEmptyList())); } protected final String e() { diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java index 2e4a06e84..f343c0f6e 100644 --- a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java +++ b/testapp-legacy/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java @@ -1,10 +1,8 @@ package testapp.endpoint.binding.single; -import org.junit.Ignore; import org.junit.Test; import org.osgl.mvc.result.BadRequest; import testapp.endpoint.EndPointTestContext; -import testapp.endpoint.binding.collection.*; public abstract class PrimitiveTypeActionParameterBindingTestBase extends SimpleTypeActionParameterBindingTestBase { protected String primitiveUrlPath; From 6abb5c9bedd811e0f58bfc3c9f64e1aa65cbf7ec Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 11 Sep 2018 16:59:27 +1000 Subject: [PATCH 096/730] #827 - fix the issue when there are nested structures in Map value; handle allowIgnoreNamespace for AdaptiveRecord binding --- src/main/java/act/app/ActionContext.java | 2 ++ .../inject/param/AdaptiveRecordLoader.java | 10 +++++++ .../act/inject/param/CollectionLoader.java | 2 +- .../java/act/inject/param/FieldLoader.java | 5 ++++ src/main/java/act/inject/param/MapLoader.java | 10 +++---- src/main/java/act/inject/param/ParamTree.java | 26 ++++++++++++------- .../param/StringValueResolverValueLoader.java | 18 ++++--------- src/main/java/act/util/ActContext.java | 7 +++++ 8 files changed, 50 insertions(+), 30 deletions(-) diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index f5a47fa83..4b7ebcefc 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -646,6 +646,8 @@ public Set paramKeys() { set.addAll(C.list(request.paramNames())); set.addAll(extraParams.keySet()); set.addAll(bodyParams().keySet()); + set.remove("_method"); + set.remove("_body"); return set; } diff --git a/src/main/java/act/inject/param/AdaptiveRecordLoader.java b/src/main/java/act/inject/param/AdaptiveRecordLoader.java index 2f515b06a..89a3b4847 100644 --- a/src/main/java/act/inject/param/AdaptiveRecordLoader.java +++ b/src/main/java/act/inject/param/AdaptiveRecordLoader.java @@ -38,6 +38,7 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { Set loadedFields = fieldLoaders.keySet(); String prefix = S.concat(bindName(), "."); Set paramKeys = context.paramKeys(); + boolean allowIgnoreNamespace = context.isAllowIgnoreParamNamespace(); for (String paramKey : paramKeys) { if (paramKey.startsWith(prefix)) { String field = S.afterFirst(paramKey, prefix); @@ -48,6 +49,15 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { } ar.putValue(field, context.paramVal(paramKey)); } + } else if (allowIgnoreNamespace) { + String field = paramKey; + if (S.notBlank(field) && !loadedFields.contains(field)) { + if (field.contains(".")) { + warn("AdaptiveRecordLoader does not support nested structure"); + continue; + } + ar.putValue(field, context.paramVal(paramKey)); + } } } return ar; diff --git a/src/main/java/act/inject/param/CollectionLoader.java b/src/main/java/act/inject/param/CollectionLoader.java index bf05476f6..b2cc4118e 100644 --- a/src/main/java/act/inject/param/CollectionLoader.java +++ b/src/main/java/act/inject/param/CollectionLoader.java @@ -83,7 +83,7 @@ public String bindName() { @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { ParamTree tree = ParamValueLoaderService.ensureParamTree(context); - ParamTreeNode node = tree.node(key); + ParamTreeNode node = tree.node(key, context); if (null == node) { return injector.get(collectionClass); } diff --git a/src/main/java/act/inject/param/FieldLoader.java b/src/main/java/act/inject/param/FieldLoader.java index 55121a644..e28b146dd 100644 --- a/src/main/java/act/inject/param/FieldLoader.java +++ b/src/main/java/act/inject/param/FieldLoader.java @@ -97,4 +97,9 @@ public void applyTo($.Func0 beanSource, ActContext context) { throw new InjectException(e); } } + + @Override + public String toString() { + return "FieldLoader[" + field.getName() + "]"; + } } diff --git a/src/main/java/act/inject/param/MapLoader.java b/src/main/java/act/inject/param/MapLoader.java index 920415e25..342c9ce34 100644 --- a/src/main/java/act/inject/param/MapLoader.java +++ b/src/main/java/act/inject/param/MapLoader.java @@ -90,14 +90,9 @@ class MapLoader extends LogSupport implements ParamValueLoader { @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { ParamTree tree = ParamValueLoaderService.ensureParamTree(context); - ParamTreeNode node = tree.node(key); - ActionContext actionContext = context instanceof ActionContext ? (ActionContext) context : null; + ParamTreeNode node = tree.node(key, context); if (null == node) { - if (null != actionContext && actionContext.isAllowIgnoreParamNamespace()) { - node = tree.asRootNode(); - } else { - return noDefaultValue ? null : injector.get(mapClass); - } + return noDefaultValue ? null : injector.get(mapClass); } Map map = null == bean ? injector.get(mapClass) : (Map) bean; if (node.isList()) { @@ -123,6 +118,7 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { } else if (node.isMap()) { Set childrenKeys = node.mapKeys(); Class valClass = BeanSpec.rawTypeOf(valType); + ActionContext actionContext = context instanceof ActionContext ? (ActionContext) context : null; for (String s : childrenKeys) { ParamTreeNode child = node.child(s); Object key = s; diff --git a/src/main/java/act/inject/param/ParamTree.java b/src/main/java/act/inject/param/ParamTree.java index 9b847d480..f28269fb4 100644 --- a/src/main/java/act/inject/param/ParamTree.java +++ b/src/main/java/act/inject/param/ParamTree.java @@ -33,15 +33,11 @@ class ParamTree { private Map allNodes = new HashMap<>(); + private ParamTreeNode rootNode; + void build(ActContext context) { Set paramKeys = context.paramKeys(); for (String key : paramKeys) { - if ("_body".equals(key)) { - continue; - } - if ("_method".equals(key)) { - continue; - } String[] vals = context.paramVals(key); buildNode(key, vals); } @@ -71,11 +67,23 @@ private void buildNode(String rawKey, String[] vals) { ensureParent(key, node); } - ParamTreeNode node(ParamKey key) { - return allNodes.get(key); + ParamTreeNode node(ParamKey key, ActContext context) { + ParamTreeNode node = allNodes.get(key); + if (null == node && context.isAllowIgnoreParamNamespace()) { + key = key.withoutNamespace(); + if (null == key) { + if (null == rootNode) { + rootNode = asRootNode(); + } + node = rootNode; + } else { + node = allNodes.get(key); + } + } + return node; } - ParamTreeNode asRootNode() { + private ParamTreeNode asRootNode() { ParamTreeNode root = ParamTreeNode.map(ParamKey.ROOT_KEY); for (Map.Entry entry : allNodes.entrySet()) { root.addChild(entry.getKey().name(), entry.getValue()); diff --git a/src/main/java/act/inject/param/StringValueResolverValueLoader.java b/src/main/java/act/inject/param/StringValueResolverValueLoader.java index 9015defef..8a4fca0b3 100644 --- a/src/main/java/act/inject/param/StringValueResolverValueLoader.java +++ b/src/main/java/act/inject/param/StringValueResolverValueLoader.java @@ -47,6 +47,9 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { ParamTree paramTree = ParamValueLoaderService.paramTree(); if (null != paramTree) { return load(paramTree, context); + } else if (context instanceof ActionContext && ((ActionContext) context).isAllowIgnoreParamNamespace()) { + paramTree = ParamValueLoaderService.ensureParamTree(context); + return load(paramTree, context); } HttpRequestParamEncode encode = encodeShare.get(); if (null == encode) { @@ -76,20 +79,9 @@ private Object load(ActContext context, HttpRequestParamEncode encode) { } private Object load(ParamTree tree, ActContext context) { - ParamTreeNode node = tree.node(paramKey); + ParamTreeNode node = tree.node(paramKey, context); if (null == node) { - if (context instanceof ActionContext) { - ActionContext actx = (ActionContext) context; - if (actx.isAllowIgnoreParamNamespace()) { - ParamKey withoutNamespace = paramKey.withoutNamespace(); - if (null != withoutNamespace) { - node = tree.node(withoutNamespace); - } - } - } - if (null == node) { - return null; - } + return null; } if (!node.isLeaf()) { throw E.unexpected("Expect leaf node, found: \n%s", node.debug()); diff --git a/src/main/java/act/util/ActContext.java b/src/main/java/act/util/ActContext.java index f29c233ba..48c878d30 100644 --- a/src/main/java/act/util/ActContext.java +++ b/src/main/java/act/util/ActContext.java @@ -244,6 +244,8 @@ public interface ActContext extends ParamValueProvi boolean isDisableCircularReferenceDetect(); + boolean isAllowIgnoreParamNamespace(); + interface Listener { void onDestroy(ActContext context); @@ -679,6 +681,11 @@ public ConstraintViolation violation(String property) { return this.violations.get(property); } + @Override + public boolean isAllowIgnoreParamNamespace() { + return false; + } + public void setJobId(String jobId) { this.jobId = jobId; app().jobManager().setJobProgressGauge(jobId, progress()); From 0b30dc2e14c8cf560bdb0187e815fd4d0e7b29a6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 12 Sep 2018 22:17:20 +1000 Subject: [PATCH 097/730] fix #820 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/Endpoint.java | 2 +- .../src/main/java/ghissues/Gh820.java | 25 ++++++------------- .../java/ghissues/gh820/BaseController.java | 14 +++++++++++ .../main/java/ghissues/gh820/BaseService.java | 7 ++++++ .../java/ghissues/gh820/Gh820IntService.java | 8 ------ .../java/ghissues/gh820/Gh820Service.java | 5 ---- .../ghissues/gh820/Gh820ServiceLoader.java | 23 ----------------- .../ghissues/gh820/Gh820StringService.java | 8 ------ .../java/ghissues/gh820/IntegerService.java | 12 +++++++++ .../src/main/resources/test/scenarios/820.yml | 15 +++++------ 11 files changed, 48 insertions(+), 72 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/BaseController.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/BaseService.java delete mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/Gh820IntService.java delete mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/Gh820Service.java delete mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/Gh820ServiceLoader.java delete mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/Gh820StringService.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh820/IntegerService.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 4606c56d1..f5edf8a4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * Force response status not working when response type is JSON #825 * Apply new scope for implicit transaction #823 * When returning String is not a valid JSON, it shall be encapsulated with `result` #821 +* Using generic typed injection in Controller cause `UnexpectedException` when start up #820 * Extended request handler method's param not enhanced with `@Named` annotation #819 * maven pom: It shall add `.tag` file into resource filtering list #817 * `Controller.renderHtml()` method signature error #816 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 6434c4b26..c198baa3b 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -331,7 +331,7 @@ private void explore(RequestHandler handler) { this.id = id(controllerClass, method); Type returnType = method.getGenericReturnType(); Map typeParamLookup = C.Map(); - if (controllerClass != method.getDeclaringClass()) { + if (controllerClass.getGenericSuperclass() instanceof ParameterizedType) { typeParamLookup = Generics.buildTypeParamImplLookup(controllerClass); } returnSample = void.class == returnType ? null : generateSampleJson(BeanSpec.of(returnType, null, Act.injector(), typeParamLookup), typeParamLookup); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh820.java b/testapps/GHIssues/src/main/java/ghissues/Gh820.java index 8802d1530..9cc39c2ba 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh820.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh820.java @@ -1,29 +1,18 @@ package ghissues; import act.controller.annotation.UrlContext; -import act.util.LogSupport; -import ghissues.gh820.Gh820Service; +import ghissues.gh820.BaseController; +import ghissues.gh820.IntegerService; import org.osgl.mvc.annotation.GetAction; -import javax.inject.Inject; +import java.util.List; @UrlContext("820") -public class Gh820 extends LogSupport { +public class Gh820 extends BaseController { - @Inject - private Gh820Service stringService; - - @Inject - private Gh820Service intService; - - @GetAction("string") - public String getString() { - return stringService.get(); - } - - @GetAction("int") - public int getInt() { - return intService.get(); + @GetAction + public List get() { + return service().produceList(); } } diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/BaseController.java b/testapps/GHIssues/src/main/java/ghissues/gh820/BaseController.java new file mode 100644 index 000000000..2890cf17c --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/BaseController.java @@ -0,0 +1,14 @@ +package ghissues.gh820; + +import act.util.LogSupport; + +import javax.inject.Inject; + +public class BaseController> extends LogSupport { + @Inject + private SERVICE service; + + protected SERVICE service() { + return service; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/BaseService.java b/testapps/GHIssues/src/main/java/ghissues/gh820/BaseService.java new file mode 100644 index 000000000..54d0f7f9b --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/BaseService.java @@ -0,0 +1,7 @@ +package ghissues.gh820; + +import java.util.List; + +public interface BaseService { + List produceList(); +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820IntService.java b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820IntService.java deleted file mode 100644 index 3ccb138b9..000000000 --- a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820IntService.java +++ /dev/null @@ -1,8 +0,0 @@ -package ghissues.gh820; - -public class Gh820IntService implements Gh820Service { - @Override - public Integer get() { - return 123; - } -} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820Service.java b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820Service.java deleted file mode 100644 index dcd46f335..000000000 --- a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820Service.java +++ /dev/null @@ -1,5 +0,0 @@ -package ghissues.gh820; - -public interface Gh820Service { - ENTITY_TYPE get(); -} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820ServiceLoader.java b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820ServiceLoader.java deleted file mode 100644 index 375c57421..000000000 --- a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820ServiceLoader.java +++ /dev/null @@ -1,23 +0,0 @@ -package ghissues.gh820; - -import org.osgl.inject.BeanSpec; -import org.osgl.inject.GenericTypedBeanLoader; -import org.osgl.util.E; - -import java.lang.reflect.Type; -import java.util.List; - -public class Gh820ServiceLoader implements GenericTypedBeanLoader { - @Override - public Gh820Service load(BeanSpec spec) { - List typeParams = spec.typeParams(); - E.illegalArgumentIf(typeParams.isEmpty(), "Expected type parameters in " + spec); - Type type = typeParams.get(0); - if (type == String.class) { - return new Gh820StringService(); - } else if (type == Integer.class) { - return new Gh820IntService(); - } - throw E.unsupport("Unsupported type: " + type); - } -} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820StringService.java b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820StringService.java deleted file mode 100644 index 7948a5e1a..000000000 --- a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820StringService.java +++ /dev/null @@ -1,8 +0,0 @@ -package ghissues.gh820; - -public class Gh820StringService implements Gh820Service { - @Override - public String get() { - return "abc"; - } -} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/IntegerService.java b/testapps/GHIssues/src/main/java/ghissues/gh820/IntegerService.java new file mode 100644 index 000000000..baafcda6c --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/IntegerService.java @@ -0,0 +1,12 @@ +package ghissues.gh820; + +import org.osgl.util.C; + +import java.util.List; + +public class IntegerService implements BaseService { + @Override + public List produceList() { + return C.list(1, 2, 3); + } +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/820.yml b/testapps/GHIssues/src/main/resources/test/scenarios/820.yml index 2c35862da..527d4c1d2 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/820.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/820.yml @@ -1,15 +1,12 @@ Scenario(GH820): description: "[820] Using generic typed injection in Controller cause `UnexpectedException`" interactions: - - description: Access String Service + - description: Test request: - get: /820/string + get: /820 response: json: - result: abc - - description: Access Int Service - request: - get: /820/int - response: - json: - result: 123 + size: 3 + 0: 1 + 1: 2 + 2: 3 From 5a3af4d364a14929de56d65fc04f15a3b505313a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 13 Sep 2018 08:44:32 +1000 Subject: [PATCH 098/730] fix #829 --- CHANGELOG.md | 1 + .../act/annotations/DownloadFilename.java | 37 +++++ src/main/java/act/app/ActionContext.java | 157 +++++++++++++----- .../impl/ReflectedHandlerInvoker.java | 14 +- src/main/java/act/test/Interaction.java | 7 +- src/main/java/act/test/ResponseSpec.java | 7 +- src/main/java/act/test/Scenario.java | 17 +- src/main/java/act/view/RenderCSV.java | 5 +- .../src/main/java/ghissues/Gh829.java | 42 +++++ .../src/main/resources/test/scenarios/829.yml | 17 ++ 10 files changed, 247 insertions(+), 57 deletions(-) create mode 100644 src/main/java/act/annotations/DownloadFilename.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh829.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/829.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index f5edf8a4f..2b8e6158a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Allow app developer to specify download file name #829 * `ActionContext.allowIgnoreParamNamespace()` overlooked by `MapLoader` #827 * Use `JSON.toJSONString()` to replace `Object.toString()` whenever it is used to render response body #826 * Force response status not working when response type is JSON #825 diff --git a/src/main/java/act/annotations/DownloadFilename.java b/src/main/java/act/annotations/DownloadFilename.java new file mode 100644 index 000000000..56bf49d26 --- /dev/null +++ b/src/main/java/act/annotations/DownloadFilename.java @@ -0,0 +1,37 @@ +package act.annotations; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Mark on a request handler method to specify the download filename. + * + * @see act.app.ActionContext#downloadFileName(String) + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface DownloadFilename { + /** + * The download filename without suffix. + */ + String value(); +} diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 4b7ebcefc..b9fddfaa6 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -116,6 +116,7 @@ public class ActionContext extends ActContext.Base implements Des private int resultHash = Integer.MIN_VALUE; private PropertySpec.MetaInfo propSpec; private boolean suppressJsonDateFormat; + private String attachmentName; // see https://github.com/actframework/actframework/issues/492 public String encodedSessionToken; @@ -123,33 +124,43 @@ public class ActionContext extends ActContext.Base implements Des // -- replace attributres with fields -- perf tune // -- ATTR_CSRF_PREFETCHED private String csrfPrefetched; + public void setCsrfPrefetched(String csrf) { csrfPrefetched = csrf; } + public String csrfPrefetched() { return csrfPrefetched; } + public void clearCsrfPrefetched() { csrfPrefetched = null; } + // -- ATTR_WAS_UNAUTHENTICATED private boolean wasUnauthenticated; + public boolean wasUnauthenticated() { return wasUnauthenticated; } + public void setWasUnauthenticated() { wasUnauthenticated = true; } + public void clearWasUnauthenticated() { wasUnauthenticated = false; } + // -- ATTR_HANDLER // replaced with field handler // -- ATTR_RESULT private Result result; + public Result result() { return result; } + public void setResult(Result result) { this.result = result; } @@ -240,6 +251,7 @@ public H.Session session(String key, String value) { /** * Returns HTTP session's id + * * @return HTTP session id */ public String sessionId() { @@ -277,19 +289,45 @@ private String processedUrl() { } public String attachmentName() { - String s = processedUrl; - if (s.contains("/")) { - s = S.cut(s).afterLast("/"); - } else { - s = methodPath(); - if (s.contains(".")) { - s = S.cut(s).afterLast("."); + if (null == attachmentName) { + String s = processedUrl(); + if (s.contains("/")) { + s = S.cut(s).afterLast("/"); + } else { + s = methodPath(); + if (s.contains(".")) { + s = S.cut(s).afterLast("."); + } } + attachmentName = s; } - return s + "." + accept().name(); + return attachmentName + "." + accept().name(); + } + + /** + * Set download attachment name. This is used when response has + * `Content-Disposition` header and the type is `attachment`. + * + * Note developer shall **NOT** add suffix to the filename, instead + * the framework will automatically append suffix based on the + * response content-type. E.g. if the response content type is + * `text/csv`, it will append `.csv` to the name, while when the + * content type is `application/vnd.ms-excel`, framework will append + * `.xls` to the filename. + * + * @param filename + * the filename without suffix + * @return this action context + */ + public ActionContext downloadFileName(String filename) { + this.attachmentName = filename; + return this; } public String attachmentName(URL url) { + if (null != attachmentName) { + return attachmentName; + } String path = url.getPath(); String name = path.contains("/") ? S.cut(path).afterLast("/") : path; if (!name.contains(".")) { @@ -299,6 +337,9 @@ public String attachmentName(URL url) { } public String attachmentName(File file) { + if (null != attachmentName) { + return attachmentName; + } String path = file.getName(); String name = path.contains("/") ? S.cut(path).afterLast("/") : path; if (!name.contains(".")) { @@ -452,11 +493,11 @@ public UrlPath urlPath() { * 2. the request method must be `GET`. * * @param url - * the url template + * the url template * @param args - * the url argument + * the url argument */ - public void forward(String url, Object ... args) { + public void forward(String url, Object... args) { E.illegalArgumentIfNot(url.startsWith("/"), "forward URL must starts with single '/'"); E.illegalArgumentIf(url.startsWith("//"), "forward URL must starts with single `/`"); E.unexpectedIfNot(H.Method.GET == req().method(), "forward only support on HTTP GET request"); @@ -570,7 +611,9 @@ public String portId() { return router().portId(); } - public int port() {return router().port(); } + public int port() { + return router().port(); + } public UserAgent userAgent() { if (null == ua) { @@ -774,7 +817,8 @@ public Result nullValueResult() { public Result nullValueResultIgnoreRenderArgs() { if (null != forceResponseStatus) { - return new Result(forceResponseStatus){}; + return new Result(forceResponseStatus) { + }; } else { if (req().method() == H.Method.POST) { H.Format accept = accept(); @@ -820,9 +864,8 @@ public void disableCORS() { * * otherwise use `text/html` * * @param result - * the result used to check if it is error result - * @return - * this `ActionContext`. + * the result used to check if it is error result + * @return this `ActionContext`. */ public ActionContext applyContentType(Result result) { if (!result.status().isError()) { @@ -927,7 +970,8 @@ private void applyGlobalCorsSetting() { * Called by bytecode enhancer to set the name list of the render arguments that is update * by the enhancer * - * @param names the render argument names separated by "," + * @param names + * the render argument names separated by "," * @return this AppContext */ public ActionContext __appRenderArgNames(String names) { @@ -952,7 +996,8 @@ public Object __controllerInstance(String className) { * current session id when fetching the cached object * * @param key - * @param the object type + * @param + * the object type * @return the cached object */ public T cached(String key) { @@ -968,8 +1013,10 @@ public T cached(String key) { * Add an object into cache by key. The key will be used in conjunction with session id if * there is a session instance * - * @param key the key to index the object within the cache - * @param obj the object to be cached + * @param key + * the key to index the object within the cache + * @param obj + * the object to be cached */ public void cache(String key, Object obj) { H.Session sess = session(); @@ -983,9 +1030,12 @@ public void cache(String key, Object obj) { /** * Add an object into cache by key with expiration time specified * - * @param key the key to index the object within the cache - * @param obj the object to be cached - * @param expiration the seconds after which the object will be evicted from the cache + * @param key + * the key to index the object within the cache + * @param obj + * the object to be cached + * @param expiration + * the seconds after which the object will be evicted from the cache */ public void cache(String key, Object obj, int expiration) { H.Session session = this.session; @@ -999,8 +1049,10 @@ public void cache(String key, Object obj, int expiration) { /** * Add an object into cache by key and expired after one hour * - * @param key the key to index the object within the cache - * @param obj the object to be cached + * @param key + * the key to index the object within the cache + * @param obj + * the object to be cached */ public void cacheForOneHour(String key, Object obj) { cache(key, obj, 60 * 60); @@ -1009,8 +1061,10 @@ public void cacheForOneHour(String key, Object obj) { /** * Add an object into cache by key and expired after half hour * - * @param key the key to index the object within the cache - * @param obj the object to be cached + * @param key + * the key to index the object within the cache + * @param obj + * the object to be cached */ public void cacheForHalfHour(String key, Object obj) { cache(key, obj, 30 * 60); @@ -1019,8 +1073,10 @@ public void cacheForHalfHour(String key, Object obj) { /** * Add an object into cache by key and expired after 10 minutes * - * @param key the key to index the object within the cache - * @param obj the object to be cached + * @param key + * the key to index the object within the cache + * @param obj + * the object to be cached */ public void cacheForTenMinutes(String key, Object obj) { cache(key, obj, 10 * 60); @@ -1029,8 +1085,10 @@ public void cacheForTenMinutes(String key, Object obj) { /** * Add an object into cache by key and expired after one minute * - * @param key the key to index the object within the cache+ - * @param obj the object to be cached + * @param key + * the key to index the object within the cache+ + * @param obj + * the object to be cached */ public void cacheForOneMinute(String key, Object obj) { cache(key, obj, 60); @@ -1039,7 +1097,8 @@ public void cacheForOneMinute(String key, Object obj) { /** * Evict cached object * - * @param key the key indexed the cached object to be evicted + * @param key + * the key indexed the cached object to be evicted */ public void evictCache(String key) { H.Session sess = session(); @@ -1107,7 +1166,9 @@ public void startHandling() { /** * Update the context session to mark a user logged in - * @param username the username + * + * @param username + * the username */ public void login(String username) { session().put(config().sessionKeyUsername(), username); @@ -1115,8 +1176,9 @@ public void login(String username) { /** * Login the user and redirect back to original URL + * * @param username - * the username + * the username */ public void loginAndRedirectBack(String username) { login(username); @@ -1128,9 +1190,9 @@ public void loginAndRedirectBack(String username) { * original URL found then redirect to `defaultLandingUrl`. * * @param username - * The username + * The username * @param defaultLandingUrl - * the URL to be redirected if original URL not found + * the URL to be redirected if original URL not found */ public void loginAndRedirectBack(String username, String defaultLandingUrl) { login(username); @@ -1139,10 +1201,11 @@ public void loginAndRedirectBack(String username, String defaultLandingUrl) { /** * Login the user and redirect to specified URL + * * @param username - * the username + * the username * @param url - * the URL to be redirected to + * the URL to be redirected to */ public void loginAndRedirect(String username, String url) { login(username); @@ -1186,11 +1249,11 @@ public void resolve() { public void proceedWithHandler(RequestHandler handler) { /** * TODO: fix Dalian-Dong issue - if (requireBodyParsing) { - ((RequestImplBase) req()).receiveFullBytesAndProceed(this, handler); - } else { - handler.handle(this); - } + if (requireBodyParsing) { + ((RequestImplBase) req()).receiveFullBytesAndProceed(this, handler); + } else { + handler.handle(this); + } */ handler.handle(this); } @@ -1408,7 +1471,7 @@ private SessionManager sessionManager() { return sessionManager; } -// private void dissolveSession() { + // private void dissolveSession() { // Cookie c = Act.sessionManager().dissolveSession(this); // if (null != c) { // config().sessionMapper().serializeSession(c, this); @@ -1448,9 +1511,11 @@ public enum State { INTERCEPTING, HANDLING, DESTROYED; + public boolean isHandling() { return this == HANDLING; } + public boolean isIntercepting() { return this == INTERCEPTING; } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 5035c8ab6..e118c3b53 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -22,8 +22,7 @@ import act.Act; import act.Trace; -import act.annotations.LargeResponse; -import act.annotations.SmallResponse; +import act.annotations.*; import act.app.ActionContext; import act.app.App; import act.app.AppClassLoader; @@ -165,6 +164,8 @@ public void visit(H.Format format) throws $.Break { private boolean fullJsonStringCheckFailure; // See https://github.com/actframework/actframework/issues/797 private boolean suppressJsonDateFormat; + // see https://github.com/actframework/actframework/issues/829 + private String downloadFilename; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -299,6 +300,11 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { forceResponseContentType = contentType.value().format(); } + DownloadFilename downloadFilename = method.getAnnotation(DownloadFilename.class); + if (null != downloadFilename) { + this.downloadFilename = downloadFilename.value(); + } + // method annotation takes priority of class annotation if (null != method.getAnnotation(JsonView.class)) { forceResponseContentType = H.MediaType.JSON.format(); @@ -427,6 +433,10 @@ public Result handle(final ActionContext context) { context.enableCircularReferenceDetect(); } + if (null != downloadFilename) { + context.downloadFileName(downloadFilename); + } + context.setReflectedHandlerInvoker(this); if (!context.skipEvents()) { app.eventBus().emit(new ReflectedHandlerInvokerInvoke(this, context)); diff --git a/src/main/java/act/test/Interaction.java b/src/main/java/act/test/Interaction.java index e85f21293..3f2312468 100644 --- a/src/main/java/act/test/Interaction.java +++ b/src/main/java/act/test/Interaction.java @@ -168,7 +168,12 @@ private void verifyHeaders(Response resp) { private void verifyBody(Response rs) throws Exception { if (null != response && S.notBlank(response.checksum)) { - Scenario.get().verifyDownload(rs, response.checksum); + Scenario.get().verifyDownloadChecksum(rs, response.checksum); + if (S.notBlank(response.downloadFilename)) { + Scenario.get().verifyDownloadFilename(rs, response.downloadFilename); + } + } else if (null != response && S.notBlank(response.downloadFilename)) { + Scenario.get().verifyDownloadFilename(rs, response.downloadFilename); } else { String bodyString = S.string(rs.body().string()).trim(); Scenario.get().verifyBody(bodyString, response); diff --git a/src/main/java/act/test/ResponseSpec.java b/src/main/java/act/test/ResponseSpec.java index 3577fae10..eb70e3166 100644 --- a/src/main/java/act/test/ResponseSpec.java +++ b/src/main/java/act/test/ResponseSpec.java @@ -23,6 +23,7 @@ import com.alibaba.fastjson.JSON; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; +import org.osgl.util.S; import java.util.LinkedHashMap; @@ -34,6 +35,7 @@ public class ResponseSpec implements InteractionPart { public LinkedHashMap json = new LinkedHashMap<>(); public LinkedHashMap headers = new LinkedHashMap<>(); public String checksum; + public String downloadFilename; @Override public void validate(Interaction interaction) throws UnexpectedException { @@ -61,7 +63,10 @@ private void checkForEmpty(Interaction interaction) { if (!headers.isEmpty()) { return; } - if (null != checksum) { + if (S.notBlank(checksum)) { + return; + } + if (S.notBlank(downloadFilename)) { return; } throw new UnexpectedException("Empty response spec found in interaction[%s]", interaction); diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 6712ef05a..8f33b2c4f 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -547,18 +547,29 @@ private synchronized CookieStore cookieStore() { return cookieStore; } - void verifyDownload(Response response, String checksum) { - Object o = cached(checksum); + void verifyDownloadChecksum(Response response, String checksumExpected) { + Object o = cached(checksumExpected); if (null == o) { o = cached("checksum-last"); } if (null == o) { - o = checksum; + o = checksumExpected; } String downloadChecksum = IO.checksum(response.body().byteStream()); errorIfNot($.eq(downloadChecksum, o), "Download checksum not match"); } + void verifyDownloadFilename(Response response, String filenameExpected) { + String header = response.header("Content-Disposition"); + // header should be something like: attachment; filename="postcodes.xls" + errorIf(S.isBlank(header), "No Content-Disposition header found"); + int pos = header.indexOf('"'); + errorIf(pos < 0, "Content-Disposition header does not have filename specified: " + header); + String filename = header.substring(pos + 1); + filename = filename.substring(0, filename.length() - 1); // strip off last `"` + errorIfNot(S.eq(filenameExpected, filename), "Download filename[%s] not match expected value[%s]", filename, filenameExpected); + } + void verifyBody(String bodyString, ResponseSpec spec) { lastData.set(bodyString); if (null == spec) { diff --git a/src/main/java/act/view/RenderCSV.java b/src/main/java/act/view/RenderCSV.java index 80e76dd05..f0f2f70fb 100644 --- a/src/main/java/act/view/RenderCSV.java +++ b/src/main/java/act/view/RenderCSV.java @@ -22,7 +22,6 @@ import act.app.ActionContext; import act.cli.view.CliView; -import act.route.UrlPath; import act.util.ActContext; import act.util.PropertySpec; import org.osgl.$; @@ -118,9 +117,7 @@ private static void render(Writer writer, Object v, PropertySpec.MetaInfo spec, private static void setDownloadHeader(ActContext context) { if (context instanceof ActionContext) { ActionContext ctx = (ActionContext) context; - UrlPath path = ctx.urlPath(); - String fileName = S.concat(S.underscore(path.lastPart()), ".csv"); - ctx.resp().contentDisposition(fileName, false); + ctx.resp().contentDisposition(ctx.attachmentName(), false); } } } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh829.java b/testapps/GHIssues/src/main/java/ghissues/Gh829.java new file mode 100644 index 000000000..adddacbd6 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh829.java @@ -0,0 +1,42 @@ +package ghissues; + +import act.annotations.DownloadFilename; +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import act.inject.param.NoBind; +import act.job.OnAppStart; +import act.util.LogSupport; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.S; + +import java.util.ArrayList; +import java.util.List; + +@UrlContext("829") +public class Gh829 extends LogSupport { + + public static class Foo { + public String name = S.random(); + } + + @NoBind + private List foos; + + @OnAppStart + public void prepareData() { + foos = new ArrayList<>(); + for (int i = 0; i < 10; ++i) { + foos.add(new Foo()); + } + } + + @GetAction + @DownloadFilename("foo") + public List testStatic(ActionContext context, String nonce) { + if (S.notBlank(nonce)) { + context.downloadFileName("foo-" + nonce); + } + return foos; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/829.yml b/testapps/GHIssues/src/main/resources/test/scenarios/829.yml new file mode 100644 index 000000000..4ae2f063d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/829.yml @@ -0,0 +1,17 @@ +Scenario(GH829): + description: "[829] Allow app developer to specify download file name" + interactions: + - description: test static filename setting by `@DownloadFilename` annotation + request: + accept: text/csv + get: 829 + response: + downloadFilename: foo.csv + - description: test dynamic filename setting by `ActionContext.downloadFilename(String)` API + request: + accept: text/csv + get: 829 + params: + nonce: 1 + response: + downloadFilename: foo-1.csv From edd200ffae4685538c7a22c20db8c65ac7a9120f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 15 Sep 2018 06:04:30 +1000 Subject: [PATCH 099/730] fix Optimise `LogSupport` for `DestroyableBase` #833 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 2 +- src/main/java/act/app/App.java | 2 +- src/main/java/act/app/AppHolderBase.java | 4 +- src/main/java/act/cli/CliSession.java | 21 ++-- src/main/java/act/conf/Config.java | 8 +- .../meta/ControllerClassMetaInfoManager.java | 14 ++- .../meta/HandlerMethodMetaInfo.java | 11 +-- .../meta/InterceptorMethodMetaInfo.java | 4 +- .../controller/ExceptionInterceptor.java | 2 +- .../handler/builtin/controller/Handler.java | 4 + .../impl/ReflectedHandlerInvoker.java | 4 +- src/main/java/act/job/Job.java | 8 +- .../act/job/meta/JobClassMetaInfoManager.java | 15 ++- .../mail/meta/MailerClassMetaInfoManager.java | 12 +-- .../java/act/session/DefaultSessionCodec.java | 16 +--- src/main/java/act/util/ActContext.java | 12 +-- .../act/util/AppCodeScannerPluginManager.java | 9 +- src/main/java/act/util/DestroyableBase.java | 6 +- .../act/util/LogSupportedDestroyableBase.java | 96 +++++++++++++++++++ src/main/java/act/util/SingletonBase.java | 2 +- testapps/GHIssues/pom.xml | 5 + .../src/main/java/ghissues/Gh830.java | 31 ++++++ .../src/main/java/ghissues/Gh832.java | 14 +++ 24 files changed, 217 insertions(+), 86 deletions(-) create mode 100644 src/main/java/act/util/LogSupportedDestroyableBase.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh830.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh832.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b8e6158a..7f285b5ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Optimise `LogSupport` for `DestroyableBase` #833 * Allow app developer to specify download file name #829 * `ActionContext.allowIgnoreParamNamespace()` overlooked by `MapLoader` #827 * Use `JSON.toJSONString()` to replace `Object.toString()` whenever it is used to render response body #826 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index b9fddfaa6..4e3a64e36 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -167,7 +167,7 @@ public void setResult(Result result) { @Inject private ActionContext(App app, H.Request request, ActResponse response) { - super(app, true); + super(app); E.NPE(app, request, response); request.context(this); response.context(this); diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 9caf0f528..be790a55a 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -96,7 +96,7 @@ /** * {@code App} represents an application that is deployed in a Act container */ -public class App extends DestroyableBase { +public class App extends LogSupportedDestroyableBase { public interface HotReloadListener { void preHotReload(); diff --git a/src/main/java/act/app/AppHolderBase.java b/src/main/java/act/app/AppHolderBase.java index 5c7ace5d4..ac44a4d26 100644 --- a/src/main/java/act/app/AppHolderBase.java +++ b/src/main/java/act/app/AppHolderBase.java @@ -22,10 +22,10 @@ import act.Act; import act.Destroyable; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.$; -public abstract class AppHolderBase extends DestroyableBase implements AppHolder, Destroyable { +public abstract class AppHolderBase extends LogSupportedDestroyableBase implements AppHolder, Destroyable { private App app; diff --git a/src/main/java/act/cli/CliSession.java b/src/main/java/act/cli/CliSession.java index 03dfd402b..f20d69026 100644 --- a/src/main/java/act/cli/CliSession.java +++ b/src/main/java/act/cli/CliSession.java @@ -21,9 +21,7 @@ */ import act.Destroyable; -import act.app.ActionContext; -import act.app.App; -import act.app.CliServer; +import act.app.*; import act.cli.builtin.IterateCursor; import act.cli.event.CliSessionStart; import act.cli.event.CliSessionTerminate; @@ -33,21 +31,22 @@ import act.util.DestroyableBase; import jline.console.ConsoleReader; import org.osgl.$; +import org.osgl.logging.LogManager; +import org.osgl.logging.Logger; import org.osgl.util.IO; import org.osgl.util.S; -import javax.enterprise.context.ApplicationScoped; -import java.io.IOException; -import java.io.InterruptedIOException; -import java.io.OutputStream; -import java.io.PrintWriter; +import java.io.*; import java.net.Socket; import java.net.SocketException; import java.util.HashMap; import java.util.Map; +import javax.enterprise.context.ApplicationScoped; public class CliSession extends DestroyableBase implements Runnable { + private static final Logger LOGGER = LogManager.get(CliSession.class); + private String id; private CliServer server; protected App app; @@ -195,11 +194,11 @@ public void run() { } } } catch (InterruptedIOException e) { - logger.info("session thread interrupted"); + LOGGER.info("session thread interrupted"); } catch (SocketException e) { - logger.error(e.getMessage()); + LOGGER.error(e.getMessage()); } catch (Exception e) { - logger.error(e, "Error processing cli session"); + LOGGER.error(e, "Error processing cli session"); } finally { if (null != server) { server.remove(this); diff --git a/src/main/java/act/conf/Config.java b/src/main/java/act/conf/Config.java index de3b5ca49..14b7ee00d 100644 --- a/src/main/java/act/conf/Config.java +++ b/src/main/java/act/conf/Config.java @@ -20,21 +20,19 @@ * #L% */ -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.$; import org.osgl.exception.ConfigurationException; import org.osgl.exception.UnexpectedNewInstanceException; import org.osgl.util.Keyword; import org.osgl.util.S; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Base class for XxConfig */ -public abstract class Config extends DestroyableBase { +public abstract class Config extends LogSupportedDestroyableBase { static final String PREFIX = "act."; static final int PREFIX_LEN = PREFIX.length(); diff --git a/src/main/java/act/controller/meta/ControllerClassMetaInfoManager.java b/src/main/java/act/controller/meta/ControllerClassMetaInfoManager.java index 559a6f7fa..172766d78 100644 --- a/src/main/java/act/controller/meta/ControllerClassMetaInfoManager.java +++ b/src/main/java/act/controller/meta/ControllerClassMetaInfoManager.java @@ -20,24 +20,22 @@ * #L% */ +import static act.Destroyable.Util.destroyAll; + import act.Act; import act.app.App; import act.app.AppClassLoader; import act.app.event.SysEventId; import act.asm.Type; -import act.util.ClassInfoRepository; -import act.util.ClassNode; -import act.util.DestroyableBase; +import act.util.*; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; import java.util.HashMap; import java.util.Map; - -import static act.Destroyable.Util.destroyAll; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; @ApplicationScoped -public class ControllerClassMetaInfoManager extends DestroyableBase { +public class ControllerClassMetaInfoManager extends LogSupportedDestroyableBase { private Map controllers = new HashMap<>(); diff --git a/src/main/java/act/controller/meta/HandlerMethodMetaInfo.java b/src/main/java/act/controller/meta/HandlerMethodMetaInfo.java index 07d426d14..ccb00f9e1 100644 --- a/src/main/java/act/controller/meta/HandlerMethodMetaInfo.java +++ b/src/main/java/act/controller/meta/HandlerMethodMetaInfo.java @@ -26,13 +26,9 @@ import act.handler.builtin.controller.Handler; import act.sys.meta.InvokeType; import act.sys.meta.ReturnTypeInfo; -import act.util.DestroyableBase; -import act.util.Prioritised; -import act.util.PropertySpec; +import act.util.*; import org.osgl.$; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.util.*; import java.util.HashMap; import java.util.Map; @@ -41,7 +37,8 @@ * Common meta data storage for both {@link ControllerAction} * and {@link Handler} */ -public abstract class HandlerMethodMetaInfo extends DestroyableBase implements Prioritised { +public abstract class HandlerMethodMetaInfo extends LogSupportedDestroyableBase implements Prioritised { + private String name; private InvokeType invokeType; private ActContextInjection actContextInjection; diff --git a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java index e9a4de782..5408ba22a 100644 --- a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java +++ b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java @@ -58,14 +58,14 @@ protected void releaseResources() { public InterceptorMethodMetaInfo addOnly(String... only) { if (!blackList.isEmpty()) { - logger.warn("Both [only] and [except] list are used for interceptor method[%s]. You should use only one", name()); + warn("Both [only] and [except] list are used for interceptor method[%s]. You should use only one", name()); } return addTo(whiteList, only); } public InterceptorMethodMetaInfo addExcept(String... except) { if (!whiteList.isEmpty()) { - logger.warn("Both [only] and [except] list are used for interceptor method[%s]. You should use only one", name()); + warn("Both [only] and [except] list are used for interceptor method[%s]. You should use only one", name()); // when white list is used, black list is ignored return this; } diff --git a/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java b/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java index ade700ba9..434d80db5 100644 --- a/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java +++ b/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java @@ -85,7 +85,7 @@ public int compareTo(ExceptionInterceptor o) { return -1; } if (thisPriority <0 && thatPririty < 0) { - warn("Found more than one high priority Exception handlers"); + LOGGER.warn("Found more than one high priority Exception handlers"); } boolean iAmEmpty = exClasses.isEmpty(), uAreEmpty = o.exClasses.isEmpty(); if (iAmEmpty) { diff --git a/src/main/java/act/handler/builtin/controller/Handler.java b/src/main/java/act/handler/builtin/controller/Handler.java index 80a955be9..8210f5295 100644 --- a/src/main/java/act/handler/builtin/controller/Handler.java +++ b/src/main/java/act/handler/builtin/controller/Handler.java @@ -23,6 +23,8 @@ import act.security.CORS; import act.util.DestroyableBase; import org.osgl.$; +import org.osgl.logging.LogManager; +import org.osgl.logging.Logger; /** * The base class of @Before, @After, @Exception, @Finally interceptor and @@ -30,6 +32,8 @@ */ public abstract class Handler extends DestroyableBase implements Comparable { + protected static final Logger LOGGER = LogManager.get(Handler.class); + private int priority; protected Handler(int priority) { diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index e118c3b53..5cd91d043 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -94,7 +94,7 @@ * https://github.com/EsotericSoftware/reflectasm */ @ApplicationScoped -public class ReflectedHandlerInvoker extends DestroyableBase +public class ReflectedHandlerInvoker extends LogSupportedDestroyableBase implements ActionHandlerInvoker, AfterInterceptorInvoker, ExceptionInterceptorInvoker { private static final Object[] DUMP_PARAMS = new Object[0]; @@ -516,7 +516,7 @@ protected void run(ProgressGauge progressGauge) { try { invoke(handler, context, controller, params); } catch (Exception e) { - logger.warn(e, "Error executing async handler: " + handler); + warn(e, "Error executing async handler: " + handler); } } }); diff --git a/src/main/java/act/job/Job.java b/src/main/java/act/job/Job.java index 4778ac23b..5e10a1382 100644 --- a/src/main/java/act/job/Job.java +++ b/src/main/java/act/job/Job.java @@ -33,6 +33,8 @@ import act.ws.WebSocketConnectionManager; import org.osgl.$; import org.osgl.exception.*; +import org.osgl.logging.LogManager; +import org.osgl.logging.Logger; import org.osgl.util.*; import java.lang.reflect.Method; @@ -44,6 +46,8 @@ */ public class Job extends DestroyableBase implements Runnable { + private static final Logger LOGGER = LogManager.get(Job.class); + private static class LockableJobList { boolean iterating; List jobList; @@ -308,13 +312,13 @@ public void run() { } throw E.unexpected(e); } else { - logger.fatal(cause, "Fatal error executing job %s", id()); + LOGGER.fatal(cause, "Fatal error executing job %s", id()); } } return; } // TODO inject Job Exception Handling mechanism here - logger.warn(e, "error executing job %s", id()); + LOGGER.warn(e, "error executing job %s", id()); } finally { if (!isDestroyed()) { executed = true; diff --git a/src/main/java/act/job/meta/JobClassMetaInfoManager.java b/src/main/java/act/job/meta/JobClassMetaInfoManager.java index 1f83f291d..4a2ec421b 100644 --- a/src/main/java/act/job/meta/JobClassMetaInfoManager.java +++ b/src/main/java/act/job/meta/JobClassMetaInfoManager.java @@ -20,20 +20,17 @@ * #L% */ +import static act.Destroyable.Util.destroyAll; + import act.asm.Type; import act.util.AsmTypes; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; +import java.util.*; import javax.enterprise.context.ApplicationScoped; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static act.Destroyable.Util.destroyAll; @ApplicationScoped -public class JobClassMetaInfoManager extends DestroyableBase { +public class JobClassMetaInfoManager extends LogSupportedDestroyableBase { private Map jobs = new HashMap<>(); private Map> subTypeInfo = new HashMap<>(); @@ -72,7 +69,7 @@ public void registerJobMetaInfo(JobClassMetaInfo metaInfo) { if (null != subTypes) { subTypeInfo.remove(metaInfo.type()); } - logger.trace("Job meta info registered for: %s", className); + trace("Job meta info registered for: %s", className); } public JobClassMetaInfo jobMetaInfo(String className) { diff --git a/src/main/java/act/mail/meta/MailerClassMetaInfoManager.java b/src/main/java/act/mail/meta/MailerClassMetaInfoManager.java index 62d25309f..34ebec0eb 100644 --- a/src/main/java/act/mail/meta/MailerClassMetaInfoManager.java +++ b/src/main/java/act/mail/meta/MailerClassMetaInfoManager.java @@ -20,17 +20,17 @@ * #L% */ +import static act.Destroyable.Util.destroyAll; + import act.asm.Type; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; -import javax.enterprise.context.ApplicationScoped; import java.util.HashMap; import java.util.Map; - -import static act.Destroyable.Util.destroyAll; +import javax.enterprise.context.ApplicationScoped; @ApplicationScoped -public class MailerClassMetaInfoManager extends DestroyableBase { +public class MailerClassMetaInfoManager extends LogSupportedDestroyableBase { private Map mailers = new HashMap<>(); @@ -47,7 +47,7 @@ protected void releaseResources() { public void registerMailerMetaInfo(MailerClassMetaInfo metaInfo) { String className = Type.getObjectType(metaInfo.className()).getClassName(); mailers.put(className, metaInfo); - logger.trace("Mailer meta info registered for: %s", className); + trace("Mailer meta info registered for: %s", className); } public MailerClassMetaInfo mailerMetaInfo(String className) { diff --git a/src/main/java/act/session/DefaultSessionCodec.java b/src/main/java/act/session/DefaultSessionCodec.java index 2e2d80261..e3c8d9246 100644 --- a/src/main/java/act/session/DefaultSessionCodec.java +++ b/src/main/java/act/session/DefaultSessionCodec.java @@ -26,23 +26,17 @@ import act.conf.AppConfig; import act.crypto.AppCrypto; import act.crypto.RotateSecretCrypto; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.$; import org.osgl.http.H; -import org.osgl.util.C; -import org.osgl.util.Charsets; -import org.osgl.util.Codec; -import org.osgl.util.S; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import org.osgl.util.*; + +import java.util.*; import javax.inject.Inject; import javax.inject.Singleton; @Singleton -public class DefaultSessionCodec extends DestroyableBase implements SessionCodec { +public class DefaultSessionCodec extends LogSupportedDestroyableBase implements SessionCodec { private final boolean sessionWillExpire; private final boolean encryptSession; diff --git a/src/main/java/act/util/ActContext.java b/src/main/java/act/util/ActContext.java index 48c878d30..ea143b666 100644 --- a/src/main/java/act/util/ActContext.java +++ b/src/main/java/act/util/ActContext.java @@ -35,6 +35,8 @@ import com.alibaba.fastjson.serializer.SerializerFeature; import org.osgl.$; import org.osgl.http.H; +import org.osgl.logging.LogManager; +import org.osgl.logging.Logger; import org.osgl.mvc.util.ParamValueProvider; import org.osgl.util.C; import org.osgl.util.E; @@ -253,6 +255,9 @@ interface Listener { abstract class Base extends DestroyableBase implements ActContext { + + private static final Logger LOGGER = LogManager.get(ActContext.class); + private App app; private String templatePath; private String templateContent; @@ -280,11 +285,6 @@ abstract class Base extends DestroyableBase private boolean disableCircularReferenceDetect = true; public Base(App app) { - this(app, false); - } - - protected Base(App app, boolean noLogger) { - super(noLogger); E.NPE(app); this.app = app; renderArgs = new HashMap<>(); @@ -300,7 +300,7 @@ protected void releaseResources() { try { l.onDestroy(this); } catch (Exception e) { - warn(e, "error calling listener onDestroy method"); + LOGGER.warn(e, "error calling listener onDestroy method"); } } Destroyable.Util.destroyAll(destroyableList, RequestScoped.class); diff --git a/src/main/java/act/util/AppCodeScannerPluginManager.java b/src/main/java/act/util/AppCodeScannerPluginManager.java index 0c1eabbd9..591c48623 100644 --- a/src/main/java/act/util/AppCodeScannerPluginManager.java +++ b/src/main/java/act/util/AppCodeScannerPluginManager.java @@ -21,16 +21,13 @@ */ import act.Destroyable; -import act.app.App; -import act.app.AppByteCodeScanner; -import act.app.AppCodeScannerManager; -import act.app.AppSourceCodeScanner; +import act.app.*; -import javax.enterprise.context.ApplicationScoped; import java.util.HashMap; import java.util.Map; +import javax.enterprise.context.ApplicationScoped; -public class AppCodeScannerPluginManager extends DestroyableBase { +public class AppCodeScannerPluginManager extends LogSupportedDestroyableBase { private Map, AppCodeScannerPluginBase> registry = new HashMap<>(); diff --git a/src/main/java/act/util/DestroyableBase.java b/src/main/java/act/util/DestroyableBase.java index d17f1caf1..1797be87d 100644 --- a/src/main/java/act/util/DestroyableBase.java +++ b/src/main/java/act/util/DestroyableBase.java @@ -31,7 +31,7 @@ import javax.enterprise.context.RequestScoped; import javax.enterprise.context.SessionScoped; -public abstract class DestroyableBase extends LogSupport implements Destroyable { +public abstract class DestroyableBase implements Destroyable { private volatile boolean destroyed; @@ -41,10 +41,6 @@ public abstract class DestroyableBase extends LogSupport implements Destroyable public DestroyableBase() {} - protected DestroyableBase(boolean noLogger) { - super(noLogger); - } - @Override public final void destroy() { if (isDestroyed()) { diff --git a/src/main/java/act/util/LogSupportedDestroyableBase.java b/src/main/java/act/util/LogSupportedDestroyableBase.java new file mode 100644 index 000000000..5af61426e --- /dev/null +++ b/src/main/java/act/util/LogSupportedDestroyableBase.java @@ -0,0 +1,96 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Destroyable; +import act.handler.builtin.controller.RequestHandlerProxy; + +import java.lang.annotation.Annotation; +import java.util.ArrayList; +import java.util.List; +import javax.enterprise.context.*; + +public abstract class LogSupportedDestroyableBase extends LogSupport implements Destroyable { + + private volatile boolean destroyed; + + private List subResources = new ArrayList<>(); + + private volatile Class scope; + + public LogSupportedDestroyableBase() {} + + protected LogSupportedDestroyableBase(boolean noLogger) { + super(noLogger); + } + + @Override + public final void destroy() { + if (isDestroyed()) { + return; + } + destroyed = true; + if (!subResources.isEmpty()) { + Util.destroyAll(subResources, scope()); + } + releaseResources(); + } + + @Override + public final boolean isDestroyed() { + return destroyed; + } + + /** + * Recover the destroy state. Use this API with cautious + */ + protected void reload() { + RequestHandlerProxy.releaseGlobalResources(); + destroyed = false; + } + + protected void releaseResources() {} + + public Class scope() { + if (null == scope) { + synchronized (this) { + if (null == scope) { + Class c = getClass(); + if (c.isAnnotationPresent(RequestScoped.class)) { + scope = RequestScoped.class; + } else if (c.isAnnotationPresent(SessionScoped.class)) { + scope = SessionScoped.class; + } else if (c.isAnnotationPresent(ApplicationScoped.class)) { + scope = ApplicationScoped.class; + } else { + scope = NormalScope.class; + } + } + } + } + return scope; + } + + public synchronized void addSubResource(Destroyable object) { + subResources.add(object); + } + +} diff --git a/src/main/java/act/util/SingletonBase.java b/src/main/java/act/util/SingletonBase.java index cfca2bb4f..a89771540 100644 --- a/src/main/java/act/util/SingletonBase.java +++ b/src/main/java/act/util/SingletonBase.java @@ -28,7 +28,7 @@ * Note, the sub type must NOT be abstract and has public constructor *

                                                                                                                                                                      */ -public abstract class SingletonBase extends DestroyableBase { +public abstract class SingletonBase extends LogSupportedDestroyableBase { /** * Returns the singleton instance of the sub type diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index a0ed3c215..e45929aa0 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -31,6 +31,11 @@ org.actframework act-eclipselink + + cn.hutool + hutool-all + 4.1.11 + diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh830.java b/testapps/GHIssues/src/main/java/ghissues/Gh830.java new file mode 100644 index 000000000..3cca3e36a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh830.java @@ -0,0 +1,31 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.LogSupport; +import cn.hutool.http.HttpUtil; +import org.osgl.mvc.annotation.PostAction; + +import java.util.HashMap; +import java.util.Map; + +@UrlContext("830") +public class Gh830 extends LogSupport { + + @PostAction("svc/{url}") + public String server(String url,String dataJson) { + info("data: " + dataJson); + info("url: " + url); + return url; + } + + @PostAction("client/{url}") + public String client(String url, String dataJson) { + Map map = new HashMap(); + map.put("dataJson", dataJson); + String post = HttpUtil.post("http://localhost:5460/830/svc/" + url, map); + info("response from server: " + post); + return post; + } + + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh832.java b/testapps/GHIssues/src/main/java/ghissues/Gh832.java new file mode 100644 index 000000000..506664da0 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh832.java @@ -0,0 +1,14 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("832") +public class Gh832 { + + @GetAction("/post/{cityId}") + public int action(int cityId) { + return cityId; + } + +} From bb1c767bbd0e2670c2dad8ac9f8fdc02206b15d2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 15 Sep 2018 06:42:01 +1000 Subject: [PATCH 100/730] #833 - further updates --- src/main/java/act/util/LogSupport.java | 16 +++------------- .../act/util/LogSupportedDestroyableBase.java | 4 ---- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/main/java/act/util/LogSupport.java b/src/main/java/act/util/LogSupport.java index 94a6576c8..72963e803 100644 --- a/src/main/java/act/util/LogSupport.java +++ b/src/main/java/act/util/LogSupport.java @@ -20,6 +20,7 @@ * #L% */ +import act.inject.param.NoBind; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.S; @@ -35,22 +36,11 @@ public class LogSupport { public static final String HASH_SYMBOL_LINE = S.times('#', 80); public static final String TILD_LINE = S.times('~', 80); + @NoBind protected final transient Logger logger; public LogSupport() { - this(false); - } - - /** - * Used by sub class that want to implement it's own logging logic. - * - * Typically for class that generates massive number of instances and - * want to avoid creating logger every time. - * - * @param noLogger if `false` then logger will not be generated - */ - protected LogSupport(boolean noLogger) { - logger = noLogger ? null : LogManager.get(getClass()); + logger = LogManager.get(getClass()); } /** diff --git a/src/main/java/act/util/LogSupportedDestroyableBase.java b/src/main/java/act/util/LogSupportedDestroyableBase.java index 5af61426e..fcea8b510 100644 --- a/src/main/java/act/util/LogSupportedDestroyableBase.java +++ b/src/main/java/act/util/LogSupportedDestroyableBase.java @@ -38,10 +38,6 @@ public abstract class LogSupportedDestroyableBase extends LogSupport implements public LogSupportedDestroyableBase() {} - protected LogSupportedDestroyableBase(boolean noLogger) { - super(noLogger); - } - @Override public final void destroy() { if (isDestroyed()) { From ebf7b36430ce28778b4793baef7a1423ddca8070 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 15 Sep 2018 07:23:27 +1000 Subject: [PATCH 101/730] #833 - switch parent class from Destoryable Base to LogSupportedDestroyableBase for classes with limited number of instances --- CHANGELOG.md | 1 + .../java/act/BytecodeEnhancerManager.java | 15 ++-- src/main/java/act/app/AppCompiler.java | 13 ++-- src/main/java/act/app/AppManager.java | 12 ++-- src/main/java/act/cli/CommandExecutor.java | 4 +- .../act/cli/meta/CommandMethodMetaInfo.java | 12 ++-- .../act/cli/meta/CommandParamMetaInfo.java | 5 +- .../act/cli/meta/CommanderClassMetaInfo.java | 13 ++-- .../meta/CommanderClassMetaInfoManager.java | 12 ++-- src/main/java/act/controller/Controller.java | 59 +++++++++++++++ .../meta/ControllerClassMetaInfo.java | 12 ++-- .../meta/GroupInterceptorMetaInfo.java | 10 +-- src/main/java/act/db/DbManager.java | 4 +- .../act/db/di/DaoInjectionListenerBase.java | 5 +- .../java/act/event/ActEventListenerBase.java | 4 +- .../java/act/handler/OptionsInfoBase.java | 4 +- .../handler/builtin/controller/Handler.java | 8 +-- .../inject/param/ParamValueLoaderService.java | 30 ++------ .../act/inject/param/ProvidedValueLoader.java | 6 +- .../util/ResourceChecksumManager.java | 8 +-- .../java/act/job/meta/JobClassMetaInfo.java | 6 +- .../java/act/job/meta/JobMethodMetaInfo.java | 5 +- .../act/mail/meta/MailerClassMetaInfo.java | 12 ++-- .../act/mail/meta/SenderMethodMetaInfo.java | 5 +- .../act/plugin/AppServicePluginManager.java | 6 +- .../java/act/plugin/GenericPluginManager.java | 9 +-- src/main/java/act/session/SessionManager.java | 8 +-- .../act/util/AppCodeScannerPluginBase.java | 2 +- .../java/act/util/ClassInfoRepository.java | 2 +- .../java/act/util/FastJsonJodaDateCodec.java | 2 +- src/main/java/act/util/SimpleBean.java | 2 +- .../ActValidationMessageInterpolator.java | 6 +- .../java/act/view/RenderBufferedImage.java | 71 +++++++++++++++++++ src/main/java/act/view/ViewManager.java | 5 +- src/main/java/act/view/rythm/Tags.java | 5 +- .../act/ws/WebSocketConnectionRegistry.java | 4 +- src/main/java/act/xio/NetworkBase.java | 11 ++- src/main/java/act/xio/NetworkHandler.java | 16 ++--- .../src/main/java/ghissues/Gh834.java | 19 +++++ 39 files changed, 258 insertions(+), 175 deletions(-) create mode 100644 src/main/java/act/view/RenderBufferedImage.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh834.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f285b5ee..208a59e25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Add render image support #834 * Optimise `LogSupport` for `DestroyableBase` #833 * Allow app developer to specify download file name #829 * `ActionContext.allowIgnoreParamNamespace()` overlooked by `MapLoader` #827 diff --git a/src/main/java/act/BytecodeEnhancerManager.java b/src/main/java/act/BytecodeEnhancerManager.java index dcdb3c7a0..088595fa0 100644 --- a/src/main/java/act/BytecodeEnhancerManager.java +++ b/src/main/java/act/BytecodeEnhancerManager.java @@ -20,22 +20,17 @@ * #L% */ +import static act.Destroyable.Util.tryDestroyAll; + import act.app.App; import act.asm.ClassWriter; -import act.util.AppByteCodeEnhancer; -import act.util.AsmByteCodeEnhancer; -import act.util.ByteCodeVisitor; -import act.util.DestroyableBase; +import act.util.*; import org.osgl.$; +import java.util.*; import javax.enterprise.context.ApplicationScoped; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static act.Destroyable.Util.tryDestroyAll; -public class BytecodeEnhancerManager extends DestroyableBase { +public class BytecodeEnhancerManager extends LogSupportedDestroyableBase { private List appEnhancers = new ArrayList<>(); private List generalEnhancers = new ArrayList<>(); diff --git a/src/main/java/act/app/AppCompiler.java b/src/main/java/act/app/AppCompiler.java index 39255ea44..ad1c7400e 100644 --- a/src/main/java/act/app/AppCompiler.java +++ b/src/main/java/act/app/AppCompiler.java @@ -26,16 +26,14 @@ import act.conf.AppConfig; import act.metric.Metric; import act.metric.Timer; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.*; import org.eclipse.jdt.internal.compiler.Compiler; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; -import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; -import org.eclipse.jdt.internal.compiler.env.INameEnvironment; -import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer; +import org.eclipse.jdt.internal.compiler.env.*; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.problem.DefaultProblem; import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; @@ -43,16 +41,13 @@ import org.osgl.util.E; import org.osgl.util.S; -import java.util.Collection; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; +import java.util.*; /** * Compile App srccode code in memory. Only used when Act is running * in DEV mode */ -class AppCompiler extends DestroyableBase { +class AppCompiler extends LogSupportedDestroyableBase { Map packagesCache = new HashMap<>(); private DevModeClassLoader classLoader; diff --git a/src/main/java/act/app/AppManager.java b/src/main/java/act/app/AppManager.java index 3a9c720f0..88d8d130a 100644 --- a/src/main/java/act/app/AppManager.java +++ b/src/main/java/act/app/AppManager.java @@ -20,25 +20,23 @@ * #L% */ +import static act.Destroyable.Util.tryDestroyAll; + import act.Act; import act.internal.util.AppDescriptor; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.$; import org.osgl.util.E; +import java.util.*; import javax.enterprise.context.ApplicationScoped; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import static act.Destroyable.Util.tryDestroyAll; /** * Manage applications deployed on Act * * TODO: get rid of multi-tenant support */ -public class AppManager extends DestroyableBase { +public class AppManager extends LogSupportedDestroyableBase { private Map byPort = new HashMap<>(); diff --git a/src/main/java/act/cli/CommandExecutor.java b/src/main/java/act/cli/CommandExecutor.java index fcc23cdda..930065394 100644 --- a/src/main/java/act/cli/CommandExecutor.java +++ b/src/main/java/act/cli/CommandExecutor.java @@ -20,12 +20,12 @@ * #L% */ -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; /** * A command executor execute a command and return the result */ -public abstract class CommandExecutor extends DestroyableBase { +public abstract class CommandExecutor extends LogSupportedDestroyableBase { /** * Execute the command within the {@link CliContext context} specified * @param context the CLI context diff --git a/src/main/java/act/cli/meta/CommandMethodMetaInfo.java b/src/main/java/act/cli/meta/CommandMethodMetaInfo.java index f1b847059..d2e54ec4f 100644 --- a/src/main/java/act/cli/meta/CommandMethodMetaInfo.java +++ b/src/main/java/act/cli/meta/CommandMethodMetaInfo.java @@ -28,18 +28,14 @@ import act.handler.CliHandler; import act.sys.meta.InvokeType; import act.sys.meta.ReturnTypeInfo; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import act.util.PropertySpec; import org.osgl.$; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.util.*; +import java.util.*; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; /** * Stores the command method meta info including @@ -51,7 +47,7 @@ * */ @ApplicationScoped -public class CommandMethodMetaInfo extends DestroyableBase { +public class CommandMethodMetaInfo extends LogSupportedDestroyableBase { private String methodName; private String commandName; diff --git a/src/main/java/act/cli/meta/CommandParamMetaInfo.java b/src/main/java/act/cli/meta/CommandParamMetaInfo.java index 72a5b3b6b..2ad8f8767 100644 --- a/src/main/java/act/cli/meta/CommandParamMetaInfo.java +++ b/src/main/java/act/cli/meta/CommandParamMetaInfo.java @@ -21,14 +21,13 @@ */ import act.asm.Type; -import act.util.AsmTypes; -import act.util.DestroyableBase; +import act.util.*; import org.osgl.$; /** * Stores Command parameter meta info */ -public class CommandParamMetaInfo extends DestroyableBase { +public class CommandParamMetaInfo extends LogSupportedDestroyableBase { private String name; private Type type; private boolean readFileContent; diff --git a/src/main/java/act/cli/meta/CommanderClassMetaInfo.java b/src/main/java/act/cli/meta/CommanderClassMetaInfo.java index 8488b09d3..48ee29fee 100644 --- a/src/main/java/act/cli/meta/CommanderClassMetaInfo.java +++ b/src/main/java/act/cli/meta/CommanderClassMetaInfo.java @@ -20,29 +20,26 @@ * #L% */ +import static act.Destroyable.Util.destroyAll; + import act.app.AppClassLoader; import act.asm.Type; import act.cli.view.CliView; import act.sys.meta.SessionVariableAnnoInfo; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.$; import org.osgl.util.C; import org.osgl.util.S; +import java.util.*; import javax.enterprise.context.ApplicationScoped; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static act.Destroyable.Util.destroyAll; /** * Stores all class level information to support generating of * {@link act.cli.CommandExecutor command executor} */ @ApplicationScoped -public class CommanderClassMetaInfo extends DestroyableBase { +public class CommanderClassMetaInfo extends LogSupportedDestroyableBase { private static CommanderClassMetaInfo NULL = new CommanderClassMetaInfo() { @Override diff --git a/src/main/java/act/cli/meta/CommanderClassMetaInfoManager.java b/src/main/java/act/cli/meta/CommanderClassMetaInfoManager.java index 6c6cb9a44..99153e0bb 100644 --- a/src/main/java/act/cli/meta/CommanderClassMetaInfoManager.java +++ b/src/main/java/act/cli/meta/CommanderClassMetaInfoManager.java @@ -20,20 +20,18 @@ * #L% */ +import static act.Destroyable.Util.destroyAll; + import act.asm.Type; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; +import java.util.*; import javax.enterprise.context.ApplicationScoped; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static act.Destroyable.Util.destroyAll; @ApplicationScoped -public class CommanderClassMetaInfoManager extends DestroyableBase { +public class CommanderClassMetaInfoManager extends LogSupportedDestroyableBase { private static final Logger logger = LogManager.get(CommanderClassMetaInfoManager.class); diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 87a24d6ff..69f5319fd 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -37,6 +37,7 @@ import org.osgl.util.*; import org.osgl.util.Output; +import java.awt.image.BufferedImage; import java.io.File; import java.io.InputStream; import java.lang.annotation.*; @@ -1391,6 +1392,64 @@ public static RenderBinary renderBinary(byte[] blob, String attachmentName) { return binary(blob, attachmentName); } + /** + * Returns a {@link RenderBufferedImage} result with image specified. + * + * The contentType will be set as default "image/png". + * + * @param image + * the buffered image instance. + * @return the result + */ + public static RenderBufferedImage renderImage(BufferedImage image) { + return image(image); + } + + /** + * alias of {@link #renderImage(BufferedImage)}. + */ + public static RenderBufferedImage image(BufferedImage image) { + return new RenderBufferedImage(image); + } + + /** + * Returns a {@link RenderBufferedImage} result wth image and content type specified. + * @param image + * the image + * @param contentType + * the content type + * @return the result + */ + public static RenderBufferedImage renderImage(BufferedImage image, String contentType) { + return new RenderBufferedImage(image, contentType); + } + + /** + * alias of {@link #renderImage(BufferedImage, String)} + */ + public static RenderBufferedImage image(BufferedImage image, String contentType) { + return renderImage(image, contentType); + } + + /** + * Returns a {@link RenderBufferedImage} result wth image and format specified. + * @param image + * the image + * @param format + * the format + * @return the result + */ + public static RenderBufferedImage renderImage(BufferedImage image, H.Format format) { + return new RenderBufferedImage(image, format.contentType()); + } + + /** + * alias of {@link #renderImage(BufferedImage, H.Format)} + */ + public static RenderBufferedImage image(BufferedImage image, H.Format format) { + return renderImage(image, format); + } + /** * Returns a {@link RenderBinary} result with a URL. * diff --git a/src/main/java/act/controller/meta/ControllerClassMetaInfo.java b/src/main/java/act/controller/meta/ControllerClassMetaInfo.java index 86352c309..49698e018 100644 --- a/src/main/java/act/controller/meta/ControllerClassMetaInfo.java +++ b/src/main/java/act/controller/meta/ControllerClassMetaInfo.java @@ -20,6 +20,8 @@ * #L% */ +import static act.Destroyable.Util.destroyAll; + import act.Act; import act.app.App; import act.app.AppClassLoader; @@ -28,19 +30,15 @@ import act.handler.builtin.controller.ControllerAction; import act.handler.builtin.controller.Handler; import act.plugin.ControllerPlugin; -import act.util.ClassInfoRepository; -import act.util.ClassNode; -import act.util.DestroyableBase; +import act.util.*; import org.osgl.http.H; import org.osgl.mvc.annotation.*; import org.osgl.util.C; import org.osgl.util.S; -import javax.enterprise.context.ApplicationScoped; import java.lang.annotation.Annotation; import java.util.*; - -import static act.Destroyable.Util.destroyAll; +import javax.enterprise.context.ApplicationScoped; /** * Stores all class level information to support generating of @@ -48,7 +46,7 @@ * and {@link Handler interceptors} */ @ApplicationScoped -public final class ControllerClassMetaInfo extends DestroyableBase { +public final class ControllerClassMetaInfo extends LogSupportedDestroyableBase { private Type type; private Type superType; diff --git a/src/main/java/act/controller/meta/GroupInterceptorMetaInfo.java b/src/main/java/act/controller/meta/GroupInterceptorMetaInfo.java index 4757a87c0..0dfab1408 100644 --- a/src/main/java/act/controller/meta/GroupInterceptorMetaInfo.java +++ b/src/main/java/act/controller/meta/GroupInterceptorMetaInfo.java @@ -20,16 +20,16 @@ * #L% */ -import act.util.DestroyableBase; +import static act.Destroyable.Util.destroyAll; + +import act.util.LogSupportedDestroyableBase; import org.osgl.$; import org.osgl.util.C; import org.osgl.util.S; -import javax.enterprise.context.ApplicationScoped; import java.lang.annotation.Annotation; import java.util.List; - -import static act.Destroyable.Util.destroyAll; +import javax.enterprise.context.ApplicationScoped; /** * Aggregate interception meta info. This structure is used in @@ -37,7 +37,7 @@ * {@link ActionMethodMetaInfo} */ @ApplicationScoped -public class GroupInterceptorMetaInfo extends DestroyableBase { +public class GroupInterceptorMetaInfo extends LogSupportedDestroyableBase { private C.List beforeList = C.newList(); private C.List afterList = C.newList(); diff --git a/src/main/java/act/db/DbManager.java b/src/main/java/act/db/DbManager.java index 70aba930f..21a431b5d 100644 --- a/src/main/java/act/db/DbManager.java +++ b/src/main/java/act/db/DbManager.java @@ -20,13 +20,13 @@ * #L% */ -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.$; import java.util.HashMap; import java.util.Map; -public class DbManager extends DestroyableBase { +public class DbManager extends LogSupportedDestroyableBase { private Map plugins = new HashMap<>(); private Map timestampGeneratorMap = new HashMap<>(); diff --git a/src/main/java/act/db/di/DaoInjectionListenerBase.java b/src/main/java/act/db/di/DaoInjectionListenerBase.java index d29a08425..7109ea55f 100644 --- a/src/main/java/act/db/di/DaoInjectionListenerBase.java +++ b/src/main/java/act/db/di/DaoInjectionListenerBase.java @@ -23,8 +23,7 @@ import act.app.DbServiceManager; import act.db.DB; import act.inject.DependencyInjectionListener; -import act.util.AnnotationUtil; -import act.util.DestroyableBase; +import act.util.*; import org.osgl.$; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; @@ -34,7 +33,7 @@ import java.util.List; import java.util.Map; -public abstract class DaoInjectionListenerBase extends DestroyableBase implements DependencyInjectionListener { +public abstract class DaoInjectionListenerBase extends LogSupportedDestroyableBase implements DependencyInjectionListener { protected Logger logger = LogManager.get(DaoInjectionListenerBase.class); diff --git a/src/main/java/act/event/ActEventListenerBase.java b/src/main/java/act/event/ActEventListenerBase.java index 7b6563840..6e4e926bd 100644 --- a/src/main/java/act/event/ActEventListenerBase.java +++ b/src/main/java/act/event/ActEventListenerBase.java @@ -21,13 +21,13 @@ */ import act.app.event.SysEventListener; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.util.S; import java.util.EventObject; import java.util.concurrent.atomic.AtomicInteger; -public abstract class ActEventListenerBase extends DestroyableBase implements ActEventListener { +public abstract class ActEventListenerBase extends LogSupportedDestroyableBase implements ActEventListener { private static final AtomicInteger ID_ = new AtomicInteger(); diff --git a/src/main/java/act/handler/OptionsInfoBase.java b/src/main/java/act/handler/OptionsInfoBase.java index 2b7abdb7d..152891aa5 100644 --- a/src/main/java/act/handler/OptionsInfoBase.java +++ b/src/main/java/act/handler/OptionsInfoBase.java @@ -25,7 +25,7 @@ import act.handler.builtin.UnknownHttpMethodHandler; import act.route.Router; import act.security.CORS; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.http.H; import org.osgl.util.S; @@ -37,7 +37,7 @@ /** * Process HTTP OPTIONS request */ -public class OptionsInfoBase extends DestroyableBase { +public class OptionsInfoBase extends LogSupportedDestroyableBase { private Router router; private ConcurrentMap handlers = new ConcurrentHashMap(); diff --git a/src/main/java/act/handler/builtin/controller/Handler.java b/src/main/java/act/handler/builtin/controller/Handler.java index 8210f5295..07a911d10 100644 --- a/src/main/java/act/handler/builtin/controller/Handler.java +++ b/src/main/java/act/handler/builtin/controller/Handler.java @@ -21,18 +21,14 @@ */ import act.security.CORS; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.$; -import org.osgl.logging.LogManager; -import org.osgl.logging.Logger; /** * The base class of @Before, @After, @Exception, @Finally interceptor and * request dispatcher */ -public abstract class Handler extends DestroyableBase implements Comparable { - - protected static final Logger LOGGER = LogManager.get(Handler.class); +public abstract class Handler extends LogSupportedDestroyableBase implements Comparable { private int priority; diff --git a/src/main/java/act/inject/param/ParamValueLoaderService.java b/src/main/java/act/inject/param/ParamValueLoaderService.java index 61ca262ae..362123981 100644 --- a/src/main/java/act/inject/param/ParamValueLoaderService.java +++ b/src/main/java/act/inject/param/ParamValueLoaderService.java @@ -29,24 +29,15 @@ import act.db.AdaptiveRecord; import act.db.DbBind; import act.db.di.FindBy; -import act.inject.DefaultValue; -import act.inject.DependencyInjector; -import act.inject.SessionVariable; -import act.inject.genie.DependentScope; -import act.inject.genie.GenieInjector; -import act.inject.genie.RequestScope; -import act.inject.genie.SessionScope; +import act.inject.*; +import act.inject.genie.*; import act.util.*; -import org.osgl.$; -import org.osgl.Lang; -import org.osgl.OsglConfig; +import org.osgl.*; import org.osgl.exception.UnexpectedException; import org.osgl.inject.BeanSpec; import org.osgl.inject.InjectException; import org.osgl.inject.util.AnnotationUtil; import org.osgl.inject.util.ArrayLoader; -import org.osgl.logging.LogManager; -import org.osgl.logging.Logger; import org.osgl.mvc.annotation.Bind; import org.osgl.mvc.annotation.Param; import org.osgl.mvc.result.Result; @@ -58,14 +49,9 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.context.Dependent; -import javax.enterprise.context.RequestScoped; -import javax.enterprise.context.SessionScoped; +import javax.enterprise.context.*; import javax.enterprise.inject.New; -import javax.inject.Named; -import javax.inject.Provider; -import javax.inject.Singleton; +import javax.inject.*; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.validation.*; @@ -74,9 +60,7 @@ /** * Manage {@link ParamValueLoader} grouped by Method */ -public abstract class ParamValueLoaderService extends DestroyableBase { - - protected Logger logger = LogManager.get(getClass()); +public abstract class ParamValueLoaderService extends LogSupportedDestroyableBase { private static final ParamValueLoader[] DUMB = new ParamValueLoader[0]; private static final ThreadLocal PARAM_TREE = new ThreadLocal(); @@ -170,7 +154,7 @@ public ParamValueLoader[] methodParamLoaders(Object host, Method method, ActCont } boolean hasValidationConstraint = boolBag.get(); if (hasValidationConstraint && null == host) { - logger.error("Cannot validate static method: %s", method); + error("Cannot validate static method: %s", method); hasValidationConstraint = false; } methodValidationConstraintLookup.put(method, hasValidationConstraint); diff --git a/src/main/java/act/inject/param/ProvidedValueLoader.java b/src/main/java/act/inject/param/ProvidedValueLoader.java index ac0004652..8f1cbc15a 100644 --- a/src/main/java/act/inject/param/ProvidedValueLoader.java +++ b/src/main/java/act/inject/param/ProvidedValueLoader.java @@ -25,16 +25,14 @@ import act.app.AppServiceBase; import act.inject.DependencyInjector; import act.inject.genie.GenieInjector; -import act.util.ActContext; -import act.util.DestroyableBase; -import act.util.SingletonBase; +import act.util.*; import org.osgl.inject.BeanSpec; import java.util.concurrent.ConcurrentMap; import javax.enterprise.context.ApplicationScoped; import javax.inject.Singleton; -public class ProvidedValueLoader extends DestroyableBase implements ParamValueLoader { +public class ProvidedValueLoader extends LogSupportedDestroyableBase implements ParamValueLoader { private DependencyInjector injector; private BeanSpec beanSpec; private Object singleton; diff --git a/src/main/java/act/internal/util/ResourceChecksumManager.java b/src/main/java/act/internal/util/ResourceChecksumManager.java index 95e01da65..5e1cd255a 100644 --- a/src/main/java/act/internal/util/ResourceChecksumManager.java +++ b/src/main/java/act/internal/util/ResourceChecksumManager.java @@ -22,19 +22,19 @@ import act.Act; import act.crypto.AppCrypto; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.$; import org.osgl.util.E; import org.osgl.util.S; -import javax.inject.Inject; -import javax.inject.Singleton; import java.io.InputStream; import java.util.HashMap; import java.util.Map; +import javax.inject.Inject; +import javax.inject.Singleton; @Singleton -public class ResourceChecksumManager extends DestroyableBase { +public class ResourceChecksumManager extends LogSupportedDestroyableBase { @Inject private AppCrypto crypto; diff --git a/src/main/java/act/job/meta/JobClassMetaInfo.java b/src/main/java/act/job/meta/JobClassMetaInfo.java index cba9eec3e..b8b94a8e4 100644 --- a/src/main/java/act/job/meta/JobClassMetaInfo.java +++ b/src/main/java/act/job/meta/JobClassMetaInfo.java @@ -23,9 +23,9 @@ import static act.Destroyable.Util.destroyAll; import act.asm.Type; -import act.test.FixtureLoader; import act.job.*; -import act.util.DestroyableBase; +import act.test.FixtureLoader; +import act.util.LogSupportedDestroyableBase; import org.osgl.util.C; import org.osgl.util.S; @@ -38,7 +38,7 @@ * Job worker class that wrap the annotated Job action method */ @ApplicationScoped -public final class JobClassMetaInfo extends DestroyableBase { +public final class JobClassMetaInfo extends LogSupportedDestroyableBase { private Type type; private Type superType; diff --git a/src/main/java/act/job/meta/JobMethodMetaInfo.java b/src/main/java/act/job/meta/JobMethodMetaInfo.java index 4ac87fdcd..d97d5182b 100644 --- a/src/main/java/act/job/meta/JobMethodMetaInfo.java +++ b/src/main/java/act/job/meta/JobMethodMetaInfo.java @@ -27,8 +27,7 @@ import act.event.meta.SimpleEventListenerMetaInfo; import act.sys.meta.InvokeType; import act.sys.meta.ReturnTypeInfo; -import act.util.ClassNode; -import act.util.DestroyableBase; +import act.util.*; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.util.E; @@ -38,7 +37,7 @@ import java.util.ArrayList; import java.util.List; -public class JobMethodMetaInfo extends DestroyableBase { +public class JobMethodMetaInfo extends LogSupportedDestroyableBase { private String id; private String name; private InvokeType invokeType; diff --git a/src/main/java/act/mail/meta/MailerClassMetaInfo.java b/src/main/java/act/mail/meta/MailerClassMetaInfo.java index bf00f847f..851e46746 100644 --- a/src/main/java/act/mail/meta/MailerClassMetaInfo.java +++ b/src/main/java/act/mail/meta/MailerClassMetaInfo.java @@ -20,22 +20,20 @@ * #L% */ +import static act.Destroyable.Util.destroyAll; + import act.asm.Type; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.util.S; +import java.util.*; import javax.enterprise.context.ApplicationScoped; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static act.Destroyable.Util.destroyAll; /** * Stores all class level information to support generating of mailer method */ @ApplicationScoped -public final class MailerClassMetaInfo extends DestroyableBase { +public final class MailerClassMetaInfo extends LogSupportedDestroyableBase { private Type type; private String configId; diff --git a/src/main/java/act/mail/meta/SenderMethodMetaInfo.java b/src/main/java/act/mail/meta/SenderMethodMetaInfo.java index 754a15cf8..e9e4739a4 100644 --- a/src/main/java/act/mail/meta/SenderMethodMetaInfo.java +++ b/src/main/java/act/mail/meta/SenderMethodMetaInfo.java @@ -27,8 +27,7 @@ import act.controller.meta.LocalVariableMetaInfo; import act.sys.meta.InvokeType; import act.sys.meta.ReturnTypeInfo; -import act.util.AsmTypes; -import act.util.DestroyableBase; +import act.util.*; import org.osgl.$; import org.osgl.util.C; import org.osgl.util.E; @@ -37,7 +36,7 @@ import java.util.HashMap; import java.util.Map; -public class SenderMethodMetaInfo extends DestroyableBase { +public class SenderMethodMetaInfo extends LogSupportedDestroyableBase { private String name; private String configId; private InvokeType invokeType; diff --git a/src/main/java/act/plugin/AppServicePluginManager.java b/src/main/java/act/plugin/AppServicePluginManager.java index 9500c558e..e54cec049 100644 --- a/src/main/java/act/plugin/AppServicePluginManager.java +++ b/src/main/java/act/plugin/AppServicePluginManager.java @@ -22,13 +22,13 @@ import act.Destroyable; import act.app.App; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; -import javax.enterprise.context.ApplicationScoped; import java.util.HashMap; import java.util.Map; +import javax.enterprise.context.ApplicationScoped; -public class AppServicePluginManager extends DestroyableBase { +public class AppServicePluginManager extends LogSupportedDestroyableBase { private Map, AppServicePlugin> registry = new HashMap<>(); diff --git a/src/main/java/act/plugin/GenericPluginManager.java b/src/main/java/act/plugin/GenericPluginManager.java index efced8a8a..452bf2f39 100644 --- a/src/main/java/act/plugin/GenericPluginManager.java +++ b/src/main/java/act/plugin/GenericPluginManager.java @@ -21,15 +21,12 @@ */ import act.Destroyable; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.util.C; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; -public class GenericPluginManager extends DestroyableBase { +public class GenericPluginManager extends LogSupportedDestroyableBase { private Map, List> registry = new HashMap<>(); @Override diff --git a/src/main/java/act/session/SessionManager.java b/src/main/java/act/session/SessionManager.java index 8f8281013..5c6ee6566 100644 --- a/src/main/java/act/session/SessionManager.java +++ b/src/main/java/act/session/SessionManager.java @@ -22,16 +22,14 @@ import act.app.ActionContext; import act.conf.AppConfig; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.cache.CacheService; import org.osgl.http.H; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; +import javax.inject.*; @Singleton -public class SessionManager extends DestroyableBase { +public class SessionManager extends LogSupportedDestroyableBase { private SessionCodec codec; private SessionMapper mapper; diff --git a/src/main/java/act/util/AppCodeScannerPluginBase.java b/src/main/java/act/util/AppCodeScannerPluginBase.java index 032afdec6..ef559acd5 100644 --- a/src/main/java/act/util/AppCodeScannerPluginBase.java +++ b/src/main/java/act/util/AppCodeScannerPluginBase.java @@ -26,7 +26,7 @@ import act.app.AppSourceCodeScanner; import act.plugin.Plugin; -public abstract class AppCodeScannerPluginBase extends DestroyableBase implements Plugin { +public abstract class AppCodeScannerPluginBase extends LogSupportedDestroyableBase implements Plugin { @Override public void register() { diff --git a/src/main/java/act/util/ClassInfoRepository.java b/src/main/java/act/util/ClassInfoRepository.java index e00f2b886..ddf1a8ba3 100644 --- a/src/main/java/act/util/ClassInfoRepository.java +++ b/src/main/java/act/util/ClassInfoRepository.java @@ -39,7 +39,7 @@ * The repository to keep class information */ @ApplicationScoped -public class ClassInfoRepository extends DestroyableBase { +public class ClassInfoRepository extends LogSupportedDestroyableBase { public ClassInfoRepository() { } diff --git a/src/main/java/act/util/FastJsonJodaDateCodec.java b/src/main/java/act/util/FastJsonJodaDateCodec.java index f5fe0996d..7a589d906 100644 --- a/src/main/java/act/util/FastJsonJodaDateCodec.java +++ b/src/main/java/act/util/FastJsonJodaDateCodec.java @@ -40,7 +40,7 @@ import javax.inject.Singleton; @Singleton -public class FastJsonJodaDateCodec extends DestroyableBase implements ObjectSerializer, ObjectDeserializer { +public class FastJsonJodaDateCodec extends LogSupportedDestroyableBase implements ObjectSerializer, ObjectDeserializer { private JodaDateTimeCodec dateTimeCodec; private JodaLocalDateCodec localDateCodec; diff --git a/src/main/java/act/util/SimpleBean.java b/src/main/java/act/util/SimpleBean.java index 03a857fa4..5ddf26894 100644 --- a/src/main/java/act/util/SimpleBean.java +++ b/src/main/java/act/util/SimpleBean.java @@ -125,7 +125,7 @@ static boolean isBoolean(String desc) { } @ApplicationScoped - class MetaInfoManager extends DestroyableBase { + class MetaInfoManager extends LogSupportedDestroyableBase { private static final String INTF_SIMPLE_BEAN = SimpleBean.class.getName(); private ClassInfoRepository classInfoRepository; private Map registry = new HashMap<>(); diff --git a/src/main/java/act/validation/ActValidationMessageInterpolator.java b/src/main/java/act/validation/ActValidationMessageInterpolator.java index f40c901f4..52ed376d3 100644 --- a/src/main/java/act/validation/ActValidationMessageInterpolator.java +++ b/src/main/java/act/validation/ActValidationMessageInterpolator.java @@ -23,13 +23,13 @@ import act.act_messages; import act.conf.AppConfig; import act.i18n.I18n; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import org.osgl.util.S; -import javax.validation.MessageInterpolator; import java.util.Locale; +import javax.validation.MessageInterpolator; -public class ActValidationMessageInterpolator extends DestroyableBase implements MessageInterpolator { +public class ActValidationMessageInterpolator extends LogSupportedDestroyableBase implements MessageInterpolator { private MessageInterpolator realInterpolator; private AppConfig config; diff --git a/src/main/java/act/view/RenderBufferedImage.java b/src/main/java/act/view/RenderBufferedImage.java new file mode 100644 index 000000000..f393b2b23 --- /dev/null +++ b/src/main/java/act/view/RenderBufferedImage.java @@ -0,0 +1,71 @@ +package act.view; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static org.osgl.http.H.Header.Names.CONTENT_DISPOSITION; + +import org.osgl.$; +import org.osgl.http.H; +import org.osgl.mvc.result.Result; +import org.osgl.util.*; + +import java.awt.image.BufferedImage; + +public class RenderBufferedImage extends Result { + + private final BufferedImage img; + + private final String contentType; + + public RenderBufferedImage(BufferedImage img) { + this(img, "image/png"); + } + + public RenderBufferedImage(BufferedImage img, String contentType) { + this.img = $.requireNotNull(img); + this.contentType = S.requireNotBlank(contentType); + } + + @Override + public void apply(H.Request req, H.Response resp) { + try { + applyCookies(resp); + applyHeaders(resp); + resp.contentType(contentType); + if (!resp.containsHeader(CONTENT_DISPOSITION)) { + resp.contentDisposition(null, true); + } + applyStatus(resp); + applyBeforeCommitHandler(req, resp); + Img.source(img).writeTo(resp.outputStream(), contentType); + } catch (Exception e) { + throw E.unexpected(e); + } finally { + try { + resp.commit(); + applyAfterCommitHandler(req, resp); + } finally { + clearThreadLocals(); + } + } + } + +} diff --git a/src/main/java/act/view/ViewManager.java b/src/main/java/act/view/ViewManager.java index 03080ffb4..99270be44 100644 --- a/src/main/java/act/view/ViewManager.java +++ b/src/main/java/act/view/ViewManager.java @@ -27,8 +27,7 @@ import act.app.App; import act.conf.AppConfig; import act.mail.MailerContext; -import act.util.ActContext; -import act.util.DestroyableBase; +import act.util.*; import org.osgl.$; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; @@ -40,7 +39,7 @@ /** * Manage different view solutions */ -public class ViewManager extends DestroyableBase { +public class ViewManager extends LogSupportedDestroyableBase { private C.List viewList = C.newList(); private Map implicitActionViewVariables = new HashMap<>(); diff --git a/src/main/java/act/view/rythm/Tags.java b/src/main/java/act/view/rythm/Tags.java index 096b921e9..8f636a7b8 100644 --- a/src/main/java/act/view/rythm/Tags.java +++ b/src/main/java/act/view/rythm/Tags.java @@ -29,8 +29,7 @@ import act.internal.util.ResourceChecksumManager; import act.job.OnAppStart; import act.route.Router; -import act.util.ActContext; -import act.util.DestroyableBase; +import act.util.*; import org.osgl.$; import org.osgl.exception.NotAppliedException; import org.osgl.util.E; @@ -50,7 +49,7 @@ * Defines fast tags for Act app */ @Singleton -public class Tags extends DestroyableBase { +public class Tags extends LogSupportedDestroyableBase { @Inject private List fastTags; diff --git a/src/main/java/act/ws/WebSocketConnectionRegistry.java b/src/main/java/act/ws/WebSocketConnectionRegistry.java index 4d88eaa95..91add3d04 100644 --- a/src/main/java/act/ws/WebSocketConnectionRegistry.java +++ b/src/main/java/act/ws/WebSocketConnectionRegistry.java @@ -20,7 +20,7 @@ * #L% */ -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import act.xio.WebSocketConnection; import org.osgl.$; import org.osgl.util.C; @@ -33,7 +33,7 @@ * Organize websocket connection by string typed keys. Multiple connections * can be attached to the same key */ -public class WebSocketConnectionRegistry extends DestroyableBase { +public class WebSocketConnectionRegistry extends LogSupportedDestroyableBase { private ConcurrentMap> registry = new ConcurrentHashMap<>(); /** diff --git a/src/main/java/act/xio/NetworkBase.java b/src/main/java/act/xio/NetworkBase.java index 8788d80de..cb488cdf5 100644 --- a/src/main/java/act/xio/NetworkBase.java +++ b/src/main/java/act/xio/NetworkBase.java @@ -24,23 +24,20 @@ import act.Destroyable; import act.app.App; import act.controller.meta.ActionMethodMetaInfo; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import act.ws.WebSocketConnectionManager; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.E; -import javax.enterprise.context.ApplicationScoped; import java.io.IOException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; +import javax.enterprise.context.ApplicationScoped; /** * The base implementation of {@link Network} */ -public abstract class NetworkBase extends DestroyableBase implements Network { +public abstract class NetworkBase extends LogSupportedDestroyableBase implements Network { protected final static Logger logger = LogManager.get(Network.class); diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 29283375f..799e36fcd 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -27,27 +27,21 @@ import act.app.util.NamedPort; import act.event.EventBus; import act.handler.RequestHandler; -import act.handler.builtin.AlwaysNotFound; -import act.handler.builtin.FileGetter; -import act.handler.builtin.ResourceGetter; +import act.handler.builtin.*; import act.handler.builtin.controller.FastRequestHandler; import act.handler.builtin.controller.RequestHandlerProxy; import act.handler.event.PostHandle; import act.handler.event.PreHandle; -import act.metric.Metric; -import act.metric.MetricInfo; -import act.metric.Timer; +import act.metric.*; import act.route.Router; -import act.util.DestroyableBase; +import act.util.LogSupportedDestroyableBase; import act.view.ActErrorResult; import org.osgl.$; import org.osgl.exception.NotAppliedException; import org.osgl.http.H; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; -import org.osgl.mvc.result.ErrorResult; -import org.osgl.mvc.result.NotFound; -import org.osgl.mvc.result.Result; +import org.osgl.mvc.result.*; import org.osgl.util.E; import org.osgl.util.S; @@ -55,7 +49,7 @@ * A `NetworkHandler` can be registered to an {@link Network} and get invoked when * there are network event (e.g. an HTTP request) incoming */ -public class NetworkHandler extends DestroyableBase { +public class NetworkHandler extends LogSupportedDestroyableBase { private static Logger logger = LogManager.get(NetworkHandler.class); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh834.java b/testapps/GHIssues/src/main/java/ghissues/Gh834.java new file mode 100644 index 000000000..52ac8b95f --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh834.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.Controller; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.Img; + +import java.awt.image.BufferedImage; + +@UrlContext("834") +public class Gh834 extends Controller.Util { + + @GetAction + public void test() { + BufferedImage image = Img.source(Img.F.randomPixels(600, 480)).get(); + renderImage(image); + } + +} From e784fe5802378e5daa4e7f69833bd24f5a3abb0c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 15 Sep 2018 07:26:04 +1000 Subject: [PATCH 102/730] WIP --- .../act/handler/builtin/controller/ExceptionInterceptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java b/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java index 434d80db5..ade700ba9 100644 --- a/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java +++ b/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java @@ -85,7 +85,7 @@ public int compareTo(ExceptionInterceptor o) { return -1; } if (thisPriority <0 && thatPririty < 0) { - LOGGER.warn("Found more than one high priority Exception handlers"); + warn("Found more than one high priority Exception handlers"); } boolean iAmEmpty = exClasses.isEmpty(), uAreEmpty = o.exClasses.isEmpty(); if (iAmEmpty) { From 2341bedee97d19ccfb4ac56f17a4d490f7699d53 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 15 Sep 2018 08:44:35 +1000 Subject: [PATCH 103/730] fix #836 `CacheFor` key shall include `Accept` type --- CHANGELOG.md | 1 + .../handler/builtin/controller/impl/ReflectedHandlerInvoker.java | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 208a59e25..e2883277f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `CacheFor` key shall include `Accept` type #836 * Add render image support #834 * Optimise `LogSupport` for `DestroyableBase` #833 * Allow app developer to specify download file name #829 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 5cd91d043..650393047 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -1248,6 +1248,7 @@ private TreeMap keyValues(ActionContext context) { map.put(key, paramVal(key, context)); } } + map.put("__accept__", context.accept().name()); return map; } From 4057a0375367d8af0323e9e215f7adff48df83cf Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 15 Sep 2018 11:31:11 +1000 Subject: [PATCH 104/730] fix #837 and #838 --- CHANGELOG.md | 2 ++ .../act/controller/CacheSupportMetaInfo.java | 4 +++- .../java/act/controller/ResponseCache.java | 23 +------------------ .../controller/RequestHandlerProxy.java | 4 +++- .../impl/ReflectedHandlerInvoker.java | 3 ++- src/main/java/act/util/CacheFor.java | 6 +++++ 6 files changed, 17 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2883277f..0a30cd4ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* `CacheFor` - make it allow skip `Cache-Control` header #837 +* `ResponseCache` - content disposition shall be cached #838 * `CacheFor` key shall include `Accept` type #836 * Add render image support #834 * Optimise `LogSupport` for `DestroyableBase` #833 diff --git a/src/main/java/act/controller/CacheSupportMetaInfo.java b/src/main/java/act/controller/CacheSupportMetaInfo.java index f0d6e5093..247036d2a 100644 --- a/src/main/java/act/controller/CacheSupportMetaInfo.java +++ b/src/main/java/act/controller/CacheSupportMetaInfo.java @@ -30,6 +30,7 @@ public class CacheSupportMetaInfo { public int ttl; public boolean supportPost; public boolean usePrivate; + public boolean noCacheControl; private CacheSupportMetaInfo() {} @@ -41,13 +42,14 @@ public static CacheSupportMetaInfo disabled() { return new CacheSupportMetaInfo(); } - public static CacheSupportMetaInfo enabled($.Function keyGenerator, int ttl, boolean supportPost, boolean usePrivate) { + public static CacheSupportMetaInfo enabled($.Function keyGenerator, int ttl, boolean supportPost, boolean usePrivate, boolean noCacheControl) { CacheSupportMetaInfo meta = new CacheSupportMetaInfo(); meta.enabled = true; meta.ttl = ttl; meta.supportPost = supportPost; meta.usePrivate = usePrivate; meta.keyGenerator = $.requireNotNull(keyGenerator); + meta.noCacheControl = noCacheControl; return meta; } } diff --git a/src/main/java/act/controller/ResponseCache.java b/src/main/java/act/controller/ResponseCache.java index 04feb05e4..3eb2f7d02 100644 --- a/src/main/java/act/controller/ResponseCache.java +++ b/src/main/java/act/controller/ResponseCache.java @@ -39,6 +39,7 @@ public class ResponseCache extends ActResponse implements Serializable { private Map cookies = new HashMap<>(); private Map headers = new HashMap<>(); + private Long len; private H.Status status; private String etag; @@ -174,28 +175,6 @@ public H.Response initContentType(String type) { return this; } - @Override - public H.Response contentDisposition(String filename, boolean inline) { - realResponse.contentDisposition(filename, inline); - // set through header call - return this; - } - - @Override - public H.Response prepareDownload(String filename) { - realResponse.prepareDownload(filename); - // set through header call - return this; - } - - @Override - public H.Response etag(String etag) { - this.etag = etag; - realResponse.etag(etag); - // set through header call - return this; - } - @Override public H.Response locale(Locale locale) { realResponse.locale(locale); diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index 900d51ea9..071035eba 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -218,7 +218,9 @@ public void handle(ActionContext context) { } if (supportCache) { String s = cacheSupport.usePrivate ? "private, max-age=" : "public, max-age="; - context.resp().addHeaderIfNotAdded(H.Header.Names.CACHE_CONTROL, s + cacheSupport.ttl); + if (!cacheSupport.noCacheControl) { + context.resp().addHeaderIfNotAdded(H.Header.Names.CACHE_CONTROL, s + cacheSupport.ttl); + } } onResult(result, context); if (supportCache) { diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 650393047..9e65ecb09 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -745,7 +745,8 @@ private void initCacheParams(AppConfig config) { new CacheKeyBuilder(cacheFor, S.concat(controllerClass.getName(), ".", method.getName())), cacheFor.value(), cacheFor.supportPost(), - cacheFor.usePrivate() + cacheFor.usePrivate(), + cacheFor.noCacheControl() ); } diff --git a/src/main/java/act/util/CacheFor.java b/src/main/java/act/util/CacheFor.java index 895020ac2..b8ee798b9 100644 --- a/src/main/java/act/util/CacheFor.java +++ b/src/main/java/act/util/CacheFor.java @@ -64,4 +64,10 @@ * @return */ boolean usePrivate() default false; + + /** + * Suppress `Cache-Control` header setting. + * @return + */ + boolean noCacheControl() default false; } From 4ce575e33af791a48dc655e8453f816ae16efb19 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 15 Sep 2018 22:43:02 +1000 Subject: [PATCH 105/730] Provide a mechanism to allow developer advice on return value of request handler method #835 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 9 +++ src/main/java/act/conf/AppConfig.java | 27 ++++++++ src/main/java/act/conf/AppConfigKey.java | 8 +++ .../act/controller/CacheSupportMetaInfo.java | 4 +- .../java/act/handler/NoReturnValueAdvice.java | 34 ++++++++++ .../java/act/handler/ReturnValueAdvice.java | 27 ++++++++ .../java/act/handler/ReturnValueAdvisor.java | 34 ++++++++++ .../controller/RequestHandlerProxy.java | 29 +++++++-- .../impl/ReflectedHandlerInvoker.java | 26 ++++++-- src/main/java/act/route/Router.java | 4 +- src/main/java/act/util/CacheFor.java | 65 +++++++++++++++++-- .../main/java/ghissues/BaseController.java | 8 +++ .../src/main/java/ghissues/Gh784.java | 2 +- .../src/main/java/ghissues/Gh786.java | 3 +- .../src/main/java/ghissues/Gh790.java | 2 +- .../src/main/java/ghissues/Gh796.java | 2 +- .../src/main/java/ghissues/Gh797.java | 3 +- .../src/main/java/ghissues/Gh798.java | 3 +- .../src/main/java/ghissues/Gh809.java | 3 +- .../src/main/java/ghissues/Gh819.java | 3 +- .../src/main/java/ghissues/Gh820.java | 4 +- .../src/main/java/ghissues/Gh821.java | 3 +- .../src/main/java/ghissues/Gh823.java | 3 +- .../src/main/java/ghissues/Gh829.java | 3 +- .../src/main/java/ghissues/Gh830.java | 3 +- .../src/main/java/ghissues/Gh832.java | 2 +- .../src/main/java/ghissues/Gh834.java | 5 +- .../src/main/java/ghissues/Gh835.java | 39 +++++++++++ ...ntroller.java => Gh820BaseController.java} | 4 +- .../src/main/resources/conf/app.properties | 1 + .../src/main/resources/test/scenarios/835.yml | 17 +++++ 32 files changed, 335 insertions(+), 46 deletions(-) create mode 100644 src/main/java/act/handler/NoReturnValueAdvice.java create mode 100644 src/main/java/act/handler/ReturnValueAdvice.java create mode 100644 src/main/java/act/handler/ReturnValueAdvisor.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/BaseController.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh835.java rename testapps/GHIssues/src/main/java/ghissues/gh820/{BaseController.java => Gh820BaseController.java} (56%) create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/835.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a30cd4ab..f357dbcf3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * `CacheFor` - make it allow skip `Cache-Control` header #837 * `ResponseCache` - content disposition shall be cached #838 * `CacheFor` key shall include `Accept` type #836 +* Provide a mechanism to allow developer advice on return value of request handler method #835 * Add render image support #834 * Optimise `LogSupport` for `DestroyableBase` #833 * Allow app developer to specify download file name #829 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 4e3a64e36..896faf80a 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -32,6 +32,7 @@ import act.event.ActEvent; import act.event.SystemEvent; import act.handler.RequestHandler; +import act.handler.builtin.controller.RequestHandlerProxy; import act.handler.builtin.controller.impl.ReflectedHandlerInvoker; import act.i18n.LocaleResolver; import act.route.Router; @@ -460,6 +461,14 @@ public boolean isByPassImplicitTemplateVariable() { return this.byPassImplicitTemplateVariable; } + public ActionContext resetCache() { + RequestHandler handler = handler(); + if (handler instanceof RequestHandlerProxy) { + ((RequestHandlerProxy) handler).resetCache(); + } + return this; + } + public ActionContext urlContext(String context) { this.urlContext = context; return this; diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 0f585eefc..b151d1766 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -36,6 +36,7 @@ import act.data.DateTimeType; import act.db.util.SequenceNumberGenerator; import act.db.util._SequenceNumberGenerator; +import act.handler.ReturnValueAdvice; import act.handler.UnknownHttpMethodProcessor; import act.handler.event.ResultEvent; import act.i18n.I18n; @@ -1096,6 +1097,32 @@ private void _mergeXForwardedProtocol(AppConfig conf) { } } + private ReturnValueAdvice globalReturnValueAdvice; + private Boolean globalReturnValueAdviceSet; + + protected T globalReturnValueAdvice(ReturnValueAdvice advice) { + this.globalReturnValueAdvice = $.requireNotNull(advice); + return me(); + } + + public ReturnValueAdvice globalReturnValueAdvice() { + if (null != globalReturnValueAdvice) { + return globalReturnValueAdvice; + } + if (null == globalReturnValueAdviceSet) { + globalReturnValueAdviceSet = true; + String s = get(GLOBAL_RETURN_VALUE_ADVICE, null); + if (null != s) { + try { + globalReturnValueAdvice = app.getInstance(s); + } catch (Exception e) { + throw new ConfigurationException("Error loading global returnValueAdvice: " + s); + } + } + } + return globalReturnValueAdvice; + } + private Boolean contentSuffixAware = null; diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 7747e22c7..723e0082d 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -464,6 +464,14 @@ public enum AppConfigKey implements ConfigKey { */ FORMAT_TIME("fmt.time"), + /** + * `globalReturnValueAdvice` specifies the global {@link act.handler.ReturnValueAdvice} + * type. + * + * Default value: null + */ + GLOBAL_RETURN_VALUE_ADVICE("globalReturnValueAdvice"), + /** * `act.handler.csrf_check_failure.impl` specifies the implementation * for {@link act.util.MissingAuthenticationHandler} diff --git a/src/main/java/act/controller/CacheSupportMetaInfo.java b/src/main/java/act/controller/CacheSupportMetaInfo.java index 247036d2a..5b119caf1 100644 --- a/src/main/java/act/controller/CacheSupportMetaInfo.java +++ b/src/main/java/act/controller/CacheSupportMetaInfo.java @@ -28,6 +28,7 @@ public class CacheSupportMetaInfo { public $.Function keyGenerator; public boolean enabled; public int ttl; + public String id; public boolean supportPost; public boolean usePrivate; public boolean noCacheControl; @@ -42,9 +43,10 @@ public static CacheSupportMetaInfo disabled() { return new CacheSupportMetaInfo(); } - public static CacheSupportMetaInfo enabled($.Function keyGenerator, int ttl, boolean supportPost, boolean usePrivate, boolean noCacheControl) { + public static CacheSupportMetaInfo enabled($.Function keyGenerator, String cacheForId, int ttl, boolean supportPost, boolean usePrivate, boolean noCacheControl) { CacheSupportMetaInfo meta = new CacheSupportMetaInfo(); meta.enabled = true; + meta.id = cacheForId; meta.ttl = ttl; meta.supportPost = supportPost; meta.usePrivate = usePrivate; diff --git a/src/main/java/act/handler/NoReturnValueAdvice.java b/src/main/java/act/handler/NoReturnValueAdvice.java new file mode 100644 index 000000000..aa3acf5b6 --- /dev/null +++ b/src/main/java/act/handler/NoReturnValueAdvice.java @@ -0,0 +1,34 @@ +package act.handler; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Mark a controller class or request handler method to make + * it suppress the application of + * {@link act.conf.AppConfigKey#GLOBAL_RETURN_VALUE_ADVICE globalReturnValueAdvice} + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE}) +@Inherited +public @interface NoReturnValueAdvice { +} diff --git a/src/main/java/act/handler/ReturnValueAdvice.java b/src/main/java/act/handler/ReturnValueAdvice.java new file mode 100644 index 000000000..d471f5299 --- /dev/null +++ b/src/main/java/act/handler/ReturnValueAdvice.java @@ -0,0 +1,27 @@ +package act.handler; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.ActionContext; + +public interface ReturnValueAdvice { + Object applyTo(Object returnValue, ActionContext context); +} diff --git a/src/main/java/act/handler/ReturnValueAdvisor.java b/src/main/java/act/handler/ReturnValueAdvisor.java new file mode 100644 index 000000000..b6529d267 --- /dev/null +++ b/src/main/java/act/handler/ReturnValueAdvisor.java @@ -0,0 +1,34 @@ +package act.handler; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Mark a controller class or request handle method is subject to + * the application of a {@link ReturnValueAdvice}. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE}) +@Inherited +public @interface ReturnValueAdvisor { + Class value(); +} diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index 071035eba..8f1423638 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -35,9 +35,7 @@ import act.handler.RequestHandlerBase; import act.security.CORS; import act.security.CSRF; -import act.util.AnnotatedClassFinder; -import act.util.Global; -import act.util.MissingAuthenticationHandler; +import act.util.*; import act.view.ActErrorResult; import act.view.RenderAny; import act.xio.WebSocketConnectionHandler; @@ -60,6 +58,8 @@ @ApplicationScoped public final class RequestHandlerProxy extends RequestHandlerBase { + public static final String CACHE_NAME = "__action_proxy__"; + private static Logger logger = L.get(RequestHandlerProxy.class); private static final List globalBeforeInterceptors = new ArrayList<>(); @@ -83,6 +83,7 @@ public final class RequestHandlerProxy extends RequestHandlerBase { private String actionMethodName; private String actionPath; private Method actionMethod; + private Set cacheKeys = new HashSet<>(); private volatile ControllerAction actionHandler = null; private List beforeInterceptors = new ArrayList<>(); @@ -98,6 +99,8 @@ public final class RequestHandlerProxy extends RequestHandlerBase { private MissingAuthenticationHandler missingAuthenticationHandler; private MissingAuthenticationHandler csrfFailureHandler; + private CacheFor.Manager cacheForManager; + private WebSocketConnectionHandler webSocketConnectionHandler; final GroupInterceptorWithResult BEFORE_INTERCEPTOR = new GroupInterceptorWithResult(beforeInterceptors); @@ -116,12 +119,12 @@ public RequestHandlerProxy(final String actionMethodName, final App app) { E.illegalArgumentIf(S.isEmpty(this.actionMethodName), ERR, actionMethodName); this.actionPath = actionMethodName; if (app.classLoader() != null) { - cache = app.config().cacheService("action_proxy"); + cache = app.config().cacheService(CACHE_NAME); } else { app.jobManager().on(SysEventId.CLASS_LOADER_INITIALIZED, new Runnable() { @Override public void run() { - cache = app.config().cacheService("action_proxy"); + cache = app.config().cacheService(CACHE_NAME); } }); } @@ -139,6 +142,7 @@ protected void releaseResources() { actionHandler.destroy(); actionHandler = null; } + cacheForManager = null; } public static void releaseGlobalResources() { @@ -225,6 +229,7 @@ public void handle(ActionContext context) { onResult(result, context); if (supportCache) { this.cache.put(cacheKey, context.resp(), cacheSupport.ttl); + cacheKeys.add(cacheKey); } } catch (Exception e) { H.Request req = context.req(); @@ -278,6 +283,14 @@ public boolean skipEvents(ActionContext context) { return skipEvents; } + public void resetCache() { + if (supportCache) { + for (String cacheKey : cacheKeys) { + cache.evict(cacheKey); + } + } + } + protected final void registerBeforeInterceptor(BeforeInterceptor interceptor) { insertInterceptor(beforeInterceptors, interceptor); } @@ -409,6 +422,12 @@ private void generateHandlers() { App app = this.app; if (supportCache) { cache = app.cache(); + cacheForManager = app.getInstance(CacheFor.Manager.class); + cacheForManager.register(actionPath, this); + String cacheForId = cacheSupport.id; + if (S.notBlank(cacheForId)) { + cacheForManager.register(cacheForId, this); + } } GroupInterceptorMetaInfo interceptorMetaInfo = new GroupInterceptorMetaInfo(actionInfo.interceptors()); diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 9e65ecb09..367cce5f9 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -39,9 +39,7 @@ import act.data.annotation.DateFormatPattern; import act.data.annotation.Pattern; import act.db.RequireDataBind; -import act.handler.NonBlock; -import act.handler.PreventDoubleSubmission; -import act.handler.SkipBuiltInEvents; +import act.handler.*; import act.handler.builtin.controller.*; import act.handler.event.ReflectedHandlerInvokerInit; import act.handler.event.ReflectedHandlerInvokerInvoke; @@ -166,6 +164,8 @@ public void visit(H.Format format) throws $.Break { private boolean suppressJsonDateFormat; // see https://github.com/actframework/actframework/issues/829 private String downloadFilename; + // see https://github.com/actframework/actframework/issues/835 + private ReturnValueAdvice returnValueAdvice; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -202,6 +202,15 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { method.setAccessible(true); } + if (handlerMetaInfo.hasReturn()) { + ReturnValueAdvisor advisor = getAnnotation(ReturnValueAdvisor.class); + if (null != advisor) { + returnValueAdvice = app.getInstance(advisor.value()); + } else if (!hasAnnotation(NoReturnValueAdvice.class)) { + returnValueAdvice = app.config().globalReturnValueAdvice(); + } + } + if (method.isAnnotationPresent(RequireCaptcha.class)) { this.requireCaptcha = true; } @@ -743,6 +752,7 @@ private void initCacheParams(AppConfig config) { CacheFor cacheFor = method.getAnnotation(CacheFor.class); cacheSupport = null == cacheFor ? CacheSupportMetaInfo.disabled() : CacheSupportMetaInfo.enabled( new CacheKeyBuilder(cacheFor, S.concat(controllerClass.getName(), ".", method.getName())), + cacheFor.id(), cacheFor.value(), cacheFor.supportPost(), cacheFor.usePrivate(), @@ -878,15 +888,16 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle } throw e; } - return transform(retVal, this, context); + return transform(retVal, this, context, returnValueAdvice); } - public static Result transform(Object retVal, ReflectedHandlerInvoker invoker, ActionContext context) { + public static Result transform(Object retVal, ReflectedHandlerInvoker invoker, ActionContext context, ReturnValueAdvice returnValueAdvice) { if (context.resp().isClosed()) { return null; } HandlerMethodMetaInfo handlerMetaInfo = invoker.handler; - if (null == retVal && handlerMetaInfo.hasReturn() && !handlerMetaInfo.returnTypeInfo().isResult()) { + final boolean hasReturn = handlerMetaInfo.hasReturn() && !handlerMetaInfo.returnTypeInfo().isResult(); + if (null == retVal && hasReturn) { // ActFramework respond 404 Not Found when // handler invoker return `null` // and there are return type of the action method signature @@ -894,6 +905,9 @@ public static Result transform(Object retVal, ReflectedHandlerInvoker invoker, A return ActNotFound.create(); } boolean hasTemplate = invoker.checkTemplate(context); + if (!hasTemplate && hasReturn && null != returnValueAdvice) { + retVal = returnValueAdvice.applyTo(retVal, context); + } if (hasTemplate && retVal instanceof RenderAny) { retVal = RenderTemplate.INSTANCE; } diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 33f517c7b..91d8be526 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -106,10 +106,10 @@ private void initControllerLookup(RequestHandlerResolver lookup) { lookup = new RequestHandlerResolverBase() { @Override public RequestHandler resolve(String payload, App app) { - if (S.eq(WsEndpoint.PSEUDO_METHOD, payload.toString())) { + if (S.eq(WsEndpoint.PSEUDO_METHOD, payload)) { return Act.network().createWebSocketConnectionHandler(); } - return new RequestHandlerProxy(payload.toString(), app); + return new RequestHandlerProxy(payload, app); } }; diff --git a/src/main/java/act/util/CacheFor.java b/src/main/java/act/util/CacheFor.java index b8ee798b9..19041df29 100644 --- a/src/main/java/act/util/CacheFor.java +++ b/src/main/java/act/util/CacheFor.java @@ -20,10 +20,14 @@ * #L% */ -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import act.handler.builtin.controller.RequestHandlerProxy; +import org.osgl.util.E; +import org.osgl.util.S; + +import java.lang.annotation.*; +import java.util.HashMap; +import java.util.Map; +import javax.inject.Singleton; /** * Mark an action handler method result can be cached @@ -31,6 +35,13 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface CacheFor { + + /** + * Application specify the ID of the CacheFor and use it + * to reset cache + */ + String id() default ""; + /** * Specify cache expiration time in seconds * @@ -70,4 +81,50 @@ * @return */ boolean noCacheControl() default false; + + @Singleton + class Manager extends LogSupportedDestroyableBase { + + private Map proxyLookup = new HashMap<>(); + + @Override + protected void releaseResources() { + proxyLookup.clear(); + proxyLookup = null; + } + + public void register(String key, RequestHandlerProxy proxy) { + RequestHandlerProxy existing = proxyLookup.put(key, proxy); + E.illegalStateIf(null != existing, "proxy already registered with key[%s]: %s", key, proxy); + } + + /** + * Reset CacheFor cache for a request handler specified by controller class and + * request handler method name. + * @param controllerClass + * the host class of the handler method + * @param requestHandlerName + * the request handler method name + */ + public void resetCache(Class controllerClass, String requestHandlerName) { + String key = S.pathConcat(controllerClass.getName(), '.', requestHandlerName); + resetCache(key); + } + + /** + * Reset CacheFor cache for a request handler specified + * by {@link CacheFor#id()}. + * + * @param cacheForId + * the cacheFor id + */ + public void resetCache(String cacheForId) { + RequestHandlerProxy proxy = proxyLookup.get(cacheForId); + if (null == proxy) { + warn("Cannot find proxy by key: " + cacheForId); + } else { + proxy.resetCache(); + } + } + } } diff --git a/testapps/GHIssues/src/main/java/ghissues/BaseController.java b/testapps/GHIssues/src/main/java/ghissues/BaseController.java new file mode 100644 index 000000000..4dd201b76 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/BaseController.java @@ -0,0 +1,8 @@ +package ghissues; + +import act.handler.NoReturnValueAdvice; +import act.util.LogSupport; + +@NoReturnValueAdvice +public class BaseController extends LogSupport { +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh784.java b/testapps/GHIssues/src/main/java/ghissues/Gh784.java index f23ea7613..ecf25a47d 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh784.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh784.java @@ -3,7 +3,7 @@ import act.data.annotation.Data; import org.osgl.mvc.annotation.GetAction; -public class Gh784 { +public class Gh784 extends BaseController { @Data public static class Foo {} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh786.java b/testapps/GHIssues/src/main/java/ghissues/Gh786.java index 1230be8f7..c2c914c8b 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh786.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh786.java @@ -2,10 +2,9 @@ import act.data.annotation.Data; import act.util.AdaptiveBean; -import act.util.LogSupport; import org.osgl.mvc.annotation.GetAction; -public class Gh786 extends LogSupport { +public class Gh786 extends BaseController { @Data public static class FooBase { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh790.java b/testapps/GHIssues/src/main/java/ghissues/Gh790.java index a09914f6e..c9a99d1c5 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh790.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh790.java @@ -11,7 +11,7 @@ @UrlContext("790") @JsonView -public class Gh790 extends LogSupport { +public class Gh790 extends BaseController { @Data public static class Student implements SimpleBean { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh796.java b/testapps/GHIssues/src/main/java/ghissues/Gh796.java index 96bb7b9b5..589387c53 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh796.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh796.java @@ -8,7 +8,7 @@ @UrlContext("796") @JsonView -public class Gh796 extends LogSupport { +public class Gh796 extends BaseController { public static class Foo { public String text = S.random(); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh797.java b/testapps/GHIssues/src/main/java/ghissues/Gh797.java index dddc0ec0a..50b00d95a 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh797.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh797.java @@ -2,14 +2,13 @@ import act.controller.annotation.UrlContext; import act.util.JsonView; -import act.util.LogSupport; import org.osgl.mvc.annotation.GetAction; import java.util.Date; @UrlContext("797") @JsonView -public class Gh797 extends LogSupport { +public class Gh797 extends BaseController { public static class Foo { public Date date = new Date(); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh798.java b/testapps/GHIssues/src/main/java/ghissues/Gh798.java index c21c3838c..9390cbeff 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh798.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh798.java @@ -2,7 +2,6 @@ import act.controller.annotation.UrlContext; import act.util.JsonView; -import act.util.LogSupport; import com.alibaba.fastjson.annotation.JSONField; import org.osgl.mvc.annotation.GetAction; @@ -10,7 +9,7 @@ @UrlContext("798") @JsonView -public class Gh798 extends LogSupport { +public class Gh798 extends BaseController { public static class Foo { @JSONField(format = "yyyy-MM") diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh809.java b/testapps/GHIssues/src/main/java/ghissues/Gh809.java index 70ceb7a02..fdb136dba 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh809.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh809.java @@ -4,11 +4,10 @@ import act.Act; import act.controller.annotation.UrlContext; -import act.util.LogSupport; import org.osgl.mvc.annotation.GetAction; @UrlContext("809") -public class Gh809 extends LogSupport { +public class Gh809 extends BaseController { @GetAction public void index() { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh819.java b/testapps/GHIssues/src/main/java/ghissues/Gh819.java index 549ca6ba2..17a74669d 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh819.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh819.java @@ -2,10 +2,9 @@ import act.controller.annotation.UrlContext; import act.util.JsonView; -import act.util.LogSupport; import org.osgl.mvc.annotation.PostAction; -public abstract class Gh819 extends LogSupport { +public abstract class Gh819 extends BaseController { public static class Foo { public String name; diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh820.java b/testapps/GHIssues/src/main/java/ghissues/Gh820.java index 9cc39c2ba..8cae69d99 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh820.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh820.java @@ -1,14 +1,14 @@ package ghissues; import act.controller.annotation.UrlContext; -import ghissues.gh820.BaseController; +import ghissues.gh820.Gh820BaseController; import ghissues.gh820.IntegerService; import org.osgl.mvc.annotation.GetAction; import java.util.List; @UrlContext("820") -public class Gh820 extends BaseController { +public class Gh820 extends Gh820BaseController { @GetAction public List get() { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh821.java b/testapps/GHIssues/src/main/java/ghissues/Gh821.java index 59501d139..eaed718b2 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh821.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh821.java @@ -1,11 +1,10 @@ package ghissues; import act.controller.annotation.UrlContext; -import act.util.LogSupport; import org.osgl.mvc.annotation.GetAction; @UrlContext("821") -public class Gh821 extends LogSupport { +public class Gh821 extends BaseController { @GetAction("invalid_json") public String getInvalidJSON() { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh823.java b/testapps/GHIssues/src/main/java/ghissues/Gh823.java index 4625e2f27..227e67961 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh823.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh823.java @@ -4,7 +4,6 @@ import act.db.DbBind; import act.db.jpa.JPADao; import act.db.sql.tx.Transactional; -import act.util.LogSupport; import act.util.PropertySpec; import ghissues.gh823.Gh823User; import org.osgl.$; @@ -13,7 +12,7 @@ import javax.inject.Inject; @UrlContext("823") -public class Gh823 extends LogSupport { +public class Gh823 extends BaseController { @Inject private JPADao userDao; diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh829.java b/testapps/GHIssues/src/main/java/ghissues/Gh829.java index adddacbd6..b1fc63053 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh829.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh829.java @@ -5,7 +5,6 @@ import act.controller.annotation.UrlContext; import act.inject.param.NoBind; import act.job.OnAppStart; -import act.util.LogSupport; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.S; @@ -13,7 +12,7 @@ import java.util.List; @UrlContext("829") -public class Gh829 extends LogSupport { +public class Gh829 extends BaseController { public static class Foo { public String name = S.random(); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh830.java b/testapps/GHIssues/src/main/java/ghissues/Gh830.java index 3cca3e36a..197705412 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh830.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh830.java @@ -1,7 +1,6 @@ package ghissues; import act.controller.annotation.UrlContext; -import act.util.LogSupport; import cn.hutool.http.HttpUtil; import org.osgl.mvc.annotation.PostAction; @@ -9,7 +8,7 @@ import java.util.Map; @UrlContext("830") -public class Gh830 extends LogSupport { +public class Gh830 extends BaseController { @PostAction("svc/{url}") public String server(String url,String dataJson) { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh832.java b/testapps/GHIssues/src/main/java/ghissues/Gh832.java index 506664da0..ca5065fe0 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh832.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh832.java @@ -4,7 +4,7 @@ import org.osgl.mvc.annotation.GetAction; @UrlContext("832") -public class Gh832 { +public class Gh832 extends BaseController { @GetAction("/post/{cityId}") public int action(int cityId) { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh834.java b/testapps/GHIssues/src/main/java/ghissues/Gh834.java index 52ac8b95f..c63da9064 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh834.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh834.java @@ -1,6 +1,7 @@ package ghissues; -import act.controller.Controller; +import static act.controller.Controller.Util.renderImage; + import act.controller.annotation.UrlContext; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.Img; @@ -8,7 +9,7 @@ import java.awt.image.BufferedImage; @UrlContext("834") -public class Gh834 extends Controller.Util { +public class Gh834 extends BaseController { @GetAction public void test() { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh835.java b/testapps/GHIssues/src/main/java/ghissues/Gh835.java new file mode 100644 index 000000000..f6e0ce72d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh835.java @@ -0,0 +1,39 @@ +package ghissues; + +import act.app.ActionContext; +import act.controller.Controller; +import act.controller.annotation.UrlContext; +import act.handler.ReturnValueAdvice; +import act.handler.ReturnValueAdvisor; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +@UrlContext("835") +public class Gh835 extends Controller.Util { + + public static class GenkoAdvice implements ReturnValueAdvice { + @Override + public Object applyTo(Object o, ActionContext actionContext) { + return C.Map("code", 0, "data", o); + } + } + + public static class GlobalAdvice implements ReturnValueAdvice { + @Override + public Object applyTo(Object o, ActionContext actionContext) { + return C.Map("code", 1, "data", o); + } + } + + @GetAction("withSpecificAdvice") + @ReturnValueAdvisor(GenkoAdvice.class) + public String test1() { + return "Hello Genko!"; + } + + @GetAction("withGlobalAdvice") + public Integer test2() { + return 5; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/BaseController.java b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820BaseController.java similarity index 56% rename from testapps/GHIssues/src/main/java/ghissues/gh820/BaseController.java rename to testapps/GHIssues/src/main/java/ghissues/gh820/Gh820BaseController.java index 2890cf17c..25cdd3cac 100644 --- a/testapps/GHIssues/src/main/java/ghissues/gh820/BaseController.java +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820BaseController.java @@ -1,10 +1,10 @@ package ghissues.gh820; -import act.util.LogSupport; +import ghissues.BaseController; import javax.inject.Inject; -public class BaseController> extends LogSupport { +public class Gh820BaseController> extends BaseController { @Inject private SERVICE service; diff --git a/testapps/GHIssues/src/main/resources/conf/app.properties b/testapps/GHIssues/src/main/resources/conf/app.properties index 7612bb6a7..0f6e9f560 100644 --- a/testapps/GHIssues/src/main/resources/conf/app.properties +++ b/testapps/GHIssues/src/main/resources/conf/app.properties @@ -1,3 +1,4 @@ +globalReturnValueAdvice=ghissues.Gh835$GlobalAdvice ############################################## # Application configuration # act-1.8.8-RC12-SNAPSHOT diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/835.yml b/testapps/GHIssues/src/main/resources/test/scenarios/835.yml new file mode 100644 index 000000000..ed7ea6059 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/835.yml @@ -0,0 +1,17 @@ +Scenario(GH829): + description: "[835] Provide a mechanism to allow developer advice on return value of request handler method" + interactions: + - description: test specified advice + request: + get: 835/withSpecificAdvice + response: + json: + code: 0 + data: Hello Genko! + - description: test global advice + request: + get: 835/withGlobalAdvice + response: + json: + code: 1 + data: 5 From 714073c8b6de0c9efbcc51e77a9e0d1f75f20dca Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 15 Sep 2018 23:07:41 +1000 Subject: [PATCH 106/730] fix #835 - @NoReturnVaule on method shall overwrite @ReturnValueAdvice on class --- .../impl/ReflectedHandlerInvoker.java | 4 ++-- .../src/main/java/ghissues/Gh835a.java | 19 +++++++++++++++++++ .../src/main/resources/test/scenarios/835.yml | 8 +++++++- 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh835a.java diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 367cce5f9..c3dd81b23 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -202,11 +202,11 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { method.setAccessible(true); } - if (handlerMetaInfo.hasReturn()) { + if (handlerMetaInfo.hasReturn() && null == method.getAnnotation(NoReturnValueAdvice.class)) { ReturnValueAdvisor advisor = getAnnotation(ReturnValueAdvisor.class); if (null != advisor) { returnValueAdvice = app.getInstance(advisor.value()); - } else if (!hasAnnotation(NoReturnValueAdvice.class)) { + } else if (null == controllerClass.getAnnotation(NoReturnValueAdvice.class)) { returnValueAdvice = app.config().globalReturnValueAdvice(); } } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh835a.java b/testapps/GHIssues/src/main/java/ghissues/Gh835a.java new file mode 100644 index 000000000..7f9d580f2 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh835a.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.Controller; +import act.controller.annotation.UrlContext; +import act.handler.NoReturnValueAdvice; +import act.handler.ReturnValueAdvisor; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("835a") +@ReturnValueAdvisor(Gh835.GenkoAdvice.class) +public class Gh835a extends Controller.Util { + + @NoReturnValueAdvice + @GetAction + public Integer test() { + return 5; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/835.yml b/testapps/GHIssues/src/main/resources/test/scenarios/835.yml index ed7ea6059..48e39ccba 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/835.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/835.yml @@ -1,4 +1,4 @@ -Scenario(GH829): +Scenario(GH835): description: "[835] Provide a mechanism to allow developer advice on return value of request handler method" interactions: - description: test specified advice @@ -15,3 +15,9 @@ Scenario(GH829): json: code: 1 data: 5 + - description: test NoReturnValueAdvice on method to ignore @ReturnVakenenglueAdvisor on class + request: + get: 835a + response: + json: + result: 5 \ No newline at end of file From 8ce78a8ed4d6084ff0c383acfad869427b37d408 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 16 Sep 2018 10:09:20 +1000 Subject: [PATCH 107/730] allow app to specify unauthorised error response app error code and message --- src/main/java/act/controller/Controller.java | 24 ++++++++++++++++++++ src/main/java/act/view/ActUnauthorized.java | 16 +++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 69f5319fd..9abe82e98 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -722,6 +722,30 @@ public static Unauthorized unauthorized() { return ActUnauthorized.create(); } + /** + * Returns a {@link Unauthorized} instance with error code specified. + * + * @param errorCode + * the application error code. + * @return a 401 Unauthorized result + */ + public static Unauthorized unauthorized(int errorCode) { + return ActUnauthorized.create(errorCode); + } + + /** + * Returns a {@link Unauthorized} instance with error code specified. + * + * @param errorCode + * the application error code. + * @param message + * the application error message. + * @return a 401 Unauthorized result + */ + public static Unauthorized unauthorized(int errorCode, String message) { + return ActUnauthorized.create(errorCode, message); + } + /** * Returns a {@link Unauthorized} instance with `realm` specified. * diff --git a/src/main/java/act/view/ActUnauthorized.java b/src/main/java/act/view/ActUnauthorized.java index 0ac5f6005..9a5d7d99c 100644 --- a/src/main/java/act/view/ActUnauthorized.java +++ b/src/main/java/act/view/ActUnauthorized.java @@ -36,6 +36,14 @@ public ActUnauthorized() { super(); } + public ActUnauthorized(int errorCode) { + super(errorCode); + } + + public ActUnauthorized(int errorCode, String message) { + super(errorCode, message); + } + public ActUnauthorized(String realm) { super(realm); } @@ -74,6 +82,14 @@ public static Unauthorized create() { return Act.isDev() ? new ActUnauthorized() : Unauthorized.get(); } + public static Unauthorized create(int errorCode) { + return Act.isDev() ? new ActUnauthorized(errorCode) : Unauthorized.of(errorCode); + } + + public static Unauthorized create(int errorCode, String message) { + return Act.isDev() ? new ActUnauthorized(errorCode, message) : Unauthorized.of(errorCode, message); + } + public static Unauthorized create(String realm) { return Act.isDev() ? new ActUnauthorized(realm) : Unauthorized.of(realm); } From 4c0fd258e79ae764748ed495c57c2d46a8f69609 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 18 Sep 2018 16:13:18 +1000 Subject: [PATCH 108/730] test case for GH841; hook API doc to /~/api --- src/main/java/act/apidoc/ApiManager.java | 1 + .../src/main/java/ghissues/Gh841.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh841.java diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index fdda6a79c..39a19cc87 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -89,6 +89,7 @@ public void run() { app.router().addMapping(H.Method.GET, "/~/apibook/endpoints", new GetEndpointsHandler(this)); app.router().addMapping(H.Method.GET, "/~/apibook/modules", new GetModulesHandler(this)); ResourceGetter apidocHandler = new ResourceGetter("asset/~act/apibook/index.html"); + app.router().addMapping(H.Method.GET, "/~/api", apidocHandler); app.router().addMapping(H.Method.GET, "/~/apibook", apidocHandler); app.router().addMapping(H.Method.GET, "/~/apidoc", apidocHandler); } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh841.java b/testapps/GHIssues/src/main/java/ghissues/Gh841.java new file mode 100644 index 000000000..4f5028058 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh841.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.Controller; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.Map; + +@UrlContext("841") +public class Gh841 extends BaseController { + + @GetAction + public Map test(boolean fail) { + Controller.Util.unauthorizedIf(fail); + return C.Map("token", "aaa"); + } + +} From f2ca2c11f7f1d33ff264406c7bfacb2d0e327605 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 18 Sep 2018 18:23:20 +1000 Subject: [PATCH 109/730] It takes over 20s to bootstrap app in dev mode with large file in resources dir #846 --- CHANGELOG.md | 1 + src/main/java/act/app/AppBuilder.java | 8 ++-- src/main/java/act/app/DevModeClassLoader.java | 39 +++++++++++++++---- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f357dbcf3..b3aaedda1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* It takes over 20s to bootstrap app in dev mode with large file in resources dir #846 * `CacheFor` - make it allow skip `Cache-Control` header #837 * `ResponseCache` - content disposition shall be cached #838 * `CacheFor` key shall include `Accept` type #836 diff --git a/src/main/java/act/app/AppBuilder.java b/src/main/java/act/app/AppBuilder.java index bccd3934b..bc00d79cb 100644 --- a/src/main/java/act/app/AppBuilder.java +++ b/src/main/java/act/app/AppBuilder.java @@ -20,14 +20,14 @@ * #L% */ +import static act.app.RuntimeDirs.*; + import act.Act; import org.osgl.util.E; import org.osgl.util.IO; import java.io.File; -import static act.app.RuntimeDirs.*; - /** * Build Application when Act running in DEV mode. * TODO: we probably don't need to copy resources in DEV mode @@ -64,8 +64,8 @@ private AppBuilder(App app) { } public void build() { - prepareTargetDir(); - copyFiles(); + //prepareTargetDir(); + //copyFiles(); } private void prepareTargetDir() { diff --git a/src/main/java/act/app/DevModeClassLoader.java b/src/main/java/act/app/DevModeClassLoader.java index 7dd6037e2..4b80e8a58 100644 --- a/src/main/java/act/app/DevModeClassLoader.java +++ b/src/main/java/act/app/DevModeClassLoader.java @@ -20,25 +20,23 @@ * #L% */ +import static act.app.App.F.*; + import act.Act; import act.controller.meta.ControllerClassMetaInfo; import act.metric.Timer; -import act.util.Files; -import act.util.FsChangeDetector; -import act.util.FsEvent; -import act.util.FsEventListener; +import act.util.*; import org.osgl.$; import org.osgl.exception.NotAppliedException; import org.osgl.logging.L; import org.osgl.logging.Logger; -import org.osgl.util.C; -import org.osgl.util.S; +import org.osgl.util.*; import java.io.File; +import java.io.InputStream; +import java.net.URL; import java.util.*; -import static act.app.App.F.*; - /** * Dev mode application class loader, which is able to * load classes directly from app src folder @@ -85,6 +83,31 @@ public ControllerClassMetaInfo controllerClassMetaInfo(String controllerClassNam return super.controllerClassMetaInfo(controllerClassName); } + @Override + public URL getResource(String name) { + // TODO: handle modules case + File file = new File(RuntimeDirs.resource(app()), name); + return file.exists() ? $.convert(file).to(URL.class) : super.getResource(name); + } + + @Override + public InputStream getResourceAsStream(String name) { + URL url = getResource(name); + return null != url ? IO.inputStream(url) : super.getResourceAsStream(name); + } + + @Override + public InputStream getOriginalResourceAsStream(String name) { + URL url = getOriginalResource(name); + return null != url ? IO.inputStream(url) : super.getOriginalResourceAsStream(name); + } + + @Override + public URL getOriginalResource(String name) { + File file = new File(RuntimeDirs.resource(app()), name); + return file.exists() ? $.convert(file).to(URL.class) : super.getOriginalResource(name); + } + @Override protected void preload() { preloadSources(); From 8c5dc5c671077c7402a650e38995f6f7ce147ab3 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 18 Sep 2018 19:44:21 +1000 Subject: [PATCH 110/730] FastJson exception when serialize ACT error message #841 --- CHANGELOG.md | 1 + .../impl/ReflectedHandlerInvoker.java | 10 ++++++++- src/main/java/act/view/ActUnauthorized.java | 2 ++ .../src/main/java/ghissues/Gh841.java | 3 ++- .../src/main/resources/test/scenarios/841.yml | 21 +++++++++++++++++++ 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/841.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index f357dbcf3..ce9796430 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* FastJson exception when serialize ACT error message #841 * `CacheFor` - make it allow skip `Cache-Control` header #837 * `ResponseCache` - content disposition shall be cached #838 * `CacheFor` key shall include `Accept` type #836 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index c3dd81b23..f67a77c84 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -891,10 +891,18 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle return transform(retVal, this, context, returnValueAdvice); } - public static Result transform(Object retVal, ReflectedHandlerInvoker invoker, ActionContext context, ReturnValueAdvice returnValueAdvice) { + private static Result transform(Object retVal, ReflectedHandlerInvoker invoker, ActionContext context, ReturnValueAdvice returnValueAdvice) { if (context.resp().isClosed()) { return null; } + if (retVal instanceof Result) { + Result result = (Result) retVal; + if (result.status().isError()) { + throw result; + } + invoker.checkTemplate(context); + return result; + } HandlerMethodMetaInfo handlerMetaInfo = invoker.handler; final boolean hasReturn = handlerMetaInfo.hasReturn() && !handlerMetaInfo.returnTypeInfo().isResult(); if (null == retVal && hasReturn) { diff --git a/src/main/java/act/view/ActUnauthorized.java b/src/main/java/act/view/ActUnauthorized.java index 9a5d7d99c..2e98e4996 100644 --- a/src/main/java/act/view/ActUnauthorized.java +++ b/src/main/java/act/view/ActUnauthorized.java @@ -25,6 +25,7 @@ import act.Act; import act.app.SourceInfo; import act.util.ActError; +import com.alibaba.fastjson.annotation.JSONField; import org.osgl.mvc.result.Unauthorized; import org.osgl.util.C; @@ -53,6 +54,7 @@ public ActUnauthorized(String realm, boolean digest) { } @Override + @JSONField(serialize = false, deserialize = false) public Throwable getCauseOrThis() { return this; } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh841.java b/testapps/GHIssues/src/main/java/ghissues/Gh841.java index 4f5028058..db1c64fe1 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh841.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh841.java @@ -2,13 +2,14 @@ import act.controller.Controller; import act.controller.annotation.UrlContext; +import act.util.LogSupport; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.C; import java.util.Map; @UrlContext("841") -public class Gh841 extends BaseController { +public class Gh841 extends LogSupport { @GetAction public Map test(boolean fail) { diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/841.yml b/testapps/GHIssues/src/main/resources/test/scenarios/841.yml new file mode 100644 index 000000000..c0cfaa846 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/841.yml @@ -0,0 +1,21 @@ +Scenario(GH841): + description: "[841] FastJson exception when serialize ACT error message" + interactions: + - description: test normal return + request: + get: 841 + response: + json: + code: 1 + data: + token: aaa + - description: test return unauthorized case + request: + accept: json + get: 841?fail=true + response: + status: 401 + json: + ts: + - exists: true + message: Unauthorized \ No newline at end of file From d1f70aaa1a8265816c8f2960c2dde03a0bdef28b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 19 Sep 2018 08:24:37 +1000 Subject: [PATCH 111/730] gh846 - disable resources copy on hot reload; fix routes loading --- src/main/java/act/app/AppBuilder.java | 6 +-- src/main/java/act/app/DevModeClassLoader.java | 42 +++++++++---------- src/main/java/act/app/RuntimeDirs.java | 23 +++++----- 3 files changed, 34 insertions(+), 37 deletions(-) diff --git a/src/main/java/act/app/AppBuilder.java b/src/main/java/act/app/AppBuilder.java index bc00d79cb..ae8f5fe99 100644 --- a/src/main/java/act/app/AppBuilder.java +++ b/src/main/java/act/app/AppBuilder.java @@ -79,9 +79,9 @@ private void prepareTargetDir() { private void copyFiles() { copyLibs(); - copyResources(); - copyConf(); - copyRoutes(); + // copyResources(); + // copyConf(); + // copyRoutes(); } void copyResources() { diff --git a/src/main/java/act/app/DevModeClassLoader.java b/src/main/java/act/app/DevModeClassLoader.java index 4b80e8a58..2dea9407e 100644 --- a/src/main/java/act/app/DevModeClassLoader.java +++ b/src/main/java/act/app/DevModeClassLoader.java @@ -363,27 +363,27 @@ public void on(FsEvent... events) { private class ResourceChangeListener implements FsEventListener { @Override public void on(FsEvent... events) { - int len = events.length; - for (int i = 0; i < len; ++i) { - FsEvent e = events[i]; - List paths = e.paths(); - File[] files = new File[paths.size()]; - int idx = 0; - for (String path : paths) { - files[idx++] = new File(path); - } - switch (e.kind()) { - case CREATE: - case MODIFY: - app().builder().copyResources(files); - break; - case DELETE: - app().builder().removeResources(files); - break; - default: - assert false; - } - } +// int len = events.length; +// for (int i = 0; i < len; ++i) { +// FsEvent e = events[i]; +// List paths = e.paths(); +// File[] files = new File[paths.size()]; +// int idx = 0; +// for (String path : paths) { +// files[idx++] = new File(path); +// } +// switch (e.kind()) { +// case CREATE: +// case MODIFY: +// app().builder().copyResources(files); +// break; +// case DELETE: +// app().builder().removeResources(files); +// break; +// default: +// assert false; +// } +// } } } diff --git a/src/main/java/act/app/RuntimeDirs.java b/src/main/java/act/app/RuntimeDirs.java index 6e195b603..3e020232b 100644 --- a/src/main/java/act/app/RuntimeDirs.java +++ b/src/main/java/act/app/RuntimeDirs.java @@ -20,18 +20,15 @@ * #L% */ +import static act.app.ProjectLayout.Utils.file; +import static act.route.RouteTableRouterBuilder.ROUTES_FILE; + import act.Act; import act.app.util.NamedPort; import org.osgl.util.S; import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static act.app.ProjectLayout.Utils.file; -import static act.route.RouteTableRouterBuilder.ROUTES_FILE; +import java.util.*; /** * Define application dir structure at runtime @@ -65,20 +62,20 @@ public static File conf(App app) { public static Map> routes(App app) { Map> map = new HashMap(); - File classes = classes(app); - map.put(NamedPort.DEFAULT, routes(classes, ROUTES_FILE)); + File base = resource(app); + map.put(NamedPort.DEFAULT, routes(base, ROUTES_FILE)); for (NamedPort np : app.config().namedPorts()) { String npName = np.name(); String routesConfName = S.concat("routes.", npName, ".conf"); - map.put(npName, routes(classes, routesConfName)); + map.put(npName, routes(base, routesConfName)); } return map; } - private static List routes(File classes, String name) { + private static List routes(File base, String name) { List routes = new ArrayList<>(); - routes.add(file(classes, name)); - File confRoot = file(classes, CONF); + routes.add(file(base, name)); + File confRoot = file(base, CONF); routes.add(file(confRoot, name)); File profileRooot = file(confRoot, Act.profile()); routes.add(file(profileRooot, name)); From 776d21055bb432f7a2dd90816ecc2c18ee0588a9 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 19 Sep 2018 08:25:34 +1000 Subject: [PATCH 112/730] update maven parent to osgl-parent-1.0.0-BETA-4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6eab0e19a..25af164ae 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ org.osgl parent - 1.0.0-BETA-3 + 1.0.0-BETA-4 From cb9a3e9d0ef370e996255e1c197da775243811dd Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 20 Sep 2018 11:19:48 +1000 Subject: [PATCH 113/730] GH846 - fix asset hotloading issue --- src/main/java/act/app/App.java | 4 +-- .../act/handler/builtin/ResourceGetter.java | 25 +++++++++---------- .../impl/ReflectedHandlerInvoker.java | 4 ++- .../java/act/inject/genie/SessionScope.java | 2 +- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index be790a55a..08b63329f 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -642,6 +642,8 @@ public synchronized void refresh() { initResolverManager(); initBinderManager(); initUploadFileStorageService(); + initClassLoader(); + emit(SysEventId.CLASS_LOADER_INITIALIZED); initRouters(); emit(ROUTER_INITIALIZED); loadRoutes(); @@ -667,8 +669,6 @@ public synchronized void refresh() { loadBuiltInScanners(); emit(PRE_LOAD_CLASSES); - initClassLoader(); - emit(SysEventId.CLASS_LOADER_INITIALIZED); initCache(); preloadClasses(); try { diff --git a/src/main/java/act/handler/builtin/ResourceGetter.java b/src/main/java/act/handler/builtin/ResourceGetter.java index c745e989d..1c252d9e8 100644 --- a/src/main/java/act/handler/builtin/ResourceGetter.java +++ b/src/main/java/act/handler/builtin/ResourceGetter.java @@ -26,6 +26,7 @@ import act.Act; import act.ActResponse; import act.app.ActionContext; +import act.app.App; import act.conf.AppConfig; import act.controller.ParamNames; import act.handler.RequestHandler; @@ -33,13 +34,9 @@ import org.osgl.$; import org.osgl.http.H; import org.osgl.mvc.result.NotFound; -import org.osgl.util.E; -import org.osgl.util.IO; -import org.osgl.util.S; +import org.osgl.util.*; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URL; import java.nio.ByteBuffer; import java.util.*; @@ -56,6 +53,7 @@ public class ResourceGetter extends FastRequestHandler { private FastRequestHandler delegate; + private App app; private String base; private URL baseUrl; private int preloadSizeLimit; @@ -77,9 +75,10 @@ public class ResourceGetter extends FastRequestHandler { public ResourceGetter(String base) { E.illegalArgumentIf(S.blank(base), "empty resource string encountered"); - String path = S.ensureStartsWith(base, SEP); + String path = base.charAt(0) == SEP ? base.substring(1) : base; this.base = path; - this.baseUrl = FileGetter.class.getResource(path); + this.app = Act.app(); + this.baseUrl = app.getResource(path); this.delegate = verifyBase(this.baseUrl, base); if (null == delegate) { this.isFolder = isFolder(this.baseUrl, path); @@ -205,7 +204,7 @@ protected void handle(String path, ActionContext context) { synchronized (this) { if (null == indexHandler) { loadPath = S.pathConcat(base, SEP, "index.html"); - target = FileGetter.class.getResource(loadPath); + target = app.getResource(loadPath); } indexHandler = null == target ? AlwaysForbidden.INSTANCE : new FixedResourceGetter(loadPath); } @@ -215,7 +214,7 @@ protected void handle(String path, ActionContext context) { } } else { loadPath = S.pathConcat(base, SEP, path); - target = FileGetter.class.getResource(loadPath); + target = app.getResource(loadPath); if (null == target) { throw NotFound.get(); } @@ -308,7 +307,7 @@ private boolean preventFolderAccess(URL target, String path, ActionContext conte } if (isFolder(target, path)) { String indexPath = S.pathConcat(path, SEP, "index.html"); - URL indexTarget = ResourceGetter.class.getResource(indexPath); + URL indexTarget = app.getResource(indexPath); if (null != indexTarget) { folderHandler = exists(indexTarget, indexPath) ? new FixedResourceGetter(indexPath) : AlwaysForbidden.INSTANCE; subFolderIndexHandlers.putIfAbsent(path, folderHandler); @@ -328,7 +327,7 @@ private boolean isFolder(URL target, String path) { if (path.endsWith("/")) { return true; } - URL url = FileGetter.class.getResource(S.ensureEndsWith(path, "/")); + URL url = app.getResource(S.ensureEndsWith(path, "/")); return null != url; } return false; @@ -340,7 +339,7 @@ private boolean exists(URL target, String path) { return file.exists(); } if ("jar".equals(target.getProtocol())) { - URL url = FileGetter.class.getResource(path); + URL url = app.getResource(path); return null != url; } return false; diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index f67a77c84..b4f8a5316 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -970,7 +970,9 @@ private boolean probeTemplate(H.Format fmt, ActionContext context) { return false; } else { Template t = Act.viewManager().load(context); - return t != null; + boolean hasTemplate = null != t; + context.setHasTemplate(hasTemplate); + return hasTemplate; } } diff --git a/src/main/java/act/inject/genie/SessionScope.java b/src/main/java/act/inject/genie/SessionScope.java index ec2d86380..40b6629b6 100644 --- a/src/main/java/act/inject/genie/SessionScope.java +++ b/src/main/java/act/inject/genie/SessionScope.java @@ -37,7 +37,7 @@ public class SessionScope extends ScopeCacheSupport.Base implements ScopeCache.S private final int TTL; public SessionScope() { - TTL = (int) App.instance().config().sessionTtl(); + TTL = App.instance().config().sessionTtl(); } @Override From ff1cfe0363093cb6a103da23c4ae73ad139965d4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 20 Sep 2018 21:51:01 +1000 Subject: [PATCH 114/730] `@PropertySpec` not applied to excel download #848 --- CHANGELOG.md | 1 + src/main/java/act/controller/Controller.java | 1 + src/main/java/act/inject/genie/GenieProviders.java | 3 +++ 3 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7859401d6..3b4e0e13e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `@PropertySpec` not applied to excel download #848 * It takes over 20s to bootstrap app in dev mode with large file in resources dir #846 * FastJson exception when serialize ACT error message #841 * `CacheFor` - make it allow skip `Cache-Control` header #837 diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 9abe82e98..7b017cd65 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1895,6 +1895,7 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon return RenderCSV.of(status, v, propertySpec, context); } else { boolean isArray = vCls.isArray(); + PropertySpec.MetaInfo.withCurrent(meta, context); return inferPrimitiveResult(v, context, false, requireXML, isArray, shouldUseToString); } } diff --git a/src/main/java/act/inject/genie/GenieProviders.java b/src/main/java/act/inject/genie/GenieProviders.java index 07144fe0d..7cca9c500 100644 --- a/src/main/java/act/inject/genie/GenieProviders.java +++ b/src/main/java/act/inject/genie/GenieProviders.java @@ -105,6 +105,9 @@ protected void initialized() { // default value set through `@DefaultValue` annotation this.defaultValue = defaultValue.value(); } + if ("".equals(this.defaultValue)) { + this.defaultValue = null; + } } @Override From 5d2f792516f33a0215c37bb10e51d4cd51ecaa9e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 20 Sep 2018 21:55:44 +1000 Subject: [PATCH 115/730] Add code and message support for unauthorizedIf function #847 --- CHANGELOG.md | 1 + src/main/java/act/controller/Controller.java | 38 ++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b4e0e13e..d2bb4f8c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ **1.8.8** * `@PropertySpec` not applied to excel download #848 +* Add code and message support for unauthorizedIf function #847 * It takes over 20s to bootstrap app in dev mode with large file in resources dir #846 * FastJson exception when serialize ACT error message #841 * `CacheFor` - make it allow skip `Cache-Control` header #837 diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 7b017cd65..9d12ab901 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -740,10 +740,12 @@ public static Unauthorized unauthorized(int errorCode) { * the application error code. * @param message * the application error message. + * @param args + * the message template arguments * @return a 401 Unauthorized result */ - public static Unauthorized unauthorized(int errorCode, String message) { - return ActUnauthorized.create(errorCode, message); + public static Unauthorized unauthorized(int errorCode, String message, Object ... args) { + return ActUnauthorized.create(errorCode, S.fmt(message, args)); } /** @@ -782,6 +784,38 @@ public static void unauthorizedIf(boolean test) { } } + /** + * Throws out an {@link Unauthorized} instance if `test ` is `true`. + * + * @param test + * the test + * @param code + * the app specified error code + */ + public static void unauthorizedIf(boolean test, int code) { + if (test) { + throw ActUnauthorized.create(code); + } + } + + /** + * Throws out an {@link Unauthorized} instance if `test ` is `true`. + * + * @param test + * the test + * @param code + * the app specified error code + * @param message + * the app specified error message (template) + * @param args + * the error message template arguments + */ + public static void unauthorizedIf(boolean test, int code, String message, Object ... args) { + if (test) { + throw ActUnauthorized.create(code, S.fmt(message, args)); + } + } + /** * Throws out an {@link Unauthorized} instance with `realm` specified if `test ` is `true`. * From 64c80302094393c3cad95df6f4e2c1e927d2ba59 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 22 Sep 2018 10:59:52 +1000 Subject: [PATCH 116/730] Create an annotation to help specify head mapping for `@LoadResource` mechanism #844 --- CHANGELOG.md | 1 + .../act/inject/util/ConfigResourceLoader.java | 53 +++++++++++---- .../java/act/inject/util/LoadResource.java | 4 +- .../java/act/inject/util/ResourceLoader.java | 27 +++++--- src/main/java/act/util/HeaderMapping.java | 66 +++++++++++++++++++ .../src/main/java/ghissues/Gh844.java | 28 ++++++++ .../GHIssues/src/main/resources/countries.csv | 2 + .../src/main/resources/test/scenarios/844.yml | 12 ++++ 8 files changed, 172 insertions(+), 21 deletions(-) create mode 100644 src/main/java/act/util/HeaderMapping.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh844.java create mode 100644 testapps/GHIssues/src/main/resources/countries.csv create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/844.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index d2bb4f8c3..2b105a376 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * `@PropertySpec` not applied to excel download #848 * Add code and message support for unauthorizedIf function #847 * It takes over 20s to bootstrap app in dev mode with large file in resources dir #846 +* Create an annotation to help specify head mapping for `@LoadResource` mechanism #844 * FastJson exception when serialize ACT error message #841 * `CacheFor` - make it allow skip `Cache-Control` header #837 * `ResponseCache` - content disposition shall be cached #838 diff --git a/src/main/java/act/inject/util/ConfigResourceLoader.java b/src/main/java/act/inject/util/ConfigResourceLoader.java index 23b0e565e..3bdacd5ca 100644 --- a/src/main/java/act/inject/util/ConfigResourceLoader.java +++ b/src/main/java/act/inject/util/ConfigResourceLoader.java @@ -53,18 +53,23 @@ protected void initialized() { if (path.startsWith("config/")) { path = path.substring(7); } - resource = ResourceLoader._load(profileConfig(path), spec, ignoreResourceNotFound); + resource = ResourceLoader._load(profileConfig(path), spec, hint, ignoreResourceNotFound); if (null == resource) { - resource = ResourceLoader._load(commonConfig(path), spec, ignoreResourceNotFound); + resource = ResourceLoader._load(commonConfig(path), spec, hint, ignoreResourceNotFound); } if (null == resource) { - resource = ResourceLoader._load(confConfig(path), spec, ignoreResourceNotFound); + resource = ResourceLoader._load(confConfig(path), spec, hint, ignoreResourceNotFound); } if (null == resource) { - resource = ResourceLoader._load(path, spec, ignoreResourceNotFound); + resource = ResourceLoader._load(path, spec, hint, ignoreResourceNotFound); } } + private void init(Map options, BeanSpec spec, Object hint) { + super.init(options, spec); + this.hint = hint; + } + private String profileConfig(String path) { return S.concat("conf/", Act.profile(), "/", path); } @@ -90,11 +95,19 @@ private String confConfig(String path) { * @return loaded resource or `null` if exception encountered. */ public static T load(String path, Class type) { - return load(path, type, false); + return load(path, type, null, false); + } + + public static T load(String path, Class type, Object hint) { + return load(path, type, hint, false); } public static T load(String path, Class type, boolean ignoreResourceNotFound) { - return __load(path, BeanSpec.of(type, injector), ignoreResourceNotFound); + return load(path, type, null, ignoreResourceNotFound); + } + + public static T load(String path, Class type, Object hint, boolean ignoreResourceNotFound) { + return __load(path, BeanSpec.of(type, injector), hint, ignoreResourceNotFound); } /** @@ -108,12 +121,20 @@ public static T load(String path, Class type, boolean ignoreResourceNotFo * @return loaded resource or `null` if exception encountered. */ public static T load(String path, TypeReference typeReference) { - return load(path, typeReference, false); + return load(path, typeReference, null, false); } public static T load(String path, TypeReference typeReference, boolean ignoreResourceNotFound) { + return load(path, typeReference, null, ignoreResourceNotFound); + } + + public static T load(String path, TypeReference typeReference, Object hint) { + return load(path, typeReference, hint, false); + } + + public static T load(String path, TypeReference typeReference, Object hint, boolean ignoreResourceNotFound) { BeanSpec spec = BeanSpec.of(typeReference.getType(), injector); - return __load(path, spec, ignoreResourceNotFound); + return __load(path, spec, hint, ignoreResourceNotFound); } /** @@ -127,17 +148,25 @@ public static T load(String path, TypeReference typeReference, boolean ig * @return loaded resource or `null` if exception encountered. */ public static T load(String path, BeanSpec spec) { - return load(path, spec); + return load(path, spec, null, false); } public static T load(String path, BeanSpec spec, boolean ignoreResourceNotFound) { - return __load(path, spec, ignoreResourceNotFound); + return load(path, spec, null, ignoreResourceNotFound); + } + + public static T load(String path, BeanSpec spec, Object hint) { + return load(path, spec, hint, false); + } + + public static T load(String path, BeanSpec spec, Object hint, boolean ignoreResourceNotFound) { + return __load(path, spec, hint, ignoreResourceNotFound); } - private static T __load(String path, BeanSpec spec, boolean ignoreResourceNotFound) { + private static T __load(String path, BeanSpec spec, Object hint, boolean ignoreResourceNotFound) { Map option = C.Map("value", path); ConfigResourceLoader loader = new ConfigResourceLoader(ignoreResourceNotFound); - loader.init(option, spec); + loader.init(option, spec, hint); return $.cast(loader.resource); } diff --git a/src/main/java/act/inject/util/LoadResource.java b/src/main/java/act/inject/util/LoadResource.java index 2bdd5f187..bd1b0a61a 100644 --- a/src/main/java/act/inject/util/LoadResource.java +++ b/src/main/java/act/inject/util/LoadResource.java @@ -31,7 +31,9 @@ /** * The annotation specify a field or parameter should be a resource - * that is loaded from path specified + * that is loaded from path specified. + * + * @see act.util.HeaderMapping */ @LoadValue(ResourceLoader.class) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index 1590f27ce..b2aab90c2 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -23,6 +23,7 @@ import act.Act; import act.app.App; import act.app.data.StringValueResolverManager; +import act.util.HeaderMapping; import act.util.Jars; import com.alibaba.fastjson.JSON; import org.osgl.$; @@ -60,6 +61,8 @@ public class ResourceLoader extends ValueLoader.Base { protected Object resource; + protected Object hint; + @Override protected void initialized() { String path = (String) options.get("value"); @@ -69,7 +72,11 @@ protected void initialized() { path = path.substring(1); } E.unexpectedIf(S.blank(path), "resource path not specified"); - resource = load(path, spec); + HeaderMapping anno = spec.getAnnotation(HeaderMapping.class); + if (null != anno) { + this.hint = HeaderMapping.Parser.parse(anno.value()); + } + resource = load(path, spec, hint); } @Override @@ -130,11 +137,15 @@ public static T load(String resourcePath, BeanSpec spec) { return load(resourcePath, spec, false); } + public static T load(String resourcePath, BeanSpec spec, Object hint) { + return $.cast(_load(resourcePath, spec, hint, false)); + } + public static T load(String resourcePath, BeanSpec spec, boolean ignoreResourceNotFound) { - return $.cast(_load(resourcePath, spec, ignoreResourceNotFound)); + return $.cast(_load(resourcePath, spec, null, ignoreResourceNotFound)); } - protected static Object _load(String resourcePath, BeanSpec spec, boolean ignoreResourceNotFound) { + protected static Object _load(String resourcePath, BeanSpec spec, Object hint, boolean ignoreResourceNotFound) { URL url = loadResource(resourcePath); if (null == url) { if (!ignoreResourceNotFound) { @@ -142,10 +153,10 @@ protected static Object _load(String resourcePath, BeanSpec spec, boolean ignore } return null; } - return _load(url, spec); + return _load(url, spec, hint); } - private static Object _load(URL url, BeanSpec spec) { + private static Object _load(URL url, BeanSpec spec, Object hint) { $.Var entryBag = $.var(); $.Var jarFileBag = $.var(); $.Var fileBag = $.var(); @@ -194,7 +205,7 @@ private static Object _load(URL url, BeanSpec spec) { try { URL subUrl = new URL(subUrlSpec); String s = S.cut(fileName).beforeLast("."); - map.put(isKeyword ? Keyword.of(s) : s, _load(subUrl, subSpec)); + map.put(isKeyword ? Keyword.of(s) : s, _load(subUrl, subSpec, hint)); } catch (MalformedURLException e) { throw E.unexpected(e); } @@ -210,7 +221,7 @@ private static Object _load(URL url, BeanSpec spec) { String key = S.cut(file.getName()).beforeLast("."); try { URL fileUrl = file.toURI().toURL(); - map.put(isKeyword ? Keyword.of(key) : key, _load(fileUrl, subSpec)); + map.put(isKeyword ? Keyword.of(key) : key, _load(fileUrl, subSpec, hint)); } catch (MalformedURLException e) { throw E.unexpected(e); } @@ -220,7 +231,7 @@ private static Object _load(URL url, BeanSpec spec) { } // eof isDir try { - return IO.read(url).to(spec); + return null == hint ? IO.read(url).to(spec) : IO.read(url).hint(hint).to(spec); } catch (Exception e) { if (LOGGER.isDebugEnabled()) { LOGGER.debug(e, "error read URL[%s] to [%s] via IO.read call", url, spec); diff --git a/src/main/java/act/util/HeaderMapping.java b/src/main/java/act/util/HeaderMapping.java new file mode 100644 index 000000000..bba8dff05 --- /dev/null +++ b/src/main/java/act/util/HeaderMapping.java @@ -0,0 +1,66 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.*; + +import java.lang.annotation.*; +import java.util.HashMap; +import java.util.Map; + +/** + * Specify header mapping when loading a list of data + * into a field with {@link act.inject.util.LoadResource}. + * + * Note if the target field type is not a List of data, this + * annotation will be ignored. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface HeaderMapping { + + /** + * Specify header mapping. + * + * Example: `"# as id,姓 as lastName,名 as firstName"` + */ + String value(); + + class Parser { + public static Map parse(String value) { + if (S.isBlank(value)) { + return C.Map(); + } + S.List list = S.fastSplit(value, ","); + Map map = new HashMap<>(); + for (String part : list) { + part = part.trim(); + int pos = part.toLowerCase().indexOf(" as "); + E.illegalArgumentIf(pos < 1, "Illegal mapping specification: " + part); + String src = part.substring(0, pos); + String tgt = part.substring(pos + 4); + map.put(src, tgt); + } + return map; + } + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh844.java b/testapps/GHIssues/src/main/java/ghissues/Gh844.java new file mode 100644 index 000000000..09652829d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh844.java @@ -0,0 +1,28 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import act.util.HeaderMapping; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; + +@UrlContext("844") +public class Gh844 extends BaseController { + + public static class Country { + public Integer no; + public String code; + public String name; + } + + @LoadResource("countries.csv") + @HeaderMapping("country as name") + private List countryList; + + @GetAction + public List test() { + return countryList; + } + +} diff --git a/testapps/GHIssues/src/main/resources/countries.csv b/testapps/GHIssues/src/main/resources/countries.csv new file mode 100644 index 000000000..332b54829 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/countries.csv @@ -0,0 +1,2 @@ +no,code,country +0,AU,Australia \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/844.yml b/testapps/GHIssues/src/main/resources/test/scenarios/844.yml new file mode 100644 index 000000000..b8007d6a3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/844.yml @@ -0,0 +1,12 @@ +Scenario(GH844): + description: "[844] Create an annotation to help specify head mapping for `@LoadResource` mechanism" + interactions: + - description: test + request: + get: 844 + response: + json: + size: 1 + 0: + code: AU + name: Australia From b0ff4fb15d30ef9bf9f435ab22bade5d32c24d44 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 23 Sep 2018 15:52:08 +1000 Subject: [PATCH 117/730] Allow it to run specific test scenario #851 --- CHANGELOG.md | 1 + .../java/act/test/ScenarioDebugHelper.java | 7 ++++--- src/main/java/act/test/Test.java | 21 ++++++++++++------- .../java/act/test/util/ScenarioManager.java | 4 ++++ 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b105a376..8b0014100 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Allow it to run specific test scenario #851 * `@PropertySpec` not applied to excel download #848 * Add code and message support for unauthorizedIf function #847 * It takes over 20s to bootstrap app in dev mode with large file in resources dir #846 diff --git a/src/main/java/act/test/ScenarioDebugHelper.java b/src/main/java/act/test/ScenarioDebugHelper.java index 42ff2f4b3..70ba89a38 100644 --- a/src/main/java/act/test/ScenarioDebugHelper.java +++ b/src/main/java/act/test/ScenarioDebugHelper.java @@ -32,6 +32,7 @@ import com.alibaba.fastjson.JSONObject; import org.osgl.http.H; import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.Keyword; import java.util.List; import javax.inject.Inject; @@ -95,9 +96,9 @@ public void prepareAuthentication(ActionContext context) { @Inject private Test test; - @GetAction({"e2e", "test"}) - public void run(App app) { - List scenarios = test.run(app, false); + @GetAction({"e2e/{testId}", "test/{testId}", "tests/{testId}"}) + public void run(App app, Keyword testId) { + List scenarios = test.run(app, testId, false); renderTemplate("/~test.html", scenarios, app); } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 50ecf2d97..fce6a857e 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -204,11 +204,11 @@ public void clearFixtures() { public void run(App app) { boolean run = $.bool(app.config().get("test.run")) || $.bool(app.config().get("e2e.run")) || "test".equalsIgnoreCase(Act.profile()) || "e2e".equalsIgnoreCase(Act.profile()); if (run) { - run(app, true); + run(app, null, true); } } - public List run(App app, boolean shutdownApp) { + public List run(App app, Keyword testId, boolean shutdownApp) { E.illegalStateIf(inProgress()); info("Start running test scenarios\n"); int exitCode = 0; @@ -222,13 +222,19 @@ public List run(App app, boolean shutdownApp) { requestTemplateManager.load(); final ScenarioManager scenarioManager = new ScenarioManager(); Map scenarios = scenarioManager.load(); + List list; if (scenarios.isEmpty()) { LOGGER.warn("No scenario defined."); + list = C.list(); } else { - C.List list = C.list(scenarios.values()).sorted(new ScenarioComparator(scenarioManager)); - for (Scenario scenario : list) { + list = new ArrayList<>(); + for (Scenario scenario : C.list(scenarios.values()).sorted(new ScenarioComparator(scenarioManager))) { + if (null != testId && $.ne(testId, Keyword.of(scenario.name))) { + continue; + } try { scenario.start(scenarioManager, requestTemplateManager); + addToList(scenario, list, scenarioManager); } catch (Exception e) { String message = e.getMessage(); scenario.errorMessage = S.blank(message) ? e.getClass().getName() : message; @@ -237,10 +243,9 @@ public List run(App app, boolean shutdownApp) { } } } - List list = new ArrayList<>(); - for (Scenario scenario : scenarios.values()) { - addToList(scenario, list, scenarioManager); - } +// for (Scenario scenario : scenarios.values()) { +// addToList(scenario, list, scenarioManager); +// } if (shutdownApp) { for (Scenario scenario : list) { if (!scenario.status.pass()) { diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index 3b20e30f2..eac1496c0 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -65,6 +65,10 @@ public Scenario get(String name) { return store.get(Keyword.of(name)); } + public Scenario get(Keyword testId) { + return store.get(testId); + } + public Map load() { loadDefault(); searchScenarioFolder(); From 748552f3b11f1b34a4d4b57cd78b236b186557bd Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 23 Sep 2018 15:58:04 +1000 Subject: [PATCH 118/730] fix ut error --- src/test/java/act/conf/ConfigKeyHelperTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/act/conf/ConfigKeyHelperTest.java b/src/test/java/act/conf/ConfigKeyHelperTest.java index 5fd443226..ca39dde2e 100644 --- a/src/test/java/act/conf/ConfigKeyHelperTest.java +++ b/src/test/java/act/conf/ConfigKeyHelperTest.java @@ -110,11 +110,11 @@ public void fetchFromSysEnv() { } @Test - public void testVariableEvaluaation() { + public void testVariableEvaluation() { put("foo.bar", "123"); put("xyz", "aaa"); - put("p1", "abc${foo.bar}/xyz/${xyz}/ddd"); - eq("abc123/xyz/aaa/ddd", helper.getConfiguration("p1", null, conf)); + put("p", "abc${foo.bar}/xyz/${xyz}/ddd"); + eq("abc123/xyz/aaa/ddd", helper.getConfiguration("p", null, conf)); } @Test From 51aff01796f6acd559e3f74f649eb12cf9b896d4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 23 Sep 2018 20:20:58 +1000 Subject: [PATCH 119/730] minor updates to NamedLogic --- src/main/java/act/cli/CliDispatcher.java | 7 ++++++- src/main/java/act/httpclient/HttpClientService.java | 7 ++++++- src/main/java/act/test/util/NamedLogic.java | 2 +- .../java/{act/route => benchmark}/RouterBenchmark.java | 3 ++- 4 files changed, 15 insertions(+), 4 deletions(-) rename src/test/java/{act/route => benchmark}/RouterBenchmark.java (99%) diff --git a/src/main/java/act/cli/CliDispatcher.java b/src/main/java/act/cli/CliDispatcher.java index c7e6f4e1e..4377b5902 100644 --- a/src/main/java/act/cli/CliDispatcher.java +++ b/src/main/java/act/cli/CliDispatcher.java @@ -58,7 +58,12 @@ public class CliDispatcher extends AppServiceBase { public CliDispatcher(App app) { super(app); - registerBuiltInHandlers(); + app.jobManager().now(new Runnable() { + @Override + public void run() { + registerBuiltInHandlers(); + } + }); } public CliDispatcher registerCommandHandler(String command, CommandMethodMetaInfo methodMetaInfo, CommanderClassMetaInfo classMetaInfo) { diff --git a/src/main/java/act/httpclient/HttpClientService.java b/src/main/java/act/httpclient/HttpClientService.java index 43f87bd6e..4ade6fb43 100644 --- a/src/main/java/act/httpclient/HttpClientService.java +++ b/src/main/java/act/httpclient/HttpClientService.java @@ -49,7 +49,12 @@ public HttpClientService(App app) { super(app); config = app.config(); reCaptchaSercret = config.reCaptchaSecret(); - initHttp(); + app.jobManager().now(new Runnable() { + @Override + public void run() { + initHttp(); + } + }); } @Override diff --git a/src/main/java/act/test/util/NamedLogic.java b/src/main/java/act/test/util/NamedLogic.java index e161ef255..ee7518bd2 100644 --- a/src/main/java/act/test/util/NamedLogic.java +++ b/src/main/java/act/test/util/NamedLogic.java @@ -132,7 +132,7 @@ private void register(Keyword keyword, boolean force) { registry.put(type, lookup); } NamedLogic existing = lookup.put(keyword, this); - E.unexpectedIf(!force && null != existing, "Keyword already used: " + keyword.hyphenated()); + E.unexpectedIf(!force && null != existing && this != existing, "Keyword already used: " + keyword.hyphenated()); } private static T get(Class logicType, String name) { diff --git a/src/test/java/act/route/RouterBenchmark.java b/src/test/java/benchmark/RouterBenchmark.java similarity index 99% rename from src/test/java/act/route/RouterBenchmark.java rename to src/test/java/benchmark/RouterBenchmark.java index 962e1a92e..27a095580 100644 --- a/src/test/java/act/route/RouterBenchmark.java +++ b/src/test/java/benchmark/RouterBenchmark.java @@ -1,4 +1,4 @@ -package act.route; +package benchmark; /*- * #%L @@ -33,6 +33,7 @@ import act.handler.builtin.AlwaysBadRequest; import act.handler.builtin.AlwaysNotFound; import act.plugin.GenericPluginManager; +import act.route.*; import com.carrotsearch.junitbenchmarks.BenchmarkOptions; import org.junit.BeforeClass; import org.junit.Test; From 61c2c5b60b0cd305535fbbf55b4834bf9ee71467 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 27 Sep 2018 16:57:45 +1000 Subject: [PATCH 120/730] fix #852 and #855 --- CHANGELOG.md | 2 + src/main/java/act/Act.java | 2 +- src/main/java/act/event/EventBus.java | 34 ++++--- .../impl/ReflectedHandlerInvoker.java | 91 ++++++++++++------- src/main/java/act/test/Test.java | 17 +++- src/main/java/act/util/PropertySpec.java | 21 ++++- .../src/main/java/ghissues/Gh657.java | 31 +++++++ .../src/main/java/ghissues/Gh809.java | 2 - .../src/main/java/ghissues/Gh852.java | 23 +++++ .../src/main/resources/test/scenarios/852.yml | 13 +++ 10 files changed, 181 insertions(+), 55 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh657.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh852.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/852.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b0014100..69392602d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Automate testing failure #855 +* `@PropertySpec` not effect when `ReturnValueAdvice` applied #852 * Allow it to run specific test scenario #851 * `@PropertySpec` not applied to excel download #848 * Add code and message support for unauthorizedIf function #847 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 92e7ffdce..ec762857e 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -323,7 +323,6 @@ public static void startup(AppDescriptor descriptor) { shutdownNetworkLayer(); throw new UnexpectedException("App not found. Please make sure your app start directory is correct"); } - emit(SysEventId.ACT_START); writePidFile(); int port = httpPort(); String urlContext = appConfig().urlContext(); @@ -332,6 +331,7 @@ public static void startup(AppDescriptor descriptor) { } else { LOGGER.info("app is ready at: http://%s:%s%s", getLocalIpAddr(), port, urlContext); } + emit(SysEventId.ACT_START); } public static void shutdown(final App app) { diff --git a/src/main/java/act/event/EventBus.java b/src/main/java/act/event/EventBus.java index 2f56f8edb..f8a0e6d34 100644 --- a/src/main/java/act/event/EventBus.java +++ b/src/main/java/act/event/EventBus.java @@ -1328,20 +1328,30 @@ private void callOn(final T event, List toBeRemoved = C.newSet(); - for (final ActEventListener l : listeners) { - if (!async) { - boolean result = callOn(event, l); - if (result && once) { - toBeRemoved.add(l); + try { + for (final ActEventListener l : listeners) { + if (!async) { + boolean result = callOn(event, l); + if (result && once) { + toBeRemoved.add(l); + } + } else { + jobManager.now(new Runnable() { + @Override + public void run() { + callOn(event, l); + } + }); } + } + } catch (ConcurrentModificationException e) { + String eventName; + if (event instanceof SysEvent) { + eventName = event.toString(); } else { - jobManager.now(new Runnable() { - @Override - public void run() { - callOn(event, l); - } - }); + eventName = event.getClass().getName(); } + throw E.unexpected("Concurrent modification issue encountered on handling event: " + eventName); } if (once && !toBeRemoved.isEmpty()) { listeners.removeAll(toBeRemoved); @@ -1365,7 +1375,7 @@ private boolean callNowIfEmitted(SysEventId sysEventId, SysEventListener l) { try { l.on(lookUpSysEvent(sysEventId)); } catch (Exception e) { - LOGGER.warn(e, "error calling event handler"); + LOGGER.warn(e, "error calling event handler on " + sysEventId); } return true; } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index b4f8a5316..f3f09f606 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -23,16 +23,10 @@ import act.Act; import act.Trace; import act.annotations.*; -import act.app.ActionContext; -import act.app.App; -import act.app.AppClassLoader; +import act.app.*; import act.conf.AppConfig; -import act.controller.CacheSupportMetaInfo; -import act.controller.Controller; -import act.controller.ExpressController; -import act.controller.annotation.HandleCsrfFailure; -import act.controller.annotation.HandleMissingAuthentication; -import act.controller.annotation.Throttled; +import act.controller.*; +import act.controller.annotation.*; import act.controller.builtin.ThrottleFilter; import act.controller.captcha.RequireCaptcha; import act.controller.meta.*; @@ -44,44 +38,32 @@ import act.handler.event.ReflectedHandlerInvokerInit; import act.handler.event.ReflectedHandlerInvokerInvoke; import act.inject.DependencyInjector; -import act.inject.param.JsonDto; -import act.inject.param.JsonDtoClassManager; -import act.inject.param.ParamValueLoaderManager; -import act.inject.param.ParamValueLoaderService; +import act.inject.param.*; import act.job.JobManager; import act.job.TrackableWorker; import act.plugin.ControllerPlugin; -import act.security.CORS; -import act.security.CSP; -import act.security.CSRF; +import act.security.*; import act.sys.Env; import act.util.*; +import act.util.Output; import act.view.*; import act.ws.WebSocketConnectionManager; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.*; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.serializer.SerializeFilter; import com.alibaba.fastjson.serializer.SerializerFeature; import com.esotericsoftware.reflectasm.MethodAccess; import org.osgl.$; +import org.osgl.Lang; import org.osgl.exception.NotAppliedException; import org.osgl.http.H; import org.osgl.inject.BeanSpec; -import org.osgl.mvc.annotation.ResponseContentType; -import org.osgl.mvc.annotation.ResponseStatus; -import org.osgl.mvc.annotation.SessionFree; -import org.osgl.mvc.result.BadRequest; -import org.osgl.mvc.result.Conflict; -import org.osgl.mvc.result.RenderJSON; -import org.osgl.mvc.result.Result; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.mvc.annotation.*; +import org.osgl.mvc.result.*; +import org.osgl.util.*; import java.lang.annotation.Annotation; -import java.lang.reflect.Field; -import java.lang.reflect.Method; +import java.lang.reflect.*; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -166,6 +148,11 @@ public void visit(H.Format format) throws $.Break { private String downloadFilename; // see https://github.com/actframework/actframework/issues/835 private ReturnValueAdvice returnValueAdvice; + // see https://github.com/actframework/actframework/issues/852 + private boolean returnIterable; + private boolean returnSimpleType; + private boolean returnIterableComponentIsSimpleType; + private boolean shallTransformReturnVal; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -185,6 +172,35 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { throw E.unexpected(e); } this.returnString = method.getReturnType() == String.class; + if (handlerMetaInfo.hasReturn()) { + this.returnSimpleType = this.returnString || $.isSimpleType(method.getReturnType()); + this.returnIterable = !this.returnSimpleType && (handlerMetaInfo.isReturnArray() || Iterable.class.isAssignableFrom(method.getReturnType())); + if (this.returnIterable) { + if (handlerMetaInfo.isReturnArray()) { + this.returnIterableComponentIsSimpleType = $.isSimpleType(method.getReturnType().getComponentType()); + } else { + Type type = method.getGenericReturnType(); + if (type instanceof ParameterizedType) { + ParameterizedType ptype = $.cast(type); + Type[] typeParams = ptype.getActualTypeArguments(); + if (typeParams.length > 1) { + this.returnIterableComponentIsSimpleType = false; + } else if (typeParams.length == 1) { + Type p0 = typeParams[0]; + if (p0 instanceof Class) { + this.returnIterableComponentIsSimpleType = $.isSimpleType((Class) p0); + } else { + this.returnIterableComponentIsSimpleType = false; + } + } + } else { + warn("Cannot determine component type of handler method return type: " + method); + this.returnIterableComponentIsSimpleType = false; + } + } + } + this.shallTransformReturnVal = handlerMetaInfo.hasReturn() && (returnIterable && !returnIterableComponentIsSimpleType) || (!returnSimpleType); + } this.pluginBeforeHandler = ControllerPlugin.Manager.INST.beforeHandler(controllerClass, method); this.pluginAfterHandler = ControllerPlugin.Manager.INST.afterHandler(controllerClass, method); this.disabled = this.disabled || !Env.matches(method); @@ -888,10 +904,10 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle } throw e; } - return transform(retVal, this, context, returnValueAdvice); + return transform(retVal, this, context, returnValueAdvice, shallTransformReturnVal, returnIterable); } - private static Result transform(Object retVal, ReflectedHandlerInvoker invoker, ActionContext context, ReturnValueAdvice returnValueAdvice) { + private static Result transform(Object retVal, ReflectedHandlerInvoker invoker, ActionContext context, ReturnValueAdvice returnValueAdvice, boolean transformRetVal, boolean returnIterable) { if (context.resp().isClosed()) { return null; } @@ -914,11 +930,16 @@ private static Result transform(Object retVal, ReflectedHandlerInvoker invoker, } boolean hasTemplate = invoker.checkTemplate(context); if (!hasTemplate && hasReturn && null != returnValueAdvice) { + if (transformRetVal) { + PropertySpec.MetaInfo propertySpec = handlerMetaInfo.propertySpec(); + if (null != propertySpec) { + Lang._MappingStage stage = propertySpec.applyTo(Lang.map(retVal), context); + Object newRetVal = returnIterable ? new JSONArray() : new JSONObject(); + retVal = stage.to(newRetVal); + } + } retVal = returnValueAdvice.applyTo(retVal, context); } - if (hasTemplate && retVal instanceof RenderAny) { - retVal = RenderTemplate.INSTANCE; - } return Controller.Util.inferResult(handlerMetaInfo, retVal, context, hasTemplate); } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index fce6a857e..55aa4108e 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -24,6 +24,7 @@ import act.apidoc.Endpoint; import act.app.App; import act.app.DbServiceManager; +import act.app.event.SysEventId; import act.db.Dao; import act.db.DbService; import act.test.func.Func; @@ -200,11 +201,21 @@ public void clearFixtures() { } // wait 1 seconds to allow app setup the network - @OnAppStart(delayInSeconds = 1) - public void run(App app) { + @OnSysEvent(SysEventId.ACT_START) + public void run(final App app) { boolean run = $.bool(app.config().get("test.run")) || $.bool(app.config().get("e2e.run")) || "test".equalsIgnoreCase(Act.profile()) || "e2e".equalsIgnoreCase(Act.profile()); if (run) { - run(app, null, true); + app.jobManager().post(SysEventId.POST_START, new Runnable() { + @Override + public void run() { + app.jobManager().post(SysEventId.DB_SVC_LOADED, new Runnable() { + @Override + public void run() { + Test.this.run(app, null, true); + } + }, true); + } + }, true); } } diff --git a/src/main/java/act/util/PropertySpec.java b/src/main/java/act/util/PropertySpec.java index b09582c04..d58d90692 100644 --- a/src/main/java/act/util/PropertySpec.java +++ b/src/main/java/act/util/PropertySpec.java @@ -25,6 +25,7 @@ import act.cli.CliSession; import act.controller.meta.HandlerMethodMetaInfo; import org.osgl.$; +import org.osgl.Lang; import org.osgl.util.C; import org.osgl.util.S; @@ -138,11 +139,11 @@ /** * Capture the {@code PropertySpec} annotation meta info in bytecode scanning phase */ - public class MetaInfo { + class MetaInfo { // split "fn as firstName" into "fn" and "firstName" private static Pattern p = Pattern.compile("\\s+as\\s+", Pattern.CASE_INSENSITIVE); - static class Spec extends $.T3, Set, Map> { + public static class Spec extends $.T3, Set, Map> { Spec() { super(C.newList(), C.newSet(), C.newMap()); @@ -164,6 +165,18 @@ boolean isEmpty() { return _1.isEmpty() && _2.isEmpty() && _3.isEmpty(); } + public Lang._MappingStage applyTo(Lang._MappingStage stage) { + if (!outputs().isEmpty()) { + stage.filter(S.join(",", outputs())); + } else if (!excluded().isEmpty()) { + stage.filter(S.join(",", C.list(excluded()).map(S.F.prepend("-")))); + } + if (!labels().isEmpty()) { + stage.withHeadMapping(labels()); + } + return stage; + } + } private static Spec newSpec() { @@ -260,6 +273,10 @@ public String label(String field, ActContext context) { return null == lbl ? field : lbl; } + public Lang._MappingStage applyTo(Lang._MappingStage mappingStage, ActContext context) { + return spec(context).applyTo(mappingStage); + } + private Spec httpSpec() { return null == http || http.isEmpty() ? common : http; } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh657.java b/testapps/GHIssues/src/main/java/ghissues/Gh657.java new file mode 100644 index 000000000..08deb7e0d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh657.java @@ -0,0 +1,31 @@ +package ghissues; + +import static act.controller.Controller.Util.renderJson; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.Date; +import java.util.List; + +@UrlContext("657") +public class Gh657 extends BaseController { + + @GetAction("list") + @JsonView + public List list() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("date", new Date()); + return C.list(jsonObject); + } + + @GetAction("list1") + public void list1() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("date", new Date()); + renderJson(C.list(jsonObject)); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh809.java b/testapps/GHIssues/src/main/java/ghissues/Gh809.java index fdb136dba..845b51d8a 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh809.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh809.java @@ -2,7 +2,6 @@ import static act.controller.Controller.Util.template; -import act.Act; import act.controller.annotation.UrlContext; import org.osgl.mvc.annotation.GetAction; @@ -11,7 +10,6 @@ public class Gh809 extends BaseController { @GetAction public void index() { - System.out.println(!Act.isDev()); template(); } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh852.java b/testapps/GHIssues/src/main/java/ghissues/Gh852.java new file mode 100644 index 000000000..bc3e7227f --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh852.java @@ -0,0 +1,23 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.PropertySpec; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.N; +import org.osgl.util.S; + +@UrlContext("852") +public class Gh852 { + + public static class Foo { + public String id = S.random(); + public int number = N.randInt(); + } + + @GetAction + @PropertySpec("-id") + public Foo test() { + return new Foo(); + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/852.yml b/testapps/GHIssues/src/main/resources/test/scenarios/852.yml new file mode 100644 index 000000000..11963ad19 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/852.yml @@ -0,0 +1,13 @@ +Scenario(GH852): + description: "[852] @PropertySpec not take effect" + interactions: + - description: test + request: + get: 852 + response: + json: + data: + number: + - exists: true + id: + - exists: false From e20b5891b96341626cd3f1d02c6bf4d699f1bd43 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 27 Sep 2018 22:43:25 +1000 Subject: [PATCH 121/730] `@SessionVariable` annotation not working as expected #856 --- CHANGELOG.md | 1 + .../impl/ReflectedHandlerInvoker.java | 16 +++++++-- .../java/act/inject/genie/SessionScope.java | 13 ------- .../act/inject/param/BoundedValueLoader.java | 5 +++ .../act/inject/param/CliParamValueLoader.java | 4 +++ .../act/inject/param/CollectionLoader.java | 5 +++ .../act/inject/param/HeaderValueLoader.java | 5 +++ .../inject/param/JsonParamValueLoader.java | 7 +++- src/main/java/act/inject/param/MapLoader.java | 5 +++ .../act/inject/param/ParamValueLoader.java | 7 ++++ .../inject/param/ParamValueLoaderService.java | 35 +++++++++++++++++-- .../act/inject/param/PartialPathLoader.java | 4 +++ .../java/act/inject/param/PojoLoader.java | 5 +++ .../act/inject/param/ProvidedValueLoader.java | 5 +++ .../inject/param/ScopedParamValueLoader.java | 8 +++++ .../act/inject/param/SessionValueLoader.java | 5 +++ .../param/StringValueResolverValueLoader.java | 5 +++ 17 files changed, 115 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69392602d..aefbfb647 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `@SessionVariable` annotation not working as expected #856 * Automate testing failure #855 * `@PropertySpec` not effect when `ReturnValueAdvice` applied #852 * Allow it to run specific test scenario #851 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index f3f09f606..ca5fbbfbd 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -38,6 +38,7 @@ import act.handler.event.ReflectedHandlerInvokerInit; import act.handler.event.ReflectedHandlerInvokerInvoke; import act.inject.DependencyInjector; +import act.inject.SessionVariable; import act.inject.param.*; import act.job.JobManager; import act.job.TrackableWorker; @@ -97,6 +98,7 @@ public void visit(H.Format format) throws $.Break { private JsonDtoClassManager jsonDTOClassManager; private int paramCount; private int fieldsAndParamsCount; + private int sessionVariablesCount; private String singleJsonFieldName; private boolean sessionFree; private boolean express; @@ -286,9 +288,17 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { paramCount = handler.paramCount(); paramSpecs = jsonDTOClassManager.beanSpecs(controllerClass, method); + List paramSpecWithoutSessionVariables = new ArrayList<>(); fieldsAndParamsCount = paramSpecs.size(); - if (1 == fieldsAndParamsCount) { - singleJsonFieldName = paramSpecs.get(0).name(); + for (BeanSpec spec : paramSpecs) { + if (spec.hasAnnotation(SessionVariable.class)) { + sessionVariablesCount++; + } else { + paramSpecWithoutSessionVariables.add(spec); + } + } + if (1 == (fieldsAndParamsCount - sessionVariablesCount)) { + singleJsonFieldName = paramSpecWithoutSessionVariables.get(0).name(); } CORS.Spec corsSpec = CORS.spec(method).chain(CORS.spec(controllerClass)); @@ -642,7 +652,7 @@ private int fieldsAndParamsCount(ActionContext context) { if (fieldsAndParamsCount < 2) { return fieldsAndParamsCount; } - return fieldsAndParamsCount - context.pathVarCount(); + return fieldsAndParamsCount - context.pathVarCount() - sessionVariablesCount; } private String singleJsonFieldName(ActionContext context) { diff --git a/src/main/java/act/inject/genie/SessionScope.java b/src/main/java/act/inject/genie/SessionScope.java index 40b6629b6..cc758f893 100644 --- a/src/main/java/act/inject/genie/SessionScope.java +++ b/src/main/java/act/inject/genie/SessionScope.java @@ -24,12 +24,10 @@ import act.app.App; import act.cli.CliContext; import act.cli.CliSession; -import act.inject.SessionVariable; import act.inject.param.ScopeCacheSupport; import org.osgl.http.H; import org.osgl.inject.BeanSpec; import org.osgl.inject.ScopeCache; -import org.osgl.util.S; public class SessionScope extends ScopeCacheSupport.Base implements ScopeCache.SessionScope, ScopeCacheSupport { @@ -82,15 +80,4 @@ public void put(String key, T t) { } } - @Override - public String key(BeanSpec spec) { - SessionVariable sessionVariable = spec.getAnnotation(SessionVariable.class); - if (null != sessionVariable) { - String key = sessionVariable.value(); - if (S.notBlank(key)) { - return key; - } - } - return super.key(spec); - } } diff --git a/src/main/java/act/inject/param/BoundedValueLoader.java b/src/main/java/act/inject/param/BoundedValueLoader.java index 6fcd0e56c..889afb4e3 100644 --- a/src/main/java/act/inject/param/BoundedValueLoader.java +++ b/src/main/java/act/inject/param/BoundedValueLoader.java @@ -45,4 +45,9 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { public String bindName() { return bindModel; } + + @Override + public boolean supportJsonDecorator() { + return false; + } } diff --git a/src/main/java/act/inject/param/CliParamValueLoader.java b/src/main/java/act/inject/param/CliParamValueLoader.java index 5b2ed53e4..cb2948946 100644 --- a/src/main/java/act/inject/param/CliParamValueLoader.java +++ b/src/main/java/act/inject/param/CliParamValueLoader.java @@ -52,4 +52,8 @@ private CommandLineParser parser(CliContext ctx) { return ctx.commandLine(); } + @Override + public boolean supportJsonDecorator() { + return false; + } } diff --git a/src/main/java/act/inject/param/CollectionLoader.java b/src/main/java/act/inject/param/CollectionLoader.java index b2cc4118e..87f07020b 100644 --- a/src/main/java/act/inject/param/CollectionLoader.java +++ b/src/main/java/act/inject/param/CollectionLoader.java @@ -136,6 +136,11 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { return collection; } + @Override + public boolean supportJsonDecorator() { + return true; + } + private ParamValueLoader childLoader(ParamKey key) { ParamValueLoader loader = childLoaders.get(key); if (null == loader) { diff --git a/src/main/java/act/inject/param/HeaderValueLoader.java b/src/main/java/act/inject/param/HeaderValueLoader.java index 8f9e496cb..881aec36f 100644 --- a/src/main/java/act/inject/param/HeaderValueLoader.java +++ b/src/main/java/act/inject/param/HeaderValueLoader.java @@ -107,6 +107,11 @@ public String bindName() { return key; } + @Override + public boolean supportJsonDecorator() { + return false; + } + private String key(String name, BeanSpec spec) { if (S.notBlank(name)) { return name; diff --git a/src/main/java/act/inject/param/JsonParamValueLoader.java b/src/main/java/act/inject/param/JsonParamValueLoader.java index 7379e7db0..dfcdc66ec 100644 --- a/src/main/java/act/inject/param/JsonParamValueLoader.java +++ b/src/main/java/act/inject/param/JsonParamValueLoader.java @@ -28,10 +28,10 @@ import org.osgl.$; import org.osgl.inject.BeanSpec; -import javax.inject.Provider; import java.lang.reflect.Array; import java.util.Collection; import java.util.Map; +import javax.inject.Provider; class JsonParamValueLoader implements ParamValueLoader { @@ -76,6 +76,11 @@ public String bindName() { return spec.name(); } + @Override + public boolean supportJsonDecorator() { + return false; + } + private static Provider findDefValProvider(BeanSpec beanSpec, DependencyInjector injector) { final Class c = beanSpec.rawType(); final StringValueResolverManager resolver = App.instance().resolverManager(); diff --git a/src/main/java/act/inject/param/MapLoader.java b/src/main/java/act/inject/param/MapLoader.java index 342c9ce34..62d6aeaf7 100644 --- a/src/main/java/act/inject/param/MapLoader.java +++ b/src/main/java/act/inject/param/MapLoader.java @@ -183,6 +183,11 @@ public String bindName() { return key.toString(); } + @Override + public boolean supportJsonDecorator() { + return true; + } + private ParamValueLoader childLoader(ParamKey key) { ParamValueLoader loader = childLoaders.get(key); if (null == loader) { diff --git a/src/main/java/act/inject/param/ParamValueLoader.java b/src/main/java/act/inject/param/ParamValueLoader.java index f51bf31a1..ca847b01b 100644 --- a/src/main/java/act/inject/param/ParamValueLoader.java +++ b/src/main/java/act/inject/param/ParamValueLoader.java @@ -38,6 +38,11 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { public String bindName() { return null; } + + @Override + public boolean supportJsonDecorator() { + return false; + } }; /** @@ -61,4 +66,6 @@ public String bindName() { */ String bindName(); + boolean supportJsonDecorator(); + } diff --git a/src/main/java/act/inject/param/ParamValueLoaderService.java b/src/main/java/act/inject/param/ParamValueLoaderService.java index 362123981..84a1524d5 100644 --- a/src/main/java/act/inject/param/ParamValueLoaderService.java +++ b/src/main/java/act/inject/param/ParamValueLoaderService.java @@ -74,6 +74,11 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { public String bindName() { return null; } + + @Override + public boolean supportJsonDecorator() { + return false; + } }; private static class ThrowableLoader implements ParamValueLoader { private Class throwableType; @@ -92,6 +97,11 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { public String bindName() { return null; } + + @Override + public boolean supportJsonDecorator() { + return false; + } } // contains field names that should be waived when looking for value loader private static final Set fieldBlackList = new HashSet<>(); @@ -238,6 +248,11 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { public String bindName() { return null; } + + @Override + public boolean supportJsonDecorator() { + return true; + } }; return decorate(loader, BeanSpec.of(beanClass, injector), false, true); } @@ -398,6 +413,11 @@ public Object load(Object bean, ActContext ctx, boolean noDefaultValue) { public String bindName() { return null; } + + @Override + public boolean supportJsonDecorator() { + return false; + } }; } @@ -560,6 +580,11 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { public String bindName() { return key.toString(); } + + @Override + public boolean supportJsonDecorator() { + return true; + } }; } @@ -660,7 +685,7 @@ private ParamValueLoader decorate( boolean useJsonDecorator, boolean useValidationDecorator ) { - final ParamValueLoader jsonDecorated = useJsonDecorator ? new JsonParamValueLoader(loader, spec, injector) : loader; + final ParamValueLoader jsonDecorated = useJsonDecorator && loader.supportJsonDecorator() ? new JsonParamValueLoader(loader, spec, injector) : loader; ParamValueLoader validationDecorated = jsonDecorated; if (useValidationDecorator) { validationDecorated = new ParamValueLoader() { @@ -684,6 +709,11 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { public String bindName() { return jsonDecorated.bindName(); } + + @Override + public boolean supportJsonDecorator() { + return false; + } }; } @@ -747,8 +777,7 @@ private static ScopeCacheSupport scopeCacheSupport(BeanSpec spec) { static boolean sessionScoped(BeanSpec spec) { return spec.hasAnnotation(SessionScoped.class) - || spec.hasAnnotation(org.osgl.inject.annotation.SessionScoped.class) - || spec.hasAnnotation(SessionVariable.class); + || spec.hasAnnotation(org.osgl.inject.annotation.SessionScoped.class); } public static void waiveFields(String... fieldNames) { diff --git a/src/main/java/act/inject/param/PartialPathLoader.java b/src/main/java/act/inject/param/PartialPathLoader.java index 156bc15a9..c0ad8d286 100644 --- a/src/main/java/act/inject/param/PartialPathLoader.java +++ b/src/main/java/act/inject/param/PartialPathLoader.java @@ -41,4 +41,8 @@ public String bindName() { return bindName; } + @Override + public boolean supportJsonDecorator() { + return false; + } } diff --git a/src/main/java/act/inject/param/PojoLoader.java b/src/main/java/act/inject/param/PojoLoader.java index b6cd1d2b9..6d99a9b55 100644 --- a/src/main/java/act/inject/param/PojoLoader.java +++ b/src/main/java/act/inject/param/PojoLoader.java @@ -82,6 +82,11 @@ public String bindName() { return key.toString(); } + @Override + public boolean supportJsonDecorator() { + return true; + } + private Map fieldLoaders(ParamKey key, BeanSpec spec) { Class current = spec.rawType(); Map fieldLoaders = new HashMap<>(); diff --git a/src/main/java/act/inject/param/ProvidedValueLoader.java b/src/main/java/act/inject/param/ProvidedValueLoader.java index 8f1cbc15a..fe3be8f5b 100644 --- a/src/main/java/act/inject/param/ProvidedValueLoader.java +++ b/src/main/java/act/inject/param/ProvidedValueLoader.java @@ -66,6 +66,11 @@ public String bindName() { return beanSpec.name(); } + @Override + public boolean supportJsonDecorator() { + return false; + } + @Override protected void releaseResources() { Destroyable.Util.tryDestroy(singleton); diff --git a/src/main/java/act/inject/param/ScopedParamValueLoader.java b/src/main/java/act/inject/param/ScopedParamValueLoader.java index f8dbee7eb..f35786b7e 100644 --- a/src/main/java/act/inject/param/ScopedParamValueLoader.java +++ b/src/main/java/act/inject/param/ScopedParamValueLoader.java @@ -41,6 +41,9 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { Object cached = scopeCache.get(key); boolean isSession = SessionScope.INSTANCE == scopeCache; if (isSession) { + if (null != cached) { + return cached; + } Object requestScoped = RequestScope.INSTANCE.get(key); if (null != requestScoped) { return requestScoped; @@ -58,4 +61,9 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { public String bindName() { return realLoader.bindName(); } + + @Override + public boolean supportJsonDecorator() { + return realLoader.supportJsonDecorator(); + } } diff --git a/src/main/java/act/inject/param/SessionValueLoader.java b/src/main/java/act/inject/param/SessionValueLoader.java index 13116600f..bb7cdbc90 100644 --- a/src/main/java/act/inject/param/SessionValueLoader.java +++ b/src/main/java/act/inject/param/SessionValueLoader.java @@ -68,6 +68,11 @@ public String bindName() { return key; } + @Override + public boolean supportJsonDecorator() { + return false; + } + private String key(String name, BeanSpec spec) { if (S.notBlank(name)) { return name; diff --git a/src/main/java/act/inject/param/StringValueResolverValueLoader.java b/src/main/java/act/inject/param/StringValueResolverValueLoader.java index 8a4fca0b3..c9224f92e 100644 --- a/src/main/java/act/inject/param/StringValueResolverValueLoader.java +++ b/src/main/java/act/inject/param/StringValueResolverValueLoader.java @@ -72,6 +72,11 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { return null == obj && !noDefaultValue ? defVal : obj; } + @Override + public boolean supportJsonDecorator() { + return true; + } + private Object load(ActContext context, HttpRequestParamEncode encode) { String bindName = encode.concat(paramKey); String value = context.paramVal(bindName); From 2655f2f15687610fb03652a01bd0a1467ee1030b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 28 Sep 2018 08:28:21 +1000 Subject: [PATCH 122/730] optimize ParamValueLoader framework --- .../act/inject/param/BoundedValueLoader.java | 6 +- .../act/inject/param/CliParamValueLoader.java | 6 +- .../act/inject/param/CollectionLoader.java | 7 +-- .../act/inject/param/HeaderValueLoader.java | 7 +-- .../inject/param/JsonParamValueLoader.java | 5 ++ src/main/java/act/inject/param/MapLoader.java | 3 +- .../java/act/inject/param/OptionLoader.java | 2 +- .../act/inject/param/ParamValueLoader.java | 53 ++++++++++++---- .../inject/param/ParamValueLoaderService.java | 62 ++++--------------- .../act/inject/param/PartialPathLoader.java | 6 +- .../java/act/inject/param/PojoLoader.java | 8 +-- .../act/inject/param/ProvidedValueLoader.java | 2 +- .../inject/param/ScopedParamValueLoader.java | 37 ++++++----- .../act/inject/param/SessionValueLoader.java | 7 +-- .../param/StringValueResolverValueLoader.java | 7 +-- .../StringValueResolverValueLoaderBase.java | 2 +- 16 files changed, 91 insertions(+), 129 deletions(-) diff --git a/src/main/java/act/inject/param/BoundedValueLoader.java b/src/main/java/act/inject/param/BoundedValueLoader.java index 889afb4e3..650ca41bc 100644 --- a/src/main/java/act/inject/param/BoundedValueLoader.java +++ b/src/main/java/act/inject/param/BoundedValueLoader.java @@ -26,7 +26,7 @@ /** * Use {@link org.osgl.mvc.util.Binder} to load param value */ -class BoundedValueLoader implements ParamValueLoader { +class BoundedValueLoader extends ParamValueLoader.Cacheable { private Binder binder; private String bindModel; @@ -46,8 +46,4 @@ public String bindName() { return bindModel; } - @Override - public boolean supportJsonDecorator() { - return false; - } } diff --git a/src/main/java/act/inject/param/CliParamValueLoader.java b/src/main/java/act/inject/param/CliParamValueLoader.java index cb2948946..bf8335024 100644 --- a/src/main/java/act/inject/param/CliParamValueLoader.java +++ b/src/main/java/act/inject/param/CliParamValueLoader.java @@ -25,7 +25,7 @@ import java.util.List; -abstract class CliParamValueLoader implements ParamValueLoader { +abstract class CliParamValueLoader extends ParamValueLoader.Cacheable { final String optionValue(String lead1, String lead2, CliContext ctx) { return parser(ctx).getString(lead1, lead2); @@ -52,8 +52,4 @@ private CommandLineParser parser(CliContext ctx) { return ctx.commandLine(); } - @Override - public boolean supportJsonDecorator() { - return false; - } } diff --git a/src/main/java/act/inject/param/CollectionLoader.java b/src/main/java/act/inject/param/CollectionLoader.java index 87f07020b..654095bdd 100644 --- a/src/main/java/act/inject/param/CollectionLoader.java +++ b/src/main/java/act/inject/param/CollectionLoader.java @@ -34,7 +34,7 @@ import java.lang.reflect.Type; import java.util.*; -class CollectionLoader implements ParamValueLoader { +class CollectionLoader extends ParamValueLoader.JsonBodySupported { private final ParamKey key; private final Class collectionClass; @@ -136,11 +136,6 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { return collection; } - @Override - public boolean supportJsonDecorator() { - return true; - } - private ParamValueLoader childLoader(ParamKey key) { ParamValueLoader loader = childLoaders.get(key); if (null == loader) { diff --git a/src/main/java/act/inject/param/HeaderValueLoader.java b/src/main/java/act/inject/param/HeaderValueLoader.java index 881aec36f..cc248f8b8 100644 --- a/src/main/java/act/inject/param/HeaderValueLoader.java +++ b/src/main/java/act/inject/param/HeaderValueLoader.java @@ -35,7 +35,7 @@ import java.util.Collection; import java.util.List; -class HeaderValueLoader implements ParamValueLoader { +class HeaderValueLoader extends ParamValueLoader.NonCacheable { private final String key; private final boolean multiValues; @@ -107,11 +107,6 @@ public String bindName() { return key; } - @Override - public boolean supportJsonDecorator() { - return false; - } - private String key(String name, BeanSpec spec) { if (S.notBlank(name)) { return name; diff --git a/src/main/java/act/inject/param/JsonParamValueLoader.java b/src/main/java/act/inject/param/JsonParamValueLoader.java index dfcdc66ec..f6e912feb 100644 --- a/src/main/java/act/inject/param/JsonParamValueLoader.java +++ b/src/main/java/act/inject/param/JsonParamValueLoader.java @@ -76,6 +76,11 @@ public String bindName() { return spec.name(); } + @Override + public boolean supportScopeCaching() { + return fallBack.supportScopeCaching(); + } + @Override public boolean supportJsonDecorator() { return false; diff --git a/src/main/java/act/inject/param/MapLoader.java b/src/main/java/act/inject/param/MapLoader.java index 62d6aeaf7..8a71fffd1 100644 --- a/src/main/java/act/inject/param/MapLoader.java +++ b/src/main/java/act/inject/param/MapLoader.java @@ -25,7 +25,6 @@ import act.app.data.StringValueResolverManager; import act.inject.DependencyInjector; import act.util.ActContext; -import act.util.LogSupport; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.mvc.result.BadRequest; @@ -34,7 +33,7 @@ import java.lang.reflect.Type; import java.util.*; -class MapLoader extends LogSupport implements ParamValueLoader { +class MapLoader extends ParamValueLoader.JsonBodySupported { private final ParamKey key; private final Class mapClass; diff --git a/src/main/java/act/inject/param/OptionLoader.java b/src/main/java/act/inject/param/OptionLoader.java index cc553aa1f..3a27185c8 100644 --- a/src/main/java/act/inject/param/OptionLoader.java +++ b/src/main/java/act/inject/param/OptionLoader.java @@ -33,7 +33,7 @@ /** * Load command line options */ -class OptionLoader extends CliParamValueLoader implements ParamValueLoader { +class OptionLoader extends CliParamValueLoader { final String bindName; String lead1; diff --git a/src/main/java/act/inject/param/ParamValueLoader.java b/src/main/java/act/inject/param/ParamValueLoader.java index ca847b01b..9ea3b8a2a 100644 --- a/src/main/java/act/inject/param/ParamValueLoader.java +++ b/src/main/java/act/inject/param/ParamValueLoader.java @@ -21,28 +21,18 @@ */ import act.cli.CliContext; -import act.util.ActContext; +import act.util.*; /** * Responsible for providing the value to a method parameter */ public interface ParamValueLoader { - ParamValueLoader NIL = new ParamValueLoader() { + ParamValueLoader NIL = new ParamValueLoader.NonCacheable() { @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { return null; } - - @Override - public String bindName() { - return null; - } - - @Override - public boolean supportJsonDecorator() { - return false; - } }; /** @@ -66,6 +56,45 @@ public boolean supportJsonDecorator() { */ String bindName(); + /** + * Is this param value type possibly be retrieved from JSON body? + */ boolean supportJsonDecorator(); + /** + * Is this param value type eligible to scope caching? e.g. Session scope or Request scope + */ + boolean supportScopeCaching(); + + abstract class NonCacheable extends LogSupportedDestroyableBase implements ParamValueLoader { + @Override + public String bindName() { + return null; + } + + @Override + public boolean supportJsonDecorator() { + return false; + } + + @Override + public boolean supportScopeCaching() { + return false; + } + } + + abstract class Cacheable extends NonCacheable { + @Override + public boolean supportScopeCaching() { + return true; + } + } + + abstract class JsonBodySupported extends Cacheable { + @Override + public boolean supportJsonDecorator() { + return true; + } + } + } diff --git a/src/main/java/act/inject/param/ParamValueLoaderService.java b/src/main/java/act/inject/param/ParamValueLoaderService.java index 84a1524d5..af9def250 100644 --- a/src/main/java/act/inject/param/ParamValueLoaderService.java +++ b/src/main/java/act/inject/param/ParamValueLoaderService.java @@ -64,23 +64,13 @@ public abstract class ParamValueLoaderService extends LogSupportedDestroyableBas private static final ParamValueLoader[] DUMB = new ParamValueLoader[0]; private static final ThreadLocal PARAM_TREE = new ThreadLocal(); - private static final ParamValueLoader RESULT_LOADER = new ParamValueLoader() { + private static final ParamValueLoader RESULT_LOADER = new ParamValueLoader.NonCacheable() { @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { return ((ActionContext)context).result(); } - - @Override - public String bindName() { - return null; - } - - @Override - public boolean supportJsonDecorator() { - return false; - } }; - private static class ThrowableLoader implements ParamValueLoader { + private static class ThrowableLoader extends ParamValueLoader.NonCacheable { private Class throwableType; public ThrowableLoader(Class throwableType) { @@ -93,16 +83,8 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { return throwableType.isInstance(o) ? o : null; } - @Override - public String bindName() { - return null; - } - - @Override - public boolean supportJsonDecorator() { - return false; - } } + // contains field names that should be waived when looking for value loader private static final Set fieldBlackList = new HashSet<>(); @@ -215,7 +197,7 @@ protected ParamValueLoader findBeanLoader(Class beanClass) { final Map loaders = fieldLoaders(beanClass); final boolean hasField = !loaders.isEmpty(); final $.Var hasValidateConstraint = $.var(); - ParamValueLoader loader = new ParamValueLoader() { + ParamValueLoader loader = new ParamValueLoader.NonCacheable() { @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (null == bean) { @@ -231,8 +213,6 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { Object fieldValue = loader.load(null, context, noDefaultValue); if (null != fieldValue) { field.set(bean, fieldValue); - } else { - fieldValue = field.get(bean); } if (hasValidationConstraint(BeanSpec.of(field, injector))) { hasValidateConstraint.set(true); @@ -243,16 +223,6 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { } return bean; } - - @Override - public String bindName() { - return null; - } - - @Override - public boolean supportJsonDecorator() { - return true; - } }; return decorate(loader, BeanSpec.of(beanClass, injector), false, true); } @@ -395,7 +365,7 @@ private ParamValueLoader findHandlerMethodAnnotation(final Class ctx, boolean noDefaultValue) { Method handlerMethod = ctx.handlerMethod(); @@ -408,16 +378,6 @@ public Object load(Object bean, ActContext ctx, boolean noDefaultValue) { } return anno; } - - @Override - public String bindName() { - return null; - } - - @Override - public boolean supportJsonDecorator() { - return false; - } }; } @@ -562,7 +522,7 @@ private ParamValueLoader buildArrayLoader( final BeanSpec targetSpec ) { final CollectionLoader collectionLoader = new CollectionLoader(key, ArrayList.class, elementType, targetSpec, injector, this); - return new ParamValueLoader() { + return new ParamValueLoader.JsonBodySupported() { @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { List list = new ArrayList(); @@ -580,11 +540,6 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { public String bindName() { return key.toString(); } - - @Override - public boolean supportJsonDecorator() { - return true; - } }; } @@ -714,6 +669,11 @@ public String bindName() { public boolean supportJsonDecorator() { return false; } + + @Override + public boolean supportScopeCaching() { + return jsonDecorated.supportScopeCaching(); + } }; } diff --git a/src/main/java/act/inject/param/PartialPathLoader.java b/src/main/java/act/inject/param/PartialPathLoader.java index c0ad8d286..db8d3d0e1 100644 --- a/src/main/java/act/inject/param/PartialPathLoader.java +++ b/src/main/java/act/inject/param/PartialPathLoader.java @@ -23,7 +23,7 @@ import act.controller.ParamNames; import act.util.ActContext; -public class PartialPathLoader implements ParamValueLoader { +public class PartialPathLoader extends ParamValueLoader.NonCacheable { private String bindName; @@ -41,8 +41,4 @@ public String bindName() { return bindName; } - @Override - public boolean supportJsonDecorator() { - return false; - } } diff --git a/src/main/java/act/inject/param/PojoLoader.java b/src/main/java/act/inject/param/PojoLoader.java index 6d99a9b55..bea81b1f3 100644 --- a/src/main/java/act/inject/param/PojoLoader.java +++ b/src/main/java/act/inject/param/PojoLoader.java @@ -24,7 +24,6 @@ import act.inject.genie.GenieInjector; import act.util.ActContext; -import act.util.LogSupport; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.inject.InjectException; @@ -33,7 +32,7 @@ import java.util.HashMap; import java.util.Map; -class PojoLoader extends LogSupport implements ParamValueLoader { +class PojoLoader extends ParamValueLoader.JsonBodySupported { final ParamKey key; final BeanSpec spec; @@ -82,11 +81,6 @@ public String bindName() { return key.toString(); } - @Override - public boolean supportJsonDecorator() { - return true; - } - private Map fieldLoaders(ParamKey key, BeanSpec spec) { Class current = spec.rawType(); Map fieldLoaders = new HashMap<>(); diff --git a/src/main/java/act/inject/param/ProvidedValueLoader.java b/src/main/java/act/inject/param/ProvidedValueLoader.java index fe3be8f5b..28f76173b 100644 --- a/src/main/java/act/inject/param/ProvidedValueLoader.java +++ b/src/main/java/act/inject/param/ProvidedValueLoader.java @@ -32,7 +32,7 @@ import javax.enterprise.context.ApplicationScoped; import javax.inject.Singleton; -public class ProvidedValueLoader extends LogSupportedDestroyableBase implements ParamValueLoader { +public class ProvidedValueLoader extends ParamValueLoader.NonCacheable { private DependencyInjector injector; private BeanSpec beanSpec; private Object singleton; diff --git a/src/main/java/act/inject/param/ScopedParamValueLoader.java b/src/main/java/act/inject/param/ScopedParamValueLoader.java index f35786b7e..ee932d91f 100644 --- a/src/main/java/act/inject/param/ScopedParamValueLoader.java +++ b/src/main/java/act/inject/param/ScopedParamValueLoader.java @@ -29,32 +29,34 @@ class ScopedParamValueLoader implements ParamValueLoader { private ParamValueLoader realLoader; private String key; private ScopeCacheSupport scopeCache; + private boolean supportCaching; ScopedParamValueLoader(ParamValueLoader loader, BeanSpec beanSpec, ScopeCacheSupport scopeCache) { this.realLoader = loader; - this.scopeCache = scopeCache; + if (loader.supportScopeCaching()) { + this.scopeCache = scopeCache; + this.supportCaching = true; + } this.key = scopeCache.key(beanSpec); } @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { - Object cached = scopeCache.get(key); - boolean isSession = SessionScope.INSTANCE == scopeCache; - if (isSession) { - if (null != cached) { - return cached; + if (supportCaching) { + Object cached = scopeCache.get(key); + boolean isSession = SessionScope.INSTANCE == scopeCache; + if (isSession && null == cached) { + cached = RequestScope.INSTANCE.get(key); } - Object requestScoped = RequestScope.INSTANCE.get(key); - if (null != requestScoped) { - return requestScoped; + cached = realLoader.load(cached, context, noDefaultValue); + scopeCache.put(key, cached); + if (isSession) { + RequestScope.INSTANCE.put(key, cached); } + return cached; + } else { + return realLoader.load(null, context, noDefaultValue); } - cached = realLoader.load(cached, context, noDefaultValue); - scopeCache.put(key, cached); - if (isSession) { - RequestScope.INSTANCE.put(key, cached); - } - return cached; } @Override @@ -66,4 +68,9 @@ public String bindName() { public boolean supportJsonDecorator() { return realLoader.supportJsonDecorator(); } + + @Override + public boolean supportScopeCaching() { + return realLoader.supportScopeCaching(); + } } diff --git a/src/main/java/act/inject/param/SessionValueLoader.java b/src/main/java/act/inject/param/SessionValueLoader.java index bb7cdbc90..7f63ee9ed 100644 --- a/src/main/java/act/inject/param/SessionValueLoader.java +++ b/src/main/java/act/inject/param/SessionValueLoader.java @@ -29,7 +29,7 @@ import org.osgl.util.S; import org.osgl.util.StringValueResolver; -class SessionValueLoader implements ParamValueLoader { +class SessionValueLoader extends ParamValueLoader.NonCacheable { private final String key; private final Class targetType; @@ -68,11 +68,6 @@ public String bindName() { return key; } - @Override - public boolean supportJsonDecorator() { - return false; - } - private String key(String name, BeanSpec spec) { if (S.notBlank(name)) { return name; diff --git a/src/main/java/act/inject/param/StringValueResolverValueLoader.java b/src/main/java/act/inject/param/StringValueResolverValueLoader.java index c9224f92e..1b5862b7a 100644 --- a/src/main/java/act/inject/param/StringValueResolverValueLoader.java +++ b/src/main/java/act/inject/param/StringValueResolverValueLoader.java @@ -27,7 +27,7 @@ import org.osgl.util.E; import org.osgl.util.StringValueResolver; -public class StringValueResolverValueLoader extends StringValueResolverValueLoaderBase implements ParamValueLoader { +public class StringValueResolverValueLoader extends StringValueResolverValueLoaderBase { private static final ThreadLocal encodeShare = new ThreadLocal(); @@ -72,11 +72,6 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { return null == obj && !noDefaultValue ? defVal : obj; } - @Override - public boolean supportJsonDecorator() { - return true; - } - private Object load(ActContext context, HttpRequestParamEncode encode) { String bindName = encode.concat(paramKey); String value = context.paramVal(bindName); diff --git a/src/main/java/act/inject/param/StringValueResolverValueLoaderBase.java b/src/main/java/act/inject/param/StringValueResolverValueLoaderBase.java index dd153e07c..3670eb9fd 100644 --- a/src/main/java/act/inject/param/StringValueResolverValueLoaderBase.java +++ b/src/main/java/act/inject/param/StringValueResolverValueLoaderBase.java @@ -25,7 +25,7 @@ import org.osgl.util.E; import org.osgl.util.StringValueResolver; -abstract class StringValueResolverValueLoaderBase implements ParamValueLoader { +abstract class StringValueResolverValueLoaderBase extends ParamValueLoader.JsonBodySupported { protected final StringValueResolver stringValueResolver; protected final ParamKey paramKey; From 84d64254ca8d735b9857ccb1b1a5e1118e880cbc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 28 Sep 2018 21:41:43 +1000 Subject: [PATCH 123/730] Provide a way to allow app to specify order of elements in the injected collection #857 --- CHANGELOG.md | 1 + src/main/java/act/annotations/Order.java | 48 ++++++++++++++ src/main/java/act/annotations/Sorted.java | 37 +++++++++++ src/main/java/act/inject/util/Sorter.java | 66 +++++++++++++++++++ .../src/main/java/ghissues/Gh857.java | 54 +++++++++++++++ .../src/main/resources/test/scenarios/857.yml | 11 ++++ 6 files changed, 217 insertions(+) create mode 100644 src/main/java/act/annotations/Order.java create mode 100644 src/main/java/act/annotations/Sorted.java create mode 100644 src/main/java/act/inject/util/Sorter.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh857.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/857.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index aefbfb647..6d0e70706 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Provide a way to allow app to specify order of elements in the injected collection #857 * `@SessionVariable` annotation not working as expected #856 * Automate testing failure #855 * `@PropertySpec` not effect when `ReturnValueAdvice` applied #852 diff --git a/src/main/java/act/annotations/Order.java b/src/main/java/act/annotations/Order.java new file mode 100644 index 000000000..d6d5e0a27 --- /dev/null +++ b/src/main/java/act/annotations/Order.java @@ -0,0 +1,48 @@ +package act.annotations; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Specifies the sort order for an annotated component + * + * When sorting a list of element with (potentially) the + * `@Order` annotation, the one without the + * annotation is put in the head of the list, followed + * by the one with less order weight value and then + * followed by the one with greater order weight value + * + * @see Sorted + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface Order { + + int HIGHEST_PRECEDENCE = Integer.MIN_VALUE; + int LOWEST_PRECEDENCE = Integer.MAX_VALUE; + + /** + * Specify the order weight. + */ + int value(); + +} diff --git a/src/main/java/act/annotations/Sorted.java b/src/main/java/act/annotations/Sorted.java new file mode 100644 index 000000000..6df6a6555 --- /dev/null +++ b/src/main/java/act/annotations/Sorted.java @@ -0,0 +1,37 @@ +package act.annotations; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ +import act.inject.util.Sorter; +import org.osgl.inject.annotation.PostConstructProcess; + +import java.lang.annotation.*; + +/** + * A hint to tell framework that a list + * shall be sorted in a certain order + * + * @see Order + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@PostConstructProcess(Sorter.class) +public @interface Sorted { +} diff --git a/src/main/java/act/inject/util/Sorter.java b/src/main/java/act/inject/util/Sorter.java new file mode 100644 index 000000000..82531a0a6 --- /dev/null +++ b/src/main/java/act/inject/util/Sorter.java @@ -0,0 +1,66 @@ +package act.inject.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.annotations.Order; +import org.osgl.inject.PostConstructProcessor; + +import java.lang.annotation.Annotation; +import java.util.*; + +public class Sorter implements PostConstructProcessor { + + private static final Comparator comp = new Comparator() { + @Override + public int compare(Object o1, Object o2) { + if (o1 == null) { + return -1; + } + if (o2 == null) { + return 1; + } + Class c1 = o1.getClass(); + Class c2 = o2.getClass(); + Order order1 = c1.getAnnotation(Order.class); + Order order2 = c2.getAnnotation(Order.class); + int p1 = null == order1 ? Order.HIGHEST_PRECEDENCE : order1.value(); + int p2 = null == order2 ? Order.HIGHEST_PRECEDENCE : order2.value(); + int delta = Integer.compare(p1, p2); + if (0 != delta) { + return delta; + } + return c1.toString().compareTo(c2.toString()); + } + }; + + + @Override + public void process(Object bean, Annotation annotation) { + if (bean instanceof List) { + sort((List) bean); + } + } + + private void sort(List list) { + Collections.sort(list, comp); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh857.java b/testapps/GHIssues/src/main/java/ghissues/Gh857.java new file mode 100644 index 000000000..3f93bba54 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh857.java @@ -0,0 +1,54 @@ +package ghissues; + +import act.annotations.Order; +import act.annotations.Sorted; +import act.controller.annotation.UrlContext; +import org.osgl.inject.annotation.TypeOf; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.List; + +@UrlContext("857") +public class Gh857 extends BaseController { + + public interface Service857 { + String name(); + } + + @Order(2) + public static class BarService implements Service857 { + @Override + public String name() { + return "bar"; + } + } + + @Order(11) + public static class FooService implements Service857 { + @Override + public String name() { + return "foo"; + } + + } + + @Order(3) + public static class ZooService implements Service857 { + @Override + public String name() { + return "zoo"; + } + } + + + @TypeOf + @Sorted + private List services; + + @GetAction + public List test() { + return C.list(services).map(Service857::name); + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/857.yml b/testapps/GHIssues/src/main/resources/test/scenarios/857.yml new file mode 100644 index 000000000..54763651e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/857.yml @@ -0,0 +1,11 @@ +Scenario(GH857): + description: "[857] Provide a way to allow app to specify order of elements in the injected collection" + interactions: + - description: test + request: + get: 857 + response: + json: + 0: bar + 1: zoo + 2: foo \ No newline at end of file From 10bfe79f9d8bd9cbf3e07abcc29551c24dbfaf2c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 28 Sep 2018 22:40:24 +1000 Subject: [PATCH 124/730] Render automated test report for JSON request #858 --- CHANGELOG.md | 1 + .../controller/impl/ReflectedHandlerInvoker.java | 15 ++++++++------- src/main/java/act/test/ScenarioDebugHelper.java | 16 ++++++++-------- src/main/resources/rythm/~test.html | 7 +++---- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d0e70706..f8e4017b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Render automated test report for JSON request #858 * Provide a way to allow app to specify order of elements in the injected collection #857 * `@SessionVariable` annotation not working as expected #856 * Automate testing failure #855 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index ca5fbbfbd..ddd7b2119 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -174,7 +174,8 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { throw E.unexpected(e); } this.returnString = method.getReturnType() == String.class; - if (handlerMetaInfo.hasReturn()) { + final boolean isBuiltIn = controllerClass.getName().startsWith("act."); + if (handlerMetaInfo.hasReturn() && !isBuiltIn) { this.returnSimpleType = this.returnString || $.isSimpleType(method.getReturnType()); this.returnIterable = !this.returnSimpleType && (handlerMetaInfo.isReturnArray() || Iterable.class.isAssignableFrom(method.getReturnType())); if (this.returnIterable) { @@ -220,7 +221,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { method.setAccessible(true); } - if (handlerMetaInfo.hasReturn() && null == method.getAnnotation(NoReturnValueAdvice.class)) { + if (!isBuiltIn && handlerMetaInfo.hasReturn() && null == method.getAnnotation(NoReturnValueAdvice.class)) { ReturnValueAdvisor advisor = getAnnotation(ReturnValueAdvisor.class); if (null != advisor) { returnValueAdvice = app.getInstance(advisor.value()); @@ -659,7 +660,7 @@ private String singleJsonFieldName(ActionContext context) { if (null != singleJsonFieldName) { return singleJsonFieldName; } - for (BeanSpec spec: paramSpecs) { + for (BeanSpec spec : paramSpecs) { String name = spec.name(); if (context.isPathVar(name)) { continue; @@ -776,7 +777,7 @@ private void initCacheParams(AppConfig config) { return; } CacheFor cacheFor = method.getAnnotation(CacheFor.class); - cacheSupport = null == cacheFor ? CacheSupportMetaInfo.disabled() : CacheSupportMetaInfo.enabled( + cacheSupport = null == cacheFor ? CacheSupportMetaInfo.disabled() : CacheSupportMetaInfo.enabled( new CacheKeyBuilder(cacheFor, S.concat(controllerClass.getName(), ".", method.getName())), cacheFor.id(), cacheFor.value(), @@ -1315,7 +1316,7 @@ private String paramVal(String key, ActionContext context) { } else if (1 == allValues.length) { return allValues[0]; } else { - return $.toString2(allValues); + return $.toString2(allValues); } } } diff --git a/src/main/java/act/test/ScenarioDebugHelper.java b/src/main/java/act/test/ScenarioDebugHelper.java index 70ba89a38..91663e947 100644 --- a/src/main/java/act/test/ScenarioDebugHelper.java +++ b/src/main/java/act/test/ScenarioDebugHelper.java @@ -20,16 +20,13 @@ * #L% */ -import static act.controller.Controller.Util.renderTemplate; - import act.Act; import act.app.ActionContext; import act.app.App; import act.handler.RequestHandlerBase; import act.sys.Env; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; +import act.util.PropertySpec; +import com.alibaba.fastjson.*; import org.osgl.http.H; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.Keyword; @@ -97,9 +94,12 @@ public void prepareAuthentication(ActionContext context) { private Test test; @GetAction({"e2e/{testId}", "test/{testId}", "tests/{testId}"}) - public void run(App app, Keyword testId) { - List scenarios = test.run(app, testId, false); - renderTemplate("/~test.html", scenarios, app); + @PropertySpec("name, status, description") + public List run(App app, Keyword testId, ActionContext context) { + if (context.accept() == H.Format.HTML) { + context.templatePath("/~test.html"); + } + return test.run(app, testId, false); } } diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html index be713e025..9d44d681c 100644 --- a/src/main/resources/rythm/~test.html +++ b/src/main/resources/rythm/~test.html @@ -1,7 +1,7 @@ @import act.test.Scenario @import act.test.Interaction -@args List scenarios +@args List result @@ -56,10 +56,9 @@ @render(head) -@args act.app.App app

                                                                                                                                                                      Test Report

                                                                                                                                                                      -
                                                                                                                                                                      @(app.name().capFirst())-@(app.version().getVersion())
                                                                                                                                                                      -@for(Scenario scenario: scenarios) { +
                                                                                                                                                                      @(_app.name().capFirst())-@(_app.version().getVersion())
                                                                                                                                                                      +@for(Scenario scenario: result) {

                                                                                                                                                                      @if(scenario.description) { @scenario.description From d7c0f12ce4ed7369a0460718ba6c87f3a1d47643 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 29 Sep 2018 07:23:31 +1000 Subject: [PATCH 125/730] Rythm Template error report - source tab issue #859 --- CHANGELOG.md | 1 + src/main/java/act/view/rythm/RythmView.java | 16 ++++++++++++++++ .../resources/rythm/error/dev/errorPage.html | 4 ++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8e4017b8..61896b3c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Rythm Template error report - source tab issue #859 * Render automated test report for JSON request #858 * Provide a way to allow app to specify order of elements in the injected collection #857 * `@SessionVariable` annotation not working as expected #856 diff --git a/src/main/java/act/view/rythm/RythmView.java b/src/main/java/act/view/rythm/RythmView.java index a4a087094..7de9777ba 100644 --- a/src/main/java/act/view/rythm/RythmView.java +++ b/src/main/java/act/view/rythm/RythmView.java @@ -229,4 +229,20 @@ public static RawData errorLine(String data, int errorColumn) { return new RawData(line); } + @Transformer + public static RawData errorLine(RawData data, int errorColumn) { + String line = S.string(data); + if (errorColumn > -1 && errorColumn < line.length()) { + String a = line.substring(0, errorColumn); + char c = line.charAt(errorColumn); + String b = line.substring(errorColumn + 1); + line = S.concat(a, "", c, "", b); + line = S.replace(" ").with(" ").in(line); + line = S.replace("span_class").with("span class").in(line); + } else { + line = S.replace(" ").with(" ").in(line); + } + return new RawData(line); + } + } diff --git a/src/main/resources/rythm/error/dev/errorPage.html b/src/main/resources/rythm/error/dev/errorPage.html index b96118c59..dc36e9c51 100644 --- a/src/main/resources/rythm/error/dev/errorPage.html +++ b/src/main/resources/rythm/error/dev/errorPage.html @@ -187,9 +187,9 @@ @line_index @ifNot(isErrorLine || sourceInfo.column() < 0) { - @line.sp2nbsp() + @line.escapeHtml().sp2nbsp() } else { - @line.errorLine(sourceInfo.column()) + @line.escapeHtml().errorLine(sourceInfo.column()) } From 50d37ba64897d75b7de230cd5514bdba00888f2a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 30 Sep 2018 21:43:01 +1000 Subject: [PATCH 126/730] optimize report when exception encountered on handling request --- .../act/handler/builtin/controller/RequestHandlerProxy.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index 8f1423638..0df8320ff 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -232,20 +232,20 @@ public void handle(ActionContext context) { cacheKeys.add(cacheKey); } } catch (Exception e) { - H.Request req = context.req(); - logger.error(e, S.concat("Error handling request: [", req.method().name(), "] ", req.url())); try { result = handleException(e, context); } catch (Exception e0) { logger.error(e0, "Error invoking exception handler"); } if (null == result) { + H.Request req = context.req(); + logger.error(e, "error handling request: " + req); result = ActErrorResult.of(e); } try { onResult(result, context); } catch (Exception e2) { - logger.error(e2, "error rendering exception handle result"); + logger.error(e2, "error rendering exception handle result"); onResult(ActErrorResult.of(e2), context); } } finally { From ab2e8eaad1bac92794a81e04438f047b157ea3a5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 30 Sep 2018 23:07:17 +1000 Subject: [PATCH 127/730] ActionContext.login now accept non string type parameter - support keeping user id in addition to username --- src/main/java/act/app/ActionContext.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 896faf80a..a60286eab 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -1176,11 +1176,11 @@ public void startHandling() { /** * Update the context session to mark a user logged in * - * @param username - * the username + * @param userIdentifier + * the user identifier, could be either userId or username */ - public void login(String username) { - session().put(config().sessionKeyUsername(), username); + public void login(Object userIdentifier) { + session().put(config().sessionKeyUsername(), userIdentifier); } /** From ebb6650c9c17929afd502d1836bd390060f05d53 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 1 Oct 2018 06:44:46 +1000 Subject: [PATCH 128/730] test resource loading - fixtures not refreshed after hot-reload #860 --- CHANGELOG.md | 1 + src/main/java/act/Zen.java | 2 +- src/main/java/act/app/DevModeClassLoader.java | 14 ++++++- src/main/java/act/test/Test.java | 5 ++- src/main/java/act/test/macro/Macro.java | 37 ++++++++++++------- .../java/act/test/util/ScenarioManager.java | 2 +- src/main/java/act/test/util/YamlLoader.java | 2 +- 7 files changed, 43 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61896b3c7..37952c56d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* test resource not refreshed after hot-reload #860 * Rythm Template error report - source tab issue #859 * Render automated test report for JSON request #858 * Provide a way to allow app to specify order of elements in the injected collection #857 diff --git a/src/main/java/act/Zen.java b/src/main/java/act/Zen.java index 654c0e24e..abc88c09a 100644 --- a/src/main/java/act/Zen.java +++ b/src/main/java/act/Zen.java @@ -58,7 +58,7 @@ public void zen(ActionContext context) { } private static List loadWords() { - URL url = Zen.class.getResource("/act_zen.txt"); + URL url = Act.getResource("act_zen.txt"); List words = C.newList(defaultWords()); if (null != url) { try { diff --git a/src/main/java/act/app/DevModeClassLoader.java b/src/main/java/act/app/DevModeClassLoader.java index 2dea9407e..3133ff169 100644 --- a/src/main/java/act/app/DevModeClassLoader.java +++ b/src/main/java/act/app/DevModeClassLoader.java @@ -85,9 +85,19 @@ public ControllerClassMetaInfo controllerClassMetaInfo(String controllerClassNam @Override public URL getResource(String name) { - // TODO: handle modules case + // TODO: handle multiple modules case File file = new File(RuntimeDirs.resource(app()), name); - return file.exists() ? $.convert(file).to(URL.class) : super.getResource(name); + if (file.exists()) { + return $.convert(file).to(URL.class); + } + URL url = super.getResource(name); + if (null == url) { + if (name.startsWith("/")) { + name = name.substring(1); + return super.getResource(name); + } + } + return null; } @Override diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 55aa4108e..7e7595605 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -200,7 +200,10 @@ public void clearFixtures() { } } - // wait 1 seconds to allow app setup the network + // ensure automated test start after three events: + // 1. ACT_START + // 2. POST_START + // 3. DB_SVC_LOADED @OnSysEvent(SysEventId.ACT_START) public void run(final App app) { boolean run = $.bool(app.config().get("test.run")) || $.bool(app.config().get("e2e.run")) || "test".equalsIgnoreCase(Act.profile()) || "e2e".equalsIgnoreCase(Act.profile()); diff --git a/src/main/java/act/test/macro/Macro.java b/src/main/java/act/test/macro/Macro.java index 9870888f2..1d8261a69 100644 --- a/src/main/java/act/test/macro/Macro.java +++ b/src/main/java/act/test/macro/Macro.java @@ -20,14 +20,11 @@ * #L% */ -import act.app.App; +import act.Act; import act.test.Scenario; import act.test.util.NamedLogic; import org.osgl.$; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.IO; -import org.osgl.util.S; +import org.osgl.util.*; import org.osgl.util.converter.TypeConverterRegistry; import java.io.File; @@ -68,22 +65,34 @@ public void run(Scenario scenario) { * with the underscore style of the file name. */ public static class ReadContent extends Macro { + + private String resourcePath; + + @Override + public void init(Object param) { + String s = S.string(param); + if (s.startsWith("/")) { + s = s.substring(1); + } + resourcePath = s; + E.unexpectedIf(null == tryRead(), "ReadContent init param must be a valid resource path: ", s); + } + @Override public void run(Scenario scenario) { - String fileName = (String) initVal; - File file = new File(fileName); + scenario.cache(S.underscore(resourcePath), tryRead()); + } + + private String tryRead() { + File file = new File(resourcePath); String content; if (file.exists() && file.canRead()) { content = IO.read(file).toString(); } else { - URL url = App.class.getResource(fileName); - if (null == url) { - url = App.class.getClassLoader().getResource(fileName); - } - E.unexpectedIf(null == url, "Cannot find file or resource by " + fileName); - content = IO.read(url).toString(); + URL url = Act.getResource(resourcePath); + content = null == url ? null : IO.read(url).toString(); } - scenario.cache(S.underscore(fileName), content); + return content; } @Override diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index eac1496c0..9a1faea8d 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -99,7 +99,7 @@ private void searchScenarioFolder() { if (null != app) { searchWhenInAppContext(app); } else { - URL url = ScenarioManager.class.getResource("/test/scenarios"); + URL url = Act.getResource("/test/scenarios"); if (null != url) { File file = new File(url.getFile()); if (file.exists()) { diff --git a/src/main/java/act/test/util/YamlLoader.java b/src/main/java/act/test/util/YamlLoader.java index 135379ff7..4579a0532 100644 --- a/src/main/java/act/test/util/YamlLoader.java +++ b/src/main/java/act/test/util/YamlLoader.java @@ -272,7 +272,7 @@ private void resolveConstants(Map entityValue) { } protected String getResourceAsString(String name) { - URL url = YamlLoader.class.getResource(patchResourceName(name)); + URL url = Act.getResource(patchResourceName(name)); return null == url ? null : IO.read(url).toString(); } From 04184ce648b939a59b9890932a73aeeffe001695 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 1 Oct 2018 07:32:13 +1000 Subject: [PATCH 129/730] test resource not refreshed after hot-reload #860 --- src/main/java/act/Act.java | 9 ++++++++- src/main/java/act/app/DevModeClassLoader.java | 2 +- src/main/java/act/test/macro/Macro.java | 4 ++-- .../GHIssues/src/main/java/ghissues/Gh860.java | 14 ++++++++++++++ testapps/GHIssues/src/main/resources/860.txt | 1 + .../src/main/resources/test/scenarios/860.yml | 13 +++++++++++++ 6 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh860.java create mode 100644 testapps/GHIssues/src/main/resources/860.txt create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/860.yml diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index ec762857e..2d51484c4 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -571,7 +571,14 @@ public static T getInstance(Class clz) { * @return the `URL` if found, or `null` if resource not found */ public static URL getResource(String name) { - return app().getResource(name); + App app = app(); + if (null == app) { + if (name.startsWith("/")) { + name = name.substring(1); + } + return Act.class.getClassLoader().getResource(name); + } + return app.getResource(name); } /** diff --git a/src/main/java/act/app/DevModeClassLoader.java b/src/main/java/act/app/DevModeClassLoader.java index 3133ff169..e861a6c34 100644 --- a/src/main/java/act/app/DevModeClassLoader.java +++ b/src/main/java/act/app/DevModeClassLoader.java @@ -97,7 +97,7 @@ public URL getResource(String name) { return super.getResource(name); } } - return null; + return url; } @Override diff --git a/src/main/java/act/test/macro/Macro.java b/src/main/java/act/test/macro/Macro.java index 1d8261a69..f5aa620c2 100644 --- a/src/main/java/act/test/macro/Macro.java +++ b/src/main/java/act/test/macro/Macro.java @@ -75,12 +75,12 @@ public void init(Object param) { s = s.substring(1); } resourcePath = s; - E.unexpectedIf(null == tryRead(), "ReadContent init param must be a valid resource path: ", s); + E.unexpectedIf(null == tryRead(), "ReadContent init param[%s] must be a valid resource path.", s); } @Override public void run(Scenario scenario) { - scenario.cache(S.underscore(resourcePath), tryRead()); + scenario.cache(resourcePath, tryRead()); } private String tryRead() { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh860.java b/testapps/GHIssues/src/main/java/ghissues/Gh860.java new file mode 100644 index 000000000..36c7310c5 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh860.java @@ -0,0 +1,14 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("860") +public class Gh860 extends BaseController { + + @GetAction + public String test(String content) { + return content; + } + +} diff --git a/testapps/GHIssues/src/main/resources/860.txt b/testapps/GHIssues/src/main/resources/860.txt new file mode 100644 index 000000000..fc80254b6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/860.txt @@ -0,0 +1 @@ +pass \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/860.yml b/testapps/GHIssues/src/main/resources/test/scenarios/860.yml new file mode 100644 index 000000000..99e44648a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/860.yml @@ -0,0 +1,13 @@ +Scenario(GH860): + description: "[860] test resource not refreshed after hot-reload" + interactions: + - description: Test + preActions: + - read-content: 860.txt + request: + get: 860 + params: + content: ${860.txt} + response: + json: + result: pass From b3877a7afff01b97bb6735b2b699a396e0a1399b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 1 Oct 2018 10:56:27 +1000 Subject: [PATCH 130/730] Make `EventBus` and `Job` list favor `Order` annotation #861 --- CHANGELOG.md | 1 + src/main/java/act/event/EventBus.java | 19 +++++++---- .../ReflectedSimpleEventListener.java | 16 ++++++--- src/main/java/act/inject/util/Sorter.java | 33 ++++++++++++++----- src/main/java/act/job/Job.java | 2 ++ src/main/java/act/util/Ordered.java | 25 ++++++++++++++ 6 files changed, 78 insertions(+), 18 deletions(-) create mode 100644 src/main/java/act/util/Ordered.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 37952c56d..06fa4674c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Make `EventBus` and `Job` list favor `Order` annotation #861 * test resource not refreshed after hot-reload #860 * Rythm Template error report - source tab issue #859 * Render automated test report for JSON request #858 diff --git a/src/main/java/act/event/EventBus.java b/src/main/java/act/event/EventBus.java index f8a0e6d34..8b94d6ee3 100644 --- a/src/main/java/act/event/EventBus.java +++ b/src/main/java/act/event/EventBus.java @@ -28,6 +28,7 @@ import act.app.event.SysEventListener; import act.inject.DependencyInjectionBinder; import act.inject.DependencyInjector; +import act.inject.util.Sorter; import act.job.JobManager; import org.osgl.$; import org.osgl.logging.LogManager; @@ -1115,7 +1116,7 @@ private EventBus _bind(List[] listeners, SysEventId sysEventId, SysEventListener return this; } List list = listeners[sysEventId.ordinal()]; - if (!list.contains(l)) list.add(l); + addIntoListWithOrder(list, l); return this; } @@ -1129,8 +1130,7 @@ private synchronized EventBus _bind(final ConcurrentMap 0) { app().jobManager().delay(new Runnable() { @Override @@ -1184,9 +1184,7 @@ private EventBus _bind(ConcurrentMap> listeners, list = newList; } } - if (!list.contains(eventListener)) { - list.add(eventListener); - } + addIntoListWithOrder(list, eventListener); return this; } @@ -1529,4 +1527,13 @@ public static boolean isAsync(AnnotatedElement c) { private static boolean _isAsync(Object eventId) { return eventId instanceof Class && isAsync((Class) eventId); } + + private boolean addIntoListWithOrder(List list, Object element) { + if (!list.contains(element)) { + list.add(element); + Collections.sort(list, Sorter.COMPARATOR); + return true; + } + return false; + } } diff --git a/src/main/java/act/event/bytecode/ReflectedSimpleEventListener.java b/src/main/java/act/event/bytecode/ReflectedSimpleEventListener.java index c78815b22..3a65b92dd 100644 --- a/src/main/java/act/event/bytecode/ReflectedSimpleEventListener.java +++ b/src/main/java/act/event/bytecode/ReflectedSimpleEventListener.java @@ -21,21 +21,21 @@ */ import act.Act; +import act.annotations.Order; import act.app.App; import act.event.EventBus; import act.event.SimpleEventListener; import act.inject.DependencyInjector; import act.inject.param.ParamValueLoaderService; +import act.util.Ordered; import org.osgl.$; import org.osgl.inject.BeanSpec; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.util.*; import java.lang.reflect.Method; import java.util.List; -public class ReflectedSimpleEventListener implements SimpleEventListener { +public class ReflectedSimpleEventListener implements SimpleEventListener, Ordered { private transient volatile Object host; @@ -46,6 +46,7 @@ public class ReflectedSimpleEventListener implements SimpleEventListener { private final int providedParamSize; private final boolean isStatic; private final boolean isAsync; + private final int order; ReflectedSimpleEventListener(String className, String methodName, List paramTypes, boolean isStatic, boolean isAsync) { this.isStatic = isStatic; @@ -78,6 +79,8 @@ public class ReflectedSimpleEventListener implements SimpleEventListener { this.hostClass = Act.app().classForName(className); this.method = $.getMethod(hostClass, methodName, argList); this.isAsync = isAsync || EventBus.isAsync(hostClass) || EventBus.isAsync(method); + Order order = this.hostClass.getAnnotation(Order.class); + this.order = null == order ? Order.HIGHEST_PRECEDENCE : order.value(); } @Override @@ -85,6 +88,11 @@ public boolean isAsync() { return isAsync; } + @Override + public int order() { + return this.order; + } + @Override public void invoke(Object... args) { int paramNo = paramTypes.size(); diff --git a/src/main/java/act/inject/util/Sorter.java b/src/main/java/act/inject/util/Sorter.java index 82531a0a6..f68192468 100644 --- a/src/main/java/act/inject/util/Sorter.java +++ b/src/main/java/act/inject/util/Sorter.java @@ -21,6 +21,7 @@ */ import act.annotations.Order; +import act.util.Ordered; import org.osgl.inject.PostConstructProcessor; import java.lang.annotation.Annotation; @@ -28,7 +29,7 @@ public class Sorter implements PostConstructProcessor { - private static final Comparator comp = new Comparator() { + public static final Comparator COMPARATOR = new Comparator() { @Override public int compare(Object o1, Object o2) { if (o1 == null) { @@ -37,20 +38,36 @@ public int compare(Object o1, Object o2) { if (o2 == null) { return 1; } - Class c1 = o1.getClass(); - Class c2 = o2.getClass(); - Order order1 = c1.getAnnotation(Order.class); - Order order2 = c2.getAnnotation(Order.class); - int p1 = null == order1 ? Order.HIGHEST_PRECEDENCE : order1.value(); - int p2 = null == order2 ? Order.HIGHEST_PRECEDENCE : order2.value(); + if (o1 == o2 || o1.equals(o2)) { + return 0; + } + int p1 = orderOf(o1); + int p2 = orderOf(o2); int delta = Integer.compare(p1, p2); if (0 != delta) { return delta; } + Class c1 = o1.getClass(); + Class c2 = o2.getClass(); + if (c1 == c2) { + if (Comparable.class.isAssignableFrom(c1)) { + return ((Comparable) o1).compareTo(o2); + } + return o1.toString().compareTo(o2.toString()); + } return c1.toString().compareTo(c2.toString()); } }; + private static int orderOf(Object o) { + if (o instanceof Ordered) { + return ((Ordered) o).order(); + } + Class c = o.getClass(); + Order order = c.getAnnotation(Order.class); + return null == order ? Order.HIGHEST_PRECEDENCE : order.value(); + } + @Override public void process(Object bean, Annotation annotation) { @@ -60,7 +77,7 @@ public void process(Object bean, Annotation annotation) { } private void sort(List list) { - Collections.sort(list, comp); + Collections.sort(list, COMPARATOR); } } diff --git a/src/main/java/act/job/Job.java b/src/main/java/act/job/Job.java index 5e10a1382..e2e75795d 100644 --- a/src/main/java/act/job/Job.java +++ b/src/main/java/act/job/Job.java @@ -27,6 +27,7 @@ import act.app.App; import act.app.event.SysEventId; import act.event.SysEventListenerBase; +import act.inject.util.Sorter; import act.job.bytecode.ReflectedJobInvoker; import act.route.DuplicateRouteMappingException; import act.util.*; @@ -71,6 +72,7 @@ synchronized Job add(Job thatJob) { return parent; } jobList.add(thatJob); + Collections.sort(jobList, Sorter.COMPARATOR); return parent; } diff --git a/src/main/java/act/util/Ordered.java b/src/main/java/act/util/Ordered.java new file mode 100644 index 000000000..8875d0a47 --- /dev/null +++ b/src/main/java/act/util/Ordered.java @@ -0,0 +1,25 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +public interface Ordered { + int order(); +} From f65f09b91255c73e5abc8c1894163f2ad4638fc2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 1 Oct 2018 11:33:28 +1000 Subject: [PATCH 131/730] take job list sort out (#861); rename testapp-legacy to legay-testapp --- {testapp-legacy => legacy-testapp}/.gitignore | 0 {testapp-legacy => legacy-testapp}/pom.xml | 0 {testapp-legacy => legacy-testapp}/run.sh | 0 .../src/assembly/pkg.xml | 0 .../src/main/bin/start | 0 .../src/main/bin/start.bat | 0 .../src/main/java/testapp/FastJson37Issue.java | 0 .../src/main/java/testapp/TestApp.java | 0 .../src/main/java/testapp/endpoint/Arguments.java | 0 .../endpoint/BindingWithAnnotationTestBed.java | 4 ++-- .../src/main/java/testapp/endpoint/CORSTestBed.java | 4 ++-- .../src/main/java/testapp/endpoint/CSPTestBed.java | 4 ++-- .../src/main/java/testapp/endpoint/CSRFTestBed.java | 4 ++-- .../testapp/endpoint/ChineseGreetingService.java | 0 .../testapp/endpoint/ContextHierarchiTestBed.java | 4 ++-- .../main/java/testapp/endpoint/CustomBinder.java | 0 .../src/main/java/testapp/endpoint/DspTestBed.java | 4 ++-- .../src/main/java/testapp/endpoint/ETagTestBed.java | 3 ++- .../testapp/endpoint/EnglishGreetingService.java | 0 .../main/java/testapp/endpoint/GreetingService.java | 0 .../src/main/java/testapp/endpoint/HelloCli.java | 0 .../main/java/testapp/endpoint/HelloController.java | 0 .../src/main/java/testapp/endpoint/I18nTestBed.java | 0 .../main/java/testapp/endpoint/InheritedOption.java | 0 .../testapp/endpoint/InterceptorTestController.java | 8 +++----- .../main/java/testapp/endpoint/MiscsTestBed.java | 8 +++++--- .../main/java/testapp/endpoint/MorphiaTestBed.java | 0 .../endpoint/OutputRequestParamsTestBed.java | 0 .../main/java/testapp/endpoint/ParamAndField.java | 0 .../src/main/java/testapp/endpoint/PojoBinding.java | 12 ++++-------- .../endpoint/SimpleArrayParameterResolver.java | 8 +++----- .../java/testapp/endpoint/SimpleBeanTestBed.java | 3 ++- .../endpoint/SimpleEventListenerMarkerTestBed.java | 0 .../endpoint/SimpleMapParameterResolver.java | 4 ++-- .../testapp/endpoint/SimpleParameterResolver.java | 5 +++-- .../main/java/testapp/endpoint/SingleOption.java | 0 .../java/testapp/endpoint/StatelessTestBed.java | 0 .../main/java/testapp/endpoint/SysController.java | 0 .../java/testapp/endpoint/ValidationTestBed.java | 3 ++- .../testapp/endpoint/VirtualControllerTestBed.java | 12 ++++++------ .../endpoint/enhancement/Controler20160911.java | 0 .../main/java/testapp/endpoint/ghissues/GH136.java | 0 .../testapp/endpoint/ghissues/GH136Interceptor.java | 0 .../testapp/endpoint/ghissues/GH152Controller.java | 0 .../testapp/endpoint/ghissues/GH152Interceptor.java | 0 .../ghissues/GH152InterceptorGlobalOnMethod.java | 0 .../main/java/testapp/endpoint/ghissues/GH222.java | 0 .../main/java/testapp/endpoint/ghissues/GH229.java | 0 .../main/java/testapp/endpoint/ghissues/GH232.java | 0 .../main/java/testapp/endpoint/ghissues/GH287.java | 0 .../main/java/testapp/endpoint/ghissues/GH289.java | 0 .../main/java/testapp/endpoint/ghissues/GH295.java | 0 .../main/java/testapp/endpoint/ghissues/GH296.java | 0 .../main/java/testapp/endpoint/ghissues/GH297.java | 0 .../main/java/testapp/endpoint/ghissues/GH301.java | 0 .../main/java/testapp/endpoint/ghissues/GH317.java | 0 .../main/java/testapp/endpoint/ghissues/GH319.java | 0 .../main/java/testapp/endpoint/ghissues/GH325.java | 0 .../main/java/testapp/endpoint/ghissues/GH349.java | 0 .../main/java/testapp/endpoint/ghissues/GH350.java | 0 .../main/java/testapp/endpoint/ghissues/GH352.java | 0 .../main/java/testapp/endpoint/ghissues/GH354.java | 0 .../main/java/testapp/endpoint/ghissues/GH421.java | 0 .../main/java/testapp/endpoint/ghissues/GH449.java | 0 .../main/java/testapp/endpoint/ghissues/GH504.java | 0 .../main/java/testapp/endpoint/ghissues/GH506.java | 0 .../main/java/testapp/endpoint/ghissues/GH518.java | 0 .../main/java/testapp/endpoint/ghissues/GH536.java | 0 .../main/java/testapp/endpoint/ghissues/GH537.java | 0 .../main/java/testapp/endpoint/ghissues/GH538.java | 0 .../main/java/testapp/endpoint/ghissues/GH542.java | 0 .../main/java/testapp/endpoint/ghissues/GH555.java | 0 .../main/java/testapp/endpoint/ghissues/GH562.java | 0 .../main/java/testapp/endpoint/ghissues/GH631.java | 0 .../main/java/testapp/endpoint/ghissues/GH636.java | 0 .../main/java/testapp/endpoint/ghissues/GH657.java | 0 .../main/java/testapp/endpoint/ghissues/GH671.java | 0 .../main/java/testapp/endpoint/ghissues/GH678.java | 0 .../main/java/testapp/endpoint/ghissues/GH691.java | 0 .../main/java/testapp/endpoint/ghissues/Gh318.java | 0 .../main/java/testapp/endpoint/ghissues/Gh438.java | 0 .../testapp/endpoint/ghissues/GithubIssueBase.java | 0 .../testapp/endpoint/ghissues/gh304/Gh304Event.java | 0 .../endpoint/ghissues/gh304/Gh304EventListener.java | 0 .../java/testapp/endpoint/ghissues/gh310/GH310.java | 0 .../testapp/endpoint/ghissues/gh310/GH310Model.java | 0 .../java/testapp/endpoint/ghissues/gh353/GH353.java | 0 .../java/testapp/endpoint/ghissues/gh353/User.java | 0 .../endpoint/ghissues/gh417/FastJsonIssue.java | 0 .../java/testapp/endpoint/ghissues/gh417/GH417.java | 0 .../testapp/endpoint/ghissues/gh417/Record.java | 0 .../java/testapp/endpoint/ghissues/gh426/GH426.java | 0 .../testapp/endpoint/ghissues/gh434/ByeService.java | 0 .../endpoint/ghissues/gh434/FarewellService.java | 0 .../java/testapp/endpoint/ghissues/gh434/GH434.java | 0 .../endpoint/ghissues/gh434/GreetingService.java | 0 .../endpoint/ghissues/gh434/HelloService.java | 0 .../endpoint/ghissues/gh434/NiHaoService.java | 0 .../testapp/endpoint/ghissues/gh434/Service.java | 0 .../endpoint/ghissues/gh434/ZaiJianService.java | 0 .../testapp/endpoint/ghissues/gh446/DataTable.java | 0 .../java/testapp/endpoint/ghissues/gh446/GH446.java | 0 .../testapp/endpoint/ghissues/gh471/FooEvent.java | 0 .../java/testapp/endpoint/ghissues/gh471/GH471.java | 0 .../java/testapp/endpoint/ghissues/gh473/Foo.java | 0 .../java/testapp/endpoint/ghissues/gh473/GH473.java | 0 .../testapp/endpoint/ghissues/gh547/DataTable.java | 0 .../java/testapp/endpoint/ghissues/gh547/GH547.java | 0 .../endpoint/ghissues/gh554/EventListener.java | 0 .../java/testapp/endpoint/ghissues/gh554/GH554.java | 0 .../endpoint/ghissues/gh554/MsgTemplate.java | 0 .../endpoint/ghissues/gh692/Gh692Service.java | 0 .../endpoint/ghissues/gh692/HelloService.java | 0 .../src/main/java/testapp/model/Bar.java | 0 .../src/main/java/testapp/model/Contact.java | 0 .../src/main/java/testapp/model/Foo.java | 0 .../src/main/java/testapp/model/ModelBase.java | 0 .../src/main/java/testapp/model/RGB.java | 0 .../src/main/java/testapp/model/User.java | 0 .../src/main/java/testapp/model/VersionedModel.java | 0 .../main/java/testapp/model/mongo/GH301Model.java | 0 .../src/main/java/testapp/model/mongo/Group.java | 0 .../main/java/testapp/model/mongo/KVStoreModel.java | 0 .../src/main/java/testapp/model/mongo/Person.java | 0 .../main/java/testapp/sbean/DerivedSimpleBean.java | 0 .../sbean/NotSimpleBeanWithDefaultConstructor.java | 0 .../NotSimpleBeanWithoutDefaultConstructor.java | 0 .../sbean/SimpleBeanWithDefaultConstructor.java | 0 .../sbean/SimpleBeanWithoutDefaultConstructor.java | 0 .../src/main/java/testapp/sbean/SimpleModel.java | 0 .../src/main/resources/act.router.macro | 0 .../src/main/resources/app.properties | 0 .../src/main/resources/app.version | 0 .../src/main/resources/bigfile | Bin .../src/main/resources/gh434.properties | 0 .../src/main/resources/gh536.properties | 0 .../src/main/resources/gh631.properties | 0 .../src/main/resources/gh671.properties | 0 .../src/main/resources/logback.xml | 0 .../src/main/resources/messages.properties | 0 .../src/main/resources/messages_en.properties | 0 .../src/main/resources/messages_zh_CN.properties | 0 .../src/main/resources/routes.conf | 0 .../src/main/resources/rythm/gh/287/foo.html | 0 .../src/main/resources/rythm/gh/352/test.html | 0 .../src/main/resources/rythm/gh/354/foo.html | 0 .../testapp/endpoint/HelloController/hello5.html | 0 .../src/main/resources/smallfile | Bin .../src/main/resources/testapp/.version | 0 .../src/main/resources/testapp/TestApp.properties | 0 .../main/resources/testapp/TestApp_en.properties | 0 .../main/resources/testapp/TestApp_zh_CN.properties | 0 .../src/test/java/testapp/TestBase.java | 0 .../test/java/testapp/benchmark/CuidBenchmark.java | 0 .../src/test/java/testapp/endpoint/CORSTest.java | 0 .../src/test/java/testapp/endpoint/CSPTest.java | 0 .../src/test/java/testapp/endpoint/CSRFTest.java | 0 .../java/testapp/endpoint/ContextHierarchiTest.java | 0 .../java/testapp/endpoint/CustomBinderTest.java | 0 .../src/test/java/testapp/endpoint/DspTest.java | 0 .../src/test/java/testapp/endpoint/ETagTest.java | 0 .../java/testapp/endpoint/EndPointTestContext.java | 0 .../test/java/testapp/endpoint/EndpointTester.java | 0 .../src/test/java/testapp/endpoint/GHIssue136.java | 0 .../src/test/java/testapp/endpoint/GHIssue222.java | 0 .../src/test/java/testapp/endpoint/GHIssue229.java | 0 .../src/test/java/testapp/endpoint/GHIssue232.java | 0 .../src/test/java/testapp/endpoint/GHIssue287.java | 0 .../src/test/java/testapp/endpoint/GHIssue289.java | 0 .../src/test/java/testapp/endpoint/GHIssue295.java | 0 .../src/test/java/testapp/endpoint/GHIssue296.java | 0 .../src/test/java/testapp/endpoint/GHIssue297.java | 0 .../src/test/java/testapp/endpoint/GHIssue301.java | 0 .../src/test/java/testapp/endpoint/GHIssue304.java | 0 .../src/test/java/testapp/endpoint/GHIssue310.java | 0 .../src/test/java/testapp/endpoint/GHIssue317.java | 0 .../src/test/java/testapp/endpoint/GHIssue319.java | 0 .../src/test/java/testapp/endpoint/GHIssue325.java | 0 .../src/test/java/testapp/endpoint/GHIssue349.java | 0 .../src/test/java/testapp/endpoint/GHIssue350.java | 0 .../src/test/java/testapp/endpoint/GHIssue352.java | 0 .../src/test/java/testapp/endpoint/GHIssue353.java | 0 .../src/test/java/testapp/endpoint/GHIssue354.java | 0 .../src/test/java/testapp/endpoint/GHIssue421.java | 0 .../src/test/java/testapp/endpoint/GHIssue426.java | 0 .../src/test/java/testapp/endpoint/GHIssue434.java | 0 .../src/test/java/testapp/endpoint/GHIssue438.java | 0 .../src/test/java/testapp/endpoint/GHIssue449.java | 0 .../src/test/java/testapp/endpoint/GHIssue471.java | 0 .../src/test/java/testapp/endpoint/GHIssue473.java | 0 .../src/test/java/testapp/endpoint/GHIssue504.java | 0 .../src/test/java/testapp/endpoint/GHIssue506.java | 0 .../src/test/java/testapp/endpoint/GHIssue518.java | 0 .../src/test/java/testapp/endpoint/GHIssue536.java | 0 .../src/test/java/testapp/endpoint/GHIssue537.java | 0 .../src/test/java/testapp/endpoint/GHIssue538.java | 0 .../src/test/java/testapp/endpoint/GHIssue542.java | 0 .../src/test/java/testapp/endpoint/GHIssue547.java | 0 .../src/test/java/testapp/endpoint/GHIssue554.java | 0 .../src/test/java/testapp/endpoint/GHIssue555.java | 0 .../src/test/java/testapp/endpoint/GHIssue562.java | 0 .../src/test/java/testapp/endpoint/GHIssue631.java | 0 .../src/test/java/testapp/endpoint/GHIssue636.java | 0 .../src/test/java/testapp/endpoint/GHIssue657.java | 0 .../src/test/java/testapp/endpoint/GHIssue671.java | 0 .../src/test/java/testapp/endpoint/GHIssue678.java | 0 .../src/test/java/testapp/endpoint/GHIssue691.java | 0 .../src/test/java/testapp/endpoint/GHIssue692.java | 0 .../java/testapp/endpoint/HelloControllerTest.java | 0 .../src/test/java/testapp/endpoint/I18nTest.java | 0 .../test/java/testapp/endpoint/InterceptorTest.java | 0 .../src/test/java/testapp/endpoint/MorphiaTest.java | 0 .../test/java/testapp/endpoint/OutputParamTest.java | 0 .../test/java/testapp/endpoint/ParamEncoding.java | 0 .../src/test/java/testapp/endpoint/ReqTest.java | 0 .../test/java/testapp/endpoint/SimpleBeanTest.java | 0 .../endpoint/SimpleEventListenerMarkerTest.java | 0 .../test/java/testapp/endpoint/StatelessTest.java | 0 .../java/testapp/endpoint/VirtualHandlerTest.java | 0 .../binding/ActionParameterBindingTestBase.java | 0 .../endpoint/binding/BindingWithAnnotationTest.java | 0 .../testapp/endpoint/binding/ParamAndFieldTest.java | 0 .../BigDecimalArrayActionParameterBindingTest.java | 0 .../BigIntegerArrayActionParameterBindingTest.java | 0 .../BooleanArrayActionParameterBindingTest.java | 0 .../ByteArrayActionParameterBindingTest.java | 0 .../CharArrayActionParameterBindingTest.java | 0 .../DoubleArrayActionParameterBindingTest.java | 0 .../EnumArrayActionParameterBindingTest.java | 0 .../FloatArrayActionParameterBindingTest.java | 0 .../IntArrayActionParameterBindingTest.java | 0 .../LongArrayActionParameterBindingTest.java | 0 ...tiveTypeArrayActionParameterBindingTestBase.java | 0 .../ShortArrayActionParameterBindingTest.java | 0 ...mpleTypeArrayActionParameterBindingTestBase.java | 0 .../StringArrayActionParameterBindingTest.java | 0 .../endpoint/binding/collection/package-info.java | 0 .../binding/map/BooleanTypeMapValBindingTest.java | 0 .../binding/map/ByteTypeMapValBindingTest.java | 0 .../binding/map/CharacterTypeMapValBindingTest.java | 0 .../binding/map/DoubleTypeMapValBindingTest.java | 0 .../binding/map/EnumTypeMapValBindingTest.java | 0 .../binding/map/FloatTypeMapValBindingTest.java | 0 .../binding/map/IntTypeMapValBindingTest.java | 0 .../binding/map/LongTypeMapValBindingTest.java | 0 .../binding/map/ShortTypeMapValBindingTest.java | 0 .../map/SimpleTypeMapValBindingTestBase.java | 0 .../binding/map/StringTypeMapValBindingTest.java | 0 .../endpoint/binding/pojo/PojoBindingTest.java | 0 .../testapp/endpoint/binding/pojo/PojoEncoder.java | 0 .../single/BooleanActionParameterBindingTest.java | 0 .../single/ByteActionParameterBindingTest.java | 0 .../single/CharActionParameterBindingTest.java | 0 .../single/DoubleActionParameterBindingTest.java | 0 .../single/EnumActionParameterBindingTest.java | 0 .../single/FloatActionParameterBindingTest.java | 0 .../single/IntActionParameterBindingTest.java | 0 .../single/LongActionParameterBindingTest.java | 0 ...PrimitiveTypeActionParameterBindingTestBase.java | 0 .../single/ShortActionParameterBindingTest.java | 0 .../SimpleTypeActionParameterBindingTestBase.java | 0 .../single/StringActionParameterBindingTest.java | 0 .../endpoint/binding/single/package-info.java | 0 .../issue/enhancement/Controler20160911.java | 0 .../endpoint/issue/enhancement/GHIssue152.java | 0 .../src/test/resources/photo.jpg | Bin src/main/java/act/job/Job.java | 5 +++-- 267 files changed, 47 insertions(+), 48 deletions(-) rename {testapp-legacy => legacy-testapp}/.gitignore (100%) rename {testapp-legacy => legacy-testapp}/pom.xml (100%) rename {testapp-legacy => legacy-testapp}/run.sh (100%) rename {testapp-legacy => legacy-testapp}/src/assembly/pkg.xml (100%) rename {testapp-legacy => legacy-testapp}/src/main/bin/start (100%) rename {testapp-legacy => legacy-testapp}/src/main/bin/start.bat (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/FastJson37Issue.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/TestApp.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/Arguments.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java (91%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/CORSTestBed.java (90%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/CSPTestBed.java (91%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/CSRFTestBed.java (84%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ChineseGreetingService.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java (84%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/CustomBinder.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/DspTestBed.java (79%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ETagTestBed.java (82%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/EnglishGreetingService.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/GreetingService.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/HelloCli.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/HelloController.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/I18nTestBed.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/InheritedOption.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/InterceptorTestController.java (89%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/MiscsTestBed.java (93%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/MorphiaTestBed.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ParamAndField.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/PojoBinding.java (87%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java (97%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/SimpleBeanTestBed.java (98%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java (98%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/SimpleParameterResolver.java (97%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/SingleOption.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/StatelessTestBed.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/SysController.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ValidationTestBed.java (68%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/VirtualControllerTestBed.java (83%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/enhancement/Controler20160911.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH136.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH152Controller.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH222.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH229.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH232.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH287.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH289.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH295.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH296.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH297.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH301.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH317.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH319.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH325.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH349.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH350.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH352.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH354.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH421.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH449.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH504.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH506.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH518.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH536.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH537.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH538.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH542.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH555.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH562.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH631.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH636.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH657.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH671.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH678.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GH691.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/Gh318.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/Gh438.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh353/User.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh417/Record.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh434/Service.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/Bar.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/Contact.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/Foo.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/ModelBase.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/RGB.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/User.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/VersionedModel.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/mongo/GH301Model.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/mongo/Group.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/mongo/KVStoreModel.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/model/mongo/Person.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/sbean/DerivedSimpleBean.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/java/testapp/sbean/SimpleModel.java (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/act.router.macro (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/app.properties (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/app.version (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/bigfile (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/gh434.properties (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/gh536.properties (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/gh631.properties (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/gh671.properties (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/logback.xml (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/messages.properties (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/messages_en.properties (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/messages_zh_CN.properties (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/routes.conf (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/rythm/gh/287/foo.html (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/rythm/gh/352/test.html (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/rythm/gh/354/foo.html (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/smallfile (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/testapp/.version (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/testapp/TestApp.properties (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/testapp/TestApp_en.properties (100%) rename {testapp-legacy => legacy-testapp}/src/main/resources/testapp/TestApp_zh_CN.properties (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/TestBase.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/benchmark/CuidBenchmark.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/CORSTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/CSPTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/CSRFTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/ContextHierarchiTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/CustomBinderTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/DspTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/ETagTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/EndPointTestContext.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/EndpointTester.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue136.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue222.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue229.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue232.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue287.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue289.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue295.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue296.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue297.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue301.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue304.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue310.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue317.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue319.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue325.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue349.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue350.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue352.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue353.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue354.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue421.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue426.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue434.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue438.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue449.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue471.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue473.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue504.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue506.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue518.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue536.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue537.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue538.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue542.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue547.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue554.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue555.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue562.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue631.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue636.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue657.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue671.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue678.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue691.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/GHIssue692.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/HelloControllerTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/I18nTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/InterceptorTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/MorphiaTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/OutputParamTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/ParamEncoding.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/ReqTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/SimpleBeanTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/StatelessTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/VirtualHandlerTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/collection/package-info.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/binding/single/package-info.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java (100%) rename {testapp-legacy => legacy-testapp}/src/test/resources/photo.jpg (100%) diff --git a/testapp-legacy/.gitignore b/legacy-testapp/.gitignore similarity index 100% rename from testapp-legacy/.gitignore rename to legacy-testapp/.gitignore diff --git a/testapp-legacy/pom.xml b/legacy-testapp/pom.xml similarity index 100% rename from testapp-legacy/pom.xml rename to legacy-testapp/pom.xml diff --git a/testapp-legacy/run.sh b/legacy-testapp/run.sh similarity index 100% rename from testapp-legacy/run.sh rename to legacy-testapp/run.sh diff --git a/testapp-legacy/src/assembly/pkg.xml b/legacy-testapp/src/assembly/pkg.xml similarity index 100% rename from testapp-legacy/src/assembly/pkg.xml rename to legacy-testapp/src/assembly/pkg.xml diff --git a/testapp-legacy/src/main/bin/start b/legacy-testapp/src/main/bin/start similarity index 100% rename from testapp-legacy/src/main/bin/start rename to legacy-testapp/src/main/bin/start diff --git a/testapp-legacy/src/main/bin/start.bat b/legacy-testapp/src/main/bin/start.bat similarity index 100% rename from testapp-legacy/src/main/bin/start.bat rename to legacy-testapp/src/main/bin/start.bat diff --git a/testapp-legacy/src/main/java/testapp/FastJson37Issue.java b/legacy-testapp/src/main/java/testapp/FastJson37Issue.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/FastJson37Issue.java rename to legacy-testapp/src/main/java/testapp/FastJson37Issue.java diff --git a/testapp-legacy/src/main/java/testapp/TestApp.java b/legacy-testapp/src/main/java/testapp/TestApp.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/TestApp.java rename to legacy-testapp/src/main/java/testapp/TestApp.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/Arguments.java b/legacy-testapp/src/main/java/testapp/endpoint/Arguments.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/Arguments.java rename to legacy-testapp/src/main/java/testapp/endpoint/Arguments.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java similarity index 91% rename from testapp-legacy/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java index 6a1026cdd..fb68f5ea9 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java @@ -1,6 +1,6 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.data.annotation.DateFormatPattern; import com.alibaba.fastjson.JSON; import org.joda.time.DateTime; @@ -9,7 +9,7 @@ import java.util.Arrays; import java.util.Map; -@Controller("/bwa") +@UrlContext("/bwa") @SuppressWarnings("unused") public class BindingWithAnnotationTestBed { diff --git a/testapp-legacy/src/main/java/testapp/endpoint/CORSTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/CORSTestBed.java similarity index 90% rename from testapp-legacy/src/main/java/testapp/endpoint/CORSTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/CORSTestBed.java index ace930929..a7c6aa7de 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/CORSTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/CORSTestBed.java @@ -1,13 +1,13 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.security.CORS; import org.osgl.mvc.annotation.GetAction; import org.osgl.mvc.annotation.PutAction; @CORS.AllowHeaders(CORSTestBed.ALLOW_HEADERS) @CORS.AllowOrigin(CORSTestBed.ALLOW_ORIGIN) -@Controller("/cors") +@UrlContext("/cors") @SuppressWarnings("unused") public class CORSTestBed { diff --git a/testapp-legacy/src/main/java/testapp/endpoint/CSPTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/CSPTestBed.java similarity index 91% rename from testapp-legacy/src/main/java/testapp/endpoint/CSPTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/CSPTestBed.java index c72a8bad6..b2ea830a0 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/CSPTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/CSPTestBed.java @@ -1,10 +1,10 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.security.CSP; import org.osgl.mvc.annotation.GetAction; -@Controller("/csp") +@UrlContext("/csp") @CSP("default-src 'self'; img-src https://*; child-src 'none';") public class CSPTestBed { diff --git a/testapp-legacy/src/main/java/testapp/endpoint/CSRFTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/CSRFTestBed.java similarity index 84% rename from testapp-legacy/src/main/java/testapp/endpoint/CSRFTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/CSRFTestBed.java index a9c36fb74..43b483094 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/CSRFTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/CSRFTestBed.java @@ -1,12 +1,12 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.security.CSRF; import org.osgl.mvc.annotation.GetAction; import org.osgl.mvc.annotation.PostAction; @CSRF.Enable -@Controller("/csrf") +@UrlContext("/csrf") public class CSRFTestBed { @GetAction diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ChineseGreetingService.java b/legacy-testapp/src/main/java/testapp/endpoint/ChineseGreetingService.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ChineseGreetingService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ChineseGreetingService.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java similarity index 84% rename from testapp-legacy/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java index cbbe4316a..22b3548f3 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java @@ -1,9 +1,9 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.mvc.annotation.GetAction; -@Controller("/cht") +@UrlContext("/cht") public class ContextHierarchiTestBed { public static class IntermediateController extends ContextHierarchiTestBed { diff --git a/testapp-legacy/src/main/java/testapp/endpoint/CustomBinder.java b/legacy-testapp/src/main/java/testapp/endpoint/CustomBinder.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/CustomBinder.java rename to legacy-testapp/src/main/java/testapp/endpoint/CustomBinder.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/DspTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/DspTestBed.java similarity index 79% rename from testapp-legacy/src/main/java/testapp/endpoint/DspTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/DspTestBed.java index d1fa608fd..2cde6916a 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/DspTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/DspTestBed.java @@ -1,11 +1,11 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.handler.PreventDoubleSubmission; import org.osgl.mvc.annotation.PostAction; // Test double submission protection -@Controller("/dsp") +@UrlContext("/dsp") public class DspTestBed { @PreventDoubleSubmission diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ETagTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/ETagTestBed.java similarity index 82% rename from testapp-legacy/src/main/java/testapp/endpoint/ETagTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/ETagTestBed.java index 23a50dacb..f884ed90b 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/ETagTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/ETagTestBed.java @@ -1,10 +1,11 @@ package testapp.endpoint; import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.mvc.annotation.GetAction; import testapp.model.VersionedModel; -@Controller("/etag") +@UrlContext("/etag") public class ETagTestBed extends Controller.Util { @GetAction("{id}") diff --git a/testapp-legacy/src/main/java/testapp/endpoint/EnglishGreetingService.java b/legacy-testapp/src/main/java/testapp/endpoint/EnglishGreetingService.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/EnglishGreetingService.java rename to legacy-testapp/src/main/java/testapp/endpoint/EnglishGreetingService.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/GreetingService.java b/legacy-testapp/src/main/java/testapp/endpoint/GreetingService.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/GreetingService.java rename to legacy-testapp/src/main/java/testapp/endpoint/GreetingService.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/HelloCli.java b/legacy-testapp/src/main/java/testapp/endpoint/HelloCli.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/HelloCli.java rename to legacy-testapp/src/main/java/testapp/endpoint/HelloCli.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/HelloController.java b/legacy-testapp/src/main/java/testapp/endpoint/HelloController.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/HelloController.java rename to legacy-testapp/src/main/java/testapp/endpoint/HelloController.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/I18nTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/I18nTestBed.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/I18nTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/I18nTestBed.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/InheritedOption.java b/legacy-testapp/src/main/java/testapp/endpoint/InheritedOption.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/InheritedOption.java rename to legacy-testapp/src/main/java/testapp/endpoint/InheritedOption.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/InterceptorTestController.java b/legacy-testapp/src/main/java/testapp/endpoint/InterceptorTestController.java similarity index 89% rename from testapp-legacy/src/main/java/testapp/endpoint/InterceptorTestController.java rename to legacy-testapp/src/main/java/testapp/endpoint/InterceptorTestController.java index 4decd7ae4..8221cd45a 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/InterceptorTestController.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/InterceptorTestController.java @@ -2,15 +2,13 @@ import act.app.ActionContext; import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.exception.UnexpectedException; -import org.osgl.mvc.annotation.After; -import org.osgl.mvc.annotation.Before; -import org.osgl.mvc.annotation.Catch; -import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.*; import org.osgl.mvc.result.BadRequest; import org.osgl.mvc.result.Result; -@Controller("/aop") +@UrlContext("/aop") @SuppressWarnings("unused") public class InterceptorTestController extends Controller.Util { diff --git a/testapp-legacy/src/main/java/testapp/endpoint/MiscsTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/MiscsTestBed.java similarity index 93% rename from testapp-legacy/src/main/java/testapp/endpoint/MiscsTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/MiscsTestBed.java index 7bba7712b..e79906160 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/MiscsTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/MiscsTestBed.java @@ -2,17 +2,19 @@ import act.cli.Command; import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.data.annotation.ReadContent; import org.osgl.mvc.annotation.PostAction; import org.osgl.storage.impl.SObject; import org.osgl.util.C; import org.osgl.util.IO; -import javax.inject.Named; import java.io.File; -import java.util.*; +import java.util.Collection; +import java.util.List; +import javax.inject.Named; -@Controller("/misc") +@UrlContext("/misc") @SuppressWarnings("unused") public class MiscsTestBed extends Controller.Util { diff --git a/testapp-legacy/src/main/java/testapp/endpoint/MorphiaTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/MorphiaTestBed.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/MorphiaTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/MorphiaTestBed.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ParamAndField.java b/legacy-testapp/src/main/java/testapp/endpoint/ParamAndField.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ParamAndField.java rename to legacy-testapp/src/main/java/testapp/endpoint/ParamAndField.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/PojoBinding.java b/legacy-testapp/src/main/java/testapp/endpoint/PojoBinding.java similarity index 87% rename from testapp-legacy/src/main/java/testapp/endpoint/PojoBinding.java rename to legacy-testapp/src/main/java/testapp/endpoint/PojoBinding.java index 464a835c5..81f7b710d 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/PojoBinding.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/PojoBinding.java @@ -1,15 +1,11 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.http.H; import org.osgl.inject.annotation.SessionScoped; -import org.osgl.mvc.annotation.Action; -import org.osgl.mvc.annotation.Before; -import org.osgl.mvc.annotation.SessionFree; +import org.osgl.mvc.annotation.*; import org.osgl.util.C; -import testapp.model.Bar; -import testapp.model.Contact; -import testapp.model.Foo; +import testapp.model.*; import java.util.List; import java.util.Map; @@ -17,7 +13,7 @@ /** * Test binding to a POJO object */ -@Controller("/pojo") +@UrlContext("/pojo") @SuppressWarnings("unused") public class PojoBinding { diff --git a/testapp-legacy/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java b/legacy-testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java similarity index 97% rename from testapp-legacy/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java rename to legacy-testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java index c5df85931..451e9eda3 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java @@ -1,21 +1,19 @@ package testapp.endpoint; import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.util.JsonView; import org.osgl.mvc.annotation.Action; import testapp.model.RGB; import java.math.BigDecimal; import java.math.BigInteger; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; /** * Used to test simple array|list|set type parameter resolving */ -@Controller("/sapr") +@UrlContext("/sapr") @SuppressWarnings("unused") public class SimpleArrayParameterResolver extends Controller.Util { @Action("bool_pa") diff --git a/testapp-legacy/src/main/java/testapp/endpoint/SimpleBeanTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java similarity index 98% rename from testapp-legacy/src/main/java/testapp/endpoint/SimpleBeanTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java index 2de83ad1c..d3fe01096 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/SimpleBeanTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java @@ -2,6 +2,7 @@ import act.app.App; import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.$; import org.osgl.exception.UnexpectedException; import org.osgl.exception.UnexpectedNoSuchMethodException; @@ -9,7 +10,7 @@ import org.osgl.mvc.annotation.GetAction; import testapp.sbean.*; -@Controller("/sbean") +@UrlContext("/sbean") public class SimpleBeanTestBed extends Controller.Util { @GetAction("def_const/sbean_no_def_const") diff --git a/testapp-legacy/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java b/legacy-testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java similarity index 98% rename from testapp-legacy/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java rename to legacy-testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java index 10c2272d0..4279eb505 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java @@ -1,6 +1,6 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.mvc.annotation.Action; import testapp.model.RGB; @@ -10,7 +10,7 @@ /** * Used to verify the parameter binding for Map data */ -@Controller("/smpr") +@UrlContext("/smpr") @SuppressWarnings("unused") public class SimpleMapParameterResolver { diff --git a/testapp-legacy/src/main/java/testapp/endpoint/SimpleParameterResolver.java b/legacy-testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java similarity index 97% rename from testapp-legacy/src/main/java/testapp/endpoint/SimpleParameterResolver.java rename to legacy-testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java index f5ec3b442..1ccc28e7a 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/SimpleParameterResolver.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java @@ -1,17 +1,18 @@ package testapp.endpoint; import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.mvc.annotation.Action; import testapp.model.RGB; -import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.math.BigInteger; +import javax.validation.constraints.NotNull; /** * Used to test simple type parameter resolving */ -@Controller("/spr") +@UrlContext("/spr") public class SimpleParameterResolver extends Controller.Util { @Action("bool_p") diff --git a/testapp-legacy/src/main/java/testapp/endpoint/SingleOption.java b/legacy-testapp/src/main/java/testapp/endpoint/SingleOption.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/SingleOption.java rename to legacy-testapp/src/main/java/testapp/endpoint/SingleOption.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/StatelessTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/StatelessTestBed.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/StatelessTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/StatelessTestBed.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/SysController.java b/legacy-testapp/src/main/java/testapp/endpoint/SysController.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/SysController.java rename to legacy-testapp/src/main/java/testapp/endpoint/SysController.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ValidationTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/ValidationTestBed.java similarity index 68% rename from testapp-legacy/src/main/java/testapp/endpoint/ValidationTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/ValidationTestBed.java index 8b1a1bb83..86ea42eaf 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/ValidationTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/ValidationTestBed.java @@ -1,8 +1,9 @@ package testapp.endpoint; import act.controller.Controller; +import act.controller.annotation.UrlContext; -@Controller("validation") +@UrlContext("validation") public class ValidationTestBed extends Controller.Util { public void foo() { diff --git a/testapp-legacy/src/main/java/testapp/endpoint/VirtualControllerTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java similarity index 83% rename from testapp-legacy/src/main/java/testapp/endpoint/VirtualControllerTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java index c40198933..eb792b137 100644 --- a/testapp-legacy/src/main/java/testapp/endpoint/VirtualControllerTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java @@ -1,12 +1,12 @@ package testapp.endpoint; -import act.controller.Controller; +import static act.controller.Controller.Util.renderText; + +import act.controller.annotation.UrlContext; import act.util.Virtual; import org.osgl.mvc.annotation.GetAction; -import static act.controller.Controller.Util.renderText; - -@Controller("/vc") +@UrlContext("/vc") public class VirtualControllerTestBed { @GetAction("1") @@ -20,10 +20,10 @@ public void handler2() { renderText("2" + getClass().getSimpleName()); } - @Controller("foo") + @UrlContext("foo") public static class Foo extends VirtualControllerTestBed {} - @Controller("bar") + @UrlContext("bar") public static class Bar extends VirtualControllerTestBed {} } diff --git a/testapp-legacy/src/main/java/testapp/endpoint/enhancement/Controler20160911.java b/legacy-testapp/src/main/java/testapp/endpoint/enhancement/Controler20160911.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/enhancement/Controler20160911.java rename to legacy-testapp/src/main/java/testapp/endpoint/enhancement/Controler20160911.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH136.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH136.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH136.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH136.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152Controller.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152Controller.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152Controller.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152Controller.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH222.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH222.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH222.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH222.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH229.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH229.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH229.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH229.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH232.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH232.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH232.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH232.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH287.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH287.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH287.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH287.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH289.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH289.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH289.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH289.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH295.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH295.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH295.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH295.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH296.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH296.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH296.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH296.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH297.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH297.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH297.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH297.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH301.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH301.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH301.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH301.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH317.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH317.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH317.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH317.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH319.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH319.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH319.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH319.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH325.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH325.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH325.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH325.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH349.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH349.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH349.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH349.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH350.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH350.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH350.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH350.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH352.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH352.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH352.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH352.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH354.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH354.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH354.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH354.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH421.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH421.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH421.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH421.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH449.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH449.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH449.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH449.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH504.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH504.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH504.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH504.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH506.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH506.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH506.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH506.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH518.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH518.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH518.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH518.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH536.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH536.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH536.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH536.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH537.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH537.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH537.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH537.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH538.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH538.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH538.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH538.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH542.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH542.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH542.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH542.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH555.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH555.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH555.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH555.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH562.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH562.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH562.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH562.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH631.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH631.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH631.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH631.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH636.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH636.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH636.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH636.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH657.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH657.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH657.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH657.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH671.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH671.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH671.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH671.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH678.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH678.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH678.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH678.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH691.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH691.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GH691.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH691.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/Gh318.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/Gh318.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/Gh318.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/Gh318.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/Gh438.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/Gh438.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/Gh438.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/Gh438.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh353/User.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh353/User.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh353/User.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh353/User.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/Record.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/Record.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh417/Record.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/Record.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/Service.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/Service.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/Service.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/Service.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java diff --git a/testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java diff --git a/testapp-legacy/src/main/java/testapp/model/Bar.java b/legacy-testapp/src/main/java/testapp/model/Bar.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/Bar.java rename to legacy-testapp/src/main/java/testapp/model/Bar.java diff --git a/testapp-legacy/src/main/java/testapp/model/Contact.java b/legacy-testapp/src/main/java/testapp/model/Contact.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/Contact.java rename to legacy-testapp/src/main/java/testapp/model/Contact.java diff --git a/testapp-legacy/src/main/java/testapp/model/Foo.java b/legacy-testapp/src/main/java/testapp/model/Foo.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/Foo.java rename to legacy-testapp/src/main/java/testapp/model/Foo.java diff --git a/testapp-legacy/src/main/java/testapp/model/ModelBase.java b/legacy-testapp/src/main/java/testapp/model/ModelBase.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/ModelBase.java rename to legacy-testapp/src/main/java/testapp/model/ModelBase.java diff --git a/testapp-legacy/src/main/java/testapp/model/RGB.java b/legacy-testapp/src/main/java/testapp/model/RGB.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/RGB.java rename to legacy-testapp/src/main/java/testapp/model/RGB.java diff --git a/testapp-legacy/src/main/java/testapp/model/User.java b/legacy-testapp/src/main/java/testapp/model/User.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/User.java rename to legacy-testapp/src/main/java/testapp/model/User.java diff --git a/testapp-legacy/src/main/java/testapp/model/VersionedModel.java b/legacy-testapp/src/main/java/testapp/model/VersionedModel.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/VersionedModel.java rename to legacy-testapp/src/main/java/testapp/model/VersionedModel.java diff --git a/testapp-legacy/src/main/java/testapp/model/mongo/GH301Model.java b/legacy-testapp/src/main/java/testapp/model/mongo/GH301Model.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/mongo/GH301Model.java rename to legacy-testapp/src/main/java/testapp/model/mongo/GH301Model.java diff --git a/testapp-legacy/src/main/java/testapp/model/mongo/Group.java b/legacy-testapp/src/main/java/testapp/model/mongo/Group.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/mongo/Group.java rename to legacy-testapp/src/main/java/testapp/model/mongo/Group.java diff --git a/testapp-legacy/src/main/java/testapp/model/mongo/KVStoreModel.java b/legacy-testapp/src/main/java/testapp/model/mongo/KVStoreModel.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/mongo/KVStoreModel.java rename to legacy-testapp/src/main/java/testapp/model/mongo/KVStoreModel.java diff --git a/testapp-legacy/src/main/java/testapp/model/mongo/Person.java b/legacy-testapp/src/main/java/testapp/model/mongo/Person.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/model/mongo/Person.java rename to legacy-testapp/src/main/java/testapp/model/mongo/Person.java diff --git a/testapp-legacy/src/main/java/testapp/sbean/DerivedSimpleBean.java b/legacy-testapp/src/main/java/testapp/sbean/DerivedSimpleBean.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/sbean/DerivedSimpleBean.java rename to legacy-testapp/src/main/java/testapp/sbean/DerivedSimpleBean.java diff --git a/testapp-legacy/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java b/legacy-testapp/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java rename to legacy-testapp/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java diff --git a/testapp-legacy/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java b/legacy-testapp/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java rename to legacy-testapp/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java diff --git a/testapp-legacy/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java b/legacy-testapp/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java rename to legacy-testapp/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java diff --git a/testapp-legacy/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java b/legacy-testapp/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java rename to legacy-testapp/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java diff --git a/testapp-legacy/src/main/java/testapp/sbean/SimpleModel.java b/legacy-testapp/src/main/java/testapp/sbean/SimpleModel.java similarity index 100% rename from testapp-legacy/src/main/java/testapp/sbean/SimpleModel.java rename to legacy-testapp/src/main/java/testapp/sbean/SimpleModel.java diff --git a/testapp-legacy/src/main/resources/act.router.macro b/legacy-testapp/src/main/resources/act.router.macro similarity index 100% rename from testapp-legacy/src/main/resources/act.router.macro rename to legacy-testapp/src/main/resources/act.router.macro diff --git a/testapp-legacy/src/main/resources/app.properties b/legacy-testapp/src/main/resources/app.properties similarity index 100% rename from testapp-legacy/src/main/resources/app.properties rename to legacy-testapp/src/main/resources/app.properties diff --git a/testapp-legacy/src/main/resources/app.version b/legacy-testapp/src/main/resources/app.version similarity index 100% rename from testapp-legacy/src/main/resources/app.version rename to legacy-testapp/src/main/resources/app.version diff --git a/testapp-legacy/src/main/resources/bigfile b/legacy-testapp/src/main/resources/bigfile similarity index 100% rename from testapp-legacy/src/main/resources/bigfile rename to legacy-testapp/src/main/resources/bigfile diff --git a/testapp-legacy/src/main/resources/gh434.properties b/legacy-testapp/src/main/resources/gh434.properties similarity index 100% rename from testapp-legacy/src/main/resources/gh434.properties rename to legacy-testapp/src/main/resources/gh434.properties diff --git a/testapp-legacy/src/main/resources/gh536.properties b/legacy-testapp/src/main/resources/gh536.properties similarity index 100% rename from testapp-legacy/src/main/resources/gh536.properties rename to legacy-testapp/src/main/resources/gh536.properties diff --git a/testapp-legacy/src/main/resources/gh631.properties b/legacy-testapp/src/main/resources/gh631.properties similarity index 100% rename from testapp-legacy/src/main/resources/gh631.properties rename to legacy-testapp/src/main/resources/gh631.properties diff --git a/testapp-legacy/src/main/resources/gh671.properties b/legacy-testapp/src/main/resources/gh671.properties similarity index 100% rename from testapp-legacy/src/main/resources/gh671.properties rename to legacy-testapp/src/main/resources/gh671.properties diff --git a/testapp-legacy/src/main/resources/logback.xml b/legacy-testapp/src/main/resources/logback.xml similarity index 100% rename from testapp-legacy/src/main/resources/logback.xml rename to legacy-testapp/src/main/resources/logback.xml diff --git a/testapp-legacy/src/main/resources/messages.properties b/legacy-testapp/src/main/resources/messages.properties similarity index 100% rename from testapp-legacy/src/main/resources/messages.properties rename to legacy-testapp/src/main/resources/messages.properties diff --git a/testapp-legacy/src/main/resources/messages_en.properties b/legacy-testapp/src/main/resources/messages_en.properties similarity index 100% rename from testapp-legacy/src/main/resources/messages_en.properties rename to legacy-testapp/src/main/resources/messages_en.properties diff --git a/testapp-legacy/src/main/resources/messages_zh_CN.properties b/legacy-testapp/src/main/resources/messages_zh_CN.properties similarity index 100% rename from testapp-legacy/src/main/resources/messages_zh_CN.properties rename to legacy-testapp/src/main/resources/messages_zh_CN.properties diff --git a/testapp-legacy/src/main/resources/routes.conf b/legacy-testapp/src/main/resources/routes.conf similarity index 100% rename from testapp-legacy/src/main/resources/routes.conf rename to legacy-testapp/src/main/resources/routes.conf diff --git a/testapp-legacy/src/main/resources/rythm/gh/287/foo.html b/legacy-testapp/src/main/resources/rythm/gh/287/foo.html similarity index 100% rename from testapp-legacy/src/main/resources/rythm/gh/287/foo.html rename to legacy-testapp/src/main/resources/rythm/gh/287/foo.html diff --git a/testapp-legacy/src/main/resources/rythm/gh/352/test.html b/legacy-testapp/src/main/resources/rythm/gh/352/test.html similarity index 100% rename from testapp-legacy/src/main/resources/rythm/gh/352/test.html rename to legacy-testapp/src/main/resources/rythm/gh/352/test.html diff --git a/testapp-legacy/src/main/resources/rythm/gh/354/foo.html b/legacy-testapp/src/main/resources/rythm/gh/354/foo.html similarity index 100% rename from testapp-legacy/src/main/resources/rythm/gh/354/foo.html rename to legacy-testapp/src/main/resources/rythm/gh/354/foo.html diff --git a/testapp-legacy/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html b/legacy-testapp/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html similarity index 100% rename from testapp-legacy/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html rename to legacy-testapp/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html diff --git a/testapp-legacy/src/main/resources/smallfile b/legacy-testapp/src/main/resources/smallfile similarity index 100% rename from testapp-legacy/src/main/resources/smallfile rename to legacy-testapp/src/main/resources/smallfile diff --git a/testapp-legacy/src/main/resources/testapp/.version b/legacy-testapp/src/main/resources/testapp/.version similarity index 100% rename from testapp-legacy/src/main/resources/testapp/.version rename to legacy-testapp/src/main/resources/testapp/.version diff --git a/testapp-legacy/src/main/resources/testapp/TestApp.properties b/legacy-testapp/src/main/resources/testapp/TestApp.properties similarity index 100% rename from testapp-legacy/src/main/resources/testapp/TestApp.properties rename to legacy-testapp/src/main/resources/testapp/TestApp.properties diff --git a/testapp-legacy/src/main/resources/testapp/TestApp_en.properties b/legacy-testapp/src/main/resources/testapp/TestApp_en.properties similarity index 100% rename from testapp-legacy/src/main/resources/testapp/TestApp_en.properties rename to legacy-testapp/src/main/resources/testapp/TestApp_en.properties diff --git a/testapp-legacy/src/main/resources/testapp/TestApp_zh_CN.properties b/legacy-testapp/src/main/resources/testapp/TestApp_zh_CN.properties similarity index 100% rename from testapp-legacy/src/main/resources/testapp/TestApp_zh_CN.properties rename to legacy-testapp/src/main/resources/testapp/TestApp_zh_CN.properties diff --git a/testapp-legacy/src/test/java/testapp/TestBase.java b/legacy-testapp/src/test/java/testapp/TestBase.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/TestBase.java rename to legacy-testapp/src/test/java/testapp/TestBase.java diff --git a/testapp-legacy/src/test/java/testapp/benchmark/CuidBenchmark.java b/legacy-testapp/src/test/java/testapp/benchmark/CuidBenchmark.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/benchmark/CuidBenchmark.java rename to legacy-testapp/src/test/java/testapp/benchmark/CuidBenchmark.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/CORSTest.java b/legacy-testapp/src/test/java/testapp/endpoint/CORSTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/CORSTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/CORSTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/CSPTest.java b/legacy-testapp/src/test/java/testapp/endpoint/CSPTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/CSPTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/CSPTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/CSRFTest.java b/legacy-testapp/src/test/java/testapp/endpoint/CSRFTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/CSRFTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/CSRFTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/ContextHierarchiTest.java b/legacy-testapp/src/test/java/testapp/endpoint/ContextHierarchiTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/ContextHierarchiTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/ContextHierarchiTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/CustomBinderTest.java b/legacy-testapp/src/test/java/testapp/endpoint/CustomBinderTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/CustomBinderTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/CustomBinderTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/DspTest.java b/legacy-testapp/src/test/java/testapp/endpoint/DspTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/DspTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/DspTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/ETagTest.java b/legacy-testapp/src/test/java/testapp/endpoint/ETagTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/ETagTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/ETagTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/EndPointTestContext.java b/legacy-testapp/src/test/java/testapp/endpoint/EndPointTestContext.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/EndPointTestContext.java rename to legacy-testapp/src/test/java/testapp/endpoint/EndPointTestContext.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/EndpointTester.java b/legacy-testapp/src/test/java/testapp/endpoint/EndpointTester.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/EndpointTester.java rename to legacy-testapp/src/test/java/testapp/endpoint/EndpointTester.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue136.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue136.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue136.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue136.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue222.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue222.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue222.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue222.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue229.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue229.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue229.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue229.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue232.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue232.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue232.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue232.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue287.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue287.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue287.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue287.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue289.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue289.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue289.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue289.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue295.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue295.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue295.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue295.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue296.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue296.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue296.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue296.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue297.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue297.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue297.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue297.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue301.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue301.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue301.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue301.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue304.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue304.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue304.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue304.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue310.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue310.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue310.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue310.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue317.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue317.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue317.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue317.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue319.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue319.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue319.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue319.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue325.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue325.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue325.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue325.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue349.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue349.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue349.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue349.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue350.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue350.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue350.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue350.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue352.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue352.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue352.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue352.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue353.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue353.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue353.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue353.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue354.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue354.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue354.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue354.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue421.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue421.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue421.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue421.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue426.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue426.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue426.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue426.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue434.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue434.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue434.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue434.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue438.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue438.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue438.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue438.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue449.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue449.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue449.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue449.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue471.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue471.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue471.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue471.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue473.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue473.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue473.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue473.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue504.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue504.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue504.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue504.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue506.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue506.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue506.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue506.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue518.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue518.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue518.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue518.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue536.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue536.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue536.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue536.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue537.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue537.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue537.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue537.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue538.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue538.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue538.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue538.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue542.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue542.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue542.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue542.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue547.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue547.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue547.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue547.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue554.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue554.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue554.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue554.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue555.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue555.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue555.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue555.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue562.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue562.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue562.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue562.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue631.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue631.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue631.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue631.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue636.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue636.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue636.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue636.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue657.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue657.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue657.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue657.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue671.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue671.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue671.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue671.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue678.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue678.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue678.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue678.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue691.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue691.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue691.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue691.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/GHIssue692.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue692.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/GHIssue692.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue692.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/HelloControllerTest.java b/legacy-testapp/src/test/java/testapp/endpoint/HelloControllerTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/HelloControllerTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/HelloControllerTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/I18nTest.java b/legacy-testapp/src/test/java/testapp/endpoint/I18nTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/I18nTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/I18nTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/InterceptorTest.java b/legacy-testapp/src/test/java/testapp/endpoint/InterceptorTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/InterceptorTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/InterceptorTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/MorphiaTest.java b/legacy-testapp/src/test/java/testapp/endpoint/MorphiaTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/MorphiaTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/MorphiaTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/OutputParamTest.java b/legacy-testapp/src/test/java/testapp/endpoint/OutputParamTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/OutputParamTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/OutputParamTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/ParamEncoding.java b/legacy-testapp/src/test/java/testapp/endpoint/ParamEncoding.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/ParamEncoding.java rename to legacy-testapp/src/test/java/testapp/endpoint/ParamEncoding.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/ReqTest.java b/legacy-testapp/src/test/java/testapp/endpoint/ReqTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/ReqTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/ReqTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/SimpleBeanTest.java b/legacy-testapp/src/test/java/testapp/endpoint/SimpleBeanTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/SimpleBeanTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/SimpleBeanTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java b/legacy-testapp/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/StatelessTest.java b/legacy-testapp/src/test/java/testapp/endpoint/StatelessTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/StatelessTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/StatelessTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/VirtualHandlerTest.java b/legacy-testapp/src/test/java/testapp/endpoint/VirtualHandlerTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/VirtualHandlerTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/VirtualHandlerTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/collection/package-info.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/package-info.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/collection/package-info.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/package-info.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/binding/single/package-info.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/package-info.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/binding/single/package-info.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/package-info.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java b/legacy-testapp/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java rename to legacy-testapp/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java diff --git a/testapp-legacy/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java b/legacy-testapp/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java similarity index 100% rename from testapp-legacy/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java rename to legacy-testapp/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java diff --git a/testapp-legacy/src/test/resources/photo.jpg b/legacy-testapp/src/test/resources/photo.jpg similarity index 100% rename from testapp-legacy/src/test/resources/photo.jpg rename to legacy-testapp/src/test/resources/photo.jpg diff --git a/src/main/java/act/job/Job.java b/src/main/java/act/job/Job.java index e2e75795d..88e71f495 100644 --- a/src/main/java/act/job/Job.java +++ b/src/main/java/act/job/Job.java @@ -27,7 +27,6 @@ import act.app.App; import act.app.event.SysEventId; import act.event.SysEventListenerBase; -import act.inject.util.Sorter; import act.job.bytecode.ReflectedJobInvoker; import act.route.DuplicateRouteMappingException; import act.util.*; @@ -72,7 +71,9 @@ synchronized Job add(Job thatJob) { return parent; } jobList.add(thatJob); - Collections.sort(jobList, Sorter.COMPARATOR); + // Note we can't do this otherwise route registration + // process will be broken + // - Collections.sort(jobList, Sorter.COMPARATOR); return parent; } From b9c3129eea54fde09ad068d077e0b1b346fc7dd8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 1 Oct 2018 19:56:34 +1000 Subject: [PATCH 132/730] Support using `SessionVariable` annotation and `DbBind` together #862 --- CHANGELOG.md | 1 + src/main/java/act/db/di/FindBy.java | 32 +++++++++++- .../inject/param/ParamValueLoaderService.java | 4 +- .../src/main/java/ghissues/Gh862.java | 51 +++++++++++++++++++ .../src/main/resources/test/scenarios/862.yml | 32 ++++++++++++ 5 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh862.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/862.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 06fa4674c..8a2023304 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Support using `SessionVariable` annotation and `DbBind` together #862 * Make `EventBus` and `Job` list favor `Order` annotation #861 * test resource not refreshed after hot-reload #860 * Rythm Template error report - source tab issue #859 diff --git a/src/main/java/act/db/di/FindBy.java b/src/main/java/act/db/di/FindBy.java index f4129a64e..371ae4b6f 100644 --- a/src/main/java/act/db/di/FindBy.java +++ b/src/main/java/act/db/di/FindBy.java @@ -23,12 +23,15 @@ import act.Act; import act.app.ActionContext; import act.app.App; +import act.cli.CliContext; import act.db.Dao; +import act.inject.SessionVariable; import act.inject.param.JsonDto; import act.inject.param.ParamValueLoaderService; import act.util.ActContext; import act.view.ActBadRequest; import act.view.ActNotFound; +import org.osgl.$; import org.osgl.inject.ValueLoader; import org.osgl.util.*; @@ -47,6 +50,8 @@ public class FindBy extends ValueLoader.Base { private Class rawType; private boolean notNull; private String onetimeValue; + private boolean isSessionVariable; + private String sessionVarName; @Override protected void initialized() { @@ -72,6 +77,14 @@ protected void initialized() { queryFieldName = requestParamName; } } + SessionVariable sessionVariable = spec.getAnnotation(SessionVariable.class); + if (null != sessionVariable) { + isSessionVariable = true; + sessionVarName = sessionVariable.value(); + if (S.blank(sessionVarName)) { + sessionVarName = requestParamName; + } + } } public void setOnetimeValue(String s) { @@ -82,7 +95,7 @@ public void setOnetimeValue(String s) { public Object get() { ActContext ctx = ActContext.Base.currentContext(); E.illegalStateIf(null == ctx); - String value = null == onetimeValue ? resolve(requestParamName, ctx) : onetimeValue; + String value = rawValue(ctx); onetimeValue = null; if (S.empty(value)) { if (findOne) { @@ -124,6 +137,23 @@ public Object get() { } } + private String rawValue(ActContext ctx) { + if (null != onetimeValue) { + return onetimeValue; + } + if (isSessionVariable) { + if (ctx instanceof ActionContext) { + ActionContext actionContext = $.cast(ctx); + return actionContext.session(sessionVarName); + } else if (ctx instanceof CliContext) { + CliContext cliContext = $.cast(ctx); + return cliContext.session(sessionVarName); + } + throw E.unsupport(); + } + return resolve(requestParamName, ctx); + } + private Object ensureNotNull(Object obj, String value, ActContext ctx) { if (notNull) { if (null == value) { diff --git a/src/main/java/act/inject/param/ParamValueLoaderService.java b/src/main/java/act/inject/param/ParamValueLoaderService.java index af9def250..94bab0604 100644 --- a/src/main/java/act/inject/param/ParamValueLoaderService.java +++ b/src/main/java/act/inject/param/ParamValueLoaderService.java @@ -793,10 +793,12 @@ public static boolean providedButNotDbBind(BeanSpec beanSpec, DependencyInjector return !hasDbBind(aa); } + private static final String DB_BIND_CNAME = DbBind.class.getName(); // DbBind is special: it's class loader is AppClassLoader public static boolean hasDbBind(Annotation[] annotations) { + final String name = DB_BIND_CNAME; for (Annotation a : annotations) { - if (a.annotationType().getName().equals(DbBind.class.getName())) { + if (a.annotationType().getName().equals(name)) { return true; } } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh862.java b/testapps/GHIssues/src/main/java/ghissues/Gh862.java new file mode 100644 index 000000000..5355044b4 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh862.java @@ -0,0 +1,51 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.db.DbBind; +import act.db.jpa.JPADao; +import act.inject.SessionVariable; +import org.osgl.http.H; +import org.osgl.mvc.annotation.*; + +import javax.inject.Inject; +import javax.persistence.*; + +@UrlContext("862") +public class Gh862 extends BaseController { + @Entity(name = "foo862") + public static class Foo { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + + public String name; + } + + @Inject + private JPADao dao; + + @SessionVariable + @DbBind + private Foo foo; + + @PostAction + public Foo create(final Foo foo) { + return dao.save(foo); + } + + @GetAction + public Iterable list() { + return dao.findAll(); + } + + @PutAction("current/{target}") + public Foo select(@DbBind Foo target, H.Session session) { + session.put("foo", target.id); + return target; + } + + @GetAction("current") + public Foo current() { + return foo; + } +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/862.yml b/testapps/GHIssues/src/main/resources/test/scenarios/862.yml new file mode 100644 index 000000000..071f00eb6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/862.yml @@ -0,0 +1,32 @@ +Scenario(GH862): + constants: + newFooName: ${randStr} + description: "[862] Support using `SessionVariable` annotation and `DbBind` together" + interactions: + - description: Create record + request: + post: /862 + params: + name: ${newFooName} + response: + json: + id: + - exists: true + cache: + newFooId: id + - description: select new record as session variable + request: + put: /862/current + params: + target: ${newFooId} + respons: + json: + id: ${newFooId} + name: ${newFooName} + - description: select current record (from session) + request: + get: /862/current + response: + json: + id: ${newFooId} + name: ${newFooName} \ No newline at end of file From 4c67af690cfb5e2451f25d3eb018eaabc3623314 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 1 Oct 2018 21:14:42 +1000 Subject: [PATCH 133/730] add Controller.Util.requireNotNull(Object) method --- src/main/java/act/controller/Controller.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 9d12ab901..50588927e 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -173,6 +173,22 @@ public static Result notFound(String msg, Object... args) { return ActNotFound.create(msg, args); } + /** + * Check if the input is `null` then throw out `NotFound` result, otherwise return + * the input back. + * + * @param o + * the input object to be evaluated. + * @param + * the type parameter. + * @return + * the input `o` if it is not `null`. + */ + public static T requireNotNull(T o) { + notFoundIfNull(o); + return o; + } + /** * Throws out an {@link NotFound} result if the object specified is * {@code null} From 49691a3273cd31f386118ab92398bf1c1a844eb4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 2 Oct 2018 20:25:00 +1000 Subject: [PATCH 134/730] add test project for GH863 --- testapps/GH863/.gitignore | 19 + testapps/GH863/pom.xml | 28 + testapps/GH863/run_dev | 3 + testapps/GH863/run_dev.bat | 2 + testapps/GH863/run_e2e | 3 + testapps/GH863/run_e2e.bat | 2 + testapps/GH863/run_prod | 10 + .../GH863/src/main/java/test/AppEntry.java | 22 + .../src/main/resources/conf/app.properties | 801 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + testapps/GH863/src/main/resources/logback.xml | 115 +++ .../src/main/resources/messages.properties | 1 + 13 files changed, 1016 insertions(+) create mode 100644 testapps/GH863/.gitignore create mode 100644 testapps/GH863/pom.xml create mode 100755 testapps/GH863/run_dev create mode 100755 testapps/GH863/run_dev.bat create mode 100755 testapps/GH863/run_e2e create mode 100755 testapps/GH863/run_e2e.bat create mode 100755 testapps/GH863/run_prod create mode 100644 testapps/GH863/src/main/java/test/AppEntry.java create mode 100644 testapps/GH863/src/main/resources/conf/app.properties create mode 100644 testapps/GH863/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH863/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH863/src/main/resources/logback.xml create mode 100644 testapps/GH863/src/main/resources/messages.properties diff --git a/testapps/GH863/.gitignore b/testapps/GH863/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH863/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH863/pom.xml b/testapps/GH863/pom.xml new file mode 100644 index 000000000..5d6305612 --- /dev/null +++ b/testapps/GH863/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + gh863-test + 1.8.8.8-SNAPSHOT + + ActFramework Test App for Github Issue 863 + + + org.actframework + act-starter-parent + 1.8.8.7-SNAPSHOT + + + + + 1.8 + test.AppEntry + + + + + + + diff --git a/testapps/GH863/run_dev b/testapps/GH863/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH863/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH863/run_dev.bat b/testapps/GH863/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH863/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH863/run_e2e b/testapps/GH863/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH863/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH863/run_e2e.bat b/testapps/GH863/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH863/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH863/run_prod b/testapps/GH863/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH863/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH863/src/main/java/test/AppEntry.java b/testapps/GH863/src/main/java/test/AppEntry.java new file mode 100644 index 000000000..d335c88ca --- /dev/null +++ b/testapps/GH863/src/main/java/test/AppEntry.java @@ -0,0 +1,22 @@ +package test; + +import act.Act; +import act.controller.Controller; +import act.util.JsonView; +import org.osgl.mvc.annotation.GetAction; + +@SuppressWarnings("unused") +@JsonView +public class AppEntry extends Controller.Util { + + @GetAction + public void test() { + unauthorized(); + } + + + public static void main(String[] args) throws Exception { + Act.start(); + } + +} diff --git a/testapps/GH863/src/main/resources/conf/app.properties b/testapps/GH863/src/main/resources/conf/app.properties new file mode 100644 index 000000000..2db74b457 --- /dev/null +++ b/testapps/GH863/src/main/resources/conf/app.properties @@ -0,0 +1,801 @@ +i18n=true +############################################## +# Application configuration +# act-1.8.8-RC12-SNAPSHOT +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy年MM月dd日 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy年MM月dd日 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=xcgXKMICkvZ3k3uLj2AIiarXjLt2Lr6nHzvkBs9o1a9eKyspfvSd1eKYYSYNAhu8 + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH863/src/main/resources/conf/prod/app.properties b/testapps/GH863/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..5f0017b9a --- /dev/null +++ b/testapps/GH863/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC12-SNAPSHOT +############################################## +act.secret=clypiSZ9qOFMZ8JgAdutcvPctiPYRhC4HFkjcvwhf9j3YQrAUxAx9cUL0FzmnlRB \ No newline at end of file diff --git a/testapps/GH863/src/main/resources/conf/uat/app.properties b/testapps/GH863/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..844739167 --- /dev/null +++ b/testapps/GH863/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC12-SNAPSHOT +############################################## +act.secret=AkrRnS5yuyq98LmEBRwoQom9nCIj8oLlXEKRUjXiBlbjPc0phCf7VL3yJOJqjjbC \ No newline at end of file diff --git a/testapps/GH863/src/main/resources/logback.xml b/testapps/GH863/src/main/resources/logback.xml new file mode 100644 index 000000000..83909e662 --- /dev/null +++ b/testapps/GH863/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH863/src/main/resources/messages.properties b/testapps/GH863/src/main/resources/messages.properties new file mode 100644 index 000000000..853b8995a --- /dev/null +++ b/testapps/GH863/src/main/resources/messages.properties @@ -0,0 +1 @@ +osgl.result.unauthorized=Please login \ No newline at end of file From 73cccdd220a0412d9639da89c1b50032e5ef4d48 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 3 Oct 2018 16:08:04 +1000 Subject: [PATCH 135/730] #862 - make SessionVariable a Qualifier --- src/main/java/act/inject/SessionVariable.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/act/inject/SessionVariable.java b/src/main/java/act/inject/SessionVariable.java index 27ced870d..c33999fba 100644 --- a/src/main/java/act/inject/SessionVariable.java +++ b/src/main/java/act/inject/SessionVariable.java @@ -26,6 +26,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.inject.Qualifier; /** * Indicate a binding from a {@link CliSession#attribute(String) CLI session variable} to @@ -34,6 +35,7 @@ * Or binding from a {@link org.osgl.http.H.Session#get(String)} to a controller field or action handler * parameter */ +@Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER, ElementType.FIELD}) public @interface SessionVariable { From 0b9c3b21748e916a59df31b850bfa424814b4be6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 4 Oct 2018 06:46:24 +1000 Subject: [PATCH 136/730] fix #864 and #865 --- CHANGELOG.md | 2 + src/main/java/act/annotations/Order.java | 2 +- src/main/java/act/app/ActionContext.java | 32 +++- .../controller/ActionHandlerInvoker.java | 5 +- .../controller/AfterInterceptorInvoker.java | 3 +- .../builtin/controller/ControllerAction.java | 27 ++++ .../ExceptionInterceptorInvoker.java | 3 +- .../handler/builtin/controller/Handler.java | 17 +-- .../controller/RequestHandlerProxy.java | 39 ++--- .../impl/ReflectedHandlerInvoker.java | 144 +++++++++++++++++- src/main/java/act/inject/util/Sorter.java | 11 ++ 11 files changed, 230 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a2023304..4d08da5cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Multiple instances issue with request handlers/interceptors happens across class hierarchies #865 +* Support `@Order` in intercepting #864 * Support using `SessionVariable` annotation and `DbBind` together #862 * Make `EventBus` and `Job` list favor `Order` annotation #861 * test resource not refreshed after hot-reload #860 diff --git a/src/main/java/act/annotations/Order.java b/src/main/java/act/annotations/Order.java index d6d5e0a27..a8a965dfa 100644 --- a/src/main/java/act/annotations/Order.java +++ b/src/main/java/act/annotations/Order.java @@ -34,7 +34,7 @@ * @see Sorted */ @Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) +@Target({ElementType.TYPE, ElementType.METHOD}) public @interface Order { int HIGHEST_PRECEDENCE = Integer.MIN_VALUE; diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index a60286eab..0eade8681 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -83,7 +83,7 @@ public class ActionContext extends ActContext.Base implements Des private Map allParams; private String actionPath; // e.g. com.mycorp.myapp.controller.AbcController.foo private State state; - private Map controllerInstances; + private Map controllerInstances; private Map uploads; private Router router; private String processedUrl; @@ -118,6 +118,7 @@ public class ActionContext extends ActContext.Base implements Des private PropertySpec.MetaInfo propSpec; private boolean suppressJsonDateFormat; private String attachmentName; + private Class handlerClass; // see https://github.com/actframework/actframework/issues/492 public String encodedSessionToken; @@ -987,16 +988,37 @@ public ActionContext __appRenderArgNames(String names) { return super.__appRenderArgNames(names); } - public ActionContext __controllerInstance(String className, Object instance) { + public ActionContext __controllerInstance(Class controllerClass, Object instance) { if (null == controllerInstances) { controllerInstances = new HashMap<>(); } - controllerInstances.put(className, instance); + controllerInstances.put(controllerClass, instance); return this; } - public Object __controllerInstance(String className) { - return null == controllerInstances ? null : controllerInstances.get(className); + public Object __controllerInstance(Class controllerClass) { + if (null == controllerInstances) { + return null; + } + Object inst = controllerInstances.get(controllerClass); + if (null != inst) { + return inst; + } + for (Object o : controllerInstances.values()) { + if (controllerClass.isInstance(o)) { + return o; + } + } + return null; + } + + public ActionContext handlerClass(Class clazz) { + this.handlerClass = clazz; + return this; + } + + public Class handlerClass() { + return handlerClass; } diff --git a/src/main/java/act/handler/builtin/controller/ActionHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/ActionHandlerInvoker.java index 48f7fbed9..69577ddec 100644 --- a/src/main/java/act/handler/builtin/controller/ActionHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/ActionHandlerInvoker.java @@ -25,13 +25,12 @@ import act.controller.CacheSupportMetaInfo; import act.security.CORS; import act.security.CSRF; -import act.util.MissingAuthenticationHandler; -import act.util.Prioritised; +import act.util.*; import org.osgl.mvc.result.Result; import java.lang.reflect.Method; -public interface ActionHandlerInvoker extends Prioritised, Destroyable { +public interface ActionHandlerInvoker extends Prioritised, Destroyable, Ordered { Result handle(ActionContext actionContext) throws Exception; void accept(Visitor visitor); diff --git a/src/main/java/act/handler/builtin/controller/AfterInterceptorInvoker.java b/src/main/java/act/handler/builtin/controller/AfterInterceptorInvoker.java index cea61345a..c02d42899 100644 --- a/src/main/java/act/handler/builtin/controller/AfterInterceptorInvoker.java +++ b/src/main/java/act/handler/builtin/controller/AfterInterceptorInvoker.java @@ -23,10 +23,11 @@ import act.Destroyable; import act.app.ActionContext; import act.security.CORS; +import act.util.Ordered; import act.util.Prioritised; import org.osgl.mvc.result.Result; -public interface AfterInterceptorInvoker extends Prioritised, Destroyable { +public interface AfterInterceptorInvoker extends Prioritised, Destroyable, Ordered { Result handle(Result result, ActionContext actionContext) throws Exception; void accept(ActionHandlerInvoker.Visitor visitor); diff --git a/src/main/java/act/handler/builtin/controller/ControllerAction.java b/src/main/java/act/handler/builtin/controller/ControllerAction.java index 40f55f206..957c27d24 100644 --- a/src/main/java/act/handler/builtin/controller/ControllerAction.java +++ b/src/main/java/act/handler/builtin/controller/ControllerAction.java @@ -25,6 +25,7 @@ import act.security.CORS; import act.security.CSRF; import act.util.MissingAuthenticationHandler; +import org.osgl.$; import org.osgl.mvc.result.Result; /** @@ -48,6 +49,27 @@ public Result handle(ActionContext actionContext) throws Exception { return handlerInvoker.handle(actionContext); } + @Override + public int hashCode() { + return $.hc(handlerInvoker, getClass()); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj instanceof ControllerAction) { + return $.eq(((ControllerAction) obj).handlerInvoker, handlerInvoker); + } + return false; + } + + @Override + public String toString() { + return handlerInvoker.toString(); + } + @Override public CORS.Spec corsSpec() { return handlerInvoker.corsSpec(); @@ -102,4 +124,9 @@ protected void releaseResources() { handlerInvoker.destroy(); handlerInvoker = null; } + + @Override + public int order() { + return handlerInvoker.order(); + } } diff --git a/src/main/java/act/handler/builtin/controller/ExceptionInterceptorInvoker.java b/src/main/java/act/handler/builtin/controller/ExceptionInterceptorInvoker.java index ff6100c29..ac98b178e 100644 --- a/src/main/java/act/handler/builtin/controller/ExceptionInterceptorInvoker.java +++ b/src/main/java/act/handler/builtin/controller/ExceptionInterceptorInvoker.java @@ -23,10 +23,11 @@ import act.Destroyable; import act.app.ActionContext; import act.security.CORS; +import act.util.Ordered; import act.util.Prioritised; import org.osgl.mvc.result.Result; -public interface ExceptionInterceptorInvoker extends Prioritised, Destroyable { +public interface ExceptionInterceptorInvoker extends Prioritised, Destroyable, Ordered { Result handle(Exception e, ActionContext actionContext) throws Exception; void accept(ActionHandlerInvoker.Visitor visitor); CORS.Spec corsSpec(); diff --git a/src/main/java/act/handler/builtin/controller/Handler.java b/src/main/java/act/handler/builtin/controller/Handler.java index 07a911d10..c5b0cefb1 100644 --- a/src/main/java/act/handler/builtin/controller/Handler.java +++ b/src/main/java/act/handler/builtin/controller/Handler.java @@ -22,13 +22,13 @@ import act.security.CORS; import act.util.LogSupportedDestroyableBase; -import org.osgl.$; +import act.util.Ordered; /** * The base class of @Before, @After, @Exception, @Finally interceptor and * request dispatcher */ -public abstract class Handler extends LogSupportedDestroyableBase implements Comparable { +public abstract class Handler extends LogSupportedDestroyableBase implements Comparable, Ordered { private int priority; @@ -45,19 +45,6 @@ public int compareTo(T o) { return priority - o.priority(); } - @Override - public int hashCode() { - return $.hc(priority, getClass()); - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - return obj.getClass().equals(getClass()); - } - public void accept(Visitor visitor) {} public abstract boolean sessionFree(); diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index 0df8320ff..e7219cbb6 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -33,6 +33,7 @@ import act.controller.*; import act.controller.meta.*; import act.handler.RequestHandlerBase; +import act.inject.util.Sorter; import act.security.CORS; import act.security.CSRF; import act.util.*; @@ -203,6 +204,7 @@ public void handle(ActionContext context) { context.enableCache(); } saveActionPath(context); + setHandlerClass(context); context.startIntercepting(); result = handleBefore(context); if (null == result) { @@ -349,6 +351,11 @@ private void saveActionPath(ActionContext context) { context.actionPath(actionPath); } + // in case interceptor class is super type of action handler class + private void setHandlerClass(ActionContext context) { + context.handlerClass(actionHandler.invoker().invokeMethod().getDeclaringClass()); + } + private boolean matches(Set patterns) { if (patterns.contains(actionMethodName) || patterns.contains(actionPath)) { return true; @@ -441,7 +448,7 @@ private void generateHandlers() { continue; } BeforeInterceptor interceptor = mode.createBeforeInterceptor(info, app); - beforeInterceptors.add(interceptor); + insertInterceptor(beforeInterceptors, interceptor); sessionFree = sessionFree && interceptor.sessionFree(); express = express && interceptor.express(); } @@ -450,7 +457,7 @@ private void generateHandlers() { continue; } AfterInterceptor interceptor = mode.createAfterInterceptor(info, app); - afterInterceptors.add(interceptor); + insertInterceptor(afterInterceptors, interceptor); sessionFree = sessionFree && interceptor.sessionFree(); express = express && interceptor.express(); } @@ -459,7 +466,7 @@ private void generateHandlers() { continue; } ExceptionInterceptor interceptor = mode.createExceptionInterceptor(info, app); - exceptionInterceptors.add(interceptor); + insertInterceptor(exceptionInterceptors, interceptor); sessionFree = sessionFree && interceptor.sessionFree(); express = express && interceptor.express(); } @@ -470,7 +477,7 @@ private void generateHandlers() { continue; } FinallyInterceptor interceptor = mode.createFinallyInterceptor(info, app); - finallyInterceptors.add(interceptor); + insertInterceptor(finallyInterceptors, interceptor); sessionFree = sessionFree && interceptor.sessionFree(); express = express && interceptor.express(); } @@ -600,7 +607,6 @@ public static void registerGlobalInterceptor(FinallyInterceptor interceptor) { public static void registerGlobalInterceptor(ExceptionInterceptor interceptor) { insertInterceptor(globalExceptionInterceptors, interceptor); - Collections.sort(globalExceptionInterceptors); } @AnnotatedClassFinder(value = Global.class, callOn = SysEventId.PRE_START) @@ -629,28 +635,11 @@ public static void registerGlobalInterceptors(Class interceptorClass) { } public static void insertInterceptor(List list, T i) { - int sz = list.size(); - if (0 == sz) { - list.add(i); - } - ListIterator itr = list.listIterator(); - while (itr.hasNext()) { - T t = itr.next(); - int n = i.compareTo(t); - if (n < 0) { - itr.add(i); - return; - } else if (n == 0) { - if (i.equals(t)) { - // already exists - return; - } else { - itr.add(i); - return; - } - } + if (list.contains(i)) { + return; } list.add(i); + Collections.sort(list, Sorter.COMPARATOR); } public static class GroupInterceptorWithResult { diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index ddd7b2119..9b15592ff 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -155,6 +155,7 @@ public void visit(H.Format format) throws $.Break { private boolean returnSimpleType; private boolean returnIterableComponentIsSimpleType; private boolean shallTransformReturnVal; + private int order; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -174,6 +175,8 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { throw E.unexpected(e); } this.returnString = method.getReturnType() == String.class; + Order order = method.getAnnotation(Order.class); + this.order = null == order ? Order.HIGHEST_PRECEDENCE : order.value(); final boolean isBuiltIn = controllerClass.getName().startsWith("act."); if (handlerMetaInfo.hasReturn() && !isBuiltIn) { this.returnSimpleType = this.returnString || $.isSimpleType(method.getReturnType()); @@ -375,6 +378,27 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { app.eventBus().emit(new ReflectedHandlerInvokerInit(this)); } + @Override + public int hashCode() { + return $.hc(method); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj instanceof ReflectedHandlerInvoker) { + return $.eq(((ReflectedHandlerInvoker) obj).method, method); + } + return false; + } + + @Override + public String toString() { + return method.toString(); + } + @Override protected void releaseResources() { app = null; @@ -389,6 +413,11 @@ protected void releaseResources() { super.releaseResources(); } + @Override + public int order() { + return this.order; + } + @Override public int priority() { return handler.priority(); @@ -762,11 +791,14 @@ private Object controllerInstance(ActionContext context) { if (null != singleton) { return singleton; } - String controllerName = controllerClass.getName(); - Object inst = context.__controllerInstance(controllerName); + Class host = controllerClass; + if (host.isAssignableFrom(context.handlerClass())) { + host = context.handlerClass(); + } + Object inst = context.__controllerInstance(host); if (null == inst) { - inst = paramLoaderService.loadHostBean(controllerClass, context); - context.__controllerInstance(controllerName, inst); + inst = paramLoaderService.loadHostBean(host, context); + context.__controllerInstance(host, inst); } return inst; } @@ -1075,6 +1107,32 @@ public Result handle(ActionContext actionContext) throws Exception { return invoker.handle(actionContext); } + @Override + public int order() { + return invoker.order(); + } + + @Override + public int hashCode() { + return $.hc(invoker, getClass()); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj instanceof _Before) { + return $.eq(((_Before) obj).invoker, invoker); + } + return false; + } + + @Override + public String toString() { + return invoker.toString(); + } + @Override public boolean sessionFree() { return invoker.sessionFree(); @@ -1120,6 +1178,32 @@ public Result handle(Result result, ActionContext actionContext) throws Exceptio return invoker.handle(result, actionContext); } + @Override + public int hashCode() { + return $.hc(invoker, getClass()); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj instanceof _After) { + return $.eq(((_After) obj).invoker, invoker); + } + return false; + } + + @Override + public String toString() { + return invoker.toString(); + } + + @Override + public int order() { + return invoker.order(); + } + @Override public CORS.Spec corsSpec() { return invoker.corsSpec(); @@ -1177,6 +1261,32 @@ private static List> exceptionClassesOf(CatchMethodMe return clsList; } + @Override + public int hashCode() { + return $.hc(invoker, getClass()); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj instanceof _Exception) { + return $.eq(((_Exception) obj).invoker, invoker); + } + return false; + } + + @Override + public String toString() { + return invoker.toString(); + } + + @Override + public int order() { + return invoker.order(); + } + @Override protected Result internalHandle(Exception e, ActionContext actionContext) throws Exception { return invoker.handle(e, actionContext); @@ -1232,6 +1342,32 @@ public void handle(ActionContext actionContext) throws Exception { invoker.handle(actionContext); } + @Override + public int hashCode() { + return $.hc(invoker, getClass()); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj instanceof _Finally) { + return $.eq(((_Finally) obj).invoker, invoker); + } + return false; + } + + @Override + public String toString() { + return invoker.toString(); + } + + @Override + public int order() { + return invoker.order(); + } + @Override public CORS.Spec corsSpec() { return invoker.corsSpec(); diff --git a/src/main/java/act/inject/util/Sorter.java b/src/main/java/act/inject/util/Sorter.java index f68192468..fce027f94 100644 --- a/src/main/java/act/inject/util/Sorter.java +++ b/src/main/java/act/inject/util/Sorter.java @@ -59,6 +59,17 @@ public int compare(Object o1, Object o2) { } }; + public static final Comparator REVERSE_COMPARATOR = new Comparator() { + @Override + public int compare(Object o1, Object o2) { + return COMPARATOR.compare(o2, o1); + } + }; + + public static final Comparator comparator(boolean reverseOrder) { + return reverseOrder ? REVERSE_COMPARATOR : COMPARATOR; + } + private static int orderOf(Object o) { if (o instanceof Ordered) { return ((Ordered) o).order(); From e780939ed2accc71f9b9556cfc9f361e5f7d63d9 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 4 Oct 2018 08:05:42 +1000 Subject: [PATCH 137/730] #864 - merge processing of priority defined with interceptor annotation with @Order annotation --- .../meta/GroupInterceptorMetaInfo.java | 9 +++++---- .../meta/HandlerMethodMetaInfo.java | 4 ++-- .../meta/InterceptorMethodMetaInfo.java | 14 ++++--------- .../builtin/controller/ActionHandler.java | 2 +- .../builtin/controller/AfterInterceptor.java | 2 +- .../builtin/controller/BeforeInterceptor.java | 2 +- .../controller/ExceptionInterceptor.java | 20 ++++--------------- .../controller/FinallyInterceptor.java | 2 +- .../handler/builtin/controller/Handler.java | 13 ++++++------ .../impl/ReflectedHandlerInvoker.java | 11 +++++++--- src/main/java/act/inject/util/Sorter.java | 2 +- src/main/java/act/util/Prioritised.java | 2 +- 12 files changed, 36 insertions(+), 47 deletions(-) diff --git a/src/main/java/act/controller/meta/GroupInterceptorMetaInfo.java b/src/main/java/act/controller/meta/GroupInterceptorMetaInfo.java index 0dfab1408..53f92d9aa 100644 --- a/src/main/java/act/controller/meta/GroupInterceptorMetaInfo.java +++ b/src/main/java/act/controller/meta/GroupInterceptorMetaInfo.java @@ -22,6 +22,7 @@ import static act.Destroyable.Util.destroyAll; +import act.inject.util.Sorter; import act.util.LogSupportedDestroyableBase; import org.osgl.$; import org.osgl.util.C; @@ -138,10 +139,10 @@ public void mergeFrom(GroupInterceptorMetaInfo classInterceptors, String actionN classInterceptors.afterList.each(_F.mergeInto(this.afterList, actionName)); classInterceptors.catchList.each(_F.mergeInto(this.catchList, actionName)); classInterceptors.finallyList.each(_F.mergeInto(this.finallyList, actionName)); - beforeList = beforeList.sorted(); - afterList = afterList.sorted(); - catchList = catchList.sorted(); - finallyList = finallyList.sorted(); + Sorter.sort(beforeList); + Sorter.sort(afterList); + Sorter.sort(catchList); + Sorter.sort(finallyList); } @Override diff --git a/src/main/java/act/controller/meta/HandlerMethodMetaInfo.java b/src/main/java/act/controller/meta/HandlerMethodMetaInfo.java index ccb00f9e1..95b5d6af9 100644 --- a/src/main/java/act/controller/meta/HandlerMethodMetaInfo.java +++ b/src/main/java/act/controller/meta/HandlerMethodMetaInfo.java @@ -122,8 +122,8 @@ public String dateFormatPattern() { } @Override - public int priority() { - return -1; + public Integer priority() { + return null; } public T appContextViaField(String fieldName) { diff --git a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java index 5408ba22a..69fdad7aa 100644 --- a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java +++ b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java @@ -31,12 +31,11 @@ * Stores all method level information needed to generate * {@link Handler interceptors} */ -public class InterceptorMethodMetaInfo extends HandlerMethodMetaInfo - implements Comparable { +public class InterceptorMethodMetaInfo extends HandlerMethodMetaInfo { private Set whiteList = C.newSet(); private Set blackList = C.newSet(); - private int priority; + private Integer priority; protected InterceptorMethodMetaInfo(InterceptorMethodMetaInfo copy, ControllerClassMetaInfo clsInfo) { super(copy, clsInfo); @@ -77,7 +76,7 @@ public InterceptorMethodMetaInfo priority(int priority) { return this; } - public int priority() { + public Integer priority() { return priority; } @@ -120,7 +119,7 @@ public String toString() { @Override protected S.Buffer toStrBuffer(S.Buffer sb) { S.Buffer prependix = S.newBuffer(); - if (0 != priority) { + if (null != priority) { prependix.append("p[") .append(priority).append("] "); } @@ -134,11 +133,6 @@ protected S.Buffer toStrBuffer(S.Buffer sb) { return super.toStrBuffer(sb).prepend(prependix); } - @Override - public int compareTo(InterceptorMethodMetaInfo o) { - return o.priority - priority; - } - public final InterceptorMethodMetaInfo extended(ControllerClassMetaInfo clsInfo) { if (clsInfo.isMyAncestor(this.classInfo()) && !this.isStatic()) { return doExtend(clsInfo); diff --git a/src/main/java/act/handler/builtin/controller/ActionHandler.java b/src/main/java/act/handler/builtin/controller/ActionHandler.java index 82ce15472..896e91377 100644 --- a/src/main/java/act/handler/builtin/controller/ActionHandler.java +++ b/src/main/java/act/handler/builtin/controller/ActionHandler.java @@ -28,7 +28,7 @@ */ public abstract class ActionHandler extends Handler { - protected ActionHandler(int priority) { + protected ActionHandler(Integer priority) { super(priority); } diff --git a/src/main/java/act/handler/builtin/controller/AfterInterceptor.java b/src/main/java/act/handler/builtin/controller/AfterInterceptor.java index 11abcba7f..73f4b9bd6 100644 --- a/src/main/java/act/handler/builtin/controller/AfterInterceptor.java +++ b/src/main/java/act/handler/builtin/controller/AfterInterceptor.java @@ -31,7 +31,7 @@ public abstract class AfterInterceptor extends Handler implements Plugin, AfterInterceptorInvoker { - protected AfterInterceptor(int priority) { + protected AfterInterceptor(Integer priority) { super(priority); } diff --git a/src/main/java/act/handler/builtin/controller/BeforeInterceptor.java b/src/main/java/act/handler/builtin/controller/BeforeInterceptor.java index 927b41e8d..8b8d81e5f 100644 --- a/src/main/java/act/handler/builtin/controller/BeforeInterceptor.java +++ b/src/main/java/act/handler/builtin/controller/BeforeInterceptor.java @@ -27,7 +27,7 @@ */ public abstract class BeforeInterceptor extends ActionHandler implements Plugin { - public BeforeInterceptor(int priority) { + public BeforeInterceptor(Integer priority) { super(priority); } diff --git a/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java b/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java index ade700ba9..6ade7f4f5 100644 --- a/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java +++ b/src/main/java/act/handler/builtin/controller/ExceptionInterceptor.java @@ -41,7 +41,7 @@ public ExceptionInterceptor() { } @SuppressWarnings("unchecked") - public ExceptionInterceptor(int priority) { + public ExceptionInterceptor(Integer priority) { this(priority, new Class[]{}); } @@ -49,12 +49,12 @@ public ExceptionInterceptor(Class... exClasses) { this(0, exClasses); } - public ExceptionInterceptor(int priority, Class... exClasses) { + public ExceptionInterceptor(Integer priority, Class... exClasses) { super(priority); this.exClasses = C.listOf(exClasses).sorted(EXCEPTION_WEIGHT_COMPARATOR); } - public ExceptionInterceptor(int priority, List> exClasses) { + public ExceptionInterceptor(Integer priority, List> exClasses) { super(priority); E.illegalArgumentIf(exClasses.isEmpty()); this.exClasses = C.list(exClasses).sorted(EXCEPTION_WEIGHT_COMPARATOR); @@ -76,25 +76,13 @@ public Result handle(Exception e, ActionContext actionContext) throws Exception @Override public int compareTo(ExceptionInterceptor o) { if (o == this) return 0; - int thisPriority = priority(); - int thatPririty = o.priority(); - if (thisPriority > 0 && thatPririty < 0) { - return 1; - } - if (thisPriority < 0 && thatPririty > 0) { - return -1; - } - if (thisPriority <0 && thatPririty < 0) { - warn("Found more than one high priority Exception handlers"); - } boolean iAmEmpty = exClasses.isEmpty(), uAreEmpty = o.exClasses.isEmpty(); if (iAmEmpty) { return uAreEmpty ? 0 : 1; } else if (uAreEmpty) { return -1; } - int n = EXCEPTION_WEIGHT_COMPARATOR.compare(o.exClasses.get(0), exClasses.get(0)); - return 0 == n ? super.compareTo(o) : n; + return EXCEPTION_WEIGHT_COMPARATOR.compare(o.exClasses.get(0), exClasses.get(0)); } @Override diff --git a/src/main/java/act/handler/builtin/controller/FinallyInterceptor.java b/src/main/java/act/handler/builtin/controller/FinallyInterceptor.java index 41cf8b48f..2d6b4abd8 100644 --- a/src/main/java/act/handler/builtin/controller/FinallyInterceptor.java +++ b/src/main/java/act/handler/builtin/controller/FinallyInterceptor.java @@ -30,7 +30,7 @@ public abstract class FinallyInterceptor extends Handler implements Plugin { - protected FinallyInterceptor(int priority) { + protected FinallyInterceptor(Integer priority) { super(priority); } diff --git a/src/main/java/act/handler/builtin/controller/Handler.java b/src/main/java/act/handler/builtin/controller/Handler.java index c5b0cefb1..ab02d3261 100644 --- a/src/main/java/act/handler/builtin/controller/Handler.java +++ b/src/main/java/act/handler/builtin/controller/Handler.java @@ -20,6 +20,7 @@ * #L% */ +import act.annotations.Order; import act.security.CORS; import act.util.LogSupportedDestroyableBase; import act.util.Ordered; @@ -28,21 +29,21 @@ * The base class of @Before, @After, @Exception, @Finally interceptor and * request dispatcher */ -public abstract class Handler extends LogSupportedDestroyableBase implements Comparable, Ordered { +public abstract class Handler extends LogSupportedDestroyableBase implements Ordered { - private int priority; + private Integer priority; - protected Handler(int priority) { + protected Handler(Integer priority) { this.priority = priority; } - public int priority() { + public Integer priority() { return priority; } @Override - public int compareTo(T o) { - return priority - o.priority(); + public int order() { + return null == priority ? Order.HIGHEST_PRECEDENCE : priority; } public void accept(Visitor visitor) {} diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 9b15592ff..967810ad9 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -175,8 +175,13 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { throw E.unexpected(e); } this.returnString = method.getReturnType() == String.class; - Order order = method.getAnnotation(Order.class); - this.order = null == order ? Order.HIGHEST_PRECEDENCE : order.value(); + Integer priority = handler.priority(); + if (null != priority) { + this.order = priority; + } else { + Order order = method.getAnnotation(Order.class); + this.order = null == order ? Order.HIGHEST_PRECEDENCE : order.value(); + } final boolean isBuiltIn = controllerClass.getName().startsWith("act."); if (handlerMetaInfo.hasReturn() && !isBuiltIn) { this.returnSimpleType = this.returnString || $.isSimpleType(method.getReturnType()); @@ -419,7 +424,7 @@ public int order() { } @Override - public int priority() { + public Integer priority() { return handler.priority(); } diff --git a/src/main/java/act/inject/util/Sorter.java b/src/main/java/act/inject/util/Sorter.java index fce027f94..7820f5cbf 100644 --- a/src/main/java/act/inject/util/Sorter.java +++ b/src/main/java/act/inject/util/Sorter.java @@ -87,7 +87,7 @@ public void process(Object bean, Annotation annotation) { } } - private void sort(List list) { + public static void sort(List list) { Collections.sort(list, COMPARATOR); } diff --git a/src/main/java/act/util/Prioritised.java b/src/main/java/act/util/Prioritised.java index fa83b837a..00b16b6d7 100644 --- a/src/main/java/act/util/Prioritised.java +++ b/src/main/java/act/util/Prioritised.java @@ -21,5 +21,5 @@ */ public interface Prioritised { - int priority(); + Integer priority(); } From c3748d0c42caf1b1620fda6843bff0118b894310 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 4 Oct 2018 17:30:41 +1000 Subject: [PATCH 138/730] fix `PropertySpec` specification not working when return value is a list #866 --- CHANGELOG.md | 1 + src/main/java/act/controller/Controller.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d08da5cb..b0a28bf26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `PropertySpec` specification not working when return value is a list #866 * Multiple instances issue with request handlers/interceptors happens across class hierarchies #865 * Support `@Order` in intercepting #864 * Support using `SessionVariable` annotation and `DbBind` together #862 diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 50588927e..18bfafaf1 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1912,6 +1912,9 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } Class vCls = v.getClass(); boolean shouldUseToString = $$.shouldUseToString(vCls); + if (!requireJSON && !requireXML && !shouldUseToString) { + requireJSON = true; + } if ($.isSimpleType(vCls) || shouldUseToString) { boolean isArray = vCls.isArray(); return inferPrimitiveResult(v, context, requireJSON, requireXML, isArray, shouldUseToString); From 9f41097a73a275e080dc0b19d409862f9ef0dae0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 4 Oct 2018 18:56:43 +1000 Subject: [PATCH 139/730] API Doc: generate sample data for interface #867 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/Endpoint.java | 83 +++++++++++++++++-- src/main/java/act/controller/Controller.java | 2 +- .../inject/param/ParamValueLoaderService.java | 12 ++- .../src/main/java/ghissues/Gh866.java | 22 +++++ .../src/main/resources/test/scenarios/866.yml | 15 ++++ 6 files changed, 123 insertions(+), 12 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh866.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/866.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index b0a28bf26..96b7e3156 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* API Doc: generate sample data for interface #867 * `PropertySpec` specification not working when return value is a list #866 * Multiple instances issue with request handlers/interceptors happens across class hierarchies #865 * Support `@Order` in intercepting #864 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index c198baa3b..c3f7d54b4 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -32,17 +32,17 @@ import act.handler.builtin.controller.impl.ReflectedHandlerInvoker; import act.inject.DefaultValue; import act.inject.DependencyInjector; +import act.inject.param.NoBind; import act.inject.param.ParamValueLoaderService; -import act.util.FastJsonPropertyPreFilter; -import act.util.PropertySpec; +import act.util.*; import act.validation.NotBlank; import com.alibaba.fastjson.JSON; import org.apache.bval.constraints.NotEmpty; import org.joda.time.*; import org.osgl.$; +import org.osgl.OsglConfig; import org.osgl.http.H; -import org.osgl.inject.BeanSpec; -import org.osgl.inject.Injector; +import org.osgl.inject.*; import org.osgl.logging.Logger; import org.osgl.mvc.result.Result; import org.osgl.storage.ISObject; @@ -681,9 +681,57 @@ public static Object generateSampleData( return obj; } - obj = Act.getInstance(classType); - List fields = $.fieldsOf(classType); Injector injector = Act.injector(); + try { + obj = Act.getInstance(classType); + } catch (Exception e) { + Method emailGetter = null; + Map map = new HashMap<>(); + Method[] ma = classType.getMethods(); + for (Method m : ma) { + if (!Modifier.isStatic(m.getModifiers()) && m.getName().startsWith("get") && m.getReturnType() != void.class) { + if (shouldWaive(m)) { + continue; + } + Class propertyClass = m.getReturnType(); + Object val = null; + try { + String propertyName = m.getName().substring(3); + if ("name".equalsIgnoreCase(propertyName)) { + propertyName = m.getDeclaringClass().getSimpleName(); + } + Annotation[] annotations = m.getDeclaredAnnotations(); + Type propertyType = m.getGenericReturnType(); + if (propertyType instanceof TypeVariable) { + propertyType = propertyClass; + } + BeanSpec propertySpec = BeanSpec.of(propertyType, annotations, propertyName, injector, m.getModifiers(), typeParamLookup); + if (null == emailGetter && isEmail(propertySpec)) { + emailGetter = m; + } else { + val = generateSampleData(propertySpec, typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter); + if (null != val) { + Class valType = val.getClass(); + if (!propertyClass.isAssignableFrom(valType)) { + val = $.convert(val).to(propertyClass); + } + if (null != val) { + map.put(propertyName, val); + } + } + } + } catch (Exception e1) { + + } + } + } + if (null != emailGetter) { + String mockEmail = sampleDataProviderManager.getSampleData(SampleDataCategory.EMAIL, name, String.class); + map.put(emailGetter.getName().substring(3), mockEmail); + } + return map; + } + List fields = $.fieldsOf(classType); Field emailField = null; for (Field field : fields) { if (Modifier.isStatic(field.getModifiers())) { @@ -703,7 +751,7 @@ public static Object generateSampleData( Annotation[] annotations = field.getDeclaredAnnotations(); Type fieldType = field.getGenericType(); if (fieldType instanceof TypeVariable) { - fieldType = field.getType(); + fieldType = fieldClass; } BeanSpec fieldSpec = BeanSpec.of(fieldType, annotations, fieldName, injector, field.getModifiers(), typeParamLookup); if (null == emailField && isEmail(fieldSpec)) { @@ -721,7 +769,7 @@ public static Object generateSampleData( field.set(obj, val); } } - } catch (Exception e) { + } catch (Exception e2) { LOGGER.warn("Error setting value[%s] to field[%s.%s]", val, classType.getSimpleName(), field.getName()); } } @@ -753,4 +801,23 @@ private static StringValueResolver stringValueResolver(Class ty return Act.app().resolverManager().resolver(type); } + // see ParamValueLoaderService.shouldWaive(Field) + private static boolean shouldWaive(Method getter) { + int modifiers = getter.getModifiers(); + if (Modifier.isTransient(modifiers) || Modifier.isStatic(modifiers)) { + return true; + } + String fieldName = getter.getName().substring(3); + Class entityType = getter.getReturnType(); + return ParamValueLoaderService.noBind(entityType) + || getter.isAnnotationPresent(NoBind.class) + || getter.isAnnotationPresent(Stateless.class) + || getter.isAnnotationPresent(Global.class) + || ParamValueLoaderService.isInBlackList(fieldName) + || Object.class.equals(entityType) + || Class.class.equals(entityType) + || OsglConfig.globalMappingFilter_shouldIgnore(fieldName); + } + + } diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 18bfafaf1..b64d38bee 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1912,7 +1912,7 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } Class vCls = v.getClass(); boolean shouldUseToString = $$.shouldUseToString(vCls); - if (!requireJSON && !requireXML && !shouldUseToString) { + if (accept == H.Format.HTML && !shouldUseToString) { requireJSON = true; } if ($.isSimpleType(vCls) || shouldUseToString) { diff --git a/src/main/java/act/inject/param/ParamValueLoaderService.java b/src/main/java/act/inject/param/ParamValueLoaderService.java index 94bab0604..4cb53a953 100644 --- a/src/main/java/act/inject/param/ParamValueLoaderService.java +++ b/src/main/java/act/inject/param/ParamValueLoaderService.java @@ -233,22 +233,28 @@ public static boolean shouldWaive(Field field) { return true; } String fieldName = field.getName(); - return noBind(field.getDeclaringClass()) + Class entityType = field.getDeclaringClass(); + return noBind(entityType) || field.isAnnotationPresent(NoBind.class) || field.isAnnotationPresent(Stateless.class) || field.isAnnotationPresent(Global.class) || fieldBlackList.contains(fieldName) - || Object.class.equals(field.getDeclaringClass()) + || Object.class.equals(entityType) + || Class.class.equals(entityType) || OsglConfig.globalMappingFilter_shouldIgnore(fieldName); } + public static boolean isInBlackList(String fieldName) { + return fieldBlackList.contains(fieldName); + } + private static ConcurrentMap noBindCache; public static void classInit(App app) { noBindCache = app.createConcurrentMap(); } - private static boolean noBind(Class c) { + public static boolean noBind(Class c) { Boolean b = noBindCache.get(c); if (null != b) { return b; diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh866.java b/testapps/GHIssues/src/main/java/ghissues/Gh866.java new file mode 100644 index 000000000..3d8cb7750 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh866.java @@ -0,0 +1,22 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.PropertySpec; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.*; + +@UrlContext("866") +public class Gh866 extends BaseController { + + public static class Foo { + public String name = S.random(); + public int number = N.randInt(); + } + + @GetAction + @PropertySpec("name") + public Iterable list() { + return C.list(new Foo()); + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/866.yml b/testapps/GHIssues/src/main/resources/test/scenarios/866.yml new file mode 100644 index 000000000..6443ed2ac --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/866.yml @@ -0,0 +1,15 @@ +Scenario(GH866): + description: "[8466] `PropertySpec` specification not working when return value is a list" + interactions: + - description: test + request: + accept: text/html + get: 866 + response: + json: + size: 1 + 0: + name: + - exists: true + number: + - exists: false \ No newline at end of file From 0b2bc1de767d997aa160547e21a1d2ff84209b41 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 4 Oct 2018 22:02:52 +1000 Subject: [PATCH 140/730] Add jobId to all built-in jobs #868 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 4 ++-- src/main/java/act/app/CliServer.java | 2 +- src/main/java/act/app/DbServiceManager.java | 2 +- .../java/act/app/conf/AppConfigurator.java | 9 +++----- .../conf/ConfigurationByteCodeScanner.java | 2 +- .../controller/builtin/ThrottleFilter.java | 4 ++-- .../bytecode/ControllerByteCodeScanner.java | 22 +++++++++---------- .../meta/ControllerClassMetaInfoManager.java | 2 +- .../act/db/meta/MasterEntityMetaInfoRepo.java | 4 ++-- .../SimpleEventListenerByteCodeScanner.java | 2 +- .../meta/SimpleEventListenerMetaInfo.java | 14 +++++++++--- .../act/handler/builtin/ResourceGetter.java | 3 ++- .../controller/RequestHandlerProxy.java | 2 +- .../act/inject/genie/GenieModuleScanner.java | 2 +- .../java/act/job/JobAnnotationProcessor.java | 2 +- src/main/java/act/job/JobManager.java | 7 ++++++ .../java/act/job/meta/JobMethodMetaInfo.java | 6 ++++- .../java/act/metric/MetricMetaInfoRepo.java | 2 +- .../act/route/RouteTableRouterBuilder.java | 5 ++++- .../java/act/util/ClassInfoRepository.java | 2 +- src/main/java/act/util/SimpleBean.java | 2 +- .../act/view/ImplicitVariableProvider.java | 16 +++++--------- src/main/java/act/view/View.java | 2 +- .../view/rythm/RythmTransformerScanner.java | 2 +- src/main/java/act/xio/NetworkHandler.java | 2 +- 26 files changed, 68 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96b7e3156..477f57e89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Add jobId to all built-in jobs #868 * API Doc: generate sample data for interface #867 * `PropertySpec` specification not working when return value is a list #866 * Multiple instances issue with request handlers/interceptors happens across class hierarchies #865 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 08b63329f..3b91ad7d8 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -746,7 +746,7 @@ public void run() { if (!dbServiceManager().hasDbService() || eventEmitted(DB_SVC_LOADED)) { runnable.run(); } else { - jobManager().on(DB_SVC_LOADED, runnable, true); + jobManager().on(DB_SVC_LOADED, "App:postDbSvcLoadLogic", runnable, true); } } catch (BlockIssueSignal e) { // ignore @@ -1235,7 +1235,7 @@ private void initDaemonRegistry() { Destroyable.Util.tryDestroyAll(daemonRegistry.values(), ApplicationScoped.class); } daemonRegistry = new HashMap<>(); - jobManager.on(SysEventId.START, new Runnable() { + jobManager.on(SysEventId.START, "App:schedule-daemon-keeper", new Runnable() { @Override public void run() { jobManager.fixedDelay("daemon-keeper", new Runnable() { diff --git a/src/main/java/act/app/CliServer.java b/src/main/java/act/app/CliServer.java index 892e0f1ce..8fe96ee90 100644 --- a/src/main/java/act/app/CliServer.java +++ b/src/main/java/act/app/CliServer.java @@ -161,7 +161,7 @@ public void run() { } } }); - app().jobManager().on(SysEventId.ACT_START, new Runnable() { + app().jobManager().on(SysEventId.ACT_START, "CliServer:print-cli-start-message", new Runnable() { @Override public void run() { Act.LOGGER.info("CLI server started on port: %s", port); diff --git a/src/main/java/act/app/DbServiceManager.java b/src/main/java/act/app/DbServiceManager.java index d428f0777..abcbbd0a3 100644 --- a/src/main/java/act/app/DbServiceManager.java +++ b/src/main/java/act/app/DbServiceManager.java @@ -138,7 +138,7 @@ boolean hasDbService() { } private void configureSequenceGenerator(final App app) { - app.jobManager().on(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED, new Runnable() { + app.jobManager().on(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED, "DbServiceManager:registerSequenceNumberGenerator", new Runnable() { @Override public void run() { _SequenceNumberGenerator seqGen = app.config().sequenceNumberGenerator(); diff --git a/src/main/java/act/app/conf/AppConfigurator.java b/src/main/java/act/app/conf/AppConfigurator.java index f06aa1444..4204967e4 100644 --- a/src/main/java/act/app/conf/AppConfigurator.java +++ b/src/main/java/act/app/conf/AppConfigurator.java @@ -26,10 +26,7 @@ import act.util.LogSupport; import org.osgl.$; import org.osgl.http.H; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; -import org.osgl.util.StringValueResolver; +import org.osgl.util.*; import java.util.*; @@ -127,7 +124,7 @@ protected static class CsrfSetting extends LogSupport { CsrfSetting(AppConfigurator conf) { this.conf = conf; this.enabled = true; - conf.app().jobManager().on(SysEventId.CONFIG_PREMERGE, new Runnable() { + conf.app().jobManager().on(SysEventId.CONFIG_PREMERGE, "CsrfSetting:checkAndCommit", new Runnable() { @Override public void run() { checkAndCommit(); @@ -191,7 +188,7 @@ protected static class CorsSetting extends LogSupport { CorsSetting(AppConfigurator conf) { this.conf = conf; this.enabled = true; - conf.app().jobManager().on(SysEventId.CONFIG_PREMERGE, new Runnable() { + conf.app().jobManager().on(SysEventId.CONFIG_PREMERGE, "CorsSetting:checkAndCommit", new Runnable() { @Override public void run() { checkAndCommit(); diff --git a/src/main/java/act/conf/ConfigurationByteCodeScanner.java b/src/main/java/act/conf/ConfigurationByteCodeScanner.java index f7a4efb8c..187c7d12f 100644 --- a/src/main/java/act/conf/ConfigurationByteCodeScanner.java +++ b/src/main/java/act/conf/ConfigurationByteCodeScanner.java @@ -100,7 +100,7 @@ public void scanFinished(final String className) { } final DependencyInjector injector = app().injector(); final Map staticConfigurationFields = new HashMap<>(this.staticConfigurationFields); - app().jobManager().on(SysEventId.PRE_START, new Runnable() { + app().jobManager().on(SysEventId.PRE_START, "ConfigurationByteCodeScanner:loadIntoStaticFieldsOf:" + className, new Runnable() { @Override public void run() { Class theClass = app().classForName(className); diff --git a/src/main/java/act/controller/builtin/ThrottleFilter.java b/src/main/java/act/controller/builtin/ThrottleFilter.java index c97093619..9a4bcdc6d 100644 --- a/src/main/java/act/controller/builtin/ThrottleFilter.java +++ b/src/main/java/act/controller/builtin/ThrottleFilter.java @@ -49,7 +49,7 @@ public class ThrottleFilter { public ThrottleFilter() { final App app = Act.app(); - app.jobManager().on(SysEventId.CLASS_LOADER_INITIALIZED, new Runnable() { + app.jobManager().on(SysEventId.CLASS_LOADER_INITIALIZED, "ThrottleFilter:initCache", new Runnable() { @Override public void run() { cache = app.cache(CACHE_NAME); @@ -62,7 +62,7 @@ public ThrottleFilter(int throttle, boolean expireScale) { this.throttle = throttle; this.expireScale = expireScale; final App app = Act.app(); - app.jobManager().on(SysEventId.CLASS_LOADER_INITIALIZED, new Runnable() { + app.jobManager().on(SysEventId.CLASS_LOADER_INITIALIZED, "ThrottleFilter:initCache", new Runnable() { @Override public void run() { cache = app.cache(CACHE_NAME); diff --git a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java index 01c62b196..43788106c 100644 --- a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java +++ b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java @@ -21,9 +21,7 @@ */ import act.Act; -import act.app.App; -import act.app.AppByteCodeScannerBase; -import act.app.AppClassLoader; +import act.app.*; import act.app.event.SysEventId; import act.asm.*; import act.asm.signature.SignatureReader; @@ -34,9 +32,7 @@ import act.controller.annotation.TemplateContext; import act.controller.meta.*; import act.handler.builtin.controller.RequestHandlerProxy; -import act.route.DuplicateRouteMappingException; -import act.route.RouteSource; -import act.route.Router; +import act.route.*; import act.sys.Env; import act.sys.meta.EnvAnnotationVisitor; import act.util.*; @@ -45,13 +41,11 @@ import org.osgl.http.H; import org.osgl.mvc.annotation.With; import org.osgl.mvc.util.Binder; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.ListBuilder; -import org.osgl.util.S; +import org.osgl.util.*; import java.lang.annotation.Annotation; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; /** * New controller scanner implementation @@ -213,7 +207,7 @@ public void visitEnd() { * Note we need to schedule route registration after all app code scanned because we need the * parent context information be set on class meta info, which is done after controller scanning */ - app().jobManager().on(SysEventId.APP_CODE_SCANNED, new RouteRegister(envMatches, C.list(H.Method.GET), strings, WsEndpoint.PSEUDO_METHOD, routers, classInfo, false, $.var(false))); + app().jobManager().on(SysEventId.APP_CODE_SCANNED, "WsEndpointAnnotationVisitor:registerRoute - " + registerRouteTaskCounter.getAndIncrement(), new RouteRegister(envMatches, C.list(H.Method.GET), strings, WsEndpoint.PSEUDO_METHOD, routers, classInfo, false, $.var(false))); super.visitEnd(); } @@ -773,6 +767,7 @@ public void visitEnum(String name, String desc, String value) { } } + @Override public void visitEnd() { super.visitEnd(); @@ -792,7 +787,7 @@ public void visitEnd() { * Note we need to schedule route registration after all app code scanned because we need the * parent context information be set on class meta info, which is done after controller scanning */ - app().jobManager().on(SysEventId.APP_CODE_SCANNED, new RouteRegister(envMatched, httpMethods, paths, methodName, routers, classInfo, classInfo.isAbstract() && !isStatic, isVirtual)); + app().jobManager().on(SysEventId.APP_CODE_SCANNED, "ActionAnnotationVisitor:registerRoute-" + registerRouteTaskCounter.getAndIncrement(), new RouteRegister(envMatched, httpMethods, paths, methodName, routers, classInfo, classInfo.isAbstract() && !isStatic, isVirtual)); } } @@ -1025,4 +1020,7 @@ private void registerOnContext(String ctxPath, String action) { } } } + + private static AtomicInteger registerRouteTaskCounter = new AtomicInteger(0); + } diff --git a/src/main/java/act/controller/meta/ControllerClassMetaInfoManager.java b/src/main/java/act/controller/meta/ControllerClassMetaInfoManager.java index 172766d78..15c55d6b4 100644 --- a/src/main/java/act/controller/meta/ControllerClassMetaInfoManager.java +++ b/src/main/java/act/controller/meta/ControllerClassMetaInfoManager.java @@ -41,7 +41,7 @@ public class ControllerClassMetaInfoManager extends LogSupportedDestroyableBase @Inject public ControllerClassMetaInfoManager(App app) { - app.jobManager().on(SysEventId.APP_CODE_SCANNED, new Runnable() { + app.jobManager().on(SysEventId.APP_CODE_SCANNED, "ControllerClassMetaInfoManager:buildControllerHierarchies", new Runnable() { @Override public void run() { buildControllerHierarchies(); diff --git a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java index eeca48a2d..309c9b60e 100644 --- a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java +++ b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java @@ -126,7 +126,7 @@ void register(Class entityClass, EntityClassMetaInfo info) { registerEntityListenerAnnotation(EntityListeners.class); final MasterEntityMetaInfoRepo me = this; JobManager jobManager = app.jobManager(); - jobManager.on(SysEventId.CLASS_LOADED, new Runnable() { + jobManager.on(SysEventId.CLASS_LOADED, "MasterEntityMetaInfoRepo:findAndRegisterEntityClasses", new Runnable() { @Override public void run() { final ClassInfoRepository classRepo = app.classLoader().classInfoRepository(); @@ -146,7 +146,7 @@ public void run() { } } }); - jobManager.on(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED, new Runnable() { + jobManager.on(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED, "MasterEntityMetaInfoRepo:registerEntityMetaInfoRepo.Provider", new Runnable() { @Override public void run() { app.injector().registerNamedProvider(EntityMetaInfoRepo.class, app.getInstance(EntityMetaInfoRepo.Provider.class)); diff --git a/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java b/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java index c001404bd..a1ba0a700 100644 --- a/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java +++ b/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java @@ -65,7 +65,7 @@ public void scanFinished(String className) { JobManager jobManager = app().jobManager(); for (final SimpleEventListenerMetaInfo metaInfo : metaInfoList) { SysEventId hookOn = metaInfo.beforeAppStart() ? SysEventId.DEPENDENCY_INJECTOR_PROVISIONED : SysEventId.PRE_START; - jobManager.on(hookOn, new Runnable() { + jobManager.on(hookOn, "SimpleEventListenerByteCodeScanner:bindEventListener:" + metaInfo.jobId(), new Runnable() { @Override public void run() { for (final Object event : metaInfo.events()) { diff --git a/src/main/java/act/event/meta/SimpleEventListenerMetaInfo.java b/src/main/java/act/event/meta/SimpleEventListenerMetaInfo.java index ddd1a1ddb..faaf48ace 100644 --- a/src/main/java/act/event/meta/SimpleEventListenerMetaInfo.java +++ b/src/main/java/act/event/meta/SimpleEventListenerMetaInfo.java @@ -26,8 +26,7 @@ import act.inject.DependencyInjector; import org.osgl.$; import org.osgl.inject.BeanSpec; -import org.osgl.util.C; -import org.osgl.util.E; +import org.osgl.util.*; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -72,7 +71,7 @@ public SimpleEventListenerMetaInfo( this.isStatic = isStatic; this.beforeAppStart = beforeAppStart; SysEventId hookOn = beforeAppStart ? SysEventId.DEPENDENCY_INJECTOR_LOADED : SysEventId.DEPENDENCY_INJECTOR_PROVISIONED; - app.jobManager().on(hookOn, new Runnable() { + app.jobManager().on(hookOn, jobId(), new Runnable() { @Override public void run() { SimpleEventListenerMetaInfo.this.paramTypes = convert(paramTypes, className, methodName, $.var()); @@ -80,6 +79,15 @@ public void run() { }); } + public String jobId() { + S.Buffer buf = S.buffer("SimpleEventListenerByteCodeScanner:init:" ) + .append(className).append(".").append(methodName); + if (null != asyncMethodName) { + buf.append("|").append(asyncMethodName); + } + return buf.toString(); + } + public List events() { if (!delayedEvents.isEmpty()) { List list = new ArrayList(); diff --git a/src/main/java/act/handler/builtin/ResourceGetter.java b/src/main/java/act/handler/builtin/ResourceGetter.java index 1c252d9e8..d3162759e 100644 --- a/src/main/java/act/handler/builtin/ResourceGetter.java +++ b/src/main/java/act/handler/builtin/ResourceGetter.java @@ -27,6 +27,7 @@ import act.ActResponse; import act.app.ActionContext; import act.app.App; +import act.app.event.SysEventId; import act.conf.AppConfig; import act.controller.ParamNames; import act.handler.RequestHandler; @@ -83,7 +84,7 @@ public ResourceGetter(String base) { if (null == delegate) { this.isFolder = isFolder(this.baseUrl, path); if (!this.isFolder && "file".equals(baseUrl.getProtocol())) { - Act.jobManager().beforeAppStart(new Runnable() { + Act.jobManager().on(SysEventId.START, "ResourceGetter[" + base + "]:preloadCache", new Runnable() { @Override public void run() { preloadCache(); diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index e7219cbb6..3e5e546ac 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -122,7 +122,7 @@ public RequestHandlerProxy(final String actionMethodName, final App app) { if (app.classLoader() != null) { cache = app.config().cacheService(CACHE_NAME); } else { - app.jobManager().on(SysEventId.CLASS_LOADER_INITIALIZED, new Runnable() { + app.jobManager().on(SysEventId.CLASS_LOADER_INITIALIZED, "RequestHandlerProxy[" + actionMethodName + "]:setCache", new Runnable() { @Override public void run() { cache = app.config().cacheService(CACHE_NAME); diff --git a/src/main/java/act/inject/genie/GenieModuleScanner.java b/src/main/java/act/inject/genie/GenieModuleScanner.java index 9d59fcaf1..f6dc1f86e 100644 --- a/src/main/java/act/inject/genie/GenieModuleScanner.java +++ b/src/main/java/act/inject/genie/GenieModuleScanner.java @@ -47,7 +47,7 @@ public void visit(int version, int access, String name, String signature, String @Override public void scanFinished(final String className) { if (shouldRegister) { - app().jobManager().on(SysEventId.DEPENDENCY_INJECTOR_LOADED, new Runnable() { + app().jobManager().on(SysEventId.DEPENDENCY_INJECTOR_LOADED, "GenieModuleScanner:addModuleClass:" + className, new Runnable() { @Override public void run() { GenieInjector.addModuleClass($.classForName(className, app().classLoader())); diff --git a/src/main/java/act/job/JobAnnotationProcessor.java b/src/main/java/act/job/JobAnnotationProcessor.java index 3c8115dd2..def16a89c 100644 --- a/src/main/java/act/job/JobAnnotationProcessor.java +++ b/src/main/java/act/job/JobAnnotationProcessor.java @@ -52,7 +52,7 @@ public void register(final JobMethodMetaInfo method, final Class list = method.extendedJobMethodMetaInfoList(app()); diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 3c2a3f27c..a1888750e 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -310,9 +310,16 @@ public void cancel(String jobId) { } } + public void beforeAppStart(String jobId, final Runnable runnable) { + on(SysEventId.START, jobId, runnable); + } + public void beforeAppStart(final Runnable runnable) { on(SysEventId.START, runnable); } + public void afterAppStart(String jobId, final Runnable runnable) { + post(SysEventId.START, jobId, runnable); + } public void afterAppStart(final Runnable runnable) { post(SysEventId.START, runnable); diff --git a/src/main/java/act/job/meta/JobMethodMetaInfo.java b/src/main/java/act/job/meta/JobMethodMetaInfo.java index d97d5182b..d02523cea 100644 --- a/src/main/java/act/job/meta/JobMethodMetaInfo.java +++ b/src/main/java/act/job/meta/JobMethodMetaInfo.java @@ -36,8 +36,12 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; public class JobMethodMetaInfo extends LogSupportedDestroyableBase { + + private static final AtomicInteger jobIdCounter = new AtomicInteger(0); + private String id; private String name; private InvokeType invokeType; @@ -49,7 +53,7 @@ public class JobMethodMetaInfo extends LogSupportedDestroyableBase { public JobMethodMetaInfo(final JobClassMetaInfo clsInfo, final List paramTypes) { this.clsInfo = clsInfo; final App app = Act.app(); - app.jobManager().on(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED, new Runnable() { + app.jobManager().on(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED, "JobMethodMetaInfo:init-" + jobIdCounter.getAndIncrement(), new Runnable() { @Override public void run() { $.Var var = $.var(); diff --git a/src/main/java/act/metric/MetricMetaInfoRepo.java b/src/main/java/act/metric/MetricMetaInfoRepo.java index 8ff5ddb7b..6df30c18d 100644 --- a/src/main/java/act/metric/MetricMetaInfoRepo.java +++ b/src/main/java/act/metric/MetricMetaInfoRepo.java @@ -38,7 +38,7 @@ public class MetricMetaInfoRepo extends AppServiceBase { public MetricMetaInfoRepo(final App app) { super(app); - app.jobManager().on(SysEventId.APP_CODE_SCANNED, new Runnable() { + app.jobManager().on(SysEventId.APP_CODE_SCANNED, "MetricMetaInfoRepo:mergeFromParents", new Runnable() { @Override public void run() { mergeFromParents(app.classLoader().classInfoRepository()); diff --git a/src/main/java/act/route/RouteTableRouterBuilder.java b/src/main/java/act/route/RouteTableRouterBuilder.java index 56bb4c59d..d0fb1b260 100644 --- a/src/main/java/act/route/RouteTableRouterBuilder.java +++ b/src/main/java/act/route/RouteTableRouterBuilder.java @@ -32,6 +32,7 @@ import java.util.Iterator; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; /** * {@code RouteTableRouterBuilder} take a list of route map definition line and @@ -102,6 +103,8 @@ */ public class RouteTableRouterBuilder implements RouterBuilder { + private static AtomicInteger jobIdCounter = new AtomicInteger(0); + public static final String ROUTES_FILE = "routes.conf"; private List lines; @@ -128,7 +131,7 @@ public void build(Router router) { } catch (final RuntimeException e) { if (Act.isDev()) { final App app = router.app(); - app.jobManager().on(SysEventId.PRE_START, new Runnable() { + app.jobManager().on(SysEventId.PRE_START, "RouteTableRouterBuilder:setAppBlockIssue-" + jobIdCounter.getAndIncrement(), new Runnable() { @Override public void run() { app.setBlockIssue(e); diff --git a/src/main/java/act/util/ClassInfoRepository.java b/src/main/java/act/util/ClassInfoRepository.java index ddf1a8ba3..d69a62693 100644 --- a/src/main/java/act/util/ClassInfoRepository.java +++ b/src/main/java/act/util/ClassInfoRepository.java @@ -84,7 +84,7 @@ public Set methodsWithAnnotation(Class annoType) { } public void registerMethodAnnotationLookup(final String annotationDesc, final String classInternalName, final String methodName, final String methodDesc) { - Act.app().jobManager().on(SysEventId.CLASS_LOADED, new Runnable() { + Act.app().jobManager().on(SysEventId.CLASS_LOADED, "ClassInfoRepository:registerMethodAnnotationLookup", new Runnable() { @Override public void run() { Class annoType = AsmType.classForDesc(annotationDesc); diff --git a/src/main/java/act/util/SimpleBean.java b/src/main/java/act/util/SimpleBean.java index 5ddf26894..0ccbac465 100644 --- a/src/main/java/act/util/SimpleBean.java +++ b/src/main/java/act/util/SimpleBean.java @@ -239,7 +239,7 @@ public void visitEnd() { @Override public void visitEnd() { if (isPublicClass) { - Act.app().jobManager().on(SysEventId.APP_CODE_SCANNED, new Runnable() { + Act.app().jobManager().on(SysEventId.APP_CODE_SCANNED, "SimpleBeanByteCodeVisitor:registerToMetaInfoManager:" + className, new Runnable() { @Override public void run() { SimpleBean.MetaInfoManager metaInfoManager = Act.app().classLoader().simpleBeanInfoManager(); diff --git a/src/main/java/act/view/ImplicitVariableProvider.java b/src/main/java/act/view/ImplicitVariableProvider.java index 23fa772d6..43a2539f1 100644 --- a/src/main/java/act/view/ImplicitVariableProvider.java +++ b/src/main/java/act/view/ImplicitVariableProvider.java @@ -21,13 +21,9 @@ */ import act.Act; -import act.app.ActionContext; -import act.app.App; -import act.app.AppByteCodeScannerBase; -import act.asm.AnnotationVisitor; -import act.asm.AsmException; -import act.asm.MethodVisitor; -import act.asm.Type; +import act.app.*; +import act.app.event.SysEventId; +import act.asm.*; import act.inject.genie.GenieInjector; import act.inject.param.ParamValueLoader; import act.inject.param.ProvidedValueLoader; @@ -43,9 +39,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Method; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; /** * Plugin developer could extend this interface to inject @@ -108,7 +102,7 @@ public String toString() { private Set providers = new HashSet<>(); public TemplateVariableScanner(final App app) { - app.jobManager().beforeAppStart(new Runnable() { + app.jobManager().on(SysEventId.START, "TemplateVariableScanner:registerByteCodeScanner", new Runnable() { @Override public void run() { register(app); diff --git a/src/main/java/act/view/View.java b/src/main/java/act/view/View.java index 3760341f6..20dfc378b 100644 --- a/src/main/java/act/view/View.java +++ b/src/main/java/act/view/View.java @@ -48,7 +48,7 @@ public abstract class View extends AppServicePlugin { @Override protected void applyTo(final App app) { Act.viewManager().register(this); - app.jobManager().on(SysEventId.CLASS_LOADER_INITIALIZED, new Runnable() { + app.jobManager().on(SysEventId.CLASS_LOADER_INITIALIZED, getClass().getSimpleName() + ":init", new Runnable() { @Override public void run() { init(app); diff --git a/src/main/java/act/view/rythm/RythmTransformerScanner.java b/src/main/java/act/view/rythm/RythmTransformerScanner.java index 400c832cb..ddf4cf555 100644 --- a/src/main/java/act/view/rythm/RythmTransformerScanner.java +++ b/src/main/java/act/view/rythm/RythmTransformerScanner.java @@ -103,7 +103,7 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { public void visitEnd() { super.visitEnd(); if (found) { - app().jobManager().on(SysEventId.PRE_START, new Runnable() { + app().jobManager().on(SysEventId.PRE_START, "RythmTransformerScanner:registerTransformer:" + className, new Runnable() { @Override public void run() { RythmView rythmView = (RythmView) Act.viewManager().view(RythmView.ID); diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 799e36fcd..1d73c402b 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -101,7 +101,7 @@ public void handle(final ActionContext ctx, final NetworkDispatcher dispatcher) try { boolean updated = app.checkUpdates(false); if (updated && !app.hasBlockIssue()) { - app.jobManager().on(SysEventId.POST_START, new Runnable() { + app.jobManager().on(SysEventId.POST_START, "NetworkHandler:resumeRequestHandlingAfterHotReload", new Runnable() { @Override public void run() { handle(ctx, dispatcher); From b6f2fcc3dc23c06ff9976900ea35ee5427af0e61 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 6 Oct 2018 06:09:35 +1000 Subject: [PATCH 141/730] Test - Allow app to define url context for scenario #869 --- CHANGELOG.md | 1 + src/main/java/act/Act.java | 4 +-- src/main/java/act/app/App.java | 33 ++++++++++++------- src/main/java/act/app/AppClassLoader.java | 12 +++++-- src/main/java/act/app/DevModeClassLoader.java | 20 ++++++++--- .../app/FullStackAppBootstrapClassLoader.java | 21 ++++++++++-- .../bytecode/ControllerByteCodeScanner.java | 1 - src/main/java/act/plugin/PluginScanner.java | 3 +- src/main/java/act/test/Scenario.java | 7 +++- .../java/act/test/util/ScenarioManager.java | 9 +++++ .../src/main/java/ghissues/Gh869.java | 12 +++++++ .../src/main/resources/test/scenarios/866.yml | 2 +- .../src/main/resources/test/scenarios/869.yml | 7 ++++ 13 files changed, 106 insertions(+), 26 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh869.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/869.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 477f57e89..a37a59622 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Test - Allow app to define url context for scenario #869 * Add jobId to all built-in jobs #868 * API Doc: generate sample data for interface #867 * `PropertySpec` specification not working when return value is a list #866 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 2d51484c4..fdcd23220 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -896,8 +896,8 @@ private static void unloadConfig() { private static void loadPlugins() { LOGGER.debug("scanning plugins ..."); long ts = $.ms(); - new PluginScanner().scan(); - LOGGER.debug("plugin scanning finished in %sms", $.ms() - ts); + int count = new PluginScanner().scan(); + LOGGER.debug("%s plugin scanning finished in %sms", count, $.ms() - ts); } private static void unloadPlugins() { diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 3b91ad7d8..8a35568be 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -22,6 +22,7 @@ import static act.app.event.SysEventId.*; import static org.osgl.http.H.Method.GET; +import static org.osgl.util.S.F.endsWith; import act.Act; import act.Destroyable; @@ -106,9 +107,9 @@ public interface HotReloadListener { public enum F { ; - public static $.Predicate JAVA_SOURCE = S.F.endsWith(".java"); - public static $.Predicate JAR_FILE = S.F.endsWith(".jar"); - public static $.Predicate CONF_FILE = S.F.endsWith(".conf").or(S.F.endsWith(".properties").or(S.F.endsWith(".yaml").or(S.F.endsWith(".yml").or(S.F.endsWith(".xml"))))); + public static $.Predicate JAVA_SOURCE = endsWith(".java"); + public static $.Predicate JAR_FILE = endsWith(".jar"); + public static $.Predicate CONF_FILE = endsWith(".conf").or(endsWith(".properties").or(endsWith(".yaml").or(endsWith(".yml").or(endsWith(".xml"))))); public static $.Predicate ROUTES_FILE = $.F.eq(RouteTableRouterBuilder.ROUTES_FILE); } @@ -490,7 +491,7 @@ public void restart() { } public synchronized void setBlockIssue(Throwable e) { - logger.fatal(e, "Block issue encountered"); + fatal(e, "Block issue encountered"); if (null != blockIssue || null != blockIssueCause) { // do not overwrite previous block issue return; @@ -554,7 +555,7 @@ protected void releaseResources() { if (null == daemonRegistry) { return; } - logger.info("App shutting down ...."); + info("App shutting down ...."); for (HotReloadListener listener : hotReloadListeners) { listener.preHotReload(); } @@ -597,7 +598,7 @@ public RequestHandler blockIssueHandler() { public synchronized void refresh() { currentState = null; final long ms = $.ms(); - logger.info("App starting ...."); + info("App starting ...."); profile = null; blockIssue = null; blockIssueCause = null; @@ -738,7 +739,7 @@ public void run() { emit(STATELESS_PROVISIONED); emit(START); daemonKeeper(); - logger.info("App[%s] loaded in %sms", name(), $.ms() - ms); + info("App[%s] loaded in %sms", name(), $.ms() - ms); emit(POST_START); hasStarted = true; } @@ -1125,8 +1126,8 @@ public Object resolve(App app) { } public void emit(SysEventId sysEvent) { - if (logger.isTraceEnabled()) { - logger.trace(S.concat("emitting event: ", sysEvent.name())); + if (isTraceEnabled()) { + trace(S.concat("emitting event: ", sysEvent.name())); } currentState = sysEvent; eventEmitted().add(sysEvent); @@ -1297,7 +1298,7 @@ public void run() { try { daemon.start(); } catch (Exception e) { - logger.error(e, "Error starting daemon [%s]", daemon.id()); + error(e, "Error starting daemon [%s]", daemon.id()); } } }); @@ -1510,13 +1511,13 @@ private void loadDependencyInjector() { if (null == di) { new GenieInjector(this); } else { - logger.warn("Third party injector[%s] loaded. Please consider using Act air injection instead", di.getClass()); + warn("Third party injector[%s] loaded. Please consider using Act air injection instead", di.getClass()); } } private void loadRoutes() { loadBuiltInRoutes(); - logger.debug("loading app routing table: %s ...", appBase.getPath()); + debug("loading app routing table: %s ...", appBase.getPath()); Map> routes; if (Act.isProd()) { routes = RuntimeDirs.routes(this); @@ -1629,7 +1630,15 @@ private Logger.Level loggerLevelOf(String s) { } private void scanAppCodes() { + long ms = 0; + if (isDebugEnabled()) { + ms = $.ms(); + debug("scanning process starts ..."); + } classLoader().scan(); + if (isDebugEnabled()) { + debug("Scanning process takes " + ($.ms() - ms) + "ms"); + } } static App create(File appBase, Version version, ProjectLayout layout) { diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index ae455fba6..c74477fb7 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -250,8 +250,12 @@ protected void scan() { * due to the context is not established can be captured eventually * */ - protected void scanByteCode(Iterable classes, $.Function bytecodeProvider) { - logger.debug("start to scan bytecode ..."); + protected void scanByteCode(Collection classes, $.Function bytecodeProvider) { + long ms = 0; + if (logger.isDebugEnabled()) { + ms = $.ms(); + logger.debug("Bytecode scanning starts on %s classes ...", classes.size()); + } final AppCodeScannerManager scannerManager = app().scannerManager(); Map> dependencies = new HashMap<>(); for (String className : classes) { @@ -361,6 +365,10 @@ protected void scanByteCode(Iterable classes, $.Function } timer.stop(); } + + if (logger.isDebugEnabled()) { + logger.debug("Bytecode scanning takes: " + ($.ms() - ms) + "ms"); + } } protected void preload() { diff --git a/src/main/java/act/app/DevModeClassLoader.java b/src/main/java/act/app/DevModeClassLoader.java index e861a6c34..af1496bcd 100644 --- a/src/main/java/act/app/DevModeClassLoader.java +++ b/src/main/java/act/app/DevModeClassLoader.java @@ -200,8 +200,16 @@ private void preloadSource(List sourceRoot, String className) { } private void compileSources() { - logger.debug("start to compile sources ..."); - compiler.compile(sources.values()); + long l = 0; + if (logger.isDebugEnabled()) { + logger.debug("Source compiling starts ..."); + l = $.ms(); + } + Collection toBeCompiled = sources.values(); + compiler.compile(toBeCompiled); + if (logger.isDebugEnabled()) { + logger.debug("Source compiling takes %sms to compile %s sources", $.ms() - l, toBeCompiled.size()); + } } private void scanSources() { @@ -219,7 +227,7 @@ private void scanSources() { } else { for (String className : sources.keySet()) { classesNeedByteCodeScan.add(className); - logger.debug("scanning %s ...", className); + logger.trace("scanning %s ...", className); List l = new ArrayList<>(); for (AppSourceCodeScanner scanner : scanners) { if (scanner.start(className)) { @@ -261,7 +269,11 @@ public byte[] apply(String s) throws NotAppliedException, $.Break { embeddedClassNames.removeAll(embeddedClassNameCopy); } } finally { + long ns = timer.ns(); timer.stop(); + if (logger.isDebugEnabled()) { + logger.debug("it takes %sms to scan %s sources and their bytecodes", ns / (1000 * 1000), sources.size()); + } } } @@ -360,7 +372,7 @@ public void on(FsEvent... events) { } }; - private final FsEventListener confChangeListener = new ResourceChangeListener() { + private final FsEventListener confChangeListener = new DevModeClassLoader.ResourceChangeListener() { @Override public void on(FsEvent... events) { super.on(events); diff --git a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java index af37d46a1..6b6a7d70a 100644 --- a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java +++ b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java @@ -26,6 +26,8 @@ import act.boot.BootstrapClassLoader; import act.util.*; import org.osgl.$; +import org.osgl.logging.LogManager; +import org.osgl.logging.Logger; import org.osgl.util.*; import java.io.File; @@ -39,6 +41,8 @@ */ public class FullStackAppBootstrapClassLoader extends BootstrapClassLoader implements ActClassLoader { + private static final Logger LOGGER = LogManager.get(FullStackAppBootstrapClassLoader.class); + private static final String KEY_CLASSPATH = "java.class.path"; /** @@ -58,8 +62,18 @@ public class FullStackAppBootstrapClassLoader extends BootstrapClassLoader imple */ private static final String KEY_APP_JAR_IGNORE = "act.jar.app.ignore"; - private static final String DEF_JAR_IGNORE = "act-asm,antlr,ecj-,cglib,commons-,hibernate-,jline-,kryo-,logback-," + - "mongo-java-,mvel,newrelic,okio-,okhttp,pat-,proxytoys,rythm-engine,snakeyaml,undertow,xnio"; + private static final String DEF_JAR_IGNORE = "act-asm,activation-,antlr," + + "asm-,byte-buddy,byte-buddy-agent," + + "cdi-api,cglib,commons-,core-,curvesapi," + + "debugger-agent,ecj-,guava-,hibernate-," + + "idea_rt,image4j-," + + "jansi-,javase-,javaparser,javax.,jboss-,jcl-,jcommander-," + + "jfiglet,jline-,jsoup-,jxls-,joda-,kryo-,logback-," + + "mail-,mongo-,mvel,newrelic," + + "okio-,okhttp,org.apache.," + + "pat-,patchca,poi-,proxytoys," + + "reflectasm-,rythm-engine," + + "slf4j-,snakeyaml,stax-,undertow-,xmlbeans-,xnio"; private final Class PLUGIN_CLASS; @@ -83,6 +97,9 @@ public List> pluginClasses() { restoreClassInfoRegistry(); restorePluginClasses(); if (classInfoRepository.isEmpty()) { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("classInfoRegistry not recovered, start searching through libBC (with total %s classes)", libBCSize()); + } for (String className : C.list(libBC.keySet())) { try { Class c = loadClass(className, true); diff --git a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java index 43788106c..88a1eed63 100644 --- a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java +++ b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java @@ -109,7 +109,6 @@ private void checkMethodName(String methodName) { @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - logger.trace("Scanning %s", name); classInfo.className(name); String className = name.replace('/', '.'); if (router.possibleController(className)) { diff --git a/src/main/java/act/plugin/PluginScanner.java b/src/main/java/act/plugin/PluginScanner.java index c12aaad85..ee14329b2 100644 --- a/src/main/java/act/plugin/PluginScanner.java +++ b/src/main/java/act/plugin/PluginScanner.java @@ -40,7 +40,7 @@ public class PluginScanner { public PluginScanner() { } - public void scan() { + public int scan() { Plugin.InfoRepo.clear(); List> pluginClasses = Act.pluginClasses(); int sz = pluginClasses.size(); @@ -54,6 +54,7 @@ public void scan() { logger.warn(e, "failed to register plugin: %s", c); } } + return sz; } public void unload() { diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 8f33b2c4f..84eea782b 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -110,7 +110,11 @@ private class RequestBuilder { builder.addHeader(headerName, headerVal); } } - String url = S.concat("http://localhost:", port, S.ensure(processStringSubstitution(requestSpec.url)).startWith("/")); + String reqUrl = requestSpec.url; + if (S.notBlank(urlContext) && !reqUrl.startsWith("/")) { + reqUrl = S.pathConcat(urlContext, '/', reqUrl); + } + String url = S.concat("http://localhost:", port, S.ensure(processStringSubstitution(reqUrl)).startWith("/")); boolean hasParams = !requestSpec.params.isEmpty(); if (hasParams) { processParamSubstitution(requestSpec.params); @@ -243,6 +247,7 @@ private String verifyJsonBody(Object jsonBody) { public String errorMessage; public Throwable cause; public boolean clearFixtures = true; + public String urlContext; $.Var lastData = $.var(); $.Var lastHeaders = $.var(); diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index 9a1faea8d..c8b4bdbd2 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -24,6 +24,7 @@ import act.app.App; import act.app.DaoLocator; import act.app.RuntimeDirs; +import act.conf.AppConfig; import act.test.Scenario; import org.osgl.$; import org.osgl.util.C; @@ -47,6 +48,8 @@ public class ScenarioManager extends YamlLoader { private Map store = new LinkedHashMap<>(); + private String urlContext; + public ScenarioManager() { super("act.test"); setFixtureFolder("/test"); @@ -84,6 +87,8 @@ private void configure() { if (null == app) { return; } + AppConfig config = app.config(); + urlContext = config.get("test.urlContext"); } private void loadDefault() { @@ -180,10 +185,14 @@ private boolean isScenarioFile(String name) { private void parseOne(String content) { Map map = parse(content, NULL_DAO); Map loaded = $.cast(map); + boolean hasDefaultUrlContext = S.notBlank(urlContext); for (Map.Entry entry : loaded.entrySet()) { String key = entry.getKey(); Scenario scenario = entry.getValue(); scenario.name = key; + if (hasDefaultUrlContext && S.isBlank(scenario.urlContext)) { + scenario.urlContext = this.urlContext; + } this.store.put(Keyword.of(key), scenario); } } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh869.java b/testapps/GHIssues/src/main/java/ghissues/Gh869.java new file mode 100644 index 000000000..546910e6e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh869.java @@ -0,0 +1,12 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("api/v1/869") +public class Gh869 extends BaseController { + + @GetAction + public void test() {} + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/866.yml b/testapps/GHIssues/src/main/resources/test/scenarios/866.yml index 6443ed2ac..954203fca 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/866.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/866.yml @@ -1,5 +1,5 @@ Scenario(GH866): - description: "[8466] `PropertySpec` specification not working when return value is a list" + description: "[866] `PropertySpec` specification not working when return value is a list" interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/869.yml b/testapps/GHIssues/src/main/resources/test/scenarios/869.yml new file mode 100644 index 000000000..e7e459794 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/869.yml @@ -0,0 +1,7 @@ +Scenario(GH869): + urlContext: /api/v1 + description: "[869] Test - Allow app to define url context for scenario #869" + interactions: + - description: test + request: + get: 869 From 40ca074670db9dc6de12f1840b04456fa3e5d37a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 6 Oct 2018 06:34:47 +1000 Subject: [PATCH 142/730] Act not return application/json as default when exception #870 --- CHANGELOG.md | 1 + src/main/java/act/util/ActErrorPageRender.java | 2 +- .../GHIssues/src/main/java/ghissues/Gh870.java | 15 +++++++++++++++ .../src/main/resources/test/scenarios/870.yml | 11 +++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh870.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/870.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index a37a59622..624200222 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Act not return application/json as default when exception #870 * Test - Allow app to define url context for scenario #869 * Add jobId to all built-in jobs #868 * API Doc: generate sample data for interface #867 diff --git a/src/main/java/act/util/ActErrorPageRender.java b/src/main/java/act/util/ActErrorPageRender.java index 4844458e4..6c345ac65 100644 --- a/src/main/java/act/util/ActErrorPageRender.java +++ b/src/main/java/act/util/ActErrorPageRender.java @@ -108,7 +108,7 @@ protected String renderTemplate(ErrorResult error, H.Format format) { private void fixRequestAcceptFormat(ActionContext context) { H.Request req = context.req(); if (null != req && !isAcceptGoodForErrorPage(req.accept())) { - req.accept(H.Format.HTML); + req.accept(H.Format.JSON); } } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh870.java b/testapps/GHIssues/src/main/java/ghissues/Gh870.java new file mode 100644 index 000000000..d86a0c909 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh870.java @@ -0,0 +1,15 @@ +package ghissues; + +import act.controller.Controller; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("870") +public class Gh870 extends BaseController { + + @GetAction + public void test() { + Controller.Util.badRequest(101, "missing key"); + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/870.yml b/testapps/GHIssues/src/main/resources/test/scenarios/870.yml new file mode 100644 index 000000000..4dc51324c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/870.yml @@ -0,0 +1,11 @@ +Scenario(GH870): + description: "[870] Act not return application/json as default when exception" + interactions: + - description: test + request: + get: 870 + response: + status: 400 + json: + code: 101 + message: missing key From 6889511187a7da1694f4b9b52256a8c6294c8108 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 6 Oct 2018 06:38:45 +1000 Subject: [PATCH 143/730] #870 - minor tune in ActErrorPageRender.fixRequestAcceptFormat --- src/main/java/act/util/ActErrorPageRender.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/act/util/ActErrorPageRender.java b/src/main/java/act/util/ActErrorPageRender.java index 6c345ac65..f67356229 100644 --- a/src/main/java/act/util/ActErrorPageRender.java +++ b/src/main/java/act/util/ActErrorPageRender.java @@ -113,8 +113,7 @@ private void fixRequestAcceptFormat(ActionContext context) { } private boolean isAcceptGoodForErrorPage(H.Format fmt) { - return (null == fmt || - HTML == fmt + return (HTML == fmt || CSV == fmt || H.Format.JSON == fmt || XML == fmt); From 77460daf86f3e9a44eea65df3bf77765769a8328 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 6 Oct 2018 09:06:23 +1000 Subject: [PATCH 144/730] #869 - allow concatenate configured urlContext and scenario urlContext if later is not an absolute path --- src/main/java/act/test/util/ScenarioManager.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index c8b4bdbd2..907d9d642 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -190,8 +190,12 @@ private void parseOne(String content) { String key = entry.getKey(); Scenario scenario = entry.getValue(); scenario.name = key; - if (hasDefaultUrlContext && S.isBlank(scenario.urlContext)) { - scenario.urlContext = this.urlContext; + if (hasDefaultUrlContext) { + if (S.isBlank(scenario.urlContext)) { + scenario.urlContext = this.urlContext; + } else if (!scenario.urlContext.startsWith("/")) { + scenario.urlContext = S.pathConcat(this.urlContext, '/', scenario.urlContext); + } } this.store.put(Keyword.of(key), scenario); } From 6080eb3877e78565b06b0cf5329da7fa02a8aaa1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 8 Oct 2018 08:58:41 +1100 Subject: [PATCH 145/730] fix #871 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 2 +- src/main/java/act/test/Scenario.java | 12 +++++++ src/main/java/act/test/Test.java | 2 +- .../src/main/java/ghissues/Gh871.java | 36 +++++++++++++++++++ .../src/main/resources/test/scenarios/871.yml | 15 ++++++++ 6 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh871.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/871.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 624200222..23b13fe55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Test: evaluation complex expression refer to cached object issue #871 * Act not return application/json as default when exception #870 * Test - Allow app to define url context for scenario #869 * Add jobId to all built-in jobs #868 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 0eade8681..782b0baa7 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -759,7 +759,7 @@ private Map bodyParams() { if (null == bodyParams) { Map map = new HashMap<>(); H.Method method = request.method(); - if (H.Method.POST == method || H.Method.PUT == method || H.Method.PATCH == method) { + if (H.Method.POST == method || H.Method.PUT == method || H.Method.PATCH == method || H.Method.DELETE == method) { RequestBodyParser parser = RequestBodyParser.get(request); map = parser.parse(this); } diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 84eea782b..fe4bd67b5 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -323,6 +323,7 @@ private Object eval(String expr) { } String key = S.underscore(expr); Object o = constants.get(key); + o = null == o ? cache.get(key) : o; return null == o ? Test.constant(key) : o; } @@ -925,6 +926,17 @@ private Object getVal(String key) { if (null != o) { return o; } + if (key.contains(".")) { + String firstLevel = S.cut(key).beforeFirst("."); + Object firstLevelVal = cache.get(firstLevel); + if (null != firstLevelVal) { + try { + return $.getProperty(firstLevelVal, S.cut(key).afterFirst(".")); + } catch (Exception e) { + // ignore + } + } + } key = S.underscore(key); o = constants.get(key); if (null != o) { diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 7e7595605..a946bf02b 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -248,13 +248,13 @@ public List run(App app, Keyword testId, boolean shutdownApp) { } try { scenario.start(scenarioManager, requestTemplateManager); - addToList(scenario, list, scenarioManager); } catch (Exception e) { String message = e.getMessage(); scenario.errorMessage = S.blank(message) ? e.getClass().getName() : message; scenario.cause = e.getCause(); scenario.status = TestStatus.FAIL; } + addToList(scenario, list, scenarioManager); } } // for (Scenario scenario : scenarios.values()) { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh871.java b/testapps/GHIssues/src/main/java/ghissues/Gh871.java new file mode 100644 index 000000000..25d4bf9ce --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh871.java @@ -0,0 +1,36 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.param.NoBind; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.N; + +import javax.inject.Singleton; + +@UrlContext("871") +@Singleton +public class Gh871 extends BaseController { + + public static class Foo { + public Bar bar = new Bar(); + } + + public static class Bar { + public int id = N.randInt(); + } + + @NoBind + private Foo foo; + + @GetAction("setup") + public Foo setup() { + foo = new Foo(); + return foo; + } + + @GetAction + public Foo test() { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/871.yml b/testapps/GHIssues/src/main/resources/test/scenarios/871.yml new file mode 100644 index 000000000..cd6908ff3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/871.yml @@ -0,0 +1,15 @@ +Scenario(GH871): + description: "[871] Test: evaluation complex expression refer to cached object issue" + interactions: + - description: setup + request: + get: 871/setup + cache: + bar: bar + - description: verify + request: + get: 871 + response: + json: + bar: + id: ${bar.id} From ccb31f76df149f11439b33c0cb7b5d5507d3e1d3 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 8 Oct 2018 22:43:11 +1100 Subject: [PATCH 146/730] update logback conf for GHIssue project - for bootstrap optimization --- testapps/GHIssues/src/main/resources/logback.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/testapps/GHIssues/src/main/resources/logback.xml b/testapps/GHIssues/src/main/resources/logback.xml index 83909e662..ed365697a 100644 --- a/testapps/GHIssues/src/main/resources/logback.xml +++ b/testapps/GHIssues/src/main/resources/logback.xml @@ -5,6 +5,9 @@ + + INFO + true @@ -81,7 +84,7 @@ - + From d3216526840b1349c17167bca481e6f7cd5cb2a2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 9 Oct 2018 20:46:47 +1100 Subject: [PATCH 147/730] Optimize app code start in dev mode #872 --- CHANGELOG.md | 1 + src/main/java/act/Act.java | 60 ++++++++-- src/main/java/act/app/App.java | 91 ++++++++++----- src/main/java/act/app/CliServer.java | 20 +--- src/main/java/act/conf/AppConfig.java | 2 + .../controller/captcha/CaptchaService.java | 5 +- .../java/act/internal/util/AppDescriptor.java | 5 + src/main/java/act/xio/Network.java | 2 + src/main/java/act/xio/NetworkBase.java | 3 +- .../act/xio/undertow/UndertowNetwork.java | 2 +- testapps/GHIssues/pom.xml | 2 +- .../src/main/java/ghissues/Gh857.java | 108 +++++++++--------- .../GHIssues/src/main/resources/logback.xml | 2 +- 13 files changed, 189 insertions(+), 114 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23b13fe55..7b6042241 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Optimize app code start in dev mode #872 * Test: evaluation complex expression refer to cached object issue #871 * Act not return application/json as default when exception #870 * Test - Allow app to define url context for scenario #869 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index fdcd23220..c8ce9c17a 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -299,6 +299,7 @@ public static T registeredPlugin(Class type) { } public static void startup(AppDescriptor descriptor) { + long start = descriptor.getStart(); processEnvironment(descriptor); Banner.print(descriptor); registerTypeConverters(); @@ -312,26 +313,35 @@ public static void startup(AppDescriptor descriptor) { initAppCodeScannerPluginManager(); loadPlugins(); enhancerManager().registered(); // so it can order the enhancers - initNetworkLayer(); + NetworkBootupThread nbt = initNetworkLayer(); initApplicationManager(); LOGGER.info("loading application(s) ..."); appManager.loadSingleApp(descriptor); - startNetworkLayer(); + startNetworkLayer(nbt); Thread.currentThread().setContextClassLoader(Act.class.getClassLoader()); App app = app(); if (null == app) { shutdownNetworkLayer(); throw new UnexpectedException("App not found. Please make sure your app start directory is correct"); } - writePidFile(); int port = httpPort(); String urlContext = appConfig().urlContext(); + CliServer cliServer = app.cliServer(); + if (null != cliServer) { + cliServer.logStart(); + } if (null == urlContext) { - LOGGER.info("app is ready at: http://%s:%s", getLocalIpAddr(), port); + LOGGER.info("app is ready in %sms at: http://%s:%s\n\n", $.ms() - start, getLocalIpAddr(), port); } else { - LOGGER.info("app is ready at: http://%s:%s%s", getLocalIpAddr(), port, urlContext); + LOGGER.info("app is ready in %sms at: http://%s:%s%s\n\n", $.ms() - start, getLocalIpAddr(), port, urlContext); } - emit(SysEventId.ACT_START); + writePidFile(); + app.jobManager().post(SysEventId.POST_START, new Runnable() { + @Override + public void run() { + emit(SysEventId.ACT_START); + } + }, true); } public static void shutdown(final App app) { @@ -988,9 +998,31 @@ private static void destroyEnhancerManager() { } } - private static void initNetworkLayer() { + private static class NetworkBootupThread extends Thread { + + Network network; + RuntimeException exception; + + public NetworkBootupThread(Network network) { + this.network = network; + } + + @Override + public void run() { + try { + network.bootUp(); + } catch (RuntimeException e) { + exception = e; + } + } + } + + private static NetworkBootupThread initNetworkLayer() { LOGGER.debug("initializing network layer ..."); network = new UndertowNetwork(); + NetworkBootupThread nbt = new NetworkBootupThread(network); + nbt.start(); + return nbt; } private static void destroyNetworkLayer() { @@ -1000,11 +1032,20 @@ private static void destroyNetworkLayer() { } } - private static void startNetworkLayer() { + private static void startNetworkLayer(NetworkBootupThread nbt) { if (network.isDestroyed()) { return; } LOGGER.debug("starting network layer ..."); + try { + nbt.join(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new UnexpectedException(e); + } + if (null != nbt.exception) { + throw nbt.exception; + } network.start(); } @@ -1033,7 +1074,6 @@ private static Class getCallerClass() { } private static void bootstrap(AppDescriptor appDescriptor) throws Exception { - long ts = $.ms(); String profile = SysProps.get(AppConfigKey.PROFILE.key()); if (S.blank(profile)) { profile = ""; @@ -1052,7 +1092,7 @@ private static void bootstrap(AppDescriptor appDescriptor) throws Exception { Method m = actClass.getDeclaredMethod("startup", byte[].class); m.setAccessible(true); $.invokeStatic(m, appDescriptor.toByteArray()); - LOGGER.info("it takes %sms to start the app\n", $.ms() - ts); + LOGGER.debug("bootstrap application takes: %sms", $.ms() - appDescriptor.getStart()); } public static int httpPort() { diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 8a35568be..fb38a43ac 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -183,6 +183,7 @@ public String toString() { } }; private final Version version; + private boolean reloading; private List hotReloadListeners = new ArrayList<>(); private PrincipalProvider principalProvider = PrincipalProvider.DefaultPrincipalProvider.INSTANCE; @@ -391,6 +392,10 @@ public CliDispatcher cliDispatcher() { return cliDispatcher; } + public CliServer cliServer() { + return cliServer; + } + public CaptchaManager captchaManager() { return captchaManager; } @@ -535,6 +540,10 @@ public boolean wasStarted() { return hasStarted; } + public boolean hotReloading() { + return hasStarted; + } + public boolean isMainThread() { return Thread.currentThread() == mainThread; } @@ -547,6 +556,7 @@ public void shutdown(int exitCode) { Act.shutdown(this, exitCode); } + @Override protected void releaseResources() { // shall not interrupt main thread @@ -705,49 +715,68 @@ public synchronized void refresh() { if (null == blockIssue && null == blockIssueCause) { try { - initJsonDtoClassManager(); - initParamValueLoaderManager(); - initMailerConfigManager(); - - // setting context class loader here might lead to memory leaks - // and cause weird problems as class loader been set to thread - // could be switched to handling other app in ACT or still hold - // old app class loader instance after the app been refreshed - // - Thread.currentThread().setContextClassLoader(classLoader()); - - initHttpConfig(); - initViewManager(); - - // let's any emit the dependency injector loaded event - // in case some other service depend on this event. - // If any DI plugin e.g. guice has emitted this event - // already, it doesn't matter we emit the event again - // because once app event is consumed the event listeners - // are cleared - emit(DEPENDENCY_INJECTOR_PROVISIONED); - emit(SINGLETON_PROVISIONED); - registerMetricProvider(); - config().preloadConfigurations(); - initSessionManager(); - Runnable runnable = new Runnable() { + final Runnable runnable1 = new Runnable() { + @Override + public void run() { + initJsonDtoClassManager(); + initParamValueLoaderManager(); + initMailerConfigManager(); + + // setting context class loader here might lead to memory leaks + // and cause weird problems as class loader been set to thread + // could be switched to handling other app in ACT or still hold + // old app class loader instance after the app been refreshed + // - Thread.currentThread().setContextClassLoader(classLoader()); + + initHttpConfig(); + initViewManager(); + + // let's any emit the dependency injector loaded event + // in case some other service depend on this event. + // If any DI plugin e.g. guice has emitted this event + // already, it doesn't matter we emit the event again + // because once app event is consumed the event listeners + // are cleared + emit(DEPENDENCY_INJECTOR_PROVISIONED); + emit(SINGLETON_PROVISIONED); + registerMetricProvider(); + config().preloadConfigurations(); + initSessionManager(); + } + }; + if (!isDevColdStart()) { + runnable1.run(); + } + Runnable runnable2 = new Runnable() { @Override public void run() { + if (isDevColdStart()) { + runnable1.run(); + } if (null != blockIssueCause) { setBlockIssue(blockIssueCause); } emit(PRE_START); emit(STATELESS_PROVISIONED); emit(START); + if (isProd() || !wasStarted()) { + debug("App[%s] loaded in %sms", name(), $.ms() - ms); + } else { + info("App[%s] loaded in %sms", name(), $.ms() - ms); + } + hasStarted = true; daemonKeeper(); - info("App[%s] loaded in %sms", name(), $.ms() - ms); emit(POST_START); - hasStarted = true; } }; if (!dbServiceManager().hasDbService() || eventEmitted(DB_SVC_LOADED)) { - runnable.run(); + if (Act.isDev()) { + jobManager.now(runnable2); + } else { + runnable2.run(); + } } else { - jobManager().on(DB_SVC_LOADED, "App:postDbSvcLoadLogic", runnable, true); + jobManager().on(DB_SVC_LOADED, "App:postDbSvcLoadLogic", runnable2, true); } } catch (BlockIssueSignal e) { // ignore @@ -755,6 +784,10 @@ public void run() { } } + private boolean isDevColdStart() { + return Act.isDev() && !wasStarted(); + } + /** * Check if the app has block issue set * @return `true` if the app has block issue encountered during start up diff --git a/src/main/java/act/app/CliServer.java b/src/main/java/act/app/CliServer.java index 8fe96ee90..a51436818 100644 --- a/src/main/java/act/app/CliServer.java +++ b/src/main/java/act/app/CliServer.java @@ -22,22 +22,16 @@ import act.Act; import act.Destroyable; -import act.app.event.SysEventId; import act.cli.CliSession; import org.osgl.exception.ConfigurationException; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import java.io.IOException; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; +import java.net.*; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; @@ -161,12 +155,6 @@ public void run() { } } }); - app().jobManager().on(SysEventId.ACT_START, "CliServer:print-cli-start-message", new Runnable() { - @Override - public void run() { - Act.LOGGER.info("CLI server started on port: %s", port); - } - }); } catch (IOException e) { Throwable t = e.getCause(); if (null != t && t.getMessage().contains("Address already in use")) { @@ -176,6 +164,10 @@ public void run() { } } + public void logStart() { + Act.LOGGER.info("CLI server started on port: %s", port); + } + boolean running() { return running.get(); } diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index b151d1766..8269820b8 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -142,6 +142,7 @@ public AppConfig app(App app) { } public void preloadConfigurations() { + long ms = $.ms(); // ensure JWT get evaluated first to set // default value for dependency settings jwtEnabled(); @@ -202,6 +203,7 @@ public boolean test(Object o) { app().cache(key).setDefaultTTL(ttl); } } + logger.trace("Preload Config takes: %sms", $.ms() - ms); } diff --git a/src/main/java/act/controller/captcha/CaptchaService.java b/src/main/java/act/controller/captcha/CaptchaService.java index 39cf3e887..10ae91361 100644 --- a/src/main/java/act/controller/captcha/CaptchaService.java +++ b/src/main/java/act/controller/captcha/CaptchaService.java @@ -23,6 +23,7 @@ import static org.osgl.http.H.Format.JPG; import static org.osgl.http.H.Header.Names.CACHE_CONTROL; +import act.app.event.SysEventId; import act.controller.Controller; import act.controller.annotation.UrlContext; import act.controller.captcha.render.CaptchaImageRender; @@ -48,12 +49,12 @@ public class CaptchaService extends Controller.Util { @Inject private CaptchaManager pluginManager; - @SubClassFinder + @SubClassFinder(callOn = SysEventId.POST_START) public void foundSessionGenerator(CaptchaSessionGenerator generator) { pluginManager.registerGenerator(generator); } - @SubClassFinder + @SubClassFinder(callOn = SysEventId.POST_START) public void foundImageRender(CaptchaImageRender render) { pluginManager.registerImageGenerator(render); } diff --git a/src/main/java/act/internal/util/AppDescriptor.java b/src/main/java/act/internal/util/AppDescriptor.java index 380d0a62d..0d9b8f43e 100644 --- a/src/main/java/act/internal/util/AppDescriptor.java +++ b/src/main/java/act/internal/util/AppDescriptor.java @@ -39,6 +39,7 @@ public class AppDescriptor implements Serializable { private String appName; private String packageName; private Version version; + private long start = $.ms(); /** * Construct an `AppVersion` with name and version @@ -98,6 +99,10 @@ public boolean isValid() { return !version.isUnknown(); } + public long getStart() { + return this.start; + } + /** * Serialize this `AppDescriptor` and output byte array * diff --git a/src/main/java/act/xio/Network.java b/src/main/java/act/xio/Network.java index d09ed9858..c1a103cd1 100644 --- a/src/main/java/act/xio/Network.java +++ b/src/main/java/act/xio/Network.java @@ -29,6 +29,8 @@ public interface Network extends Destroyable { void register(int port, boolean secure, NetworkHandler client); + void bootUp(); + void start(); void shutdown(); diff --git a/src/main/java/act/xio/NetworkBase.java b/src/main/java/act/xio/NetworkBase.java index cb488cdf5..93e49ae17 100644 --- a/src/main/java/act/xio/NetworkBase.java +++ b/src/main/java/act/xio/NetworkBase.java @@ -65,7 +65,6 @@ public synchronized void register(int port, boolean secure, NetworkHandler clien @Override public void start() { - bootUp(); for (int port : registry.keySet()) { NetworkHandler client = registry.get(port); if (!trySetUpClient(client, port, securePorts.contains(port))) { @@ -107,7 +106,7 @@ private boolean trySetUpClient(NetworkHandler client, int port, boolean secure) protected abstract void setUpClient(NetworkHandler client, int port, boolean secure) throws IOException; - protected abstract void bootUp(); + public abstract void bootUp(); protected abstract void close(); diff --git a/src/main/java/act/xio/undertow/UndertowNetwork.java b/src/main/java/act/xio/undertow/UndertowNetwork.java index e7ae4e86c..7b6370e74 100644 --- a/src/main/java/act/xio/undertow/UndertowNetwork.java +++ b/src/main/java/act/xio/undertow/UndertowNetwork.java @@ -67,7 +67,7 @@ public class UndertowNetwork extends NetworkBase { private List> channels; @Override - protected void bootUp() { + public void bootUp() { try { xnio = Xnio.getInstance(UndertowNetwork.class.getClassLoader()); // abcdefgdgd1234566789(dddd) diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index e45929aa0..ab198f443 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.8.7-SNAPSHOT + 1.8.8.7-dld2-SNAPSHOT diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh857.java b/testapps/GHIssues/src/main/java/ghissues/Gh857.java index 3f93bba54..c3b09c54b 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh857.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh857.java @@ -1,54 +1,54 @@ -package ghissues; - -import act.annotations.Order; -import act.annotations.Sorted; -import act.controller.annotation.UrlContext; -import org.osgl.inject.annotation.TypeOf; -import org.osgl.mvc.annotation.GetAction; -import org.osgl.util.C; - -import java.util.List; - -@UrlContext("857") -public class Gh857 extends BaseController { - - public interface Service857 { - String name(); - } - - @Order(2) - public static class BarService implements Service857 { - @Override - public String name() { - return "bar"; - } - } - - @Order(11) - public static class FooService implements Service857 { - @Override - public String name() { - return "foo"; - } - - } - - @Order(3) - public static class ZooService implements Service857 { - @Override - public String name() { - return "zoo"; - } - } - - - @TypeOf - @Sorted - private List services; - - @GetAction - public List test() { - return C.list(services).map(Service857::name); - } - -} +//package ghissues; +// +//import act.annotations.Order; +//import act.annotations.Sorted; +//import act.controller.annotation.UrlContext; +//import org.osgl.inject.annotation.TypeOf; +//import org.osgl.mvc.annotation.GetAction; +//import org.osgl.util.C; +// +//import java.util.List; +// +//@UrlContext("857") +//public class Gh857 extends BaseController { +// +// public interface Service857 { +// String name(); +// } +// +// @Order(2) +// public static class BarService implements Service857 { +// @Override +// public String name() { +// return "bar"; +// } +// } +// +// @Order(11) +// public static class FooService implements Service857 { +// @Override +// public String name() { +// return "foo"; +// } +// +// } +// +// @Order(3) +// public static class ZooService implements Service857 { +// @Override +// public String name() { +// return "zoo"; +// } +// } +// +// +// @TypeOf +// @Sorted +// private List services; +// +// @GetAction +// public List test() { +// return C.list(services).map(Service857::name); +// } +// +//} diff --git a/testapps/GHIssues/src/main/resources/logback.xml b/testapps/GHIssues/src/main/resources/logback.xml index ed365697a..664022662 100644 --- a/testapps/GHIssues/src/main/resources/logback.xml +++ b/testapps/GHIssues/src/main/resources/logback.xml @@ -101,7 +101,7 @@ - +App From fe92178eacc0b399a11c2aba76ac36e20f9c3c27 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 9 Oct 2018 20:55:18 +1100 Subject: [PATCH 148/730] `EntityClassMetaInfo.mergeFromMappedSuperClasses` logic error #873 --- CHANGELOG.md | 1 + src/main/java/act/db/meta/EntityClassMetaInfo.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b6042241..4d6817792 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `EntityClassMetaInfo.mergeFromMappedSuperClasses` logic error #873 * Optimize app code start in dev mode #872 * Test: evaluation complex expression refer to cached object issue #871 * Act not return application/json as default when exception #870 diff --git a/src/main/java/act/db/meta/EntityClassMetaInfo.java b/src/main/java/act/db/meta/EntityClassMetaInfo.java index 490efd7a7..536fa12a1 100644 --- a/src/main/java/act/db/meta/EntityClassMetaInfo.java +++ b/src/main/java/act/db/meta/EntityClassMetaInfo.java @@ -126,7 +126,7 @@ public String toString() { } void mergeFromMappedSuperClasses(ClassInfoRepository classRepo, EntityMetaInfoRepo entityRepo) { - ClassNode node = classRepo.node(getClass().getName()); + ClassNode node = classRepo.node(className); ClassNode parent = node.parent(); if (null != parent) { mergeFrom(parent, entityRepo); From 8750942d3ca73179421fc05ec6327eb3785c7008 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 9 Oct 2018 23:29:36 +1100 Subject: [PATCH 149/730] Route configured for namedport not effective #874 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 29 ++++++++++++++++ .../bytecode/ControllerByteCodeScanner.java | 16 +++++++-- src/main/java/act/test/RequestSpec.java | 1 + src/main/java/act/test/Scenario.java | 8 ++++- .../ControllerByteCodeScannerTest.java | 23 +++++-------- .../src/main/resources/test/scenarios.yml | 34 +++++++++++++++++++ 7 files changed, 94 insertions(+), 18 deletions(-) create mode 100644 testapps/GH874/src/main/resources/test/scenarios.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d6817792..dfd4c25a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Route configured for namedport not effective #874 * `EntityClassMetaInfo.mergeFromMappedSuperClasses` logic error #873 * Optimize app code start in dev mode #872 * Test: evaluation complex expression refer to cached object issue #871 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index fb38a43ac..7b4bec16b 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -1206,6 +1206,35 @@ public SysEventId currentState() { return currentState; } + public boolean isRoutedActionMethod(String className, String methodName) { + if (router.isActionMethod(className, methodName)) { + return true; + } + if (!moreRouters.isEmpty()) { + for (Router routerX : moreRouters.values()) { + if (routerX.isActionMethod(className, methodName)) { + return true; + } + } + } + return false; + } + + public boolean hasMoreRouters() { + return !moreRouters.isEmpty(); + } + + public Router getRouterFor(String className, String methodName) { + if (!moreRouters.isEmpty()) { + for (Router routerX : moreRouters.values()) { + if (routerX.isActionMethod(className, methodName)) { + return routerX; + } + } + } + return router; + } + private void loadConfig() { JsonUtilConfig.configure(this); File resource = RuntimeDirs.resource(this); diff --git a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java index 88a1eed63..9667efe8a 100644 --- a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java +++ b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java @@ -157,7 +157,7 @@ public MethodVisitor visitMethod(int access, String name, String desc, String si return mv; } String className = classInfo.className(); - boolean isRoutedMethod = router.isActionMethod(className, name); + boolean isRoutedMethod = app().isRoutedActionMethod(className, name); return new ActionMethodVisitor(isRoutedMethod, mv, access, name, desc, signature, exceptions); } @@ -900,10 +900,20 @@ public void visit(String name, Object value) { private List routers() { final List routers = new ArrayList<>(); + final App app = app(); if (null == ports || ports.length == 0) { - routers.add(app().router()); + if (app().hasMoreRouters()) { + String className = classInfo.className(); + for (String methodName : methodNames) { + Router routerX = app.getRouterFor(className, methodName); + if (!routers.contains(routerX)) { + routers.add(routerX); + } + } + } else { + routers.add(app.router()); + } } else { - App app = app(); for (String portName : ports) { Router r = app.router(portName); if (null == r) { diff --git a/src/main/java/act/test/RequestSpec.java b/src/main/java/act/test/RequestSpec.java index 0f46dbc18..26424fdb2 100644 --- a/src/main/java/act/test/RequestSpec.java +++ b/src/main/java/act/test/RequestSpec.java @@ -40,6 +40,7 @@ public class RequestSpec implements InteractionPart { public String parent; public H.Method method; + public int port; public String url; // shortcut for (GET, url) pair public String get; diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index fe4bd67b5..7320fefe4 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -114,7 +114,13 @@ private class RequestBuilder { if (S.notBlank(urlContext) && !reqUrl.startsWith("/")) { reqUrl = S.pathConcat(urlContext, '/', reqUrl); } - String url = S.concat("http://localhost:", port, S.ensure(processStringSubstitution(reqUrl)).startWith("/")); + String url; + if (!reqUrl.startsWith("http")) { + int portx = 0 != requestSpec.port ? requestSpec.port : port; + url = S.concat("http://localhost:", portx, S.ensure(processStringSubstitution(reqUrl)).startWith("/")); + } else { + url = processStringSubstitution(reqUrl); + } boolean hasParams = !requestSpec.params.isEmpty(); if (hasParams) { processParamSubstitution(requestSpec.params); diff --git a/src/test/java/act/controller/bytecode/ControllerByteCodeScannerTest.java b/src/test/java/act/controller/bytecode/ControllerByteCodeScannerTest.java index 997f8393c..368c91981 100644 --- a/src/test/java/act/controller/bytecode/ControllerByteCodeScannerTest.java +++ b/src/test/java/act/controller/bytecode/ControllerByteCodeScannerTest.java @@ -20,10 +20,13 @@ * #L% */ +import static act.route.RouteSource.ACTION_ANNOTATION; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.*; +import static org.osgl.http.H.Method.*; + import act.ActTestBase; -import act.app.AppByteCodeScanner; -import act.app.AppCodeScannerManager; -import act.app.TestingAppClassLoader; +import act.app.*; import act.asm.Type; import act.controller.meta.*; import act.event.EventBus; @@ -33,15 +36,11 @@ import act.route.RouteSource; import act.util.ClassInfoRepository; import act.util.Files; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.*; import org.mockito.internal.verification.Times; import org.osgl.$; import org.osgl.http.H; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.util.*; import playground.EmailBinder; import testapp.controller.*; import testapp.model.ModelController; @@ -50,11 +49,6 @@ import java.io.File; import java.util.List; -import static act.route.RouteSource.ACTION_ANNOTATION; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.*; -import static org.osgl.http.H.Method.*; - public class ControllerByteCodeScannerTest extends ActTestBase { private ControllerClassMetaInfoManager infoSrc; @@ -117,6 +111,7 @@ public void testNotRoutedActionScan() { @Test public void testRoutedActionScan() { when(mockRouter.isActionMethod("testapp.controller.WithAppContext", "foo")).thenReturn(true); + when(mockApp.isRoutedActionMethod("testapp.controller.WithAppContext", "foo")).thenReturn(true); scan(WithAppContext.class); ActionMethodMetaInfo action = action("WithAppContext", "foo"); assertNotNull(action); diff --git a/testapps/GH874/src/main/resources/test/scenarios.yml b/testapps/GH874/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..6fb69b1f2 --- /dev/null +++ b/testapps/GH874/src/main/resources/test/scenarios.yml @@ -0,0 +1,34 @@ +Scenario: + interactions: + - description: /hello [port_a] + request: + port: 12345 + get: hello + response: + json: + result: SUCCESS + - description: /hello1 [port_a] + request: + port: 12345 + get: hello1 + response: + json: + result: SUCCESS + - description: /hello2 [port_a] + request: + port: 12345 + get: hello2 + response: + json: + result: SUCCESS + - description: /hello3 [port_a] + request: + get: hello3 + response: + json: + result: SUCCESS + - description: /hello4 [port_a] + request: + get: hello4 + response: + text: 哈哈哈 输出 Hello World From af75541960315e97dd69dcd4b0bad00601012c49 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 9 Oct 2018 23:32:57 +1100 Subject: [PATCH 150/730] add test project to GH874 --- testapps/GH874/.gitignore | 19 +++++++++++++ testapps/GH874/pom.xml | 28 +++++++++++++++++++ .../controller/HelloScanController.java | 13 +++++++++ .../java/liusheng/main/HelloController.java | 26 +++++++++++++++++ .../src/main/java/liusheng/main/Main.java | 10 +++++++ .../GH874/src/main/resources/1.properties | 2 ++ testapps/GH874/src/main/resources/routes.conf | 1 + .../src/main/resources/routes.port_a.conf | 2 ++ 8 files changed, 101 insertions(+) create mode 100644 testapps/GH874/.gitignore create mode 100644 testapps/GH874/pom.xml create mode 100644 testapps/GH874/src/main/java/liusheng/controller/HelloScanController.java create mode 100644 testapps/GH874/src/main/java/liusheng/main/HelloController.java create mode 100644 testapps/GH874/src/main/java/liusheng/main/Main.java create mode 100644 testapps/GH874/src/main/resources/1.properties create mode 100644 testapps/GH874/src/main/resources/routes.conf create mode 100644 testapps/GH874/src/main/resources/routes.port_a.conf diff --git a/testapps/GH874/.gitignore b/testapps/GH874/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH874/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH874/pom.xml b/testapps/GH874/pom.xml new file mode 100644 index 000000000..f5034d1f3 --- /dev/null +++ b/testapps/GH874/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + act-gh874 + 1.8.8.8-SNAPSHOT + + ActFramework Github Issue #874 Reproduce App + + + org.actframework + act-starter-parent + 1.8.8.7-SNAPSHOT + + + + + 1.8 + liusheng.main.Main + + + + + + + diff --git a/testapps/GH874/src/main/java/liusheng/controller/HelloScanController.java b/testapps/GH874/src/main/java/liusheng/controller/HelloScanController.java new file mode 100644 index 000000000..1b2a8cc7c --- /dev/null +++ b/testapps/GH874/src/main/java/liusheng/controller/HelloScanController.java @@ -0,0 +1,13 @@ +package liusheng.controller; + +import act.controller.annotation.Port; +import org.osgl.mvc.annotation.GetAction; + +@Port({"port_a"}) +public class HelloScanController { + @GetAction("/hello") + public String hello5() { + + return "SUCCESS"; + } +} diff --git a/testapps/GH874/src/main/java/liusheng/main/HelloController.java b/testapps/GH874/src/main/java/liusheng/main/HelloController.java new file mode 100644 index 000000000..478391cfc --- /dev/null +++ b/testapps/GH874/src/main/java/liusheng/main/HelloController.java @@ -0,0 +1,26 @@ +package liusheng.main; + +import act.controller.Controller; +import org.osgl.mvc.annotation.GetAction; + +public class HelloController { + + public String hello1() { + return "SUCCESS"; + } + public String hello2() { + return "SUCCESS"; + } + + @GetAction("/hello3") + public String hello3() { + return "SUCCESS"; + } + + public void hello4() { + Controller.Util.renderText("哈哈哈 输出 %s","Hello World"); + + } + + +} diff --git a/testapps/GH874/src/main/java/liusheng/main/Main.java b/testapps/GH874/src/main/java/liusheng/main/Main.java new file mode 100644 index 000000000..868729932 --- /dev/null +++ b/testapps/GH874/src/main/java/liusheng/main/Main.java @@ -0,0 +1,10 @@ +package liusheng.main; + +import act.Act; + +public class Main { + + public static void main(String[] args) throws Exception{ + Act.start("Hello World"); + } +} diff --git a/testapps/GH874/src/main/resources/1.properties b/testapps/GH874/src/main/resources/1.properties new file mode 100644 index 000000000..9e70435cb --- /dev/null +++ b/testapps/GH874/src/main/resources/1.properties @@ -0,0 +1,2 @@ +namedPorts=port_a:12345;port_b:8888 +scan_package=liusheng diff --git a/testapps/GH874/src/main/resources/routes.conf b/testapps/GH874/src/main/resources/routes.conf new file mode 100644 index 000000000..79155479a --- /dev/null +++ b/testapps/GH874/src/main/resources/routes.conf @@ -0,0 +1 @@ +GET /hello4 liusheng.main.HelloController.hello4 \ No newline at end of file diff --git a/testapps/GH874/src/main/resources/routes.port_a.conf b/testapps/GH874/src/main/resources/routes.port_a.conf new file mode 100644 index 000000000..2170daaf4 --- /dev/null +++ b/testapps/GH874/src/main/resources/routes.port_a.conf @@ -0,0 +1,2 @@ +GET /hello1 liusheng.main.HelloController.hello1 +GET /hello2 liusheng.main.HelloController.hello2 \ No newline at end of file From 73937d3bb64b6c132efc7111736a91cb76b18810 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 10 Oct 2018 23:59:27 +1100 Subject: [PATCH 151/730] fix #876 and #875 --- CHANGELOG.md | 2 ++ src/main/java/act/RequestImplBase.java | 2 +- src/main/java/act/app/App.java | 17 ++++------ .../event/AppDependencyInjectorPreLoad.java | 32 +++++++++++++++++++ src/main/java/act/app/event/SysEventId.java | 5 +++ src/main/java/act/conf/AppConfigKey.java | 2 +- .../act/inject/DependencyInjectorBase.java | 2 +- .../java/act/inject/genie/GenieInjector.java | 9 +++++- .../act/inject/genie/GenieModuleScanner.java | 2 +- src/main/java/act/test/RequestSpec.java | 11 ++++--- src/main/java/act/test/func/Func.java | 16 ++++++++++ .../java/act/conf/AutoConfigPluginTest.java | 1 + 12 files changed, 82 insertions(+), 19 deletions(-) create mode 100644 src/main/java/act/app/event/AppDependencyInjectorPreLoad.java diff --git a/CHANGELOG.md b/CHANGELOG.md index dfd4c25a4..061e798b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Test: add $now() and $today() function #876 +* Intermittent ACT start failure in `GenieModuleScanner` #875 * Route configured for namedport not effective #874 * `EntityClassMetaInfo.mergeFromMappedSuperClasses` logic error #873 * Optimize app code start in dev mode #872 diff --git a/src/main/java/act/RequestImplBase.java b/src/main/java/act/RequestImplBase.java index 6dd8185b4..0b42f68eb 100644 --- a/src/main/java/act/RequestImplBase.java +++ b/src/main/java/act/RequestImplBase.java @@ -68,7 +68,7 @@ public H.Method method() { // check the method overload String s = header(H.Header.Names.X_HTTP_METHOD_OVERRIDE); if (S.blank(s)) { - s = paramVal("_method"); // Spring use this + s = paramVal("_method"); // Spring convention } if (S.notBlank(s)) { method = H.Method.valueOfIgnoreCase(s); diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 7b4bec16b..659130ad4 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -139,7 +139,7 @@ public enum F { private SingletonRegistry singletonRegistry; private BinderManager binderManager; private AppInterceptorManager interceptorManager; - private DependencyInjector dependencyInjector; + private GenieInjector dependencyInjector; private HttpClientService httpClientService; private UploadFileStorageService uploadFileStorageService; private AppServiceRegistry appServiceRegistry; @@ -708,6 +708,8 @@ public synchronized void refresh() { try { loadDependencyInjector(); + emit(DEPENDENCY_INJECTOR_PRELOAD); + dependencyInjector.unlock(); emit(DEPENDENCY_INJECTOR_LOADED); } catch (BlockIssueSignal e) { return; @@ -762,7 +764,7 @@ public void run() { if (isProd() || !wasStarted()) { debug("App[%s] loaded in %sms", name(), $.ms() - ms); } else { - info("App[%s] loaded in %sms", name(), $.ms() - ms); + info("App[%s] reloaded in %sms\n\n", name(), $.ms() - ms); } hasStarted = true; daemonKeeper(); @@ -971,11 +973,11 @@ public MetricMetaInfoRepo metricMetaInfoRepo() { return metricMetaInfoRepo; } + @Deprecated public App injector(DI dependencyInjector) { E.NPE(dependencyInjector); E.illegalStateIf(null != this.dependencyInjector, "Dependency injection factory already set"); - this.dependencyInjector = dependencyInjector; - return this; + throw E.unsupport(); } public DI injector() { @@ -1569,12 +1571,7 @@ private void loadBuiltInScanners() { } private void loadDependencyInjector() { - DependencyInjector di = injector(); - if (null == di) { - new GenieInjector(this); - } else { - warn("Third party injector[%s] loaded. Please consider using Act air injection instead", di.getClass()); - } + dependencyInjector = new GenieInjector(this); } private void loadRoutes() { diff --git a/src/main/java/act/app/event/AppDependencyInjectorPreLoad.java b/src/main/java/act/app/event/AppDependencyInjectorPreLoad.java new file mode 100644 index 000000000..7db1cf67a --- /dev/null +++ b/src/main/java/act/app/event/AppDependencyInjectorPreLoad.java @@ -0,0 +1,32 @@ +package act.app.event; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.App; + +/** + * Emitted immediately when {@link App}'s dependency injector is loaded + */ +public class AppDependencyInjectorPreLoad extends SysEvent { + public AppDependencyInjectorPreLoad(App source) { + super(SysEventId.DEPENDENCY_INJECTOR_PRELOAD, source); + } +} diff --git a/src/main/java/act/app/event/SysEventId.java b/src/main/java/act/app/event/SysEventId.java index f26be53b4..73156a1ad 100644 --- a/src/main/java/act/app/event/SysEventId.java +++ b/src/main/java/act/app/event/SysEventId.java @@ -81,6 +81,11 @@ public SysEvent of(App app) { public SysEvent of(App app) { return new AppRouterLoaded(app); } + }, DEPENDENCY_INJECTOR_PRELOAD { + @Override + public SysEvent of(App app) { + return new AppDependencyInjectorPreLoad(app); + } }, DEPENDENCY_INJECTOR_LOADED { @Override public SysEvent of(App app) { diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 723e0082d..3bbb7267d 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -1040,7 +1040,7 @@ public T val(Map configuration) { SESSION_PERSISTENT_ENABLED("session.persistent.enabled"), /** - * `session.encrypted.enabled` specify whether the system should + * `session.encrypt.enabled` specify whether the system should * encrypt the key/value pairs in the session cookie. Enable session * encryption will greatly improve the security but with the cost * of additional CPU usage and a little bit longer time on request diff --git a/src/main/java/act/inject/DependencyInjectorBase.java b/src/main/java/act/inject/DependencyInjectorBase.java index 2eda23653..d5e018d2b 100644 --- a/src/main/java/act/inject/DependencyInjectorBase.java +++ b/src/main/java/act/inject/DependencyInjectorBase.java @@ -42,7 +42,7 @@ public abstract class DependencyInjectorBase> listeners = new HashMap<>(); public DependencyInjectorBase(App app) { - this(app, false); + this(app, true); } protected DependencyInjectorBase(App app, boolean noRegister) { diff --git a/src/main/java/act/inject/genie/GenieInjector.java b/src/main/java/act/inject/genie/GenieInjector.java index 0a82b4df7..005df4265 100644 --- a/src/main/java/act/inject/genie/GenieInjector.java +++ b/src/main/java/act/inject/genie/GenieInjector.java @@ -62,12 +62,18 @@ protected void configure() { private volatile Genie genie; private Set modules; private Set> injectTags = new HashSet>(); + private boolean locked; public GenieInjector(App app) { - super(app); + super(app, true); modules = new LinkedHashSet<>(); modules.add(SCOPE_MODULE); modules.addAll(factories()); + this.locked = true; + } + + public synchronized void unlock() { + locked = false; } @Override @@ -183,6 +189,7 @@ private Set factories() { public Genie genie() { if (null == genie) { synchronized (this) { + E.illegalStateIf(locked, "Injector locked"); if (null == genie) { InjectListener listener = new GenieListener(this); genie = Genie.create(listener, modules.toArray(new Object[modules.size()])); diff --git a/src/main/java/act/inject/genie/GenieModuleScanner.java b/src/main/java/act/inject/genie/GenieModuleScanner.java index f6dc1f86e..8d55a7976 100644 --- a/src/main/java/act/inject/genie/GenieModuleScanner.java +++ b/src/main/java/act/inject/genie/GenieModuleScanner.java @@ -47,7 +47,7 @@ public void visit(int version, int access, String name, String signature, String @Override public void scanFinished(final String className) { if (shouldRegister) { - app().jobManager().on(SysEventId.DEPENDENCY_INJECTOR_LOADED, "GenieModuleScanner:addModuleClass:" + className, new Runnable() { + app().jobManager().on(SysEventId.DEPENDENCY_INJECTOR_PRELOAD, "GenieModuleScanner:addModuleClass:" + className, new Runnable() { @Override public void run() { GenieInjector.addModuleClass($.classForName(className, app().classLoader())); diff --git a/src/main/java/act/test/RequestSpec.java b/src/main/java/act/test/RequestSpec.java index 26424fdb2..004037a63 100644 --- a/src/main/java/act/test/RequestSpec.java +++ b/src/main/java/act/test/RequestSpec.java @@ -93,21 +93,24 @@ public void validate(Interaction interaction) throws UnexpectedException { if (S.notBlank(email)) { return; } - if (S.notBlank(get)) { + if (null != get) { method = H.Method.GET; url = get; - } else if (S.notBlank(post)) { + } else if (null != post) { method = H.Method.POST; url = post; - } else if (S.notBlank(put)) { + } else if (null != put) { method = H.Method.PUT; url = put; - } else if (S.notBlank(delete)) { + } else if (null != delete) { method = H.Method.DELETE; url = delete; } E.unexpectedIf(null == method, "method not specified in request spec of interaction[%s]", interaction); E.unexpectedIf(null == url, "url not specified in the request spec of interaction[%s]", interaction); + if (".".equals(url)) { + url = ""; + } } public void markAsResolved() { diff --git a/src/main/java/act/test/func/Func.java b/src/main/java/act/test/func/Func.java index e2899177c..082142905 100644 --- a/src/main/java/act/test/func/Func.java +++ b/src/main/java/act/test/func/Func.java @@ -23,6 +23,8 @@ import act.Act; import act.test.inbox.Inbox; import act.test.util.NamedLogic; +import org.joda.time.DateTime; +import org.joda.time.LocalDate; import org.osgl.$; import org.osgl.util.*; import org.osgl.util.converter.TypeConverterRegistry; @@ -80,6 +82,20 @@ public Object apply() { } } + public static class Today extends Func { + @Override + public Object apply() { + return LocalDate.now(); + } + } + + public static class Now extends Func { + @Override + public Object apply() { + return DateTime.now(); + } + } + public static class AfterLast extends Func { private String retVal; diff --git a/src/test/java/act/conf/AutoConfigPluginTest.java b/src/test/java/act/conf/AutoConfigPluginTest.java index 820d46a55..82072df1b 100644 --- a/src/test/java/act/conf/AutoConfigPluginTest.java +++ b/src/test/java/act/conf/AutoConfigPluginTest.java @@ -69,6 +69,7 @@ public void before() throws Exception { resolverManager = new StringValueResolverManager(mockApp); when(mockApp.resolverManager()).thenReturn(resolverManager); injector = new GenieInjector(mockApp); + injector.unlock(); when(mockApp.injector()).thenReturn(injector); GenericPluginManager pluginManager = mock(GenericPluginManager.class); From 73ea0d0c9f96d0dfd151cc30bc62f04772702b2a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 11 Oct 2018 00:27:18 +1100 Subject: [PATCH 152/730] #875 - keep fixing --- src/main/java/act/inject/genie/GenieInjector.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/act/inject/genie/GenieInjector.java b/src/main/java/act/inject/genie/GenieInjector.java index 005df4265..5b1f2b37c 100644 --- a/src/main/java/act/inject/genie/GenieInjector.java +++ b/src/main/java/act/inject/genie/GenieInjector.java @@ -242,12 +242,12 @@ public Genie get() { return genie; } - @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_LOADED) + @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_PRELOAD) public static void foundModule(Class moduleClass) { addModuleClass(moduleClass); } - @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_LOADED) + @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_PRELOAD) public static void foundConfigurator(Class configurator) { addModuleClass(configurator); } @@ -318,7 +318,7 @@ public void visit(ClassNode classNode) throws $.Break { } } - @AnnotatedClassFinder(value = ModuleTag.class, callOn = SysEventId.DEPENDENCY_INJECTOR_LOADED, noAbstract = false) + @AnnotatedClassFinder(value = ModuleTag.class, callOn = SysEventId.DEPENDENCY_INJECTOR_PRELOAD, noAbstract = false) public static void foundTaggedModule(Class taggedModuleClass) { addModuleClass(taggedModuleClass); } From 98a39421f3be7bd4b22d3550006b44ba4053d8c5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 11 Oct 2018 08:56:57 +1100 Subject: [PATCH 153/730] #876 - add tomorrow, nextMinute, nextHour, GetTime --- src/main/java/act/test/func/Func.java | 99 +++++++++++++++++++ .../act/test/verifier/DateTimeVerifier.java | 6 +- src/test/java/act/test/util/FuncTest.java | 48 +++++++++ src/test/java/act/test/util/GetTimeTest.java | 85 ++++++++++++++++ 4 files changed, 235 insertions(+), 3 deletions(-) create mode 100644 src/test/java/act/test/util/GetTimeTest.java diff --git a/src/main/java/act/test/func/Func.java b/src/main/java/act/test/func/Func.java index 082142905..83d30ec4c 100644 --- a/src/main/java/act/test/func/Func.java +++ b/src/main/java/act/test/func/Func.java @@ -23,11 +23,13 @@ import act.Act; import act.test.inbox.Inbox; import act.test.util.NamedLogic; +import act.test.verifier.DateTimeVerifier; import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.osgl.$; import org.osgl.util.*; import org.osgl.util.converter.TypeConverterRegistry; +import org.rythmengine.utils.Time; import java.lang.reflect.Array; import java.util.Collection; @@ -89,6 +91,89 @@ public Object apply() { } } + public static class Tomorrow extends Func { + @Override + public Object apply() { + return LocalDate.now().plusDays(1); + } + } + + public static class GetTime extends Func { + + private Integer deltaInSeconds; + private DateTime dateTime; + + @Override + public void init(Object param) { + super.init(param); + if (param instanceof String) { + initStr((String) param); + } else if (param instanceof List) { + initList((List) param); + } + } + + private void initStr(String s) { + E.illegalArgumentIf(!tryParseDuration(s) && !tryParseDateTime(s), "Invalid GetTime argument: " + s); + } + + private void initList(List list) { + E.illegalArgumentIf(list.isEmpty()); + String first = list.get(0); + if (list.size() < 2) { + initStr(first); + return; + } + String second = list.get(1); + if (!tryParseDateTime(first)) { + if (!tryParseDuration(first)) { + throw new IllegalArgumentException("Invalid GetTime argument: " + list); + } else if (!tryParseDateTime(second)) { + throw new IllegalArgumentException("Invalid GetTime argument: " + list); + } + } else if (!tryParseDuration(second)) { + throw new IllegalArgumentException("Invalid GetTime argument: " + list); + } + } + + private boolean tryParseDuration(String s) { + boolean negative = false; + if (s.startsWith("-")) { + negative = true; + s = s.substring(1); + } else if (s.startsWith("+")) { + s = s.substring(1); + } + try { + int n = Time.parseDuration(s); + deltaInSeconds = negative ? -1 * n : n; + return true; + } catch (IllegalArgumentException e) { + return false; + } + } + + private boolean tryParseDateTime(String s) { + Long l = DateTimeVerifier.tryWithDefaultDateTimeFormats(s); + if (null == l) { + return false; + } + dateTime = new DateTime(l); + return true; + } + + @Override + public Object apply() { + DateTime now = null == dateTime ? DateTime.now() : dateTime; + if (null != deltaInSeconds) { + int delta = deltaInSeconds; + now = delta < 0 ? now.minusSeconds(-1 * delta) : now.plusSeconds(delta); + } + return now; + } + } + + public static class Now extends Func { @Override public Object apply() { @@ -96,6 +181,20 @@ public Object apply() { } } + public static class NextMinute extends Func { + @Override + public Object apply() { + return DateTime.now().plusMinutes(1); + } + } + + public static class NextHour extends Func { + @Override + public Object apply() { + return DateTime.now().plusHours(1); + } + } + public static class AfterLast extends Func { private String retVal; diff --git a/src/main/java/act/test/verifier/DateTimeVerifier.java b/src/main/java/act/test/verifier/DateTimeVerifier.java index 01c3844ee..581c50a59 100644 --- a/src/main/java/act/test/verifier/DateTimeVerifier.java +++ b/src/main/java/act/test/verifier/DateTimeVerifier.java @@ -90,7 +90,7 @@ private Long tryWithAppConfig(String s, AppConfig config) { return tryWithFormat(s, config.dateFormat()); } - private Long tryWithDefaultDateTimeFormats(String s) { + public static Long tryWithDefaultDateTimeFormats(String s) { return tryWithFormat(s, "yyyy-MM-dd hh:mm:ss", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd", "yyyyMMdd HH:mm:ss", @@ -100,7 +100,7 @@ private Long tryWithDefaultDateTimeFormats(String s) { "dd MMM yyyy"); } - private Long tryWithFormat(String s, String pattern, String... otherPatterns) { + private static Long tryWithFormat(String s, String pattern, String... otherPatterns) { Long l = tryWithFormat(s, new SimpleDateFormat(pattern)); if (null != l) { return l; @@ -114,7 +114,7 @@ private Long tryWithFormat(String s, String pattern, String... otherPatterns) { return null; } - private Long tryWithFormat(String s, DateFormat format) { + private static Long tryWithFormat(String s, DateFormat format) { try { Date date = format.parse(s); return date.getTime(); diff --git a/src/test/java/act/test/util/FuncTest.java b/src/test/java/act/test/util/FuncTest.java index e06516d2a..7004f080e 100644 --- a/src/test/java/act/test/util/FuncTest.java +++ b/src/test/java/act/test/util/FuncTest.java @@ -21,6 +21,8 @@ */ import act.test.func.Func; +import org.joda.time.DateTime; +import org.joda.time.LocalDate; import org.junit.Test; import org.osgl.util.C; import org.osgl.util.S; @@ -176,4 +178,50 @@ public void RandLongWithTwoInitVals2() { yes(i > -14); } + @Test + public void testToday() { + Func.Today func = new Func.Today(); + Object obj = func.apply(); + yes(obj instanceof LocalDate); + LocalDate funcToday = (LocalDate) obj; + eq(LocalDate.now(), funcToday); + } + + @Test + public void testTomorrow() { + Func.Tomorrow func = new Func.Tomorrow(); + Object obj = func.apply(); + yes(obj instanceof LocalDate); + LocalDate funcToday = (LocalDate) obj; + eq(LocalDate.now().plusDays(1), funcToday); + } + + @Test + public void testNow() { + Func.Now func = new Func.Now(); + Object obj = func.apply(); + yes(obj instanceof DateTime); + DateTime funcNow = (DateTime) obj; + yes((DateTime.now().getMillis() - funcNow.getMillis()) < 1000); + } + + @Test + public void testNextMinute() { + Func.NextMinute func = new Func.NextMinute(); + Object obj = func.apply(); + yes(obj instanceof DateTime); + DateTime funcNow = (DateTime) obj; + yes((DateTime.now().plusMinutes(1).getMillis() - funcNow.getMillis()) < 1000); + } + + + @Test + public void testNextHour() { + Func.NextHour func = new Func.NextHour(); + Object obj = func.apply(); + yes(obj instanceof DateTime); + DateTime funcNow = (DateTime) obj; + yes((DateTime.now().plusHours(1).getMillis() - funcNow.getMillis()) < 1000); + } + } diff --git a/src/test/java/act/test/util/GetTimeTest.java b/src/test/java/act/test/util/GetTimeTest.java new file mode 100644 index 000000000..cbbc2ce27 --- /dev/null +++ b/src/test/java/act/test/util/GetTimeTest.java @@ -0,0 +1,85 @@ +package act.test.util; + +import act.test.func.Func; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.junit.Test; +import org.osgl.util.C; +import osgl.ut.TestBase; + +public class GetTimeTest extends TestBase { + + Func.GetTime func; + DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); + + @Test + public void testDateTimeAsOneParam() { + init("1986-12-11"); + verifyDate("1986-12-11"); + + init("1/Nov/2012"); + verifyDate("2012-11-1"); + + init("1985-02-02 03:22:11"); + verifyTime("1985-02-02 03:22:11"); + + init("19940723 12:33:10"); + verifyTime("1994-07-23 12:33:10"); + } + + @Test + public void testDeltaAsOneParam() { + init("30s"); + verifyDelta(30); + + init("1min"); + verifyDelta(60); + + init("-3s"); + verifyDelta(-3); + + init("+1h"); + verifyDelta(60 * 60); + } + + @Test + public void testDeltaBeforeDate() { + init("30s", "1986-01-01 11:10:00"); + DateTime dt = fmt.parseDateTime("1986-01-01 11:10:00"); + eq(dt.plusSeconds(30), get()); + } + + @Test + public void testDetalAfterDate() { + init("1986-01-01 11:10:00", "30s"); + DateTime dt = fmt.parseDateTime("1986-01-01 11:10:00"); + eq(dt.plusSeconds(30), get()); + } + + private void init(String ... args) { + func = new Func.GetTime(); + func.init(C.listOf(args)); + } + + private DateTime get() { + return (DateTime) func.apply(); + } + + private void verifyDate(String dateTime) { + DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd"); + DateTime dt = fmt.parseDateTime(dateTime); + eq(dt, get()); + } + + private void verifyTime(String dateTime) { + DateTime dt = fmt.parseDateTime(dateTime); + yes(1000 > (dt.getMillis() - get().getMillis())); + } + + private void verifyDelta(int seconds) { + DateTime now = DateTime.now().plusSeconds(seconds); + yes((now.getMillis() - get().getMillis()) < 1000); + } + +} From bdcb9f88778dd1d6dcc13365e43e3709bb323524 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 11 Oct 2018 10:28:03 +1100 Subject: [PATCH 154/730] reset GHIssues test project parent version --- src/test/java/act/test/util/GetTimeTest.java | 20 ++++++++++++++++++++ testapps/GHIssues/pom.xml | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/test/java/act/test/util/GetTimeTest.java b/src/test/java/act/test/util/GetTimeTest.java index cbbc2ce27..752da7a76 100644 --- a/src/test/java/act/test/util/GetTimeTest.java +++ b/src/test/java/act/test/util/GetTimeTest.java @@ -1,5 +1,25 @@ package act.test.util; +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + import act.test.func.Func; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index ab198f443..e45929aa0 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.8.7-dld2-SNAPSHOT + 1.8.8.7-SNAPSHOT From 68042977a97d86c627dd13095c6ef767746dce33 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 11 Oct 2018 10:30:31 +1100 Subject: [PATCH 155/730] recover Gh857 testbed --- .../src/main/java/ghissues/Gh857.java | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh857.java b/testapps/GHIssues/src/main/java/ghissues/Gh857.java index c3b09c54b..3f93bba54 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh857.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh857.java @@ -1,54 +1,54 @@ -//package ghissues; -// -//import act.annotations.Order; -//import act.annotations.Sorted; -//import act.controller.annotation.UrlContext; -//import org.osgl.inject.annotation.TypeOf; -//import org.osgl.mvc.annotation.GetAction; -//import org.osgl.util.C; -// -//import java.util.List; -// -//@UrlContext("857") -//public class Gh857 extends BaseController { -// -// public interface Service857 { -// String name(); -// } -// -// @Order(2) -// public static class BarService implements Service857 { -// @Override -// public String name() { -// return "bar"; -// } -// } -// -// @Order(11) -// public static class FooService implements Service857 { -// @Override -// public String name() { -// return "foo"; -// } -// -// } -// -// @Order(3) -// public static class ZooService implements Service857 { -// @Override -// public String name() { -// return "zoo"; -// } -// } -// -// -// @TypeOf -// @Sorted -// private List services; -// -// @GetAction -// public List test() { -// return C.list(services).map(Service857::name); -// } -// -//} +package ghissues; + +import act.annotations.Order; +import act.annotations.Sorted; +import act.controller.annotation.UrlContext; +import org.osgl.inject.annotation.TypeOf; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.List; + +@UrlContext("857") +public class Gh857 extends BaseController { + + public interface Service857 { + String name(); + } + + @Order(2) + public static class BarService implements Service857 { + @Override + public String name() { + return "bar"; + } + } + + @Order(11) + public static class FooService implements Service857 { + @Override + public String name() { + return "foo"; + } + + } + + @Order(3) + public static class ZooService implements Service857 { + @Override + public String name() { + return "zoo"; + } + } + + + @TypeOf + @Sorted + private List services; + + @GetAction + public List test() { + return C.list(services).map(Service857::name); + } + +} From 8980e7140eae3c507963b781f820e65c1974997f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 11 Oct 2018 13:16:45 +1100 Subject: [PATCH 156/730] #872 - add DB_SVC_PROVISIONED event to fix time sequqnce issue when act-storage is engaged --- src/main/java/act/app/App.java | 10 +- src/main/java/act/app/DbServiceManager.java | 8 +- .../act/app/event/AppDbSvcProvisioned.java | 32 ++++ ... => AppDependencyInjectorInitialized.java} | 6 +- src/main/java/act/app/event/SysEventId.java | 170 +++++++++++++++--- .../java/act/inject/genie/GenieInjector.java | 6 +- .../act/inject/genie/GenieModuleScanner.java | 2 +- 7 files changed, 191 insertions(+), 43 deletions(-) create mode 100644 src/main/java/act/app/event/AppDbSvcProvisioned.java rename src/main/java/act/app/event/{AppDependencyInjectorPreLoad.java => AppDependencyInjectorInitialized.java} (80%) diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 659130ad4..b5ebb588d 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -654,7 +654,7 @@ public synchronized void refresh() { initBinderManager(); initUploadFileStorageService(); initClassLoader(); - emit(SysEventId.CLASS_LOADER_INITIALIZED); + emit(CLASS_LOADER_INITIALIZED); initRouters(); emit(ROUTER_INITIALIZED); loadRoutes(); @@ -708,7 +708,7 @@ public synchronized void refresh() { try { loadDependencyInjector(); - emit(DEPENDENCY_INJECTOR_PRELOAD); + emit(DEPENDENCY_INJECTOR_INITIALIZED); dependencyInjector.unlock(); emit(DEPENDENCY_INJECTOR_LOADED); } catch (BlockIssueSignal e) { @@ -771,14 +771,14 @@ public void run() { emit(POST_START); } }; - if (!dbServiceManager().hasDbService() || eventEmitted(DB_SVC_LOADED)) { + if (!dbServiceManager().hasDbService() || eventEmitted(DB_SVC_PROVISIONED)) { if (Act.isDev()) { - jobManager.now(runnable2); + jobManager.now("App:postDbSvcLogic", runnable2); } else { runnable2.run(); } } else { - jobManager().on(DB_SVC_LOADED, "App:postDbSvcLoadLogic", runnable2, true); + jobManager().on(DB_SVC_PROVISIONED, "App:postDbSvcLogic", runnable2, true); } } catch (BlockIssueSignal e) { // ignore diff --git a/src/main/java/act/app/DbServiceManager.java b/src/main/java/act/app/DbServiceManager.java index abcbbd0a3..eab22fba3 100644 --- a/src/main/java/act/app/DbServiceManager.java +++ b/src/main/java/act/app/DbServiceManager.java @@ -73,6 +73,12 @@ public DbServiceManager(final App app) { final Runnable daoInitializer = new Runnable() { @Override public void run() { + app.emit(SysEventId.DB_SVC_LOADED); + initDao(); + app.emit(SysEventId.DB_SVC_PROVISIONED); + } + + private void initDao() { ClassNode node = app.classLoader().classInfoRepository().node(Dao.class.getName()); node.visitPublicNotAbstractTreeNodes(new $.Visitor() { private boolean isGeneral(Class c) { @@ -114,7 +120,6 @@ public void visit(ClassNode classNode) throws $.Break { @Override public void on(EventObject event) throws Exception { daoInitializer.run(); - app.emit(SysEventId.DB_SVC_LOADED); } }); } else { @@ -125,7 +130,6 @@ public void on(DbServiceInitialized event) { asyncInitializers.remove(event.source()); if (asyncInitializers.isEmpty()) { daoInitializer.run(); - app.emit(SysEventId.DB_SVC_LOADED); } } } diff --git a/src/main/java/act/app/event/AppDbSvcProvisioned.java b/src/main/java/act/app/event/AppDbSvcProvisioned.java new file mode 100644 index 000000000..3f37de0e4 --- /dev/null +++ b/src/main/java/act/app/event/AppDbSvcProvisioned.java @@ -0,0 +1,32 @@ +package act.app.event; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.App; + +/** + * Emitted after Application's {@link act.db.DbService db services} have been loaded + */ +public class AppDbSvcProvisioned extends SysEvent { + public AppDbSvcProvisioned(App source) { + super(SysEventId.DB_SVC_PROVISIONED, source); + } +} diff --git a/src/main/java/act/app/event/AppDependencyInjectorPreLoad.java b/src/main/java/act/app/event/AppDependencyInjectorInitialized.java similarity index 80% rename from src/main/java/act/app/event/AppDependencyInjectorPreLoad.java rename to src/main/java/act/app/event/AppDependencyInjectorInitialized.java index 7db1cf67a..b030b5fdc 100644 --- a/src/main/java/act/app/event/AppDependencyInjectorPreLoad.java +++ b/src/main/java/act/app/event/AppDependencyInjectorInitialized.java @@ -25,8 +25,8 @@ /** * Emitted immediately when {@link App}'s dependency injector is loaded */ -public class AppDependencyInjectorPreLoad extends SysEvent { - public AppDependencyInjectorPreLoad(App source) { - super(SysEventId.DEPENDENCY_INJECTOR_PRELOAD, source); +public class AppDependencyInjectorInitialized extends SysEvent { + public AppDependencyInjectorInitialized(App source) { + super(SysEventId.DEPENDENCY_INJECTOR_INITIALIZED, source); } } diff --git a/src/main/java/act/app/event/SysEventId.java b/src/main/java/act/app/event/SysEventId.java index 73156a1ad..519ae7fff 100644 --- a/src/main/java/act/app/event/SysEventId.java +++ b/src/main/java/act/app/event/SysEventId.java @@ -23,104 +23,204 @@ import act.app.App; public enum SysEventId { + /** + * Emitted after {@link act.event.EventBus} initialized. + */ EVENT_BUS_INITIALIZED() { @Override public SysEvent of(App app) { return new EventBusInitialized(app); } }, + /** + * Emitted after {@link App#config()} loaded. + */ CONFIG_LOADED() { @Override public SysEvent of(App app) { return new AppConfigLoaded(app); } }, + /** + * Emitted if {@link act.app.conf.AppConfigurator} implementation + * found and before it merged into {@link App#config()}. + * + * This event might not be triggered if there is no + * {@link act.app.conf.AppConfigurator} defined in application. + */ CONFIG_PREMERGE() { @Override public SysEvent of(App app) { return new AppConfigPreMerge(app); } }, - DB_SVC_LOADED () { + /** + * Emitted before {@link App#classLoader()} initialized + */ + CLASS_LOADER_INITIALIZED () { @Override public SysEvent of(App app) { - return new AppDbSvcLoaded(app); + return new AppClassLoaderInitialized(app); } - }, PRE_LOAD_CLASSES () { + }, + /** + * Emitted after all routers initialized. + */ + ROUTER_INITIALIZED { @Override public SysEvent of(App app) { - return new AppPreLoadClasses(app); + return new AppRouterInitialized(app); } - }, CLASS_LOADER_INITIALIZED () { + }, + /** + * Emitted after built-in and all file based route tables loaded into routers + */ + ROUTER_LOADED { @Override public SysEvent of(App app) { - return new AppClassLoaderInitialized(app); + return new AppRouterLoaded(app); } - }, CLASS_LOADED { + }, + /** + * Emitted after {@link act.plugin.AppServicePlugin global application plugin} loaded. + */ + APP_ACT_PLUGIN_LOADED { @Override public SysEvent of(App app) { - return new AppClassLoaded(app); + return new AppActPluginLoaded(app); + } + }, + /** + * Emitted before loading classes into {@link App#classLoader()} + */ + PRE_LOAD_CLASSES () { + @Override + public SysEvent of(App app) { + return new AppPreLoadClasses(app); } - }, APP_CODE_SCANNED { + }, + /** + * Emitted after application code scanned. + */ + APP_CODE_SCANNED { @Override public SysEvent of(App app) { return new AppCodeScanned(app); } - }, APP_ACT_PLUGIN_LOADED { + }, + /** + * Emitted after classes loaded into {@link App#classLoader()} + */ + CLASS_LOADED { @Override public SysEvent of(App app) { - return new AppActPluginLoaded(app); + return new AppClassLoaded(app); } - }, ROUTER_INITIALIZED { + }, + /** + * Emitted after dependency injector initialized. + * + * Note this event happened before {@link #DEPENDENCY_INJECTOR_LOADED} + * and it marks a point when framework can register modules into + * dependency injector. + */ + DEPENDENCY_INJECTOR_INITIALIZED { @Override public SysEvent of(App app) { - return new AppRouterInitialized(app); + return new AppDependencyInjectorInitialized(app); } - }, ROUTER_LOADED { + }, + /** + * Emitted after dependency injector loaded. + * + * This event happened after all modules registered into dependency + * injector. + */ + DEPENDENCY_INJECTOR_LOADED { @Override public SysEvent of(App app) { - return new AppRouterLoaded(app); + return new AppDependencyInjectorLoaded(app); } - }, DEPENDENCY_INJECTOR_PRELOAD { + }, + /** + * Emitted after depenedency injector fully provisioned. + * + * This event happens after {@link #DEPENDENCY_INJECTOR_LOADED} + */ + DEPENDENCY_INJECTOR_PROVISIONED { @Override public SysEvent of(App app) { - return new AppDependencyInjectorPreLoad(app); + return new AppDependencyInjectorProvisioned(app); } - }, DEPENDENCY_INJECTOR_LOADED { + }, + /** + * Emitted after all `@Singleton` instance registered. + */ + SINGLETON_PROVISIONED { @Override public SysEvent of(App app) { - return new AppDependencyInjectorLoaded(app); + return new SingletonProvisioned(app); } - }, DEPENDENCY_INJECTOR_PROVISIONED { + }, + /** + * Emit once a database service has been loaded. + * + * When this event is emitted, the Dao of the db service hasn't been + * initialized yet. + * + * @see #DB_SVC_PROVISIONED + */ + DB_SVC_LOADED () { @Override public SysEvent of(App app) { - return new AppDependencyInjectorProvisioned(app); + return new AppDbSvcLoaded(app); } - }, SINGLETON_PROVISIONED { + }, + /** + * Emit once all Dao has been initialized for a database service. + * + * Note this event happens after {@link #DB_SVC_LOADED} + */ + DB_SVC_PROVISIONED () { @Override public SysEvent of(App app) { - return new SingletonProvisioned(app); + return new AppDbSvcProvisioned(app); } - }, PRE_START () { + }, + /** + * Emitted to mark application is ready to start + */ + PRE_START () { @Override public SysEvent of(App app) { return new AppPreStart(app); } - }, STATELESS_PROVISIONED { + }, + /** + * Emitted when all '@Stateless' bean registered into + * Singleton registry. + * + * This happens after {@link #PRE_START}. + */ + STATELESS_PROVISIONED { @Override public SysEvent of(App app) { return new StatelessProvisioned(app); } - }, START() { + }, + /** + * Mark application has been started. + * + * This happens after {@link #STATELESS_PROVISIONED}. + */ + START() { @Override public SysEvent of(App app) { return new AppStart(app); } }, /** - * The App POST_START event - * is used for framework. Application shall not - * use this event + * Mark a point after {@link #START}. */ POST_START() { @Override @@ -128,12 +228,24 @@ public SysEvent of(App app) { return new AppPostStart(app); } }, + /** + * Mark Act instance fully started. + * + * This main difference between this event and {@link #START} is + * in that {@link #START} will be triggered after app hot reloaded + * in dev mode, while this even will only trigger one time. + */ ACT_START() { @Override public SysEvent of(App app) { return new ActStart(app); } }, + /** + * Mark app stop event. + * + * This triggers when hotreload is happening. + */ STOP () { @Override public SysEvent of(App app) { diff --git a/src/main/java/act/inject/genie/GenieInjector.java b/src/main/java/act/inject/genie/GenieInjector.java index 5b1f2b37c..eca8b4756 100644 --- a/src/main/java/act/inject/genie/GenieInjector.java +++ b/src/main/java/act/inject/genie/GenieInjector.java @@ -242,12 +242,12 @@ public Genie get() { return genie; } - @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_PRELOAD) + @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_INITIALIZED) public static void foundModule(Class moduleClass) { addModuleClass(moduleClass); } - @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_PRELOAD) + @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_INITIALIZED) public static void foundConfigurator(Class configurator) { addModuleClass(configurator); } @@ -318,7 +318,7 @@ public void visit(ClassNode classNode) throws $.Break { } } - @AnnotatedClassFinder(value = ModuleTag.class, callOn = SysEventId.DEPENDENCY_INJECTOR_PRELOAD, noAbstract = false) + @AnnotatedClassFinder(value = ModuleTag.class, callOn = SysEventId.DEPENDENCY_INJECTOR_INITIALIZED, noAbstract = false) public static void foundTaggedModule(Class taggedModuleClass) { addModuleClass(taggedModuleClass); } diff --git a/src/main/java/act/inject/genie/GenieModuleScanner.java b/src/main/java/act/inject/genie/GenieModuleScanner.java index 8d55a7976..2a9a03cb1 100644 --- a/src/main/java/act/inject/genie/GenieModuleScanner.java +++ b/src/main/java/act/inject/genie/GenieModuleScanner.java @@ -47,7 +47,7 @@ public void visit(int version, int access, String name, String signature, String @Override public void scanFinished(final String className) { if (shouldRegister) { - app().jobManager().on(SysEventId.DEPENDENCY_INJECTOR_PRELOAD, "GenieModuleScanner:addModuleClass:" + className, new Runnable() { + app().jobManager().on(SysEventId.DEPENDENCY_INJECTOR_INITIALIZED, "GenieModuleScanner:addModuleClass:" + className, new Runnable() { @Override public void run() { GenieInjector.addModuleClass($.classForName(className, app().classLoader())); From f003b2edc7eb1c30d717f9fbcb50dc2b39853421 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 12 Oct 2018 13:51:26 +1100 Subject: [PATCH 157/730] It randomly found request handler parameters are not enhanced with `@Named` annotation #879 --- CHANGELOG.md | 1 + .../act/controller/bytecode/HandlerEnhancer.java | 3 +++ src/main/java/act/xio/NetworkHandler.java | 9 ++++++--- testapps/GHIssues/src/main/java/ghissues/Gh897.java | 12 ++++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh897.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 061e798b0..73074afaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* It randomly found request handler parameters are not enhanced with `@Named` annotation #879 * Test: add $now() and $today() function #876 * Intermittent ACT start failure in `GenieModuleScanner` #875 * Route configured for namedport not effective #874 diff --git a/src/main/java/act/controller/bytecode/HandlerEnhancer.java b/src/main/java/act/controller/bytecode/HandlerEnhancer.java index 4b7b9795b..55f83817f 100644 --- a/src/main/java/act/controller/bytecode/HandlerEnhancer.java +++ b/src/main/java/act/controller/bytecode/HandlerEnhancer.java @@ -48,6 +48,9 @@ public class HandlerEnhancer extends MethodVisitor implements Opcodes { public HandlerEnhancer(final MethodVisitor mv, HandlerMethodMetaInfo meta, final int access, final String name, final String desc, final String signature, final String[] exceptions) { super(ASM5, new MethodNode(access, name, desc, signature, exceptions)); + if (logger.isTraceEnabled()) { + logger.trace("enhance handler: " + meta.fullName()); + } this.info = meta; this.next = mv; } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 1d73c402b..63e606e76 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -125,17 +125,20 @@ public void run() { url = urlContextProcessor.apply(req, url); } catch (NotFound notFound) { ctx.handler(AlwaysNotFound.INSTANCE); - ctx.saveLocal(); AlwaysNotFound.INSTANCE.apply(ctx); return; } + + // have to save context current here + // otherwise it might cause + // https://github.com/actframework/actframework/issues + ctx.saveLocal(); Timer timer = metric.startTimer(MetricInfo.ROUTING); final RequestHandler requestHandler = router().getInvoker(method, url, ctx); ctx.handler(requestHandler); timer.stop(); boolean resourceGetter = requestHandler instanceof ResourceGetter || requestHandler instanceof FileGetter; if (null != refreshError && !resourceGetter) { - ctx.saveLocal(); handleException(refreshError, ctx, "Error refreshing app"); ActionContext.clearCurrent(); return; @@ -148,9 +151,9 @@ public void run() { String key = S.concat(MetricInfo.HTTP_HANDLER, ":", requestHandler.toString()); timer = metric.startTimer(key); } - ctx.saveLocal(); EventBus eventBus = app.eventBus(); final boolean skipEvents = ctx.skipEvents(); + ctx.saveLocal(); try { if (!skipEvents) { eventBus.emit(new PreHandle(ctx)); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh897.java b/testapps/GHIssues/src/main/java/ghissues/Gh897.java new file mode 100644 index 000000000..48e1a6fef --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh897.java @@ -0,0 +1,12 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("897") +public class Gh897 extends BaseController { + @GetAction + public String test(String x) { + return x; + } +} From 25250c67edb3e8dde4d14fcccf347671d29debab Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 13 Oct 2018 23:52:53 +1100 Subject: [PATCH 158/730] add test case for GH878 --- CHANGELOG.md | 1 + .../src/main/java/ghissues/Gh878.java | 44 +++++++++++++++++++ .../src/main/java/ghissues/Gh897.java | 12 ----- .../src/main/resources/test/scenarios/878.yml | 27 ++++++++++++ 4 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh878.java delete mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh897.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/878.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 73074afaf..bf62d2e84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* @PropertySpec could not effect entity in collection #878 * It randomly found request handler parameters are not enhanced with `@Named` annotation #879 * Test: add $now() and $today() function #876 * Intermittent ACT start failure in `GenieModuleScanner` #875 diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh878.java b/testapps/GHIssues/src/main/java/ghissues/Gh878.java new file mode 100644 index 000000000..1475e4f30 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh878.java @@ -0,0 +1,44 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.PropertySpec; +import act.util.SimpleBean; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.*; + +@UrlContext("878") +public class Gh878 { + + public static class Foo implements SimpleBean{ + public Bar bar; + public Integer id; + + public Foo(Bar bar, Integer id) { + this.bar = bar; + this.id = id; + } + } + + public static class Bar implements SimpleBean { + public Integer id; + public String name; + + public Bar(Integer id, String name) { + this.id = id; + this.name = name; + } + } + + @GetAction("list") + @PropertySpec("-bar.id") + public Iterable test() { + return C.list(new Foo(new Bar(1, "a"), 1), new Foo(new Bar(2, "b"), 2)); + } + + @GetAction + @PropertySpec("-bar.id,-id") + public Foo test2() { + return new Foo(new Bar(1, "a"), 1); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh897.java b/testapps/GHIssues/src/main/java/ghissues/Gh897.java deleted file mode 100644 index 48e1a6fef..000000000 --- a/testapps/GHIssues/src/main/java/ghissues/Gh897.java +++ /dev/null @@ -1,12 +0,0 @@ -package ghissues; - -import act.controller.annotation.UrlContext; -import org.osgl.mvc.annotation.GetAction; - -@UrlContext("897") -public class Gh897 extends BaseController { - @GetAction - public String test(String x) { - return x; - } -} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/878.yml b/testapps/GHIssues/src/main/resources/test/scenarios/878.yml new file mode 100644 index 000000000..93323ecc1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/878.yml @@ -0,0 +1,27 @@ +Scenario(GH878): + description: "[878] @PropertySpec could not effect entity in collection" + interactions: + - description: test list + request: + get: 878/list + response: + json: + data: + size: 2 + 0: + bar: + id: + - exists: false + name: + - exists: true + - description: test nested structure + request: + get: 878 + response: + json: + data: + bar: + name: + - exists: true + id: + - exists: false \ No newline at end of file From 295a26693bccd5c3aa34bccfbd0928a749ab0ebb Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 14 Oct 2018 17:54:42 +1100 Subject: [PATCH 159/730] No need to trigger hotreload when testing file changes #880 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 3 ++- src/main/java/act/util/Files.java | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf62d2e84..7b4336520 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* No need to trigger hotreload when testing file changes #880 * @PropertySpec could not effect entity in collection #878 * It randomly found request handler parameters are not enhanced with `@Named` annotation #879 * Test: add $now() and $today() function #876 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index b5ebb588d..094cc6b6f 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -22,6 +22,7 @@ import static act.app.event.SysEventId.*; import static org.osgl.http.H.Method.GET; +import static org.osgl.util.S.F.contains; import static org.osgl.util.S.F.endsWith; import act.Act; @@ -109,7 +110,7 @@ public enum F { ; public static $.Predicate JAVA_SOURCE = endsWith(".java"); public static $.Predicate JAR_FILE = endsWith(".jar"); - public static $.Predicate CONF_FILE = endsWith(".conf").or(endsWith(".properties").or(endsWith(".yaml").or(endsWith(".yml").or(endsWith(".xml"))))); + public static $.Predicate CONF_FILE = endsWith(".conf").or(endsWith(".properties").or(endsWith(".yaml").or(endsWith(".yml").or(endsWith(".xml"))))).and(contains("main/resources/test").negate()); public static $.Predicate ROUTES_FILE = $.F.eq(RouteTableRouterBuilder.ROUTES_FILE); } diff --git a/src/main/java/act/util/Files.java b/src/main/java/act/util/Files.java index 2bafb4bd9..63299b979 100644 --- a/src/main/java/act/util/Files.java +++ b/src/main/java/act/util/Files.java @@ -55,7 +55,7 @@ public static void filter(File baseDir, $.F1 filter, $.F1 Date: Sun, 14 Oct 2018 20:53:47 +1100 Subject: [PATCH 160/730] Support opt-out jars from managed classloader by specifying file name prefix in `act.jar.black.list` #881; Add `SysEventId.POST_STARTED` #882 --- CHANGELOG.md | 2 ++ src/main/java/act/app/App.java | 6 ++++ src/main/java/act/app/AppClassLoader.java | 10 +++--- .../java/act/app/event/AppPostStarted.java | 33 +++++++++++++++++++ src/main/java/act/app/event/SysEventId.java | 9 +++++ .../java/act/boot/BootstrapClassLoader.java | 14 ++------ .../app/FullStackAppBootstrapClassLoader.java | 20 ++++++----- src/main/java/act/db/DbBind.java | 2 ++ src/main/java/act/job/JobManager.java | 2 +- src/main/java/act/test/Test.java | 11 ++----- .../src/main/resources/conf/app.properties | 1 + 11 files changed, 77 insertions(+), 33 deletions(-) create mode 100644 src/main/java/act/app/event/AppPostStarted.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b4336520..c811bad6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Add `SysEventId.POST_STARTED` #882 +* Support opt-out jars from managed classloader by specifying file name prefix in `act.jar.black.list` #881 * No need to trigger hotreload when testing file changes #880 * @PropertySpec could not effect entity in collection #878 * It randomly found request handler parameters are not enhanced with `@Named` annotation #879 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 094cc6b6f..ac9e1ddd6 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -770,6 +770,12 @@ public void run() { hasStarted = true; daemonKeeper(); emit(POST_START); + jobManager.post(SysEventId.DB_SVC_LOADED, new Runnable() { + @Override + public void run() { + emit(POST_STARTED); + } + }, true); } }; if (!dbServiceManager().hasDbService() || eventEmitted(DB_SVC_PROVISIONED)) { diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index c74477fb7..372fe10da 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -53,9 +53,7 @@ import org.osgl.exception.NotAppliedException; import org.osgl.logging.L; import org.osgl.logging.Logger; -import org.osgl.util.E; -import org.osgl.util.IO; -import org.osgl.util.S; +import org.osgl.util.*; import java.io.*; import java.lang.annotation.Annotation; @@ -382,7 +380,11 @@ private void preloadLib() { final $.Function ignoredClassNames = app().config().appClassTester().negate(); Jars.F.JarEntryVisitor classNameIndexBuilder = Jars.F.classNameIndexBuilder(bytecodeIdx, ignoredClassNames); Jars.F.JarEntryVisitor confIndexBuilder = Jars.F.appConfigFileIndexBuilder(jarConf); - List jars = FullStackAppBootstrapClassLoader.jars(AppClassLoader.class.getClassLoader()); + ClassLoader parent = getParent(); + List jars = C.list(); + if (parent instanceof FullStackAppBootstrapClassLoader) { + jars = ((FullStackAppBootstrapClassLoader) parent).jars(AppClassLoader.class.getClassLoader()); + } Set blackList = app().jarFileBlackList(); Set blackList2 = app().jarFileBlackList2(); for (File jar : jars) { diff --git a/src/main/java/act/app/event/AppPostStarted.java b/src/main/java/act/app/event/AppPostStarted.java new file mode 100644 index 000000000..8ea9dca92 --- /dev/null +++ b/src/main/java/act/app/event/AppPostStarted.java @@ -0,0 +1,33 @@ +package act.app.event; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.App; + +/** + * Mark a Application Post Start event. The App Post Start event + * will be triggered after the {@link AppStart} event + */ +public class AppPostStarted extends SysEvent { + public AppPostStarted(App source) { + super(SysEventId.POST_STARTED, source); + } +} diff --git a/src/main/java/act/app/event/SysEventId.java b/src/main/java/act/app/event/SysEventId.java index 519ae7fff..9fbff06bd 100644 --- a/src/main/java/act/app/event/SysEventId.java +++ b/src/main/java/act/app/event/SysEventId.java @@ -228,6 +228,15 @@ public SysEvent of(App app) { return new AppPostStart(app); } }, + /** + * Mark a point after all {@link #POST_START} jobs has finished + */ + POST_STARTED() { + @Override + public SysEvent of(App app) { + return new AppPostStarted(app); + } + }, /** * Mark Act instance fully started. * diff --git a/src/main/java/act/boot/BootstrapClassLoader.java b/src/main/java/act/boot/BootstrapClassLoader.java index bfc7df57a..933342490 100644 --- a/src/main/java/act/boot/BootstrapClassLoader.java +++ b/src/main/java/act/boot/BootstrapClassLoader.java @@ -25,25 +25,17 @@ import act.asm.ClassWriter; import act.boot.app.FullStackAppBootstrapClassLoader; import act.boot.server.ServerBootstrapClassLoader; -import act.util.ActClassLoader; -import act.util.ByteCodeVisitor; -import act.util.ClassInfoRepository; -import act.util.ClassNode; +import act.util.*; import org.osgl.$; import org.osgl.logging.L; import org.osgl.logging.Logger; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.IO; -import org.osgl.util.S; +import org.osgl.util.*; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.security.ProtectionDomain; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.Set; +import java.util.*; /** * Base class for Act class loaders diff --git a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java index 6b6a7d70a..227960939 100644 --- a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java +++ b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java @@ -53,16 +53,16 @@ public class FullStackAppBootstrapClassLoader extends BootstrapClassLoader imple * The default value is defined in {@link #DEF_JAR_IGNORE} * `` */ - private static final String KEY_SYS_JAR_IGNORE = "act.jar.sys.ignore"; + public static final String KEY_SYS_JAR_IGNORE = "act.jar.sys.ignore"; /** * the {@link System#getProperty(String) system property} key to get * the ignored jar file name prefix; multiple prefixes can be specified * with comma `,` */ - private static final String KEY_APP_JAR_IGNORE = "act.jar.app.ignore"; + public static final String KEY_APP_JAR_IGNORE = "act.jar.app.ignore"; - private static final String DEF_JAR_IGNORE = "act-asm,activation-,antlr," + + public static final String DEF_JAR_IGNORE = "act-asm,activation-,antlr," + "asm-,byte-buddy,byte-buddy-agent," + "cdi-api,cglib,commons-,core-,curvesapi," + "debugger-agent,ecj-,guava-,hibernate-," + @@ -83,7 +83,7 @@ public class FullStackAppBootstrapClassLoader extends BootstrapClassLoader imple private List> actClasses = new ArrayList<>(); private List> pluginClasses = new ArrayList<>(); private String lineSeparator = OS.get().lineSeparator(); - private static final $.Predicate jarFilter = jarFilter(); + private final $.Predicate jarFilter = jarFilter(); public FullStackAppBootstrapClassLoader(ClassLoader parent) { super(parent); @@ -145,7 +145,8 @@ protected long jarsChecksum() { return jarsChecksum; } - private static $.Predicate jarFilter() { + private $.Predicate jarFilter() { + Set set = jarBlackList(); String ignores = System.getProperty(KEY_SYS_JAR_IGNORE); if (null == ignores) { ignores = DEF_JAR_IGNORE; @@ -154,12 +155,13 @@ protected long jarsChecksum() { if (null != appIgnores) { ignores += ("," + appIgnores); } - final String[] sa = ignores.split(","); + set.addAll(S.fastSplit(ignores, ",")); + final Set blackList = set; return new $.Predicate() { @Override public boolean test(File file) { String name = file.getName(); - for (String prefix : sa) { + for (String prefix : blackList) { if (S.notBlank(prefix) && name.startsWith(prefix)) { return false; } @@ -169,14 +171,14 @@ public boolean test(File file) { }; } - private static List filterJars(List jars) { + private List filterJars(List jars) { if (null == jarFilter) { return null; } return C.list(jars).filter(jarFilter); } - public static List jars(ClassLoader cl) { + public List jars(ClassLoader cl) { List jars = null; C.List path = C.listOf(System.getProperty(KEY_CLASSPATH).split(File.pathSeparator)); if (path.size() < 10) { diff --git a/src/main/java/act/db/DbBind.java b/src/main/java/act/db/DbBind.java index b3a1315ec..53f196256 100644 --- a/src/main/java/act/db/DbBind.java +++ b/src/main/java/act/db/DbBind.java @@ -22,6 +22,7 @@ import act.data.annotation.ParamBindingAnnotation; import act.db.di.FindBy; +import org.osgl.inject.annotation.InjectTag; import org.osgl.inject.annotation.LoadValue; import java.lang.annotation.ElementType; @@ -35,6 +36,7 @@ * {@link act.util.ActContext} */ @LoadValue(FindBy.class) +@InjectTag @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER, ElementType.FIELD}) @ParamBindingAnnotation diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index a1888750e..19c905983 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -476,7 +476,7 @@ private class ContextualJob extends Job { super(id, JobManager.this, callable); } - ContextualJob(String id, final Runnable runnable) { + ContextualJob(final String id, final Runnable runnable) { super(id, JobManager.this, new $.F0() { @Override public Object apply() throws NotAppliedException, $.Break { diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index a946bf02b..5ace3d3d0 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -208,17 +208,12 @@ public void clearFixtures() { public void run(final App app) { boolean run = $.bool(app.config().get("test.run")) || $.bool(app.config().get("e2e.run")) || "test".equalsIgnoreCase(Act.profile()) || "e2e".equalsIgnoreCase(Act.profile()); if (run) { - app.jobManager().post(SysEventId.POST_START, new Runnable() { + app.jobManager().post(SysEventId.POST_STARTED, new Runnable() { @Override public void run() { - app.jobManager().post(SysEventId.DB_SVC_LOADED, new Runnable() { - @Override - public void run() { - Test.this.run(app, null, true); - } - }, true); + Test.this.run(app, null, true); } - }, true); + }); } } diff --git a/testapps/GHIssues/src/main/resources/conf/app.properties b/testapps/GHIssues/src/main/resources/conf/app.properties index 0f6e9f560..babc5fc93 100644 --- a/testapps/GHIssues/src/main/resources/conf/app.properties +++ b/testapps/GHIssues/src/main/resources/conf/app.properties @@ -1,3 +1,4 @@ +api_doc=false globalReturnValueAdvice=ghissues.Gh835$GlobalAdvice ############################################## # Application configuration From 8523b79e3c60e3c6c98a7e3ea46205fefc7a5be2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 14 Oct 2018 22:09:44 +1100 Subject: [PATCH 161/730] fine tune jar opt-out logic --- .../src/main/resources/app.properties | 1 + .../app/FullStackAppBootstrapClassLoader.java | 28 +++++++++++++++---- src/main/resources/act.jar.black.list | 2 +- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/legacy-testapp/src/main/resources/app.properties b/legacy-testapp/src/main/resources/app.properties index a3d3ea340..eb869f4a7 100644 --- a/legacy-testapp/src/main/resources/app.properties +++ b/legacy-testapp/src/main/resources/app.properties @@ -9,3 +9,4 @@ greeting.service.cn.impl=testapp.endpoint.ChineseGreetingService greeting.service.en.impl=testapp.endpoint.EnglishGreetingService foo.bar=567 apidoc=false +api_doc=false \ No newline at end of file diff --git a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java index 227960939..bc0f9004f 100644 --- a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java +++ b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java @@ -146,7 +146,13 @@ protected long jarsChecksum() { } private $.Predicate jarFilter() { - Set set = jarBlackList(); + final Set blackList = jarBlackList(); + final Set whiteList = new HashSet<>(); + for (String s : blackList) { + if (s.startsWith("-")) { + whiteList.add(s.substring(1)); + } + } String ignores = System.getProperty(KEY_SYS_JAR_IGNORE); if (null == ignores) { ignores = DEF_JAR_IGNORE; @@ -155,15 +161,25 @@ protected long jarsChecksum() { if (null != appIgnores) { ignores += ("," + appIgnores); } - set.addAll(S.fastSplit(ignores, ",")); - final Set blackList = set; + blackList.addAll(S.fastSplit(ignores, ",")); return new $.Predicate() { @Override public boolean test(File file) { String name = file.getName(); for (String prefix : blackList) { - if (S.notBlank(prefix) && name.startsWith(prefix)) { - return false; + if (S.blank(prefix)) { + continue; + } + if (name.startsWith(prefix)) { + boolean whiteListed = false; + for (String s : whiteList) { + if (name.startsWith(s)) { + whiteListed = true; + } + } + if (!whiteListed) { + return false; + } } } return true; @@ -313,7 +329,7 @@ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundE return c; } - if (name.startsWith("java") || name.startsWith("org.osgl") || name.startsWith("org.slf4j")) { + if (name.startsWith("java") || name.startsWith("org.slf4j")) { return super.loadClass(name, resolve); } diff --git a/src/main/resources/act.jar.black.list b/src/main/resources/act.jar.black.list index f8c8f545d..d99e78108 100644 --- a/src/main/resources/act.jar.black.list +++ b/src/main/resources/act.jar.black.list @@ -6,7 +6,6 @@ core debugger ecj fastjson -genie guava hamcrest idea_rt @@ -27,6 +26,7 @@ mockito objenesis org.apache.bval.bundle osgl +-osgl-mvc patchca reflectasm rythm From ef017ea82c7c0e51fd1237058bf118da175809e2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 14 Oct 2018 22:30:39 +1100 Subject: [PATCH 162/730] Test - partition scenarios #877 --- CHANGELOG.md | 1 + src/main/java/act/test/Scenario.java | 1 + src/main/java/act/test/util/ScenarioComparator.java | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c811bad6c..5557d48c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Test - partition scenarios #877 * Add `SysEventId.POST_STARTED` #882 * Support opt-out jars from managed classloader by specifying file name prefix in `act.jar.black.list` #881 * No need to trigger hotreload when testing file changes #880 diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 7320fefe4..67c8b3bc4 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -254,6 +254,7 @@ private String verifyJsonBody(Object jsonBody) { public Throwable cause; public boolean clearFixtures = true; public String urlContext; + public String partition = "DEFAULT"; $.Var lastData = $.var(); $.Var lastHeaders = $.var(); diff --git a/src/main/java/act/test/util/ScenarioComparator.java b/src/main/java/act/test/util/ScenarioComparator.java index 793049fb8..90b2fb89a 100644 --- a/src/main/java/act/test/util/ScenarioComparator.java +++ b/src/main/java/act/test/util/ScenarioComparator.java @@ -45,7 +45,8 @@ public int compare(Scenario o1, Scenario o2) { if (d2.contains(o1)) { return -1; } - return o1.name.compareTo(o2.name); + int n = o1.partition.compareTo(o2.partition); + return 0 != n ? n : o1.name.compareTo(o2.name); } private List depends(Scenario s, List depends) { for (String name : s.depends) { From e269068e2f23774a607bc8bc43a351f5289f4de6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 15 Oct 2018 06:02:24 +1100 Subject: [PATCH 163/730] make YamlLoader(String modelPackage, String... modelPackages) constructor be public --- src/main/java/act/test/util/YamlLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/act/test/util/YamlLoader.java b/src/main/java/act/test/util/YamlLoader.java index 4579a0532..9b80b48fc 100644 --- a/src/main/java/act/test/util/YamlLoader.java +++ b/src/main/java/act/test/util/YamlLoader.java @@ -93,7 +93,7 @@ public YamlLoader() { * @param modelPackage * @param modelPackages */ - protected YamlLoader(String modelPackage, String... modelPackages) { + public YamlLoader(String modelPackage, String... modelPackages) { resetModelPackages(); loadConfig(); addModelPackages(modelPackage, modelPackages); From 9e960fff0df6b29bc2eb281d3ff3319b43b6b2ee Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 16 Oct 2018 10:56:54 +1100 Subject: [PATCH 164/730] CSRF - the XSRF token cookie shall not be set as httpOnly #883 --- CHANGELOG.md | 1 + src/main/java/act/conf/AppConfig.java | 2 +- src/main/java/act/security/CSRF.java | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5557d48c1..216ea67e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* CSRF - the XSRF token cookie shall not be set as httpOnly #883 * Test - partition scenarios #877 * Add `SysEventId.POST_STARTED` #882 * Support opt-out jars from managed classloader by specifying file name prefix in `act.jar.black.list` #881 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 8269820b8..1bba1745f 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -678,7 +678,7 @@ protected T csrfCookieName(String s) { public String csrfCookieName() { if (null == csrfCookieName) { - csrfCookieName = get(CSRF_COOKIE_NAME, cookieName("xsrf-token")); + csrfCookieName = get(CSRF_COOKIE_NAME, "XSRF-TOKEN"); } return csrfCookieName; } diff --git a/src/main/java/act/security/CSRF.java b/src/main/java/act/security/CSRF.java index d9b9a83d8..e9ffec246 100644 --- a/src/main/java/act/security/CSRF.java +++ b/src/main/java/act/security/CSRF.java @@ -207,6 +207,7 @@ public void setCookieAndRenderArgs(ActionContext context) { cookie.secure(context.config().sessionSecure()); cookie.domain(cookieDomain); cookie.path("/"); + cookie.httpOnly(false); context.resp().addCookie(cookie); csrfProtector.outputToken(token, cookieName, cookieDomain, context); } From d5fe70fc023ee721a572de25cf2c2cd535fc6475 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 22 Oct 2018 22:18:31 +1100 Subject: [PATCH 165/730] make jquery extension library process xsrf token cookie automatically #884; add test app for GH885 and GH886 --- CHANGELOG.md | 1 + src/main/java/act/conf/ConfAdmin.java | 17 +- src/main/java/act/db/DaoBase.java | 2 + src/main/java/act/util/LogSupport.java | 1 + .../resources/asset/~act/js/jquery.ext.js | 59 +- src/main/resources/asset/~act/js/riotjs.js | 4 +- testapps/GH885/.gitignore | 19 + testapps/GH885/pom.xml | 28 + testapps/GH885/src/main/java/gh885/Main.java | 22 + .../GH885/src/main/resources/app.properties | 1 + testapps/GH885/src/main/resources/logback.xml | 110 +++ testapps/GH886/.gitignore | 19 + testapps/GH886/pom.xml | 34 + testapps/GH886/run_dev | 3 + testapps/GH886/run_dev.bat | 2 + testapps/GH886/run_e2e | 3 + testapps/GH886/run_e2e.bat | 2 + testapps/GH886/run_prod | 10 + .../GH886/src/main/java/gh886/AppEntry.java | 22 + .../src/main/resources/conf/app.properties | 801 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + .../src/main/resources/e2e/scenarios.yml | 53 ++ testapps/GH886/src/main/resources/logback.xml | 115 +++ .../GH886/src/main/resources/rythm/test.html | 9 + 25 files changed, 1340 insertions(+), 7 deletions(-) create mode 100644 testapps/GH885/.gitignore create mode 100644 testapps/GH885/pom.xml create mode 100644 testapps/GH885/src/main/java/gh885/Main.java create mode 100644 testapps/GH885/src/main/resources/app.properties create mode 100644 testapps/GH885/src/main/resources/logback.xml create mode 100644 testapps/GH886/.gitignore create mode 100644 testapps/GH886/pom.xml create mode 100755 testapps/GH886/run_dev create mode 100755 testapps/GH886/run_dev.bat create mode 100755 testapps/GH886/run_e2e create mode 100755 testapps/GH886/run_e2e.bat create mode 100755 testapps/GH886/run_prod create mode 100644 testapps/GH886/src/main/java/gh886/AppEntry.java create mode 100644 testapps/GH886/src/main/resources/conf/app.properties create mode 100644 testapps/GH886/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH886/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH886/src/main/resources/e2e/scenarios.yml create mode 100644 testapps/GH886/src/main/resources/logback.xml create mode 100644 testapps/GH886/src/main/resources/rythm/test.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 216ea67e4..9eb0ce8c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* make jquery extension library process xsrf token cookie automatically #884 * CSRF - the XSRF token cookie shall not be set as httpOnly #883 * Test - partition scenarios #877 * Add `SysEventId.POST_STARTED` #882 diff --git a/src/main/java/act/conf/ConfAdmin.java b/src/main/java/act/conf/ConfAdmin.java index 7553746bc..3ac18e0d1 100644 --- a/src/main/java/act/conf/ConfAdmin.java +++ b/src/main/java/act/conf/ConfAdmin.java @@ -23,12 +23,18 @@ import act.Act; import act.cli.Command; import act.cli.Optional; +import act.controller.annotation.UrlContext; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; import org.osgl.util.C; import org.osgl.util.S; -import javax.inject.Inject; import java.util.List; +import javax.inject.Inject; +import javax.inject.Singleton; +@UrlContext("conf") +@Singleton public class ConfAdmin { @Inject @@ -54,4 +60,13 @@ public List list( return list; } + @GetAction({"csrf", "xsrf"}) + public JSONObject csrfConf() { + JSONObject retVal = new JSONObject(); + retVal.put("cookieName", appConfig.csrfCookieName()); + retVal.put("headerName", appConfig.csrfHeaderName()); + retVal.put("paramName", appConfig.csrfParamName()); + return retVal; + } + } diff --git a/src/main/java/act/db/DaoBase.java b/src/main/java/act/db/DaoBase.java index b9951cf22..d2fd3f18f 100644 --- a/src/main/java/act/db/DaoBase.java +++ b/src/main/java/act/db/DaoBase.java @@ -23,6 +23,7 @@ import act.app.security.SecurityContext; import act.inject.param.NoBind; import act.util.ActContext; +import act.util.LogSupport; import org.osgl.$; import org.osgl.util.C; import org.osgl.util.Generics; @@ -36,6 +37,7 @@ //@InheritedStateless @NoBind public abstract class DaoBase> + extends LogSupport implements Dao { private ActContext appCtx; diff --git a/src/main/java/act/util/LogSupport.java b/src/main/java/act/util/LogSupport.java index 72963e803..d9d04ea1e 100644 --- a/src/main/java/act/util/LogSupport.java +++ b/src/main/java/act/util/LogSupport.java @@ -37,6 +37,7 @@ public class LogSupport { public static final String TILD_LINE = S.times('~', 80); @NoBind + @Stateless protected final transient Logger logger; public LogSupport() { diff --git a/src/main/resources/asset/~act/js/jquery.ext.js b/src/main/resources/asset/~act/js/jquery.ext.js index b9da8cd7a..00e70bba2 100644 --- a/src/main/resources/asset/~act/js/jquery.ext.js +++ b/src/main/resources/asset/~act/js/jquery.ext.js @@ -4,6 +4,52 @@ if (typeof String.prototype.contains != 'function') { }; } +function __processCsrfSetup(setup) { + try { + if (jQuery.csrfConf && jQuery.csrfConf.cookieName && jQuery.csrfConf.headerName && "post" === submitMethod) { + var token = jQuery.csrfConf.token + if (token) { + setup.beforeSend = function(xhr) { + xhr.setRequestHeader(jQuery.csrfConf.headerName, token) + } + } + } + } catch (e) { + console.warn(e) + } +} + +function __processCsrfForm() { + var csrfToken = jQuery.csrfConf.token + if (csrfToken) { + jQuery('form:not(.no-csrf)').each(function() { + var $form = $(this) + if ($form.children('input[name=' + jQuery.csrfConf.paramName + ']').length == 0) { + $form.append('') + } + }) + } +} + +jQuery.getJSON('/~/conf/csrf', function(csrfConf) { + jQuery.csrfConf = csrfConf; + jQuery.csrfConf.token = jQuery.cookie(csrfConf.cookieName) + __processCsrfForm() +}) + +if (!jQuery.cookie) { + jQuery.cookie = function(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for(var i=0;i < ca.length;i++) { + var c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1,c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); + } + return false; + } +} + jQuery.createWebSocket = function(path) { if (!path.startsWith('/')) { var pathname = window.location.pathname @@ -39,13 +85,16 @@ jQuery.each(["get", "post", "put", "delete", "patch" ], function (i, method) { submitMethod = "post"; } - return jQuery.ajax({ + var setup = { url: url, type: submitMethod, dataType: type, data: data, success: callback - }).always(checkAjaxRedirect); + } + + __processCsrfSetup(setup) + return jQuery.ajax(setup).always(checkAjaxRedirect); }; }); @@ -71,12 +120,14 @@ jQuery.each(["getJSON", "postJSON", "putJSON", "deleteJSON", "patchJSON"], funct url = url +"&now="+ new Date().getTime(); } } - return jQuery.ajax({ + var setup = { url: url, type: submitMethod.replace("JSON", ""), dataType: "json", data: data, success: callback - }).always(checkAjaxRedirect); + } + __processCsrfSetup(setup) + return jQuery.ajax(setup).always(checkAjaxRedirect); }; }); diff --git a/src/main/resources/asset/~act/js/riotjs.js b/src/main/resources/asset/~act/js/riotjs.js index 6bd7d1a4e..58098c843 100644 --- a/src/main/resources/asset/~act/js/riotjs.js +++ b/src/main/resources/asset/~act/js/riotjs.js @@ -1,2 +1,2 @@ -/* Riot v3.11.2, @license MIT */ -var e,t;e=this,t=function(){"use strict";function s(e,t){return(t||document).querySelector(e)}var t,r,x=[],_={},a="yield",y="__global_mixin",A="riot-",u=["ref","data-ref"],p="data-is",f="if",d="each",n="no-reorder",O="show",N="hide",i="key",b="__riot-events__",c="string",F="object",o="undefined",l="function",h="http://www.w3.org/1999/xlink",m="http://www.w3.org/2000/svg",g=/^xlink:(\w+)/,v=typeof window===o?void 0:window,w=/^on/,E=/([-\w]+) ?= ?(?:"([^"]*)|'([^']*)|({[^}]*}))/g,C={viewbox:"viewBox",preserveaspectratio:"preserveAspectRatio"},j=/^(?:disabled|checked|readonly|required|allowfullscreen|auto(?:focus|play)|compact|controls|default|formnovalidate|hidden|ismap|itemscope|loop|multiple|muted|no(?:resize|shade|validate|wrap)?|open|reversed|seamless|selected|sortable|truespeed|typemustmatch)$/,S=0|(v&&v.document||{}).documentMode;function k(e){return"svg"===e?document.createElementNS(m,e):document.createElement(e)}function T(e,t,r){var n=g.exec(t);n&&n[1]?e.setAttributeNS(h,n[1],r):e.setAttribute(t,r)}var e,L,I={},R=!1;v&&(e=k("style"),L=s("style[type=riot]"),T(e,"type","text/css"),L?(L.id&&(e.id=L.id),L.parentNode.replaceChild(e,L)):document.head.appendChild(e),r=(t=e).styleSheet);var M={styleNode:t,add:function(e,t){I[t]=e,R=!0},inject:function(){if(v&&R){R=!1;var e=Object.keys(I).map(function(e){return I[e]}).join("\n");r?r.cssText=e:t.innerHTML=e}},remove:function(e){delete I[e],R=!0}},P=function(){var u=["case","default","do","else","in","instanceof","prefix","return","typeof","void","yield"],c=u.reduce(function(e,t){return e+t.slice(-1)},""),l=/^\/(?=[^*>/])[^[/\\]*(?:(?:\\.|\[(?:\\.|[^\]\\]*)*\])[^[\\/]*)*?\/[gimuy]*/,p=/[$\w]/;function f(e,t){for(;0<=--t&&/\s/.test(e[t]););return t}return function(e,t){var r=/.*/g,n=r.lastIndex=t++,i=r.exec(e)[0].match(l);if(i){var o=n+i[0].length,s=e[n=f(e,n)];if(n<0||~"[{(,;:?=|&!^~>%*/".indexOf(s))return o;if("."===s)"."===e[n-1]&&(t=o);else if("+"===s||"-"===s)(e[--n]!==s||(n=f(e,n))<0||!p.test(e[n]))&&(t=o);else if(~c.indexOf(s)){for(var a=n+1;0<=--n&&p.test(e[n]););~u.indexOf(e.slice(n+1,a))&&(t=o)}}return t}}(),$=function(e){var t,r,n="g",i=/"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|`[^`\\]*(?:\\[\S\s][^`\\]*)*`/g,o=i.source+"|"+/(?:\breturn\s+|(?:[$\w\)\]]|\+\+|--)\s*(\/)(?![*\/]))/.source+"|"+/\/(?=[^*\/])[^[\/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[\/\\]*)*?([^<]\/)[gim]*/.source,s=RegExp("[\\x00-\\x1F<>a-zA-Z0-9'\",;\\\\]"),a=/(?=[[\]()*+?.^$|])/g,u=i.source+"|"+/(\/)(?![*\/])/.source,x={"(":RegExp("([()])|"+u,n),"[":RegExp("([[\\]])|"+u,n),"{":RegExp("([{}])|"+u,n)},c="{ }",l=["{","}","{","}",/{[^}]*}/,/\\([{}])/g,/\\({)|{/g,RegExp("\\\\(})|([[({])|(})|"+u,n),c,/^\s*{\^?\s*([$\w]+)(?:\s*,\s*(\S+))?\s+in\s+(\S.*)\s*}/,/(^|[^\\]){=[\S\s]*?}/],p=void 0,y=[];function f(e){return e}function d(e,t){return t||(t=y),new RegExp(e.source.replace(/{/g,t[2]).replace(/}/g,t[3]),e.global?n:"")}function h(e){if(e===c)return l;var t=e.split(" ");if(2!==t.length||s.test(e))throw new Error('Unsupported brackets "'+e+'"');return(t=t.concat(e.replace(a,"\\").split(" ")))[4]=d(1 %s",e.riotData.tagName||"Unknown tag",this.tmpl),console.log(this.data))}.bind({data:t,tmpl:e})):e}n.hasExpr=$.hasExpr,n.loopKeys=$.loopKeys,n.clearCache=function(){r={}},n.errorHandler=null;var a=/\u2057/g,u=/\u2057(\d+)~/g;var l=/^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/,p={"(":/[()]/g,"[":/[[\]]/g,"{":/[{}]/g};function c(o,e,t){if(o=o.replace(/\s+/g," ").trim().replace(/\ ?([[\({},?\.:])\ ?/g,"$1")){for(var r,n=[],i=0;o&&(r=o.match(l))&&!r.index;){var s,a,u=/,|([[{(])|$/g;for(o=RegExp.rightContext,s=r[2]?t[r[2]].slice(1,-1).trim().replace(/\s+/g," "):r[1];a=(r=u.exec(o))[1];)c(a,u);a=o.slice(0,r.index),o=RegExp.rightContext,n[i++]=d(a,1,s)}o=i?1'+t+"","application/xml").documentElement,!0);e.appendChild(n)}else e.innerHTML=t}function Y(e,t){if(e)for(var r;r=E.exec(e);)t(r[1].toLowerCase(),r[2]||r[3]||r[4])}function ee(){return document.createDocumentFragment()}function te(e,t,r){e.insertBefore(t,r.parentNode&&r)}function re(r){return Object.keys(r).reduce(function(e,t){return e+" "+t+": "+r[t]+";"},"")}function ne(e,t,r){if(e){var n,i=t(e,r);if(!1===i)return;for(e=e.firstChild;e;)n=e.nextSibling,ne(e,t,i),e=n}}var ie=Object.freeze({$$:G,$:s,createDOMPlaceholder:K,mkEl:k,setAttr:T,toggleVisibility:W,getAttr:J,remAttr:Q,setInnerHTML:X,walkAttrs:Y,createFrag:ee,safeInsert:te,styleObjectToString:re,walkNodes:ne});function oe(e){return V(e)||null===e}function se(e){return oe(e)||""===e}function ae(e){return typeof e===l}function ue(e){return e&&typeof e===F}function ce(e){var t=e.ownerSVGElement;return!!t||null===t}function le(e){return Array.isArray(e)||e instanceof Array}function pe(e){return j.test(e)}function fe(e){return typeof e===c}var de=Object.freeze({isBlank:se,isFunction:ae,isObject:ue,isSvg:ce,isWritable:B,isArray:le,isBoolAttr:pe,isNil:oe,isString:fe,isUndefined:V});function he(e,t){return-1!==e.indexOf(t)}function me(e,t){for(var r=e?e.length:0,n=0;n|>([\S\s]*?)<\/yield\s*>|>)/gi,Se=/]*)['"]\s*>([\S\s]*?)<\/yield\s*>/gi,ke=/|>([\S\s]*?)<\/yield\s*>)/gi,Te={tr:"tbody",th:"tr",td:"tr",col:"colgroup"},Le=S&&S<10?/^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?|opt(?:ion|group))$/:/^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?)$/,Ie="div",Re="svg";function Me(e,t,r){var n=e&&e.match(/^\s*<([-\w]+)/),i=n&&n[1].toLowerCase(),o=k(r?Re:Ie);return e=function(e,r){if(!Ce.test(e))return e;var n={};return r=r&&r.replace(Se,function(e,t,r){return n[t]=n[t]||r,""}).trim(),e.replace(ke,function(e,t,r){return n[t]||r||""}).replace(je,function(e,t){return r||t||""})}(e,t),Le.test(i)?o=function(e,t,r){var n="o"===r[0],i=n?"select>":"table>";if(e.innerHTML="<"+i+t.trim()+"=$.length,m=c&&p||!c&&!d||!I[r];m?((d=vt(k,{parent:O,isLoop:!0,isAnonymous:M,tagName:S,root:A.cloneNode(M),item:n,index:r},R)).mount(),h?function(e,t){t?Ue.call(this,e):e.appendChild(this.root)}.apply(d,[v||y,P]):function(e,t,r){r?Ue.apply(this,[e,t]):te(e,this.root,t.root)}.apply(d,[y,I[r],P]),h||$.splice(r,0,n),I.splice(r,0,d),T&&Ae(O.tags,S,d,!0)):f!==r&&c&&((C||he(g,$[f]))&&(function(e,t,r){r?ot.apply(this,[e,t]):te(e,this.root,t.root)}.apply(d,[y,I[r],P]),I.splice(r,0,I.splice(f,1)[0]),$.splice(r,0,$.splice(f,1)[0])),N.pos&&(d[N.pos]=r),!T&&d.tags&&function(t){var r=this;me(Object.keys(this.tags),function(e){it.apply(r.tags[e],[e,t])})}.call(d,r)),q(d.__,{item:n,index:r,parent:O}),b[r]=u,m||d.update(n)}else _++}),function(e,t,r){for(var n=t.length,i=e.length-r;i)[\S\s]*?-->/.source+"|"+zt,"g"),Bt=/<(-?[A-Za-z][-\w\xA0-\xFF]*)(?:\s+([^"'/>]*(?:(?:"[^"]*"|'[^']*'|\/[^>])[^'"/>]*)*)|\s*)(\/?)>/g,qt=/>[ \t]+<(-?[A-Za-z]|\/[-A-Za-z])/g,Dt=["style","src","d","value"],Zt=/^(?:input|img|br|wbr|hr|area|base|col|embed|keygen|link|meta|param|source|track)$/,Gt=/]*|"[^"]*")*)?>([\S\s]+?)<\/pre\s*>/gi,Kt=/^"(?:number|date(?:time)?|time|month|email|color)\b/i,Wt=/^\s*import(?!\w)(?:(?:\s|[^\s'"])*)['|"].*\n?/gm,Jt=/[ \t]+$/gm,Qt=Lt(/@#\d/,"x01"),Xt=Lt(/@#(\d+)/g,"x01"),Yt="#",er="⁗",tr='"',rr="'";function nr(e){var t,r=Vt;for(1!==e.indexOf("\r")&&(e=e.replace(/\r\n?/g,"\n")),r.lastIndex=0;t=r.exec(e);)"<"===t[0][0]&&(e=RegExp.leftContext+RegExp.rightContext,r.lastIndex=t[3]+1);return e}function ir(e,t){var r,n,i,o=[];for(Ut.lastIndex=0,e=e.replace(/\s+/g," ");r=Ut.exec(e);){var s=r[1].toLowerCase(),a=r[2];a?(a[0]!==tr&&(a=tr+(a[0]===rr?a.slice(1,-1):a)+tr),"type"===s&&Kt.test(a)?n=a:(Qt.test(a)&&("value"===s&&(i=1),-1!==Dt.indexOf(s)&&(s="riot-"+s)),o.push(s+"="+a))):o.push(s)}return n&&(i&&(n=tr+t._bp[0]+rr+n.slice(1,-1)+rr+t._bp[1]+tr),o.push("type="+n)),o.join(" ")}function or(e,t,r){var n=r._bp;if(e&&n[4].test(e)){for(var i,o=t.expr&&(t.parser||t.type)?lr:0,s=$.split(e,0,n),a=1;a"}),!t.whitespace){var r=[];/]/.test(e)&&(e=e.replace(Gt,function(e){return r.push(e),""})),e=e.trim().replace(/\s+/g," "),r.length&&(e=e.replace(/\u0002/g,function(){return r.shift()}))}return t.compact&&(e=e.replace(qt,"><$1")),sr(e,i).replace(Jt,"")}var ur=/^[ \t]*(((?:async|\*)\s*)?([$_A-Za-z][$\w]*))\s*\([^()]*\)\s*{/m;function cr(e){var t,r,n,i,o,s,a=[],u=RegExp,c=function(e,t){for(var r,n,i,o,s,a,u=new RegExp(Mt,"g"),c=$.skipRegex,l=0|t,p=[[]],f=[],d=u,h=d.lastIndex=l;a=d.exec(e);){if(o=a.index,s=d.lastIndex,n="",i=a[1]){if("{"===i)f.push("}");else if("}"===i){if(f.pop()!==i)throw new Error("Unexpected '}'");"`"===f[f.length-1]&&(i=f.pop())}else"/"===i&&o+1<(s=c(e,o))&&(n=e.slice(o,s));"`"===i&&(s=$t(e,s,f),n=e.slice(o,s),d=f.length?r||(r=new RegExp(Pt,"g")):u)}else"/"===(n=a[0])[0]?(n="*"===n[1]?" ":"",e=e.slice(l,o)+n+e.slice(s),s=o+n.length,n=""):2===n.length&&(n="");n&&(p[0].push(e.slice(h,o)),p.push(n),h=s),d.lastIndex=s}return p[0].push(e.slice(h)),p}(e);for(e=c.shift().join("<%>");t=e.match(ur);)a.push(u.leftContext),n=l(e=u.rightContext),i=t[1],o=t[2]||"",s=t[3],s=(r=!/^(?:if|while|for|switch|catch|function)$/.test(s))?t[0].replace(i,"this."+s+" ="+o+" function"):t[0],a.push(s,e.slice(0,n)),e=e.slice(n),r&&!/^\s*.\s*bind\b/.test(e)&&a.push(".bind(this)");return a.length&&(e=a.join("")+e),c.length&&(e=e.replace(/<%>/g,function(){return c.shift()})),e;function l(e){for(var t=/[{}]/g,r=1;r&&t.exec(e);)"{"===e[t.lastIndex-1]?++r:--r;return r?e.length:t.lastIndex}}function lr(e,t,r,n,i){return/\S/.test(e)?(r||(r=t.type),(t.parser||r&&It._req("js."+r,!0)||cr)(e,n,i).replace(/\r\n?/g,"\n").replace(Jt,"")):""}var pr=RegExp("([{}]|^)[; ]*((?:[^@ ;{}][^{}]*)?[^@ ;{}:] ?)(?={)|"+zt,"g");function fr(e,t,r,n){var i,o;(n=n||{},r)&&("css"!==r&&(e=It._req("css."+r,!0)(t,e,n.parserOpts||{},n.url)));return e=e.replace($.R_MLCOMMS,"").replace(/\s+/g," ").trim(),t&&(i=t,o=":scope",e=e.replace(pr,function(e,t,r){return r?(r=r.replace(/[^,]+/g,function(e){var t=e.trim();return 0===t.indexOf(i)?e:t&&"from"!==t&&"to"!==t&&"%"!==t.slice(-1)?t=t.indexOf(o)<0?i+" "+t+',[data-is="'+i+'"] '+t:t.replace(o,i)+","+t.replace(o,'[data-is="'+i+'"]'):e}),t?t+" "+r:r):e})),e}var dr=/\stype\s*=\s*(?:(['"])(.+?)\1|(\S+))/i,hr="\\s*=\\s*("+Ht+"|{[^}]+}|\\S+)",mr=/\/>\n|^<(?:\/?-?[A-Za-z][-\w\xA0-\xFF]*\s*|-?[A-Za-z][-\w\xA0-\xFF]*\s+[-\w:\xA0-\xFF][\S\s]*?)>\n/;function gr(e,t){return e?(e=rr+e.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+rr,t&&-1!==e.indexOf("\n")?e.replace(/\n/g,"\\n"):e):"''"}function vr(e){if(e){var t=e.match(dr);if(t=t&&(t[2]||t[3]))return t.replace("text/","")}return""}function xr(e,t){if(e){var r=e.match(RegExp("\\s"+t+hr,"i"));if(r=r&&r[1])return/^['"]/.test(r)?r.slice(1,-1):r}return""}function yr(e){var t=xr(e,"options").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'");return t?JSON.parse(t):null}var br=RegExp(/^([ \t]*)<(-?[A-Za-z][-\w\xA0-\xFF]*)(?:\s+([^'"/>]+(?:(?:@|\/[^>])[^'"/>]*)*)|\s*)?(?:\/>|>[ \t]*\n?([\S\s]*)^\1<\/\2\s*>|>(.*)<\/\2\s*>)/.source.replace("@",Ht),"gim"),wr=/]*)?>\n?([\S\s]*?)<\/script\s*>/gi,_r=/]*)?>\n?([\S\s]*?)<\/style\s*>/gi;var Ar,Or,Nr={compile:function(e,b,w){var _,A=[],t=e;b||(b={}),b.parserOptions=Ft({template:{},js:{},style:{}},b.parserOptions||{}),_=b.exclude?function(e){return b.exclude.indexOf(e)<0}:function(){return 1},w||(w="");var r,n,i,o,O=$.array(b.brackets);return b.template&&(r=t,n=w,i=b.template,o=b.parserOptions.template,t=It._req("html."+i,!0)(r,o,n)),t=nr(t).replace(br,function(e,t,l,r,n,i){var o,s,a,u,c,p,f,d,h="",m="",g="",v="",x=[];if(x._bp=O,l=l.toLowerCase(),r=r&&_("attribs")?sr(ir(or(r,b,x),x),x):"",(n||(n=i))&&/\S/.test(n))if(i)_("html")&&(g=ar(i,b,x));else{var y=function(e){if(/<[-\w]/.test(e))for(var t,r=e.lastIndexOf("<"),n=e.length;-1!==r;){if(t=e.slice(r,n).match(mr))return r+=t.index+t[0].length,"<-/>\n"===(t=e.slice(0,r)).slice(-5)&&(t=t.slice(0,-5)),[t,e.slice(r)];n=r,r=e.lastIndexOf("<",r-1)}return["",e]}((n=(n=(n=n.replace(RegExp("^"+t,"gm"),"")).replace(wr,function(e,t,r){if(_("js")){var n=(i=r,o=b,a=w,u=vr(s=t),c=xr(s,"src"),l=Ft({},o.parserOptions.js),!c&&lr(i,o,u,Ft(l,yr(s)),a));n&&(h+=(h?"\n":"")+n)}var i,o,s,a,u,c,l;return""})).replace(_r,function(e,t,r){var n,i,o,s,a,u,c;return _("css")&&(m+=(m?" ":"")+(n=r,o=t,s=w,a=l,u=Ft({},(i=b).parserOptions.style),c={parserOpts:Ft(u,yr(o)),url:s},fr(n,a,vr(o)||i.style,c))),""})).replace(Jt,""));_("html")&&(g=ar(y[0],b,x)),_("js")&&((n=lr(y[1],b,null,null,w))&&(h+=(h?"\n":"")+n),h=h.replace(Wt,function(e){return v+=e.trim()+"\n",""}))}return h=/\S/.test(h)?h.replace(/\n{3,}/g,"\n\n"):"",b.entities?(A.push({tagName:l,html:g,css:m,attribs:r,js:h,imports:v}),""):(o=l,s=g,a=m,u=r,c=h,p=v,f=b.debug?",\n ":", ",d="});",c&&"\n"!==c.slice(-1)&&(d="\n"+d),p+"riot.tag2('"+o+rr+f+gr(s,1)+f+gr(a)+f+gr(u)+", function(opts) {\n"+c+d)}),b.entities?A:t},compileHTML:function(e,t,r){return Array.isArray(t)?(r=t,t={}):(r||(r=[]),t||(t={})),r._bp=$.array(t.brackets),ar(nr(e),t,r)},compileCSS:function(e,t,r){return t&&"object"==typeof t?(r=t,t=""):r||(r={}),fr(e,r.tagName,t,r)},compileJS:function(e,t,r,n){return"string"==typeof t&&(n=r,r=t,t={}),r&&"object"==typeof r&&(n=r,r=""),n||(n={}),lr(e,t||{},r,n.parserOptions,n.url)},parsers:It,version:"v3.5.1"};function Er(e,t,r){var n=new XMLHttpRequest;n.onreadystatechange=function(){4===n.readyState&&(200===n.status||!n.status&&n.responseText.length?t(n.responseText,r,e):Sr.error('"'+e+'" not found'))},n.onerror=function(e){return Sr.error(e)},n.open("GET",e,!0),n.send("")}function Cr(e,t){if(typeof e===c){var r=k("script"),n=document.documentElement;t&&(e+="\n//# sourceURL="+t+".js"),r.text=e,n.appendChild(r),n.removeChild(r)}}var jr=Nr.parsers;function Sr(e,i,t){if(typeof e===c){if(ue(i)&&(t=i,i=!1),/^\s*/])[^[/\\]*(?:(?:\\.|\[(?:\\.|[^\]\\]*)*\])[^[\\/]*)*?\/[gimuy]*/,p=/[$\w]/;function f(e,t){for(;0<=--t&&/\s/.test(e[t]););return t}return function(e,t){var r=/.*/g,n=r.lastIndex=t++,i=r.exec(e)[0].match(l);if(i){var o=n+i[0].length,s=e[n=f(e,n)];if(n<0||~"[{(,;:?=|&!^~>%*/".indexOf(s))return o;if("."===s)"."===e[n-1]&&(t=o);else if("+"===s||"-"===s)(e[--n]!==s||(n=f(e,n))<0||!p.test(e[n]))&&(t=o);else if(~c.indexOf(s)){for(var a=n+1;0<=--n&&p.test(e[n]););~u.indexOf(e.slice(n+1,a))&&(t=o)}}return t}}(),$=function(e){var t,r,n="g",i=/"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|`[^`\\]*(?:\\[\S\s][^`\\]*)*`/g,o=i.source+"|"+/(?:\breturn\s+|(?:[$\w\)\]]|\+\+|--)\s*(\/)(?![*\/]))/.source+"|"+/\/(?=[^*\/])[^[\/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[\/\\]*)*?([^<]\/)[gim]*/.source,s=RegExp("[\\x00-\\x1F<>a-zA-Z0-9'\",;\\\\]"),a=/(?=[[\]()*+?.^$|])/g,u=i.source+"|"+/(\/)(?![*\/])/.source,x={"(":RegExp("([()])|"+u,n),"[":RegExp("([[\\]])|"+u,n),"{":RegExp("([{}])|"+u,n)},c="{ }",l=["{","}","{","}",/{[^}]*}/,/\\([{}])/g,/\\({)|{/g,RegExp("\\\\(})|([[({])|(})|"+u,n),c,/^\s*{\^?\s*([$\w]+)(?:\s*,\s*(\S+))?\s+in\s+(\S.*)\s*}/,/(^|[^\\]){=[\S\s]*?}/],p=void 0,y=[];function f(e){return e}function d(e,t){return t||(t=y),new RegExp(e.source.replace(/{/g,t[2]).replace(/}/g,t[3]),e.global?n:"")}function h(e){if(e===c)return l;var t=e.split(" ");if(2!==t.length||s.test(e))throw new Error('Unsupported brackets "'+e+'"');return(t=t.concat(e.replace(a,"\\").split(" ")))[4]=d(1 %s",e.riotData.tagName||"Unknown tag",this.tmpl),console.log(this.data))}.bind({data:t,tmpl:e})):e}n.hasExpr=$.hasExpr,n.loopKeys=$.loopKeys,n.clearCache=function(){r={}},n.errorHandler=null;var a=/\u2057/g,u=/\u2057(\d+)~/g;var l=/^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/,p={"(":/[()]/g,"[":/[[\]]/g,"{":/[{}]/g};function c(o,e,t){if(o=o.replace(/\s+/g," ").trim().replace(/\ ?([[\({},?\.:])\ ?/g,"$1")){for(var r,n=[],i=0;o&&(r=o.match(l))&&!r.index;){var s,a,u=/,|([[{(])|$/g;for(o=RegExp.rightContext,s=r[2]?t[r[2]].slice(1,-1).trim().replace(/\s+/g," "):r[1];a=(r=u.exec(o))[1];)c(a,u);a=o.slice(0,r.index),o=RegExp.rightContext,n[i++]=d(a,1,s)}o=i?1'+t+"","application/xml").documentElement,!0);e.appendChild(n)}else e.innerHTML=t}function Y(e,t){if(e)for(var r;r=E.exec(e);)t(r[1].toLowerCase(),r[2]||r[3]||r[4])}function ee(){return document.createDocumentFragment()}function te(e,t,r){e.insertBefore(t,r.parentNode&&r)}function re(r){return Object.keys(r).reduce(function(e,t){return e+" "+t+": "+r[t]+";"},"")}function ne(e,t,r){if(e){var n,i=t(e,r);if(!1===i)return;for(e=e.firstChild;e;)n=e.nextSibling,ne(e,t,i),e=n}}var ie=Object.freeze({$$:G,$:s,createDOMPlaceholder:K,mkEl:k,setAttr:T,toggleVisibility:W,getAttr:J,remAttr:Q,setInnerHTML:X,walkAttrs:Y,createFrag:ee,safeInsert:te,styleObjectToString:re,walkNodes:ne});function oe(e){return V(e)||null===e}function se(e){return oe(e)||""===e}function ae(e){return typeof e===l}function ue(e){return e&&typeof e===F}function ce(e){var t=e.ownerSVGElement;return!!t||null===t}function le(e){return Array.isArray(e)||e instanceof Array}function pe(e){return j.test(e)}function fe(e){return typeof e===c}var de=Object.freeze({isBlank:se,isFunction:ae,isObject:ue,isSvg:ce,isWritable:B,isArray:le,isBoolAttr:pe,isNil:oe,isString:fe,isUndefined:V});function he(e,t){return-1!==e.indexOf(t)}function me(e,t){for(var r=e?e.length:0,n=0;n|>([\S\s]*?)<\/yield\s*>|>)/gi,Se=/]*)['"]\s*>([\S\s]*?)<\/yield\s*>/gi,ke=/|>([\S\s]*?)<\/yield\s*>)/gi,Te={tr:"tbody",th:"tr",td:"tr",col:"colgroup"},Le=S&&S<10?/^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?|opt(?:ion|group))$/:/^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?)$/,Ie="div",Re="svg";function Me(e,t,r){var n=e&&e.match(/^\s*<([-\w]+)/),i=n&&n[1].toLowerCase(),o=k(r?Re:Ie);return e=function(e,r){if(!Ce.test(e))return e;var n={};return r=r&&r.replace(Se,function(e,t,r){return n[t]=n[t]||r,""}).trim(),e.replace(ke,function(e,t,r){return n[t]||r||""}).replace(je,function(e,t){return r||t||""})}(e,t),Le.test(i)?o=function(e,t,r){var n="o"===r[0],i=n?"select>":"table>";if(e.innerHTML="<"+i+t.trim()+"=$.length,m=c&&p||!c&&!d||!I[r];m?((d=vt(k,{parent:O,isLoop:!0,isAnonymous:M,tagName:S,root:A.cloneNode(M),item:n,index:r},R)).mount(),h?function(e,t){t?Ue.call(this,e):e.appendChild(this.root)}.apply(d,[v||y,P]):function(e,t,r){r?Ue.apply(this,[e,t]):te(e,this.root,t.root)}.apply(d,[y,I[r],P]),h||$.splice(r,0,n),I.splice(r,0,d),T&&Ae(O.tags,S,d,!0)):f!==r&&c&&((C||he(g,$[f]))&&(function(e,t,r){r?ot.apply(this,[e,t]):te(e,this.root,t.root)}.apply(d,[y,I[r],P]),I.splice(r,0,I.splice(f,1)[0]),$.splice(r,0,$.splice(f,1)[0])),N.pos&&(d[N.pos]=r),!T&&d.tags&&function(t){var r=this;me(Object.keys(this.tags),function(e){it.apply(r.tags[e],[e,t])})}.call(d,r)),q(d.__,{item:n,index:r,parent:O}),b[r]=u,m||d.update(n)}else _++}),function(e,t,r){for(var n=t.length,i=e.length-r;i)[\S\s]*?-->/.source+"|"+zt,"g"),Bt=/<(-?[A-Za-z][-\w\xA0-\xFF]*)(?:\s+([^"'/>]*(?:(?:"[^"]*"|'[^']*'|\/[^>])[^'"/>]*)*)|\s*)(\/?)>/g,qt=/>[ \t]+<(-?[A-Za-z]|\/[-A-Za-z])/g,Dt=["style","src","d","value"],Zt=/^(?:input|img|br|wbr|hr|area|base|col|embed|keygen|link|meta|param|source|track)$/,Gt=/]*|"[^"]*")*)?>([\S\s]+?)<\/pre\s*>/gi,Kt=/^"(?:number|date(?:time)?|time|month|email|color)\b/i,Wt=/^\s*import(?!\w)(?:(?:\s|[^\s'"])*)['|"].*\n?/gm,Jt=/[ \t]+$/gm,Qt=Lt(/@#\d/,"x01"),Xt=Lt(/@#(\d+)/g,"x01"),Yt="#",er="⁗",tr='"',rr="'";function nr(e){var t,r=Vt;for(1!==e.indexOf("\r")&&(e=e.replace(/\r\n?/g,"\n")),r.lastIndex=0;t=r.exec(e);)"<"===t[0][0]&&(e=RegExp.leftContext+RegExp.rightContext,r.lastIndex=t[3]+1);return e}function ir(e,t){var r,n,i,o=[];for(Ut.lastIndex=0,e=e.replace(/\s+/g," ");r=Ut.exec(e);){var s=r[1].toLowerCase(),a=r[2];a?(a[0]!==tr&&(a=tr+(a[0]===rr?a.slice(1,-1):a)+tr),"type"===s&&Kt.test(a)?n=a:(Qt.test(a)&&("value"===s&&(i=1),-1!==Dt.indexOf(s)&&(s="riot-"+s)),o.push(s+"="+a))):o.push(s)}return n&&(i&&(n=tr+t._bp[0]+rr+n.slice(1,-1)+rr+t._bp[1]+tr),o.push("type="+n)),o.join(" ")}function or(e,t,r){var n=r._bp;if(e&&n[4].test(e)){for(var i,o=t.expr&&(t.parser||t.type)?lr:0,s=$.split(e,0,n),a=1;a"}),!t.whitespace){var r=[];/]/.test(e)&&(e=e.replace(Gt,function(e){return r.push(e),""})),e=e.trim().replace(/\s+/g," "),r.length&&(e=e.replace(/\u0002/g,function(){return r.shift()}))}return t.compact&&(e=e.replace(qt,"><$1")),sr(e,i).replace(Jt,"")}var ur=/^[ \t]*(((?:async|\*)\s*)?([$_A-Za-z][$\w]*))\s*\([^()]*\)\s*{/m;function cr(e){var t,r,n,i,o,s,a=[],u=RegExp,c=function(e,t){for(var r,n,i,o,s,a,u=new RegExp(Mt,"g"),c=$.skipRegex,l=0|t,p=[[]],f=[],d=u,h=d.lastIndex=l;a=d.exec(e);){if(o=a.index,s=d.lastIndex,n="",i=a[1]){if("{"===i)f.push("}");else if("}"===i){if(f.pop()!==i)throw new Error("Unexpected '}'");"`"===f[f.length-1]&&(i=f.pop())}else"/"===i&&o+1<(s=c(e,o))&&(n=e.slice(o,s));"`"===i&&(s=$t(e,s,f),n=e.slice(o,s),d=f.length?r||(r=new RegExp(Pt,"g")):u)}else"/"===(n=a[0])[0]?(n="*"===n[1]?" ":"",e=e.slice(l,o)+n+e.slice(s),s=o+n.length,n=""):2===n.length&&(n="");n&&(p[0].push(e.slice(h,o)),p.push(n),h=s),d.lastIndex=s}return p[0].push(e.slice(h)),p}(e);for(e=c.shift().join("<%>");t=e.match(ur);)a.push(u.leftContext),n=l(e=u.rightContext),i=t[1],o=t[2]||"",s=t[3],s=(r=!/^(?:if|while|for|switch|catch|function)$/.test(s))?t[0].replace(i,"this."+s+" ="+o+" function"):t[0],a.push(s,e.slice(0,n)),e=e.slice(n),r&&!/^\s*.\s*bind\b/.test(e)&&a.push(".bind(this)");return a.length&&(e=a.join("")+e),c.length&&(e=e.replace(/<%>/g,function(){return c.shift()})),e;function l(e){for(var t=/[{}]/g,r=1;r&&t.exec(e);)"{"===e[t.lastIndex-1]?++r:--r;return r?e.length:t.lastIndex}}function lr(e,t,r,n,i){return/\S/.test(e)?(r||(r=t.type),(t.parser||r&&It._req("js."+r,!0)||cr)(e,n,i).replace(/\r\n?/g,"\n").replace(Jt,"")):""}var pr=RegExp("([{}]|^)[; ]*((?:[^@ ;{}][^{}]*)?[^@ ;{}:] ?)(?={)|"+zt,"g");function fr(e,t,r,n){var i,o;(n=n||{},r)&&("css"!==r&&(e=It._req("css."+r,!0)(t,e,n.parserOpts||{},n.url)));return e=e.replace($.R_MLCOMMS,"").replace(/\s+/g," ").trim(),t&&(i=t,o=":scope",e=e.replace(pr,function(e,t,r){return r?(r=r.replace(/[^,]+/g,function(e){var t=e.trim();return 0===t.indexOf(i)?e:t&&"from"!==t&&"to"!==t&&"%"!==t.slice(-1)?t=t.indexOf(o)<0?i+" "+t+',[data-is="'+i+'"] '+t:t.replace(o,i)+","+t.replace(o,'[data-is="'+i+'"]'):e}),t?t+" "+r:r):e})),e}var dr=/\stype\s*=\s*(?:(['"])(.+?)\1|(\S+))/i,hr="\\s*=\\s*("+Ht+"|{[^}]+}|\\S+)",mr=/\/>\n|^<(?:\/?-?[A-Za-z][-\w\xA0-\xFF]*\s*|-?[A-Za-z][-\w\xA0-\xFF]*\s+[-\w:\xA0-\xFF][\S\s]*?)>\n/;function gr(e,t){return e?(e=rr+e.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+rr,t&&-1!==e.indexOf("\n")?e.replace(/\n/g,"\\n"):e):"''"}function vr(e){if(e){var t=e.match(dr);if(t=t&&(t[2]||t[3]))return t.replace("text/","")}return""}function xr(e,t){if(e){var r=e.match(RegExp("\\s"+t+hr,"i"));if(r=r&&r[1])return/^['"]/.test(r)?r.slice(1,-1):r}return""}function yr(e){var t=xr(e,"options").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'");return t?JSON.parse(t):null}var br=RegExp(/^([ \t]*)<(-?[A-Za-z][-\w\xA0-\xFF]*)(?:\s+([^'"/>]+(?:(?:@|\/[^>])[^'"/>]*)*)|\s*)?(?:\/>|>[ \t]*\n?([\S\s]*)^\1<\/\2\s*>|>(.*)<\/\2\s*>)/.source.replace("@",Ht),"gim"),wr=/]*)?>\n?([\S\s]*?)<\/script\s*>/gi,_r=/]*)?>\n?([\S\s]*?)<\/style\s*>/gi;var Ar,Or,Nr={compile:function(e,b,w){var _,A=[],t=e;b||(b={}),b.parserOptions=Ft({template:{},js:{},style:{}},b.parserOptions||{}),_=b.exclude?function(e){return b.exclude.indexOf(e)<0}:function(){return 1},w||(w="");var r,n,i,o,O=$.array(b.brackets);return b.template&&(r=t,n=w,i=b.template,o=b.parserOptions.template,t=It._req("html."+i,!0)(r,o,n)),t=nr(t).replace(br,function(e,t,l,r,n,i){var o,s,a,u,c,p,f,d,h="",m="",g="",v="",x=[];if(x._bp=O,l=l.toLowerCase(),r=r&&_("attribs")?sr(ir(or(r,b,x),x),x):"",(n||(n=i))&&/\S/.test(n))if(i)_("html")&&(g=ar(i,b,x));else{var y=function(e){if(/<[-\w]/.test(e))for(var t,r=e.lastIndexOf("<"),n=e.length;-1!==r;){if(t=e.slice(r,n).match(mr))return r+=t.index+t[0].length,"<-/>\n"===(t=e.slice(0,r)).slice(-5)&&(t=t.slice(0,-5)),[t,e.slice(r)];n=r,r=e.lastIndexOf("<",r-1)}return["",e]}((n=(n=(n=n.replace(RegExp("^"+t,"gm"),"")).replace(wr,function(e,t,r){if(_("js")){var n=(i=r,o=b,a=w,u=vr(s=t),c=xr(s,"src"),l=Ft({},o.parserOptions.js),!c&&lr(i,o,u,Ft(l,yr(s)),a));n&&(h+=(h?"\n":"")+n)}var i,o,s,a,u,c,l;return""})).replace(_r,function(e,t,r){var n,i,o,s,a,u,c;return _("css")&&(m+=(m?" ":"")+(n=r,o=t,s=w,a=l,u=Ft({},(i=b).parserOptions.style),c={parserOpts:Ft(u,yr(o)),url:s},fr(n,a,vr(o)||i.style,c))),""})).replace(Jt,""));_("html")&&(g=ar(y[0],b,x)),_("js")&&((n=lr(y[1],b,null,null,w))&&(h+=(h?"\n":"")+n),h=h.replace(Wt,function(e){return v+=e.trim()+"\n",""}))}return h=/\S/.test(h)?h.replace(/\n{3,}/g,"\n\n"):"",b.entities?(A.push({tagName:l,html:g,css:m,attribs:r,js:h,imports:v}),""):(o=l,s=g,a=m,u=r,c=h,p=v,f=b.debug?",\n ":", ",d="});",c&&"\n"!==c.slice(-1)&&(d="\n"+d),p+"riot.tag2('"+o+rr+f+gr(s,1)+f+gr(a)+f+gr(u)+", function(opts) {\n"+c+d)}),b.entities?A:t},compileHTML:function(e,t,r){return Array.isArray(t)?(r=t,t={}):(r||(r=[]),t||(t={})),r._bp=$.array(t.brackets),ar(nr(e),t,r)},compileCSS:function(e,t,r){return t&&"object"==typeof t?(r=t,t=""):r||(r={}),fr(e,r.tagName,t,r)},compileJS:function(e,t,r,n){return"string"==typeof t&&(n=r,r=t,t={}),r&&"object"==typeof r&&(n=r,r=""),n||(n={}),lr(e,t||{},r,n.parserOptions,n.url)},parsers:It,version:"v3.5.1"};function Er(e,t,r){var n=new XMLHttpRequest;n.onreadystatechange=function(){4===n.readyState&&(200===n.status||!n.status&&n.responseText.length?t(n.responseText,r,e):Sr.error('"'+e+'" not found'))},n.onerror=function(e){return Sr.error(e)},n.open("GET",e,!0),n.send("")}function Cr(e,t){if(typeof e===c){var r=k("script"),n=document.documentElement;t&&(e+="\n//# sourceURL="+t+".js"),r.text=e,n.appendChild(r),n.removeChild(r)}}var jr=Nr.parsers;function Sr(e,i,t){if(typeof e===c){if(ue(i)&&(t=i,i=!1),/^\s* + + 4.0.0 + + act-gh885 + 1.8.8.8-SNAPSHOT + + ActFramework Github Issue #874 Reproduce App + + + org.actframework + act-starter-parent + 1.8.8.7-SNAPSHOT + + + + + 1.8 + gh885.Main + + + + + + + diff --git a/testapps/GH885/src/main/java/gh885/Main.java b/testapps/GH885/src/main/java/gh885/Main.java new file mode 100644 index 000000000..52f7c3579 --- /dev/null +++ b/testapps/GH885/src/main/java/gh885/Main.java @@ -0,0 +1,22 @@ +package gh885; + +import act.Act; +import org.osgl.inject.annotation.Configuration; +import org.osgl.mvc.annotation.GetAction; + +public class Main { + + @Configuration("foo.bar") + private String fooBar; + + @GetAction + public String test() { + return fooBar; + } + + public static void main(String[] args) throws Exception { + Act.start(); + } + +} + diff --git a/testapps/GH885/src/main/resources/app.properties b/testapps/GH885/src/main/resources/app.properties new file mode 100644 index 000000000..82fed97bc --- /dev/null +++ b/testapps/GH885/src/main/resources/app.properties @@ -0,0 +1 @@ +foo.bar=xyz diff --git a/testapps/GH885/src/main/resources/logback.xml b/testapps/GH885/src/main/resources/logback.xml new file mode 100644 index 000000000..91706deae --- /dev/null +++ b/testapps/GH885/src/main/resources/logback.xml @@ -0,0 +1,110 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH886/.gitignore b/testapps/GH886/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH886/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH886/pom.xml b/testapps/GH886/pom.xml new file mode 100644 index 000000000..f6c2ff965 --- /dev/null +++ b/testapps/GH886/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + act_issues + gh886 + 1.0-SNAPSHOT + + + org.actframework + act-starter-parent + 1.8.8.7-dld2-SNAPSHOT + + + + + 1.8 + gh886.AppEntry + + + + + org.actframework + act-hibernate + + + com.zaxxer + HikariCP + + + + diff --git a/testapps/GH886/run_dev b/testapps/GH886/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH886/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH886/run_dev.bat b/testapps/GH886/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH886/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH886/run_e2e b/testapps/GH886/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH886/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH886/run_e2e.bat b/testapps/GH886/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH886/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH886/run_prod b/testapps/GH886/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH886/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH886/src/main/java/gh886/AppEntry.java b/testapps/GH886/src/main/java/gh886/AppEntry.java new file mode 100644 index 000000000..152ee7b38 --- /dev/null +++ b/testapps/GH886/src/main/java/gh886/AppEntry.java @@ -0,0 +1,22 @@ +package gh886; + +import static act.controller.Controller.Util.renderTemplate; + +import act.Act; +import act.app.ActionContext; +import org.osgl.mvc.annotation.GetAction; + +public class AppEntry { + + @GetAction + public void test(ActionContext context, String vo) { + if (null != vo) { + context.renderArg("vo", vo); + } + renderTemplate("/test"); + } + + public static void main(String[] args) throws Exception { + Act.start(); + } +} diff --git a/testapps/GH886/src/main/resources/conf/app.properties b/testapps/GH886/src/main/resources/conf/app.properties new file mode 100644 index 000000000..3127fb7ae --- /dev/null +++ b/testapps/GH886/src/main/resources/conf/app.properties @@ -0,0 +1,801 @@ +api_doc=false +############################################## +# Application configuration +# act-1.8.8-RC11 +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy年MM月dd日 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy年MM月dd日 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=r2WMft6bZHxUCwiUf5gVRsXJ3iQuB2zSzKZosG3eX98iZNpR1fFfpFlRhjoSQMjm + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH886/src/main/resources/conf/prod/app.properties b/testapps/GH886/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..0798e5539 --- /dev/null +++ b/testapps/GH886/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC11 +############################################## +act.secret=xPBOinitJYM7dli8k1Ji93ERQ1DUzebQrrynkrUwH0U5FzCT2mZGZXhte51tj8Xq \ No newline at end of file diff --git a/testapps/GH886/src/main/resources/conf/uat/app.properties b/testapps/GH886/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..b00fbc901 --- /dev/null +++ b/testapps/GH886/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC11 +############################################## +act.secret=mPFALnfidBVV73tqkcImPCnopmaLpcCcktkCYyb02qusdTQvmP9o6bF6S1WYRFNp \ No newline at end of file diff --git a/testapps/GH886/src/main/resources/e2e/scenarios.yml b/testapps/GH886/src/main/resources/e2e/scenarios.yml new file mode 100644 index 000000000..9c5e791dc --- /dev/null +++ b/testapps/GH886/src/main/resources/e2e/scenarios.yml @@ -0,0 +1,53 @@ +Scenario(Hello Service): + description: a service says hello + interactions: + - description: send request to hello service without parameter + request: + method: GET + url: /hello + response: + text: Hello World # response text must be "Hello World" + - description: send request to hello servcie with parameter specified + request: + method: GET + url: /hello?who=ActFramework + response: + # this time we demonstrate how to verify text with a list of verifiers + text: + - eq: Hello ActFramework # value must be equal to "Hello ActFramework" + - contains: ActFramework # value must contains "ActFramework" + - starts: Hello # value must starts with "Hello" + - ends: Framework # value must ends with "Framework" + - description: send request to hello servcie with parameter specified and require JSON response + request: + accept: json # specify accept type is application/json + method: GET + url: /hello?who=Java + response: + json: # treat result as a JSON object + # act returns json result in `{"result": ...}` style + result: Hello Java # result property of the JSON object must be "Hello World" + +# Test Service#date() endpoint, which is available at `GET /date` endpoint +Scenario(Date Service): + description: A service returns an important date in the history + interactions: + - description: send request to the service + request: + method: GET + url: /date + response: + text: + - after: 1997-05-11 # the returned date should be after date 1997-05-11 + - before: 13/May/2018 # the returned date should be before date 13/May/2018 + - description: send request to the service and request response be JSON format + request: + accept: json + method: GET + url: /date + response: + json: # treat result as a JSON object + # act returns json result in `{"result": ...}` style + result: # thus we will use `result` to fetch the date + - after: 1997-05-11 # the returned date should be after date 1997-05-11 + - before: 13/May/2018 # the returned date should be before date 13/May/2018 \ No newline at end of file diff --git a/testapps/GH886/src/main/resources/logback.xml b/testapps/GH886/src/main/resources/logback.xml new file mode 100644 index 000000000..81946c4bc --- /dev/null +++ b/testapps/GH886/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH886/src/main/resources/rythm/test.html b/testapps/GH886/src/main/resources/rythm/test.html new file mode 100644 index 000000000..833ef24b7 --- /dev/null +++ b/testapps/GH886/src/main/resources/rythm/test.html @@ -0,0 +1,9 @@ + +@args String vo + + GH886 - @vo + + +

                                                                                                                                                                      @vo

                                                                                                                                                                      + + \ No newline at end of file From fb89b4a7b8fb26cdc5ae9f39c91f8083abaf0020 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 23 Oct 2018 21:04:04 +1100 Subject: [PATCH 166/730] `context.renderArg(key, val)` not cleared in prod mode #886 --- CHANGELOG.md | 1 + src/main/java/act/view/Template.java | 2 ++ src/main/java/act/view/TemplateBase.java | 5 +++++ src/main/java/act/view/ViewManager.java | 2 +- 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9eb0ce8c5..1fb70b4a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `context.renderArg(key, val)` not cleared in prod mode #886 * make jquery extension library process xsrf token cookie automatically #884 * CSRF - the XSRF token cookie shall not be set as httpOnly #883 * Test - partition scenarios #877 diff --git a/src/main/java/act/view/Template.java b/src/main/java/act/view/Template.java index 30e38a12f..5eb453a72 100644 --- a/src/main/java/act/view/Template.java +++ b/src/main/java/act/view/Template.java @@ -52,4 +52,6 @@ public interface Template { String render(ActionContext context); String render(MailerContext context); + + boolean supportCache(); } diff --git a/src/main/java/act/view/TemplateBase.java b/src/main/java/act/view/TemplateBase.java index f68599163..f19a674e7 100644 --- a/src/main/java/act/view/TemplateBase.java +++ b/src/main/java/act/view/TemplateBase.java @@ -65,6 +65,11 @@ public String render(MailerContext context) { return render(renderArgs); } + @Override + public boolean supportCache() { + return true; + } + /** * Sub class can implement this method to inject logic that needs to be done * before rendering happening diff --git a/src/main/java/act/view/ViewManager.java b/src/main/java/act/view/ViewManager.java index 99270be44..14f61780f 100644 --- a/src/main/java/act/view/ViewManager.java +++ b/src/main/java/act/view/ViewManager.java @@ -252,7 +252,7 @@ private Template getTemplate(ActContext context, AppConfig config, String path) } } } - if (null != template) { + if (null != template && template.supportCache()) { context.cacheTemplate(template); cache(path, template); } From 70a3d39ce44693f0e7cc0abbdaaad2a3d5e7ee4c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 23 Oct 2018 21:06:44 +1100 Subject: [PATCH 167/730] `context.renderArg(key, val)` not cleared in prod mode #886 --- src/main/java/act/view/ViewManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/act/view/ViewManager.java b/src/main/java/act/view/ViewManager.java index 14f61780f..9cc608529 100644 --- a/src/main/java/act/view/ViewManager.java +++ b/src/main/java/act/view/ViewManager.java @@ -216,7 +216,7 @@ public Template getTemplate(String path) { } } if (null != template) { - templateCache.put(path, template); + cache(path, template); } return template; } @@ -327,7 +327,7 @@ private Template cached(String key) { } private void cache(String key, Template template) { - if (Act.isProd()) { + if (template.supportCache() && Act.isProd()) { templateCache.put(key, template); } } From cfe364f5819c2e9c49d95b9f53db86ebea318536 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 23 Oct 2018 21:33:30 +1100 Subject: [PATCH 168/730] Route table: support whitespace in URL path #887 --- CHANGELOG.md | 1 + src/main/java/act/route/RouteTableRouterBuilder.java | 8 ++++---- testapps/GHIssues/src/main/resources/routes.conf | 1 + .../GHIssues/src/main/resources/test/scenarios/887.yml | 8 ++++++++ 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 testapps/GHIssues/src/main/resources/routes.conf create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/887.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fb70b4a9..1d46ce76c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Route table: support whitespace in URL path #887 * `context.renderArg(key, val)` not cleared in prod mode #886 * make jquery extension library process xsrf token cookie automatically #884 * CSRF - the XSRF token cookie shall not be set as httpOnly #883 diff --git a/src/main/java/act/route/RouteTableRouterBuilder.java b/src/main/java/act/route/RouteTableRouterBuilder.java index d0fb1b260..dc963fb31 100644 --- a/src/main/java/act/route/RouteTableRouterBuilder.java +++ b/src/main/java/act/route/RouteTableRouterBuilder.java @@ -25,10 +25,7 @@ import act.app.event.SysEventId; import org.osgl.http.H; import org.osgl.http.util.Path; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; -import org.osgl.util.Unsafe; +import org.osgl.util.*; import java.util.Iterator; import java.util.List; @@ -156,6 +153,9 @@ private void process(String line, Router router) { } if (itr.hasNext()) { path = itr.next(); + if (path.contains("%")) { + path = Codec.decodeUrl(path); + } } else { E.illegalArgumentIf(true, UNKNOWN); } diff --git a/testapps/GHIssues/src/main/resources/routes.conf b/testapps/GHIssues/src/main/resources/routes.conf new file mode 100644 index 000000000..8922eb485 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/routes.conf @@ -0,0 +1 @@ +GET /gh%20887 echo:887 \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/887.yml b/testapps/GHIssues/src/main/resources/test/scenarios/887.yml new file mode 100644 index 000000000..d77cee155 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/887.yml @@ -0,0 +1,8 @@ +Scenario(GH887): + description: "[887] Route table: support whitespace in URL path" + interactions: + - description: test + request: + get: "gh 887" + response: + text: 887 From d0db25f11240d1e84746d729d53d765cb094e71f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 24 Oct 2018 20:36:03 +1100 Subject: [PATCH 169/730] InterceptorMethodMetaInfo shal not extend clsInfo in case it is abstract --- .../java/act/controller/meta/InterceptorMethodMetaInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java index 69fdad7aa..6f34988ad 100644 --- a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java +++ b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java @@ -134,7 +134,7 @@ protected S.Buffer toStrBuffer(S.Buffer sb) { } public final InterceptorMethodMetaInfo extended(ControllerClassMetaInfo clsInfo) { - if (clsInfo.isMyAncestor(this.classInfo()) && !this.isStatic()) { + if (clsInfo.isMyAncestor(this.classInfo()) && !this.isStatic() && !clsInfo.isAbstract()) { return doExtend(clsInfo); } else { return this; From 633d4e5e53980316b3111e7641c8d379af786ebf Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 25 Oct 2018 10:25:39 +1100 Subject: [PATCH 170/730] Caused by: act.app.CompilationException: TestBase cannot be resolved to a type #889 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 5 +---- src/main/java/act/app/DevModeClassLoader.java | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d46ce76c..5f8e44a5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Caused by: act.app.CompilationException: TestBase cannot be resolved to a type #889 * Route table: support whitespace in URL path #887 * `context.renderArg(key, val)` not cleared in prod mode #886 * make jquery extension library process xsrf token cookie automatically #884 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index ac9e1ddd6..52d3ff4d7 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -358,12 +358,9 @@ public List testLibDirs() { return layoutDirs(ProjectLayout.F.TST_LIB.curry(layout())); } - public List allSourceDirs(boolean requireTestProfile) { + public List allSourceDirs() { List dirs = new ArrayList<>(); dirs.addAll(sourceDirs()); - if (!requireTestProfile || "test".equals(Act.profile())) { - dirs.addAll(testSourceDirs()); - } return dirs; } diff --git a/src/main/java/act/app/DevModeClassLoader.java b/src/main/java/act/app/DevModeClassLoader.java index af1496bcd..53fc520bc 100644 --- a/src/main/java/act/app/DevModeClassLoader.java +++ b/src/main/java/act/app/DevModeClassLoader.java @@ -166,7 +166,7 @@ public Source source(String className) { } private void preloadSources() { - List sourceRoots = app().allSourceDirs(true); + List sourceRoots = app().allSourceDirs(); for (final File sourceRoot : sourceRoots) { Files.filter(sourceRoot, JAVA_SOURCE, new $.Visitor() { @Override From 309fe6d819fbdfe14b7c7f66c1267e210d5e37a4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 25 Oct 2018 10:36:55 +1100 Subject: [PATCH 171/730] Stop loading API manager when running in `test` profile or `prod` mode #890 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 8 ++++++-- src/main/java/act/test/Test.java | 6 +++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f8e44a5f..e225eb965 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Stop loading API manager when running in `test` profile or `prod` mode #890 * Caused by: act.app.CompilationException: TestBase cannot be resolved to a type #889 * Route table: support whitespace in URL path #887 * `context.renderArg(key, val)` not cleared in prod mode #886 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 52d3ff4d7..765db504d 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -69,6 +69,7 @@ import act.route.*; import act.session.CookieSessionMapper; import act.session.SessionManager; +import act.test.Test; import act.util.*; import act.validation.Password; import act.view.ActErrorResult; @@ -657,7 +658,7 @@ public synchronized void refresh() { emit(ROUTER_INITIALIZED); loadRoutes(); emit(ROUTER_LOADED); - initApiManager(); + initApiManager(this); initSampleDataProviderManager(); initHttpClientService(); initCaptchaPluginManager(); @@ -1481,7 +1482,10 @@ private void shutdownJobManager() { } } - private void initApiManager() { + private void initApiManager(App app) { + if (Act.isProd() || Test.shallRunAutomatedTest(app)) { + return; + } apiManager = new ApiManager(this); } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 5ace3d3d0..ba703cb78 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -206,7 +206,7 @@ public void clearFixtures() { // 3. DB_SVC_LOADED @OnSysEvent(SysEventId.ACT_START) public void run(final App app) { - boolean run = $.bool(app.config().get("test.run")) || $.bool(app.config().get("e2e.run")) || "test".equalsIgnoreCase(Act.profile()) || "e2e".equalsIgnoreCase(Act.profile()); + boolean run = shallRunAutomatedTest(app); if (run) { app.jobManager().post(SysEventId.POST_STARTED, new Runnable() { @Override @@ -217,6 +217,10 @@ public void run() { } } + public static boolean shallRunAutomatedTest(App app) { + return $.bool(app.config().get("test.run")) || $.bool(app.config().get("e2e.run")) || "test".equalsIgnoreCase(Act.profile()) || "e2e".equalsIgnoreCase(Act.profile()); + } + public List run(App app, Keyword testId, boolean shutdownApp) { E.illegalStateIf(inProgress()); info("Start running test scenarios\n"); From 386b21a3150d650b2e43e9f781a50b2374dc6346 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 26 Oct 2018 06:56:36 +1100 Subject: [PATCH 172/730] minor tune logic in InterceptorMethodMetaInfo.extended(ControllerClassMetaInfo) --- .../java/act/controller/meta/InterceptorMethodMetaInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java index 6f34988ad..d80a9762e 100644 --- a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java +++ b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java @@ -134,7 +134,7 @@ protected S.Buffer toStrBuffer(S.Buffer sb) { } public final InterceptorMethodMetaInfo extended(ControllerClassMetaInfo clsInfo) { - if (clsInfo.isMyAncestor(this.classInfo()) && !this.isStatic() && !clsInfo.isAbstract()) { + if (!this.isStatic() && !clsInfo.isAbstract() && clsInfo.isMyAncestor(this.classInfo())) { return doExtend(clsInfo); } else { return this; From d7590c52becfbd33e3dc4b4c9b08cc51266a7b19 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 26 Oct 2018 15:39:24 +1100 Subject: [PATCH 173/730] Allow app to delay automate testing #894; Add `removeTag`, `reTag` method to `WebSocketContext` #892 --- CHANGELOG.md | 2 ++ src/main/java/act/test/Test.java | 17 ++++++++++- .../act/ws/WebSocketConnectionRegistry.java | 28 ++++++++++++++++++- src/main/java/act/ws/WebSocketContext.java | 24 ++++++++++++++++ 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e225eb965..f0a51a779 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* Allow app to delay automate testing #894 +* Add `removeTag`, `reTag` method to `WebSocketContext` #892 * Stop loading API manager when running in `test` profile or `prod` mode #890 * Caused by: act.app.CompilationException: TestBase cannot be resolved to a type #889 * Route table: support whitespace in URL path #887 diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index ba703cb78..a56396c7a 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -48,6 +48,7 @@ import java.lang.reflect.Type; import java.net.URL; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import javax.inject.Inject; @@ -206,12 +207,26 @@ public void clearFixtures() { // 3. DB_SVC_LOADED @OnSysEvent(SysEventId.ACT_START) public void run(final App app) { + Object o = app.config().get("test.delay"); + final $.Var delay = $.var(0l); + if (null != o) { + delay.set($.convert(o).to(Long.class)); + } boolean run = shallRunAutomatedTest(app); if (run) { app.jobManager().post(SysEventId.POST_STARTED, new Runnable() { @Override public void run() { - Test.this.run(app, null, true); + if (delay.get() > 0l) { + app.jobManager().delay(new Runnable() { + @Override + public void run() { + Test.this.run(app, null, true); + } + }, delay.get(), TimeUnit.SECONDS); + } else { + Test.this.run(app, null, true); + } } }); } diff --git a/src/main/java/act/ws/WebSocketConnectionRegistry.java b/src/main/java/act/ws/WebSocketConnectionRegistry.java index 91add3d04..d64c7a65b 100644 --- a/src/main/java/act/ws/WebSocketConnectionRegistry.java +++ b/src/main/java/act/ws/WebSocketConnectionRegistry.java @@ -155,14 +155,40 @@ public void deRegister(String key, Collection connections) signOff(key, connections); } + /** + * Detach a connection from a key. + * @param key the key + * @param connection the connection + */ public void signOff(String key, WebSocketConnection connection) { - ConcurrentMap connections = ensureConnectionList(key); + ConcurrentMap connections = registry.get(key); if (null == connections) { return; } connections.remove(connection); } + /** + * Remove a connection from this registry. + * + * This method is an alias of {@link #signOff(WebSocketConnection)}. + * + * @param connection the connection. + */ + public void deRegister(WebSocketConnection connection) { + signOff(connection); + } + + /** + * Remove a connection from all keys. + * @param connection the connection + */ + public void signOff(WebSocketConnection connection) { + for (ConcurrentMap connections : registry.values()) { + connections.remove(connection); + } + } + /** * Sign off a group of connections from the registry by key * diff --git a/src/main/java/act/ws/WebSocketContext.java b/src/main/java/act/ws/WebSocketContext.java index 8a6335835..823e77a09 100644 --- a/src/main/java/act/ws/WebSocketContext.java +++ b/src/main/java/act/ws/WebSocketContext.java @@ -108,6 +108,30 @@ public WebSocketContext tag(String label) { return this; } + /** + * Re-Tag the websocket connection hold by this context with label specified. + * This method will remove all previous tags on the websocket connection and then + * tag it with the new label. + * @param label the label. + * @return this websocket conext. + */ + public WebSocketContext reTag(String label) { + WebSocketConnectionRegistry registry = manager.tagRegistry(); + registry.signOff(connection); + registry.signIn(label, connection); + return this; + } + + /** + * Remove the websocket connection hold by this context from label specified + * @param label the label previously tagged the websocket connection + * @return this context + */ + public WebSocketContext removeTag(String label) { + manager.tagRegistry().deRegister(label, connection); + return this; + } + public String stringMessage() { return stringMessage; } From f5a520b1265d07078ada1b0e18898aa5021b6312 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Oct 2018 05:25:13 +1100 Subject: [PATCH 174/730] Failed to instantiate abstract class when building interceptor list in a rare scenario #888; fix legacy test app csrf test --- CHANGELOG.md | 1 + .../test/java/testapp/endpoint/CSRFTest.java | 2 +- .../meta/ControllerClassMetaInfo.java | 30 ++++++++++++++----- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0a51a779..dfa76a9c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Add `removeTag`, `reTag` method to `WebSocketContext` #892 * Stop loading API manager when running in `test` profile or `prod` mode #890 * Caused by: act.app.CompilationException: TestBase cannot be resolved to a type #889 +* Failed to instantiate abstract class when building interceptor list in a rare scenario #888 * Route table: support whitespace in URL path #887 * `context.renderArg(key, val)` not cleared in prod mode #886 * make jquery extension library process xsrf token cookie automatically #884 diff --git a/legacy-testapp/src/test/java/testapp/endpoint/CSRFTest.java b/legacy-testapp/src/test/java/testapp/endpoint/CSRFTest.java index a3e3b678e..cb8d35ce0 100644 --- a/legacy-testapp/src/test/java/testapp/endpoint/CSRFTest.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/CSRFTest.java @@ -53,7 +53,7 @@ public List retrieveCsrfToken($.Var csrf) throws IOException { List cookies = cookies(); List returnCookies = C.newList(); for (Cookie cookie : cookies) { - if ("act-xsrf-token".equals(cookie.name())) { + if ("xsrf-token".equalsIgnoreCase(cookie.name())) { csrf.set(cookie.value()); } else { returnCookies.add(cookie); diff --git a/src/main/java/act/controller/meta/ControllerClassMetaInfo.java b/src/main/java/act/controller/meta/ControllerClassMetaInfo.java index 49698e018..25f39a55e 100644 --- a/src/main/java/act/controller/meta/ControllerClassMetaInfo.java +++ b/src/main/java/act/controller/meta/ControllerClassMetaInfo.java @@ -310,6 +310,7 @@ public List finallyInterceptors() { } public ControllerClassMetaInfo merge(ControllerClassMetaInfoManager infoBase, App app) { + mergeFromSuperType(infoBase, app); mergeFromWithList(infoBase, app); mergeIntoActionList(infoBase, app); buildActionLookup(); @@ -391,6 +392,9 @@ private void _addWith(String clsName) { private void getAllWithList(final Set withList, final ControllerClassMetaInfoManager infoBase) { withList.addAll(this.withList); + } + + private ControllerClassMetaInfo superControllerClass(final ControllerClassMetaInfoManager infoBase) { if (null != superType) { final String superClass = superType.getClassName(); App app = App.instance(); @@ -407,11 +411,25 @@ private void getAllWithList(final Set withList, final ControllerClassMet } curSuperClass = node.name(); info = infoBase.controllerMetaInfo(curSuperClass); - } - if (null != info) { - withList.add(superClass); + if (null != info) { + if (info.isAbstract()) { + info = null; + } else { + return info; + } + } } } + return null; + } + + private void mergeFromSuperType(final ControllerClassMetaInfoManager infoBase, final App app) { + ControllerClassMetaInfo superType = superControllerClass(infoBase); + if (null == superType) { + return; + } + superType.merge(infoBase, app); + interceptors.mergeFrom(superType.interceptors, this); } private void mergeFromWithList(final ControllerClassMetaInfoManager infoBase, final App app) { @@ -435,11 +453,7 @@ private void mergeFromWithList(final ControllerClassMetaInfoManager infoBase, fi } if (null != withClassInfo) { withClassInfo.merge(infoBase, app); - if (isMyAncestor(withClassInfo)) { - interceptors.mergeFrom(withClassInfo.interceptors, me); - } else { - interceptors.mergeFrom(withClassInfo.interceptors); - } + interceptors.mergeFrom(withClassInfo.interceptors); } } } From 6aeea5285bbc2ddbc39acda0467c736f780aa214 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Oct 2018 12:21:31 +1100 Subject: [PATCH 175/730] `JPAContext` not closed when Error response is generated #895 --- CHANGELOG.md | 1 + src/main/java/act/Info.java | 6 ++--- src/main/java/act/Zen.java | 4 +-- src/main/java/act/conf/ConfAdmin.java | 2 ++ .../controller/FastRequestHandler.java | 25 +++++++++++++++++++ src/main/java/act/xio/NetworkHandler.java | 6 ++--- 6 files changed, 35 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfa76a9c6..850f82211 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `JPAContext` not closed when Error response is generated #895 * Allow app to delay automate testing #894 * Add `removeTag`, `reTag` method to `WebSocketContext` #892 * Stop loading API manager when running in `test` profile or `prod` mode #890 diff --git a/src/main/java/act/Info.java b/src/main/java/act/Info.java index 54b999750..0ee1000d2 100644 --- a/src/main/java/act/Info.java +++ b/src/main/java/act/Info.java @@ -26,7 +26,7 @@ import act.app.ActionContext; import act.app.App; import act.cli.Command; -import act.handler.NonBlock; +import act.controller.ExpressController; import act.inject.param.NoBind; import act.sys.Env; import act.util.Banner; @@ -44,6 +44,7 @@ @Singleton @SuppressWarnings("unused") +@ExpressController public class Info { // a unit of information data @@ -92,20 +93,17 @@ public Info(App app) { } @GetAction("info") - @NonBlock @Description("Show application info including version, scan package, base dir and profile") public void show(ActionContext context) { info.applyTo(context); } @GetAction("pid") - @NonBlock @Description("Get process id") public void pid(ActionContext context) { pid.applyTo(context); } - @NonBlock @JsonView @GetAction("version") @Description("Get version info in JSON format. This include both application version and actframework version.") diff --git a/src/main/java/act/Zen.java b/src/main/java/act/Zen.java index abc88c09a..020799897 100644 --- a/src/main/java/act/Zen.java +++ b/src/main/java/act/Zen.java @@ -22,7 +22,7 @@ import act.apidoc.Description; import act.app.ActionContext; -import act.handler.NonBlock; +import act.controller.ExpressController; import org.osgl.$; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.C; @@ -35,6 +35,7 @@ import javax.inject.Singleton; @Singleton +@ExpressController public final class Zen { private static final List WORDS = loadWords(); @@ -50,7 +51,6 @@ public static String wordsOfTheDay() { return $.random(WORDS); } - @NonBlock @GetAction("zen") @Description("Get my zen words (禅语)") public void zen(ActionContext context) { diff --git a/src/main/java/act/conf/ConfAdmin.java b/src/main/java/act/conf/ConfAdmin.java index 3ac18e0d1..1fbb2dfc0 100644 --- a/src/main/java/act/conf/ConfAdmin.java +++ b/src/main/java/act/conf/ConfAdmin.java @@ -23,6 +23,7 @@ import act.Act; import act.cli.Command; import act.cli.Optional; +import act.controller.ExpressController; import act.controller.annotation.UrlContext; import com.alibaba.fastjson.JSONObject; import org.osgl.mvc.annotation.GetAction; @@ -35,6 +36,7 @@ @UrlContext("conf") @Singleton +@ExpressController public class ConfAdmin { @Inject diff --git a/src/main/java/act/handler/builtin/controller/FastRequestHandler.java b/src/main/java/act/handler/builtin/controller/FastRequestHandler.java index 0cd0048c8..49b8d8882 100644 --- a/src/main/java/act/handler/builtin/controller/FastRequestHandler.java +++ b/src/main/java/act/handler/builtin/controller/FastRequestHandler.java @@ -51,12 +51,37 @@ public boolean skipEvents(ActionContext context) { return true; } + @Override + public String toString() { + return "dumb handler (skip event)"; + } + }; + + public static final RequestHandler DUMB_NO_SKIP_EVENTS = new FastRequestHandler() { + @Override + public void handle(ActionContext context) { + } + + @Override + public boolean express(ActionContext context) { + return true; + } + + @Override + public boolean skipEvents(ActionContext context) { + return false; + } + @Override public String toString() { return "dumb handler"; } }; + public static RequestHandler dumbHandler(ActionContext ctx) { + return ctx.skipEvents() ? DUMB : DUMB_NO_SKIP_EVENTS; + } + @Override public boolean requireResolveContext() { return false; diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 63e606e76..7c9c19c70 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -161,7 +161,7 @@ public void run() { requestHandler.handle(ctx); } catch (Result r) { if (isError(r)) { - ctx.handler(FastRequestHandler.DUMB); + ctx.handler(FastRequestHandler.dumbHandler(ctx)); } try { r = RequestHandlerProxy.GLOBAL_AFTER_INTERCEPTOR.apply(r, ctx); @@ -170,7 +170,7 @@ public void run() { r = ActErrorResult.of(e); } if (null == ctx.handler() || isError(r)) { - ctx.handler(FastRequestHandler.DUMB); + ctx.handler(FastRequestHandler.dumbHandler(ctx)); } H.Format fmt = req.accept(); @@ -225,7 +225,7 @@ private void handleException(Exception exception, final ActionContext ctx, Strin r = ActErrorResult.of(r); } if (null == ctx.handler()) { - ctx.handler(FastRequestHandler.DUMB); + ctx.handler(FastRequestHandler.dumbHandler(ctx)); } r.apply(ctx.req(), ctx.prepareRespForResultEvaluation()); } From e277d813eb255317958b3a0892284dbfa36d6a56 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Oct 2018 14:39:33 +1100 Subject: [PATCH 176/730] make sure agents generated before calling RequestHandlerProxy.ensureAgentsReady() --- .../act/handler/builtin/controller/RequestHandlerProxy.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index 3e5e546ac..e43d17590 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -277,11 +277,13 @@ public void prepareAuthentication(ActionContext context) { @Override public boolean express(ActionContext context) { + ensureAgentsReady(); return express; } @Override public boolean skipEvents(ActionContext context) { + ensureAgentsReady(); return skipEvents; } From 0f42bcc6678d3dda8cc527496076d2724e6b670e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Oct 2018 22:54:10 +1100 Subject: [PATCH 177/730] improve DateTimeVerifier processing of date time string --- .../act/test/verifier/DateTimeVerifier.java | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/main/java/act/test/verifier/DateTimeVerifier.java b/src/main/java/act/test/verifier/DateTimeVerifier.java index 581c50a59..8d90c5c28 100644 --- a/src/main/java/act/test/verifier/DateTimeVerifier.java +++ b/src/main/java/act/test/verifier/DateTimeVerifier.java @@ -23,15 +23,13 @@ import act.Act; import act.app.App; import act.conf.AppConfig; -import org.joda.time.LocalDate; -import org.joda.time.ReadableDateTime; -import org.joda.time.ReadableInstant; +import org.joda.time.*; +import org.joda.time.format.*; import org.osgl.$; import org.osgl.util.E; import org.osgl.util.S; import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Date; public abstract class DateTimeVerifier extends Verifier { @@ -55,7 +53,9 @@ public boolean verify(Object value) { protected abstract boolean verify(long expected, long found); private Long convert(Object value) { - if (value instanceof Date) { + if (value instanceof Long) { + return (Long) value; + } else if (value instanceof Date) { return ((Date) value).getTime(); } else if (value instanceof ReadableDateTime) { return ((ReadableDateTime) value).getMillis(); @@ -69,6 +69,9 @@ private Long convert(Object value) { } private long convert(String param) { + if (S.isInt(param)) { + return Long.parseLong(param); + } App app = Act.app(); if (null != app) { AppConfig config = app.config(); @@ -91,7 +94,7 @@ private Long tryWithAppConfig(String s, AppConfig config) { } public static Long tryWithDefaultDateTimeFormats(String s) { - return tryWithFormat(s, "yyyy-MM-dd hh:mm:ss", "yyyy-MM-dd HH:mm:ss", + return tryWithFormat(s, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'","yyyy-MM-dd hh:mm:ss", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd", "yyyyMMdd HH:mm:ss", "yyyyMMdd", @@ -101,12 +104,20 @@ public static Long tryWithDefaultDateTimeFormats(String s) { } private static Long tryWithFormat(String s, String pattern, String... otherPatterns) { - Long l = tryWithFormat(s, new SimpleDateFormat(pattern)); + DateTimeFormatter format = new DateTimeFormatterBuilder() + .appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSS") + .appendTimeZoneOffset("Z", true, 2, 4) + .toFormatter(); + Long l = tryWithFormat(s, format); + if (null != l) { + return l; + } + l = tryWithFormat(s, DateTimeFormat.forPattern(pattern)); if (null != l) { return l; } for (String op : otherPatterns) { - l = tryWithFormat(s, new SimpleDateFormat(op)); + l = tryWithFormat(s, DateTimeFormat.forPattern(op)); if (null != l) { return l; } @@ -114,10 +125,19 @@ private static Long tryWithFormat(String s, String pattern, String... otherPatte return null; } - private static Long tryWithFormat(String s, DateFormat format) { + private static Long tryWithFormat(String s, DateFormat pattern) { + try { + Date dt = pattern.parse(s); + return dt.getTime(); + } catch (Exception e) { + return null; + } + } + + private static Long tryWithFormat(String s, DateTimeFormatter format) { try { - Date date = format.parse(s); - return date.getTime(); + DateTime dt = format.parseDateTime(s); + return dt.getMillis(); } catch (Exception e) { return null; } From 878ed72b05ccbbe6398519208c53003497ab8952 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Oct 2018 09:49:26 +1100 Subject: [PATCH 178/730] fix #897 and #898 --- CHANGELOG.md | 2 + .../java/act/apidoc/SampleDataCategory.java | 1 + .../act/apidoc/sampledata/UrlProvider.java | 39 +++++++++++++++++++ .../app/util/SimpleRestfulServiceBase.java | 36 +++++++++++++---- src/main/java/act/xio/NetworkHandler.java | 6 ++- 5 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 src/main/java/act/apidoc/sampledata/UrlProvider.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 850f82211..726084b8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* SimpleRestfulServiceBase - further simplified the usage #898 +* API sample data - add URL category #897 * `JPAContext` not closed when Error response is generated #895 * Allow app to delay automate testing #894 * Add `removeTag`, `reTag` method to `WebSocketContext` #892 diff --git a/src/main/java/act/apidoc/SampleDataCategory.java b/src/main/java/act/apidoc/SampleDataCategory.java index e7cbf579b..d5b402e34 100644 --- a/src/main/java/act/apidoc/SampleDataCategory.java +++ b/src/main/java/act/apidoc/SampleDataCategory.java @@ -35,6 +35,7 @@ public enum SampleDataCategory { USERNAME("userName", "login", "loginName"), DOB("Birthday", "生日", "DateOfBirth", "*date", "date*"), EMAIL("mail"), + URL("uri"), HOST, STREET, SUBURB("city"), diff --git a/src/main/java/act/apidoc/sampledata/UrlProvider.java b/src/main/java/act/apidoc/sampledata/UrlProvider.java new file mode 100644 index 000000000..042b3f503 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/UrlProvider.java @@ -0,0 +1,39 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.*; +import org.osgl.util.S; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.URL) +public class UrlProvider extends SampleDataProvider { + @Inject + private HostProvider hostProvider; + + @Override + public String get() { + return S.concat("https://", hostProvider.get(), "/..."); + } +} diff --git a/src/main/java/act/app/util/SimpleRestfulServiceBase.java b/src/main/java/act/app/util/SimpleRestfulServiceBase.java index 59beef622..8770060b3 100644 --- a/src/main/java/act/app/util/SimpleRestfulServiceBase.java +++ b/src/main/java/act/app/util/SimpleRestfulServiceBase.java @@ -20,13 +20,17 @@ * #L% */ -import act.db.DaoBase; -import act.db.DbBind; -import act.db.ModelBase; +import act.Act; +import act.db.*; +import act.inject.param.NoBind; +import act.util.PropertySpec; import org.osgl.$; -import org.osgl.mvc.annotation.DeleteAction; -import org.osgl.mvc.annotation.GetAction; -import org.osgl.mvc.annotation.PostAction; +import org.osgl.inject.BeanSpec; +import org.osgl.mvc.annotation.*; +import org.osgl.util.Generics; + +import java.lang.reflect.Type; +import java.util.List; /** * A class template for simple RESTful service @@ -34,11 +38,16 @@ public abstract class SimpleRestfulServiceBase< ID_TYPE, - MODEL_TYPE extends ModelBase, + MODEL_TYPE, DAO_TYPE extends DaoBase> { + @NoBind private DAO_TYPE dao; + public SimpleRestfulServiceBase() { + exploreTypes(); + } + public SimpleRestfulServiceBase(DAO_TYPE dao) { this.dao = $.requireNotNull(dao); } @@ -54,6 +63,7 @@ public MODEL_TYPE get(@DbBind("id") MODEL_TYPE model) { } @PostAction + @PropertySpec("id") public MODEL_TYPE create(MODEL_TYPE model) { return dao.save(model); } @@ -63,4 +73,16 @@ public void delete(ID_TYPE id) { dao.deleteById(id); } + private void exploreTypes() { + List types = Generics.typeParamImplementations(getClass(), SimpleRestfulServiceBase.class); + int sz = types.size(); + if (sz < 3) { + throw new IllegalArgumentException("Cannot determine DAO type"); + } + Type daoType = types.get(2); + BeanSpec spec = BeanSpec.of(daoType, Act.injector()); + DaoLoader loader = Act.getInstance(DaoLoader.class); + dao = $.cast(loader.load(spec)); + } + } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 7c9c19c70..616136c68 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -152,8 +152,12 @@ public void run() { timer = metric.startTimer(key); } EventBus eventBus = app.eventBus(); - final boolean skipEvents = ctx.skipEvents(); + // need to set ActionContext.current before calling ctx.skipEvents() as the later + // one will call into ReflectedHandlerInvoker.init() will in turn try to + // set up the parameter spec where ActionContext.current is required. + // see ReflectedInvokerHelper.requestHandlerMethodParamAnnotations(method) ctx.saveLocal(); + final boolean skipEvents = ctx.skipEvents(); try { if (!skipEvents) { eventBus.emit(new PreHandle(ctx)); From ed8236084c41985e9ba53b3b96c493d1dacf5e3b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Oct 2018 10:08:20 +1100 Subject: [PATCH 179/730] Test debug page - make failed test display in the beginning of the page #896 --- CHANGELOG.md | 1 + src/main/java/act/test/Test.java | 6 ++---- src/main/java/act/test/util/ScenarioComparator.java | 13 ++++++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 726084b8d..3fbaad12a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Test debug page - make failed test display in the beginning of the page #896 * SimpleRestfulServiceBase - further simplified the usage #898 * API sample data - add URL category #897 * `JPAContext` not closed when Error response is generated #895 diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index a56396c7a..39f050db7 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -256,7 +256,7 @@ public List run(App app, Keyword testId, boolean shutdownApp) { list = C.list(); } else { list = new ArrayList<>(); - for (Scenario scenario : C.list(scenarios.values()).sorted(new ScenarioComparator(scenarioManager))) { + for (Scenario scenario : C.list(scenarios.values()).sorted(new ScenarioComparator(scenarioManager, false))) { if (null != testId && $.ne(testId, Keyword.of(scenario.name))) { continue; } @@ -271,9 +271,6 @@ public List run(App app, Keyword testId, boolean shutdownApp) { addToList(scenario, list, scenarioManager); } } -// for (Scenario scenario : scenarios.values()) { -// addToList(scenario, list, scenarioManager); -// } if (shutdownApp) { for (Scenario scenario : list) { if (!scenario.status.pass()) { @@ -282,6 +279,7 @@ public List run(App app, Keyword testId, boolean shutdownApp) { output(scenario); } } + Collections.sort(list, new ScenarioComparator(scenarioManager, true)); return list; } catch (Exception e) { exitCode = -1; diff --git a/src/main/java/act/test/util/ScenarioComparator.java b/src/main/java/act/test/util/ScenarioComparator.java index 90b2fb89a..b1d58c39f 100644 --- a/src/main/java/act/test/util/ScenarioComparator.java +++ b/src/main/java/act/test/util/ScenarioComparator.java @@ -30,13 +30,24 @@ public class ScenarioComparator implements Comparator { private ScenarioManager scenarioManager; + private boolean finished; - public ScenarioComparator(ScenarioManager manager) { + public ScenarioComparator(ScenarioManager manager, boolean finished) { scenarioManager = $.requireNotNull(manager); + this.finished = finished; } @Override public int compare(Scenario o1, Scenario o2) { + if (finished) { + boolean p1 = o1.status.pass(); + boolean p2 = o2.status.pass(); + if (!p1 && p2) { + return -1; + } else if (p1 && !p2) { + return 1; + } + } List d1 = depends(o1, new ArrayList()); List d2 = depends(o2, new ArrayList()); if (d1.contains(o2)) { From e31a46ebb5e1340147932a7da7111a9e881bc76f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Oct 2018 10:32:32 +1100 Subject: [PATCH 180/730] minor improvement on RequestSpec validation: now it allows suppressing url declaration, which takes "" as url --- src/main/java/act/test/RequestSpec.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/act/test/RequestSpec.java b/src/main/java/act/test/RequestSpec.java index 004037a63..43af2f370 100644 --- a/src/main/java/act/test/RequestSpec.java +++ b/src/main/java/act/test/RequestSpec.java @@ -107,8 +107,7 @@ public void validate(Interaction interaction) throws UnexpectedException { url = delete; } E.unexpectedIf(null == method, "method not specified in request spec of interaction[%s]", interaction); - E.unexpectedIf(null == url, "url not specified in the request spec of interaction[%s]", interaction); - if (".".equals(url)) { + if (null == url || ".".equals(url)) { url = ""; } } From b787af921d83a7324bcced642c4e8f8139f6a0cf Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Oct 2018 13:46:25 +1100 Subject: [PATCH 181/730] fix #899 and #900 --- src/main/java/act/Act.java | 60 +++++++----------- src/main/java/act/test/Scenario.java | 35 ++++++++++- src/main/java/act/test/util/NamedLogic.java | 50 +++++---------- .../act/test/util/NamedLogicRegister.java | 62 +++++++++++++++++++ src/main/java/act/test/verifier/StrEq.java | 39 ++++++++++++ src/main/resources/act.scan.list | 1 + src/test/java/act/test/util/TestTestBase.java | 6 +- testapps/GHIssues/run_e2e | 3 - testapps/GHIssues/run_e2e.bat | 2 - 9 files changed, 174 insertions(+), 84 deletions(-) create mode 100644 src/main/java/act/test/util/NamedLogicRegister.java create mode 100644 src/main/java/act/test/verifier/StrEq.java delete mode 100755 testapps/GHIssues/run_e2e delete mode 100755 testapps/GHIssues/run_e2e.bat diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index c8ce9c17a..38a25e7e0 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -30,14 +30,10 @@ import act.boot.app.FullStackAppBootstrapClassLoader; import act.boot.app.RunApp; import act.conf.*; -import act.controller.meta.ActionMethodMetaInfo; -import act.controller.meta.CatchMethodMetaInfo; -import act.controller.meta.InterceptorMethodMetaInfo; +import act.controller.meta.*; import act.crypto.AppCrypto; import act.db.DbManager; -import act.event.ActEvent; -import act.event.ActEventListener; -import act.event.EventBus; +import act.event.*; import act.handler.RequestHandlerBase; import act.handler.SimpleRequestHandler; import act.handler.builtin.controller.*; @@ -47,10 +43,7 @@ import act.job.JobManager; import act.metric.MetricPlugin; import act.metric.SimpleMetricPlugin; -import act.plugin.AppServicePluginManager; -import act.plugin.GenericPluginManager; -import act.plugin.Plugin; -import act.plugin.PluginScanner; +import act.plugin.*; import act.route.RouteSource; import act.sys.Env; import act.util.*; @@ -58,8 +51,6 @@ import act.xio.Network; import act.xio.NetworkHandler; import act.xio.undertow.UndertowNetwork; -import com.sun.imageio.plugins.gif.GIFImageWriter; -import com.sun.imageio.plugins.gif.GIFImageWriterSpi; import org.joda.time.*; import org.joda.time.format.DateTimeFormat; import org.osgl.$; @@ -67,6 +58,7 @@ import org.osgl.exception.NotAppliedException; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; +import org.osgl.inject.Genie; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.*; @@ -74,27 +66,14 @@ import osgl.version.Version; import osgl.version.Versioned; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.lang.reflect.Method; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.URL; +import java.net.*; import java.util.*; -import java.util.List; import java.util.jar.Attributes; import java.util.jar.Manifest; -import javax.imageio.IIOImage; -import javax.imageio.ImageWriteParam; -import javax.imageio.ImageWriter; -import javax.imageio.stream.MemoryCacheImageOutputStream; /** * The Act runtime and facade @@ -191,6 +170,7 @@ public static Mode valueOfIgnoreCase(String mode) { } } + private static Genie genie; private static ActConfig conf; private static Mode mode = Mode.PROD; private static String nodeGroup = ""; @@ -555,7 +535,13 @@ public static Class classForName(String className) { * @return the instance of the class */ public static T getInstance(String className) { - return app().getInstance(className); + App app = app(); + if (null != app) { + return app.getInstance(className); + } else { + Class type = $.classForName(className); + return getInstance(type); + } } /** @@ -567,7 +553,7 @@ public static T getInstance(String className) { */ public static T getInstance(Class clz) { App app = app(); - return null == app ? $.newInstance(clz) : app.getInstance(clz); + return null == app ? genie().get(clz) : app.getInstance(clz); } /** @@ -1220,6 +1206,13 @@ public Mode apply() throws NotAppliedException, $.Break { }; } + private static Genie genie() { + if (null == genie) { + genie = Genie.create(); + } + return genie; + } + // debug javadoc generating. // Note if you get `Illegal group reference` issue then make sure // you do not have `$` in the `{@link}` tag @@ -1231,14 +1224,5 @@ public Mode apply() throws NotAppliedException, $.Break { // } public static void main(String[] args) throws Exception { - BufferedImage trackPixel = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR); - trackPixel.setRGB(0, 0, new Color(0, 0, 0, 0).getRGB()); - GIFImageWriterSpi spi = new GIFImageWriterSpi(); - ImageWriter writer = new GIFImageWriter(spi); - ImageWriteParam params = writer.getDefaultWriteParam(); - IIOImage img = new IIOImage(trackPixel, null, null); - ByteArrayOutputStream os = new ByteArrayOutputStream(); - writer.setOutput(new MemoryCacheImageOutputStream(os)); - writer.write(null, img, params); } } diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 67c8b3bc4..dc5b79c74 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -627,7 +627,9 @@ void verifyList(String name, List array, Map spec) { String sKey = S.string(key); Object test = entry.getValue(); Object value = null; - if ("size".equals(key) || "len".equals(key) || "length".equals(key)) { + if ("me".equals(key) || "this".equals(key)) { + value = array; + } else if ("size".equals(key) || "len".equals(key) || "length".equals(key)) { value = array.size(); } else if ("toString".equals(key) || "string".equals(key) || "str".equals(key)) { value = JSON.toJSONString(array); @@ -825,8 +827,8 @@ private void verifyValue_(String name, Object value, List tests) { Object entryValue = entry.getValue(); if (entryValue instanceof String) { String s = (String) entryValue; - String processed = processStringSubstitution(s); - if (S.neq(processed, s)) { + Object processed = evalStr(s); + if (s != processed) { entry.setValue(processed); } } @@ -960,6 +962,33 @@ private Object getVal(String key) { } } + Object evalStr(String s) { + int n = s.indexOf("${"); + if (n < 0) { + return s; + } + if (n > 0) { + return processStringSubstitution(s); + } + int z = s.indexOf("}"); + if (z < s.length() - 1) { + return processStringSubstitution(s); + } + String part = s.substring(2, z); + if (part.contains("(") && part.endsWith(")")) { + return evalFunc(part); + } else { + String key = part; + String payload = ""; + if (part.contains(":")) { + S.Binary binary = S.binarySplit(part, ':'); + key = binary.first(); + payload = binary.second(); + } + return getVal(key, payload); + } + } + String processStringSubstitution(String s) { int n = s.indexOf("${"); if (n < 0) { diff --git a/src/main/java/act/test/util/NamedLogic.java b/src/main/java/act/test/util/NamedLogic.java index ee7518bd2..02776f8df 100644 --- a/src/main/java/act/test/util/NamedLogic.java +++ b/src/main/java/act/test/util/NamedLogic.java @@ -20,18 +20,12 @@ * #L% */ -import act.plugin.Plugin; +import act.Act; import act.util.LogSupport; import org.osgl.$; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.Keyword; -import org.osgl.util.S; +import org.osgl.util.*; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * An `NamedLogic` encapsulate a piece of logic with a name, which can @@ -43,25 +37,23 @@ * * Assert - used to verify the data * * Modifier - used to modify request */ -public abstract class NamedLogic extends LogSupport implements Plugin { - - private static Map, Map> registry = new HashMap<>(); +public abstract class NamedLogic extends LogSupport { protected abstract Class type(); protected Object initVal; - @Override public void register() { register(false); } protected void register(boolean force) { Keyword keyword = keyword(); - register(keyword, force); + NamedLogicRegister register = Act.getInstance(NamedLogicRegister.class); + register.register(keyword, this, force); for (String alias : aliases()) { keyword = Keyword.of(alias); - register(keyword, force); + register.register(keyword, this, force); } } @@ -124,26 +116,10 @@ protected Keyword keyword() { return Keyword.of(name); } - private void register(Keyword keyword, boolean force) { - Class type = type(); - Map lookup = registry.get(type); - if (null == lookup) { - lookup = new HashMap<>(); - registry.put(type, lookup); - } - NamedLogic existing = lookup.put(keyword, this); - E.unexpectedIf(!force && null != existing && this != existing, "Keyword already used: " + keyword.hyphenated()); - } + protected static class FromLinkedHashMap extends $.TypeConverter { - private static T get(Class logicType, String name) { - Map lookup = registry.get(logicType); - if (null == lookup) { - return null; - } - return (T) lookup.get(Keyword.of(name)); - } + private NamedLogicRegister register = Act.getInstance(NamedLogicRegister.class); - protected static class FromLinkedHashMap extends $.TypeConverter { public FromLinkedHashMap(Class toType) { super(LinkedHashMap.class, toType); } @@ -153,7 +129,7 @@ public T convert(LinkedHashMap o) { E.illegalStateIfNot(o.size() == 1, "single element map expected"); Map.Entry entry = (Map.Entry) o.entrySet().iterator().next(); String key = S.string(entry.getKey()); - T logic = get(toType, key); + T logic = register.get(toType, key); E.illegalArgumentIf(null == logic, "%s not found: %s", toType.getName(), key); logic = $.cloneOf(logic); logic.init(entry.getValue()); @@ -162,6 +138,9 @@ public T convert(LinkedHashMap o) { } protected static class FromString extends $.TypeConverter { + + private NamedLogicRegister register = Act.getInstance(NamedLogicRegister.class); + public FromString(Class toType) { super(String.class, toType); } @@ -170,11 +149,12 @@ public FromString(Class toType) { public T convert(String o) { E.illegalStateIf(S.blank(o)); String key = o; - T logic = get(toType, key); + T logic = register.get(toType, key); E.illegalArgumentIf(null == logic, "%s not found: %s", toType.getName(), key); logic = $.cloneOf(logic); return logic; } } + } diff --git a/src/main/java/act/test/util/NamedLogicRegister.java b/src/main/java/act/test/util/NamedLogicRegister.java new file mode 100644 index 000000000..270a3fb3c --- /dev/null +++ b/src/main/java/act/test/util/NamedLogicRegister.java @@ -0,0 +1,62 @@ +package act.test.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.util.SubClassFinder; +import org.osgl.util.E; +import org.osgl.util.Keyword; + +import java.util.HashMap; +import java.util.Map; +import javax.inject.Singleton; + +@Singleton +public class NamedLogicRegister { + + private Map, Map> registry = new HashMap<>(); + + @SubClassFinder + public void doRegister(NamedLogic logic) { + logic.register(); + } + + void register(Keyword keyword, NamedLogic logic, boolean force) { + Class type = logic.type(); + Map lookup = registry.get(type); + if (null == lookup) { + lookup = new HashMap<>(); + registry.put(type, lookup); + } + NamedLogic existing = lookup.put(keyword, logic); + E.unexpectedIf(!force && null != existing && logic != existing, "Keyword already used: " + keyword.hyphenated()); + } + + static T get(Class logicType, String name) { + NamedLogicRegister register = Act.getInstance(NamedLogicRegister.class); + Map lookup = register.registry.get(logicType); + if (null == lookup) { + return null; + } + return (T) lookup.get(Keyword.of(name)); + } + +} diff --git a/src/main/java/act/test/verifier/StrEq.java b/src/main/java/act/test/verifier/StrEq.java new file mode 100644 index 000000000..01628943a --- /dev/null +++ b/src/main/java/act/test/verifier/StrEq.java @@ -0,0 +1,39 @@ +package act.test.verifier; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.C; +import org.osgl.util.S; + +import java.util.List; + +public class StrEq extends Verifier { + + @Override + public boolean verify(Object value) { + return S.eq(S.string(value), S.string(initVal)); + } + + @Override + protected List aliases() { + return C.list("seq", "stringEquals"); + } +} diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 14af96e14..ee6128d09 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -14,6 +14,7 @@ act.test.ScenarioDebugHelper act.test.ScenarioDebugHelper$LoadFixtures act.test.ScenarioDebugHelper$ClearFixtures act.test.func.SampleDataProviderAdaptor +act.test.util.NamedLogicRegister act.handler.builtin.controller.RequestHandlerProxy act.i18n.TimeZoneResolver act.i18n.LocaleResolver diff --git a/src/test/java/act/test/util/TestTestBase.java b/src/test/java/act/test/util/TestTestBase.java index 46c37d4bf..7d60647ae 100644 --- a/src/test/java/act/test/util/TestTestBase.java +++ b/src/test/java/act/test/util/TestTestBase.java @@ -21,14 +21,14 @@ */ import act.app.App; -import org.junit.Before; +import org.junit.BeforeClass; import org.osgl.$; import osgl.ut.TestBase; public class TestTestBase extends TestBase { - @Before - public void clearActMockup() { + @BeforeClass + public static void clearActMockup() { $.setFieldValue("INST", App.class, null); Thread.currentThread().setContextClassLoader(TestTestBase.class.getClassLoader()); } diff --git a/testapps/GHIssues/run_e2e b/testapps/GHIssues/run_e2e deleted file mode 100755 index 39a6606d6..000000000 --- a/testapps/GHIssues/run_e2e +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -echo building ... -mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GHIssues/run_e2e.bat b/testapps/GHIssues/run_e2e.bat deleted file mode 100755 index ea9f51de7..000000000 --- a/testapps/GHIssues/run_e2e.bat +++ /dev/null @@ -1,2 +0,0 @@ -echo building ... -mvn -q compile act:e2e \ No newline at end of file From 3eb87a5b33b088fdf32e8c120cf6fd660e1f798d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Oct 2018 19:46:18 +1100 Subject: [PATCH 182/730] JsonView, CsvView etc shall be declared as `@Inherited` #904 --- CHANGELOG.md | 1 + src/main/java/act/cli/CsvView.java | 6 ++---- src/main/java/act/cli/JsonView.java | 6 ++---- src/main/java/act/cli/TableView.java | 6 ++---- src/main/java/act/cli/TreeView.java | 6 ++---- src/main/java/act/cli/XmlView.java | 6 ++---- src/main/java/act/util/CsvView.java | 6 ++---- src/main/java/act/util/JsonView.java | 6 ++---- 8 files changed, 15 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fbaad12a..a7c577218 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* JsonView, CsvView etc shall be declared as `@Inherited` #904 * Test debug page - make failed test display in the beginning of the page #896 * SimpleRestfulServiceBase - further simplified the usage #898 * API sample data - add URL category #897 diff --git a/src/main/java/act/cli/CsvView.java b/src/main/java/act/cli/CsvView.java index b3f069118..efdebdf7a 100644 --- a/src/main/java/act/cli/CsvView.java +++ b/src/main/java/act/cli/CsvView.java @@ -22,10 +22,7 @@ import act.util.PropertySpec; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * **Note** this is deprecated, please use `act.util.CsvView` instead @@ -54,5 +51,6 @@ @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) @Deprecated +@Inherited public @interface CsvView { } diff --git a/src/main/java/act/cli/JsonView.java b/src/main/java/act/cli/JsonView.java index 3e7ded1e7..93c500cfe 100644 --- a/src/main/java/act/cli/JsonView.java +++ b/src/main/java/act/cli/JsonView.java @@ -22,10 +22,7 @@ import act.util.PropertySpec; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * Mark a command method return value shall be displayed as a JSON object. e.g @@ -59,5 +56,6 @@ @Retention(RetentionPolicy.CLASS) @Target({ElementType.METHOD, ElementType.TYPE}) @Deprecated +@Inherited public @interface JsonView { } diff --git a/src/main/java/act/cli/TableView.java b/src/main/java/act/cli/TableView.java index b25645bf2..48f7c31d1 100644 --- a/src/main/java/act/cli/TableView.java +++ b/src/main/java/act/cli/TableView.java @@ -22,10 +22,7 @@ import act.util.PropertySpec; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * Mark a command method return value shall be displayed as a table. e.g @@ -51,5 +48,6 @@ */ @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) +@Inherited public @interface TableView { } diff --git a/src/main/java/act/cli/TreeView.java b/src/main/java/act/cli/TreeView.java index 54b3eb41a..fa7c79eec 100644 --- a/src/main/java/act/cli/TreeView.java +++ b/src/main/java/act/cli/TreeView.java @@ -23,10 +23,7 @@ import act.cli.view.CliView; import act.util.PropertySpec; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * Mark a command method return value shall be displayed as tree structure. e.g @@ -39,5 +36,6 @@ */ @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) +@Inherited public @interface TreeView { } diff --git a/src/main/java/act/cli/XmlView.java b/src/main/java/act/cli/XmlView.java index da5824416..860a9f806 100644 --- a/src/main/java/act/cli/XmlView.java +++ b/src/main/java/act/cli/XmlView.java @@ -22,10 +22,7 @@ import act.util.PropertySpec; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * Mark a command method return value shall be displayed as a XML object. e.g @@ -53,5 +50,6 @@ */ @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) +@Inherited public @interface XmlView { } diff --git a/src/main/java/act/util/CsvView.java b/src/main/java/act/util/CsvView.java index c7bad8aef..d73289c80 100644 --- a/src/main/java/act/util/CsvView.java +++ b/src/main/java/act/util/CsvView.java @@ -22,10 +22,7 @@ import act.cli.TableView; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * Mark a command method return value shall be displayed using a csv file format. e.g @@ -49,5 +46,6 @@ */ @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) +@Inherited public @interface CsvView { } diff --git a/src/main/java/act/util/JsonView.java b/src/main/java/act/util/JsonView.java index 086f77645..5fd759707 100644 --- a/src/main/java/act/util/JsonView.java +++ b/src/main/java/act/util/JsonView.java @@ -22,10 +22,7 @@ import act.cli.TableView; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * Mark a command method return value shall be displayed as a JSON object. e.g @@ -56,5 +53,6 @@ */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE}) +@Inherited public @interface JsonView { } From 0f05bfbcfcfa02ba1461db8c5841175b1072144d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Oct 2018 20:22:37 +1100 Subject: [PATCH 183/730] ReflectedHandlerInvoker - try to get Annotation from method in parent class if possible #906 --- CHANGELOG.md | 1 + .../bytecode/ReflectedCommandExecutor.java | 12 ++--- .../impl/ReflectedHandlerInvoker.java | 44 +++++++++---------- .../java/act/util/ReflectedInvokerHelper.java | 28 ++++++++++++ 4 files changed, 57 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7c577218..d75176663 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* ReflectedHandlerInvoker - try to get Annotation from method in parent class if possible #906 * JsonView, CsvView etc shall be declared as `@Inherited` #904 * Test debug page - make failed test display in the beginning of the page #896 * SimpleRestfulServiceBase - further simplified the usage #898 diff --git a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java index 77e41c991..bb1ea8a78 100644 --- a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java +++ b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java @@ -79,13 +79,13 @@ public ReflectedCommandExecutor(CommandMethodMetaInfo methodMetaInfo, App app) { this.commanderClass = $.classForName(methodMetaInfo.classInfo().className(), cl); try { this.method = commanderClass.getMethod(methodMetaInfo.methodName(), paramTypes); - this.async = null != method.getAnnotation(Async.class); - this.reportProgress = method.getAnnotation(ReportProgress.class); - FastJsonFilter filterAnno = method.getAnnotation(FastJsonFilter.class); + this.async = null != ReflectedInvokerHelper.getAnnotation(Async.class, method); + this.reportProgress = ReflectedInvokerHelper.getAnnotation(ReportProgress.class, method); + FastJsonFilter filterAnno = ReflectedInvokerHelper.getAnnotation(FastJsonFilter.class, method); if (null != filterAnno) { filters = filterAnno.value(); } - FastJsonFeature featureAnno = method.getAnnotation(FastJsonFeature.class); + FastJsonFeature featureAnno = ReflectedInvokerHelper.getAnnotation(FastJsonFeature.class, method); if (null != featureAnno) { features = featureAnno.value(); } @@ -98,11 +98,11 @@ public ReflectedCommandExecutor(CommandMethodMetaInfo methodMetaInfo, App app) { } else { method.setAccessible(true); } - DateFormatPattern dfp = method.getAnnotation(DateFormatPattern.class); + DateFormatPattern dfp = ReflectedInvokerHelper.getAnnotation(DateFormatPattern.class, method); if (null != dfp) { this.dateFormatPattern = dfp.value(); } else { - Pattern pattern = method.getAnnotation(Pattern.class); + Pattern pattern = ReflectedInvokerHelper.getAnnotation(Pattern.class, method); if (null != pattern) { this.dateFormatPattern = pattern.value(); } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 967810ad9..f84f8ac8f 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -179,7 +179,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { if (null != priority) { this.order = priority; } else { - Order order = method.getAnnotation(Order.class); + Order order = ReflectedInvokerHelper.getAnnotation(Order.class, method); this.order = null == order ? Order.HIGHEST_PRECEDENCE : order.value(); } final boolean isBuiltIn = controllerClass.getName().startsWith("act."); @@ -215,8 +215,8 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.pluginBeforeHandler = ControllerPlugin.Manager.INST.beforeHandler(controllerClass, method); this.pluginAfterHandler = ControllerPlugin.Manager.INST.afterHandler(controllerClass, method); this.disabled = this.disabled || !Env.matches(method); - this.forceDataBinding = method.isAnnotationPresent(RequireDataBind.class); - this.async = null != method.getAnnotation(Async.class); + this.forceDataBinding = ReflectedInvokerHelper.isAnnotationPresent(RequireDataBind.class, method); + this.async = null != ReflectedInvokerHelper.getAnnotation(Async.class, method); if (this.async && (handlerMetaInfo.hasReturnOrThrowResult())) { logger.warn("handler return result will be ignored for async method: " + method); } @@ -229,7 +229,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { method.setAccessible(true); } - if (!isBuiltIn && handlerMetaInfo.hasReturn() && null == method.getAnnotation(NoReturnValueAdvice.class)) { + if (!isBuiltIn && handlerMetaInfo.hasReturn() && null == ReflectedInvokerHelper.getAnnotation(NoReturnValueAdvice.class, method)) { ReturnValueAdvisor advisor = getAnnotation(ReturnValueAdvisor.class); if (null != advisor) { returnValueAdvice = app.getInstance(advisor.value()); @@ -244,7 +244,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.suppressJsonDateFormat = shouldSuppressJsonDateFormat(); - Throttled throttleControl = method.getAnnotation(Throttled.class); + Throttled throttleControl = ReflectedInvokerHelper.getAnnotation(Throttled.class, method); if (null != throttleControl) { int throttle = throttleControl.value(); if (throttle < 1) { @@ -254,28 +254,28 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { throttleFilter = new ThrottleFilter(throttle, expireScale.enabled()); } - this.isLargeResponse = method.getAnnotation(LargeResponse.class) != null; - this.forceSmallResponse = method.getAnnotation(SmallResponse.class) != null; + this.isLargeResponse = ReflectedInvokerHelper.getAnnotation(LargeResponse.class, method) != null; + this.forceSmallResponse = ReflectedInvokerHelper.getAnnotation(SmallResponse.class, method) != null; if (isLargeResponse && forceSmallResponse) { warn("found both @LargeResponse and @SmallResponse, will ignore @SmallResponse"); forceSmallResponse = false; } - FastJsonFilter filterAnno = method.getAnnotation(FastJsonFilter.class); + FastJsonFilter filterAnno = ReflectedInvokerHelper.getAnnotation(FastJsonFilter.class, method); if (null != filterAnno) { filters = filterAnno.value(); } - FastJsonFeature featureAnno = method.getAnnotation(FastJsonFeature.class); + FastJsonFeature featureAnno = ReflectedInvokerHelper.getAnnotation(FastJsonFeature.class, method); if (null != featureAnno) { features = featureAnno.value(); } enableCircularReferenceDetect = hasAnnotation(EnableCircularReferenceDetect.class); - DateFormatPattern pattern = method.getAnnotation(DateFormatPattern.class); + DateFormatPattern pattern = ReflectedInvokerHelper.getAnnotation(DateFormatPattern.class, method); if (null != pattern) { this.dateFormatPattern = pattern.value(); } else { - Pattern patternLegacy = method.getAnnotation(Pattern.class); + Pattern patternLegacy = ReflectedInvokerHelper.getAnnotation(Pattern.class, method); if (null != patternLegacy) { this.dateFormatPattern = patternLegacy.value(); } @@ -344,29 +344,29 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { forceResponseContentType = contentType.value().format(); } - DownloadFilename downloadFilename = method.getAnnotation(DownloadFilename.class); + DownloadFilename downloadFilename = ReflectedInvokerHelper.getAnnotation(DownloadFilename.class, method); if (null != downloadFilename) { this.downloadFilename = downloadFilename.value(); } // method annotation takes priority of class annotation - if (null != method.getAnnotation(JsonView.class)) { + if (null != ReflectedInvokerHelper.getAnnotation(JsonView.class, method)) { forceResponseContentType = H.MediaType.JSON.format(); } - if (null != method.getAnnotation(CsvView.class)) { + if (null != ReflectedInvokerHelper.getAnnotation(CsvView.class, method)) { forceResponseContentType = H.MediaType.CSV.format(); } - contentType = method.getAnnotation(ResponseContentType.class); + contentType = ReflectedInvokerHelper.getAnnotation(ResponseContentType.class, method); if (null != contentType) { forceResponseContentType = contentType.value().format(); } - ResponseStatus status = method.getAnnotation(ResponseStatus.class); + ResponseStatus status = ReflectedInvokerHelper.getAnnotation(ResponseStatus.class, method); if (null != status) { forceResponseStatus = H.Status.of(status.value()); } - PreventDoubleSubmission dsp = method.getAnnotation(PreventDoubleSubmission.class); + PreventDoubleSubmission dsp = ReflectedInvokerHelper.getAnnotation(PreventDoubleSubmission.class, method); if (null != dsp) { dspToken = dsp.value(); if (PreventDoubleSubmission.DEFAULT.equals(dspToken)) { @@ -375,7 +375,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { } byPassImplicityTemplateVariable = (controllerClass.isAnnotationPresent(NoImplicitTemplateVariable.class) || - method.isAnnotationPresent(NoImplicitTemplateVariable.class)); + ReflectedInvokerHelper.isAnnotationPresent(NoImplicitTemplateVariable.class, method)); initOutputVariables(); initCacheParams(app.config()); @@ -813,7 +813,7 @@ private void initCacheParams(AppConfig config) { cacheSupport = CacheSupportMetaInfo.disabled(); return; } - CacheFor cacheFor = method.getAnnotation(CacheFor.class); + CacheFor cacheFor = ReflectedInvokerHelper.getAnnotation(CacheFor.class, method); cacheSupport = null == cacheFor ? CacheSupportMetaInfo.disabled() : CacheSupportMetaInfo.enabled( new CacheKeyBuilder(cacheFor, S.concat(controllerClass.getName(), ".", method.getName())), cacheFor.id(), @@ -888,7 +888,7 @@ private void initOutputVariables() { if (0 == len) { return; } - Annotation outputRequestParams = method.getAnnotation(OutputRequestParams.class); + Annotation outputRequestParams = ReflectedInvokerHelper.getAnnotation(OutputRequestParams.class, method); if (null != outputRequestParams) { DependencyInjector injector = app.injector(); for (int i = 0; i < len; ++i) { @@ -1054,7 +1054,7 @@ private Object[] params(Object controller, ActionContext context) { public T getAnnotation(Class annoType) { - T anno = method.getAnnotation(annoType); + T anno = ReflectedInvokerHelper.getAnnotation(annoType, method); if (null == anno) { anno = controllerClass.getAnnotation(annoType); } @@ -1062,7 +1062,7 @@ public T getAnnotation(Class annoType) { } public boolean hasAnnotation(Class annoType) { - return (null != method.getAnnotation(annoType)) || null != controllerClass.getAnnotation(annoType); + return (null != ReflectedInvokerHelper.getAnnotation(annoType, method)) || null != controllerClass.getAnnotation(annoType); } private boolean shouldSuppressJsonDateFormat() { diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 51b4bd2fb..263b0057e 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -31,6 +31,7 @@ import org.osgl.util.E; import java.lang.annotation.Annotation; +import java.lang.annotation.Inherited; import java.lang.reflect.*; import java.util.*; import javax.inject.Singleton; @@ -117,6 +118,33 @@ public static boolean isGlobalOrStateless(Field field) { return isGlobalOrStateless(field, new HashSet()); } + public static boolean isAnnotationPresent(Class annotationClass, Method method) { + return null != getAnnotation(annotationClass, method); + } + + public static T getAnnotation(Class annotationClass, Method method) { + T anno = method.getAnnotation(annotationClass); + if (null != anno) { + return anno; + } + if (!annotationClass.isAnnotationPresent(Inherited.class)) { + return null; + } + Method overridenMethod = getOverridenMethod(method); + return null == overridenMethod ? null : getAnnotation(annotationClass, overridenMethod); + } + + private static Method getOverridenMethod(Method method) { + Class host = method.getDeclaringClass(); + host = host.getSuperclass(); + if (null == host || Object.class == host) { + return null; + } + String name = method.getName(); + Class[] params = method.getParameterTypes(); + return $.getMethod(host, name, params); + } + private static boolean isGlobalOrStateless(Class type, Set circularReferenceDetector) { if ($.isSimpleType(type)) { return false; From 8069fc7a62658961554a9ad59a22fda4f49d9553 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Oct 2018 20:33:43 +1100 Subject: [PATCH 184/730] add test case for GH906 --- testapps/GHIssues/run_test | 3 ++ testapps/GHIssues/run_test.bat | 2 ++ .../src/main/java/ghissues/Gh906.java | 36 +++++++++++++++++++ .../src/main/resources/test/scenarios/906.yml | 10 ++++++ 4 files changed, 51 insertions(+) create mode 100755 testapps/GHIssues/run_test create mode 100755 testapps/GHIssues/run_test.bat create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh906.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/906.yml diff --git a/testapps/GHIssues/run_test b/testapps/GHIssues/run_test new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GHIssues/run_test @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GHIssues/run_test.bat b/testapps/GHIssues/run_test.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GHIssues/run_test.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh906.java b/testapps/GHIssues/src/main/java/ghissues/Gh906.java new file mode 100644 index 000000000..236b1dc75 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh906.java @@ -0,0 +1,36 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.SimpleBean; +import org.osgl.http.H; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.ResponseContentType; +import org.osgl.util.S; + +public class Gh906 { + + public static class Foo implements SimpleBean { + public int id; + + public Foo(int id) { + this.id = id; + } + + @Override + public String toString() { + return S.string(id); + } + } + + public abstract static class Super extends BaseController { + @GetAction + @ResponseContentType(H.MediaType.TXT) + public Foo getFoo(int n) { + return new Foo(n); + } + } + + @UrlContext("906") + public static class Child extends Super {} + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/906.yml b/testapps/GHIssues/src/main/resources/test/scenarios/906.yml new file mode 100644 index 000000000..516d4dc03 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/906.yml @@ -0,0 +1,10 @@ +Scenario(GH906): + description: "[906] ReflectedHandlerInvoker - try to get Annotation from method in parent class if possible" + interactions: + - description: Test + request: + get: /906?n=100 + response: + headers: + Content-Type: + - contains: text/plain From c68f4f8570b78b915c591e827e4c19a3d205faf8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Oct 2018 21:26:13 +1100 Subject: [PATCH 185/730] Basic support for xml content-type #905 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 4 ++++ src/main/java/act/cli/view/CliView.java | 14 +++++++++---- .../impl/ReflectedHandlerInvoker.java | 8 +++++++- src/main/java/act/test/ResponseSpec.java | 1 + src/main/java/act/test/Scenario.java | 18 +++++++++++++++++ .../src/main/java/ghissues/Gh905.java | 20 +++++++++++++++++++ .../src/main/java/ghissues/Gh906.java | 12 +++++++---- .../src/main/resources/test/scenarios/905.yml | 17 ++++++++++++++++ 9 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh905.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/905.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index d75176663..b5a47517c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Basic support for xml content-type #905 * ReflectedHandlerInvoker - try to get Annotation from method in parent class if possible #906 * JsonView, CsvView etc shall be declared as `@Inherited` #904 * Test debug page - make failed test display in the beginning of the page #896 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 782b0baa7..bea8c799d 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -636,6 +636,10 @@ public boolean jsonEncoded() { return req().contentType() == H.Format.JSON; } + public boolean xmlEncoded() { + return req().contentType() == H.Format.XML; + } + public boolean acceptJson() { return accept() == H.Format.JSON; } diff --git a/src/main/java/act/cli/view/CliView.java b/src/main/java/act/cli/view/CliView.java index 3f0c784e1..1172faa6b 100644 --- a/src/main/java/act/cli/view/CliView.java +++ b/src/main/java/act/cli/view/CliView.java @@ -28,12 +28,12 @@ import act.cli.util.TableCursor; import act.data.DataPropertyRepository; import act.db.AdaptiveRecord; -import act.util.ActContext; -import act.util.JsonUtilConfig; -import act.util.PropertySpec; +import act.util.*; +import com.alibaba.fastjson.JSONObject; import org.osgl.$; import org.osgl.util.*; import org.rythmengine.utils.Escape; +import org.w3c.dom.Document; import java.io.Writer; import java.util.*; @@ -156,7 +156,13 @@ private void buildTree(Writer writer, TreeNode node, String prefix, boolean isTr XML() { @Override public void render(Writer writer, Object result, PropertySpec.MetaInfo spec, ActContext context) { - throw E.unsupport(); + JSONObject json; + if (null != spec) { + json = spec.applyTo($.map(result), context).to(JSONObject.class); + } else { + json = $.map(result).to(JSONObject.class); + } + IO.write($.convert(json).to(Document.class)).to(writer); } }, diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index f84f8ac8f..8a2908765 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -62,6 +62,7 @@ import org.osgl.mvc.annotation.*; import org.osgl.mvc.result.*; import org.osgl.util.*; +import org.w3c.dom.Document; import java.lang.annotation.Annotation; import java.lang.reflect.*; @@ -662,7 +663,7 @@ private void cacheJsonDto(ActContext context, JsonDto dto) { } private void ensureJsonDtoGenerated(ActionContext context) { - if (0 == fieldsAndParamsCount || !context.jsonEncoded()) { + if (0 == fieldsAndParamsCount || (!context.jsonEncoded() && !context.xmlEncoded())) { return; } Class dtoClass = jsonDTOClassManager.get(controllerClass, method); @@ -710,6 +711,11 @@ private String singleJsonFieldName(ActionContext context) { */ private String patchedJsonBody(ActionContext context) { String body = context.body(); + if (context.xmlEncoded()) { + Document doc = XML.read(body); + JSONObject json = $.convert(doc).to(JSONObject.class); + body = JSON.toJSONString(json.containsKey("root") ? json.get("root") : json); + } if (S.blank(body) || 1 < fieldsAndParamsCount(context)) { return body; } diff --git a/src/main/java/act/test/ResponseSpec.java b/src/main/java/act/test/ResponseSpec.java index eb70e3166..c2cc91875 100644 --- a/src/main/java/act/test/ResponseSpec.java +++ b/src/main/java/act/test/ResponseSpec.java @@ -33,6 +33,7 @@ public class ResponseSpec implements InteractionPart { public Object text; public LinkedHashMap html = new LinkedHashMap<>(); public LinkedHashMap json = new LinkedHashMap<>(); + public LinkedHashMap xml = new LinkedHashMap<>(); public LinkedHashMap headers = new LinkedHashMap<>(); public String checksum; public String downloadFilename; diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index dc5b79c74..9268c2003 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -609,6 +609,24 @@ void verifyBody(String bodyString, ResponseSpec spec) { } else { error("Unknown JSON string: \n%s", bodyString); } + } else if (null != spec.xml && !spec.xml.isEmpty()) { + org.w3c.dom.Document doc = XML.read(bodyString); + JSONObject obj = $.convert(doc).to(JSONObject.class); + if (obj.containsKey("root")) { + Object o = obj.get("root"); + lastData.set(o); + if (o instanceof JSONObject) { + obj = (JSONObject) o; + verifyJsonObject(obj, spec.xml); + } else if (o instanceof List) { + verifyList("body xml array", (List)o, spec.xml); + } else { + throw new UnexpectedException("Unknown root type: " + o.getClass()); + } + } else { + lastData.set(obj); + verifyJsonObject(obj, spec.xml); + } } else if (null != spec.html && !spec.html.isEmpty()) { lastData.set(bodyString); Document doc = Jsoup.parse(bodyString, S.concat("http://localhost:", port, "/")); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh905.java b/testapps/GHIssues/src/main/java/ghissues/Gh905.java new file mode 100644 index 000000000..7342e7a87 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh905.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.SimpleBean; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("905") +public class Gh905 extends BaseController { + + public static class Foo implements SimpleBean { + public int id; + public String name; + } + + @PostAction + public Foo create(Foo foo) { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh906.java b/testapps/GHIssues/src/main/java/ghissues/Gh906.java index 236b1dc75..52d6d10d5 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh906.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh906.java @@ -1,6 +1,7 @@ package ghissues; import act.controller.annotation.UrlContext; +import act.util.PropertySpec; import act.util.SimpleBean; import org.osgl.http.H; import org.osgl.mvc.annotation.GetAction; @@ -11,9 +12,11 @@ public class Gh906 { public static class Foo implements SimpleBean { public int id; + public String name; - public Foo(int id) { + public Foo(int id, String name) { this.id = id; + this.name = name; } @Override @@ -24,9 +27,10 @@ public String toString() { public abstract static class Super extends BaseController { @GetAction - @ResponseContentType(H.MediaType.TXT) - public Foo getFoo(int n) { - return new Foo(n); + @ResponseContentType(H.MediaType.XML) + @PropertySpec("id") + public Foo getFoo(int id, String name) { + return new Foo(id, name); } } diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/905.yml b/testapps/GHIssues/src/main/resources/test/scenarios/905.yml new file mode 100644 index 000000000..a0d22393f --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/905.yml @@ -0,0 +1,17 @@ +Scenario(GH905): + description: "[905] Basic support for xml content-type" + interactions: + - description: Test + request: + post: /905 + accept: text/xml + params: + id: 5 + name: x + response: + headers: + Content-Type: + - contains: text/xml + xml: + id: 5 + name: x From e49e288396c5de7056cb2e868d4a71f7a810f82b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Oct 2018 21:59:44 +1100 Subject: [PATCH 186/730] #902 - add meaningful error message when AppCompiler cannot locate source file for a certain class --- src/main/java/act/app/AppCompiler.java | 3 +++ testapps/GHIssues/src/main/java/ghissues/Gh906.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/act/app/AppCompiler.java b/src/main/java/act/app/AppCompiler.java index ad1c7400e..c3086a6fb 100644 --- a/src/main/java/act/app/AppCompiler.java +++ b/src/main/java/act/app/AppCompiler.java @@ -278,6 +278,9 @@ public void acceptResult(CompilationResult result) { $.nil(); source = classLoader.source(name0); } + if (null == source) { + throw E.unexpected("Cannot locate source file for %s. \nPlease make sure you do not have non-nested classes defined in source file of other class"); + } if (name != name0) { String innerName = S.afterFirst(name, "$"); source.compiled(innerName, clazzFile.getBytes()); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh906.java b/testapps/GHIssues/src/main/java/ghissues/Gh906.java index 52d6d10d5..a8a26022f 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh906.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh906.java @@ -27,7 +27,7 @@ public String toString() { public abstract static class Super extends BaseController { @GetAction - @ResponseContentType(H.MediaType.XML) + @ResponseContentType(H.MediaType.TXT) @PropertySpec("id") public Foo getFoo(int id, String name) { return new Foo(id, name); From b93547c47ea2c55d87c5ad04ab2734dd1b5edf66 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Oct 2018 22:05:39 +1100 Subject: [PATCH 187/730] #902 - add meaningful error message when AppCompiler cannot locate source file for a certain class --- src/main/java/act/app/AppCompiler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/act/app/AppCompiler.java b/src/main/java/act/app/AppCompiler.java index c3086a6fb..ee2c38ee3 100644 --- a/src/main/java/act/app/AppCompiler.java +++ b/src/main/java/act/app/AppCompiler.java @@ -279,7 +279,7 @@ public void acceptResult(CompilationResult result) { source = classLoader.source(name0); } if (null == source) { - throw E.unexpected("Cannot locate source file for %s. \nPlease make sure you do not have non-nested classes defined in source file of other class"); + throw E.unexpected("Cannot locate source file for %s. \nPlease make sure you do not have non-nested classes defined in source file of other class", name); } if (name != name0) { String innerName = S.afterFirst(name, "$"); From d0fbe01d58cf1eb917154964606a750fbdbdf713 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 29 Oct 2018 11:14:35 +1100 Subject: [PATCH 188/730] Interceptor defined in super class now not effective on sub class #907 --- CHANGELOG.md | 1 + .../meta/ControllerClassMetaInfo.java | 6 +++++ .../src/main/java/ghissues/Gh907.java | 26 +++++++++++++++++++ .../src/main/resources/test/scenarios/907.yml | 8 ++++++ 4 files changed, 41 insertions(+) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh907.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/907.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index b5a47517c..4c24defbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Interceptor defined in super class now not effective on sub class #907 * Basic support for xml content-type #905 * ReflectedHandlerInvoker - try to get Annotation from method in parent class if possible #906 * JsonView, CsvView etc shall be declared as `@Inherited` #904 diff --git a/src/main/java/act/controller/meta/ControllerClassMetaInfo.java b/src/main/java/act/controller/meta/ControllerClassMetaInfo.java index 25f39a55e..bdc45f324 100644 --- a/src/main/java/act/controller/meta/ControllerClassMetaInfo.java +++ b/src/main/java/act/controller/meta/ControllerClassMetaInfo.java @@ -90,6 +90,11 @@ protected void releaseResources() { super.releaseResources(); } + @Override + public String toString() { + return className(); + } + public String className() { return type.getClassName(); } @@ -419,6 +424,7 @@ private ControllerClassMetaInfo superControllerClass(final ControllerClassMetaIn } } } + return info; } return null; } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh907.java b/testapps/GHIssues/src/main/java/ghissues/Gh907.java new file mode 100644 index 000000000..0e31cd8d0 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh907.java @@ -0,0 +1,26 @@ +package ghissues; + +import static act.controller.Controller.Util.notFound; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.Before; +import org.osgl.mvc.annotation.GetAction; + +public class Gh907 { + + public static class Super extends BaseController { + @Before + public void before() { + notFound(); + } + } + + @UrlContext("907") + public static class Child extends Super { + @GetAction + public String test() { + return "oops"; + } + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/907.yml b/testapps/GHIssues/src/main/resources/test/scenarios/907.yml new file mode 100644 index 000000000..0f91f5bd5 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/907.yml @@ -0,0 +1,8 @@ +Scenario(GH907): + description: "[907] Interceptor defined in super class now not effective on sub class" + interactions: + - description: Test + request: + get: /907 + response: + status: 404 From 9c812b86c6ede68bddffbca0899ba368b44f0b89 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 29 Oct 2018 14:03:52 +1100 Subject: [PATCH 189/730] fix jquery.ext.js __processCsrfSetup issue: submitMethod shall be passed in --- src/main/resources/asset/~act/js/jquery.ext.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/asset/~act/js/jquery.ext.js b/src/main/resources/asset/~act/js/jquery.ext.js index 00e70bba2..a56de955c 100644 --- a/src/main/resources/asset/~act/js/jquery.ext.js +++ b/src/main/resources/asset/~act/js/jquery.ext.js @@ -4,7 +4,7 @@ if (typeof String.prototype.contains != 'function') { }; } -function __processCsrfSetup(setup) { +function __processCsrfSetup(setup, submitMethod) { try { if (jQuery.csrfConf && jQuery.csrfConf.cookieName && jQuery.csrfConf.headerName && "post" === submitMethod) { var token = jQuery.csrfConf.token @@ -93,7 +93,7 @@ jQuery.each(["get", "post", "put", "delete", "patch" ], function (i, method) { success: callback } - __processCsrfSetup(setup) + __processCsrfSetup(setup, submitMethod) return jQuery.ajax(setup).always(checkAjaxRedirect); }; }); @@ -127,7 +127,7 @@ jQuery.each(["getJSON", "postJSON", "putJSON", "deleteJSON", "patchJSON"], funct data: data, success: callback } - __processCsrfSetup(setup) + __processCsrfSetup(setup, submitMethod) return jQuery.ajax(setup).always(checkAjaxRedirect); }; }); From 7cba0fd3f6dd3d613abcedd6fbadf242eaf1f427 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 29 Oct 2018 20:09:32 +1100 Subject: [PATCH 190/730] fix #908, #909, #910, #911 and #912 --- CHANGELOG.md | 5 + src/main/java/act/test/Scenario.java | 11 +- src/main/java/act/test/func/Func.java | 131 +++++++++++++++--- src/main/java/act/test/macro/Macro.java | 10 +- .../test/req_modifier/RequestModifier.java | 8 +- src/main/java/act/test/util/NamedLogic.java | 28 +++- src/main/java/act/test/verifier/Compare.java | 2 +- src/main/java/act/test/verifier/Contains.java | 2 +- .../act/test/verifier/DateTimeVerifier.java | 2 +- src/main/java/act/test/verifier/Ends.java | 2 +- src/main/java/act/test/verifier/Eq.java | 2 +- .../java/act/test/verifier/EqIgnoreCase.java | 2 +- src/main/java/act/test/verifier/Exists.java | 2 +- src/main/java/act/test/verifier/Neq.java | 2 +- .../act/test/verifier/ReversedVerifier.java | 43 ++++++ src/main/java/act/test/verifier/Starts.java | 2 +- src/main/java/act/test/verifier/StrEq.java | 2 +- src/main/java/act/test/verifier/Verifier.java | 6 +- src/main/java/act/util/ClassFinderData.java | 3 + src/main/java/act/util/SubTypeFinder.java | 4 +- .../src/main/java/ghissues/Gh908.java | 13 ++ .../src/main/java/ghissues/Gh911.java | 36 +++++ .../src/main/resources/test/scenarios/908.yml | 14 ++ .../src/main/resources/test/scenarios/911.yml | 23 +++ 24 files changed, 310 insertions(+), 45 deletions(-) create mode 100644 src/main/java/act/test/verifier/ReversedVerifier.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh908.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh911.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/908.yml create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/911.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c24defbb..df3d3b43e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # ActFramework Change Log **1.8.8** +* `SubClassFinder` and `AnnotatedClassFinder` shall favor `NoAutoRegister` annotation #912 +* Test - enhance ${now()} function #911 +* Test - allow it add `negative` decorator to verifier #910 +* Test - remove generic type parameter from `NamedLogic` #909 +* Test - allow setting precision of ${now()} function #908 * Interceptor defined in super class now not effective on sub class #907 * Basic support for xml content-type #905 * ReflectedHandlerInvoker - try to get Annotation from method in parent class if possible #906 diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 9268c2003..e7dafb97c 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -911,10 +911,19 @@ private Class tryLoadClass(String name) { } private Verifier tryLoadVerifier(String name) { + boolean revert = false; + if (name.startsWith("!") || name.startsWith("-")) { + revert = true; + name = name.substring(1).trim(); + } else if (name.startsWith("not:")) { + revert = true; + name = name.substring(4).trim(); + } Class c = tryLoadClass(name); if (null != c) { if (Verifier.class.isAssignableFrom(c)) { - return (Verifier) (null != app ? app.getInstance(c) : $.newInstance(c)); + final Verifier v = (Verifier) (null != app ? app.getInstance(c) : $.newInstance(c)); + return v.meOrReversed(revert); } else { throw new UnexpectedException("Class not supported: " + name); } diff --git a/src/main/java/act/test/func/Func.java b/src/main/java/act/test/func/Func.java index 83d30ec4c..d31bb879c 100644 --- a/src/main/java/act/test/func/Func.java +++ b/src/main/java/act/test/func/Func.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -27,6 +27,7 @@ import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.osgl.$; +import org.osgl.exception.UnexpectedException; import org.osgl.util.*; import org.osgl.util.converter.TypeConverterRegistry; import org.rythmengine.utils.Time; @@ -35,7 +36,7 @@ import java.util.Collection; import java.util.List; -public abstract class Func extends NamedLogic { +public abstract class Func extends NamedLogic { @Override protected Class type() { @@ -44,7 +45,7 @@ protected Class type() { public abstract Object apply(); - public static class VerifiableEmail extends Func { + public static class VerifiableEmail extends Func { @Override public Object apply() { String email = Act.getInstance(Inbox.class).account; @@ -59,7 +60,7 @@ protected List aliases() { } } - public static class SizeOf extends Func { + public static class SizeOf extends Func { int size; @@ -84,21 +85,21 @@ public Object apply() { } } - public static class Today extends Func { + public static class Today extends Func { @Override public Object apply() { return LocalDate.now(); } } - public static class Tomorrow extends Func { + public static class Tomorrow extends Func { @Override public Object apply() { return LocalDate.now().plusDays(1); } } - public static class GetTime extends Func { + public static class GetTime extends Func { private Integer deltaInSeconds; private DateTime dateTime; @@ -173,29 +174,115 @@ public Object apply() { } } + /** + * `_Time` is the base class for all time relevant functions, including + * `Now`, `NextMinute`, `NextHour`. + * + * Examples of configuring `_Time`: + * + * `${now(+1d)}` - now plus one day + * `${now(-2h)}` - now minus 2 hours + * `${now(true,+3s)} - now with high precision plus 3 seconds + * `${now(-5mn,lp)} - now with low precision minus 5 minutes + */ + public abstract static class _Time extends Func { + + /** + * When `highPrecision` is true, then it set the precision to + * milliseconds instead of second. + * + * The default value is `false`. + */ + protected boolean highPrecision = false; + + + protected int delta; - public static class Now extends Func { + @Override + public void init(Object param) { + if (param.getClass().isArray()) { + int n = Array.getLength(param); + for (int i = 0; i < n; ++i) { + Object o = Array.get(param, i); + parseParam(o); + } + } else if (param instanceof Collection) { + for (Object o : ((Collection) param)) { + parseParam(o); + } + } else { + parseParam(param); + } + } + + private void parseParam(Object o) { + String s = S.string(o); + String[] sa = s.split(S.COMMON_SEP); + for (String si : sa) { + parseParamPart(si); + } + } + + private void parseParamPart(String s) { + if ("true".equalsIgnoreCase(s)) { + highPrecision = true; + } else if ("false".equalsIgnoreCase(s)) { + highPrecision = false; + } else if (Keyword.of("highPrecision").equals(Keyword.of(s))) { + highPrecision = true; + } else if (Keyword.of("lowPrecision").equals(Keyword.of(s))) { + highPrecision = false; + } else if ("hp".equalsIgnoreCase(s)) { + highPrecision = true; + } else if ("lp".equalsIgnoreCase(s)) { + highPrecision = false; + } else if (s.startsWith("+")) { + s = s.substring(1); + delta = Time.parseDuration(s); + } else { + if (S.isInt(s)) { + delta = Integer.parseInt(s); + } else if (s.startsWith("-")) { + s = s.substring(1); + delta = -Time.parseDuration(s); + } else { + throw new UnexpectedException("Unknown time parameter: " + s); + } + } + } + + } + + /** + * {@inheritDoc} + */ + public static class Now extends _Time { @Override public Object apply() { - return DateTime.now(); + return now(); + } + + protected DateTime now() { + DateTime dt = highPrecision ? DateTime.now() : DateTime.now().withMillisOfSecond(0); + return 0 == delta ? dt : dt.plusSeconds(delta); } } - public static class NextMinute extends Func { + public static class NextMinute extends Now { @Override public Object apply() { - return DateTime.now().plusMinutes(1); + return now().plusMinutes(1); } } - public static class NextHour extends Func { + public static class NextHour extends Now { @Override public Object apply() { - return DateTime.now().plusHours(1); + return now().plusHours(1); } } - public static class AfterLast extends Func { + public static class AfterLast extends Func { private String retVal; @@ -220,7 +307,7 @@ protected List aliases() { } } - public static class BeforeFirst extends Func { + public static class BeforeFirst extends Func { private String retVal; @@ -258,7 +345,7 @@ protected List aliases() { * @see String#substring(int) * @see String#substring(int, int) */ - public static class SubStr extends Func { + public static class SubStr extends Func { private String targetStr; @@ -298,7 +385,7 @@ protected List aliases() { /** * Random pick up from a list of parameters. */ - public static class RandomOf extends Func { + public static class RandomOf extends Func { private boolean isList; private List list; @@ -330,7 +417,7 @@ protected List aliases() { * the length of the random string. Otherwise the length will be any * where between 5 and 15. */ - public static class RandomStr extends Func { + public static class RandomStr extends Func { @Override public Object apply() { int length = 0; @@ -360,7 +447,7 @@ protected List aliases() { * - if there is 1 init val, it specify the ceiling of the random integer * - if there are 2 values, the first is the bottom of the random val and the second is the ceiling of the val */ - public static class RandomInt extends Func { + public static class RandomInt extends Func { @Override public Object apply() { int max = 0; @@ -416,7 +503,7 @@ protected List aliases() { /** * Generate random `true`, `false` */ - public static class RandomBoolean extends Func { + public static class RandomBoolean extends Func { @Override public Object apply() { return $.random(true, false); @@ -435,7 +522,7 @@ protected List aliases() { * - if there is 1 init val, it specify the ceiling of the random long value * - if there are 2 values, the first is the bottom of the random val and the second is the ceiling of the val */ - public static class RandomLong extends Func { + public static class RandomLong extends Func { @Override public Object apply() { long max = 0; diff --git a/src/main/java/act/test/macro/Macro.java b/src/main/java/act/test/macro/Macro.java index f5aa620c2..8f1a1d29a 100644 --- a/src/main/java/act/test/macro/Macro.java +++ b/src/main/java/act/test/macro/Macro.java @@ -31,7 +31,7 @@ import java.net.URL; import java.util.List; -public abstract class Macro extends NamedLogic { +public abstract class Macro extends NamedLogic { public abstract void run(Scenario scenario); @@ -40,7 +40,7 @@ protected final Class type() { return Macro.class; } - public static class ClearFixture extends Macro { + public static class ClearFixture extends Macro { @Override public void run(Scenario scenario) { @@ -53,7 +53,7 @@ protected List aliases() { } } - public static class ClearSession extends Macro { + public static class ClearSession extends Macro { @Override public void run(Scenario scenario) { scenario.clearSession(); @@ -64,7 +64,7 @@ public void run(Scenario scenario) { * Read file content into a string and cache the string * with the underscore style of the file name. */ - public static class ReadContent extends Macro { + public static class ReadContent extends Macro { private String resourcePath; @@ -101,7 +101,7 @@ protected List aliases() { } } - public static class Pause extends Macro { + public static class Pause extends Macro { long time; diff --git a/src/main/java/act/test/req_modifier/RequestModifier.java b/src/main/java/act/test/req_modifier/RequestModifier.java index e07122b55..3d0031e68 100644 --- a/src/main/java/act/test/req_modifier/RequestModifier.java +++ b/src/main/java/act/test/req_modifier/RequestModifier.java @@ -30,7 +30,7 @@ import java.util.List; -public abstract class RequestModifier extends NamedLogic { +public abstract class RequestModifier extends NamedLogic { public abstract void modifyRequest(Request.Builder builder); @@ -39,7 +39,7 @@ protected Class type() { return RequestModifier.class; } - public static class AcceptJson extends RequestModifier { + public static class AcceptJson extends RequestModifier { @Override public void modifyRequest(Request.Builder builder) { builder.header(ACCEPT, "application/json"); @@ -52,7 +52,7 @@ protected List aliases() { } - public static class RemoteAddress extends RequestModifier { + public static class RemoteAddress extends RequestModifier { @Override public void modifyRequest(Request.Builder builder) { builder.header(X_FORWARDED_FOR, S.string(initVal)); @@ -64,7 +64,7 @@ protected List aliases() { } } - public static class JsonContent extends RequestModifier { + public static class JsonContent extends RequestModifier { @Override public void modifyRequest(Request.Builder builder) { builder.header(CONTENT_TYPE, "application/json"); diff --git a/src/main/java/act/test/util/NamedLogic.java b/src/main/java/act/test/util/NamedLogic.java index 02776f8df..e77e8dfeb 100644 --- a/src/main/java/act/test/util/NamedLogic.java +++ b/src/main/java/act/test/util/NamedLogic.java @@ -21,6 +21,8 @@ */ import act.Act; +import act.test.verifier.ReversedVerifier; +import act.test.verifier.Verifier; import act.util.LogSupport; import org.osgl.$; import org.osgl.util.*; @@ -37,7 +39,7 @@ * * Assert - used to verify the data * * Modifier - used to modify request */ -public abstract class NamedLogic extends LogSupport { +public abstract class NamedLogic extends LogSupport { protected abstract Class type(); @@ -129,10 +131,22 @@ public T convert(LinkedHashMap o) { E.illegalStateIfNot(o.size() == 1, "single element map expected"); Map.Entry entry = (Map.Entry) o.entrySet().iterator().next(); String key = S.string(entry.getKey()); + boolean revert = false; + if (key.startsWith("!") || key.startsWith("-")) { + revert = true; + key = key.substring(1).trim(); + } else if (key.startsWith("not:")) { + revert = true; + key = key.substring(4).trim(); + } T logic = register.get(toType, key); E.illegalArgumentIf(null == logic, "%s not found: %s", toType.getName(), key); logic = $.cloneOf(logic); logic.init(entry.getValue()); + if (revert && logic instanceof Verifier) { + final Verifier v = $.cast(logic); + return $.cast(new ReversedVerifier(v)); + } return logic; } } @@ -149,9 +163,21 @@ public FromString(Class toType) { public T convert(String o) { E.illegalStateIf(S.blank(o)); String key = o; + boolean revert = false; + if (key.startsWith("!") || key.startsWith("-")) { + revert = true; + key = key.substring(1).trim(); + } else if (key.startsWith("not:")) { + revert = true; + key = key.substring(4).trim(); + } T logic = register.get(toType, key); E.illegalArgumentIf(null == logic, "%s not found: %s", toType.getName(), key); logic = $.cloneOf(logic); + if (revert && logic instanceof Verifier) { + final Verifier v = $.cast(logic); + return $.cast(new ReversedVerifier(v)); + } return logic; } } diff --git a/src/main/java/act/test/verifier/Compare.java b/src/main/java/act/test/verifier/Compare.java index ec4ae0267..45fd0348c 100644 --- a/src/main/java/act/test/verifier/Compare.java +++ b/src/main/java/act/test/verifier/Compare.java @@ -23,7 +23,7 @@ import org.osgl.$; import org.osgl.util.E; -public abstract class Compare extends Verifier { +public abstract class Compare extends Verifier { public enum Type { GT() { diff --git a/src/main/java/act/test/verifier/Contains.java b/src/main/java/act/test/verifier/Contains.java index 7fadfa387..e8748c903 100644 --- a/src/main/java/act/test/verifier/Contains.java +++ b/src/main/java/act/test/verifier/Contains.java @@ -26,7 +26,7 @@ import java.lang.reflect.Array; import java.util.Collection; -public class Contains extends Verifier { +public class Contains extends Verifier { @Override public boolean verify(Object value) { diff --git a/src/main/java/act/test/verifier/DateTimeVerifier.java b/src/main/java/act/test/verifier/DateTimeVerifier.java index 8d90c5c28..87a85c3ca 100644 --- a/src/main/java/act/test/verifier/DateTimeVerifier.java +++ b/src/main/java/act/test/verifier/DateTimeVerifier.java @@ -32,7 +32,7 @@ import java.text.DateFormat; import java.util.Date; -public abstract class DateTimeVerifier extends Verifier { +public abstract class DateTimeVerifier extends Verifier { protected long timestamp; diff --git a/src/main/java/act/test/verifier/Ends.java b/src/main/java/act/test/verifier/Ends.java index 8b96d21e6..41d875753 100644 --- a/src/main/java/act/test/verifier/Ends.java +++ b/src/main/java/act/test/verifier/Ends.java @@ -25,7 +25,7 @@ import java.util.List; -public class Ends extends Verifier { +public class Ends extends Verifier { @Override public boolean verify(Object value) { diff --git a/src/main/java/act/test/verifier/Eq.java b/src/main/java/act/test/verifier/Eq.java index c436ed76d..5c2d882d3 100644 --- a/src/main/java/act/test/verifier/Eq.java +++ b/src/main/java/act/test/verifier/Eq.java @@ -25,7 +25,7 @@ import java.util.List; -public class Eq extends Verifier { +public class Eq extends Verifier { @Override public boolean verify(Object value) { diff --git a/src/main/java/act/test/verifier/EqIgnoreCase.java b/src/main/java/act/test/verifier/EqIgnoreCase.java index b9dea0789..ea0b4e1fe 100644 --- a/src/main/java/act/test/verifier/EqIgnoreCase.java +++ b/src/main/java/act/test/verifier/EqIgnoreCase.java @@ -25,7 +25,7 @@ import java.util.List; -public class EqIgnoreCase extends Verifier { +public class EqIgnoreCase extends Verifier { @Override public boolean verify(Object value) { diff --git a/src/main/java/act/test/verifier/Exists.java b/src/main/java/act/test/verifier/Exists.java index 851145674..80c6c4c5b 100644 --- a/src/main/java/act/test/verifier/Exists.java +++ b/src/main/java/act/test/verifier/Exists.java @@ -26,7 +26,7 @@ import java.util.List; -public class Exists extends Verifier { +public class Exists extends Verifier { @Override public boolean verify(Object value) { diff --git a/src/main/java/act/test/verifier/Neq.java b/src/main/java/act/test/verifier/Neq.java index f31b827db..b24b7bdd9 100644 --- a/src/main/java/act/test/verifier/Neq.java +++ b/src/main/java/act/test/verifier/Neq.java @@ -25,7 +25,7 @@ import java.util.List; -public class Neq extends Verifier { +public class Neq extends Verifier { @Override public boolean verify(Object value) { diff --git a/src/main/java/act/test/verifier/ReversedVerifier.java b/src/main/java/act/test/verifier/ReversedVerifier.java new file mode 100644 index 000000000..314e8f996 --- /dev/null +++ b/src/main/java/act/test/verifier/ReversedVerifier.java @@ -0,0 +1,43 @@ +package act.test.verifier; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.util.NoAutoRegister; +import org.osgl.$; + +@NoAutoRegister +public class ReversedVerifier extends Verifier { + private Verifier v; + + public ReversedVerifier(Verifier v) { + this.v = $.requireNotNull(v); + } + + @Override + public boolean verify(Object value) { + return !v.verify(value); + } + + @Override + public String toString() { + return "!" + v.toString(); + } +} diff --git a/src/main/java/act/test/verifier/Starts.java b/src/main/java/act/test/verifier/Starts.java index 50f38ce38..58d541c6a 100644 --- a/src/main/java/act/test/verifier/Starts.java +++ b/src/main/java/act/test/verifier/Starts.java @@ -25,7 +25,7 @@ import java.util.List; -public class Starts extends Verifier { +public class Starts extends Verifier { @Override public boolean verify(Object value) { diff --git a/src/main/java/act/test/verifier/StrEq.java b/src/main/java/act/test/verifier/StrEq.java index 01628943a..c11c5a0bb 100644 --- a/src/main/java/act/test/verifier/StrEq.java +++ b/src/main/java/act/test/verifier/StrEq.java @@ -25,7 +25,7 @@ import java.util.List; -public class StrEq extends Verifier { +public class StrEq extends Verifier { @Override public boolean verify(Object value) { diff --git a/src/main/java/act/test/verifier/Verifier.java b/src/main/java/act/test/verifier/Verifier.java index 238f4e25c..e0edf3383 100644 --- a/src/main/java/act/test/verifier/Verifier.java +++ b/src/main/java/act/test/verifier/Verifier.java @@ -23,7 +23,7 @@ import act.test.util.NamedLogic; import org.osgl.util.converter.TypeConverterRegistry; -public abstract class Verifier extends NamedLogic { +public abstract class Verifier extends NamedLogic { public abstract boolean verify(Object value); @@ -36,4 +36,8 @@ public static void registerTypeConverters() { TypeConverterRegistry.INSTANCE.register(new FromLinkedHashMap(Verifier.class)); TypeConverterRegistry.INSTANCE.register(new FromString(Verifier.class)); } + + public Verifier meOrReversed(boolean reversed) { + return reversed ? new ReversedVerifier(this) : this; + } } diff --git a/src/main/java/act/util/ClassFinderData.java b/src/main/java/act/util/ClassFinderData.java index 0ef581640..a271e9242 100644 --- a/src/main/java/act/util/ClassFinderData.java +++ b/src/main/java/act/util/ClassFinderData.java @@ -88,6 +88,9 @@ public void visit(ClassNode classNode) throws $.Break { cl = cl.getParent(); } Class targetClass = $.classForName(classNode.name(), app.classLoader()); + if (targetClass.isAnnotationPresent(NoAutoRegister.class)) { + return; + } Object param = targetClass; if (data.paramIsInstance) { param = app.getInstance(targetClass); diff --git a/src/main/java/act/util/SubTypeFinder.java b/src/main/java/act/util/SubTypeFinder.java index db24279a4..1c49ef22a 100644 --- a/src/main/java/act/util/SubTypeFinder.java +++ b/src/main/java/act/util/SubTypeFinder.java @@ -66,7 +66,9 @@ public void on(EventObject event) throws Exception { @Override public void visit(ClassNode classNode) throws $.Break { final Class c = $.classForName(classNode.name(), app.classLoader()); - found(c, app); + if (!c.isAnnotationPresent(NoAutoRegister.class)) { + found(c, app); + } } }); } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh908.java b/testapps/GHIssues/src/main/java/ghissues/Gh908.java new file mode 100644 index 000000000..520a6ca31 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh908.java @@ -0,0 +1,13 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.joda.time.DateTime; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("908") +public class Gh908 extends BaseController { + @GetAction + public DateTime test() { + return DateTime.now().withMillisOfSecond(0); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh911.java b/testapps/GHIssues/src/main/java/ghissues/Gh911.java new file mode 100644 index 000000000..bfeaca664 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh911.java @@ -0,0 +1,36 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.joda.time.DateTime; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.S; +import org.rythmengine.utils.Time; + +@UrlContext("911") +public class Gh911 extends BaseController { + + @GetAction + public DateTime getTime(String delta) { + DateTime now = DateTime.now(); + int seconds; + if (null != delta) { + if (S.isInt(delta)) { + seconds = Integer.parseInt(delta); + } else { + boolean negative = false; + if (delta.startsWith("+")) { + delta = delta.substring(1); + } else if (delta.startsWith("-")) { + delta = delta.substring(1); + negative = true; + } else { + throw new IllegalArgumentException("Unknown delta: " + delta); + } + seconds = Time.parseDuration(delta); + } + now = now.plusSeconds(seconds); + } + return now; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/908.yml b/testapps/GHIssues/src/main/resources/test/scenarios/908.yml new file mode 100644 index 000000000..09f706822 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/908.yml @@ -0,0 +1,14 @@ +Scenario(GH908): + description: "[908] Test - allow setting precision of ${now()} function" + constants: + startTs0: ${now()} # default: low precision + startTs1: ${now(hp)} # specify high precision + interactions: + - description: Test + request: + get: 908 + response: + json: + result: + - -before: ${startTs0} + - before: ${startTs1} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/911.yml b/testapps/GHIssues/src/main/resources/test/scenarios/911.yml new file mode 100644 index 000000000..e1ce27077 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/911.yml @@ -0,0 +1,23 @@ +Scenario(GH911): + description: "[911] Test - enhance ${now()} function" + interactions: + - description: simple now + request: + get: 911 + response: + json: + result: + - -after: ${now()} + - before: ${now(hp)} + - before: ${now(highPrecision)} + - -after: ${now(lowPrecision)} + - -after: ${now(lp)} + - description: simple now with delta + request: + get: 911 + params: + delta: +2mn + response: + json: + result: + - -after: ${now(lp,+2mn)} \ No newline at end of file From 0e32f42c3e8725a6a97fce97cd64a9ce1f201c23 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 30 Oct 2018 17:38:02 +1100 Subject: [PATCH 191/730] fix #913, #914 and #916 --- CHANGELOG.md | 3 ++ .../app/FullStackAppBootstrapClassLoader.java | 18 ++++++++- src/main/java/act/conf/AppConfigKey.java | 2 +- src/main/java/act/db/Dao.java | 5 +-- src/main/java/act/db/DaoBase.java | 29 +------------- .../act/db/meta/MasterEntityMetaInfoRepo.java | 9 +---- src/main/java/act/test/Scenario.java | 3 +- src/main/java/act/test/Test.java | 17 ++++---- src/main/java/act/util/LogSupport.java | 4 +- .../act/util/LogSupportedDestroyableBase.java | 2 + .../java/act/util/ReflectedInvokerHelper.java | 40 ++++++++++++++++--- .../src/main/java/ghissues/Gh829.java | 4 +- 12 files changed, 75 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df3d3b43e..7e8ac8b63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.8.8** +* `App.getResource(String)` behavior different between dev and prod mode #916 +* Make `Dao` by default be stateless #914 +* Optimize Singleton controller instance infer logic #913 * `SubClassFinder` and `AnnotatedClassFinder` shall favor `NoAutoRegister` annotation #912 * Test - enhance ${now()} function #911 * Test - allow it add `negative` decorator to verifier #910 diff --git a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java index bc0f9004f..afff193f8 100644 --- a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java +++ b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java @@ -30,7 +30,7 @@ import org.osgl.logging.Logger; import org.osgl.util.*; -import java.io.File; +import java.io.*; import java.lang.reflect.Modifier; import java.net.URL; import java.net.URLClassLoader; @@ -128,6 +128,22 @@ public int libBCSize() { return libBC.size(); } + @Override + public URL getResource(String name) { + if (name.startsWith("/")) { + name = name.substring(1); + } + return super.getResource(name); + } + + @Override + public Enumeration getResources(String name) throws IOException { + if (name.startsWith("/")) { + name = name.substring(1); + } + return super.getResources(name); + } + protected void preload() { buildIndex(); } diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 3bbb7267d..c34f0c023 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -332,7 +332,7 @@ public enum AppConfigKey implements ConfigKey { CORS_MAX_AGE("cors.max_age"), /** - * `act.cors.allow_credential` specifies `Access-Control-Allow-Credential`. + * `act.cors.allow_credentials` specifies `Access-Control-Allow-Credentials`. * * Default value: `false` */ diff --git a/src/main/java/act/db/Dao.java b/src/main/java/act/db/Dao.java index 77dd824e7..4add4a418 100644 --- a/src/main/java/act/db/Dao.java +++ b/src/main/java/act/db/Dao.java @@ -21,8 +21,6 @@ */ import act.Destroyable; -import act.app.AppContextAware; -import act.app.security.SecurityContextAware; import java.util.Collection; import java.util.List; @@ -32,8 +30,7 @@ * @param the generic key type * @param the generic model type */ -public interface Dao> - extends AppContextAware, SecurityContextAware, Destroyable { +public interface Dao> extends Destroyable { /** * Returns the identifier type diff --git a/src/main/java/act/db/DaoBase.java b/src/main/java/act/db/DaoBase.java index d2fd3f18f..aa79a8771 100644 --- a/src/main/java/act/db/DaoBase.java +++ b/src/main/java/act/db/DaoBase.java @@ -20,10 +20,9 @@ * #L% */ -import act.app.security.SecurityContext; import act.inject.param.NoBind; -import act.util.ActContext; import act.util.LogSupport; +import act.util.Stateless; import org.osgl.$; import org.osgl.util.C; import org.osgl.util.Generics; @@ -33,15 +32,12 @@ import java.util.List; import javax.enterprise.context.ApplicationScoped; -// We can't do this atm, otherwise app developer cannot use EbeanDao, or MorphiaDao directly -//@InheritedStateless @NoBind +@Stateless public abstract class DaoBase> extends LogSupport implements Dao { - private ActContext appCtx; - private SecurityContext secCtx; private boolean destroyed; protected Type modelType; protected Class modelClass; @@ -61,19 +57,11 @@ public DaoBase(Class idType, Class modelType) { this.modelClass = Generics.classOf(modelType); } - - @Override - public void setAppContext(ActContext context) { - appCtx = context; - } - @Override public void destroy() { if (destroyed) return; destroyed = true; releaseResources(); - appCtx = null; - secCtx = null; } @Override @@ -96,11 +84,6 @@ public boolean isDestroyed() { return destroyed; } - @Override - public void setSecurityContext(SecurityContext context) { - secCtx = context; - } - protected void releaseResources() {} @Override @@ -108,14 +91,6 @@ public Class scope() { return ApplicationScoped.class; } - protected final ActContext appContext() { - return appCtx; - } - - protected final SecurityContext securityContext() { - return secCtx; - } - @Override public Iterable findBy(String fields, Object... values) throws IllegalArgumentException { return q(fields, values).fetch(); diff --git a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java index 309c9b60e..90b4bdec2 100644 --- a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java +++ b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java @@ -30,15 +30,10 @@ import org.osgl.util.E; import java.lang.annotation.Annotation; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; import javax.inject.Inject; import javax.inject.Singleton; -import javax.persistence.Entity; -import javax.persistence.EntityListeners; -import javax.persistence.MappedSuperclass; +import javax.persistence.*; @Singleton public class MasterEntityMetaInfoRepo extends EntityMetaInfoRepo { diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index e7dafb97c..09924e408 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -47,6 +47,7 @@ import org.osgl.$; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; +import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.*; @@ -61,7 +62,7 @@ public class Scenario implements ScenarioPart { - private static final Logger LOGGER = Test.LOGGER; + private static final Logger LOGGER = LogManager.get(Test.class); private static final ThreadLocal current = new ThreadLocal<>(); diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 39f050db7..0d3376503 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -27,20 +27,19 @@ import act.app.event.SysEventId; import act.db.Dao; import act.db.DbService; +import act.event.EventBus; +import act.inject.DefaultValue; +import act.job.*; +import act.sys.Env; import act.test.func.Func; import act.test.macro.Macro; import act.test.req_modifier.RequestModifier; import act.test.util.*; import act.test.verifier.Verifier; -import act.event.EventBus; -import act.inject.DefaultValue; -import act.job.*; -import act.sys.Env; import act.util.LogSupport; +import act.util.Stateless; import org.osgl.$; import org.osgl.inject.BeanSpec; -import org.osgl.logging.LogManager; -import org.osgl.logging.Logger; import org.osgl.mvc.annotation.DeleteAction; import org.osgl.mvc.annotation.PostAction; import org.osgl.util.*; @@ -53,11 +52,9 @@ import javax.inject.Inject; @Env.RequireMode(Act.Mode.DEV) +@Stateless public class Test extends LogSupport { - - static final Logger LOGGER = LogManager.get(Test.class); - private static final AtomicBoolean STARTED = new AtomicBoolean(false); /** @@ -252,7 +249,7 @@ public List run(App app, Keyword testId, boolean shutdownApp) { Map scenarios = scenarioManager.load(); List list; if (scenarios.isEmpty()) { - LOGGER.warn("No scenario defined."); + warn("No scenario defined."); list = C.list(); } else { list = new ArrayList<>(); diff --git a/src/main/java/act/util/LogSupport.java b/src/main/java/act/util/LogSupport.java index d9d04ea1e..371da55b0 100644 --- a/src/main/java/act/util/LogSupport.java +++ b/src/main/java/act/util/LogSupport.java @@ -20,7 +20,6 @@ * #L% */ -import act.inject.param.NoBind; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.S; @@ -28,6 +27,7 @@ /** * Provides logging support utility methods to extended classes. */ +@Stateless public class LogSupport { public static final String DOUBLE_DASHED_LINE = S.times('=', 80); @@ -36,8 +36,6 @@ public class LogSupport { public static final String HASH_SYMBOL_LINE = S.times('#', 80); public static final String TILD_LINE = S.times('~', 80); - @NoBind - @Stateless protected final transient Logger logger; public LogSupport() { diff --git a/src/main/java/act/util/LogSupportedDestroyableBase.java b/src/main/java/act/util/LogSupportedDestroyableBase.java index fcea8b510..4f9e47c1e 100644 --- a/src/main/java/act/util/LogSupportedDestroyableBase.java +++ b/src/main/java/act/util/LogSupportedDestroyableBase.java @@ -22,12 +22,14 @@ import act.Destroyable; import act.handler.builtin.controller.RequestHandlerProxy; +import act.inject.param.NoBind; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.List; import javax.enterprise.context.*; +@NoBind public abstract class LogSupportedDestroyableBase extends LogSupport implements Destroyable { private volatile boolean destroyed; diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 263b0057e..a9a037473 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -23,6 +23,7 @@ import act.Act; import act.apidoc.ApiManager; import act.app.*; +import act.inject.util.LoadConfig; import act.inject.util.LoadResource; import org.osgl.$; import org.osgl.inject.annotation.Configuration; @@ -52,7 +53,7 @@ public static void classInit(App app) { public static Object tryGetSingleton(Class invokerClass, App app) { Object singleton = app.singleton(invokerClass); if (null == singleton) { - if (_isGlobalOrStateless(invokerClass, new HashSet())) { + if (isGlobalOrStateless(invokerClass, new HashSet())) { singleton = app.getInstance(invokerClass); } } @@ -159,8 +160,22 @@ private static boolean isGlobalOrStateless(Class type, Set circularRefere return _isGlobalOrStateless(type, circularReferenceDetector); } + private static $.Predicate> STATEFUL_CLASS = new $.Predicate>() { + @Override + public boolean test(Class aClass) { + return !_hasGlobalOrStatelessAnnotations(aClass); + } + }; + + private static $.Predicate NON_STATIC_FIELD = new $.Predicate() { + @Override + public boolean test(Field field) { + return !Modifier.isStatic(field.getModifiers()); + } + }; + private static boolean _isGlobalOrStateless(Class type, Set circularReferenceDetector) { - List fields = $.fieldsOf(type); + List fields = $.fieldsOf(type, STATEFUL_CLASS, NON_STATIC_FIELD); if (fields.isEmpty()) { return true; } @@ -180,10 +195,25 @@ private static boolean isGlobalOrStateless(Field field, Set circularRefer return isGlobalOrStateless(fieldType, circularReferenceDetector); } - private final static List> statelessMarkers = C.list(Singleton.class, Stateless.class, Global.class, Configuration.class, LoadResource.class); + private final static List> statelessMarkersForClass = C.list( + Singleton.class, Stateless.class + ); + + private final static List> statelessMarkersForFields = C.list( + Stateless.class, Global.class, Configuration.class, + LoadResource.class, LoadConfig.class + ); + + private static boolean _hasGlobalOrStatelessAnnotations(Class type) { + return _hasAnnotations(type, statelessMarkersForClass); + } + + private static boolean _hasGlobalOrStatelessAnnotations(Field field) { + return _hasAnnotations(field, statelessMarkersForFields); + } - private static boolean _hasGlobalOrStatelessAnnotations(AnnotatedElement element) { - for (Class type : statelessMarkers) { + private static boolean _hasAnnotations(AnnotatedElement element, List> annotations) { + for (Class type : annotations) { if (null != element.getAnnotation(type)) { return true; } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh829.java b/testapps/GHIssues/src/main/java/ghissues/Gh829.java index b1fc63053..65f752d56 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh829.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh829.java @@ -3,8 +3,8 @@ import act.annotations.DownloadFilename; import act.app.ActionContext; import act.controller.annotation.UrlContext; -import act.inject.param.NoBind; import act.job.OnAppStart; +import act.util.Global; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.S; @@ -18,7 +18,7 @@ public static class Foo { public String name = S.random(); } - @NoBind + @Global private List foos; @OnAppStart From cb4fe01cba3e7b6a9086da28407a11c73d2e7904 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 30 Oct 2018 20:43:41 +1100 Subject: [PATCH 192/730] Cannot add white space for `session.header.payload.prefix` configuration #918 --- CHANGELOG.md | 1 + src/main/java/act/conf/AppConfig.java | 4 +- testapps/GH918/.gitignore | 19 + testapps/GH918/pom.xml | 26 + testapps/GH918/run_dev | 3 + testapps/GH918/run_dev.bat | 2 + testapps/GH918/run_e2e | 3 + testapps/GH918/run_e2e.bat | 2 + testapps/GH918/run_prod | 10 + .../GH918/src/main/java/gh918/AppEntry.java | 15 + .../src/main/resources/conf/app.properties | 805 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + testapps/GH918/src/main/resources/logback.xml | 115 +++ .../src/main/resources/test/scenarios.yml | 10 + 15 files changed, 1024 insertions(+), 1 deletion(-) create mode 100644 testapps/GH918/.gitignore create mode 100644 testapps/GH918/pom.xml create mode 100755 testapps/GH918/run_dev create mode 100755 testapps/GH918/run_dev.bat create mode 100755 testapps/GH918/run_e2e create mode 100755 testapps/GH918/run_e2e.bat create mode 100755 testapps/GH918/run_prod create mode 100644 testapps/GH918/src/main/java/gh918/AppEntry.java create mode 100644 testapps/GH918/src/main/resources/conf/app.properties create mode 100644 testapps/GH918/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH918/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH918/src/main/resources/logback.xml create mode 100644 testapps/GH918/src/main/resources/test/scenarios.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e8ac8b63..7b07003b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* Cannot add white space for `session.header.payload.prefix` configuration #918 * `App.getResource(String)` behavior different between dev and prod mode #916 * Make `Dao` by default be stateless #914 * Optimize Singleton controller instance infer logic #913 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 1bba1745f..772128f15 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -2882,7 +2882,9 @@ protected void sessionHeaderPayloadPrefix(String prefix) { public String sessionHeaderPayloadPrefix() { if (null == sessionHeaderPayloadPrefix) { - sessionHeaderPayloadPrefix = get(SESSION_HEADER_PAYLOAD_PREFIX, HeaderTokenSessionMapper.DEF_PAYLOAD_PREFIX); + String s = get(SESSION_HEADER_PAYLOAD_PREFIX, HeaderTokenSessionMapper.DEF_PAYLOAD_PREFIX); + s = S.strip(s).of(S.DOUBLE_QUOTES); + sessionHeaderPayloadPrefix = s; } return sessionHeaderPayloadPrefix; } diff --git a/testapps/GH918/.gitignore b/testapps/GH918/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH918/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH918/pom.xml b/testapps/GH918/pom.xml new file mode 100644 index 000000000..441c07cd8 --- /dev/null +++ b/testapps/GH918/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + act_issues + gh918 + 1.0-SNAPSHOT + + + org.actframework + act-starter-parent + 1.8.8.7-SNAPSHOT + + + + + 1.8 + gh918.AppEntry + + + + + + diff --git a/testapps/GH918/run_dev b/testapps/GH918/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH918/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH918/run_dev.bat b/testapps/GH918/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH918/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH918/run_e2e b/testapps/GH918/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH918/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH918/run_e2e.bat b/testapps/GH918/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH918/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH918/run_prod b/testapps/GH918/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH918/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH918/src/main/java/gh918/AppEntry.java b/testapps/GH918/src/main/java/gh918/AppEntry.java new file mode 100644 index 000000000..fedd4be04 --- /dev/null +++ b/testapps/GH918/src/main/java/gh918/AppEntry.java @@ -0,0 +1,15 @@ +package gh918; + +import act.Act; +import org.osgl.mvc.annotation.GetAction; + +public class AppEntry { + + @GetAction + public void test() { + } + + public static void main(String[] args) throws Exception { + Act.start(); + } +} diff --git a/testapps/GH918/src/main/resources/conf/app.properties b/testapps/GH918/src/main/resources/conf/app.properties new file mode 100644 index 000000000..a6bc18149 --- /dev/null +++ b/testapps/GH918/src/main/resources/conf/app.properties @@ -0,0 +1,805 @@ +session.header=Authorization +session.header.payload.prefix="Bearer " +session.mapper.impl=act.session.CookieAndHeaderSessionMapper +session.codec.impl=act.session.JsonWebTokenSessionCodec +api_doc=false +############################################## +# Application configuration +# act-1.8.8-RC11 +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy\u5E74MM\u6708dd\u65E5 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy\u5E74MM\u6708dd\u65E5 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=r2WMft6bZHxUCwiUf5gVRsXJ3iQuB2zSzKZosG3eX98iZNpR1fFfpFlRhjoSQMjm + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH918/src/main/resources/conf/prod/app.properties b/testapps/GH918/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..0798e5539 --- /dev/null +++ b/testapps/GH918/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC11 +############################################## +act.secret=xPBOinitJYM7dli8k1Ji93ERQ1DUzebQrrynkrUwH0U5FzCT2mZGZXhte51tj8Xq \ No newline at end of file diff --git a/testapps/GH918/src/main/resources/conf/uat/app.properties b/testapps/GH918/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..b00fbc901 --- /dev/null +++ b/testapps/GH918/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC11 +############################################## +act.secret=mPFALnfidBVV73tqkcImPCnopmaLpcCcktkCYyb02qusdTQvmP9o6bF6S1WYRFNp \ No newline at end of file diff --git a/testapps/GH918/src/main/resources/logback.xml b/testapps/GH918/src/main/resources/logback.xml new file mode 100644 index 000000000..81946c4bc --- /dev/null +++ b/testapps/GH918/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH918/src/main/resources/test/scenarios.yml b/testapps/GH918/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..a6f4dfeda --- /dev/null +++ b/testapps/GH918/src/main/resources/test/scenarios.yml @@ -0,0 +1,10 @@ +Scenario(GH918): + interactions: + - description: "[gh918] Cannot add white space for `session.header.payload.prefix` configuration" + request: + get: / + response: + headers: + Authorization: + - exists: true + - startsWith: "Bearer " From 6e3e12aa1d0d60ad70b5665e8c1e07e1841b84ed Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 30 Oct 2018 23:34:55 +1100 Subject: [PATCH 193/730] prepare to 1.8.8 release --- pom.xml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 25af164ae..97f6a7bc1 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.8-RC12-SNAPSHOT + 1.8.8-SNAPSHOT ACT Framework The ACT full stack MVC framework @@ -31,7 +31,7 @@ org.osgl parent - 1.0.0-BETA-4 + 1.0.0-BETA-5 @@ -63,14 +63,13 @@ 2.9.9 1.11.3 3.10.0 - 1.18.0-SNAPSHOT + 1.18.0 1.5.0 - 1.9.0-SNAPSHOT - 1.8.1-SNAPSHOT - 1.8.1-SNAPSHOT - 1.7.0 - 1.2.0 - 2.0.0-BETA-1 + 1.9.0 + 1.9.0 + 1.9.0 + 1.8.0 + 1.3.0 0.0.1 1.11.3 1.3.0 From a95fd9d7ef72769fc0f8ca09a552e2aeec2bda86 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 30 Oct 2018 23:35:35 +1100 Subject: [PATCH 194/730] update CHANGELOG date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b07003b0..352e6052d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.8** +**1.8.8** 30/Oct/2018 * Cannot add white space for `session.header.payload.prefix` configuration #918 * `App.getResource(String)` behavior different between dev and prod mode #916 * Make `Dao` by default be stateless #914 From 7aafb3cb3b2630bd11a1ddd38be33daebbf07de2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 30 Oct 2018 23:37:10 +1100 Subject: [PATCH 195/730] [maven-release-plugin] prepare release act-1.8.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 97f6a7bc1..b147dc59f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.8-SNAPSHOT + 1.8.8 ACT Framework The ACT full stack MVC framework From 94b9bc5c3b125b8ce5fc9297e8036bba0e5427e8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 30 Oct 2018 23:37:26 +1100 Subject: [PATCH 196/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b147dc59f..b2444b166 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.8 + 1.8.9-SNAPSHOT ACT Framework The ACT full stack MVC framework From cfe8a13b557f543ed58474086b90402ddecdec33 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 31 Oct 2018 02:07:16 +1100 Subject: [PATCH 197/730] update VERSION_MATRIX --- VERSION_MATRIX.md | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 7f98f8e2c..1b457fe74 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,26 +1,25 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8-RC12 | +| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | | --- | ----: | ----: | ----: | ----: | -| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.1 | -| beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.4 | -| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.2 | -| e2e | | | | 1.0.1 | -| ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.2 | -| ebean | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.2 | -| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.1 | -| excel | 1.3.x | 1.4.x | 1.4.3 | 1.4.5 | -| freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | -| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.1 | -| jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.4 | -| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.1 | -| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.1 | -| mustache | 1.3.x | 1.4.0 | 1.4.2 | 1.4.4 | -| social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.4 | -| sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.2 | -| storage | 0.12.x | 0.13.0 | 0.13.2 | 0.13.4 | -| thymeleaf | 1.2.x | 1.3.0 | 1.3.2 | 1.3.4 | -| velocity | 1.2.x | 1.3.0 | 1.3.2 | 1.3.4 | +| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | +| beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | +| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | +| ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.3 | +| ebean(java8) | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.3 | +| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | +| excel | 1.3.x | 1.4.x | 1.4.3 | 1.5.0 | +| freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.6 | +| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | +| jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.5 | +| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | +| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | +| mustache(java8) | 1.3.x | 1.4.0 | 1.4.2 | 1.4.5 | +| social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.5 | +| sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.3 | +| storage(java8) | 0.12.x | 0.13.0 | 0.13.2 | 0.13.5 | +| thymeleaf | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | +| velocity | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | ## Note From 7c6e2f0a4f971f911c8ba5b1a6c963e1d25ab068 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 31 Oct 2018 02:09:18 +1100 Subject: [PATCH 198/730] update README --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e5634c0b6..32e18e46e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.8.6 + 1.8.8.8 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.8.7 + -DarchetypeVersion=1.8.8.8 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.8.7 + -DarchetypeVersion=1.8.8.8 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.8.7 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.8.8 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.8.7 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.8.8 ``` For RESTful service project From a88f8320884fc974315a0e914d76fc4d5d8be577 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 31 Oct 2018 08:12:16 +1100 Subject: [PATCH 199/730] update archetypeversion to 1.8.8.9 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 32e18e46e..36c8a8bcf 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.8.8 + -DarchetypeVersion=1.8.8.9 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.8.8 + -DarchetypeVersion=1.8.8.9 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.8.8 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.8.9 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.8.8 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.8.9 ``` For RESTful service project From e2a00dae17fde21d733f491399371f8d833bf13c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 31 Oct 2018 08:44:19 +1100 Subject: [PATCH 200/730] update archetype version to 1.8.8.10 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 36c8a8bcf..a15f705a7 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.8.9 + -DarchetypeVersion=1.8.8.10 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.8.9 + -DarchetypeVersion=1.8.8.10 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.8.9 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.8.10 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.8.9 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.8.10 ``` For RESTful service project From cdfe2da892e6e574defe96811062aa3ee0940cb1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 3 Nov 2018 08:29:25 +1100 Subject: [PATCH 201/730] `Unable to find the overwritten method of Xxx` issue on 1.8.8 #925 --- CHANGELOG.md | 3 ++ legacy-testapp/pom.xml | 4 +- .../java/act/apidoc/ApiDocCompileContext.java | 54 +++++++++++++++++++ src/main/java/act/apidoc/ApiManager.java | 28 ++++++---- src/main/java/act/app/ActionContext.java | 17 ++++-- src/main/java/act/route/RouteSource.java | 6 --- .../act/route/RouteTableRouterBuilder.java | 5 +- src/main/java/act/route/RoutedContext.java | 44 +++++++++++++++ src/main/java/act/route/Router.java | 14 ++--- .../java/act/util/ReflectedInvokerHelper.java | 9 ++-- testapps/GHIssues/pom.xml | 4 +- .../src/main/java/ghissues/Gh925.java | 15 ++++++ .../GHIssues/src/main/resources/routes.conf | 4 +- .../src/main/resources/test/scenarios/925.yml | 9 ++++ testapps/ResourceLoaderTest/pom.xml | 2 +- 15 files changed, 180 insertions(+), 38 deletions(-) create mode 100644 src/main/java/act/apidoc/ApiDocCompileContext.java create mode 100644 src/main/java/act/route/RoutedContext.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh925.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/925.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 352e6052d..173e931ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # ActFramework Change Log +**1.8.8** +* `Unable to find the overwritten method of Xxx` issue on 1.8.8 #925 + **1.8.8** 30/Oct/2018 * Cannot add white space for `session.header.payload.prefix` configuration #918 * `App.getResource(String)` behavior different between dev and prod mode #916 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 90592792c..1db8e2fb0 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,9 +73,9 @@ UTF-8 UTF-8 - 1.8.8-RC12-SNAPSHOT + 1.8.9-SNAPSHOT [0.13.0, 2.0.0) - 1.6.2-SNAPSHOT + 1.6.2 testapp.TestApp diff --git a/src/main/java/act/apidoc/ApiDocCompileContext.java b/src/main/java/act/apidoc/ApiDocCompileContext.java new file mode 100644 index 000000000..05d2f2505 --- /dev/null +++ b/src/main/java/act/apidoc/ApiDocCompileContext.java @@ -0,0 +1,54 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.route.RouteSource; +import act.route.RoutedContext; + +public class ApiDocCompileContext implements RoutedContext { + + private RouteSource routeSource; + + @Override + public RouteSource routeSource() { + return routeSource; + } + + @Override + public ApiDocCompileContext routeSource(RouteSource source) { + this.routeSource = source; + return this; + } + + public void saveCurrent() { + current_.set(this); + } + + public void destroy() { + current_.remove(); + } + + private static final ThreadLocal current_ = new ThreadLocal<>(); + + public static ApiDocCompileContext current() { + return current_.get(); + } +} diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index 39a19cc87..6d97a78d3 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -33,6 +33,7 @@ import act.handler.RequestHandlerBase; import act.handler.builtin.ResourceGetter; import act.handler.builtin.controller.RequestHandlerProxy; +import act.route.RouteSource; import act.route.Router; import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; @@ -105,15 +106,21 @@ public void load(App app) { Router router = app.router(); AppConfig config = app.config(); Set controllerClasses = new HashSet<>(); - load(router, null, config, controllerClasses); - for (NamedPort port : app.config().namedPorts()) { - router = app.router(port); - load(router, port, config, controllerClasses); - } - if (Act.isDev()) { - exploreDescriptions(controllerClasses); + ApiDocCompileContext ctx = new ApiDocCompileContext(); + ctx.saveCurrent(); + try { + load(router, null, config, controllerClasses, ctx); + for (NamedPort port : app.config().namedPorts()) { + router = app.router(port); + load(router, port, config, controllerClasses, ctx); + } + if (Act.isDev()) { + exploreDescriptions(controllerClasses); + } + buildModuleLookup(); + } finally { + ctx.destroy(); } - buildModuleLookup(); LOGGER.info("API book compiled"); } @@ -129,13 +136,14 @@ private void buildModuleLookup() { } } - private void load(Router router, NamedPort port, AppConfig config, final Set controllerClasses) { + private void load(Router router, NamedPort port, AppConfig config, final Set controllerClasses, final ApiDocCompileContext ctx) { final int portNumber = null == port ? config.httpExternalPort() : port.port(); final boolean isDev = Act.isDev(); final boolean hideBuiltIn = app().config().isHideBuiltInEndpointsInApiDoc(); router.accept(new Router.Visitor() { @Override - public void visit(H.Method method, String path, RequestHandler handler) { + public void visit(H.Method method, String path, RouteSource routeSource, RequestHandler handler) { + ctx.routeSource(routeSource); if (showEndpoint(path, handler)) { Endpoint endpoint = new Endpoint(portNumber, method, path, handler); endpoints.add(endpoint); diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index bea8c799d..0cd049f4f 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -35,8 +35,7 @@ import act.handler.builtin.controller.RequestHandlerProxy; import act.handler.builtin.controller.impl.ReflectedHandlerInvoker; import act.i18n.LocaleResolver; -import act.route.Router; -import act.route.UrlPath; +import act.route.*; import act.security.CORS; import act.session.SessionManager; import act.util.*; @@ -65,7 +64,7 @@ * an application session */ @RequestScoped -public class ActionContext extends ActContext.Base implements Destroyable { +public class ActionContext extends ActContext.Base implements Destroyable, RoutedContext { private static final Logger LOGGER = LogManager.get(ActionContext.class); @@ -119,6 +118,7 @@ public class ActionContext extends ActContext.Base implements Des private boolean suppressJsonDateFormat; private String attachmentName; private Class handlerClass; + private RouteSource routeSource; // see https://github.com/actframework/actframework/issues/492 public String encodedSessionToken; @@ -568,6 +568,17 @@ public ActionContext handler(RequestHandler handler) { return this; } + @Override + public RouteSource routeSource() { + return routeSource; + } + + @Override + public ActionContext routeSource(RouteSource routeSource) { + this.routeSource = routeSource; + return this; + } + public H.Format accept() { return req().accept(); } diff --git a/src/main/java/act/route/RouteSource.java b/src/main/java/act/route/RouteSource.java index b1adbc374..dc6eec0a5 100644 --- a/src/main/java/act/route/RouteSource.java +++ b/src/main/java/act/route/RouteSource.java @@ -20,8 +20,6 @@ * #L% */ -import org.osgl.util.E; - /** * Enumerate the source where the route mapping come from. *

                                                                                                                                                                      @@ -35,10 +33,6 @@ * action annotation - the route mapping defined by action handler method * along with action annotation * - *

                                                                                                                                                                    • - * app config - route mapping configured by code by calling - * {@link act.app.conf.AppConfigurator.RouteBuilder} APIs - *
                                                                                                                                                                    • * */ public enum RouteSource { diff --git a/src/main/java/act/route/RouteTableRouterBuilder.java b/src/main/java/act/route/RouteTableRouterBuilder.java index dc963fb31..510fd2184 100644 --- a/src/main/java/act/route/RouteTableRouterBuilder.java +++ b/src/main/java/act/route/RouteTableRouterBuilder.java @@ -169,11 +169,10 @@ private void process(String line, Router router) { router.addMapping(m, path, action.toString(), RouteSource.ROUTE_TABLE); } } else { - String s = method; - if ("context".equalsIgnoreCase(s) || "ctx".equalsIgnoreCase(s)) { + if ("context".equalsIgnoreCase(method) || "ctx".equalsIgnoreCase(method)) { router.addContext(action.toString(), path); } else { - H.Method m = H.Method.valueOfIgnoreCase(s); + H.Method m = H.Method.valueOfIgnoreCase(method); router.addMapping(m, path, action.toString(), RouteSource.ROUTE_TABLE); } } diff --git a/src/main/java/act/route/RoutedContext.java b/src/main/java/act/route/RoutedContext.java new file mode 100644 index 000000000..c87ff6b23 --- /dev/null +++ b/src/main/java/act/route/RoutedContext.java @@ -0,0 +1,44 @@ +package act.route; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.ApiDocCompileContext; +import act.app.ActionContext; + +public interface RoutedContext { + + RouteSource routeSource(); + + RoutedContext routeSource(RouteSource source); + + class Current { + + public static RoutedContext get() { + ActionContext actionContext = ActionContext.current(); + if (null != actionContext) { + return actionContext; + } + return ApiDocCompileContext.current(); + } + + } + +} diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 91d8be526..522e46866 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -69,10 +69,12 @@ public interface Visitor { * the HTTP method * @param path * the URL path + * @param source + * the route source * @param handler * the handler */ - void visit(H.Method method, String path, RequestHandler handler); + void visit(H.Method method, String path, RouteSource source, RequestHandler handler); } public static final String IGNORE_NOTATION = "..."; @@ -188,7 +190,7 @@ private void visit(Node node, H.Method method, Visitor visitor) { if (handler instanceof ContextualHandler) { handler = ((ContextualHandler) handler).realHandler(); } - visitor.visit(method, node.path(), handler); + visitor.visit(method, node.path(), node.routeSource, handler); } for (Node child : node.dynamicChilds) { visit(child, method, visitor); @@ -216,10 +218,10 @@ public RequestHandler getInvoker(H.Method method, String path, ActionContext con node = search(node, Path.tokenizer(Unsafe.bufOf(path)), context); RequestHandler handler = getInvokerFrom(node); RequestHandler blockIssueHandler = app().blockIssueHandler(); - if (null == blockIssueHandler) { - return handler; - } - if (handler instanceof FileGetter || handler instanceof ResourceGetter) { + if (null == blockIssueHandler || (handler instanceof FileGetter || handler instanceof ResourceGetter)) { + if (null != node) { + context.routeSource(node.routeSource); + } // otherwise handler is always 404 return handler; } return blockIssueHandler; diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index a9a037473..a0b92d953 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -25,6 +25,8 @@ import act.app.*; import act.inject.util.LoadConfig; import act.inject.util.LoadResource; +import act.route.RouteSource; +import act.route.RoutedContext; import org.osgl.$; import org.osgl.inject.annotation.Configuration; import org.osgl.mvc.annotation.*; @@ -77,7 +79,9 @@ public static Annotation[][] requestHandlerMethodParamAnnotations(Method method) } Annotation[][] paramAnnotations = requestHandlerMethodParamAnnotationCache.get(method); if (null == paramAnnotations) { - if (!hasActionAnnotation(method)) { + RoutedContext ctx = RoutedContext.Current.get(); + E.illegalStateIf(null == ctx, "Unable to detected current RoutedContext"); + if (RouteSource.ACTION_ANNOTATION == ctx.routeSource() && !hasActionAnnotation(method)) { Method overwrittenMethod = overwrittenMethodOf(method); paramAnnotations = overwrittenMethod == method ? method.getParameterAnnotations() : requestHandlerMethodParamAnnotations(overwrittenMethod); } else { @@ -94,9 +98,6 @@ public static Method overwrittenMethodOf(Method method) { try { return base.getMethod(method.getName(), method.getParameterTypes()); } catch (NoSuchMethodException e) { - if (ApiManager.inProgress()) { - return method; - } throw E.unexpected("Unable to find the overwritten method of " + method); } } diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index e45929aa0..00d6d6bd1 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -5,14 +5,14 @@ 4.0.0 act-ghissues - 1.8.8.8-SNAPSHOT + 1.8.8.8 ActFramework Github Issue Reproduce App org.actframework act-starter-parent - 1.8.8.7-SNAPSHOT + 1.8.8.9-SNAPSHOT diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh925.java b/testapps/GHIssues/src/main/java/ghissues/Gh925.java new file mode 100644 index 000000000..39aefde09 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh925.java @@ -0,0 +1,15 @@ +package ghissues; + +public class Gh925 { + + public static class Super extends BaseController {} + + public static class Sub extends Super { + + public String test(String who) { + return who; + } + + } + +} diff --git a/testapps/GHIssues/src/main/resources/routes.conf b/testapps/GHIssues/src/main/resources/routes.conf index 8922eb485..d9a34c0dc 100644 --- a/testapps/GHIssues/src/main/resources/routes.conf +++ b/testapps/GHIssues/src/main/resources/routes.conf @@ -1 +1,3 @@ -GET /gh%20887 echo:887 \ No newline at end of file +GET /gh%20887 echo:887 + +GET /925 ghissues.Gh925$Sub.test \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/925.yml b/testapps/GHIssues/src/main/resources/test/scenarios/925.yml new file mode 100644 index 000000000..8ff8b6be2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/925.yml @@ -0,0 +1,9 @@ +Scenario(GH925): + description: "[925] `Unable to find the overwritten method of Xxx` issue on 1.8.8" + interactions: + - description: test + request: + get: 925?who=x + response: + json: + result: x \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/pom.xml b/testapps/ResourceLoaderTest/pom.xml index d251beee8..797ecee95 100644 --- a/testapps/ResourceLoaderTest/pom.xml +++ b/testapps/ResourceLoaderTest/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.8.7-SNAPSHOT + 1.8.8.9-SNAPSHOT From 893298fa9c8a326faa9a5ac89390fec75632be18 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 3 Nov 2018 09:17:06 +1100 Subject: [PATCH 202/730] `UnexpectedClassNotFoundException` raised during restoring plugin classes #923 --- CHANGELOG.md | 1 + .../act/boot/app/FullStackAppBootstrapClassLoader.java | 9 +++++++-- src/main/java/act/util/ClassInfoRepository.java | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 173e931ad..c77b6c80c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* `UnexpectedClassNotFoundException` raised during restoring plugin classes #923 * `Unable to find the overwritten method of Xxx` issue on 1.8.8 #925 **1.8.8** 30/Oct/2018 diff --git a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java index afff193f8..c98bfc9c4 100644 --- a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java +++ b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java @@ -94,8 +94,13 @@ public FullStackAppBootstrapClassLoader(ClassLoader parent) { @Override public List> pluginClasses() { if (classInfoRepository().isEmpty()) { - restoreClassInfoRegistry(); - restorePluginClasses(); + try { + restoreClassInfoRegistry(); + restorePluginClasses(); + } catch (RuntimeException e) { + LOGGER.warn(e, "Error restoring class info registry or plugin classes"); + classInfoRepository.reset(); + } if (classInfoRepository.isEmpty()) { if (LOGGER.isTraceEnabled()) { LOGGER.trace("classInfoRegistry not recovered, start searching through libBC (with total %s classes)", libBCSize()); diff --git a/src/main/java/act/util/ClassInfoRepository.java b/src/main/java/act/util/ClassInfoRepository.java index d69a62693..8f409df99 100644 --- a/src/main/java/act/util/ClassInfoRepository.java +++ b/src/main/java/act/util/ClassInfoRepository.java @@ -117,6 +117,10 @@ public boolean isEmpty() { return classes.isEmpty(); } + public void reset() { + classes.clear(); + } + @Override protected void releaseResources() { classes.clear(); From 610b76f58f63aa9e01a7ebe7a2df6ee12caee0f7 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 3 Nov 2018 10:17:21 +1100 Subject: [PATCH 203/730] API doc - it shall support `@Sensitive` annotation #919 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/Endpoint.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c77b6c80c..249f1c75a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* API doc - it shall support `@Sensitive` annotation #919 * `UnexpectedClassNotFoundException` raised during restoring plugin classes #923 * `Unable to find the overwritten method of Xxx` issue on 1.8.8 #925 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index c3f7d54b4..f30a4e208 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -766,6 +766,9 @@ public static Object generateSampleData( val = $.convert(val).to(fieldClass); } if (null != val) { + if (valType == String.class && fieldSpec.hasAnnotation(Sensitive.class)) { + val = Act.app().crypto().encrypt((String) val); + } field.set(obj, val); } } From b90083c3a16c68f6dbe7acf8131f06c0868fb7ef Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 3 Nov 2018 11:51:26 +1100 Subject: [PATCH 204/730] API doc - allow fault tolerant when generating sample data #920 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/Endpoint.java | 6 +++++- src/main/java/act/util/ReflectedInvokerHelper.java | 10 ++++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 249f1c75a..6c5409c1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* API doc - allow fault tolerant when generating sample data #920 * API doc - it shall support `@Sensitive` annotation #919 * `UnexpectedClassNotFoundException` raised during restoring plugin classes #923 * `Unable to find the overwritten method of Xxx` issue on 1.8.8 #925 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index f30a4e208..4563b8269 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -334,7 +334,6 @@ private void explore(RequestHandler handler) { if (controllerClass.getGenericSuperclass() instanceof ParameterizedType) { typeParamLookup = Generics.buildTypeParamImplLookup(controllerClass); } - returnSample = void.class == returnType ? null : generateSampleJson(BeanSpec.of(returnType, null, Act.injector(), typeParamLookup), typeParamLookup); Description descAnno = method.getAnnotation(Description.class); this.description = null == descAnno ? id(controllerClass, method) : descAnno.value(); Module methodModule = method.getAnnotation(Module.class); @@ -344,6 +343,11 @@ private void explore(RequestHandler handler) { exploreParamInfo(controllerClass, typeParamLookup); } this.controllerClass = controllerClass; + try { + returnSample = void.class == returnType ? null : generateSampleJson(BeanSpec.of(returnType, null, Act.injector(), typeParamLookup), typeParamLookup); + } catch (Exception e) { + LOGGER.warn(e, "Error creating returnSample of endpoint for request handler [%s] for [%s %s]", handler, httpMethod, path); + } } private String inferModule(Class controllerClass) { diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index a0b92d953..0cd0490fa 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -25,6 +25,7 @@ import act.app.*; import act.inject.util.LoadConfig; import act.inject.util.LoadResource; +import act.job.JobContext; import act.route.RouteSource; import act.route.RoutedContext; import org.osgl.$; @@ -79,9 +80,14 @@ public static Annotation[][] requestHandlerMethodParamAnnotations(Method method) } Annotation[][] paramAnnotations = requestHandlerMethodParamAnnotationCache.get(method); if (null == paramAnnotations) { + boolean searchForOverwrittenMethod = false; RoutedContext ctx = RoutedContext.Current.get(); - E.illegalStateIf(null == ctx, "Unable to detected current RoutedContext"); - if (RouteSource.ACTION_ANNOTATION == ctx.routeSource() && !hasActionAnnotation(method)) { + if (null != ctx) { + searchForOverwrittenMethod = RouteSource.ACTION_ANNOTATION == ctx.routeSource() && !hasActionAnnotation(method); + } else { + E.illegalStateIf(null == JobContext.current(), "Unable to detected current RoutedContext"); + } + if (searchForOverwrittenMethod) { Method overwrittenMethod = overwrittenMethodOf(method); paramAnnotations = overwrittenMethod == method ? method.getParameterAnnotations() : requestHandlerMethodParamAnnotations(overwrittenMethod); } else { From 2a966c94899b32e6af8281973e05847d4957676b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 3 Nov 2018 12:44:14 +1100 Subject: [PATCH 205/730] CLI - do not output `null` for options without help message #927 --- CHANGELOG.md | 1 + src/main/java/act/cli/meta/OptionAnnoInfoBase.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c5409c1d..c5555458e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.8** +* CLI - do not output `null` for options without help message #927 * API doc - allow fault tolerant when generating sample data #920 * API doc - it shall support `@Sensitive` annotation #919 * `UnexpectedClassNotFoundException` raised during restoring plugin classes #923 diff --git a/src/main/java/act/cli/meta/OptionAnnoInfoBase.java b/src/main/java/act/cli/meta/OptionAnnoInfoBase.java index cb9df4494..53195c1ef 100644 --- a/src/main/java/act/cli/meta/OptionAnnoInfoBase.java +++ b/src/main/java/act/cli/meta/OptionAnnoInfoBase.java @@ -43,7 +43,7 @@ public class OptionAnnoInfoBase { private String lead2; private String defVal; private String group; - private String help; + private String help = ""; private boolean required; private String param; From 8f624ee331350a593fca39d8d13e45b0d19206c5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 3 Nov 2018 21:54:06 +1100 Subject: [PATCH 206/730] add testcase for GH928; InheritedStateless shall be statelessMarkersForClass --- .../act/cli/meta/CommandMethodMetaInfo.java | 2 +- .../java/act/util/ReflectedInvokerHelper.java | 2 +- .../main/java/ghissues/gh928/BaseModel.java | 14 +++++++++++++ .../main/java/ghissues/gh928/Department.java | 10 +++++++++ .../ghissues/gh928/DepartmentService.java | 21 +++++++++++++++++++ .../src/main/java/ghissues/gh928/User.java | 10 +++++++++ .../main/java/ghissues/gh928/UserService.java | 21 +++++++++++++++++++ .../src/main/resources/test/fixtures/928.yml | 4 ++++ .../src/main/resources/test/scenarios/928.yml | 20 ++++++++++++++++++ 9 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh928/BaseModel.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh928/Department.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh928/DepartmentService.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh928/User.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh928/UserService.java create mode 100644 testapps/GHIssues/src/main/resources/test/fixtures/928.yml create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/928.yml diff --git a/src/main/java/act/cli/meta/CommandMethodMetaInfo.java b/src/main/java/act/cli/meta/CommandMethodMetaInfo.java index d2e54ec4f..0bf0dacdf 100644 --- a/src/main/java/act/cli/meta/CommandMethodMetaInfo.java +++ b/src/main/java/act/cli/meta/CommandMethodMetaInfo.java @@ -116,7 +116,7 @@ public CommandMethodMetaInfo helpMsg(String msg) { } public String helpMsg() { - return null == helpMsg ? "" : helpMsg; + return null == helpMsg ? "" : helpMsg; } /** diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 0cd0490fa..6a38f7796 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -203,7 +203,7 @@ private static boolean isGlobalOrStateless(Field field, Set circularRefer } private final static List> statelessMarkersForClass = C.list( - Singleton.class, Stateless.class + Singleton.class, Stateless.class, InheritedStateless.class ); private final static List> statelessMarkersForFields = C.list( diff --git a/testapps/GHIssues/src/main/java/ghissues/gh928/BaseModel.java b/testapps/GHIssues/src/main/java/ghissues/gh928/BaseModel.java new file mode 100644 index 000000000..ce5abac75 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh928/BaseModel.java @@ -0,0 +1,14 @@ +package ghissues.gh928; + +import act.util.SimpleBean; + +import javax.persistence.*; + +@MappedSuperclass +public abstract class BaseModel implements SimpleBean { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh928/Department.java b/testapps/GHIssues/src/main/java/ghissues/gh928/Department.java new file mode 100644 index 000000000..c65632a14 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh928/Department.java @@ -0,0 +1,10 @@ +package ghissues.gh928; + +import javax.persistence.Entity; + +@Entity +public class Department extends BaseModel { + + public String name; + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh928/DepartmentService.java b/testapps/GHIssues/src/main/java/ghissues/gh928/DepartmentService.java new file mode 100644 index 000000000..d7a84133a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh928/DepartmentService.java @@ -0,0 +1,21 @@ +package ghissues.gh928; + +import act.controller.annotation.UrlContext; +import act.db.jpa.JPADao; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; + +@UrlContext("928/departments") +public class DepartmentService extends BaseController { + + @Inject + private JPADao dao; + + @GetAction + public Iterable list() { + return dao.findAll(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh928/User.java b/testapps/GHIssues/src/main/java/ghissues/gh928/User.java new file mode 100644 index 000000000..cd17f48c8 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh928/User.java @@ -0,0 +1,10 @@ +package ghissues.gh928; + +import javax.persistence.Entity; + +@Entity +public class User extends BaseModel { + + public String fullName; + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh928/UserService.java b/testapps/GHIssues/src/main/java/ghissues/gh928/UserService.java new file mode 100644 index 000000000..a0f84d7e3 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh928/UserService.java @@ -0,0 +1,21 @@ +package ghissues.gh928; + +import act.controller.annotation.UrlContext; +import act.db.jpa.JPADao; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; + +@UrlContext("928/users") +public class UserService extends BaseController { + + @Inject + private JPADao dao; + + @GetAction + public Iterable list() { + return dao.findAll(); + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/fixtures/928.yml b/testapps/GHIssues/src/main/resources/test/fixtures/928.yml new file mode 100644 index 000000000..7f2db9753 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/fixtures/928.yml @@ -0,0 +1,4 @@ +ghissues.gh928.User(Green): + fullName: Gelin Luo +ghissues.gh928.Department(R&D): + name: R&D \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/928.yml b/testapps/GHIssues/src/main/resources/test/scenarios/928.yml new file mode 100644 index 000000000..cd1ae6713 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/928.yml @@ -0,0 +1,20 @@ +Scenario(GH928): + fixtures: + - 928.yml + interactions: + - description: fetch user list + request: + get: /928/users + response: + json: + size: 1 + 0: + fullName: Gelin Luo + - description: fetch department list + request: + get: /928/departments + response: + json: + size: 1 + 0: + name: R&D \ No newline at end of file From cc5c8997efea9760bb0274386a69f3b6ff74b190 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 4 Nov 2018 10:19:14 +1100 Subject: [PATCH 207/730] add testcase for GH919 and GH926 --- testapps/GH919/.gitignore | 19 + testapps/GH919/README.md | 61 ++ testapps/GH919/pom.xml | 26 + testapps/GH919/run_dev | 3 + testapps/GH919/run_dev.bat | 2 + testapps/GH919/run_e2e | 3 + testapps/GH919/run_e2e.bat | 2 + testapps/GH919/run_prod | 10 + .../GH919/src/main/java/gh919/AppEntry.java | 31 + .../src/main/resources/conf/app.properties | 800 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + testapps/GH919/src/main/resources/logback.xml | 115 +++ .../src/main/resources/test/scenarios.yml | 10 + testapps/GH926/.gitignore | 19 + testapps/GH926/README.md | 15 + testapps/GH926/pom.xml | 26 + testapps/GH926/run_dev | 3 + testapps/GH926/run_dev.bat | 2 + testapps/GH926/run_e2e | 3 + testapps/GH926/run_e2e.bat | 2 + testapps/GH926/run_prod | 10 + .../GH926/src/main/java/gh926/AppEntry.java | 18 + .../src/main/resources/conf/app.properties | 800 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + testapps/GH926/src/main/resources/logback.xml | 115 +++ 27 files changed, 2115 insertions(+) create mode 100644 testapps/GH919/.gitignore create mode 100644 testapps/GH919/README.md create mode 100644 testapps/GH919/pom.xml create mode 100755 testapps/GH919/run_dev create mode 100755 testapps/GH919/run_dev.bat create mode 100755 testapps/GH919/run_e2e create mode 100755 testapps/GH919/run_e2e.bat create mode 100755 testapps/GH919/run_prod create mode 100644 testapps/GH919/src/main/java/gh919/AppEntry.java create mode 100644 testapps/GH919/src/main/resources/conf/app.properties create mode 100644 testapps/GH919/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH919/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH919/src/main/resources/logback.xml create mode 100644 testapps/GH919/src/main/resources/test/scenarios.yml create mode 100644 testapps/GH926/.gitignore create mode 100644 testapps/GH926/README.md create mode 100644 testapps/GH926/pom.xml create mode 100755 testapps/GH926/run_dev create mode 100755 testapps/GH926/run_dev.bat create mode 100755 testapps/GH926/run_e2e create mode 100755 testapps/GH926/run_e2e.bat create mode 100755 testapps/GH926/run_prod create mode 100644 testapps/GH926/src/main/java/gh926/AppEntry.java create mode 100644 testapps/GH926/src/main/resources/conf/app.properties create mode 100644 testapps/GH926/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH926/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH926/src/main/resources/logback.xml diff --git a/testapps/GH919/.gitignore b/testapps/GH919/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH919/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH919/README.md b/testapps/GH919/README.md new file mode 100644 index 000000000..8132c1838 --- /dev/null +++ b/testapps/GH919/README.md @@ -0,0 +1,61 @@ +# GH919 API doc - it shall support `@Sensitive` annotation + +## Reproduce + +Run `./run_dev`. Once app started it will print error logs like: + +``` +2018-11-03 09:39:00,604 WARN a.j.Job@[jobs-thread-6] - error executing job compile-api-book +com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.2.47, class gh919.AppEntry$Foo + at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:465) + at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:120) + at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:281) + at com.alibaba.fastjson.JSON.toJSONString(JSON.java:591) + at com.alibaba.fastjson.JSON.toJSONString(JSON.java:580) + at com.alibaba.fastjson.JSON.toJSONString(JSON.java:740) + at act.apidoc.Endpoint.generateSampleJson(Endpoint.java:474) + at act.apidoc.Endpoint.explore(Endpoint.java:337) + at act.apidoc.Endpoint.(Endpoint.java:213) + at act.apidoc.ApiManager$2.visit(ApiManager.java:148) + at act.route.Router.visit(Router.java:193) + at act.route.Router.visit(Router.java:199) + at act.route.Router.accept(Router.java:180) + at act.apidoc.ApiManager.load(ApiManager.java:143) + at act.apidoc.ApiManager.load(ApiManager.java:112) + at act.apidoc.ApiManager$1.run(ApiManager.java:84) + at act.job.Job$4.apply(Job.java:394) + at act.job.Job.doJob(Job.java:355) + at act.job.Job.run(Job.java:292) + at act.job.Job$LockableJobList$1.run(Job.java:96) + at act.job.JobManager$ContextualJob$1.apply(JobManager.java:483) + at act.job.Job.doJob(Job.java:355) + at act.job.Job.run(Job.java:292) + at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) + at java.util.concurrent.FutureTask.run(FutureTask.java:266) + at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) + at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) + at java.lang.Thread.run(Thread.java:748) +Caused by: java.lang.reflect.InvocationTargetException: null + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at com.alibaba.fastjson.util.FieldInfo.get(FieldInfo.java:484) + at com.alibaba.fastjson.serializer.FieldSerializer.getPropertyValueDirect(FieldSerializer.java:140) + at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:249) + ... 29 common frames omitted +Caused by: org.osgl.exception.UnexpectedException: java.lang.IllegalArgumentException: contains illegal character for hexBinary: M4yjB9b&SPc5f&!K + at org.osgl.util.E.unexpected(E.java:189) + at org.osgl.util.Crypto.decryptAES(Crypto.java:361) + at act.crypto.AppCrypto.decrypt(AppCrypto.java:135) + at gh919.AppEntry$Foo.getName(AppEntry.java) + ... 36 common frames omitted +Caused by: java.lang.IllegalArgumentException: contains illegal character for hexBinary: M4yjB9b&SPc5f&!K + at javax.xml.bind.DatatypeConverterImpl.parseHexBinary(DatatypeConverterImpl.java:451) + at javax.xml.bind.DatatypeConverter.parseHexBinary(DatatypeConverter.java:357) + at org.osgl.util.Codec.hexStringToByte(Codec.java:220) + at org.osgl.util.Crypto.decryptAES(Crypto.java:345) + ... 38 common frames omitted +``` diff --git a/testapps/GH919/pom.xml b/testapps/GH919/pom.xml new file mode 100644 index 000000000..421c35529 --- /dev/null +++ b/testapps/GH919/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + act_issues + gh919 + 1.0-SNAPSHOT + + + org.actframework + act-starter-parent + 1.8.8.9-SNAPSHOT + + + + + 1.8 + gh919.AppEntry + + + + + + diff --git a/testapps/GH919/run_dev b/testapps/GH919/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH919/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH919/run_dev.bat b/testapps/GH919/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH919/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH919/run_e2e b/testapps/GH919/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH919/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH919/run_e2e.bat b/testapps/GH919/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH919/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH919/run_prod b/testapps/GH919/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH919/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH919/src/main/java/gh919/AppEntry.java b/testapps/GH919/src/main/java/gh919/AppEntry.java new file mode 100644 index 000000000..97b0c8dd6 --- /dev/null +++ b/testapps/GH919/src/main/java/gh919/AppEntry.java @@ -0,0 +1,31 @@ +package gh919; + +import act.Act; +import act.controller.annotation.UrlContext; +import act.data.Sensitive; +import act.util.SimpleBean; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("919") +public class AppEntry { + + public static class Foo implements SimpleBean { + @Sensitive + public String name; + } + + @PostAction + public Foo post() { + return new Foo(); + } + + @GetAction + public String get() { + return "Hello"; + } + + public static void main(String[] args) throws Exception { + Act.start(); + } +} diff --git a/testapps/GH919/src/main/resources/conf/app.properties b/testapps/GH919/src/main/resources/conf/app.properties new file mode 100644 index 000000000..d4e2a8ec0 --- /dev/null +++ b/testapps/GH919/src/main/resources/conf/app.properties @@ -0,0 +1,800 @@ +############################################## +# Application configuration +# act-1.8.8-RC11 +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy\u5E74MM\u6708dd\u65E5 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy\u5E74MM\u6708dd\u65E5 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=r2WMft6bZHxUCwiUf5gVRsXJ3iQuB2zSzKZosG3eX98iZNpR1fFfpFlRhjoSQMjm + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH919/src/main/resources/conf/prod/app.properties b/testapps/GH919/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..0798e5539 --- /dev/null +++ b/testapps/GH919/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC11 +############################################## +act.secret=xPBOinitJYM7dli8k1Ji93ERQ1DUzebQrrynkrUwH0U5FzCT2mZGZXhte51tj8Xq \ No newline at end of file diff --git a/testapps/GH919/src/main/resources/conf/uat/app.properties b/testapps/GH919/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..b00fbc901 --- /dev/null +++ b/testapps/GH919/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC11 +############################################## +act.secret=mPFALnfidBVV73tqkcImPCnopmaLpcCcktkCYyb02qusdTQvmP9o6bF6S1WYRFNp \ No newline at end of file diff --git a/testapps/GH919/src/main/resources/logback.xml b/testapps/GH919/src/main/resources/logback.xml new file mode 100644 index 000000000..81946c4bc --- /dev/null +++ b/testapps/GH919/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH919/src/main/resources/test/scenarios.yml b/testapps/GH919/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..a6f4dfeda --- /dev/null +++ b/testapps/GH919/src/main/resources/test/scenarios.yml @@ -0,0 +1,10 @@ +Scenario(GH918): + interactions: + - description: "[gh918] Cannot add white space for `session.header.payload.prefix` configuration" + request: + get: / + response: + headers: + Authorization: + - exists: true + - startsWith: "Bearer " diff --git a/testapps/GH926/.gitignore b/testapps/GH926/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH926/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH926/README.md b/testapps/GH926/README.md new file mode 100644 index 000000000..ec0d94806 --- /dev/null +++ b/testapps/GH926/README.md @@ -0,0 +1,15 @@ +# GH926 CLI - it shall not use JSON as default encoding type for output + +## Reproduce + +1. run `run_dev` + +2. Once app started, enter cli + +3. type `hello world`, it will print out something like + + ```json + {"result": "hello world"} + ``` + + \ No newline at end of file diff --git a/testapps/GH926/pom.xml b/testapps/GH926/pom.xml new file mode 100644 index 000000000..d800aa283 --- /dev/null +++ b/testapps/GH926/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + act_issues + gh926 + 1.0-SNAPSHOT + + + org.actframework + act-starter-parent + 1.8.8.9-SNAPSHOT + + + + + 1.8 + gh926.AppEntry + + + + + + diff --git a/testapps/GH926/run_dev b/testapps/GH926/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH926/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH926/run_dev.bat b/testapps/GH926/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH926/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH926/run_e2e b/testapps/GH926/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH926/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH926/run_e2e.bat b/testapps/GH926/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH926/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH926/run_prod b/testapps/GH926/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH926/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH926/src/main/java/gh926/AppEntry.java b/testapps/GH926/src/main/java/gh926/AppEntry.java new file mode 100644 index 000000000..4014a2d76 --- /dev/null +++ b/testapps/GH926/src/main/java/gh926/AppEntry.java @@ -0,0 +1,18 @@ +package gh926; + +import act.Act; +import act.cli.Command; +import act.cli.Optional; +import act.inject.DefaultValue; + +public class AppEntry { + + @Command("hello") + public String hello(@Optional @DefaultValue("World") String who) { + return "Hello " + who; + } + + public static void main(String[] args) throws Exception { + Act.start(); + } +} diff --git a/testapps/GH926/src/main/resources/conf/app.properties b/testapps/GH926/src/main/resources/conf/app.properties new file mode 100644 index 000000000..d4e2a8ec0 --- /dev/null +++ b/testapps/GH926/src/main/resources/conf/app.properties @@ -0,0 +1,800 @@ +############################################## +# Application configuration +# act-1.8.8-RC11 +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy\u5E74MM\u6708dd\u65E5 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy\u5E74MM\u6708dd\u65E5 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=r2WMft6bZHxUCwiUf5gVRsXJ3iQuB2zSzKZosG3eX98iZNpR1fFfpFlRhjoSQMjm + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH926/src/main/resources/conf/prod/app.properties b/testapps/GH926/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..0798e5539 --- /dev/null +++ b/testapps/GH926/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC11 +############################################## +act.secret=xPBOinitJYM7dli8k1Ji93ERQ1DUzebQrrynkrUwH0U5FzCT2mZGZXhte51tj8Xq \ No newline at end of file diff --git a/testapps/GH926/src/main/resources/conf/uat/app.properties b/testapps/GH926/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..b00fbc901 --- /dev/null +++ b/testapps/GH926/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC11 +############################################## +act.secret=mPFALnfidBVV73tqkcImPCnopmaLpcCcktkCYyb02qusdTQvmP9o6bF6S1WYRFNp \ No newline at end of file diff --git a/testapps/GH926/src/main/resources/logback.xml b/testapps/GH926/src/main/resources/logback.xml new file mode 100644 index 000000000..81946c4bc --- /dev/null +++ b/testapps/GH926/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f7215dbff7c94ec8369cd81a2498f19b0f941095 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 4 Nov 2018 16:38:25 +1100 Subject: [PATCH 208/730] `java.lang.IllegalArgumentException` upon starting BSBF project #931; Hot reload is broken in R1.8.8 version #921 --- CHANGELOG.md | 2 ++ src/main/java/act/app/App.java | 5 ++- .../GH931/src/main/java/gh931/Account.java | 18 +++++++++++ testapps/GH931/src/main/java/gh931/Order.java | 32 +++++++++++++++++++ .../main/resources/test/fixtures/fixture.yml | 7 ++++ .../main/resources/test/scenarios/test.yml | 16 ++++++++++ 6 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 testapps/GH931/src/main/java/gh931/Account.java create mode 100644 testapps/GH931/src/main/java/gh931/Order.java create mode 100644 testapps/GH931/src/main/resources/test/fixtures/fixture.yml create mode 100644 testapps/GH931/src/main/resources/test/scenarios/test.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index c5555458e..b382270a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.8** +* `java.lang.IllegalArgumentException` upon starting BSBF project #931 +* Hot reload is broken in R1.8.8 version #921 * CLI - do not output `null` for options without help message #927 * API doc - allow fault tolerant when generating sample data #920 * API doc - it shall support `@Sensitive` annotation #919 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 765db504d..8be7640f8 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -747,13 +747,12 @@ public void run() { }; if (!isDevColdStart()) { runnable1.run(); + } else { + jobManager.now("post_di_load_init", runnable1); } Runnable runnable2 = new Runnable() { @Override public void run() { - if (isDevColdStart()) { - runnable1.run(); - } if (null != blockIssueCause) { setBlockIssue(blockIssueCause); } diff --git a/testapps/GH931/src/main/java/gh931/Account.java b/testapps/GH931/src/main/java/gh931/Account.java new file mode 100644 index 000000000..b81e0c6f2 --- /dev/null +++ b/testapps/GH931/src/main/java/gh931/Account.java @@ -0,0 +1,18 @@ +package gh931; + +import act.db.morphia.MorphiaDao; +import act.db.morphia.MorphiaModel; +import org.mongodb.morphia.annotations.Entity; + +import javax.inject.Inject; + +@Entity +public class Account extends MorphiaModel { + + public String name; + + public static class Dao extends MorphiaDao { + @Inject + private MorphiaDao orderDao; + } +} diff --git a/testapps/GH931/src/main/java/gh931/Order.java b/testapps/GH931/src/main/java/gh931/Order.java new file mode 100644 index 000000000..66325e860 --- /dev/null +++ b/testapps/GH931/src/main/java/gh931/Order.java @@ -0,0 +1,32 @@ +package gh931; + +import act.controller.annotation.UrlContext; +import act.db.morphia.MorphiaDao; +import act.db.morphia.MorphiaModel; +import org.bson.types.ObjectId; +import org.mongodb.morphia.annotations.Entity; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; + +@Entity +public class Order extends MorphiaModel { + public ObjectId accountId; + public String product; + public int quantity; + + public Account getAccount() { + Account.Dao dao = Account.dao(); + return dao.findById(accountId); + } + + @UrlContext("/orders") + public static class Dao extends MorphiaDao { + @GetAction + public Iterable list() { + List orders = findAllAsList(); + return orders; + } + } + +} diff --git a/testapps/GH931/src/main/resources/test/fixtures/fixture.yml b/testapps/GH931/src/main/resources/test/fixtures/fixture.yml new file mode 100644 index 000000000..e9d8c72eb --- /dev/null +++ b/testapps/GH931/src/main/resources/test/fixtures/fixture.yml @@ -0,0 +1,7 @@ +gh931.Account(Tom): + name: tom + +gh931.Order(monitor): + product: monitor + quantity: 1 + accountId: ref:Tom diff --git a/testapps/GH931/src/main/resources/test/scenarios/test.yml b/testapps/GH931/src/main/resources/test/scenarios/test.yml new file mode 100644 index 000000000..ddb45af7a --- /dev/null +++ b/testapps/GH931/src/main/resources/test/scenarios/test.yml @@ -0,0 +1,16 @@ +Scenario(GH931): + fixtures: + - fixture.yml + description: "[931] `java.lang.IllegalArgumentException` upon starting BSBF project" + interactions: + - description: test + request: + get: /orders + response: + json: + size: 1 + 0: + product: monitor + quantity: 1 + account: + name: tom From a1f787e37745a15a85eaaf540a4d43d01ac954a7 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 4 Nov 2018 19:51:25 +1100 Subject: [PATCH 209/730] Allow app to customise error response upon invalid request #922 --- CHANGELOG.md | 3 +- pom.xml | 2 +- src/main/java/act/conf/AppConfig.java | 61 +- src/main/java/act/conf/AppConfigKey.java | 8 + .../handler/NoValidateViolationAdvice.java | 34 + .../act/handler/ValidateViolationAdvice.java | 30 + .../act/handler/ValidateViolationAdvisor.java | 34 + .../impl/ReflectedHandlerInvoker.java | 70 +- src/main/java/act/test/Interaction.java | 3 +- testapps/GH931/.gitignore | 19 + testapps/GH931/README.md | 3 + testapps/GH931/pom.xml | 30 + testapps/GH931/run_dev | 3 + testapps/GH931/run_dev.bat | 2 + testapps/GH931/run_e2e | 3 + testapps/GH931/run_e2e.bat | 2 + testapps/GH931/run_prod | 10 + .../GH931/src/main/java/gh931/AppEntry.java | 13 + .../src/main/resources/conf/app.properties | 800 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + testapps/GH931/src/main/resources/logback.xml | 115 +++ .../src/main/java/ghissues/Gh922.java | 49 ++ .../src/main/resources/conf/app.properties | 1 + .../src/main/resources/test/scenarios/784.yml | 2 +- .../src/main/resources/test/scenarios/786.yml | 2 +- .../src/main/resources/test/scenarios/790.yml | 2 +- .../src/main/resources/test/scenarios/796.yml | 2 +- .../src/main/resources/test/scenarios/797.yml | 2 +- .../src/main/resources/test/scenarios/798.yml | 2 +- .../src/main/resources/test/scenarios/809.yml | 2 +- .../src/main/resources/test/scenarios/819.yml | 2 +- .../src/main/resources/test/scenarios/820.yml | 2 +- .../src/main/resources/test/scenarios/821.yml | 2 +- .../src/main/resources/test/scenarios/823.yml | 2 +- .../src/main/resources/test/scenarios/829.yml | 2 +- .../src/main/resources/test/scenarios/835.yml | 2 +- .../src/main/resources/test/scenarios/841.yml | 2 +- .../src/main/resources/test/scenarios/844.yml | 2 +- .../src/main/resources/test/scenarios/852.yml | 2 +- .../src/main/resources/test/scenarios/857.yml | 2 +- .../src/main/resources/test/scenarios/860.yml | 2 +- .../src/main/resources/test/scenarios/862.yml | 2 +- .../src/main/resources/test/scenarios/866.yml | 2 +- .../src/main/resources/test/scenarios/869.yml | 2 +- .../src/main/resources/test/scenarios/870.yml | 2 +- .../src/main/resources/test/scenarios/871.yml | 2 +- .../src/main/resources/test/scenarios/878.yml | 2 +- .../src/main/resources/test/scenarios/887.yml | 2 +- .../src/main/resources/test/scenarios/905.yml | 2 +- .../src/main/resources/test/scenarios/906.yml | 2 +- .../src/main/resources/test/scenarios/907.yml | 2 +- .../src/main/resources/test/scenarios/908.yml | 2 +- .../src/main/resources/test/scenarios/911.yml | 2 +- .../src/main/resources/test/scenarios/922.yml | 20 + .../src/main/resources/test/scenarios/925.yml | 2 +- .../src/main/resources/test/scenarios/928.yml | 2 +- 57 files changed, 1329 insertions(+), 60 deletions(-) create mode 100644 src/main/java/act/handler/NoValidateViolationAdvice.java create mode 100644 src/main/java/act/handler/ValidateViolationAdvice.java create mode 100644 src/main/java/act/handler/ValidateViolationAdvisor.java create mode 100644 testapps/GH931/.gitignore create mode 100644 testapps/GH931/README.md create mode 100644 testapps/GH931/pom.xml create mode 100755 testapps/GH931/run_dev create mode 100755 testapps/GH931/run_dev.bat create mode 100755 testapps/GH931/run_e2e create mode 100755 testapps/GH931/run_e2e.bat create mode 100755 testapps/GH931/run_prod create mode 100644 testapps/GH931/src/main/java/gh931/AppEntry.java create mode 100644 testapps/GH931/src/main/resources/conf/app.properties create mode 100644 testapps/GH931/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH931/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH931/src/main/resources/logback.xml create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh922.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/922.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index b382270a7..6d56d4f92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log -**1.8.8** +**1.8.9** +* Allow app to customise error response upon invalid request #922 * `java.lang.IllegalArgumentException` upon starting BSBF project #931 * Hot reload is broken in R1.8.8 version #921 * CLI - do not output `null` for options without help message #927 diff --git a/pom.xml b/pom.xml index b2444b166..896583144 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ 1 1.5.0-b01 0.0.8 - 2.14.3 + 2.14.4 1.0.0.Final 2.9.9 1.11.3 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 772128f15..38fcb730a 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -36,8 +36,7 @@ import act.data.DateTimeType; import act.db.util.SequenceNumberGenerator; import act.db.util._SequenceNumberGenerator; -import act.handler.ReturnValueAdvice; -import act.handler.UnknownHttpMethodProcessor; +import act.handler.*; import act.handler.event.ResultEvent; import act.i18n.I18n; import act.internal.util.StrBufRetentionLimitCalculator; @@ -1104,27 +1103,65 @@ private void _mergeXForwardedProtocol(AppConfig conf) { protected T globalReturnValueAdvice(ReturnValueAdvice advice) { this.globalReturnValueAdvice = $.requireNotNull(advice); + this.globalReturnValueAdviceSet = true; return me(); } public ReturnValueAdvice globalReturnValueAdvice() { - if (null != globalReturnValueAdvice) { + if (null != globalReturnValueAdviceSet) { return globalReturnValueAdvice; } - if (null == globalReturnValueAdviceSet) { - globalReturnValueAdviceSet = true; - String s = get(GLOBAL_RETURN_VALUE_ADVICE, null); - if (null != s) { - try { - globalReturnValueAdvice = app.getInstance(s); - } catch (Exception e) { - throw new ConfigurationException("Error loading global returnValueAdvice: " + s); - } + String s = get(GLOBAL_RETURN_VALUE_ADVICE, null); + if (null != s) { + try { + globalReturnValueAdvice = app.getInstance(s); + } catch (Exception e) { + throw new ConfigurationException("Error loading global returnValueAdvice: " + s); } } + globalReturnValueAdviceSet = true; return globalReturnValueAdvice; } + private void _mergeGlobalReturnValueAdvice(AppConfig conf) { + if (!hasConfiguration(GLOBAL_RETURN_VALUE_ADVICE)) { + globalReturnValueAdvice = conf.globalReturnValueAdvice; + globalReturnValueAdviceSet = conf.globalReturnValueAdviceSet; + } + } + + private ValidateViolationAdvice globalValidateViolationAdvice; + private Boolean globalValidateViolationAdviceSet; + + protected T globalValidateViolationAdvice(ValidateViolationAdvice advice) { + this.globalValidateViolationAdvice = $.requireNotNull(advice); + this.globalValidateViolationAdviceSet = true; + return me(); + } + + public ValidateViolationAdvice globalValidateViolationAdvice() { + if (null != globalValidateViolationAdviceSet) { + return globalValidateViolationAdvice; + } + String s = get(GLOBAL_VALIDATE_VIOLATION_ADVICE, null); + if (null != s) { + try { + globalValidateViolationAdvice = app.getInstance(s); + } catch (Exception e) { + throw new ConfigurationException("Error loading global returnValueAdvice: " + s); + } + } + globalValidateViolationAdviceSet = true; + return globalValidateViolationAdvice; + } + + private void _mergeGlobalValidateViolationAdvice(AppConfig conf) { + if (!hasConfiguration(GLOBAL_VALIDATE_VIOLATION_ADVICE)) { + globalValidateViolationAdvice = conf.globalValidateViolationAdvice; + globalValidateViolationAdviceSet = conf.globalValidateViolationAdviceSet; + } + } + private Boolean contentSuffixAware = null; diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index c34f0c023..ca1103622 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -472,6 +472,14 @@ public enum AppConfigKey implements ConfigKey { */ GLOBAL_RETURN_VALUE_ADVICE("globalReturnValueAdvice"), + /** + * `globalValidateViolationAdvice` specifies the global {@link act.handler.ValidateViolationAdvice} + * type. + * + * Default value: null + */ + GLOBAL_VALIDATE_VIOLATION_ADVICE("globalValidateViolateAdvice"), + /** * `act.handler.csrf_check_failure.impl` specifies the implementation * for {@link act.util.MissingAuthenticationHandler} diff --git a/src/main/java/act/handler/NoValidateViolationAdvice.java b/src/main/java/act/handler/NoValidateViolationAdvice.java new file mode 100644 index 000000000..d6c89b319 --- /dev/null +++ b/src/main/java/act/handler/NoValidateViolationAdvice.java @@ -0,0 +1,34 @@ +package act.handler; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Mark a controller class or request handler method to make + * it suppress the application of + * {@link act.conf.AppConfigKey#GLOBAL_VALIDATE_VIOLATION_ADVICE globalValidateViolationAdvice} + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE}) +@Inherited +public @interface NoValidateViolationAdvice { +} diff --git a/src/main/java/act/handler/ValidateViolationAdvice.java b/src/main/java/act/handler/ValidateViolationAdvice.java new file mode 100644 index 000000000..a9fb38396 --- /dev/null +++ b/src/main/java/act/handler/ValidateViolationAdvice.java @@ -0,0 +1,30 @@ +package act.handler; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.ActionContext; + +import java.util.Map; +import javax.validation.ConstraintViolation; + +public interface ValidateViolationAdvice { + Object onValidateViolation(Map violations, ActionContext context); +} diff --git a/src/main/java/act/handler/ValidateViolationAdvisor.java b/src/main/java/act/handler/ValidateViolationAdvisor.java new file mode 100644 index 000000000..8c64d9d31 --- /dev/null +++ b/src/main/java/act/handler/ValidateViolationAdvisor.java @@ -0,0 +1,34 @@ +package act.handler; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Mark a controller class or request handle method is subject to + * the application of a {@link ValidateViolationAdvice}. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE}) +@Inherited +public @interface ValidateViolationAdvisor { + Class value(); +} diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 8a2908765..14336dbfc 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -70,6 +70,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import javax.enterprise.context.ApplicationScoped; +import javax.validation.ConstraintViolation; /** * Implement handler using @@ -153,6 +154,8 @@ public void visit(H.Format format) throws $.Break { private ReturnValueAdvice returnValueAdvice; // see https://github.com/actframework/actframework/issues/852 private boolean returnIterable; + // see https://github.com/actframework/actframework/issues/922 + private ValidateViolationAdvice validateViolationAdvice; private boolean returnSimpleType; private boolean returnIterableComponentIsSimpleType; private boolean shallTransformReturnVal; @@ -234,11 +237,18 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { ReturnValueAdvisor advisor = getAnnotation(ReturnValueAdvisor.class); if (null != advisor) { returnValueAdvice = app.getInstance(advisor.value()); - } else if (null == controllerClass.getAnnotation(NoReturnValueAdvice.class)) { + } else if (null == getAnnotation(NoReturnValueAdvice.class)) { returnValueAdvice = app.config().globalReturnValueAdvice(); } } + ValidateViolationAdvisor vAdvisor = getAnnotation(ValidateViolationAdvisor.class); + if (null != vAdvisor) { + validateViolationAdvice = app.getInstance(vAdvisor.value()); + } else if (null == getAnnotation(NoValidateViolationAdvice.class)) { + validateViolationAdvice = app.config().globalValidateViolationAdvice(); + } + if (method.isAnnotationPresent(RequireCaptcha.class)) { this.requireCaptcha = true; } @@ -562,21 +572,57 @@ public Result handle(final ActionContext context) { } final Object controller = controllerInstance(context); - /* - * We will send back response immediately when param validation - * failed in either of the following cases: - * 1) this is an ajax call - * 2) the accept content type is **NOT** html - */ - boolean failOnViolation = context.isAjax() || context.accept() != H.Format.HTML; - final Object[] params = params(controller, context); context.ensureCaptcha(); - if (failOnViolation && context.hasViolation()) { - String msg = context.violationMessage(";"); - return ActBadRequest.create(msg); + Map violations = context.violations(); + if (!violations.isEmpty()) { + + if (null != validateViolationAdvice) { + Result r = null; + try { + Object retVal = validateViolationAdvice.onValidateViolation(violations, context); + if (null != retVal) { + if (retVal instanceof Result) { + r = (Result) retVal; + } else { + String payload; + H.Format accept = context.accept(); + boolean requireXML = accept == H.Format.XML; + JSONObject json = $.deepCopy(retVal).to(JSONObject.class); + if (requireXML) { + Document doc = $.convert(json).to(Document.class); + payload = XML.toString(doc); + r = new RenderXML(payload); + } else { + payload = JSON.toJSONString(json); + context.resp().contentType(H.Format.JSON); + r = new RenderJSON(payload); + } + r.status(H.Status.BAD_REQUEST); + } + } + } catch (Result e) { + r = e; + } + if (null != r) { + return r; + } + } + + /* + * We will send back response immediately when param validation + * failed in either of the following cases: + * 1) this is an ajax call + * 2) the accept content type is **NOT** html + */ + boolean failOnViolation = context.isAjax() || context.accept() != H.Format.HTML; + + if (failOnViolation) { + String msg = context.violationMessage(";"); + return ActBadRequest.create(msg); + } } if (async) { diff --git a/src/main/java/act/test/Interaction.java b/src/main/java/act/test/Interaction.java index 3f2312468..088831a83 100644 --- a/src/main/java/act/test/Interaction.java +++ b/src/main/java/act/test/Interaction.java @@ -35,7 +35,7 @@ public class Interaction implements ScenarioPart { public List preActions = new ArrayList<>(); - public String description; + public String description = "test interaction"; public RequestSpec request; public ResponseSpec response; public List postActions = new ArrayList<>(); @@ -46,7 +46,6 @@ public class Interaction implements ScenarioPart { @Override public void validate(Scenario scenario) throws UnexpectedException { - E.unexpectedIf(S.blank(description), "no description in the interaction of [%s]", scenario); E.unexpectedIf(null == request, "request spec not specified in interaction[%s]", this); //E.unexpectedIf(null == response, "response spec not specified"); scenario.resolveRequest(request); diff --git a/testapps/GH931/.gitignore b/testapps/GH931/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH931/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH931/README.md b/testapps/GH931/README.md new file mode 100644 index 000000000..f08d500c3 --- /dev/null +++ b/testapps/GH931/README.md @@ -0,0 +1,3 @@ +# GH931 `java.lang.IllegalArgumentException` upon starting BSBF project + +Start the app and check if there are `java.lang.IllegalArgumentException: Cannot infer type parameter implementation on act.db.morphia.MorphiaDao against act.db.DaoBase` exception \ No newline at end of file diff --git a/testapps/GH931/pom.xml b/testapps/GH931/pom.xml new file mode 100644 index 000000000..64149978f --- /dev/null +++ b/testapps/GH931/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + act_issues + gh931 + 1.0-SNAPSHOT + + + org.actframework + act-starter-parent + 1.8.8.9-SNAPSHOT + + + + + 1.8 + gh931.AppEntry + + + + + org.actframework + act-morphia + + + + diff --git a/testapps/GH931/run_dev b/testapps/GH931/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH931/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH931/run_dev.bat b/testapps/GH931/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH931/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH931/run_e2e b/testapps/GH931/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH931/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH931/run_e2e.bat b/testapps/GH931/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH931/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH931/run_prod b/testapps/GH931/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH931/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH931/src/main/java/gh931/AppEntry.java b/testapps/GH931/src/main/java/gh931/AppEntry.java new file mode 100644 index 000000000..23246ddc5 --- /dev/null +++ b/testapps/GH931/src/main/java/gh931/AppEntry.java @@ -0,0 +1,13 @@ +package gh931; + +import act.Act; +import act.cli.Command; +import act.cli.Optional; +import act.inject.DefaultValue; + +public class AppEntry { + + public static void main(String[] args) throws Exception { + Act.start(); + } +} diff --git a/testapps/GH931/src/main/resources/conf/app.properties b/testapps/GH931/src/main/resources/conf/app.properties new file mode 100644 index 000000000..d4e2a8ec0 --- /dev/null +++ b/testapps/GH931/src/main/resources/conf/app.properties @@ -0,0 +1,800 @@ +############################################## +# Application configuration +# act-1.8.8-RC11 +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy\u5E74MM\u6708dd\u65E5 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy\u5E74MM\u6708dd\u65E5 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=r2WMft6bZHxUCwiUf5gVRsXJ3iQuB2zSzKZosG3eX98iZNpR1fFfpFlRhjoSQMjm + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH931/src/main/resources/conf/prod/app.properties b/testapps/GH931/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..0798e5539 --- /dev/null +++ b/testapps/GH931/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC11 +############################################## +act.secret=xPBOinitJYM7dli8k1Ji93ERQ1DUzebQrrynkrUwH0U5FzCT2mZGZXhte51tj8Xq \ No newline at end of file diff --git a/testapps/GH931/src/main/resources/conf/uat/app.properties b/testapps/GH931/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..b00fbc901 --- /dev/null +++ b/testapps/GH931/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC11 +############################################## +act.secret=mPFALnfidBVV73tqkcImPCnopmaLpcCcktkCYyb02qusdTQvmP9o6bF6S1WYRFNp \ No newline at end of file diff --git a/testapps/GH931/src/main/resources/logback.xml b/testapps/GH931/src/main/resources/logback.xml new file mode 100644 index 000000000..81946c4bc --- /dev/null +++ b/testapps/GH931/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh922.java b/testapps/GHIssues/src/main/java/ghissues/Gh922.java new file mode 100644 index 000000000..eabf97338 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh922.java @@ -0,0 +1,49 @@ +package ghissues; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import act.handler.ValidateViolationAdvice; +import act.handler.ValidateViolationAdvisor; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.result.RenderJSON; +import org.osgl.util.C; + +import java.util.Map; +import javax.validation.ConstraintViolation; +import javax.validation.constraints.Max; +import javax.validation.constraints.NotNull; + +@UrlContext("922") +public class Gh922 { + + public static class GenkoAdvice implements ValidateViolationAdvice { + @Override + public Object onValidateViolation(Map violations, ActionContext context) { + throw new RenderJSON(violations); + } + } + + public static class GlobalAdvice implements ValidateViolationAdvice { + @Override + public Object onValidateViolation(Map violations, ActionContext context) { + JSONObject json = new JSONObject(); + json.put("code", 1); + json.put("msg", "xxx"); + json.put("count", 180); + json.put("data", C.Map("item", new int[]{1, 2, 3})); + return json; + } + } + + + @GetAction("global") + public void global(@NotNull String x, @Max(100) int n) { + } + + @GetAction("specific") + @ValidateViolationAdvisor(GenkoAdvice.class) + public void specific(@NotNull String x, @Max(100) int n) { + } + +} diff --git a/testapps/GHIssues/src/main/resources/conf/app.properties b/testapps/GHIssues/src/main/resources/conf/app.properties index babc5fc93..47a3cf402 100644 --- a/testapps/GHIssues/src/main/resources/conf/app.properties +++ b/testapps/GHIssues/src/main/resources/conf/app.properties @@ -1,5 +1,6 @@ api_doc=false globalReturnValueAdvice=ghissues.Gh835$GlobalAdvice +globalValidateViolateAdvice=ghissues.Gh922$GlobalAdvice ############################################## # Application configuration # act-1.8.8-RC12-SNAPSHOT diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/784.yml b/testapps/GHIssues/src/main/resources/test/scenarios/784.yml index aa932905f..03ddc8388 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/784.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/784.yml @@ -1,4 +1,4 @@ -Scenario(GH784): +Scenario(784): description: "[784] `@Data` enhancement error when Model class has no fields" interactions: - description: test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/786.yml b/testapps/GHIssues/src/main/resources/test/scenarios/786.yml index ae2d1a2d9..42c128484 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/786.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/786.yml @@ -1,4 +1,4 @@ -Scenario(GH786): +Scenario(786): description: "[786] `@Data` enhancement shall call super by default for Map/AdaptiveMap types" interactions: - description: test case A - app shall specify call super diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/790.yml b/testapps/GHIssues/src/main/resources/test/scenarios/790.yml index 61b34eb43..6d18707ef 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/790.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/790.yml @@ -1,4 +1,4 @@ -Scenario(GH790): +Scenario(790): description: "[790] Resource loader - allow loading from excel file" interactions: - description: retreive all students diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/796.yml b/testapps/GHIssues/src/main/resources/test/scenarios/796.yml index 5934cb2a2..d1e6dd8d7 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/796.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/796.yml @@ -1,4 +1,4 @@ -Scenario(GH796): +Scenario(796): description: "[796] `@PropertySpec` annotation now cause `NullPointerException` on JSON output" interactions: - description: Test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/797.yml b/testapps/GHIssues/src/main/resources/test/scenarios/797.yml index 6b41cc623..60a32d7e3 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/797.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/797.yml @@ -1,4 +1,4 @@ -Scenario(GH797): +Scenario(797): description: "[797] JSON output: default format for `java.util.Date` missing time part" interactions: - description: Test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/798.yml b/testapps/GHIssues/src/main/resources/test/scenarios/798.yml index d961cf0e2..a4841b5c3 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/798.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/798.yml @@ -1,4 +1,4 @@ -Scenario(GH798): +Scenario(798): description: "[798] `@JSONField(format = 'yyyy-MM')` setting not work" interactions: - description: Test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/809.yml b/testapps/GHIssues/src/main/resources/test/scenarios/809.yml index 27bb9d606..94145c817 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/809.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/809.yml @@ -1,4 +1,4 @@ -Scenario(GH809): +Scenario(809): description: "[809] Bytecode enhanement error on App start" interactions: - description: Test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/819.yml b/testapps/GHIssues/src/main/resources/test/scenarios/819.yml index 580c5c226..16ca4cc8f 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/819.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/819.yml @@ -1,4 +1,4 @@ -Scenario(GH819): +Scenario(819): description: "[819] Extended request handler method's param not enhanced with `@Named` annotation" interactions: - description: Test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/820.yml b/testapps/GHIssues/src/main/resources/test/scenarios/820.yml index 527d4c1d2..8bb3411e3 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/820.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/820.yml @@ -1,4 +1,4 @@ -Scenario(GH820): +Scenario(820): description: "[820] Using generic typed injection in Controller cause `UnexpectedException`" interactions: - description: Test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/821.yml b/testapps/GHIssues/src/main/resources/test/scenarios/821.yml index 9ab2084b1..4ee553168 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/821.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/821.yml @@ -1,4 +1,4 @@ -Scenario(GH821): +Scenario(821): description: "[821] When returning String is not a valid JSON, it shall be encapsulated with `result`" interactions: - description: Get invalid JSON diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/823.yml b/testapps/GHIssues/src/main/resources/test/scenarios/823.yml index 6d5fd66ea..6f7e875bc 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/823.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/823.yml @@ -1,4 +1,4 @@ -Scenario(GH823): +Scenario(823): description: "[823] Apply new scope for implicit transaction" interactions: - description: Create an new User diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/829.yml b/testapps/GHIssues/src/main/resources/test/scenarios/829.yml index 4ae2f063d..d52930190 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/829.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/829.yml @@ -1,4 +1,4 @@ -Scenario(GH829): +Scenario(829): description: "[829] Allow app developer to specify download file name" interactions: - description: test static filename setting by `@DownloadFilename` annotation diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/835.yml b/testapps/GHIssues/src/main/resources/test/scenarios/835.yml index 48e39ccba..1f85d7c2b 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/835.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/835.yml @@ -1,4 +1,4 @@ -Scenario(GH835): +Scenario(835): description: "[835] Provide a mechanism to allow developer advice on return value of request handler method" interactions: - description: test specified advice diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/841.yml b/testapps/GHIssues/src/main/resources/test/scenarios/841.yml index c0cfaa846..a32c0101d 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/841.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/841.yml @@ -1,4 +1,4 @@ -Scenario(GH841): +Scenario(841): description: "[841] FastJson exception when serialize ACT error message" interactions: - description: test normal return diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/844.yml b/testapps/GHIssues/src/main/resources/test/scenarios/844.yml index b8007d6a3..7258d860c 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/844.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/844.yml @@ -1,4 +1,4 @@ -Scenario(GH844): +Scenario(844): description: "[844] Create an annotation to help specify head mapping for `@LoadResource` mechanism" interactions: - description: test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/852.yml b/testapps/GHIssues/src/main/resources/test/scenarios/852.yml index 11963ad19..3a4e6e063 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/852.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/852.yml @@ -1,4 +1,4 @@ -Scenario(GH852): +Scenario(852): description: "[852] @PropertySpec not take effect" interactions: - description: test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/857.yml b/testapps/GHIssues/src/main/resources/test/scenarios/857.yml index 54763651e..646dafd80 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/857.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/857.yml @@ -1,4 +1,4 @@ -Scenario(GH857): +Scenario(857): description: "[857] Provide a way to allow app to specify order of elements in the injected collection" interactions: - description: test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/860.yml b/testapps/GHIssues/src/main/resources/test/scenarios/860.yml index 99e44648a..2aba7b3db 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/860.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/860.yml @@ -1,4 +1,4 @@ -Scenario(GH860): +Scenario(860): description: "[860] test resource not refreshed after hot-reload" interactions: - description: Test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/862.yml b/testapps/GHIssues/src/main/resources/test/scenarios/862.yml index 071f00eb6..ce435655f 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/862.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/862.yml @@ -1,4 +1,4 @@ -Scenario(GH862): +Scenario(862): constants: newFooName: ${randStr} description: "[862] Support using `SessionVariable` annotation and `DbBind` together" diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/866.yml b/testapps/GHIssues/src/main/resources/test/scenarios/866.yml index 954203fca..67e657e4d 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/866.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/866.yml @@ -1,4 +1,4 @@ -Scenario(GH866): +Scenario(866): description: "[866] `PropertySpec` specification not working when return value is a list" interactions: - description: test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/869.yml b/testapps/GHIssues/src/main/resources/test/scenarios/869.yml index e7e459794..f45282454 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/869.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/869.yml @@ -1,4 +1,4 @@ -Scenario(GH869): +Scenario(869): urlContext: /api/v1 description: "[869] Test - Allow app to define url context for scenario #869" interactions: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/870.yml b/testapps/GHIssues/src/main/resources/test/scenarios/870.yml index 4dc51324c..4b04b93a7 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/870.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/870.yml @@ -1,4 +1,4 @@ -Scenario(GH870): +Scenario(870): description: "[870] Act not return application/json as default when exception" interactions: - description: test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/871.yml b/testapps/GHIssues/src/main/resources/test/scenarios/871.yml index cd6908ff3..5028c0be9 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/871.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/871.yml @@ -1,4 +1,4 @@ -Scenario(GH871): +Scenario(871): description: "[871] Test: evaluation complex expression refer to cached object issue" interactions: - description: setup diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/878.yml b/testapps/GHIssues/src/main/resources/test/scenarios/878.yml index 93323ecc1..2b595d0d0 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/878.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/878.yml @@ -1,4 +1,4 @@ -Scenario(GH878): +Scenario(878): description: "[878] @PropertySpec could not effect entity in collection" interactions: - description: test list diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/887.yml b/testapps/GHIssues/src/main/resources/test/scenarios/887.yml index d77cee155..7068fcc74 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/887.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/887.yml @@ -1,4 +1,4 @@ -Scenario(GH887): +Scenario(887): description: "[887] Route table: support whitespace in URL path" interactions: - description: test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/905.yml b/testapps/GHIssues/src/main/resources/test/scenarios/905.yml index a0d22393f..3af8be287 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/905.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/905.yml @@ -1,4 +1,4 @@ -Scenario(GH905): +Scenario(905): description: "[905] Basic support for xml content-type" interactions: - description: Test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/906.yml b/testapps/GHIssues/src/main/resources/test/scenarios/906.yml index 516d4dc03..e34e90ef1 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/906.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/906.yml @@ -1,4 +1,4 @@ -Scenario(GH906): +Scenario(906): description: "[906] ReflectedHandlerInvoker - try to get Annotation from method in parent class if possible" interactions: - description: Test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/907.yml b/testapps/GHIssues/src/main/resources/test/scenarios/907.yml index 0f91f5bd5..a1afaba6a 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/907.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/907.yml @@ -1,4 +1,4 @@ -Scenario(GH907): +Scenario(907): description: "[907] Interceptor defined in super class now not effective on sub class" interactions: - description: Test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/908.yml b/testapps/GHIssues/src/main/resources/test/scenarios/908.yml index 09f706822..dd09d5b7f 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/908.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/908.yml @@ -1,4 +1,4 @@ -Scenario(GH908): +Scenario(908): description: "[908] Test - allow setting precision of ${now()} function" constants: startTs0: ${now()} # default: low precision diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/911.yml b/testapps/GHIssues/src/main/resources/test/scenarios/911.yml index e1ce27077..0b5b23d63 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/911.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/911.yml @@ -1,4 +1,4 @@ -Scenario(GH911): +Scenario(911): description: "[911] Test - enhance ${now()} function" interactions: - description: simple now diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/922.yml b/testapps/GHIssues/src/main/resources/test/scenarios/922.yml new file mode 100644 index 000000000..f735d59e0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/922.yml @@ -0,0 +1,20 @@ +Scenario(922): + description: "[922] Allow app to customise error response upon invalid request" + interactions: + - description: method specific violation advice + request: + get: 922/specific + response: + status: 200 + - description: global violation advice + request: + get: 922/global + response: + status: 400 + json: + code: 1 + msg: xxx + count: 180 + data: { + item: [1, 2, 3] + } \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/925.yml b/testapps/GHIssues/src/main/resources/test/scenarios/925.yml index 8ff8b6be2..cd4dcaa44 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/925.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/925.yml @@ -1,4 +1,4 @@ -Scenario(GH925): +Scenario(925): description: "[925] `Unable to find the overwritten method of Xxx` issue on 1.8.8" interactions: - description: test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/928.yml b/testapps/GHIssues/src/main/resources/test/scenarios/928.yml index cd1ae6713..c79b69098 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/928.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/928.yml @@ -1,4 +1,4 @@ -Scenario(GH928): +Scenario(928): fixtures: - 928.yml interactions: From 14d480908f3afd80ef6e1d57b95f5a7f994fb883 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 4 Nov 2018 21:09:56 +1100 Subject: [PATCH 210/730] CLI - support `@DefaultValue` #929 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 2 +- src/main/java/act/cli/CliContext.java | 15 +- .../act/inject/param/CliArgumentLoader.java | 10 +- .../inject/param/CliContextParamLoader.java | 8 +- .../inject/param/CliVarArgumentLoader.java | 2 +- .../java/act/inject/param/OptionLoader.java | 21 +- testapps/GH929/.gitignore | 19 + testapps/GH929/README.md | 2 + testapps/GH929/pom.xml | 26 + testapps/GH929/run_dev | 3 + testapps/GH929/run_dev.bat | 2 + testapps/GH929/run_e2e | 3 + testapps/GH929/run_e2e.bat | 2 + testapps/GH929/run_prod | 10 + .../GH929/src/main/java/gh929/AppEntry.java | 29 + .../src/main/resources/conf/app.properties | 800 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + testapps/GH929/src/main/resources/logback.xml | 115 +++ 20 files changed, 1063 insertions(+), 17 deletions(-) create mode 100644 testapps/GH929/.gitignore create mode 100644 testapps/GH929/README.md create mode 100644 testapps/GH929/pom.xml create mode 100755 testapps/GH929/run_dev create mode 100755 testapps/GH929/run_dev.bat create mode 100755 testapps/GH929/run_e2e create mode 100755 testapps/GH929/run_e2e.bat create mode 100755 testapps/GH929/run_prod create mode 100644 testapps/GH929/src/main/java/gh929/AppEntry.java create mode 100644 testapps/GH929/src/main/resources/conf/app.properties create mode 100644 testapps/GH929/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH929/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH929/src/main/resources/logback.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d56d4f92..06ea79035 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.9** +* CLI - support `@DefaultValue` #929 * Allow app to customise error response upon invalid request #922 * `java.lang.IllegalArgumentException` upon starting BSBF project #931 * Hot reload is broken in R1.8.8 version #921 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 8be7640f8..24130e4f6 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -777,7 +777,7 @@ public void run() { }; if (!dbServiceManager().hasDbService() || eventEmitted(DB_SVC_PROVISIONED)) { if (Act.isDev()) { - jobManager.now("App:postDbSvcLogic", runnable2); + jobManager.post(SINGLETON_PROVISIONED, "App:postDbSvcLogic", runnable2, true); } else { runnable2.run(); } diff --git a/src/main/java/act/cli/CliContext.java b/src/main/java/act/cli/CliContext.java index ab9b46371..01c4caf73 100644 --- a/src/main/java/act/cli/CliContext.java +++ b/src/main/java/act/cli/CliContext.java @@ -77,6 +77,8 @@ public AtomicInteger curArgId() { return curArgId; } + public Map argDefVals = new HashMap<>(); + public boolean hasArguments(CommandLineParser command) { return curArgId.get() < command.argumentCount(); } @@ -119,11 +121,12 @@ public void raiseExceptionIfThereAreMissingOptions(CliContext context) { public ParsingContext copy() { ParsingContext ctx = new ParsingContext(); ctx.optionArgumentsCnt = optionArgumentsCnt; - ctx.required = new HashMap(required); + ctx.required = new HashMap<>(required); for (Map.Entry entry : ctx.required.entrySet()) { entry.setValue(new AtomicInteger(0)); } ctx.curArgId = new AtomicInteger(0); + ctx.argDefVals.putAll(this.argDefVals); return ctx; } } @@ -133,7 +136,7 @@ public static class ParsingContextBuilder { public static void start() { ParsingContext ctx0 = new ParsingContext(); - ctx0.required = new HashMap(); + ctx0.required = new HashMap<>(); ctx.set(ctx0); } @@ -141,8 +144,12 @@ public static void foundOptional() { ctx.get().optionArgumentsCnt++; } - public static void foundArgument() { - ctx.get().optionArgumentsCnt++; + public static void foundArgument(String defVal) { + ParsingContext ctx0 = ctx.get(); + int n = ctx0.optionArgumentsCnt++; + if (S.notBlank(defVal)) { + ctx0.argDefVals.put(n, defVal) ; + } } public static void foundRequired(String group) { diff --git a/src/main/java/act/inject/param/CliArgumentLoader.java b/src/main/java/act/inject/param/CliArgumentLoader.java index 761113f16..161e02016 100644 --- a/src/main/java/act/inject/param/CliArgumentLoader.java +++ b/src/main/java/act/inject/param/CliArgumentLoader.java @@ -29,17 +29,21 @@ class CliArgumentLoader extends CliParamValueLoader { private final StringValueResolver resolver; - CliArgumentLoader(StringValueResolver resolver) { + CliArgumentLoader(StringValueResolver resolver, String defVal) { this.resolver = resolver; - CliContext.ParsingContextBuilder.foundArgument(); + CliContext.ParsingContextBuilder.foundArgument(defVal); } @Override public Object load(Object cached, ActContext context, boolean noDefaultValue) { CliContext ctx = (CliContext) context; - int id = ctx.parsingContext().curArgId().getAndIncrement(); + CliContext.ParsingContext ptx = ctx.parsingContext(); + int id = ptx.curArgId().getAndIncrement(); String optVal = ctx.commandLine().argument(id); Object val = null; + if (S.isBlank(optVal)) { + optVal = ptx.argDefVals.get(id); + } if (S.notBlank(optVal)) { val = resolver.resolve(optVal); } diff --git a/src/main/java/act/inject/param/CliContextParamLoader.java b/src/main/java/act/inject/param/CliContextParamLoader.java index c84905e93..337e91d2a 100644 --- a/src/main/java/act/inject/param/CliContextParamLoader.java +++ b/src/main/java/act/inject/param/CliContextParamLoader.java @@ -28,6 +28,7 @@ import act.cli.Required; import act.cli.meta.CommandMethodMetaInfo; import act.cli.util.CommandLineParser; +import act.inject.DefaultValue; import act.util.ActContext; import org.osgl.$; import org.osgl.exception.UnexpectedException; @@ -144,6 +145,11 @@ protected ParamValueLoader findContextSpecificLoader( BeanSpec spec ) { boolean isArray = spec.isArray(); + String defVal = null; + DefaultValue defaultValue = spec.getAnnotation(DefaultValue.class); + if (null != defaultValue) { + defVal = defaultValue.value(); + } StringValueResolver resolver = findResolver(spec, isArray); //= isArray ? resolverManager.resolver(rawType.getComponentType(), spec) : resolverManager.resolver(rawType, spec); Required required = spec.getAnnotation(Required.class); @@ -153,7 +159,7 @@ protected ParamValueLoader findContextSpecificLoader( } else if (null != optional) { return new OptionLoader(bindName, optional, resolver, spec); } - return isArray ? new CliVarArgumentLoader(spec.rawType().getComponentType(), resolver) : new CliArgumentLoader(resolver); + return isArray ? new CliVarArgumentLoader(spec.rawType().getComponentType(), resolver) : new CliArgumentLoader(resolver, defVal); } private StringValueResolver findResolver(BeanSpec spec, boolean isArray) { diff --git a/src/main/java/act/inject/param/CliVarArgumentLoader.java b/src/main/java/act/inject/param/CliVarArgumentLoader.java index 1d5ff8c96..9700ba090 100644 --- a/src/main/java/act/inject/param/CliVarArgumentLoader.java +++ b/src/main/java/act/inject/param/CliVarArgumentLoader.java @@ -37,7 +37,7 @@ class CliVarArgumentLoader extends CliParamValueLoader { CliVarArgumentLoader(Class componentType, StringValueResolver resolver) { this.componentType = componentType; this.resolver = resolver; - CliContext.ParsingContextBuilder.foundArgument(); + CliContext.ParsingContextBuilder.foundArgument(null); } @Override diff --git a/src/main/java/act/inject/param/OptionLoader.java b/src/main/java/act/inject/param/OptionLoader.java index 3a27185c8..95f5c109e 100644 --- a/src/main/java/act/inject/param/OptionLoader.java +++ b/src/main/java/act/inject/param/OptionLoader.java @@ -23,6 +23,7 @@ import act.cli.CliContext; import act.cli.Optional; import act.cli.Required; +import act.inject.DefaultValue; import act.util.ActContext; import org.osgl.inject.BeanSpec; import org.osgl.util.E; @@ -49,31 +50,42 @@ class OptionLoader extends CliParamValueLoader { this.bindName = bindName; this.required = false; this.parseLeads(optional.lead()); - this.defVal = optional.defVal(); + String defVal = optional.defVal(); this.requiredGroup = null; this.beanSpec = beanSpec; this.errorTemplate = errorTemplate(optional); this.resolver = resolver; CliContext.ParsingContextBuilder.foundOptional(); + if (S.blank(defVal)) { + DefaultValue defaultValue = beanSpec.getAnnotation(DefaultValue.class); + if (null != defaultValue) { + defVal = defaultValue.value(); + } + } + this.defVal = defVal; } OptionLoader(String bindName, Required required, StringValueResolver resolver, BeanSpec beanSpec) { this.bindName = bindName; this.required = true; this.parseLeads(required.lead()); - this.defVal = null; String group = required.group(); this.requiredGroup = S.blank(group) ? bindName : group; this.beanSpec = beanSpec; this.errorTemplate = errorTemplate(required); this.resolver = resolver; CliContext.ParsingContextBuilder.foundRequired(this.requiredGroup); + DefaultValue defaultValue = beanSpec.getAnnotation(DefaultValue.class); + this.defVal = null == defaultValue ? null : defaultValue.value(); } @Override public Object load(Object cachedBean, ActContext context, boolean noDefaultValue) { CliContext ctx = (CliContext) context; String optVal = ctx.paramVal(bindName); + if (S.blank(optVal)) { + optVal = this.defVal; + } if (S.blank(optVal) && required) { optVal = getFirstArgument(ctx); } @@ -84,11 +96,6 @@ public Object load(Object cachedBean, ActContext context, boolean noDefaultVa if (null == val && null != cachedBean) { val = cachedBean; } - if (null == val) { - if (!required) { - val = S.notBlank(defVal) ? resolve(defVal) : resolve(null); - } - } if (null != val && required) { ctx.parsingContext().foundRequired(requiredGroup); } diff --git a/testapps/GH929/.gitignore b/testapps/GH929/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH929/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH929/README.md b/testapps/GH929/README.md new file mode 100644 index 000000000..1996955c1 --- /dev/null +++ b/testapps/GH929/README.md @@ -0,0 +1,2 @@ +# GH929 CLI - support DefaultValue + diff --git a/testapps/GH929/pom.xml b/testapps/GH929/pom.xml new file mode 100644 index 000000000..d800aa283 --- /dev/null +++ b/testapps/GH929/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + act_issues + gh926 + 1.0-SNAPSHOT + + + org.actframework + act-starter-parent + 1.8.8.9-SNAPSHOT + + + + + 1.8 + gh926.AppEntry + + + + + + diff --git a/testapps/GH929/run_dev b/testapps/GH929/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH929/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH929/run_dev.bat b/testapps/GH929/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH929/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH929/run_e2e b/testapps/GH929/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH929/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH929/run_e2e.bat b/testapps/GH929/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH929/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH929/run_prod b/testapps/GH929/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH929/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH929/src/main/java/gh929/AppEntry.java b/testapps/GH929/src/main/java/gh929/AppEntry.java new file mode 100644 index 000000000..9ef18f692 --- /dev/null +++ b/testapps/GH929/src/main/java/gh929/AppEntry.java @@ -0,0 +1,29 @@ +package gh929; + +import act.Act; +import act.cli.Command; +import act.cli.Optional; +import act.cli.Required; +import act.inject.DefaultValue; + +public class AppEntry { + + @Command("h1") + public String style1(@Optional @DefaultValue("World") String who) { + return "Hello " + who; + } + + @Command("h2") + public String style2(@Required @DefaultValue("World") String who) { + return "Hello " + who; + } + + @Command("h3") + public String style3(@DefaultValue("World") String who) { + return "Hello " + who; + } + + public static void main(String[] args) throws Exception { + Act.start(); + } +} diff --git a/testapps/GH929/src/main/resources/conf/app.properties b/testapps/GH929/src/main/resources/conf/app.properties new file mode 100644 index 000000000..d4e2a8ec0 --- /dev/null +++ b/testapps/GH929/src/main/resources/conf/app.properties @@ -0,0 +1,800 @@ +############################################## +# Application configuration +# act-1.8.8-RC11 +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy\u5E74MM\u6708dd\u65E5 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy\u5E74MM\u6708dd\u65E5 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=r2WMft6bZHxUCwiUf5gVRsXJ3iQuB2zSzKZosG3eX98iZNpR1fFfpFlRhjoSQMjm + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH929/src/main/resources/conf/prod/app.properties b/testapps/GH929/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..0798e5539 --- /dev/null +++ b/testapps/GH929/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC11 +############################################## +act.secret=xPBOinitJYM7dli8k1Ji93ERQ1DUzebQrrynkrUwH0U5FzCT2mZGZXhte51tj8Xq \ No newline at end of file diff --git a/testapps/GH929/src/main/resources/conf/uat/app.properties b/testapps/GH929/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..b00fbc901 --- /dev/null +++ b/testapps/GH929/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC11 +############################################## +act.secret=mPFALnfidBVV73tqkcImPCnopmaLpcCcktkCYyb02qusdTQvmP9o6bF6S1WYRFNp \ No newline at end of file diff --git a/testapps/GH929/src/main/resources/logback.xml b/testapps/GH929/src/main/resources/logback.xml new file mode 100644 index 000000000..81946c4bc --- /dev/null +++ b/testapps/GH929/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7863902102ff25d0882868bc1139178b6bdf08c1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 4 Nov 2018 21:10:58 +1100 Subject: [PATCH 211/730] update CHANGELOG for jline update --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06ea79035..c8b87f681 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.9** +* update jline to 2.14.4 * CLI - support `@DefaultValue` #929 * Allow app to customise error response upon invalid request #922 * `java.lang.IllegalArgumentException` upon starting BSBF project #931 From 4e8aac8c3274136715b2b8f565841cd9e18bb6b2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 4 Nov 2018 21:19:37 +1100 Subject: [PATCH 212/730] update README and VERSION_MATRIX --- README.md | 10 +++++----- VERSION_MATRIX.md | 40 ++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index a15f705a7..dfbe91dd8 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.8.8 + 1.8.8.9 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.8.10 + -DarchetypeVersion=1.8.8.11 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.8.10 + -DarchetypeVersion=1.8.8.11 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.8.10 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.8.11 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.8.10 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.8.11 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 1b457fe74..964133be0 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,25 +1,25 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | -| --- | ----: | ----: | ----: | ----: | -| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | -| beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | -| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | -| ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.3 | -| ebean(java8) | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.3 | -| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | -| excel | 1.3.x | 1.4.x | 1.4.3 | 1.5.0 | -| freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.6 | -| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | -| jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.5 | -| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | -| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | -| mustache(java8) | 1.3.x | 1.4.0 | 1.4.2 | 1.4.5 | -| social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.5 | -| sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.3 | -| storage(java8) | 0.12.x | 0.13.0 | 0.13.2 | 0.13.5 | -| thymeleaf | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | -| velocity | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | +| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.9 | +| --- | ----: | ----: | ----: | ----: | ----: | +| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.2 | +| beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | 1.4.5 | +| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | 1.5.4 | +| ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.3 | 1.7.4 | +| ebean(java8) | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.3 | 1.7.4 | +| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | +| excel | 1.3.x | 1.4.x | 1.4.3 | 1.5.0 | 1.5.0 | +| freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.6 | 1.3.6 | +| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | +| jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.5 | 1.0.5 | +| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | +| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | 1.6.3 | +| mustache(java8) | 1.3.x | 1.4.0 | 1.4.2 | 1.4.5 | 1.4.5 | +| social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.5 | 0.12.5 | +| sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.3 | 1.4.4 | +| storage(java8) | 0.12.x | 0.13.0 | 0.13.2 | 0.13.5 | 0.13.5 | +| thymeleaf | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | +| velocity | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | ## Note From a4564fcd013201842d4654f6a21d242d630ff6f4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 4 Nov 2018 21:20:04 +1100 Subject: [PATCH 213/730] update CHANGELOG for release date of 1.8.9 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8b87f681..a0c3c6f76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.9** +**1.8.9** 4/Nov/2018 * update jline to 2.14.4 * CLI - support `@DefaultValue` #929 * Allow app to customise error response upon invalid request #922 From 29f9b9ba2f0cd4dac7f5c0a87ae50ee422f7b10a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 4 Nov 2018 21:44:24 +1100 Subject: [PATCH 214/730] [maven-release-plugin] prepare release act-1.8.9 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 896583144..51bd84057 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.9-SNAPSHOT + 1.8.9 ACT Framework The ACT full stack MVC framework From 5931e7349c077e4c42f20b85b8b2a87258af4802 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 4 Nov 2018 21:44:38 +1100 Subject: [PATCH 215/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 51bd84057..9973371fd 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.9 + 1.8.10-SNAPSHOT ACT Framework The ACT full stack MVC framework From 29cdbb23157845d8e5c713232ec8e44c8b1e73c6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 5 Nov 2018 06:43:21 +1100 Subject: [PATCH 216/730] Automate test failure #932; bump version to 1.8.11 --- CHANGELOG.md | 3 +++ legacy-testapp/pom.xml | 2 +- pom.xml | 2 +- src/main/java/act/app/App.java | 2 +- testapps/GHIssues/pom.xml | 5 +++++ 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0c3c6f76..fa7b84c97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # ActFramework Change Log +**1.8.11** 5/Nov/2018 +* Automate test failure #932 + **1.8.9** 4/Nov/2018 * update jline to 2.14.4 * CLI - support `@DefaultValue` #929 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 1db8e2fb0..6c6c0c251 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.9-SNAPSHOT + 1.8.11-SNAPSHOT [0.13.0, 2.0.0) 1.6.2 testapp.TestApp diff --git a/pom.xml b/pom.xml index 9973371fd..56bfc31f9 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.10-SNAPSHOT + 1.8.11-SNAPSHOT ACT Framework The ACT full stack MVC framework diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 24130e4f6..1a80c345e 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -739,10 +739,10 @@ public void run() { // because once app event is consumed the event listeners // are cleared emit(DEPENDENCY_INJECTOR_PROVISIONED); - emit(SINGLETON_PROVISIONED); registerMetricProvider(); config().preloadConfigurations(); initSessionManager(); + emit(SINGLETON_PROVISIONED); } }; if (!isDevColdStart()) { diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 00d6d6bd1..2e1780f88 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -36,6 +36,11 @@ hutool-all 4.1.11 + + org.actframework + act + 1.8.11-SNAPSHOT + From de4db0fba00628fa11095c1639c5e6d652a4bb57 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 5 Nov 2018 06:53:00 +1100 Subject: [PATCH 217/730] update dependency versions --- CHANGELOG.md | 6 ++++++ pom.xml | 10 +++++----- testapps/ResourceLoaderTest/pom.xml | 5 +++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa7b84c97..889c45a15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ **1.8.11** 5/Nov/2018 * Automate test failure #932 +* update dependencies + - undertow-core: 1.4.26.Final + - snakeyaml: 1.23 + - reflectasm: 1.11.7 + - joda-time: 2.10.1 + - jline: 2.14.6 **1.8.9** 4/Nov/2018 * update jline to 2.14.4 diff --git a/pom.xml b/pom.xml index 56bfc31f9..8e7433bfb 100644 --- a/pom.xml +++ b/pom.xml @@ -58,9 +58,9 @@ 1 1.5.0-b01 0.0.8 - 2.14.4 + 2.14.6 1.0.0.Final - 2.9.9 + 2.10.1 1.11.3 3.10.0 1.18.0 @@ -71,11 +71,11 @@ 1.8.0 1.3.0 0.0.1 - 1.11.3 + 1.11.7 1.3.0 1.1.0.Final - 1.4.25.Final - 1.21 + 1.4.26.Final + 1.23 3.3.2 diff --git a/testapps/ResourceLoaderTest/pom.xml b/testapps/ResourceLoaderTest/pom.xml index 797ecee95..ce715dcff 100644 --- a/testapps/ResourceLoaderTest/pom.xml +++ b/testapps/ResourceLoaderTest/pom.xml @@ -27,6 +27,11 @@ org.actframework act-excel + + org.actframework + act + 1.8.11-SNAPSHOT + From ff522af9243e2186a9a6b3e39579682fd2adea4a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 5 Nov 2018 06:54:21 +1100 Subject: [PATCH 218/730] [maven-release-plugin] prepare release act-1.8.11 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8e7433bfb..7467e0865 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.11-SNAPSHOT + 1.8.11 ACT Framework The ACT full stack MVC framework From 18f61d8afdbf7d94efc507ef055257733ba3f9f5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 5 Nov 2018 06:54:36 +1100 Subject: [PATCH 219/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7467e0865..9426d1f99 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.11 + 1.8.12-SNAPSHOT ACT Framework The ACT full stack MVC framework From c9d018d58738e909e12a48417138fd93a31da756 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 5 Nov 2018 07:40:22 +1100 Subject: [PATCH 220/730] update readme and version matrix for 1.8.11 --- README.md | 10 +++++----- VERSION_MATRIX.md | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index dfbe91dd8..c244dfbc7 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.8.9 + 1.8.11.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.8.11 + -DarchetypeVersion=1.8.11.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.8.11 + -DarchetypeVersion=1.8.11.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.8.11 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.11.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.8.11 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.11.0 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 964133be0..926b55170 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,6 +1,6 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.9 | +| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.11 | | --- | ----: | ----: | ----: | ----: | ----: | | aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.2 | | beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | 1.4.5 | From 599550b47ce35de6ce34c0131c20c10787140f02 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 6 Nov 2018 20:27:04 +1100 Subject: [PATCH 221/730] Hot-reload issue caused by `StackOverflowError` on `AppConfig.loginUrl()` #936; --- CHANGELOG.md | 3 +++ src/main/java/act/conf/AppConfig.java | 12 ++++++++---- src/main/java/act/xio/NetworkHandler.java | 3 +++ testapps/GHIssues/pom.xml | 2 +- testapps/GHIssues/src/main/resources/asset/menu.svg | 1 + 5 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 testapps/GHIssues/src/main/resources/asset/menu.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 889c45a15..85ce8a7b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # ActFramework Change Log +**1.8.12** +* Hot-reload issue caused by `StackOverflowError` on `AppConfig.loginUrl()` #936 + **1.8.11** 5/Nov/2018 * Automate test failure #932 * update dependencies diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 38fcb730a..bf806c623 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -1562,13 +1562,17 @@ protected T loginUrl(String url) { } public String loginUrl() { - if (null == loginUrl) { - loginUrl = get(URL_LOGIN, "/login"); - } ActionContext context = ActionContext.current(); if (null != context && context.isAjax()) { return ajaxLoginUrl(); } + return loginUrl0(); + } + + private String loginUrl0() { + if (null == loginUrl) { + loginUrl = get(URL_LOGIN, "/login"); + } return loginUrl; } @@ -1588,7 +1592,7 @@ protected T ajaxLoginUrl(String url) { public String ajaxLoginUrl() { if (null == ajaxLoginUrl) { - ajaxLoginUrl = get(URL_LOGIN_AJAX, loginUrl()); + ajaxLoginUrl = get(URL_LOGIN_AJAX, loginUrl0()); } return ajaxLoginUrl; } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 616136c68..3bb9c2f76 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -190,6 +190,9 @@ public void run() { } } catch (Exception e) { handleException(e, ctx, "Error handling network request"); + } catch (Throwable t) { + fatal(t, "Fatal Error Found"); + Act.shutdown(app); } finally { if (!skipEvents) { eventBus.emit(new PostHandle(ctx)); diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 2e1780f88..f7c7c96ad 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.8.9-SNAPSHOT + 1.8.11.0 diff --git a/testapps/GHIssues/src/main/resources/asset/menu.svg b/testapps/GHIssues/src/main/resources/asset/menu.svg new file mode 100644 index 000000000..6755934ec --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file From 9a6b33b07eb498c109a93388e62482c05ed9b2fd Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 6 Nov 2018 20:59:55 +1100 Subject: [PATCH 222/730] Missing `Content-Type` header in response servicing static file request #937 --- CHANGELOG.md | 1 + src/main/java/act/ActResponse.java | 3 ++- src/main/java/act/handler/builtin/ResourceGetter.java | 3 ++- testapps/GHIssues/pom.xml | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85ce8a7b2..8a3977608 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* Missing `Content-Type` header in response servicing static file request #937 * Hot-reload issue caused by `StackOverflowError` on `AppConfig.loginUrl()` #936 **1.8.11** 5/Nov/2018 diff --git a/src/main/java/act/ActResponse.java b/src/main/java/act/ActResponse.java index 055d9d3be..6e2073e22 100644 --- a/src/main/java/act/ActResponse.java +++ b/src/main/java/act/ActResponse.java @@ -112,8 +112,9 @@ public void onResult() { this.onResult = true; } - public void commitContentType() { + public T commitContentType() { header(H.Header.Names.CONTENT_TYPE, _getContentType()); + return me(); } @Override diff --git a/src/main/java/act/handler/builtin/ResourceGetter.java b/src/main/java/act/handler/builtin/ResourceGetter.java index d3162759e..bf6730e72 100644 --- a/src/main/java/act/handler/builtin/ResourceGetter.java +++ b/src/main/java/act/handler/builtin/ResourceGetter.java @@ -189,6 +189,7 @@ protected void handle(String path, ActionContext context) { if (null != buffer) { context.resp() .contentType(cachedContentType.get(path)) + .commitContentType() .header(CACHE_CONTROL, "public, max-age=7200") .etag(etags.get(path)) .writeContent(buffer.duplicate()); @@ -234,7 +235,7 @@ protected void handle(String path, ActionContext context) { } else { contentType = FileGetter.contentType(target.getPath()); } - resp.contentType(contentType); + resp.contentType(contentType).commitContentType(); if (isProd) { resp.header(CACHE_CONTROL, "max-age=86400"); String etag = etags.get(path); diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index f7c7c96ad..4df2ce7d6 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -39,7 +39,7 @@ org.actframework act - 1.8.11-SNAPSHOT + 1.8.12-SNAPSHOT From 54d13bae38c43156f847482f752a774488ef0ff1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 7 Nov 2018 07:15:49 +1100 Subject: [PATCH 223/730] add testcase for GH935 --- CHANGELOG.md | 1 + testapps/GH935/.gitignore | 19 + testapps/GH935/README.md | 61 ++ testapps/GH935/pom.xml | 26 + testapps/GH935/run_dev | 3 + testapps/GH935/run_dev.bat | 2 + testapps/GH935/run_e2e | 3 + testapps/GH935/run_e2e.bat | 2 + testapps/GH935/run_prod | 10 + .../GH935/src/main/java/gh935/AppEntry.java | 33 + .../src/main/resources/conf/app.properties | 800 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + testapps/GH935/src/main/resources/logback.xml | 115 +++ .../src/main/resources/test/scenarios.yml | 13 + 15 files changed, 1098 insertions(+) create mode 100644 testapps/GH935/.gitignore create mode 100644 testapps/GH935/README.md create mode 100644 testapps/GH935/pom.xml create mode 100755 testapps/GH935/run_dev create mode 100755 testapps/GH935/run_dev.bat create mode 100755 testapps/GH935/run_e2e create mode 100755 testapps/GH935/run_e2e.bat create mode 100755 testapps/GH935/run_prod create mode 100644 testapps/GH935/src/main/java/gh935/AppEntry.java create mode 100644 testapps/GH935/src/main/resources/conf/app.properties create mode 100644 testapps/GH935/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH935/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH935/src/main/resources/logback.xml create mode 100644 testapps/GH935/src/main/resources/test/scenarios.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a3977608..bbbbfb39e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* * Missing `Content-Type` header in response servicing static file request #937 * Hot-reload issue caused by `StackOverflowError` on `AppConfig.loginUrl()` #936 diff --git a/testapps/GH935/.gitignore b/testapps/GH935/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH935/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH935/README.md b/testapps/GH935/README.md new file mode 100644 index 000000000..8132c1838 --- /dev/null +++ b/testapps/GH935/README.md @@ -0,0 +1,61 @@ +# GH919 API doc - it shall support `@Sensitive` annotation + +## Reproduce + +Run `./run_dev`. Once app started it will print error logs like: + +``` +2018-11-03 09:39:00,604 WARN a.j.Job@[jobs-thread-6] - error executing job compile-api-book +com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.2.47, class gh919.AppEntry$Foo + at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:465) + at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:120) + at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:281) + at com.alibaba.fastjson.JSON.toJSONString(JSON.java:591) + at com.alibaba.fastjson.JSON.toJSONString(JSON.java:580) + at com.alibaba.fastjson.JSON.toJSONString(JSON.java:740) + at act.apidoc.Endpoint.generateSampleJson(Endpoint.java:474) + at act.apidoc.Endpoint.explore(Endpoint.java:337) + at act.apidoc.Endpoint.(Endpoint.java:213) + at act.apidoc.ApiManager$2.visit(ApiManager.java:148) + at act.route.Router.visit(Router.java:193) + at act.route.Router.visit(Router.java:199) + at act.route.Router.accept(Router.java:180) + at act.apidoc.ApiManager.load(ApiManager.java:143) + at act.apidoc.ApiManager.load(ApiManager.java:112) + at act.apidoc.ApiManager$1.run(ApiManager.java:84) + at act.job.Job$4.apply(Job.java:394) + at act.job.Job.doJob(Job.java:355) + at act.job.Job.run(Job.java:292) + at act.job.Job$LockableJobList$1.run(Job.java:96) + at act.job.JobManager$ContextualJob$1.apply(JobManager.java:483) + at act.job.Job.doJob(Job.java:355) + at act.job.Job.run(Job.java:292) + at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) + at java.util.concurrent.FutureTask.run(FutureTask.java:266) + at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) + at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) + at java.lang.Thread.run(Thread.java:748) +Caused by: java.lang.reflect.InvocationTargetException: null + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at com.alibaba.fastjson.util.FieldInfo.get(FieldInfo.java:484) + at com.alibaba.fastjson.serializer.FieldSerializer.getPropertyValueDirect(FieldSerializer.java:140) + at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:249) + ... 29 common frames omitted +Caused by: org.osgl.exception.UnexpectedException: java.lang.IllegalArgumentException: contains illegal character for hexBinary: M4yjB9b&SPc5f&!K + at org.osgl.util.E.unexpected(E.java:189) + at org.osgl.util.Crypto.decryptAES(Crypto.java:361) + at act.crypto.AppCrypto.decrypt(AppCrypto.java:135) + at gh919.AppEntry$Foo.getName(AppEntry.java) + ... 36 common frames omitted +Caused by: java.lang.IllegalArgumentException: contains illegal character for hexBinary: M4yjB9b&SPc5f&!K + at javax.xml.bind.DatatypeConverterImpl.parseHexBinary(DatatypeConverterImpl.java:451) + at javax.xml.bind.DatatypeConverter.parseHexBinary(DatatypeConverter.java:357) + at org.osgl.util.Codec.hexStringToByte(Codec.java:220) + at org.osgl.util.Crypto.decryptAES(Crypto.java:345) + ... 38 common frames omitted +``` diff --git a/testapps/GH935/pom.xml b/testapps/GH935/pom.xml new file mode 100644 index 000000000..48ca9e434 --- /dev/null +++ b/testapps/GH935/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + act_issues + gh935 + 1.0-SNAPSHOT + + + org.actframework + act-starter-parent + 1.8.11.0 + + + + + 1.8 + gh935.AppEntry + + + + + + diff --git a/testapps/GH935/run_dev b/testapps/GH935/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH935/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH935/run_dev.bat b/testapps/GH935/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH935/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH935/run_e2e b/testapps/GH935/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH935/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH935/run_e2e.bat b/testapps/GH935/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH935/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH935/run_prod b/testapps/GH935/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH935/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH935/src/main/java/gh935/AppEntry.java b/testapps/GH935/src/main/java/gh935/AppEntry.java new file mode 100644 index 000000000..72bfa1804 --- /dev/null +++ b/testapps/GH935/src/main/java/gh935/AppEntry.java @@ -0,0 +1,33 @@ +package gh935; + +import act.Act; +import act.controller.annotation.UrlContext; +import act.data.annotation.DateFormatPattern; +import act.util.JsonView; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Date; + +@UrlContext("935") +public class AppEntry { + + public static class Foo { + public Date date; + public String name; + + public Foo(Date date, String name) { + this.date = date; + this.name = name; + } + } + + @GetAction + @JsonView + public Foo test(@DateFormatPattern("yyyy-MM-dd") Date date, String name) { + return new Foo(date, name); + } + + public static void main(String[] args) throws Exception { + Act.start(); + } +} diff --git a/testapps/GH935/src/main/resources/conf/app.properties b/testapps/GH935/src/main/resources/conf/app.properties new file mode 100644 index 000000000..cb4d90e97 --- /dev/null +++ b/testapps/GH935/src/main/resources/conf/app.properties @@ -0,0 +1,800 @@ +############################################## +# Application configuration +# act-1.8.8-RC11 +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy\u5E74MM\u6708dd\u65E5 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +fmt.date_time=yyyy-MM-dd HH:mm:ss + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy\u5E74MM\u6708dd\u65E5 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=r2WMft6bZHxUCwiUf5gVRsXJ3iQuB2zSzKZosG3eX98iZNpR1fFfpFlRhjoSQMjm + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH935/src/main/resources/conf/prod/app.properties b/testapps/GH935/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..0798e5539 --- /dev/null +++ b/testapps/GH935/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC11 +############################################## +act.secret=xPBOinitJYM7dli8k1Ji93ERQ1DUzebQrrynkrUwH0U5FzCT2mZGZXhte51tj8Xq \ No newline at end of file diff --git a/testapps/GH935/src/main/resources/conf/uat/app.properties b/testapps/GH935/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..b00fbc901 --- /dev/null +++ b/testapps/GH935/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC11 +############################################## +act.secret=mPFALnfidBVV73tqkcImPCnopmaLpcCcktkCYyb02qusdTQvmP9o6bF6S1WYRFNp \ No newline at end of file diff --git a/testapps/GH935/src/main/resources/logback.xml b/testapps/GH935/src/main/resources/logback.xml new file mode 100644 index 000000000..81946c4bc --- /dev/null +++ b/testapps/GH935/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH935/src/main/resources/test/scenarios.yml b/testapps/GH935/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..eb77eaf6e --- /dev/null +++ b/testapps/GH935/src/main/resources/test/scenarios.yml @@ -0,0 +1,13 @@ +Scenario(GH935): + interactions: + - description: "[gh935] renderJson date yyyy-MM-dd HH:mm:ss" + request: + get: /935 + params: + date: "1999-12-21" + name: xyz + response: + json: + name: xyz + date: "1999-12-21 00:00:00" + From cce9a40862d64cb011142188f20ed28574c0cb0a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 7 Nov 2018 07:19:03 +1100 Subject: [PATCH 224/730] update README for GH935 --- testapps/GH935/README.md | 62 +++------------------------------------- 1 file changed, 4 insertions(+), 58 deletions(-) diff --git a/testapps/GH935/README.md b/testapps/GH935/README.md index 8132c1838..9ac7511e2 100644 --- a/testapps/GH935/README.md +++ b/testapps/GH935/README.md @@ -1,61 +1,7 @@ -# GH919 API doc - it shall support `@Sensitive` annotation +# GH35 renderJson date yyyy-MM-dd HH:mm:ss -## Reproduce +Date format shall be set in application properties file: -Run `./run_dev`. Once app started it will print error logs like: - -``` -2018-11-03 09:39:00,604 WARN a.j.Job@[jobs-thread-6] - error executing job compile-api-book -com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.2.47, class gh919.AppEntry$Foo - at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:465) - at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:120) - at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:281) - at com.alibaba.fastjson.JSON.toJSONString(JSON.java:591) - at com.alibaba.fastjson.JSON.toJSONString(JSON.java:580) - at com.alibaba.fastjson.JSON.toJSONString(JSON.java:740) - at act.apidoc.Endpoint.generateSampleJson(Endpoint.java:474) - at act.apidoc.Endpoint.explore(Endpoint.java:337) - at act.apidoc.Endpoint.(Endpoint.java:213) - at act.apidoc.ApiManager$2.visit(ApiManager.java:148) - at act.route.Router.visit(Router.java:193) - at act.route.Router.visit(Router.java:199) - at act.route.Router.accept(Router.java:180) - at act.apidoc.ApiManager.load(ApiManager.java:143) - at act.apidoc.ApiManager.load(ApiManager.java:112) - at act.apidoc.ApiManager$1.run(ApiManager.java:84) - at act.job.Job$4.apply(Job.java:394) - at act.job.Job.doJob(Job.java:355) - at act.job.Job.run(Job.java:292) - at act.job.Job$LockableJobList$1.run(Job.java:96) - at act.job.JobManager$ContextualJob$1.apply(JobManager.java:483) - at act.job.Job.doJob(Job.java:355) - at act.job.Job.run(Job.java:292) - at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) - at java.util.concurrent.FutureTask.run(FutureTask.java:266) - at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) - at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) - at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) - at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) - at java.lang.Thread.run(Thread.java:748) -Caused by: java.lang.reflect.InvocationTargetException: null - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - at java.lang.reflect.Method.invoke(Method.java:498) - at com.alibaba.fastjson.util.FieldInfo.get(FieldInfo.java:484) - at com.alibaba.fastjson.serializer.FieldSerializer.getPropertyValueDirect(FieldSerializer.java:140) - at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:249) - ... 29 common frames omitted -Caused by: org.osgl.exception.UnexpectedException: java.lang.IllegalArgumentException: contains illegal character for hexBinary: M4yjB9b&SPc5f&!K - at org.osgl.util.E.unexpected(E.java:189) - at org.osgl.util.Crypto.decryptAES(Crypto.java:361) - at act.crypto.AppCrypto.decrypt(AppCrypto.java:135) - at gh919.AppEntry$Foo.getName(AppEntry.java) - ... 36 common frames omitted -Caused by: java.lang.IllegalArgumentException: contains illegal character for hexBinary: M4yjB9b&SPc5f&!K - at javax.xml.bind.DatatypeConverterImpl.parseHexBinary(DatatypeConverterImpl.java:451) - at javax.xml.bind.DatatypeConverter.parseHexBinary(DatatypeConverter.java:357) - at org.osgl.util.Codec.hexStringToByte(Codec.java:220) - at org.osgl.util.Crypto.decryptAES(Crypto.java:345) - ... 38 common frames omitted ``` +fmt.date_time=yyyy-MM-dd HH:mm:ss +``` \ No newline at end of file From 5c03183c7cdd7b037b5cea4ed22c69e87d9bcb0e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 7 Nov 2018 07:26:14 +1100 Subject: [PATCH 225/730] Handle `Error` encountered processing incoming request #933 --- CHANGELOG.md | 2 +- src/main/java/act/xio/NetworkHandler.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bbbbfb39e..e4a30a46b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,9 @@ # ActFramework Change Log **1.8.12** -* * Missing `Content-Type` header in response servicing static file request #937 * Hot-reload issue caused by `StackOverflowError` on `AppConfig.loginUrl()` #936 +* Handle `Error` encountered processing incoming request #933 **1.8.11** 5/Nov/2018 * Automate test failure #932 diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 3bb9c2f76..67f2503ce 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -190,8 +190,8 @@ public void run() { } } catch (Exception e) { handleException(e, ctx, "Error handling network request"); - } catch (Throwable t) { - fatal(t, "Fatal Error Found"); + } catch (Error t) { + fatal(t, "Fatal Error encountered handling request: ", ctx.req()); Act.shutdown(app); } finally { if (!skipEvents) { From c9789130a1f8912daf4a4fcfd436acfb0d4bde38 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 9 Nov 2018 08:48:50 +1100 Subject: [PATCH 226/730] Allow app to do keyword matching on certain route path element #939 --- CHANGELOG.md | 1 + src/main/java/act/route/Router.java | 78 +++++++++++++++---- src/test/java/act/route/RouterTest.java | 14 ++++ .../src/main/java/gh935/TestController.java | 13 ++++ 4 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 testapps/GH935/src/main/java/gh935/TestController.java diff --git a/CHANGELOG.md b/CHANGELOG.md index e4a30a46b..c501186ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* Allow app to do keyword matching on certain route path element #939 * Missing `Content-Type` header in response servicing static file request #937 * Hot-reload issue caused by `StackOverflowError` on `AppConfig.loginUrl()` #936 * Handle `Error` encountered processing incoming request #933 diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 522e46866..3486d0897 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -314,7 +314,7 @@ public void addMapping(final H.Method method, final String path, RequestHandler trace("R+ %s %s | %s (%s)", method, path, handler, source); } if (!app().config().builtInReqHandlerEnabled()) { - String sPath = path.toString(); + String sPath = path; if (sPath.startsWith("/~/")) { // disable built-in handlers except those might impact application behaviour // apibook is allowed here as it only available on dev mode @@ -609,7 +609,7 @@ private Node _search(H.Method method, String path) { if (path.length() == 1 && path.charAt(0) == '/') { return node; } - String sUrl = path.toString(); + String sUrl = path; List paths = Path.tokenize(Unsafe.bufOf(sUrl)); int len = paths.size(); for (int i = 0; i < len - 1; ++i) { @@ -627,7 +627,7 @@ private Node _locate(final H.Method method, final String path, String action) { if (0 == pathLen || (1 == pathLen && path.charAt(0) == '/')) { return node; } - String sUrl = path.toString(); + String sUrl = path; List paths = Path.tokenize(Unsafe.bufOf(sUrl)); int len = paths.size(); for (int i = 0; i < len - 1; ++i) { @@ -847,6 +847,8 @@ public boolean test(String s) { */ private static class Node extends DestroyableBase implements Serializable, TreeNode, Comparable { + private static final S.Pair TILDE = S.pair('~', '~'); + // used to pass a baq request result when dynamic regex matching failed private static final Node BADREQUEST = new Node(Integer.MIN_VALUE, Act.appConfig()) { @Override @@ -874,9 +876,14 @@ static Node newRoot(String name, AppConfig config) { // --- for static node private String name; + // --- for keyword matching node + private Keyword keyword; + // ignore all the rest in URL when routing private boolean ignoreRestParts; + private boolean hasKeywordMatchingChild; + // --- for dynamic node private Pattern pattern; private String patternTrait; @@ -890,6 +897,7 @@ static Node newRoot(String name, AppConfig config) { private transient Node conflictNode; private List dynamicChilds = new ArrayList<>(); private Map staticChildren = new HashMap<>(); + private Map keywordMatchingChildren = new HashMap<>(); private Map dynamicAliases = new HashMap<>(); private Map dynamicReverseAliases = new HashMap<>(); private RequestHandler handler; @@ -904,9 +912,16 @@ private Node(int id, AppConfig config) { root = this; } + Node(Keyword keyword, Node parent) { + this.keyword = $.requireNotNull(keyword); + this.parent = parent; + this.id = keyword.hashCode(); + this.root = parent.root; + this.macroLookup = parent.macroLookup; + } + Node(String name, Node parent) { - E.NPE(name); - this.name = name; + this.name = S.requireNotBlank(name); this.parent = parent; this.id = name.hashCode(); this.root = parent.root; @@ -1019,7 +1034,16 @@ public List children() { public Node child(String name, ActionContext context) { Node node = staticChildren.get(name); - if (null == node && !dynamicChilds.isEmpty()) { + if (null != node) { + return node; + } + if (hasKeywordMatchingChild) { + node = keywordMatchingChildren.get(Keyword.of(name)); + if (null != node) { + return node; + } + } + if (!dynamicChilds.isEmpty()) { UrlPath path = context.urlPath(); for (Node targetNode : dynamicChilds) { for (Map.Entry entry : targetNode.dynamicAliases.entrySet()) { @@ -1089,11 +1113,20 @@ protected void releaseResources() { staticChildren.clear(); } - Node childByMetaInfoExactMatching(String s) { - Node node = staticChildren.get(s); - if (null == node && !dynamicChilds.isEmpty()) { + Node childByMetaInfoExactMatching(String name) { + Node node = staticChildren.get(name); + if (null != node) { + return node; + } + if (hasKeywordMatchingChild) { + node = keywordMatchingChildren.get(Keyword.of(name)); + if (null != node) { + return node; + } + } + if (!dynamicChilds.isEmpty()) { for (Node targetNode : dynamicChilds) { - if (targetNode.metaInfoMatchesExactly(s)) { + if (targetNode.metaInfoMatchesExactly(name)) { return targetNode; } } @@ -1101,16 +1134,15 @@ Node childByMetaInfoExactMatching(String s) { return node; } - Node childByMetaInfoConflictMatching(String s) { - Node node = staticChildren.get(s); - if (null == node && !dynamicChilds.isEmpty()) { + Node childByMetaInfoConflictMatching(String name) { + if (!dynamicChilds.isEmpty()) { for (Node targetNode : dynamicChilds) { - if (targetNode.metaInfoConflict(s)) { + if (targetNode.metaInfoConflict(name)) { return targetNode; } } } - return node; + return null; } Node findChild(String name) { @@ -1120,7 +1152,21 @@ Node findChild(String name) { Node addChild(String name, final String path, final String action) { name = name.trim(); - Node node = childByMetaInfoExactMatching(name); + Keyword keyword = null; + if (S.is(name).wrappedWith(TILDE)) { + keyword = Keyword.of(S.strip(name).of(TILDE)); + Node node = keywordMatchingChildren.get(keyword); + if (null == node) { + node = new Node(keyword, this); + keywordMatchingChildren.put(keyword, node); + hasKeywordMatchingChild = true; + staticChildren.put(keyword.javaVariable(), node); + staticChildren.put(keyword.hyphenated(), node); + staticChildren.put(keyword.underscore(), node); + return node; + } + } + Node node = null != keyword ? keywordMatchingChildren.get(keyword) : childByMetaInfoExactMatching(name); if (null != node) { return node; } diff --git a/src/test/java/act/route/RouterTest.java b/src/test/java/act/route/RouterTest.java index f46765f00..49ab07271 100644 --- a/src/test/java/act/route/RouterTest.java +++ b/src/test/java/act/route/RouterTest.java @@ -104,6 +104,20 @@ public void testGH561_extended3() { router.addMapping(GET, "/foo/{<[0-9]{4}>y}/b", "Foo.foo", RouteSource.ACTION_ANNOTATION); } + @Test + public void testGH393_1() { + router.addMapping(GET, "/foo/~FooBar~", controller, RouteSource.ACTION_ANNOTATION); + router.getInvoker(GET, "/foo/foo-bar", ctx).handle(ctx); + controllerInvoked(); + } + + @Test + public void testGH393_2() { + router.addMapping(GET, "/foo/~FooBar~/{x}", controller, RouteSource.ACTION_ANNOTATION); + router.getInvoker(GET, "/foo/foo-bar/xyz", ctx).handle(ctx); + controllerInvoked(); + } + @Test public void searchRoot() { router.addMapping(GET, "/", controller); diff --git a/testapps/GH935/src/main/java/gh935/TestController.java b/testapps/GH935/src/main/java/gh935/TestController.java new file mode 100644 index 000000000..efc7393c6 --- /dev/null +++ b/testapps/GH935/src/main/java/gh935/TestController.java @@ -0,0 +1,13 @@ +package gh935; + +import act.inject.DefaultValue; +import org.osgl.mvc.annotation.GetAction; + +public class TestController { + + @GetAction("/test/{test}") + public String Test(@DefaultValue("Test") String test) { + return test; + } + +} From 05b53a2cfaa0c3156cbcc149c8bcf67e70418c50 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 12 Nov 2018 08:06:34 +1100 Subject: [PATCH 227/730] Deadlock issue during app hot reload #941 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 57 ++++++++------- testapps/GH938/src/main/java/test/Bean.java | 71 +++++++++++++++++++ .../GH938/src/main/resources/app.properties | 1 + 4 files changed, 105 insertions(+), 25 deletions(-) create mode 100644 testapps/GH938/src/main/java/test/Bean.java create mode 100644 testapps/GH938/src/main/resources/app.properties diff --git a/CHANGELOG.md b/CHANGELOG.md index c501186ad..b2357b475 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* Deadlock issue during app hot reload #941 * Allow app to do keyword matching on certain route path element #939 * Missing `Content-Type` header in response servicing static file request #937 * Hot-reload issue caused by `StackOverflowError` on `AppConfig.loginUrl()` #936 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 1a80c345e..2daf35e50 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -234,6 +234,7 @@ App name(String name) { /** * Returns the name of the app + * * @return the app name */ public String name() { @@ -242,8 +243,8 @@ public String name() { /** * Returns the app version - * @return - * the app version + * + * @return the app version */ public Version version() { return version; @@ -463,17 +464,15 @@ public boolean checkUpdates(boolean async) { if (!Act.isDev()) { return false; } - synchronized (this) { - try { - detectChanges(); - return false; - } catch (RequestRefreshClassLoader refreshRequest) { - refresh(async); - return true; - } catch (RequestServerRestart requestServerRestart) { - refresh(async); - return true; - } + try { + detectChanges(); + return false; + } catch (RequestRefreshClassLoader refreshRequest) { + refresh(async); + return true; + } catch (RequestServerRestart requestServerRestart) { + refresh(async); + return true; } } @@ -796,6 +795,7 @@ private boolean isDevColdStart() { /** * Check if the app has block issue set + * * @return `true` if the app has block issue encountered during start up */ public boolean hasBlockIssue() { @@ -816,7 +816,9 @@ public void register(ClassMetaInfoManager classMetaInfoManager) { /** * Report if a class is registered into singleton registry - * @param cls the class + * + * @param cls + * the class * @return `true` if the class is registered into singleton registry */ public boolean isSingleton(Class cls) { @@ -842,7 +844,7 @@ private boolean hasSingletonAnnotation(Class cls) { boolean found = false; GenieInjector injector = Act.app().injector(); Annotation[] aa = cls.getAnnotations(); - for (Annotation a: aa) { + for (Annotation a : aa) { Class type = a.annotationType(); if (injector.isInheritedScopeStopper(type)) { return false; @@ -1025,8 +1027,10 @@ public T singleton(Class clz) { * * **Note** the class will be loaded by the app's {@link #classLoader()} * - * @param className the className of the instance to be returned - * @param the generic type of the class + * @param className + * the className of the instance to be returned + * @param + * the generic type of the class * @return the instance of the class */ public T getInstance(String className) { @@ -1041,8 +1045,10 @@ public T getInstance(String className) { * to load the instance. And this is dependency inject process, * not a simple constructor call * - * @param clz the class - * @param the generic type of the class + * @param clz + * the class + * @param + * the generic type of the class * @return the instance of the class */ public T getInstance(Class clz) { @@ -1059,7 +1065,7 @@ public T getInstance(Class clz) { * on {@link #classLoader() App classloader}. * * @param name - * the resource name + * the resource name * @return `URL` to the resource if found or `null` if not found. */ public URL getResource(String name) { @@ -1073,7 +1079,7 @@ public URL getResource(String name) { * on {@link #classLoader()}. * * @param name - * the resource name + * the resource name * @return the input stream to the resource or `null` if resource not found */ public InputStream getResourceAsStream(String name) { @@ -1095,7 +1101,8 @@ public Set createSet() { /** * Load/get a class by name using the app's {@link #classLoader()} * - * @param className the name of the class to be loaded + * @param className + * the name of the class to be loaded * @return the class as described above */ public Class classForName(String className) { @@ -1499,7 +1506,7 @@ private void initScanList() { scanPatterns = new HashSet<>(); scanPrefixList = new HashSet<>(); scanSuffixList = new HashSet<>(); - for (String scanPackage: ((BootstrapClassLoader) classLoader).scanList()) { + for (String scanPackage : ((BootstrapClassLoader) classLoader).scanList()) { if (scanPackage.contains("\\.") || scanPackage.contains("*")) { scanPatterns.add(Pattern.compile(scanPackage)); String prefix = S.cut(scanPackage).beforeFirst("\\"); diff --git a/testapps/GH938/src/main/java/test/Bean.java b/testapps/GH938/src/main/java/test/Bean.java new file mode 100644 index 000000000..3e34d87fe --- /dev/null +++ b/testapps/GH938/src/main/java/test/Bean.java @@ -0,0 +1,71 @@ +package test; + +public class Bean { + + public static class Attr { + + public static class Test { + private String a; + + public Test(String a) { + this.a = a; + } + + public String getA() { + return a; + } + + public void setA(String a) { + this.a = a; + } + } + + private Test test; + + private String a; + + public Attr(Test test) { + this.test = test; + } + + public Test getTest() { + return test; + } + + public void setTest(Test test) { + this.test = test; + } + + public String getA() { + return a; + } + + public void setA(String a) { + this.a = a; + } + } + + public Bean(String a) { + this.a = a; + Attr.Test test = new Attr.Test(a); + this.mfield = new Attr(test); + } + private String a; + private Attr mfield; + + public String getA() { + return a; + } + + public void setA(String a) { + this.a = a; + } + + public Attr getMfield() { + return mfield; + } + + public void setMfield(Attr attr) { + this.mfield = attr; + } +} \ No newline at end of file diff --git a/testapps/GH938/src/main/resources/app.properties b/testapps/GH938/src/main/resources/app.properties new file mode 100644 index 000000000..22f9bbd02 --- /dev/null +++ b/testapps/GH938/src/main/resources/app.properties @@ -0,0 +1 @@ +content_suffix.aware=true \ No newline at end of file From f24837927e8903818a85277eff90c9baa3e5ddcc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 13 Nov 2018 20:57:10 +1100 Subject: [PATCH 228/730] `UnexpectedException` with `Controller.Util.download(URL)` call #944 --- CHANGELOG.md | 1 + src/main/java/act/controller/ResponseCache.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2357b475..03baad10f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* `UnexpectedException` with `Controller.Util.download(URL)` call #944 * Deadlock issue during app hot reload #941 * Allow app to do keyword matching on certain route path element #939 * Missing `Content-Type` header in response servicing static file request #937 diff --git a/src/main/java/act/controller/ResponseCache.java b/src/main/java/act/controller/ResponseCache.java index 3eb2f7d02..22081b7fd 100644 --- a/src/main/java/act/controller/ResponseCache.java +++ b/src/main/java/act/controller/ResponseCache.java @@ -214,7 +214,7 @@ public H.Response writeBinary(ISObject binary) { buffer.put(ba); buffer.flip(); this.buffer = buffer; - realResponse.writeBinary(binary); + realResponse.writeContent(buffer); this.wroteDirectly = true; return this; } From 636eaf39cf545c8848ff8ec054d064c5ae0ff929 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 14 Nov 2018 12:29:56 +1100 Subject: [PATCH 229/730] Output enhanced asm code when `java.lang.VerifyError` encountered #945 --- CHANGELOG.md | 1 + src/main/java/act/Act.java | 11 ++--- src/main/java/act/app/App.java | 47 +++++++++++++++++-- src/main/java/act/app/AppClassLoader.java | 21 ++++----- src/main/java/act/app/DbServiceManager.java | 2 +- src/main/java/act/app/SingletonFinder.java | 2 +- .../java/act/app/conf/AutoConfigPlugin.java | 2 +- .../bytecode/ReflectedCommandExecutor.java | 7 +-- .../act/cli/meta/FieldOptionAnnoInfo.java | 5 +- .../controller/meta/CatchMethodMetaInfo.java | 6 +-- .../SimpleEventListenerByteCodeScanner.java | 8 ++-- .../meta/SimpleEventListenerMetaInfo.java | 5 +- .../impl/ReflectedHandlerInvoker.java | 15 +++--- .../act/inject/DependencyInjectorBase.java | 12 ++--- .../java/act/inject/genie/GenieInjector.java | 19 +++----- .../act/inject/genie/GenieModuleScanner.java | 7 +-- .../java/act/inject/genie/GenieProviders.java | 22 ++++----- .../act/job/bytecode/ReflectedJobInvoker.java | 4 +- .../java/act/job/meta/JobMethodMetaInfo.java | 6 ++- src/main/java/act/test/util/YamlLoader.java | 15 +++--- src/main/java/act/util/ClassFinderData.java | 3 +- src/main/java/act/util/GeneralAnnoInfo.java | 8 ---- src/main/java/act/util/SubTypeFinder.java | 2 +- .../act/view/ImplicitVariableProvider.java | 2 +- .../view/rythm/RythmTransformerScanner.java | 9 ++-- .../act/xio/WebSocketConnectionHandler.java | 31 +++++++++--- .../main/java/test/JiayouOrderTestEntity.java | 7 +++ testapps/GHIssues/pom.xml | 2 +- 28 files changed, 153 insertions(+), 128 deletions(-) create mode 100644 testapps/GH944/src/main/java/test/JiayouOrderTestEntity.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 03baad10f..27d9ebb16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* Output enhanced asm code when `java.lang.VerifyError` encountered #945 * `UnexpectedException` with `Controller.Util.download(URL)` call #944 * Deadlock issue during app hot reload #941 * Allow app to do keyword matching on certain route path element #939 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 38a25e7e0..aa5da297c 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -516,15 +516,11 @@ public static Class appClassForName(String className) { } public static Class classForName(String className) { - ClassLoader cl = null; App app = app(); if (null != app) { - cl = app.classLoader(); + return app.classForName(className); } - if (null == cl) { - cl = Act.class.getClassLoader(); - } - return $.classForName(className, cl); + return $.classForName(className, Act.class.getClassLoader()); } /** @@ -539,8 +535,7 @@ public static T getInstance(String className) { if (null != app) { return app.getInstance(className); } else { - Class type = $.classForName(className); - return getInstance(type); + return getInstance(Act.classForName(className)); } } diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 2daf35e50..684cde1d0 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -34,6 +34,11 @@ import act.app.event.SysEventId; import act.app.util.NamedPort; import act.asm.AsmException; +import act.asm.ClassReader; +import act.asm.tree.ClassNode; +import act.asm.tree.InsnList; +import act.asm.tree.MethodNode; +import act.asm.util.*; import act.boot.BootstrapClassLoader; import act.boot.app.BlockIssueSignal; import act.cli.CliDispatcher; @@ -1034,8 +1039,7 @@ public T singleton(Class clz) { * @return the instance of the class */ public T getInstance(String className) { - Class c = $.classForName(className, classLoader()); - return getInstance(c); + return getInstance(this.classForName(className)); } /** @@ -1106,7 +1110,44 @@ public Set createSet() { * @return the class as described above */ public Class classForName(String className) { - return $.classForName(className, classLoader()); + try { + return $.classForName(className, classLoader()); + } catch (VerifyError error) { + if (Act.isDev()) { + // try output the bad bytecode + byte[] bytes = classLoader.cachedEnhancedBytecode(className); + if (null != bytes) { + File outputDir = new File(tmpDir(), "bytes"); + outputDir.mkdirs(); + File output = new File(outputDir, className + ".java"); + PrintWriter writer = new PrintWriter(IO.writer(output)); + ClassReader cr = new ClassReader(bytes); + ClassNode cn = new ClassNode(); + cr.accept(cn, 0); + final List mns = cn.methods; + Printer printer = new Textifier(); + TraceMethodVisitor mp = new TraceMethodVisitor(printer); + for (MethodNode mn : mns) { + InsnList inList = mn.instructions; + writer.println(); + writer.println(mn.name); + for (int i = 0; i < inList.size(); i++) { + inList.get(i).accept(mp); + printer.print(writer); + } + } + IO.close(writer); + logger.error("Bad enhanced class encountered, asm code dumped to \n\t>>" + output.getAbsolutePath()); + } else { + logger.error("Bad enhanced class: " + className); + } + setBlockIssue(error); + } else { + logger.fatal(error, "Bad enhanced class found: " + className); + shutdown(-1); + } + return null; + } } @Override diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index 372fe10da..3b817181b 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -26,25 +26,17 @@ import act.Act; import act.app.event.SysEventId; import act.app.util.EnvMatcher; -import act.asm.AsmException; -import act.asm.ClassReader; -import act.asm.ClassWriter; +import act.asm.*; import act.boot.BootstrapClassLoader; import act.boot.app.FullStackAppBootstrapClassLoader; -import act.cli.meta.CommanderClassMetaInfo; -import act.cli.meta.CommanderClassMetaInfoHolder; -import act.cli.meta.CommanderClassMetaInfoManager; +import act.cli.meta.*; import act.conf.AppConfig; -import act.controller.meta.ControllerClassMetaInfo; -import act.controller.meta.ControllerClassMetaInfoHolder; -import act.controller.meta.ControllerClassMetaInfoManager; +import act.controller.meta.*; import act.event.SysEventListenerBase; import act.exception.EnvNotMatchException; import act.job.meta.JobClassMetaInfo; import act.job.meta.JobClassMetaInfoManager; -import act.mail.meta.MailerClassMetaInfo; -import act.mail.meta.MailerClassMetaInfoHolder; -import act.mail.meta.MailerClassMetaInfoManager; +import act.mail.meta.*; import act.metric.Metric; import act.metric.MetricInfo; import act.util.*; @@ -646,6 +638,11 @@ byte[] enhancedBytecode(String name) { return null == bytecode ? null : enhance(name, bytecode); } + byte[] cachedEnhancedBytecode(String className) { + String key = className.replace('.', '/') + ".class"; + return enhancedResourceCache.get(key); + } + private synchronized ClassNode cache(Class c) { String cname = canonicalName(c); if (null == cname) { diff --git a/src/main/java/act/app/DbServiceManager.java b/src/main/java/act/app/DbServiceManager.java index eab22fba3..3ef83643e 100644 --- a/src/main/java/act/app/DbServiceManager.java +++ b/src/main/java/act/app/DbServiceManager.java @@ -93,7 +93,7 @@ private boolean isGeneral(Class c) { @Override public void visit(ClassNode classNode) throws $.Break { - Class daoType = $.classForName(classNode.name(), app.classLoader()); + Class daoType = app.classForName(classNode.name()); if (isGeneral(daoType)) { return; } diff --git a/src/main/java/act/app/SingletonFinder.java b/src/main/java/act/app/SingletonFinder.java index ebfc06a79..c16bc80e0 100644 --- a/src/main/java/act/app/SingletonFinder.java +++ b/src/main/java/act/app/SingletonFinder.java @@ -66,7 +66,7 @@ public static void foundInheritedStateless(Class cls) { @Override public void visit(ClassNode classNode) throws $.Break { String name = classNode.name(); - Class cls = $.classForName(name, app.classLoader()); + Class cls = app.classForName(name); if (!stopInheritedScope(cls)) { registerSingleton(cls); } else if (LOGGER.isDebugEnabled()) { diff --git a/src/main/java/act/app/conf/AutoConfigPlugin.java b/src/main/java/act/app/conf/AutoConfigPlugin.java index 4a8abf351..9df00d3eb 100644 --- a/src/main/java/act/app/conf/AutoConfigPlugin.java +++ b/src/main/java/act/app/conf/AutoConfigPlugin.java @@ -55,7 +55,7 @@ public Map, Set> apply(final App app app.eventBus().bind(SysEventId.PRE_START, new SysEventListenerBase() { @Override public void on(EventObject event) throws Exception { - Class autoConfigClass = $.classForName(className, app.classLoader()); + Class autoConfigClass = app.classForName(className); new AutoConfigLoader(app, autoConfigClass).load(); } }); diff --git a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java index bb1ea8a78..9cfcdbc01 100644 --- a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java +++ b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java @@ -53,7 +53,6 @@ public class ReflectedCommandExecutor extends CommandExecutor { private CommandMethodMetaInfo methodMetaInfo; private App app; private CliContextParamLoader paramLoaderService; - private ClassLoader cl; private Class[] paramTypes; private Class commanderClass; private Method method; @@ -72,11 +71,10 @@ public class ReflectedCommandExecutor extends CommandExecutor { public ReflectedCommandExecutor(CommandMethodMetaInfo methodMetaInfo, App app) { this.methodMetaInfo = $.requireNotNull(methodMetaInfo); this.app = $.NPE(app); - this.cl = app.classLoader(); this.paramTypes = paramTypes(); this.paramCount = methodMetaInfo.paramCount(); this.isStatic = methodMetaInfo.isStatic(); - this.commanderClass = $.classForName(methodMetaInfo.classInfo().className(), cl); + this.commanderClass = app.classForName(methodMetaInfo.classInfo().className()); try { this.method = commanderClass.getMethod(methodMetaInfo.methodName(), paramTypes); this.async = null != ReflectedInvokerHelper.getAnnotation(Async.class, method); @@ -150,7 +148,6 @@ protected void run(ProgressGauge progressGauge) { @Override protected void releaseResources() { app = null; - cl = null; commandIndex = 0; commanderClass = null; method = null; @@ -181,7 +178,7 @@ private Class[] paramTypes() { for (int i = 0; i < paramCount; ++i) { CommandParamMetaInfo param = methodMetaInfo.param(i); String className = param.type().getClassName(); - ca[i] = $.classForName(className, cl); + ca[i] = app.classForName(className); } return ca; } diff --git a/src/main/java/act/cli/meta/FieldOptionAnnoInfo.java b/src/main/java/act/cli/meta/FieldOptionAnnoInfo.java index b1a7084a1..af307ce7c 100644 --- a/src/main/java/act/cli/meta/FieldOptionAnnoInfo.java +++ b/src/main/java/act/cli/meta/FieldOptionAnnoInfo.java @@ -20,9 +20,8 @@ * #L% */ -import act.app.App; +import act.Act; import act.asm.Type; -import org.osgl.$; /** * Store {@link OptionAnnoInfoBase option annotation info} that @@ -44,7 +43,7 @@ public String fieldName() { } public Class fieldType() { - return $.classForName(type.getClassName(), App.instance().classLoader()); + return Act.classForName(type.getClassName()); } public void setReadFileContent() { diff --git a/src/main/java/act/controller/meta/CatchMethodMetaInfo.java b/src/main/java/act/controller/meta/CatchMethodMetaInfo.java index f20b025b4..2b5477bb3 100644 --- a/src/main/java/act/controller/meta/CatchMethodMetaInfo.java +++ b/src/main/java/act/controller/meta/CatchMethodMetaInfo.java @@ -21,7 +21,7 @@ */ import act.Act; -import org.osgl.$; +import act.app.App; import org.osgl.util.C; import org.osgl.util.S; @@ -72,7 +72,7 @@ public List exceptionClasses() { } private void analyzeParamTypes() { - ClassLoader cl = Act.app().classLoader(); + App app = Act.app(); List paramExceptions = new ArrayList<>(); for (int i = 0, n = paramCount(); i < n; ++i) { HandlerParamMetaInfo param = param(i); @@ -80,7 +80,7 @@ private void analyzeParamTypes() { if (className.endsWith("Exception")) { paramExceptions.add(className); } else { - Class cls = $.classForName(className, cl); + Class cls = app.classForName(className); if (Throwable.class.isAssignableFrom(cls)) { paramExceptions.add(className); } diff --git a/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java b/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java index a1ba0a700..119035278 100644 --- a/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java +++ b/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java @@ -151,7 +151,7 @@ public void visit(String name, Object value) { events.add(S.string(value).intern()); } else { Type type = (Type) value; - Class c = $.classForName(type.getClassName(), app().classLoader()); + Class c = app().classForName(type.getClassName()); events.add(c); } super.visit(name, value); @@ -163,7 +163,7 @@ public void visitEnum(String name, String desc, final String value) { delayedEvents.add(new $.Func0() { @Override public Object apply() throws NotAppliedException, $.Break { - Class enumClass = $.classForName(enumClassName, app().classLoader()); + Class enumClass = app().classForName(enumClassName); return (Enum.valueOf(enumClass, value)); } }); @@ -192,7 +192,7 @@ public void visitEnum(String name, String desc, final String value) { delayedEvents.add(new $.Func0() { @Override public Object apply() throws NotAppliedException, $.Break { - Class enumClass = $.classForName(enumClassName, app().classLoader()); + Class enumClass = app().classForName(enumClassName); return (Enum.valueOf(enumClass, value)); } }); @@ -221,7 +221,7 @@ public void visitEnd() { logger.warn("@OnEvent annotation shall be put on a method with exactly one event object (optionally with other injectable arguments"); } else { String type = paramTypes.get(0); - events.add($.classForName(type, app().classLoader())); + events.add(app().classForName(type)); } } if (!events.isEmpty() || !delayedEvents.isEmpty()) { diff --git a/src/main/java/act/event/meta/SimpleEventListenerMetaInfo.java b/src/main/java/act/event/meta/SimpleEventListenerMetaInfo.java index faaf48ace..51d11557c 100644 --- a/src/main/java/act/event/meta/SimpleEventListenerMetaInfo.java +++ b/src/main/java/act/event/meta/SimpleEventListenerMetaInfo.java @@ -130,12 +130,11 @@ public boolean beforeAppStart() { public static List convert(List paramTypes, String className, String methodName, $.Var methodHolder) { int sz = paramTypes.size(); App app = Act.app(); - ClassLoader cl = app.classLoader(); - Class c = $.classForName(className, cl); + Class c = app.classForName(className); Class[] paramClasses = new Class[sz]; int i = 0; for (String s : paramTypes) { - paramClasses[i++] = $.classForName(s, cl); + paramClasses[i++] = app.classForName(s); } Method method = $.getMethod(c, methodName, paramClasses); method.setAccessible(true); diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 14336dbfc..11a571d20 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -82,7 +82,6 @@ public class ReflectedHandlerInvoker extends Lo private static final Object[] DUMP_PARAMS = new Object[0]; private App app; - private ClassLoader cl; private ControllerClassMetaInfo controller; private Class controllerClass; private MethodAccess methodAccess; @@ -163,16 +162,15 @@ public void visit(H.Format format) throws $.Break { private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; - this.cl = app.classLoader(); this.handler = handlerMetaInfo; this.controller = handlerMetaInfo.classInfo(); - this.controllerClass = $.classForName(controller.className(), cl); + this.controllerClass = app.classForName(controller.className()); this.disabled = !Env.matches(controllerClass); this.traceHandler = app.config().traceHandler(); this.paramLoaderService = app.service(ParamValueLoaderManager.class).get(ActionContext.class); this.jsonDTOClassManager = app.service(JsonDtoClassManager.class); - Class[] paramTypes = paramTypes(cl); + Class[] paramTypes = paramTypes(app); try { method = controllerClass.getMethod(handlerMetaInfo.name(), paramTypes); } catch (NoSuchMethodException e) { @@ -418,7 +416,6 @@ public String toString() { @Override protected void releaseResources() { app = null; - cl = null; controller = null; controllerClass = null; method = null; @@ -801,12 +798,12 @@ private String patchedJsonBody(ActionContext context) { return needPatch ? S.fmt("{\"%s\": %s}", theName, body) : body; } - private Class[] paramTypes(ClassLoader cl) { + private Class[] paramTypes(App app) { int sz = handler.paramCount(); Class[] ca = new Class[sz]; for (int i = 0; i < sz; ++i) { HandlerParamMetaInfo param = handler.param(i); - ca[i] = $.classForName(param.type().getClassName(), cl); + ca[i] = app.classForName(param.type().getClassName()); } return ca; } @@ -1311,9 +1308,9 @@ private static List> exceptionClassesOf(CatchMethodMe List classNames = metaInfo.exceptionClasses(); List> clsList; clsList = C.newSizedList(classNames.size()); - AppClassLoader cl = App.instance().classLoader(); + App app = Act.app(); for (String cn : classNames) { - clsList.add((Class) $.classForName(cn, cl)); + clsList.add((Class) app.classForName(cn)); } return clsList; } diff --git a/src/main/java/act/inject/DependencyInjectorBase.java b/src/main/java/act/inject/DependencyInjectorBase.java index d5e018d2b..824ee8224 100644 --- a/src/main/java/act/inject/DependencyInjectorBase.java +++ b/src/main/java/act/inject/DependencyInjectorBase.java @@ -22,7 +22,6 @@ import act.Destroyable; import act.app.App; -import act.app.AppClassLoader; import act.app.AppServiceBase; import act.app.event.SysEventId; import act.util.ClassNode; @@ -30,10 +29,7 @@ import org.osgl.$; import org.osgl.inject.BeanSpec; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import javax.enterprise.context.ApplicationScoped; public abstract class DependencyInjectorBase> extends AppServiceBase implements DependencyInjector { @@ -73,12 +69,12 @@ public synchronized void registerDiListener(DependencyInjectionListener listener if (null == list) { final List list0 = new ArrayList<>(); list = list0; - final AppClassLoader cl = app().classLoader(); - ClassNode node = cl.classInfoRepository().node(c.getName()); + final App app = app(); + ClassNode node = app.classLoader().classInfoRepository().node(c.getName()); node.visitPublicNotAbstractTreeNodes(new $.Visitor() { @Override public void visit(ClassNode classNode) throws $.Break { - listeners.put($.classForName(classNode.name(), cl), list0); + listeners.put(app.classForName(classNode.name()), list0); } }); listeners.put(c, list); diff --git a/src/main/java/act/inject/genie/GenieInjector.java b/src/main/java/act/inject/genie/GenieInjector.java index eca8b4756..088a1c879 100644 --- a/src/main/java/act/inject/genie/GenieInjector.java +++ b/src/main/java/act/inject/genie/GenieInjector.java @@ -22,7 +22,6 @@ import act.Act; import act.app.App; -import act.app.AppClassLoader; import act.app.conf.AppConfigurator; import act.app.event.SysEventId; import act.controller.ActionMethodParamAnnotationHandler; @@ -33,9 +32,7 @@ import org.osgl.exception.ConfigurationException; import org.osgl.exception.NotAppliedException; import org.osgl.inject.*; -import org.osgl.inject.annotation.LoadValue; -import org.osgl.inject.annotation.Provided; -import org.osgl.inject.annotation.StopInheritedScope; +import org.osgl.inject.annotation.*; import org.osgl.mvc.annotation.Bind; import org.osgl.mvc.annotation.Param; import org.osgl.util.E; @@ -44,9 +41,7 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.*; -import javax.inject.Inject; -import javax.inject.Provider; -import javax.inject.Singleton; +import javax.inject.*; public class GenieInjector extends DependencyInjectorBase { @@ -179,9 +174,9 @@ private Set factories() { if (0 == len) { return set; } - ClassLoader cl = App.instance().classLoader(); + App app = Act.app(); for (String className : factories) { - set.add($.classForName(className, cl)); + set.add(app.classForName(className)); } return set; } @@ -264,8 +259,8 @@ public static void foundAutoBinding(final Class autoBinding) { if (hasBinding(autoBinding)) { return; } - final AppClassLoader cl = Act.app().classLoader(); - ClassInfoRepository repo = cl.classInfoRepository(); + final App app = Act.app(); + ClassInfoRepository repo = app.classLoader().classInfoRepository(); ClassNode root = repo.node(autoBinding.getName()); E.invalidConfigurationIf(null == root, "Cannot find AutoBind root: %s", autoBinding.getName()); final Set> candidates = new LinkedHashSet<>(); @@ -273,7 +268,7 @@ public static void foundAutoBinding(final Class autoBinding) { @Override public void visit(ClassNode classNode) throws $.Break { try { - Class clazz = $.classForName(classNode.name(), cl); + Class clazz = app.classForName(classNode.name()); if (Env.matches(clazz)) { candidates.add(clazz); } diff --git a/src/main/java/act/inject/genie/GenieModuleScanner.java b/src/main/java/act/inject/genie/GenieModuleScanner.java index 2a9a03cb1..d625038d9 100644 --- a/src/main/java/act/inject/genie/GenieModuleScanner.java +++ b/src/main/java/act/inject/genie/GenieModuleScanner.java @@ -20,10 +20,10 @@ * #L% */ +import act.app.App; import act.app.AppByteCodeScannerBase; import act.app.event.SysEventId; import act.util.ByteCodeVisitor; -import org.osgl.$; /** * Find all classes that ends with `Module`, try to register it as @@ -47,10 +47,11 @@ public void visit(int version, int access, String name, String signature, String @Override public void scanFinished(final String className) { if (shouldRegister) { - app().jobManager().on(SysEventId.DEPENDENCY_INJECTOR_INITIALIZED, "GenieModuleScanner:addModuleClass:" + className, new Runnable() { + final App app = app(); + app.jobManager().on(SysEventId.DEPENDENCY_INJECTOR_INITIALIZED, "GenieModuleScanner:addModuleClass:" + className, new Runnable() { @Override public void run() { - GenieInjector.addModuleClass($.classForName(className, app().classLoader())); + GenieInjector.addModuleClass(app.classForName(className)); } }); } diff --git a/src/main/java/act/inject/genie/GenieProviders.java b/src/main/java/act/inject/genie/GenieProviders.java index 7cca9c500..27e0f359c 100644 --- a/src/main/java/act/inject/genie/GenieProviders.java +++ b/src/main/java/act/inject/genie/GenieProviders.java @@ -22,7 +22,6 @@ import act.Act; import act.app.App; -import act.app.AppClassLoader; import act.conf.AppConfig; import act.conf.Config; import act.inject.DefaultValue; @@ -31,19 +30,14 @@ import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.inject.InjectException; -import org.osgl.inject.loader.AnnotatedElementLoader; -import org.osgl.inject.loader.ConfigurationValueLoader; -import org.osgl.inject.loader.TypedElementLoader; +import org.osgl.inject.loader.*; import org.osgl.inject.util.ArrayLoader; import org.osgl.util.C; import org.osgl.util.S; import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import javax.inject.Provider; /** @@ -54,8 +48,8 @@ class GenieProviders { private static final AnnotatedElementLoader _ANNO_ELEMENT_LOADER = new AnnotatedElementLoader() { @Override protected List> load(Class aClass, final boolean loadNonPublic, final boolean loadAbstract) { - final AppClassLoader cl = app().classLoader(); - ClassNode root = cl.classInfoRepository().node(aClass.getName()); + final App app = app(); + ClassNode root = app.classLoader().classInfoRepository().node(aClass.getName()); if (null == root) { return C.list(); } @@ -63,7 +57,7 @@ protected List> load(Class aClass, final boolean $.Visitor visitor = new $.Visitor() { @Override public void visit(ClassNode classNode) throws $.Break { - Class c = $.classForName(classNode.name(), cl); + Class c = app.classForName(classNode.name()); list.add(c); } }; @@ -216,8 +210,8 @@ public TypedElementLoader get() { return new TypedElementLoader() { @Override protected List load(Class aClass, final boolean loadNonPublic, final boolean loadAbstract, final boolean loadRoot) { - final AppClassLoader cl = app().classLoader(); - final ClassNode root = cl.classInfoRepository().node(aClass.getName()); + final App app = app(); + final ClassNode root = app.classLoader().classInfoRepository().node(aClass.getName()); if (null == root) { return C.list(); } @@ -225,7 +219,7 @@ protected List load(Class aClass, final boolean loadNonPublic, final bool $.Visitor visitor = new $.Visitor() { @Override public void visit(ClassNode classNode) throws $.Break { - Class c = $.classForName(classNode.name(), cl); + Class c = app.classForName(classNode.name()); list.add(c); } }; diff --git a/src/main/java/act/job/bytecode/ReflectedJobInvoker.java b/src/main/java/act/job/bytecode/ReflectedJobInvoker.java index ce98988f1..280eabf98 100644 --- a/src/main/java/act/job/bytecode/ReflectedJobInvoker.java +++ b/src/main/java/act/job/bytecode/ReflectedJobInvoker.java @@ -45,7 +45,6 @@ public class ReflectedJobInvoker extends $.F0 { private App app; - private ClassLoader cl; private JobClassMetaInfo classInfo; private volatile Class jobClass; private MethodAccess methodAccess; @@ -58,7 +57,6 @@ public class ReflectedJobInvoker extends $.F0 paramTypes) { this.clsInfo = clsInfo; - final App app = Act.app(); + app = Act.app(); app.jobManager().on(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED, "JobMethodMetaInfo:init-" + jobIdCounter.getAndIncrement(), new Runnable() { @Override public void run() { @@ -71,6 +72,7 @@ private JobMethodMetaInfo(final JobClassMetaInfo clsInfo, JobMethodMetaInfo pare @Override protected void releaseResources() { + app = null; clsInfo.destroy(); super.releaseResources(); } @@ -103,7 +105,7 @@ public String id() { public Method method() { if (null == method) { - Class c = $.classForName(classInfo().className(), Act.app().classLoader()); + Class c = app.classForName(classInfo().className()); if (null == paramTypes() || paramTypes().isEmpty()) { method = $.getMethod(c, name()); } else { diff --git a/src/main/java/act/test/util/YamlLoader.java b/src/main/java/act/test/util/YamlLoader.java index 9b80b48fc..8d16acb9a 100644 --- a/src/main/java/act/test/util/YamlLoader.java +++ b/src/main/java/act/test/util/YamlLoader.java @@ -52,8 +52,6 @@ public class YamlLoader extends LogSupport { private String fixtureFolder = "/test/fixtures/"; - private ClassLoader classLoader = appClassLoader(); - public YamlLoader() { resetModelPackages(); loadConfig(); @@ -282,12 +280,12 @@ private String patchResourceName(String name) { private Class loadModelType(String type) { if (type.contains(".") || $.isPrimitiveType(type)) { - return $.classForName(type, classLoader); + return classForName(type); } for (String pkg : modelPackages) { String patched = S.concat(pkg, type); try { - return $.classForName(patched, classLoader); + return classForName(patched); } catch (Exception e) { // ignore } @@ -313,13 +311,12 @@ protected void addModelPackages(String modelPackage, String... modelPackages) { } } - private ClassLoader appClassLoader() { + private Class classForName(String name) { App app = Act.app(); - if (null == app) { - return Thread.currentThread().getContextClassLoader(); + if (null != app) { + return app.classForName(name); } - ClassLoader appClassLoader = app.classLoader(); - return null == appClassLoader ? Thread.currentThread().getContextClassLoader() : appClassLoader; + return $.classForName(name, Thread.currentThread().getContextClassLoader()); } private void resolveDependencies(Map objects, Map> mapCache, Map entityCache, Dao dao) { diff --git a/src/main/java/act/util/ClassFinderData.java b/src/main/java/act/util/ClassFinderData.java index a271e9242..a0a9914f4 100644 --- a/src/main/java/act/util/ClassFinderData.java +++ b/src/main/java/act/util/ClassFinderData.java @@ -84,10 +84,11 @@ public void find(final App app, final ClassFinderData data) { @Override public void visit(ClassNode classNode) throws $.Break { ClassLoader cl = app.classLoader(); + if (data.className.startsWith("act.")) { cl = cl.getParent(); } - Class targetClass = $.classForName(classNode.name(), app.classLoader()); + Class targetClass = app.classForName(classNode.name()); if (targetClass.isAnnotationPresent(NoAutoRegister.class)) { return; } diff --git a/src/main/java/act/util/GeneralAnnoInfo.java b/src/main/java/act/util/GeneralAnnoInfo.java index d532e33ca..547ca0cbc 100644 --- a/src/main/java/act/util/GeneralAnnoInfo.java +++ b/src/main/java/act/util/GeneralAnnoInfo.java @@ -71,18 +71,10 @@ public Type type() { return type; } - public Class annotationClass(ClassLoader classLoader) { - return $.classForName(type.getClassName(), classLoader); - } - public Map attributes() { return C.Map(attributes); } - public Map> listAttributes() { - return C.Map(listAttributes); - } - public GeneralAnnoInfo addAnnotation(String name, Type type) { GeneralAnnoInfo anno = new GeneralAnnoInfo(type); attributes.put(name, anno); diff --git a/src/main/java/act/util/SubTypeFinder.java b/src/main/java/act/util/SubTypeFinder.java index 1c49ef22a..e87d105b9 100644 --- a/src/main/java/act/util/SubTypeFinder.java +++ b/src/main/java/act/util/SubTypeFinder.java @@ -65,7 +65,7 @@ public void on(EventObject event) throws Exception { parent.visitPublicNotAbstractTreeNodes(new $.Visitor() { @Override public void visit(ClassNode classNode) throws $.Break { - final Class c = $.classForName(classNode.name(), app.classLoader()); + final Class c = app.classForName(classNode.name()); if (!c.isAnnotationPresent(NoAutoRegister.class)) { found(c, app); } diff --git a/src/main/java/act/view/ImplicitVariableProvider.java b/src/main/java/act/view/ImplicitVariableProvider.java index 43a2539f1..7896a4e8c 100644 --- a/src/main/java/act/view/ImplicitVariableProvider.java +++ b/src/main/java/act/view/ImplicitVariableProvider.java @@ -180,7 +180,7 @@ private void register(App app) { } private void register(Meta meta, App app) { - Class cls = $.classForName(meta.className, app.classLoader()); + Class cls = app.classForName(meta.className); Method method = findMethod(cls, meta.methodName); E.unexpectedIf(null == method, "Unable to find method %s", meta); register(meta, cls, method, app); diff --git a/src/main/java/act/view/rythm/RythmTransformerScanner.java b/src/main/java/act/view/rythm/RythmTransformerScanner.java index ddf4cf555..f2c274bd2 100644 --- a/src/main/java/act/view/rythm/RythmTransformerScanner.java +++ b/src/main/java/act/view/rythm/RythmTransformerScanner.java @@ -21,14 +21,12 @@ */ import act.Act; +import act.app.App; import act.app.AppByteCodeScannerBase; import act.app.event.SysEventId; -import act.asm.AnnotationVisitor; -import act.asm.MethodVisitor; -import act.asm.Type; +import act.asm.*; import act.util.AsmTypes; import act.util.ByteCodeVisitor; -import org.osgl.$; import org.osgl.util.S; import org.rythmengine.extension.Transformer; @@ -103,11 +101,12 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { public void visitEnd() { super.visitEnd(); if (found) { + final App app = app(); app().jobManager().on(SysEventId.PRE_START, "RythmTransformerScanner:registerTransformer:" + className, new Runnable() { @Override public void run() { RythmView rythmView = (RythmView) Act.viewManager().view(RythmView.ID); - rythmView.registerTransformer(app(), $.classForName(className, app().classLoader())); + rythmView.registerTransformer(app(), app.classForName(className)); } }); } diff --git a/src/main/java/act/xio/WebSocketConnectionHandler.java b/src/main/java/act/xio/WebSocketConnectionHandler.java index e64954e6d..5e0a43fa8 100644 --- a/src/main/java/act/xio/WebSocketConnectionHandler.java +++ b/src/main/java/act/xio/WebSocketConnectionHandler.java @@ -50,7 +50,7 @@ public abstract class WebSocketConnectionHandler extends RequestHandlerBase { private static final Object[] DUMP_PARAMS = new Object[0]; protected boolean disabled; - protected ClassLoader cl; + protected App app; protected WebSocketConnectionManager connectionManager; protected ActionMethodMetaInfo handler; protected ControllerClassMetaInfo controller; @@ -84,18 +84,17 @@ public WebSocketConnectionHandler(ActionMethodMetaInfo methodInfo, WebSocketConn this.disabled = true; return; } - App app = manager.app(); - this.cl = app.classLoader(); + app = manager.app(); this.handler = $.requireNotNull(methodInfo); this.controller = handler.classInfo(); this.paramLoaderService = app.service(ParamValueLoaderManager.class).get(WebSocketContext.class); this.jsonDTOClassManager = app.service(JsonDtoClassManager.class); - this.handlerClass = $.classForName(controller.className(), cl); + this.handlerClass = app.classForName(controller.className()); this.disabled = !Env.matches(handlerClass); - paramTypes = paramTypes(cl); + paramTypes = paramTypes(app); try { this.method = handlerClass.getMethod(methodInfo.name(), paramTypes); @@ -140,6 +139,24 @@ public WebSocketConnectionHandler(ActionMethodMetaInfo methodInfo, WebSocketConn } } + @Override + protected void releaseResources() { + app = null; + connectionManager = null; + handler = null; + controller = null; + handlerClass = null; + method = null; + methodAccess = null; + paramLoaderService = null; + jsonDTOClassManager = null; + paramSpecs = null; + host = null; + $.resetArray(paramTypes); + paramTypes = null; + super.releaseResources(); + } + @Override public String toString() { return "websocket connection handler"; @@ -202,12 +219,12 @@ private Object[] params(WebSocketContext context) { return params; } - private Class[] paramTypes(ClassLoader cl) { + private Class[] paramTypes(App app) { int sz = handler.paramCount(); Class[] ca = new Class[sz]; for (int i = 0; i < sz; ++i) { HandlerParamMetaInfo param = handler.param(i); - ca[i] = $.classForName(param.type().getClassName(), cl); + ca[i] = app.classForName(param.type().getClassName()); } return ca; } diff --git a/testapps/GH944/src/main/java/test/JiayouOrderTestEntity.java b/testapps/GH944/src/main/java/test/JiayouOrderTestEntity.java new file mode 100644 index 000000000..80cc75549 --- /dev/null +++ b/testapps/GH944/src/main/java/test/JiayouOrderTestEntity.java @@ -0,0 +1,7 @@ +package test; + +import act.util.SimpleBean; + +public class JiayouOrderTestEntity extends BaseModel implements SimpleBean { + public String name; +} \ No newline at end of file diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 4df2ce7d6..e2c9389a6 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -34,7 +34,7 @@ cn.hutool hutool-all - 4.1.11 + [4.1.12,) org.actframework From 7d69c34fd89fe4976e644f269494f6d07e6674df Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 14 Nov 2018 12:50:26 +1100 Subject: [PATCH 230/730] Output enhanced asm code when `java.lang.VerifyError` encountered #945 --- src/main/java/act/app/App.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 684cde1d0..1d59ebd5f 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -1125,16 +1125,16 @@ public Class classForName(String className) { ClassNode cn = new ClassNode(); cr.accept(cn, 0); final List mns = cn.methods; - Printer printer = new Textifier(); - TraceMethodVisitor mp = new TraceMethodVisitor(printer); for (MethodNode mn : mns) { InsnList inList = mn.instructions; writer.println(); - writer.println(mn.name); + writer.println(mn.name + mn.desc); + Printer printer = new Textifier(); + TraceMethodVisitor mp = new TraceMethodVisitor(printer); for (int i = 0; i < inList.size(); i++) { inList.get(i).accept(mp); - printer.print(writer); } + printer.print(writer); } IO.close(writer); logger.error("Bad enhanced class encountered, asm code dumped to \n\t>>" + output.getAbsolutePath()); From 295ef98566f36df59b27c99d30360aa983e49aff Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 14 Nov 2018 21:59:27 +1100 Subject: [PATCH 231/730] add releaseResource logic to JodaDateTimeCodecBase --- .../java/act/data/JodaDateTimeCodecBase.java | 36 ++++++++++++++++++- .../java/act/job/meta/JobMethodMetaInfo.java | 1 + src/main/java/act/util/ActContext.java | 4 +-- .../java/act/util/FastJsonJodaDateCodec.java | 22 ++++++++++++ 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/main/java/act/data/JodaDateTimeCodecBase.java b/src/main/java/act/data/JodaDateTimeCodecBase.java index 731ecf7ba..bfd50a7c9 100644 --- a/src/main/java/act/data/JodaDateTimeCodecBase.java +++ b/src/main/java/act/data/JodaDateTimeCodecBase.java @@ -21,6 +21,7 @@ */ import act.Act; +import act.Destroyable; import act.conf.AppConfig; import act.data.annotation.DateFormatPattern; import act.data.annotation.Pattern; @@ -30,13 +31,16 @@ import org.osgl.$; import org.osgl.util.*; +import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.List; import java.util.Locale; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import javax.enterprise.context.ApplicationScoped; -public abstract class JodaDateTimeCodecBase extends StringValueResolver implements ValueObject.Codec { +public abstract class JodaDateTimeCodecBase extends StringValueResolver + implements ValueObject.Codec, Destroyable { private ConcurrentMap localizedDateFormats = new ConcurrentHashMap<>(); private boolean i18n; @@ -44,6 +48,7 @@ public abstract class JodaDateTimeCodecBase extends StringValueResolver im protected DateTimeFormatter formatter; private AppConfig conf; private Class dateTimeType; + private boolean destroyed; public JodaDateTimeCodecBase(DateTimeFormatter formatter) { exploreDateTimeType(); @@ -62,6 +67,35 @@ public JodaDateTimeCodecBase(String pattern) { initFormatter(formatter(pattern, defLocale)); } + @Override + public void destroy() { + if (destroyed) { + return; + } + if (null != localizedDateFormats) { + localizedDateFormats.clear(); + localizedDateFormats = null; + } + defLocale = null; + formatter = null; + conf = null; + dateTimeType = null; + releaseResources(); + destroyed = true; + } + + @Override + public boolean isDestroyed() { + return destroyed; + } + + protected void releaseResources() {} + + @Override + public Class scope() { + return ApplicationScoped.class; + } + @Override public final T parse(String s) { return resolve(s); diff --git a/src/main/java/act/job/meta/JobMethodMetaInfo.java b/src/main/java/act/job/meta/JobMethodMetaInfo.java index 90311363a..7b92d19c6 100644 --- a/src/main/java/act/job/meta/JobMethodMetaInfo.java +++ b/src/main/java/act/job/meta/JobMethodMetaInfo.java @@ -66,6 +66,7 @@ public void run() { } private JobMethodMetaInfo(final JobClassMetaInfo clsInfo, JobMethodMetaInfo parent) { + this.app = parent.app; this.clsInfo = clsInfo; this.paramTypes = parent.paramTypes; } diff --git a/src/main/java/act/util/ActContext.java b/src/main/java/act/util/ActContext.java index ea143b666..9dc49c1dd 100644 --- a/src/main/java/act/util/ActContext.java +++ b/src/main/java/act/util/ActContext.java @@ -39,7 +39,6 @@ import org.osgl.logging.Logger; import org.osgl.mvc.util.ParamValueProvider; import org.osgl.util.C; -import org.osgl.util.E; import org.osgl.util.S; import java.lang.reflect.Method; @@ -285,8 +284,7 @@ abstract class Base extends DestroyableBase private boolean disableCircularReferenceDetect = true; public Base(App app) { - E.NPE(app); - this.app = app; + this.app = $.requireNotNull(app); renderArgs = new HashMap<>(); attributes = new HashMap<>(); listenerList = new ArrayList<>(); diff --git a/src/main/java/act/util/FastJsonJodaDateCodec.java b/src/main/java/act/util/FastJsonJodaDateCodec.java index 7a589d906..cfe02896c 100644 --- a/src/main/java/act/util/FastJsonJodaDateCodec.java +++ b/src/main/java/act/util/FastJsonJodaDateCodec.java @@ -54,6 +54,28 @@ public FastJsonJodaDateCodec(App app) { this.app = app; } + @Override + protected void releaseResources() { + app = null; + if (null != dateTimeCodec) { + dateTimeCodec.destroy(); + dateTimeCodec = null; + } + if (null != localDateCodec) { + localDateCodec.destroy(); + localDateCodec = null; + } + if (null != localTimeCodec) { + localTimeCodec.destroy(); + localTimeCodec = null; + } + if (null != localDateTimeCodec) { + localDateTimeCodec.destroy(); + localDateTimeCodec = null; + } + super.releaseResources(); + } + public FastJsonJodaDateCodec( JodaDateTimeCodec dateTimeCodec, JodaLocalDateCodec localDateCodec, From 1f8838e3ba1e4a9345d81f005e9aff95dbb2d3a0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 14 Nov 2018 22:14:54 +1100 Subject: [PATCH 232/730] `NullPointerException` when calling `$.convert(str).to(DateTime.class)` in Job #947 --- CHANGELOG.md | 1 + pom.xml | 2 +- src/main/java/act/Act.java | 18 +++++++++++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27d9ebb16..3b8fb2c5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* `NullPointerException` when calling `$.convert(str).to(DateTime.class)` in Job #947 * Output enhanced asm code when `java.lang.VerifyError` encountered #945 * `UnexpectedException` with `Controller.Util.download(URL)` call #944 * Deadlock issue during app hot reload #941 diff --git a/pom.xml b/pom.xml index 9426d1f99..03a7cd92f 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 2.10.1 1.11.3 3.10.0 - 1.18.0 + 1.18.1-SNAPSHOT 1.5.0 1.9.0 1.9.0 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index aa5da297c..21a85fb3e 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -53,6 +53,7 @@ import act.xio.undertow.UndertowNetwork; import org.joda.time.*; import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.ISODateTimeFormat; import org.osgl.$; import org.osgl.cache.CacheService; import org.osgl.exception.NotAppliedException; @@ -826,10 +827,8 @@ public DateTime convert(String s) { Long l = Long.valueOf(s); return $.convert(l).to(DateTime.class); } - ActContext ctx = ActContext.Base.currentContext(); - Locale locale = ctx.locale(true); AppConfig config = Act.appConfig(); - String pattern = config.localizedDateTimePattern(locale); + String pattern = config.localizedDateTimePattern(locale()); return (DateTimeFormat.forPattern(pattern)).parseDateTime(s); } @Override @@ -842,6 +841,9 @@ public DateTime convert(String s, Object hint) { return $.convert(l).to(DateTime.class); } String pattern = S.string(hint); + if (pattern.toLowerCase().contains("iso")) { + return ISODateTimeFormat.dateTime().parseDateTime(s); + } return (DateTimeFormat.forPattern(pattern)).parseDateTime(s); } }).register(new $.TypeConverter() { @@ -868,6 +870,16 @@ public LocalTime convert(DateTime o) { ; } + private static Locale locale() { + ActContext ctx = ActContext.Base.currentContext(); + if (null != ctx) { + return ctx.locale(true); + } else { + App app = app(); + return null == app ? Locale.getDefault() : app.config().locale(); + } + } + private static void loadConfig() { LOGGER.debug("loading configuration ..."); From 29f327d4c64324892c1f87013cd1493315cbe0fa Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 15 Nov 2018 06:34:16 +1100 Subject: [PATCH 233/730] add test apps for GH938 and GH944 --- testapps/GH938/.gitignore | 19 +++ testapps/GH938/pom.xml | 33 +++++ .../GH938/src/main/java/test/AppEntry.java | 24 ++++ .../src/main/resources/test/scenarios.yml | 34 +++++ testapps/GH944/.gitignore | 19 +++ testapps/GH944/pom.xml | 38 ++++++ .../GH944/src/main/java/test/AppEntry.java | 30 +++++ .../GH944/src/main/java/test/BaseModel.java | 11 ++ .../GH944/src/main/resources/app.properties | 1 + testapps/GH944/src/main/resources/logback.xml | 124 ++++++++++++++++++ .../src/main/resources/test/scenarios.yml | 34 +++++ 11 files changed, 367 insertions(+) create mode 100644 testapps/GH938/.gitignore create mode 100644 testapps/GH938/pom.xml create mode 100644 testapps/GH938/src/main/java/test/AppEntry.java create mode 100644 testapps/GH938/src/main/resources/test/scenarios.yml create mode 100644 testapps/GH944/.gitignore create mode 100644 testapps/GH944/pom.xml create mode 100644 testapps/GH944/src/main/java/test/AppEntry.java create mode 100644 testapps/GH944/src/main/java/test/BaseModel.java create mode 100644 testapps/GH944/src/main/resources/app.properties create mode 100644 testapps/GH944/src/main/resources/logback.xml create mode 100644 testapps/GH944/src/main/resources/test/scenarios.yml diff --git a/testapps/GH938/.gitignore b/testapps/GH938/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH938/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH938/pom.xml b/testapps/GH938/pom.xml new file mode 100644 index 000000000..ae97c44b2 --- /dev/null +++ b/testapps/GH938/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + act-gh938 + 1.8.11.0 + + ActFramework Github Issue #938 Reproduce App + + + org.actframework + act-starter-parent + 1.8.11.0 + + + + + 1.8 + test.Main + + + + + + org.actframework + act-excel + + + + + diff --git a/testapps/GH938/src/main/java/test/AppEntry.java b/testapps/GH938/src/main/java/test/AppEntry.java new file mode 100644 index 000000000..aceffb9e0 --- /dev/null +++ b/testapps/GH938/src/main/java/test/AppEntry.java @@ -0,0 +1,24 @@ +package test; + +import act.Act; +import act.util.PropertySpec; +import org.osgl.mvc.annotation.GetAction; + +import java.util.ArrayList; +import java.util.List; + +public class AppEntry { + + @GetAction("/query") + @PropertySpec("mfield.test.a as 测试") + public List query() { + List beans = new ArrayList<>(); + beans.add(new Bean("a1")); + beans.add(new Bean("a2")); + return beans; + } + + public static void main(String[] args) throws Exception{ + Act.start(); + } +} diff --git a/testapps/GH938/src/main/resources/test/scenarios.yml b/testapps/GH938/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..6fb69b1f2 --- /dev/null +++ b/testapps/GH938/src/main/resources/test/scenarios.yml @@ -0,0 +1,34 @@ +Scenario: + interactions: + - description: /hello [port_a] + request: + port: 12345 + get: hello + response: + json: + result: SUCCESS + - description: /hello1 [port_a] + request: + port: 12345 + get: hello1 + response: + json: + result: SUCCESS + - description: /hello2 [port_a] + request: + port: 12345 + get: hello2 + response: + json: + result: SUCCESS + - description: /hello3 [port_a] + request: + get: hello3 + response: + json: + result: SUCCESS + - description: /hello4 [port_a] + request: + get: hello4 + response: + text: 哈哈哈 输出 Hello World diff --git a/testapps/GH944/.gitignore b/testapps/GH944/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH944/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH944/pom.xml b/testapps/GH944/pom.xml new file mode 100644 index 000000000..099906a77 --- /dev/null +++ b/testapps/GH944/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + act-gh944 + 1.8.11.0 + + ActFramework Github Issue #944 Reproduce App + + + org.actframework + act-starter-parent + 1.8.11.0 + + + + + 1.8 + test.Main + + + + + + org.actframework + act-ebean + + + org.actframework + act + 1.8.12-SNAPSHOT + + + + + diff --git a/testapps/GH944/src/main/java/test/AppEntry.java b/testapps/GH944/src/main/java/test/AppEntry.java new file mode 100644 index 000000000..466385150 --- /dev/null +++ b/testapps/GH944/src/main/java/test/AppEntry.java @@ -0,0 +1,30 @@ +package test; + +import static act.controller.Controller.Util.render; + +import act.Act; +import act.job.OnAppStart; +import org.joda.time.DateTime; +import org.osgl.$; +import org.osgl.mvc.annotation.GetAction; + +public class AppEntry { + + @GetAction("/test") + public void test() { + JiayouOrderTestEntity jiayouOrderTestEntity = new JiayouOrderTestEntity(); + jiayouOrderTestEntity.name = "123"; + jiayouOrderTestEntity.save(); + throw render(jiayouOrderTestEntity); + } + + @OnAppStart + public void doJob() { + DateTime dateTime = $.convert("2018-11-13T13:28:01.952+1100").hint("iso").to(DateTime.class); + System.out.println(dateTime); + } + + public static void main(String[] args) throws Exception{ + Act.start(); + } +} diff --git a/testapps/GH944/src/main/java/test/BaseModel.java b/testapps/GH944/src/main/java/test/BaseModel.java new file mode 100644 index 000000000..f4d47a4b1 --- /dev/null +++ b/testapps/GH944/src/main/java/test/BaseModel.java @@ -0,0 +1,11 @@ +package test; + +import io.ebean.Model; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; + +@MappedSuperclass +public abstract class BaseModel extends Model{ + @Id + public Long id; +} \ No newline at end of file diff --git a/testapps/GH944/src/main/resources/app.properties b/testapps/GH944/src/main/resources/app.properties new file mode 100644 index 000000000..22f9bbd02 --- /dev/null +++ b/testapps/GH944/src/main/resources/app.properties @@ -0,0 +1 @@ +content_suffix.aware=true \ No newline at end of file diff --git a/testapps/GH944/src/main/resources/logback.xml b/testapps/GH944/src/main/resources/logback.xml new file mode 100644 index 000000000..012c5317d --- /dev/null +++ b/testapps/GH944/src/main/resources/logback.xml @@ -0,0 +1,124 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + access.log + + %msg%n + + + + /access.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + trace.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} - %msg%n + + + + /trace.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act.metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /jcg.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH944/src/main/resources/test/scenarios.yml b/testapps/GH944/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..6fb69b1f2 --- /dev/null +++ b/testapps/GH944/src/main/resources/test/scenarios.yml @@ -0,0 +1,34 @@ +Scenario: + interactions: + - description: /hello [port_a] + request: + port: 12345 + get: hello + response: + json: + result: SUCCESS + - description: /hello1 [port_a] + request: + port: 12345 + get: hello1 + response: + json: + result: SUCCESS + - description: /hello2 [port_a] + request: + port: 12345 + get: hello2 + response: + json: + result: SUCCESS + - description: /hello3 [port_a] + request: + get: hello3 + response: + json: + result: SUCCESS + - description: /hello4 [port_a] + request: + get: hello4 + response: + text: 哈哈哈 输出 Hello World From 515031af7736023f587a2b336bd2998cd2cfcb2d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 15 Nov 2018 07:06:42 +1100 Subject: [PATCH 234/730] add testapp for GH946 --- CHANGELOG.md | 1 + .../src/main/java/ghissues/Gh946.java | 20 +++++++++++++++++++ .../src/main/resources/gh946.properties | 2 ++ .../src/main/resources/test/scenarios/946.yml | 10 ++++++++++ 4 files changed, 33 insertions(+) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh946.java create mode 100644 testapps/GHIssues/src/main/resources/gh946.properties create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/946.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b8fb2c5c..7ea8252f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* Issue with loading configuration into Map #946 * `NullPointerException` when calling `$.convert(str).to(DateTime.class)` in Job #947 * Output enhanced asm code when `java.lang.VerifyError` encountered #945 * `UnexpectedException` with `Controller.Util.download(URL)` call #944 diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh946.java b/testapps/GHIssues/src/main/java/ghissues/Gh946.java new file mode 100644 index 000000000..89df92a39 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh946.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.inject.annotation.Configuration; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Map; + +@UrlContext("946") +public class Gh946 extends BaseController { + + @Configuration("map.field") + private Map map; + + @GetAction + public Map test() { + return map; + } + +} diff --git a/testapps/GHIssues/src/main/resources/gh946.properties b/testapps/GHIssues/src/main/resources/gh946.properties new file mode 100644 index 000000000..0daf7d347 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/gh946.properties @@ -0,0 +1,2 @@ +map.field.beginTime=2018 +map.field.endTime=2019 \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/946.yml b/testapps/GHIssues/src/main/resources/test/scenarios/946.yml new file mode 100644 index 000000000..cc0e21bc0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/946.yml @@ -0,0 +1,10 @@ +Scenario(946): + description: "[GH946] Issue with loading configuration into Map" + interactions: + - description: test + request: + get: 946 + response: + json: + beginTime: 2018 + endTime: 2019 \ No newline at end of file From f1db27901a8a6d9e4cb20479bec23337bd6bb4fa Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 15 Nov 2018 16:29:03 +1100 Subject: [PATCH 235/730] execute `route.list` command causes `NullPointerException` #948 --- CHANGELOG.md | 1 + .../impl/CollectionASCIITableAware.java | 6 ++-- .../java/act/inject/param/OptionLoader.java | 32 +++++++++++++++---- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ea8252f9..04b722c34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* execute `route.list` command causes `NullPointerException` #948 * Issue with loading configuration into Map #946 * `NullPointerException` when calling `$.convert(str).to(DateTime.class)` in Job #947 * Output enhanced asm code when `java.lang.VerifyError` encountered #945 diff --git a/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java b/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java index 10f7258b0..f9dc9db8f 100644 --- a/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java +++ b/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java @@ -44,7 +44,6 @@ import org.osgl.util.Keyword; import org.osgl.util.S; -import java.io.Serializable; import java.lang.reflect.Method; import java.math.BigDecimal; import java.text.DecimalFormat; @@ -95,7 +94,7 @@ public CollectionASCIITableAware(List objList, List properties, List< } //Populate data - data = new ArrayList>(); + data = new ArrayList<>(); List rowData; Class dataClazz = Object.class; for (Object o: objList) { @@ -104,14 +103,13 @@ public CollectionASCIITableAware(List objList, List properties, List< break; } } - Map propertyExtractorMap = new HashMap(); CacheService cache = null; CliContext ctx = CliContext.current(); if (null != ctx) { cache = ctx.evaluatorCache(); } for (int i = 0 ; i < objList.size() ; i ++) { - rowData = new ArrayList(); + rowData = new ArrayList<>(); for (int j = 0 ; j < properties.size() ; j ++) { rowData.add(getProperty(cache, diff --git a/src/main/java/act/inject/param/OptionLoader.java b/src/main/java/act/inject/param/OptionLoader.java index 95f5c109e..dffdae627 100644 --- a/src/main/java/act/inject/param/OptionLoader.java +++ b/src/main/java/act/inject/param/OptionLoader.java @@ -20,16 +20,14 @@ * #L% */ -import act.cli.CliContext; -import act.cli.Optional; -import act.cli.Required; +import act.cli.*; import act.inject.DefaultValue; import act.util.ActContext; +import org.osgl.$; import org.osgl.inject.BeanSpec; -import org.osgl.util.E; -import org.osgl.util.Keyword; -import org.osgl.util.S; -import org.osgl.util.StringValueResolver; +import org.osgl.util.*; + +import java.lang.reflect.Array; /** * Load command line options @@ -40,6 +38,7 @@ class OptionLoader extends CliParamValueLoader { String lead1; String lead2; final String defVal; + final Object langDefVal; final String requiredGroup; final boolean required; final BeanSpec beanSpec; @@ -63,6 +62,14 @@ class OptionLoader extends CliParamValueLoader { } } this.defVal = defVal; + Class rawType = beanSpec.rawType(); + if (rawType.isArray()) { + this.langDefVal = Array.newInstance(rawType); + } else if ($.isPrimitiveType(rawType)) { + this.langDefVal = $.primitiveDefaultValue(rawType); + } else { + this.langDefVal = null; + } } OptionLoader(String bindName, Required required, StringValueResolver resolver, BeanSpec beanSpec) { @@ -77,6 +84,14 @@ class OptionLoader extends CliParamValueLoader { CliContext.ParsingContextBuilder.foundRequired(this.requiredGroup); DefaultValue defaultValue = beanSpec.getAnnotation(DefaultValue.class); this.defVal = null == defaultValue ? null : defaultValue.value(); + Class rawType = beanSpec.rawType(); + if (rawType.isArray()) { + this.langDefVal = Array.newInstance(rawType); + } else if ($.isPrimitiveType(rawType)) { + this.langDefVal = $.primitiveDefaultValue(rawType); + } else { + this.langDefVal = null; + } } @Override @@ -99,6 +114,9 @@ public Object load(Object cachedBean, ActContext context, boolean noDefaultVa if (null != val && required) { ctx.parsingContext().foundRequired(requiredGroup); } + if (null == val) { + val = langDefVal; + } return val; } From 3ea6d226d9d32f4b88555c6a3c941e237e92fe74 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 15 Nov 2018 18:05:38 +1100 Subject: [PATCH 236/730] #948 - fix IllegalArgumentException when argument is array --- src/main/java/act/inject/param/OptionLoader.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/act/inject/param/OptionLoader.java b/src/main/java/act/inject/param/OptionLoader.java index dffdae627..41ca884c0 100644 --- a/src/main/java/act/inject/param/OptionLoader.java +++ b/src/main/java/act/inject/param/OptionLoader.java @@ -20,6 +20,7 @@ * #L% */ +import act.Act; import act.cli.*; import act.inject.DefaultValue; import act.util.ActContext; @@ -28,6 +29,7 @@ import org.osgl.util.*; import java.lang.reflect.Array; +import java.util.Collection; /** * Load command line options @@ -64,9 +66,11 @@ class OptionLoader extends CliParamValueLoader { this.defVal = defVal; Class rawType = beanSpec.rawType(); if (rawType.isArray()) { - this.langDefVal = Array.newInstance(rawType); + this.langDefVal = Array.newInstance(rawType.getComponentType()); } else if ($.isPrimitiveType(rawType)) { this.langDefVal = $.primitiveDefaultValue(rawType); + } else if (Collection.class.isAssignableFrom(rawType)) { + this.langDefVal = Act.getInstance(rawType); } else { this.langDefVal = null; } @@ -86,9 +90,11 @@ class OptionLoader extends CliParamValueLoader { this.defVal = null == defaultValue ? null : defaultValue.value(); Class rawType = beanSpec.rawType(); if (rawType.isArray()) { - this.langDefVal = Array.newInstance(rawType); + this.langDefVal = Array.newInstance(rawType.getComponentType()); } else if ($.isPrimitiveType(rawType)) { this.langDefVal = $.primitiveDefaultValue(rawType); + } else if (Collection.class.isAssignableFrom(rawType)) { + this.langDefVal = Act.getInstance(rawType); } else { this.langDefVal = null; } From 4b699696dda4bd9208cb90ca6abf6bd2817a1da1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 15 Nov 2018 18:27:32 +1100 Subject: [PATCH 237/730] #948 - fix IllegalArgumentException when argument is array --- src/main/java/act/inject/param/OptionLoader.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/act/inject/param/OptionLoader.java b/src/main/java/act/inject/param/OptionLoader.java index 41ca884c0..3e40ff587 100644 --- a/src/main/java/act/inject/param/OptionLoader.java +++ b/src/main/java/act/inject/param/OptionLoader.java @@ -66,7 +66,7 @@ class OptionLoader extends CliParamValueLoader { this.defVal = defVal; Class rawType = beanSpec.rawType(); if (rawType.isArray()) { - this.langDefVal = Array.newInstance(rawType.getComponentType()); + this.langDefVal = Array.newInstance(rawType.getComponentType(), 0); } else if ($.isPrimitiveType(rawType)) { this.langDefVal = $.primitiveDefaultValue(rawType); } else if (Collection.class.isAssignableFrom(rawType)) { @@ -90,7 +90,7 @@ class OptionLoader extends CliParamValueLoader { this.defVal = null == defaultValue ? null : defaultValue.value(); Class rawType = beanSpec.rawType(); if (rawType.isArray()) { - this.langDefVal = Array.newInstance(rawType.getComponentType()); + this.langDefVal = Array.newInstance(rawType.getComponentType(), 0); } else if ($.isPrimitiveType(rawType)) { this.langDefVal = $.primitiveDefaultValue(rawType); } else if (Collection.class.isAssignableFrom(rawType)) { @@ -187,5 +187,4 @@ private void parseLeads(String[] specs) { } } - } From 42248f347829a757a909eddaeab34b81bd1f544f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 15 Nov 2018 21:14:24 +1100 Subject: [PATCH 238/730] Allow it to turn on/off handler trace while app is running #949 --- CHANGELOG.md | 1 + src/main/java/act/conf/AppConfig.java | 8 +++++++ src/main/java/act/conf/ConfAdmin.java | 21 ++++++++++++++++--- src/main/java/act/conf/ConfigItem.java | 5 +++++ .../impl/ReflectedHandlerInvoker.java | 8 +++---- 5 files changed, 36 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04b722c34..3938defd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* Allow it to turn on/off handler trace while app is running #949 * execute `route.list` command causes `NullPointerException` #948 * Issue with loading configuration into Map #946 * `NullPointerException` when calling `$.convert(str).to(DateTime.class)` in Job #947 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index bf806c623..c7a6260e5 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -3109,6 +3109,10 @@ public boolean traceHandler() { return traceHandler; } + void toggleTraceHandler(boolean enabled) { + traceHandler = enabled; + } + private void _mergeTraceHandler(AppConfig config) { if (!hasConfiguration(TRACE_HANDLER_ENABLED)) { this.traceHandler = config.traceHandler; @@ -3129,6 +3133,10 @@ public boolean traceRequests() { return traceRequest; } + void toggleTraceRequest(boolean enabled) { + traceRequest = enabled; + } + private void _mergeTraceRequests(AppConfig config) { if (!hasConfiguration(TRACE_REQUEST_ENABLED)) { this.traceRequest = config.traceRequest; diff --git a/src/main/java/act/conf/ConfAdmin.java b/src/main/java/act/conf/ConfAdmin.java index 1fbb2dfc0..c68f91b76 100644 --- a/src/main/java/act/conf/ConfAdmin.java +++ b/src/main/java/act/conf/ConfAdmin.java @@ -21,8 +21,7 @@ */ import act.Act; -import act.cli.Command; -import act.cli.Optional; +import act.cli.*; import act.controller.ExpressController; import act.controller.annotation.UrlContext; import com.alibaba.fastjson.JSONObject; @@ -57,7 +56,13 @@ public List list( if (hasQuery && !keyString.contains(q)) { continue; } - list.add(new ConfigItem(key.toString(), config)); + if (AppConfigKey.TRACE_HANDLER_ENABLED == key) { + list.add(new ConfigItem(key.toString(), appConfig.traceHandler())); + } else if (AppConfigKey.TRACE_REQUEST_ENABLED == key) { + list.add(new ConfigItem(key.toString(), appConfig.traceRequests())); + } else { + list.add(new ConfigItem(key.toString(), config)); + } } return list; } @@ -71,4 +76,14 @@ public JSONObject csrfConf() { return retVal; } + @Command("act.conf.trace-handler") + public void toggleTraceHandler(@Required boolean enabled) { + appConfig.toggleTraceHandler(enabled); + } + + @Command("act.conf.trace-request") + public void toggleTraceRequest(@Required boolean enabled) { + appConfig.toggleTraceRequest(enabled); + } + } diff --git a/src/main/java/act/conf/ConfigItem.java b/src/main/java/act/conf/ConfigItem.java index 04768be4d..aff3cc45b 100644 --- a/src/main/java/act/conf/ConfigItem.java +++ b/src/main/java/act/conf/ConfigItem.java @@ -33,6 +33,11 @@ public ConfigItem(String key, Config config) { this.val = ValueObject.of(config.get(key)); } + public ConfigItem(String key, Object val) { + this.key = key; + this.val = ValueObject.of(val); + } + public String getKey() { return key; } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 11a571d20..10711ff2e 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -82,6 +82,7 @@ public class ReflectedHandlerInvoker extends Lo private static final Object[] DUMP_PARAMS = new Object[0]; private App app; + private AppConfig config; private ControllerClassMetaInfo controller; private Class controllerClass; private MethodAccess methodAccess; @@ -131,7 +132,6 @@ public void visit(H.Format format) throws $.Break { private boolean async; private boolean byPassImplicityTemplateVariable; private boolean forceDataBinding; - private boolean traceHandler; private boolean isLargeResponse; private boolean forceSmallResponse; private Class filters[]; @@ -162,11 +162,11 @@ public void visit(H.Format format) throws $.Break { private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; + this.config = app.config(); this.handler = handlerMetaInfo; this.controller = handlerMetaInfo.classInfo(); this.controllerClass = app.classForName(controller.className()); this.disabled = !Env.matches(controllerClass); - this.traceHandler = app.config().traceHandler(); this.paramLoaderService = app.service(ParamValueLoaderManager.class).get(ActionContext.class); this.jsonDTOClassManager = app.service(JsonDtoClassManager.class); @@ -984,7 +984,7 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle Object retVal; String invocationInfo = null; try { - if (traceHandler) { + if (config.traceHandler()) { invocationInfo = S.fmt("%s(%s)", handlerMetaInfo.fullName(), $.toString2(params)); Trace.LOGGER_HANDLER.trace(invocationInfo); } @@ -996,7 +996,7 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle } catch (Result r) { retVal = r; } catch (Exception e) { - if (traceHandler) { + if (config.traceHandler()) { Trace.LOGGER_HANDLER.trace(e, "error invoking %s", invocationInfo); } throw e; From f42dafbdffb9b73713e96b02b8ec9f975509ae22 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 16 Nov 2018 08:39:24 +1100 Subject: [PATCH 239/730] `NullPointerException` invoking `job.list` command #950 --- CHANGELOG.md | 1 + .../act/cli/ascii_table/impl/CollectionASCIITableAware.java | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3938defd8..e8d8e9065 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* `NullPointerException` invoking `job.list` command #950 * Allow it to turn on/off handler trace while app is running #949 * execute `route.list` command causes `NullPointerException` #948 * Issue with loading configuration into Map #946 diff --git a/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java b/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java index f9dc9db8f..45cb78d89 100644 --- a/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java +++ b/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java @@ -155,9 +155,12 @@ public List getHeaders() { @Override public String formatData(ASCIITableHeader header, int row, int col, Object data) { + if (null == data) { + return ""; + } //Format only numbers try { - BigDecimal bd = new BigDecimal(data.toString()); + BigDecimal bd = new BigDecimal(S.string(data)); return DecimalFormat.getInstance().format(bd); } catch (Exception e) { } From d1039502896d1e520ca6403bca30707c57f4a9ef Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 16 Nov 2018 16:50:56 +1100 Subject: [PATCH 240/730] CLI session shall not time out when it is reporting async job progress #952 --- CHANGELOG.md | 1 + src/main/java/act/SysUtilAdmin.java | 20 +++------- src/main/java/act/app/CliServer.java | 3 +- src/main/java/act/cli/CliContext.java | 53 +++++++++++++++------------ src/main/java/act/cli/CliSession.java | 5 ++- 5 files changed, 42 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8d8e9065..e0b451b9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* CLI session shall not time out when it is reporting async job progress #952 * `NullPointerException` invoking `job.list` command #950 * Allow it to turn on/off handler trace while app is running #949 * execute `route.list` command causes `NullPointerException` #948 diff --git a/src/main/java/act/SysUtilAdmin.java b/src/main/java/act/SysUtilAdmin.java index 4818bb37c..4961df7d9 100644 --- a/src/main/java/act/SysUtilAdmin.java +++ b/src/main/java/act/SysUtilAdmin.java @@ -21,24 +21,16 @@ */ import act.cli.*; -import act.handler.NonBlock; import act.sys.Env; -import act.util.JsonView; import act.util.PropertySpec; import org.joda.time.LocalDateTime; import org.osgl.$; -import org.osgl.mvc.annotation.GetAction; import org.osgl.storage.impl.SObject; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.IO; -import org.osgl.util.S; +import org.osgl.util.*; -import javax.validation.constraints.Min; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.util.*; +import javax.validation.constraints.Min; @SuppressWarnings("unused") public class SysUtilAdmin { @@ -57,10 +49,10 @@ public String pid() { @Command(name = "act.meminfo, act.mi", help = "Print memory info") public void memInfo( @act.cli.Optional("monitor memory usage") boolean monitor, - @act.cli.Optional("human readable") boolean human, + @act.cli.Optional("readable") boolean readable, CliContext context ) { - final int factor = human ? 1024 * 1024 : 1; + final int factor = readable ? 1024 * 1024 : 1; Runtime runtime = Runtime.getRuntime(); if (monitor) { @@ -113,7 +105,7 @@ public void memInfo( public void gc(CliContext context) { System.gc(); context.println("GC executed"); - memInfo(false, false, context); + memInfo(false, true, context); } @Command(name = "act.pwd", help = "Print name of the current working directory") diff --git a/src/main/java/act/app/CliServer.java b/src/main/java/act/app/CliServer.java index a51436818..7d2d85771 100644 --- a/src/main/java/act/app/CliServer.java +++ b/src/main/java/act/app/CliServer.java @@ -24,6 +24,7 @@ import act.Destroyable; import act.cli.CliSession; import org.osgl.exception.ConfigurationException; +import org.osgl.exception.UnexpectedException; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; @@ -149,7 +150,7 @@ public void run() { try { Thread.sleep(60 * 1000); } catch (InterruptedException e) { - return; + throw new UnexpectedException(e); } app().checkUpdates(false); } diff --git a/src/main/java/act/cli/CliContext.java b/src/main/java/act/cli/CliContext.java index 01c4caf73..a04eff682 100644 --- a/src/main/java/act/cli/CliContext.java +++ b/src/main/java/act/cli/CliContext.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -22,7 +22,6 @@ import static act.cli.ReportProgress.Type.BAR; -import act.app.ActionContext; import act.app.App; import act.cli.ascii_table.ASCIITableHeader; import act.cli.ascii_table.impl.SimpleASCIITableImpl; @@ -32,10 +31,7 @@ import act.cli.builtin.Help; import act.cli.util.CommandLineParser; import act.handler.CliHandler; -import act.util.ActContext; -import act.util.ProgressGauge; -import act.util.PropertySpec; -import act.util.SimpleProgressGauge; +import act.util.*; import jline.console.ConsoleReader; import me.tongfei.progressbar.ProgressBar; import me.tongfei.progressbar.ProgressBarStyle; @@ -47,10 +43,7 @@ import org.osgl.util.S; import org.xnio.streams.WriterOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.PrintStream; -import java.io.PrintWriter; +import java.io.*; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; @@ -71,7 +64,8 @@ public static class ParsingContext { // for a specific required group Map required; - private ParsingContext() {} + private ParsingContext() { + } public AtomicInteger curArgId() { return curArgId; @@ -148,7 +142,7 @@ public static void foundArgument(String defVal) { ParsingContext ctx0 = ctx.get(); int n = ctx0.optionArgumentsCnt++; if (S.notBlank(defVal)) { - ctx0.argDefVals.put(n, defVal) ; + ctx0.argDefVals.put(n, defVal); } } @@ -193,6 +187,8 @@ public static ParsingContext finish() { private boolean rawPrint; + private boolean inProgress; + private Map preparsedOptionValues; public CliContext(String line, App app, ConsoleReader console, CliSession session) { @@ -214,7 +210,9 @@ protected CliContext(String line, App app, ConsoleReader console, CliSession ses /** * Set the console prompt - * @param prompt the prompt + * + * @param prompt + * the prompt */ public void prompt(String prompt) { console.setPrompt(prompt); @@ -266,6 +264,7 @@ public T session(String key) { /** * Returns CLI session id + * * @return CLI session id */ @Override @@ -299,6 +298,7 @@ public String[] paramVals(String key) { /** * Return the current working directory + * * @return the current working directory */ public File curDir() { @@ -340,10 +340,15 @@ public void print(ProgressGauge progressGauge) { reportProgress = org.osgl.inject.util.AnnotationUtil.createAnnotation(ReportProgress.class); } ReportProgress.Type type = reportProgress.type(); - if (BAR == type) { - printBar(progressGauge); - } else { - printText(progressGauge); + inProgress = true; + try { + if (BAR == type) { + printBar(progressGauge); + } else { + printText(progressGauge); + } + } finally { + inProgress = false; } } @@ -381,7 +386,7 @@ public void printText(ProgressGauge progressGauge) { println(); } - public void print(String template, Object ... args) { + public void print(String template, Object... args) { if (rawPrint) { print1(template, args); } else { @@ -424,7 +429,7 @@ private void print0(String template, Object... args) { } } - private void print1(String template, Object ... args) { + private void print1(String template, Object... args) { if (args.length == 0) { pw.print(template); } else { @@ -585,12 +590,12 @@ public File getFile(String path) { return new File(file.getAbsolutePath()); } - private void saveLocal() { - _local.set(this); + boolean inProgress() { + return inProgress; } - private void initOverHttp(ActionContext actionContext) { - + private void saveLocal() { + _local.set(this); } public static CliContext current() { diff --git a/src/main/java/act/cli/CliSession.java b/src/main/java/act/cli/CliSession.java index f20d69026..d6562f3c1 100644 --- a/src/main/java/act/cli/CliSession.java +++ b/src/main/java/act/cli/CliSession.java @@ -131,7 +131,10 @@ public T attribute(String key) { * @return {@code true} if this session is expired */ public boolean expired(int expiration) { - if (daemon && null != cliContext && !cliContext.disconnected()) { + if (null == cliContext) { + return true; + } + if ((daemon || cliContext.inProgress()) && !cliContext.disconnected()) { return false; } long l = expiration * 1000; From 59c02708b9beb8d5dd6e677926c1faa6245623cb Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 18 Nov 2018 08:18:39 +1100 Subject: [PATCH 241/730] #941 recurred in UND project - new fix implemented --- src/main/java/act/app/App.java | 140 +++++++++++++++----------- src/main/java/act/app/CliServer.java | 4 +- src/main/java/act/cli/CliSession.java | 5 +- src/main/java/act/event/EventBus.java | 2 +- src/main/java/act/job/Job.java | 54 +++++++++- src/main/java/act/job/JobManager.java | 36 +++++-- 6 files changed, 170 insertions(+), 71 deletions(-) diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 1d59ebd5f..d039fbc65 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -36,8 +36,7 @@ import act.asm.AsmException; import act.asm.ClassReader; import act.asm.tree.ClassNode; -import act.asm.tree.InsnList; -import act.asm.tree.MethodNode; +import act.asm.tree.*; import act.asm.util.*; import act.boot.BootstrapClassLoader; import act.boot.app.BlockIssueSignal; @@ -97,6 +96,7 @@ import java.net.URL; import java.util.*; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; import javax.enterprise.context.ApplicationScoped; import javax.inject.Singleton; @@ -174,7 +174,6 @@ public enum F { private Set scanSuffixList; private List baseDirs; private volatile File tmpDir; - private boolean restarting; private Result blockIssue; private Throwable blockIssueCause; private RequestHandler blockIssueHandler = new FastRequestHandler() { @@ -190,10 +189,12 @@ public String toString() { } }; private final Version version; - private boolean reloading; private List hotReloadListeners = new ArrayList<>(); private PrincipalProvider principalProvider = PrincipalProvider.DefaultPrincipalProvider.INSTANCE; + // lock app hot reload process + private final AtomicBoolean loading = new AtomicBoolean(); + // for unit test purpose private App() { this.version = Version.get(); @@ -465,10 +466,40 @@ public void registerHotReloadListener(HotReloadListener listener) { } } + /** + * Check if app needs updates. + * + * @param async + * refresh app async or sync + * @return `true` if there are updates and app require hot reload + */ public boolean checkUpdates(boolean async) { + return checkUpdates(async, false); + } + + public boolean checkUpdatesNonBlock(boolean async) { + return checkUpdates(async, true); + } + + private boolean checkUpdates(boolean async, boolean nonBlock) { if (!Act.isDev()) { return false; } + if (loading.get()) { + if (nonBlock) { + return true; + } + synchronized (this) { + while (loading.get()) { + try { + wait(); + } catch (InterruptedException e) { + throw E.unexpected(e); + } + } + } + return false; + } try { detectChanges(); return false; @@ -597,10 +628,6 @@ public synchronized void refresh(boolean async) { } } - public synchronized boolean isRestarting() { - return restarting; - } - public RequestHandler blockIssueHandler() { if (null != blockIssue && Act.isDev()) { return blockIssueHandler; @@ -609,39 +636,38 @@ public RequestHandler blockIssueHandler() { } public synchronized void refresh() { - currentState = null; - final long ms = $.ms(); - info("App starting ...."); - profile = null; - blockIssue = null; - blockIssueCause = null; - - Act.viewManager().clearAppDefinedVars(); - initScanList(); - initJarFileBlackList(); - initServiceResourceManager(); - reload(); - - managedCollectionService = new ManagedCollectionService(this); - I18n.classInit(this); - ReflectedInvokerHelper.classInit(this); - ParamValueLoaderService.classInit(this); - JodaTransformers.classInit(this); - FastJsonPropertyPreFilter.classInit(this); - ActErrorResult.classInit(this); - ActProviders.classInit(this); - ProvidedValueLoader.classInit(this); - GenieFactoryFinder.classInit(this); - - mainThread = Thread.currentThread(); - restarting = mainThread.getName().contains("job"); - eventEmitted = C.newSet(); - - initSingletonRegistry(); - initEventBus(); - emit(EVENT_BUS_INITIALIZED); - + startLoading(); try { + currentState = null; + final long ms = $.ms(); + info("App starting ...."); + profile = null; + blockIssue = null; + blockIssueCause = null; + + Act.viewManager().clearAppDefinedVars(); + initScanList(); + initJarFileBlackList(); + initServiceResourceManager(); + reload(); + + managedCollectionService = new ManagedCollectionService(this); + I18n.classInit(this); + ReflectedInvokerHelper.classInit(this); + ParamValueLoaderService.classInit(this); + JodaTransformers.classInit(this); + FastJsonPropertyPreFilter.classInit(this); + ActErrorResult.classInit(this); + ActProviders.classInit(this); + ProvidedValueLoader.classInit(this); + GenieFactoryFinder.classInit(this); + + mainThread = Thread.currentThread(); + eventEmitted = C.newSet(); + + initSingletonRegistry(); + initEventBus(); + emit(EVENT_BUS_INITIALIZED); loadConfig(); emit(CONFIG_LOADED); @@ -696,30 +722,17 @@ public synchronized void refresh() { asmException = e; throw ActErrorResult.of(e); } - } catch (BlockIssueSignal e) { - return; - } - try { - //classLoader().loadClasses(); emit(APP_CODE_SCANNED); emit(CLASS_LOADED); Act.viewManager().reload(this); - } catch (BlockIssueSignal e) { - // ignore and keep going with dependency injector initialization - } - try { loadDependencyInjector(); emit(DEPENDENCY_INJECTOR_INITIALIZED); dependencyInjector.unlock(); emit(DEPENDENCY_INJECTOR_LOADED); - } catch (BlockIssueSignal e) { - return; - } - if (null == blockIssue && null == blockIssueCause) { - try { + if (null == blockIssue && null == blockIssueCause) { final Runnable runnable1 = new Runnable() { @Override public void run() { @@ -752,7 +765,7 @@ public void run() { if (!isDevColdStart()) { runnable1.run(); } else { - jobManager.now("post_di_load_init", runnable1); + jobManager.now("post_di_load_init", runnable1, true); } Runnable runnable2 = new Runnable() { @Override @@ -770,6 +783,7 @@ public void run() { } hasStarted = true; daemonKeeper(); + loadingDone(); emit(POST_START); jobManager.post(SysEventId.DB_SVC_LOADED, new Runnable() { @Override @@ -788,9 +802,12 @@ public void run() { } else { jobManager().on(DB_SVC_PROVISIONED, "App:postDbSvcLogic", runnable2, true); } - } catch (BlockIssueSignal e) { - // ignore } + } catch (BlockIssueSignal e) { + loadingDone(); + } catch (RuntimeException e) { + loadingDone(); + throw e; } } @@ -1289,6 +1306,15 @@ public Router getRouterFor(String className, String methodName) { return router; } + private synchronized void startLoading() { + loading.set(true); + } + + private synchronized void loadingDone() { + loading.set(false); + this.notifyAll(); + } + private void loadConfig() { JsonUtilConfig.configure(this); File resource = RuntimeDirs.resource(this); diff --git a/src/main/java/act/app/CliServer.java b/src/main/java/act/app/CliServer.java index 7d2d85771..57717a09a 100644 --- a/src/main/java/act/app/CliServer.java +++ b/src/main/java/act/app/CliServer.java @@ -152,7 +152,9 @@ public void run() { } catch (InterruptedException e) { throw new UnexpectedException(e); } - app().checkUpdates(false); + if (app().checkUpdatesNonBlock(false)) { + return; + } } } }); diff --git a/src/main/java/act/cli/CliSession.java b/src/main/java/act/cli/CliSession.java index d6562f3c1..a5bceddde 100644 --- a/src/main/java/act/cli/CliSession.java +++ b/src/main/java/act/cli/CliSession.java @@ -173,7 +173,10 @@ public void run() { return; } ts = $.ms(); - app.checkUpdates(true); + if (app.checkUpdatesNonBlock(true)) { + console.print("app reloading ..."); + return; + } if (S.blank(line)) { continue; } diff --git a/src/main/java/act/event/EventBus.java b/src/main/java/act/event/EventBus.java index 8b94d6ee3..697e9b795 100644 --- a/src/main/java/act/event/EventBus.java +++ b/src/main/java/act/event/EventBus.java @@ -1339,7 +1339,7 @@ private void callOn(final T event, List jobList; Job parent; + boolean sysJob; LockableJobList(Job parent) { this.jobList = new ArrayList<>(); this.parent = parent; + this.sysJob = null != parent && parent.sysJob; + } + + void markAsSysJob() { + this.sysJob = true; + for (Job job : jobList) { + job.markAsSysJob(); + } } synchronized void clear() { @@ -67,10 +76,13 @@ synchronized Job add(Job thatJob) { thatJob.setOneTime(); } if (parent.done() || iterating) { - parent.manager.now(thatJob); + parent.manager.now(thatJob, sysJob); return parent; } jobList.add(thatJob); + if (sysJob) { + thatJob.markAsSysJob(); + } // Note we can't do this otherwise route registration // process will be broken // - Collections.sort(jobList, Sorter.COMPARATOR); @@ -95,7 +107,7 @@ synchronized void runSubJobs(boolean async) { public void run() { subJob.run(); } - }); + }, subJob.sysJob); } else { subJob.run(); if (Act.isDev() && subJob.app.hasBlockIssue()) { @@ -128,6 +140,7 @@ public void run() { Object callableResult; Exception callableException; private Method method; + private boolean sysJob; // progress percentage private SimpleProgressGauge progress = new SimpleProgressGauge(); private LockableJobList parallelJobs = new LockableJobList(this); @@ -137,12 +150,22 @@ public void run() { private Job(String id) { this.id = id; this.jobProgressTag = wsJobProgressTag(id); + if (JobManager.isSysJob(this)) { + markAsSysJob(); + } } Job(String id, JobManager manager) { this(id, manager, ($.Func0)null); } + Job(String id, boolean sysJob, JobManager manager) { + this(id, manager, ($.Func0) null); + if (sysJob) { + markAsSysJob(); + } + } + Job(String id, JobManager manager, final Callable callable) { this.id = id; this.manager = $.requireNotNull(manager); @@ -161,6 +184,9 @@ public Object apply() throws NotAppliedException, $.Break { return null; } }; + if (JobManager.isSysJob(this)) { + markAsSysJob(); + } } Job(String id, JobManager manager, $.Func0 worker) { @@ -178,6 +204,9 @@ public Object apply() throws NotAppliedException, $.Break { if (worker instanceof ReflectedJobInvoker) { this.method = ((ReflectedJobInvoker) worker).method(); } + if (JobManager.isSysJob(this)) { + markAsSysJob(); + } } Job(String id, JobManager manager, $.Function worker) { @@ -193,6 +222,9 @@ public Object apply() throws NotAppliedException, $.Break { this.app = manager.app(); this.jobProgressTag = wsJobProgressTag(id); this.manager.addJob(this); + if (JobManager.isSysJob(this)) { + markAsSysJob(); + } } public void setProgressGauge(ProgressGauge progressGauge) { @@ -229,6 +261,17 @@ protected String brief() { return S.concat("job[", id, "]\none time job:", S.string(oneTime), "\ntrigger:", S.string(trigger)); } + void markAsSysJob() { + this.sysJob = true; + this.parallelJobs.markAsSysJob(); + this.followingJobs.markAsSysJob(); + this.precedenceJobs.markAsSysJob(); + } + + boolean isSysJob() { + return sysJob; + } + @Override public String toString() { S.Buffer sb = S.buffer(brief()); @@ -286,8 +329,11 @@ public void run() { invokeParallelJobs(); runPrecedenceJobs(); try { - if (Act.isDev() && app.isStarted()) { - app.checkUpdates(false); + if (Act.isDev() && app.isStarted() && !sysJob) { + if (app.checkUpdates(false)) { + // app reloaded + return; + } } doJob(); } catch (Throwable e) { diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 19c905983..23dd03834 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -45,6 +45,8 @@ public class JobManager extends AppServiceBase { + public static final String SYS_JOB_MARKER = "__act_sys__"; + private static final Logger LOGGER = LogManager.get(JobManager.class); private ScheduledThreadPoolExecutor executor; @@ -53,7 +55,7 @@ public class JobManager extends AppServiceBase { private ConcurrentMap scheduled = new ConcurrentHashMap<>(); static String sysEventJobId(SysEventId eventId) { - return S.concat("__act_sys__", eventId.toString().toLowerCase()); + return S.concat(SYS_JOB_MARKER, eventId.toString().toLowerCase()); } public JobManager(App app) { @@ -93,12 +95,24 @@ public T call() throws Exception { }); } + public void now(Job job) { + now(job, job.isSysJob()); + } + public void now(Runnable runnable) { - now(randomJobId(), runnable); + now(runnable, false); + } + + public void now(Runnable runnable, boolean sysJob) { + now(randomJobId(), runnable, sysJob); } public void now(String jobId, Runnable runnable) { - executor().submit(wrap(jobId, runnable)); + now(jobId, runnable, false); + } + + public void now(String jobId, Runnable runnable, boolean sysJob) { + executor().submit(wrap(jobId, runnable, sysJob)); } public String now($.Function worker) { @@ -420,7 +434,7 @@ private void initExecutor(App app) { private void createSysEventListener(SysEventId sysEventId) { String jobId = sysEventJobId(sysEventId); - Job job = new Job(jobId, this); + Job job = new Job(jobId, true, this); app().eventBus().bind(sysEventId, new _SysEventListener(jobId, job)); } @@ -445,11 +459,15 @@ protected void releaseResources() { } private Job wrap(Runnable runnable) { - return new ContextualJob(randomJobId(), runnable); + return wrap(randomJobId(), runnable, false); } - private Job wrap(String name, Runnable runnable) { - return new ContextualJob(name, runnable); + private Job wrap(String name, Runnable runnable, boolean sysJob) { + Job job = new ContextualJob(name, runnable); + if (sysJob) { + job.markAsSysJob(); + } + return job; } private Job wrap(Callable callable) { @@ -523,4 +541,8 @@ private String randomJobId() { return app().cuid() + S.random(4); } + static boolean isSysJob(Job job) { + return S.is(job.id()).startsWith(SYS_JOB_MARKER); + } + } From df5ab6eaab0556525337a9abf33c9ca9893769aa Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 18 Nov 2018 12:29:19 +1100 Subject: [PATCH 242/730] False warning message on DB configuration #953 --- CHANGELOG.md | 1 + src/main/java/act/app/DbServiceManager.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0b451b9d..54d795f10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* False warning message on DB configuration #953 * CLI session shall not time out when it is reporting async job progress #952 * `NullPointerException` invoking `job.list` command #950 * Allow it to turn on/off handler trace while app is running #949 diff --git a/src/main/java/act/app/DbServiceManager.java b/src/main/java/act/app/DbServiceManager.java index 3ef83643e..077e99f29 100644 --- a/src/main/java/act/app/DbServiceManager.java +++ b/src/main/java/act/app/DbServiceManager.java @@ -250,7 +250,7 @@ private void initServices(AppConfig config) { if (null == db) { logger.warn("DB service not initialized: need to specify default db service implementation"); } else { - logger.warn("DB configuration not found. Will try to init default service with the sole db plugin: %s", db); + logger.info("Init default service with the sole db plugin: %s", db); Map svcConf = new HashMap<>(); String prefix = "db."; for (String key : dbConf.keySet()) { From 361297d82ad7cfab2308572d72979ee4ad9223b1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 18 Nov 2018 18:42:39 +1100 Subject: [PATCH 243/730] If interceptor is disabled then it shall not return `404` #955 --- CHANGELOG.md | 2 +- .../builtin/controller/impl/ReflectedHandlerInvoker.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54d795f10..a4b00538a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,12 @@ # ActFramework Change Log **1.8.12** +* If interceptor is disabled then it shall not return `404` #955 * False warning message on DB configuration #953 * CLI session shall not time out when it is reporting async job progress #952 * `NullPointerException` invoking `job.list` command #950 * Allow it to turn on/off handler trace while app is running #949 * execute `route.list` command causes `NullPointerException` #948 -* Issue with loading configuration into Map #946 * `NullPointerException` when calling `$.convert(str).to(DateTime.class)` in Job #947 * Output enhanced asm code when `java.lang.VerifyError` encountered #945 * `UnexpectedException` with `Controller.Util.download(URL)` call #944 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 10711ff2e..af33504ff 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -20,6 +20,8 @@ * #L% */ +import static act.app.ActionContext.State.INTERCEPTING; + import act.Act; import act.Trace; import act.annotations.*; @@ -484,6 +486,9 @@ public MissingAuthenticationHandler csrfFailureHandler() { public Result handle(final ActionContext context) { if (disabled) { + if (INTERCEPTING == context.state()) { + return null; + } return ActNotFound.get(); } From ca61bef2498c94ed8cd1a7b946a41bfcfd86ac14 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 19 Nov 2018 21:28:40 +1100 Subject: [PATCH 244/730] The `/~/job/progress` ws endpoint does not work #956; update osgl-tool to 1.18.1; update fastjson to 1.2.52 --- CHANGELOG.md | 1 + pom.xml | 4 ++-- src/main/java/act/job/JobAdmin.java | 12 ++++-------- src/main/java/act/job/JobManager.java | 2 +- src/main/resources/act.scan.list | 2 +- 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4b00538a..1aba8d70c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* The `/~/job/progress` ws endpoint does not work #956 * If interceptor is disabled then it shall not return `404` #955 * False warning message on DB configuration #953 * CLI session shall not time out when it is reporting async job progress #952 diff --git a/pom.xml b/pom.xml index 03a7cd92f..bf87ab3e1 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2 1.3.3 4.6.1 - 1.2.47 + 1.2.52 1.1.2 0.7 1.16 @@ -63,7 +63,7 @@ 2.10.1 1.11.3 3.10.0 - 1.18.1-SNAPSHOT + 1.18.1 1.5.0 1.9.0 1.9.0 diff --git a/src/main/java/act/job/JobAdmin.java b/src/main/java/act/job/JobAdmin.java index 3fe8a26ca..961fa00f6 100644 --- a/src/main/java/act/job/JobAdmin.java +++ b/src/main/java/act/job/JobAdmin.java @@ -23,21 +23,17 @@ import act.cli.*; import act.event.OnEvent; import act.util.JsonView; -import act.util.PropertySpec; -import act.util.SimpleProgressGauge; -import act.ws.WebSocketConnectEvent; -import act.ws.WebSocketConnectionManager; -import act.ws.WebSocketContext; -import act.ws.WsEndpoint; +import act.util.*; +import act.ws.*; import com.alibaba.fastjson.JSONObject; import org.osgl.$; import org.osgl.util.C; import org.osgl.util.S; -import javax.inject.Inject; import java.util.Comparator; import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; +import javax.inject.Inject; /** * Provide admin service to act {@link JobManager} @@ -107,7 +103,7 @@ public String getSchedulerStatus(JobManager jobManager) { public static class WebsocketEndpoints { - @WsEndpoint("/~/job/{id}/progress") + @WsEndpoint("/~/job/progress") public static class JobProgress { @Inject diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 23dd03834..99d25c392 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -538,7 +538,7 @@ public boolean tryHandle(MailerContext.InitEvent event) throws Exception { } private String randomJobId() { - return app().cuid() + S.random(4); + return app().cuid() + S.urlSafeRandom(2); } static boolean isSysJob(Job job) { diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index ee6128d09..f4dd203d9 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -33,4 +33,4 @@ act.Zen act.apidoc.Endpoint.Service org.osgl.util.FastJsonKvCodec act.ws.WebSocketAdminConsole -act.job.JobAdmin.WebsocketEndpoints.JobProgress +act.job.JobAdmin$WebsocketEndpoints$JobProgress From b5efac4568476cf490e71c450583d16b7011e1a8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 20 Nov 2018 08:45:41 +1100 Subject: [PATCH 245/730] Change ws endpoint for job progress status, add GET endpoint for job progress checking #957 --- CHANGELOG.md | 1 + legacy-testapp/pom.xml | 2 +- src/main/java/act/app/AppClassLoader.java | 8 ++-- src/main/java/act/job/JobAdmin.java | 35 +++++++++------ .../java/act/util/SimpleProgressGauge.java | 43 +++++++++++++++++++ src/main/resources/act.scan.list | 3 +- src/test/java/act/test/util/FuncTest.java | 6 +-- testapps/ResourceLoaderTest/pom.xml | 6 +-- 8 files changed, 78 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1aba8d70c..0c597ed4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.12** +* Change ws endpoint for job progress status, add GET endpoint for job progress checking #957 * The `/~/job/progress` ws endpoint does not work #956 * If interceptor is disabled then it shall not return `404` #955 * False warning message on DB configuration #953 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 6c6c0c251..6411cfaed 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.11-SNAPSHOT + 1.8.12-SNAPSHOT [0.13.0, 2.0.0) 1.6.2 testapp.TestApp diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index 3b817181b..0f851afb4 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -214,10 +214,10 @@ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundE return c; } - // ensure we can enhance the act classes specified below - if (name.startsWith("act.") && name.endsWith("Admin")) { - return super.loadClass(name, resolve); - } +// // ensure we can enhance the act classes specified below +// if (name.startsWith("act.") && name.endsWith("Admin")) { +// return super.loadClass(name, resolve); +// } c = loadAppClass(name, resolve); diff --git a/src/main/java/act/job/JobAdmin.java b/src/main/java/act/job/JobAdmin.java index 961fa00f6..9c397e617 100644 --- a/src/main/java/act/job/JobAdmin.java +++ b/src/main/java/act/job/JobAdmin.java @@ -27,6 +27,7 @@ import act.ws.*; import com.alibaba.fastjson.JSONObject; import org.osgl.$; +import org.osgl.mvc.annotation.GetAction; import org.osgl.util.C; import org.osgl.util.S; @@ -101,22 +102,28 @@ public String getSchedulerStatus(JobManager jobManager) { return json.toJSONString(); } - public static class WebsocketEndpoints { - - @WsEndpoint("/~/job/progress") - public static class JobProgress { + @GetAction("jobs/{id}/progress") + public ProgressGauge jobProgress(String id, JobManager jobManager) { + Job job = jobManager.jobById(id); + if (null == job) { + return SimpleProgressGauge.NULL; + } + ProgressGauge gauge = job.progress(); + return null == gauge ? SimpleProgressGauge.NULL : gauge; + } - @Inject - private WebSocketConnectionManager connectionManager; + @WsEndpoint("/~/ws/jobs/{id}/progress") + public static class WsProgress { + @Inject + private WebSocketConnectionManager connectionManager; - @OnEvent - public void onConnect(WebSocketConnectEvent event) { - WebSocketContext context = event.source(); - String jobId = context.actionContext().paramVal("id"); - String tag = SimpleProgressGauge.wsJobProgressTag(jobId); - connectionManager.subscribe(context.actionContext().session(), tag); - } + @OnEvent + public void onConnect(WebSocketConnectEvent event) { + WebSocketContext context = event.source(); + String jobId = context.actionContext().paramVal("id"); + String tag = SimpleProgressGauge.wsJobProgressTag(jobId); + connectionManager.subscribe(context.actionContext().session(), tag); } - } + } diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java index 70ecd63fe..34c6908f2 100644 --- a/src/main/java/act/util/SimpleProgressGauge.java +++ b/src/main/java/act/util/SimpleProgressGauge.java @@ -29,12 +29,55 @@ public class SimpleProgressGauge extends DestroyableBase implements ProgressGauge { + public static final ProgressGauge NULL = new SimpleProgressGauge(100, -1) { + + @Override + public void addListener(Listener listener) { + E.unsupport(); + } + + @Override + public void updateMaxHint(int maxHint) { + E.unsupport(); + } + + @Override + public void step() { + E.unsupport(); + } + + @Override + public void stepBy(int steps) { + E.unsupport(); + } + + @Override + public void stepTo(int steps) { + E.unsupport(); + } + + @Override + public void setId(String id) { + E.unsupport(); + } + + @Override + public void markAsDone() { + E.unsupport(); + } + }; + private String id; private int maxHint; private int currentSteps; private ProgressGauge delegate; private List listeners = new ArrayList<>(); + private SimpleProgressGauge(int maxHint, int currentSteps) { + this.maxHint = maxHint; + this.currentSteps = currentSteps; + } + private SimpleProgressGauge(ProgressGauge delegate) { this.delegate = $.requireNotNull(delegate); } diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index f4dd203d9..429c2c931 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -33,4 +33,5 @@ act.Zen act.apidoc.Endpoint.Service org.osgl.util.FastJsonKvCodec act.ws.WebSocketAdminConsole -act.job.JobAdmin$WebsocketEndpoints$JobProgress +act.job.JobAdmin +act.job.JobAdmin$WsProgress diff --git a/src/test/java/act/test/util/FuncTest.java b/src/test/java/act/test/util/FuncTest.java index 7004f080e..f31801455 100644 --- a/src/test/java/act/test/util/FuncTest.java +++ b/src/test/java/act/test/util/FuncTest.java @@ -202,7 +202,7 @@ public void testNow() { Object obj = func.apply(); yes(obj instanceof DateTime); DateTime funcNow = (DateTime) obj; - yes((DateTime.now().getMillis() - funcNow.getMillis()) < 1000); + yes((DateTime.now().getMillis() - funcNow.getMillis()) < 2000); } @Test @@ -211,7 +211,7 @@ public void testNextMinute() { Object obj = func.apply(); yes(obj instanceof DateTime); DateTime funcNow = (DateTime) obj; - yes((DateTime.now().plusMinutes(1).getMillis() - funcNow.getMillis()) < 1000); + yes((DateTime.now().plusMinutes(1).getMillis() - funcNow.getMillis()) < 2000); } @@ -221,7 +221,7 @@ public void testNextHour() { Object obj = func.apply(); yes(obj instanceof DateTime); DateTime funcNow = (DateTime) obj; - yes((DateTime.now().plusHours(1).getMillis() - funcNow.getMillis()) < 1000); + yes((DateTime.now().plusHours(1).getMillis() - funcNow.getMillis()) < 2000); } } diff --git a/testapps/ResourceLoaderTest/pom.xml b/testapps/ResourceLoaderTest/pom.xml index ce715dcff..de6619a2a 100644 --- a/testapps/ResourceLoaderTest/pom.xml +++ b/testapps/ResourceLoaderTest/pom.xml @@ -5,14 +5,14 @@ 4.0.0 act-resourceloader-test - 1.8.8.8-SNAPSHOT + 1.8.11.0 ActFramework ResourceLoader Test App org.actframework act-starter-parent - 1.8.8.9-SNAPSHOT + 1.8.11.0 @@ -30,7 +30,7 @@ org.actframework act - 1.8.11-SNAPSHOT + 1.8.12-SNAPSHOT From 174ec7cc1940b2a1caf9304bb8fe9d22f2ef5fcf Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 20 Nov 2018 08:47:38 +1100 Subject: [PATCH 246/730] [maven-release-plugin] prepare release act-1.8.12 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bf87ab3e1..084493d2c 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.12-SNAPSHOT + 1.8.12 ACT Framework The ACT full stack MVC framework From e57ea169d8ec05ec5479f4c0010b708821120f1a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 20 Nov 2018 08:47:53 +1100 Subject: [PATCH 247/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 084493d2c..d1a3e9ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.12 + 1.8.13-SNAPSHOT ACT Framework The ACT full stack MVC framework From f29be33b8bd1c9c0f6e54d8e0dafaeb8ca0ae9e2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 20 Nov 2018 11:37:52 +1100 Subject: [PATCH 248/730] update VERSION MATRIX and README for 1.8.12 --- README.md | 10 +++++----- VERSION_MATRIX.md | 40 +++++++++++++++++++-------------------- testapps/GHIssues/pom.xml | 9 ++------- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index c244dfbc7..a94c3cbb0 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.11.0 + 1.8.12.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.11.0 + -DarchetypeVersion=1.8.12.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.11.0 + -DarchetypeVersion=1.8.12.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.11.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.12.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.11.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.12.0 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 926b55170..5066de4ff 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,25 +1,25 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.11 | -| --- | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.2 | -| beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | 1.4.5 | -| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | 1.5.4 | -| ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.3 | 1.7.4 | -| ebean(java8) | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.3 | 1.7.4 | -| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | -| excel | 1.3.x | 1.4.x | 1.4.3 | 1.5.0 | 1.5.0 | -| freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.6 | 1.3.6 | -| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | -| jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.5 | 1.0.5 | -| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | -| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | 1.6.3 | -| mustache(java8) | 1.3.x | 1.4.0 | 1.4.2 | 1.4.5 | 1.4.5 | -| social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.5 | 0.12.5 | -| sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.3 | 1.4.4 | -| storage(java8) | 0.12.x | 0.13.0 | 0.13.2 | 0.13.5 | 0.13.5 | -| thymeleaf | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | -| velocity | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | +| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.11 | 1.8.12 | +| --- | ----: | ----: | ----: | ----: | ----: | ----: | +| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.2 | 1.5.2 | +| beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | 1.4.5 | 1.4.6 | +| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | 1.5.4 | 1.5.5 | +| ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.3 | 1.7.4 | 1.7.5 | +| ebean(java8) | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.3 | 1.7.4 | 1.7.5 | +| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | 1.5.4 | +| excel | 1.3.x | 1.4.x | 1.4.3 | 1.5.0 | 1.5.0 | 1.5.0 | +| freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.6 | 1.3.6 | 1.3.6 | +| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | 1.5.3 | +| jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.5 | 1.0.5 | 1.0.5 | +| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | 1.5.3 | +| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | 1.6.3 | 1.6.4 | +| mustache(java8) | 1.3.x | 1.4.0 | 1.4.2 | 1.4.5 | 1.4.5 | 1.4.5 | +| social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.5 | 0.12.5 | 0.12.5 | +| sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.3 | 1.4.4 | 1.4.4 | +| storage(java8) | 0.12.x | 0.13.0 | 0.13.2 | 0.13.5 | 0.13.5 | 0.13.5 | +| thymeleaf | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | +| velocity | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | ## Note diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index e2c9389a6..496affabd 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -5,14 +5,14 @@ 4.0.0 act-ghissues - 1.8.8.8 + 1.8.12.0 ActFramework Github Issue Reproduce App org.actframework act-starter-parent - 1.8.11.0 + 1.8.12.0-SNAPSHOT @@ -36,11 +36,6 @@ hutool-all [4.1.12,) - - org.actframework - act - 1.8.12-SNAPSHOT - From 866bec8c6059dd1dd86b33a3121bf0f98846a0c2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 21 Nov 2018 21:04:30 +1100 Subject: [PATCH 249/730] WIP --- CHANGELOG.md | 5 ++- src/main/java/act/ws/WsConnectionHandler.java | 33 +++++++++++++++++++ src/test/java/act/route/RouterTest.java | 11 +++++-- 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 src/main/java/act/ws/WsConnectionHandler.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c597ed4b..8e124ac35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log -**1.8.12** +**1.8.13** +* Provides a mechanism for accurate routing ws connection event to user defined connection handler #961 + +**1.8.12** 20/Nov/2018 * Change ws endpoint for job progress status, add GET endpoint for job progress checking #957 * The `/~/job/progress` ws endpoint does not work #956 * If interceptor is disabled then it shall not return `404` #955 diff --git a/src/main/java/act/ws/WsConnectionHandler.java b/src/main/java/act/ws/WsConnectionHandler.java new file mode 100644 index 000000000..f5758535c --- /dev/null +++ b/src/main/java/act/ws/WsConnectionHandler.java @@ -0,0 +1,33 @@ +package act.ws; + +import act.util.LogSupportedDestroyableBase; + +import java.util.ArrayList; +import java.util.List; +import javax.inject.Singleton; + +/** + * The implementation of this interface will be registered automatically + * and called when a websocket connection is established. + * + * Note if the implementation class is annotated with {@link WsEndpoint} + * then it will match the URL path specified in `WsEndpoint` with the + * current websocket connection URL. In case there is no URL setting in + * the `WsEndpoint` then it will receive call on websocket connect event + * of any URL path + */ +public interface WsConnectionHandler { + + /** + * Implement this method to process websocket connection. + * + * @param context the web socket context + */ + void handleConnection(WebSocketContext context); + + @Singleton + class Manager extends LogSupportedDestroyableBase { + private List freeHandlers = new ArrayList<>(); + private Map + } +} diff --git a/src/test/java/act/route/RouterTest.java b/src/test/java/act/route/RouterTest.java index 49ab07271..7748c3b0e 100644 --- a/src/test/java/act/route/RouterTest.java +++ b/src/test/java/act/route/RouterTest.java @@ -105,19 +105,26 @@ public void testGH561_extended3() { } @Test - public void testGH393_1() { + public void testGH939_1() { router.addMapping(GET, "/foo/~FooBar~", controller, RouteSource.ACTION_ANNOTATION); router.getInvoker(GET, "/foo/foo-bar", ctx).handle(ctx); controllerInvoked(); } @Test - public void testGH393_2() { + public void testGH939_2() { router.addMapping(GET, "/foo/~FooBar~/{x}", controller, RouteSource.ACTION_ANNOTATION); router.getInvoker(GET, "/foo/foo-bar/xyz", ctx).handle(ctx); controllerInvoked(); } + @Test + public void testGH958() { + router.addMapping(GET, "/foo/~FooBar~/x", controller, RouteSource.ACTION_ANNOTATION); + router.getInvoker(GET, "/foo/foo-bar/x", ctx).handle(ctx); + controllerInvoked(); + } + @Test public void searchRoot() { router.addMapping(GET, "/", controller); From 27a0d4b6c1cc2e8ea6ab72b351ed05d65c550e20 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 21 Nov 2018 21:08:53 +1100 Subject: [PATCH 250/730] temp workaround for #959 - will be overwritten once #961 is done --- CHANGELOG.md | 5 ++++- src/main/java/act/job/JobAdmin.java | 12 ++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c597ed4b..fcfe02ccb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log -**1.8.12** +**1.8.13** +* Issue with using `WebSocketConnectEvent` to call websocket connection handler #959 + +**1.8.12** 20/Nov/2018 * Change ws endpoint for job progress status, add GET endpoint for job progress checking #957 * The `/~/job/progress` ws endpoint does not work #956 * If interceptor is disabled then it shall not return `404` #955 diff --git a/src/main/java/act/job/JobAdmin.java b/src/main/java/act/job/JobAdmin.java index 9c397e617..59c183bff 100644 --- a/src/main/java/act/job/JobAdmin.java +++ b/src/main/java/act/job/JobAdmin.java @@ -112,7 +112,7 @@ public ProgressGauge jobProgress(String id, JobManager jobManager) { return null == gauge ? SimpleProgressGauge.NULL : gauge; } - @WsEndpoint("/~/ws/jobs/{id}/progress") + @WsEndpoint("/~/ws/jobs/{jobId}/progress") public static class WsProgress { @Inject private WebSocketConnectionManager connectionManager; @@ -120,7 +120,15 @@ public static class WsProgress { @OnEvent public void onConnect(WebSocketConnectEvent event) { WebSocketContext context = event.source(); - String jobId = context.actionContext().paramVal("id"); + String url = context.url(); + if (!url.startsWith("/~/ws/jobs/") && !url.endsWith("/progress") && !context.actionContext().isPathVar("jobId")) { + // not my cup of tea + return; + } + String jobId = context.actionContext().paramVal("jobId"); + if (null == jobId) { + return; + } String tag = SimpleProgressGauge.wsJobProgressTag(jobId); connectionManager.subscribe(context.actionContext().session(), tag); } From 96118554a2d2b181e0d9138a4c4e208876d56710 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 22 Nov 2018 08:20:07 +1100 Subject: [PATCH 251/730] `WebsocketConnectionRegistry` - provide method to remove key #962 --- CHANGELOG.md | 1 + src/main/java/act/ws/WebSocketConnectionRegistry.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcfe02ccb..a2cb1de5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.13** +* `WebsocketConnectionRegistry` - provide method to remove key #962 * Issue with using `WebSocketConnectEvent` to call websocket connection handler #959 **1.8.12** 20/Nov/2018 diff --git a/src/main/java/act/ws/WebSocketConnectionRegistry.java b/src/main/java/act/ws/WebSocketConnectionRegistry.java index d64c7a65b..19bdfd117 100644 --- a/src/main/java/act/ws/WebSocketConnectionRegistry.java +++ b/src/main/java/act/ws/WebSocketConnectionRegistry.java @@ -47,6 +47,14 @@ public List get(String key) { return retList; } + /** + * Remove all connection associations to `key`. + * @param key the key to be removed from the registry + */ + public void removeAll(String key) { + registry.remove(key); + } + /** * Accept a visitor to iterate through the connections attached to the key specified * From b4b0d17e83dc3f730324830eefd2daeeb75a8112 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 22 Nov 2018 22:09:44 +1100 Subject: [PATCH 252/730] Provide a mechanism to handle async process result #960 --- CHANGELOG.md | 1 + src/main/java/act/cli/CliContext.java | 7 ++++ .../bytecode/ReflectedCommandExecutor.java | 12 ++++--- .../impl/ReflectedHandlerInvoker.java | 32 ++++++++++++------- src/main/java/act/job/JobAdmin.java | 6 ++++ src/main/java/act/job/JobManager.java | 24 +++++++++++++- src/main/java/act/util/ProgressGauge.java | 10 ++++++ .../java/act/util/SimpleProgressGauge.java | 1 + 8 files changed, 76 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2cb1de5e..c1a71c0b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.13** +* Provide a mechanism to handle async process result #960 * `WebsocketConnectionRegistry` - provide method to remove key #962 * Issue with using `WebSocketConnectEvent` to call websocket connection handler #959 diff --git a/src/main/java/act/cli/CliContext.java b/src/main/java/act/cli/CliContext.java index a04eff682..57e5aff80 100644 --- a/src/main/java/act/cli/CliContext.java +++ b/src/main/java/act/cli/CliContext.java @@ -22,6 +22,7 @@ import static act.cli.ReportProgress.Type.BAR; +import act.Act; import act.app.App; import act.cli.ascii_table.ASCIITableHeader; import act.cli.ascii_table.impl.SimpleASCIITableImpl; @@ -31,7 +32,9 @@ import act.cli.builtin.Help; import act.cli.util.CommandLineParser; import act.handler.CliHandler; +import act.job.JobManager; import act.util.*; +import com.alibaba.fastjson.JSON; import jline.console.ConsoleReader; import me.tongfei.progressbar.ProgressBar; import me.tongfei.progressbar.ProgressBarStyle; @@ -347,6 +350,10 @@ public void print(ProgressGauge progressGauge) { } else { printText(progressGauge); } + Object o = Act.getInstance(JobManager.class).cachedResult(progressGauge.getId()); + if (null != o) { + println(JSON.toJSONString(o)); + } } finally { inProgress = false; } diff --git a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java index 9cfcdbc01..b6288e628 100644 --- a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java +++ b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java @@ -126,20 +126,24 @@ public Object execute(CliContext context) { final Object cmd = commanderInstance(context); final Object[] params = params(cmd, context); if (async) { - JobManager jobManager = context.app().jobManager(); - String jobId = jobManager.prepare(new TrackableWorker() { + final JobManager jobManager = context.app().jobManager(); + final String jobId = app.cuid(); + jobManager.prepare(jobId, new TrackableWorker() { @Override protected void run(ProgressGauge progressGauge) { - invoke(cmd, params); + Object o = invoke(cmd, params); + jobManager.cacheResult(jobId, o); } }); context.setJobId(jobId); jobManager.now(jobId); + String message = "Async job started: " + jobId; if (null != reportProgress) { + context.println(message); context.attribute(ReportProgress.CTX_ATTR_KEY, reportProgress); return context.progress(); } else { - return "Async job started: " + jobId; + return message; } } return invoke(cmd, params); diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index af33504ff..c0fb7fc85 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -628,12 +628,14 @@ public Result handle(final ActionContext context) { } if (async) { - JobManager jobManager = context.app().jobManager(); - String jobId = jobManager.prepare(new TrackableWorker() { + final JobManager jobManager = context.app().jobManager(); + final String jobId = app.cuid(); + jobManager.prepare(jobId, new TrackableWorker() { @Override protected void run(ProgressGauge progressGauge) { try { - invoke(handler, context, controller, params); + Object o = invoke(context, controller, params); + jobManager.cacheResult(jobId, o); } catch (Exception e) { warn(e, "Error executing async handler: " + handler); } @@ -988,16 +990,12 @@ private void initOutputVariables() { private Result invoke(M handlerMetaInfo, ActionContext context, Object controller, Object[] params) { Object retVal; String invocationInfo = null; + if (config.traceHandler()) { + invocationInfo = S.fmt("%s(%s)", handlerMetaInfo.fullName(), $.toString2(params)); + Trace.LOGGER_HANDLER.trace(invocationInfo); + } try { - if (config.traceHandler()) { - invocationInfo = S.fmt("%s(%s)", handlerMetaInfo.fullName(), $.toString2(params)); - Trace.LOGGER_HANDLER.trace(invocationInfo); - } - retVal = null == methodAccess ? $.invokeStatic(method, params) : methodAccess.invoke(controller, handlerIndex, params); - if (returnString && context.acceptJson()) { - retVal = null == retVal ? null : ensureValidJson(S.string(retVal)); - } - context.calcResultHashForEtag(retVal); + retVal = invoke(context, controller, params); } catch (Result r) { retVal = r; } catch (Exception e) { @@ -1009,6 +1007,16 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle return transform(retVal, this, context, returnValueAdvice, shallTransformReturnVal, returnIterable); } + private Object invoke(ActionContext context, Object controller, Object[] params) { + Object retVal; + retVal = null == methodAccess ? $.invokeStatic(method, params) : methodAccess.invoke(controller, handlerIndex, params); + if (returnString && context.acceptJson()) { + retVal = null == retVal ? null : ensureValidJson(S.string(retVal)); + } + context.calcResultHashForEtag(retVal); + return retVal; + } + private static Result transform(Object retVal, ReflectedHandlerInvoker invoker, ActionContext context, ReturnValueAdvice returnValueAdvice, boolean transformRetVal, boolean returnIterable) { if (context.resp().isClosed()) { return null; diff --git a/src/main/java/act/job/JobAdmin.java b/src/main/java/act/job/JobAdmin.java index 59c183bff..fd62dce69 100644 --- a/src/main/java/act/job/JobAdmin.java +++ b/src/main/java/act/job/JobAdmin.java @@ -102,6 +102,12 @@ public String getSchedulerStatus(JobManager jobManager) { return json.toJSONString(); } + @GetAction("jobs/{jobId}/result") + @Command(value = "act.job.result", help = "Retrieve async job result") + public Object getAsyncResult(@Required("specify job id") String jobId, JobManager jobManager, ActContext context) { + return jobManager.cachedResult(jobId); + } + @GetAction("jobs/{id}/progress") public ProgressGauge jobProgress(String id, JobManager jobManager) { Job job = jobManager.jobById(id); diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 99d25c392..24c7bdec4 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -20,6 +20,8 @@ * #L% */ +import static act.app.event.SysEventId.APP_CODE_SCANNED; + import act.Act; import act.Destroyable; import act.app.*; @@ -32,6 +34,7 @@ import org.joda.time.DateTime; import org.joda.time.Seconds; import org.osgl.$; +import org.osgl.cache.CacheService; import org.osgl.exception.NotAppliedException; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; @@ -53,17 +56,24 @@ public class JobManager extends AppServiceBase { private ConcurrentMap jobs = new ConcurrentHashMap(); private ConcurrentMap methodIndex = new ConcurrentHashMap<>(); private ConcurrentMap scheduled = new ConcurrentHashMap<>(); + private CacheService jobResultCache; static String sysEventJobId(SysEventId eventId) { return S.concat(SYS_JOB_MARKER, eventId.toString().toLowerCase()); } - public JobManager(App app) { + public JobManager(final App app) { super(app); initExecutor(app); for (SysEventId sysEventId : SysEventId.values()) { createSysEventListener(sysEventId); } + on(APP_CODE_SCANNED, "init-job-result-cache", new Runnable() { + @Override + public void run() { + jobResultCache = app.cache("job_result_cache"); + } + }); } @Override @@ -138,6 +148,10 @@ public String prepare($.Function worker) { return job.id(); } + public void prepare(String jobId, $.Function worker) { + wrap(jobId, worker); + } + /** * Run a job by ID now * @param jobId the job ID @@ -419,6 +433,14 @@ void removeJob(Job job) { } } + public void cacheResult(String jobId, Object result) { + jobResultCache.put("__jr_" + jobId, result, 60); + } + + public Object cachedResult(String jobId) { + return jobResultCache.get("__jr_" + jobId); + } + ScheduledThreadPoolExecutor executor() { return executor; } diff --git a/src/main/java/act/util/ProgressGauge.java b/src/main/java/act/util/ProgressGauge.java index 131eb741a..9579a795f 100644 --- a/src/main/java/act/util/ProgressGauge.java +++ b/src/main/java/act/util/ProgressGauge.java @@ -33,6 +33,16 @@ public interface ProgressGauge { */ void setId(String id); + /** + * Return ID of this gauge. + * + * **Note** the id of the gauge is the same + * with the id of the Job this gauge monitor. + * + * @return the id of the gauge + */ + String getId(); + /** * Update max hint. If the number is negative, then * it indicate the progress is indefinite diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java index 34c6908f2..fd5192edb 100644 --- a/src/main/java/act/util/SimpleProgressGauge.java +++ b/src/main/java/act/util/SimpleProgressGauge.java @@ -177,6 +177,7 @@ public void setId(String id) { this.id = id; } + @Override public String getId() { return id; } From b640f2908e45d46699427398d38c125e0fa41170 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 22 Nov 2018 22:14:26 +1100 Subject: [PATCH 253/730] `ProgressGuage.markAsDone` shall not trigger event if progress is already done #963 --- CHANGELOG.md | 1 + .../java/act/util/SimpleProgressGauge.java | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1a71c0b8..b77afeb3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.13** +* `ProgressGuage.markAsDone` shall not trigger event if progress is already done #963 * Provide a mechanism to handle async process result #960 * `WebsocketConnectionRegistry` - provide method to remove key #962 * Issue with using `WebSocketConnectEvent` to call websocket connection handler #959 diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java index fd5192edb..4790dab49 100644 --- a/src/main/java/act/util/SimpleProgressGauge.java +++ b/src/main/java/act/util/SimpleProgressGauge.java @@ -143,8 +143,10 @@ public void stepTo(int steps) { if (null != delegate) { delegate.stepTo(steps); } else { - currentSteps = steps; - triggerUpdateEvent(); + if (currentSteps != steps) { + currentSteps = steps; + triggerUpdateEvent(); + } } } @@ -186,7 +188,11 @@ public int currentProgressPercent() { if (null != delegate) { return delegate.currentSteps() * 100 / delegate.maxHint(); } - return currentSteps * 100 / maxHint; + int n = currentSteps * 100 / maxHint; + if (100 == n && !isDone()) { + n = 99; + } + return n; } public int getProgressPercent() { @@ -198,12 +204,14 @@ public boolean isDone() { if (null != delegate) { return delegate.isDone(); } - return currentSteps == maxHint; + return currentSteps >= maxHint; } @Override public void markAsDone() { - stepTo(maxHint); + if (!isDone()) { + stepTo(maxHint); + } } private void triggerUpdateEvent() { From eede417ec1b23f86e38cdb0a98da5885879accf1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 23 Nov 2018 22:43:31 +1100 Subject: [PATCH 254/730] Keep decorator setting of async command/request #965 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 1 + src/main/java/act/cli/CliContext.java | 11 ++-- .../bytecode/ReflectedCommandExecutor.java | 2 +- src/main/java/act/cli/view/CliView.java | 2 +- .../handler/builtin/cli/CliHandlerProxy.java | 2 +- .../impl/ReflectedHandlerInvoker.java | 4 +- src/main/java/act/job/JobAdmin.java | 60 ++++++++++++++++++- src/main/java/act/job/JobManager.java | 7 ++- src/main/java/act/util/PropertySpec.java | 22 ++++--- 10 files changed, 92 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b77afeb3b..6264e87b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.13** +* Keep decorator setting of async command/request #965 * `ProgressGuage.markAsDone` shall not trigger event if progress is already done #963 * Provide a mechanism to handle async process result #960 * `WebsocketConnectionRegistry` - provide method to remove key #962 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 0cd049f4f..75042180a 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -1363,6 +1363,7 @@ public void dissolve() { protected void releaseResources() { super.releaseResources(); PropertySpec.current.remove(); + PropertySpec.currentSpec.remove(); if (this.state != State.DESTROYED) { sessionManager = null; this.allParams = null; diff --git a/src/main/java/act/cli/CliContext.java b/src/main/java/act/cli/CliContext.java index 57e5aff80..37a3f0096 100644 --- a/src/main/java/act/cli/CliContext.java +++ b/src/main/java/act/cli/CliContext.java @@ -30,11 +30,11 @@ import act.cli.ascii_table.spec.IASCIITableAware; import act.cli.builtin.Exit; import act.cli.builtin.Help; +import act.cli.meta.CommandMethodMetaInfo; import act.cli.util.CommandLineParser; import act.handler.CliHandler; import act.job.JobManager; import act.util.*; -import com.alibaba.fastjson.JSON; import jline.console.ConsoleReader; import me.tongfei.progressbar.ProgressBar; import me.tongfei.progressbar.ProgressBarStyle; @@ -337,7 +337,7 @@ public boolean disconnected() { return pw.checkError(); } - public void print(ProgressGauge progressGauge) { + public void print(CommandMethodMetaInfo methodMetaInfo, ProgressGauge progressGauge) { ReportProgress reportProgress = attribute(ReportProgress.CTX_ATTR_KEY); if (null == reportProgress) { reportProgress = org.osgl.inject.util.AnnotationUtil.createAnnotation(ReportProgress.class); @@ -350,9 +350,10 @@ public void print(ProgressGauge progressGauge) { } else { printText(progressGauge); } - Object o = Act.getInstance(JobManager.class).cachedResult(progressGauge.getId()); - if (null != o) { - println(JSON.toJSONString(o)); + Object result = Act.getInstance(JobManager.class).cachedResult(progressGauge.getId()); + if (null != result) { + PropertySpec.MetaInfo filter = methodMetaInfo.propertySpec(); + methodMetaInfo.view().print(result, filter, this); } } finally { inProgress = false; diff --git a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java index b6288e628..1f69ab557 100644 --- a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java +++ b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java @@ -132,7 +132,7 @@ public Object execute(CliContext context) { @Override protected void run(ProgressGauge progressGauge) { Object o = invoke(cmd, params); - jobManager.cacheResult(jobId, o); + jobManager.cacheResult(jobId, o, methodMetaInfo); } }); context.setJobId(jobId); diff --git a/src/main/java/act/cli/view/CliView.java b/src/main/java/act/cli/view/CliView.java index 1172faa6b..783826073 100644 --- a/src/main/java/act/cli/view/CliView.java +++ b/src/main/java/act/cli/view/CliView.java @@ -247,7 +247,7 @@ public void remove() { if (outputFields.isEmpty()) { return; } - IO.write(buildHeaderLine(outputFields, spec.labelMapping()), writer); + IO.write(buildHeaderLine(outputFields, spec.labelMapping(context)), writer); IO.write($.OS.lineSeparator(), writer); IO.write(buildDataLine(firstElement, outputFields), writer); while (iterator.hasNext()) { diff --git a/src/main/java/act/handler/builtin/cli/CliHandlerProxy.java b/src/main/java/act/handler/builtin/cli/CliHandlerProxy.java index 97281e2bc..98d2ccbf7 100644 --- a/src/main/java/act/handler/builtin/cli/CliHandlerProxy.java +++ b/src/main/java/act/handler/builtin/cli/CliHandlerProxy.java @@ -116,7 +116,7 @@ private void onResult(Object result, CliContext context) { return; } if (result instanceof ProgressGauge) { - context.print((ProgressGauge) result); + context.print(methodMetaInfo, (ProgressGauge) result); } else { PropertySpec.MetaInfo filter = methodMetaInfo.propertySpec(); methodMetaInfo.view().print(result, filter, context); diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index c0fb7fc85..3f33b5801 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -635,9 +635,9 @@ public Result handle(final ActionContext context) { protected void run(ProgressGauge progressGauge) { try { Object o = invoke(context, controller, params); - jobManager.cacheResult(jobId, o); + jobManager.cacheResult(jobId, o, method); } catch (Exception e) { - warn(e, "Error executing async handler: " + handler); + warn(e, "Error executing async handler: " + method); } } }); diff --git a/src/main/java/act/job/JobAdmin.java b/src/main/java/act/job/JobAdmin.java index fd62dce69..026ed85f2 100644 --- a/src/main/java/act/job/JobAdmin.java +++ b/src/main/java/act/job/JobAdmin.java @@ -21,16 +21,23 @@ */ import act.cli.*; +import act.cli.meta.CommandMethodMetaInfo; import act.event.OnEvent; +import act.util.CsvView; import act.util.JsonView; import act.util.*; import act.ws.*; import com.alibaba.fastjson.JSONObject; import org.osgl.$; +import org.osgl.exception.UnexpectedException; +import org.osgl.http.H; import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.ResponseContentType; import org.osgl.util.C; import org.osgl.util.S; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; import java.util.Comparator; import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -105,7 +112,58 @@ public String getSchedulerStatus(JobManager jobManager) { @GetAction("jobs/{jobId}/result") @Command(value = "act.job.result", help = "Retrieve async job result") public Object getAsyncResult(@Required("specify job id") String jobId, JobManager jobManager, ActContext context) { - return jobManager.cachedResult(jobId); + Object result = jobManager.cachedResult(jobId); + if (null == result) { + return null; + } + Object meta = jobManager.cachedMeta(jobId); + if (null == meta) { + return result; + } + if (meta instanceof CommandMethodMetaInfo) { + CommandMethodMetaInfo methodMetaInfo = $.cast(meta); + PropertySpec.MetaInfo filter = methodMetaInfo.propertySpec(); + methodMetaInfo.view().print(result, filter, (CliContext) context); + return null; + } + if (meta instanceof Method) { + Method method = $.cast(meta); + PropertySpec spec = method.getAnnotation(PropertySpec.class); + if (null != spec) { + PropertySpec.MetaInfo metaInfo = new PropertySpec.MetaInfo(); + for (String s : spec.value()) { + metaInfo.onValue(s); + } + for (String s : spec.http()) { + metaInfo.onHttp(s); + } + PropertySpec.currentSpec.set(metaInfo); + } + if (isAnnotationPresented(JsonView.class, method)) { + context.accept(H.Format.JSON); + } else if (isAnnotationPresented(CsvView.class, method)) { + context.accept(H.Format.CSS); + } else { + ResponseContentType rct = getAnnotation(ResponseContentType.class, method); + if (null != rct) { + context.accept(rct.value().format()); + } + } + return result; + } + throw new UnexpectedException("Oops! how come? The cached async handler meta is type of " + meta.getClass()); + } + + private boolean isAnnotationPresented(Class annotationClass, Method method) { + return null != getAnnotation(annotationClass, method); + } + + private T getAnnotation(Class annotationClass, Method method) { + T anno = ReflectedInvokerHelper.getAnnotation(annotationClass, method); + if (null != anno) { + return anno; + } + return method.getClass().getAnnotation(annotationClass); } @GetAction("jobs/{id}/progress") diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 24c7bdec4..38ea49e93 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -433,14 +433,19 @@ void removeJob(Job job) { } } - public void cacheResult(String jobId, Object result) { + public void cacheResult(String jobId, Object result, Object meta) { jobResultCache.put("__jr_" + jobId, result, 60); + jobResultCache.put("__jm_" + jobId, meta, 60); } public Object cachedResult(String jobId) { return jobResultCache.get("__jr_" + jobId); } + public Object cachedMeta(String jobId) { + return jobResultCache.get("__jm_" + jobId); + } + ScheduledThreadPoolExecutor executor() { return executor; } diff --git a/src/main/java/act/util/PropertySpec.java b/src/main/java/act/util/PropertySpec.java index d58d90692..82694f1a4 100644 --- a/src/main/java/act/util/PropertySpec.java +++ b/src/main/java/act/util/PropertySpec.java @@ -294,15 +294,20 @@ private Spec spec(ActContext context) { public static MetaInfo withCurrent(MetaInfo builtIn, ActContext context) { MetaInfo retVal = builtIn; - String s = PropertySpec.current.get(); - if (S.notBlank(s)) { - PropertySpec.MetaInfo spec = new PropertySpec.MetaInfo(); - if (context instanceof CliContext) { - spec.onCli(s); - } else { - spec.onHttp(s); - } + MetaInfo spec = currentSpec.get(); + if (null != spec) { retVal = spec; + } else { + String s = PropertySpec.current.get(); + if (S.notBlank(s)) { + spec = new PropertySpec.MetaInfo(); + if (context instanceof CliContext) { + spec.onCli(s); + } else { + spec.onHttp(s); + } + retVal = spec; + } } if (context instanceof ActionContext) { ActionContext actionContext = (ActionContext) context; @@ -318,5 +323,6 @@ public static MetaInfo withCurrent(HandlerMethodMetaInfo methodMetaInfo, ActCont } ThreadLocal current = new ThreadLocal<>(); + ThreadLocal currentSpec = new ThreadLocal<>(); } From 6fd8f2c55da693355811158ba0dd1cf7b85dfd9f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 23 Nov 2018 22:53:01 +1100 Subject: [PATCH 255/730] `@CsvView` and `@TableView` not effective when mark on request handler method --- CHANGELOG.md | 1 + src/main/java/act/cli/CsvView.java | 2 +- src/main/java/act/cli/TableView.java | 19 ++++++++++--------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6264e87b1..747ac6636 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.13** +* `@CsvView` and `@TableView` not effective when mark on request handler method #966 * Keep decorator setting of async command/request #965 * `ProgressGuage.markAsDone` shall not trigger event if progress is already done #963 * Provide a mechanism to handle async process result #960 diff --git a/src/main/java/act/cli/CsvView.java b/src/main/java/act/cli/CsvView.java index efdebdf7a..23a5e461e 100644 --- a/src/main/java/act/cli/CsvView.java +++ b/src/main/java/act/cli/CsvView.java @@ -48,7 +48,7 @@ * @see TableView * @see PropertySpec */ -@Retention(RetentionPolicy.CLASS) +@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Deprecated @Inherited diff --git a/src/main/java/act/cli/TableView.java b/src/main/java/act/cli/TableView.java index 48f7c31d1..5e56cbe3d 100644 --- a/src/main/java/act/cli/TableView.java +++ b/src/main/java/act/cli/TableView.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -35,18 +35,19 @@ * +---------------------------------+---------+---------+ * *

                                                                                                                                                                      - * {@code TableView} can be used in conjunction with {@link PropertySpec} - * to export only specified fields + * {@code TableView} can be used in conjunction with {@link PropertySpec} + * to export only specified fields *

                                                                                                                                                                      *

                                                                                                                                                                      - * Note if a method is marked with neither {@link TableView} nor - * {@link JsonView} then the console will simply use - * {@link Object#toString()} to present the data. + * Note if a method is marked with neither {@link TableView} nor + * {@link act.util.JsonView} then the console will simply use + * {@link Object#toString()} to present the data. *

                                                                                                                                                                      - * @see JsonView + * + * @see act.util.JsonView * @see PropertySpec */ -@Retention(RetentionPolicy.CLASS) +@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface TableView { From 0090c2a89b2bd5bb48437261d39556979385eeda Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 24 Nov 2018 07:30:42 +1100 Subject: [PATCH 256/730] `App.singleton(Xyz.class)` returns `null` value #967 --- CHANGELOG.md | 1 + src/main/java/act/app/SingletonRegistry.java | 21 +++++++++++++++++-- testapps/GHIssues/pom.xml | 5 +++++ .../src/main/java/ghissues/gh967/Test.java | 16 ++++++++++++++ .../main/java/ghissues/gh967/XyzService.java | 11 ++++++++++ .../src/main/resources/test/scenarios/967.yml | 9 ++++++++ 6 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh967/Test.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh967/XyzService.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/967.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 747ac6636..433ceb3cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.13** +* `App.singleton(Xyz.class)` returns `null` value #967 * `@CsvView` and `@TableView` not effective when mark on request handler method #966 * Keep decorator setting of async command/request #965 * `ProgressGuage.markAsDone` shall not trigger event if progress is already done #963 diff --git a/src/main/java/act/app/SingletonRegistry.java b/src/main/java/act/app/SingletonRegistry.java index e42e92c51..a3632f6b8 100644 --- a/src/main/java/act/app/SingletonRegistry.java +++ b/src/main/java/act/app/SingletonRegistry.java @@ -24,10 +24,10 @@ import act.app.event.SysEventId; import org.osgl.$; -import javax.enterprise.context.ApplicationScoped; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import javax.enterprise.context.ApplicationScoped; /** * provides service for app to get singleton instance by type @@ -43,8 +43,16 @@ public class SingletonRegistry extends AppServiceBase { } synchronized void register(final Class singletonClass) { + if (isTraceEnabled()) { + trace("register " + singletonClass); + } if (!batchRegistered) { if (preRegistry.isEmpty()) { + trace("preRegistry is empty"); + if (isTraceEnabled()) { + trace("Add [%s] to preRegistry", singletonClass); + } + preRegistry.put(singletonClass, singletonClass); app().jobManager().on(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED, "register-singleton-instances", new Runnable() { @Override public void run() { @@ -52,13 +60,15 @@ public void run() { } }, true); } - preRegistry.put(singletonClass, singletonClass); } else { register(singletonClass, app().getInstance(singletonClass)); } } public void register(Class singletonClass, Object singleton) { + if (isTraceEnabled()) { + trace("direct register " + singletonClass); + } registry.put(singletonClass, singleton); } @@ -73,9 +83,16 @@ protected void releaseResources() { } private void doRegister() { + boolean traceEnabled = isTraceEnabled(); + if (traceEnabled) { + trace("doRegister"); + } batchRegistered = true; for (Map.Entry, Class> entry: preRegistry.entrySet()) { Class c = entry.getKey(); + if (traceEnabled) { + trace("doRegister on " + c); + } registry.put(c, app().getInstance(c)); } preRegistry.clear(); diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 496affabd..04b76315e 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -23,6 +23,11 @@ + + org.actframework + act + 1.8.13-SNAPSHOT + org.actframework act-excel diff --git a/testapps/GHIssues/src/main/java/ghissues/gh967/Test.java b/testapps/GHIssues/src/main/java/ghissues/gh967/Test.java new file mode 100644 index 000000000..593d62f91 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh967/Test.java @@ -0,0 +1,16 @@ +package ghissues.gh967; + +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("967") +public class Test extends BaseController { + + @GetAction + public String test() { + XyzService svc = XyzService.instance(); + return svc.doService(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh967/XyzService.java b/testapps/GHIssues/src/main/java/ghissues/gh967/XyzService.java new file mode 100644 index 000000000..a8b0d34de --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh967/XyzService.java @@ -0,0 +1,11 @@ +package ghissues.gh967; + +import act.util.SingletonBase; + +public class XyzService extends SingletonBase { + + public String doService() { + return "xyz"; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/967.yml b/testapps/GHIssues/src/main/resources/test/scenarios/967.yml new file mode 100644 index 000000000..b3041d219 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/967.yml @@ -0,0 +1,9 @@ +Scenario(967): + description: "[GH967] Issue with loading configuration into Map" + interactions: + - description: test + request: + get: 967 + response: + json: + result: xyz From 27eb44712e69e3e4ea9cea50d8f2a5f6a0a74b07 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 24 Nov 2018 07:31:26 +1100 Subject: [PATCH 257/730] act.session.ttl=-1 not take effect when using jwt #968 --- CHANGELOG.md | 1 + src/main/java/act/session/JWT.java | 2 +- testapps/GH968/.gitignore | 19 + testapps/GH968/README.md | 61 ++ testapps/GH968/pom.xml | 31 + testapps/GH968/run_dev | 3 + testapps/GH968/run_dev.bat | 2 + testapps/GH968/run_e2e | 3 + testapps/GH968/run_e2e.bat | 2 + testapps/GH968/run_prod | 10 + .../GH968/src/main/java/test/AppEntry.java | 25 + .../src/main/resources/conf/app.properties | 802 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + testapps/GH968/src/main/resources/logback.xml | 115 +++ .../src/main/resources/test/scenarios.yml | 13 + 16 files changed, 1098 insertions(+), 1 deletion(-) create mode 100644 testapps/GH968/.gitignore create mode 100644 testapps/GH968/README.md create mode 100644 testapps/GH968/pom.xml create mode 100755 testapps/GH968/run_dev create mode 100755 testapps/GH968/run_dev.bat create mode 100755 testapps/GH968/run_e2e create mode 100755 testapps/GH968/run_e2e.bat create mode 100755 testapps/GH968/run_prod create mode 100644 testapps/GH968/src/main/java/test/AppEntry.java create mode 100644 testapps/GH968/src/main/resources/conf/app.properties create mode 100644 testapps/GH968/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH968/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH968/src/main/resources/logback.xml create mode 100644 testapps/GH968/src/main/resources/test/scenarios.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 433ceb3cb..65f73d75b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * Issue with using `WebSocketConnectEvent` to call websocket connection handler #959 **1.8.12** 20/Nov/2018 +* act.session.ttl=-1 not take effect when using jwt #968 * Change ws endpoint for job progress status, add GET endpoint for job progress checking #957 * The `/~/job/progress` ws endpoint does not work #956 * If interceptor is disabled then it shall not return `404` #955 diff --git a/src/main/java/act/session/JWT.java b/src/main/java/act/session/JWT.java index e4866451b..2e4b3faa5 100644 --- a/src/main/java/act/session/JWT.java +++ b/src/main/java/act/session/JWT.java @@ -202,7 +202,7 @@ private boolean verifyIssuer(JSONObject payloads) { private boolean verifyExpires(JSONObject payloads) { Object obj = payloads.get(Payload.EXPIRES_AT.key); - return null != obj && obj instanceof Number && ((Number) obj).longValue() > ($.ms() / 1000); + return null == obj || (obj instanceof Number && ((Number) obj).longValue() > ($.ms() / 1000)); } private boolean verifyArgo(JSONObject headers) { diff --git a/testapps/GH968/.gitignore b/testapps/GH968/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH968/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH968/README.md b/testapps/GH968/README.md new file mode 100644 index 000000000..8132c1838 --- /dev/null +++ b/testapps/GH968/README.md @@ -0,0 +1,61 @@ +# GH919 API doc - it shall support `@Sensitive` annotation + +## Reproduce + +Run `./run_dev`. Once app started it will print error logs like: + +``` +2018-11-03 09:39:00,604 WARN a.j.Job@[jobs-thread-6] - error executing job compile-api-book +com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.2.47, class gh919.AppEntry$Foo + at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:465) + at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:120) + at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:281) + at com.alibaba.fastjson.JSON.toJSONString(JSON.java:591) + at com.alibaba.fastjson.JSON.toJSONString(JSON.java:580) + at com.alibaba.fastjson.JSON.toJSONString(JSON.java:740) + at act.apidoc.Endpoint.generateSampleJson(Endpoint.java:474) + at act.apidoc.Endpoint.explore(Endpoint.java:337) + at act.apidoc.Endpoint.(Endpoint.java:213) + at act.apidoc.ApiManager$2.visit(ApiManager.java:148) + at act.route.Router.visit(Router.java:193) + at act.route.Router.visit(Router.java:199) + at act.route.Router.accept(Router.java:180) + at act.apidoc.ApiManager.load(ApiManager.java:143) + at act.apidoc.ApiManager.load(ApiManager.java:112) + at act.apidoc.ApiManager$1.run(ApiManager.java:84) + at act.job.Job$4.apply(Job.java:394) + at act.job.Job.doJob(Job.java:355) + at act.job.Job.run(Job.java:292) + at act.job.Job$LockableJobList$1.run(Job.java:96) + at act.job.JobManager$ContextualJob$1.apply(JobManager.java:483) + at act.job.Job.doJob(Job.java:355) + at act.job.Job.run(Job.java:292) + at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) + at java.util.concurrent.FutureTask.run(FutureTask.java:266) + at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) + at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) + at java.lang.Thread.run(Thread.java:748) +Caused by: java.lang.reflect.InvocationTargetException: null + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at com.alibaba.fastjson.util.FieldInfo.get(FieldInfo.java:484) + at com.alibaba.fastjson.serializer.FieldSerializer.getPropertyValueDirect(FieldSerializer.java:140) + at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:249) + ... 29 common frames omitted +Caused by: org.osgl.exception.UnexpectedException: java.lang.IllegalArgumentException: contains illegal character for hexBinary: M4yjB9b&SPc5f&!K + at org.osgl.util.E.unexpected(E.java:189) + at org.osgl.util.Crypto.decryptAES(Crypto.java:361) + at act.crypto.AppCrypto.decrypt(AppCrypto.java:135) + at gh919.AppEntry$Foo.getName(AppEntry.java) + ... 36 common frames omitted +Caused by: java.lang.IllegalArgumentException: contains illegal character for hexBinary: M4yjB9b&SPc5f&!K + at javax.xml.bind.DatatypeConverterImpl.parseHexBinary(DatatypeConverterImpl.java:451) + at javax.xml.bind.DatatypeConverter.parseHexBinary(DatatypeConverter.java:357) + at org.osgl.util.Codec.hexStringToByte(Codec.java:220) + at org.osgl.util.Crypto.decryptAES(Crypto.java:345) + ... 38 common frames omitted +``` diff --git a/testapps/GH968/pom.xml b/testapps/GH968/pom.xml new file mode 100644 index 000000000..8e862e81a --- /dev/null +++ b/testapps/GH968/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + act_issues + gh968 + 1.0-SNAPSHOT + + + org.actframework + act-starter-parent + 1.8.12.0 + + + + + 1.8 + test.AppEntry + + + + + org.actframework + act + 1.8.13-SNAPSHOT + + + + diff --git a/testapps/GH968/run_dev b/testapps/GH968/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH968/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH968/run_dev.bat b/testapps/GH968/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH968/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH968/run_e2e b/testapps/GH968/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH968/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH968/run_e2e.bat b/testapps/GH968/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH968/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH968/run_prod b/testapps/GH968/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH968/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH968/src/main/java/test/AppEntry.java b/testapps/GH968/src/main/java/test/AppEntry.java new file mode 100644 index 000000000..201fd77c3 --- /dev/null +++ b/testapps/GH968/src/main/java/test/AppEntry.java @@ -0,0 +1,25 @@ +package test; + +import act.Act; +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("968") +public class AppEntry { + + @GetAction("meet") + public String meet(ActionContext ctx) { + return ctx.session().get("Hi"); + } + + @GetAction("touch") + public String touch(ActionContext ctx) { + ctx.session().put("Hi", "Hi"); + return "Hello"; + } + + public static void main(String[] args) throws Exception { + Act.start(); + } +} diff --git a/testapps/GH968/src/main/resources/conf/app.properties b/testapps/GH968/src/main/resources/conf/app.properties new file mode 100644 index 000000000..0070c8171 --- /dev/null +++ b/testapps/GH968/src/main/resources/conf/app.properties @@ -0,0 +1,802 @@ +############################################## +# Application configuration +# act-1.8.8-RC11 +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy\u5E74MM\u6708dd\u65E5 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy\u5E74MM\u6708dd\u65E5 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false +jwt=true + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=r2WMft6bZHxUCwiUf5gVRsXJ3iQuB2zSzKZosG3eX98iZNpR1fFfpFlRhjoSQMjm + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= +session.ttl=-1 + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH968/src/main/resources/conf/prod/app.properties b/testapps/GH968/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..0798e5539 --- /dev/null +++ b/testapps/GH968/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC11 +############################################## +act.secret=xPBOinitJYM7dli8k1Ji93ERQ1DUzebQrrynkrUwH0U5FzCT2mZGZXhte51tj8Xq \ No newline at end of file diff --git a/testapps/GH968/src/main/resources/conf/uat/app.properties b/testapps/GH968/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..b00fbc901 --- /dev/null +++ b/testapps/GH968/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC11 +############################################## +act.secret=mPFALnfidBVV73tqkcImPCnopmaLpcCcktkCYyb02qusdTQvmP9o6bF6S1WYRFNp \ No newline at end of file diff --git a/testapps/GH968/src/main/resources/logback.xml b/testapps/GH968/src/main/resources/logback.xml new file mode 100644 index 000000000..81946c4bc --- /dev/null +++ b/testapps/GH968/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH968/src/main/resources/test/scenarios.yml b/testapps/GH968/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..ea78c4e5a --- /dev/null +++ b/testapps/GH968/src/main/resources/test/scenarios.yml @@ -0,0 +1,13 @@ +Scenario(968): + urlContext: 968 + description: "[gh968] act.session.ttl=-1 not take effect when using jwt #968" + interactions: + - description: touch + request: + get: touch + - description: meet + request: + get: meet + response: + json: + result: Hi From 868009787bfa7fc13779fd729b7452b181790ef2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 24 Nov 2018 07:33:48 +1100 Subject: [PATCH 258/730] update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65f73d75b..f90b742e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.13** +* act.session.ttl=-1 not effect when JWT is enabled #968 * `App.singleton(Xyz.class)` returns `null` value #967 * `@CsvView` and `@TableView` not effective when mark on request handler method #966 * Keep decorator setting of async command/request #965 @@ -10,7 +11,6 @@ * Issue with using `WebSocketConnectEvent` to call websocket connection handler #959 **1.8.12** 20/Nov/2018 -* act.session.ttl=-1 not take effect when using jwt #968 * Change ws endpoint for job progress status, add GET endpoint for job progress checking #957 * The `/~/job/progress` ws endpoint does not work #956 * If interceptor is disabled then it shall not return `404` #955 From eed17ee977264ae1a514d41860763c95153c6ce9 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 24 Nov 2018 08:59:59 +1100 Subject: [PATCH 259/730] `NullPointerException` when route path element wrapped with `~` is no the final one #958 --- CHANGELOG.md | 1 + src/main/java/act/route/Router.java | 63 ++++++++++--------- .../src/main/java/ghissues/Gh958.java | 20 ++++++ .../src/main/resources/test/scenarios/958.yml | 9 +++ 4 files changed, 64 insertions(+), 29 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh958.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/958.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index f90b742e0..1e8c5675f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.13** +* `NullPointerException` when route path element wrapped with `~` is no the final one #958 * act.session.ttl=-1 not effect when JWT is enabled #968 * `App.singleton(Xyz.class)` returns `null` value #967 * `@CsvView` and `@TableView` not effective when mark on request handler method #966 diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 3486d0897..6144bd373 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -284,16 +284,16 @@ enum ConflictResolver { } private String withUrlContext(String path, String action) { - String sAction = action.toString(); + String sAction = action; String urlContext = null; for (String key : urlContexts.keySet()) { - String sKey = key.toString(); + String sKey = key; if (sAction.startsWith(sKey)) { urlContext = urlContexts.get(key); break; } } - return null == urlContext ? path : S.pathConcat(urlContext, '/', path.toString()); + return null == urlContext ? path : S.pathConcat(urlContext, '/', path); } public void addMapping(H.Method method, String path, String action) { @@ -354,8 +354,8 @@ public void addMapping(final H.Method method, final String path, RequestHandler break; case EXIT: throw new DuplicateRouteMappingException( - new RouteInfo(method, path.toString(), node.handler(), existing), - new RouteInfo(method, path.toString(), handler, source) + new RouteInfo(method, path, node.handler(), existing), + new RouteInfo(method, path, handler, source) ); default: throw E.unsupport(); @@ -368,7 +368,7 @@ private RequestHandler prepareReverseRoutes(RequestHandler handler, Node node) { RequestHandlerInfo info = (RequestHandlerInfo) handler; String action = info.action; Node root = node.root; - root.reverseRoutes.put(action.toString(), node); + root.reverseRoutes.put(action, node); handler = info.theHandler(); } return handler; @@ -476,7 +476,7 @@ public String reverseRoute(String action, H.Method method, Map a } elements.add(s); } else { - elements.add(node.name.toString()); + elements.add(node.toString()); } node = node.parent; } @@ -929,6 +929,11 @@ private Node(int id, AppConfig config) { parseDynaName(name); } + @Override + public String toString() { + return id(); + } + @Override public int hashCode() { return id; @@ -1053,7 +1058,7 @@ public Node child(String name, ActionContext context) { } } if (MATCH_ALL == targetNode.patternTrait) { - context.urlPathParam(targetNode.varNames.get(0).toString(), name.toString()); + context.urlPathParam(targetNode.varNames.get(0), name); return targetNode; } Pattern pattern = targetNode.pattern; @@ -1061,7 +1066,7 @@ public Node child(String name, ActionContext context) { if (null != matcher && matcher.matches()) { if (!targetNode.nodeValueBuilders.isEmpty()) { for (String varName : targetNode.varNames) { - String varNameStr = varName.toString(); + String varNameStr = varName; try { String varValue = matcher.group(varNameStr); if (S.notBlank(varValue)) { @@ -1069,7 +1074,7 @@ public Node child(String name, ActionContext context) { } } catch (IllegalArgumentException e) { if (e.getMessage().contains("No group with name")) { - String escaped = escapeUnderscore(varNameStr).toString(); + String escaped = escapeUnderscore(varNameStr); String varValue = matcher.group(escaped); if (S.notBlank(varValue)) { context.urlPathParam(varNameStr, S.string(varValue)); @@ -1079,7 +1084,7 @@ public Node child(String name, ActionContext context) { } } else { String varName = targetNode.varNames.get(0); - context.urlPathParam(varName.toString(), S.string(name)); + context.urlPathParam(varName, S.string(name)); } return targetNode; } @@ -1091,7 +1096,7 @@ public Node child(String name, ActionContext context) { @Override public String id() { - return name.toString(); + return null == name ? keyword.camelCase() : name; } @Override @@ -1217,7 +1222,7 @@ boolean terminateRouteSearch() { String path() { if (null == parent) return "/"; String pPath = parent.path(); - return S.pathConcat(pPath, '/', name.toString()); + return S.pathConcat(pPath, '/', id()); } void debug(H.Method method, PrintStream ps) { @@ -1372,7 +1377,7 @@ public String transform(Map stringObjectMap) { if (escaped == s) { throw e; } - pattern.set(Pattern.compile(escaped.toString())); + pattern.set(Pattern.compile(escaped)); } } } @@ -1469,40 +1474,40 @@ private enum BuiltInHandlerResolver { @Override public RequestHandler resolve(String msg, App app, EnumSet decorators) { return decorators.contains(BuiltInHandlerDecorator.authenticated) ? - new ContextualHandler(new AuthenticatedEcho(msg.toString())) : - new Echo(msg.toString()); + new ContextualHandler(new AuthenticatedEcho(msg)) : + new Echo(msg); } }, redirect() { @Override public RequestHandler resolve(String payload, App app, EnumSet decorators) { return decorators.contains(BuiltInHandlerDecorator.authenticated) ? - new ContextualHandler(new AuthenticatedRedirect(payload.toString())) : - new Redirect(payload.toString()); + new ContextualHandler(new AuthenticatedRedirect(payload)) : + new Redirect(payload); } }, moved() { @Override public RequestHandler resolve(String payload, App app, EnumSet decorators) { return decorators.contains(BuiltInHandlerDecorator.authenticated) ? - new ContextualHandler(new AuthenticatedRedirect(payload.toString())) : - new Redirect(payload.toString()); + new ContextualHandler(new AuthenticatedRedirect(payload)) : + new Redirect(payload); } }, redirectdir() { @Override public RequestHandler resolve(String payload, App app, EnumSet decorators) { return decorators.contains(BuiltInHandlerDecorator.authenticated) ? - new ContextualHandler(new AuthenticatedRedirectDir(payload.toString())) : - new RedirectDir(payload.toString()); + new ContextualHandler(new AuthenticatedRedirectDir(payload)) : + new RedirectDir(payload); } }, file() { @Override public RequestHandler resolve(String base, App app, EnumSet decorators) { File file = decorators.contains(BuiltInHandlerDecorator.external) ? - new File(base.toString()) : - app.file(base.toString()); + new File(base) : + app.file(base); if (!file.canRead()) { LOGGER.warn("file not found: %s", file.getPath()); } @@ -1514,13 +1519,13 @@ public RequestHandler resolve(String base, App app, EnumSet decorators) { - return new ContextualHandler(new AuthenticatedFileGetter(app.file(base.toString()))); + return new ContextualHandler(new AuthenticatedFileGetter(app.file(base))); } }, externalfile() { @Override public RequestHandler resolve(String base, App app, EnumSet decorators) { - File file = new File(base.toString()); + File file = new File(base); if (!file.canRead()) { LOGGER.warn("External file not found: %s", file.getPath()); } @@ -1533,15 +1538,15 @@ public RequestHandler resolve(String base, App app, EnumSet decorators) { return decorators.contains(BuiltInHandlerDecorator.authenticated) ? - new ContextualHandler(new AuthenticatedResourceGetter(payload.toString())) : - new ResourceGetter(payload.toString()); + new ContextualHandler(new AuthenticatedResourceGetter(payload)) : + new ResourceGetter(payload); } }; protected abstract RequestHandler resolve(String payload, App app, EnumSet decorators); private static RequestHandler tryResolve(String directive, String payload, App app) { - String s = directive.toString().toLowerCase(); + String s = directive.toLowerCase(); String resolver = s, sDecorators; BuiltInHandlerResolver r; EnumSet decorators = EnumSet.noneOf(BuiltInHandlerDecorator.class); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh958.java b/testapps/GHIssues/src/main/java/ghissues/Gh958.java new file mode 100644 index 000000000..4043d47c8 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh958.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("958") +public class Gh958 extends BaseController { + + @UrlContext("~fooBar~") + public static class Tester extends Gh958 { + + @GetAction + public String test() { + return "ok"; + } + + } + + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/958.yml b/testapps/GHIssues/src/main/resources/test/scenarios/958.yml new file mode 100644 index 000000000..cc64b2687 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/958.yml @@ -0,0 +1,9 @@ +Scenario(958): + description: "[GH958] `NullPointerException` when route path element wrapped with `~` is no the final one" + interactions: + - description: test + request: + get: 958/foo-bar + response: + json: + result: ok From 0a8ce87e24856fc771562c8805668777643a0ae1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 25 Nov 2018 08:53:39 +1100 Subject: [PATCH 260/730] fix issue: automate test blocked when running in batch mode --- legacy-testapp/pom.xml | 2 +- src/main/java/act/job/JobManager.java | 8 +++--- src/main/java/act/test/Test.java | 7 +++++- .../act/xio/WebSocketConnectionHandler.java | 25 +++++++++++-------- testapps/ResourceLoaderTest/pom.xml | 4 +-- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 6411cfaed..f9a3d7299 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.12-SNAPSHOT + 1.8.13-SNAPSHOT [0.13.0, 2.0.0) 1.6.2 testapp.TestApp diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index e7eee5189..33e974ec9 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -529,12 +529,12 @@ public Object apply() throws NotAppliedException, $.Break { return null; } }, true); - foo(); + ensureMailerContext(); } ContextualJob(String id, final $.Function worker) { super(id, JobManager.this, worker); - foo(); + ensureMailerContext(); } @Override @@ -549,10 +549,10 @@ protected void _finally() { removeJob(this); } - private void foo() { + private void ensureMailerContext() { app().eventBus().once(MailerContext.InitEvent.class, new OnceEventListenerBase() { @Override - public boolean tryHandle(MailerContext.InitEvent event) throws Exception { + public boolean tryHandle(MailerContext.InitEvent event) { MailerContext mailerContext = MailerContext.current(); if (null != mailerContext) { _before(); diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 0d3376503..68338bea3 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -222,7 +222,12 @@ public void run() { } }, delay.get(), TimeUnit.SECONDS); } else { - Test.this.run(app, null, true); + app.jobManager().now(new Runnable() { + @Override + public void run() { + Test.this.run(app, null, true); + } + }); } } }); diff --git a/src/main/java/act/xio/WebSocketConnectionHandler.java b/src/main/java/act/xio/WebSocketConnectionHandler.java index 839d7a80e..ef15a8b2b 100644 --- a/src/main/java/act/xio/WebSocketConnectionHandler.java +++ b/src/main/java/act/xio/WebSocketConnectionHandler.java @@ -23,8 +23,9 @@ import act.Act; import act.app.ActionContext; import act.app.App; -import act.app.event.SysEventId; +import act.app.event.*; import act.controller.meta.*; +import act.event.SysEventListenerBase; import act.handler.RequestHandlerBase; import act.inject.param.*; import act.sys.Env; @@ -39,8 +40,7 @@ import org.osgl.util.*; import java.lang.reflect.Method; -import java.util.List; -import java.util.Set; +import java.util.*; public abstract class WebSocketConnectionHandler extends RequestHandlerBase { @@ -160,13 +160,18 @@ protected void releaseResources() { } private void initWebSocketConnectionListenerManager() { - final WebSocketConnectionHandler me = this; - this.app.jobManager().on(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED, new Runnable() { - @Override - public void run() { - me.connectionListenerManager = me.app.getInstance(WebSocketConnectionListener.Manager.class); - } - }, true); + App app = Act.app(); + if (app.eventEmitted(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED)) { + this.connectionListenerManager = app.getInstance(WebSocketConnectionListener.Manager.class); + } else { + final WebSocketConnectionHandler me = this; + this.app.eventBus().bind(SysEventId.DEPENDENCY_INJECTOR_PROVISIONED, new SysEventListenerBase() { + @Override + public void on(EventObject event) { + me.connectionListenerManager = me.app.getInstance(WebSocketConnectionListener.Manager.class); + } + }); + } } protected void setConnectionListener(WebSocketConnectionListener connectionListener) { diff --git a/testapps/ResourceLoaderTest/pom.xml b/testapps/ResourceLoaderTest/pom.xml index de6619a2a..b25a1c8e3 100644 --- a/testapps/ResourceLoaderTest/pom.xml +++ b/testapps/ResourceLoaderTest/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.11.0 + 1.8.12.0 @@ -30,7 +30,7 @@ org.actframework act - 1.8.12-SNAPSHOT + 1.8.13-SNAPSHOT From 91df463c3ea707c2e658012cdb07fbdf7bd90f2a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 25 Nov 2018 08:55:08 +1100 Subject: [PATCH 261/730] [maven-release-plugin] prepare release act-1.8.13 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d1a3e9ebd..04d53c91f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.13-SNAPSHOT + 1.8.13 ACT Framework The ACT full stack MVC framework From 7c86938757e69b492805d682db97d07105c1c283 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 25 Nov 2018 08:55:24 +1100 Subject: [PATCH 262/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 04d53c91f..f55579b73 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.13 + 1.8.14-SNAPSHOT ACT Framework The ACT full stack MVC framework From 2424b052a14b408a519b2c2925f4e21c18684828 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 25 Nov 2018 10:14:02 +1100 Subject: [PATCH 263/730] update VERSION_MATRIX; README for act-1.8.13 --- CHANGELOG.md | 2 +- README.md | 10 +++++----- VERSION_MATRIX.md | 40 ++++++++++++++++++++-------------------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c9c443c4..27241b96c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.13** +**1.8.13** 25/Nov/2018 * Provides a mechanism for accurate routing ws connection event to user defined connection handler #961 * `NullPointerException` when route path element wrapped with `~` is no the final one #958 * act.session.ttl=-1 not effect when JWT is enabled #968 diff --git a/README.md b/README.md index a94c3cbb0..9f1c6ac0f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.12.0 + 1.8.13.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.12.0 + -DarchetypeVersion=1.8.13.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.12.0 + -DarchetypeVersion=1.8.13.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.12.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.13.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.12.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.13.0 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 5066de4ff..4fb3921b5 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,25 +1,25 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.11 | 1.8.12 | -| --- | ----: | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.2 | 1.5.2 | -| beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | 1.4.5 | 1.4.6 | -| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | 1.5.4 | 1.5.5 | -| ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.3 | 1.7.4 | 1.7.5 | -| ebean(java8) | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.3 | 1.7.4 | 1.7.5 | -| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | 1.5.4 | -| excel | 1.3.x | 1.4.x | 1.4.3 | 1.5.0 | 1.5.0 | 1.5.0 | -| freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.6 | 1.3.6 | 1.3.6 | -| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | 1.5.3 | -| jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.5 | 1.0.5 | 1.0.5 | -| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | 1.5.3 | -| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | 1.6.3 | 1.6.4 | -| mustache(java8) | 1.3.x | 1.4.0 | 1.4.2 | 1.4.5 | 1.4.5 | 1.4.5 | -| social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.5 | 0.12.5 | 0.12.5 | -| sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.3 | 1.4.4 | 1.4.4 | -| storage(java8) | 0.12.x | 0.13.0 | 0.13.2 | 0.13.5 | 0.13.5 | 0.13.5 | -| thymeleaf | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | -| velocity | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | +| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.13 | +| --- | ----: | ----: | ----: | ----: | ----: | +| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.2 | +| beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | 1.4.6 | +| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | 1.5.5 | +| ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.3 | 1.7.5 | +| ebean(java8) | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.3 | 1.7.5 | +| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.4 | +| excel | 1.3.x | 1.4.x | 1.4.3 | 1.5.0 | 1.5.0 | +| freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.6 | 1.3.6 | +| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | +| jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.5 | 1.0.5 | +| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | +| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | 1.6.4 | +| mustache(java8) | 1.3.x | 1.4.0 | 1.4.2 | 1.4.5 | 1.4.5 | +| social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.5 | 0.12.5 | +| sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.3 | 1.4.4 | +| storage(java8) | 0.12.x | 0.13.0 | 0.13.2 | 0.13.5 | 0.13.5 | +| thymeleaf | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | +| velocity | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | ## Note From ec847224a34d58d2663cdb27e369c6f822234343 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 27 Nov 2018 08:12:28 +1100 Subject: [PATCH 264/730] Push progress only when `ProgressGauge`'s percentage changed #975 --- CHANGELOG.md | 3 +++ .../java/act/util/SimpleProgressGauge.java | 27 ++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27241b96c..919778b63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # ActFramework Change Log +**1.8.14** +* Push progress only when `ProgressGauge`'s percentage changed #975 + **1.8.13** 25/Nov/2018 * Provides a mechanism for accurate routing ws connection event to user defined connection handler #961 * `NullPointerException` when route path element wrapped with `~` is no the final one #958 diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java index 4790dab49..851e07cf9 100644 --- a/src/main/java/act/util/SimpleProgressGauge.java +++ b/src/main/java/act/util/SimpleProgressGauge.java @@ -70,6 +70,7 @@ public void markAsDone() { private String id; private int maxHint; private int currentSteps; + private transient int percent; private ProgressGauge delegate; private List listeners = new ArrayList<>(); @@ -95,7 +96,6 @@ protected void releaseResources() { maxHint = 100; currentSteps = 0; Destroyable.Util.tryDestroy(delegate); - triggerUpdateEvent(); } @Override @@ -113,7 +113,7 @@ public void updateMaxHint(int maxHint) { delegate.updateMaxHint(maxHint); } else { this.maxHint = maxHint; - triggerUpdateEvent(); + triggerUpdateEvent(true); } } @@ -188,7 +188,7 @@ public int currentProgressPercent() { if (null != delegate) { return delegate.currentSteps() * 100 / delegate.maxHint(); } - int n = currentSteps * 100 / maxHint; + int n = currentSteps * 100 / (maxHint - 1); if (100 == n && !isDone()) { n = 99; } @@ -204,7 +204,7 @@ public boolean isDone() { if (null != delegate) { return delegate.isDone(); } - return currentSteps >= maxHint; + return currentSteps >= (maxHint - 1); } @Override @@ -215,9 +215,24 @@ public void markAsDone() { } private void triggerUpdateEvent() { - for (Listener listener : listeners) { - listener.onUpdate(this); + triggerUpdateEvent(false); + } + + private void triggerUpdateEvent(boolean forceTriggerEvent) { + if (forceTriggerEvent || percentageChanged()) { + for (Listener listener : listeners) { + listener.onUpdate(this); + } + } + } + + private boolean percentageChanged() { + int cur = currentProgressPercent(); + if (cur != percent) { + percent = cur; + return true; } + return false; } public static SimpleProgressGauge wrap(ProgressGauge progressGauge) { From 59756d6b3a7987ee04a5ecb237f6949cb9c4b9fc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 27 Nov 2018 08:14:16 +1100 Subject: [PATCH 265/730] Make the `dao` field of `SimpleRestfulServiceBase` be protected #980 --- CHANGELOG.md | 1 + src/main/java/act/app/util/SimpleRestfulServiceBase.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 919778b63..acb3f1dc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.14** +* Make the `dao` field of `SimpleRestfulServiceBase` be protected #980 * Push progress only when `ProgressGauge`'s percentage changed #975 **1.8.13** 25/Nov/2018 diff --git a/src/main/java/act/app/util/SimpleRestfulServiceBase.java b/src/main/java/act/app/util/SimpleRestfulServiceBase.java index 8770060b3..e8d8cbf6a 100644 --- a/src/main/java/act/app/util/SimpleRestfulServiceBase.java +++ b/src/main/java/act/app/util/SimpleRestfulServiceBase.java @@ -42,7 +42,7 @@ DAO_TYPE extends DaoBase> { @NoBind - private DAO_TYPE dao; + protected DAO_TYPE dao; public SimpleRestfulServiceBase() { exploreTypes(); From 0b88384a7259ee668ed7e46392fa5b13daf84af4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 27 Nov 2018 21:18:39 +1100 Subject: [PATCH 266/730] Drop websocket connection subscribed to listen job progress once job is finished #977 --- CHANGELOG.md | 1 + src/main/java/act/job/JobAdmin.java | 31 +++++++++++++++-- .../java/act/util/SimpleProgressGauge.java | 33 ++++++++++++++----- 3 files changed, 54 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index acb3f1dc0..258ef20e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.14** +* Drop websocket connection subscribed to listen job progress once job is finished #977 * Make the `dao` field of `SimpleRestfulServiceBase` be protected #980 * Push progress only when `ProgressGauge`'s percentage changed #975 diff --git a/src/main/java/act/job/JobAdmin.java b/src/main/java/act/job/JobAdmin.java index 09787ac46..efa413c06 100644 --- a/src/main/java/act/job/JobAdmin.java +++ b/src/main/java/act/job/JobAdmin.java @@ -20,6 +20,8 @@ * #L% */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import act.cli.*; import act.cli.meta.CommandMethodMetaInfo; import act.util.CsvView; @@ -179,15 +181,40 @@ public ProgressGauge jobProgress(String id, JobManager jobManager) { public static class WsProgress implements WebSocketConnectionListener { @Inject private WebSocketConnectionManager connectionManager; + @Inject + private JobManager jobManager; @Override - public void onConnect(WebSocketContext context) { + public void onConnect(final WebSocketContext context) { String jobId = context.actionContext().paramVal("jobId"); - if (null == jobId) { + Job job = null; + if (null != jobId) { + job = jobManager.jobById(jobId); + } + if (null == job) { + jobManager.delay(new Runnable() { + @Override + public void run() { + context.connection().close(); + } + }, 10, MILLISECONDS); return; } String tag = SimpleProgressGauge.wsJobProgressTag(jobId); connectionManager.subscribe(context.session(), tag); + job.progress().addListener(new ProgressGauge.Listener() { + @Override + public void onUpdate(ProgressGauge progressGauge) { + if (progressGauge.isDone()) { + jobManager.delay(new Runnable() { + @Override + public void run() { + context.connection().close(); + } + }, 10, MILLISECONDS); + } + } + }); } } diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java index 851e07cf9..dc685e1aa 100644 --- a/src/main/java/act/util/SimpleProgressGauge.java +++ b/src/main/java/act/util/SimpleProgressGauge.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.concurrent.locks.*; public class SimpleProgressGauge extends DestroyableBase implements ProgressGauge { @@ -73,6 +74,7 @@ public void markAsDone() { private transient int percent; private ProgressGauge delegate; private List listeners = new ArrayList<>(); + private ReadWriteLock listenerListLock = new ReentrantReadWriteLock(); private SimpleProgressGauge(int maxHint, int currentSteps) { this.maxHint = maxHint; @@ -103,7 +105,13 @@ public void addListener(Listener listener) { if (null != delegate) { delegate.addListener(listener); } else { - listeners.add(listener); + Lock lock = listenerListLock.writeLock(); + lock.lock(); + try { + listeners.add(listener); + } finally { + lock.unlock(); + } } } @@ -186,13 +194,9 @@ public String getId() { public int currentProgressPercent() { if (null != delegate) { - return delegate.currentSteps() * 100 / delegate.maxHint(); - } - int n = currentSteps * 100 / (maxHint - 1); - if (100 == n && !isDone()) { - n = 99; + return percentage(delegate.currentSteps(), delegate.maxHint()); } - return n; + return percentage(currentSteps, maxHint); } public int getProgressPercent() { @@ -220,8 +224,14 @@ private void triggerUpdateEvent() { private void triggerUpdateEvent(boolean forceTriggerEvent) { if (forceTriggerEvent || percentageChanged()) { - for (Listener listener : listeners) { - listener.onUpdate(this); + Lock lock = listenerListLock.readLock(); + lock.lock(); + try { + for (Listener listener : listeners) { + listener.onUpdate(this); + } + } finally { + lock.unlock(); } } } @@ -246,4 +256,9 @@ public static SimpleProgressGauge wrap(ProgressGauge progressGauge) { public static String wsJobProgressTag(String jobId) { return "__act_job_progress_" + jobId + "__"; } + + private static int percentage(int currentSteps, int maxHint) { + int n = currentSteps / (maxHint / 100); + return (100 <= n) && (currentSteps < (maxHint - 1)) ? 99 : n; + } } From 35fea27d263afc4977006f3f035fcc0d08fd5431 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 27 Nov 2018 22:10:32 +1100 Subject: [PATCH 267/730] CLI table view does not work properly with `Keyword` typed field #983 --- CHANGELOG.md | 1 + pom.xml | 2 +- .../act/cli/ascii_table/impl/CollectionASCIITableAware.java | 2 +- src/main/java/act/conf/ConfigurationByteCodeScanner.java | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 258ef20e1..4528213b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.14** +* CLI table view does not work properly with `Keyword` typed field #983 * Drop websocket connection subscribed to listen job progress once job is finished #977 * Make the `dao` field of `SimpleRestfulServiceBase` be protected #980 * Push progress only when `ProgressGauge`'s percentage changed #975 diff --git a/pom.xml b/pom.xml index f55579b73..690791a9f 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 2.10.1 1.11.3 3.10.0 - 1.18.1 + 1.18.2-SNAPSHOT 1.5.0 1.9.0 1.9.0 diff --git a/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java b/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java index 45cb78d89..6ad02f16c 100644 --- a/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java +++ b/src/main/java/act/cli/ascii_table/impl/CollectionASCIITableAware.java @@ -90,7 +90,7 @@ public CollectionASCIITableAware(List objList, List properties, List< properties.remove(i); properties.add(i, prop); } - headers.add(new ASCIITableHeader(Keyword.of(String.valueOf(header)).constantName())); + headers.add(new ASCIITableHeader(Keyword.of(header).constantName())); } //Populate data diff --git a/src/main/java/act/conf/ConfigurationByteCodeScanner.java b/src/main/java/act/conf/ConfigurationByteCodeScanner.java index 187c7d12f..6cb6e6f5a 100644 --- a/src/main/java/act/conf/ConfigurationByteCodeScanner.java +++ b/src/main/java/act/conf/ConfigurationByteCodeScanner.java @@ -153,7 +153,7 @@ public void run() { field.set(null, value); } } catch (Exception e) { - throw E.unexpected(e, "failed to set configuration value[%] to field[%s]", value, field); + throw E.unexpected(e, "failed to set configuration value[%s] to field[%s]", value, field); } } } From baf1676a5d0a2d33622a239aba6749680892b3b5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 27 Nov 2018 22:13:06 +1100 Subject: [PATCH 268/730] It shall not set `null` to field marked with `@Configuration` if the setting is not configured #984 --- CHANGELOG.md | 1 + src/main/java/act/conf/ConfigurationByteCodeScanner.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4528213b2..07a512606 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.14** +* It shall not set `null` to field marked with `@Configuration` if the setting is not configured #984 * CLI table view does not work properly with `Keyword` typed field #983 * Drop websocket connection subscribed to listen job progress once job is finished #977 * Make the `dao` field of `SimpleRestfulServiceBase` be protected #980 diff --git a/src/main/java/act/conf/ConfigurationByteCodeScanner.java b/src/main/java/act/conf/ConfigurationByteCodeScanner.java index 6cb6e6f5a..2582f79ec 100644 --- a/src/main/java/act/conf/ConfigurationByteCodeScanner.java +++ b/src/main/java/act/conf/ConfigurationByteCodeScanner.java @@ -128,6 +128,9 @@ public void run() { } loader.init(map, valueSpec); Object value = loader.get(); + if (null == value) { + return; + } try { if (isConst) { Const fieldValue = $.cast(field.get(null)); From 23327baf386669acb9828e181ef52dde4b4f7153 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 27 Nov 2018 22:21:22 +1100 Subject: [PATCH 269/730] `DaoLoader` not able to load Dao class without type parameter #979 --- CHANGELOG.md | 1 + src/main/java/act/db/DaoLoader.java | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07a512606..51dd669e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.14** +* `DaoLoader` not able to load Dao class without type parameter #979 * It shall not set `null` to field marked with `@Configuration` if the setting is not configured #984 * CLI table view does not work properly with `Keyword` typed field #983 * Drop websocket connection subscribed to listen job progress once job is finished #977 diff --git a/src/main/java/act/db/DaoLoader.java b/src/main/java/act/db/DaoLoader.java index 428f25931..b575c9fff 100644 --- a/src/main/java/act/db/DaoLoader.java +++ b/src/main/java/act/db/DaoLoader.java @@ -20,14 +20,15 @@ * #L% */ +import act.Act; import act.app.App; import act.app.DbServiceManager; import org.osgl.inject.BeanSpec; import org.osgl.inject.GenericTypedBeanLoader; -import javax.enterprise.context.ApplicationScoped; import java.lang.reflect.Type; import java.util.List; +import javax.enterprise.context.ApplicationScoped; @ApplicationScoped public class DaoLoader implements GenericTypedBeanLoader { @@ -45,7 +46,7 @@ public Dao load(BeanSpec spec) { Class modelType = BeanSpec.rawTypeOf(typeList.get(1)); return dbServiceManager.dao(modelType); } - return null; + return (Dao)Act.getInstance(spec.rawType()); } } From d999a751dc8df5199f68d6dfa7d3377e910ab36a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 28 Nov 2018 08:23:09 +1100 Subject: [PATCH 270/730] @Before @After not effect when sub class extends from super class #985\nIt shall force marking progress gauge as done once the job is returned #971 --- CHANGELOG.md | 2 ++ .../controller/meta/ActionMethodMetaInfo.java | 1 + .../meta/ControllerClassMetaInfo.java | 12 ++++------ src/main/java/act/job/Job.java | 2 ++ .../java/act/util/SimpleProgressGauge.java | 8 ++++++- testapps/GHIssues/pom.xml | 2 +- .../src/main/java/ghissues/gh985/Crud.java | 24 +++++++++++++++++++ .../src/main/java/ghissues/gh985/Sub.java | 13 ++++++++++ .../src/main/resources/test/scenarios/985.yml | 10 ++++++++ 9 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh985/Crud.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh985/Sub.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/985.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 51dd669e8..e318927a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.14** +* @Before @After not effect when sub class extends from super class #985 +* It shall force marking progress gauge as done once the job is returned #971 * `DaoLoader` not able to load Dao class without type parameter #979 * It shall not set `null` to field marked with `@Configuration` if the setting is not configured #984 * CLI table view does not work properly with `Keyword` typed field #983 diff --git a/src/main/java/act/controller/meta/ActionMethodMetaInfo.java b/src/main/java/act/controller/meta/ActionMethodMetaInfo.java index 22dbc5db8..739f7c7ba 100644 --- a/src/main/java/act/controller/meta/ActionMethodMetaInfo.java +++ b/src/main/java/act/controller/meta/ActionMethodMetaInfo.java @@ -39,6 +39,7 @@ public ActionMethodMetaInfo(ControllerClassMetaInfo classMetaInfo) { public ActionMethodMetaInfo(ActionMethodMetaInfo parentAction, ControllerClassMetaInfo thisClass) { super(parentAction, thisClass); + this.interceptors.mergeFrom(thisClass.interceptors()); } public ActionMethodMetaInfo addWith(String... classes) { diff --git a/src/main/java/act/controller/meta/ControllerClassMetaInfo.java b/src/main/java/act/controller/meta/ControllerClassMetaInfo.java index bdc45f324..2df329f89 100644 --- a/src/main/java/act/controller/meta/ControllerClassMetaInfo.java +++ b/src/main/java/act/controller/meta/ControllerClassMetaInfo.java @@ -178,15 +178,11 @@ public ControllerClassMetaInfo parent(boolean checkClassInfoRepo) { ClassInfoRepository repo = classLoader.classInfoRepository(); ClassNode parentNode = repo.node(superType.getClassName()); while(null != parentNode) { - parentNode = parentNode.parent(); - if (null != parentNode) { - ControllerClassMetaInfo parentInfo = classLoader.controllerClassMetaInfo(parentNode.name()); - if (null != parentInfo) { - return parentInfo; - } - } else { - return null; + ControllerClassMetaInfo parentInfo = classLoader.controllerClassMetaInfo(parentNode.name()); + if (null != parentInfo) { + return parentInfo; } + parentNode = parentNode.parent(); } return null; } diff --git a/src/main/java/act/job/Job.java b/src/main/java/act/job/Job.java index 69aed59fd..4e6896cc6 100644 --- a/src/main/java/act/job/Job.java +++ b/src/main/java/act/job/Job.java @@ -336,6 +336,7 @@ public void run() { } } doJob(); + progress.markAsDone(); } catch (Throwable e) { boolean isFatal = FATAL_EXCEPTIONS.contains(e.getClass()) || Error.class.isInstance(e); Throwable cause = e; @@ -349,6 +350,7 @@ public void run() { cause = cause.getCause(); } } + progress.fail(e.getMessage()); if (isFatal) { if (Act.isDev()) { app.setBlockIssue(e); diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java index dc685e1aa..0ec558271 100644 --- a/src/main/java/act/util/SimpleProgressGauge.java +++ b/src/main/java/act/util/SimpleProgressGauge.java @@ -71,6 +71,7 @@ public void markAsDone() { private String id; private int maxHint; private int currentSteps; + private String error; private transient int percent; private ProgressGauge delegate; private List listeners = new ArrayList<>(); @@ -208,7 +209,12 @@ public boolean isDone() { if (null != delegate) { return delegate.isDone(); } - return currentSteps >= (maxHint - 1); + return null != error || currentSteps >= (maxHint - 1); + } + + public void fail(String error) { + this.error = error; + triggerUpdateEvent(true); } @Override diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 04b76315e..e2dd11b08 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -26,7 +26,7 @@ org.actframework act - 1.8.13-SNAPSHOT + 1.8.14-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/java/ghissues/gh985/Crud.java b/testapps/GHIssues/src/main/java/ghissues/gh985/Crud.java new file mode 100644 index 000000000..389cab27e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh985/Crud.java @@ -0,0 +1,24 @@ +package ghissues.gh985; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.Before; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.Map; + +public abstract class Crud extends BaseController { + @Before + public void init(ActionContext context) { + context.renderArg("superInit", true); + } + + @GetAction + public Map test(ActionContext context) { + Boolean superInit = context.renderArg("superInit"); + Boolean subInit = context.renderArg("subInit"); + return C.Map("superInit", superInit, "subInit", subInit); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh985/Sub.java b/testapps/GHIssues/src/main/java/ghissues/gh985/Sub.java new file mode 100644 index 000000000..543429054 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh985/Sub.java @@ -0,0 +1,13 @@ +package ghissues.gh985; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.Before; + +@UrlContext("985") +public class Sub extends Crud { + @Before + public void initial(ActionContext context) { + context.renderArg("subInit", true); + } +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/985.yml b/testapps/GHIssues/src/main/resources/test/scenarios/985.yml new file mode 100644 index 000000000..eca6df0e6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/985.yml @@ -0,0 +1,10 @@ +Scenario(985): + description: "[985] @Before @After not effect when sub class extends from super class" + interactions: + - description: test + request: + get: 985 + response: + json: + superInit: true + subInit: true From d244c08e245b801f96d500ee57de5538172a8e92 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 28 Nov 2018 12:45:59 +1100 Subject: [PATCH 271/730] Support generating sample data for `org.osgl.util.Keyword` typed field #986 --- CHANGELOG.md | 1 + VERSION_MATRIX.md | 2 +- legacy-testapp/pom.xml | 4 ++-- src/main/java/act/apidoc/Endpoint.java | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e318927a2..836a545d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.14** +* Support generating sample data for `org.osgl.util.Keyword` typed field #986 * @Before @After not effect when sub class extends from super class #985 * It shall force marking progress gauge as done once the job is returned #971 * `DaoLoader` not able to load Dao class without type parameter #979 diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 4fb3921b5..ad86a911d 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,6 +1,6 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.13 | +| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.14 | | --- | ----: | ----: | ----: | ----: | ----: | | aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.2 | | beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | 1.4.6 | diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index f9a3d7299..a7ed81233 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,9 +73,9 @@ UTF-8 UTF-8 - 1.8.13-SNAPSHOT + 1.8.14-SNAPSHOT [0.13.0, 2.0.0) - 1.6.2 + 1.6.4 testapp.TestApp diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 4563b8269..3a4013913 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -610,12 +610,12 @@ public static Object generateSampleData( return 0 < len ? ea[N.randInt(len)] : null; } else if (Locale.class == classType) { return (Act.appConfig().locale()); - } else if (String.class == classType) { + } else if (String.class == classType || Keyword.class == classType) { String mockValue = sampleDataProviderManager.getSampleData(category, name, String.class); if (spec.hasAnnotation(Sensitive.class)) { return Act.crypto().encrypt(mockValue); } - return mockValue; + return Keyword.class == classType ? Keyword.of(mockValue) : mockValue; } else if (classType.isArray()) { Object sample = Array.newInstance(classType.getComponentType(), 2); Array.set(sample, 0, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); From 272b0617c6e1ce62441f7cdab2626d59b372aa2b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 28 Nov 2018 13:38:41 +1100 Subject: [PATCH 272/730] java.lang.IllegalStateException: UT000146: HttpServerExchange cannot have both async IO resumed and dispatch() called in the same cycle #974 --- CHANGELOG.md | 1 + src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java | 2 +- .../builtin/controller/impl/ReflectedHandlerInvoker.java | 2 +- src/main/java/act/job/JobManager.java | 4 ++-- src/main/java/act/xio/NetworkHandler.java | 4 ++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 836a545d7..db3af0a0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.14** +* java.lang.IllegalStateException: UT000146: HttpServerExchange cannot have both async IO resumed and dispatch() called in the same cycle #974 * Support generating sample data for `org.osgl.util.Keyword` typed field #986 * @Before @After not effect when sub class extends from super class #985 * It shall force marking progress gauge as done once the job is returned #971 diff --git a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java index 1f69ab557..2762737fa 100644 --- a/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java +++ b/src/main/java/act/cli/bytecode/ReflectedCommandExecutor.java @@ -127,7 +127,7 @@ public Object execute(CliContext context) { final Object[] params = params(cmd, context); if (async) { final JobManager jobManager = context.app().jobManager(); - final String jobId = app.cuid(); + final String jobId = jobManager.randomJobId(); jobManager.prepare(jobId, new TrackableWorker() { @Override protected void run(ProgressGauge progressGauge) { diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 69cce04f7..ce045bb19 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -626,7 +626,7 @@ public Result handle(final ActionContext context) { if (async) { final JobManager jobManager = context.app().jobManager(); - final String jobId = app.cuid(); + final String jobId = jobManager.randomJobId(); jobManager.prepare(jobId, new TrackableWorker() { @Override protected void run(ProgressGauge progressGauge) { diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 33e974ec9..95828cbfa 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -564,8 +564,8 @@ public boolean tryHandle(MailerContext.InitEvent event) { } } - private String randomJobId() { - return app().cuid() + S.urlSafeRandom(2); + public String randomJobId() { + return app().cuid() + S.urlSafeRandom(3); } static boolean isSysJob(Job job) { diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 67f2503ce..344c54663 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -101,12 +101,12 @@ public void handle(final ActionContext ctx, final NetworkDispatcher dispatcher) try { boolean updated = app.checkUpdates(false); if (updated && !app.hasBlockIssue()) { - app.jobManager().on(SysEventId.POST_START, "NetworkHandler:resumeRequestHandlingAfterHotReload", new Runnable() { + app.jobManager().post(SysEventId.POST_START, "NetworkHandler:resumeRequestHandlingAfterHotReload", new Runnable() { @Override public void run() { handle(ctx, dispatcher); } - }, true); + }, false); dispatcher.keep(); return; } From 1055c7c351426ab6e339517324c325dcf7d3656a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 28 Nov 2018 14:00:37 +1100 Subject: [PATCH 273/730] act command throw IllegalStateException: JPAContext is not ready #973 --- CHANGELOG.md | 1 + src/main/java/act/cli/CliSession.java | 4 ++++ src/main/java/act/job/JobContext.java | 5 +++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db3af0a0a..3f7f2da71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.14** +* act command throw IllegalStateException: JPAContext is not ready #973 * java.lang.IllegalStateException: UT000146: HttpServerExchange cannot have both async IO resumed and dispatch() called in the same cycle #974 * Support generating sample data for `org.osgl.util.Keyword` typed field #986 * @Before @After not effect when sub class extends from super class #985 diff --git a/src/main/java/act/cli/CliSession.java b/src/main/java/act/cli/CliSession.java index a5bceddde..17a470772 100644 --- a/src/main/java/act/cli/CliSession.java +++ b/src/main/java/act/cli/CliSession.java @@ -27,6 +27,7 @@ import act.cli.event.CliSessionTerminate; import act.cli.util.CliCursor; import act.handler.CliHandler; +import act.job.JobContext; import act.util.Banner; import act.util.DestroyableBase; import jline.console.ConsoleReader; @@ -184,6 +185,7 @@ public void run() { try { CliContext context = new CliContext(line, app, console, this); cliContext = context; + JobContext.init(); context.handle(); } catch ($.Break b) { Object payload = b.get(); @@ -197,6 +199,8 @@ public void run() { } else { console.println(S.fmt("INTERNAL ERROR: unknown payload type: %s", payload.getClass())); } + } finally { + JobContext.clear(); } } } catch (InterruptedIOException e) { diff --git a/src/main/java/act/job/JobContext.java b/src/main/java/act/job/JobContext.java index 88d055cc8..2443e39fa 100644 --- a/src/main/java/act/job/JobContext.java +++ b/src/main/java/act/job/JobContext.java @@ -112,7 +112,8 @@ public String[] paramVals(String s) { /** * Init JobContext of current thread */ - static void init() { + // make it public for CLI interaction to reuse JobContext + public static void init() { JobContext parent = current_.get(); JobContext ctx = new JobContext(parent); if (null == parent) { @@ -123,7 +124,7 @@ static void init() { /** * Clear JobContext of current thread */ - static void clear() { + public static void clear() { JobContext ctx = current_.get(); if (null != ctx) { ctx.bag_.clear(); From 0b6148c18a3fb6eeb37239bcd5f00675f0701846 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 28 Nov 2018 14:01:15 +1100 Subject: [PATCH 274/730] update README --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9f1c6ac0f..a87ce94c7 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.13.0 + 1.8.14.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.13.0 + -DarchetypeVersion=1.8.14.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.13.0 + -DarchetypeVersion=1.8.14.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.13.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.14.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.13.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.14.0 ``` For RESTful service project From bd4a84c614b67cc49cdf065edf193b5c964ebdc8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 28 Nov 2018 14:02:15 +1100 Subject: [PATCH 275/730] update osgl-tool to 1.18.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 690791a9f..a540e38c4 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 2.10.1 1.11.3 3.10.0 - 1.18.2-SNAPSHOT + 1.18.2 1.5.0 1.9.0 1.9.0 From d60e4739de1493866558c86368f9003a9a45f2b4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 28 Nov 2018 14:03:38 +1100 Subject: [PATCH 276/730] [maven-release-plugin] prepare release act-1.8.14 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a540e38c4..963be2499 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.14-SNAPSHOT + 1.8.14 ACT Framework The ACT full stack MVC framework From 9173eef3dd241170a421223ed7d0fa6e32e6d274 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 28 Nov 2018 14:03:54 +1100 Subject: [PATCH 277/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 963be2499..41f3d417d 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.14 + 1.8.15-SNAPSHOT ACT Framework The ACT full stack MVC framework From 53cbdf414cba0c2b056ddc08c61c67daf4df8b86 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 29 Nov 2018 22:20:22 +1100 Subject: [PATCH 278/730] websocket connection not released after closed #991 --- CHANGELOG.md | 5 +- src/main/java/act/conf/AppConfig.java | 20 + src/main/java/act/conf/AppConfigKey.java | 9 + .../act/ws/WebSocketConnectionManager.java | 44 +- .../act/ws/WebSocketConnectionRegistry.java | 125 ++- testapps/GH991/.gitignore | 19 + testapps/GH991/pack | 6 + testapps/GH991/pack.bat | 5 + testapps/GH991/pom.xml | 34 + testapps/GH991/run_dev | 3 + testapps/GH991/run_dev.bat | 2 + testapps/GH991/run_prod | 10 + .../GH991/src/main/java/test/AppEntry.java | 34 + .../src/main/resources/conf/app.properties | 821 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + testapps/GH991/src/main/resources/logback.xml | 115 +++ .../resources/rythm/test/AppEntry/home.html | 26 + .../GH991/src/main/resources/test/.version | 3 + .../GH991/src/main/resources/test/logback.xml | 115 +++ .../src/main/resources/test/scenarios.yml | 23 + testapps/GH991/test | 3 + testapps/GH991/test.bat | 2 + testapps/new_proj.sh | 7 + 24 files changed, 1400 insertions(+), 41 deletions(-) create mode 100644 testapps/GH991/.gitignore create mode 100755 testapps/GH991/pack create mode 100644 testapps/GH991/pack.bat create mode 100644 testapps/GH991/pom.xml create mode 100755 testapps/GH991/run_dev create mode 100755 testapps/GH991/run_dev.bat create mode 100755 testapps/GH991/run_prod create mode 100644 testapps/GH991/src/main/java/test/AppEntry.java create mode 100644 testapps/GH991/src/main/resources/conf/app.properties create mode 100644 testapps/GH991/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH991/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH991/src/main/resources/logback.xml create mode 100644 testapps/GH991/src/main/resources/rythm/test/AppEntry/home.html create mode 100644 testapps/GH991/src/main/resources/test/.version create mode 100644 testapps/GH991/src/main/resources/test/logback.xml create mode 100644 testapps/GH991/src/main/resources/test/scenarios.yml create mode 100755 testapps/GH991/test create mode 100644 testapps/GH991/test.bat create mode 100755 testapps/new_proj.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f7f2da71..c02255854 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log -**1.8.14** +**1.8.15** +* websocket connection not released after closed #991 + +**1.8.14** 28/Nov/2018 * act command throw IllegalStateException: JPAContext is not ready #973 * java.lang.IllegalStateException: UT000146: HttpServerExchange cannot have both async IO resumed and dispatch() called in the same cycle #974 * Support generating sample data for `org.osgl.util.Keyword` typed field #986 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index c7a6260e5..bd1c52158 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -3404,6 +3404,26 @@ private void _mergeWsTicketKey(AppConfig config) { } } + private Integer wsPurgeClosedConnPeriod; + + protected T wsPurgeClosedConnPeriod(int period) { + this.wsPurgeClosedConnPeriod = period; + return me(); + } + + public int wsPurgeClosedConnPeriod() { + if (null == wsPurgeClosedConnPeriod) { + wsPurgeClosedConnPeriod = get(WS_PURGE_CLOSED_CONN_PERIOD, Act.isDev() ? 1 : 10); + } + return wsPurgeClosedConnPeriod; + } + + private void _mergeWsPurgeClosedConnPeroid(AppConfig config) { + if (!hasConfiguration(WS_PURGE_CLOSED_CONN_PERIOD)) { + wsPurgeClosedConnPeriod = config.wsPurgeClosedConnPeriod; + } + } + private Set mergeTracker = C.newSet(); public void loadJarProperties(Map jarProperties) { diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index ca1103622..5492657fd 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -1253,6 +1253,15 @@ public T val(Map configuration) { */ WS_KEY_TICKET("ws.key.ticket"), + /** + * `ws.purge-closed-conn.period` + * + * Specifies the waiting period in seconds to purge closed websocket connections + * + * Default value: `10` in PROD mode, `1` in DEV mode + */ + WS_PURGE_CLOSED_CONN_PERIOD("ws.purge-closed-conn.period"), + X_FORWARD_PROTOCOL("x_forward_protocol"), ; diff --git a/src/main/java/act/ws/WebSocketConnectionManager.java b/src/main/java/act/ws/WebSocketConnectionManager.java index 2f73561c6..fd4e8604c 100644 --- a/src/main/java/act/ws/WebSocketConnectionManager.java +++ b/src/main/java/act/ws/WebSocketConnectionManager.java @@ -20,9 +20,8 @@ * #L% */ -import act.app.ActionContext; -import act.app.App; -import act.app.AppServiceBase; +import act.app.*; +import act.event.ActEventListenerBase; import act.util.Stateless; import act.xio.WebSocketConnection; import com.alibaba.fastjson.JSON; @@ -30,8 +29,11 @@ import org.osgl.http.H; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; +import org.osgl.util.C; import java.util.Collection; +import java.util.List; +import java.util.concurrent.*; /** * Manage {@link WebSocketConnection} through {@link WebSocketConnectionRegistry} @@ -46,11 +48,27 @@ public class WebSocketConnectionManager extends AppServiceBase closed = new ConcurrentHashMap<>(); + private String wsTicketKey; public WebSocketConnectionManager(App app) { super(app); wsTicketKey = app.config().wsTicketKey(); + app.eventBus().bind(WebSocketCloseEvent.class, new ActEventListenerBase() { + @Override + public void on(WebSocketCloseEvent event) { + WebSocketContext ctx = event.source(); + closed.put(ctx, ctx); + closed.put(ctx.connection(), ctx.connection()); + } + }); + app.jobManager().every(new Runnable() { + @Override + public void run() { + purgeClosed(); + } + }, app.config().wsPurgeClosedConnPeriod(), TimeUnit.SECONDS); } public WebSocketConnectionRegistry sessionRegistry() { @@ -205,6 +223,26 @@ protected void releaseResources() { byTag.destroy(); } + private void purgeClosed() { + if (closed.isEmpty()) { + return; + } + List list = C.list(closed.values()); + closed.clear(); + purgeClosed(list, bySessionId); + purgeClosed(list, byTag); + purgeClosed(list, byUrl); + purgeClosed(list, byUsername); + } + + private void purgeClosed(List closed, WebSocketConnectionRegistry registry) { + try { + registry.purge(closed); + } catch (Exception e) { + warn(e, "Error purge closed connection"); + } + } + private void sendToConnections(String message, WebSocketConnectionRegistry registry, String key) { for (WebSocketConnection conn : registry.get(key)) { if (logger.isTraceEnabled()) { diff --git a/src/main/java/act/ws/WebSocketConnectionRegistry.java b/src/main/java/act/ws/WebSocketConnectionRegistry.java index 19bdfd117..f80fa5cef 100644 --- a/src/main/java/act/ws/WebSocketConnectionRegistry.java +++ b/src/main/java/act/ws/WebSocketConnectionRegistry.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -28,17 +28,23 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.locks.ReentrantLock; /** * Organize websocket connection by string typed keys. Multiple connections * can be attached to the same key */ public class WebSocketConnectionRegistry extends LogSupportedDestroyableBase { + private ConcurrentMap> registry = new ConcurrentHashMap<>(); + private ReentrantLock lock = new ReentrantLock(); + /** * Return a list of websocket connection by key - * @param key the key to find the websocket connection list + * + * @param key + * the key to find the websocket connection list * @return a list of websocket connection or an empty list if no websocket connection found by key */ public List get(String key) { @@ -49,7 +55,9 @@ public List get(String key) { /** * Remove all connection associations to `key`. - * @param key the key to be removed from the registry + * + * @param key + * the key to be removed from the registry */ public void removeAll(String key) { registry.remove(key); @@ -58,8 +66,10 @@ public void removeAll(String key) { /** * Accept a visitor to iterate through the connections attached to the key specified * - * @param key the key - * @param visitor the visitor + * @param key + * the key + * @param visitor + * the visitor */ public void accept(String key, $.Function visitor) { ConcurrentMap connections = registry.get(key); @@ -67,20 +77,25 @@ public void accept(String key, $.Function visitor) { return; } if (!connections.isEmpty()) { - List toBeCleared = null; - for (WebSocketConnection conn : connections.keySet()) { - if (conn.closed()) { - if (null == toBeCleared) { - toBeCleared = new ArrayList<>(); + lock.lock(); + try { + List toBeCleared = null; + for (WebSocketConnection conn : connections.keySet()) { + if (conn.closed()) { + if (null == toBeCleared) { + toBeCleared = new ArrayList<>(); + } + toBeCleared.add(conn); + continue; } - toBeCleared.add(conn); - continue; + visitor.apply(conn); } - visitor.apply(conn); - } - if (null != toBeCleared) { - ConcurrentMap originalCopy = registry.get(key); - originalCopy.keySet().removeAll(toBeCleared); + if (null != toBeCleared) { + ConcurrentMap originalCopy = registry.get(key); + originalCopy.keySet().removeAll(toBeCleared); + } + } finally { + lock.unlock(); } } } @@ -92,8 +107,10 @@ public void accept(String key, $.Function visitor) { * * Note multiple connections can be attached to the same key * - * @param key the key - * @param connection the websocket connection + * @param key + * the key + * @param connection + * the websocket connection * @see #signIn(String, WebSocketConnection) */ public void register(String key, WebSocketConnection connection) { @@ -105,8 +122,10 @@ public void register(String key, WebSocketConnection connection) { * * Note multiple connections can be attached to the same key * - * @param key the key - * @param connection the websocket connection + * @param key + * the key + * @param connection + * the websocket connection * @see #register(String, WebSocketConnection) */ public void signIn(String key, WebSocketConnection connection) { @@ -116,8 +135,11 @@ public void signIn(String key, WebSocketConnection connection) { /** * Sign in a group of web socket connections to the registry by key - * @param key the key - * @param connections a collection of websocket connections + * + * @param key + * the key + * @param connections + * a collection of websocket connections */ public void register(String key, Collection connections) { signIn(key, connections); @@ -125,8 +147,11 @@ public void register(String key, Collection connections) { /** * Sign in a group of connections to the registry by key - * @param key the key - * @param connections a collection of websocket connections + * + * @param key + * the key + * @param connections + * a collection of websocket connections */ public void signIn(String key, Collection connections) { if (connections.isEmpty()) { @@ -143,8 +168,10 @@ public void signIn(String key, Collection connections) { /** * De-register a connection from the registry by key specified * - * @param key the key - * @param connection the websocket connection + * @param key + * the key + * @param connection + * the websocket connection */ public void deRegister(String key, WebSocketConnection connection) { signOff(key, connection); @@ -155,8 +182,10 @@ public void deRegister(String key, WebSocketConnection connection) { * * Note this method is an alias of {@link #signOff(String, Collection)} * - * @param key the key - * @param connections a collection of websocket connections + * @param key + * the key + * @param connections + * a collection of websocket connections * @see #signOff(String, Collection) */ public void deRegister(String key, Collection connections) { @@ -165,8 +194,11 @@ public void deRegister(String key, Collection connections) /** * Detach a connection from a key. - * @param key the key - * @param connection the connection + * + * @param key + * the key + * @param connection + * the connection */ public void signOff(String key, WebSocketConnection connection) { ConcurrentMap connections = registry.get(key); @@ -181,7 +213,8 @@ public void signOff(String key, WebSocketConnection connection) { * * This method is an alias of {@link #signOff(WebSocketConnection)}. * - * @param connection the connection. + * @param connection + * the connection. */ public void deRegister(WebSocketConnection connection) { signOff(connection); @@ -189,7 +222,9 @@ public void deRegister(WebSocketConnection connection) { /** * Remove a connection from all keys. - * @param connection the connection + * + * @param connection + * the connection */ public void signOff(WebSocketConnection connection) { for (ConcurrentMap connections : registry.values()) { @@ -200,8 +235,10 @@ public void signOff(WebSocketConnection connection) { /** * Sign off a group of connections from the registry by key * - * @param key the key - * @param connections a collection of websocket connections + * @param key + * the key + * @param connections + * a collection of websocket connections */ public void signOff(String key, Collection connections) { if (connections.isEmpty()) { @@ -232,7 +269,8 @@ public int count() { * * Note it might count connections that are closed but not removed from registry yet * - * @param key the key + * @param key + * the key * @return connection count by key */ public int count(String key) { @@ -250,6 +288,19 @@ protected void releaseResources() { registry.clear(); } + void purge(List closedConnections) { + lock.lock(); + try { + for (WebSocketConnection connection : closedConnections) { + for (ConcurrentMap map: registry.values()) { + map.remove(connection); + } + } + } finally { + lock.unlock(); + } + } + private ConcurrentMap ensureConnectionList(String key) { ConcurrentMap connections = registry.get(key); if (null == connections) { diff --git a/testapps/GH991/.gitignore b/testapps/GH991/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH991/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH991/pack b/testapps/GH991/pack new file mode 100755 index 000000000..d4daf2bc9 --- /dev/null +++ b/testapps/GH991/pack @@ -0,0 +1,6 @@ +#!/bin/sh +echo build ... +mvn -q compile +echo run test and then package ... +mvn -q package +echo package has been built up and stored in target/dist dir \ No newline at end of file diff --git a/testapps/GH991/pack.bat b/testapps/GH991/pack.bat new file mode 100644 index 000000000..44b5e3aa2 --- /dev/null +++ b/testapps/GH991/pack.bat @@ -0,0 +1,5 @@ +echo build ... +mvn -q compile +echo run test and then package ... +mvn -q package +echo package has been built up and stored in target/dist dir \ No newline at end of file diff --git a/testapps/GH991/pom.xml b/testapps/GH991/pom.xml new file mode 100644 index 000000000..929530103 --- /dev/null +++ b/testapps/GH991/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + test + GH991 + 1.0-SNAPSHOT + + My Awesome Application + + + org.actframework + act-starter-parent + 1.8.14.0 + + + + + 1.8 + test.AppEntry + + + + + + org.actframework + act + 1.8.15-SNAPSHOT + + + + \ No newline at end of file diff --git a/testapps/GH991/run_dev b/testapps/GH991/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH991/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH991/run_dev.bat b/testapps/GH991/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH991/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH991/run_prod b/testapps/GH991/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH991/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH991/src/main/java/test/AppEntry.java b/testapps/GH991/src/main/java/test/AppEntry.java new file mode 100644 index 000000000..20b5b5a9d --- /dev/null +++ b/testapps/GH991/src/main/java/test/AppEntry.java @@ -0,0 +1,34 @@ +package test; + +import act.Act; +import act.ws.*; +import org.osgl.mvc.annotation.GetAction; + +/** + * A simple hello world app entry + * + * Run this app, try to update some of the code, then + * press F5 in the browser to watch the immediate change + * in the browser! + */ +@SuppressWarnings("unused") +public class AppEntry { + + @WsEndpoint("/ws") + public static class WsConnHandler implements WebSocketConnectionListener { + @Override + public void onConnect(WebSocketContext context) { + int n = context.manager().urlRegistry().count(); + context.send("count: " + n); + } + } + + @GetAction + public void home() { + } + + public static void main(String[] args) throws Exception { + Act.start(); + } + +} diff --git a/testapps/GH991/src/main/resources/conf/app.properties b/testapps/GH991/src/main/resources/conf/app.properties new file mode 100644 index 000000000..12edfa8e8 --- /dev/null +++ b/testapps/GH991/src/main/resources/conf/app.properties @@ -0,0 +1,821 @@ +############################################## +# Application configuration +# act-1.8.14 +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy年MM月dd日 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy年MM月dd日 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `globalReturnValueAdvice` specifies the global `ReturnValueAdvice` implementation +# +# Default value: `null` +#globalReturnValueAdvice=ghissues.Gh835$GlobalAdvice + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=3gREkLUOWscj7NbxgRnvScs8hy5UcyEkTu14ORyzqjgml5dGo7hp7x2rS2Rc00Gp + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypt` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypt=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `test.delay` specifies the seconds it shall wait before starting automate test. +# the value must be in integer, the unit of the value is second. +# +# Default value: 0 +#test.delay=5 + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= + +# `xio.worker_threads.max` specifies the maximum worker thread for XIO. +# +# Default value: `0`, meaning let system to decide the number of worker threads +#xio.worker_threads.max=0 + +# `xio.statistics.enabled` turn on/off statistics in XIO layer +# +# Default value: `false` +#xio.statistics.enabled=false diff --git a/testapps/GH991/src/main/resources/conf/prod/app.properties b/testapps/GH991/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..729db137e --- /dev/null +++ b/testapps/GH991/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.14 +############################################## +act.secret=51fR6Dm6lBQs6agdlQWJPVsBhE27N37tp8CVv71ry6ggeckNOXKkbLV1DdOpRHas \ No newline at end of file diff --git a/testapps/GH991/src/main/resources/conf/uat/app.properties b/testapps/GH991/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..d5f531618 --- /dev/null +++ b/testapps/GH991/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.14 +############################################## +act.secret=X4CuPD2V8mAiEin3lWOUQkTOCDnb0IGEEemimJGlwABvC9CkJEKzO3nDtKng1Sar \ No newline at end of file diff --git a/testapps/GH991/src/main/resources/logback.xml b/testapps/GH991/src/main/resources/logback.xml new file mode 100644 index 000000000..058a546ce --- /dev/null +++ b/testapps/GH991/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + test.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH991/src/main/resources/rythm/test/AppEntry/home.html b/testapps/GH991/src/main/resources/rythm/test/AppEntry/home.html new file mode 100644 index 000000000..eea17c399 --- /dev/null +++ b/testapps/GH991/src/main/resources/rythm/test/AppEntry/home.html @@ -0,0 +1,26 @@ + + + + GH991 - websocket connection not released after closed + + + + +

                                                                                                                                                                      GH991 - websocket connection not released after closed

                                                                                                                                                                      +

                                                                                                                                                                      + Once the page is load it will create new websocket connection and then display the number of websocket connections established in the app backend. +

                                                                                                                                                                      +

                                                                                                                                                                      + Pres F5 to refresh the page will cause previous websocket connection get closed and new connection established. +

                                                                                                                                                                      +

                                                                                                                                                                      + So try keep pressing f5 to monitor if the connection number keep increasing +

                                                                                                                                                                      + + + diff --git a/testapps/GH991/src/main/resources/test/.version b/testapps/GH991/src/main/resources/test/.version new file mode 100644 index 000000000..ea0c26126 --- /dev/null +++ b/testapps/GH991/src/main/resources/test/.version @@ -0,0 +1,3 @@ +artifact=${project.artifactId} +version=${project.version} +build=${buildNumber} \ No newline at end of file diff --git a/testapps/GH991/src/main/resources/test/logback.xml b/testapps/GH991/src/main/resources/test/logback.xml new file mode 100644 index 000000000..ba406ef43 --- /dev/null +++ b/testapps/GH991/src/main/resources/test/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + test.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH991/src/main/resources/test/scenarios.yml b/testapps/GH991/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..ccbfc55d6 --- /dev/null +++ b/testapps/GH991/src/main/resources/test/scenarios.yml @@ -0,0 +1,23 @@ +Scenario(Hello World): + description: a web page says Hello + interactions: + - description: send request to the app without parameter + request: + method: GET + url: / + response: + html: + h1: Hello World + head title: + - contains: Hello World + - contains: ActFramework + p: + : + - contains: Powered by ActFramework + - description: send request to the app with [who = ActFramework] + request: + method: GET + url: /?who=ActFramework + response: + html: + h1: Hello ActFramework \ No newline at end of file diff --git a/testapps/GH991/test b/testapps/GH991/test new file mode 100755 index 000000000..e32ec2e85 --- /dev/null +++ b/testapps/GH991/test @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:test \ No newline at end of file diff --git a/testapps/GH991/test.bat b/testapps/GH991/test.bat new file mode 100644 index 000000000..a324f34a0 --- /dev/null +++ b/testapps/GH991/test.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:test \ No newline at end of file diff --git a/testapps/new_proj.sh b/testapps/new_proj.sh new file mode 100755 index 000000000..4aacaafc8 --- /dev/null +++ b/testapps/new_proj.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +mvn archetype:generate -B \ + -DgroupId=test \ + -DartifactId=GH$1 \ + -DarchetypeGroupId=org.actframework \ + -DarchetypeArtifactId=archetype-quickstart \ + -DarchetypeVersion=1.8.14.0 \ No newline at end of file From 4ee3466bf6d3aeb4ae13e0d5db630a60b539ecce Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 29 Nov 2018 22:58:55 +1100 Subject: [PATCH 279/730] Add method to handle connection close event to `WebSocketConnectionListener` #994 --- CHANGELOG.md | 1 + src/main/java/act/job/JobAdmin.java | 4 +++ .../act/ws/WebSocketConnectionListener.java | 27 ++++++++++++++--- .../act/ws/WebSocketConnectionManager.java | 29 ++++++++++++------- .../act/xio/WebSocketConnectionHandler.java | 10 ++++++- .../UndertowWebSocketConnectionHandler.java | 2 +- .../GH991/src/main/java/test/AppEntry.java | 17 +++++++++-- .../resources/rythm/test/AppEntry/home.html | 1 + 8 files changed, 73 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c02255854..0d6435456 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.15** +* Add method to handle connection close event to `WebSocketConnectionListener` #994 * websocket connection not released after closed #991 **1.8.14** 28/Nov/2018 diff --git a/src/main/java/act/job/JobAdmin.java b/src/main/java/act/job/JobAdmin.java index efa413c06..fa000da9b 100644 --- a/src/main/java/act/job/JobAdmin.java +++ b/src/main/java/act/job/JobAdmin.java @@ -216,6 +216,10 @@ public void run() { } }); } + + @Override + public void onClose(WebSocketContext context) { + } } } diff --git a/src/main/java/act/ws/WebSocketConnectionListener.java b/src/main/java/act/ws/WebSocketConnectionListener.java index 6a44f493a..356810e91 100644 --- a/src/main/java/act/ws/WebSocketConnectionListener.java +++ b/src/main/java/act/ws/WebSocketConnectionListener.java @@ -50,6 +50,13 @@ public interface WebSocketConnectionListener { */ void onConnect(WebSocketContext context); + /** + * Implement this method to process websocket connection close event. + * + * @param context the web socket context + */ + void onClose(WebSocketContext context); + @NoAutoRegister class DelayedResolveProxy implements WebSocketConnectionListener { WebSocketConnectionListener realListener; @@ -69,19 +76,31 @@ public void onConnect(WebSocketContext context) { E.illegalStateIf(null == realListener); realListener.onConnect(context); } + + @Override + public void onClose(WebSocketContext context) { + E.illegalStateIf(null == realListener); + realListener.onClose(context); + } } @Singleton - class Manager extends LogSupportedDestroyableBase { + public class Manager extends LogSupportedDestroyableBase { // NOTE we have to leave it as public // as the Finder will be load by Application class loader // while the manager is not public List freeListeners = new ArrayList<>(); - public void notifyFreeListeners(WebSocketContext context) { - for (WebSocketConnectionListener listener: freeListeners) { - listener.onConnect(context); + public void notifyFreeListeners(WebSocketContext context, boolean close) { + if (close) { + for (WebSocketConnectionListener listener : freeListeners) { + listener.onClose(context); + } + } else { + for (WebSocketConnectionListener listener : freeListeners) { + listener.onConnect(context); + } } } diff --git a/src/main/java/act/ws/WebSocketConnectionManager.java b/src/main/java/act/ws/WebSocketConnectionManager.java index fd4e8604c..d8fc97c7c 100644 --- a/src/main/java/act/ws/WebSocketConnectionManager.java +++ b/src/main/java/act/ws/WebSocketConnectionManager.java @@ -21,7 +21,7 @@ */ import act.app.*; -import act.event.ActEventListenerBase; +import act.app.event.SysEventId; import act.util.Stateless; import act.xio.WebSocketConnection; import com.alibaba.fastjson.JSON; @@ -52,23 +52,32 @@ public class WebSocketConnectionManager extends AppServiceBase() { - @Override - public void on(WebSocketCloseEvent event) { - WebSocketContext ctx = event.source(); - closed.put(ctx, ctx); - closed.put(ctx.connection(), ctx.connection()); - } - }); app.jobManager().every(new Runnable() { @Override public void run() { purgeClosed(); } }, app.config().wsPurgeClosedConnPeriod(), TimeUnit.SECONDS); + app.jobManager().on(SysEventId.SINGLETON_PROVISIONED, new Runnable() { + @Override + public void run() { + WebSocketConnectionListener.Manager manager = app.getInstance(WebSocketConnectionListener.Manager.class); + manager.freeListeners.add(new WebSocketConnectionListener() { + @Override + public void onConnect(WebSocketContext context) { + } + + @Override + public void onClose(WebSocketContext context) { + closed.put(context, context); + closed.put(context.connection(), context.connection()); + } + }); + } + }); } public WebSocketConnectionRegistry sessionRegistry() { diff --git a/src/main/java/act/xio/WebSocketConnectionHandler.java b/src/main/java/act/xio/WebSocketConnectionHandler.java index ef15a8b2b..68372ddf4 100644 --- a/src/main/java/act/xio/WebSocketConnectionHandler.java +++ b/src/main/java/act/xio/WebSocketConnectionHandler.java @@ -187,10 +187,18 @@ protected final void _onConnect(WebSocketContext context) { if (null != connectionListener) { connectionListener.onConnect(context); } - connectionListenerManager.notifyFreeListeners(context); + connectionListenerManager.notifyFreeListeners(context, false); Act.eventBus().emit(new WebSocketConnectEvent(context)); } + protected final void _onClose(WebSocketContext context) { + if (null != connectionListener) { + connectionListener.onClose(context); + } + connectionListenerManager.notifyFreeListeners(context, true); + Act.eventBus().emit(new WebSocketCloseEvent(context)); + } + @Override public String toString() { return "websocket connection handler"; diff --git a/src/main/java/act/xio/undertow/UndertowWebSocketConnectionHandler.java b/src/main/java/act/xio/undertow/UndertowWebSocketConnectionHandler.java index daed60103..1927c190d 100644 --- a/src/main/java/act/xio/undertow/UndertowWebSocketConnectionHandler.java +++ b/src/main/java/act/xio/undertow/UndertowWebSocketConnectionHandler.java @@ -78,7 +78,7 @@ protected void onClose(WebSocketChannel webSocketChannel, StreamSourceFrameChann WebSocketContext.current(wsCtx); super.onClose(webSocketChannel, channel); connection.destroy(); - context.app().eventBus().emit(new WebSocketCloseEvent(wsCtx)); + UndertowWebSocketConnectionHandler.this._onClose(wsCtx); } }); channel.resumeReceives(); diff --git a/testapps/GH991/src/main/java/test/AppEntry.java b/testapps/GH991/src/main/java/test/AppEntry.java index 20b5b5a9d..c7ec177ff 100644 --- a/testapps/GH991/src/main/java/test/AppEntry.java +++ b/testapps/GH991/src/main/java/test/AppEntry.java @@ -1,6 +1,8 @@ package test; import act.Act; +import act.event.OnEvent; +import act.util.LogSupport; import act.ws.*; import org.osgl.mvc.annotation.GetAction; @@ -12,15 +14,26 @@ * in the browser! */ @SuppressWarnings("unused") -public class AppEntry { +@WsEndpoint("/ws2") +public class AppEntry extends LogSupport { @WsEndpoint("/ws") - public static class WsConnHandler implements WebSocketConnectionListener { + public static class WsConnHandler extends LogSupport implements WebSocketConnectionListener { @Override public void onConnect(WebSocketContext context) { int n = context.manager().urlRegistry().count(); context.send("count: " + n); } + + @Override + public void onClose(WebSocketContext context) { + info("Connection closed: " + context.url()); + } + } + + @OnEvent + public void onClose(WebSocketCloseEvent event) { + info(">>> Connection closed: " + event.source().url()); } @GetAction diff --git a/testapps/GH991/src/main/resources/rythm/test/AppEntry/home.html b/testapps/GH991/src/main/resources/rythm/test/AppEntry/home.html index eea17c399..e80c9efbc 100644 --- a/testapps/GH991/src/main/resources/rythm/test/AppEntry/home.html +++ b/testapps/GH991/src/main/resources/rythm/test/AppEntry/home.html @@ -21,6 +21,7 @@

                                                                                                                                                                      GH991 - websocket connection not released after closed

                                                                                                                                                                      ws.onmessage = function(event) { alert(event.data) } + var ws2 = $.createWebSocket("/ws2") From f8694d11a158027c85a7b342b585cd82afcbbf84 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 06:43:41 +1100 Subject: [PATCH 280/730] add test case for GH990 --- .../src/main/java/ghissues/Gh990.java | 46 +++++++++++++++++++ .../src/main/resources/test/scenarios/990.yml | 9 ++++ 2 files changed, 55 insertions(+) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh990.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/990.yml diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh990.java b/testapps/GHIssues/src/main/java/ghissues/Gh990.java new file mode 100644 index 000000000..64b942e25 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh990.java @@ -0,0 +1,46 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; +import javax.inject.Named; + +@UrlContext("990") +public class Gh990 extends BaseController { + + @Inject + @Named("a") + private P p; + + @GetAction + public String say(){ + return p.say(); + } + + public interface P { + String say(); + } + + @Named("a") + public static class A implements P{ + public String say(){ + return (this.getClass().getSimpleName()); + } + } + + @Named("b") + public static class B implements P{ + public String say(){ + return (this.getClass().getSimpleName()); + } + } + + public static class Module extends org.osgl.inject.Module { + @Override + protected void configure() { + bind(P.class).to(A.class).named("a"); + } + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/990.yml b/testapps/GHIssues/src/main/resources/test/scenarios/990.yml new file mode 100644 index 000000000..457b6c812 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/990.yml @@ -0,0 +1,9 @@ +Scenario(990): + description: "[990] @Named inject fail #990" + interactions: + - description: Test + request: + get: /990 + response: + json: + result: A From 83d52a03797af98293975d7b3f5071695d7f6a5b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 09:51:44 +1100 Subject: [PATCH 281/730] fix Hot reload in dev mode always fail at the first POST request --- CHANGELOG.md | 1 + src/main/java/act/xio/undertow/UndertowNetworkDispatcher.java | 2 ++ testapps/GHIssues/pom.xml | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d6435456..5ea7a9839 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.15** +* Hot reload in dev mode always fail at the first POST request #989 * Add method to handle connection close event to `WebSocketConnectionListener` #994 * websocket connection not released after closed #991 diff --git a/src/main/java/act/xio/undertow/UndertowNetworkDispatcher.java b/src/main/java/act/xio/undertow/UndertowNetworkDispatcher.java index 342a6380f..6c5b568e4 100644 --- a/src/main/java/act/xio/undertow/UndertowNetworkDispatcher.java +++ b/src/main/java/act/xio/undertow/UndertowNetworkDispatcher.java @@ -22,6 +22,7 @@ import act.xio.NetworkDispatcher; import act.xio.NetworkJob; +import io.undertow.server.Connectors; import io.undertow.server.HttpServerExchange; class UndertowNetworkDispatcher implements NetworkDispatcher { @@ -42,6 +43,7 @@ public void dispatch(NetworkJob job) { @Override public void keep() { if (!this.dispatched) { + Connectors.resetRequestChannel(exchange); exchange.getRequestChannel().resumeReads(); } } diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index e2dd11b08..d402c8009 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.12.0-SNAPSHOT + 1.8.14.0 @@ -26,7 +26,7 @@ org.actframework act - 1.8.14-SNAPSHOT + 1.8.15-SNAPSHOT org.actframework From 2567b8a19da18c7050d7e14dffb18bb6f0e5e952 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 10:33:34 +1100 Subject: [PATCH 282/730] @After @Finally not effect when @Valid failed #988 --- CHANGELOG.md | 1 + .../builtin/controller/impl/ReflectedHandlerInvoker.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ea7a9839..5185717bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.15** +* @After @Finally not effect when @Valid failed #988 * Hot reload in dev mode always fail at the first POST request #989 * Add method to handle connection close event to `WebSocketConnectionListener` #994 * websocket connection not released after closed #991 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index ce045bb19..7813df82f 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -20,6 +20,7 @@ * #L% */ +import static act.app.ActionContext.State.HANDLING; import static act.app.ActionContext.State.INTERCEPTING; import act.Act; @@ -576,7 +577,7 @@ public Result handle(final ActionContext context) { context.ensureCaptcha(); Map violations = context.violations(); - if (!violations.isEmpty()) { + if (HANDLING == context.state() && !violations.isEmpty()) { if (null != validateViolationAdvice) { Result r = null; From ce19bd4cba5e7368fe24e6adbf7d5bd6022695c4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 10:40:34 +1100 Subject: [PATCH 283/730] SimpleRestfulServiceBase update enhancement #976 --- CHANGELOG.md | 1 + src/main/java/act/app/util/SimpleRestfulServiceBase.java | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5185717bf..5f97bdf81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.15** +* SimpleRestfulServiceBase 'update' enhancement #976 * @After @Finally not effect when @Valid failed #988 * Hot reload in dev mode always fail at the first POST request #989 * Add method to handle connection close event to `WebSocketConnectionListener` #994 diff --git a/src/main/java/act/app/util/SimpleRestfulServiceBase.java b/src/main/java/act/app/util/SimpleRestfulServiceBase.java index e8d8cbf6a..9220b1abf 100644 --- a/src/main/java/act/app/util/SimpleRestfulServiceBase.java +++ b/src/main/java/act/app/util/SimpleRestfulServiceBase.java @@ -24,6 +24,7 @@ import act.db.*; import act.inject.param.NoBind; import act.util.PropertySpec; +import com.alibaba.fastjson.JSONObject; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.mvc.annotation.*; @@ -68,6 +69,12 @@ public MODEL_TYPE create(MODEL_TYPE model) { return dao.save(model); } + @PutAction("{id}") + public void update(@DbBind("id") MODEL_TYPE model, JSONObject data) { + $.merge(data).to(model); + dao.save(model); + } + @DeleteAction("{id}") public void delete(ID_TYPE id) { dao.deleteById(id); From c4f192726ceb65223e73a76a2f5bacf886de2e0a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 11:19:59 +1100 Subject: [PATCH 284/730] #976 - add automate test case; tune the implementation --- .../app/util/SimpleRestfulServiceBase.java | 11 ++++---- .../src/main/java/ghissues/Gh976.java | 11 ++++++++ .../src/main/java/ghissues/gh976/Foo.java | 19 +++++++++++++ .../src/main/resources/test/scenarios/976.yml | 27 +++++++++++++++++++ 4 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh976.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh976/Foo.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/976.yml diff --git a/src/main/java/act/app/util/SimpleRestfulServiceBase.java b/src/main/java/act/app/util/SimpleRestfulServiceBase.java index 9220b1abf..292a78271 100644 --- a/src/main/java/act/app/util/SimpleRestfulServiceBase.java +++ b/src/main/java/act/app/util/SimpleRestfulServiceBase.java @@ -24,7 +24,6 @@ import act.db.*; import act.inject.param.NoBind; import act.util.PropertySpec; -import com.alibaba.fastjson.JSONObject; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.mvc.annotation.*; @@ -58,8 +57,8 @@ public Iterable list() { return dao.findAll(); } - @GetAction("{id}") - public MODEL_TYPE get(@DbBind("id") MODEL_TYPE model) { + @GetAction("{model}") + public MODEL_TYPE get(@DbBind MODEL_TYPE model) { return model; } @@ -69,9 +68,9 @@ public MODEL_TYPE create(MODEL_TYPE model) { return dao.save(model); } - @PutAction("{id}") - public void update(@DbBind("id") MODEL_TYPE model, JSONObject data) { - $.merge(data).to(model); + @PutAction("{model}") + public void update(@DbBind MODEL_TYPE model, MODEL_TYPE data) { + $.merge(data).filter("-id").to(model); dao.save(model); } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh976.java b/testapps/GHIssues/src/main/java/ghissues/Gh976.java new file mode 100644 index 000000000..519728240 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh976.java @@ -0,0 +1,11 @@ +package ghissues; + +import act.app.util.SimpleRestfulServiceBase; +import act.controller.annotation.UrlContext; +import act.handler.NoReturnValueAdvice; +import ghissues.gh976.Foo; + +@UrlContext("976") +@NoReturnValueAdvice +public class Gh976 extends SimpleRestfulServiceBase { +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh976/Foo.java b/testapps/GHIssues/src/main/java/ghissues/gh976/Foo.java new file mode 100644 index 000000000..ee4641235 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh976/Foo.java @@ -0,0 +1,19 @@ +package ghissues.gh976; + +import act.db.jpa.JPADao; +import act.util.SimpleBean; + +import javax.persistence.*; + +@Entity(name = "foo976") +public class Foo implements SimpleBean { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + + public String name; + + public static class Dao extends JPADao { + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/976.yml b/testapps/GHIssues/src/main/resources/test/scenarios/976.yml new file mode 100644 index 000000000..da9022a79 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/976.yml @@ -0,0 +1,27 @@ +Scenario(976): + description: "[GH976] SimpleRestfulServiceBase 'update' enhancement" + interactions: + - description: create data + request: + post: 976 + params: + name: abc + cache: + dataId: id + - description: verify data create + request: + get: 976/${dataId} + response: + json: + name: abc + - description: update data + request: + put: 976/${dataId} + params: + name: xyz + - description: verify data update + request: + get: 976/${dataId} + response: + json: + name: xyz From 7d3e65b5792d786389330b15cd3df3518ff10fc4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 12:48:25 +1100 Subject: [PATCH 285/730] compile-api-book error when super class has generics #987 --- CHANGELOG.md | 1 + pom.xml | 2 +- .../java/act/inject/param/JsonDtoClassManager.java | 12 ++++++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f97bdf81..68353dd24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.15** +* compile-api-book error when super class has generics #987 * SimpleRestfulServiceBase 'update' enhancement #976 * @After @Finally not effect when @Valid failed #988 * Hot reload in dev mode always fail at the first POST request #989 diff --git a/pom.xml b/pom.xml index 41f3d417d..675f1c480 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ 3.10.0 1.18.2 1.5.0 - 1.9.0 + 1.9.1-SNAPSHOT 1.9.0 1.9.0 1.8.0 diff --git a/src/main/java/act/inject/param/JsonDtoClassManager.java b/src/main/java/act/inject/param/JsonDtoClassManager.java index 22c9655ff..8e5996364 100644 --- a/src/main/java/act/inject/param/JsonDtoClassManager.java +++ b/src/main/java/act/inject/param/JsonDtoClassManager.java @@ -207,7 +207,8 @@ private void extractBeanSpec(List beanSpecs, Method method, Class host Annotation[][] annotations = ReflectedInvokerHelper.requestHandlerMethodParamAnnotations(method); for (int i = 0; i < sz; ++i) { Type type = paramTypes[i]; - if (type instanceof TypeVariable && !Modifier.isStatic(method.getModifiers())) { + boolean isStatic = Modifier.isStatic(method.getModifiers()); + if (type instanceof TypeVariable && !isStatic) { // explore type variable impl TypeVariable typeVar = $.cast(type); String typeVarName = typeVar.getName(); @@ -219,7 +220,14 @@ private void extractBeanSpec(List beanSpecs, Method method, Class host } } Annotation[] anno = annotations[i]; - BeanSpec spec = BeanSpec.of(type, anno, injector); + BeanSpec spec; + if (type instanceof ParameterizedType && !isStatic) { + // find all generic types on host + Map typeVarLookup = Generics.buildTypeParamImplLookup(host); + spec = BeanSpec.of(type, anno, injector, typeVarLookup); + } else { + spec = BeanSpec.of(type, anno, injector); + } if (ParamValueLoaderService.providedButNotDbBind(spec, injector)) { continue; } From 128c7039b0bd9e187afcabfc3a2d3d1846f3df92 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 17:06:11 +1100 Subject: [PATCH 286/730] `IllegalAccessError` triggered while running `mi` command #995 --- CHANGELOG.md | 1 + src/main/java/act/Act.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68353dd24..3b1af08b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.15** +* `IllegalAccessError` triggered while running `mi` command #995 * compile-api-book error when super class has generics #987 * SimpleRestfulServiceBase 'update' enhancement #976 * @After @Finally not effect when @Valid failed #988 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 21a85fb3e..1c89b0004 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -725,7 +725,7 @@ public static void start(String appName, String scanPackage, Version appVersion) bootstrap(AppDescriptor.of(appName, scanPackage, appVersion)); } - static int classCacheSize() { + public static int classCacheSize() { return ((FullStackAppBootstrapClassLoader) Act.class.getClassLoader()).libBCSize(); } From 44515d7448f3408690bb9d220d3f32097b9cc6a2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 17:23:21 +1100 Subject: [PATCH 287/730] `mi` make it display number in MB by default #996 --- CHANGELOG.md | 1 + src/main/java/act/SysUtilAdmin.java | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b1af08b6..625b738a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.15** +* `mi` make it display number in MB by default #996 * `IllegalAccessError` triggered while running `mi` command #995 * compile-api-book error when super class has generics #987 * SimpleRestfulServiceBase 'update' enhancement #976 diff --git a/src/main/java/act/SysUtilAdmin.java b/src/main/java/act/SysUtilAdmin.java index 4961df7d9..13cbd1370 100644 --- a/src/main/java/act/SysUtilAdmin.java +++ b/src/main/java/act/SysUtilAdmin.java @@ -49,10 +49,10 @@ public String pid() { @Command(name = "act.meminfo, act.mi", help = "Print memory info") public void memInfo( @act.cli.Optional("monitor memory usage") boolean monitor, - @act.cli.Optional("readable") boolean readable, + @act.cli.Optional(lead = "-b,--bytes", help = "display number in bytes") boolean bytes, CliContext context ) { - final int factor = readable ? 1024 * 1024 : 1; + final int factor = bytes ? 1 : 1024 * 1024; Runtime runtime = Runtime.getRuntime(); if (monitor) { @@ -105,7 +105,7 @@ public void memInfo( public void gc(CliContext context) { System.gc(); context.println("GC executed"); - memInfo(false, true, context); + memInfo(false, false, context); } @Command(name = "act.pwd", help = "Print name of the current working directory") From c58d3c95b79b29896667aa8609aa2ccd73f35aee Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 18:01:38 +1100 Subject: [PATCH 288/730] Introduce `@CommandPrefix` annotation #982 --- CHANGELOG.md | 1 + src/main/java/act/cli/CliDispatcher.java | 36 +++++++++++++++++- src/main/java/act/cli/CommandPrefix.java | 37 +++++++++++++++++++ .../meta/CommanderClassMetaInfoManager.java | 4 -- 4 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 src/main/java/act/cli/CommandPrefix.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 625b738a2..0cd24a947 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.15** +* Introduce `@CommandPrefix` annotation #982 * `mi` make it display number in MB by default #996 * `IllegalAccessError` triggered while running `mi` command #995 * compile-api-book error when super class has generics #987 diff --git a/src/main/java/act/cli/CliDispatcher.java b/src/main/java/act/cli/CliDispatcher.java index 4377b5902..b25d0bd7f 100644 --- a/src/main/java/act/cli/CliDispatcher.java +++ b/src/main/java/act/cli/CliDispatcher.java @@ -23,6 +23,7 @@ import act.Act; import act.app.App; import act.app.AppServiceBase; +import act.app.event.SysEventId; import act.cli.builtin.Exit; import act.cli.builtin.Help; import act.cli.builtin.IterateCursor; @@ -64,6 +65,12 @@ public void run() { registerBuiltInHandlers(); } }); + app.jobManager().on(SysEventId.PRE_START, new Runnable() { + @Override + public void run() { + resolveCommandPrefix(); + } + }); } public CliDispatcher registerCommandHandler(String command, CommandMethodMetaInfo methodMetaInfo, CommanderClassMetaInfo classMetaInfo) { @@ -72,7 +79,7 @@ public CliDispatcher registerCommandHandler(String command, CommandMethodMetaInf if (registry.containsKey(s)) { throw E.invalidConfiguration("Command %s already registered", command); } - addToRegistry(s, new CliHandlerProxy(classMetaInfo, methodMetaInfo, app())); + addToRegistry0(s, new CliHandlerProxy(classMetaInfo, methodMetaInfo, app())); logger.debug("Command registered: %s", s); } return this; @@ -170,6 +177,10 @@ protected void releaseResources() { registry.clear(); } + private void addToRegistry0(String name, CliHandler handler) { + registry.put(name, handler); + } + private void addToRegistry(String name, CliHandler handler) { registry.put(name, handler); Help.updateMaxWidth(name.length()); @@ -177,6 +188,29 @@ private void addToRegistry(String name, CliHandler handler) { registerShortCut(name, handler); } + private void resolveCommandPrefix() { + Map temp = new HashMap<>(); + temp.putAll(registry); + registry.clear(); + App app = app(); + for (Map.Entry pair : temp.entrySet()) { + String name = pair.getKey(); + CliHandler handler = pair.getValue(); + if (handler instanceof CliHandlerProxy) { + CliHandlerProxy proxy = $.cast(handler); + Class type = app.classForName(proxy.classMetaInfo().className()); + CommandPrefix prefix = type.getAnnotation(CommandPrefix.class); + if (null != prefix) { + String pre = prefix.value(); + if (S.notBlank(pre)) { + name = S.pathConcat(pre, '.', name); + } + } + } + addToRegistry(name, handler); + } + } + private void updateNameIndex(String name, CliHandler handler) { List nameList = nameMap.get(handler); if (null == nameList) { diff --git a/src/main/java/act/cli/CommandPrefix.java b/src/main/java/act/cli/CommandPrefix.java new file mode 100644 index 000000000..156b11552 --- /dev/null +++ b/src/main/java/act/cli/CommandPrefix.java @@ -0,0 +1,37 @@ +package act.cli; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Mark on a class to define common prefix for + * all {@link Command} method defined in the class + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface CommandPrefix { + /** + * Specify the prefix of the command + * @return the command prefix + */ + String value(); +} diff --git a/src/main/java/act/cli/meta/CommanderClassMetaInfoManager.java b/src/main/java/act/cli/meta/CommanderClassMetaInfoManager.java index 99153e0bb..ffa11d00a 100644 --- a/src/main/java/act/cli/meta/CommanderClassMetaInfoManager.java +++ b/src/main/java/act/cli/meta/CommanderClassMetaInfoManager.java @@ -24,8 +24,6 @@ import act.asm.Type; import act.util.LogSupportedDestroyableBase; -import org.osgl.logging.LogManager; -import org.osgl.logging.Logger; import java.util.*; import javax.enterprise.context.ApplicationScoped; @@ -33,8 +31,6 @@ @ApplicationScoped public class CommanderClassMetaInfoManager extends LogSupportedDestroyableBase { - private static final Logger logger = LogManager.get(CommanderClassMetaInfoManager.class); - private Map commands = new HashMap<>(); private Map> subTypeInfo = new HashMap<>(); From 246ca15a611b847818065ed9c7989c1345409349 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 21:01:45 +1100 Subject: [PATCH 289/730] prepare for 1.8.15 release --- CHANGELOG.md | 2 +- README.md | 10 +++++----- VERSION_MATRIX.md | 2 +- pom.xml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cd24a947..c696002ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.15** +**1.8.15** 30/Nov/2018 * Introduce `@CommandPrefix` annotation #982 * `mi` make it display number in MB by default #996 * `IllegalAccessError` triggered while running `mi` command #995 diff --git a/README.md b/README.md index a87ce94c7..be5706fbd 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.14.0 + 1.8.15.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.14.0 + -DarchetypeVersion=1.8.15.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.14.0 + -DarchetypeVersion=1.8.15.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.14.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.15.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.14.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.15.0 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index ad86a911d..da760e4cd 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,6 +1,6 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.14 | +| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.15 | | --- | ----: | ----: | ----: | ----: | ----: | | aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.2 | | beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | 1.4.6 | diff --git a/pom.xml b/pom.xml index 675f1c480..798f118df 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ 3.10.0 1.18.2 1.5.0 - 1.9.1-SNAPSHOT + 1.9.1 1.9.0 1.9.0 1.8.0 From 9f53c9faaccf25425b32d5ee660a30f6d2921d91 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 21:03:24 +1100 Subject: [PATCH 290/730] [maven-release-plugin] prepare release act-1.8.15 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 798f118df..89ad1168a 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.15-SNAPSHOT + 1.8.15 ACT Framework The ACT full stack MVC framework From 2496217e1900fef8de28c8c7e8a96d2f419f7705 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 21:03:40 +1100 Subject: [PATCH 291/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 89ad1168a..931906365 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.15 + 1.8.16-SNAPSHOT ACT Framework The ACT full stack MVC framework From f7b39ee53f44f8881c169054bd385b57a880b1ee Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 30 Nov 2018 21:50:57 +1100 Subject: [PATCH 292/730] update GHIssues project pom --- legacy-testapp/pom.xml | 2 +- testapps/GHIssues/pom.xml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index a7ed81233..228f569ad 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.14-SNAPSHOT + 1.8.15 [0.13.0, 2.0.0) 1.6.4 testapp.TestApp diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index d402c8009..c71203d97 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -5,14 +5,14 @@ 4.0.0 act-ghissues - 1.8.12.0 + 1.8.15.0 ActFramework Github Issue Reproduce App org.actframework act-starter-parent - 1.8.14.0 + 1.8.15.0 @@ -22,12 +22,12 @@ - + org.actframework act-excel From 1c230bc787e9aff84d23ddf6c833c328776c89d6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 1 Dec 2018 10:15:10 +1100 Subject: [PATCH 293/730] Make `CommandPrefix` be inheritable #998 --- CHANGELOG.md | 3 +++ src/main/java/act/cli/CommandPrefix.java | 1 + 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c696002ac..3147fbb42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # ActFramework Change Log +**1.8.16** +* Make `CommandPrefix` be inheritable #998 + **1.8.15** 30/Nov/2018 * Introduce `@CommandPrefix` annotation #982 * `mi` make it display number in MB by default #996 diff --git a/src/main/java/act/cli/CommandPrefix.java b/src/main/java/act/cli/CommandPrefix.java index 156b11552..165088075 100644 --- a/src/main/java/act/cli/CommandPrefix.java +++ b/src/main/java/act/cli/CommandPrefix.java @@ -28,6 +28,7 @@ */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Inherited public @interface CommandPrefix { /** * Specify the prefix of the command From 5039da29822eb51c2b05672318dde99d5bfc0f64 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 2 Dec 2018 09:53:20 +1100 Subject: [PATCH 294/730] - Request handler argument type with type parameter does not work #1000 - compile-api-book error when super class has generics v2 #999 --- CHANGELOG.md | 1 + pom.xml | 2 +- src/main/java/act/apidoc/Endpoint.java | 2 +- .../inject/param/ParamValueLoaderService.java | 16 ++++++---------- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3147fbb42..63ded4e79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ **1.8.16** * Make `CommandPrefix` be inheritable #998 +* Request handler argument type with type parameter does not work #1000 **1.8.15** 30/Nov/2018 * Introduce `@CommandPrefix` annotation #982 diff --git a/pom.xml b/pom.xml index 931906365..9e9320fdf 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ 3.10.0 1.18.2 1.5.0 - 1.9.1 + 1.9.2-SNAPSHOT 1.9.0 1.9.0 1.8.0 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 3a4013913..8deac8785 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -570,7 +570,7 @@ public static Object generateSampleData( if (void.class == type) { return null; } - if (typeChain.contains(type) && !isCollection(type)) { + if (typeChain.contains(type) && !isCollection(type) && !$.isSimpleType(spec.rawType())) { return S.concat(spec.name(), ":", type); // circular reference detected } typeChain.add(type); diff --git a/src/main/java/act/inject/param/ParamValueLoaderService.java b/src/main/java/act/inject/param/ParamValueLoaderService.java index 4cb53a953..1c443d2ce 100644 --- a/src/main/java/act/inject/param/ParamValueLoaderService.java +++ b/src/main/java/act/inject/param/ParamValueLoaderService.java @@ -305,16 +305,11 @@ protected ParamValueLoader[] findMethodParamLoaders( for (int i = 0; i < sz; ++i) { String name = paramName(i); Type type = types[i]; - if (type instanceof TypeVariable) { - TypeVariable var = $.cast(type); - if (null != host) { - type = Generics.buildTypeParamImplLookup(host).get(var.getName()); - } - if (null == type) { - throw new UnexpectedException("Cannot infer param type: %s", var.getName()); - } + Map typeLookups = null; + if (type instanceof TypeVariable || type instanceof ParameterizedType) { + typeLookups = Generics.buildTypeParamImplLookup(host); } - BeanSpec spec = BeanSpec.of(type, annotations[i], name, injector); + BeanSpec spec = BeanSpec.of(type, annotations[i], name, injector, typeLookups); if (hasValidationConstraint(spec)) { hasValidationConstraint.set(true); } @@ -468,9 +463,10 @@ ParamValueLoader buildLoader(final ParamKey key, BeanSpec spec) { return buildArrayLoader(key, rawType.getComponentType(), spec); } if (Collection.class.isAssignableFrom(rawType)) { + List typeParams = spec.typeParams(); Type elementType = Object.class; if (type instanceof ParameterizedType) { - elementType = ((ParameterizedType) type).getActualTypeArguments()[0]; + elementType = typeParams.get(0); } return buildCollectionLoader(key, rawType, elementType, spec); } From 35e921605e329235e1d4e58dc9046f874e62b562 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 3 Dec 2018 15:25:35 +1100 Subject: [PATCH 295/730] add test script for GH 1001 --- src/main/java/act/data/UrlEncodedParser.java | 2 +- testapps/GHIssues/pom.xml | 5 ++--- .../src/main/java/ghissues/Gh1001.java | 19 +++++++++++++++++++ .../main/resources/test/scenarios/1001.yml | 14 ++++++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1001.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1001.yml diff --git a/src/main/java/act/data/UrlEncodedParser.java b/src/main/java/act/data/UrlEncodedParser.java index 62d1459d2..4b8ac300a 100644 --- a/src/main/java/act/data/UrlEncodedParser.java +++ b/src/main/java/act/data/UrlEncodedParser.java @@ -58,7 +58,7 @@ public Map parse(ActionContext context) { String data = new String(os.toByteArray(), encoding); if (data.length() == 0) { //data is empty - can skip the rest - return new HashMap(0); + return new HashMap<>(0); } // check if data is in JSON format diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index c71203d97..36c082091 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -22,12 +22,11 @@ - + 1.8.16-SNAPSHOT + org.actframework act-excel diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1001.java b/testapps/GHIssues/src/main/java/ghissues/Gh1001.java new file mode 100644 index 000000000..98449f1a4 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1001.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1001") +public class Gh1001 extends BaseController { + + public static class Foo { + public int id; + public String name; + } + + @GetAction + public Foo test(Foo foo) { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1001.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1001.yml new file mode 100644 index 000000000..e935ed904 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1001.yml @@ -0,0 +1,14 @@ +Scenario(1001): + description: "[1001] HTTP GET support json auto bind to obj #1001" + interactions: + - description: Test + request: + headers: + content-type: application/json + get: /1001 + params: + _body: '{"id":1,"name":"foo"}' + response: + json: + id: 1 + name: foo From dcd78784a4b8fe4ac6840797d3de48af31cd6f08 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 3 Dec 2018 20:10:07 +1100 Subject: [PATCH 296/730] Make `TimestampAuditor` defined in act-jpa project be common #1002 --- CHANGELOG.md | 1 + src/main/java/act/app/DbServiceManager.java | 4 +- src/main/java/act/db/util/AuditHelper.java | 231 ++++++++++++++++++++ 3 files changed, 234 insertions(+), 2 deletions(-) create mode 100644 src/main/java/act/db/util/AuditHelper.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 63ded4e79..965425eb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.16** +* Make `TimestampAuditor` defined in act-jpa project be common #1002 * Make `CommandPrefix` be inheritable #998 * Request handler argument type with type parameter does not work #1000 diff --git a/src/main/java/act/app/DbServiceManager.java b/src/main/java/act/app/DbServiceManager.java index 077e99f29..1f3926f3d 100644 --- a/src/main/java/act/app/DbServiceManager.java +++ b/src/main/java/act/app/DbServiceManager.java @@ -25,8 +25,7 @@ import act.app.event.SysEventId; import act.conf.AppConfig; import act.db.*; -import act.db.util.SequenceNumberGenerator; -import act.db.util._SequenceNumberGenerator; +import act.db.util.*; import act.event.ActEventListenerBase; import act.event.EventBus; import act.event.SysEventListenerBase; @@ -76,6 +75,7 @@ public void run() { app.emit(SysEventId.DB_SVC_LOADED); initDao(); app.emit(SysEventId.DB_SVC_PROVISIONED); + app.getInstance(AuditHelper.class); } private void initDao() { diff --git a/src/main/java/act/db/util/AuditHelper.java b/src/main/java/act/db/util/AuditHelper.java new file mode 100644 index 000000000..45ffd6e2d --- /dev/null +++ b/src/main/java/act/db/util/AuditHelper.java @@ -0,0 +1,231 @@ +package act.db.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.App; +import act.app.event.SysEventId; +import act.db.*; +import act.db.meta.*; +import act.plugin.PrincipalProvider; +import act.util.*; +import org.osgl.$; +import org.osgl.Lang; +import org.osgl.util.E; + +import java.lang.reflect.Field; +import java.util.*; +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; + +@Stateless +public class AuditHelper { + private Map createdAtLookup = new HashMap<>(); + private Map lastModifiedAtLookup = new HashMap<>(); + private Map createdByLookup = new HashMap<>(); + private Map lastModifiedByLookup = new HashMap<>(); + + public AuditHelper() { + buildLookups(); + final App app = Act.app(); + final AuditHelper me = this; + // register singleton as the first AuditHelper could be initialized + // by ORM lib e.g Hibernate + app.jobManager().on(SysEventId.SINGLETON_PROVISIONED, new Runnable() { + @Override + public void run() { + app.registerSingleton(me); + } + }, true); + } + + @PrePersist + public void prePersist(Object entity) { + Class entityType = entity.getClass(); + apply(createdAtLookup.get(entityType), entity); + apply(lastModifiedAtLookup.get(entityType), entity); + apply(createdByLookup.get(entityType), entity); + apply(lastModifiedByLookup.get(entityType), entity); + } + + @PreUpdate + public void preUpdate(Object entity) { + Class entityType = entity.getClass(); + apply(lastModifiedAtLookup.get(entityType), entity); + apply(lastModifiedByLookup.get(entityType), entity); + } + + private void buildLookups() { + final App app = Act.app(); + MasterEntityMetaInfoRepo masterRepo = app.entityMetaInfoRepo(); + final DbManager dbManager = Act.dbManager(); + ClassInfoRepository classInfoRepository = app.classLoader().classInfoRepository(); + for (DbService db : app.dbServiceManager().registeredServices()) { + final EntityMetaInfoRepo repo = masterRepo.forDb(db.id()); + final Set entityClasses = new HashSet<>(repo.entityClasses()); + for (Class entityClass : repo.entityClasses()) { + if (!entityClasses.contains(entityClass)) { + continue; + } + final EntityClassMetaInfo classInfo = repo.classMetaInfo(entityClass); + EntityFieldMetaInfo fieldInfo = classInfo.createdAtField(); + if (null != fieldInfo) { + final Field field = $.requireNotNull($.fieldOf(entityClass, fieldInfo.fieldName())); + field.setAccessible(true); + final TimestampFieldVisitor timestampFieldVisitor = new TimestampFieldVisitor(field, dbManager); + createdAtLookup.put(entityClass, timestampFieldVisitor); + final ClassNode node = classInfoRepository.node(entityClass.getName()); + node.visitSubTree(new $.Visitor() { + @Override + public void visit(ClassNode classNode) throws $.Break { + String className = classNode.name(); + EntityClassMetaInfo classInfo = repo.classMetaInfo(className); + if (null == classInfo) { + return; + } + EntityFieldMetaInfo fieldInfo = classInfo.createdAtField(); + if (null == fieldInfo) { + Class entityClass = app.classForName(className); + createdAtLookup.put(entityClass, timestampFieldVisitor); + entityClasses.remove(entityClass); + } + } + }, true, true); + } + fieldInfo = classInfo.createdByField(); + if (null != fieldInfo) { + final Field field = $.requireNotNull($.fieldOf(entityClass, fieldInfo.fieldName())); + field.setAccessible(true); + final PricipalFieldVisitor pricipalFieldVisitor = new PricipalFieldVisitor(field); + createdByLookup.put(entityClass, pricipalFieldVisitor); + final ClassNode node = classInfoRepository.node(entityClass.getName()); + node.visitSubTree(new $.Visitor() { + @Override + public void visit(ClassNode classNode) throws $.Break { + String className = classNode.name(); + EntityClassMetaInfo classInfo = repo.classMetaInfo(className); + if (null == classInfo) { + return; + } + EntityFieldMetaInfo fieldInfo = classInfo.createdByField(); + if (null == fieldInfo) { + Class entityClass = app.classForName(className); + createdByLookup.put(entityClass, pricipalFieldVisitor); + entityClasses.remove(entityClass); + } + } + }, true, true); + } + fieldInfo = classInfo.lastModifiedAtField(); + if (null != fieldInfo) { + Field field = $.requireNotNull($.fieldOf(entityClass, fieldInfo.fieldName())); + final TimestampFieldVisitor timestampFieldVisitor = new TimestampFieldVisitor(field, dbManager); + lastModifiedAtLookup.put(entityClass, timestampFieldVisitor); + final ClassNode node = classInfoRepository.node(entityClass.getName()); + node.visitSubTree(new $.Visitor() { + @Override + public void visit(ClassNode classNode) throws $.Break { + String className = classNode.name(); + EntityClassMetaInfo classInfo = repo.classMetaInfo(className); + if (null == classInfo) { + return; + } + EntityFieldMetaInfo fieldInfo = classInfo.createdAtField(); + if (null == fieldInfo) { + Class entityClass = app.classForName(className); + lastModifiedAtLookup.put(entityClass, timestampFieldVisitor); + entityClasses.remove(entityClass); + } + } + }, true, true); + } + fieldInfo = classInfo.lastModifiedByField(); + if (null != fieldInfo) { + Field field = $.requireNotNull($.fieldOf(entityClass, fieldInfo.fieldName())); + final PricipalFieldVisitor pricipalFieldVisitor = new PricipalFieldVisitor(field); + lastModifiedByLookup.put(entityClass, pricipalFieldVisitor); + final ClassNode node = classInfoRepository.node(entityClass.getName()); + node.visitSubTree(new $.Visitor() { + @Override + public void visit(ClassNode classNode) throws $.Break { + String className = classNode.name(); + EntityClassMetaInfo classInfo = repo.classMetaInfo(className); + if (null == classInfo) { + return; + } + EntityFieldMetaInfo fieldInfo = classInfo.createdByField(); + if (null == fieldInfo) { + Class entityClass = app.classForName(className); + lastModifiedByLookup.put(entityClass, pricipalFieldVisitor); + entityClasses.remove(entityClass); + } + } + }, true, true); + } + } + } + } + + private static void apply($.Visitor visitor, Object entity) { + if (null != visitor) { + visitor.visit(entity); + } + } + + private static class TimestampFieldVisitor extends $.Visitor { + final TimestampGenerator tsGen; + final Field field; + public TimestampFieldVisitor(Field field, DbManager dbManager) { + this.tsGen = dbManager.timestampGenerator(field.getType()); + field.setAccessible(true); + this.field = field; + } + + @Override + public void visit(Object entity) throws $.Break { + try { + field.set(entity, tsGen.now()); + } catch (IllegalAccessException e) { + throw E.unexpected(e); + } + } + } + + private static class PricipalFieldVisitor extends $.Visitor { + final Field field; + final PrincipalProvider principalProvider; + + public PricipalFieldVisitor(Field field) { + field.setAccessible(true); + this.field = field; + this.principalProvider = Act.app().principalProvider(); + } + + @Override + public void visit(Object o) throws Lang.Break { + if (null == o) { + return; + } + $.setFieldValue(o, field, principalProvider.get()); + } + } + +} From 3cbbb9b1260c19cb0beedc3c3c46a56382c5e6ac Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 3 Dec 2018 22:11:33 +1100 Subject: [PATCH 297/730] @PropertySpec and PropertySpec.current.set cannot work when object wrapped by GlobalAdvice #1005 --- CHANGELOG.md | 1 + .../impl/ReflectedHandlerInvoker.java | 7 ++++++ .../src/main/java/ghissues/Gh1005.java | 22 +++++++++++++++++++ .../main/resources/test/scenarios/1005.yml | 18 +++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1005.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1005.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 965425eb8..a79cc1ab1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.16** +* @PropertySpec and PropertySpec.current.set cannot work when object wrapped by GlobalAdvice #1005 * Make `TimestampAuditor` defined in act-jpa project be common #1002 * Make `CommandPrefix` be inheritable #998 * Request handler argument type with type parameter does not work #1000 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 7813df82f..f760573d6 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -1044,6 +1044,13 @@ private static Result transform(Object retVal, ReflectedHandlerInvoker invoker, Lang._MappingStage stage = propertySpec.applyTo(Lang.map(retVal), context); Object newRetVal = returnIterable ? new JSONArray() : new JSONObject(); retVal = stage.to(newRetVal); + } else { + String curSpec = PropertySpec.current.get(); + if (S.notBlank(curSpec)) { + Object newRetVal = returnIterable ? new JSONArray() : new JSONObject(); + retVal = Lang.map(retVal).filter(curSpec).to(newRetVal); + PropertySpec.current.remove(); + } } } retVal = returnValueAdvice.applyTo(retVal, context); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1005.java b/testapps/GHIssues/src/main/java/ghissues/Gh1005.java new file mode 100644 index 000000000..5dcdd2722 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1005.java @@ -0,0 +1,22 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.PropertySpec; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1005") +public class Gh1005 { + + public static class Foo { + public int id; + public boolean flag; + public String name; + } + + @PostAction + public Foo create(Foo foo, String fields) { + PropertySpec.current.set(fields); + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1005.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1005.yml new file mode 100644 index 000000000..35570e8b8 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1005.yml @@ -0,0 +1,18 @@ +Scenario(1005): + description: "[1005] @PropertySpec and PropertySpec.current.set cannot work" + interactions: + - description: Test + request: + post: /1005 + params: + foo.name: foo + foo.flag: true + foo.id: 10 + fields: id,flag + response: + json: + data: + id: 10 + flag: true + name: + - exists: false \ No newline at end of file From 66c0e0c8f01df0929ef53551c095930ec8829dcb Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 6 Dec 2018 22:42:59 +1100 Subject: [PATCH 298/730] fix #1003, #1010, #1009, #1006 --- CHANGELOG.md | 4 ++ pom.xml | 2 +- src/main/java/act/apidoc/ApiManager.java | 20 +++++- src/main/java/act/apidoc/Endpoint.java | 26 ++++---- .../java/act/apidoc/EndpointIdProvider.java | 26 ++++++++ .../act/apidoc/SimpleEndpointIdProvider.java | 63 +++++++++++++++++++ src/main/java/act/event/EventBus.java | 58 ++++++++++++++--- .../impl/ReflectedHandlerInvoker.java | 2 +- 8 files changed, 178 insertions(+), 23 deletions(-) create mode 100644 src/main/java/act/apidoc/EndpointIdProvider.java create mode 100644 src/main/java/act/apidoc/SimpleEndpointIdProvider.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a79cc1ab1..8a32667ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # ActFramework Change Log **1.8.16** +* api-book-compile cannot get comments from super class #1003 +* act test failed when check return data exist #1010 +* Calling mailer method asynchronously by eventBus.trigger didn't work #1009 +* @PropertySpec and PropertySpec.current.set cannot always work when object wrapped by GlobalAdvice #1006 * @PropertySpec and PropertySpec.current.set cannot work when object wrapped by GlobalAdvice #1005 * Make `TimestampAuditor` defined in act-jpa project be common #1002 * Make `CommandPrefix` be inheritable #998 diff --git a/pom.xml b/pom.xml index 9e9320fdf..753c70125 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 2.10.1 1.11.3 3.10.0 - 1.18.2 + 1.18.3-SNAPSHOT 1.5.0 1.9.2-SNAPSHOT 1.9.0 diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index 9e52c9dd6..0ca6efe5a 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -160,10 +160,22 @@ private boolean showEndpoint(String path, RequestHandler handler) { }); } + private Set withSuperClasses(Set classes) { + Set ret = new HashSet<>(classes); + for (Class c : classes) { + c = c.getSuperclass(); + while (c != null && c != Object.class) { + ret.add(c); + c = c.getSuperclass(); + } + } + return ret; + } + private void exploreDescriptions(Set controllerClasses) { DevModeClassLoader cl = $.cast(Act.app().classLoader()); Map methodJavaDocs = new HashMap<>(); - for (Class controllerClass: controllerClasses) { + for (Class controllerClass: withSuperClasses(controllerClasses)) { Source src = cl.source(controllerClass); if (null == src) { continue; @@ -182,6 +194,12 @@ private void exploreDescriptions(Set controllerClasses) { } for (Endpoint endpoint : endpoints) { Javadoc javadoc = methodJavaDocs.get(endpoint.getId()); + if (null == javadoc) { + String parentId = endpoint.getParentId(); + if (null != parentId) { + javadoc = methodJavaDocs.get(parentId); + } + } if (null != javadoc) { String desc = javadoc.getDescription().toText(); if (S.notBlank(desc)) { diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 8deac8785..32d6bb2bd 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -21,6 +21,8 @@ */ import static act.apidoc.SampleDataCategory.EMAIL; +import static act.apidoc.SimpleEndpointIdProvider.id; +import static jdk.nashorn.internal.codegen.CompilerConstants.className; import act.Act; import act.app.data.StringValueResolverManager; @@ -59,7 +61,7 @@ /** * An `Endpoint` represents an API that provides specific service */ -public class Endpoint implements Comparable { +public class Endpoint implements Comparable, EndpointIdProvider { private static final Logger LOGGER = ApiManager.LOGGER; @@ -152,6 +154,8 @@ public enum Scheme { */ private String id; + private EndpointIdProvider parent; + /** * The scheme used to access the endpoint */ @@ -226,6 +230,11 @@ public String getId() { return id; } + @Override + public String getParentId() { + return null == parent ? null : parent.getId(); + } + /** * Returns extends id. This is the concatenation of * {@link #httpMethod} and {@link #id}. This will @@ -329,6 +338,9 @@ private void explore(RequestHandler handler) { Module classModule = controllerClass.getAnnotation(Module.class); String classModuleText = null == classModule ? inferModule(controllerClass) : classModule.value(); this.id = id(controllerClass, method); + if (controllerClass != method.getDeclaringClass()) { + parent = new SimpleEndpointIdProvider(method.getDeclaringClass(), method); + } Type returnType = method.getGenericReturnType(); Map typeParamLookup = C.Map(); if (controllerClass.getGenericSuperclass() instanceof ParameterizedType) { @@ -354,18 +366,6 @@ private String inferModule(Class controllerClass) { return controllerClass.getSimpleName(); } - private String id(Class controllerClass, Method method) { - return className(controllerClass) + "." + method.getName(); - } - - private String className(Class clz) { - Class enclosing = clz.getEnclosingClass(); - if (null != enclosing) { - return className(enclosing) + "." + clz.getSimpleName(); - } - return clz.getSimpleName(); - } - private void exploreParamInfo(Method method, Map typeParamLookup) { Type[] paramTypes = method.getGenericParameterTypes(); int paramCount = paramTypes.length; diff --git a/src/main/java/act/apidoc/EndpointIdProvider.java b/src/main/java/act/apidoc/EndpointIdProvider.java new file mode 100644 index 000000000..117cca485 --- /dev/null +++ b/src/main/java/act/apidoc/EndpointIdProvider.java @@ -0,0 +1,26 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +public interface EndpointIdProvider { + String getId(); + String getParentId(); +} diff --git a/src/main/java/act/apidoc/SimpleEndpointIdProvider.java b/src/main/java/act/apidoc/SimpleEndpointIdProvider.java new file mode 100644 index 000000000..ec9a65fca --- /dev/null +++ b/src/main/java/act/apidoc/SimpleEndpointIdProvider.java @@ -0,0 +1,63 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.$; + +import java.lang.reflect.Method; + +public class SimpleEndpointIdProvider implements EndpointIdProvider { + + private Class controllerClass; + private Method method; + + private EndpointIdProvider parent; + + public SimpleEndpointIdProvider(Class controllerClass, Method method) { + this.controllerClass = $.requireNotNull(controllerClass); + this.method = $.requireNotNull(method); + if (controllerClass != method.getDeclaringClass()) { + parent = new SimpleEndpointIdProvider(method.getDeclaringClass(), method); + } + } + + @Override + public String getId() { + return id(controllerClass, method); + } + + @Override + public String getParentId() { + return null == parent ? null : parent.getId(); + } + + static String id(Class controllerClass, Method method) { + return className(controllerClass) + "." + method.getName(); + } + + static String className(Class clz) { + Class enclosing = clz.getEnclosingClass(); + if (null != enclosing) { + return className(enclosing) + "." + clz.getSimpleName(); + } + return clz.getSimpleName(); + } +} diff --git a/src/main/java/act/event/EventBus.java b/src/main/java/act/event/EventBus.java index 697e9b795..63c5e8387 100644 --- a/src/main/java/act/event/EventBus.java +++ b/src/main/java/act/event/EventBus.java @@ -131,6 +131,18 @@ private static Class[] convert(List argList) { private static Class VARARG_TYPE = Object[].class; private static ConcurrentMap typeMap = new ConcurrentHashMap<>(); + static { + typeMap.put(ArrayList.class, List.class); + typeMap.put(LinkedList.class, List.class); + typeMap.put($.Val.class, List.class); + typeMap.put($.Var.class, List.class); + typeMap.put(HashSet.class, Set.class); + typeMap.put(TreeSet.class, Set.class); + typeMap.put(LinkedHashSet.class, Set.class); + typeMap.put(HashMap.class, Map.class); + typeMap.put(LinkedHashMap.class, Map.class); + typeMap.put(ConcurrentHashMap.class, Map.class); + } // checkout https://github.com/actframework/actframework/issues/518 private static Class effectiveTypeOf(Object o) { @@ -148,11 +160,25 @@ private static Class effectiveTypeOf(Class type) { || type.isAnonymousClass() || type.isLocalClass() || type.isMemberClass()) { - Class[] ca = type.getInterfaces(); - if (ca.length > 0) { - for (Class intf: ca) { - if (Modifier.isPublic(intf.getModifiers())) { - mappedType = intf; + boolean isCollection = Collection.class.isAssignableFrom(type); + boolean isMap = !isCollection && Map.class.isAssignableFrom(type); + if (isCollection || isMap) { + if (isMap) { + typeMap.putIfAbsent(type, Map.class); + } else if (List.class.isAssignableFrom(type)) { + typeMap.putIfAbsent(type, List.class); + } else if (Set.class.isAssignableFrom(type)) { + typeMap.putIfAbsent(type, Set.class); + } + mappedType = typeMap.get(type); + } + if (null == mappedType) { + Class[] ca = type.getInterfaces(); + if (ca.length > 0) { + for (Class intf : ca) { + if (Modifier.isPublic(intf.getModifiers())) { + mappedType = intf; + } } } } @@ -162,8 +188,16 @@ private static Class effectiveTypeOf(Class type) { } typeMap.putIfAbsent(type, mappedType); } else { - typeMap.putIfAbsent(type, type); - mappedType = type; + if (List.class.isAssignableFrom(type)) { + typeMap.putIfAbsent(type, List.class); + } else if (Set.class.isAssignableFrom(type)) { + typeMap.putIfAbsent(type, Set.class); + } else if (Map.class.isAssignableFrom(type)) { + typeMap.putIfAbsent(type, Map.class); + } else { + typeMap.putIfAbsent(type, type); + } + mappedType = typeMap.get(type); } } return mappedType; @@ -329,16 +363,26 @@ boolean shouldCallAdhocEventListeners(EventBus eventBus) { private static class StringEventContext extends EventContext { StringEventContext(String event, Object[] args) { super(event, args); + validateSimpleEventArgs(args); } StringEventContext(boolean asyncForAsync, boolean asyncForSync, String event, Object[] args) { super(asyncForAsync, asyncForSync, event, args); + validateSimpleEventArgs(args); } @Override boolean shouldCallAdhocEventListeners(EventBus eventBus) { return eventBus.hasAdhocEventListenerFor(event); } + + private void validateSimpleEventArgs(Object[] args) { + for (Object arg : args) { + if (null == arg) { + throw new NullPointerException("Simple event argument cannot be null"); + } + } + } } private static class EventObjectContext extends EventContext { diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index f760573d6..35530603a 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -1048,7 +1048,7 @@ private static Result transform(Object retVal, ReflectedHandlerInvoker invoker, String curSpec = PropertySpec.current.get(); if (S.notBlank(curSpec)) { Object newRetVal = returnIterable ? new JSONArray() : new JSONObject(); - retVal = Lang.map(retVal).filter(curSpec).to(newRetVal); + retVal = Lang.deepCopy(retVal).filter(curSpec).to(newRetVal); PropertySpec.current.remove(); } } From 74e2d08ce81a59d003ee36f73d5bb8c4509f50e5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 7 Dec 2018 08:18:55 +1100 Subject: [PATCH 299/730] `NullPointerException` caused by sending GET request with `Content-Type=application/xml` header #1008 --- CHANGELOG.md | 1 + .../builtin/controller/impl/ReflectedHandlerInvoker.java | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a32667ee..522dde38f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.16** +* `NullPointerException` caused by sending GET request with `Content-Type=application/xml` header #1008 * api-book-compile cannot get comments from super class #1003 * act test failed when check return data exist #1010 * Calling mailer method asynchronously by eventBus.trigger didn't work #1009 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 35530603a..58c68765a 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -759,12 +759,15 @@ private String singleJsonFieldName(ActionContext context) { */ private String patchedJsonBody(ActionContext context) { String body = context.body(); + if (S.blank(body)) { + return body; + } if (context.xmlEncoded()) { Document doc = XML.read(body); JSONObject json = $.convert(doc).to(JSONObject.class); body = JSON.toJSONString(json.containsKey("root") ? json.get("root") : json); } - if (S.blank(body) || 1 < fieldsAndParamsCount(context)) { + if (1 < fieldsAndParamsCount(context)) { return body; } String theName = singleJsonFieldName(context); From bd849cea4b72b38441852a3959d824c866c2515a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 7 Dec 2018 08:31:17 +1100 Subject: [PATCH 300/730] Allow load resource from `.xml` file #1012 --- CHANGELOG.md | 1 + src/main/java/act/inject/util/ResourceLoader.java | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 522dde38f..8e819f9bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.16** +* Allow load resource from `.xml` file #1012 * `NullPointerException` caused by sending GET request with `Content-Type=application/xml` header #1008 * api-book-compile cannot get comments from super class #1003 * act test failed when check return data exist #1010 diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index b2aab90c2..07d584e6b 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -26,6 +26,7 @@ import act.util.HeaderMapping; import act.util.Jars; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import org.osgl.$; import org.osgl.exception.UnexpectedException; import org.osgl.inject.BeanSpec; @@ -311,11 +312,18 @@ private static Object _load(URL url, BeanSpec spec, Object hint) { Object o = content.startsWith("[") ? JSON.parseArray(content) : JSON.parseObject(content); return $.map(o).targetGenericType(spec.type()).to(rawType); } - boolean isYaml = !isJson && (resourcePath.endsWith(".yml") || resourcePath.endsWith(".yaml")); + boolean isYaml = (resourcePath.endsWith(".yml") || resourcePath.endsWith(".yaml")); if (isYaml) { Object o = new Yaml().load(IO.readContentAsString(url)); return $.map(o).targetGenericType(spec.type()).to(rawType); - } else if (String.class == rawType) { + } + boolean isXml = resourcePath.endsWith(".xml"); + if (isXml) { + Object o = XML.read(url); + JSONObject json = $.convert(o).to(JSONObject.class); + return $.map(json).targetGenericType(spec.type()).to(rawType); + } + if (String.class == rawType) { return IO.readContentAsString(url); } else if (List.class.equals(rawType)) { List typeParams = spec.typeParams(); From 7b38a21385720fc2e96afe33ba703a343820d5e8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 7 Dec 2018 08:49:41 +1100 Subject: [PATCH 301/730] Allow configure XML root element tag #1011 --- CHANGELOG.md | 1 + src/main/java/act/conf/AppConfig.java | 19 +++++++++++++++++++ src/main/java/act/conf/AppConfigKey.java | 17 +++++++++++++++++ .../impl/ReflectedHandlerInvoker.java | 4 +++- src/main/java/act/test/Scenario.java | 5 +++-- 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e819f9bc..ff3c9aeb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.16** +* Allow configure XML root element tag #1011 * Allow load resource from `.xml` file #1012 * `NullPointerException` caused by sending GET request with `Content-Type=application/xml` header #1008 * api-book-compile cannot get comments from super class #1003 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index bd1c52158..7abe9a015 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -162,6 +162,8 @@ public void preloadConfigurations() { MvcConfig.jsonMediaTypeProvider(jsonContentProvider); } + OsglConfig.setXmlRootTag(xmlRootTag()); + OsglConfig.internalCache().clear(); OsglConfig.setThreadLocalBufferLimit(threadLocalBufRetentionLimit()); OsglConfig.registerGlobalInstanceFactory(new $.Function() { @@ -1098,6 +1100,23 @@ private void _mergeXForwardedProtocol(AppConfig conf) { } } + private String xmlRootTag; + protected T xmlRootTag(String tag) { + this.xmlRootTag = tag; + return me(); + } + public String xmlRootTag() { + if (null == xmlRootTag) { + xmlRootTag = get(XML_ROOT, "xml"); + } + return xmlRootTag; + } + private void _mergeXmlRootTag(AppConfig conf) { + if (!hasConfiguration(XML_ROOT)) { + this.xmlRootTag = conf.xmlRootTag; + } + } + private ReturnValueAdvice globalReturnValueAdvice; private Boolean globalReturnValueAdviceSet; diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 5492657fd..937b30be8 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -1262,8 +1262,25 @@ public T val(Map configuration) { */ WS_PURGE_CLOSED_CONN_PERIOD("ws.purge-closed-conn.period"), + /** + * `x_forward_protocol` + * + * specifies the header it shall check to determine if the current request + * is convey on HTTPS channel. + * + * Default value: `http` + */ X_FORWARD_PROTOCOL("x_forward_protocol"), + /** + * `xml_root` + * + * Specifies the XML response root tag name. + * + * Default value: `xml` + */ + XML_ROOT("xml_root"), + ; private String key; private Object defVal; diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 58c68765a..da88adf7f 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -162,6 +162,7 @@ public void visit(H.Format format) throws $.Break { private boolean returnIterableComponentIsSimpleType; private boolean shallTransformReturnVal; private int order; + private String xmlRootTag; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -172,6 +173,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.disabled = !Env.matches(controllerClass); this.paramLoaderService = app.service(ParamValueLoaderManager.class).get(ActionContext.class); this.jsonDTOClassManager = app.service(JsonDtoClassManager.class); + this.xmlRootTag = config.xmlRootTag(); Class[] paramTypes = paramTypes(app); try { @@ -765,7 +767,7 @@ private String patchedJsonBody(ActionContext context) { if (context.xmlEncoded()) { Document doc = XML.read(body); JSONObject json = $.convert(doc).to(JSONObject.class); - body = JSON.toJSONString(json.containsKey("root") ? json.get("root") : json); + body = JSON.toJSONString(json.containsKey(xmlRootTag) ? json.get(xmlRootTag) : json); } if (1 < fieldsAndParamsCount(context)) { return body; diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 09924e408..a553deebf 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -613,8 +613,9 @@ void verifyBody(String bodyString, ResponseSpec spec) { } else if (null != spec.xml && !spec.xml.isEmpty()) { org.w3c.dom.Document doc = XML.read(bodyString); JSONObject obj = $.convert(doc).to(JSONObject.class); - if (obj.containsKey("root")) { - Object o = obj.get("root"); + String xmlRoot = app.config().xmlRootTag(); + if (obj.containsKey(xmlRoot)) { + Object o = obj.get(xmlRoot); lastData.set(o); if (o instanceof JSONObject) { obj = (JSONObject) o; From 4dfde13593477520598aff394b8dd7afb4e8a133 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 7 Dec 2018 12:36:44 +1100 Subject: [PATCH 302/730] [#1012] - allow loading XML resource into collection types --- src/main/java/act/inject/util/ResourceLoader.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index 07d584e6b..bdb1a58cd 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -25,8 +25,7 @@ import act.app.data.StringValueResolverManager; import act.util.HeaderMapping; import act.util.Jars; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.*; import org.osgl.$; import org.osgl.exception.UnexpectedException; import org.osgl.inject.BeanSpec; @@ -38,6 +37,7 @@ import org.osgl.storage.ISObject; import org.osgl.storage.impl.SObject; import org.osgl.util.*; +import org.osgl.util.TypeReference; import org.yaml.snakeyaml.Yaml; import java.io.File; @@ -320,8 +320,13 @@ private static Object _load(URL url, BeanSpec spec, Object hint) { boolean isXml = resourcePath.endsWith(".xml"); if (isXml) { Object o = XML.read(url); - JSONObject json = $.convert(o).to(JSONObject.class); - return $.map(json).targetGenericType(spec.type()).to(rawType); + if ($.isCollectionType(rawType)) { + JSONArray array = $.convert(o).to(JSONArray.class); + return $.map(array).targetGenericType(spec.type()).to(rawType); + } else { + JSONObject json = $.convert(o).to(JSONObject.class); + return $.map(json).targetGenericType(spec.type()).to(rawType); + } } if (String.class == rawType) { return IO.readContentAsString(url); From eed811d6ee9937fd6689d601cccfc312d76c69ec Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 9 Dec 2018 10:44:19 +1100 Subject: [PATCH 303/730] `StackOverflowError` caused by POJO typed request handler method param circular reference #1015 --- CHANGELOG.md | 1 + .../java/act/inject/param/PojoLoader.java | 32 +++++++++++++------ src/main/java/act/xio/NetworkHandler.java | 4 ++- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff3c9aeb3..737461c19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.16** +* `StackOverflowError` caused by POJO typed request handler method param circular reference #1015 * Allow configure XML root element tag #1011 * Allow load resource from `.xml` file #1012 * `NullPointerException` caused by sending GET request with `Content-Type=application/xml` header #1008 diff --git a/src/main/java/act/inject/param/PojoLoader.java b/src/main/java/act/inject/param/PojoLoader.java index bea81b1f3..d037d8b68 100644 --- a/src/main/java/act/inject/param/PojoLoader.java +++ b/src/main/java/act/inject/param/PojoLoader.java @@ -29,8 +29,7 @@ import org.osgl.inject.InjectException; import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; +import java.util.*; class PojoLoader extends ParamValueLoader.JsonBodySupported { @@ -84,18 +83,31 @@ public String bindName() { private Map fieldLoaders(ParamKey key, BeanSpec spec) { Class current = spec.rawType(); Map fieldLoaders = new HashMap<>(); - while (null != current && !current.equals(Object.class)) { - for (Field field : current.getDeclaredFields()) { - if (shouldWaive(field)) { - continue; + Set> circularReferenceDetector = circularReferenceCounter.get(); + if (null == circularReferenceDetector) { + circularReferenceDetector = new HashSet<>(); + circularReferenceCounter.set(circularReferenceDetector); + } + circularReferenceDetector.add(current); + try { + while (null != current && !current.equals(Object.class)) { + for (Field field : current.getDeclaredFields()) { + if (shouldWaive(field) || circularReferenceDetector.contains(field.getType())) { + continue; + } + field.setAccessible(true); + String fieldName = field.getName(); + fieldLoaders.put(fieldName, service.fieldLoader(key, field, spec.field(fieldName))); } - field.setAccessible(true); - String fieldName = field.getName(); - fieldLoaders.put(fieldName, service.fieldLoader(key, field, spec.field(fieldName))); + current = current.getSuperclass(); } - current = current.getSuperclass(); + } finally { + circularReferenceDetector.remove(current); } return fieldLoaders; } + + static final ThreadLocal>> circularReferenceCounter = new ThreadLocal<>(); + } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 344c54663..c284f8470 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -192,7 +192,9 @@ public void run() { handleException(e, ctx, "Error handling network request"); } catch (Error t) { fatal(t, "Fatal Error encountered handling request: ", ctx.req()); - Act.shutdown(app); + if (Act.isProd()) { + Act.shutdown(app); + } } finally { if (!skipEvents) { eventBus.emit(new PostHandle(ctx)); From a026a845aa81ca8bf7f726cf067262b1df65ce25 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 9 Dec 2018 11:50:39 +1100 Subject: [PATCH 304/730] minor update to CLI progress gauage handling --- src/main/java/act/cli/CliContext.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/act/cli/CliContext.java b/src/main/java/act/cli/CliContext.java index 37a3f0096..acd840fe9 100644 --- a/src/main/java/act/cli/CliContext.java +++ b/src/main/java/act/cli/CliContext.java @@ -345,10 +345,12 @@ public void print(CommandMethodMetaInfo methodMetaInfo, ProgressGauge progressGa ReportProgress.Type type = reportProgress.type(); inProgress = true; try { - if (BAR == type) { - printBar(progressGauge); - } else { - printText(progressGauge); + if (!progressGauge.isDone()) { + if (BAR == type) { + printBar(progressGauge); + } else { + printText(progressGauge); + } } Object result = Act.getInstance(JobManager.class).cachedResult(progressGauge.getId()); if (null != result) { @@ -368,6 +370,7 @@ public void printBar(ProgressGauge progressGauge) { while (!progressGauge.isDone()) { pb.maxHint(progressGauge.maxHint()); pb.stepTo(progressGauge.currentSteps()); + Thread.yield(); flush(); } pb.stepTo(pb.getMax()); From 16803c75ff57c3f1e41d940eae02b401d05a4c7e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 9 Dec 2018 19:05:38 +1100 Subject: [PATCH 305/730] param value loading circular reference detection improve; prepare for 1.8.16 release --- CHANGELOG.md | 2 +- legacy-testapp/pom.xml | 4 +-- pom.xml | 6 ++-- .../java/act/inject/param/PojoLoader.java | 29 ++++++++++--------- .../src/main/java/ghissues/Gh1015.java | 29 +++++++++++++++++++ .../main/resources/test/scenarios/1015.yml | 22 ++++++++++++++ 6 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1015.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1015.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 737461c19..0ce6fbff5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.16** +**1.8.16** 09/Dec/2018 * `StackOverflowError` caused by POJO typed request handler method param circular reference #1015 * Allow configure XML root element tag #1011 * Allow load resource from `.xml` file #1012 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 228f569ad..09e9195a3 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,9 +73,9 @@ UTF-8 UTF-8 - 1.8.15 + 1.8.16-SNAPSHOT [0.13.0, 2.0.0) - 1.6.4 + 1.6.5-SNAPSHOT testapp.TestApp diff --git a/pom.xml b/pom.xml index 753c70125..3f2e2a068 100644 --- a/pom.xml +++ b/pom.xml @@ -63,9 +63,9 @@ 2.10.1 1.11.3 3.10.0 - 1.18.3-SNAPSHOT - 1.5.0 - 1.9.2-SNAPSHOT + 1.18.3 + 1.6.0 + 1.9.2 1.9.0 1.9.0 1.8.0 diff --git a/src/main/java/act/inject/param/PojoLoader.java b/src/main/java/act/inject/param/PojoLoader.java index d037d8b68..4f24f6eaf 100644 --- a/src/main/java/act/inject/param/PojoLoader.java +++ b/src/main/java/act/inject/param/PojoLoader.java @@ -84,25 +84,26 @@ private Map fieldLoaders(ParamKey key, BeanSpec spec) { Class current = spec.rawType(); Map fieldLoaders = new HashMap<>(); Set> circularReferenceDetector = circularReferenceCounter.get(); - if (null == circularReferenceDetector) { - circularReferenceDetector = new HashSet<>(); - circularReferenceCounter.set(circularReferenceDetector); - } - circularReferenceDetector.add(current); - try { - while (null != current && !current.equals(Object.class)) { - for (Field field : current.getDeclaredFields()) { - if (shouldWaive(field) || circularReferenceDetector.contains(field.getType())) { - continue; - } + while (null != current && !current.equals(Object.class)) { + if (null == circularReferenceDetector) { + circularReferenceDetector = new HashSet<>(); + circularReferenceCounter.set(circularReferenceDetector); + } + for (Field field : current.getDeclaredFields()) { + Class fieldType = field.getType(); + if (shouldWaive(field) || circularReferenceDetector.contains(fieldType)) { + continue; + } + circularReferenceDetector.add(fieldType); + try { field.setAccessible(true); String fieldName = field.getName(); fieldLoaders.put(fieldName, service.fieldLoader(key, field, spec.field(fieldName))); + } finally { + circularReferenceDetector.remove(fieldType); } - current = current.getSuperclass(); } - } finally { - circularReferenceDetector.remove(current); + current = current.getSuperclass(); } return fieldLoaders; } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1015.java b/testapps/GHIssues/src/main/java/ghissues/Gh1015.java new file mode 100644 index 000000000..f7fb72701 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1015.java @@ -0,0 +1,29 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.PostAction; + +import javax.persistence.Transient; +import javax.validation.constraints.*; + +@UrlContext("1015") +public class Gh1015 extends BaseController { + public static class User { + + @NotNull + @Size(min = 3, max = 20) + public String name; + + @Min(18) + @Max(60) + public Integer age = 0; + + @Transient + public User invitor; + } + + @PostAction + public User create(User user) { + return user; + } +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml new file mode 100644 index 000000000..b4cf1b4c9 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml @@ -0,0 +1,22 @@ +Scenario(1015): + description: "[1015] `StackOverflowError` caused by POJO typed request handler method param circular reference" + interactions: + - description: Test + request: + post: /1015 + params: + name: foo + age: 1 + invitor.name: bar + invitor.age: 2 + invitor.invitor.name: hai + invitor.invitor.age: 3 + response: + json: + name: foo + age: 1 + invitor: + name: bar + age: 2 + invitor: + - exists: false \ No newline at end of file From 7bf48a04083804074a44b78912a144d5176adc39 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 9 Dec 2018 19:24:28 +1100 Subject: [PATCH 306/730] update README and VERSION_MATRIX --- README.md | 10 +++++----- VERSION_MATRIX.md | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index be5706fbd..ab7bd4192 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.15.0 + 1.8.16.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.15.0 + -DarchetypeVersion=1.8.16.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.15.0 + -DarchetypeVersion=1.8.16.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.15.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.16.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.15.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.16.0 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index da760e4cd..7f41cbbf0 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,10 +1,10 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.15 | +| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.16 | | --- | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.2 | +| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.3 | | beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | 1.4.6 | -| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | 1.5.5 | +| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | 1.5.6 | | ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.3 | 1.7.5 | | ebean(java8) | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.3 | 1.7.5 | | eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.4 | @@ -13,7 +13,7 @@ | hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | | jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.5 | 1.0.5 | | jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | -| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | 1.6.4 | +| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | 1.6.5 | | mustache(java8) | 1.3.x | 1.4.0 | 1.4.2 | 1.4.5 | 1.4.5 | | social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.5 | 0.12.5 | | sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.3 | 1.4.4 | From 6e8b9f799ef51ce8fb461e11323fea3dfb6e4d7e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 9 Dec 2018 19:25:46 +1100 Subject: [PATCH 307/730] [maven-release-plugin] prepare release act-1.8.16 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3f2e2a068..7cb3e0ff5 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.16-SNAPSHOT + 1.8.16 ACT Framework The ACT full stack MVC framework From a7a30fed1e13253033faa719b1ae1ec639b400a0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 9 Dec 2018 19:26:03 +1100 Subject: [PATCH 308/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7cb3e0ff5..1384b2318 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.16 + 1.8.17-SNAPSHOT ACT Framework The ACT full stack MVC framework From d60972ea24411188edf0c210aa3c520e518c8e26 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 9 Dec 2018 22:58:24 +1100 Subject: [PATCH 309/730] update README and VERSION tag for act-starter-parent-1.8.16.1 --- README.md | 10 ++-- VERSION_MATRIX.md | 6 +- .../src/main/java/ghissues/IpLoaderDemo.java | 55 +++++++++++++++++++ 3 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/IpLoaderDemo.java diff --git a/README.md b/README.md index ab7bd4192..eb63fe2e1 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.16.0 + 1.8.16.1 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.16.0 + -DarchetypeVersion=1.8.16.1 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.16.0 + -DarchetypeVersion=1.8.16.1 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.16.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.16.1 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.16.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.16.1 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 7f41cbbf0..313ee12bc 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -7,12 +7,12 @@ | beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | 1.5.6 | | ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.3 | 1.7.5 | | ebean(java8) | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.3 | 1.7.5 | -| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.4 | +| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.5 | | excel | 1.3.x | 1.4.x | 1.4.3 | 1.5.0 | 1.5.0 | | freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.6 | 1.3.6 | -| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | +| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.4 | | jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.5 | 1.0.5 | -| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.3 | +| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.4 | | morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | 1.6.5 | | mustache(java8) | 1.3.x | 1.4.0 | 1.4.2 | 1.4.5 | 1.4.5 | | social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.5 | 0.12.5 | diff --git a/testapps/GHIssues/src/main/java/ghissues/IpLoaderDemo.java b/testapps/GHIssues/src/main/java/ghissues/IpLoaderDemo.java new file mode 100644 index 000000000..693bba11f --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/IpLoaderDemo.java @@ -0,0 +1,55 @@ +package ghissues; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.data.annotation.ParamBindingAnnotation; +import act.util.SimpleBean; +import org.osgl.inject.BeanSpec; +import org.osgl.inject.ValueLoader; +import org.osgl.inject.annotation.InjectTag; +import org.osgl.inject.annotation.LoadValue; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.E; + +import java.lang.annotation.*; +import java.util.Map; + +@UrlContext("ip-demo") +public class IpLoaderDemo extends BaseController { + + public static class IpLoader implements ValueLoader { + @Override + public void init(Map options, BeanSpec spec) { + } + + @Override + public String get() { + ActionContext context = ActionContext.current(); + E.illegalStateIf(null == context); + return context.req().ip(); + } + } + + + @LoadValue(IpLoader.class) + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.PARAMETER, ElementType.FIELD}) + @ParamBindingAnnotation + @InjectTag + public @interface FillIp { + } + + @Data + public static class Foo implements SimpleBean { + public int id; + @FillIp + public String ip; + } + + @PostAction + public Foo create(Foo foo) { + return foo; + } + +} From ce6567b58c7354b4490f5bc1cd3559613ab3f99b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 10 Dec 2018 09:24:09 +1100 Subject: [PATCH 310/730] prepare testcase for gh1016 --- testapps/GHIssues/pom.xml | 6 +++--- .../ghissues/{IpLoaderDemo.java => Gh1016.java} | 4 ++-- .../src/main/resources/test/scenarios/1016.yml | 13 +++++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) rename testapps/GHIssues/src/main/java/ghissues/{IpLoaderDemo.java => Gh1016.java} (94%) create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1016.yml diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 36c082091..e04e9ce5b 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -5,14 +5,14 @@ 4.0.0 act-ghissues - 1.8.15.0 + 1.8.16.0 ActFramework Github Issue Reproduce App org.actframework act-starter-parent - 1.8.15.0 + 1.8.16.0 @@ -25,7 +25,7 @@ org.actframework act - 1.8.16-SNAPSHOT + 1.8.17-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/java/ghissues/IpLoaderDemo.java b/testapps/GHIssues/src/main/java/ghissues/Gh1016.java similarity index 94% rename from testapps/GHIssues/src/main/java/ghissues/IpLoaderDemo.java rename to testapps/GHIssues/src/main/java/ghissues/Gh1016.java index 693bba11f..b9467e4ab 100644 --- a/testapps/GHIssues/src/main/java/ghissues/IpLoaderDemo.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1016.java @@ -15,8 +15,8 @@ import java.lang.annotation.*; import java.util.Map; -@UrlContext("ip-demo") -public class IpLoaderDemo extends BaseController { +@UrlContext("1016") +public class Gh1016 extends BaseController { public static class IpLoader implements ValueLoader { @Override diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml new file mode 100644 index 000000000..1689a540c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml @@ -0,0 +1,13 @@ +Scenario(1016): + description: "[1016] Annotations with ValueLoader cannot work if post with json" + interactions: + - description: Test + request: + post: /1016 + json: + id: 1 + response: + json: + id: 1 + ip: + - exists: true From 358885b1d733f3b849be70bd04bb9f77665597d5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 12 Dec 2018 05:39:19 +1100 Subject: [PATCH 311/730] fix #1018, #1019 and #1022 --- CHANGELOG.md | 5 ++ src/main/java/act/cli/builtin/Help.java | 8 +- src/main/java/act/conf/AppConfig.java | 6 +- .../impl/ReflectedHandlerInvoker.java | 6 +- src/main/java/act/inject/param/JsonDto.java | 11 ++- .../act/inject/param/JsonDtoClassManager.java | 3 +- .../java/act/inject/param/JsonDtoPatch.java | 80 +++++++++++++++++++ src/main/java/act/route/UrlPath.java | 39 +++++---- .../act/xio/WebSocketConnectionHandler.java | 2 +- .../src/main/java/ghissues/Gh1022.java | 30 +++++++ .../main/resources/test/scenarios/1022.yml | 17 ++++ 11 files changed, 182 insertions(+), 25 deletions(-) create mode 100644 src/main/java/act/inject/param/JsonDtoPatch.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1022.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1022.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ce6fbff5..6d2285720 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # ActFramework Change Log +**1.8.17** +* Routing issue with dynamic aliases and keyword matching #1022 +* Make CLI help command default to display application commands 1018# +* CLI - execute `conf.trace-handler -e` trigger `IllegalAccessError` #1019 + **1.8.16** 09/Dec/2018 * `StackOverflowError` caused by POJO typed request handler method param circular reference #1015 * Allow configure XML root element tag #1011 diff --git a/src/main/java/act/cli/builtin/Help.java b/src/main/java/act/cli/builtin/Help.java index 18b5a2670..726b417d4 100644 --- a/src/main/java/act/cli/builtin/Help.java +++ b/src/main/java/act/cli/builtin/Help.java @@ -54,10 +54,12 @@ public void handle(CliContext context) { } CommandLineParser parser = context.commandLine(); boolean sys = parser.getBoolean("-s", "--system"); - boolean app = parser.getBoolean("-a", "--app"); - if (!sys && !app) { + boolean all = parser.getBoolean("-a", "--all"); + boolean app = true; + if (all) { sys = true; - app = true; + } else if (sys) { + app = false; } CliDispatcher dispatcher = context.app().cliDispatcher(); diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 7abe9a015..a80f92e95 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -3128,7 +3128,8 @@ public boolean traceHandler() { return traceHandler; } - void toggleTraceHandler(boolean enabled) { + // must be public, otherwise it get IllegalAccessError + public void toggleTraceHandler(boolean enabled) { traceHandler = enabled; } @@ -3152,7 +3153,8 @@ public boolean traceRequests() { return traceRequest; } - void toggleTraceRequest(boolean enabled) { + // must be public, otherwise it get IllegalAccessError + public void toggleTraceRequest(boolean enabled) { traceRequest = enabled; } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index da88adf7f..3e1c3dbc2 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -716,7 +716,7 @@ private void ensureJsonDtoGenerated(ActionContext context) { if (0 == fieldsAndParamsCount || (!context.jsonEncoded() && !context.xmlEncoded())) { return; } - Class dtoClass = jsonDTOClassManager.get(controllerClass, method); + Class dtoClass = jsonDTOClassManager.get(paramSpecs, controllerClass); if (null == dtoClass) { // there are neither fields nor params return; @@ -734,6 +734,10 @@ private void ensureJsonDtoGenerated(ActionContext context) { } } + private void patchDtoBeans(JsonDto dto) { + + } + private int fieldsAndParamsCount(ActionContext context) { if (fieldsAndParamsCount < 2) { return fieldsAndParamsCount; diff --git a/src/main/java/act/inject/param/JsonDto.java b/src/main/java/act/inject/param/JsonDto.java index 040625664..fec09e021 100644 --- a/src/main/java/act/inject/param/JsonDto.java +++ b/src/main/java/act/inject/param/JsonDto.java @@ -20,8 +20,7 @@ * #L% */ -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * The base class of system generated data transfer object to support converting JSON string into @@ -50,4 +49,12 @@ public Object get(String name) { protected void set(String name, Object bean) { beans.put(name, bean); } + + /** + * Get all bean objects deserialized into this DTO. + * @return all bean objects + */ + public Collection beans() { + return beans.values(); + } } diff --git a/src/main/java/act/inject/param/JsonDtoClassManager.java b/src/main/java/act/inject/param/JsonDtoClassManager.java index 8e5996364..1dfaefbda 100644 --- a/src/main/java/act/inject/param/JsonDtoClassManager.java +++ b/src/main/java/act/inject/param/JsonDtoClassManager.java @@ -68,8 +68,7 @@ protected void releaseResources() { } - public Class get(Class host, Method method) { - List beanSpecs = beanSpecs(host, method); + public Class get(List beanSpecs, Class host) { String key = key(beanSpecs); if (S.blank(key)) { return null; diff --git a/src/main/java/act/inject/param/JsonDtoPatch.java b/src/main/java/act/inject/param/JsonDtoPatch.java new file mode 100644 index 000000000..1d8d01e9e --- /dev/null +++ b/src/main/java/act/inject/param/JsonDtoPatch.java @@ -0,0 +1,80 @@ +package act.inject.param; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import org.osgl.$; +import org.osgl.inject.BeanSpec; +import org.osgl.inject.ValueLoader; +import org.osgl.inject.annotation.LoadValue; +import org.osgl.util.S; + +import java.lang.annotation.Annotation; +import java.util.*; + +/** + * Patch JSON DTO bean object in case there are + * value loader annotation on certain field, and the + * value of the field on the bean is null, then it + * shall inject the value loader result into the field + * on the bean. + * + * See https://github.com/actframework/actframework/issues/1016 + */ +public class JsonDtoPatch { + private List fieldsPatch = new ArrayList<>(); + private String name; + private JsonDtoPatch parent; + private ValueLoader loader; + private JsonDtoPatch(String name, BeanSpec spec, JsonDtoPatch parent) { + this.name = S.requireNotBlank(name); + this.parent = parent; + this.loader = valueLoaderOf(spec); + if (null == loader) { + for (Map.Entry entry : spec.fields().entrySet()) { + String fieldName = entry.getKey(); + BeanSpec fieldSpec = entry.getValue(); + + } + } + } + + public void apply(Object host) { + Object v = $.getProperty(host, name); + if (null != v) { + return; + } + if (null != loader) { + } + } + + private ValueLoader valueLoaderOf(BeanSpec spec) { + LoadValue loadValue = spec.getAnnotation(LoadValue.class); + if (null == loadValue) { + Annotation[] aa = spec.taggedAnnotations(LoadValue.class); + if (aa.length > 0) { + Annotation a = aa[0]; + loadValue = a.annotationType().getAnnotation(LoadValue.class); + } + } + return null == loadValue ? null : Act.getInstance(loadValue.value()); + } +} diff --git a/src/main/java/act/route/UrlPath.java b/src/main/java/act/route/UrlPath.java index ec0bcb9b7..e7d079649 100644 --- a/src/main/java/act/route/UrlPath.java +++ b/src/main/java/act/route/UrlPath.java @@ -21,6 +21,7 @@ */ import act.app.App; +import org.osgl.util.Keyword; import org.osgl.util.S; import java.util.ArrayList; @@ -38,17 +39,24 @@ public class UrlPath { static final String DYNA_PART = ""; - private final List parts = new ArrayList<>(); + private final List parts = new ArrayList<>(); private UrlPath(CharSequence path) { String s = path.toString(); String[] sa = s.split("/"); for (String item: sa) { if (S.notBlank(item)) { + Keyword kw = null; if (item.startsWith("{") || item.contains(":")) { item = DYNA_PART; + } else if (item.startsWith("~") && item.endsWith("~")) { + kw = Keyword.of(S.strip(item, "~", "~")); + } + if (null != kw) { + parts.add(kw); + } else { + parts.add(item); } - parts.add(item); } } } @@ -57,14 +65,6 @@ public int size() { return parts.size(); } - public String part(int index) { - return parts.get(index); - } - - public String lastPart() { - return part(size() - 1); - } - /** * Check if the URL path is a built-in service url. * @@ -114,19 +114,30 @@ public static UrlPath of(CharSequence path) { return urlPath; } - private static boolean matches(CharSequence cs1, CharSequence cs2) { + private static boolean matches(Object cs1, Object cs2) { if (DYNA_PART.equals(cs1)) { return true; } - int len = cs1.length(); - if (len != cs2.length()) { + if (cs1 instanceof Keyword) { + return matches((Keyword) cs1, cs2); + } else if (cs2 instanceof Keyword) { + return matches((Keyword) cs2, cs1); + } + String s1 = S.string(cs1); + String s2 = S.string(cs2); + int len = s1.length(); + if (len != s2.length()) { return false; } for (int i = len - 1; i >= 0; --i) { - if (cs1.charAt(i) != cs2.charAt(i)) { + if (s1.charAt(i) != s2.charAt(i)) { return false; } } return true; } + + private static boolean matches(Keyword keyword, Object o) { + return keyword.matches(S.string(o)); + } } diff --git a/src/main/java/act/xio/WebSocketConnectionHandler.java b/src/main/java/act/xio/WebSocketConnectionHandler.java index 68372ddf4..aedfc382c 100644 --- a/src/main/java/act/xio/WebSocketConnectionHandler.java +++ b/src/main/java/act/xio/WebSocketConnectionHandler.java @@ -275,7 +275,7 @@ private void ensureJsonDtoGenerated(WebSocketContext context) { if (0 == fieldsAndParamsCount || !context.isJson()) { return; } - Class dtoClass = jsonDTOClassManager.get(handlerClass, method); + Class dtoClass = jsonDTOClassManager.get(paramSpecs, handlerClass); if (null == dtoClass) { // there are neither fields nor params return; diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1022.java b/testapps/GHIssues/src/main/java/ghissues/Gh1022.java new file mode 100644 index 000000000..83673c69a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1022.java @@ -0,0 +1,30 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.S; + +@UrlContext("1022") +public class Gh1022 extends BaseController { + + public static class Foo { + public String name = S.random(); + } + + @GetAction("foo/{id}") + public Foo foo(int id) { + if (1 == id) { + return new Foo(); + } + return null; + } + + @GetAction("foo/{fooId}/~foo-name~") + public String fooName(int fooId) { + if (1 == fooId) { + return new Foo().name; + } + return null; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml new file mode 100644 index 000000000..549b2f525 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml @@ -0,0 +1,17 @@ +Scenario(1022): + description: "[1022] Routing issue with dynamic aliases" + interactions: + - description: Get foo + request: + get: /1022/foo/1 + response: + json: + name: + - exists: true + - description: Get foo name + request: + get: /1022/foo/1/name + response: + json: + result: + - exists: true From ef8693af8a63e83826e1805d9be0baa0f41ed99e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 12 Dec 2018 08:17:44 +1100 Subject: [PATCH 312/730] Annotations with ValueLoader cannot work if post with json #1016 --- CHANGELOG.md | 1 + pom.xml | 2 +- .../impl/ReflectedHandlerInvoker.java | 21 +++++++++- .../java/act/inject/param/JsonDtoPatch.java | 39 ++++++++++++++----- .../src/main/java/ghissues/Gh1016.java | 11 ++++++ .../main/resources/test/scenarios/1016.yml | 12 ++++++ 6 files changed, 74 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d2285720..4c44c1474 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.17** +* Annotations with ValueLoader cannot work if post with json #1016 * Routing issue with dynamic aliases and keyword matching #1022 * Make CLI help command default to display application commands 1018# * CLI - execute `conf.trace-handler -e` trigger `IllegalAccessError` #1019 diff --git a/pom.xml b/pom.xml index 1384b2318..ffeeca7ec 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ 3.10.0 1.18.3 1.6.0 - 1.9.2 + 1.9.3-SNAPSHOT 1.9.0 1.9.0 1.8.0 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 3e1c3dbc2..6bc33f5e0 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -163,6 +163,8 @@ public void visit(H.Format format) throws $.Break { private boolean shallTransformReturnVal; private int order; private String xmlRootTag; + private List dtoPatches = new ArrayList<>(); + private boolean hasDtoPatches; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -308,6 +310,13 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { paramCount = handler.paramCount(); paramSpecs = jsonDTOClassManager.beanSpecs(controllerClass, method); + for (BeanSpec spec : paramSpecs) { + JsonDtoPatch patch = JsonDtoPatch.of(spec); + if (null != patch) { + dtoPatches.add(patch); + } + } + hasDtoPatches = !dtoPatches.isEmpty(); List paramSpecWithoutSessionVariables = new ArrayList<>(); fieldsAndParamsCount = paramSpecs.size(); for (BeanSpec spec : paramSpecs) { @@ -723,7 +732,10 @@ private void ensureJsonDtoGenerated(ActionContext context) { } try { JsonDto dto = JSON.parseObject(patchedJsonBody(context), dtoClass); - cacheJsonDto(context, dto); + if (null != dto) { + patchDtoBeans(dto); + cacheJsonDto(context, dto); + } } catch (JSONException e) { if (e.getCause() != null) { warn(e.getCause(), "error parsing JSON data"); @@ -735,7 +747,12 @@ private void ensureJsonDtoGenerated(ActionContext context) { } private void patchDtoBeans(JsonDto dto) { - + if (hasDtoPatches) { + for (JsonDtoPatch patch : dtoPatches) { + Object bean = dto.get(patch.name()); + patch.applyChildren(bean); + } + } } private int fieldsAndParamsCount(ActionContext context) { diff --git a/src/main/java/act/inject/param/JsonDtoPatch.java b/src/main/java/act/inject/param/JsonDtoPatch.java index 1d8d01e9e..4d136bbd6 100644 --- a/src/main/java/act/inject/param/JsonDtoPatch.java +++ b/src/main/java/act/inject/param/JsonDtoPatch.java @@ -40,32 +40,48 @@ * See https://github.com/actframework/actframework/issues/1016 */ public class JsonDtoPatch { - private List fieldsPatch = new ArrayList<>(); + private List fieldsPatches = new ArrayList<>(); private String name; - private JsonDtoPatch parent; private ValueLoader loader; - private JsonDtoPatch(String name, BeanSpec spec, JsonDtoPatch parent) { + private JsonDtoPatch(String name, BeanSpec spec) { this.name = S.requireNotBlank(name); - this.parent = parent; this.loader = valueLoaderOf(spec); if (null == loader) { for (Map.Entry entry : spec.fields().entrySet()) { String fieldName = entry.getKey(); BeanSpec fieldSpec = entry.getValue(); - + JsonDtoPatch child = new JsonDtoPatch(fieldName, fieldSpec); + if (!child.isEmpty()) { + fieldsPatches.add(child); + } } } } - public void apply(Object host) { - Object v = $.getProperty(host, name); - if (null != v) { - return; + public String name() { + return name; + } + + public void applyChildren(Object host) { + for (JsonDtoPatch child : fieldsPatches) { + child.apply(host); } + } + + public void apply(Object host) { if (null != loader) { + Object o = loader.get(); + $.setProperty(host, o, name); + } else { + Object o = $.getProperty(host, name); + applyChildren(o); } } + private boolean isEmpty() { + return null == loader && fieldsPatches.isEmpty(); + } + private ValueLoader valueLoaderOf(BeanSpec spec) { LoadValue loadValue = spec.getAnnotation(LoadValue.class); if (null == loadValue) { @@ -77,4 +93,9 @@ private ValueLoader valueLoaderOf(BeanSpec spec) { } return null == loadValue ? null : Act.getInstance(loadValue.value()); } + + public static JsonDtoPatch of(BeanSpec spec) { + JsonDtoPatch patch = new JsonDtoPatch(spec.name(), spec); + return patch.isEmpty() ? null : patch; + } } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1016.java b/testapps/GHIssues/src/main/java/ghissues/Gh1016.java index b9467e4ab..af1231ca6 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh1016.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1016.java @@ -47,9 +47,20 @@ public static class Foo implements SimpleBean { public String ip; } + @Data + public static class Bar implements SimpleBean { + public Foo foo; + } + + @PostAction public Foo create(Foo foo) { return foo; } + @PostAction("embedded") + public Bar createEmbedded(Bar bar) { + return bar; + } + } diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml index 1689a540c..ec995326f 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml @@ -11,3 +11,15 @@ Scenario(1016): id: 1 ip: - exists: true + - description: Test embedded case + request: + post: /1016/embedded + json: + foo: + id: 1 + response: + json: + foo: + id: 1 + ip: + - exists: true From 82cf0d321953bfdad9e303ad8947dfe105dca9e7 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 13 Dec 2018 11:42:16 +1100 Subject: [PATCH 313/730] fix #1024 and #1025 --- CHANGELOG.md | 2 ++ src/main/java/act/test/Scenario.java | 45 +++++++++++++++++++--------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c44c1474..23b255dda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.17** +* Test - json param shall be processed #1025 +* Test - allow it post body for DELETE request #1024 * Annotations with ValueLoader cannot work if post with json #1016 * Routing issue with dynamic aliases and keyword matching #1022 * Make CLI help command default to display application commands 1018# diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index a553deebf..6a1d98047 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -28,17 +28,12 @@ import act.Act; import act.app.App; +import act.handler.builtin.FileGetter; import act.test.func.Func; import act.test.req_modifier.RequestModifier; -import act.test.util.CookieStore; -import act.test.util.JSONTraverser; -import act.test.util.RequestTemplateManager; -import act.test.util.ScenarioManager; +import act.test.util.*; import act.test.verifier.Verifier; -import act.handler.builtin.FileGetter; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.*; import okhttp3.*; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -53,10 +48,7 @@ import java.io.IOException; import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; @@ -145,9 +137,9 @@ private class RequestBuilder { } url = buf.toString(); } - case DELETE: builder.method(requestSpec.method.name(), null); break; + case DELETE: case POST: case PUT: case PATCH: @@ -201,12 +193,35 @@ private void processParamSubstitution(Map params) { entry.setValue(getLastVal(ref)); } else if (sVal.contains("${")) { sVal = processStringSubstitution(sVal); - entry.setValue(sVal); + entry.setValue(S.isInt(sVal) ? Integer.parseInt(sVal) : sVal); + } + } else if (val instanceof Map) { + processParamSubstitution((Map) val); + } else if (val instanceof Collection) { + processParamSubstitution((Collection) val); + } + } + } + + private Collection processParamSubstitution(Collection params) { + Collection ret = Act.getInstance(params.getClass()); + for (Object val : params) { + if (val instanceof String) { + String sVal = (String) val; + if (sVal.startsWith("last:") || sVal.startsWith("last|")) { + String ref = sVal.substring(5); + ret.add(getLastVal(ref)); + } else if (sVal.contains("${")) { + sVal = processStringSubstitution(sVal); + ret.add(S.isInt(sVal) ? Integer.parseInt(sVal) : sVal); } } else if (val instanceof Map) { processParamSubstitution((Map) val); + } else if (val instanceof Collection) { + processParamSubstitution((Collection) val); } } + return ret; } Request build() { @@ -216,6 +231,8 @@ Request build() { private String verifyJsonBody(Object jsonBody) { if (jsonBody instanceof Map) { processParamSubstitution((Map) jsonBody); + } else if (jsonBody instanceof Collection) { + jsonBody = processParamSubstitution((Collection) jsonBody); } String s = null == jsonBody ? "" : (jsonBody instanceof String) ? (String) jsonBody : JSON.toJSONString(jsonBody); if (S.blank(s)) { From 3222aaa9006de64b1d7f0179bd48f0e227e20daf Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 13 Dec 2018 22:15:16 +1100 Subject: [PATCH 314/730] update fastjson to 1.2.54; improve SimpleRestfulServiceBase on generic type handling --- pom.xml | 2 +- src/main/java/act/app/util/SimpleRestfulServiceBase.java | 4 +++- src/main/java/act/test/Scenario.java | 5 ++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index ffeeca7ec..70ae38daf 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2 1.3.3 4.6.1 - 1.2.52 + 1.2.54 1.1.2 0.7 1.16 diff --git a/src/main/java/act/app/util/SimpleRestfulServiceBase.java b/src/main/java/act/app/util/SimpleRestfulServiceBase.java index 292a78271..091ed2b2b 100644 --- a/src/main/java/act/app/util/SimpleRestfulServiceBase.java +++ b/src/main/java/act/app/util/SimpleRestfulServiceBase.java @@ -31,6 +31,7 @@ import java.lang.reflect.Type; import java.util.List; +import java.util.Map; /** * A class template for simple RESTful service @@ -80,13 +81,14 @@ public void delete(ID_TYPE id) { } private void exploreTypes() { + Map typeParamLookup = Generics.buildTypeParamImplLookup(getClass()); List types = Generics.typeParamImplementations(getClass(), SimpleRestfulServiceBase.class); int sz = types.size(); if (sz < 3) { throw new IllegalArgumentException("Cannot determine DAO type"); } Type daoType = types.get(2); - BeanSpec spec = BeanSpec.of(daoType, Act.injector()); + BeanSpec spec = BeanSpec.of(daoType, Act.injector(), typeParamLookup); DaoLoader loader = Act.getInstance(DaoLoader.class); dao = $.cast(loader.load(spec)); } diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 6a1d98047..beec1e4b0 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -217,8 +217,11 @@ private Collection processParamSubstitution(Collection params) { } } else if (val instanceof Map) { processParamSubstitution((Map) val); + ret.add(val); } else if (val instanceof Collection) { - processParamSubstitution((Collection) val); + ret.add(processParamSubstitution((Collection) val)); + } else { + ret.add(val); } } return ret; From 0b80aff6c0ca974a7f09e9bc2cf05efd373f71f6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 17 Dec 2018 08:06:58 +1100 Subject: [PATCH 315/730] Configure healthy monitor and report server status #1021 --- CHANGELOG.md | 1 + src/main/java/act/Act.java | 2 +- src/main/java/act/app/App.java | 2 +- src/main/java/act/app/util/NamedPort.java | 7 +- src/main/java/act/conf/AppConfig.java | 56 ++++++++++---- src/main/java/act/conf/AppConfigKey.java | 9 +++ .../java/act/inject/param/JsonDtoPatch.java | 6 +- src/main/java/act/job/Every.java | 2 +- src/main/java/act/monitor/Monitor.java | 65 ++++++++++++++++ src/main/java/act/monitor/Probe.java | 76 +++++++++++++++++++ .../act/xio/undertow/UndertowResponse.java | 21 ++--- src/main/resources/aaa.authenticate.list | 1 + src/main/resources/act.scan.list | 1 + 13 files changed, 217 insertions(+), 32 deletions(-) create mode 100644 src/main/java/act/monitor/Monitor.java create mode 100644 src/main/java/act/monitor/Probe.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 23b255dda..f2d6bc2ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.17** +* Configure healthy monitor and report server status #1021 * Test - json param shall be processed #1025 * Test - allow it post body for DELETE request #1024 * Annotations with ValueLoader cannot work if post with json #1016 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 1c89b0004..e9560d0c4 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -361,7 +361,7 @@ public static void hook(App app) { if (app.config().supportSsl()) { network.register(appConfig().httpsPort(), true, networkHandler); } - List portList = app.config().namedPorts(); + Collection portList = app.config().namedPorts(); for (NamedPort np : portList) { network.register(np.port(), false, new NetworkHandler(app, np)); } diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index d039fbc65..e2b9a8c5b 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -1496,7 +1496,7 @@ private void initRouters() { UrlPath.classInit(this); router = new Router(this); moreRouters = new HashMap<>(); - List ports = config().namedPorts(); + Collection ports = config().namedPorts(); for (NamedPort port : ports) { moreRouters.put(port, new Router(this, port.name())); } diff --git a/src/main/java/act/app/util/NamedPort.java b/src/main/java/act/app/util/NamedPort.java index defdfa915..46b2c06c4 100644 --- a/src/main/java/act/app/util/NamedPort.java +++ b/src/main/java/act/app/util/NamedPort.java @@ -23,7 +23,7 @@ import org.osgl.util.E; import org.osgl.util.S; -public class NamedPort { +public class NamedPort implements Comparable { public static final String DEFAULT = "default"; @@ -62,6 +62,11 @@ public boolean equals(Object obj) { return false; } + @Override + public int compareTo(NamedPort o) { + return o.name.compareTo(name); + } + @Override public String toString() { return S.fmt("%s[:%s]", name, port); diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index a80f92e95..936c5fe15 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -83,6 +83,7 @@ public class AppConfig extends Config impleme public static final String CONF_FILE_NAME = "app.conf"; public static final String CSRF_TOKEN_NAME = "__csrf__"; public static final String PORT_CLI_OVER_HTTP = "__admin__"; + public static final String PORT_SYS = "__sys__"; private App app; @@ -821,7 +822,7 @@ protected T cliOverHttpPort(int port) { public int cliOverHttpPort() { if (null == cliOverHttpPort) { - cliOverHttpPort = get(CLI_OVER_HTTP_PORT, 5462); + cliOverHttpPort = get(CLI_OVER_HTTP_PORT, httpPort() + 2); } return cliOverHttpPort; } @@ -882,7 +883,7 @@ protected T cliPort(int port) { public int cliPort() { if (null == cliPort) { - cliPort = get(CLI_PORT, 5461); + cliPort = get(CLI_PORT, httpPort() + 1); } return cliPort; } @@ -1975,40 +1976,67 @@ private void _defPasswordSpec(String spec) { } } - private List namedPorts = null; + private Boolean monitorEnabled; + + protected T enableMonitor(boolean enable) { + this.monitorEnabled = enable; + return me(); + } + + public boolean monitorEnabled() { + if (null == monitorEnabled) { + monitorEnabled = $.bool(get(MONITOR, false)); + } + return monitorEnabled; + } + + private void _mergeMonitorEnabled(AppConfig config) { + if (!hasConfiguration(MONITOR)) { + this.monitorEnabled = config.monitorEnabled; + } + } + + private Map namedPorts = null; protected T namedPorts(NamedPort... namedPorts) { - this.namedPorts = C.listOf(namedPorts); + this.namedPorts = new HashMap<>(); + for (NamedPort port : namedPorts) { + this.namedPorts.put(port.name(), port); + } return me(); } - public List namedPorts() { + public Collection namedPorts() { if (null == namedPorts) { String s = get(NAMED_PORTS, null); if (null == s) { - namedPorts = cliOverHttp() ? C.list(new NamedPort(PORT_CLI_OVER_HTTP, cliOverHttpPort())) : C.list(); + namedPorts = new HashMap<>(); } else { String[] sa = (s.split("[,;]+")); - ListBuilder builder = ListBuilder.create(); + Map builder = new HashMap<>(); for (String s0 : sa) { String[] sa0 = s0.split(":"); E.invalidConfigurationIf(2 != sa0.length, "Unknown named port configuration: %s", s); String name = sa0[0].trim(); String val = sa0[1].trim(); NamedPort port = new NamedPort(name, Integer.parseInt(val)); - if (!builder.contains(port)) { - builder.add(port); + if (!builder.containsKey(port.name())) { + builder.put(port.name(), port); } else { throw E.invalidConfiguration("port[%s] already configured", name); } } - if (cliOverHttp()) { - builder.add(new NamedPort(PORT_CLI_OVER_HTTP, cliOverHttpPort())); - } - namedPorts = builder.toList(); + namedPorts = builder; } + if (cliOverHttp() && !namedPorts.containsKey(PORT_CLI_OVER_HTTP)) { + namedPorts.put(PORT_CLI_OVER_HTTP, new NamedPort(PORT_CLI_OVER_HTTP, cliOverHttpPort())); + } + if (!namedPorts.containsKey(PORT_SYS)) { + namedPorts.put(PORT_SYS, new NamedPort(PORT_SYS, httpPort() + 3)); + } + } - return namedPorts; + return namedPorts.values(); } public NamedPort namedPort(String portId) { diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 937b30be8..24a9a5545 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -767,6 +767,15 @@ public T val(Map configuration) { */ MODULES("modules"), + /** + * `act.monitor` + * + * When `act.monitor` is turned on then it will load the monitor thread + * + * Default value: `false`` + */ + MONITOR("monitor.enabled"), + /** * {@code act.namedPorts} specifies a list of port names this * application listen to. These are additional ports other than diff --git a/src/main/java/act/inject/param/JsonDtoPatch.java b/src/main/java/act/inject/param/JsonDtoPatch.java index 4d136bbd6..34b83ac4e 100644 --- a/src/main/java/act/inject/param/JsonDtoPatch.java +++ b/src/main/java/act/inject/param/JsonDtoPatch.java @@ -29,6 +29,7 @@ import java.lang.annotation.Annotation; import java.util.*; +import javax.persistence.Transient; /** * Patch JSON DTO bean object in case there are @@ -48,8 +49,11 @@ private JsonDtoPatch(String name, BeanSpec spec) { this.loader = valueLoaderOf(spec); if (null == loader) { for (Map.Entry entry : spec.fields().entrySet()) { - String fieldName = entry.getKey(); BeanSpec fieldSpec = entry.getValue(); + if (fieldSpec.isTransient() || fieldSpec.hasAnnotation(Transient.class)) { + continue; + } + String fieldName = entry.getKey(); JsonDtoPatch child = new JsonDtoPatch(fieldName, fieldSpec); if (!child.isEmpty()) { fieldsPatches.add(child); diff --git a/src/main/java/act/job/Every.java b/src/main/java/act/job/Every.java index 632634f0d..38fe3f287 100644 --- a/src/main/java/act/job/Every.java +++ b/src/main/java/act/job/Every.java @@ -35,7 +35,7 @@ * thus the job execution time will impact the next time the job is invoked

                                                                                                                                                                      */ @Retention(RetentionPolicy.CLASS) -@Target(ElementType.METHOD) +@Target({ElementType.METHOD, ElementType.TYPE}) public @interface Every { /** * Specifies the duration to execute the method. Time could be specified in diff --git a/src/main/java/act/monitor/Monitor.java b/src/main/java/act/monitor/Monitor.java new file mode 100644 index 000000000..7bfc8b317 --- /dev/null +++ b/src/main/java/act/monitor/Monitor.java @@ -0,0 +1,65 @@ +package act.monitor; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.conf.AppConfig; +import act.controller.annotation.Port; +import act.controller.annotation.UrlContext; +import org.osgl.inject.annotation.TypeOf; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.E; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import javax.inject.Singleton; + +@Singleton +@UrlContext("probes") +@Port(AppConfig.PORT_SYS) +public class Monitor implements Runnable { + + @TypeOf(Probe.class) + private List probes; + + Map> currentStatus = new HashMap<>(); + + public Monitor() { + if (Act.app().config().monitorEnabled()) { + Act.app().jobManager().every(this, 5, TimeUnit.SECONDS); + } + } + + @Override + public void run() { + for (Probe probe : probes) { + Map status = probe.doJob(); + currentStatus.put(probe.id(), status); + } + } + + @GetAction("{id}") + public Map get(String id) { + E.illegalArgumentIf(null == id); + return currentStatus.get(id); + } + +} diff --git a/src/main/java/act/monitor/Probe.java b/src/main/java/act/monitor/Probe.java new file mode 100644 index 000000000..5ae2cd686 --- /dev/null +++ b/src/main/java/act/monitor/Probe.java @@ -0,0 +1,76 @@ +package act.monitor; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.management.*; +import java.util.HashMap; +import java.util.Map; +import javax.inject.Singleton; + +/** + * A `Probe` is a worker that probe system and return data + */ +public interface Probe { + /** + * The identifier of this probe. This could be used + * for consumer to subscribe the data collected by + * the probe + * + * @return the probe id. + */ + String id(); + /** + * Do probe job once and return the data + * + * @return the data + */ + Map doJob(); + + @Singleton + class SystemProbe implements Probe { + + private RuntimeMXBean runtimeMXBean; + private ThreadMXBean threadMXBean; + private MemoryMXBean memoryMXBean; + + private Map status = new HashMap<>(); + + public SystemProbe() { + runtimeMXBean = ManagementFactory.getRuntimeMXBean(); + threadMXBean = ManagementFactory.getThreadMXBean(); + memoryMXBean = ManagementFactory.getMemoryMXBean(); + } + + @Override + public String id() { + return "sys"; + } + + @Override + public Map doJob() { + status.put("memory", memoryMXBean.getHeapMemoryUsage()); + status.put("threads", threadMXBean.getThreadCount()); + status.put("start", runtimeMXBean.getStartTime()); + status.put("uptime", runtimeMXBean.getUptime()); + return status; + } + } +} diff --git a/src/main/java/act/xio/undertow/UndertowResponse.java b/src/main/java/act/xio/undertow/UndertowResponse.java index 953008f91..5e09acf41 100644 --- a/src/main/java/act/xio/undertow/UndertowResponse.java +++ b/src/main/java/act/xio/undertow/UndertowResponse.java @@ -28,27 +28,20 @@ import io.undertow.server.HttpServerExchange; import io.undertow.server.handlers.resource.Resource; import io.undertow.server.handlers.resource.URLResource; -import io.undertow.util.HeaderMap; -import io.undertow.util.Headers; -import io.undertow.util.HttpString; +import io.undertow.util.*; import org.osgl.$; import org.osgl.exception.UnexpectedIOException; import org.osgl.http.H; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.storage.ISObject; -import org.osgl.util.E; -import org.osgl.util.IO; -import org.osgl.util.Output; -import org.osgl.util.OutputStreamOutput; - -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.Writer; +import org.osgl.util.*; + +import java.io.*; import java.net.URL; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; +import java.nio.file.StandardOpenOption; import java.util.Locale; public class UndertowResponse extends ActResponse { @@ -162,7 +155,9 @@ public UndertowResponse send(URL url) { @Override public UndertowResponse send(File file) { try { - sender().transferFrom(FileChannel.open(file.toPath()), IoCallback.END_EXCHANGE); + final FileChannel channel = FileChannel.open(file.toPath(), StandardOpenOption.READ); + hse.setResponseContentLength(channel.size() * 1000); + sender().transferFrom(channel, IoCallback.END_EXCHANGE); endAsync = !blocking(); afterWritingContent(); } catch (IOException e) { diff --git a/src/main/resources/aaa.authenticate.list b/src/main/resources/aaa.authenticate.list index 33c6ad641..b32dbfa03 100644 --- a/src/main/resources/aaa.authenticate.list +++ b/src/main/resources/aaa.authenticate.list @@ -3,6 +3,7 @@ -act.i18n.TimeZoneResolver -act.i18n.EnumService -act.Zen. +-act.monitor. # The following endpoints are only public on dev mode [dev]-act.apidoc. diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index a4feab5f8..1af2da1f6 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -36,3 +36,4 @@ act.ws.WebSocketAdminConsole act.job.JobAdmin act.job.JobAdmin$WsProgress act.ws.WebSocketConnectionListener$Manager$Finder +act\.monitor\..* From a111c57f50070a4fd3d2f1f25682722d40a227e8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 17 Dec 2018 16:57:09 +1100 Subject: [PATCH 316/730] Static file handler - the file handle not closed after serviced #1028 --- CHANGELOG.md | 1 + .../java/act/xio/undertow/UndertowResponse.java | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2d6bc2ec..3ca751229 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.17** +* * Configure healthy monitor and report server status #1021 * Test - json param shall be processed #1025 * Test - allow it post body for DELETE request #1024 diff --git a/src/main/java/act/xio/undertow/UndertowResponse.java b/src/main/java/act/xio/undertow/UndertowResponse.java index 5e09acf41..0a00349a8 100644 --- a/src/main/java/act/xio/undertow/UndertowResponse.java +++ b/src/main/java/act/xio/undertow/UndertowResponse.java @@ -156,8 +156,20 @@ public UndertowResponse send(URL url) { public UndertowResponse send(File file) { try { final FileChannel channel = FileChannel.open(file.toPath(), StandardOpenOption.READ); - hse.setResponseContentLength(channel.size() * 1000); - sender().transferFrom(channel, IoCallback.END_EXCHANGE); + hse.setResponseContentLength(channel.size()); + sender().transferFrom(channel, new IoCallback() { + @Override + public void onComplete(HttpServerExchange exchange, Sender sender) { + IO.close(channel); + IoCallback.END_EXCHANGE.onComplete(exchange, sender); + } + + @Override + public void onException(HttpServerExchange exchange, Sender sender, IOException exception) { + IO.close(channel); + IoCallback.END_EXCHANGE.onException(exchange, sender, exception); + } + }); endAsync = !blocking(); afterWritingContent(); } catch (IOException e) { From 861893d4ee65af1f7e9fe63a6a8cd120e6683ce1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 18 Dec 2018 21:07:11 +1100 Subject: [PATCH 317/730] add test case for 1027 --- CHANGELOG.md | 3 ++- .../src/main/java/ghissues/Gh1027.java | 20 +++++++++++++++++++ .../main/resources/test/scenarios/1027.yml | 19 ++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1027.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1027.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ca751229..7fbee7969 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # ActFramework Change Log **1.8.17** -* +* UnexpectedException when submit a `Map` type parameter with value as `null` #1027 +* Static file handler - the file handle not closed after serviced #1028 * Configure healthy monitor and report server status #1021 * Test - json param shall be processed #1025 * Test - allow it post body for DELETE request #1024 diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1027.java b/testapps/GHIssues/src/main/java/ghissues/Gh1027.java new file mode 100644 index 000000000..e3bf52aee --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1027.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.PostAction; + +import java.util.Map; + +@UrlContext("1027") +public class Gh1027 extends BaseController { + + public static class Foo { + public String name; + } + + @PostAction + public Map test(Map data) { + return data; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1027.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1027.yml new file mode 100644 index 000000000..a2c52ea73 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1027.yml @@ -0,0 +1,19 @@ +Scenario(1027): + description: "[1027] UnexpectedException when submit a `Map` type parameter with value as `null`" + interactions: + - description: Test + request: + post: /1027 + params: + + response: + json: + name: + - exists: true + - description: Get foo name + request: + get: /1022/foo/1/name + response: + json: + result: + - exists: true From ed55b7f1ce4c8a79f440a539b6c553c8bbbdd174 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 19 Dec 2018 14:51:04 +1100 Subject: [PATCH 318/730] UnexpectedException when submit a `Map` type parameter with value as `null` #1027 --- src/main/java/act/SysUtilAdmin.java | 13 +++++++++++ src/main/java/act/app/App.java | 5 +++++ src/main/java/act/app/SingletonRegistry.java | 5 +++++ src/main/java/act/data/SObjectResolver.java | 3 +++ src/main/java/act/inject/ActProviders.java | 3 +-- src/main/java/act/inject/param/MapLoader.java | 3 +++ src/main/java/act/inject/param/ParamTree.java | 6 ++++- .../src/main/java/ghissues/Gh1027.java | 22 ++++++++++++++++++- 8 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/main/java/act/SysUtilAdmin.java b/src/main/java/act/SysUtilAdmin.java index 13cbd1370..c15dfa483 100644 --- a/src/main/java/act/SysUtilAdmin.java +++ b/src/main/java/act/SysUtilAdmin.java @@ -20,6 +20,7 @@ * #L% */ +import act.app.SingletonRegistry; import act.cli.*; import act.sys.Env; import act.util.PropertySpec; @@ -101,6 +102,18 @@ public void memInfo( } } + @Command(name = "act.singleton.list", help = "List all singletons") + public Iterable listSingletons() { + SingletonRegistry singletonRegistry = Act.app().singletonRegistry(); + return singletonRegistry.typeNames(); + } + + @Command(name = "act.singleton.show-property", help = "Show singleton instance property") + public Object showSingletonProperty(@Required String type, @Required String property) { + Object o = Act.app().singleton(Act.classForName(type)); + return $.getProperty(o, property); + } + @Command(name = "act.gc", help = "Run GC") public void gc(CliContext context) { System.gc(); diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index e2b9a8c5b..066ef4955 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -211,6 +211,7 @@ private App() { this.sessionManager = new SessionManager(this.config, config().cacheService("logout-session")); this.dependencyInjector = new GenieInjector(this); this.singletonRegistry = new SingletonRegistry(this); + this.singletonRegistry.register(SingletonRegistry.class, this.singletonRegistry); this.singletonRegistry.register(SessionManager.class, this.sessionManager); this.singletonRegistry.register(CookieSessionMapper.class, new CookieSessionMapper(this.config)); } @@ -1012,6 +1013,10 @@ public DI injector() { return (DI) dependencyInjector; } + public SingletonRegistry singletonRegistry() { + return singletonRegistry; + } + public UploadFileStorageService uploadFileStorageService() { return uploadFileStorageService; } diff --git a/src/main/java/act/app/SingletonRegistry.java b/src/main/java/act/app/SingletonRegistry.java index a3632f6b8..02dff798d 100644 --- a/src/main/java/act/app/SingletonRegistry.java +++ b/src/main/java/act/app/SingletonRegistry.java @@ -23,6 +23,7 @@ import act.Destroyable; import act.app.event.SysEventId; import org.osgl.$; +import org.osgl.util.C; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -65,6 +66,10 @@ public void run() { } } + public Iterable typeNames() { + return C.list(registry.keySet()).map($.F.asString()); + } + public void register(Class singletonClass, Object singleton) { if (isTraceEnabled()) { trace("direct register " + singletonClass); diff --git a/src/main/java/act/data/SObjectResolver.java b/src/main/java/act/data/SObjectResolver.java index b51f37103..a6b0c6dbb 100644 --- a/src/main/java/act/data/SObjectResolver.java +++ b/src/main/java/act/data/SObjectResolver.java @@ -76,6 +76,9 @@ public SObject resolve(String value) { } } } + if (S.blank(value)) { + return null; + } // last try base64 decoder try { return resolveFromBase64(value); diff --git a/src/main/java/act/inject/ActProviders.java b/src/main/java/act/inject/ActProviders.java index 62c314e87..beeaffe44 100644 --- a/src/main/java/act/inject/ActProviders.java +++ b/src/main/java/act/inject/ActProviders.java @@ -21,8 +21,7 @@ */ import act.Act; -import act.app.ActionContext; -import act.app.App; +import act.app.*; import act.cli.CliContext; import act.cli.CliOverHttpContext; import act.cli.CliSession; diff --git a/src/main/java/act/inject/param/MapLoader.java b/src/main/java/act/inject/param/MapLoader.java index 8a71fffd1..510080f5d 100644 --- a/src/main/java/act/inject/param/MapLoader.java +++ b/src/main/java/act/inject/param/MapLoader.java @@ -139,6 +139,9 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { throw E.unexpected("Component type not resolvable: %s", valType); } Object value = valueResolver.resolve(sval); + if (null == value) { + continue; + } if (!valClass.isInstance(value)) { throw new BadRequest("Cannot load parameter, expected type: %s, found: %s", valClass, value.getClass()); } diff --git a/src/main/java/act/inject/param/ParamTree.java b/src/main/java/act/inject/param/ParamTree.java index f28269fb4..42cd19013 100644 --- a/src/main/java/act/inject/param/ParamTree.java +++ b/src/main/java/act/inject/param/ParamTree.java @@ -86,7 +86,11 @@ ParamTreeNode node(ParamKey key, ActContext context) { private ParamTreeNode asRootNode() { ParamTreeNode root = ParamTreeNode.map(ParamKey.ROOT_KEY); for (Map.Entry entry : allNodes.entrySet()) { - root.addChild(entry.getKey().name(), entry.getValue()); + ParamKey key = entry.getKey(); + if (key.size() > 1) { + continue; + } + root.addChild(key.name(), entry.getValue()); } return root; } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1027.java b/testapps/GHIssues/src/main/java/ghissues/Gh1027.java index e3bf52aee..2ccc4595e 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh1027.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1027.java @@ -1,15 +1,30 @@ package ghissues; import act.controller.annotation.UrlContext; +import act.util.SimpleBean; import org.osgl.mvc.annotation.PostAction; +import org.osgl.storage.ISObject; +import org.osgl.util.StringValueResolver; +import java.util.List; import java.util.Map; @UrlContext("1027") public class Gh1027 extends BaseController { - public static class Foo { + public static class Foo implements SimpleBean { public String name; + + public Foo(String name) { + this.name = name; + } + } + + public static class FooResolver extends StringValueResolver { + @Override + public Foo resolve(String value) { + return new Foo(value); + } } @PostAction @@ -17,4 +32,9 @@ public Map test(Map data) { return data; } + @PostAction("upload") + public void testFile(List files) { + System.out.println(files.size()); + } + } From 6a0dcc8843fa2b73a1f197ac0e16973dd6f1a183 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 19 Dec 2018 20:25:57 +1100 Subject: [PATCH 319/730] Provide a way to handle generic param type loading #1031 --- CHANGELOG.md | 1 + legacy-testapp/pom.xml | 4 +- .../param/ActionContextParamLoader.java | 6 +- .../java/act/inject/param/JsonDtoPatch.java | 11 +-- .../inject/param/JsonParamValueLoader.java | 16 +++++ .../act/inject/param/ParamValueLoader.java | 19 +++++ .../inject/param/ParamValueLoaderService.java | 72 ++++++++++++++++--- .../java/act/inject/param/PojoLoader.java | 5 ++ .../inject/param/ScopedParamValueLoader.java | 17 +++++ .../param/StringValueResolverValueLoader.java | 48 +++++++++++-- .../StringValueResolverValueLoaderBase.java | 71 +++++++++++++++++- src/main/resources/rythm/~test.html | 6 ++ .../src/main/java/ghissues/Gh1027.java | 40 ----------- .../main/resources/test/scenarios/1022.yml | 2 +- .../main/resources/test/scenarios/1027.yml | 19 ----- 15 files changed, 250 insertions(+), 87 deletions(-) delete mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1027.java delete mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1027.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fbee7969..6e6ce7d9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.17** +* Provide a way to handle generic param type loading #1031 * UnexpectedException when submit a `Map` type parameter with value as `null` #1027 * Static file handler - the file handle not closed after serviced #1028 * Configure healthy monitor and report server status #1021 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 09e9195a3..f6fd9e5f7 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,9 +73,9 @@ UTF-8 UTF-8 - 1.8.16-SNAPSHOT + 1.8.17-SNAPSHOT [0.13.0, 2.0.0) - 1.6.5-SNAPSHOT + 1.6.5 testapp.TestApp diff --git a/src/main/java/act/inject/param/ActionContextParamLoader.java b/src/main/java/act/inject/param/ActionContextParamLoader.java index b4912e296..357f3c00b 100644 --- a/src/main/java/act/inject/param/ActionContextParamLoader.java +++ b/src/main/java/act/inject/param/ActionContextParamLoader.java @@ -80,7 +80,7 @@ protected ParamValueLoader findContextSpecificLoader( } } if (matches) { - loader = new StringValueResolverValueLoader(ParamKey.of(bindName), resolver, null, def, rawType); + loader = new StringValueResolverValueLoader(ParamKey.of(bindName), def, resolver, spec); } } } @@ -104,7 +104,7 @@ protected ParamValueLoader findContextSpecificLoader( } } if (matches) { - loader = new StringValueResolverValueLoader(ParamKey.of(bindName), resolver, null, def, rawType); + loader = new StringValueResolverValueLoader(ParamKey.of(bindName), def, resolver, spec); break; } } @@ -126,7 +126,7 @@ protected ParamValueLoader findContextSpecificLoader( resolver = resolverManager.resolver(rawType, spec); } - loader = (null != resolver) ? new StringValueResolverValueLoader(ParamKey.of(bindName), resolver, param, def, rawType) : buildLoader(ParamKey.of(bindName), spec); + loader = (null != resolver) ? new StringValueResolverValueLoader(ParamKey.of(bindName), def, spec) : buildLoader(ParamKey.of(bindName), spec); } return loader; diff --git a/src/main/java/act/inject/param/JsonDtoPatch.java b/src/main/java/act/inject/param/JsonDtoPatch.java index 34b83ac4e..b321155ba 100644 --- a/src/main/java/act/inject/param/JsonDtoPatch.java +++ b/src/main/java/act/inject/param/JsonDtoPatch.java @@ -48,12 +48,15 @@ private JsonDtoPatch(String name, BeanSpec spec) { this.name = S.requireNotBlank(name); this.loader = valueLoaderOf(spec); if (null == loader) { - for (Map.Entry entry : spec.fields().entrySet()) { - BeanSpec fieldSpec = entry.getValue(); - if (fieldSpec.isTransient() || fieldSpec.hasAnnotation(Transient.class)) { + for (BeanSpec fieldSpec : spec.nonStaticFields()) { + Class fieldType = fieldSpec.rawType(); + if (fieldSpec.isTransient() || fieldSpec.hasAnnotation(Transient.class) || $.isImmutable(fieldType)) { continue; } - String fieldName = entry.getKey(); + if (Collection.class.isAssignableFrom(fieldType) || Map.class.isAssignableFrom(fieldType)) { + continue; + } + String fieldName = fieldSpec.name(); JsonDtoPatch child = new JsonDtoPatch(fieldName, fieldSpec); if (!child.isEmpty()) { fieldsPatches.add(child); diff --git a/src/main/java/act/inject/param/JsonParamValueLoader.java b/src/main/java/act/inject/param/JsonParamValueLoader.java index f6e912feb..20b2cfca2 100644 --- a/src/main/java/act/inject/param/JsonParamValueLoader.java +++ b/src/main/java/act/inject/param/JsonParamValueLoader.java @@ -57,6 +57,13 @@ public Object get() { } } + private JsonParamValueLoader(JsonParamValueLoader parent, Class runtimeType) { + this.fallBack = parent.fallBack.wrapWithRuntimeType(runtimeType); + this.spec = parent.spec; + this.defValProvider = parent.defValProvider; + this.isPathVariable = parent.isPathVariable; + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (isPathVariable) { @@ -110,4 +117,13 @@ public Object get() { } } + @Override + public boolean requireRuntimeTypeInfo() { + return fallBack.requireRuntimeTypeInfo(); + } + + @Override + public ParamValueLoader wrapWithRuntimeType(Class type) { + return new JsonParamValueLoader(this, type); + } } diff --git a/src/main/java/act/inject/param/ParamValueLoader.java b/src/main/java/act/inject/param/ParamValueLoader.java index 9ea3b8a2a..f3e0d35ef 100644 --- a/src/main/java/act/inject/param/ParamValueLoader.java +++ b/src/main/java/act/inject/param/ParamValueLoader.java @@ -22,6 +22,7 @@ import act.cli.CliContext; import act.util.*; +import org.osgl.util.E; /** * Responsible for providing the value to a method parameter @@ -66,6 +67,14 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { */ boolean supportScopeCaching(); + /** + * Does this loader require runtime param type resolution. Useful when parent class + * is a generic typed class. + */ + boolean requireRuntimeTypeInfo(); + + ParamValueLoader wrapWithRuntimeType(Class type); + abstract class NonCacheable extends LogSupportedDestroyableBase implements ParamValueLoader { @Override public String bindName() { @@ -81,6 +90,16 @@ public boolean supportJsonDecorator() { public boolean supportScopeCaching() { return false; } + + @Override + public boolean requireRuntimeTypeInfo() { + return false; + } + + @Override + public ParamValueLoader wrapWithRuntimeType(Class type) { + throw E.unsupport(); + } } abstract class Cacheable extends NonCacheable { diff --git a/src/main/java/act/inject/param/ParamValueLoaderService.java b/src/main/java/act/inject/param/ParamValueLoaderService.java index 1c443d2ce..bfa410698 100644 --- a/src/main/java/act/inject/param/ParamValueLoaderService.java +++ b/src/main/java/act/inject/param/ParamValueLoaderService.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -67,9 +67,10 @@ public abstract class ParamValueLoaderService extends LogSupportedDestroyableBas private static final ParamValueLoader RESULT_LOADER = new ParamValueLoader.NonCacheable() { @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { - return ((ActionContext)context).result(); + return ((ActionContext) context).result(); } }; + private static class ThrowableLoader extends ParamValueLoader.NonCacheable { private Class throwableType; @@ -91,6 +92,8 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { protected StringValueResolverManager resolverManager; protected BinderManager binderManager; protected GenieInjector injector; + ConcurrentHashMap> typeLookupLookup = new ConcurrentHashMap<>(); + ConcurrentHashMap<$.Pair, ParamValueLoader> runtimeLoaders = new ConcurrentHashMap<>(); ConcurrentMap methodRegistry = new ConcurrentHashMap<>(); Map methodValidationConstraintLookup = new HashMap(); ConcurrentMap> fieldRegistry = new ConcurrentHashMap<>(); @@ -154,6 +157,15 @@ public ParamValueLoader[] methodParamLoaders(Object host, Method method, ActCont return loaders; } + private Map getTypeLookup(Class host) { + Map lookup = typeLookupLookup.get(host); + if (null == lookup) { + lookup = Generics.buildTypeParamImplLookup(host); + typeLookupLookup.put(host, lookup); + } + return lookup; + } + public Object[] loadMethodParams(Object host, Method method, ActContext ctx) { try { ParamValueLoader[] loaders = methodParamLoaders(host, method, ctx); @@ -161,7 +173,22 @@ public Object[] loadMethodParams(Object host, Method method, ActContext ctx) { int sz = loaders.length; Object[] params = new Object[sz]; for (int i = 0; i < sz; ++i) { - params[i] = loaders[i].load(null, ctx, false); + ParamValueLoader loader = loaders[i]; + if (loader.requireRuntimeTypeInfo()) { + Class hostType = host.getClass(); + $.Pair key = $.Pair(loader, hostType); + ParamValueLoader runtimeLoader = runtimeLoaders.get(key); + if (null == runtimeLoader) { + Map typeLookups = getTypeLookup(hostType); + Type[] paramTypes = method.getGenericParameterTypes(); + Type paramType = paramTypes[i]; + Class runtimeType = typeLookups.get(((TypeVariable) paramType).getName()); + runtimeLoader = loader.wrapWithRuntimeType(runtimeType); + runtimeLoaders.put(key, runtimeLoader); + } + loader = runtimeLoader; + } + params[i] = loader.load(null, ctx, false); } if (null != hasValidationConstraint && hasValidationConstraint) { Set violations = $.cast(executableValidator().validateParameters(host, method, params)); @@ -192,7 +219,7 @@ public Object[] loadMethodParams(Object host, Method method, ActContext ctx) { } } - protected ParamValueLoader findBeanLoader(Class beanClass) { + protected ParamValueLoader findBeanLoader(final Class beanClass) { final Provider provider = injector.getProvider(beanClass); final Map loaders = fieldLoaders(beanClass); final boolean hasField = !loaders.isEmpty(); @@ -210,6 +237,18 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { for (Map.Entry entry : loaders.entrySet()) { Field field = entry.getKey(); ParamValueLoader loader = entry.getValue(); + if (loader.requireRuntimeTypeInfo()) { + $.Pair key = $.Pair(loader, (Class)beanClass); + ParamValueLoader runtimeLoader = runtimeLoaders.get(key); + if (null == runtimeLoader) { + Map typeLookups = getTypeLookup(beanClass); + Type paramType = field.getGenericType(); + Class runtimeType = typeLookups.get(((TypeVariable) paramType).getName()); + runtimeLoader = loader.wrapWithRuntimeType(runtimeType); + runtimeLoaders.put(key, runtimeLoader); + } + loader = runtimeLoader; + } Object fieldValue = loader.load(null, context, noDefaultValue); if (null != fieldValue) { field.set(bean, fieldValue); @@ -331,7 +370,7 @@ private ParamValueLoader paramValueLoaderOf(BeanSpec spec, String bindName, ActC if (Result.class.isAssignableFrom(rawType)) { return RESULT_LOADER; } else if (Throwable.class.isAssignableFrom(rawType)) { - return new ThrowableLoader((Class)rawType); + return new ThrowableLoader((Class) rawType); } else if (Annotation.class.isAssignableFrom(rawType)) { return findHandlerMethodAnnotation((Class) rawType, ctx); } @@ -358,8 +397,10 @@ private ParamValueLoader paramValueLoaderOf(BeanSpec spec, String bindName, ActC * * the handler method * * the current method (might be a intercepter method) * - * @param annoType the annotation type - * @param ctx the current {@link ActContext} + * @param annoType + * the annotation type + * @param ctx + * the current {@link ActContext} * @return a `ParamValueLoader` instance */ private ParamValueLoader findHandlerMethodAnnotation(final Class annoType, ActContext ctx) { @@ -406,7 +447,7 @@ protected final ParamValueLoader binder(BeanSpec spec, String bindName) { if (null == loader) { Annotation[] aa = spec.taggedAnnotations(Bind.class); if (aa.length > 0) { - for (Annotation a: aa) { + for (Annotation a : aa) { Bind bind = AnnotationUtil.tagAnnotation(a, Bind.class); for (Class binderClass : bind.value()) { Binder binder = injector.get(binderClass); @@ -603,7 +644,7 @@ private ParamValueLoader findLoader(ParamKey paramKey, BeanSpec spec) { StringValueResolver resolver = resolverManager.resolver(fieldType, spec); if (null != resolver) { DefaultValue def = spec.getAnnotation(DefaultValue.class); - return new StringValueResolverValueLoader(key, resolver, null, def, fieldType); + return new StringValueResolverValueLoader(key, def, spec); } return buildLoader(key, spec); @@ -676,6 +717,16 @@ public boolean supportJsonDecorator() { public boolean supportScopeCaching() { return jsonDecorated.supportScopeCaching(); } + + @Override + public boolean requireRuntimeTypeInfo() { + return false; + } + + @Override + public ParamValueLoader wrapWithRuntimeType(Class type) { + throw E.unsupport(); + } }; } @@ -796,6 +847,7 @@ public static boolean providedButNotDbBind(BeanSpec beanSpec, DependencyInjector } private static final String DB_BIND_CNAME = DbBind.class.getName(); + // DbBind is special: it's class loader is AppClassLoader public static boolean hasDbBind(Annotation[] annotations) { final String name = DB_BIND_CNAME; diff --git a/src/main/java/act/inject/param/PojoLoader.java b/src/main/java/act/inject/param/PojoLoader.java index 4f24f6eaf..b2df9e882 100644 --- a/src/main/java/act/inject/param/PojoLoader.java +++ b/src/main/java/act/inject/param/PojoLoader.java @@ -98,6 +98,11 @@ private Map fieldLoaders(ParamKey key, BeanSpec spec) { try { field.setAccessible(true); String fieldName = field.getName(); + BeanSpec fieldSpec = spec.field(fieldName); + if (null == fieldSpec) { + // circular reference + continue; + } fieldLoaders.put(fieldName, service.fieldLoader(key, field, spec.field(fieldName))); } finally { circularReferenceDetector.remove(fieldType); diff --git a/src/main/java/act/inject/param/ScopedParamValueLoader.java b/src/main/java/act/inject/param/ScopedParamValueLoader.java index ee932d91f..77fc9c7cd 100644 --- a/src/main/java/act/inject/param/ScopedParamValueLoader.java +++ b/src/main/java/act/inject/param/ScopedParamValueLoader.java @@ -40,6 +40,13 @@ class ScopedParamValueLoader implements ParamValueLoader { this.key = scopeCache.key(beanSpec); } + private ScopedParamValueLoader(ScopedParamValueLoader parent, Class runtimeType) { + this.realLoader = parent.realLoader.wrapWithRuntimeType(runtimeType); + this.key = parent.key; + this.scopeCache = parent.scopeCache; + this.supportCaching = parent.supportCaching; + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (supportCaching) { @@ -73,4 +80,14 @@ public boolean supportJsonDecorator() { public boolean supportScopeCaching() { return realLoader.supportScopeCaching(); } + + @Override + public boolean requireRuntimeTypeInfo() { + return realLoader.requireRuntimeTypeInfo(); + } + + @Override + public ParamValueLoader wrapWithRuntimeType(Class type) { + return new ScopedParamValueLoader(this, type); + } } diff --git a/src/main/java/act/inject/param/StringValueResolverValueLoader.java b/src/main/java/act/inject/param/StringValueResolverValueLoader.java index 1b5862b7a..2d4ded989 100644 --- a/src/main/java/act/inject/param/StringValueResolverValueLoader.java +++ b/src/main/java/act/inject/param/StringValueResolverValueLoader.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -23,18 +23,56 @@ import act.app.ActionContext; import act.inject.DefaultValue; import act.util.ActContext; -import org.osgl.mvc.annotation.Param; +import org.osgl.inject.BeanSpec; import org.osgl.util.E; import org.osgl.util.StringValueResolver; +import java.util.concurrent.ConcurrentHashMap; + public class StringValueResolverValueLoader extends StringValueResolverValueLoaderBase { private static final ThreadLocal encodeShare = new ThreadLocal(); private HttpRequestParamEncode encode; - public StringValueResolverValueLoader(ParamKey key, StringValueResolver resolver, Param param, DefaultValue def, Class type) { - super(key, resolver, param, def, type, false); + private ConcurrentHashMap dynamicLoaders = new ConcurrentHashMap<>(); + + public StringValueResolverValueLoader(ParamKey key, DefaultValue def, BeanSpec paramSpec) { + super(key, def, paramSpec, false); + } + + public StringValueResolverValueLoader(ParamKey key, DefaultValue def, StringValueResolver resolver, BeanSpec paramSpec) { + super(key, def, resolver, paramSpec, false); + } + + private StringValueResolverValueLoader(StringValueResolverValueLoader me, Class runtimeType, StringValueResolver resolver, Object defVal) { + super(me, runtimeType, resolver, defVal); + } + + @Override + public ParamValueLoader wrapWithRuntimeType(final Class type) { + final StringValueResolverValueLoader me = this; + return new JsonBodySupported() { + @Override + public Object load(Object bean, ActContext context, boolean noDefaultValue) { + StringValueResolverValueLoader dynamicLoader = dynamicLoaders.get(type); + if (null == dynamicLoader) { + StringValueResolver resolver = resolverMap.get(type); + Object defVal; + if (null == resolver) { + resolver = lookupResolver(paramSpec, type); + defVal = null == defSpec ? defVal(param, type) : resolver.resolve(defSpec.value()); + resolverMap.put(type, resolver); + defValMap.put(type, defVal); + } else { + defVal = defValMap.get(type); + } + dynamicLoader = new StringValueResolverValueLoader(me, type, resolver, defVal); + dynamicLoaders.put(type, dynamicLoader); + } + return dynamicLoader.load(bean, context, noDefaultValue); + } + }; } @Override diff --git a/src/main/java/act/inject/param/StringValueResolverValueLoaderBase.java b/src/main/java/act/inject/param/StringValueResolverValueLoaderBase.java index 3670eb9fd..bcedc1364 100644 --- a/src/main/java/act/inject/param/StringValueResolverValueLoaderBase.java +++ b/src/main/java/act/inject/param/StringValueResolverValueLoaderBase.java @@ -20,25 +20,74 @@ * #L% */ +import act.Act; +import act.app.data.StringValueResolverManager; import act.inject.DefaultValue; +import org.osgl.inject.BeanSpec; +import org.osgl.inject.Injector; import org.osgl.mvc.annotation.Param; import org.osgl.util.E; import org.osgl.util.StringValueResolver; +import java.util.HashMap; +import java.util.Map; + abstract class StringValueResolverValueLoaderBase extends ParamValueLoader.JsonBodySupported { protected final StringValueResolver stringValueResolver; + private final StringValueResolverManager resolverManager; + private final boolean requireRuntimeType; + private final Injector injector; protected final ParamKey paramKey; + protected final Param param; protected final Object defVal; protected final DefaultValue defSpec; + protected final BeanSpec paramSpec; + protected final Map defValMap = new HashMap<>(); + protected final Map resolverMap = new HashMap<>(); - public StringValueResolverValueLoaderBase(ParamKey key, StringValueResolver resolver, Param param, DefaultValue def, Class type, boolean simpleKeyOnly) { + public StringValueResolverValueLoaderBase(ParamKey key, DefaultValue def, BeanSpec spec, boolean simpleKeyOnly) { E.illegalArgumentIf(simpleKeyOnly && !key.isSimple()); + this.paramSpec = spec; + this.param = spec.getAnnotation(Param.class); + this.paramKey = key; + this.defSpec = def; + this.resolverManager = Act.app().resolverManager(); + this.injector = Act.app().injector(); + this.requireRuntimeType = !(spec.type() instanceof Class); + this.stringValueResolver = this.requireRuntimeType ? null : lookupResolver(spec, spec.rawType()); + this.defVal = this.requireRuntimeType ? null : null != def ? this.stringValueResolver.resolve(def.value()) : defVal(param, spec.rawType()); + } + + protected StringValueResolverValueLoaderBase(ParamKey key, DefaultValue def, StringValueResolver resolver, BeanSpec paramSpec, boolean simpleKeyOnly) { + E.illegalArgumentIf(simpleKeyOnly && !key.isSimple()); + this.paramSpec = paramSpec; + this.param = paramSpec.getAnnotation(Param.class); this.paramKey = key; - this.stringValueResolver = resolver; this.defSpec = def; - this.defVal = null != def ? resolver.resolve(def.value()) : defVal(param, type); + this.resolverManager = Act.app().resolverManager(); + this.injector = Act.app().injector(); + this.requireRuntimeType = false; + this.stringValueResolver = resolver; + this.defVal = null != def ? this.stringValueResolver.resolve(def.value()) : defVal(param, paramSpec.rawType()); + } + + protected StringValueResolverValueLoaderBase(StringValueResolverValueLoaderBase parent, Class runtimeType, StringValueResolver resolver, Object defVal) { + this.injector = parent.injector; + this.resolverManager = parent.resolverManager; + this.requireRuntimeType = false; + this.paramKey = parent.paramKey; + this.param = parent.param; + this.defVal = defVal; + this.stringValueResolver = resolver; + this.defSpec = parent.defSpec; + this.paramSpec = BeanSpec.of(runtimeType, this.injector); + } + + @Override + public boolean requireRuntimeTypeInfo() { + return this.requireRuntimeType; } @Override @@ -46,6 +95,22 @@ public String bindName() { return paramKey.toString(); } + protected StringValueResolver lookupResolver(BeanSpec spec, Class runtimeType) { + StringValueResolver resolver = null; + Param param = spec.getAnnotation(Param.class); + if (null != param) { + Class resolverClass = param.resolverClass(); + if (Param.DEFAULT_RESOLVER.class != resolverClass) { + resolver = injector.get(resolverClass); + } + } + + if (null == resolver) { + resolver = resolverManager.resolver(runtimeType, spec); + } + return resolver; + } + static Object defVal(Param param, Class rawType) { if (boolean.class == rawType) { return null != param && param.defBooleanVal(); diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html index 9d44d681c..aee947820 100644 --- a/src/main/resources/rythm/~test.html +++ b/src/main/resources/rythm/~test.html @@ -65,6 +65,12 @@

                                                                                                                                                                      } else { @scenario.name.toUpperCase() } + @if(!scenario.status.pass()) { +    + + Re-run scenario > + + }

                                                                                                                                                                      diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1027.java b/testapps/GHIssues/src/main/java/ghissues/Gh1027.java deleted file mode 100644 index 2ccc4595e..000000000 --- a/testapps/GHIssues/src/main/java/ghissues/Gh1027.java +++ /dev/null @@ -1,40 +0,0 @@ -package ghissues; - -import act.controller.annotation.UrlContext; -import act.util.SimpleBean; -import org.osgl.mvc.annotation.PostAction; -import org.osgl.storage.ISObject; -import org.osgl.util.StringValueResolver; - -import java.util.List; -import java.util.Map; - -@UrlContext("1027") -public class Gh1027 extends BaseController { - - public static class Foo implements SimpleBean { - public String name; - - public Foo(String name) { - this.name = name; - } - } - - public static class FooResolver extends StringValueResolver { - @Override - public Foo resolve(String value) { - return new Foo(value); - } - } - - @PostAction - public Map test(Map data) { - return data; - } - - @PostAction("upload") - public void testFile(List files) { - System.out.println(files.size()); - } - -} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml index 549b2f525..023dc0aeb 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml @@ -10,7 +10,7 @@ Scenario(1022): - exists: true - description: Get foo name request: - get: /1022/foo/1/name + get: /1022/foo/1/fooName response: json: result: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1027.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1027.yml deleted file mode 100644 index a2c52ea73..000000000 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1027.yml +++ /dev/null @@ -1,19 +0,0 @@ -Scenario(1027): - description: "[1027] UnexpectedException when submit a `Map` type parameter with value as `null`" - interactions: - - description: Test - request: - post: /1027 - params: - - response: - json: - name: - - exists: true - - description: Get foo name - request: - get: /1022/foo/1/name - response: - json: - result: - - exists: true From 421db2134cf548f368dc4816b2ca72fca5d281e6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 20 Dec 2018 18:45:28 +1100 Subject: [PATCH 320/730] Test report page improvement #1032 --- CHANGELOG.md | 1 + src/main/java/act/db/di/FindBy.java | 8 ++++ src/main/java/act/route/Router.java | 2 +- src/main/java/act/test/Scenario.java | 1 + .../java/act/test/util/ScenarioManager.java | 15 ++++--- src/main/java/act/test/util/YamlLoader.java | 2 +- src/main/resources/rythm/~test.html | 43 +++++++++++++++++++ 7 files changed, 63 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e6ce7d9e..c0d33f828 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.17** +* Test report page improvement #1032 * Provide a way to handle generic param type loading #1031 * UnexpectedException when submit a `Map` type parameter with value as `null` #1027 * Static file handler - the file handle not closed after serviced #1028 diff --git a/src/main/java/act/db/di/FindBy.java b/src/main/java/act/db/di/FindBy.java index 371ae4b6f..b2d2007ec 100644 --- a/src/main/java/act/db/di/FindBy.java +++ b/src/main/java/act/db/di/FindBy.java @@ -125,6 +125,14 @@ public Object get() { } else { if (findOne) { Object found = dao.findOneBy(Keyword.of(queryFieldName).javaVariable(), by); + if (null == found) { + // try find by id anyway + try { + found = dao.findById(by); + } catch (Exception e) { + // ignore + } + } return ensureNotNull(found, value, ctx); } else { if (S.empty(value)) { diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 9c9c6682c..d82c89e39 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -1106,7 +1106,7 @@ public Node child(String name, ActionContext context) { @Override public String id() { - return null == name ? keyword.camelCase() : name; + return null == name ? keyword.dashed() : name; } @Override diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index beec1e4b0..6b6d70b00 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -276,6 +276,7 @@ private String verifyJsonBody(Object jsonBody) { public boolean clearFixtures = true; public String urlContext; public String partition = "DEFAULT"; + public String source; $.Var lastData = $.var(); $.Var lastHeaders = $.var(); diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index 907d9d642..f62cbc3d7 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -92,11 +92,11 @@ private void configure() { } private void loadDefault() { - String content = getResourceAsString("scenarios.yml"); - if (null == content) { - return; + URL url = Act.getResource(patchResourceName("scenarios.yml")); + if (null != url) { + String content = IO.readContentAsString(url); + parseOne(content, url.getFile()); } - parseOne(content); } private void searchScenarioFolder() { @@ -155,7 +155,7 @@ public boolean accept(File dir, String name) { continue; } try { - parseOne(content); + parseOne(content, file.getAbsolutePath()); } catch (RuntimeException e) { error(e, "Error parsing scenario file: %s", file.getName()); throw e; @@ -170,7 +170,7 @@ private void loadFromJar(File jarFile) { if (isScenarioFile(name)) { InputStream is = jar.getInputStream(entry); String content = IO.readContentAsString(is); - parseOne(content); + parseOne(content, null); } } } catch (IOException e) { @@ -182,7 +182,7 @@ private boolean isScenarioFile(String name) { return name.startsWith("test/scenarios/") && name.endsWith(".yml"); } - private void parseOne(String content) { + private void parseOne(String content, String fileName) { Map map = parse(content, NULL_DAO); Map loaded = $.cast(map); boolean hasDefaultUrlContext = S.notBlank(urlContext); @@ -190,6 +190,7 @@ private void parseOne(String content) { String key = entry.getKey(); Scenario scenario = entry.getValue(); scenario.name = key; + scenario.source = fileName; if (hasDefaultUrlContext) { if (S.isBlank(scenario.urlContext)) { scenario.urlContext = this.urlContext; diff --git a/src/main/java/act/test/util/YamlLoader.java b/src/main/java/act/test/util/YamlLoader.java index 8d16acb9a..9e1027c23 100644 --- a/src/main/java/act/test/util/YamlLoader.java +++ b/src/main/java/act/test/util/YamlLoader.java @@ -274,7 +274,7 @@ protected String getResourceAsString(String name) { return null == url ? null : IO.read(url).toString(); } - private String patchResourceName(String name) { + protected String patchResourceName(String name) { return S.ensure(name).startWith(fixtureFolder); } diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html index aee947820..6865cbb93 100644 --- a/src/main/resources/rythm/~test.html +++ b/src/main/resources/rythm/~test.html @@ -5,6 +5,7 @@ + @render(head) @@ -66,10 +70,31 @@

                                                                                                                                                                      @scenario.name.toUpperCase() } @if(!scenario.status.pass()) { + @if(scenario.source) { + + +    + + Re-run scenario > + + + } else {    Re-run scenario > + } }

                                                                                                                                                                      @@ -103,5 +128,23 @@

                                                                                                                                                                      } actframework-@act.Act.VERSION.getVersion() + \ No newline at end of file From b91f0dcc90eeecfdd23a64d1ba2f2b5efcab211a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 21 Dec 2018 20:38:52 +1100 Subject: [PATCH 321/730] Bad behaviour when Error result returned on Accept excel mime type #1034 --- CHANGELOG.md | 1 + pom.xml | 2 +- src/main/java/act/app/ActionContext.java | 18 +++++++++--------- .../controller/RequestHandlerProxy.java | 6 +++++- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0d33f828..53981e004 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.17** +* Bad behaviour when Error result returned on Accept excel mime type #1034 * Test report page improvement #1032 * Provide a way to handle generic param type loading #1031 * UnexpectedException when submit a `Map` type parameter with value as `null` #1027 diff --git a/pom.xml b/pom.xml index 70ae38daf..f05b5f890 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ 1.9.0 1.9.0 1.8.0 - 1.3.0 + 1.3.1-SNAPSHOT 0.0.1 1.11.7 1.3.0 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 75042180a..4fbba4ac6 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -896,21 +896,20 @@ public ActionContext applyContentType(Result result) { if (!result.status().isError()) { return applyContentType(); } - if (req().isAjax()) { - H.Request req = req(); + return applyContentType(contentTypeForErrorResult(req())); + } + + public static H.Format contentTypeForErrorResult(H.Request req) { + if (req.isAjax()) { H.Format fmt = req.accept(); if (H.Format.UNKNOWN == fmt) { fmt = req.contentType(); } if (H.Format.JSON == fmt || H.Format.XML == fmt) { - applyContentType(fmt); - } else { - applyContentType(H.Format.HTML); + return fmt; } - } else { - applyContentType(H.Format.HTML); } - return this; + return (H.Format.HTML); } public ActionContext applyContentType() { @@ -956,12 +955,13 @@ public ActionContext applyContentSecurityPolicy() { return this; } - private void applyContentType(H.Format fmt) { + private ActionContext applyContentType(H.Format fmt) { if (null != fmt) { ActResponse resp = response; resp.initContentType(fmt.contentType()); resp.commitContentType(); } + return this; } private void applyGlobalCspSetting() { diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index e43d17590..ded54db2d 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -20,6 +20,7 @@ * #L% */ +import static act.app.ActionContext.contentTypeForErrorResult; import static org.osgl.http.H.Method.GET; import static org.osgl.http.H.Method.POST; @@ -324,7 +325,10 @@ private void onResult(Result result, ActionContext context) { H.Request req = context.req(); ActResponse resp = context.prepareRespForResultEvaluation(); if (result instanceof ErrorResult) { - resp.contentType(req.accept()); + // see https://github.com/actframework/actframework/issues/1034 + H.Format fmt = contentTypeForErrorResult(req); + req.accept(fmt); + resp.contentType(fmt); } result.apply(req, resp); } From ea691b879b07ce761f317da510f6348c188af56a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 22 Dec 2018 07:51:00 +1100 Subject: [PATCH 322/730] Morphia ObjectId not generate in api-book #1033 --- CHANGELOG.md | 1 + pom.xml | 2 +- src/main/java/act/apidoc/Endpoint.java | 74 +++++++++++-------- .../java/act/data/DataPropertyRepository.java | 9 ++- .../impl/ReflectedHandlerInvoker.java | 9 ++- src/main/java/act/test/Test.java | 2 +- .../java/act/util/EnhancedAdaptiveMap.java | 2 +- 7 files changed, 59 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53981e004..9bf539673 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.17** +* Morphia ObjectId not generate in api-book #1033 * Bad behaviour when Error result returned on Accept excel mime type #1034 * Test report page improvement #1032 * Provide a way to handle generic param type loading #1031 diff --git a/pom.xml b/pom.xml index f05b5f890..cc73e7f7a 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 2.10.1 1.11.3 3.10.0 - 1.18.3 + 1.19.0-SNAPSHOT 1.6.0 1.9.3-SNAPSHOT 1.9.0 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 32d6bb2bd..2ea980049 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -318,7 +318,7 @@ private void explore(RequestHandler handler) { ReflectedHandlerInvoker invoker = $.cast(proxy.actionHandler().invoker()); Class controllerClass = invoker.controllerClass(); Method method = invoker.method(); - returnType = method.getReturnType(); + returnType = Generics.getReturnType(method, controllerClass); PropertySpec pspec = method.getAnnotation(PropertySpec.class); if (null != pspec) { PropertySpec.MetaInfo propSpec = new PropertySpec.MetaInfo(); @@ -341,7 +341,6 @@ private void explore(RequestHandler handler) { if (controllerClass != method.getDeclaringClass()) { parent = new SimpleEndpointIdProvider(method.getDeclaringClass(), method); } - Type returnType = method.getGenericReturnType(); Map typeParamLookup = C.Map(); if (controllerClass.getGenericSuperclass() instanceof ParameterizedType) { typeParamLookup = Generics.buildTypeParamImplLookup(controllerClass); @@ -356,7 +355,7 @@ private void explore(RequestHandler handler) { } this.controllerClass = controllerClass; try { - returnSample = void.class == returnType ? null : generateSampleJson(BeanSpec.of(returnType, null, Act.injector(), typeParamLookup), typeParamLookup); + returnSample = void.class == returnType ? null : generateSampleJson(BeanSpec.of(returnType, null, Act.injector()), typeParamLookup, true); } catch (Exception e) { LOGGER.warn(e, "Error creating returnSample of endpoint for request handler [%s] for [%s %s]", handler, httpMethod, path); } @@ -391,7 +390,7 @@ private void exploreParamInfo(Method method, Map typeParamLookup) if (null != info.defaultValue) { sample = resolver.resolve(info.defaultValue, info.beanSpec.rawType()); } else { - sample = generateSampleData(info.beanSpec, typeParamLookup, new HashSet(), new ArrayList()); + sample = generateSampleData(info.beanSpec, typeParamLookup, new HashSet(), new ArrayList(), false); } if (H.Method.GET == this.httpMethod) { String query = generateSampleQuery(info.beanSpec.withoutName(), typeParamLookup, info.bindName, new HashSet(), C.newList()); @@ -463,12 +462,12 @@ private boolean isLoginUser(Annotation[] annos) { return false; } - private String generateSampleJson(BeanSpec spec, Map typeParamLookup) { + private String generateSampleJson(BeanSpec spec, Map typeParamLookup, boolean isReturn) { Class type = spec.rawType(); if (Result.class.isAssignableFrom(type) || void.class == type) { return null; } - Object sample = generateSampleData(spec, typeParamLookup, new HashSet(), new ArrayList()); + Object sample = generateSampleData(spec, typeParamLookup, new HashSet(), new ArrayList(), isReturn); if (null == sample) { return null; } @@ -485,7 +484,7 @@ private String generateSampleQuery(BeanSpec spec, Map typeParamLo nameChain.add(specName); } if ($.isSimpleType(type)) { - Object o = generateSampleData(spec, typeParamLookup, typeChain, nameChain); + Object o = generateSampleData(spec, typeParamLookup, typeChain, nameChain, false); if (null == o) { return ""; } @@ -496,12 +495,12 @@ private String generateSampleQuery(BeanSpec spec, Map typeParamLo Class elementType = type.getComponentType(); BeanSpec elementSpec = BeanSpec.of(elementType, Act.injector(), typeParamLookup); if ($.isSimpleType(elementType)) { - Object o = generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain); + Object o = generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain, false); if (null == o) { return ""; } return bindName + "=" + o - + "&" + bindName + "=" + generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain); + + "&" + bindName + "=" + generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain, false); } } else if (Collection.class.isAssignableFrom(type)) { // TODO handle datetime component type @@ -509,12 +508,12 @@ private String generateSampleQuery(BeanSpec spec, Map typeParamLo Type elementType = typeParams.isEmpty() ? Object.class : typeParams.get(0); BeanSpec elementSpec = BeanSpec.of(elementType, null, Act.injector(), typeParamLookup); if ($.isSimpleType(elementSpec.rawType())) { - Object o = generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain); + Object o = generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain, false); if (null == o) { return ""; } return bindName + "=" + o - + "&" + bindName + "=" + generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain); + + "&" + bindName + "=" + generateSampleData(elementSpec, typeParamLookup, typeChain, nameChain, false); } } else if (Map.class.isAssignableFrom(type)) { LOGGER.warn("Map not supported yet"); @@ -557,14 +556,15 @@ private static boolean isCollection(Type type) { return false; } - private Object generateSampleData(BeanSpec spec, Map typeParamLookup, Set typeChain, List nameChain) { - return generateSampleData(spec, typeParamLookup, typeChain, nameChain, fastJsonPropertyPreFilter); + private Object generateSampleData(BeanSpec spec, Map typeParamLookup, Set typeChain, List nameChain, boolean isReturn) { + return generateSampleData(spec, typeParamLookup, typeChain, nameChain, fastJsonPropertyPreFilter, isReturn); } public static Object generateSampleData( BeanSpec spec, Map typeParamLookup, Set typeChain, List nameChain, - FastJsonPropertyPreFilter fastJsonPropertyPreFilter + FastJsonPropertyPreFilter fastJsonPropertyPreFilter, + boolean isReturn ) { Type type = spec.type(); if (void.class == type) { @@ -618,8 +618,8 @@ public static Object generateSampleData( return Keyword.class == classType ? Keyword.of(mockValue) : mockValue; } else if (classType.isArray()) { Object sample = Array.newInstance(classType.getComponentType(), 2); - Array.set(sample, 0, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); - Array.set(sample, 1, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); + Array.set(sample, 0, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); + Array.set(sample, 1, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); return sample; } else if ($.isSimpleType(classType)) { if (Enum.class == classType) { @@ -658,11 +658,11 @@ public static Object generateSampleData( Type keyType = typeParams.get(0); Type valType = typeParams.get(1); map.put( - generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter), - generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); + generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn), + generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); map.put( - generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter), - generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); + generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn), + generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); } } else if (Iterable.class.isAssignableFrom(classType)) { Collection col = $.cast(Act.getInstance(classType)); @@ -674,8 +674,8 @@ public static Object generateSampleData( col.add(S.random()); } else { Type componentType = typeParams.get(0); - col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); - col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter)); + col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); + col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); } return col; } @@ -694,7 +694,7 @@ public static Object generateSampleData( Method[] ma = classType.getMethods(); for (Method m : ma) { if (!Modifier.isStatic(m.getModifiers()) && m.getName().startsWith("get") && m.getReturnType() != void.class) { - if (shouldWaive(m)) { + if (shouldWaive(m, classType)) { continue; } Class propertyClass = m.getReturnType(); @@ -713,7 +713,7 @@ public static Object generateSampleData( if (null == emailGetter && isEmail(propertySpec)) { emailGetter = m; } else { - val = generateSampleData(propertySpec, typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter); + val = generateSampleData(propertySpec, typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); if (null != val) { Class valType = val.getClass(); if (!propertyClass.isAssignableFrom(valType)) { @@ -741,8 +741,24 @@ public static Object generateSampleData( if (Modifier.isStatic(field.getModifiers())) { continue; } - if (ParamValueLoaderService.shouldWaive(field)) { - continue; + if (!isReturn) { + if (ParamValueLoaderService.shouldWaive(field)) { + continue; + } + } else { + // for return type we shouldn't waive NoBind fields + int modifiers = field.getModifiers(); + if (Modifier.isTransient(modifiers) || Modifier.isStatic(modifiers)) { + continue; + } + String fieldName = field.getName(); + Class entityType = field.getDeclaringClass(); + boolean shouldWaive = Object.class.equals(entityType) + || Class.class.equals(entityType) + || OsglConfig.globalMappingFilter_shouldIgnore(fieldName); + if (shouldWaive) { + continue; + } } Class fieldClass = field.getType(); Object val = null; @@ -761,7 +777,7 @@ public static Object generateSampleData( if (null == emailField && isEmail(fieldSpec)) { emailField = field; } else { - val = generateSampleData(fieldSpec, typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter); + val = generateSampleData(fieldSpec, typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); if (null == val) { continue; } @@ -809,13 +825,13 @@ private static StringValueResolver stringValueResolver(Class ty } // see ParamValueLoaderService.shouldWaive(Field) - private static boolean shouldWaive(Method getter) { + private static boolean shouldWaive(Method getter, Class implementClass) { int modifiers = getter.getModifiers(); if (Modifier.isTransient(modifiers) || Modifier.isStatic(modifiers)) { return true; } String fieldName = getter.getName().substring(3); - Class entityType = getter.getReturnType(); + Class entityType = Generics.getReturnType(getter, implementClass); return ParamValueLoaderService.noBind(entityType) || getter.isAnnotationPresent(NoBind.class) || getter.isAnnotationPresent(Stateless.class) diff --git a/src/main/java/act/data/DataPropertyRepository.java b/src/main/java/act/data/DataPropertyRepository.java index 3ff4b70c1..6a962c4f5 100644 --- a/src/main/java/act/data/DataPropertyRepository.java +++ b/src/main/java/act/data/DataPropertyRepository.java @@ -29,6 +29,7 @@ import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.C; +import org.osgl.util.Generics; import org.rythmengine.utils.S; import java.lang.reflect.*; @@ -97,7 +98,7 @@ private List buildPropertyList(Class c) { String context = ""; List retLst = new ArrayList<>(); for (Method m: ma) { - buildPropertyPath(context, m, retLst); + buildPropertyPath(context, m, c, retLst); } Field[] fa = c.getFields(); for (Field f: fa) { @@ -106,7 +107,7 @@ private List buildPropertyList(Class c) { return retLst; } - private void buildPropertyPath(String context, Method m, List repo) { + private void buildPropertyPath(String context, Method m, Class c, List repo) { if (m.getParameterTypes().length > 0) { return; } @@ -123,8 +124,8 @@ private void buildPropertyPath(String context, Method m, List repo) { if (S.isEmpty(propName)) { return; } - Class c = m.getReturnType(); - buildPropertyPath(c, m.getGenericReturnType(), context, propName, repo); + Class returnType = Generics.getReturnType(m, c); + buildPropertyPath(returnType, m.getGenericReturnType(), context, propName, repo); } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 6bc33f5e0..59c98fee0 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -165,6 +165,7 @@ public void visit(H.Format format) throws $.Break { private String xmlRootTag; private List dtoPatches = new ArrayList<>(); private boolean hasDtoPatches; + private Class returnType; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -183,7 +184,8 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { } catch (NoSuchMethodException e) { throw E.unexpected(e); } - this.returnString = method.getReturnType() == String.class; + this.returnType = Generics.getReturnType(method, controllerClass); + this.returnString = this.returnType == String.class; Integer priority = handler.priority(); if (null != priority) { this.order = priority; @@ -193,8 +195,8 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { } final boolean isBuiltIn = controllerClass.getName().startsWith("act."); if (handlerMetaInfo.hasReturn() && !isBuiltIn) { - this.returnSimpleType = this.returnString || $.isSimpleType(method.getReturnType()); - this.returnIterable = !this.returnSimpleType && (handlerMetaInfo.isReturnArray() || Iterable.class.isAssignableFrom(method.getReturnType())); + this.returnSimpleType = this.returnString || $.isSimpleType(returnType); + this.returnIterable = !this.returnSimpleType && (handlerMetaInfo.isReturnArray() || Iterable.class.isAssignableFrom(returnType)); if (this.returnIterable) { if (handlerMetaInfo.isReturnArray()) { this.returnIterableComponentIsSimpleType = $.isSimpleType(method.getReturnType().getComponentType()); @@ -1159,7 +1161,6 @@ public boolean hasAnnotation(Class annoType) { } private boolean shouldSuppressJsonDateFormat() { - Class returnType = method.getReturnType(); List fields = $.fieldsOf(returnType); for (Field field : fields) { JSONField jsonField = field.getAnnotation(JSONField.class); diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 68338bea3..fabb73702 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -322,7 +322,7 @@ private void printFooter() { private Object generateSampleData_(Class modelType) { BeanSpec spec = BeanSpec.of(modelType, Act.injector()); - return Endpoint.generateSampleData(spec, C.Map(), new HashSet(), new ArrayList(), null); + return Endpoint.generateSampleData(spec, C.Map(), new HashSet(), new ArrayList(), null, false); } public static String constant(String name) { diff --git a/src/main/java/act/util/EnhancedAdaptiveMap.java b/src/main/java/act/util/EnhancedAdaptiveMap.java index 74de32356..e6e260594 100644 --- a/src/main/java/act/util/EnhancedAdaptiveMap.java +++ b/src/main/java/act/util/EnhancedAdaptiveMap.java @@ -364,7 +364,7 @@ private void discoverProperties(Class clazz) { continue; } } - final Class returnClass = m.getReturnType(); + final Class returnClass = Generics.getReturnType(m, clazz); Type returnType = m.getGenericReturnType(); Class paramClass = null; Type paramType = null; From 09f4978a2d3716910b0ccd92617fb444421f9c3c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 22 Dec 2018 13:30:30 +1100 Subject: [PATCH 323/730] Support static apibook generation #893; bump version to 1.9 --- CHANGELOG.md | 3 +- pom.xml | 2 +- src/main/java/act/apidoc/ApiManager.java | 57 ++++++++++++++++++--- src/main/java/act/apidoc/Endpoint.java | 51 ++++++++++--------- src/main/java/act/app/App.java | 65 +++++++++++++++++++----- src/main/java/act/conf/AppConfig.java | 10 +++- 6 files changed, 142 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bf539673..f2bf4c0ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log -**1.8.17** +**1.9.0** +* Support static apibook generation #893 * Morphia ObjectId not generate in api-book #1033 * Bad behaviour when Error result returned on Accept excel mime type #1034 * Test report page improvement #1032 diff --git a/pom.xml b/pom.xml index cc73e7f7a..9e9625bb5 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.17-SNAPSHOT + 1.9.0-SNAPSHOT ACT Framework The ACT full stack MVC framework diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index 0ca6efe5a..3d377e047 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -35,6 +35,8 @@ import act.handler.builtin.controller.RequestHandlerProxy; import act.route.RouteSource; import act.route.Router; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.Node; @@ -43,11 +45,14 @@ import com.github.javaparser.ast.comments.JavadocComment; import com.github.javaparser.ast.expr.AnnotationExpr; import org.osgl.$; +import org.osgl.Lang; +import org.osgl.exception.NotAppliedException; import org.osgl.http.H; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.*; +import java.io.File; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -56,6 +61,8 @@ */ public class ApiManager extends AppServiceBase { + private static final String FILENAME = ".act.api-book"; + static final Logger LOGGER = LogManager.get(ApiManager.class); /** @@ -65,6 +72,8 @@ public class ApiManager extends AppServiceBase { SortedMap> moduleLookup = new TreeMap<>(); + private transient boolean enabled; + private static final AtomicBoolean IN_PROGRESS = new AtomicBoolean(false); public static boolean inProgress() { @@ -73,7 +82,8 @@ public static boolean inProgress() { public ApiManager(final App app) { super(app); - if (!app.config().apiDocEnabled()) { + this.enabled = app.config().apiDocEnabled(); + if (!this.enabled) { return; } app.jobManager().post(SysEventId.POST_START, "compile-api-book", new Runnable() { @@ -87,12 +97,13 @@ public void run() { } } }); - app.router().addMapping(H.Method.GET, "/~/apibook/endpoints", new GetEndpointsHandler(this)); - app.router().addMapping(H.Method.GET, "/~/apibook/modules", new GetModulesHandler(this)); + Router router = app.isDev() ? app.router() : app.sysRouter(); + router.addMapping(H.Method.GET, "/~/apibook/endpoints", new GetEndpointsHandler(this)); + router.addMapping(H.Method.GET, "/~/apibook/modules", new GetModulesHandler(this)); ResourceGetter apidocHandler = new ResourceGetter("asset/~act/apibook/index.html"); - app.router().addMapping(H.Method.GET, "/~/api", apidocHandler); - app.router().addMapping(H.Method.GET, "/~/apibook", apidocHandler); - app.router().addMapping(H.Method.GET, "/~/apidoc", apidocHandler); + router.addMapping(H.Method.GET, "/~/api", apidocHandler); + router.addMapping(H.Method.GET, "/~/apibook", apidocHandler); + router.addMapping(H.Method.GET, "/~/apidoc", apidocHandler); } @Override @@ -103,6 +114,16 @@ protected void releaseResources() { public void load(App app) { LOGGER.info("start compiling API book"); + if (app.isProd()) { + try { + deserialize(); + } catch (Exception e) { + warn(e, "Error deserialize api-book"); + } + if (!endpoints.isEmpty()) { + return; + } + } Router router = app.router(); AppConfig config = app.config(); Set controllerClasses = new HashSet<>(); @@ -118,12 +139,36 @@ public void load(App app) { exploreDescriptions(controllerClasses); } buildModuleLookup(); + serialize(); } finally { ctx.destroy(); } LOGGER.info("API book compiled"); } + private void serialize() { + File file = new File(FILENAME); + IO.write(JSON.toJSONString(moduleLookup)).to(file); + } + + private void deserialize() { + File file = new File(FILENAME); + if (!file.exists() || !file.canRead()) { + return; + } + JSONObject jsonObject = JSON.parseObject(IO.readContentAsString(file)); + $.map(jsonObject).instanceFactory(new Lang.Function() { + @Override + public Object apply(Class aClass) throws NotAppliedException, Lang.Break { + return app().getInstance(aClass); + } + }).targetGenericType(new TypeReference>>() { + }).to(moduleLookup); + for (List list : moduleLookup.values()) { + endpoints.addAll(list); + } + } + private void buildModuleLookup() { for (Endpoint endpoint : endpoints) { String module = endpoint.getModule(); diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 2ea980049..d438326ab 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -68,12 +68,15 @@ public class Endpoint implements Comparable, EndpointIdProvider { private static BeanSpecInterpreter beanSpecInterpretor = new BeanSpecInterpreter(); public static class ParamInfo { - private String bindName; - private BeanSpec beanSpec; - private String description; - private String defaultValue; - private boolean required; - private List options; + public String bindName; + public BeanSpec beanSpec; + public String type; + public String description; + public String defaultValue; + public boolean required; + public List options; + + private ParamInfo() {} private ParamInfo(String bindName, BeanSpec beanSpec, String description) { this.bindName = bindName; @@ -89,7 +92,7 @@ public String getName() { } public String getType() { - return beanSpecInterpretor.interpret(beanSpec); + return null == beanSpec ? type : beanSpecInterpretor.interpret(beanSpec); } public String getDescription() { @@ -152,46 +155,46 @@ public enum Scheme { /** * unique identify an endpoint in an application. */ - private String id; + public String id; - private EndpointIdProvider parent; + public EndpointIdProvider parent; /** * The scheme used to access the endpoint */ - private Scheme scheme = Scheme.HTTP; + public Scheme scheme = Scheme.HTTP; - private int port; + public int port; /** * The HTTP method */ - private H.Method httpMethod; + public H.Method httpMethod; /** * The URL path */ - private String path; + public String path; /** * The handler. * * In most case should be `pkg.Class.method` */ - private String handler; + public String handler; FastJsonPropertyPreFilter fastJsonPropertyPreFilter; /** * The description */ - private String description; + public String description; - private String module; + public String module; - private Class returnType; + private transient Class returnType; - private String returnSample; + public String returnSample; /** * Param list. @@ -199,12 +202,14 @@ public enum Scheme { * Only available when handler is driven by * {@link act.handler.builtin.controller.impl.ReflectedHandlerInvoker} */ - private List params = new ArrayList<>(); + public List params = new ArrayList<>(); + + public String sampleJsonPost; + public String sampleQuery; + public Class controllerClass; + public transient SampleDataProviderManager sampleDataProviderManager; - private String sampleJsonPost; - private String sampleQuery; - private Class controllerClass; - private transient SampleDataProviderManager sampleDataProviderManager; + private Endpoint() {} Endpoint(int port, H.Method httpMethod, String path, RequestHandler handler) { AppConfig conf = Act.appConfig(); diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 066ef4955..5f4521bd6 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -73,7 +73,6 @@ import act.route.*; import act.session.CookieSessionMapper; import act.session.SessionManager; -import act.test.Test; import act.util.*; import act.validation.Password; import act.view.ActErrorResult; @@ -411,6 +410,10 @@ public Router router() { return router; } + public Router sysRouter() { + return router(AppConfig.PORT_SYS); + } + public Router router(String name) { if (S.blank(name)) { return router(); @@ -430,6 +433,37 @@ public Router router(NamedPort port) { return moreRouters.get(port); } + private Iterable allRouters() { + return new Iterable() { + @Override + public Iterator iterator() { + return new Iterator() { + + private Iterator moreRoutersIterator; + + @Override + public boolean hasNext() { + return null == moreRoutersIterator || moreRoutersIterator.hasNext(); + } + + @Override + public Router next() { + if (null == moreRoutersIterator) { + moreRoutersIterator = moreRouters.values().iterator(); + return router; + } + return moreRoutersIterator.next(); + } + + @Override + public void remove() { + E.unsupport(); + } + }; + } + }; + } + public AppCrypto crypto() { return crypto; } @@ -689,7 +723,7 @@ public synchronized void refresh() { emit(ROUTER_INITIALIZED); loadRoutes(); emit(ROUTER_LOADED); - initApiManager(this); + initApiManager(); initSampleDataProviderManager(); initHttpClientService(); initCaptchaPluginManager(); @@ -1132,6 +1166,9 @@ public Set createSet() { * @return the class as described above */ public Class classForName(String className) { + if (className.contains("/")) { + className = className.replace('/', '.'); + } try { return $.classForName(className, classLoader()); } catch (VerifyError error) { @@ -1560,10 +1597,7 @@ private void shutdownJobManager() { } } - private void initApiManager(App app) { - if (Act.isProd() || Test.shallRunAutomatedTest(app)) { - return; - } + private void initApiManager() { apiManager = new ApiManager(this); } @@ -1683,17 +1717,22 @@ private void loadRoutes() { } private void loadBuiltInRoutes() { - router().addMapping(GET, "/asset/", new ResourceGetter("asset"), RouteSource.BUILD_IN); - router().addMapping(GET, "/~/asset/", new ResourceGetter("asset/~act"), RouteSource.BUILD_IN); - router().addMapping(GET, "/webjars/", new ResourceGetter("META-INF/resources/webjars"), RouteSource.BUILD_IN); - router().addContext("act.", "/~"); + ResourceGetter actAsset = new ResourceGetter("asset/~act"); + ResourceGetter webjars = new ResourceGetter("META-INF/resources/webjars"); + ResourceGetter asset = new ResourceGetter("asset"); + SecureTicketCodec secureTicketCodec = config.secureTicketCodec(); + SecureTicketHandler secureTicketHandler = new SecureTicketHandler(secureTicketCodec); + for (Router router : allRouters()) { + router.addMapping(GET, "/asset/", asset, RouteSource.BUILD_IN); + router.addMapping(GET, "/~/asset/", actAsset, RouteSource.BUILD_IN); + router.addMapping(GET, "/webjars/", webjars, RouteSource.BUILD_IN); + router.addContext("act.", "/~"); + router.addMapping(GET, "/~/ticket", secureTicketHandler, RouteSource.BUILD_IN); + } if (config.cliOverHttp()) { Router router = router(AppConfig.PORT_CLI_OVER_HTTP); router.addMapping(GET, "/asset/", new ResourceGetter("asset"), RouteSource.BUILD_IN); } - SecureTicketCodec secureTicketCodec = config.secureTicketCodec(); - SecureTicketHandler secureTicketHandler = new SecureTicketHandler(secureTicketCodec); - router().addMapping(GET, "/~/ticket", secureTicketHandler, RouteSource.BUILD_IN); } private void initClassLoader() { diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 936c5fe15..d71cfd907 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -50,8 +50,7 @@ import act.ws.DefaultSecureTicketCodec; import act.ws.SecureTicketCodec; import act.ws.UsernameSecureTicketCodec; -import org.osgl.$; -import org.osgl.OsglConfig; +import org.osgl.*; import org.osgl.cache.CacheService; import org.osgl.cache.CacheServiceProvider; import org.osgl.exception.ConfigurationException; @@ -59,6 +58,7 @@ import org.osgl.http.H; import org.osgl.mvc.MvcConfig; import org.osgl.util.*; +import org.osgl.util.converter.TypeConverterRegistry; import org.osgl.web.util.UserAgent; import org.rythmengine.utils.Time; import osgl.version.Version; @@ -98,6 +98,12 @@ public Object apply() throws NotAppliedException, $.Break { return null; } }); + TypeConverterRegistry.INSTANCE.register(new Lang.TypeConverter() { + @Override + public Class convert(String s) { + return Act.appClassForName(s); + } + }); MvcConfig.errorPageRenderer(new ActErrorPageRender()); MvcConfig.beforeCommitResultHandler(ResultEvent.BEFORE_COMMIT_HANDLER); MvcConfig.afterCommitResultHandler(ResultEvent.AFTER_COMMIT_HANDLER); From d226e45c13e9624e1eb20cadbd8a500c60bcf88f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 22 Dec 2018 13:42:37 +1100 Subject: [PATCH 324/730] make ~/info, ~/version and ~/pid endpoint be able to access on sys port --- src/main/java/act/Info.java | 4 ++++ src/main/java/act/app/App.java | 2 +- src/main/java/act/conf/ConfAdmin.java | 3 +++ src/main/java/act/route/Router.java | 2 ++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/act/Info.java b/src/main/java/act/Info.java index 0ee1000d2..c1083f1ef 100644 --- a/src/main/java/act/Info.java +++ b/src/main/java/act/Info.java @@ -26,8 +26,11 @@ import act.app.ActionContext; import act.app.App; import act.cli.Command; +import act.conf.AppConfig; import act.controller.ExpressController; +import act.controller.annotation.Port; import act.inject.param.NoBind; +import act.route.Router; import act.sys.Env; import act.util.Banner; import act.util.JsonView; @@ -45,6 +48,7 @@ @Singleton @SuppressWarnings("unused") @ExpressController +@Port({Router.PORT_DEFAULT, AppConfig.PORT_SYS}) public class Info { // a unit of information data diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 5f4521bd6..3c234e431 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -415,7 +415,7 @@ public Router sysRouter() { } public Router router(String name) { - if (S.blank(name)) { + if (S.blank(name) || "default".equalsIgnoreCase(name)) { return router(); } for (Map.Entry entry : moreRouters.entrySet()) { diff --git a/src/main/java/act/conf/ConfAdmin.java b/src/main/java/act/conf/ConfAdmin.java index c68f91b76..808317e86 100644 --- a/src/main/java/act/conf/ConfAdmin.java +++ b/src/main/java/act/conf/ConfAdmin.java @@ -23,7 +23,9 @@ import act.Act; import act.cli.*; import act.controller.ExpressController; +import act.controller.annotation.Port; import act.controller.annotation.UrlContext; +import act.route.Router; import com.alibaba.fastjson.JSONObject; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.C; @@ -36,6 +38,7 @@ @UrlContext("conf") @Singleton @ExpressController +@Port({Router.PORT_DEFAULT, AppConfig.PORT_SYS}) public class ConfAdmin { @Inject diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index d82c89e39..e6cd55ea2 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -55,6 +55,8 @@ public class Router extends AppHolderBase { + public static final String PORT_DEFAULT = "default"; + /** * A visitor can be passed to the router to traverse * the routes From 4d2149de8ae09aad306f7405ff978325f41f4656 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 23 Dec 2018 17:36:17 +1100 Subject: [PATCH 325/730] UnexpectedException when submit a `Map` type parameter with value as `null` #1027 --- CHANGELOG.md | 3 ++- pom.xml | 2 +- .../app/data/StringValueResolverManager.java | 24 +++++++++++++++---- src/main/java/act/inject/param/MapLoader.java | 4 +++- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2bf4c0ce..891223c37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log -**1.9.0** +**1.8.17** +* UnexpectedException when submit a `Map` type parameter with value as `null` #1027 * Support static apibook generation #893 * Morphia ObjectId not generate in api-book #1033 * Bad behaviour when Error result returned on Accept excel mime type #1034 diff --git a/pom.xml b/pom.xml index 9e9625bb5..cc73e7f7a 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.9.0-SNAPSHOT + 1.8.17-SNAPSHOT ACT Framework The ACT full stack MVC framework diff --git a/src/main/java/act/app/data/StringValueResolverManager.java b/src/main/java/act/app/data/StringValueResolverManager.java index af48b7afa..006a38b6d 100644 --- a/src/main/java/act/app/data/StringValueResolverManager.java +++ b/src/main/java/act/app/data/StringValueResolverManager.java @@ -31,10 +31,8 @@ import org.osgl.util.S; import org.osgl.util.StringValueResolver; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.lang.reflect.Array; +import java.util.*; public class StringValueResolverManager extends AppServiceBase { @@ -76,6 +74,24 @@ public T resolve(String value) { }; } + public StringValueResolver arrayResolver(final Class targetType, final char separator) { + final Class componentType = targetType.getComponentType(); + E.unexpectedIf(null == componentType, "specified target type is not array type: " + targetType); + final StringValueResolver elementResolver = resolver(componentType); + return new StringValueResolver(targetType) { + @Override + public T resolve(String value) { + List list = new ArrayList(); + List parts = S.fastSplit(value, String.valueOf(separator)); + for (String part : parts) { + list.add(elementResolver.resolve(part)); + } + T array = (T) Array.newInstance(componentType, list.size()); + return (T)list.toArray((Object[])array); + } + }; + } + public StringValueResolver collectionResolver(final Class targetType, final Class elementType, final String separator) { final StringValueResolver elementResolver = resolver(elementType); return new StringValueResolver(targetType) { diff --git a/src/main/java/act/inject/param/MapLoader.java b/src/main/java/act/inject/param/MapLoader.java index 510080f5d..79ab30064 100644 --- a/src/main/java/act/inject/param/MapLoader.java +++ b/src/main/java/act/inject/param/MapLoader.java @@ -70,7 +70,9 @@ class MapLoader extends ParamValueLoader.JsonBodySupported { if (!this.valTypeIsObject) { if (Collection.class.isAssignableFrom(valClass)) { Class colClass = $.cast(valClass); - this.valueResolver = resolverManager.collectionResolver(colClass, (Class)valSpec.typeParams().get(0), ','); + this.valueResolver = resolverManager.collectionResolver(colClass, (Class) valSpec.typeParams().get(0), ','); + } else if (valClass.isArray()) { + this.valueResolver = resolverManager.arrayResolver(valClass, ','); } else { this.valueResolver = resolverManager.resolver(valClass, BeanSpec.of(valType, injector)); } From 48ae5c09a6df405d0f94b1232828059045e37c26 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 23 Dec 2018 21:49:13 +1100 Subject: [PATCH 326/730] Make AuditHelper support Morphia; Endpoint deserialization issues --- src/main/java/act/apidoc/Endpoint.java | 4 +-- src/main/java/act/app/ActionContext.java | 4 +-- src/main/java/act/db/util/AuditHelper.java | 30 +++++++++++++++++++ .../java/act/inject/param/JsonDtoPatch.java | 2 +- .../src/main/resources/conf/app.properties | 2 +- 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index d438326ab..ea210deb1 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -69,7 +69,7 @@ public class Endpoint implements Comparable, EndpointIdProvider { public static class ParamInfo { public String bindName; - public BeanSpec beanSpec; + public transient BeanSpec beanSpec; public String type; public String description; public String defaultValue; @@ -157,7 +157,7 @@ public enum Scheme { */ public String id; - public EndpointIdProvider parent; + public transient EndpointIdProvider parent; /** * The scheme used to access the endpoint diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 4fbba4ac6..bfc7035d7 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -900,8 +900,8 @@ public ActionContext applyContentType(Result result) { } public static H.Format contentTypeForErrorResult(H.Request req) { + H.Format fmt = req.accept(); if (req.isAjax()) { - H.Format fmt = req.accept(); if (H.Format.UNKNOWN == fmt) { fmt = req.contentType(); } @@ -909,7 +909,7 @@ public static H.Format contentTypeForErrorResult(H.Request req) { return fmt; } } - return (H.Format.HTML); + return fmt.isText() ? fmt : H.Format.HTML; } public ActionContext applyContentType() { diff --git a/src/main/java/act/db/util/AuditHelper.java b/src/main/java/act/db/util/AuditHelper.java index 45ffd6e2d..643aac5e5 100644 --- a/src/main/java/act/db/util/AuditHelper.java +++ b/src/main/java/act/db/util/AuditHelper.java @@ -39,8 +39,10 @@ @Stateless public class AuditHelper { private Map createdAtLookup = new HashMap<>(); + private Map createdAtCheckLookup = new HashMap<>(); private Map lastModifiedAtLookup = new HashMap<>(); private Map createdByLookup = new HashMap<>(); + private Map createdByCheckLookup = new HashMap<>(); private Map lastModifiedByLookup = new HashMap<>(); public AuditHelper() { @@ -73,6 +75,18 @@ public void preUpdate(Object entity) { apply(lastModifiedByLookup.get(entityType), entity); } + protected boolean hasCreatedAtValue(Object entity) { + Class entityType = entity.getClass(); + $.Predicate predicate = createdAtCheckLookup.get(entityType); + return null == predicate ? false : predicate.test(entity); + } + + protected boolean hasCreatedByValue(Object entity) { + Class entityType = entity.getClass(); + $.Predicate predicate = createdByCheckLookup.get(entityType); + return null == predicate ? false : predicate.test(entity); + } + private void buildLookups() { final App app = Act.app(); MasterEntityMetaInfoRepo masterRepo = app.entityMetaInfoRepo(); @@ -92,6 +106,7 @@ private void buildLookups() { field.setAccessible(true); final TimestampFieldVisitor timestampFieldVisitor = new TimestampFieldVisitor(field, dbManager); createdAtLookup.put(entityClass, timestampFieldVisitor); + createdAtCheckLookup.put(entityClass, new FieldChecker(field)); final ClassNode node = classInfoRepository.node(entityClass.getName()); node.visitSubTree(new $.Visitor() { @Override @@ -116,6 +131,7 @@ public void visit(ClassNode classNode) throws $.Break { field.setAccessible(true); final PricipalFieldVisitor pricipalFieldVisitor = new PricipalFieldVisitor(field); createdByLookup.put(entityClass, pricipalFieldVisitor); + createdByCheckLookup.put(entityClass, new FieldChecker(field)); final ClassNode node = classInfoRepository.node(entityClass.getName()); node.visitSubTree(new $.Visitor() { @Override @@ -190,6 +206,20 @@ private static void apply($.Visitor visitor, Object entity) { } } + private static class FieldChecker extends $.Predicate { + + final Field field; + + FieldChecker(Field field) { + this.field = field; + } + + @Override + public boolean test(Object o) { + return null != $.getFieldValue(o, field); + } + } + private static class TimestampFieldVisitor extends $.Visitor { final TimestampGenerator tsGen; final Field field; diff --git a/src/main/java/act/inject/param/JsonDtoPatch.java b/src/main/java/act/inject/param/JsonDtoPatch.java index b321155ba..06308188e 100644 --- a/src/main/java/act/inject/param/JsonDtoPatch.java +++ b/src/main/java/act/inject/param/JsonDtoPatch.java @@ -50,7 +50,7 @@ private JsonDtoPatch(String name, BeanSpec spec) { if (null == loader) { for (BeanSpec fieldSpec : spec.nonStaticFields()) { Class fieldType = fieldSpec.rawType(); - if (fieldSpec.isTransient() || fieldSpec.hasAnnotation(Transient.class) || $.isImmutable(fieldType)) { + if (fieldSpec.isTransient() || fieldSpec.hasAnnotation(Transient.class)) { continue; } if (Collection.class.isAssignableFrom(fieldType) || Map.class.isAssignableFrom(fieldType)) { diff --git a/testapps/GHIssues/src/main/resources/conf/app.properties b/testapps/GHIssues/src/main/resources/conf/app.properties index 47a3cf402..374ebade4 100644 --- a/testapps/GHIssues/src/main/resources/conf/app.properties +++ b/testapps/GHIssues/src/main/resources/conf/app.properties @@ -1,4 +1,4 @@ -api_doc=false +api_doc=true globalReturnValueAdvice=ghissues.Gh835$GlobalAdvice globalValidateViolateAdvice=ghissues.Gh922$GlobalAdvice ############################################## From 67356e7ddec6776d19083d287f4bbec30c9ab896 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 23 Dec 2018 22:06:13 +1100 Subject: [PATCH 327/730] update legacy-testapp dependency --- legacy-testapp/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index f6fd9e5f7..8dc9336e9 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -75,7 +75,7 @@ UTF-8 1.8.17-SNAPSHOT [0.13.0, 2.0.0) - 1.6.5 + 1.6.6-SNAPSHOT testapp.TestApp From 50adc4a2a8698fa80a45e9a10613fc4d3f16d743 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 23 Dec 2018 22:18:47 +1100 Subject: [PATCH 328/730] update README and VERSION_MATRIX --- README.md | 10 +++++----- VERSION_MATRIX.md | 40 ++++++++++++++++++++-------------------- pom.xml | 6 +++--- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index eb63fe2e1..ac7e5fca3 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.16.1 + 1.8.17.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.16.1 + -DarchetypeVersion=1.8.17.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.16.1 + -DarchetypeVersion=1.8.17.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.16.1 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.17.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.16.1 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.17.0 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 313ee12bc..36e1eb68a 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,25 +1,25 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8 | 1.8.16 | -| --- | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.2 | 1.5.3 | -| beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.5 | 1.4.6 | -| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.3 | 1.5.6 | -| ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.3 | 1.7.5 | -| ebean(java8) | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.3 | 1.7.5 | -| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.5 | -| excel | 1.3.x | 1.4.x | 1.4.3 | 1.5.0 | 1.5.0 | -| freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.6 | 1.3.6 | -| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.4 | -| jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.5 | 1.0.5 | -| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.2 | 1.5.4 | -| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.2 | 1.6.5 | -| mustache(java8) | 1.3.x | 1.4.0 | 1.4.2 | 1.4.5 | 1.4.5 | -| social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.5 | 0.12.5 | -| sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.3 | 1.4.4 | -| storage(java8) | 0.12.x | 0.13.0 | 0.13.2 | 0.13.5 | 0.13.5 | -| thymeleaf | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | -| velocity | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | 1.3.5 | +| act | 1.8.7 | 1.8.8 | 1.8.16 | 1.8.17 | +| --- | ----: | ----: | ----: | ----: | +| aaa | 1.4.2 | 1.5.2 | 1.5.3 | 1.5.3 | +| beetl | 1.4.1 | 1.4.5 | 1.4.6 | 1.4.6 | +| beetlsql | 1.4.5 | 1.5.3 | 1.5.6 | 1.5.6 | +| ebean-java7 | 1.5.3 | 1.7.3 | 1.7.5 | 1.7.5 | +| ebean(java8) | 1.6.2 | 1.7.3 | 1.7.5 | 1.7.5 | +| eclipselink(java8) | 1.2.3 | 1.5.2 | 1.5.5 | 1.5.5 | +| excel | 1.4.3 | 1.5.0 | 1.5.0 | 1.5.0 | +| freemarker | 1.3.2 | 1.3.6 | 1.3.6 | 1.3.6 | +| hibernate | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.4 | +| jax-rs(java8) | 1.0.2 | 1.0.5 | 1.0.5 | 1.0.5 | +| jpa-common | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.4 | +| morphia | 1.4.2 | 1.6.2 | 1.6.5 | 1.6.6 | +| mustache(java8) | 1.4.2 | 1.4.5 | 1.4.5 | 1.4.5 | +| social | 0.12.2 | 0.12.5 | 0.12.5 | 0.12.5 | +| sql-common | 1.3.3 | 1.4.3 | 1.4.4 | 1.4.4 | +| storage(java8) | 0.13.2 | 0.13.5 | 0.13.5 | 0.13.5 | +| thymeleaf | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | +| velocity | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | ## Note diff --git a/pom.xml b/pom.xml index cc73e7f7a..c469feb38 100644 --- a/pom.xml +++ b/pom.xml @@ -63,13 +63,13 @@ 2.10.1 1.11.3 3.10.0 - 1.19.0-SNAPSHOT + 1.19.0 1.6.0 - 1.9.3-SNAPSHOT + 1.9.3 1.9.0 1.9.0 1.8.0 - 1.3.1-SNAPSHOT + 1.3.1 0.0.1 1.11.7 1.3.0 From f528284a4450ffda2ccd0e1bdc75566d2a72b93c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 23 Dec 2018 22:20:00 +1100 Subject: [PATCH 329/730] [maven-release-plugin] prepare release act-1.8.17 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c469feb38..32c30b4c1 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.17-SNAPSHOT + 1.8.17 ACT Framework The ACT full stack MVC framework From 5b4de31232455780b3337df1d0cdf9c765bd91a4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 23 Dec 2018 22:20:17 +1100 Subject: [PATCH 330/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 32c30b4c1..73bc2c650 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.17 + 1.8.18-SNAPSHOT ACT Framework The ACT full stack MVC framework From 8480c8006f1f1b74a54c7fea487bcd74ce25acd0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 24 Dec 2018 20:09:01 +1100 Subject: [PATCH 331/730] update VERSION_MATRIX --- VERSION_MATRIX.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 36e1eb68a..141954811 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -7,12 +7,12 @@ | beetlsql | 1.4.5 | 1.5.3 | 1.5.6 | 1.5.6 | | ebean-java7 | 1.5.3 | 1.7.3 | 1.7.5 | 1.7.5 | | ebean(java8) | 1.6.2 | 1.7.3 | 1.7.5 | 1.7.5 | -| eclipselink(java8) | 1.2.3 | 1.5.2 | 1.5.5 | 1.5.5 | +| eclipselink(java8) | 1.2.3 | 1.5.2 | 1.5.5 | 1.5.6 | | excel | 1.4.3 | 1.5.0 | 1.5.0 | 1.5.0 | | freemarker | 1.3.2 | 1.3.6 | 1.3.6 | 1.3.6 | -| hibernate | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.4 | +| hibernate | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.5 | | jax-rs(java8) | 1.0.2 | 1.0.5 | 1.0.5 | 1.0.5 | -| jpa-common | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.4 | +| jpa-common | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.5 | | morphia | 1.4.2 | 1.6.2 | 1.6.5 | 1.6.6 | | mustache(java8) | 1.4.2 | 1.4.5 | 1.4.5 | 1.4.5 | | social | 0.12.2 | 0.12.5 | 0.12.5 | 0.12.5 | From 79ac48273a6de040ddfda427d1e19cb9ec924398 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 24 Dec 2018 21:23:48 +1100 Subject: [PATCH 332/730] update README --- CHANGELOG.md | 2 +- README.md | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 891223c37..518793e42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.17** +**1.8.17** 23/Dec/2018 * UnexpectedException when submit a `Map` type parameter with value as `null` #1027 * Support static apibook generation #893 * Morphia ObjectId not generate in api-book #1033 diff --git a/README.md b/README.md index ac7e5fca3..c3fc10e53 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.17.0 + 1.8.17.1 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.17.0 + -DarchetypeVersion=1.8.17.1 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.17.0 + -DarchetypeVersion=1.8.17.1 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.17.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.17.1 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.17.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.17.1 ``` For RESTful service project From 115f4506b0a50fffb24a0e0d3ccfb3dc15883793 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 21 Jan 2019 22:38:02 +1100 Subject: [PATCH 333/730] fix mvn package will throw IllegalStateException #1039 --- CHANGELOG.md | 3 ++ src/main/java/act/app/AppClassLoader.java | 10 ++++- src/main/java/act/app/DevModeClassLoader.java | 37 +++++++++++++++++-- testapps/GHIssues/pom.xml | 4 +- .../src/main/resources/test/scenarios/937.yml | 10 +++++ 5 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/937.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 518793e42..d80da28b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # ActFramework Change Log +**1.8.18** +* mvn package will throw IllegalStateException #1039 + **1.8.17** 23/Dec/2018 * UnexpectedException when submit a `Map` type parameter with value as `null` #1027 * Support static apibook generation #893 diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index 0f851afb4..9d4bee83a 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -228,8 +228,16 @@ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundE } } + protected Set libClasses() { + return libClsCache.keySet(); + } + protected void scan() { - scanByteCode(libClsCache.keySet(), bytecodeLookup); + scanByteCode(libClasses(), bytecodeLookup); + } + + protected void scan(Set libClasses) { + scanByteCode(libClasses, bytecodeLookup); } /** diff --git a/src/main/java/act/app/DevModeClassLoader.java b/src/main/java/act/app/DevModeClassLoader.java index 53fc520bc..dd5d5db6b 100644 --- a/src/main/java/act/app/DevModeClassLoader.java +++ b/src/main/java/act/app/DevModeClassLoader.java @@ -132,9 +132,24 @@ protected void preloadClasses() { @Override protected void scan() { - super.scan(); compileSources(); - scanSources(); + Set sourcesToBeScanned = findSourcesToBeScanned(); + Set libClasses = libClasses(); + if (Act.profile().equalsIgnoreCase("test")) { + Set toBeRemoved = new HashSet<>(); + for (String s : libClasses) { + if (s.contains("$")) { + String s0 = S.cut(s).beforeFirst("$"); + if (sourcesToBeScanned.contains(s0)) { + toBeRemoved.add(s); + } + } + } + libClasses.removeAll(toBeRemoved); + } + libClasses.removeAll(sourcesToBeScanned); + scan(libClasses); + scanSources(sourcesToBeScanned); } @Override @@ -212,8 +227,8 @@ private void compileSources() { } } - private void scanSources() { - Timer timer = metric.startTimer("act:classload:scan:scanSources"); + private Set findSourcesToBeScanned() { + Timer timer = metric.startTimer("act:classload:scan:findScanSources"); try { logger.debug("start to scan sources..."); List scanners = app().scannerManager().sourceCodeScanners(); @@ -245,6 +260,20 @@ private void scanSources() { } } } + return classesNeedByteCodeScan; + } finally { + long ns = timer.ns(); + timer.stop(); + if (logger.isDebugEnabled()) { + logger.debug("it takes %sms to find %s sources to be scanned and their bytecodes", ns / (1000 * 1000), sources.size()); + } + } + } + + private void scanSources(Set classesNeedByteCodeScan) { + Timer timer = metric.startTimer("act:classload:scan:scanSources"); + try { + logger.debug("start to scan sources..."); if (classesNeedByteCodeScan.isEmpty()) { return; diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index e04e9ce5b..e660045fa 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.16.0 + 1.8.17.1 @@ -25,7 +25,7 @@ org.actframework act - 1.8.17-SNAPSHOT + 1.8.18-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/937.yml b/testapps/GHIssues/src/main/resources/test/scenarios/937.yml new file mode 100644 index 000000000..698c7447e --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/937.yml @@ -0,0 +1,10 @@ +Scenario(937): + description: "[937] Missing `Content-Type` header in response servicing static file request" + interactions: + - description: Test + request: + get: /906?n=100 + response: + headers: + Content-Type: + - contains: text/plain From 065a11862c4b2a48989d987722efea81e78a8c28 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 23 Jan 2019 22:18:55 +1100 Subject: [PATCH 334/730] act test failed in mvn could not see detail information #1040 --- CHANGELOG.md | 1 + src/main/java/act/test/Scenario.java | 10 ++++++++++ src/main/java/act/test/Test.java | 16 +++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d80da28b0..47910c5a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.18** +* act test failed in mvn could not see detail information #1040 * mvn package will throw IllegalStateException #1039 **1.8.17** 23/Dec/2018 diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 6b6d70b00..94a0b1d0f 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -400,6 +400,16 @@ private void start(ScenarioManager scenarioManager, RequestTemplateManager reque } boolean pass = (!reset || reset()) && run(); this.status = TestStatus.of(pass); + if (TestStatus.FAIL == this.status) { + for (Interaction interaction : this.interactions) { + if (interaction.status == TestStatus.FAIL) { + this.errorMessage = "Interaction[" + interaction.description + "] fail: " + interaction.errorMessage; + if (interaction.cause != null && !(interaction.cause instanceof ErrorMessage)) { + this.cause = interaction.cause; + } + } + } + } } public void clearSession() { diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index fabb73702..92ea4bf24 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -161,7 +161,7 @@ public void clearFixtures() { } catch (IllegalArgumentException e) { if (e.getMessage().contains("Cannot find out Dao for model type")) { // ignore - must be caused by MappedSuperClass - logger.debug(e, "error getting dao for %s", entityClass); + debug(e, "error getting dao for %s", entityClass); continue; } } @@ -282,6 +282,20 @@ public List run(App app, Keyword testId, boolean shutdownApp) { } } Collections.sort(list, new ScenarioComparator(scenarioManager, true)); + if (shutdownApp) { + for (Scenario scenario : list) { + if (scenario.status == TestStatus.FAIL) { + error("-----------------------------------------------------------"); + error("[%s] Failed", scenario.name); + if (S.notBlank(scenario.errorMessage)) { + error("error: " + scenario.errorMessage); + } + if (null != scenario.cause) { + error("cause: \n" + E.stackTrace(scenario.cause)); + } + } + } + } return list; } catch (Exception e) { exitCode = -1; From 63fd02b3867a2252f66abf1ff258a181b7e6d8a6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 23 Jan 2019 23:12:21 +1100 Subject: [PATCH 335/730] Allow keep searching route table even when a terminate node found #1041 --- CHANGELOG.md | 1 + src/main/java/act/route/Router.java | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47910c5a7..b5a4a8eb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.18** +* Allow keep searching route table even when a terminate node found #1041 * act test failed in mvn could not see detail information #1040 * mvn package will throw IllegalStateException #1039 diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index e6cd55ea2..2e32cd26a 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -719,13 +719,22 @@ public static H.Method[] supportedHttpMethods() { private Node search(Node rootNode, Iterator path, ActionContext context) { Node node = rootNode; + Node backup = null; + String backupPath = null; + List pathBackup = null; if (node.terminateRouteSearch() && !context.urlPath().isBuiltIn()) { S.Buffer sb = S.buffer(); + pathBackup = new ArrayList<>(); while (path.hasNext()) { - sb.append('/').append(path.next()); + String pathElement = path.next(); + pathBackup.add(pathElement); + sb.append('/').append(pathElement); } - context.param(ParamNames.PATH, sb.toString()); - return node; + backupPath = sb.toString(); + backup = node; + } + if (null != pathBackup) { + path = pathBackup.iterator(); } while (null != node && path.hasNext()) { String nodeName = path.next(); @@ -752,6 +761,10 @@ private Node search(Node rootNode, Iterator path, ActionContext context) } } } + if (null == node && null != backup) { + node = backup; + context.param(ParamNames.PATH, backupPath); + } return node; } From 46232a5d35d7655ab5bed0eaf06c0f74049b72b5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 23 Jan 2019 23:35:01 +1100 Subject: [PATCH 336/730] Allow load route configuration from `route.conf` file #1042 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 2 +- src/main/java/act/app/ProjectLayout.java | 37 ++++++++++++++----- .../act/route/RouteTableRouterBuilder.java | 1 + 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5a4a8eb4..b4434299e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.18** +* Allow load route configuration from `route.conf` file #1042 * Allow keep searching route table even when a terminate node found #1041 * act test failed in mvn could not see detail information #1040 * mvn package will throw IllegalStateException #1039 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 3c234e431..aafbb764b 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -116,7 +116,7 @@ public enum F { public static $.Predicate JAVA_SOURCE = endsWith(".java"); public static $.Predicate JAR_FILE = endsWith(".jar"); public static $.Predicate CONF_FILE = endsWith(".conf").or(endsWith(".properties").or(endsWith(".yaml").or(endsWith(".yml").or(endsWith(".xml"))))).and(contains("main/resources/test").negate()); - public static $.Predicate ROUTES_FILE = $.F.eq(RouteTableRouterBuilder.ROUTES_FILE); + public static $.Predicate ROUTES_FILE = $.F.eq(RouteTableRouterBuilder.ROUTES_FILE).or($.F.eq(RouteTableRouterBuilder.ROUTES_FILE2)); } private volatile String profile; diff --git a/src/main/java/act/app/ProjectLayout.java b/src/main/java/act/app/ProjectLayout.java index 7ca25992c..ee4e16898 100644 --- a/src/main/java/act/app/ProjectLayout.java +++ b/src/main/java/act/app/ProjectLayout.java @@ -24,6 +24,7 @@ import static act.app.RuntimeDirs.CLASSES; import static act.app.RuntimeDirs.CONF; import static act.route.RouteTableRouterBuilder.ROUTES_FILE; +import static act.route.RouteTableRouterBuilder.ROUTES_FILE2; import act.Act; import act.app.util.NamedPort; @@ -388,7 +389,7 @@ public File conf(File appBase) { @Override public Map> routeTables(File appBase) { Map> map = new HashMap<>(); - map.put(NamedPort.DEFAULT, routeTables(appBase, ROUTES_FILE)); + map.put(NamedPort.DEFAULT, routeTables(appBase, ROUTES_FILE, ROUTES_FILE2)); for (NamedPort np : Act.app().config().namedPorts()) { String npName = np.name(); String routesFile = S.concat("routes.", npName, ".conf"); @@ -397,23 +398,41 @@ public Map> routeTables(File appBase) { return map; } - private List routeTables(File appBase, String routesFiile) { + private List routeTables(File appBase, String ... routesFiles) { List files = new ArrayList<>(); File resourceBase = resource(appBase); - files.add(file(resourceBase, routesFiile)); + File routeFile = routeFile(resourceBase, routesFiles); + if (null != routeFile) { + files.add(routeFile); + } File confBase = conf(appBase); - if ($.eq(confBase, resourceBase)) { - // see https://github.com/actframework/actframework/issues/300 - return files; + routeFile = routeFile(confBase, routesFiles); + if (null != routeFile && !files.contains(routeFile)) { + files.add(routeFile); } - files.add(file(confBase, routesFiile)); File commonBase = file(confBase, "common"); - files.add(file(commonBase, routesFiile)); + routeFile = routeFile(commonBase, routesFiles); + if (null != routeFile && !files.contains(routeFile)) { + files.add(routeFile); + } File profileBase = file(confBase, Act.profile()); - files.add(file(profileBase, routesFiile)); + routeFile = routeFile(profileBase, routesFiles); + if (null != routeFile && !files.contains(routeFile)) { + files.add(routeFile); + } return files; } + private static File routeFile(File base, String ... routesFiles) { + for (String s : routesFiles) { + File routeFile = file(base, s); + if (routeFile.canRead()) { + return routeFile; + } + } + return null; + } + public static ProjectLayout valueOfIgnoreCase(String s) { s = s.trim().toUpperCase(); if (MAVEN.name().equals(s)) return MAVEN; diff --git a/src/main/java/act/route/RouteTableRouterBuilder.java b/src/main/java/act/route/RouteTableRouterBuilder.java index 510fd2184..5b57d9fe4 100644 --- a/src/main/java/act/route/RouteTableRouterBuilder.java +++ b/src/main/java/act/route/RouteTableRouterBuilder.java @@ -103,6 +103,7 @@ public class RouteTableRouterBuilder implements RouterBuilder { private static AtomicInteger jobIdCounter = new AtomicInteger(0); public static final String ROUTES_FILE = "routes.conf"; + public static final String ROUTES_FILE2 = "route.conf"; private List lines; From 6f8d3f3cc30a277335530a6e25dc474306a03282 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 24 Jan 2019 06:51:55 +1100 Subject: [PATCH 337/730] WIP --- src/main/java/act/conf/AppConfig.java | 20 ++++++++++++++++++++ src/main/java/act/conf/AppConfigKey.java | 14 ++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index d71cfd907..09dc77690 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -2514,6 +2514,26 @@ private void _mergeTemplateHome(AppConfig conf) { } } + private Boolean paramBindingKeywordMatching; + + protected T paramBindingKeywordMatching(boolean enabled) { + paramBindingKeywordMatching = enabled; + return me(); + } + + public boolean paramBindingKeywordMatching() { + if (null == paramBindingKeywordMatching) { + paramBindingKeywordMatching = get(PARAM_BINDING_KEYWORD_MATCHING, false); + } + return paramBindingKeywordMatching; + } + + private void _mergeParamBindingKeywordMatching(AppConfig config) { + if (!hasConfiguration(PARAM_BINDING_KEYWORD_MATCHING)) { + paramBindingKeywordMatching = config.paramBindingKeywordMatching; + } + } + private boolean pingPathResolved = false; private String pingPath = null; diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 24a9a5545..ef83f39ea 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -803,6 +803,20 @@ public T val(Map configuration) { */ OSGL_THREADLOCAL_BUF_LIMIT("threadlocal_buf.limit"), + /** + * `param_binding.keyword_matching` turn on/off keyword matching in HTTP param + * binding process. + * + * When this configuration is turned on the framework is able to do keyword matching + * to bind the HTTP parameter, e.g. when it declare to bind a parameter named `fooBar`, + * when request is sending with parameter named `foo_bar`, it can still finish the bind. + * + * **Note** turning on this configuration might cause performance degrade. + * + * Default value: `false` + */ + PARAM_BINDING_KEYWORD_MATCHING("param_binding.keyword_matching.enabled"), + /** * `password.spec` specify default password spec which is used to * validate user password. From dcaacc9b18094cd6f1251b39d077084195dbb73c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 24 Jan 2019 12:38:53 +1100 Subject: [PATCH 338/730] Support `Keyword` matching for param binding of incoming request #972 --- CHANGELOG.md | 1 + src/main/java/act/conf/AppConfigKey.java | 2 +- src/main/java/act/inject/param/ParamKey.java | 21 +- .../act/xio/undertow/UndertowRequest.java | 36 +- testapps/GH972/.gitignore | 19 + testapps/GH972/pack | 6 + testapps/GH972/pack.bat | 5 + testapps/GH972/pom.xml | 34 + testapps/GH972/run_dev | 3 + testapps/GH972/run_dev.bat | 2 + testapps/GH972/run_prod | 10 + .../GH972/src/main/java/test/AppEntry.java | 39 + .../src/main/resources/conf/app.properties | 822 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + testapps/GH972/src/main/resources/logback.xml | 115 +++ .../GH972/src/main/resources/test/.version | 3 + .../GH972/src/main/resources/test/logback.xml | 115 +++ .../src/main/resources/test/scenarios.yml | 26 + testapps/GH972/test | 3 + testapps/GH972/test.bat | 2 + 21 files changed, 1259 insertions(+), 15 deletions(-) create mode 100644 testapps/GH972/.gitignore create mode 100755 testapps/GH972/pack create mode 100644 testapps/GH972/pack.bat create mode 100644 testapps/GH972/pom.xml create mode 100755 testapps/GH972/run_dev create mode 100755 testapps/GH972/run_dev.bat create mode 100755 testapps/GH972/run_prod create mode 100644 testapps/GH972/src/main/java/test/AppEntry.java create mode 100644 testapps/GH972/src/main/resources/conf/app.properties create mode 100644 testapps/GH972/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH972/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH972/src/main/resources/logback.xml create mode 100644 testapps/GH972/src/main/resources/test/.version create mode 100644 testapps/GH972/src/main/resources/test/logback.xml create mode 100644 testapps/GH972/src/main/resources/test/scenarios.yml create mode 100755 testapps/GH972/test create mode 100644 testapps/GH972/test.bat diff --git a/CHANGELOG.md b/CHANGELOG.md index b4434299e..643ee468d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.18** +* Support `Keyword` matching for param binding of incoming request #972 * Allow load route configuration from `route.conf` file #1042 * Allow keep searching route table even when a terminate node found #1041 * act test failed in mvn could not see detail information #1040 diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index ef83f39ea..783511497 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -811,7 +811,7 @@ public T val(Map configuration) { * to bind the HTTP parameter, e.g. when it declare to bind a parameter named `fooBar`, * when request is sending with parameter named `foo_bar`, it can still finish the bind. * - * **Note** turning on this configuration might cause performance degrade. + * **Note** turning on this configuration might cause slightly performance degrade. * * Default value: `false` */ diff --git a/src/main/java/act/inject/param/ParamKey.java b/src/main/java/act/inject/param/ParamKey.java index 0d1334165..94ca4076c 100644 --- a/src/main/java/act/inject/param/ParamKey.java +++ b/src/main/java/act/inject/param/ParamKey.java @@ -20,8 +20,10 @@ * #L% */ +import act.Act; import org.osgl.$; import org.osgl.util.E; +import org.osgl.util.Keyword; import org.rythmengine.utils.S; import java.util.Arrays; @@ -34,11 +36,18 @@ class ParamKey { static final ParamKey ROOT_KEY = new ParamKey(new String[0]); private String[] seq; + private Keyword[] keywordSeq; private int hc; private int size; private ParamKey(String[] seq) { this.seq = seq; this.size = seq.length; + if (Act.appConfig().paramBindingKeywordMatching()) { + keywordSeq = new Keyword[seq.length]; + for (int i = 0; i < seq.length; ++i) { + keywordSeq[i] = Keyword.of(seq[i]); + } + } calcHashCode(); } private ParamKey(String one) { @@ -52,7 +61,15 @@ public boolean equals(Object obj) { if (obj == this) { return true; } - return obj instanceof ParamKey && Arrays.equals(((ParamKey) obj).seq, seq); + if (obj instanceof ParamKey) { + ParamKey that = (ParamKey) obj; + if (null != keywordSeq) { + return Arrays.equals(keywordSeq, that.keywordSeq); + } else { + return Arrays.equals(seq, that.seq); + } + } + return false; } @Override @@ -105,7 +122,7 @@ ParamKey child(String name) { } private void calcHashCode() { - this.hc = $.hc(seq); + this.hc = null == keywordSeq ? $.hc(seq) : $.hc(keywordSeq); } static ParamKey of(String[] seq) { diff --git a/src/main/java/act/xio/undertow/UndertowRequest.java b/src/main/java/act/xio/undertow/UndertowRequest.java index 512a8b272..ce89de2f8 100644 --- a/src/main/java/act/xio/undertow/UndertowRequest.java +++ b/src/main/java/act/xio/undertow/UndertowRequest.java @@ -65,6 +65,8 @@ public class UndertowRequest extends RequestImplBase { private HttpServerExchange hse; private byte[] body; private Map> queryParams; + private Map> queryParamsByKeyword; + private boolean keywordMatching; private Map headerCache = new HashMap<>(); public UndertowRequest(HttpServerExchange exchange, AppConfig config) { @@ -72,6 +74,7 @@ public UndertowRequest(HttpServerExchange exchange, AppConfig config) { E.NPE(exchange); hse = exchange; headerOverwrite = config.allowHeaderOverwrite(); + keywordMatching = config.paramBindingKeywordMatching(); } @Override @@ -158,19 +161,13 @@ public void handle(HttpServerExchange exchange, byte[] message) { @Override public String paramVal(String name) { - if (null == queryParams) { - queryParams = hse.getQueryParameters(); - } - Deque dq = queryParams.get(name); + Deque dq = queryParamVals(name); return null == dq ? null : dq.peekFirst(); } @Override public String[] paramVals(String name) { - if (null == queryParams) { - queryParams = hse.getQueryParameters(); - } - Deque deque = queryParams.get(name); + Deque deque = queryParamVals(name); if (null == deque) { return null; } @@ -181,10 +178,7 @@ public String[] paramVals(String name) { @Override public Iterable paramNames() { - if (null == queryParams) { - queryParams = hse.getQueryParameters(); - } - return queryParams.keySet(); + return queryParams().keySet(); } public void closeAndDrainRequest() { @@ -244,6 +238,24 @@ HttpServerExchange exchange() { return hse; } + private Map> queryParams() { + if (null == queryParams) { + queryParams = hse.getQueryParameters(); + if (keywordMatching) { + queryParamsByKeyword = new HashMap<>(); + for (Map.Entry> entry : queryParams.entrySet()) { + queryParamsByKeyword.put(Keyword.of(entry.getKey()), entry.getValue()); + } + } + } + return queryParams; + } + + private Deque queryParamVals(String name) { + queryParams(); + return keywordMatching ? queryParamsByKeyword.get(Keyword.of(name)) : queryParams.get(name); + } + public static void main(String[] args) { HttpString a = HEADER_NAMES.get("X-Forwarded-For"); HttpString b = HEADER_NAMES.get("x-forwarded-for"); diff --git a/testapps/GH972/.gitignore b/testapps/GH972/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH972/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH972/pack b/testapps/GH972/pack new file mode 100755 index 000000000..d4daf2bc9 --- /dev/null +++ b/testapps/GH972/pack @@ -0,0 +1,6 @@ +#!/bin/sh +echo build ... +mvn -q compile +echo run test and then package ... +mvn -q package +echo package has been built up and stored in target/dist dir \ No newline at end of file diff --git a/testapps/GH972/pack.bat b/testapps/GH972/pack.bat new file mode 100644 index 000000000..44b5e3aa2 --- /dev/null +++ b/testapps/GH972/pack.bat @@ -0,0 +1,5 @@ +echo build ... +mvn -q compile +echo run test and then package ... +mvn -q package +echo package has been built up and stored in target/dist dir \ No newline at end of file diff --git a/testapps/GH972/pom.xml b/testapps/GH972/pom.xml new file mode 100644 index 000000000..224e96bb9 --- /dev/null +++ b/testapps/GH972/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + test + GH972 + 1.0-SNAPSHOT + + My Awesome Application + + + org.actframework + act-starter-parent + 1.8.17.1 + + + + + 1.8 + test.AppEntry + + + + + + org.actframework + act + 1.8.18-SNAPSHOT + + + + \ No newline at end of file diff --git a/testapps/GH972/run_dev b/testapps/GH972/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH972/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH972/run_dev.bat b/testapps/GH972/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH972/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH972/run_prod b/testapps/GH972/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH972/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH972/src/main/java/test/AppEntry.java b/testapps/GH972/src/main/java/test/AppEntry.java new file mode 100644 index 000000000..db252f76d --- /dev/null +++ b/testapps/GH972/src/main/java/test/AppEntry.java @@ -0,0 +1,39 @@ +package test; + +import act.Act; +import act.data.annotation.Data; +import act.util.LogSupport; +import act.util.SimpleBean; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; + +/** + * A simple hello world app entry + * + * Run this app, try to update some of the code, then + * press F5 in the browser to watch the immediate change + * in the browser! + */ +@SuppressWarnings("unused") +public class AppEntry extends LogSupport { + + @Data + public static class Foo implements SimpleBean { + public int barLevel; + } + + @GetAction + public String queryParamsTestBed(String fooBar) { + return fooBar; + } + + @PostAction + public Foo postBindingTestBed(Foo foo) { + return foo; + } + + public static void main(String[] args) throws Exception { + Act.start(); + } + +} diff --git a/testapps/GH972/src/main/resources/conf/app.properties b/testapps/GH972/src/main/resources/conf/app.properties new file mode 100644 index 000000000..ef9f2da37 --- /dev/null +++ b/testapps/GH972/src/main/resources/conf/app.properties @@ -0,0 +1,822 @@ +param_binding.keyword_matching=true +############################################## +# Application configuration +# act-1.8.14 +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +#fmt.date= + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy年MM月dd日 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy年MM月dd日 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `globalReturnValueAdvice` specifies the global `ReturnValueAdvice` implementation +# +# Default value: `null` +#globalReturnValueAdvice=ghissues.Gh835$GlobalAdvice + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=3gREkLUOWscj7NbxgRnvScs8hy5UcyEkTu14ORyzqjgml5dGo7hp7x2rS2Rc00Gp + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypt` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypt=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `test.delay` specifies the seconds it shall wait before starting automate test. +# the value must be in integer, the unit of the value is second. +# +# Default value: 0 +#test.delay=5 + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= + +# `xio.worker_threads.max` specifies the maximum worker thread for XIO. +# +# Default value: `0`, meaning let system to decide the number of worker threads +#xio.worker_threads.max=0 + +# `xio.statistics.enabled` turn on/off statistics in XIO layer +# +# Default value: `false` +#xio.statistics.enabled=false diff --git a/testapps/GH972/src/main/resources/conf/prod/app.properties b/testapps/GH972/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..729db137e --- /dev/null +++ b/testapps/GH972/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.14 +############################################## +act.secret=51fR6Dm6lBQs6agdlQWJPVsBhE27N37tp8CVv71ry6ggeckNOXKkbLV1DdOpRHas \ No newline at end of file diff --git a/testapps/GH972/src/main/resources/conf/uat/app.properties b/testapps/GH972/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..d5f531618 --- /dev/null +++ b/testapps/GH972/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.14 +############################################## +act.secret=X4CuPD2V8mAiEin3lWOUQkTOCDnb0IGEEemimJGlwABvC9CkJEKzO3nDtKng1Sar \ No newline at end of file diff --git a/testapps/GH972/src/main/resources/logback.xml b/testapps/GH972/src/main/resources/logback.xml new file mode 100644 index 000000000..058a546ce --- /dev/null +++ b/testapps/GH972/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + test.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH972/src/main/resources/test/.version b/testapps/GH972/src/main/resources/test/.version new file mode 100644 index 000000000..ea0c26126 --- /dev/null +++ b/testapps/GH972/src/main/resources/test/.version @@ -0,0 +1,3 @@ +artifact=${project.artifactId} +version=${project.version} +build=${buildNumber} \ No newline at end of file diff --git a/testapps/GH972/src/main/resources/test/logback.xml b/testapps/GH972/src/main/resources/test/logback.xml new file mode 100644 index 000000000..ba406ef43 --- /dev/null +++ b/testapps/GH972/src/main/resources/test/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + test.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH972/src/main/resources/test/scenarios.yml b/testapps/GH972/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..59ddd005a --- /dev/null +++ b/testapps/GH972/src/main/resources/test/scenarios.yml @@ -0,0 +1,26 @@ +Scenario(KEYWORD_MATCHING TEST): + interactions: + - description: test keyword matching on query parameter + request: + get: / + params: + foo_bar: xyz + response: + json: + result: xyz + - description: test keyword matching on form fields + request: + post: / + params: + bar_level: 2 + response: + json: + barLevel: 2 + - description: test keyword matching on JSON body + request: + post: / + json: + bar_level: 2 + response: + json: + barLevel: 2 diff --git a/testapps/GH972/test b/testapps/GH972/test new file mode 100755 index 000000000..e32ec2e85 --- /dev/null +++ b/testapps/GH972/test @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:test \ No newline at end of file diff --git a/testapps/GH972/test.bat b/testapps/GH972/test.bat new file mode 100644 index 000000000..a324f34a0 --- /dev/null +++ b/testapps/GH972/test.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:test \ No newline at end of file From 590a5c99bf5aa2d1a57d795fe7692be42ac54fe4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 25 Jan 2019 22:49:19 +1100 Subject: [PATCH 339/730] Send out Login and Logout event #1043 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 32 ++++++++++--------- src/main/java/act/event/LoginEvent.java | 38 +++++++++++++++++++++++ src/main/java/act/event/LogoutEvent.java | 39 ++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 src/main/java/act/event/LoginEvent.java create mode 100644 src/main/java/act/event/LogoutEvent.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 643ee468d..4ec2e20f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.18** +* Send out Login and Logout event #1043 * Support `Keyword` matching for param binding of incoming request #972 * Allow load route configuration from `route.conf` file #1042 * Allow keep searching route table even when a terminate node found #1041 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index bfc7035d7..7351b70b8 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -29,8 +29,7 @@ import act.controller.captcha.CaptchaViolation; import act.data.MapUtil; import act.data.RequestBodyParser; -import act.event.ActEvent; -import act.event.SystemEvent; +import act.event.*; import act.handler.RequestHandler; import act.handler.builtin.controller.RequestHandlerProxy; import act.handler.builtin.controller.impl.ReflectedHandlerInvoker; @@ -1218,16 +1217,17 @@ public void startHandling() { */ public void login(Object userIdentifier) { session().put(config().sessionKeyUsername(), userIdentifier); + app().eventBus().trigger(new LoginEvent(userIdentifier.toString())); } /** * Login the user and redirect back to original URL * - * @param username - * the username + * @param userIdentifier + * the user identifier, could be either userId or username */ - public void loginAndRedirectBack(String username) { - login(username); + public void loginAndRedirectBack(Object userIdentifier) { + login(userIdentifier); RedirectToLoginUrl.redirectToOriginalUrl(this); } @@ -1235,26 +1235,26 @@ public void loginAndRedirectBack(String username) { * Login the user and redirect back to original URL. If no * original URL found then redirect to `defaultLandingUrl`. * - * @param username - * The username + * @param userIdentifier + * the user identifier, could be either userId or username * @param defaultLandingUrl * the URL to be redirected if original URL not found */ - public void loginAndRedirectBack(String username, String defaultLandingUrl) { - login(username); + public void loginAndRedirectBack(Object userIdentifier, String defaultLandingUrl) { + login(userIdentifier); RedirectToLoginUrl.redirectToOriginalUrl(this, defaultLandingUrl); } /** * Login the user and redirect to specified URL * - * @param username - * the username + * @param userIdentifier + * the user identifier, could be either userId or username * @param url * the URL to be redirected to */ - public void loginAndRedirect(String username, String url) { - login(username); + public void loginAndRedirect(Object userIdentifier, String url) { + login(userIdentifier); throw redirect(url); } @@ -1263,8 +1263,12 @@ public void loginAndRedirect(String username, String url) { * the session will be cleared */ public void logout() { + String userIdentifier = session.get(config().sessionKeyUsername()); SessionManager sessionManager = app().sessionManager(); sessionManager.logout(session); + if (S.notBlank(userIdentifier)) { + app().eventBus().trigger(new LogoutEvent(userIdentifier)); + } } /** diff --git a/src/main/java/act/event/LoginEvent.java b/src/main/java/act/event/LoginEvent.java new file mode 100644 index 000000000..4b18472b7 --- /dev/null +++ b/src/main/java/act/event/LoginEvent.java @@ -0,0 +1,38 @@ +package act.event; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.S; + +/** + * Raised once {@link act.app.ActionContext#login(Object)} is called + */ +public class LoginEvent extends ActEvent { + private String identifier; + + public LoginEvent(String identifier) { + this.identifier = S.requireNotBlank(identifier); + } + + public String identifier() { + return identifier; + } +} diff --git a/src/main/java/act/event/LogoutEvent.java b/src/main/java/act/event/LogoutEvent.java new file mode 100644 index 000000000..200273dcb --- /dev/null +++ b/src/main/java/act/event/LogoutEvent.java @@ -0,0 +1,39 @@ +package act.event; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.ActionContext; +import org.osgl.$; + +/** + * Raised once {@link ActionContext#logout()} is called + */ +public class LogoutEvent extends ActEvent { + private String identifier; + + public LogoutEvent(String identifier) { + this.identifier = $.requireNotNull(identifier); + } + + public String identifier() { + return identifier; + } +} From 66df763d26096e88684a00c50d91950e63315e9c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 29 Jan 2019 19:38:31 +1100 Subject: [PATCH 340/730] JobContext lost when invoking another job #1044 --- CHANGELOG.md | 1 + pom.xml | 2 +- src/main/java/act/job/JobContext.java | 5 +-- src/main/java/act/job/JobManager.java | 59 +++++++++++++-------------- 4 files changed, 33 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ec2e20f9..d6dfff9d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.18** +* JobContext lost when invoking another job #1044 * Send out Login and Logout event #1043 * Support `Keyword` matching for param binding of incoming request #972 * Allow load route configuration from `route.conf` file #1042 diff --git a/pom.xml b/pom.xml index 73bc2c650..f90c20b83 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2 1.3.3 4.6.1 - 1.2.54 + 1.2.56 1.1.2 0.7 1.16 diff --git a/src/main/java/act/job/JobContext.java b/src/main/java/act/job/JobContext.java index 2443e39fa..47a47547f 100644 --- a/src/main/java/act/job/JobContext.java +++ b/src/main/java/act/job/JobContext.java @@ -40,7 +40,6 @@ public class JobContext extends ActContext.Base { private static ThreadLocal current_ = new ThreadLocal(); - private JobContext parent; private JobContext(JobContext parent) { @@ -180,9 +179,9 @@ public static void remove(String key) { * Make a copy of JobContext of current thread * @return the copy of current job context or an empty job context */ - static JobContext copy() { - JobContext ctxt = new JobContext(null); + static JobContext copy(boolean keepParent) { JobContext current = current_.get(); + JobContext ctxt = new JobContext(keepParent ? current : null); if (null != current) { ctxt.bag_.putAll(current.bag_); } diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 95828cbfa..ee0993862 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -92,7 +92,7 @@ public Future now(Callable callable) { } public Future now(String jobId, final Callable callable) { - final Job job = wrap(jobId, callable); + final Job job = wrap(jobId, callable, false); return executor().submit(new Callable() { @Override public T call() throws Exception { @@ -122,7 +122,7 @@ public void now(String jobId, Runnable runnable) { } public void now(String jobId, Runnable runnable, boolean sysJob) { - executor().submit(wrap(jobId, runnable, sysJob)); + executor().submit(wrap(jobId, runnable, sysJob, false)); } public String now($.Function worker) { @@ -130,7 +130,7 @@ public String now($.Function worker) { } public String now(String jobId, $.Function worker) { - Job job = wrap(jobId, worker); + Job job = wrap(jobId, worker, false); executor().submit(job); return job.id(); } @@ -144,12 +144,12 @@ public String now(String jobId, $.Function worker) { * @return the job ID allocated */ public String prepare($.Function worker) { - Job job = wrap(worker); + Job job = wrap(worker, false); return job.id(); } public void prepare(String jobId, $.Function worker) { - wrap(jobId, worker); + wrap(jobId, worker, false); } /** @@ -167,7 +167,7 @@ public Future delay(Callable callable, long delay, TimeUnit timeUnit) } public void delay(Runnable runnable, long delay, TimeUnit timeUnit) { - executor().schedule(wrap(runnable), delay, timeUnit); + executor().schedule(wrap(runnable, false), delay, timeUnit); } public Future delay(Callable callable, String delay) { @@ -177,7 +177,7 @@ public Future delay(Callable callable, String delay) { public void delay(Runnable runnable, String delay) { int seconds = parseTime(delay); - executor().schedule(wrap(runnable), seconds, TimeUnit.SECONDS); + executor().schedule(wrap(runnable, false), seconds, TimeUnit.SECONDS); } public void every(String id, Runnable runnable, String interval) { @@ -226,7 +226,7 @@ public void on(DateTime instant, Runnable runnable) { DateTime now = DateTime.now(); E.illegalArgumentIf(instant.isBefore(now)); Seconds seconds = Seconds.secondsBetween(now, instant); - executor().schedule(wrap(runnable), seconds.getSeconds(), TimeUnit.SECONDS); + executor().schedule(wrap(runnable, false), seconds.getSeconds(), TimeUnit.SECONDS); } public Future on(DateTime instant, Callable callable) { @@ -254,7 +254,7 @@ public void post(SysEventId sysEvent, final Runnable runnable) { public void post(SysEventId sysEvent, final Runnable runnable, boolean runImmediatelyIfEventDispatched) { Job job = jobById(sysEventJobId(sysEvent), false); if (null == job) { - processDelayedJob(wrap(runnable), runImmediatelyIfEventDispatched); + processDelayedJob(wrap(runnable, runImmediatelyIfEventDispatched), runImmediatelyIfEventDispatched); } else { job.addFollowingJob(Job.once(runnable, this)); } @@ -274,7 +274,7 @@ public void on(SysEventId sysEvent, String jobId, final Runnable runnable, boole if (traceEnabled) { LOGGER.trace("process delayed job: %s", jobId); } - processDelayedJob(wrap(runnable), runImmediatelyIfEventDispatched); + processDelayedJob(wrap(runnable, runImmediatelyIfEventDispatched), runImmediatelyIfEventDispatched); } else { if (traceEnabled) { LOGGER.trace("schedule job: %s", jobId); @@ -290,7 +290,7 @@ public void post(SysEventId sysEvent, String jobId, final Runnable runnable) { public void post(SysEventId sysEvent, String jobId, final Runnable runnable, boolean runImmediatelyIfEventDispatched) { Job job = jobById(sysEventJobId(sysEvent)); if (null == job) { - processDelayedJob(wrap(runnable), runImmediatelyIfEventDispatched); + processDelayedJob(wrap(runnable, runImmediatelyIfEventDispatched), runImmediatelyIfEventDispatched); } else { job.addFollowingJob(Job.once(jobId, runnable, this)); } @@ -299,7 +299,7 @@ public void post(SysEventId sysEvent, String jobId, final Runnable runnable, boo public void alongWith(SysEventId sysEvent, String jobId, final Runnable runnable) { Job job = jobById(sysEventJobId(sysEvent)); if (null == job) { - processDelayedJob(wrap(runnable), false); + processDelayedJob(wrap(runnable, false), false); } else { job.addParallelJob(Job.once(jobId, runnable, this)); } @@ -485,43 +485,40 @@ protected void releaseResources() { } } - private Job wrap(Runnable runnable) { - return wrap(randomJobId(), runnable, false); + private Job wrap(Runnable runnable, boolean runImmediately) { + return wrap(randomJobId(), runnable, false, runImmediately); } - private Job wrap(String name, Runnable runnable, boolean sysJob) { - Job job = new ContextualJob(name, runnable); + private Job wrap(String name, Runnable runnable, boolean sysJob, boolean runImmediately) { + Job job = new ContextualJob(name, runnable, runImmediately); if (sysJob) { job.markAsSysJob(); } return job; } - private Job wrap(Callable callable) { - return new ContextualJob(randomJobId(), callable); + private Job wrap(String name, Callable callable, boolean runImmediate) { + return new ContextualJob(name, callable, runImmediate); } - private Job wrap(String name, Callable callable) { - return new ContextualJob(name, callable); + private Job wrap($.Function worker, boolean runImmediate) { + return new ContextualJob(randomJobId(), worker, runImmediate); } - private Job wrap($.Function worker) { - return new ContextualJob(randomJobId(), worker); - } - - private Job wrap(String name, $.Function worker) { - return new ContextualJob(name, worker); + private Job wrap(String name, $.Function worker, boolean runImmediate) { + return new ContextualJob(name, worker, runImmediate); } private class ContextualJob extends Job { - private JobContext origin_ = JobContext.copy(); + private JobContext origin_; - ContextualJob(String id, final Callable callable) { + ContextualJob(String id, final Callable callable, boolean sync) { super(id, JobManager.this, callable); + origin_ = JobContext.copy(sync); } - ContextualJob(final String id, final Runnable runnable) { + ContextualJob(final String id, final Runnable runnable, boolean sync) { super(id, JobManager.this, new $.F0() { @Override public Object apply() throws NotAppliedException, $.Break { @@ -529,11 +526,13 @@ public Object apply() throws NotAppliedException, $.Break { return null; } }, true); + origin_ = JobContext.copy(sync); ensureMailerContext(); } - ContextualJob(String id, final $.Function worker) { + ContextualJob(String id, final $.Function worker, boolean sync) { super(id, JobManager.this, worker); + origin_ = JobContext.copy(sync); ensureMailerContext(); } From 9d1746b679656a5e5a1783108919220053ad6332 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 30 Jan 2019 06:18:22 +1100 Subject: [PATCH 341/730] update genie to 1.9.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f90c20b83..a69355fa7 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ 3.10.0 1.19.0 1.6.0 - 1.9.3 + 1.9.4-SNAPSHOT 1.9.0 1.9.0 1.8.0 From 2f4d97d98166c6c1aded0a6802ebafadf0c1f1b8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 31 Jan 2019 05:36:58 +1100 Subject: [PATCH 342/730] update osgl-tool to 1.19.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a69355fa7..663a44ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 2.10.1 1.11.3 3.10.0 - 1.19.0 + 1.19.1-SNAPSHOT 1.6.0 1.9.4-SNAPSHOT 1.9.0 From bc5312584a568d3c3510d40a9752d9cb07eeb943 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 31 Jan 2019 22:26:39 +1100 Subject: [PATCH 343/730] ContextualJob cause JobContext get cleared twice #1046 --- CHANGELOG.md | 1 + src/main/java/act/job/JobContext.java | 3 +-- src/main/java/act/job/JobManager.java | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6dfff9d1..b2dd0545e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.18** +* ContextualJob cause JobContext get cleared twice #1046 * JobContext lost when invoking another job #1044 * Send out Login and Logout event #1043 * Support `Keyword` matching for param binding of incoming request #972 diff --git a/src/main/java/act/job/JobContext.java b/src/main/java/act/job/JobContext.java index 47a47547f..3e2a94cbd 100644 --- a/src/main/java/act/job/JobContext.java +++ b/src/main/java/act/job/JobContext.java @@ -192,8 +192,7 @@ static JobContext copy(boolean keepParent) { * Initialize current thread's JobContext using specified copy * @param origin the original job context */ - static void init(JobContext origin) { - current_.set(origin); + static void loadFromOrigin(JobContext origin) { if (origin.bag_.isEmpty()) { return; } diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index ee0993862..7b3a7a615 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -539,12 +539,11 @@ public Object apply() throws NotAppliedException, $.Break { @Override protected void _before() { // copy the JobContext of parent thread into the current thread - JobContext.init(origin_); + JobContext.loadFromOrigin(origin_); } @Override protected void _finally() { - JobContext.clear(); removeJob(this); } From ac5819a60c2dce9250fb1602b9665e1884c1d183 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 4 Feb 2019 06:45:30 +1100 Subject: [PATCH 344/730] Error enhancing bytecode at com.sun.mail.util.logging.MailHandler::publish() #1048; fix JobContext init logic issue --- CHANGELOG.md | 2 + legacy-testapp/pom.xml | 2 +- .../java/testapp/endpoint/GHIssue657.java | 12 +++- src/main/java/act/app/App.java | 2 +- src/main/java/act/app/AppClassLoader.java | 14 +++- src/main/java/act/cli/CliSession.java | 2 +- src/main/java/act/job/Job.java | 2 +- src/main/java/act/job/JobContext.java | 19 ++++-- src/main/java/act/job/JobManager.java | 66 ++++++++++--------- src/main/java/act/util/ActContext.java | 2 +- 10 files changed, 78 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2dd0545e..d2b158fac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.18** +* Fix JobContext init logic +* Error enhancing bytecode at com.sun.mail.util.logging.MailHandler::publish() #1048 * ContextualJob cause JobContext get cleared twice #1046 * JobContext lost when invoking another job #1044 * Send out Login and Logout event #1043 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 8dc9336e9..26b76e6cf 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.17-SNAPSHOT + 1.8.18-SNAPSHOT [0.13.0, 2.0.0) 1.6.6-SNAPSHOT testapp.TestApp diff --git a/legacy-testapp/src/test/java/testapp/endpoint/GHIssue657.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue657.java index 0bb64f481..f6bfa2ac9 100644 --- a/legacy-testapp/src/test/java/testapp/endpoint/GHIssue657.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue657.java @@ -1,19 +1,27 @@ package testapp.endpoint; +import org.joda.time.DateTime; import org.junit.Test; +import org.osgl.util.S; public class GHIssue657 extends EndpointTester { + private String year; + + public GHIssue657() { + year = S.string(DateTime.now().getYear()); + } + @Test public void testList1() throws Exception { url("/gh/657/1").getJSON(); - bodyContains("2018"); + bodyContains(year); } @Test public void testList2() throws Exception { url("/gh/657/2").get(); - bodyContains("2018"); + bodyContains(year); } } diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index aafbb764b..8565a2c61 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -800,7 +800,7 @@ public void run() { if (!isDevColdStart()) { runnable1.run(); } else { - jobManager.now("post_di_load_init", runnable1, true); + jobManager.now("post_di_load_init", runnable1); } Runnable runnable2 = new Runnable() { @Override diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index 9d4bee83a..371c549b5 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -592,7 +592,7 @@ protected byte[] enhance(String className, byte[] bytecode) { } private byte[] asmEnhance(String className, byte[] bytecode) { - if (!isSystemClass(className)) return bytecode; + if (isSystemClass(className)) return bytecode; $.Var cw = $.var(null); ByteCodeVisitor enhancer = Act.enhancerManager().appEnhancer(app, className, cw); if (null == enhancer) { @@ -714,7 +714,15 @@ public boolean test(String s) { } public static boolean isSystemClass(String name) { - boolean sys = name.startsWith("java.") || name.startsWith("javax.") || name.startsWith("com.google") || name.startsWith("org.apache") || name.startsWith("org.springframework") || name.startsWith("sun.") || name.startsWith("org.osgl.") || name.startsWith("osgl."); - return !sys; + boolean sys = name.startsWith("java.") + || name.startsWith("javax.") + || name.startsWith("com.google.") + || name.startsWith("org.apache.") + || name.startsWith("org.springframework.") + || name.startsWith("sun.") + || name.startsWith("com.sun.") + || name.startsWith("org.osgl.") + || name.startsWith("osgl."); + return sys; } } diff --git a/src/main/java/act/cli/CliSession.java b/src/main/java/act/cli/CliSession.java index 17a470772..eb2dec74a 100644 --- a/src/main/java/act/cli/CliSession.java +++ b/src/main/java/act/cli/CliSession.java @@ -185,7 +185,7 @@ public void run() { try { CliContext context = new CliContext(line, app, console, this); cliContext = context; - JobContext.init(); + JobContext.init(id()); context.handle(); } catch ($.Break b) { Object payload = b.get(); diff --git a/src/main/java/act/job/Job.java b/src/main/java/act/job/Job.java index 4e6896cc6..617804a35 100644 --- a/src/main/java/act/job/Job.java +++ b/src/main/java/act/job/Job.java @@ -396,7 +396,7 @@ protected void _before() { } protected void doJob(){ - JobContext.init(); + JobContext.init(id()); try { _before(); if (null != worker) { diff --git a/src/main/java/act/job/JobContext.java b/src/main/java/act/job/JobContext.java index 3e2a94cbd..26a7bdb22 100644 --- a/src/main/java/act/job/JobContext.java +++ b/src/main/java/act/job/JobContext.java @@ -44,7 +44,7 @@ public class JobContext extends ActContext.Base { private JobContext(JobContext parent) { super(App.instance()); - current_.set(this); + //current_.set(this); this.parent = parent; if (null != parent) { bag_.putAll(parent.bag_); @@ -62,6 +62,11 @@ private JobContext(JobContext parent) { } } + @Override + public String toString() { + return "job[" + jobId + "]"; + } + private static Map m() { return current_.get().bag_; } @@ -112,9 +117,13 @@ public String[] paramVals(String s) { * Init JobContext of current thread */ // make it public for CLI interaction to reuse JobContext - public static void init() { + public static void init(String jobId) { JobContext parent = current_.get(); JobContext ctx = new JobContext(parent); + current_.set(ctx); + // don't call setJobId(String) + // as it will trigger listeners -- TODO fix me + ctx.jobId = jobId; if (null == parent) { Act.eventBus().trigger(new JobContextInitialized(ctx)); } @@ -130,6 +139,7 @@ public static void clear() { JobContext parent = ctx.parent; if (null != parent) { current_.set(parent); + ctx.parent = null; } else { current_.remove(); Act.eventBus().trigger(new JobContextDestroyed(ctx)); @@ -179,9 +189,10 @@ public static void remove(String key) { * Make a copy of JobContext of current thread * @return the copy of current job context or an empty job context */ - static JobContext copy(boolean keepParent) { + static JobContext copy() { JobContext current = current_.get(); - JobContext ctxt = new JobContext(keepParent ? current : null); + //JobContext ctxt = new JobContext(keepParent ? current : null); + JobContext ctxt = new JobContext(null); if (null != current) { ctxt.bag_.putAll(current.bag_); } diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 7b3a7a615..06b824788 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -92,7 +92,7 @@ public Future now(Callable callable) { } public Future now(String jobId, final Callable callable) { - final Job job = wrap(jobId, callable, false); + final Job job = wrap(jobId, callable); return executor().submit(new Callable() { @Override public T call() throws Exception { @@ -106,11 +106,11 @@ public T call() throws Exception { } public void now(Job job) { - now(job, job.isSysJob()); + executor().submit(job); } public void now(Runnable runnable) { - now(runnable, false); + now(randomJobId(), runnable); } public void now(Runnable runnable, boolean sysJob) { @@ -118,11 +118,11 @@ public void now(Runnable runnable, boolean sysJob) { } public void now(String jobId, Runnable runnable) { - now(jobId, runnable, false); + executor().submit(wrap(jobId, runnable)); } public void now(String jobId, Runnable runnable, boolean sysJob) { - executor().submit(wrap(jobId, runnable, sysJob, false)); + executor().submit(wrap(jobId, runnable, sysJob)); } public String now($.Function worker) { @@ -130,7 +130,7 @@ public String now($.Function worker) { } public String now(String jobId, $.Function worker) { - Job job = wrap(jobId, worker, false); + Job job = wrap(jobId, worker); executor().submit(job); return job.id(); } @@ -144,12 +144,12 @@ public String now(String jobId, $.Function worker) { * @return the job ID allocated */ public String prepare($.Function worker) { - Job job = wrap(worker, false); + Job job = wrap(worker); return job.id(); } public void prepare(String jobId, $.Function worker) { - wrap(jobId, worker, false); + wrap(jobId, worker); } /** @@ -167,7 +167,7 @@ public Future delay(Callable callable, long delay, TimeUnit timeUnit) } public void delay(Runnable runnable, long delay, TimeUnit timeUnit) { - executor().schedule(wrap(runnable, false), delay, timeUnit); + executor().schedule(wrap(runnable), delay, timeUnit); } public Future delay(Callable callable, String delay) { @@ -177,7 +177,7 @@ public Future delay(Callable callable, String delay) { public void delay(Runnable runnable, String delay) { int seconds = parseTime(delay); - executor().schedule(wrap(runnable, false), seconds, TimeUnit.SECONDS); + executor().schedule(wrap(runnable), seconds, TimeUnit.SECONDS); } public void every(String id, Runnable runnable, String interval) { @@ -226,7 +226,7 @@ public void on(DateTime instant, Runnable runnable) { DateTime now = DateTime.now(); E.illegalArgumentIf(instant.isBefore(now)); Seconds seconds = Seconds.secondsBetween(now, instant); - executor().schedule(wrap(runnable, false), seconds.getSeconds(), TimeUnit.SECONDS); + executor().schedule(wrap(runnable), seconds.getSeconds(), TimeUnit.SECONDS); } public Future on(DateTime instant, Callable callable) { @@ -254,7 +254,7 @@ public void post(SysEventId sysEvent, final Runnable runnable) { public void post(SysEventId sysEvent, final Runnable runnable, boolean runImmediatelyIfEventDispatched) { Job job = jobById(sysEventJobId(sysEvent), false); if (null == job) { - processDelayedJob(wrap(runnable, runImmediatelyIfEventDispatched), runImmediatelyIfEventDispatched); + processDelayedJob(wrap(runnable), runImmediatelyIfEventDispatched); } else { job.addFollowingJob(Job.once(runnable, this)); } @@ -274,7 +274,7 @@ public void on(SysEventId sysEvent, String jobId, final Runnable runnable, boole if (traceEnabled) { LOGGER.trace("process delayed job: %s", jobId); } - processDelayedJob(wrap(runnable, runImmediatelyIfEventDispatched), runImmediatelyIfEventDispatched); + processDelayedJob(wrap(runnable), runImmediatelyIfEventDispatched); } else { if (traceEnabled) { LOGGER.trace("schedule job: %s", jobId); @@ -290,7 +290,7 @@ public void post(SysEventId sysEvent, String jobId, final Runnable runnable) { public void post(SysEventId sysEvent, String jobId, final Runnable runnable, boolean runImmediatelyIfEventDispatched) { Job job = jobById(sysEventJobId(sysEvent)); if (null == job) { - processDelayedJob(wrap(runnable, runImmediatelyIfEventDispatched), runImmediatelyIfEventDispatched); + processDelayedJob(wrap(runnable), runImmediatelyIfEventDispatched); } else { job.addFollowingJob(Job.once(jobId, runnable, this)); } @@ -299,7 +299,7 @@ public void post(SysEventId sysEvent, String jobId, final Runnable runnable, boo public void alongWith(SysEventId sysEvent, String jobId, final Runnable runnable) { Job job = jobById(sysEventJobId(sysEvent)); if (null == job) { - processDelayedJob(wrap(runnable, false), false); + processDelayedJob(wrap(runnable), false); } else { job.addParallelJob(Job.once(jobId, runnable, this)); } @@ -485,40 +485,44 @@ protected void releaseResources() { } } - private Job wrap(Runnable runnable, boolean runImmediately) { - return wrap(randomJobId(), runnable, false, runImmediately); + private Job wrap(Runnable runnable) { + return wrap(randomJobId(), runnable, false); + } + + private Job wrap(String name, Runnable runnable) { + return wrap(name, runnable, false); } - private Job wrap(String name, Runnable runnable, boolean sysJob, boolean runImmediately) { - Job job = new ContextualJob(name, runnable, runImmediately); + private Job wrap(String name, Runnable runnable, boolean sysJob) { + Job job = new ContextualJob(name, runnable); if (sysJob) { job.markAsSysJob(); } return job; } - private Job wrap(String name, Callable callable, boolean runImmediate) { - return new ContextualJob(name, callable, runImmediate); + private Job wrap(String name, Callable callable) { + return new ContextualJob(name, callable); } - private Job wrap($.Function worker, boolean runImmediate) { - return new ContextualJob(randomJobId(), worker, runImmediate); + private Job wrap($.Function worker) { + return new ContextualJob(randomJobId(), worker); } - private Job wrap(String name, $.Function worker, boolean runImmediate) { - return new ContextualJob(name, worker, runImmediate); + private Job wrap(String name, $.Function worker) { + return new ContextualJob(name, worker); } private class ContextualJob extends Job { private JobContext origin_; - ContextualJob(String id, final Callable callable, boolean sync) { + ContextualJob(String id, final Callable callable) { super(id, JobManager.this, callable); - origin_ = JobContext.copy(sync); + origin_ = JobContext.copy(); } - ContextualJob(final String id, final Runnable runnable, boolean sync) { + ContextualJob(final String id, final Runnable runnable) { super(id, JobManager.this, new $.F0() { @Override public Object apply() throws NotAppliedException, $.Break { @@ -526,13 +530,13 @@ public Object apply() throws NotAppliedException, $.Break { return null; } }, true); - origin_ = JobContext.copy(sync); + origin_ = JobContext.copy(); ensureMailerContext(); } - ContextualJob(String id, final $.Function worker, boolean sync) { + ContextualJob(String id, final $.Function worker) { super(id, JobManager.this, worker); - origin_ = JobContext.copy(sync); + origin_ = JobContext.copy(); ensureMailerContext(); } diff --git a/src/main/java/act/util/ActContext.java b/src/main/java/act/util/ActContext.java index 9dc49c1dd..c73050f30 100644 --- a/src/main/java/act/util/ActContext.java +++ b/src/main/java/act/util/ActContext.java @@ -270,7 +270,7 @@ abstract class Base extends DestroyableBase private int fieldOutputVarCount; private boolean noTemplateCache; private volatile SimpleProgressGauge progress; - private String jobId; + protected String jobId; private Method handlerMethod; private Method currentMethod; private String pattern; From 602ee671f600a7ea310da33e00b8b1e6f9f33558 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 4 Feb 2019 21:39:10 +1100 Subject: [PATCH 345/730] update VERSION_MATRIX and CHANGELOG; update testing project dependencies --- CHANGELOG.md | 2 +- VERSION_MATRIX.md | 40 +++++++------- pom.xml | 4 +- testapps/GH863/pom.xml | 7 ++- testapps/GH874/pom.xml | 7 ++- testapps/GH885/pom.xml | 7 ++- testapps/GH886/pom.xml | 2 +- .../src/main/resources/e2e/scenarios.yml | 53 ------------------- .../src/main/resources/test/scenarios.yml | 0 testapps/GH918/pom.xml | 2 +- .../src/main/resources/test/scenarios.yml | 10 ---- testapps/GH926/pom.xml | 2 +- testapps/GH931/pom.xml | 2 +- testapps/GH935/pom.xml | 2 +- .../src/main/resources/test/scenarios.yml | 34 ------------ testapps/GH968/pom.xml | 7 +-- testapps/GH972/pom.xml | 7 +-- testapps/ResourceLoaderTest/pom.xml | 4 +- 18 files changed, 50 insertions(+), 142 deletions(-) delete mode 100644 testapps/GH886/src/main/resources/e2e/scenarios.yml create mode 100644 testapps/GH886/src/main/resources/test/scenarios.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index d2b158fac..24339a5a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.18** +**1.8.18** 04/Feb/2019 * Fix JobContext init logic * Error enhancing bytecode at com.sun.mail.util.logging.MailHandler::publish() #1048 * ContextualJob cause JobContext get cleared twice #1046 diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 141954811..f3fdde6cf 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,25 +1,25 @@ # Version Matrix -| act | 1.8.7 | 1.8.8 | 1.8.16 | 1.8.17 | -| --- | ----: | ----: | ----: | ----: | -| aaa | 1.4.2 | 1.5.2 | 1.5.3 | 1.5.3 | -| beetl | 1.4.1 | 1.4.5 | 1.4.6 | 1.4.6 | -| beetlsql | 1.4.5 | 1.5.3 | 1.5.6 | 1.5.6 | -| ebean-java7 | 1.5.3 | 1.7.3 | 1.7.5 | 1.7.5 | -| ebean(java8) | 1.6.2 | 1.7.3 | 1.7.5 | 1.7.5 | -| eclipselink(java8) | 1.2.3 | 1.5.2 | 1.5.5 | 1.5.6 | -| excel | 1.4.3 | 1.5.0 | 1.5.0 | 1.5.0 | -| freemarker | 1.3.2 | 1.3.6 | 1.3.6 | 1.3.6 | -| hibernate | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.5 | -| jax-rs(java8) | 1.0.2 | 1.0.5 | 1.0.5 | 1.0.5 | -| jpa-common | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.5 | -| morphia | 1.4.2 | 1.6.2 | 1.6.5 | 1.6.6 | -| mustache(java8) | 1.4.2 | 1.4.5 | 1.4.5 | 1.4.5 | -| social | 0.12.2 | 0.12.5 | 0.12.5 | 0.12.5 | -| sql-common | 1.3.3 | 1.4.3 | 1.4.4 | 1.4.4 | -| storage(java8) | 0.13.2 | 0.13.5 | 0.13.5 | 0.13.5 | -| thymeleaf | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | -| velocity | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | +| act | 1.8.7 | 1.8.8 | 1.8.16 | 1.8.17 | 1.8.18 | +| --- | ----: | ----: | ----: | ----: | ----: | +| aaa | 1.4.2 | 1.5.2 | 1.5.3 | 1.5.3 | 1.5.4 | +| beetl | 1.4.1 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | +| beetlsql | 1.4.5 | 1.5.3 | 1.5.6 | 1.5.6 | 1.5.6 | +| ebean-java7 | 1.5.3 | 1.7.3 | 1.7.5 | 1.7.5 | 1.7.5 | +| ebean(java8) | 1.6.2 | 1.7.3 | 1.7.5 | 1.7.5 | 1.7.5 | +| eclipselink(java8) | 1.2.3 | 1.5.2 | 1.5.5 | 1.5.6 | 1.5.7 | +| excel | 1.4.3 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | +| freemarker | 1.3.2 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | +| hibernate | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.5 | 1.5.6 | +| jax-rs(java8) | 1.0.2 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | +| jpa-common | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.5 | 1.5.6 | +| morphia | 1.4.2 | 1.6.2 | 1.6.5 | 1.6.6 | 1.6.6 | +| mustache(java8) | 1.4.2 | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.5 | +| social | 0.12.2 | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.5 | +| sql-common | 1.3.3 | 1.4.3 | 1.4.4 | 1.4.4 | 1.4.4 | +| storage(java8) | 0.13.2 | 0.13.5 | 0.13.5 | 0.13.5 | 0.13.5 | +| thymeleaf | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | +| velocity | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | ## Note diff --git a/pom.xml b/pom.xml index 663a44ebd..cee504e09 100644 --- a/pom.xml +++ b/pom.xml @@ -63,9 +63,9 @@ 2.10.1 1.11.3 3.10.0 - 1.19.1-SNAPSHOT + 1.19.1 1.6.0 - 1.9.4-SNAPSHOT + 1.9.4 1.9.0 1.9.0 1.8.0 diff --git a/testapps/GH863/pom.xml b/testapps/GH863/pom.xml index 5d6305612..98f31d749 100644 --- a/testapps/GH863/pom.xml +++ b/testapps/GH863/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.8.7-SNAPSHOT + 1.8.17.1 @@ -23,6 +23,11 @@ + + org.actframework + act + 1.8.18-SNAPSHOT + diff --git a/testapps/GH874/pom.xml b/testapps/GH874/pom.xml index f5034d1f3..b05f34658 100644 --- a/testapps/GH874/pom.xml +++ b/testapps/GH874/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.8.7-SNAPSHOT + 1.8.17.1 @@ -23,6 +23,11 @@ + + org.actframework + act + 1.8.18-SNAPSHOT + diff --git a/testapps/GH885/pom.xml b/testapps/GH885/pom.xml index 0ff49a670..c7e258fc4 100644 --- a/testapps/GH885/pom.xml +++ b/testapps/GH885/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.8.7-SNAPSHOT + 1.8.17.1 @@ -23,6 +23,11 @@ + + org.actframework + act + 1.8.18-SNAPSHOT + diff --git a/testapps/GH886/pom.xml b/testapps/GH886/pom.xml index f6c2ff965..5b084e212 100644 --- a/testapps/GH886/pom.xml +++ b/testapps/GH886/pom.xml @@ -11,7 +11,7 @@ org.actframework act-starter-parent - 1.8.8.7-dld2-SNAPSHOT + 1.8.18.0-SNAPSHOT diff --git a/testapps/GH886/src/main/resources/e2e/scenarios.yml b/testapps/GH886/src/main/resources/e2e/scenarios.yml deleted file mode 100644 index 9c5e791dc..000000000 --- a/testapps/GH886/src/main/resources/e2e/scenarios.yml +++ /dev/null @@ -1,53 +0,0 @@ -Scenario(Hello Service): - description: a service says hello - interactions: - - description: send request to hello service without parameter - request: - method: GET - url: /hello - response: - text: Hello World # response text must be "Hello World" - - description: send request to hello servcie with parameter specified - request: - method: GET - url: /hello?who=ActFramework - response: - # this time we demonstrate how to verify text with a list of verifiers - text: - - eq: Hello ActFramework # value must be equal to "Hello ActFramework" - - contains: ActFramework # value must contains "ActFramework" - - starts: Hello # value must starts with "Hello" - - ends: Framework # value must ends with "Framework" - - description: send request to hello servcie with parameter specified and require JSON response - request: - accept: json # specify accept type is application/json - method: GET - url: /hello?who=Java - response: - json: # treat result as a JSON object - # act returns json result in `{"result": ...}` style - result: Hello Java # result property of the JSON object must be "Hello World" - -# Test Service#date() endpoint, which is available at `GET /date` endpoint -Scenario(Date Service): - description: A service returns an important date in the history - interactions: - - description: send request to the service - request: - method: GET - url: /date - response: - text: - - after: 1997-05-11 # the returned date should be after date 1997-05-11 - - before: 13/May/2018 # the returned date should be before date 13/May/2018 - - description: send request to the service and request response be JSON format - request: - accept: json - method: GET - url: /date - response: - json: # treat result as a JSON object - # act returns json result in `{"result": ...}` style - result: # thus we will use `result` to fetch the date - - after: 1997-05-11 # the returned date should be after date 1997-05-11 - - before: 13/May/2018 # the returned date should be before date 13/May/2018 \ No newline at end of file diff --git a/testapps/GH886/src/main/resources/test/scenarios.yml b/testapps/GH886/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..e69de29bb diff --git a/testapps/GH918/pom.xml b/testapps/GH918/pom.xml index 441c07cd8..ea4482327 100644 --- a/testapps/GH918/pom.xml +++ b/testapps/GH918/pom.xml @@ -11,7 +11,7 @@ org.actframework act-starter-parent - 1.8.8.7-SNAPSHOT + 1.8.18.0-SNAPSHOT diff --git a/testapps/GH919/src/main/resources/test/scenarios.yml b/testapps/GH919/src/main/resources/test/scenarios.yml index a6f4dfeda..e69de29bb 100644 --- a/testapps/GH919/src/main/resources/test/scenarios.yml +++ b/testapps/GH919/src/main/resources/test/scenarios.yml @@ -1,10 +0,0 @@ -Scenario(GH918): - interactions: - - description: "[gh918] Cannot add white space for `session.header.payload.prefix` configuration" - request: - get: / - response: - headers: - Authorization: - - exists: true - - startsWith: "Bearer " diff --git a/testapps/GH926/pom.xml b/testapps/GH926/pom.xml index d800aa283..592dd3069 100644 --- a/testapps/GH926/pom.xml +++ b/testapps/GH926/pom.xml @@ -11,7 +11,7 @@ org.actframework act-starter-parent - 1.8.8.9-SNAPSHOT + 1.8.18.0-SNAPSHOT diff --git a/testapps/GH931/pom.xml b/testapps/GH931/pom.xml index 64149978f..5564d4f92 100644 --- a/testapps/GH931/pom.xml +++ b/testapps/GH931/pom.xml @@ -11,7 +11,7 @@ org.actframework act-starter-parent - 1.8.8.9-SNAPSHOT + 1.8.18.0-SNAPSHOT diff --git a/testapps/GH935/pom.xml b/testapps/GH935/pom.xml index 48ca9e434..8b806c68a 100644 --- a/testapps/GH935/pom.xml +++ b/testapps/GH935/pom.xml @@ -11,7 +11,7 @@ org.actframework act-starter-parent - 1.8.11.0 + 1.8.18.0-SNAPSHOT diff --git a/testapps/GH938/src/main/resources/test/scenarios.yml b/testapps/GH938/src/main/resources/test/scenarios.yml index 6fb69b1f2..e69de29bb 100644 --- a/testapps/GH938/src/main/resources/test/scenarios.yml +++ b/testapps/GH938/src/main/resources/test/scenarios.yml @@ -1,34 +0,0 @@ -Scenario: - interactions: - - description: /hello [port_a] - request: - port: 12345 - get: hello - response: - json: - result: SUCCESS - - description: /hello1 [port_a] - request: - port: 12345 - get: hello1 - response: - json: - result: SUCCESS - - description: /hello2 [port_a] - request: - port: 12345 - get: hello2 - response: - json: - result: SUCCESS - - description: /hello3 [port_a] - request: - get: hello3 - response: - json: - result: SUCCESS - - description: /hello4 [port_a] - request: - get: hello4 - response: - text: 哈哈哈 输出 Hello World diff --git a/testapps/GH968/pom.xml b/testapps/GH968/pom.xml index 8e862e81a..308d675e3 100644 --- a/testapps/GH968/pom.xml +++ b/testapps/GH968/pom.xml @@ -11,7 +11,7 @@ org.actframework act-starter-parent - 1.8.12.0 + 1.8.18.0-SNAPSHOT @@ -21,11 +21,6 @@ - - org.actframework - act - 1.8.13-SNAPSHOT - diff --git a/testapps/GH972/pom.xml b/testapps/GH972/pom.xml index 224e96bb9..47ba420e3 100644 --- a/testapps/GH972/pom.xml +++ b/testapps/GH972/pom.xml @@ -13,7 +13,7 @@ org.actframework act-starter-parent - 1.8.17.1 + 1.8.18.0-SNAPSHOT @@ -24,11 +24,6 @@ - - org.actframework - act - 1.8.18-SNAPSHOT - \ No newline at end of file diff --git a/testapps/ResourceLoaderTest/pom.xml b/testapps/ResourceLoaderTest/pom.xml index b25a1c8e3..0b70df11b 100644 --- a/testapps/ResourceLoaderTest/pom.xml +++ b/testapps/ResourceLoaderTest/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.12.0 + 1.8.17.1 @@ -30,7 +30,7 @@ org.actframework act - 1.8.13-SNAPSHOT + 1.8.18-SNAPSHOT From 7aba3a0081ac68e9f15da1928b3962f9adfcad24 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 4 Feb 2019 21:40:12 +1100 Subject: [PATCH 346/730] update README --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c3fc10e53..030d4bdf4 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.17.1 + 1.8.18.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.17.1 + -DarchetypeVersion=1.8.18.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.17.1 + -DarchetypeVersion=1.8.18.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.17.1 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.18.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.17.1 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.18.0 ``` For RESTful service project From 980a4d954cd822d670cef9f01bace289dda9cefe Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 4 Feb 2019 21:41:33 +1100 Subject: [PATCH 347/730] [maven-release-plugin] prepare release act-1.8.18 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cee504e09..fed0bbf80 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.18-SNAPSHOT + 1.8.18 ACT Framework The ACT full stack MVC framework From f62b6b182107656635583e2c6bd4780e4711c8f9 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 4 Feb 2019 21:41:48 +1100 Subject: [PATCH 348/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fed0bbf80..4dc84ce62 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.18 + 1.8.19-SNAPSHOT ACT Framework The ACT full stack MVC framework From bd92411a69ea5bab58fc0ad7814b0745f9aaf76e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 4 Feb 2019 23:29:35 +1100 Subject: [PATCH 349/730] update VERSION_MATRIX for beetl, beeltsql and ebean --- VERSION_MATRIX.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index f3fdde6cf..9988226ef 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -3,10 +3,10 @@ | act | 1.8.7 | 1.8.8 | 1.8.16 | 1.8.17 | 1.8.18 | | --- | ----: | ----: | ----: | ----: | ----: | | aaa | 1.4.2 | 1.5.2 | 1.5.3 | 1.5.3 | 1.5.4 | -| beetl | 1.4.1 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | -| beetlsql | 1.4.5 | 1.5.3 | 1.5.6 | 1.5.6 | 1.5.6 | +| beetl | 1.4.1 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.7 | +| beetlsql | 1.4.5 | 1.5.3 | 1.5.6 | 1.5.6 | 1.5.7 | | ebean-java7 | 1.5.3 | 1.7.3 | 1.7.5 | 1.7.5 | 1.7.5 | -| ebean(java8) | 1.6.2 | 1.7.3 | 1.7.5 | 1.7.5 | 1.7.5 | +| ebean(java8) | 1.6.2 | 1.7.3 | 1.7.5 | 1.7.5 | 1.7.6 | | eclipselink(java8) | 1.2.3 | 1.5.2 | 1.5.5 | 1.5.6 | 1.5.7 | | excel | 1.4.3 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | | freemarker | 1.3.2 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | From cbf139ed925b9824403bade66d025bd8c52e75b7 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 11 Feb 2019 19:55:30 +1100 Subject: [PATCH 350/730] `@WsEndpoint` annotation now failed to register route #1050 --- CHANGELOG.md | 3 +++ .../act/controller/bytecode/ControllerByteCodeScanner.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24339a5a9..b0d65dd92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # ActFramework Change Log +**1.8.19** +* `@WsEndpoint` annotation now failed to register route #1050 + **1.8.18** 04/Feb/2019 * Fix JobContext init logic * Error enhancing bytecode at com.sun.mail.util.logging.MailHandler::publish() #1048 diff --git a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java index 58f3eae55..47184a54f 100644 --- a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java +++ b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java @@ -902,7 +902,7 @@ private List routers() { final List routers = new ArrayList<>(); final App app = app(); if (null == ports || ports.length == 0) { - if (app().hasMoreRouters()) { + if (!methodNames.isEmpty() && app().hasMoreRouters()) { String className = classInfo.className(); for (String methodName : methodNames) { Router routerX = app.getRouterFor(className, methodName); From 7c161f0588e90d582ac4e03e43822bce6478bc1a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 12 Feb 2019 14:10:06 +1100 Subject: [PATCH 351/730] fix #1052 and #1053 --- CHANGELOG.md | 2 + .../java/act/cli/tree/TreeNodeFilter.java | 6 +- src/main/java/act/route/Router.java | 76 +++++++++++++------ src/main/java/act/route/RouterAdmin.java | 38 +--------- src/main/resources/act.scan.list | 1 + 5 files changed, 61 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0d65dd92..07c199159 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.19** +* Route information missed in API doc for dynamic aliases #1052 +* command `route.print -t` triggers error #1053 * `@WsEndpoint` annotation now failed to register route #1050 **1.8.18** 04/Feb/2019 diff --git a/src/main/java/act/cli/tree/TreeNodeFilter.java b/src/main/java/act/cli/tree/TreeNodeFilter.java index d1a14ba16..f75da80e0 100644 --- a/src/main/java/act/cli/tree/TreeNodeFilter.java +++ b/src/main/java/act/cli/tree/TreeNodeFilter.java @@ -66,7 +66,8 @@ public static TreeNodeFilter pathMatches(final String pattern) { return new TreeNodeFilter() { @Override protected boolean test(List path, TreeNode theNode) { - return path(path, theNode).matches(pattern); + String s = path(path, theNode); + return s.toLowerCase().contains(pattern.toLowerCase()) || s.matches(pattern); } }; } @@ -84,7 +85,8 @@ public static TreeNodeFilter labelMatches(final String pattern) { return new TreeNodeFilter() { @Override protected boolean test(List path, TreeNode theNode) { - return theNode.label().matches(pattern); + String s = theNode.label(); + return s.toLowerCase().contains(pattern.toLowerCase()) || s.matches(pattern); } }; } diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 2e32cd26a..62ea93e8e 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -53,7 +53,7 @@ import javax.enterprise.context.ApplicationScoped; import javax.validation.constraints.NotNull; -public class Router extends AppHolderBase { +public class Router extends AppHolderBase implements TreeNode { public static final String PORT_DEFAULT = "default"; @@ -145,6 +145,26 @@ protected void releaseResources() { appConfig = null; } + @Override + public String id() { + return S.blank(portId) ? "default" : portId; + } + + @Override + public String label() { + return S.concat("Router[", id(), "]"); + } + + @Override + public List children() { + List l = new ArrayList<>(); + l.add(_GET); + l.add(_POST); + l.add(_PUT); + l.add(_DEL); + return l; + } + public String portId() { return portId; } @@ -204,11 +224,8 @@ private void visit(Node node, H.Method method, Visitor visitor) { } visitor.visit(method, node.path(), node.routeSource, handler); } - for (Node child : node.dynamicChilds) { - visit(child, method, visitor); - } - for (Node child : node.staticChildren.values()) { - visit(child, method, visitor); + for (TreeNode child : node.children()) { + visit((Node)child, method, visitor); } } @@ -258,7 +275,7 @@ private RequestHandler getInvokerFrom(Node node) { } RequestHandler handler = node.handler; if (null == handler) { - for (Node targetNode : node.dynamicChilds) { + for (Node targetNode : node.dynamicChildren) { if (Node.MATCH_ALL == targetNode.patternTrait || targetNode.pattern.matcher("").matches()) { return getInvokerFrom(targetNode); } @@ -920,7 +937,7 @@ static Node newRoot(String name, AppConfig config) { private Node root; private Node parent; private transient Node conflictNode; - private List dynamicChilds = new ArrayList<>(); + private List dynamicChildren = new ArrayList<>(); private Map staticChildren = new HashMap<>(); private Map keywordMatchingChildren = new HashMap<>(); private Map dynamicAliases = new HashMap<>(); @@ -1026,7 +1043,7 @@ private void findOutConflictNodes(Set nodes) { nodes.add(staticNode); continue; } - for (Node dynamicNode : parentConflictNode.dynamicChilds) { + for (Node dynamicNode : parentConflictNode.dynamicChildren) { if (metaInfoConflict(dynamicNode.name)) { nodes.add(dynamicNode); } @@ -1058,8 +1075,19 @@ public boolean matches(String chars) { @Override @SuppressWarnings("unchecked") public List children() { - C.List list = (C.List) C.list(staticChildren.values()); - return list.append(dynamicChilds); + Set set = new HashSet<>(); + set.addAll(staticChildren.values()); + set.addAll(dynamicChildren); + List list = new ArrayList<>(); + list.addAll(set); + for (Node node : set) { + for (Node alias : node.dynamicAliases.values()) { + if (!set.contains(alias)) { + list.add(alias); + } + } + } + return list; } public Node child(String name, ActionContext context) { @@ -1073,9 +1101,9 @@ public Node child(String name, ActionContext context) { return node; } } - if (!dynamicChilds.isEmpty()) { + if (!dynamicChildren.isEmpty()) { UrlPath path = context.urlPath(); - for (Node targetNode : dynamicChilds) { + for (Node targetNode : dynamicChildren) { for (Map.Entry entry : targetNode.dynamicAliases.entrySet()) { if (entry.getKey().equals(path)) { targetNode = entry.getValue(); @@ -1126,7 +1154,7 @@ public String id() { @Override public String label() { - StringBuilder sb = S.newBuilder(name); + StringBuilder sb = S.newBuilder(null == name ? "~" + keyword.dashed() + "~" : name); if (null != handler) { sb.append(" -> ").append(RouteInfo.compactHandler(handler.toString())); } @@ -1138,7 +1166,7 @@ protected void releaseResources() { if (null != handler) { handler.destroy(); } - Destroyable.Util.destroyAll(dynamicChilds, ApplicationScoped.class); + Destroyable.Util.destroyAll(dynamicChildren, ApplicationScoped.class); Destroyable.Util.destroyAll(staticChildren.values(), ApplicationScoped.class); staticChildren.clear(); } @@ -1154,8 +1182,8 @@ Node childByMetaInfoExactMatching(String name) { return node; } } - if (!dynamicChilds.isEmpty()) { - for (Node targetNode : dynamicChilds) { + if (!dynamicChildren.isEmpty()) { + for (Node targetNode : dynamicChildren) { if (targetNode.metaInfoMatchesExactly(name)) { return targetNode; } @@ -1165,8 +1193,8 @@ Node childByMetaInfoExactMatching(String name) { } Node childByMetaInfoConflictMatching(String name) { - if (!dynamicChilds.isEmpty()) { - for (Node targetNode : dynamicChilds) { + if (!dynamicChildren.isEmpty()) { + for (Node targetNode : dynamicChildren) { if (targetNode.metaInfoConflict(name)) { return targetNode; } @@ -1205,7 +1233,7 @@ Node addChild(String name, final String path, final String action) { child.conflictNode = conflictNode; if (child.isDynamic()) { boolean isAlias = false; - for (Node targetNode : dynamicChilds) { + for (Node targetNode : dynamicChildren) { if (S.eq(targetNode.patternTrait, child.patternTrait)) { targetNode.dynamicAliases.put(UrlPath.of(path), child); targetNode.dynamicReverseAliases.put(action, child); @@ -1216,9 +1244,9 @@ Node addChild(String name, final String path, final String action) { if (!isAlias) { child.dynamicAliases.put(UrlPath.of(path), child); child.dynamicReverseAliases.put(action, child); - dynamicChilds.add(child); + dynamicChildren.add(child); } - Collections.sort(dynamicChilds); + Collections.sort(dynamicChildren); return child; } else { staticChildren.put(name, child); @@ -1257,7 +1285,7 @@ void debug(H.Method method, PrintStream ps) { for (Node node : staticChildren.values()) { node.debug(method, ps); } - for (Node node : dynamicChilds) { + for (Node node : dynamicChildren) { node.debug(method, ps); } } @@ -1269,7 +1297,7 @@ void debug(H.Method method, List routes) { for (Node node : staticChildren.values()) { node.debug(method, routes); } - for (Node node : dynamicChilds) { + for (Node node : dynamicChildren) { node.debug(method, routes); } } diff --git a/src/main/java/act/route/RouterAdmin.java b/src/main/java/act/route/RouterAdmin.java index 4ca1ea779..50ccec199 100644 --- a/src/main/java/act/route/RouterAdmin.java +++ b/src/main/java/act/route/RouterAdmin.java @@ -21,12 +21,8 @@ */ import act.app.App; -import act.cli.CliContext; -import act.cli.Command; -import act.cli.Optional; -import act.cli.Required; +import act.cli.*; import act.cli.tree.FilteredTreeNode; -import act.cli.tree.TreeNode; import act.cli.tree.TreeNodeFilter; import act.util.PropertySpec; import org.osgl.http.H; @@ -58,38 +54,8 @@ public Object listRoutes( @Optional("specify route filter") String q ) { final Router router = S.blank(name) ? app.router() : app.router(name); - if (S.notBlank(q)) { - if (q.contains(".") || q.contains("[") || q.contains("*")) { - // already regex - } else { - // make it a regex - q = ".*" + q + ".*"; - } - } if (tree) { - TreeNode root = new TreeNode() { - - @Override - public String id() { - return "root"; - } - - @Override - public String label() { - return "Router"; - } - - @Override - public List children() { - List l = new ArrayList<>(); - l.add(router._GET); - l.add(router._POST); - l.add(router._PUT); - l.add(router._DEL); - return l; - } - }; - return S.blank(q) ? root : new FilteredTreeNode(root, TreeNodeFilter.Common.pathMatches(q)); + return S.blank(q) ? router : new FilteredTreeNode(router, TreeNodeFilter.Common.pathMatches(q)); } else { return routeInfoList(name, q); } diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 1af2da1f6..0b314a1a3 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -1,5 +1,6 @@ # Put package/class names that needs Act to scan. It can be regular expressions act\..*Admin +act.route.RouterAdmin$1 act.apidoc.SampleDataProviderFinder act.app.SingletonFinder act.app.util.SimpleRestfulServiceBase From 248506bcf6ea1772ed24537dc99ae15d7630c8d4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 12 Feb 2019 20:31:07 +1100 Subject: [PATCH 352/730] action method parameter cache #1054 --- CHANGELOG.md | 1 + src/main/java/act/inject/param/JsonParamValueLoader.java | 7 +------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07c199159..df2affbbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.19** +* action method parameter cache #1054 * Route information missed in API doc for dynamic aliases #1052 * command `route.print -t` triggers error #1053 * `@WsEndpoint` annotation now failed to register route #1050 diff --git a/src/main/java/act/inject/param/JsonParamValueLoader.java b/src/main/java/act/inject/param/JsonParamValueLoader.java index 20b2cfca2..74d227ccf 100644 --- a/src/main/java/act/inject/param/JsonParamValueLoader.java +++ b/src/main/java/act/inject/param/JsonParamValueLoader.java @@ -45,28 +45,23 @@ public Object get() { private ParamValueLoader fallBack; private BeanSpec spec; private Provider defValProvider; - private boolean isPathVariable; JsonParamValueLoader(ParamValueLoader fallBack, BeanSpec spec, DependencyInjector injector) { this.fallBack = $.requireNotNull(fallBack); this.spec = $.requireNotNull(spec); this.defValProvider = findDefValProvider(spec, injector); ActionContext ctx = ActionContext.current(); - if (null != ctx) { - isPathVariable = ctx.isPathVar(spec.name()); - } } private JsonParamValueLoader(JsonParamValueLoader parent, Class runtimeType) { this.fallBack = parent.fallBack.wrapWithRuntimeType(runtimeType); this.spec = parent.spec; this.defValProvider = parent.defValProvider; - this.isPathVariable = parent.isPathVariable; } @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { - if (isPathVariable) { + if (context instanceof ActionContext && ((ActionContext)context).isPathVar(spec.name())) { return fallBack.load(bean, context, noDefaultValue); } JsonDto dto = context.attribute(JsonDto.CTX_ATTR_KEY); From eb942ea5b1fbba35d4976f6425b2f43dd335acc6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 13 Feb 2019 06:43:40 +1100 Subject: [PATCH 353/730] Error enhancing class with `@Data` annotation #1049 --- CHANGELOG.md | 1 + .../java/act/util/DataObjectEnhancer.java | 8 +++- testapps/GHIssues/pom.xml | 4 +- .../src/main/java/ghissues/gh1049/Policy.java | 41 +++++++++++++++++++ .../java/ghissues/gh1049/QuotePolicyBase.java | 12 ++++++ .../src/main/java/ghissues/gh1049/Test.java | 15 +++++++ .../java/ghissues/gh1049/UcModelBase.java | 21 ++++++++++ .../main/resources/test/scenarios/1049.yml | 15 +++++++ 8 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1049/Policy.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1049/QuotePolicyBase.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1049/Test.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1049/UcModelBase.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1049.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index df2affbbe..983c0d93a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.19** +* Error enhancing class with `@Data` annotation #1049 * action method parameter cache #1054 * Route information missed in API doc for dynamic aliases #1052 * command `route.print -t` triggers error #1053 diff --git a/src/main/java/act/util/DataObjectEnhancer.java b/src/main/java/act/util/DataObjectEnhancer.java index cc51ca568..ce8b2206f 100644 --- a/src/main/java/act/util/DataObjectEnhancer.java +++ b/src/main/java/act/util/DataObjectEnhancer.java @@ -193,6 +193,10 @@ private void generateHashCodeMethod() { Type host = metaInfo.type(); List fields = metaInfo.fields(); int fieldCount = fieldCount(fields); + boolean shouldCallSuper = shouldCallSuper(fieldCount); + if (shouldCallSuper) { + fieldCount++; + } if (fieldCount < 6) { int cnt = 0; for (ObjectMetaInfo.FieldMetaInfo fi : fields) { @@ -201,7 +205,7 @@ private void generateHashCodeMethod() { cnt++; } } - if (shouldCallSuper(fieldCount)) { + if (shouldCallSuper) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, metaInfo.superType().getInternalName(), "hashCode", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); @@ -223,7 +227,7 @@ private void generateHashCodeMethod() { mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z", true); mv.visitInsn(POP); } - if (shouldCallSuper(fieldCount)) { + if (shouldCallSuper) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, metaInfo.superType().getInternalName(), "hashCode", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index e660045fa..58cddf790 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.17.1 + 1.8.18.0 @@ -25,7 +25,7 @@ org.actframework act - 1.8.18-SNAPSHOT + 1.8.19-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1049/Policy.java b/testapps/GHIssues/src/main/java/ghissues/gh1049/Policy.java new file mode 100644 index 000000000..b805817d5 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1049/Policy.java @@ -0,0 +1,41 @@ +package ghissues.gh1049; + +import com.alibaba.fastjson.JSONObject; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.osgl.$; + +public class Policy { + public Integer policyId; + public Integer clientId; + public Integer productId; + public String effectiveDate; + public JSONObject needs; + + public DateTime effectiveDate() { + if (null == effectiveDate) { + return null; + } + DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); + return fmt.parseDateTime(effectiveDate); + } + + @Override + public int hashCode() { + return $.hc(getClass(), policyId); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj instanceof Policy) { + Policy that = $.cast(obj); + return $.eq(that.policyId, this.policyId); + } + return false; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1049/QuotePolicyBase.java b/testapps/GHIssues/src/main/java/ghissues/gh1049/QuotePolicyBase.java new file mode 100644 index 000000000..d056abb6c --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1049/QuotePolicyBase.java @@ -0,0 +1,12 @@ +package ghissues.gh1049; + +import act.data.annotation.Data; + +@Data(callSuper = false) +public class QuotePolicyBase extends UcModelBase { + public Integer clientId; + public Integer productId; + public String clientName; + public String effectiveDate; + public String needs; +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1049/Test.java b/testapps/GHIssues/src/main/java/ghissues/gh1049/Test.java new file mode 100644 index 000000000..a6154d7c4 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1049/Test.java @@ -0,0 +1,15 @@ +package ghissues.gh1049; + +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1049") +public class Test extends BaseController { + + @PostAction + public Policy post(Policy policy) { + return policy; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1049/UcModelBase.java b/testapps/GHIssues/src/main/java/ghissues/gh1049/UcModelBase.java new file mode 100644 index 000000000..b53104fd2 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1049/UcModelBase.java @@ -0,0 +1,21 @@ +package ghissues.gh1049; + +import act.util.AdaptiveBean; + +public class UcModelBase extends AdaptiveBean { + @Override + public int hashCode() { + return asMap().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return false; + } + if (obj.getClass().equals(getClass())) { + return ((UcModelBase) obj).asMap().equals(asMap()); + } + return false; + } +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1049.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1049.yml new file mode 100644 index 000000000..a5bf3cd4d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1049.yml @@ -0,0 +1,15 @@ +Scenario(1049): + description: "[1049] Error enhancing class with `@Data` annotation" + interactions: + - description: Test + request: + post: /1049 + json: + policyId: 1 + clientId: 1 + productId: 1 + response: + json: + policyId: 1 + clientId: 1 + productId: 1 From a23bbb59a41101c6a2d27c4b52cfed4e758adff8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 13 Feb 2019 07:15:40 +1100 Subject: [PATCH 354/730] Allow app to configure automate test http request timeout #1051 --- CHANGELOG.md | 1 + src/main/java/act/conf/AppConfig.java | 28 ++++++++++++++++++- src/main/java/act/conf/AppConfigKey.java | 7 +++++ src/main/java/act/conf/ConfigKeyHelper.java | 4 +-- src/main/java/act/test/Scenario.java | 2 +- .../src/main/resources/conf/app.properties | 1 + 6 files changed, 39 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 983c0d93a..8d35fe57c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.19** +* Allow app to configure automate test http request timeout #1051 * Error enhancing class with `@Data` annotation #1049 * action method parameter cache #1054 * Route information missed in API doc for dynamic aliases #1052 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 09dc77690..6492c37c6 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -2471,7 +2471,33 @@ public boolean needEnhancement(String className) { return CONTROLLER_CLASS_TESTER; } - private TemplatePathResolver templatePathResolver = null; + private Integer testTimeout; + + protected T testTimeout(int timeout) { + if (timeout < 10) { + logger.warn("test.timeout reset to minimum value: 10"); + timeout = 10; + } + testTimeout = timeout; + return me(); + } + + public int testTimeout() { + if (null == testTimeout) { + int defTimeout = ("e2e".equalsIgnoreCase(Act.profile()) || "test".equalsIgnoreCase(Act.profile())) ? 10 : 60 * 60; + testTimeout = get(TEST_TIMEOUT, defTimeout); + this.testTimeout(testTimeout); // make sure we have a valid number + } + return testTimeout; + } + + private void _mergeTestTimeout(AppConfig conf) { + if (!hasConfiguration(TEST_TIMEOUT)) { + testTimeout = conf.testTimeout; + } + } + + private TemplatePathResolver templatePathResolver; protected T templatePathResolver(TemplatePathResolver resolver) { E.NPE(resolver); diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 783511497..30c50648e 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -1201,6 +1201,13 @@ public T val(Map configuration) { */ TEMPLATE_HOME("template.home"), + /** + * `test.timeout` specifies automate test http agent timeout in seconds + * + * Default value: 60 * 60 (i.e. 1 hour) in dev mode, 10 in automate test mode + */ + TEST_TIMEOUT("test.timeout"), + /** * `trace.handler.enabled` turn on/off handle invocation calls. * diff --git a/src/main/java/act/conf/ConfigKeyHelper.java b/src/main/java/act/conf/ConfigKeyHelper.java index fe8dd4fc6..5137111e7 100644 --- a/src/main/java/act/conf/ConfigKeyHelper.java +++ b/src/main/java/act/conf/ConfigKeyHelper.java @@ -92,7 +92,7 @@ T getConfiguration(String key, $.F0 defVal, Map configuration) if (key.endsWith(".long")) { return (T) getX(configuration, key, suffixOf(key), defVal, F.TO_LONG); } - if (key.endsWith(".int") || key.endsWith(".ttl") || key.endsWith(".len") || key.endsWith(".count") || key.endsWith(".times") || key.endsWith(".size") || key.endsWith(".port")) { + if (key.endsWith(".int") || key.endsWith(".ttl") || key.endsWith(".len") || key.endsWith(".count") || key.endsWith(".times") || key.endsWith(".size") || key.endsWith(".port") || key.endsWith(".timeout")) { return (T) getX(configuration, key, suffixOf(key), defVal, F.TO_INT); } if (key.endsWith(".float")) { @@ -109,7 +109,7 @@ static Set suffixes() { return SUFFIXES; } - private static final Set NON_ALIAS_SUFFIXES = C.set(S.fastSplit("dir,home,path,ttl,port,len,count,times,size", ",")); + private static final Set NON_ALIAS_SUFFIXES = C.set(S.fastSplit("dir,home,path,ttl,port,len,count,times,size,timeout", ",")); static Set nonAliasSuffixes() { return NON_ALIAS_SUFFIXES; } diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 94a0b1d0f..82e452318 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -495,7 +495,7 @@ private boolean verify(RequestSpec req, String operation) { } private void prepareHttp() { - long timeout = ("e2e".equalsIgnoreCase(Act.profile()) || "test".equalsIgnoreCase(Act.profile())) ? 10 : 60 * 60; + long timeout = app.config().testTimeout(); http = new OkHttpClient.Builder() .cookieJar(cookieStore()) .connectTimeout(timeout, TimeUnit.SECONDS) diff --git a/testapps/GHIssues/src/main/resources/conf/app.properties b/testapps/GHIssues/src/main/resources/conf/app.properties index 374ebade4..b84797147 100644 --- a/testapps/GHIssues/src/main/resources/conf/app.properties +++ b/testapps/GHIssues/src/main/resources/conf/app.properties @@ -1,3 +1,4 @@ +test.timeout=1 api_doc=true globalReturnValueAdvice=ghissues.Gh835$GlobalAdvice globalValidateViolateAdvice=ghissues.Gh922$GlobalAdvice From 537d080ab93b84fbfc4dbd962909ff8c412389ea Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 13 Feb 2019 14:34:43 +1100 Subject: [PATCH 355/730] Test yaml - variable not evaluated when putting in an array #1055 --- CHANGELOG.md | 1 + legacy-testapp/pom.xml | 2 +- src/main/java/act/test/Scenario.java | 3 +- testapps/GHIssues/pom.xml | 8 ++++- .../src/main/java/ghissues/Gh1026.java | 32 +++++++++++++++++++ .../main/resources/test/scenarios/1026.yml | 24 ++++++++++++++ 6 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1026.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1026.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d35fe57c..fb17f056b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.19** +* Test yaml - variable not evaluated when putting in an array #1055 * Allow app to configure automate test http request timeout #1051 * Error enhancing class with `@Data` annotation #1049 * action method parameter cache #1054 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 26b76e6cf..21ac381ec 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.18-SNAPSHOT + 1.8.19-SNAPSHOT [0.13.0, 2.0.0) 1.6.6-SNAPSHOT testapp.TestApp diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 82e452318..fd3c527ff 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -198,7 +198,8 @@ private void processParamSubstitution(Map params) { } else if (val instanceof Map) { processParamSubstitution((Map) val); } else if (val instanceof Collection) { - processParamSubstitution((Collection) val); + val = processParamSubstitution((Collection) val); + entry.setValue(val); } } } diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 58cddf790..b494952cb 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -5,7 +5,7 @@ 4.0.0 act-ghissues - 1.8.16.0 + 1.8.19.0 ActFramework Github Issue Reproduce App @@ -40,6 +40,12 @@ hutool-all [4.1.12,) + + com.google.guava + guava + 27.0.1-jre + bundle + diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1026.java b/testapps/GHIssues/src/main/java/ghissues/Gh1026.java new file mode 100644 index 000000000..5f0f9bb03 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1026.java @@ -0,0 +1,32 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1026") +public class Gh1026 extends BaseController { + + public static class Foo { + public Multimap permissions = ArrayListMultimap.create(); + } + + @PostAction + public Foo test(Foo foo) { + return foo; + } + + @GetAction + public Foo get() { + Foo foo = new Foo(); + foo.permissions.put("admin", "admin.create"); + foo.permissions.put("admin", "admin.update"); + foo.permissions.put("admin", "admin.delete"); + foo.permissions.put("user", "user.create"); + foo.permissions.put("user", "user.delete"); + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1026.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1026.yml new file mode 100644 index 000000000..46b2f407c --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1026.yml @@ -0,0 +1,24 @@ +# The issue cannot be closed till Fastjson provide deserialization support for multi-map +#Scenario(1026): +# description: "[1026] act post could not support Multimap type" +# interactions: +# - description: Test +# request: +# post: /1026 +# params: +# permissions: +# admin: +# - "admin.create" +# - "admin.read" +# - "admin.update" +# - "admin.delete" +# user: +# - "user.create" +# - "user.read" +# - "user.update" +# - "user.delete" +# response: +# json: +# permissions: +# admin: +# ?: "admin.create" From fa727654879e44e59fa632692d7805d067bd986c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 13 Feb 2019 20:49:39 +1100 Subject: [PATCH 356/730] update dependency versions; update VERSION_MATRIX and README - prepare for 1.8.19 release --- CHANGELOG.md | 1 + README.md | 10 +++++----- VERSION_MATRIX.md | 40 +++++++++++++++++++-------------------- pom.xml | 8 ++++---- testapps/GHIssues/pom.xml | 1 - 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb17f056b..a3cba14ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.19** +* Update dependency versions * Test yaml - variable not evaluated when putting in an array #1055 * Allow app to configure automate test http request timeout #1051 * Error enhancing class with `@Data` annotation #1049 diff --git a/README.md b/README.md index 030d4bdf4..8c26e9922 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.18.0 + 1.8.19.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.18.0 + -DarchetypeVersion=1.8.19.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.18.0 + -DarchetypeVersion=1.8.19.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.18.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.19.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.18.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.19.0 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 9988226ef..5a599468a 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,25 +1,25 @@ # Version Matrix -| act | 1.8.7 | 1.8.8 | 1.8.16 | 1.8.17 | 1.8.18 | -| --- | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.4.2 | 1.5.2 | 1.5.3 | 1.5.3 | 1.5.4 | -| beetl | 1.4.1 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.7 | -| beetlsql | 1.4.5 | 1.5.3 | 1.5.6 | 1.5.6 | 1.5.7 | -| ebean-java7 | 1.5.3 | 1.7.3 | 1.7.5 | 1.7.5 | 1.7.5 | -| ebean(java8) | 1.6.2 | 1.7.3 | 1.7.5 | 1.7.5 | 1.7.6 | -| eclipselink(java8) | 1.2.3 | 1.5.2 | 1.5.5 | 1.5.6 | 1.5.7 | -| excel | 1.4.3 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | -| freemarker | 1.3.2 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | -| hibernate | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.5 | 1.5.6 | -| jax-rs(java8) | 1.0.2 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | -| jpa-common | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.5 | 1.5.6 | -| morphia | 1.4.2 | 1.6.2 | 1.6.5 | 1.6.6 | 1.6.6 | -| mustache(java8) | 1.4.2 | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.5 | -| social | 0.12.2 | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.5 | -| sql-common | 1.3.3 | 1.4.3 | 1.4.4 | 1.4.4 | 1.4.4 | -| storage(java8) | 0.13.2 | 0.13.5 | 0.13.5 | 0.13.5 | 0.13.5 | -| thymeleaf | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | -| velocity | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | +| act | 1.8.7 | 1.8.8 | 1.8.16 | 1.8.17 | 1.8.18 | 1.8.19 | +| --- | ----: | ----: | ----: | ----: | ----: | ----: | +| aaa | 1.4.2 | 1.5.2 | 1.5.3 | 1.5.3 | 1.5.4 | 1.5.4 | +| beetl | 1.4.1 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.7 | 1.4.7 | +| beetlsql | 1.4.5 | 1.5.3 | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | +| ebean-java7 | 1.5.3 | 1.7.3 | 1.7.5 | 1.7.5 | 1.7.5 | 1.7.5 | +| ebean(java8) | 1.6.2 | 1.7.3 | 1.7.5 | 1.7.5 | 1.7.6 | 1.7.6 | +| eclipselink(java8) | 1.2.3 | 1.5.2 | 1.5.5 | 1.5.6 | 1.5.7 | 1.5.7 | +| excel | 1.4.3 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | +| freemarker | 1.3.2 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | +| hibernate | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.5 | 1.5.6 | 1.5.6 | +| jax-rs(java8) | 1.0.2 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | +| jpa-common | 1.2.3 | 1.5.2 | 1.5.4 | 1.5.5 | 1.5.6 | 1.5.6 | +| morphia | 1.4.2 | 1.6.2 | 1.6.5 | 1.6.6 | 1.6.6 | 1.6.6 | +| mustache(java8) | 1.4.2 | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.5 | +| social | 0.12.2 | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.5 | +| sql-common | 1.3.3 | 1.4.3 | 1.4.4 | 1.4.4 | 1.4.4 | 1.4.4 | +| storage(java8) | 0.13.2 | 0.13.5 | 0.13.5 | 0.13.5 | 0.13.5 | 0.13.5 | +| thymeleaf | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | +| velocity | 1.3.2 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | ## Note diff --git a/pom.xml b/pom.xml index 4dc84ce62..bd16233b8 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ 1.0.0.Final 2.10.1 1.11.3 - 3.10.0 + 3.13.1 1.19.1 1.6.0 1.9.4 @@ -71,12 +71,12 @@ 1.8.0 1.3.1 0.0.1 - 1.11.7 + 1.11.8 1.3.0 1.1.0.Final - 1.4.26.Final + 1.4.27.Final 1.23 - 3.3.2 + 3.3.3 diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index b494952cb..bb814dcc3 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -44,7 +44,6 @@ com.google.guava guava 27.0.1-jre - bundle From e09438ddc29ab34fc95e736f8052e9f9151385cf Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 13 Feb 2019 20:51:02 +1100 Subject: [PATCH 357/730] [maven-release-plugin] prepare release act-1.8.19 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bd16233b8..f6f74691e 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.19-SNAPSHOT + 1.8.19 ACT Framework The ACT full stack MVC framework From 738079ce6c0ff2579f178d8600bad71806dfe82e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 13 Feb 2019 20:51:19 +1100 Subject: [PATCH 358/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f6f74691e..72bd5e41e 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.19 + 1.8.20-SNAPSHOT ACT Framework The ACT full stack MVC framework From 980283e504fc1f4e63402612df0195c4f6cce61f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 13 Feb 2019 21:58:17 +1100 Subject: [PATCH 359/730] add timestamp to CHANGELOG for 1.8.19 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3cba14ce..79560e535 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.19** +**1.8.19** 13/Feb/2019 * Update dependency versions * Test yaml - variable not evaluated when putting in an array #1055 * Allow app to configure automate test http request timeout #1051 From 4ae962e1a05ddceae2d754dda3adba121513337e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 18 Feb 2019 21:10:24 +1100 Subject: [PATCH 360/730] fix #1059 and #1060 --- CHANGELOG.md | 5 +++++ src/main/java/act/apidoc/Endpoint.java | 7 ++++++- src/main/java/act/app/AppCompiler.java | 4 ++-- src/main/java/act/metric/MetricInfo.java | 1 + src/main/java/act/metric/MetricInfoTree.java | 4 ++-- src/main/java/act/metric/SimpleMetricPlugin.java | 2 +- src/main/java/act/xio/NetworkHandler.java | 2 +- .../resources/asset/~act/apibook/endpoint_list.tag | 11 ++++++++++- 8 files changed, 28 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79560e535..f089893d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # ActFramework Change Log +**1.8.20** +* API book - Module name shall include enclosing class #1059 +* API doc - line breaks in param description get removed #1060 +* metric command stop working #1058 + **1.8.19** 13/Feb/2019 * Update dependency versions * Test yaml - variable not evaluated when putting in an array #1055 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index ea210deb1..c55f15e5e 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -100,7 +100,7 @@ public String getDescription() { } public void setDescription(String description) { - this.description = description; + this.description = description.replaceAll("\\n\\s+","\n"); } public boolean isRequired() { @@ -367,6 +367,11 @@ private void explore(RequestHandler handler) { } private String inferModule(Class controllerClass) { + Class enclosingClass = controllerClass.getEnclosingClass(); + if (null != enclosingClass) { + String enclosingModule = inferModule(enclosingClass); + return S.concat(enclosingModule, ".", controllerClass.getSimpleName()); + } return controllerClass.getSimpleName(); } diff --git a/src/main/java/act/app/AppCompiler.java b/src/main/java/act/app/AppCompiler.java index ee2c38ee3..21b7fdea2 100644 --- a/src/main/java/act/app/AppCompiler.java +++ b/src/main/java/act/app/AppCompiler.java @@ -24,7 +24,7 @@ import act.Act; import act.conf.AppConfig; -import act.metric.Metric; +import act.metric.*; import act.metric.Timer; import act.util.LogSupportedDestroyableBase; import org.eclipse.jdt.core.compiler.IProblem; @@ -60,7 +60,7 @@ class AppCompiler extends LogSupportedDestroyableBase { this.classLoader = classLoader; this.app = classLoader.app(); this.conf = app.config(); - this.metric = Act.metricPlugin().metric("act.classload.compile"); + this.metric = Act.metricPlugin().metric(MetricInfo.CLASS_LOADING); configureCompilerOptions(); } diff --git a/src/main/java/act/metric/MetricInfo.java b/src/main/java/act/metric/MetricInfo.java index e93d92673..edca2b8e5 100644 --- a/src/main/java/act/metric/MetricInfo.java +++ b/src/main/java/act/metric/MetricInfo.java @@ -26,6 +26,7 @@ public class MetricInfo { public static final String HTTP_HANDLER = "act:http"; public static final String CLASS_LOADING = "act:classload"; + public static final String COMPILING = CLASS_LOADING + Metric.PATH_SEPARATOR + "compile"; public static final String JOB_HANDLER = "act:job"; public static final String CLI_HANDLER = "act:cli"; public static final String MAILER = "act:mail"; diff --git a/src/main/java/act/metric/MetricInfoTree.java b/src/main/java/act/metric/MetricInfoTree.java index cabcca764..725189ba6 100644 --- a/src/main/java/act/metric/MetricInfoTree.java +++ b/src/main/java/act/metric/MetricInfoTree.java @@ -161,14 +161,14 @@ public TreeNode transform(TreeNode treeNode) { } - static final NodeDecorator COUNTER = new NodeDecorator(new $.Transformer() { + public static final NodeDecorator COUNTER = new NodeDecorator(new $.Transformer() { @Override public String transform(MetricInfo metricInfo) { return S.fmt("%s: %s", metricInfo.getName(), metricInfo.getCountAsStr()); } }); - static final NodeDecorator TIMER = new NodeDecorator(new $.Transformer() { + public static final NodeDecorator TIMER = new NodeDecorator(new $.Transformer() { @Override public String transform(MetricInfo metricInfo) { return S.fmt("%s: %s / %s = %s", metricInfo.getName(), metricInfo.getAccumulated(), metricInfo.getCountAsStr(), metricInfo.getAvg()); diff --git a/src/main/java/act/metric/SimpleMetricPlugin.java b/src/main/java/act/metric/SimpleMetricPlugin.java index bf7b27396..b9c2cfaad 100644 --- a/src/main/java/act/metric/SimpleMetricPlugin.java +++ b/src/main/java/act/metric/SimpleMetricPlugin.java @@ -49,7 +49,7 @@ public Metric metric(String name) { } Logger logger = enabledMap.get(name); if (null == logger) { - logger = LogManager.get("metric." + name); + logger = LogManager.get("act.metric." + name); enabledMap.put(name, logger); } return logger.isTraceEnabled() ? metric() : Metric.NULL_METRIC; diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index c284f8470..b7905fe88 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -62,7 +62,7 @@ public class NetworkHandler extends LogSupportedDestroyableBase { public NetworkHandler(App app) { E.NPE(app); this.app = app; - this.metric = Act.metricPlugin().metric("act.http"); + this.metric = Act.metricPlugin().metric(MetricInfo.HTTP_HANDLER); this.initUrlProcessors(); app.registerHotReloadListener(new App.HotReloadListener() { @Override diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index 46a9fc078..e0477153c 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -28,7 +28,7 @@ { defaultValue } N/A - { description } +
                                                                                                                                                                      { description }
                                                                                                                                                                      @@ -96,6 +96,11 @@ td { font-weight: 300; padding-bottom: 0; + vertical-align: top; + } + + td:not(:first-child) { + font-family: monospace; } td:first-child, th:first-child { @@ -109,6 +114,10 @@ width: 100%; } + td pre { + margin-top: 0; + } + div.endpoint { padding-bottom: 25px; border-bottom: 1px solid #aaa; From 9f2c13597668c1854694036fa48685876aca00db Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 21 Feb 2019 21:17:48 +1100 Subject: [PATCH 361/730] fix #1065 and #1062 --- CHANGELOG.md | 2 ++ .../bytecode/ControllerByteCodeScanner.java | 7 +++++ src/main/java/act/test/RequestSpec.java | 1 + src/main/java/act/test/Scenario.java | 31 +++++++++++++++++++ testapps/GHIssues/pom.xml | 4 +-- .../src/main/java/ghissues/Gh1061.java | 18 +++++++++++ .../main/resources/test/scenarios/1061.yml | 11 +++++++ 7 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1061.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1061.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index f089893d8..406445078 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.20** +* envMatches in ControllerByteCodeScanner shall be reset upon scanning new class #1065 +* Act-Test - support post XML encoded body #1062 * API book - Module name shall include enclosing class #1059 * API doc - line breaks in param description get removed #1060 * metric command stop working #1058 diff --git a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java index 47184a54f..5f86388ac 100644 --- a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java +++ b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java @@ -68,6 +68,13 @@ protected boolean shouldScan(String className) { return possibleController; } + @Override + protected void reset(String className) { + super.reset(className); + envMatches = $.var(true); + eav = null; + } + @Override protected void onAppSet() { router = app().router(); diff --git a/src/main/java/act/test/RequestSpec.java b/src/main/java/act/test/RequestSpec.java index 43af2f370..01850ea2d 100644 --- a/src/main/java/act/test/RequestSpec.java +++ b/src/main/java/act/test/RequestSpec.java @@ -61,6 +61,7 @@ public class RequestSpec implements InteractionPart { public Map headers = new LinkedHashMap<>(); public Map parts = new LinkedHashMap<>(); public Object json; + public Object xml; private boolean resolved; diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index fd3c527ff..42c179b4e 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -145,8 +145,11 @@ private class RequestBuilder { case PATCH: RequestBody body = EMPTY_BODY; String jsonBody = verifyJsonBody(requestSpec.json); + String xmlBody = verifyXmlBody(requestSpec.xml); if (S.notBlank(jsonBody)) { body = RequestBody.create(MediaType.parse("application/json"), jsonBody); + } else if (S.notBlank(xmlBody)) { + body = RequestBody.create(MediaType.parse("text/xml"), xmlBody); } else if (hasParams) { FormBody.Builder formBuilder = new FormBody.Builder(); for (Map.Entry entry : requestSpec.params.entrySet()) { @@ -257,6 +260,34 @@ private String verifyJsonBody(Object jsonBody) { return s; } + private String verifyXmlBody(Object xmlBody) { + JSON json = null; + if (xmlBody instanceof Map) { + processParamSubstitution((Map) xmlBody); + json = JSON.parseObject(JSON.toJSONString(xmlBody)); + } else if (xmlBody instanceof Collection) { + xmlBody = processParamSubstitution((Collection) xmlBody); + json = JSON.parseArray(JSON.toJSONString(xmlBody)); + } + String s = null == xmlBody ? "" : (xmlBody instanceof String) ? (String) xmlBody : XML.toString($.convert(json).to(org.w3c.dom.Document.class)); + if (S.blank(s)) { + return ""; + } + final String origin = s; + if (s.startsWith("resource:")) { + s = S.ensure(s.substring(9).trim()).startWith("/"); + URL url = Act.getResource(s); + E.unexpectedIf(null == url, "Cannot find JSON body: " + origin); + s = IO.read(url).toString(); + } + try { + XML.read(s); + } catch (Exception e) { + E.unexpected(e, "Invalid JSON body: " + origin); + } + return s; + } + } diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index bb814dcc3..42e7221dd 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.18.0 + 1.8.19.0 @@ -25,7 +25,7 @@ org.actframework act - 1.8.19-SNAPSHOT + 1.8.20-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1061.java b/testapps/GHIssues/src/main/java/ghissues/Gh1061.java new file mode 100644 index 000000000..cd46e5bee --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1061.java @@ -0,0 +1,18 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1061") +public class Gh1061 extends BaseController { + + public static class Foo { + public String name; + } + + @PostAction + public Foo test(Foo foo) { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1061.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1061.yml new file mode 100644 index 000000000..14c599818 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1061.yml @@ -0,0 +1,11 @@ +Scenario(1061): + description: "[1061] act1.8.17 Document Class Object conflict" + interactions: + - description: Test + request: + post: /1061 + xml: + name: bar + response: + json: + name: bar From 1a46244c4f8a4645fa007917ef098ad0ca6ac8b9 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 21 Feb 2019 22:00:18 +1100 Subject: [PATCH 362/730] RouteAdmin - simple match q param; Improve cli cursor handling --- src/main/java/act/cli/CliSession.java | 10 +--------- src/main/java/act/cli/builtin/IterateCursor.java | 6 ++++++ src/main/java/act/handler/CliHandler.java | 7 +++++++ src/main/java/act/handler/CliHandlerBase.java | 7 ++++++- src/main/java/act/route/RouterAdmin.java | 4 +++- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/act/cli/CliSession.java b/src/main/java/act/cli/CliSession.java index eb2dec74a..30ae72aa8 100644 --- a/src/main/java/act/cli/CliSession.java +++ b/src/main/java/act/cli/CliSession.java @@ -22,7 +22,6 @@ import act.Destroyable; import act.app.*; -import act.cli.builtin.IterateCursor; import act.cli.event.CliSessionStart; import act.cli.event.CliSessionTerminate; import act.cli.util.CliCursor; @@ -237,15 +236,8 @@ public void stop(String message) { } void handler(CliHandler handler) { - if (handler == IterateCursor.INSTANCE) { - return; - } - if (null == this.handler || S.string(this.handler).equals(S.string(handler))) { - this.handler = handler; - return; - } + handler.resetCursor(this); this.handler = handler; - removeCursor(); } private static void printBanner(String banner, ConsoleReader console) throws IOException { diff --git a/src/main/java/act/cli/builtin/IterateCursor.java b/src/main/java/act/cli/builtin/IterateCursor.java index 74c6c13e5..e2ce44ad8 100644 --- a/src/main/java/act/cli/builtin/IterateCursor.java +++ b/src/main/java/act/cli/builtin/IterateCursor.java @@ -21,6 +21,7 @@ */ import act.cli.CliContext; +import act.cli.CliSession; import act.cli.util.CliCursor; import act.handler.CliHandlerBase; import act.util.PropertySpec; @@ -49,6 +50,11 @@ public void handle(CliContext context) { } } + @Override + public void resetCursor(CliSession session) { + // do not reset cursor for this particular handler + } + private Object readResolve() { return INSTANCE; } diff --git a/src/main/java/act/handler/CliHandler.java b/src/main/java/act/handler/CliHandler.java index ec9e5527e..180f5b8c0 100644 --- a/src/main/java/act/handler/CliHandler.java +++ b/src/main/java/act/handler/CliHandler.java @@ -23,6 +23,7 @@ import act.Act; import act.Destroyable; import act.cli.CliContext; +import act.cli.CliSession; import org.osgl.$; import java.util.List; @@ -87,4 +88,10 @@ public interface CliHandler extends $.Function, Destroyable { * @return {@code true} if this handler applied in the mode, or {@code false} otherwise */ boolean appliedIn(Act.Mode mode); + + /** + * Reset session cursor + * @param session CLI session + */ + void resetCursor(CliSession session); } diff --git a/src/main/java/act/handler/CliHandlerBase.java b/src/main/java/act/handler/CliHandlerBase.java index eaf343e74..e011462e1 100644 --- a/src/main/java/act/handler/CliHandlerBase.java +++ b/src/main/java/act/handler/CliHandlerBase.java @@ -22,11 +22,12 @@ import act.Act; import act.cli.CliContext; +import act.cli.CliSession; import org.osgl.$; import org.osgl.exception.NotAppliedException; -import javax.enterprise.context.ApplicationScoped; import java.lang.annotation.Annotation; +import javax.enterprise.context.ApplicationScoped; public abstract class CliHandlerBase extends $.F1 implements CliHandler { @@ -65,4 +66,8 @@ public boolean isDestroyed() { } protected void releaseResources() {} + + public void resetCursor(CliSession session) { + session.removeCursor(); + } } diff --git a/src/main/java/act/route/RouterAdmin.java b/src/main/java/act/route/RouterAdmin.java index 50ccec199..b2b146bbc 100644 --- a/src/main/java/act/route/RouterAdmin.java +++ b/src/main/java/act/route/RouterAdmin.java @@ -67,7 +67,9 @@ private List routeInfoList(String portName, String q) { if (S.notBlank(q)) { List toBeRemoved = new ArrayList<>(); for (RouteInfo info: list) { - if (info.path().matches(q) || S.string(info.handler()).matches(q)) { + String handler = S.string(info.handler()); + String path = info.path(); + if (path.contains(q) || handler.contains(q) || path.matches(q) || handler.matches(q)) { continue; } toBeRemoved.add(info); From bf9416637954b54698d9e95d65952398522665a0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 23 Feb 2019 21:48:33 +1100 Subject: [PATCH 363/730] improve metric timer list output; add automate test cases for 1058# --- CHANGELOG.md | 1 + src/main/java/act/metric/DurationScale.java | 4 ++-- src/main/resources/act.scan.list | 2 +- .../src/main/java/ghissues/Gh1058.java | 20 +++++++++++++++++++ .../main/resources/test/scenarios/1058.yml | 9 +++++++++ 5 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1058.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1058.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 406445078..06c330816 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Improve metric timer * envMatches in ControllerByteCodeScanner shall be reset upon scanning new class #1065 * Act-Test - support post XML encoded body #1062 * API book - Module name shall include enclosing class #1059 diff --git a/src/main/java/act/metric/DurationScale.java b/src/main/java/act/metric/DurationScale.java index 79d5e4222..98c00e5d4 100644 --- a/src/main/java/act/metric/DurationScale.java +++ b/src/main/java/act/metric/DurationScale.java @@ -24,8 +24,8 @@ import org.osgl.util.S; enum DurationScale { - ns(1), - ms(1000L * 1000L), + ns("ns", 1), + ms("ms", 1000L * 1000L), second("s", 1000L * 1000L * 1000L), minute("min", 1000L * 1000L * 1000L * 60L), hour("h", 1000L * 1000L * 1000L * 60L * 60L), diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 0b314a1a3..da1af5efd 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -1,6 +1,6 @@ # Put package/class names that needs Act to scan. It can be regular expressions act\..*Admin -act.route.RouterAdmin$1 +act\..*Admin\$.* act.apidoc.SampleDataProviderFinder act.app.SingletonFinder act.app.util.SimpleRestfulServiceBase diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1058.java b/testapps/GHIssues/src/main/java/ghissues/Gh1058.java new file mode 100644 index 000000000..e24e24a96 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1058.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.metric.MetricAdmin; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; + +@UrlContext("1058") +public class Gh1058 extends BaseController { + + @Inject + MetricAdmin metricAdmin; + + @GetAction + public Object metric() { + return metricAdmin.getTimers(1, false, 2, null, false); + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1058.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1058.yml new file mode 100644 index 000000000..71f67f4e0 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1058.yml @@ -0,0 +1,9 @@ +Scenario(1058): + description: "[1058] metric command stop working" + interactions: + - description: test + request: + get: 1058 + response: + json: + size: 1 From e7646033b3f965ab41af03652a05bd309dbec704 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 24 Feb 2019 09:44:13 +1100 Subject: [PATCH 364/730] Multiple improvements on sys admin command #1068 --- CHANGELOG.md | 17 +++++++++ src/main/java/act/SysUtilAdmin.java | 22 ++++++++++-- src/main/java/act/app/App.java | 2 +- src/main/java/act/app/DaemonAdmin.java | 23 ++++++++---- src/main/java/act/cli/builtin/Help.java | 36 ++++++++++--------- src/main/java/act/conf/AppConfigKey.java | 10 ++++-- src/main/java/act/conf/ConfAdmin.java | 11 ++++-- src/main/java/act/conf/Config.java | 2 +- .../java/act/data/DataPropertyRepository.java | 1 + src/main/java/act/job/Job.java | 2 +- src/main/java/act/job/JobAdmin.java | 5 +-- src/main/java/act/job/JobManager.java | 4 +-- src/main/java/act/metric/MetricAdmin.java | 4 +-- src/main/java/act/plugin/Plugin.java | 2 +- src/main/java/act/plugin/PluginAdmin.java | 15 ++++++-- src/main/java/act/route/RouterAdmin.java | 2 +- .../java/act/ws/WebSocketAdminConsole.java | 4 +-- 17 files changed, 114 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06c330816..6390722a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,23 @@ # ActFramework Change Log **1.8.20** +* Multiple improvements on sys admin command #1068 + + simplified command name aliases for system command: xxx.list + - route.list -> route or routes + - metric.timer.list -> metric.timer + or metric.timers + or metric + or metrics + or timer + or timers + - metric.counter.list -> metric.counter + or metric.counters + or counters + - job.list -> job or jobs + - daemon.list - daemon or daemons + - conf.list + + method/field access error due to different classloader for XxxAdmin and the access type + + uniformed `q` parameter handling for list commands * Improve metric timer * envMatches in ControllerByteCodeScanner shall be reset upon scanning new class #1065 * Act-Test - support post XML encoded body #1062 diff --git a/src/main/java/act/SysUtilAdmin.java b/src/main/java/act/SysUtilAdmin.java index c15dfa483..5fc4aba63 100644 --- a/src/main/java/act/SysUtilAdmin.java +++ b/src/main/java/act/SysUtilAdmin.java @@ -21,11 +21,13 @@ */ import act.app.SingletonRegistry; +import act.cli.Optional; import act.cli.*; import act.sys.Env; import act.util.PropertySpec; import org.joda.time.LocalDateTime; import org.osgl.$; +import org.osgl.Lang; import org.osgl.storage.impl.SObject; import org.osgl.util.*; @@ -102,10 +104,24 @@ public void memInfo( } } - @Command(name = "act.singleton.list", help = "List all singletons") - public Iterable listSingletons() { + @Command(name = "act.singleton.list, act.singleton, act.singletons", help = "List all singletons") + public Iterable listSingletons(@Optional("specify singleton filter") final String q) { SingletonRegistry singletonRegistry = Act.app().singletonRegistry(); - return singletonRegistry.typeNames(); + final Iterable iterable = singletonRegistry.typeNames(); + if (S.notBlank(q)) { + return new Iterable() { + @Override + public Iterator iterator() { + return Iterators.filter(iterable.iterator(), new Lang.Predicate() { + @Override + public boolean test(String s) { + return s.toLowerCase().contains(q) || s.matches(q); + } + }); + } + }; + } + return iterable; } @Command(name = "act.singleton.show-property", help = "Show singleton instance property") diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 8565a2c61..a70fa053f 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -958,7 +958,7 @@ public void unregisterDaemon(Daemon daemon) { daemonRegistry.remove(daemon.id()); } - List registeredDaemons() { + public List registeredDaemons() { return C.list(daemonRegistry.values()); } diff --git a/src/main/java/act/app/DaemonAdmin.java b/src/main/java/act/app/DaemonAdmin.java index e062cd174..732621f9d 100644 --- a/src/main/java/act/app/DaemonAdmin.java +++ b/src/main/java/act/app/DaemonAdmin.java @@ -20,14 +20,13 @@ * #L% */ -import act.cli.CliContext; -import act.cli.Command; -import act.cli.Required; +import act.cli.*; import act.data.JodaDateTimeCodec; import act.util.PropertySpec; import org.joda.time.DateTime; +import org.osgl.$; import org.osgl.inject.annotation.Provided; -import org.osgl.util.E; +import org.osgl.util.*; import java.util.Map; @@ -37,10 +36,20 @@ @SuppressWarnings("unused") public class DaemonAdmin { - @Command(name = "act.daemon.list", help = "List app daemons") + @Command(name = "act.daemon.list,act.daemon,act.daemons", help = "List app daemons") @PropertySpec("id,state") - public Iterable list() { - return App.instance().registeredDaemons(); + public Iterable list(@Optional("specify filter string") final String q) { + final C.List daemons = C.list(App.instance().registeredDaemons()); + if (S.notBlank(q)) { + return daemons.filter(new $.Predicate() { + @Override + public boolean test(Daemon daemon) { + String s = S.string(daemon.id()); + return s.toLowerCase().contains(q) || s.matches(q); + } + }); + } + return daemons; } @Command(name = "act.daemon.start", help = "Start app daemon") diff --git a/src/main/java/act/cli/builtin/Help.java b/src/main/java/act/cli/builtin/Help.java index 726b417d4..8f1c92d8f 100644 --- a/src/main/java/act/cli/builtin/Help.java +++ b/src/main/java/act/cli/builtin/Help.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -40,12 +40,13 @@ public class Help extends CliHandlerBase { private static int maxWidth = 0; - private Help() {} + private Help() { + } @Override public void handle(CliContext context) { List args = context.arguments(); - String command = null; + String command; if (args.size() > 0) { command = args.get(0); if (showHelp(command, context)) { @@ -55,6 +56,7 @@ public void handle(CliContext context) { CommandLineParser parser = context.commandLine(); boolean sys = parser.getBoolean("-s", "--system"); boolean all = parser.getBoolean("-a", "--all"); + String q = parser.getString("-q", "--filter"); boolean app = true; if (all) { sys = true; @@ -75,29 +77,29 @@ public void handle(CliContext context) { } String fmt = "%-" + (maxLen + 4) + "s - %s"; if (sys) { - list(command, "@|bold System commands|@", fmt, sysCommands, dispatcher, context); + list("@|bold System commands|@", fmt, sysCommands, dispatcher, context, q); } if (app) { if (sys) { context.println(""); } - list(command, "@|bold Application commands|@", fmt, appCommands, dispatcher, context); + list("@|bold Application commands|@", fmt, appCommands, dispatcher, context, q); } } - private void list(String search, String label, String fmt, List commands, CliDispatcher dispatcher, CliContext context) { + private void list(String label, String fmt, List commands, CliDispatcher dispatcher, CliContext context, String q) { List lines = new ArrayList<>(); - boolean noSearch = S.blank(search); - if (noSearch) { - lines.add(label.toUpperCase()); - lines.add(""); - } + lines.add(label.toUpperCase()); + lines.add(""); + q = S.string(q).trim(); + boolean hasFilter = S.notEmpty(q); for (String cmd : commands) { + if (hasFilter && !(cmd.toLowerCase().contains(q) || cmd.matches(q))) { + continue; + } CliHandler handler = dispatcher.handler(cmd); T2 commandLine = handler.commandLine(); - if (noSearch || commandLine._1.contains(search)) { - lines.add(S.fmt(fmt, cmd, commandLine._2)); - } + lines.add(S.fmt(fmt, cmd, commandLine._2)); } context.println(Ansi.ansi().render(S.join("\n", lines)).toString()); } @@ -135,11 +137,11 @@ public boolean showHelp(String command, CliContext context) { lines.add(""); lines.add("@|bold Options|@:"); int maxLen = 0; - for (T2 t2: options) { + for (T2 t2 : options) { maxLen = Math.max(maxLen, t2._1.length()); } String fmt = " %-" + (maxLen + 4) + "s %s"; - for (T2 t2: options) { + for (T2 t2 : options) { lines.add(S.fmt(fmt, t2._1, t2._2)); } } diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 30c50648e..4e80de67e 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -1387,19 +1387,23 @@ public T val(Map configuration) { Set suffixes = ConfigKeyHelper.suffixes(); Set nonAliasSuffixes = ConfigKeyHelper.nonAliasSuffixes(); for (AppConfigKey k : values()) { - lookup.put(k.name().toUpperCase(), k); + addToLookup(k.name(), k); String key = k.key().toUpperCase(); - lookup.put(key, k); + addToLookup(key, k); String suffix = S.afterLast(key, "."); if (S.notBlank(suffix) && suffixes.contains(suffix) && !nonAliasSuffixes.contains(suffix)) { Set aliases = ConfigKeyHelper.aliases(key, suffix); for (String alias : aliases) { - lookup.put(Config.canonical(alias), k); + addToLookup(Config.canonical(alias), k); } } } } + private static void addToLookup(String name, AppConfigKey key) { + lookup.put(Config.canonical(name), key); + } + /** * Return key enum instance from the string in case insensitive mode * diff --git a/src/main/java/act/conf/ConfAdmin.java b/src/main/java/act/conf/ConfAdmin.java index 808317e86..9a1a39924 100644 --- a/src/main/java/act/conf/ConfAdmin.java +++ b/src/main/java/act/conf/ConfAdmin.java @@ -26,6 +26,7 @@ import act.controller.annotation.Port; import act.controller.annotation.UrlContext; import act.route.Router; +import act.util.PropertySpec; import com.alibaba.fastjson.JSONObject; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.C; @@ -44,7 +45,8 @@ public class ConfAdmin { @Inject private AppConfig appConfig; - @Command(name = "act.conf.list", help = "list configuration") + @Command(name = "act.conf.list, act.conf, act.configuration, act.configurations", help = "list configuration") + @PropertySpec("key,val") public List list( @Optional("list system configuration") boolean system, @Optional(lead = "-q", help = "specify search text") String q @@ -54,9 +56,12 @@ public List list( Config config = system ? Act.conf() : appConfig; boolean hasQuery = S.notBlank(q); + if (hasQuery) { + q = q.trim().toLowerCase(); + } for (ConfigKey key: keys) { - String keyString = key.toString(); - if (hasQuery && !keyString.contains(q)) { + String keyString = key.toString().toLowerCase(); + if (hasQuery && (!keyString.contains(q) && !keyString.matches(q))) { continue; } if (AppConfigKey.TRACE_HANDLER_ENABLED == key) { diff --git a/src/main/java/act/conf/Config.java b/src/main/java/act/conf/Config.java index 14b7ee00d..836bb5e40 100644 --- a/src/main/java/act/conf/Config.java +++ b/src/main/java/act/conf/Config.java @@ -211,7 +211,7 @@ public Map subSet(String namespace) { protected abstract ConfigKey keyOf(String s); public static String canonical(String key) { - return Keyword.of(key).dotted(); + return Keyword.of(key).dotted().toLowerCase(); } public static boolean matches(String k1, String k2) { diff --git a/src/main/java/act/data/DataPropertyRepository.java b/src/main/java/act/data/DataPropertyRepository.java index 6a962c4f5..0beab0d8a 100644 --- a/src/main/java/act/data/DataPropertyRepository.java +++ b/src/main/java/act/data/DataPropertyRepository.java @@ -104,6 +104,7 @@ private List buildPropertyList(Class c) { for (Field f: fa) { buildPropertyPath(context, f, retLst); } + Collections.sort(retLst); return retLst; } diff --git a/src/main/java/act/job/Job.java b/src/main/java/act/job/Job.java index 617804a35..e693b7387 100644 --- a/src/main/java/act/job/Job.java +++ b/src/main/java/act/job/Job.java @@ -303,7 +303,7 @@ boolean done() { return executed && oneTime; } - final String id() { + public final String id() { return id; } diff --git a/src/main/java/act/job/JobAdmin.java b/src/main/java/act/job/JobAdmin.java index fa000da9b..0d8c425a9 100644 --- a/src/main/java/act/job/JobAdmin.java +++ b/src/main/java/act/job/JobAdmin.java @@ -61,7 +61,7 @@ public int compare(Job o1, Job o2) { * List all jobs in the job manager * @return a list of {@link Job jobs} */ - @Command(value = "act.job.list", help = "List jobs") + @Command(value = "act.job.list,act.job,act.jobs", help = "List jobs") @PropertySpec(Job.BRIEF_VIEW) @TableView public List listJobs(@Optional(lead = "-q") final String q, JobManager jobManager) { @@ -70,7 +70,8 @@ public List listJobs(@Optional(lead = "-q") final String q, JobManager jobM jobs = jobs.filter(new $.Predicate() { @Override public boolean test(Job job) { - return job.toString().contains(q); + String jobStr = job.toString(); + return jobStr.contains(q) || jobStr.matches(q); } }); } diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 06b824788..aa58819cf 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -374,11 +374,11 @@ public void setJobProgressGauge(String jobId, ProgressGauge progressGauge) { } } - C.List jobs() { + public C.List jobs() { return C.list(jobs.values()); } - C.List virtualJobs() { + public C.List virtualJobs() { final JobManager jobManager = Act.jobManager(); return C.list(scheduled.entrySet()).map(new $.Transformer, Job>() { @Override diff --git a/src/main/java/act/metric/MetricAdmin.java b/src/main/java/act/metric/MetricAdmin.java index 15e1c08f5..abc1f023a 100644 --- a/src/main/java/act/metric/MetricAdmin.java +++ b/src/main/java/act/metric/MetricAdmin.java @@ -46,7 +46,7 @@ public void updateMetricDataSync( context.println(pause ? "metric data sync paused." : "metric data sync enabled"); } - @Command(name = "act.metric.counter.list", help = "list all counters") + @Command(name = "act.metric.counter.list,act.metric.counter,act.counter,act.metric.counters,act.counters.", help = "show metric counters") @PropertySpec("name,count") public Object getCounters( @Optional("specify maximum items returned") Integer limit, @@ -62,7 +62,7 @@ public Object getCounters( return process(list, limit, q, tree, depth, MetricInfo.Comparator.COUNTER, MetricInfoTree.COUNTER); } - @Command(name = "act.metric.timer.list", help = "list all timers") + @Command(name = "act.metric.timer.list,act.metric.timer,act.metric,act.timer,act.metrics,act.timers", help = "show metric timers") @PropertySpec("name,accumulated,count,avg") public Object getTimers( @Optional("specify maximum items returned") Integer limit, diff --git a/src/main/java/act/plugin/Plugin.java b/src/main/java/act/plugin/Plugin.java index 2a012d94b..59fbc7a2c 100644 --- a/src/main/java/act/plugin/Plugin.java +++ b/src/main/java/act/plugin/Plugin.java @@ -46,7 +46,7 @@ public static void clear() { plugins.clear(); } - static List plugins() { + public static List plugins() { return C.list(plugins); } } diff --git a/src/main/java/act/plugin/PluginAdmin.java b/src/main/java/act/plugin/PluginAdmin.java index 816ba5580..4e93f0506 100644 --- a/src/main/java/act/plugin/PluginAdmin.java +++ b/src/main/java/act/plugin/PluginAdmin.java @@ -23,7 +23,9 @@ import act.cli.Command; import act.cli.Optional; import act.util.PropertySpec; +import org.osgl.Lang; import org.osgl.util.C; +import org.osgl.util.S; import java.util.List; @@ -32,12 +34,21 @@ */ public class PluginAdmin { - @Command(name = "act.plugin.list", help = "list plugins") + @Command(name = "act.plugin.list,act.plugin,act.plugins", help = "list plugins") @PropertySpec("this as Plugin") public List list( - @Optional("sort alphabetically") boolean sort + @Optional("sort alphabetically") boolean sort, + @Optional("filter plugin") final String q ) { C.List l = C.list(Plugin.InfoRepo.plugins()); + if (S.notBlank(q)) { + l = l.filter(new Lang.Predicate() { + @Override + public boolean test(String s) { + return s.toLowerCase().contains(q) || s.matches(q); + } + }); + } return sort ? l.sorted() : l; } diff --git a/src/main/java/act/route/RouterAdmin.java b/src/main/java/act/route/RouterAdmin.java index b2b146bbc..481e8425c 100644 --- a/src/main/java/act/route/RouterAdmin.java +++ b/src/main/java/act/route/RouterAdmin.java @@ -46,7 +46,7 @@ public RouterAdmin() { this.context = CliContext.current(); } - @Command(name = "act.route.list, act.route.print", help = "list routes") + @Command(name = "act.route.list, act.route.print, act.route, act.routes", help = "list routes") @PropertySpec("method,path,compactHandler") public Object listRoutes( @Optional("list routes in tree view") boolean tree, diff --git a/src/main/java/act/ws/WebSocketAdminConsole.java b/src/main/java/act/ws/WebSocketAdminConsole.java index 26384be0f..130a8924c 100644 --- a/src/main/java/act/ws/WebSocketAdminConsole.java +++ b/src/main/java/act/ws/WebSocketAdminConsole.java @@ -37,13 +37,13 @@ public int userConnections(@Optional("specify user name") String username) { return S.blank(username) ? registry.count() : registry.count(username); } - @Command(name = "act.ws.conn.by-tag", help = "report websocket connection number by user") + @Command(name = "act.ws.conn.by-tag", help = "report websocket connection number by (channel) tag ") public int tagConnections(@Optional("specify the tag label") String label) { WebSocketConnectionRegistry registry = manager.tagRegistry(); return S.blank(label) ? registry.count() : registry.count(label); } - @Command(name = "act.ws.conn.by-session", help = "report websocket connection number by user") + @Command(name = "act.ws.conn.by-session", help = "report websocket connection number by session id") public int sessionConnections(@Optional("specify the session id") String sessionId) { WebSocketConnectionRegistry registry = manager.sessionRegistry(); return S.blank(sessionId) ? registry.count() : registry.count(sessionId); From dc1be323a4eca1347a63dc14663f010cb250faf3 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 24 Feb 2019 11:54:07 +1100 Subject: [PATCH 365/730] fix StackOverflowError caused by JsonDtoPatch #1064 --- CHANGELOG.md | 1 + .../java/act/inject/param/JsonDtoPatch.java | 12 ++++++++--- .../main/java/ghissues/gh1064/Department.java | 21 +++++++++++++++++++ .../src/main/java/ghissues/gh1064/Gh1064.java | 20 ++++++++++++++++++ .../src/main/java/ghissues/gh1064/User.java | 13 ++++++++++++ .../main/resources/test/scenarios/1064.yml | 18 ++++++++++++++++ 6 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1064/Department.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1064/Gh1064.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1064/User.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1064.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 6390722a4..5ec8c95ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* StackOverflowError caused by JsonDtoPatch #1064 * Multiple improvements on sys admin command #1068 + simplified command name aliases for system command: xxx.list - route.list -> route or routes diff --git a/src/main/java/act/inject/param/JsonDtoPatch.java b/src/main/java/act/inject/param/JsonDtoPatch.java index 06308188e..974faf880 100644 --- a/src/main/java/act/inject/param/JsonDtoPatch.java +++ b/src/main/java/act/inject/param/JsonDtoPatch.java @@ -44,11 +44,15 @@ public class JsonDtoPatch { private List fieldsPatches = new ArrayList<>(); private String name; private ValueLoader loader; - private JsonDtoPatch(String name, BeanSpec spec) { + private JsonDtoPatch(String name, BeanSpec spec, Set circularReferenceDetector) { this.name = S.requireNotBlank(name); this.loader = valueLoaderOf(spec); if (null == loader) { for (BeanSpec fieldSpec : spec.nonStaticFields()) { + if (circularReferenceDetector.contains(fieldSpec)) { + continue; + } + circularReferenceDetector.add(fieldSpec); Class fieldType = fieldSpec.rawType(); if (fieldSpec.isTransient() || fieldSpec.hasAnnotation(Transient.class)) { continue; @@ -57,10 +61,11 @@ private JsonDtoPatch(String name, BeanSpec spec) { continue; } String fieldName = fieldSpec.name(); - JsonDtoPatch child = new JsonDtoPatch(fieldName, fieldSpec); + JsonDtoPatch child = new JsonDtoPatch(fieldName, fieldSpec, circularReferenceDetector); if (!child.isEmpty()) { fieldsPatches.add(child); } + circularReferenceDetector.remove(fieldSpec); } } } @@ -102,7 +107,8 @@ private ValueLoader valueLoaderOf(BeanSpec spec) { } public static JsonDtoPatch of(BeanSpec spec) { - JsonDtoPatch patch = new JsonDtoPatch(spec.name(), spec); + Set circularReferenceDetector = new HashSet<>(); + JsonDtoPatch patch = new JsonDtoPatch(spec.name(), spec, circularReferenceDetector); return patch.isEmpty() ? null : patch; } } diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1064/Department.java b/testapps/GHIssues/src/main/java/ghissues/gh1064/Department.java new file mode 100644 index 000000000..b853fbf00 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1064/Department.java @@ -0,0 +1,21 @@ +package ghissues.gh1064; + +import act.data.annotation.Data; +import act.util.SimpleBean; + +import java.util.List; + +@Data +public class Department implements SimpleBean { + + public Long id; + + public String name; + + public Department parent; + + public List children; + + public List users; + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1064/Gh1064.java b/testapps/GHIssues/src/main/java/ghissues/gh1064/Gh1064.java new file mode 100644 index 000000000..c643ad532 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1064/Gh1064.java @@ -0,0 +1,20 @@ +package ghissues.gh1064; + +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1064") +public class Gh1064 extends BaseController { + + @PostAction("departments") + public Department createDepartment(Department department) { + return department; + } + + @PostAction("users") + public User createUser(User user) { + return user; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1064/User.java b/testapps/GHIssues/src/main/java/ghissues/gh1064/User.java new file mode 100644 index 000000000..371f78a65 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1064/User.java @@ -0,0 +1,13 @@ +package ghissues.gh1064; + +import act.data.annotation.Data; +import act.util.SimpleBean; + +@Data +public class User implements SimpleBean { + + public Long id; + + + public Department department; +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1064.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1064.yml new file mode 100644 index 000000000..bb6ae85f3 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1064.yml @@ -0,0 +1,18 @@ +Scenario(1064): + description: "[1064] StackOverflowError caused by JsonDtoPatch" + interactions: + - description: Test + request: + post: /1064/departments + json: + id: 1 + name: foo + parent: + id: 0 + name: root + children: + - id: 2 + name: bar + response: + json: + name: foo From 34c07b6d8c00ab756ae43099ab4fd80f1666f622 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 24 Feb 2019 21:36:54 +1100 Subject: [PATCH 366/730] JPAContext is not readay error when app start asynchronously #1063 --- CHANGELOG.md | 1 + src/main/java/act/job/Job.java | 7 ++ src/main/java/act/xio/NetworkHandler.java | 1 + .../GH1063/src/main/resources/logback.xml | 118 ++++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 testapps/GH1063/src/main/resources/logback.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ec8c95ec..ba6e2aaba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* JPAContext is not readay error when app start asynchronously #1063 * StackOverflowError caused by JsonDtoPatch #1064 * Multiple improvements on sys admin command #1068 + simplified command name aliases for system command: xxx.list diff --git a/src/main/java/act/job/Job.java b/src/main/java/act/job/Job.java index e693b7387..72a15b5c7 100644 --- a/src/main/java/act/job/Job.java +++ b/src/main/java/act/job/Job.java @@ -397,6 +397,10 @@ protected void _before() { protected void doJob(){ JobContext.init(id()); + ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader(); + if (ctxClassLoader != app.classLoader()) { + Thread.currentThread().setContextClassLoader(app.classLoader()); + } try { _before(); if (null != worker) { @@ -406,6 +410,9 @@ protected void doJob(){ JobContext.clear(); scheduleNextInvocation(); _finally(); + if (ctxClassLoader != app.classLoader()) { + Thread.currentThread().setContextClassLoader(ctxClassLoader); + } } } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index b7905fe88..c094d2430 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -157,6 +157,7 @@ public void run() { // set up the parameter spec where ActionContext.current is required. // see ReflectedInvokerHelper.requestHandlerMethodParamAnnotations(method) ctx.saveLocal(); + Thread.currentThread().setContextClassLoader(app.classLoader()); final boolean skipEvents = ctx.skipEvents(); try { if (!skipEvents) { diff --git a/testapps/GH1063/src/main/resources/logback.xml b/testapps/GH1063/src/main/resources/logback.xml new file mode 100644 index 000000000..664022662 --- /dev/null +++ b/testapps/GH1063/src/main/resources/logback.xml @@ -0,0 +1,118 @@ + + + + + + + + + INFO + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + +App + + + + + + + + + + + + + + From dabafb956644695225f2fc2f9b090b99aaf874e2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 27 Feb 2019 20:25:07 +1100 Subject: [PATCH 367/730] Act-Test - add `ignore` flag to scenario #1075 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 6 +++ src/main/java/act/test/Scenario.java | 7 ++- src/main/java/act/test/Test.java | 13 ++++- .../act/test/util/ScenarioComparator.java | 10 +++- src/main/resources/rythm/~test.html | 18 +++---- testapps/GH1063/.gitignore | 19 ++++++++ testapps/GH1063/README.md | 1 + testapps/GH1063/pom.xml | 47 +++++++++++++++++++ .../GH1063/src/main/java/test/AppEntry.java | 18 +++++++ testapps/GH1063/src/main/java/test/User.java | 20 ++++++++ .../GH1063/src/main/resources/app.properties | 1 + .../src/main/resources/test/scenarios.yml | 0 .../GH1069/src/main/java/test/Unique.java | 21 +++++++++ .../src/main/java/test/UniqueValidator.java | 32 +++++++++++++ 15 files changed, 202 insertions(+), 12 deletions(-) create mode 100644 testapps/GH1063/.gitignore create mode 100644 testapps/GH1063/README.md create mode 100644 testapps/GH1063/pom.xml create mode 100644 testapps/GH1063/src/main/java/test/AppEntry.java create mode 100644 testapps/GH1063/src/main/java/test/User.java create mode 100644 testapps/GH1063/src/main/resources/app.properties create mode 100644 testapps/GH1063/src/main/resources/test/scenarios.yml create mode 100644 testapps/GH1069/src/main/java/test/Unique.java create mode 100644 testapps/GH1069/src/main/java/test/UniqueValidator.java diff --git a/CHANGELOG.md b/CHANGELOG.md index ba6e2aaba..7a4a72686 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Act-Test - add `ignore` flag to scenario #1075 * JPAContext is not readay error when app start asynchronously #1063 * StackOverflowError caused by JsonDtoPatch #1064 * Multiple improvements on sys admin command #1068 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index a70fa053f..b219ba15e 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -1571,9 +1571,15 @@ private void initSessionManager() { private void initCache() { cache = cache(config().cacheName()); cache.startup(); + if (Act.isDev()) { + cache.clear(); + } CacheService sessionCache = cache(config().cacheNameSession()); if (cache != sessionCache) { sessionCache.startup(); + if (Act.isDev()) { + sessionCache.clear(); + } } HttpConfig.setSessionCache(sessionCache); } diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 42c179b4e..35483d14d 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -297,6 +297,7 @@ private String verifyXmlBody(Object xmlBody) { private App app; public String name; public String description; + public boolean ignore = false; public List fixtures = new ArrayList<>(); public Object generateTestData; public List depends = new ArrayList<>(); @@ -331,7 +332,11 @@ public String toString() { } public String title() { - return S.blank(description) ? name : description; + String s = S.blank(description) ? name : description; + if (ignore) { + s = "[IGNORED]" + s; + } + return s; } public void cache(String name, Object payload) { diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 92ea4bf24..37b9ca37a 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -262,6 +262,12 @@ public List run(App app, Keyword testId, boolean shutdownApp) { if (null != testId && $.ne(testId, Keyword.of(scenario.name))) { continue; } + if (null != testId) { + scenario.ignore = true; + } else if (scenario.ignore) { + addToList(scenario, list, scenarioManager); + continue; + } try { scenario.start(scenarioManager, requestTemplateManager); } catch (Exception e) { @@ -275,7 +281,7 @@ public List run(App app, Keyword testId, boolean shutdownApp) { } if (shutdownApp) { for (Scenario scenario : list) { - if (!scenario.status.pass()) { + if (!scenario.ignore && !scenario.status.pass()) { exitCode = -1; } output(scenario); @@ -293,6 +299,8 @@ public List run(App app, Keyword testId, boolean shutdownApp) { if (null != scenario.cause) { error("cause: \n" + E.stackTrace(scenario.cause)); } + } else if (scenario.ignore) { + warn("[%s] ignored", scenario.name); } } } @@ -312,6 +320,9 @@ public List run(App app, Keyword testId, boolean shutdownApp) { } private void output(Scenario scenario) { + if (scenario.ignore) { + return; + } printBanner(scenario); printInteractions(scenario); printFooter(); diff --git a/src/main/java/act/test/util/ScenarioComparator.java b/src/main/java/act/test/util/ScenarioComparator.java index b1d58c39f..83bccd565 100644 --- a/src/main/java/act/test/util/ScenarioComparator.java +++ b/src/main/java/act/test/util/ScenarioComparator.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -47,6 +47,11 @@ public int compare(Scenario o1, Scenario o2) { } else if (p1 && !p2) { return 1; } + if (o1.ignore && !o2.ignore) { + return -1; + } else if (o2.ignore) { + return 1; + } } List d1 = depends(o1, new ArrayList()); List d2 = depends(o2, new ArrayList()); @@ -59,6 +64,7 @@ public int compare(Scenario o1, Scenario o2) { int n = o1.partition.compareTo(o2.partition); return 0 != n ? n : o1.name.compareTo(o2.name); } + private List depends(Scenario s, List depends) { for (String name : s.depends) { Scenario scenario = scenarioManager.get(name); diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html index 6865cbb93..c0f6ad658 100644 --- a/src/main/resources/rythm/~test.html +++ b/src/main/resources/rythm/~test.html @@ -56,6 +56,10 @@ .open-source { display:none; } + h4.ignore { + color: #FFEB3B; + text-decoration: line-through; + } @render(head) @@ -63,13 +67,9 @@

                                                                                                                                                                      Test Report

                                                                                                                                                                      @(_app.name().capFirst())-@(_app.version().getVersion())
                                                                                                                                                                      @for(Scenario scenario: result) { -

                                                                                                                                                                      -@if(scenario.description) { - @scenario.description -} else { - @scenario.name.toUpperCase() -} - @if(!scenario.status.pass()) { +

                                                                                                                                                                      + @scenario.title().nl2br().raw() + @if(!scenario.ignore && !scenario.status.pass()) { @if(scenario.source) {
                                                                                                                                                                      • @@ -99,7 +99,7 @@

                                                                                                                                                                        -@if(!scenario.status.pass() && null != scenario.errorMessage) { +@if(!scenario.ignore && !scenario.status.pass() && null != scenario.errorMessage) {
                                                                                                                                                                        [@scenario.status] @scenario.errorMessage @if(scenario.cause) { @@ -110,6 +110,7 @@

                                                                                                                                                                        } +@ifNot(scenario.ignore) {
                                                                                                                                                                          @for (Interaction interaction: scenario.interactions) {
                                                                                                                                                                        • @@ -125,6 +126,7 @@

                                                                                                                                                                        • }
                                                                                                                                                                        +} } actframework-@act.Act.VERSION.getVersion() diff --git a/testapps/GH1063/.gitignore b/testapps/GH1063/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH1063/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH1063/README.md b/testapps/GH1063/README.md new file mode 100644 index 000000000..241365a35 --- /dev/null +++ b/testapps/GH1063/README.md @@ -0,0 +1 @@ +If the app start without any error, then test passed. \ No newline at end of file diff --git a/testapps/GH1063/pom.xml b/testapps/GH1063/pom.xml new file mode 100644 index 000000000..49688ca96 --- /dev/null +++ b/testapps/GH1063/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + act-gh1063 + 1.8.20.0 + + ActFramework Github Issue #1063 Reproduce App + + + org.actframework + act-starter-parent + 1.8.19.0 + + + + + 1.8 + test.Main + + + + + + org.actframework + act + 1.8.20-SNAPSHOT + + + org.actframework + act-jpa-common + 1.5.7-SNAPSHOT + + + org.actframework + act-hibernate + + + com.zaxxer + HikariCP + + + + + diff --git a/testapps/GH1063/src/main/java/test/AppEntry.java b/testapps/GH1063/src/main/java/test/AppEntry.java new file mode 100644 index 000000000..fecf0f150 --- /dev/null +++ b/testapps/GH1063/src/main/java/test/AppEntry.java @@ -0,0 +1,18 @@ +package test; + +import act.Act; +import act.job.OnAppStart; + +public class AppEntry { + + @OnAppStart + public void onAppStart(User.Dao userDao) { + User user = new User(); + user.name = "tom"; + userDao.save(user); + } + + public static void main(String[] args) throws Exception{ + Act.start(); + } +} diff --git a/testapps/GH1063/src/main/java/test/User.java b/testapps/GH1063/src/main/java/test/User.java new file mode 100644 index 000000000..d989466e0 --- /dev/null +++ b/testapps/GH1063/src/main/java/test/User.java @@ -0,0 +1,20 @@ +package test; + +import act.db.jpa.JPADao; + +import javax.persistence.*; + +@Entity +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + + public String name; + + public static class Dao extends JPADao { + } + + +} \ No newline at end of file diff --git a/testapps/GH1063/src/main/resources/app.properties b/testapps/GH1063/src/main/resources/app.properties new file mode 100644 index 000000000..22f9bbd02 --- /dev/null +++ b/testapps/GH1063/src/main/resources/app.properties @@ -0,0 +1 @@ +content_suffix.aware=true \ No newline at end of file diff --git a/testapps/GH1063/src/main/resources/test/scenarios.yml b/testapps/GH1063/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..e69de29bb diff --git a/testapps/GH1069/src/main/java/test/Unique.java b/testapps/GH1069/src/main/java/test/Unique.java new file mode 100644 index 000000000..feec65a97 --- /dev/null +++ b/testapps/GH1069/src/main/java/test/Unique.java @@ -0,0 +1,21 @@ +package test; + +import java.lang.annotation.*; +import javax.validation.*; + +@ReportAsSingleViolation +@Constraint(validatedBy = UniqueValidator.class) +@Target({ElementType.FIELD, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Unique { + + String message() default "{org.hibernate.validator.constraints.Length.message}"; + + Class entity(); + + String field(); + + Class[] groups() default { }; + + Class[] payload() default { }; +} \ No newline at end of file diff --git a/testapps/GH1069/src/main/java/test/UniqueValidator.java b/testapps/GH1069/src/main/java/test/UniqueValidator.java new file mode 100644 index 000000000..d38882fe1 --- /dev/null +++ b/testapps/GH1069/src/main/java/test/UniqueValidator.java @@ -0,0 +1,32 @@ +package test; + +import act.app.App; +import act.db.Dao; +import org.apache.bval.jsr.ConstraintValidatorContextImpl; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class UniqueValidator implements ConstraintValidator { + + private Dao dao; + private String field; + + @Override + public void initialize(Unique parameters) { + Class cls = parameters.entity(); + dao = App.instance().dbServiceManager().dao(cls); + field = parameters.field(); + } + + @Override + public boolean isValid(Object value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + if (dao != null && context instanceof ConstraintValidatorContextImpl) { + return dao.countBy(field, value) <= 0; + } + return false; + } +} \ No newline at end of file From dc3b68ebf8d7b396b545ccec45d5e574092a1c95 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 27 Feb 2019 20:39:04 +1100 Subject: [PATCH 368/730] add automate test case for Gh1073 --- .../src/main/java/ghissues/Gh1073.java | 37 +++++++++++++++++++ testapps/GHIssues/src/main/resources/1073.yml | 14 +++++++ 2 files changed, 51 insertions(+) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1073.java create mode 100644 testapps/GHIssues/src/main/resources/1073.yml diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1073.java b/testapps/GHIssues/src/main/java/ghissues/Gh1073.java new file mode 100644 index 000000000..69207ab61 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1073.java @@ -0,0 +1,37 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.inject.util.LoadResource; +import act.util.AdaptiveBean; +import act.util.SimpleBean; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; + +@UrlContext("1073") +public class Gh1073 extends BaseController { + + @Data + public static class Config extends AdaptiveBean { + + @Data + public static class Component implements SimpleBean { + public int id; + public String kind; + } + + public String id; + public String name; + public List nameComponents; + } + + @LoadResource("1073.yml") + private List configs; + + @GetAction + public List configs() { + return configs; + } + +} diff --git a/testapps/GHIssues/src/main/resources/1073.yml b/testapps/GHIssues/src/main/resources/1073.yml new file mode 100644 index 000000000..2c1038d9d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/1073.yml @@ -0,0 +1,14 @@ +- id: u31.csg + name: 网管 + type: corba + provider: zz + adapter: Adapter + ip: 10.206.20.235 + port: 21176 + nameService: NameService + userName: user + password: + howmany: 100 + nameComponents: + - id: 123 + kind: ems \ No newline at end of file From 50bb747f92025a3e7a7873bc873647068e1c4e5b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 27 Feb 2019 20:48:39 +1100 Subject: [PATCH 369/730] add missing testapp files --- src/main/java/act/test/Test.java | 2 +- testapps/GH1069/.gitignore | 19 +++ testapps/GH1069/README.md | 1 + testapps/GH1069/pom.xml | 47 +++++++ .../GH1069/src/main/java/test/AppEntry.java | 18 +++ testapps/GH1069/src/main/java/test/User.java | 21 ++++ .../GH1069/src/main/resources/app.properties | 1 + .../GH1069/src/main/resources/logback.xml | 118 ++++++++++++++++++ .../src/main/resources/test/scenarios.yml | 0 testapps/GHIssues/src/main/resources/1073.yml | 6 +- .../main/resources/test/scenarios/1073.yml | 23 ++++ testapps/GHIssues/src/main/resources/x.ignore | 1 + 12 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 testapps/GH1069/.gitignore create mode 100644 testapps/GH1069/README.md create mode 100644 testapps/GH1069/pom.xml create mode 100644 testapps/GH1069/src/main/java/test/AppEntry.java create mode 100644 testapps/GH1069/src/main/java/test/User.java create mode 100644 testapps/GH1069/src/main/resources/app.properties create mode 100644 testapps/GH1069/src/main/resources/logback.xml create mode 100644 testapps/GH1069/src/main/resources/test/scenarios.yml create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1073.yml create mode 100644 testapps/GHIssues/src/main/resources/x.ignore diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 37b9ca37a..c2620460a 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -263,7 +263,7 @@ public List run(App app, Keyword testId, boolean shutdownApp) { continue; } if (null != testId) { - scenario.ignore = true; + scenario.ignore = false; } else if (scenario.ignore) { addToList(scenario, list, scenarioManager); continue; diff --git a/testapps/GH1069/.gitignore b/testapps/GH1069/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH1069/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH1069/README.md b/testapps/GH1069/README.md new file mode 100644 index 000000000..241365a35 --- /dev/null +++ b/testapps/GH1069/README.md @@ -0,0 +1 @@ +If the app start without any error, then test passed. \ No newline at end of file diff --git a/testapps/GH1069/pom.xml b/testapps/GH1069/pom.xml new file mode 100644 index 000000000..f08953e9f --- /dev/null +++ b/testapps/GH1069/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + act-gh1069 + 1.8.20.0 + + ActFramework Github Issue #1069 Reproduce App + + + org.actframework + act-starter-parent + 1.8.19.0 + + + + + 1.8 + test.Main + + + + + + org.actframework + act + 1.8.20-SNAPSHOT + + + org.actframework + act-jpa-common + 1.5.7-SNAPSHOT + + + org.actframework + act-hibernate + + + com.zaxxer + HikariCP + + + + + diff --git a/testapps/GH1069/src/main/java/test/AppEntry.java b/testapps/GH1069/src/main/java/test/AppEntry.java new file mode 100644 index 000000000..fecf0f150 --- /dev/null +++ b/testapps/GH1069/src/main/java/test/AppEntry.java @@ -0,0 +1,18 @@ +package test; + +import act.Act; +import act.job.OnAppStart; + +public class AppEntry { + + @OnAppStart + public void onAppStart(User.Dao userDao) { + User user = new User(); + user.name = "tom"; + userDao.save(user); + } + + public static void main(String[] args) throws Exception{ + Act.start(); + } +} diff --git a/testapps/GH1069/src/main/java/test/User.java b/testapps/GH1069/src/main/java/test/User.java new file mode 100644 index 000000000..6a85d69d3 --- /dev/null +++ b/testapps/GH1069/src/main/java/test/User.java @@ -0,0 +1,21 @@ +package test; + +import act.db.jpa.JPADao; + +import javax.persistence.*; + +@Entity +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + + @Unique(entity = User.class, field = "name") + public String name; + + public static class Dao extends JPADao { + } + + +} \ No newline at end of file diff --git a/testapps/GH1069/src/main/resources/app.properties b/testapps/GH1069/src/main/resources/app.properties new file mode 100644 index 000000000..22f9bbd02 --- /dev/null +++ b/testapps/GH1069/src/main/resources/app.properties @@ -0,0 +1 @@ +content_suffix.aware=true \ No newline at end of file diff --git a/testapps/GH1069/src/main/resources/logback.xml b/testapps/GH1069/src/main/resources/logback.xml new file mode 100644 index 000000000..664022662 --- /dev/null +++ b/testapps/GH1069/src/main/resources/logback.xml @@ -0,0 +1,118 @@ + + + + + + + + + INFO + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + +App + + + + + + + + + + + + + + diff --git a/testapps/GH1069/src/main/resources/test/scenarios.yml b/testapps/GH1069/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..e69de29bb diff --git a/testapps/GHIssues/src/main/resources/1073.yml b/testapps/GHIssues/src/main/resources/1073.yml index 2c1038d9d..e846daadd 100644 --- a/testapps/GHIssues/src/main/resources/1073.yml +++ b/testapps/GHIssues/src/main/resources/1073.yml @@ -3,11 +3,11 @@ type: corba provider: zz adapter: Adapter - ip: 10.206.20.235 - port: 21176 + ip: 127.0.0.1 + port: 8080 nameService: NameService userName: user - password: + password: aaa howmany: 100 nameComponents: - id: 123 diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1073.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1073.yml new file mode 100644 index 000000000..690201f30 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1073.yml @@ -0,0 +1,23 @@ +Scenario(1073): + description: "[1073] `@LoadResource ` load yml file to bean failed" + interactions: + - description: Test + request: + get: /1073 + response: + json: + 0: + id: u31.csg + name: 网管 + type: corba + provider: zz + adapter: Adapter + ip: 127.0.0.1 + port: 8080 + nameService: NameService + userName: user + password: aaa + howmany: 100 + nameComponents: + - id: 123 + kind: ems \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/x.ignore b/testapps/GHIssues/src/main/resources/x.ignore new file mode 100644 index 000000000..65f5bb042 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/x.ignore @@ -0,0 +1 @@ +ss \ No newline at end of file From b03361d3cccc1e52edf94ae275c38877addf2c65 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 27 Feb 2019 21:41:34 +1100 Subject: [PATCH 370/730] Add filter box in API page #1074 --- CHANGELOG.md | 1 + .../resources/asset/~act/apibook/apibook.tag | 23 +++++++++++++++++++ .../asset/~act/apibook/endpoint_list.tag | 22 +++++++++++++++++- .../asset/~act/apibook/module_list.tag | 15 +++++++++++- src/main/resources/asset/~act/apibook/toc.tag | 13 ++++++++++- 5 files changed, 71 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a4a72686..c506866b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Add filter box in API page #1074 * Act-Test - add `ignore` flag to scenario #1075 * JPAContext is not readay error when app start asynchronously #1063 * StackOverflowError caused by JsonDtoPatch #1064 diff --git a/src/main/resources/asset/~act/apibook/apibook.tag b/src/main/resources/asset/~act/apibook/apibook.tag index 42bb40dc5..c3a4a9f6d 100644 --- a/src/main/resources/asset/~act/apibook/apibook.tag +++ b/src/main/resources/asset/~act/apibook/apibook.tag @@ -1,6 +1,16 @@ +

                                                                                                                                                                        API Book - { sysInfo.appName }

                                                                                                                                                                        +
                                                                                                                                                                        @@ -37,6 +47,7 @@ \ No newline at end of file diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index e0477153c..5da5f6f13 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -186,12 +186,20 @@ \ No newline at end of file diff --git a/src/main/resources/asset/~act/apibook/module_list.tag b/src/main/resources/asset/~act/apibook/module_list.tag index edd31bc2e..f9b2471f2 100644 --- a/src/main/resources/asset/~act/apibook/module_list.tag +++ b/src/main/resources/asset/~act/apibook/module_list.tag @@ -1,7 +1,7 @@
                                                                                                                                                                        -
                                                                                                                                                                          +
                                                                                                                                                                          • {module.name}
                                                                                                                                                                        @@ -60,9 +60,18 @@ \ No newline at end of file diff --git a/src/main/resources/asset/~act/apibook/toc.tag b/src/main/resources/asset/~act/apibook/toc.tag index 57d94db74..289ea631e 100644 --- a/src/main/resources/asset/~act/apibook/toc.tag +++ b/src/main/resources/asset/~act/apibook/toc.tag @@ -121,9 +121,20 @@ self.selectedModules = modules; self.update() }) + riot.store.on('filter-changed', function(filter) { + self.filter = filter + self.update() + }) show(endpoint) { var show = self.selectedModules.indexOf(endpoint.module) > -1 - return show + if (!show) { + return false + } + if (!self.filter) { + return show + } + x = endpoint + return x.description.toLowerCase().includes(self.filter) || x.id.toLowerCase().includes(self.filter) || x.path.toLowerCase().includes(self.filter) } \ No newline at end of file From 3b03d0a8d73fdbb81e6a2fe970e7eab8c9fc4264 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 1 Mar 2019 05:12:53 +1100 Subject: [PATCH 371/730] Act-Test - JSON request array content get dropped #1076 --- CHANGELOG.md | 1 + src/main/java/act/test/Scenario.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c506866b6..c5f241885 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Act-Test - JSON request array content get dropped #1076 * Add filter box in API page #1074 * Act-Test - add `ignore` flag to scenario #1075 * JPAContext is not readay error when app start asynchronously #1063 diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 35483d14d..7294719a6 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -218,6 +218,8 @@ private Collection processParamSubstitution(Collection params) { } else if (sVal.contains("${")) { sVal = processStringSubstitution(sVal); ret.add(S.isInt(sVal) ? Integer.parseInt(sVal) : sVal); + } else { + ret.add(sVal); } } else if (val instanceof Map) { processParamSubstitution((Map) val); @@ -730,6 +732,7 @@ void verifyList(String name, List array, Map spec) { // try next one } } + throw error("No element matches requirement: %s", test); } else if (S.isInt(sKey)) { int id = Integer.parseInt(sKey); value = array.get(id); From 3e98e7b91a8a588ee0a666874a409447e4313a27 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 1 Mar 2019 05:19:13 +1100 Subject: [PATCH 372/730] #1073 - use trace level to log possible error when loading resource directly into a datastructure --- CHANGELOG.md | 1 + src/main/java/act/inject/util/ResourceLoader.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5f241885..19e2c728a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Misleading error stack printed out when loading yml file with `@LoadResource` #1073 * Act-Test - JSON request array content get dropped #1076 * Add filter box in API page #1074 * Act-Test - add `ignore` flag to scenario #1075 diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index bdb1a58cd..534153809 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -234,8 +234,8 @@ private static Object _load(URL url, BeanSpec spec, Object hint) { try { return null == hint ? IO.read(url).to(spec) : IO.read(url).hint(hint).to(spec); } catch (Exception e) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug(e, "error read URL[%s] to [%s] via IO.read call", url, spec); + if (LOGGER.isTraceEnabled()) { + LOGGER.trace(e, "error read URL[%s] to [%s] via IO.read call", url, spec); } // ignore } From decbbd472f7ea67dde43fff9b73f8253829106dc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 1 Mar 2019 06:08:13 +1100 Subject: [PATCH 373/730] clear error message logging when port is occupied by other app --- src/main/java/act/Act.java | 7 +++- src/main/java/act/app/AppManager.java | 6 +++ src/main/java/act/app/CliServer.java | 6 ++- .../exception/AppStartTerminateException.java | 26 +++++++++++++ .../act/exception/PortOccupiedException.java | 37 +++++++++++++++++++ .../act/handler/builtin/ResourceGetter.java | 6 ++- .../main/java/ghissues/gh1072/BaseModel.java | 20 ++++++++++ .../java/ghissues/gh1072/SupportInfo.java | 23 ++++++++++++ 8 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 src/main/java/act/exception/AppStartTerminateException.java create mode 100644 src/main/java/act/exception/PortOccupiedException.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1072/SupportInfo.java diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index e9560d0c4..0fbcce025 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -34,6 +34,7 @@ import act.crypto.AppCrypto; import act.db.DbManager; import act.event.*; +import act.exception.AppStartTerminateException; import act.handler.RequestHandlerBase; import act.handler.SimpleRequestHandler; import act.handler.builtin.controller.*; @@ -297,7 +298,11 @@ public static void startup(AppDescriptor descriptor) { NetworkBootupThread nbt = initNetworkLayer(); initApplicationManager(); LOGGER.info("loading application(s) ..."); - appManager.loadSingleApp(descriptor); + try { + appManager.loadSingleApp(descriptor); + } catch (AppStartTerminateException e) { + System.exit(-1); + } startNetworkLayer(nbt); Thread.currentThread().setContextClassLoader(Act.class.getClassLoader()); App app = app(); diff --git a/src/main/java/act/app/AppManager.java b/src/main/java/act/app/AppManager.java index 88d8d130a..fcbf42b7f 100644 --- a/src/main/java/act/app/AppManager.java +++ b/src/main/java/act/app/AppManager.java @@ -23,6 +23,8 @@ import static act.Destroyable.Util.tryDestroyAll; import act.Act; +import act.exception.AppStartTerminateException; +import act.exception.PortOccupiedException; import act.internal.util.AppDescriptor; import act.util.LogSupportedDestroyableBase; import org.osgl.$; @@ -141,6 +143,10 @@ private enum _F { public void visit(App app) throws $.Break { try { mgr.load(app); + } catch (PortOccupiedException e) { + Act.LOGGER.fatal("Cannot start ActFramework: %s", e.getMessage()); + Act.shutdown(app); + throw new AppStartTerminateException(); } catch (RuntimeException e) { Act.shutdown(app); throw e; diff --git a/src/main/java/act/app/CliServer.java b/src/main/java/act/app/CliServer.java index 57717a09a..9fe740147 100644 --- a/src/main/java/act/app/CliServer.java +++ b/src/main/java/act/app/CliServer.java @@ -23,6 +23,7 @@ import act.Act; import act.Destroyable; import act.cli.CliSession; +import act.exception.PortOccupiedException; import org.osgl.exception.ConfigurationException; import org.osgl.exception.UnexpectedException; import org.osgl.logging.LogManager; @@ -159,9 +160,12 @@ public void run() { } }); } catch (IOException e) { + if (e instanceof BindException) { + throw new PortOccupiedException(port); + } Throwable t = e.getCause(); if (null != t && t.getMessage().contains("Address already in use")) { - throw new ConfigurationException("Cannot start app, port[%s] already occupied. Possible cause: another app instance is running", port); + throw new PortOccupiedException(port); } throw new ConfigurationException(e, "Cannot start CLI server on port: %s", port); } diff --git a/src/main/java/act/exception/AppStartTerminateException.java b/src/main/java/act/exception/AppStartTerminateException.java new file mode 100644 index 000000000..32090ca1e --- /dev/null +++ b/src/main/java/act/exception/AppStartTerminateException.java @@ -0,0 +1,26 @@ +package act.exception; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.exception.UnexpectedException; + +public class AppStartTerminateException extends UnexpectedException { +} diff --git a/src/main/java/act/exception/PortOccupiedException.java b/src/main/java/act/exception/PortOccupiedException.java new file mode 100644 index 000000000..55f65ce99 --- /dev/null +++ b/src/main/java/act/exception/PortOccupiedException.java @@ -0,0 +1,37 @@ +package act.exception; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.exception.UnexpectedException; +import org.osgl.util.S; + +public class PortOccupiedException extends UnexpectedException { + private int port; + + public PortOccupiedException(int port) { + this.port = port; + } + + @Override + public String getMessage() { + return S.fmt("port %s is occupied", port); + } +} diff --git a/src/main/java/act/handler/builtin/ResourceGetter.java b/src/main/java/act/handler/builtin/ResourceGetter.java index bf6730e72..6917029a6 100644 --- a/src/main/java/act/handler/builtin/ResourceGetter.java +++ b/src/main/java/act/handler/builtin/ResourceGetter.java @@ -413,7 +413,11 @@ public String toString() { */ private FastRequestHandler verifyBase(URL baseUrl, String baseSupplied) { if (null == baseUrl) { - logger.warn("URL base not exists: " + baseSupplied); + if ("META-INF/resources/webjars".equalsIgnoreCase(baseSupplied)) { + // webjars not provided, just ignore it. + } else { + logger.warn("URL base not exists: " + baseSupplied); + } return AlwaysNotFound.INSTANCE; } return null; diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java b/testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java new file mode 100644 index 000000000..cc466fc0a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java @@ -0,0 +1,20 @@ +package ghissues.gh1072; + +import act.controller.annotation.UrlContext; +import act.db.jpa.JPADao; +import act.util.SimpleBean; + +import javax.persistence.*; + +@MappedSuperclass +public class BaseModel implements SimpleBean { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Long id; + + public String name; + + @UrlContext("1072") + public static class Dao extends JPADao { + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1072/SupportInfo.java b/testapps/GHIssues/src/main/java/ghissues/gh1072/SupportInfo.java new file mode 100644 index 000000000..28258f7a4 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1072/SupportInfo.java @@ -0,0 +1,23 @@ +package ghissues.gh1072; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +import javax.persistence.Entity; + +@Entity +public class SupportInfo extends BaseModel { + + public boolean supported; + + @UrlContext("support") + public static class Dao extends BaseModel.Dao { + + @GetAction + public String test() { + return "1072"; + } + + } + +} From edcdc9804550f4beebdd3ae1727fb95dcc5875ba Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 3 Mar 2019 08:23:57 +1100 Subject: [PATCH 374/730] update gh1072 test case --- testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java b/testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java index cc466fc0a..3a4873742 100644 --- a/testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java +++ b/testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java @@ -15,6 +15,6 @@ public class BaseModel implements SimpleBean { public String name; @UrlContext("1072") - public static class Dao extends JPADao { + public abstract static class Dao extends JPADao { } } From 44dae4bcd1e14fbb32124858a91ecb723f791b28 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 17 Mar 2019 01:32:19 +1100 Subject: [PATCH 375/730] Error visiting page with IE 8 or below #1079; add test case for GH1078 --- CHANGELOG.md | 1 + src/main/java/act/view/RenderAny.java | 22 +++++++++++-------- .../src/main/java/ghissues/gh1078/Base.java | 15 +++++++++++++ .../main/java/ghissues/gh1078/Service.java | 14 ++++++++++++ .../main/resources/test/scenarios/1078.yml | 9 ++++++++ 5 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1078/Base.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1078/Service.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1078.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 19e2c728a..ac22bf30b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Error visiting page with IE 8 or below #1079 * Misleading error stack printed out when loading yml file with `@LoadResource` #1073 * Act-Test - JSON request array content get dropped #1076 * Add filter box in API page #1074 diff --git a/src/main/java/act/view/RenderAny.java b/src/main/java/act/view/RenderAny.java index 7c529f1cd..857e7479b 100644 --- a/src/main/java/act/view/RenderAny.java +++ b/src/main/java/act/view/RenderAny.java @@ -69,15 +69,19 @@ public void apply(ActionContext context) { H.Format fmt = context.accept(); if (fmt == UNKNOWN) { H.Request req = context.req(); - H.Method method = req.method(); - String methodInfo = S.concat(method.name(), " method to "); - String acceptHeader = req.header(H.Header.Names.ACCEPT); - throw E.unsupport(S.concat( - "Unknown accept content type(", - acceptHeader, - "): ", - methodInfo, - req.url())); + if (req.userAgent().isIE9Down()) { + fmt = HTML; + } else { + H.Method method = req.method(); + String methodInfo = S.concat(method.name(), " method to "); + String acceptHeader = req.header(H.Header.Names.ACCEPT); + throw E.unsupport(S.concat( + "Unknown accept content type(", + acceptHeader, + "): ", + methodInfo, + req.url())); + } } Result result = null; if (JSON == fmt) { diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1078/Base.java b/testapps/GHIssues/src/main/java/ghissues/gh1078/Base.java new file mode 100644 index 000000000..ef7b42777 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1078/Base.java @@ -0,0 +1,15 @@ +package ghissues.gh1078; + +import ghissues.BaseController; +import org.osgl.mvc.annotation.After; +import org.osgl.mvc.result.RenderJSON; +import org.osgl.util.C; + +public abstract class Base extends BaseController { + + @After + public void after() { + throw new RenderJSON(C.Map("result", "intercepted")); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1078/Service.java b/testapps/GHIssues/src/main/java/ghissues/gh1078/Service.java new file mode 100644 index 000000000..02820293e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1078/Service.java @@ -0,0 +1,14 @@ +package ghissues.gh1078; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1078") +public class Service extends Base { + + @GetAction + public String test() { + return "okay"; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1078.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1078.yml new file mode 100644 index 000000000..43b1d4d1b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1078.yml @@ -0,0 +1,9 @@ +Scenario(1078): + description: "[1078] Exception caused by @After Interceptor defined in abstract class" + interactions: + - description: Test + request: + get: 1078 + response: + json: + result: intercepted From 2ffe080160aae7af1f6eb5ff69e1dc8e441f24c9 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 17 Mar 2019 16:19:24 +1100 Subject: [PATCH 376/730] update genie to 1.9.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 72bd5e41e..9bbe6b6eb 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ 3.13.1 1.19.1 1.6.0 - 1.9.4 + 1.9.5-SNAPSHOT 1.9.0 1.9.0 1.8.0 From 9f8a2864056e87597c51560388ed50f622c97b02 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 18 Mar 2019 06:09:31 +1100 Subject: [PATCH 377/730] Act-Test - introduce NotFixture annotation --- CHANGELOG.md | 1 + src/main/java/act/test/NotFixture.java | 36 ++++++++++++++++++++++++++ src/main/java/act/test/Test.java | 9 ++++++- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/main/java/act/test/NotFixture.java diff --git a/CHANGELOG.md b/CHANGELOG.md index ac22bf30b..9c7b5514c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Act-Test - Allow developer mark a model class as non-fixture #1080 * Error visiting page with IE 8 or below #1079 * Misleading error stack printed out when loading yml file with `@LoadResource` #1073 * Act-Test - JSON request array content get dropped #1076 diff --git a/src/main/java/act/test/NotFixture.java b/src/main/java/act/test/NotFixture.java new file mode 100644 index 000000000..c05008bc3 --- /dev/null +++ b/src/main/java/act/test/NotFixture.java @@ -0,0 +1,36 @@ +package act.test; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Specify a model class that should not be cleared during fixture loading + * process. + * + * This annotation could be put onto either Model (Entity) class or it's corresponding + * Dao class. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Documented +public @interface NotFixture { +} diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index c2620460a..f99c0dffa 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -156,8 +156,15 @@ public void clearFixtures() { List toBeDeleted = new ArrayList<>(); for (DbService svc : dbServiceManager.registeredServices()) { for (Class entityClass : svc.entityClasses()) { + if (entityClass.isAnnotationPresent(NotFixture.class)) { + continue; + } + Dao dao = dbServiceManager.dao(entityClass); + if (dao.getClass().isAnnotationPresent(NotFixture.class)) { + continue; + } try { - toBeDeleted.add(dbServiceManager.dao(entityClass)); + toBeDeleted.add(dao); } catch (IllegalArgumentException e) { if (e.getMessage().contains("Cannot find out Dao for model type")) { // ignore - must be caused by MappedSuperClass From 5e51caf90729553cdfcec2bdd2bb767cf647155f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 18 Mar 2019 13:21:43 +1100 Subject: [PATCH 378/730] update GH712 test app pom act version; minor updates to CHANGELOG --- CHANGELOG.md | 2 +- testapps/GH972/pom.xml | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c7b5514c..2d8f38f67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # ActFramework Change Log **1.8.20** -* Act-Test - Allow developer mark a model class as non-fixture #1080 +* Act-Test - allow developer specify a model shall not be cleared at fixture loading #1080 * Error visiting page with IE 8 or below #1079 * Misleading error stack printed out when loading yml file with `@LoadResource` #1073 * Act-Test - JSON request array content get dropped #1076 diff --git a/testapps/GH972/pom.xml b/testapps/GH972/pom.xml index 47ba420e3..d0bb8c2ba 100644 --- a/testapps/GH972/pom.xml +++ b/testapps/GH972/pom.xml @@ -13,7 +13,7 @@ org.actframework act-starter-parent - 1.8.18.0-SNAPSHOT + 1.8.19.0 @@ -23,6 +23,11 @@ + + org.actframework + act + 1.8.20-SNAPSHOT + From b94de48456af6efde0345f8bbbfff4953e5a54a2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 18 Mar 2019 15:17:06 +1100 Subject: [PATCH 379/730] Act-Test - print colourised output when run batch test #1081 --- CHANGELOG.md | 1 + src/main/java/act/Act.java | 38 ++++++++++++++++++++++-- src/main/java/act/apidoc/ApiManager.java | 2 +- src/main/java/act/cli/CliSession.java | 5 ++++ src/main/java/act/test/Test.java | 10 +++++-- src/main/java/act/util/Banner.java | 5 ++-- 6 files changed, 53 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d8f38f67..b5f1a9536 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Act-Test - print colourised output when run batch test #1081 * Act-Test - allow developer specify a model shall not be cleared at fixture loading #1080 * Error visiting page with IE 8 or below #1079 * Misleading error stack printed out when loading yml file with `@LoadResource` #1073 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 0fbcce025..6d55e43ff 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -97,11 +97,23 @@ public final class Act { */ private static final String ATTR_APP_JAR = "App-Jar"; + /** + * The runtime mode + */ public enum Mode { + + /** + * PROD mode should be used when app is running in product + * deployment or SIT/UAT testing deployment etc + */ PROD, + /** - * DEV mode is special as Act might load classes - * directly from srccode code when running in this mode + * DEV mode should be used by developer when developing the application. + * + * When Act is started in DEV mode the framework will monitor the + * source/configuration file and do hot reload when source/configuration + * file changes. */ DEV() { @Override @@ -188,18 +200,40 @@ public static Mode valueOfIgnoreCase(String mode) { private static Map genericPluginRegistry = new HashMap<>(); private static Map, List> listeners = new HashMap<>(); + /** + * Returns the runtime mode of the process. + * + * @return Act process runtime mode + * @see Mode + */ public static Mode mode() { return mode; } + /** + * Check if the Act process is running in {@link Mode#PROD} mode + * @return `true` if Act process is running in prod mode + */ public static boolean isProd() { return mode.isProd(); } + /** + * Check if the Act process is running in {@link Mode#DEV} mode + * @return `true` if Act process is running in dev mode + */ public static boolean isDev() { return mode.isDev(); } + /** + * Check if the Act process is running using `test` profile + * @return `true` if Act process is running using `test` profile + */ + public static boolean isTest() { + return "test".equalsIgnoreCase(profile()); + } + /** * Return the current profile name */ diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index 3d377e047..83544dd52 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -82,7 +82,7 @@ public static boolean inProgress() { public ApiManager(final App app) { super(app); - this.enabled = app.config().apiDocEnabled(); + this.enabled = app.config().apiDocEnabled() && !Act.isTest(); if (!this.enabled) { return; } diff --git a/src/main/java/act/cli/CliSession.java b/src/main/java/act/cli/CliSession.java index 30ae72aa8..c99e44739 100644 --- a/src/main/java/act/cli/CliSession.java +++ b/src/main/java/act/cli/CliSession.java @@ -29,6 +29,7 @@ import act.job.JobContext; import act.util.Banner; import act.util.DestroyableBase; +import jline.Terminal; import jline.console.ConsoleReader; import org.osgl.$; import org.osgl.logging.LogManager; @@ -121,6 +122,10 @@ public void removeCursor() { cursor = null; } + public Terminal term() { + return console.getTerminal(); + } + public T attribute(String key) { return $.cast(attributes.get(key)); } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index f99c0dffa..6dbce296a 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -36,8 +36,8 @@ import act.test.req_modifier.RequestModifier; import act.test.util.*; import act.test.verifier.Verifier; -import act.util.LogSupport; -import act.util.Stateless; +import act.util.*; +import org.fusesource.jansi.Ansi; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.mvc.annotation.DeleteAction; @@ -342,8 +342,14 @@ private void printBanner(Scenario scenario) { } private void printInteractions(Scenario scenario) { + boolean ansi = Banner.supportAnsi(); for (Interaction interaction : scenario.interactions) { String msg = S.concat("[", interaction.status, "]", interaction.description); + if (ansi) { + String color = interaction.status == TestStatus.PASS ? "green" : "red"; + msg = "@|" + color + " " + msg + "|@"; + msg = Ansi.ansi().render(msg).toString(); + } info(msg); } } diff --git a/src/main/java/act/util/Banner.java b/src/main/java/act/util/Banner.java index e6b5a2220..432653bc1 100644 --- a/src/main/java/act/util/Banner.java +++ b/src/main/java/act/util/Banner.java @@ -239,9 +239,8 @@ private static String poweredBy(int width, String actVersion, boolean center) { return S.concat(S.times(" ", gap), poweredBy); } - private static boolean supportAnsi() { - // eclipse project does not support ansi - return !new File(".project").exists(); + public static boolean supportAnsi() { + return S.notBlank(System.getenv("TERM")); } } From dc7f6654d584b71e981cb16f7b95320c87980bcc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 19 Mar 2019 19:59:24 +1100 Subject: [PATCH 380/730] Event bus - simple event key matching logic needs improvement #1077; Act-Test: a few optimization on test case sorting logic plus better scenario toString() implementation for debugging purpose --- CHANGELOG.md | 1 + legacy-testapp/pom.xml | 4 +- src/main/java/act/app/AppClassLoader.java | 30 ++++ .../app/FullStackAppBootstrapClassLoader.java | 29 ++- src/main/java/act/event/EventBus.java | 166 +++++++++++++----- .../SimpleEventListenerByteCodeScanner.java | 34 +++- src/main/java/act/test/Scenario.java | 6 +- src/main/java/act/test/Test.java | 10 +- .../act/test/util/ScenarioComparator.java | 9 +- .../act/util/ClassInfoByteCodeScanner.java | 31 +++- src/main/java/act/util/ClassNode.java | 4 + .../java/act/util/TypeConverterRegister.java | 2 +- src/main/resources/act.jar.black.list | 1 + 13 files changed, 261 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5f1a9536..f475d8478 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Event bus - simple event key matching logic needs improvement #1077 * Act-Test - print colourised output when run batch test #1081 * Act-Test - allow developer specify a model shall not be cleared at fixture loading #1080 * Error visiting page with IE 8 or below #1079 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 21ac381ec..ee8d041bb 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,9 +73,9 @@ UTF-8 UTF-8 - 1.8.19-SNAPSHOT + 1.8.20-SNAPSHOT [0.13.0, 2.0.0) - 1.6.6-SNAPSHOT + 1.6.6 testapp.TestApp diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index 371c549b5..6a42c04ee 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -20,6 +20,7 @@ * #L% */ +import static act.boot.app.FullStackAppBootstrapClassLoader.KEY_CLASSPATH; import static act.util.ClassInfoRepository.canonicalName; import static org.osgl.Lang.requireNotNull; @@ -73,6 +74,7 @@ public class AppClassLoader private Map enhancedResourceCache = new HashMap<>(); private ClassInfoRepository classInfoRepository; private boolean destroyed; + private boolean fullClassGraphBuilt; protected ControllerClassMetaInfoManager controllerInfo; protected MailerClassMetaInfoManager mailerInfo = new MailerClassMetaInfoManager(); protected CommanderClassMetaInfoManager commanderInfo = new CommanderClassMetaInfoManager(); @@ -207,6 +209,34 @@ public Class loadedClass(String name) { return c; } + public synchronized boolean isFullClassGraphBuilt() { + return fullClassGraphBuilt; + } + + public synchronized void buildFullClassGraph() { + if (fullClassGraphBuilt) { + return; + } + E.illegalStateIf(null == classInfoRepository); + C.List path = C.listOf(System.getProperty(KEY_CLASSPATH).split(File.pathSeparator)); + path = path.filter(S.F.endsWith(".jar")); + List jars = path.map(new $.Transformer() { + @Override + public File transform(String s) { + return new File(s); + } + }).sorted(); + Map index = Jars.buildClassNameIndex(jars); + ClassInfoByteCodeScanner scanner = new ClassInfoByteCodeScanner(classInfoRepository()); + ByteCodeVisitor bv = scanner.byteCodeVisitor(); + for (Map.Entry entry : index.entrySet()) { + byte[] ba = entry.getValue(); + ClassReader cr = new ClassReader(ba); + cr.accept(bv, 0); + } + fullClassGraphBuilt = true; + } + @Override protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { Class c = findLoadedClass(name); diff --git a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java index c98bfc9c4..2faa71e74 100644 --- a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java +++ b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java @@ -43,7 +43,7 @@ public class FullStackAppBootstrapClassLoader extends BootstrapClassLoader imple private static final Logger LOGGER = LogManager.get(FullStackAppBootstrapClassLoader.class); - private static final String KEY_CLASSPATH = "java.class.path"; + public static final String KEY_CLASSPATH = "java.class.path"; /** * the {@link System#getProperty(String) system property} key to get @@ -149,13 +149,29 @@ public Enumeration getResources(String name) throws IOException { return super.getResources(name); } + /** + * Returns all jar files in the class loader without filtering. + * @return all jar files + */ + public List allJars() { + return jars(false); + } + protected void preload() { buildIndex(); } + /** + * Returns filtered jar files in the class loader. + * @return filtered jar files. + */ protected List jars() { + return jars(true); + } + + protected List jars(boolean filter) { if (null == jars) { - jars = jars(FullStackAppBootstrapClassLoader.class.getClassLoader()); + jars = jars(FullStackAppBootstrapClassLoader.class.getClassLoader(), filter); jarsChecksum = calculateChecksum(jars); } return jars; @@ -209,13 +225,14 @@ public boolean test(File file) { } private List filterJars(List jars) { - if (null == jarFilter) { - return null; - } return C.list(jars).filter(jarFilter); } public List jars(ClassLoader cl) { + return jars(cl, true); + } + + public List jars(ClassLoader cl, boolean filter) { List jars = null; C.List path = C.listOf(System.getProperty(KEY_CLASSPATH).split(File.pathSeparator)); if (path.size() < 10) { @@ -249,7 +266,7 @@ public File transform(String s) { } }).sorted(); } - return filterJars(jars); + return filter ? filterJars(jars) : jars; } private void saveClassInfoRegistry() { diff --git a/src/main/java/act/event/EventBus.java b/src/main/java/act/event/EventBus.java index 63c5e8387..ee1b936c0 100644 --- a/src/main/java/act/event/EventBus.java +++ b/src/main/java/act/event/EventBus.java @@ -20,9 +20,9 @@ * #L% */ +import act.Act; import act.Destroyable; -import act.app.App; -import act.app.AppServiceBase; +import act.app.*; import act.app.event.SysEvent; import act.app.event.SysEventId; import act.app.event.SysEventListener; @@ -30,7 +30,10 @@ import act.inject.DependencyInjector; import act.inject.util.Sorter; import act.job.JobManager; +import act.util.ClassInfoRepository; +import act.util.ClassNode; import org.osgl.$; +import org.osgl.Lang; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.C; @@ -69,22 +72,8 @@ private enum IdType { private Class[] argTypes; private boolean varargs; private Object[] args; - Key(Object id, SimpleEventListener eventListener) { + Key(Object id, List argTypeList) { setId(id); - setArgTypes(eventListener); - } - Key(Object id, List argTypeList, Object[] args) { - this(id, argTypeList, args, false); - } - Key(Object id, List argTypeList, Object[] args, boolean varargs) { - setId(id); - this.argTypes = convert(argTypeList); - this.args = args; - this.varargs = varargs; - } - - private void setArgTypes(SimpleEventListener eventListener) { - List argTypeList = eventListener.argumentTypes(); if (null == argTypeList || argTypeList.isEmpty()) { this.argTypes = EMPTY_ARG_LIST; return; @@ -93,17 +82,112 @@ private void setArgTypes(SimpleEventListener eventListener) { this.argTypes = convert(argTypeList); int varargsIdx = 1; if (this.id != arg0Type && !arg0Type.isInstance(id)) { - E.illegalArgumentIf(idType == IdType.CLASS, "The first argument in the event listener argument list must be event when binding to an event class (Enum or EventObject). \n\t listener: %s \n\t event: %s", eventListener, this.id); + E.illegalArgumentIf(idType == IdType.CLASS, "The first argument in the event listener argument list must be event when binding to an event class (Enum or EventObject). \n\t listener signatures: %s \n\t event: %s", argTypeList, this.id); varargsIdx = 0; } this.varargs = (varargsIdx + 1) == argTypeList.size() && Object[].class == argTypeList.get(varargsIdx); } + Key(Object id, List argTypeList, Object[] args) { + this(id, argTypeList, args, false); + } + Key(Object id, List argTypeList, Object[] args, boolean varargs) { + setId(id); + this.argTypes = convert(argTypeList); + this.args = args; + this.varargs = varargs; + } private void setId(Object id) { this.idType = typeOf(id); this.id = IdType.CLASS == this.idType && !(id instanceof Class) ? id.getClass() : id; } + public static Set keysOf(Object id, SimpleEventListener eventListener) { + Set retSet = new HashSet<>(); + for (List argTypes : permutationOf(eventListener.argumentTypes())) { + retSet.add(new Key(id, argTypes)); + } + if (retSet.isEmpty()) { + retSet.add(new Key(id, C.list())); + } + return retSet; + } + + /** + * Find the permutation of arg types. E.g + * + * Suppose a declared argTypes is: + * + * ``` + * (List, ISObject) + * ``` + * + * Then permutation of the argTypes includes: + * + * ``` + * (List, ISObject) + * (ArrayList, ISObject) + * (LinkedList, ISObject) + * (ArrayList, SObject) + * (LinkedList, SObject) + * ... + * ``` + * + * @param argTypes + * @return + */ + private static Set> permutationOf(List argTypes) { + int len = argTypes.size(); + if (len == 0) { + return C.Set(); + } + + // get type candidates for each arg position + final AppClassLoader classLoader = Act.app().classLoader(); + ClassInfoRepository repo = classLoader.classInfoRepository(); + final List> candidates = new ArrayList<>(); + for (int i = 0; i < len; ++i) { + Class type = argTypes.get(i); + final List list = new ArrayList<>(); + list.add(type); + candidates.add(list); + ClassNode node = repo.findNode(type); + if (null != node) { + node.visitPublicSubTreeNodes(new Lang.Visitor() { + @Override + public void visit(ClassNode classNode) throws Lang.Break { + list.add(Act.classForName(classNode.name())); + } + }); + } + } + + // generate permutation of argTypes + return permutationOf(candidates, candidates.size() - 1); + } + + private static Set> permutationOf(List> candidates, int workingColumnId) { + if (workingColumnId == 0) { + Set> permutations = new HashSet<>(); + for (Class c : candidates.get(0)) { + permutations.add(C.newList(c)); + } + return permutations; + } else { + Set> prefixPermutations = permutationOf(candidates, workingColumnId - 1); + List currentCandidates = candidates.get(workingColumnId); + Set> retSet = new HashSet<>(); + for (List argList : prefixPermutations) { + for (Class type : currentCandidates) { + List merged = C.newList(argList); + merged.add(type); + retSet.add(merged); + } + } + return retSet; + } + } + static IdType typeOf(Object id) { if (id instanceof String) { return IdType.STRING; @@ -1190,33 +1274,35 @@ public void run() { } private EventBus _bind(Object event, final SimpleEventListener eventListener, boolean async) { - Key key = new Key(event, eventListener); - if (key.idType == Key.IdType.CLASS) { - Class type = $.cast(key.id); - if (EventObject.class.isAssignableFrom(type)) { - if (1 == key.argTypes.length) { - Class eventType = $.cast(type); - ActEventListener actEventListener = new ActEventListenerBase() { - @Override - public void on(EventObject event) { - eventListener.invoke(event); + for (Key key : Key.keysOf(event, eventListener)) { + if (key.idType == Key.IdType.CLASS) { + Class type = $.cast(key.id); + if (EventObject.class.isAssignableFrom(type)) { + if (1 == key.argTypes.length) { + Class eventType = $.cast(type); + ActEventListener actEventListener = new ActEventListenerBase() { + @Override + public void on(EventObject event) { + eventListener.invoke(event); + } + }; + if (async) { + bindAsync(eventType, actEventListener); + } else { + bindSync(eventType, actEventListener); } - }; - if (async) { - bindAsync(eventType, actEventListener); - } else { - bindSync(eventType, actEventListener); + return this; } - return this; } + classesWithAdhocListeners.add(type); + } else if (key.idType == Key.IdType.ENUM) { + enumsWithAdhocListeners.add((Enum) event); + } else { + stringsWithAdhocListeners.add((String) event); } - classesWithAdhocListeners.add(type); - } else if (key.idType == Key.IdType.ENUM) { - enumsWithAdhocListeners.add((Enum) event); - } else { - stringsWithAdhocListeners.add((String) event); + _bind(async ? asyncAdhocEventListeners : adhocEventListeners, key, eventListener); } - return _bind(async ? asyncAdhocEventListeners : adhocEventListeners, key, eventListener); + return this; } private EventBus _bind(ConcurrentMap> listeners, Key key, final SimpleEventListener eventListener) { diff --git a/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java b/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java index d32576378..a38df8644 100644 --- a/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java +++ b/src/main/java/act/event/bytecode/SimpleEventListenerByteCodeScanner.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -28,14 +28,13 @@ import act.event.*; import act.event.meta.SimpleEventListenerMetaInfo; import act.job.JobManager; -import act.util.AsmTypes; -import act.util.Async; -import act.util.ByteCodeVisitor; +import act.util.*; import org.osgl.$; import org.osgl.exception.NotAppliedException; import org.osgl.util.S; import java.lang.annotation.Annotation; +import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; @@ -63,14 +62,35 @@ public void scanFinished(String className) { if (!metaInfoList.isEmpty()) { final EventBus eventBus = app().eventBus(); JobManager jobManager = app().jobManager(); + final ClassInfoRepository repo = app().classLoader().classInfoRepository(); for (final SimpleEventListenerMetaInfo metaInfo : metaInfoList) { SysEventId hookOn = metaInfo.beforeAppStart() ? SysEventId.DEPENDENCY_INJECTOR_PROVISIONED : SysEventId.PRE_START; jobManager.on(hookOn, "SimpleEventListenerByteCodeScanner:bindEventListener:" + metaInfo.jobId(), new Runnable() { @Override public void run() { + ReflectedSimpleEventListener listener = new ReflectedSimpleEventListener(metaInfo.className(), metaInfo.methodName(), metaInfo.paramTypes(), metaInfo.isStatic(), metaInfo.isAsync()); + /* + * Here we might need to build a full class graph so we can generate + * permutation of simple event listener method argument types, and bind + * it to event in the event bus + */ + if (!app().classLoader().isFullClassGraphBuilt() && $.bool(listener.argumentTypes())) { + boolean needBuildFullClassGraph = false; + for (Class c : listener.argumentTypes()) { + if ($.isSimpleType(c) || Modifier.isFinal(c.getModifiers())) { + continue; + } + if (null == repo.findNode(c)) { + needBuildFullClassGraph = true; + break; + } + } + if (needBuildFullClassGraph) { + app().classLoader().buildFullClassGraph(); + } + } for (final Object event : metaInfo.events()) { - final boolean isStatic = metaInfo.isStatic(); - eventBus.bind(event, new ReflectedSimpleEventListener(metaInfo.className(), metaInfo.methodName(), metaInfo.paramTypes(), isStatic, metaInfo.isAsync())); + eventBus.bind(event, listener); } } }); diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 7294719a6..ca7640bfa 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -330,7 +330,11 @@ public Scenario() { @Override public String toString() { - return title(); + S.Buffer buf = S.buffer("[").a(status).a("]").a(title()); + if (partition != "DEFAULT") { + buf.append('@').append(partition); + } + return buf.toString(); } public String title() { diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 6dbce296a..f23277b55 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -44,6 +44,7 @@ import org.osgl.mvc.annotation.PostAction; import org.osgl.util.*; +import java.lang.reflect.Modifier; import java.lang.reflect.Type; import java.net.URL; import java.util.*; @@ -156,14 +157,17 @@ public void clearFixtures() { List toBeDeleted = new ArrayList<>(); for (DbService svc : dbServiceManager.registeredServices()) { for (Class entityClass : svc.entityClasses()) { - if (entityClass.isAnnotationPresent(NotFixture.class)) { + if (Modifier.isAbstract(entityClass.getModifiers())) { continue; } - Dao dao = dbServiceManager.dao(entityClass); - if (dao.getClass().isAnnotationPresent(NotFixture.class)) { + if (entityClass.isAnnotationPresent(NotFixture.class)) { continue; } try { + Dao dao = dbServiceManager.dao(entityClass); + if (dao.getClass().isAnnotationPresent(NotFixture.class)) { + continue; + } toBeDeleted.add(dao); } catch (IllegalArgumentException e) { if (e.getMessage().contains("Cannot find out Dao for model type")) { diff --git a/src/main/java/act/test/util/ScenarioComparator.java b/src/main/java/act/test/util/ScenarioComparator.java index 83bccd565..6e1f89992 100644 --- a/src/main/java/act/test/util/ScenarioComparator.java +++ b/src/main/java/act/test/util/ScenarioComparator.java @@ -62,7 +62,14 @@ public int compare(Scenario o1, Scenario o2) { return -1; } int n = o1.partition.compareTo(o2.partition); - return 0 != n ? n : o1.name.compareTo(o2.name); + if (n != 0) { + return n; + } + n = d1.size() - d2.size(); + if (n != 0) { + return n; + } + return o1.name.compareTo(o2.name); } private List depends(Scenario s, List depends) { diff --git a/src/main/java/act/util/ClassInfoByteCodeScanner.java b/src/main/java/act/util/ClassInfoByteCodeScanner.java index 22b3469d0..c2affc99f 100644 --- a/src/main/java/act/util/ClassInfoByteCodeScanner.java +++ b/src/main/java/act/util/ClassInfoByteCodeScanner.java @@ -32,6 +32,13 @@ public class ClassInfoByteCodeScanner extends AppByteCodeScannerBase { private ClassInfoRepository classInfoRepository; + public ClassInfoByteCodeScanner(ClassInfoRepository classInfoRepository) { + this.classInfoRepository = classInfoRepository; + } + + public ClassInfoByteCodeScanner() { + } + @Override protected void onAppSet() { app().eventBus().bind(SysEventId.CLASS_LOADER_INITIALIZED, new SysEventListenerBase("init-class-info-repo") { @@ -63,18 +70,32 @@ private class _ByteCodeVisitor extends ByteCodeVisitor { @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { super.visit(version, access, name, signature, superName, interfaces); + if (null == superName) { + return; // ignore java.lang.Object + } + String superType = Type.getObjectType(superName).getClassName(); String myName = Type.getObjectType(name).getClassName(); me = classInfoRepository.node(myName); - me.modifiers(access); - String superType = Type.getObjectType(superName).getClassName(); - if (!Object.class.getName().equals(superType)) { - me.parent(superType); + if (me.modifiers() == 0) { + // ASM access some how contains non-class modifiers, get rid of them + access &= ~ACC_SYNCHRONIZED; + access &= ~ACC_VOLATILE; + access &= ~ACC_BRIDGE; + access &= ~ACC_VARARGS; + access &= ~ACC_TRANSIENT; + access &= ~ACC_NATIVE; + access &= ~ACC_STRICT; + access &= ~ACC_MANDATED; + me.modifiers(access); } - if (null != interfaces) { + if (!me.hasInterfaces() && null != interfaces) { for (String intf: interfaces) { me.addInterface(intf); } } + if (null == me.parent() && !Object.class.getName().equals(superType)) { + me.parent(superType); + } } @Override diff --git a/src/main/java/act/util/ClassNode.java b/src/main/java/act/util/ClassNode.java index 30675cc16..a8cfdae9d 100644 --- a/src/main/java/act/util/ClassNode.java +++ b/src/main/java/act/util/ClassNode.java @@ -136,6 +136,10 @@ void addInterface(ClassNode classNode) { } } + public boolean hasInterfaces() { + return !interfaces.isEmpty(); + } + public boolean hasInterface(String name) { return interfaces.containsKey(name); } diff --git a/src/main/java/act/util/TypeConverterRegister.java b/src/main/java/act/util/TypeConverterRegister.java index 676d43576..e3ae12c8e 100644 --- a/src/main/java/act/util/TypeConverterRegister.java +++ b/src/main/java/act/util/TypeConverterRegister.java @@ -30,7 +30,7 @@ public class TypeConverterRegister { TypeConverterRegistry registry = TypeConverterRegistry.INSTANCE; - @SubClassFinder() + @SubClassFinder public void foundTypeConverter(Lang.TypeConverter converter) { registry.register(converter); } diff --git a/src/main/resources/act.jar.black.list b/src/main/resources/act.jar.black.list index d99e78108..c8f79f0f5 100644 --- a/src/main/resources/act.jar.black.list +++ b/src/main/resources/act.jar.black.list @@ -27,6 +27,7 @@ objenesis org.apache.bval.bundle osgl -osgl-mvc +-osgl-storage patchca reflectasm rythm From 02e01fcdf75a3ac46c24331ec731b30c29de97d2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 21 Mar 2019 15:03:54 +1100 Subject: [PATCH 381/730] update osgl-tool to 1.19.2 to fix #1082; add toString() to ActionContext --- CHANGELOG.md | 1 + pom.xml | 2 +- src/main/java/act/app/ActionContext.java | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f475d8478..c452e1fb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Upload file caused server crash #1082 * Event bus - simple event key matching logic needs improvement #1077 * Act-Test - print colourised output when run batch test #1081 * Act-Test - allow developer specify a model shall not be cleared at fixture loading #1080 diff --git a/pom.xml b/pom.xml index 9bbe6b6eb..740f3bbef 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 2.10.1 1.11.3 3.13.1 - 1.19.1 + 1.19.2-SNAPSHOT 1.6.0 1.9.5-SNAPSHOT 1.9.0 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 7351b70b8..68c294c5f 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -186,6 +186,20 @@ private ActionContext(App app, H.Request request, ActResponse response) { this.sessionManager = app.sessionManager(); } + @Override + public String toString() { + H.Request req = request; + if (null == req) { + return "INVALID CONTEXT"; + } + return S.buffer("[") + .a(req.ip()) + .a("]") + .a(req.method()) + .a(" ") + .a(req.url()).toString(); + } + public State state() { return state; } From 98890d121277d21282d5126530c21eb3ad8bedec Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 22 Mar 2019 08:52:24 +1100 Subject: [PATCH 382/730] `ISObject` is not null when no file is uploaded #1083 --- CHANGELOG.md | 1 + src/main/java/act/data/SObjectResolver.java | 4 ++++ .../src/main/java/ghissues/Gh1083.java | 20 ++++++++++++++++++ .../src/main/resources/rythm/1083/form.html | 21 +++++++++++++++++++ .../main/resources/test/scenarios/1083.yml | 17 +++++++++++++++ .../src/main/resources/test/upload/test.txt | 1 + 6 files changed, 64 insertions(+) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1083.java create mode 100644 testapps/GHIssues/src/main/resources/rythm/1083/form.html create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1083.yml create mode 100644 testapps/GHIssues/src/main/resources/test/upload/test.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index c452e1fb7..0d3f9d82e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* `ISObject` is not null when no file is uploaded #1083 * Upload file caused server crash #1082 * Event bus - simple event key matching logic needs improvement #1077 * Act-Test - print colourised output when run batch test #1081 diff --git a/src/main/java/act/data/SObjectResolver.java b/src/main/java/act/data/SObjectResolver.java index a6b0c6dbb..e05a30bed 100644 --- a/src/main/java/act/data/SObjectResolver.java +++ b/src/main/java/act/data/SObjectResolver.java @@ -79,6 +79,10 @@ public SObject resolve(String value) { if (S.blank(value)) { return null; } + if (value.length() < 15) { + // assume it is model name (the parameter name) + return null; + } // last try base64 decoder try { return resolveFromBase64(value); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1083.java b/testapps/GHIssues/src/main/java/ghissues/Gh1083.java new file mode 100644 index 000000000..9736d29c1 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1083.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.TemplateContext; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.storage.ISObject; + +@UrlContext("1083") +@TemplateContext("1083") +public class Gh1083 extends BaseController { + @GetAction + public void form() { + } + + @PostAction + public boolean handleUpload(ISObject file, String fileName) { + return null == file; + } +} diff --git a/testapps/GHIssues/src/main/resources/rythm/1083/form.html b/testapps/GHIssues/src/main/resources/rythm/1083/form.html new file mode 100644 index 000000000..a4256b952 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/rythm/1083/form.html @@ -0,0 +1,21 @@ + + + GH1083 + + +

                                                                                                                                                                        + refer to Github Issue #1083 +

                                                                                                                                                                        +
                                                                                                                                                                        +
                                                                                                                                                                        + +
                                                                                                                                                                        +
                                                                                                                                                                        + +
                                                                                                                                                                        +
                                                                                                                                                                        + +
                                                                                                                                                                        +
                                                                                                                                                                        + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1083.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1083.yml new file mode 100644 index 000000000..f1ed8c1c1 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1083.yml @@ -0,0 +1,17 @@ +Scenario(1083): + description: "[1083] `ISObject` is not null when no file is uploaded" + interactions: + - description: It shall be null when no file uploaded + request: + post: 1083 + response: + json: + result: true + - description: It shall NOT be null when file uploaded + request: + post: 1083 + parts: + file: test.txt + response: + json: + result: false diff --git a/testapps/GHIssues/src/main/resources/test/upload/test.txt b/testapps/GHIssues/src/main/resources/test/upload/test.txt new file mode 100644 index 000000000..f2ba8f84a --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/upload/test.txt @@ -0,0 +1 @@ +abc \ No newline at end of file From 18462062c52adec937e8e9dab2126fd7cf1e14d7 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 22 Mar 2019 22:57:47 +1100 Subject: [PATCH 383/730] fix #1085 API doc - make it consistent for styling of javadoc code block and sample code block and #1084 API doc - capture field javadoc comment --- CHANGELOG.md | 2 ++ src/main/java/act/apidoc/ApiManager.java | 30 ++++++++++++++++--- src/main/java/act/apidoc/Endpoint.java | 6 +++- .../act/apidoc/SimpleEndpointIdProvider.java | 2 +- .../asset/~act/apibook/endpoint_list.tag | 11 ++++++- 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d3f9d82e..5435d6a3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.20** +* API doc - make it consistent for styling of javadoc code block and sample code block #1085 +* API doc - capture field javadoc comment #1084 * `ISObject` is not null when no file is uploaded #1083 * Upload file caused server crash #1082 * Event bus - simple event key matching logic needs improvement #1077 diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index 83544dd52..eaad35224 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -220,6 +220,7 @@ private Set withSuperClasses(Set classes) { private void exploreDescriptions(Set controllerClasses) { DevModeClassLoader cl = $.cast(Act.app().classLoader()); Map methodJavaDocs = new HashMap<>(); + Map fieldJavaDocs = new HashMap<>(); for (Class controllerClass: withSuperClasses(controllerClasses)) { Source src = cl.source(controllerClass); if (null == src) { @@ -230,7 +231,7 @@ private void exploreDescriptions(Set controllerClasses) { List types = compilationUnit.getTypes(); for (TypeDeclaration type : types) { if (type instanceof ClassOrInterfaceDeclaration) { - exploreDeclaration((ClassOrInterfaceDeclaration) type, methodJavaDocs, ""); + exploreDeclaration((ClassOrInterfaceDeclaration) type, methodJavaDocs, fieldJavaDocs, ""); } } } catch (Exception e) { @@ -256,7 +257,16 @@ private void exploreDescriptions(Set controllerClasses) { } Map paramLookup = new HashMap<>(); for (ParamInfo param : params) { - paramLookup.put(param.getName(), param); + String paramName = param.getName(); + paramLookup.put(paramName, param); + String fieldKey = S.concat(SimpleEndpointIdProvider.className(endpoint.controllerClass), ".", paramName); + Javadoc fieldJavadoc = fieldJavaDocs.get(fieldKey); + if (null != fieldJavadoc) { + JavadocDescription fieldJavadocDesc = fieldJavadoc.getDescription(); + if (null != fieldJavadocDesc) { + param.setDescription(fieldJavadocDesc.toText()); + } + } } List blockTags = javadoc.getBlockTags(); for (JavadocBlockTag tag : blockTags) { @@ -274,12 +284,24 @@ private void exploreDescriptions(Set controllerClasses) { private static final Set actionAnnotations = C.set("Action", "GetAction", "PostAction", "PutAction", "DeleteAction"); - private void exploreDeclaration(ClassOrInterfaceDeclaration classDeclaration, Map methodJavaDocs, String prefix) { + private void exploreDeclaration(ClassOrInterfaceDeclaration classDeclaration, Map methodJavaDocs, Map fieldJavaDocs, String prefix) { String className = classDeclaration.getName(); String newPrefix = S.blank(prefix) ? className : S.concat(prefix, ".", className); for (Node node : classDeclaration.getChildrenNodes()) { if (node instanceof ClassOrInterfaceDeclaration) { - exploreDeclaration((ClassOrInterfaceDeclaration) node, methodJavaDocs, newPrefix); + exploreDeclaration((ClassOrInterfaceDeclaration) node, methodJavaDocs, fieldJavaDocs, newPrefix); + } else if (node instanceof FieldDeclaration) { + FieldDeclaration fieldDeclaration = (FieldDeclaration) node; + Comment comment = fieldDeclaration.getComment(); + if (!(comment instanceof JavadocComment)) { + continue; + } + List vars = fieldDeclaration.getVariables(); + if (vars.size() > 0) { + JavadocComment javadocComment = (JavadocComment) comment; + Javadoc javadoc = JavadocParser.parse(javadocComment); + fieldJavaDocs.put(S.concat(newPrefix, ".", vars.get(0).getId()), javadoc); + } } else if (node instanceof MethodDeclaration) { MethodDeclaration methodDeclaration = (MethodDeclaration) node; List annoList = methodDeclaration.getAnnotations(); diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index c55f15e5e..329b88761 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -44,7 +44,8 @@ import org.osgl.$; import org.osgl.OsglConfig; import org.osgl.http.H; -import org.osgl.inject.*; +import org.osgl.inject.BeanSpec; +import org.osgl.inject.Injector; import org.osgl.logging.Logger; import org.osgl.mvc.result.Result; import org.osgl.storage.ISObject; @@ -481,6 +482,9 @@ private String generateSampleJson(BeanSpec spec, Map typeParamLoo if (null == sample) { return null; } + if (sample instanceof Map && ((Map) sample).isEmpty()) { + return null; + } if ($.isSimpleType(type)) { sample = C.Map("result", sample); } diff --git a/src/main/java/act/apidoc/SimpleEndpointIdProvider.java b/src/main/java/act/apidoc/SimpleEndpointIdProvider.java index ec9a65fca..e99f3020e 100644 --- a/src/main/java/act/apidoc/SimpleEndpointIdProvider.java +++ b/src/main/java/act/apidoc/SimpleEndpointIdProvider.java @@ -53,7 +53,7 @@ static String id(Class controllerClass, Method method) { return className(controllerClass) + "." + method.getName(); } - static String className(Class clz) { + public static String className(Class clz) { Class enclosing = clz.getEnclosingClass(); if (null != enclosing) { return className(enclosing) + "." + clz.getSimpleName(); diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index 5da5f6f13..28c4ac217 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -153,7 +153,8 @@ padding: 10pt; background: #444; max-width: 1280px; - font-size: 12pt; + font-size: 14px; + font-weight: 500; line-height: 1.5; overflow-x: auto; margin: 16px 0 16px 0; @@ -193,6 +194,11 @@ self.fetchEndpoints() }) self.selectedModules = [] + patchPreCode() { + $('pre > code').each(function() { + $(this).parent().addClass('code') + }) + } filteredEndpoints() { if (!self.filter) { return self.endpoints @@ -209,15 +215,18 @@ self.endpoints = endpoints self.update() riot.store.trigger('endpoints-fetched', endpoints); + self.patchPreCode() }) } riot.store.on('module-selected', function(modules) { self.selectedModules = modules; self.update() + self.patchPreCode() }) riot.store.on('filter-changed', function(filter) { self.filter = filter self.update() + self.patchPreCode() }) show(endpoint) { var ret = self.selectedModules.indexOf(endpoint.module) > -1; From fb052b1496518da201c99f43c751e8fb0cdde604 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 22 Mar 2019 23:08:17 +1100 Subject: [PATCH 384/730] minor update in apibook endpoint list page style --- src/main/resources/asset/~act/apibook/endpoint_list.tag | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index 28c4ac217..40a963d7b 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -116,6 +116,7 @@ td pre { margin-top: 0; + margin-bottom: 0; } div.endpoint { From 31dd04876a349ad38c34d117b9d8f9429fa113e3 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 23 Mar 2019 13:33:44 +1100 Subject: [PATCH 385/730] API doc - multiple improvements --- src/main/java/act/apidoc/ApiManager.java | 25 ++--- src/main/java/act/apidoc/Endpoint.java | 102 ++++++++++++++---- .../impl/ReflectedHandlerInvoker.java | 4 + .../param/StringValueResolverValueLoader.java | 2 +- .../asset/~act/apibook/endpoint_list.tag | 26 +++-- .../resources/asset/~act/apibook/index.html | 6 +- 6 files changed, 116 insertions(+), 49 deletions(-) diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index eaad35224..e7f2eb844 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -43,7 +43,6 @@ import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.comments.Comment; import com.github.javaparser.ast.comments.JavadocComment; -import com.github.javaparser.ast.expr.AnnotationExpr; import org.osgl.$; import org.osgl.Lang; import org.osgl.exception.NotAppliedException; @@ -53,6 +52,7 @@ import org.osgl.util.*; import java.io.File; +import java.lang.reflect.Modifier; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -269,6 +269,7 @@ private void exploreDescriptions(Set controllerClasses) { } } List blockTags = javadoc.getBlockTags(); + String returnDesc = null; for (JavadocBlockTag tag : blockTags) { if ("param".equals(tag.getTagName())) { String paramName = tag.getName().get(); @@ -276,14 +277,17 @@ private void exploreDescriptions(Set controllerClasses) { if (null != paramInfo) { paramInfo.setDescription(tag.getContent().toText()); } + } else if ("return".equals(tag.getTagName())) { + returnDesc = tag.getContent().toText(); } } + if (null != returnDesc) { + endpoint.returnDescription = returnDesc; + } } } } - private static final Set actionAnnotations = C.set("Action", "GetAction", "PostAction", "PutAction", "DeleteAction"); - private void exploreDeclaration(ClassOrInterfaceDeclaration classDeclaration, Map methodJavaDocs, Map fieldJavaDocs, String prefix) { String className = classDeclaration.getName(); String newPrefix = S.blank(prefix) ? className : S.concat(prefix, ".", className); @@ -304,17 +308,10 @@ private void exploreDeclaration(ClassOrInterfaceDeclaration classDeclaration, Ma } } else if (node instanceof MethodDeclaration) { MethodDeclaration methodDeclaration = (MethodDeclaration) node; - List annoList = methodDeclaration.getAnnotations(); - boolean needJavadoc = false; - if (null != annoList && !annoList.isEmpty()) { - for (AnnotationExpr anno : annoList) { - String annoName = anno.getName().getName(); - if (actionAnnotations.contains(annoName)) { - needJavadoc = true; - break; - } - } - } + // Note we can't check only request handler annotation here + // because we need to cater for the extended request handler declaration + // which does not have the annotation specified + boolean needJavadoc = Modifier.isPublic(methodDeclaration.getModifiers()); if (!needJavadoc) { continue; } diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 329b88761..7867d3649 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -47,6 +47,7 @@ import org.osgl.inject.BeanSpec; import org.osgl.inject.Injector; import org.osgl.logging.Logger; +import org.osgl.mvc.annotation.*; import org.osgl.mvc.result.Result; import org.osgl.storage.ISObject; import org.osgl.storage.impl.SObject; @@ -66,7 +67,7 @@ public class Endpoint implements Comparable, EndpointIdProvider { private static final Logger LOGGER = ApiManager.LOGGER; - private static BeanSpecInterpreter beanSpecInterpretor = new BeanSpecInterpreter(); + private static BeanSpecInterpreter beanSpecInterpreter = new BeanSpecInterpreter(); public static class ParamInfo { public String bindName; @@ -77,8 +78,6 @@ public static class ParamInfo { public boolean required; public List options; - private ParamInfo() {} - private ParamInfo(String bindName, BeanSpec beanSpec, String description) { this.bindName = bindName; this.beanSpec = beanSpec; @@ -93,7 +92,7 @@ public String getName() { } public String getType() { - return null == beanSpec ? type : beanSpecInterpretor.interpret(beanSpec); + return null == beanSpec ? type : beanSpecInterpreter.interpret(beanSpec); } public String getDescription() { @@ -191,6 +190,11 @@ public enum Scheme { */ public String description; + /** + * The return info description + */ + public String returnDescription; + public String module; private transient Class returnType; @@ -355,13 +359,15 @@ private void explore(RequestHandler handler) { this.description = null == descAnno ? id(controllerClass, method) : descAnno.value(); Module methodModule = method.getAnnotation(Module.class); this.module = null == methodModule ? classModuleText : methodModule.value(); - exploreParamInfo(method, typeParamLookup); + boolean payloadMethod = H.Method.POST == httpMethod || H.Method.PUT == httpMethod || H.Method.PATCH == httpMethod; + boolean body = payloadMethod && null != invoker.singleJsonFieldName(); + exploreParamInfo(method, typeParamLookup, body); if (!Modifier.isStatic(method.getModifiers())) { - exploreParamInfo(controllerClass, typeParamLookup); + exploreParamInfo(controllerClass, typeParamLookup, body); } this.controllerClass = controllerClass; try { - returnSample = void.class == returnType ? null : generateSampleJson(BeanSpec.of(returnType, null, Act.injector()), typeParamLookup, true); + this.returnSample = void.class == returnType ? null : generateSampleJson(BeanSpec.of(returnType, null, Act.injector()), typeParamLookup, true); } catch (Exception e) { LOGGER.warn(e, "Error creating returnSample of endpoint for request handler [%s] for [%s %s]", handler, httpMethod, path); } @@ -376,21 +382,25 @@ private String inferModule(Class controllerClass) { return controllerClass.getSimpleName(); } - private void exploreParamInfo(Method method, Map typeParamLookup) { + private void exploreParamInfo(Method method, Map typeParamLookup, boolean body) { Type[] paramTypes = method.getGenericParameterTypes(); int paramCount = paramTypes.length; if (0 == paramCount) { return; } DependencyInjector injector = Act.injector(); - Annotation[][] allAnnos = method.getParameterAnnotations(); + Method declaredMethod = overridenRequestHandlerMethod(method); + if (null == declaredMethod) { + return; + } + Annotation[][] allAnnos = declaredMethod.getParameterAnnotations(); Map sampleData = new HashMap<>(); StringValueResolverManager resolver = Act.app().resolverManager(); List sampleQuery = new ArrayList<>(); for (int i = 0; i < paramCount; ++i) { Type type = paramTypes[i]; Annotation[] annos = allAnnos[i]; - ParamInfo info = paramInfo(type, typeParamLookup, annos, injector, null); + ParamInfo info = paramInfo(type, typeParamLookup, annos, injector, null, body); if (null != info) { params.add(info); if (path.contains("{" + info.getName() + "}")) { @@ -414,7 +424,11 @@ private void exploreParamInfo(Method method, Map typeParamLookup) } } if (!sampleData.isEmpty()) { - sampleJsonPost = JSON.toJSONString(sampleData, true); + Object payload = sampleData; + if (sampleData.size() == 1) { + payload = sampleData.values().iterator().next(); + } + sampleJsonPost = null == payload ? null : JSON.toJSONString(payload, true); } if (!sampleQuery.isEmpty()) { this.sampleQuery = S.join("&", sampleQuery); @@ -429,20 +443,20 @@ public boolean test(Field field) { } }; - private void exploreParamInfo(Class controller, Map typeParamLookup) { + private void exploreParamInfo(Class controller, Map typeParamLookup, boolean body) { DependencyInjector injector = Act.injector(); List fields = $.fieldsOf(controller, FIELD_PREDICATE); for (Field field : fields) { Type type = field.getGenericType(); Annotation[] annos = field.getAnnotations(); - ParamInfo info = paramInfo(type, typeParamLookup, annos, injector, field.getName()); + ParamInfo info = paramInfo(type, typeParamLookup, annos, injector, field.getName(), body); if (null != info) { params.add(info); } } } - private ParamInfo paramInfo(Type type, Map typeParamLookup, Annotation[] annos, DependencyInjector injector, String name) { + private ParamInfo paramInfo(Type type, Map typeParamLookup, Annotation[] annos, DependencyInjector injector, String name, boolean body) { if (isLoginUser(annos)) { return null; } @@ -461,7 +475,7 @@ private ParamInfo paramInfo(Type type, Map typeParamLookup, Annot if (null != descAnno) { description = descAnno.value(); } - return new ParamInfo(spec.name(), spec, description); + return new ParamInfo(body ? spec.name() + " (body)" : spec.name(), spec, description); } private boolean isLoginUser(Annotation[] annos) { @@ -666,18 +680,25 @@ public static Object generateSampleData( typeParams = Generics.typeParamImplementations(classType, Map.class); } if (typeParams.size() < 2) { - map.put(S.random(), S.random()); - map.put(S.random(), S.random()); + return null; } else { Type keyType = typeParams.get(0); Type valType = typeParams.get(1); - map.put( - generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn), - generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); - map.put( - generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn), - generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); + if (Object.class == valType) { + return null; + } + Object key1 = "foo"; + Object key2 = "bar"; + if (keyType != String.class) { + key1 = generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); + key2 = generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); + } + Object val1 = generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); + Object val2 = generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); + map.put(key1, val1); + map.put(key2, val2); } + return map; } else if (Iterable.class.isAssignableFrom(classType)) { Collection col = $.cast(Act.getInstance(classType)); List typeParams = spec.typeParams(); @@ -856,5 +877,40 @@ private static boolean shouldWaive(Method getter, Class implementClass) { || OsglConfig.globalMappingFilter_shouldIgnore(fieldName); } + private static Method overridenRequestHandlerMethod(Method method) { + if (!Modifier.isPublic(method.getModifiers())) { + return null; + } + if (isRequestHandler(method)) { + return method; + } + Method overridenMethod = overridenMethod(method); + return null == overridenMethod ? null : overridenRequestHandlerMethod(overridenMethod); + } + + private static Method overridenMethod(Method method) { + Class host = method.getDeclaringClass(); + Class superHost = host.getSuperclass(); + if (null == superHost || Object.class == superHost) { + return null; + } + Method[] ma = superHost.getMethods(); + for (Method m : ma) { + if (m.getName().equals(method.getName()) && $.eq2(method.getParameterTypes(), method.getParameterTypes())) { + return m; + } + } + return null; + } + + private static boolean isRequestHandler(Method method) { + return method.isAnnotationPresent(Action.class) + || method.isAnnotationPresent(GetAction.class) + || method.isAnnotationPresent(PutAction.class) + || method.isAnnotationPresent(PostAction.class) + || method.isAnnotationPresent(PatchAction.class) + || method.isAnnotationPresent(DeleteAction.class); + } + } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 59c98fee0..36ab876a6 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -719,6 +719,10 @@ public void setLargeResponseHint() { } } + public String singleJsonFieldName() { + return singleJsonFieldName; + } + private void cacheJsonDto(ActContext context, JsonDto dto) { context.attribute(JsonDto.CTX_ATTR_KEY, dto); } diff --git a/src/main/java/act/inject/param/StringValueResolverValueLoader.java b/src/main/java/act/inject/param/StringValueResolverValueLoader.java index 2d4ded989..fd154a6c5 100644 --- a/src/main/java/act/inject/param/StringValueResolverValueLoader.java +++ b/src/main/java/act/inject/param/StringValueResolverValueLoader.java @@ -85,7 +85,7 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { ParamTree paramTree = ParamValueLoaderService.paramTree(); if (null != paramTree) { return load(paramTree, context); - } else if (context instanceof ActionContext && ((ActionContext) context).isAllowIgnoreParamNamespace()) { + } else if (context instanceof ActionContext && context.isAllowIgnoreParamNamespace()) { paramTree = ParamValueLoaderService.ensureParamTree(context); return load(paramTree, context); } diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index 40a963d7b..8fbbd1183 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -1,10 +1,14 @@
                                                                                                                                                                          -
                                                                                                                                                                        [{ endpoint.httpMethod }] { endpoint.path }
                                                                                                                                                                        +

                                                                                                                                                                        [{ endpoint.httpMethod }] { endpoint.path }

                                                                                                                                                                        +
                                                                                                                                                                        + return  + {endpoint.returnDescription} +
                                                                                                                                                                        -

                                                                                                                                                                        Parameters

                                                                                                                                                                        +
                                                                                                                                                                        Parameters
                                                                                                                                                                        N/A @@ -28,7 +32,7 @@ { defaultValue } N/A -
                                                                                                                                                                        { description }
                                                                                                                                                                        + { description } @@ -36,15 +40,15 @@
                                                                                                                                                                        -

                                                                                                                                                                        Query example

                                                                                                                                                                        +
                                                                                                                                                                        Query example
                                                                                                                                                                        { endpoint.sampleQuery }
                                                                                                                                                                        -

                                                                                                                                                                        Json body example

                                                                                                                                                                        +
                                                                                                                                                                        Json body example
                                                                                                                                                                        { endpoint.sampleJsonPost }
                                                                                                                                                                        -

                                                                                                                                                                        Return value sample

                                                                                                                                                                        +
                                                                                                                                                                        Return value sample
                                                                                                                                                                        { endpoint.returnSample }
                                                                                                                                                                        @@ -59,6 +63,10 @@ margin-bottom: 0.2em; } + h4.entry { + font-family: "Noto Sans Mono CJK SC", Menlo, Consolas, "Envy Code R", + } + div.desc { margin-top: 10px; margin-bottom: 10px; @@ -82,7 +90,7 @@ td, th { width: 1px; padding: 5px 1em; - font-size: .9em; + font-size: 12px; white-space: nowrap; } @@ -100,7 +108,7 @@ } td:not(:first-child) { - font-family: monospace; + font-family: "Envy Code R", "Roboto Mono", Menlo, Consolas, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace; } td:first-child, th:first-child { @@ -155,7 +163,7 @@ background: #444; max-width: 1280px; font-size: 14px; - font-weight: 500; + font-weight: 400; line-height: 1.5; overflow-x: auto; margin: 16px 0 16px 0; diff --git a/src/main/resources/asset/~act/apibook/index.html b/src/main/resources/asset/~act/apibook/index.html index da6a88bfc..0a9d97a48 100644 --- a/src/main/resources/asset/~act/apibook/index.html +++ b/src/main/resources/asset/~act/apibook/index.html @@ -46,12 +46,14 @@ } h4 { font-size: 21px; + font-weight: 500; } h5 { - font-size: 18px; + font-size: 16px; + font-weight: 500; } .code, code { - font-family: "Roboto Mono", "Envy Code R", Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace; + font-family: "Envy Code R", "Roboto Mono", Menlo, Consolas, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace; } From 2d2565a45fded1efdcc3bc7755733ae2a78f9aa5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 23 Mar 2019 22:14:34 +1100 Subject: [PATCH 386/730] API Doc - improve support for endpoints defined in parent class #1086 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/ApiManager.java | 9 ++-- src/main/java/act/apidoc/Endpoint.java | 47 +++++++++++++++++-- src/main/java/act/test/Scenario.java | 1 - .../asset/~act/apibook/endpoint_list.tag | 6 ++- 5 files changed, 50 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5435d6a3a..7fbd917a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* API Doc - improve support for endpoints defined in parent class #1086 * API doc - make it consistent for styling of javadoc code block and sample code block #1085 * API doc - capture field javadoc comment #1084 * `ISObject` is not null when no file is uploaded #1083 diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index e7f2eb844..e3699bbf3 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -252,9 +252,6 @@ private void exploreDescriptions(Set controllerClasses) { endpoint.setDescription(desc); } List params = endpoint.getParams(); - if (params.isEmpty()) { - continue; - } Map paramLookup = new HashMap<>(); for (ParamInfo param : params) { String paramName = param.getName(); @@ -264,7 +261,7 @@ private void exploreDescriptions(Set controllerClasses) { if (null != fieldJavadoc) { JavadocDescription fieldJavadocDesc = fieldJavadoc.getDescription(); if (null != fieldJavadocDesc) { - param.setDescription(fieldJavadocDesc.toText()); + param.setDescription(endpoint.processTypeImplSubstitution(fieldJavadocDesc.toText())); } } } @@ -275,14 +272,14 @@ private void exploreDescriptions(Set controllerClasses) { String paramName = tag.getName().get(); ParamInfo paramInfo = paramLookup.get(paramName); if (null != paramInfo) { - paramInfo.setDescription(tag.getContent().toText()); + paramInfo.setDescription(endpoint.processTypeImplSubstitution(tag.getContent().toText())); } } else if ("return".equals(tag.getTagName())) { returnDesc = tag.getContent().toText(); } } if (null != returnDesc) { - endpoint.returnDescription = returnDesc; + endpoint.returnDescription = endpoint.processTypeImplSubstitution(returnDesc); } } } diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 7867d3649..51894976b 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -21,8 +21,8 @@ */ import static act.apidoc.SampleDataCategory.EMAIL; +import static act.apidoc.SimpleEndpointIdProvider.className; import static act.apidoc.SimpleEndpointIdProvider.id; -import static jdk.nashorn.internal.codegen.CompilerConstants.className; import act.Act; import act.app.data.StringValueResolverManager; @@ -199,6 +199,8 @@ public enum Scheme { private transient Class returnType; + private Map typeLookups; + public String returnSample; /** @@ -236,6 +238,11 @@ public int compareTo(Endpoint o) { return httpMethod.ordinal() - o.httpMethod.ordinal(); } + @Override + public String toString() { + return id; + } + public String getId() { return id; } @@ -281,7 +288,7 @@ public String getDescription() { } public void setDescription(String description) { - this.description = description; + this.description = processTypeImplSubstitution(description); } public String getModule() { @@ -323,10 +330,40 @@ public Class controllerClass() { return controllerClass; } + public String processTypeImplSubstitution(String s) { + int n = s.indexOf("${"); + if (n < 0) { + return s; + } + int a = 0; + int z = n; + S.Buffer buf = S.buffer(); + while (true) { + buf.append(s.substring(a, z)); + n = s.indexOf("}", z); + a = n; + E.illegalArgumentIf(n < -1, "Invalid string: " + s); + String key = s.substring(z + 2, a); + Class impl = typeLookups.get(key); + if (null != impl) { + buf.append(Keyword.of(className(impl)).readable().toLowerCase()); + } else { + buf.append("${").append(key).append("}"); + } + n = s.indexOf("${", a); + if (n < 0) { + buf.append(s.substring(a + 1)); + return buf.toString(); + } + z = n; + } + } + private void explore(RequestHandler handler) { RequestHandlerProxy proxy = $.cast(handler); ReflectedHandlerInvoker invoker = $.cast(proxy.actionHandler().invoker()); Class controllerClass = invoker.controllerClass(); + typeLookups = Generics.buildTypeParamImplLookup(controllerClass); Method method = invoker.method(); returnType = Generics.getReturnType(method, controllerClass); PropertySpec pspec = method.getAnnotation(PropertySpec.class); @@ -677,7 +714,7 @@ public static Object generateSampleData( Map map = $.cast(Act.getInstance(classType)); List typeParams = spec.typeParams(); if (typeParams.isEmpty()) { - typeParams = Generics.typeParamImplementations(classType, Map.class); + typeParams = Generics.tryGetTypeParamImplementations(classType, Map.class); } if (typeParams.size() < 2) { return null; @@ -703,10 +740,10 @@ public static Object generateSampleData( Collection col = $.cast(Act.getInstance(classType)); List typeParams = spec.typeParams(); if (typeParams.isEmpty()) { - typeParams = Generics.typeParamImplementations(classType, Map.class); + typeParams = Generics.tryGetTypeParamImplementations(classType, Map.class); } if (typeParams.isEmpty()) { - col.add(S.random()); + return null; } else { Type componentType = typeParams.get(0); col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index ca7640bfa..23a383cbd 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -1110,7 +1110,6 @@ String processStringSubstitution(String s) { buf.append(s.substring(a, z)); n = s.indexOf("}", z); a = n; - E.illegalArgumentIf(n < -1, "Invalid string: " + s); String part = s.substring(z + 2, a); if (part.contains("(") && part.endsWith(")")) { buf.append(evalFunc(part)); diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index 8fbbd1183..7416d961b 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -64,7 +64,10 @@ } h4.entry { - font-family: "Noto Sans Mono CJK SC", Menlo, Consolas, "Envy Code R", + font-family: "Noto Sans Mono CJK SC", Menlo, Consolas, "Envy Code R"; + border-bottom: 1px solid #aaa; + display: block; + padding-bottom: 10px; } div.desc { @@ -129,7 +132,6 @@ div.endpoint { padding-bottom: 25px; - border-bottom: 1px solid #aaa; } .endpoint > .desc { From df77062c645c9e9dfc912a3e32a9abfe33ca0682 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 24 Mar 2019 08:50:39 +1100 Subject: [PATCH 387/730] add favicon to API and Test page --- .../asset/~act/apibook/endpoint_list.tag | 10 +++++----- src/main/resources/asset/~act/apibook/index.html | 1 + src/main/resources/asset/~act/img/apibook.png | Bin 0 -> 1467 bytes src/main/resources/asset/~act/img/test.png | Bin 0 -> 1822 bytes src/main/resources/rythm/~test.html | 1 + 5 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/asset/~act/img/apibook.png create mode 100644 src/main/resources/asset/~act/img/test.png diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index 7416d961b..1e7cd9c6d 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -3,10 +3,6 @@  

                                                                                                                                                                        [{ endpoint.httpMethod }] { endpoint.path }

                                                                                                                                                                        -
                                                                                                                                                                        - return  - {endpoint.returnDescription} -
                                                                                                                                                                        Parameters
                                                                                                                                                                        @@ -38,6 +34,10 @@
                                                                                                                                                                        +
                                                                                                                                                                        +
                                                                                                                                                                        Return
                                                                                                                                                                        +
                                                                                                                                                                        { endpoint.returnDescription }
                                                                                                                                                                        +
                                                                                                                                                                        Query example
                                                                                                                                                                        @@ -171,7 +171,7 @@ margin: 16px 0 16px 0; } - .param-list-body { + .param-list-body, .return-desc { padding: 10px; background: #444; max-width: 1280px; diff --git a/src/main/resources/asset/~act/apibook/index.html b/src/main/resources/asset/~act/apibook/index.html index 0a9d97a48..43dc381e6 100644 --- a/src/main/resources/asset/~act/apibook/index.html +++ b/src/main/resources/asset/~act/apibook/index.html @@ -4,6 +4,7 @@ apibook - { appName } + From 664f40b8bfa09e891ccf7816149e8f9647e04992 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 26 Mar 2019 08:33:18 +1100 Subject: [PATCH 398/730] Act-Test - add refId property to Scenario #1091 --- CHANGELOG.md | 1 + src/main/java/act/test/Scenario.java | 2 ++ src/main/java/act/test/util/ScenarioManager.java | 3 +++ 3 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1deb66ff..bc6041277 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Act-Test - add refId property to Scenario #1091 * Add switch to disable auto hot deploy in DEV mode #1090 * GH 1078 - Log warn message when `@Global` is found on instance method of an abstract class * API Doc - handle `@inheritDoc` tag #1089 diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 3365687bd..e873bf804 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -298,6 +298,8 @@ private String verifyXmlBody(Object xmlBody) { private CookieStore cookieStore; private App app; public String name; + // GH1091 - a user friendly name for dependency reference + public String refId; public String description; public boolean ignore = false; public List fixtures = new ArrayList<>(); diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index f62cbc3d7..6dc1c4edd 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -199,6 +199,9 @@ private void parseOne(String content, String fileName) { } } this.store.put(Keyword.of(key), scenario); + if (S.notBlank(scenario.refId)) { + this.store.put(Keyword.of(scenario.refId), scenario); + } } } From 91d6975f135ccfcb1f2bc4403c075a901902cb85 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 27 Mar 2019 06:40:15 +1100 Subject: [PATCH 399/730] multiple improvements including better handling JPA raised ConstraintsViolationException - #1069 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 5 +- src/main/java/act/app/DbServiceManager.java | 8 +- src/main/java/act/conf/ActConfig.java | 4 + src/main/java/act/conf/ConfAdmin.java | 11 ++ .../java/act/data/DataPropertyRepository.java | 2 + .../controller/RequestHandlerProxy.java | 15 ++- .../java/act/inject/param/JsonDtoPatch.java | 3 +- src/main/java/act/test/Interaction.java | 22 +++- src/main/java/act/test/Scenario.java | 7 +- .../java/act/test/util/ScenarioManager.java | 5 + .../java/act/util/ReflectedInvokerHelper.java | 14 ++- .../java/act/validation/ValidationPlugin.java | 5 +- src/main/java/act/view/ActErrorResult.java | 20 ++- src/main/resources/rythm/~test.html | 13 +- testapps/GH1069/.gitignore | 19 --- testapps/GH1069/README.md | 1 - testapps/GH1069/pom.xml | 47 ------- .../GH1069/src/main/java/test/AppEntry.java | 18 --- .../GH1069/src/main/resources/app.properties | 1 - .../GH1069/src/main/resources/logback.xml | 118 ------------------ .../src/main/resources/test/scenarios.yml | 0 testapps/GHIssues/pom.xml | 13 ++ .../java/ghissues/gh1069/Gh1069User.java} | 8 +- .../java/ghissues/gh1069/Gh1069_Service.java | 20 +++ .../main/java/ghissues/gh1069}/Unique.java | 2 +- .../ghissues/gh1069}/UniqueValidator.java | 2 +- .../main/resources/test/scenarios/1001.yml | 2 +- .../main/resources/test/scenarios/1005.yml | 2 +- .../main/resources/test/scenarios/1015.yml | 2 +- .../main/resources/test/scenarios/1016.yml | 2 +- .../main/resources/test/scenarios/1022.yml | 2 +- .../main/resources/test/scenarios/1026.yml | 2 +- .../main/resources/test/scenarios/1049.yml | 2 +- .../main/resources/test/scenarios/1058.yml | 2 +- .../main/resources/test/scenarios/1061.yml | 2 +- .../main/resources/test/scenarios/1064.yml | 2 +- .../main/resources/test/scenarios/1069.yml | 18 +++ .../main/resources/test/scenarios/1073.yml | 2 +- .../main/resources/test/scenarios/1078.yml | 2 +- .../main/resources/test/scenarios/1083.yml | 2 +- .../src/main/resources/test/scenarios/784.yml | 2 +- .../src/main/resources/test/scenarios/786.yml | 2 +- .../src/main/resources/test/scenarios/790.yml | 2 +- .../src/main/resources/test/scenarios/796.yml | 2 +- .../src/main/resources/test/scenarios/797.yml | 2 +- .../src/main/resources/test/scenarios/798.yml | 2 +- .../src/main/resources/test/scenarios/809.yml | 2 +- .../src/main/resources/test/scenarios/819.yml | 2 +- .../src/main/resources/test/scenarios/820.yml | 2 +- .../src/main/resources/test/scenarios/821.yml | 2 +- .../src/main/resources/test/scenarios/823.yml | 2 +- .../src/main/resources/test/scenarios/829.yml | 2 +- .../src/main/resources/test/scenarios/835.yml | 2 +- .../src/main/resources/test/scenarios/841.yml | 2 +- .../src/main/resources/test/scenarios/844.yml | 2 +- .../src/main/resources/test/scenarios/852.yml | 2 +- .../src/main/resources/test/scenarios/857.yml | 2 +- .../src/main/resources/test/scenarios/860.yml | 2 +- .../src/main/resources/test/scenarios/862.yml | 2 +- .../src/main/resources/test/scenarios/866.yml | 2 +- .../src/main/resources/test/scenarios/869.yml | 2 +- .../src/main/resources/test/scenarios/870.yml | 2 +- .../src/main/resources/test/scenarios/871.yml | 2 +- .../src/main/resources/test/scenarios/878.yml | 2 +- .../src/main/resources/test/scenarios/887.yml | 2 +- .../src/main/resources/test/scenarios/905.yml | 2 +- .../src/main/resources/test/scenarios/906.yml | 2 +- .../src/main/resources/test/scenarios/907.yml | 2 +- .../src/main/resources/test/scenarios/908.yml | 2 +- .../src/main/resources/test/scenarios/911.yml | 2 +- .../src/main/resources/test/scenarios/922.yml | 2 +- .../src/main/resources/test/scenarios/925.yml | 2 +- .../src/main/resources/test/scenarios/937.yml | 2 +- .../src/main/resources/test/scenarios/946.yml | 2 +- .../src/main/resources/test/scenarios/958.yml | 2 +- .../src/main/resources/test/scenarios/967.yml | 2 +- .../src/main/resources/test/scenarios/976.yml | 2 +- .../src/main/resources/test/scenarios/985.yml | 2 +- .../src/main/resources/test/scenarios/990.yml | 2 +- 80 files changed, 213 insertions(+), 293 deletions(-) delete mode 100644 testapps/GH1069/.gitignore delete mode 100644 testapps/GH1069/README.md delete mode 100644 testapps/GH1069/pom.xml delete mode 100644 testapps/GH1069/src/main/java/test/AppEntry.java delete mode 100644 testapps/GH1069/src/main/resources/app.properties delete mode 100644 testapps/GH1069/src/main/resources/logback.xml delete mode 100644 testapps/GH1069/src/main/resources/test/scenarios.yml rename testapps/{GH1069/src/main/java/test/User.java => GHIssues/src/main/java/ghissues/gh1069/Gh1069User.java} (52%) create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java rename testapps/{GH1069/src/main/java/test => GHIssues/src/main/java/ghissues/gh1069}/Unique.java (94%) rename testapps/{GH1069/src/main/java/test => GHIssues/src/main/java/ghissues/gh1069}/UniqueValidator.java (97%) create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1069.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index bc6041277..dc4771181 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Error encountered with customised Unique validator when working with JPA #1069 * Act-Test - add refId property to Scenario #1091 * Add switch to disable auto hot deploy in DEV mode #1090 * GH 1078 - Log warn message when `@Global` is found on instance method of an abstract class diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 7e48fb227..9bea626e0 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -1174,7 +1174,10 @@ public S.Buffer buildViolationMessage(S.Buffer builder) { } public S.Buffer buildViolationMessage(S.Buffer builder, String separator) { - Map violations = violations(); + return buildViolationMessage(violations(), builder, separator); + } + + public static S.Buffer buildViolationMessage(Map violations, S.Buffer builder, String separator) { if (violations.isEmpty()) return builder; for (Map.Entry entry : violations.entrySet()) { builder.append(entry.getKey()).append(": ").append(entry.getValue().getMessage()).append(separator); diff --git a/src/main/java/act/app/DbServiceManager.java b/src/main/java/act/app/DbServiceManager.java index 7cbb89558..91f18d0c6 100644 --- a/src/main/java/act/app/DbServiceManager.java +++ b/src/main/java/act/app/DbServiceManager.java @@ -76,7 +76,7 @@ public void run() { private void initDao() { ClassNode node = app.classLoader().classInfoRepository().node(Dao.class.getName()); node.visitPublicNotAbstractTreeNodes(new $.Visitor() { - private boolean isValidDao(Class c) { + private boolean isGeneral(Class c) { return Generics.tryGetTypeParamImplementations(c, DaoBase.class).isEmpty(); } @@ -86,8 +86,10 @@ public void visit(ClassNode classNode) throws $.Break { if (Modifier.isAbstract(daoType.getModifiers())) { return; } - if (isValidDao(daoType)) { - warn("Ignore dao type[%s]: no type implementation found", daoType.getName()); + if (isGeneral(daoType)) { + if (!daoType.getName().startsWith("act.")) { + warn("Ignore dao type[%s]: no type implementation found", daoType.getName()); + } return; } try { diff --git a/src/main/java/act/conf/ActConfig.java b/src/main/java/act/conf/ActConfig.java index 609019369..c60e713f6 100644 --- a/src/main/java/act/conf/ActConfig.java +++ b/src/main/java/act/conf/ActConfig.java @@ -78,6 +78,10 @@ public File appBase() { private Boolean hotReload; + public void enableDisableHotReload(boolean on) { + hotReload = on; + } + public boolean hotReloadDisabled() { if (null == hotReload) { hotReload = get(HOT_RELOAD, true); diff --git a/src/main/java/act/conf/ConfAdmin.java b/src/main/java/act/conf/ConfAdmin.java index 9a1a39924..bdbd3b04c 100644 --- a/src/main/java/act/conf/ConfAdmin.java +++ b/src/main/java/act/conf/ConfAdmin.java @@ -26,6 +26,7 @@ import act.controller.annotation.Port; import act.controller.annotation.UrlContext; import act.route.Router; +import act.sys.Env; import act.util.PropertySpec; import com.alibaba.fastjson.JSONObject; import org.osgl.mvc.annotation.GetAction; @@ -45,6 +46,16 @@ public class ConfAdmin { @Inject private AppConfig appConfig; + @Env.RequireMode(Act.Mode.DEV) + @Command(name = "act.conf.hot_reload", help = "enable/disable hot reload in dev mode") + public void disableEnableHotReload( + @Required("true for enable, false for disable") boolean enable, + CliContext context + ) { + Act.conf().enableDisableHotReload(enable); + context.println(Act.conf().hotReloadDisabled() ? "Hot reload disabled" : "Hot reload enabled"); + } + @Command(name = "act.conf.list, act.conf, act.configuration, act.configurations", help = "list configuration") @PropertySpec("key,val") public List list( diff --git a/src/main/java/act/data/DataPropertyRepository.java b/src/main/java/act/data/DataPropertyRepository.java index 0beab0d8a..d22d04ce8 100644 --- a/src/main/java/act/data/DataPropertyRepository.java +++ b/src/main/java/act/data/DataPropertyRepository.java @@ -215,6 +215,8 @@ private void _init() { s.add(LocalDateTime.class); s.add(LocalTime.class); + s.add(Object.class); // use toString() to ouptut + terminators = s; Set s0 = C.newSet(); diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index ded54db2d..629d4c898 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -24,14 +24,11 @@ import static org.osgl.http.H.Method.GET; import static org.osgl.http.H.Method.POST; -import act.Act; -import act.ActResponse; -import act.Destroyable; -import act.app.ActionContext; -import act.app.App; -import act.app.AppInterceptorManager; +import act.*; +import act.app.*; import act.app.event.SysEventId; -import act.controller.*; +import act.controller.CacheSupportMetaInfo; +import act.controller.ResponseCache; import act.controller.meta.*; import act.handler.RequestHandlerBase; import act.inject.util.Sorter; @@ -242,8 +239,10 @@ public void handle(ActionContext context) { } if (null == result) { H.Request req = context.req(); - logger.error(e, "error handling request: " + req); result = ActErrorResult.of(e); + if (result.status().isServerError()) { + logger.error(e, "Server error encountered on handling request: " + req); + } } try { onResult(result, context); diff --git a/src/main/java/act/inject/param/JsonDtoPatch.java b/src/main/java/act/inject/param/JsonDtoPatch.java index 974faf880..8ddba5aa5 100644 --- a/src/main/java/act/inject/param/JsonDtoPatch.java +++ b/src/main/java/act/inject/param/JsonDtoPatch.java @@ -21,6 +21,7 @@ */ import act.Act; +import act.app.App; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.inject.ValueLoader; @@ -57,7 +58,7 @@ private JsonDtoPatch(String name, BeanSpec spec, Set circularReference if (fieldSpec.isTransient() || fieldSpec.hasAnnotation(Transient.class)) { continue; } - if (Collection.class.isAssignableFrom(fieldType) || Map.class.isAssignableFrom(fieldType)) { + if (App.class == fieldType || Class.class == fieldType || Object.class == fieldType || Collection.class.isAssignableFrom(fieldType) || Map.class.isAssignableFrom(fieldType)) { continue; } String fieldName = fieldSpec.name(); diff --git a/src/main/java/act/test/Interaction.java b/src/main/java/act/test/Interaction.java index 088831a83..ffa73bd62 100644 --- a/src/main/java/act/test/Interaction.java +++ b/src/main/java/act/test/Interaction.java @@ -26,11 +26,14 @@ import act.Act; import act.test.inbox.Inbox; import act.test.macro.Macro; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import okhttp3.Response; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; import org.osgl.util.*; +import java.io.IOException; import java.util.*; public class Interaction implements ScenarioPart { @@ -140,7 +143,24 @@ private void verifyStatus(Response resp) { H.Status expected = expectedStatus(); if (null == expected) { if (!resp.isSuccessful()) { - error("Status verification failure. Expected: successful, Found: " + resp.code()); + int status = resp.code(); + try { + String body = resp.body().string(); + String msg = body; + if (body.startsWith("{") && body.endsWith("}")) { + try { + JSONObject json = JSON.parseObject(body); + if (json.containsKey("message")) { + msg = json.getString("message"); + } + } catch (Exception e) { + // ignore + } + } + error("Status verification failure. Expected: successful, Found: %s, Error message: %s", status, msg); + } catch (IOException e) { + error("Status verification failure. Expected: successful, Found: %s", status); + } } } else { if (expected.code() != resp.code()) { diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index e873bf804..b26598366 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -301,6 +301,7 @@ private String verifyXmlBody(Object xmlBody) { // GH1091 - a user friendly name for dependency reference public String refId; public String description; + public String issueUrl; public boolean ignore = false; public List fixtures = new ArrayList<>(); public Object generateTestData; @@ -344,7 +345,11 @@ public String title() { if (S.notBlank(description)) { buf.a(" ").a(description); } - return buf.toString(); + String label = buf.toString(); + if (null != this.issueUrl && this.issueUrl.startsWith("http")) { + return S.concat("", label, ""); + } + return label; } public void cache(String name, Object payload) { diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index 6dc1c4edd..53dc256c6 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -49,6 +49,7 @@ public class ScenarioManager extends YamlLoader { private Map store = new LinkedHashMap<>(); private String urlContext; + private String issueUrlTemplate; public ScenarioManager() { super("act.test"); @@ -89,6 +90,7 @@ private void configure() { } AppConfig config = app.config(); urlContext = config.get("test.urlContext"); + issueUrlTemplate = config.get("test.issueUrlTemplate"); } private void loadDefault() { @@ -202,6 +204,9 @@ private void parseOne(String content, String fileName) { if (S.notBlank(scenario.refId)) { this.store.put(Keyword.of(scenario.refId), scenario); } + if (S.blank(scenario.issueUrl) && S.notBlank(issueUrlTemplate)) { + scenario.issueUrl = S.fmt(issueUrlTemplate, key); + } } } diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index dab18d1a1..7594e300d 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -162,7 +162,7 @@ private static boolean isGlobalOrStateless(Class type, Set circularRefere } // when type is interface or abstract class we need to infer it as stateful // as we can't determine the implementation class - if (!type.getSimpleName().equals("Logger") && (type.isInterface() || Modifier.isAbstract(type.getModifiers()))) { + if ((Modifier.isAbstract(type.getModifiers()) || type.isInterface()) && !isStatelessType(type)) { return false; } if (circularReferenceDetector.contains(type)) { @@ -172,6 +172,18 @@ private static boolean isGlobalOrStateless(Class type, Set circularRefere return _isGlobalOrStateless(type, circularReferenceDetector); } + + private static List statelessTypeTraits = C.list("Logger", "CacheService"); + private static boolean isStatelessType(Class intfType) { + String typeName = intfType.getName(); + for (String s : statelessTypeTraits) { + if (typeName.contains(s)) { + return true; + } + } + return false; + } + private static $.Predicate> STATEFUL_CLASS = new $.Predicate>() { @Override public boolean test(Class aClass) { diff --git a/src/main/java/act/validation/ValidationPlugin.java b/src/main/java/act/validation/ValidationPlugin.java index 122cabab3..c50ff66a0 100644 --- a/src/main/java/act/validation/ValidationPlugin.java +++ b/src/main/java/act/validation/ValidationPlugin.java @@ -24,10 +24,7 @@ import act.plugin.AppServicePlugin; import javax.inject.Singleton; -import javax.validation.Configuration; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import javax.validation.*; @Singleton public class ValidationPlugin extends AppServicePlugin { diff --git a/src/main/java/act/view/ActErrorResult.java b/src/main/java/act/view/ActErrorResult.java index bf2e5d430..01c07d9c5 100644 --- a/src/main/java/act/view/ActErrorResult.java +++ b/src/main/java/act/view/ActErrorResult.java @@ -25,8 +25,7 @@ import static org.osgl.http.H.Status.INTERNAL_SERVER_ERROR; import act.Act; -import act.app.App; -import act.app.SourceInfo; +import act.app.*; import act.asm.AsmContext; import act.asm.AsmException; import act.exception.BindException; @@ -41,10 +40,8 @@ import org.osgl.util.E; import org.osgl.util.S; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.validation.ValidationException; +import java.util.*; +import javax.validation.*; public class ActErrorResult extends ErrorResult implements ActError { @@ -211,6 +208,17 @@ private static int userDefinedStatusCode(Class exCls) { public static Result of(Throwable t) { if (t instanceof Result) { return (Result) t; + } else if (t instanceof ConstraintViolationException) { + ConstraintViolationException e = (ConstraintViolationException) t; + Set> violations = e.getConstraintViolations(); + Map lookup = new HashMap<>(); + for (ConstraintViolation v : violations) { + lookup.put(S.pathConcat(v.getRootBeanClass().getSimpleName(), '.', v.getPropertyPath().toString()), v); + } + S.Buffer buf = S.buffer(); + ActionContext.buildViolationMessage(lookup, buf, ";"); + String msg = buf.toString(); + return ActBadRequest.create(msg); } else if (t instanceof org.rythmengine.exception.RythmException) { return Act.isDev() ? new RythmTemplateException((org.rythmengine.exception.RythmException) t) : ErrorResult.of(INTERNAL_SERVER_ERROR); } else if (t instanceof AsmException) { diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html index 400257560..8aed27230 100644 --- a/src/main/resources/rythm/~test.html +++ b/src/main/resources/rythm/~test.html @@ -15,8 +15,8 @@ body { background-color: #222; color: #f1f1f1; - font-family: "Roboto", "Trebuchet MS", "Dejavu Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 1em; + font-family: "Noto Sans", Tahoma, "Segoe UI", "Helvetica Neue", Arial, sans-serif; + font-size: 14px; } a {color: #00b8b6;} h1,h2,h3,h4,h5 { @@ -65,6 +65,9 @@ color: #aaa; text-decoration: line-through; } + ul.interactions li { + margin-bottom: 8px; + } @render(head) @@ -73,7 +76,7 @@

                                                                                                                                                                        Test Report

                                                                                                                                                                        @(_app.name().capFirst())-@(_app.version().getVersion())
                                                                                                                                                                        @for(Scenario scenario: result) {

                                                                                                                                                                        - @scenario.title().nl2br().raw() + @scenario.title().raw() @if(!scenario.ignore && !scenario.status.pass()) { @if(scenario.source) {
                                                                                                                                                                          @@ -107,7 +110,7 @@

                                                                                                                                                                          @if(!scenario.ignore && !scenario.status.pass() && null != scenario.errorMessage && !scenario.errorMessage.contains("Interaction[")) {
                                                                                                                                                                          [@scenario.status] @scenario.errorMessage - @if(scenario.cause) { + @if(null != scenario.cause && (!(scenario.cause instanceof act.test.util.ErrorMessage))) {
                                                                                                                                                                           @scenario.causeStackTrace()
                                                                                                                                                                             
                                                                                                                                                                          @@ -122,7 +125,7 @@

                                                                                                                                                                          [@interaction.status] @interaction.description.capFirst() @if(interaction.errorMessage) {
                                                                                                                                                                          - @interaction.errorMessage
                                                                                                                                                                          - @if(interaction.cause) { + @if(interaction.cause != null && (!(interaction.cause instanceof act.test.util.ErrorMessage))) {
                                                                                                                                                                           @interaction.causeStackTrace()
                                                                                                                                                                           
                                                                                                                                                                          diff --git a/testapps/GH1069/.gitignore b/testapps/GH1069/.gitignore deleted file mode 100644 index 3b8194b3f..000000000 --- a/testapps/GH1069/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -*.iml -target -.idea -classes -*.log -*.DS_Store -*all.sql -tmp/ -**/.act* -**/.classpath -**/.settings -**/.project -**/.settings/ -store1/ -test.mv.db -test.trace.db -act.pid -.workspace -*.geany diff --git a/testapps/GH1069/README.md b/testapps/GH1069/README.md deleted file mode 100644 index 241365a35..000000000 --- a/testapps/GH1069/README.md +++ /dev/null @@ -1 +0,0 @@ -If the app start without any error, then test passed. \ No newline at end of file diff --git a/testapps/GH1069/pom.xml b/testapps/GH1069/pom.xml deleted file mode 100644 index f08953e9f..000000000 --- a/testapps/GH1069/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - act-gh1069 - 1.8.20.0 - - ActFramework Github Issue #1069 Reproduce App - - - org.actframework - act-starter-parent - 1.8.19.0 - - - - - 1.8 - test.Main - - - - - - org.actframework - act - 1.8.20-SNAPSHOT - - - org.actframework - act-jpa-common - 1.5.7-SNAPSHOT - - - org.actframework - act-hibernate - - - com.zaxxer - HikariCP - - - - - diff --git a/testapps/GH1069/src/main/java/test/AppEntry.java b/testapps/GH1069/src/main/java/test/AppEntry.java deleted file mode 100644 index fecf0f150..000000000 --- a/testapps/GH1069/src/main/java/test/AppEntry.java +++ /dev/null @@ -1,18 +0,0 @@ -package test; - -import act.Act; -import act.job.OnAppStart; - -public class AppEntry { - - @OnAppStart - public void onAppStart(User.Dao userDao) { - User user = new User(); - user.name = "tom"; - userDao.save(user); - } - - public static void main(String[] args) throws Exception{ - Act.start(); - } -} diff --git a/testapps/GH1069/src/main/resources/app.properties b/testapps/GH1069/src/main/resources/app.properties deleted file mode 100644 index 22f9bbd02..000000000 --- a/testapps/GH1069/src/main/resources/app.properties +++ /dev/null @@ -1 +0,0 @@ -content_suffix.aware=true \ No newline at end of file diff --git a/testapps/GH1069/src/main/resources/logback.xml b/testapps/GH1069/src/main/resources/logback.xml deleted file mode 100644 index 664022662..000000000 --- a/testapps/GH1069/src/main/resources/logback.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - INFO - - - true - - %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n - - - - - - - true - - %msg%n - - - - - - act.log - - %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - /act.%i.log.zip - 1 - 10 - - - - 2MB - - - - - - e2e.log - - %msg%n - - - - - act-db.log - - %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - /act-db.%i.log.zip - 1 - 10 - - - - 2MB - - - - - act-metric.log - - %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - /act-metric.%i.log.zip - 1 - 10 - - - - 2MB - - - - - - - - - - - - - - - - - - - - -App - - - - - - - - - - - - - - diff --git a/testapps/GH1069/src/main/resources/test/scenarios.yml b/testapps/GH1069/src/main/resources/test/scenarios.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 42e7221dd..593a8c20d 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -31,10 +31,23 @@ org.actframework act-excel + + com.zaxxer + HikariCP + + + org.actframework + act-jpa-common + 1.5.7-SNAPSHOT + org.actframework act-eclipselink + + + + cn.hutool hutool-all diff --git a/testapps/GH1069/src/main/java/test/User.java b/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069User.java similarity index 52% rename from testapps/GH1069/src/main/java/test/User.java rename to testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069User.java index 6a85d69d3..449d1366c 100644 --- a/testapps/GH1069/src/main/java/test/User.java +++ b/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069User.java @@ -1,20 +1,20 @@ -package test; +package ghissues.gh1069; import act.db.jpa.JPADao; import javax.persistence.*; @Entity -public class User { +public class Gh1069User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer id; - @Unique(entity = User.class, field = "name") + @Unique(entity = Gh1069User.class, field = "name") public String name; - public static class Dao extends JPADao { + public static class Dao extends JPADao { } diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java b/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java new file mode 100644 index 000000000..0e9444660 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java @@ -0,0 +1,20 @@ +package ghissues.gh1069; + +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.PostAction; + +import javax.inject.Inject; + +@UrlContext("1069") +public class Gh1069_Service extends BaseController { + + @Inject + Gh1069User.Dao dao; + + @PostAction + public void test(Gh1069User user) { + dao.save(user); + } + +} diff --git a/testapps/GH1069/src/main/java/test/Unique.java b/testapps/GHIssues/src/main/java/ghissues/gh1069/Unique.java similarity index 94% rename from testapps/GH1069/src/main/java/test/Unique.java rename to testapps/GHIssues/src/main/java/ghissues/gh1069/Unique.java index feec65a97..d638ad088 100644 --- a/testapps/GH1069/src/main/java/test/Unique.java +++ b/testapps/GHIssues/src/main/java/ghissues/gh1069/Unique.java @@ -1,4 +1,4 @@ -package test; +package ghissues.gh1069; import java.lang.annotation.*; import javax.validation.*; diff --git a/testapps/GH1069/src/main/java/test/UniqueValidator.java b/testapps/GHIssues/src/main/java/ghissues/gh1069/UniqueValidator.java similarity index 97% rename from testapps/GH1069/src/main/java/test/UniqueValidator.java rename to testapps/GHIssues/src/main/java/ghissues/gh1069/UniqueValidator.java index d38882fe1..4682fc0da 100644 --- a/testapps/GH1069/src/main/java/test/UniqueValidator.java +++ b/testapps/GHIssues/src/main/java/ghissues/gh1069/UniqueValidator.java @@ -1,4 +1,4 @@ -package test; +package ghissues.gh1069; import act.app.App; import act.db.Dao; diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1001.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1001.yml index e935ed904..d0c09e7e3 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1001.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1001.yml @@ -1,5 +1,5 @@ Scenario(1001): - description: "[1001] HTTP GET support json auto bind to obj #1001" + description: HTTP GET support json auto bind to obj #1001 interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1005.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1005.yml index 35570e8b8..f5fa4ec23 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1005.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1005.yml @@ -1,5 +1,5 @@ Scenario(1005): - description: "[1005] @PropertySpec and PropertySpec.current.set cannot work" + description: "@PropertySpec and PropertySpec.current.set cannot work" interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml index b4cf1b4c9..471b3ba8e 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml @@ -1,5 +1,5 @@ Scenario(1015): - description: "[1015] `StackOverflowError` caused by POJO typed request handler method param circular reference" + description: "`StackOverflowError` caused by POJO typed request handler method param circular reference" interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml index ec995326f..22876e816 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml @@ -1,5 +1,5 @@ Scenario(1016): - description: "[1016] Annotations with ValueLoader cannot work if post with json" + description: Annotations with ValueLoader cannot work if post with json interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml index 023dc0aeb..a92fc4ff2 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml @@ -1,5 +1,5 @@ Scenario(1022): - description: "[1022] Routing issue with dynamic aliases" + description: Routing issue with dynamic aliases interactions: - description: Get foo request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1026.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1026.yml index 46b2f407c..1e3e72954 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1026.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1026.yml @@ -1,6 +1,6 @@ # The issue cannot be closed till Fastjson provide deserialization support for multi-map #Scenario(1026): -# description: "[1026] act post could not support Multimap type" +# description: act post could not support Multimap type # interactions: # - description: Test # request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1049.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1049.yml index a5bf3cd4d..0fe07a477 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1049.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1049.yml @@ -1,5 +1,5 @@ Scenario(1049): - description: "[1049] Error enhancing class with `@Data` annotation" + description: Error enhancing class with `@Data` annotation interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1058.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1058.yml index 71f67f4e0..73f3bb375 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1058.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1058.yml @@ -1,5 +1,5 @@ Scenario(1058): - description: "[1058] metric command stop working" + description: metric command stop working interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1061.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1061.yml index 14c599818..a3da542a7 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1061.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1061.yml @@ -1,5 +1,5 @@ Scenario(1061): - description: "[1061] act1.8.17 Document Class Object conflict" + description: act1.8.17 Document Class Object conflict interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1064.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1064.yml index bb6ae85f3..0c3796480 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1064.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1064.yml @@ -1,5 +1,5 @@ Scenario(1064): - description: "[1064] StackOverflowError caused by JsonDtoPatch" + description: StackOverflowError caused by JsonDtoPatch interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1069.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1069.yml new file mode 100644 index 000000000..ca2f1e820 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1069.yml @@ -0,0 +1,18 @@ +Scenario(1069): + description: Error encountered with customised Unique validator when working with JPA + interactions: + - description: save user for the first time + request: + post: /1069 + json: + name: abc + - description: save user for the second time + request: + post: /1069 + params: + name: abc + response: + status: 400 + json: + message: + - contains: org.hibernate.validator.constraints.Length.message diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1073.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1073.yml index 690201f30..4046afde2 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1073.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1073.yml @@ -1,5 +1,5 @@ Scenario(1073): - description: "[1073] `@LoadResource ` load yml file to bean failed" + description: "`@LoadResource` load yml file to bean failed" interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1078.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1078.yml index 43b1d4d1b..90a1da362 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1078.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1078.yml @@ -1,5 +1,5 @@ Scenario(1078): - description: "[1078] Exception caused by @After Interceptor defined in abstract class" + description: Exception caused by @After Interceptor defined in abstract class interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1083.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1083.yml index f1ed8c1c1..9ce42573e 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1083.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1083.yml @@ -1,5 +1,5 @@ Scenario(1083): - description: "[1083] `ISObject` is not null when no file is uploaded" + description: "`ISObject` is not null when no file is uploaded" interactions: - description: It shall be null when no file uploaded request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/784.yml b/testapps/GHIssues/src/main/resources/test/scenarios/784.yml index 03ddc8388..ae4df471a 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/784.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/784.yml @@ -1,5 +1,5 @@ Scenario(784): - description: "[784] `@Data` enhancement error when Model class has no fields" + description: "`@Data` enhancement error when Model class has no fields" interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/786.yml b/testapps/GHIssues/src/main/resources/test/scenarios/786.yml index 42c128484..dcedc7aff 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/786.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/786.yml @@ -1,5 +1,5 @@ Scenario(786): - description: "[786] `@Data` enhancement shall call super by default for Map/AdaptiveMap types" + description: "`@Data` enhancement shall call super by default for Map/AdaptiveMap types" interactions: - description: test case A - app shall specify call super request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/790.yml b/testapps/GHIssues/src/main/resources/test/scenarios/790.yml index 6d18707ef..04d5d234b 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/790.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/790.yml @@ -1,5 +1,5 @@ Scenario(790): - description: "[790] Resource loader - allow loading from excel file" + description: Resource loader - allow loading from excel file interactions: - description: retreive all students request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/796.yml b/testapps/GHIssues/src/main/resources/test/scenarios/796.yml index d1e6dd8d7..1740a351c 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/796.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/796.yml @@ -1,5 +1,5 @@ Scenario(796): - description: "[796] `@PropertySpec` annotation now cause `NullPointerException` on JSON output" + description: "`@PropertySpec` annotation now cause `NullPointerException` on JSON output" interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/797.yml b/testapps/GHIssues/src/main/resources/test/scenarios/797.yml index 60a32d7e3..07480b311 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/797.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/797.yml @@ -1,5 +1,5 @@ Scenario(797): - description: "[797] JSON output: default format for `java.util.Date` missing time part" + description: "JSON output: default format for `java.util.Date` missing time part" interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/798.yml b/testapps/GHIssues/src/main/resources/test/scenarios/798.yml index a4841b5c3..94e8fbf39 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/798.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/798.yml @@ -1,5 +1,5 @@ Scenario(798): - description: "[798] `@JSONField(format = 'yyyy-MM')` setting not work" + description: "`@JSONField(format = 'yyyy-MM')` setting not work" interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/809.yml b/testapps/GHIssues/src/main/resources/test/scenarios/809.yml index 94145c817..f036e32fd 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/809.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/809.yml @@ -1,5 +1,5 @@ Scenario(809): - description: "[809] Bytecode enhanement error on App start" + description: Bytecode enhanement error on App start interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/819.yml b/testapps/GHIssues/src/main/resources/test/scenarios/819.yml index 16ca4cc8f..6f5d798e1 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/819.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/819.yml @@ -1,5 +1,5 @@ Scenario(819): - description: "[819] Extended request handler method's param not enhanced with `@Named` annotation" + description: Extended request handler method's param not enhanced with `@Named` annotation interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/820.yml b/testapps/GHIssues/src/main/resources/test/scenarios/820.yml index 8bb3411e3..07f115bc9 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/820.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/820.yml @@ -1,5 +1,5 @@ Scenario(820): - description: "[820] Using generic typed injection in Controller cause `UnexpectedException`" + description: Using generic typed injection in Controller cause `UnexpectedException` interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/821.yml b/testapps/GHIssues/src/main/resources/test/scenarios/821.yml index 4ee553168..ea9a42982 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/821.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/821.yml @@ -1,5 +1,5 @@ Scenario(821): - description: "[821] When returning String is not a valid JSON, it shall be encapsulated with `result`" + description: When returning String is not a valid JSON, it shall be encapsulated with `result` interactions: - description: Get invalid JSON request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/823.yml b/testapps/GHIssues/src/main/resources/test/scenarios/823.yml index 6f7e875bc..c814ee974 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/823.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/823.yml @@ -1,5 +1,5 @@ Scenario(823): - description: "[823] Apply new scope for implicit transaction" + description: Apply new scope for implicit transaction interactions: - description: Create an new User request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/829.yml b/testapps/GHIssues/src/main/resources/test/scenarios/829.yml index d52930190..ea2b02a16 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/829.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/829.yml @@ -1,5 +1,5 @@ Scenario(829): - description: "[829] Allow app developer to specify download file name" + description: Allow app developer to specify download file name interactions: - description: test static filename setting by `@DownloadFilename` annotation request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/835.yml b/testapps/GHIssues/src/main/resources/test/scenarios/835.yml index 1f85d7c2b..092365546 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/835.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/835.yml @@ -1,5 +1,5 @@ Scenario(835): - description: "[835] Provide a mechanism to allow developer advice on return value of request handler method" + description: Provide a mechanism to allow developer advice on return value of request handler method interactions: - description: test specified advice request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/841.yml b/testapps/GHIssues/src/main/resources/test/scenarios/841.yml index a32c0101d..694d35a76 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/841.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/841.yml @@ -1,5 +1,5 @@ Scenario(841): - description: "[841] FastJson exception when serialize ACT error message" + description: FastJson exception when serialize ACT error message interactions: - description: test normal return request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/844.yml b/testapps/GHIssues/src/main/resources/test/scenarios/844.yml index 7258d860c..ab92edc82 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/844.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/844.yml @@ -1,5 +1,5 @@ Scenario(844): - description: "[844] Create an annotation to help specify head mapping for `@LoadResource` mechanism" + description: Create an annotation to help specify head mapping for `@LoadResource` mechanism interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/852.yml b/testapps/GHIssues/src/main/resources/test/scenarios/852.yml index 3a4e6e063..7b33eace9 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/852.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/852.yml @@ -1,5 +1,5 @@ Scenario(852): - description: "[852] @PropertySpec not take effect" + description: "@PropertySpec not take effect" interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/857.yml b/testapps/GHIssues/src/main/resources/test/scenarios/857.yml index 646dafd80..d1d6ca40b 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/857.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/857.yml @@ -1,5 +1,5 @@ Scenario(857): - description: "[857] Provide a way to allow app to specify order of elements in the injected collection" + description: Provide a way to allow app to specify order of elements in the injected collection interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/860.yml b/testapps/GHIssues/src/main/resources/test/scenarios/860.yml index 2aba7b3db..10c7ac9db 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/860.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/860.yml @@ -1,5 +1,5 @@ Scenario(860): - description: "[860] test resource not refreshed after hot-reload" + description: test resource not refreshed after hot-reload interactions: - description: Test preActions: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/862.yml b/testapps/GHIssues/src/main/resources/test/scenarios/862.yml index ce435655f..8c6989f61 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/862.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/862.yml @@ -1,7 +1,7 @@ Scenario(862): constants: newFooName: ${randStr} - description: "[862] Support using `SessionVariable` annotation and `DbBind` together" + description: Support using `SessionVariable` annotation and `DbBind` together interactions: - description: Create record request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/866.yml b/testapps/GHIssues/src/main/resources/test/scenarios/866.yml index 67e657e4d..26e8ef300 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/866.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/866.yml @@ -1,5 +1,5 @@ Scenario(866): - description: "[866] `PropertySpec` specification not working when return value is a list" + description: "`PropertySpec` specification not working when return value is a list" interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/869.yml b/testapps/GHIssues/src/main/resources/test/scenarios/869.yml index f45282454..e03032ddd 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/869.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/869.yml @@ -1,6 +1,6 @@ Scenario(869): urlContext: /api/v1 - description: "[869] Test - Allow app to define url context for scenario #869" + description: Test - Allow app to define url context for scenario #869 interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/870.yml b/testapps/GHIssues/src/main/resources/test/scenarios/870.yml index 4b04b93a7..dd15e5da8 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/870.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/870.yml @@ -1,5 +1,5 @@ Scenario(870): - description: "[870] Act not return application/json as default when exception" + description: Act not return application/json as default when exception interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/871.yml b/testapps/GHIssues/src/main/resources/test/scenarios/871.yml index 5028c0be9..3a567c814 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/871.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/871.yml @@ -1,5 +1,5 @@ Scenario(871): - description: "[871] Test: evaluation complex expression refer to cached object issue" + description: Evaluation complex expression refer to cached object issue interactions: - description: setup request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/878.yml b/testapps/GHIssues/src/main/resources/test/scenarios/878.yml index 2b595d0d0..7a0ecc0f0 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/878.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/878.yml @@ -1,5 +1,5 @@ Scenario(878): - description: "[878] @PropertySpec could not effect entity in collection" + description: "@PropertySpec could not effect entity in collection" interactions: - description: test list request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/887.yml b/testapps/GHIssues/src/main/resources/test/scenarios/887.yml index 7068fcc74..8563a1882 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/887.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/887.yml @@ -1,5 +1,5 @@ Scenario(887): - description: "[887] Route table: support whitespace in URL path" + description: "Route table: support whitespace in URL path" interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/905.yml b/testapps/GHIssues/src/main/resources/test/scenarios/905.yml index 3af8be287..929f88ba4 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/905.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/905.yml @@ -1,5 +1,5 @@ Scenario(905): - description: "[905] Basic support for xml content-type" + description: Basic support for xml content-type interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/906.yml b/testapps/GHIssues/src/main/resources/test/scenarios/906.yml index e34e90ef1..711ca8ef3 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/906.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/906.yml @@ -1,5 +1,5 @@ Scenario(906): - description: "[906] ReflectedHandlerInvoker - try to get Annotation from method in parent class if possible" + description: ReflectedHandlerInvoker - try to get Annotation from method in parent class if possible interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/907.yml b/testapps/GHIssues/src/main/resources/test/scenarios/907.yml index a1afaba6a..97138dfc4 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/907.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/907.yml @@ -1,5 +1,5 @@ Scenario(907): - description: "[907] Interceptor defined in super class now not effective on sub class" + description: Interceptor defined in super class now not effective on sub class interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/908.yml b/testapps/GHIssues/src/main/resources/test/scenarios/908.yml index dd09d5b7f..75c3e9b1c 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/908.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/908.yml @@ -1,5 +1,5 @@ Scenario(908): - description: "[908] Test - allow setting precision of ${now()} function" + description: Test - allow setting precision of ${now()} function constants: startTs0: ${now()} # default: low precision startTs1: ${now(hp)} # specify high precision diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/911.yml b/testapps/GHIssues/src/main/resources/test/scenarios/911.yml index 0b5b23d63..499e5949d 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/911.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/911.yml @@ -1,5 +1,5 @@ Scenario(911): - description: "[911] Test - enhance ${now()} function" + description: Test - enhance ${now()} function interactions: - description: simple now request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/922.yml b/testapps/GHIssues/src/main/resources/test/scenarios/922.yml index f735d59e0..3036782a7 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/922.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/922.yml @@ -1,5 +1,5 @@ Scenario(922): - description: "[922] Allow app to customise error response upon invalid request" + description: Allow app to customise error response upon invalid request interactions: - description: method specific violation advice request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/925.yml b/testapps/GHIssues/src/main/resources/test/scenarios/925.yml index cd4dcaa44..a6ae0240a 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/925.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/925.yml @@ -1,5 +1,5 @@ Scenario(925): - description: "[925] `Unable to find the overwritten method of Xxx` issue on 1.8.8" + description: "`Unable to find the overwritten method of Xxx` issue on 1.8.8" interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/937.yml b/testapps/GHIssues/src/main/resources/test/scenarios/937.yml index 698c7447e..76b4bc3a1 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/937.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/937.yml @@ -1,5 +1,5 @@ Scenario(937): - description: "[937] Missing `Content-Type` header in response servicing static file request" + description: Missing `Content-Type` header in response servicing static file request interactions: - description: Test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/946.yml b/testapps/GHIssues/src/main/resources/test/scenarios/946.yml index cc0e21bc0..ebfb129d7 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/946.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/946.yml @@ -1,5 +1,5 @@ Scenario(946): - description: "[GH946] Issue with loading configuration into Map" + description: Issue with loading configuration into Map interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/958.yml b/testapps/GHIssues/src/main/resources/test/scenarios/958.yml index cc64b2687..d4662eca4 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/958.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/958.yml @@ -1,5 +1,5 @@ Scenario(958): - description: "[GH958] `NullPointerException` when route path element wrapped with `~` is no the final one" + description: "`NullPointerException` when route path element wrapped with `~` is no the final one" interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/967.yml b/testapps/GHIssues/src/main/resources/test/scenarios/967.yml index b3041d219..3c3abda97 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/967.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/967.yml @@ -1,5 +1,5 @@ Scenario(967): - description: "[GH967] Issue with loading configuration into Map" + description: Issue with loading configuration into Map interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/976.yml b/testapps/GHIssues/src/main/resources/test/scenarios/976.yml index da9022a79..bd2b60da9 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/976.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/976.yml @@ -1,5 +1,5 @@ Scenario(976): - description: "[GH976] SimpleRestfulServiceBase 'update' enhancement" + description: SimpleRestfulServiceBase 'update' enhancement interactions: - description: create data request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/985.yml b/testapps/GHIssues/src/main/resources/test/scenarios/985.yml index eca6df0e6..bba39d11b 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/985.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/985.yml @@ -1,5 +1,5 @@ Scenario(985): - description: "[985] @Before @After not effect when sub class extends from super class" + description: "@Before @After not effect when sub class extends from super class" interactions: - description: test request: diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/990.yml b/testapps/GHIssues/src/main/resources/test/scenarios/990.yml index 457b6c812..ad696b8f1 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/990.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/990.yml @@ -1,5 +1,5 @@ Scenario(990): - description: "[990] @Named inject fail #990" + description: "@Named inject fail #990" interactions: - description: Test request: From e5691a7fa72d2ed9ae94ebf4fc1f670fddec3b65 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 27 Mar 2019 07:58:14 +1100 Subject: [PATCH 400/730] DataPropertyRepository - StackOverflowError building property path for model with circular reference #1093 --- CHANGELOG.md | 1 + .../java/act/data/DataPropertyRepository.java | 50 ++++++++++++------- .../java/act/util/ReflectedInvokerHelper.java | 6 ++- .../ghissues/gh1093/Gh1093Department.java | 9 ++++ .../java/ghissues/gh1093/Gh1093Service.java | 28 +++++++++++ .../main/java/ghissues/gh1093/Gh1093User.java | 6 +++ .../main/resources/test/scenarios/1093.yml | 10 ++++ 7 files changed, 91 insertions(+), 19 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Department.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Service.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093User.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1093.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index dc4771181..98c07f5bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* DataPropertyRepository - StackOverflowError building property path for model with circular reference #1093 * Error encountered with customised Unique validator when working with JPA #1069 * Act-Test - add refId property to Scenario #1091 * Add switch to disable auto hot deploy in DEV mode #1090 diff --git a/src/main/java/act/data/DataPropertyRepository.java b/src/main/java/act/data/DataPropertyRepository.java index d22d04ce8..0c53dfd6e 100644 --- a/src/main/java/act/data/DataPropertyRepository.java +++ b/src/main/java/act/data/DataPropertyRepository.java @@ -84,8 +84,9 @@ public synchronized List propertyListOf(Class c) { if (ls != null) { return ls; } - ls = buildPropertyList(c); - repo.put(cn, ls); + Set> circularReferenceDetector = new HashSet<>(); + ls = propertyListOf(c, circularReferenceDetector); + repo.put(c.getName(), ls); return ls; } @@ -93,22 +94,27 @@ public List outputFields(PropertySpec.MetaInfo spec, Class componentC return outputFieldsCache.getOutputFields(spec, componentClass, context); } - private List buildPropertyList(Class c) { + private List propertyListOf(Class c, Set> circularReferenceDetector) { + List ls = buildPropertyList(c, circularReferenceDetector); + return ls; + } + + private List buildPropertyList(Class c, Set> circularReferenceDetector) { Method[] ma = c.getMethods(); String context = ""; List retLst = new ArrayList<>(); for (Method m: ma) { - buildPropertyPath(context, m, c, retLst); + buildPropertyPath(context, m, c, retLst, circularReferenceDetector); } Field[] fa = c.getFields(); for (Field f: fa) { - buildPropertyPath(context, f, retLst); + buildPropertyPath(context, f, retLst, circularReferenceDetector); } Collections.sort(retLst); return retLst; } - private void buildPropertyPath(String context, Method m, Class c, List repo) { + private void buildPropertyPath(String context, Method m, Class c, List repo, Set> circularReferenceDetector) { if (m.getParameterTypes().length > 0) { return; } @@ -126,21 +132,21 @@ private void buildPropertyPath(String context, Method m, Class c, List repo) { - buildPropertyPath(field.getType(), field.getGenericType(), context, field.getName(), repo); + private void buildPropertyPath(String context, Field field, List repo, Set> circularReferenceDetector) { + buildPropertyPath(field.getType(), field.getGenericType(), context, field.getName(), repo, circularReferenceDetector); } - private void buildPropertyPath(Class c, Type genericType, String context, String propName, List repo) { + private void buildPropertyPath(Class c, Type genericType, String context, String propName, List repo, Set> circularReferenceDetector) { if (Class.class.equals(c)) { return; } if (c.isArray()) { Class componentType = c.getComponentType(); - List retTypeProperties = propertyListOf(componentType); + List retTypeProperties = propertyListOf(componentType, circularReferenceDetector); context = context + propName + "."; for (String s: retTypeProperties) { String s0 = context + s; @@ -164,7 +170,7 @@ private void buildPropertyPath(Class c, Type genericType, String context, Str Type[] ta = pt.getActualTypeArguments(); for (Type t0: ta) { Class c0 = (Class) t0; - List retTypeProperties = propertyListOf(c0); + List retTypeProperties = propertyListOf(c0, circularReferenceDetector); context = context + propName + "."; for (String s: retTypeProperties) { String s0 = context + s; @@ -183,13 +189,21 @@ private void buildPropertyPath(Class c, Type genericType, String context, Str } return; } - List retTypeProperties = propertyListOf(c); - context = context + propName + "."; - for (String s : retTypeProperties) { - String s0 = context + s; - if (!repo.contains(s0)) { - repo.add(s0); + if (circularReferenceDetector.contains(c)) { + return; + } + circularReferenceDetector.add(c); + try { + List retTypeProperties = propertyListOf(c, circularReferenceDetector); + context = context + propName + "."; + for (String s : retTypeProperties) { + String s0 = context + s; + if (!repo.contains(s0)) { + repo.add(s0); + } } + } finally { + circularReferenceDetector.remove(c); } } diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 7594e300d..00abda930 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -169,7 +169,11 @@ private static boolean isGlobalOrStateless(Class type, Set circularRefere return false; } circularReferenceDetector.add(type); - return _isGlobalOrStateless(type, circularReferenceDetector); + try { + return _isGlobalOrStateless(type, circularReferenceDetector); + } finally { + circularReferenceDetector.remove(type); + } } diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Department.java b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Department.java new file mode 100644 index 000000000..a6129cbdd --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Department.java @@ -0,0 +1,9 @@ +package ghissues.gh1093; + +import java.util.ArrayList; +import java.util.List; + +public class Gh1093Department { + public String name; + public List users = new ArrayList<>(); +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Service.java b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Service.java new file mode 100644 index 000000000..a782e53d1 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Service.java @@ -0,0 +1,28 @@ +package ghissues.gh1093; + +import act.cli.Command; +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +import java.util.ArrayList; +import java.util.List; + +@UrlContext("1093") +public class Gh1093Service extends BaseController { + + @GetAction("users") + @Command("1092.users") + public List listUsers() { + List list = new ArrayList<>(); + Gh1093Department dep = new Gh1093Department(); + dep.name = "RD"; + Gh1093User green = new Gh1093User(); + list.add(green); + green.name = "green"; + green.department = dep; + dep.users.add(green); + return list; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093User.java b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093User.java new file mode 100644 index 000000000..12ca9e51e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093User.java @@ -0,0 +1,6 @@ +package ghissues.gh1093; + +public class Gh1093User { + public String name; + public Gh1093Department department; +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1093.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1093.yml new file mode 100644 index 000000000..eb7a3c64d --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1093.yml @@ -0,0 +1,10 @@ +Scenario(1093): + description: "DataPropertyRepository - StackOverflowError building property path for model with circular reference" + interactions: + - description: Test + request: + get: 1093/users + accept: csv + response: + text: + - contains: green From 7d3157899ae884570ce415b06036bd9025c3e2c8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 27 Mar 2019 20:16:06 +1100 Subject: [PATCH 401/730] `@LoginUser` caused `InjectException` upon hot reload #1071 --- CHANGELOG.md | 2 + pom.xml | 2 +- src/main/java/act/app/App.java | 2 +- src/main/java/act/conf/AppConfig.java | 11 +++ .../java/act/data/DataPropertyRepository.java | 72 +++++++++++-------- 5 files changed, 58 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98c07f5bc..801bf1625 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.20** +* `@LoginUser` caused `InjectException` upon hot reload #1071 +* DataPropertyRepository - ClassCastException encountered building property path #1095 * DataPropertyRepository - StackOverflowError building property path for model with circular reference #1093 * Error encountered with customised Unique validator when working with JPA #1069 * Act-Test - add refId property to Scenario #1091 diff --git a/pom.xml b/pom.xml index 740f3bbef..44cb5ee0a 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ 1.11.3 3.13.1 1.19.2-SNAPSHOT - 1.6.0 + 1.6.1-SNAPSHOT 1.9.5-SNAPSHOT 1.9.0 1.9.0 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index b219ba15e..d8ee0bb31 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -1572,7 +1572,7 @@ private void initCache() { cache = cache(config().cacheName()); cache.startup(); if (Act.isDev()) { - cache.clear(); + config.resetCacheServices(cache); } CacheService sessionCache = cache(config().cacheNameSession()); if (cache != sessionCache) { diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 6492c37c6..12b4c4c85 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -53,6 +53,8 @@ import org.osgl.*; import org.osgl.cache.CacheService; import org.osgl.cache.CacheServiceProvider; +import org.osgl.cache.impl.SimpleCacheService; +import org.osgl.cache.impl.SimpleCacheServiceProvider; import org.osgl.exception.ConfigurationException; import org.osgl.exception.NotAppliedException; import org.osgl.http.H; @@ -3336,6 +3338,15 @@ public CacheService cacheService(String name) { return cacheServiceProvider.get(name); } + public void resetCacheServices(CacheService sample) { + if (!Act.isDev()) { + return; + } + if (sample instanceof SimpleCacheService) { + SimpleCacheServiceProvider.reset(); + } + } + private void _mergeCacheServiceProvider(AppConfig config) { if (!hasConfiguration(AppConfigKey.CACHE_IMPL)) { cacheServiceProvider = config.cacheServiceProvider; diff --git a/src/main/java/act/data/DataPropertyRepository.java b/src/main/java/act/data/DataPropertyRepository.java index 0c53dfd6e..4f5e38bee 100644 --- a/src/main/java/act/data/DataPropertyRepository.java +++ b/src/main/java/act/data/DataPropertyRepository.java @@ -26,6 +26,7 @@ import act.util.PropertySpec; import org.joda.time.*; import org.osgl.$; +import org.osgl.exception.UnexpectedException; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.C; @@ -85,7 +86,7 @@ public synchronized List propertyListOf(Class c) { return ls; } Set> circularReferenceDetector = new HashSet<>(); - ls = propertyListOf(c, circularReferenceDetector); + ls = propertyListOf(c, circularReferenceDetector, null); repo.put(c.getName(), ls); return ls; } @@ -94,27 +95,40 @@ public List outputFields(PropertySpec.MetaInfo spec, Class componentC return outputFieldsCache.getOutputFields(spec, componentClass, context); } - private List propertyListOf(Class c, Set> circularReferenceDetector) { - List ls = buildPropertyList(c, circularReferenceDetector); - return ls; + private List propertyListOf(Class c, Set> circularReferenceDetector, Map typeImplLookup) { + if (null == typeImplLookup) { + typeImplLookup = Generics.buildTypeParamImplLookup(c); + } else { + typeImplLookup.putAll(Generics.buildTypeParamImplLookup(c)); + } + if (circularReferenceDetector.contains(c)) { + return C.list(); + } + circularReferenceDetector.add(c); + try { + List ls = buildPropertyList(c, circularReferenceDetector, typeImplLookup); + return ls; + } finally { + circularReferenceDetector.remove(c); + } } - private List buildPropertyList(Class c, Set> circularReferenceDetector) { + private List buildPropertyList(Class c, Set> circularReferenceDetector, Map typeImplLookup) { Method[] ma = c.getMethods(); String context = ""; List retLst = new ArrayList<>(); for (Method m: ma) { - buildPropertyPath(context, m, c, retLst, circularReferenceDetector); + buildPropertyPath(context, m, c, retLst, circularReferenceDetector, typeImplLookup); } Field[] fa = c.getFields(); for (Field f: fa) { - buildPropertyPath(context, f, retLst, circularReferenceDetector); + buildPropertyPath(context, f, retLst, circularReferenceDetector, typeImplLookup); } Collections.sort(retLst); return retLst; } - private void buildPropertyPath(String context, Method m, Class c, List repo, Set> circularReferenceDetector) { + private void buildPropertyPath(String context, Method m, Class c, List repo, Set> circularReferenceDetector, Map typeImplLookup) { if (m.getParameterTypes().length > 0) { return; } @@ -132,21 +146,21 @@ private void buildPropertyPath(String context, Method m, Class c, List repo, Set> circularReferenceDetector) { - buildPropertyPath(field.getType(), field.getGenericType(), context, field.getName(), repo, circularReferenceDetector); + private void buildPropertyPath(String context, Field field, List repo, Set> circularReferenceDetector, Map typeImplLookup) { + buildPropertyPath(field.getType(), field.getGenericType(), context, field.getName(), repo, circularReferenceDetector, typeImplLookup); } - private void buildPropertyPath(Class c, Type genericType, String context, String propName, List repo, Set> circularReferenceDetector) { + private void buildPropertyPath(Class c, Type genericType, String context, String propName, List repo, Set> circularReferenceDetector, Map typeImplLookup) { if (Class.class.equals(c)) { return; } if (c.isArray()) { Class componentType = c.getComponentType(); - List retTypeProperties = propertyListOf(componentType, circularReferenceDetector); + List retTypeProperties = propertyListOf(componentType, circularReferenceDetector, typeImplLookup); context = context + propName + "."; for (String s: retTypeProperties) { String s0 = context + s; @@ -169,8 +183,16 @@ private void buildPropertyPath(Class c, Type genericType, String context, Str ParameterizedType pt = (ParameterizedType) t; Type[] ta = pt.getActualTypeArguments(); for (Type t0: ta) { - Class c0 = (Class) t0; - List retTypeProperties = propertyListOf(c0, circularReferenceDetector); + Class c0; + if (t0 instanceof Class) { + c0 = (Class) t0; + } else if (t0 instanceof TypeVariable) { + String typeVarName = ((TypeVariable) t0).getName(); + c0 = typeImplLookup.get(typeVarName); + } else { + throw new UnexpectedException("Unknown type: " + t0); + } + List retTypeProperties = propertyListOf(c0, circularReferenceDetector, typeImplLookup); context = context + propName + "."; for (String s: retTypeProperties) { String s0 = context + s; @@ -189,21 +211,13 @@ private void buildPropertyPath(Class c, Type genericType, String context, Str } return; } - if (circularReferenceDetector.contains(c)) { - return; - } - circularReferenceDetector.add(c); - try { - List retTypeProperties = propertyListOf(c, circularReferenceDetector); - context = context + propName + "."; - for (String s : retTypeProperties) { - String s0 = context + s; - if (!repo.contains(s0)) { - repo.add(s0); - } + List retTypeProperties = propertyListOf(c, circularReferenceDetector, typeImplLookup); + context = context + propName + "."; + for (String s : retTypeProperties) { + String s0 = context + s; + if (!repo.contains(s0)) { + repo.add(s0); } - } finally { - circularReferenceDetector.remove(c); } } From a78deab55124a75e6391662fc0b8b19333433944 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 27 Mar 2019 22:52:07 +1100 Subject: [PATCH 402/730] ActFramework hot reload caused Ehcache Classloader Exception #1070 --- CHANGELOG.md | 1 + src/main/resources/act.jar.black.list | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 801bf1625..530107776 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* ActFramework hot reload caused Ehcache Classloader Exception #1070 * `@LoginUser` caused `InjectException` upon hot reload #1071 * DataPropertyRepository - ClassCastException encountered building property path #1095 * DataPropertyRepository - StackOverflowError building property path for model with circular reference #1093 diff --git a/src/main/resources/act.jar.black.list b/src/main/resources/act.jar.black.list index c8f79f0f5..2baa425c5 100644 --- a/src/main/resources/act.jar.black.list +++ b/src/main/resources/act.jar.black.list @@ -5,6 +5,7 @@ commons core debugger ecj +ehcache fastjson guava hamcrest From 6a2ca23a9afb15864f43fa3d18a6074a1bd42bed Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 28 Mar 2019 09:18:37 +1100 Subject: [PATCH 403/730] java.lang.LinkageError caused by org.w3c.dom.Document #1096 --- CHANGELOG.md | 1 + src/main/resources/act.jar.black.list | 3 ++- testapps/GHIssues/pom.xml | 16 +++++++++++----- .../GHIssues/src/main/java/ghissues/Gh862.java | 16 +++++++++------- .../java/ghissues/gh1069/Gh1069_Service.java | 1 - 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 530107776..463b7e808 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* java.lang.LinkageError caused by org.w3c.dom.Document #1096 * ActFramework hot reload caused Ehcache Classloader Exception #1070 * `@LoginUser` caused `InjectException` upon hot reload #1071 * DataPropertyRepository - ClassCastException encountered building property path #1095 diff --git a/src/main/resources/act.jar.black.list b/src/main/resources/act.jar.black.list index 2baa425c5..5a5beecd1 100644 --- a/src/main/resources/act.jar.black.list +++ b/src/main/resources/act.jar.black.list @@ -32,4 +32,5 @@ osgl patchca reflectasm rythm -slf4j \ No newline at end of file +slf4j +xml-apis \ No newline at end of file diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 593a8c20d..5aae83f82 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -5,7 +5,7 @@ 4.0.0 act-ghissues - 1.8.19.0 + 1.8.20.0-SNAPSHOT ActFramework Github Issue Reproduce App @@ -37,17 +37,23 @@ org.actframework - act-jpa-common - 1.5.7-SNAPSHOT + act-sql-common + 1.4.4 org.actframework - act-eclipselink + act-jpa-common + 1.5.7-SNAPSHOT - + + + + org.actframework + act-hibernate + cn.hutool hutool-all diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh862.java b/testapps/GHIssues/src/main/java/ghissues/Gh862.java index 5355044b4..8b28b0cec 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh862.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh862.java @@ -12,8 +12,9 @@ @UrlContext("862") public class Gh862 extends BaseController { + @Entity(name = "foo862") - public static class Foo { + public static class Gh862Foo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer id; @@ -22,30 +23,31 @@ public static class Foo { } @Inject - private JPADao dao; + private JPADao dao; @SessionVariable @DbBind - private Foo foo; + private Gh862Foo foo; @PostAction - public Foo create(final Foo foo) { + public Gh862Foo create(final Gh862Foo foo) { return dao.save(foo); } @GetAction - public Iterable list() { + public Iterable list() { return dao.findAll(); } + @PutAction("current/{target}") - public Foo select(@DbBind Foo target, H.Session session) { + public Gh862Foo select(@DbBind Gh862Foo target, H.Session session) { session.put("foo", target.id); return target; } @GetAction("current") - public Foo current() { + public Gh862Foo current() { return foo; } } diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java b/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java index 0e9444660..91dd0dbf0 100644 --- a/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java +++ b/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java @@ -8,7 +8,6 @@ @UrlContext("1069") public class Gh1069_Service extends BaseController { - @Inject Gh1069User.Dao dao; From 9bd8be1051ee122f8d5767629963126e5c62c211 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 28 Mar 2019 21:34:11 +1100 Subject: [PATCH 404/730] OsglConfig.internalCache shall be cleared before DB start init #1098 --- CHANGELOG.md | 1 + src/main/java/act/conf/AppConfig.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 463b7e808..b342bb298 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* OsglConfig.internalCache shall be cleared before DB start init #1098 * java.lang.LinkageError caused by org.w3c.dom.Document #1096 * ActFramework hot reload caused Ehcache Classloader Exception #1070 * `@LoginUser` caused `InjectException` upon hot reload #1071 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 12b4c4c85..bb40826be 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -173,7 +173,6 @@ public void preloadConfigurations() { OsglConfig.setXmlRootTag(xmlRootTag()); - OsglConfig.internalCache().clear(); OsglConfig.setThreadLocalBufferLimit(threadLocalBufRetentionLimit()); OsglConfig.registerGlobalInstanceFactory(new $.Function() { final App app = Act.app(); @@ -3342,6 +3341,7 @@ public void resetCacheServices(CacheService sample) { if (!Act.isDev()) { return; } + OsglConfig.internalCache().clear(); if (sample instanceof SimpleCacheService) { SimpleCacheServiceProvider.reset(); } From c151a87c85953a16914256497110a23e297ab975 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 29 Mar 2019 22:16:59 +1100 Subject: [PATCH 405/730] fix #1097 and #1099 --- CHANGELOG.md | 2 ++ pom.xml | 2 +- src/main/java/act/app/ActionContext.java | 10 ++++++++++ .../controller/bytecode/HandlerEnhancer.java | 18 +++++++++++++++--- .../impl/ReflectedHandlerInvoker.java | 4 +++- .../inject/param/JsonDtoClassGenerator.java | 3 +++ .../act/inject/param/JsonDtoClassManager.java | 2 +- .../inject/param/JsonParamValueLoader.java | 15 ++++++++++++++- src/main/java/act/test/Test.java | 19 +++++++++++++++---- 9 files changed, 64 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b342bb298..e4eba812e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.20** +* request handler - allow bind to a path in JSON body #1099 +* Exception raised before committing to response shall trigger another 500 response #1097 * OsglConfig.internalCache shall be cleared before DB start init #1098 * java.lang.LinkageError caused by org.w3c.dom.Document #1096 * ActFramework hot reload caused Ehcache Classloader Exception #1070 diff --git a/pom.xml b/pom.xml index 44cb5ee0a..ae5560492 100644 --- a/pom.xml +++ b/pom.xml @@ -67,7 +67,7 @@ 1.6.1-SNAPSHOT 1.9.5-SNAPSHOT 1.9.0 - 1.9.0 + 1.9.1-SNAPSHOT 1.8.0 1.3.1 0.0.1 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 9bea626e0..2eb3e823a 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -119,6 +119,7 @@ public class ActionContext extends ActContext.Base implements Des private String attachmentName; private Class handlerClass; private RouteSource routeSource; + private String patchedJsonBody; // see https://github.com/actframework/actframework/issues/492 public String encodedSessionToken; @@ -593,6 +594,15 @@ public ActionContext routeSource(RouteSource routeSource) { return this; } + public ActionContext patchedJsonBody(String patchedJsonBody) { + this.patchedJsonBody = patchedJsonBody; + return this; + } + + public String patchedJsonBody() { + return patchedJsonBody; + } + public H.Format accept() { return req().accept(); } diff --git a/src/main/java/act/controller/bytecode/HandlerEnhancer.java b/src/main/java/act/controller/bytecode/HandlerEnhancer.java index 55f83817f..c54f70afb 100644 --- a/src/main/java/act/controller/bytecode/HandlerEnhancer.java +++ b/src/main/java/act/controller/bytecode/HandlerEnhancer.java @@ -43,7 +43,8 @@ public class HandlerEnhancer extends MethodVisitor implements Opcodes { private HandlerMethodMetaInfo info; private MethodVisitor next; private int paramIdShift = 0; - private Set skipNaming = new HashSet(); + private Set skipNaming = new HashSet<>(); + private Map overriddenNames = new HashMap<>(); private boolean notAction; public HandlerEnhancer(final MethodVisitor mv, HandlerMethodMetaInfo meta, final int access, final String name, final String desc, final String signature, final String[] exceptions) { @@ -64,9 +65,19 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { } @Override - public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { + public AnnotationVisitor visitParameterAnnotation(final int parameter, String desc, boolean visible) { if ("Ljavax/inject/Named;".equals(desc)) { skipNaming.add(parameter); + } else if ("Lorg/osgl/mvc/annotation/Param;".equals(desc)) { + return new AnnotationVisitor(ASM5, super.visitParameterAnnotation(parameter, desc, visible)) { + @Override + public void visit(String name, Object value) { + if ("value".equals(name)) { + overriddenNames.put(parameter, S.string(value)); + } + super.visit(name, value); + } + }; } return super.visitParameterAnnotation(parameter, desc, visible); } @@ -114,7 +125,8 @@ private void addParamAnnotations() { int sz = info.paramCount(); for (int i = 0; i < sz; ++i) { if (!skipNaming.contains(i)) { - String name = info.param(i).name(); + String name = overriddenNames.get(i); + if (null == name) name = info.param(i).name(); AnnotationVisitor av = mv.visitParameterAnnotation(i, "Ljavax/inject/Named;", true); av.visit("value", name); } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 36ab876a6..b4bc6b45d 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -737,7 +737,9 @@ private void ensureJsonDtoGenerated(ActionContext context) { return; } try { - JsonDto dto = JSON.parseObject(patchedJsonBody(context), dtoClass); + String patchedJsonBody = patchedJsonBody(context); + context.patchedJsonBody(patchedJsonBody); + JsonDto dto = JSON.parseObject(patchedJsonBody, dtoClass); if (null != dto) { patchDtoBeans(dto); cacheJsonDto(context, dto); diff --git a/src/main/java/act/inject/param/JsonDtoClassGenerator.java b/src/main/java/act/inject/param/JsonDtoClassGenerator.java index cad05c6e3..e403bf369 100644 --- a/src/main/java/act/inject/param/JsonDtoClassGenerator.java +++ b/src/main/java/act/inject/param/JsonDtoClassGenerator.java @@ -79,6 +79,9 @@ private void generateSetters() { private void generateSetter(BeanSpec beanSpec) { String setterName = setterName(beanSpec); + if (setterName.contains(".")) { + return; + } mv = cw.visitMethod(ACC_PUBLIC, setterName, setterDescriptor(beanSpec), setterSignature(beanSpec), null); mv.visitCode(); Label l0 = new Label(); diff --git a/src/main/java/act/inject/param/JsonDtoClassManager.java b/src/main/java/act/inject/param/JsonDtoClassManager.java index 1dfaefbda..f69c22099 100644 --- a/src/main/java/act/inject/param/JsonDtoClassManager.java +++ b/src/main/java/act/inject/param/JsonDtoClassManager.java @@ -260,7 +260,7 @@ public int compare(BeanSpec o1, BeanSpec o2) { private static String key(List beanSpecs) { S.Buffer sb = S.buffer(); for (BeanSpec beanSpec : beanSpecs) { - sb.append(beanSpec.name()).append(beanSpec.type().hashCode()); + sb.append(S.underscore(beanSpec.name())).append(beanSpec.type().hashCode()); } return sb.toString(); } diff --git a/src/main/java/act/inject/param/JsonParamValueLoader.java b/src/main/java/act/inject/param/JsonParamValueLoader.java index 74d227ccf..a134abf41 100644 --- a/src/main/java/act/inject/param/JsonParamValueLoader.java +++ b/src/main/java/act/inject/param/JsonParamValueLoader.java @@ -25,6 +25,8 @@ import act.app.data.StringValueResolverManager; import act.inject.DependencyInjector; import act.util.ActContext; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import org.osgl.$; import org.osgl.inject.BeanSpec; @@ -68,7 +70,18 @@ public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (null == dto) { return this.fallBack.load(bean, context, noDefaultValue); } else { - Object o = dto.get(spec.name()); + String key = spec.name(); + Object o = dto.get(key); + if (null != o) { + return o; + } + if (context instanceof ActionContext) { + if (key.contains(".")) { + String body = ((ActionContext) context).patchedJsonBody(); + JSONObject json = JSON.parseObject(body); + o = $.getProperty(json, key); + } + } return null != o ? o : defValProvider.get(); } } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index f23277b55..a74f304ba 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -300,18 +300,20 @@ public List run(App app, Keyword testId, boolean shutdownApp) { } Collections.sort(list, new ScenarioComparator(scenarioManager, true)); if (shutdownApp) { + boolean ansi = Banner.supportAnsi(); + error("Failed and Ignored scenarios:"); for (Scenario scenario : list) { if (scenario.status == TestStatus.FAIL) { error("-----------------------------------------------------------"); - error("[%s] Failed", scenario.name); + error("[failed] ", scenario.title()); if (S.notBlank(scenario.errorMessage)) { - error("error: " + scenario.errorMessage); + logError(ansi, scenario.errorMessage); } if (null != scenario.cause) { - error("cause: \n" + E.stackTrace(scenario.cause)); + logError(ansi, "cause: \n" + E.stackTrace(scenario.cause)); } } else if (scenario.ignore) { - warn("[%s] ignored", scenario.name); + warn("[ignored] %s", scenario.title()); } } } @@ -330,6 +332,15 @@ public List run(App app, Keyword testId, boolean shutdownApp) { } } + private void logError(boolean ansi, String msg, Object... args) { + msg = S.fmt(msg, args); + if (ansi) { + msg = "@|red " + msg + "|@"; + msg = Ansi.ansi().render(msg).toString(); + } + error(msg); + } + private void output(Scenario scenario) { if (scenario.ignore) { return; From c05f0ecb5be1ed6981ef72a405feea18d999b769 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 30 Mar 2019 11:28:17 +1100 Subject: [PATCH 406/730] Provide mechanism to inspect Job failure #1100 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 16 ++++ src/main/java/act/job/Job.java | 22 ++--- .../java/act/job/JobExceptionListener.java | 72 ++++++++++++++++ .../act/job/JobExceptionListenerFinder.java | 31 +++++++ .../act/job/JobExceptionListenerManager.java | 85 +++++++++++++++++++ src/main/java/act/job/JobManager.java | 6 ++ src/main/resources/act.scan.list | 5 +- 8 files changed, 225 insertions(+), 13 deletions(-) create mode 100644 src/main/java/act/job/JobExceptionListener.java create mode 100644 src/main/java/act/job/JobExceptionListenerFinder.java create mode 100644 src/main/java/act/job/JobExceptionListenerManager.java diff --git a/CHANGELOG.md b/CHANGELOG.md index e4eba812e..cd0c710bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Provide mechanism to inspect Job failure #1100 * request handler - allow bind to a path in JSON body #1099 * Exception raised before committing to response shall trigger another 500 response #1097 * OsglConfig.internalCache shall be cleared before DB start init #1098 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 2eb3e823a..682142000 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -732,6 +732,10 @@ public ActionContext urlPathParam(String name, String value) { return param(name, value); } + /** + * Get all parameter keys. + * @return a set of parameter keys + */ @Override public Set paramKeys() { Set set = new HashSet(); @@ -743,6 +747,18 @@ public Set paramKeys() { return set; } + /** + * Get all parameter names. + * + * This method is an alias to {@link #paramKeys()}. We provide this method + * to make it consistent with {@link H.Request#paramNames()}. + * + * @return a set of parameter names + */ + public Set paramNames() { + return paramKeys(); + } + @Override public String paramVal(String name) { String val = _paramVal(name); diff --git a/src/main/java/act/job/Job.java b/src/main/java/act/job/Job.java index 4edb07a10..dbf493b2b 100644 --- a/src/main/java/act/job/Job.java +++ b/src/main/java/act/job/Job.java @@ -337,11 +337,11 @@ public void run() { } doJob(); progress.markAsDone(); - } catch (Throwable e) { - boolean isFatal = FATAL_EXCEPTIONS.contains(e.getClass()) || Error.class.isInstance(e); - Throwable cause = e; + } catch (Throwable t) { + boolean isFatal = FATAL_EXCEPTIONS.contains(t.getClass()) || !Exception.class.isInstance(t); + Throwable cause = t; if (!isFatal) { - cause = e.getCause(); + cause = t.getCause(); while (null != cause) { isFatal = FATAL_EXCEPTIONS.contains(cause.getClass()); if (isFatal) { @@ -350,26 +350,26 @@ public void run() { cause = cause.getCause(); } } - progress.fail(e.getMessage()); + progress.fail(t.getMessage()); if (isFatal) { if (Act.isDev()) { - app.setBlockIssue(e); + app.setBlockIssue(t); } else { + LOGGER.fatal(cause, "Fatal error executing job[%s]", id()); Act.shutdown(App.instance()); destroy(); if (App.instance().isMainThread()) { if (cause instanceof RuntimeException) { throw (RuntimeException) cause; } - throw E.unexpected(e); - } else { - LOGGER.fatal(cause, "Fatal error executing job %s", id()); + throw E.unexpected(t); } } return; } - // TODO inject Job Exception Handling mechanism here - LOGGER.warn(e, "error executing job %s", id()); + + JobExceptionListenerManager manager = Act.jobManager().exceptionListenerManager(); + manager.handleJobException(id(), (Exception) t); } finally { if (!isDestroyed()) { executed = true; diff --git a/src/main/java/act/job/JobExceptionListener.java b/src/main/java/act/job/JobExceptionListener.java new file mode 100644 index 000000000..0ab4d711a --- /dev/null +++ b/src/main/java/act/job/JobExceptionListener.java @@ -0,0 +1,72 @@ +package act.job; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.util.AdaptiveBean; +import act.util.LogSupport; + +/** + * App developer can define `JobExceptionListener` to + * process the case when an exception is raised during + * a {@link Job} running. + */ +public interface JobExceptionListener { + + /** + * A special ID list indicates all Jobs. + */ + String[] ALL_JOB = {}; + + /** + * Returns the id list of jobs that this listener + * is interested. + * + * Only exception happening on the job with id + * included in the returning list will be routed + * to the listener. + * + * If the listener would like to listen to + * exception of all jobs, then return an empty + * array or a `null` array. + * + * @return a set of job ids. + */ + String[] listenTo(); + + /** + * Handle exception `e` + * @param jobId the id of the job that triggered the exception + * @param e the exception raised in Job execution + * @return `true` if the exception is handled and framework shall not + * proceed with next job exception listener; `false` otherwise. + */ + boolean handleJobException(String jobId, Exception e); + + abstract class Adaptor extends LogSupport implements JobExceptionListener { + } + + abstract class GlobalAdaptor extends Adaptor { + @Override + public String[] listenTo() { + return ALL_JOB; + } + } +} diff --git a/src/main/java/act/job/JobExceptionListenerFinder.java b/src/main/java/act/job/JobExceptionListenerFinder.java new file mode 100644 index 000000000..8a625e3af --- /dev/null +++ b/src/main/java/act/job/JobExceptionListenerFinder.java @@ -0,0 +1,31 @@ +package act.job; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.util.SubClassFinder; + +public class JobExceptionListenerFinder { + @SubClassFinder + public void found(JobExceptionListener l) { + Act.jobManager().exceptionListenerManager().registerJobExceptionListener(l); + } +} diff --git a/src/main/java/act/job/JobExceptionListenerManager.java b/src/main/java/act/job/JobExceptionListenerManager.java new file mode 100644 index 000000000..2ad0937b0 --- /dev/null +++ b/src/main/java/act/job/JobExceptionListenerManager.java @@ -0,0 +1,85 @@ +package act.job; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.inject.util.Sorter; +import act.util.LogSupport; +import act.util.LogSupportedDestroyableBase; +import org.osgl.util.C; + +import java.util.*; + +public class JobExceptionListenerManager extends LogSupportedDestroyableBase { + + private Map> repo = new HashMap<>(); + private List globalListeners = new ArrayList<>(); + + @Override + protected void releaseResources() { + trace("release JobExceptionListenerManager"); + repo.clear(); + globalListeners.clear(); + } + + public void registerJobExceptionListener(JobExceptionListener l) { + String[] jobIds = l.listenTo(); + if (null == jobIds || jobIds.length == 0) { + globalListeners.add(l); + Collections.sort(globalListeners, Sorter.COMPARATOR); + return; + } + Set set = C.setOf(jobIds); + for (String jobId : set) { + List list = repo.get(jobId); + if (null == list) { + list = new ArrayList<>(); + repo.put(jobId, list); + } + list.add(l); + } + } + + public void handleJobException(String jobId, Exception e) { + List listeners = repo.get(jobId); + List allListeners; + if (null != listeners) { + allListeners = new ArrayList<>(); + allListeners.addAll(listeners); + allListeners.addAll(globalListeners); + Collections.sort(allListeners, Sorter.COMPARATOR); + } else { + allListeners = globalListeners; + } + for (JobExceptionListener l : allListeners) { + try { + if (l.handleJobException(jobId, e)) { + return; + } + } catch (Exception e2) { + warn(e, "Job exception encountered on running job[%s]", jobId); + error(e, "Error calling JobExceptionListener[%s] on Exception[%s]", l, e); + return; + } + } + warn(e, "Job exception encountered on running job[%s]", jobId); + } + +} diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index aa58819cf..5f3a5655f 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -57,6 +57,7 @@ public class JobManager extends AppServiceBase { private ConcurrentMap methodIndex = new ConcurrentHashMap<>(); private ConcurrentMap scheduled = new ConcurrentHashMap<>(); private CacheService jobResultCache; + private JobExceptionListenerManager exceptionListenerManager = new JobExceptionListenerManager(); static String sysEventJobId(SysEventId eventId) { return S.concat(SYS_JOB_MARKER, eventId.toString().toLowerCase()); @@ -79,6 +80,7 @@ public void run() { @Override protected void releaseResources() { LOGGER.trace("release job manager resources"); + exceptionListenerManager.destroy(); for (Job job : jobs.values()) { job.destroy(); } @@ -87,6 +89,10 @@ protected void releaseResources() { executor.shutdownNow(); } + public JobExceptionListenerManager exceptionListenerManager() { + return exceptionListenerManager; + } + public Future now(Callable callable) { return now(randomJobId(), callable); } diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index da1af5efd..21aefcddc 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -25,6 +25,9 @@ act.i18n.EnumLookupCache act.inject.DependencyInjectorBase act.inject.genie.GenieInjector act.Info +act.job.JobAdmin +act.job.JobAdmin$WsProgress +act.job.JobExceptionListenerFinder act.meta.ClassMetaInfoManager act.util.FastJsonEnhancedAdaptiveMapCodec act.util.FastJson @@ -34,7 +37,5 @@ act.Zen act.apidoc.Endpoint.Service org.osgl.util.FastJsonKvCodec act.ws.WebSocketAdminConsole -act.job.JobAdmin -act.job.JobAdmin$WsProgress act.ws.WebSocketConnectionListener$Manager$Finder act\.monitor\..* From caa2ae8b57239338e93a533349ff64dbbc284b71 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 3 Apr 2019 20:22:49 +1100 Subject: [PATCH 407/730] fix #1102 and #1103; minor improvement on act-test output in both CLI and html page --- CHANGELOG.md | 4 +- pom.xml | 5 +- src/main/java/act/app/AppCompiler.java | 1 + src/main/java/act/test/Scenario.java | 6 +- src/main/java/act/test/Test.java | 22 +++++- .../act/test/verifier/ContainsIgnoreCase.java | 75 +++++++++++++++++++ src/main/resources/rythm/~test.html | 5 +- 7 files changed, 105 insertions(+), 13 deletions(-) create mode 100644 src/main/java/act/test/verifier/ContainsIgnoreCase.java diff --git a/CHANGELOG.md b/CHANGELOG.md index cd0c710bf..5a488c2ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.20** +* Add `-parameters` argument to ECJ #1103 +* Act-Test add containsIgnoreCase verifier #1102 * Provide mechanism to inspect Job failure #1100 * request handler - allow bind to a path in JSON body #1099 * Exception raised before committing to response shall trigger another 500 response #1097 @@ -948,7 +950,7 @@ * Update fastjson to 1.2.30 1.0.5 -* * remove version range from pom.xml. See https://issues.apache.org/jira/browse/MNG-3092 +* * remove version range from pom.xml. See 1.0.4 * It shall display the exception stack trace tab on template exception page #109 diff --git a/pom.xml b/pom.xml index ae5560492..197221ee0 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,10 @@ 1.0.0.Final 2.10.1 1.11.3 - 3.13.1 + + + 3.12.1 + 1.19.2-SNAPSHOT 1.6.1-SNAPSHOT 1.9.5-SNAPSHOT diff --git a/src/main/java/act/app/AppCompiler.java b/src/main/java/act/app/AppCompiler.java index 21b7fdea2..e8a53dd9b 100644 --- a/src/main/java/act/app/AppCompiler.java +++ b/src/main/java/act/app/AppCompiler.java @@ -84,6 +84,7 @@ private void configureCompilerOptions() { opt(map, OPTION_Source, conf.sourceVersion()); opt(map, OPTION_TargetPlatform, conf.targetVersion()); opt(map, OPTION_Compliance, conf.sourceVersion()); + opt(map, OPTION_MethodParametersAttribute, GENERATE); compilerOptions = new CompilerOptions(map); } diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index b26598366..95befcb2e 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -345,11 +345,7 @@ public String title() { if (S.notBlank(description)) { buf.a(" ").a(description); } - String label = buf.toString(); - if (null != this.issueUrl && this.issueUrl.startsWith("http")) { - return S.concat("", label, ""); - } - return label; + return buf.toString(); } public void cache(String name, Object payload) { diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index a74f304ba..556e88644 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -301,11 +301,14 @@ public List run(App app, Keyword testId, boolean shutdownApp) { Collections.sort(list, new ScenarioComparator(scenarioManager, true)); if (shutdownApp) { boolean ansi = Banner.supportAnsi(); - error("Failed and Ignored scenarios:"); + String msg = ansi ? Ansi.ansi().render("@|bold FAILED/IGNORED SCENARIOS:|@").toString() : "FAILED/IGNORED SCENARIOS:"; + info("================================================================================"); + info(msg); + info("--------------------------------------------------------------------------------"); for (Scenario scenario : list) { if (scenario.status == TestStatus.FAIL) { - error("-----------------------------------------------------------"); - error("[failed] ", scenario.title()); + info("--------------------------------------------------------------------------------"); + logError(ansi, "[failed] %s", scenario.title()); if (S.notBlank(scenario.errorMessage)) { logError(ansi, scenario.errorMessage); } @@ -313,9 +316,11 @@ public List run(App app, Keyword testId, boolean shutdownApp) { logError(ansi, "cause: \n" + E.stackTrace(scenario.cause)); } } else if (scenario.ignore) { - warn("[ignored] %s", scenario.title()); + logIgnore(ansi, "[ignored] %s", scenario.title()); } } + info("================================================================================"); + info(""); } return list; } catch (Exception e) { @@ -341,6 +346,15 @@ private void logError(boolean ansi, String msg, Object... args) { error(msg); } + private void logIgnore(boolean ansi, String msg, Object... args) { + msg = S.fmt(msg, args); + if (ansi) { + msg = "@|faint " + msg + "|@"; + msg = Ansi.ansi().render(msg).toString(); + } + error(msg); + } + private void output(Scenario scenario) { if (scenario.ignore) { return; diff --git a/src/main/java/act/test/verifier/ContainsIgnoreCase.java b/src/main/java/act/test/verifier/ContainsIgnoreCase.java new file mode 100644 index 000000000..5506b51cd --- /dev/null +++ b/src/main/java/act/test/verifier/ContainsIgnoreCase.java @@ -0,0 +1,75 @@ +package act.test.verifier; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.$; +import org.osgl.util.S; + +import java.lang.reflect.Array; +import java.util.Collection; + +public class ContainsIgnoreCase extends Verifier { + + boolean isString; + String lowerCase; + + @Override + public void init(Object param) { + super.init(param); + isString = String.class.isInstance(param); + if (isString) { + lowerCase = S.string(param).toLowerCase(); + } + } + + @Override + public boolean verify(Object value) { + if (null == value) { + return initVal == null; + } + if (value instanceof String) { + return S.string(value).toLowerCase().contains(lowerCase); + } else if (value instanceof Collection) { + if (isString) { + for (Object o : (Collection) value) { + if (S.string(o).equalsIgnoreCase(lowerCase)) { + return true; + } + } + return false; + } + return ((Collection) value).contains(initVal); + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + for (int i = 0; i < len; ++i) { + Object component = Array.get(value, i); + if (isString) { + if (S.string(component).equalsIgnoreCase(lowerCase)) { + return true; + } + } else if ($.eq(component, initVal)) { + return true; + } + } + } + return false; + } +} diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html index 8aed27230..38cee2178 100644 --- a/src/main/resources/rythm/~test.html +++ b/src/main/resources/rythm/~test.html @@ -76,7 +76,9 @@

                                                                                                                                                                          Test Report

                                                                                                                                                                          @(_app.name().capFirst())-@(_app.version().getVersion())
                                                                                                                                                                          @for(Scenario scenario: result) {

                                                                                                                                                                          - @scenario.title().raw() + @scenario.title() @if(scenario.issueUrl) { +  issue link + } @if(!scenario.ignore && !scenario.status.pass()) { @if(scenario.source) {
                                                                                                                                                                            @@ -92,7 +94,6 @@

                                                                                                                                                                          -    Re-run scenario > From 5c47abeb3bde9c4f40159b1f07ef7a15594e58c1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 3 Apr 2019 21:43:29 +1100 Subject: [PATCH 408/730] add testcase for GH1095 --- .../main/java/ghissues/gh1095/GH1095Base.java | 10 +++++++ .../ghissues/gh1095/GH1095Department.java | 9 +++++++ .../java/ghissues/gh1095/Gh1095TestBed.java | 26 +++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Base.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Department.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh1095/Gh1095TestBed.java diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Base.java b/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Base.java new file mode 100644 index 000000000..878c6ed6a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Base.java @@ -0,0 +1,10 @@ +package ghissues.gh1095; + +import act.util.SimpleBean; + +import java.util.ArrayList; +import java.util.List; + +public class GH1095Base implements SimpleBean { + public List children = new ArrayList<>(); +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Department.java b/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Department.java new file mode 100644 index 000000000..3d050f87e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Department.java @@ -0,0 +1,9 @@ +package ghissues.gh1095; + +public class GH1095Department extends GH1095Base { + public String name; + + public GH1095Department(String name) { + this.name = name; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1095/Gh1095TestBed.java b/testapps/GHIssues/src/main/java/ghissues/gh1095/Gh1095TestBed.java new file mode 100644 index 000000000..0324e4fba --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1095/Gh1095TestBed.java @@ -0,0 +1,26 @@ +package ghissues.gh1095; + +import act.cli.Command; +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import act.util.PropertySpec; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1095") +public class Gh1095TestBed extends BaseController { + + @Command("1095.test") + @JsonView + @PropertySpec("name,children.*") + @GetAction + public GH1095Department test() { + GH1095Department c1 = new GH1095Department("c1"); + GH1095Department c2 = new GH1095Department("c2"); + GH1095Department p = new GH1095Department("p"); + p.children.add(c1); + p.children.add(c2); + return p; + } + +} From 934d32ea953d243168b50cf5d6f4dc8888d2fd43 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 4 Apr 2019 07:31:58 +1100 Subject: [PATCH 409/730] update osgl-http to 1.10.0 - Add headerNames() to UndertowRequest #1104 --- CHANGELOG.md | 1 + pom.xml | 2 +- src/main/java/act/test/Scenario.java | 9 +++++++++ .../java/act/test/ScenarioDebugHelper.java | 2 +- .../act/xio/undertow/UndertowRequest.java | 7 +++++++ .../resources/asset/~act/apibook/index.html | 2 +- src/test/java/act/MockRequest.java | 5 +++++ src/test/java/act/route/MockRequest.java | 5 +++++ .../src/main/java/ghissues/Gh1104.java | 19 +++++++++++++++++++ .../main/resources/test/scenarios/1104.yml | 14 ++++++++++++++ 10 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1104.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1104.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a488c2ca..4e62ac162 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Add headerNames() to UndertowRequest #1104 * Add `-parameters` argument to ECJ #1103 * Act-Test add containsIgnoreCase verifier #1102 * Provide mechanism to inspect Job failure #1100 diff --git a/pom.xml b/pom.xml index 197221ee0..c272a9583 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ 1.19.2-SNAPSHOT 1.6.1-SNAPSHOT 1.9.5-SNAPSHOT - 1.9.0 + 1.10.0-SNAPSHOT 1.9.1-SNAPSHOT 1.8.0 1.3.1 diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 95befcb2e..748c0703f 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -348,6 +348,15 @@ public String title() { return buf.toString(); } + /** + * For {@link #title()} JSON export. + * + * @return the {@link #title()} of the scenario. + */ + public String getTitle() { + return title(); + } + public void cache(String name, Object payload) { cache.put(name, payload); } diff --git a/src/main/java/act/test/ScenarioDebugHelper.java b/src/main/java/act/test/ScenarioDebugHelper.java index b09473b40..532704755 100644 --- a/src/main/java/act/test/ScenarioDebugHelper.java +++ b/src/main/java/act/test/ScenarioDebugHelper.java @@ -94,7 +94,7 @@ public void prepareAuthentication(ActionContext context) { private Test test; @GetAction({"e2e/{testId}", "test/{testId}", "tests/{testId}"}) - @PropertySpec("name, status, description") + @PropertySpec("name, status, title, errorMessage") public List run(App app, Keyword testId, ActionContext context) { if (context.accept() == H.Format.HTML) { context.templatePath("/~test.html"); diff --git a/src/main/java/act/xio/undertow/UndertowRequest.java b/src/main/java/act/xio/undertow/UndertowRequest.java index ce89de2f8..5e104bf37 100644 --- a/src/main/java/act/xio/undertow/UndertowRequest.java +++ b/src/main/java/act/xio/undertow/UndertowRequest.java @@ -28,6 +28,8 @@ import io.undertow.server.HttpServerExchange; import io.undertow.server.handlers.Cookie; import io.undertow.util.HttpString; +import org.osgl.$; +import org.osgl.Lang; import org.osgl.util.*; import java.io.ByteArrayInputStream; @@ -136,6 +138,11 @@ public Iterable headers(String name) { return vals; } + @Override + public Iterable headerNames() { + return C.seq(hse.getRequestHeaders().getHeaderNames()).map($.F.asString()); + } + @Override public InputStream createInputStream() throws IllegalStateException { if (null != body) { diff --git a/src/main/resources/asset/~act/apibook/index.html b/src/main/resources/asset/~act/apibook/index.html index c6d902e3f..7dc57a7f8 100644 --- a/src/main/resources/asset/~act/apibook/index.html +++ b/src/main/resources/asset/~act/apibook/index.html @@ -25,7 +25,7 @@ background-color: #222; color: #ddd; font-family: "Noto Sans", Tahoma, "Segoe UI", "Helvetica Neue", Arial, sans-serif; - font-size: 14px; + font-size: 13px; } a {color: #00b8b6;} h1,h2,h3,h4,h5 { diff --git a/src/test/java/act/MockRequest.java b/src/test/java/act/MockRequest.java index dacf6d101..e42d91079 100644 --- a/src/test/java/act/MockRequest.java +++ b/src/test/java/act/MockRequest.java @@ -50,6 +50,11 @@ public Iterable headers(String name) { return null; } + @Override + public Iterable headerNames() { + return null; + } + @Override public H.Format accept() { return super.accept(); diff --git a/src/test/java/act/route/MockRequest.java b/src/test/java/act/route/MockRequest.java index bc2d526ff..60bb97f04 100644 --- a/src/test/java/act/route/MockRequest.java +++ b/src/test/java/act/route/MockRequest.java @@ -57,6 +57,11 @@ public Iterable headers(String name) { return null; } + @Override + public Iterable headerNames() { + return null; + } + @Override public String path() { return url; diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1104.java b/testapps/GHIssues/src/main/java/ghissues/Gh1104.java new file mode 100644 index 000000000..5b58ce2ab --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1104.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import act.util.PropertySpec; +import org.osgl.http.H; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.N; +import org.osgl.util.S; + +@UrlContext("1104") +@JsonView +public class Gh1104 extends BaseController { + + @GetAction + public Iterable test(H.Request req) { + return req.headerNames(); + } +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1104.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1104.yml new file mode 100644 index 000000000..467b0280b --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1104.yml @@ -0,0 +1,14 @@ +Scenario(1104): + issueUrl: https://github.com/actframework/actframework/issues/1104 + description: "Add headerNames() to UndertowRequest" + interactions: + - description: Test + request: + get: 1104 + headers: + foo: bar + response: + json: + size: + - gt: 0 + ?: bar From 64908b02df3eb52fabdb0b2647bb56613bfa9b7c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 4 Apr 2019 08:28:39 +1100 Subject: [PATCH 410/730] ci test case fix --- .../GHIssues/src/main/java/ghissues/Gh1104.java | 13 +++++++++++++ .../src/main/resources/test/scenarios/1104.yml | 2 +- .../src/main/resources/test/scenarios/908.yml | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1104.java b/testapps/GHIssues/src/main/java/ghissues/Gh1104.java index 5b58ce2ab..5ac107fa4 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh1104.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1104.java @@ -8,12 +8,25 @@ import org.osgl.util.N; import org.osgl.util.S; +import java.util.HashMap; +import java.util.Map; + @UrlContext("1104") @JsonView +@SuppressWarnings("unused") public class Gh1104 extends BaseController { @GetAction public Iterable test(H.Request req) { return req.headerNames(); } + + @GetAction("all") + public Map> allHeaders(H.Request req) { + Map> map = new HashMap<>(); + for (String name : req.headerNames()) { + map.put(name, req.headers(name)); + } + return map; + } } diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1104.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1104.yml index 467b0280b..112d127c3 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1104.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1104.yml @@ -11,4 +11,4 @@ Scenario(1104): json: size: - gt: 0 - ?: bar + ?: foo diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/908.yml b/testapps/GHIssues/src/main/resources/test/scenarios/908.yml index 75c3e9b1c..4c4bccbcb 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/908.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/908.yml @@ -1,4 +1,6 @@ +# TODO redefine the test case Scenario(908): + ignore: true description: Test - allow setting precision of ${now()} function constants: startTs0: ${now()} # default: low precision From 400002d20afed5c875467d0860cefcb059870f11 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 4 Apr 2019 21:46:11 +1100 Subject: [PATCH 411/730] Mock data function for development #1106; API doc - improve processing collection types --- CHANGELOG.md | 1 + src/main/java/act/apidoc/ApiManager.java | 44 ++++++++-- src/main/java/act/apidoc/Endpoint.java | 33 +++---- .../act/apidoc/SimpleEndpointIdProvider.java | 2 +- .../impl/ReflectedHandlerInvoker.java | 5 ++ src/main/java/act/session/JWT.java | 4 +- src/main/java/act/view/ActErrorResult.java | 7 ++ .../java/act/view/ActToBeImplemented.java | 86 +++++++++++++++++++ 8 files changed, 156 insertions(+), 26 deletions(-) create mode 100644 src/main/java/act/view/ActToBeImplemented.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e62ac162..9a4d30517 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Mock data function for development #1106 * Add headerNames() to UndertowRequest #1104 * Add `-parameters` argument to ECJ #1103 * Act-Test add containsIgnoreCase verifier #1102 diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index f42ac0b1c..19bd9388f 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -39,7 +39,9 @@ import com.alibaba.fastjson.JSONObject; import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.NamedNode; import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.PackageDeclaration; import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.comments.Comment; import com.github.javaparser.ast.comments.JavadocComment; @@ -70,6 +72,9 @@ public class ApiManager extends AppServiceBase { */ SortedSet endpoints = new TreeSet<>(); + /** + * Mapped by {@link Endpoint#getId()} + */ Map endpointLookup = new HashMap<>(); SortedMap> moduleLookup = new TreeMap<>(); @@ -114,6 +119,10 @@ protected void releaseResources() { moduleLookup.clear(); } + public Endpoint endpoint(String id) { + return endpointLookup.get(id); + } + public void load(App app) { LOGGER.info("start compiling API book"); if (app.isProd()) { @@ -246,7 +255,7 @@ private static List merge(List overwritten, Li } private Javadoc javadocOf(Endpoint endpoint, Map methodJavaDocs) { - Javadoc javadoc = methodJavaDocs.get(endpoint.getId()); + Javadoc javadoc = methodJavaDocs.get(endpoint.getId().replace('$', '.')); if (null == javadoc) { String parentId = endpoint.getParentId(); if (S.blank(parentId)) { @@ -290,7 +299,7 @@ private void exploreDescriptions(Set controllerClasses) { List types = compilationUnit.getTypes(); for (TypeDeclaration type : types) { if (type instanceof ClassOrInterfaceDeclaration) { - exploreDeclaration((ClassOrInterfaceDeclaration) type, methodJavaDocs, fieldJavaDocs, ""); + exploreDeclaration((ClassOrInterfaceDeclaration) type, methodJavaDocs, fieldJavaDocs); } } } catch (Exception e) { @@ -338,12 +347,31 @@ private void exploreDescriptions(Set controllerClasses) { } } - private void exploreDeclaration(ClassOrInterfaceDeclaration classDeclaration, Map methodJavaDocs, Map fieldJavaDocs, String prefix) { - String className = classDeclaration.getName(); - String newPrefix = S.blank(prefix) ? className : S.concat(prefix, ".", className); + private static String name(Node node) { + S.Buffer buffer = S.newBuffer(); + Node parent = node.getParentNode(); + if (null != parent) { + buffer.append(name(parent)); + } + if (node instanceof NamedNode) { + buffer.append(".").append(((NamedNode) node).getName()); + } else if (node instanceof CompilationUnit) { + CompilationUnit unit = $.cast(node); + PackageDeclaration pkg = unit.getPackage(); + return pkg.getPackageName(); + } + return buffer.toString(); + } + + private void exploreDeclaration( + ClassOrInterfaceDeclaration classDeclaration, + Map methodJavaDocs, + Map fieldJavaDocs + ) { + String prefix = name(classDeclaration); for (Node node : classDeclaration.getChildrenNodes()) { if (node instanceof ClassOrInterfaceDeclaration) { - exploreDeclaration((ClassOrInterfaceDeclaration) node, methodJavaDocs, fieldJavaDocs, newPrefix); + exploreDeclaration((ClassOrInterfaceDeclaration) node, methodJavaDocs, fieldJavaDocs); } else if (node instanceof FieldDeclaration) { FieldDeclaration fieldDeclaration = (FieldDeclaration) node; Comment comment = fieldDeclaration.getComment(); @@ -354,7 +382,7 @@ private void exploreDeclaration(ClassOrInterfaceDeclaration classDeclaration, Ma if (vars.size() > 0) { JavadocComment javadocComment = (JavadocComment) comment; Javadoc javadoc = JavadocParser.parse(javadocComment); - fieldJavaDocs.put(S.concat(newPrefix, ".", vars.get(0).getId()), javadoc); + fieldJavaDocs.put(S.concat(prefix, ".", vars.get(0).getId()), javadoc); } } else if (node instanceof MethodDeclaration) { MethodDeclaration methodDeclaration = (MethodDeclaration) node; @@ -371,7 +399,7 @@ private void exploreDeclaration(ClassOrInterfaceDeclaration classDeclaration, Ma } JavadocComment javadocComment = (JavadocComment) comment; Javadoc javadoc = JavadocParser.parse(javadocComment); - methodJavaDocs.put(S.concat(newPrefix, ".", methodDeclaration.getName()), javadoc); + methodJavaDocs.put(S.concat(prefix, ".", methodDeclaration.getName()), javadoc); } } } diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 7453fd20d..9ae38243a 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -53,6 +53,7 @@ import org.osgl.storage.impl.SObject; import org.osgl.util.*; +import java.beans.Transient; import java.lang.annotation.Annotation; import java.lang.reflect.*; import java.math.BigDecimal; @@ -156,6 +157,8 @@ public enum Scheme { /** * unique identify an endpoint in an application. + * + * Generated from class and method name via {@link SimpleEndpointIdProvider#id(Class, Method)} */ public String id; @@ -199,12 +202,14 @@ public enum Scheme { public String module; - private transient Class returnType; + private transient BeanSpec returnType; private Map typeLookups; public String returnSample; + public transient Object returnSampleObject; + /** * Param list. * @@ -310,7 +315,7 @@ public List getParams() { return params; } - public Class returnType() { + public BeanSpec returnType() { return returnType; } @@ -319,10 +324,7 @@ public String getReturnSample() { } public String getReturnType() { - if (void.class == returnType || Void.class == returnType) { - return null; - } - return className(returnType); + return null == returnType ? null : returnType.toString(); } public String getSampleJsonPost() { @@ -372,7 +374,7 @@ private void explore(RequestHandler handler) { Class controllerClass = invoker.controllerClass(); typeLookups = Generics.buildTypeParamImplLookup(controllerClass); Method method = invoker.method(); - returnType = Generics.getReturnType(method, controllerClass); + returnType = BeanSpec.of(method.getGenericReturnType(), Act.injector(), typeLookups); PropertySpec pspec = method.getAnnotation(PropertySpec.class); if (null != pspec) { PropertySpec.MetaInfo propSpec = new PropertySpec.MetaInfo(); @@ -385,7 +387,7 @@ private void explore(RequestHandler handler) { List outputs = propSpec.outputFieldsForHttp(); Set excluded = propSpec.excludeFieldsForHttp(); if (!(outputs.isEmpty() && excluded.isEmpty())) { - fastJsonPropertyPreFilter = new FastJsonPropertyPreFilter(returnType, outputs, excluded, Act.app().service(DataPropertyRepository.class)); + fastJsonPropertyPreFilter = new FastJsonPropertyPreFilter(returnType.rawType(), outputs, excluded, Act.app().service(DataPropertyRepository.class)); } // just ignore cli value here } @@ -415,7 +417,7 @@ private void explore(RequestHandler handler) { } this.controllerClass = controllerClass; try { - this.returnSample = void.class == returnType ? null : generateSampleJson(BeanSpec.of(returnType, null, Act.injector()), typeParamLookup, true); + this.returnSample = null == returnType ? null : generateSampleJson(returnType, typeParamLookup, true); } catch (Exception e) { LOGGER.warn(e, "Error creating returnSample of endpoint for request handler [%s] for [%s %s]", handler, httpMethod, path); } @@ -424,8 +426,7 @@ private void explore(RequestHandler handler) { private String inferModule(Class controllerClass) { Class enclosingClass = controllerClass.getEnclosingClass(); if (null != enclosingClass) { - String enclosingModule = inferModule(enclosingClass); - return S.concat(enclosingModule, ".", controllerClass.getSimpleName()); + return inferModule(enclosingClass); } return controllerClass.getSimpleName(); } @@ -540,17 +541,17 @@ private String generateSampleJson(BeanSpec spec, Map typeParamLoo if (Result.class.isAssignableFrom(type) || void.class == type) { return null; } - Object sample = generateSampleData(spec, typeParamLookup, new HashSet(), new ArrayList(), isReturn); - if (null == sample) { + returnSampleObject = generateSampleData(spec, typeParamLookup, new HashSet(), new ArrayList(), isReturn); + if (null == returnSampleObject) { return null; } - if (sample instanceof Map && ((Map) sample).isEmpty()) { + if (returnSampleObject instanceof Map && ((Map) returnSampleObject).isEmpty()) { return null; } if ($.isSimpleType(type)) { - sample = C.Map("result", sample); + returnSampleObject = C.Map("result", returnSampleObject); } - return JSON.toJSONString(sample, true); + return JSON.toJSONString(returnSampleObject, true); } private String generateSampleQuery(BeanSpec spec, Map typeParamLookup, String bindName, Set typeChain, List nameChain) { diff --git a/src/main/java/act/apidoc/SimpleEndpointIdProvider.java b/src/main/java/act/apidoc/SimpleEndpointIdProvider.java index e99f3020e..66325740f 100644 --- a/src/main/java/act/apidoc/SimpleEndpointIdProvider.java +++ b/src/main/java/act/apidoc/SimpleEndpointIdProvider.java @@ -50,7 +50,7 @@ public String getParentId() { } static String id(Class controllerClass, Method method) { - return className(controllerClass) + "." + method.getName(); + return controllerClass.getName() + "." + method.getName(); } public static String className(Class clz) { diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index b4bc6b45d..74c7732b3 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -444,6 +444,11 @@ public int order() { return this.order; } + public M handlerMetaInfo() { + return handler; + + } + @Override public Integer priority() { return handler.priority(); diff --git a/src/main/java/act/session/JWT.java b/src/main/java/act/session/JWT.java index 2e4b3faa5..797d3cec2 100644 --- a/src/main/java/act/session/JWT.java +++ b/src/main/java/act/session/JWT.java @@ -162,7 +162,9 @@ public String serialize(Token token) { public Token deserialize(String tokenString) { List parts = S.fastSplit(tokenString, "."); - E.illegalArgumentIf(parts.size() != 3); + if (parts.size() != 3) { + return null; + } String encodedHeaders = parts.get(0); String encodedPayloads = parts.get(1); String hash = parts.get(2); diff --git a/src/main/java/act/view/ActErrorResult.java b/src/main/java/act/view/ActErrorResult.java index 01c07d9c5..7fc062a43 100644 --- a/src/main/java/act/view/ActErrorResult.java +++ b/src/main/java/act/view/ActErrorResult.java @@ -32,6 +32,7 @@ import act.util.ActError; import org.osgl.$; import org.osgl.exception.InvalidRangeException; +import org.osgl.exception.ToBeImplemented; import org.osgl.exception.UnsupportedException; import org.osgl.http.H; import org.osgl.mvc.annotation.ResponseStatus; @@ -164,6 +165,12 @@ public Result transform(Throwable throwable) { return ActNotImplemented.create(throwable); } }; + x.put(ToBeImplemented.class, new $.Transformer() { + @Override + public Result transform(Throwable throwable) { + return ActToBeImplemented.create(); + } + }); x.put(UnsupportedException.class, unsupported); x.put(UnsupportedOperationException.class, unsupported); x.put(IllegalStateException.class, new $.Transformer() { diff --git a/src/main/java/act/view/ActToBeImplemented.java b/src/main/java/act/view/ActToBeImplemented.java new file mode 100644 index 000000000..d7e40e092 --- /dev/null +++ b/src/main/java/act/view/ActToBeImplemented.java @@ -0,0 +1,86 @@ +package act.view; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.apidoc.ApiManager; +import act.apidoc.Endpoint; +import act.app.ActionContext; +import act.controller.Controller; +import act.handler.RequestHandler; +import act.handler.builtin.controller.ActionHandlerInvoker; +import act.handler.builtin.controller.RequestHandlerProxy; +import act.handler.builtin.controller.impl.ReflectedHandlerInvoker; +import org.osgl.$; +import org.osgl.http.H; +import org.osgl.logging.LogManager; +import org.osgl.logging.Logger; +import org.osgl.mvc.result.ErrorResult; +import org.osgl.mvc.result.NotImplemented; +import org.osgl.mvc.result.Result; + +public class ActToBeImplemented extends ErrorResult { + + private static final Logger logger = LogManager.get(ActToBeImplemented.class); + + private ActToBeImplemented() { + super(H.Status.of(inferStatusCode())); + } + + private static int inferStatusCode() { + ActionContext context = ActionContext.current(); + return context.successStatus().code(); + } + + @Override + protected void applyMessage(H.Request request, H.Response response) { + ActionContext context = ActionContext.current(); + if ($.bool(context.hasTemplate())) { + throw createNotImplemented(); + } + Endpoint endpoint = Act.getInstance(ApiManager.class).endpoint(context.actionPath()); + if (null == endpoint) { + logger.warn("Cannot locate endpoint for %s", context.actionPath()); + throw createNotImplemented(); + } + RequestHandler handler = context.handler(); + if (handler instanceof RequestHandlerProxy) { + RequestHandlerProxy proxy = $.cast(handler); + ActionHandlerInvoker invoker = proxy.actionHandler().invoker(); + if (invoker instanceof ReflectedHandlerInvoker) { + ReflectedHandlerInvoker rfi = $.cast(invoker); + Result result = Controller.Util.inferResult(rfi.handlerMetaInfo(), endpoint.returnSampleObject, context, false); + result.apply(request, response); + return; + } + } + throw createNotImplemented(); + } + + public static ErrorResult create() { + return Act.isDev() ? new ActToBeImplemented() : createNotImplemented(); + } + + private static ErrorResult createNotImplemented() { + return ActNotImplemented.create("To be implemented"); + } + +} From ad370ba461ab896126003a48cd29c7b7a3cf6b7b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 5 Apr 2019 22:55:43 +1100 Subject: [PATCH 412/730] Improve `~/test` page rendering #1105 --- CHANGELOG.md | 1 + src/main/java/act/metric/MetricInfo.java | 4 + src/main/java/act/metric/SimpleMetric.java | 7 +- .../java/act/metric/SimpleMetricPlugin.java | 5 +- src/main/java/act/test/Interaction.java | 68 +- src/main/java/act/test/Scenario.java | 90 +- .../java/act/test/ScenarioDebugHelper.java | 57 +- src/main/java/act/test/Test.java | 79 +- src/main/java/act/util/ProgressGauge.java | 19 + .../java/act/util/SimpleProgressGauge.java | 16 +- .../tongfei/progressbar/ProgressThread.java | 2 +- src/main/resources/aaa.authenticate.list | 3 +- src/main/resources/asset/~act/js/jsrender.js | 4 + .../resources/asset/~act/js/jsrender.js.map | 2628 +++++++++++++++++ src/main/resources/rythm/~test_async.html | 226 ++ .../src/main/resources/rythm/~test_async.html | 225 ++ .../main/resources/test/scenarios/1015.yml | 2 +- .../src/main/resources/test/scenarios/928.yml | 1 + 18 files changed, 3354 insertions(+), 83 deletions(-) create mode 100644 src/main/resources/asset/~act/js/jsrender.js create mode 100644 src/main/resources/asset/~act/js/jsrender.js.map create mode 100644 src/main/resources/rythm/~test_async.html create mode 100644 testapps/GHIssues/src/main/resources/rythm/~test_async.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a4d30517..8f5db6ff6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.20** +* Improve `~/test` page rendering #1105 * Mock data function for development #1106 * Add headerNames() to UndertowRequest #1104 * Add `-parameters` argument to ECJ #1103 diff --git a/src/main/java/act/metric/MetricInfo.java b/src/main/java/act/metric/MetricInfo.java index edca2b8e5..287c4f759 100644 --- a/src/main/java/act/metric/MetricInfo.java +++ b/src/main/java/act/metric/MetricInfo.java @@ -25,6 +25,10 @@ public class MetricInfo { public static final String HTTP_HANDLER = "act:http"; + public static final String ACT_TEST = "act:test"; + public static final String ACT_TEST_HELPER = "act:test:helper"; + public static final String ACT_TEST_SCENARIO = "act:test:scenario"; + public static final String ACT_TEST_INTERACTION = "act:test:scenario:interaction"; public static final String CLASS_LOADING = "act:classload"; public static final String COMPILING = CLASS_LOADING + Metric.PATH_SEPARATOR + "compile"; public static final String JOB_HANDLER = "act:job"; diff --git a/src/main/java/act/metric/SimpleMetric.java b/src/main/java/act/metric/SimpleMetric.java index db99c922e..1a1ccb13f 100644 --- a/src/main/java/act/metric/SimpleMetric.java +++ b/src/main/java/act/metric/SimpleMetric.java @@ -21,20 +21,23 @@ */ import org.osgl.$; +import org.osgl.util.S; /** * A simple implementation of {@link Metric} */ public class SimpleMetric implements Metric { private MetricStore metricStore; + private String name; - public SimpleMetric(MetricStore metricStore) { + public SimpleMetric(String name, MetricStore metricStore) { + this.name = name; this.metricStore = $.requireNotNull(metricStore); } @Override public Timer startTimer(String name) { - return new SimpleTimer(name, metricStore); + return new SimpleTimer(S.pathConcat(this.name, ':', name), metricStore); } @Override diff --git a/src/main/java/act/metric/SimpleMetricPlugin.java b/src/main/java/act/metric/SimpleMetricPlugin.java index b9c2cfaad..01d814438 100644 --- a/src/main/java/act/metric/SimpleMetricPlugin.java +++ b/src/main/java/act/metric/SimpleMetricPlugin.java @@ -26,6 +26,7 @@ import org.osgl.$; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; +import org.osgl.util.S; import java.util.HashMap; import java.util.Map; @@ -37,7 +38,7 @@ public class SimpleMetricPlugin implements MetricPlugin { private Map enabledMap = new HashMap<>(); private SimpleMetricStore defaultMetricStore = new SimpleMetricStore(this); - private Metric defaultMetric = new SimpleMetric(defaultMetricStore); + private Metric defaultMetric = new SimpleMetric("act", defaultMetricStore); public SimpleMetricPlugin() { } @@ -52,7 +53,7 @@ public Metric metric(String name) { logger = LogManager.get("act.metric." + name); enabledMap.put(name, logger); } - return logger.isTraceEnabled() ? metric() : Metric.NULL_METRIC; + return logger.isTraceEnabled() ? S.blank(name) ? defaultMetric : new SimpleMetric(name, defaultMetricStore) : Metric.NULL_METRIC; } @Override diff --git a/src/main/java/act/test/Interaction.java b/src/main/java/act/test/Interaction.java index ffa73bd62..e662aa20e 100644 --- a/src/main/java/act/test/Interaction.java +++ b/src/main/java/act/test/Interaction.java @@ -20,21 +20,29 @@ * #L% */ -import static act.test.TestStatus.PENDING; -import static act.test.util.ErrorMessage.error; - import act.Act; +import act.metric.Metric; import act.test.inbox.Inbox; import act.test.macro.Macro; +import act.test.util.ErrorMessage; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import okhttp3.Response; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; -import org.osgl.util.*; +import org.osgl.util.E; +import org.osgl.util.IO; +import org.osgl.util.S; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static act.metric.MetricInfo.ACT_TEST_INTERACTION; +import static act.test.TestStatus.PENDING; +import static act.test.util.ErrorMessage.error; public class Interaction implements ScenarioPart { public List preActions = new ArrayList<>(); @@ -44,19 +52,25 @@ public class Interaction implements ScenarioPart { public List postActions = new ArrayList<>(); public Map cache = new LinkedHashMap<>(); public String errorMessage; - public Throwable cause; + public transient Throwable cause; public TestStatus status = PENDING; + private transient Metric metric = Act.metricPlugin().metric(ACT_TEST_INTERACTION); @Override public void validate(Scenario scenario) throws UnexpectedException { E.unexpectedIf(null == request, "request spec not specified in interaction[%s]", this); //E.unexpectedIf(null == response, "response spec not specified"); - scenario.resolveRequest(request); - request.validate(this); - if (null != response) { - response.validate(this); + act.metric.Timer timer = metric.startTimer("validate"); + try { + scenario.resolveRequest(request); + request.validate(this); + if (null != response) { + response.validate(this); + } + reset(); + } finally { + timer.stop(); } - reset(); } @Override @@ -64,10 +78,19 @@ public String toString() { return description; } + public String getStackTrace() { + return causeStackTrace(); + } + public boolean run() { - boolean pass = run(preActions) && verify() && run(postActions); - status = TestStatus.of(pass); - return pass; + act.metric.Timer timer = metric.startTimer("run"); + try { + boolean pass = run(preActions) && verify() && run(postActions); + status = TestStatus.of(pass); + return pass; + } finally { + timer.stop(); + } } public String causeStackTrace() { @@ -102,9 +125,14 @@ private boolean verify() { } private void doVerify(Response resp) throws Exception { - verifyStatus(resp); - verifyHeaders(resp); - verifyBody(resp); + act.metric.Timer timer = metric.startTimer("verify"); + try { + verifyStatus(resp); + verifyHeaders(resp); + verifyBody(resp); + } finally { + timer.stop(); + } } private void doVerifyEmail(String email) throws Exception { @@ -205,6 +233,10 @@ private H.Status expectedStatus() { private static Throwable causeOf(Exception e) { Throwable cause = e.getCause(); - return null == cause ? e : cause; + Throwable t = null == cause ? e : cause; + if (t instanceof ErrorMessage) { + t = null; + } + return t; } } diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 748c0703f..88a18a684 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -29,6 +29,10 @@ import act.Act; import act.app.App; import act.handler.builtin.FileGetter; +import act.metric.MeasureTime; +import act.metric.Metric; +import act.metric.MetricInfo; +import act.metric.Timer; import act.test.func.Func; import act.test.req_modifier.RequestModifier; import act.test.util.*; @@ -315,6 +319,7 @@ private String verifyXmlBody(Object xmlBody) { public String urlContext; public String partition = "DEFAULT"; public String source; + private transient Metric metric = Act.metricPlugin().metric(MetricInfo.ACT_TEST_SCENARIO); $.Var lastData = $.var(); $.Var lastHeaders = $.var(); @@ -477,20 +482,33 @@ public boolean clearFixtures() { if (!clearFixtures) { return true; } - return verify(RequestSpec.RS_CLEAR_FIXTURE, "clearing fixtures"); + Timer timer = metric.startTimer("clear-fixtures"); + try { + return verify(RequestSpec.RS_CLEAR_FIXTURE, "clearing fixtures"); + } finally { + timer.stop(); + } } public String causeStackTrace() { return null == cause ? null: E.stackTrace(cause); } + public String getStackTrace() { + return causeStackTrace(); + } + void resolveRequest(RequestSpec req) { req.resolveParent(requestTemplateManager); } Response sendRequest(RequestSpec req) throws IOException { + Timer timer = metric.startTimer("build-request"); Request httpRequest = new RequestBuilder(req).build(); + timer.stop(); + timer = metric.startTimer("send-request"); Response resp = http.newCall(httpRequest).execute(); + timer.stop();; lastHeaders.set(resp.headers()); return resp; } @@ -499,35 +517,45 @@ private boolean createFixtures() { if (fixtures.isEmpty()) { return true; } - RequestSpec req = RequestSpec.loadFixtures(fixtures); - return verify(req, "creating fixtures"); + Timer timer = metric.startTimer("create-fixtures"); + try { + RequestSpec req = RequestSpec.loadFixtures(fixtures); + return verify(req, "creating fixtures"); + } finally { + timer.stop(); + } } private boolean generateTestData() { if (null == generateTestData) { return true; } - boolean ok; - if (generateTestData instanceof Map) { - Map map = $.cast(generateTestData); - for (Map.Entry entry : map.entrySet()) { - RequestSpec req = RequestSpec.generateTestData(entry.getKey(), entry.getValue()); - ok = verify(req, "generate test data for " + entry.getKey()); - if (!ok) { - return false; + Timer timer = metric.startTimer("generate-test-data"); + try { + boolean ok; + if (generateTestData instanceof Map) { + Map map = $.cast(generateTestData); + for (Map.Entry entry : map.entrySet()) { + RequestSpec req = RequestSpec.generateTestData(entry.getKey(), entry.getValue()); + ok = verify(req, "generate test data for " + entry.getKey()); + if (!ok) { + return false; + } } - } - } else if (generateTestData instanceof List) { - List list = $.cast(generateTestData); - for (String modelType: list) { - RequestSpec req = RequestSpec.generateTestData(modelType, 100); - ok = verify(req, "generate test data for " + modelType); - if (!ok) { - return false; + } else if (generateTestData instanceof List) { + List list = $.cast(generateTestData); + for (String modelType : list) { + RequestSpec req = RequestSpec.generateTestData(modelType, 100); + ok = verify(req, "generate test data for " + modelType); + if (!ok) { + return false; + } } } + return true; + } finally { + timer.stop(); } - return true; } private boolean verify(RequestSpec req, String operation) { @@ -560,12 +588,17 @@ private void prepareHttp() { } private boolean reset() { - errorMessage = null; - clearSession(); - if (depends.isEmpty()) { - return clearFixtures() && createFixtures() && generateTestData(); + Timer timer = metric.startTimer("reset"); + try { + errorMessage = null; + clearSession(); + if (depends.isEmpty()) { + return clearFixtures() && createFixtures() && generateTestData(); + } + return createFixtures() && generateTestData(); + } finally { + timer.stop(); } - return createFixtures() && generateTestData(); } private boolean run(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager) { @@ -581,7 +614,12 @@ private boolean run() { if (status.finished()) { return status.pass(); } - return runDependents() && runInteractions(); + Timer timer = metric.startTimer("run"); + try { + return runDependents() && runInteractions(); + } finally { + timer.stop(); + } } private boolean runDependents() { diff --git a/src/main/java/act/test/ScenarioDebugHelper.java b/src/main/java/act/test/ScenarioDebugHelper.java index 532704755..c88ad4b9c 100644 --- a/src/main/java/act/test/ScenarioDebugHelper.java +++ b/src/main/java/act/test/ScenarioDebugHelper.java @@ -24,17 +24,28 @@ import act.app.ActionContext; import act.app.App; import act.handler.RequestHandlerBase; +import act.metric.Metric; +import act.metric.MetricPlugin; +import act.metric.Timer; import act.sys.Env; +import act.util.Async; +import act.util.ProgressGauge; import act.util.PropertySpec; import com.alibaba.fastjson.*; import org.osgl.http.H; import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.mvc.result.Result; import org.osgl.util.Keyword; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; +import static act.controller.Controller.Util.render; +import static act.metric.MetricInfo.ACT_TEST_INTERACTION; +import static act.metric.MetricInfo.ACT_TEST_SCENARIO; + /** * Allows debug scenario file via: * 1. provide a command to launch test @@ -47,6 +58,7 @@ public class ScenarioDebugHelper { public static class LoadFixtures extends RequestHandlerBase { private Test test; + private Metric metric = Act.metricPlugin().metric(ACT_TEST_SCENARIO); public LoadFixtures(Test test) { this.test = test; @@ -54,12 +66,17 @@ public LoadFixtures(Test test) { @Override public void handle(ActionContext context) { - JSONObject json = JSON.parseObject(context.body()); - JSONArray fixtures = json.getJSONArray("fixtures"); - test.loadFixtures((List) fixtures); - H.Response resp = context.resp(); - resp.status(H.Status.OK); - resp.commit(); + Timer timer = metric.startTimer("load-fixtures:handler"); + try { + JSONObject json = JSON.parseObject(context.body()); + JSONArray fixtures = json.getJSONArray("fixtures"); + test.loadFixtures((List) fixtures); + H.Response resp = context.resp(); + resp.status(H.Status.OK); + resp.commit(); + } finally { + timer.stop(); + } } @Override @@ -70,6 +87,7 @@ public void prepareAuthentication(ActionContext context) { public static class ClearFixtures extends RequestHandlerBase { private Test test; + private Metric metric = Act.metricPlugin().metric(ACT_TEST_SCENARIO); public ClearFixtures(Test test) { this.test = test; @@ -77,10 +95,15 @@ public ClearFixtures(Test test) { @Override public void handle(ActionContext context) { - test.clearFixtures(); - H.Response resp = context.resp(); - resp.status(H.Status.NO_CONTENT); - resp.commit(); + Timer timer = metric.startTimer("clear-fixtures:handler"); + try { + test.clearFixtures(); + H.Response resp = context.resp(); + resp.status(H.Status.NO_CONTENT); + resp.commit(); + } finally { + timer.stop(); + } } @Override @@ -94,12 +117,19 @@ public void prepareAuthentication(ActionContext context) { private Test test; @GetAction({"e2e/{testId}", "test/{testId}", "tests/{testId}"}) - @PropertySpec("name, status, title, errorMessage") - public List run(App app, Keyword testId, ActionContext context) { + public Result testForm(String testId, ActionContext context) { + context.templatePath("/~test_async.html"); + return render(testId); + } + + @PostAction({"e2e/{testId}", "test/{testId}", "tests/{testId}"}) + @PropertySpec("name, ignore, source, status, issueUrl, title, errorMessage, interactions.status, interactions.description, interactions.stackTrace, interactions.errorMessage") + @Async + public List run(App app, Keyword testId, ActionContext context, ProgressGauge gauge) { if (context.accept() == H.Format.HTML) { context.templatePath("/~test.html"); } - List results = test.run(app, testId, false); + List results = test.run(app, testId, false, gauge); boolean failure = false; for (Scenario scenario : results) { if (!scenario.ignore && !scenario.status.pass()) { @@ -108,6 +138,7 @@ public List run(App app, Keyword testId, ActionContext context) { } } context.renderArg("failure", failure); + gauge.markAsDone(); return results; } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 556e88644..1d5b0b653 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -26,10 +26,15 @@ import act.app.DbServiceManager; import act.app.event.SysEventId; import act.db.Dao; +import act.db.DaoBase; import act.db.DbService; import act.event.EventBus; import act.inject.DefaultValue; +import act.inject.param.NoBind; import act.job.*; +import act.metric.MeasureTime; +import act.metric.Metric; +import act.metric.MetricInfo; import act.sys.Env; import act.test.func.Func; import act.test.macro.Macro; @@ -37,13 +42,17 @@ import act.test.util.*; import act.test.verifier.Verifier; import act.util.*; +import me.tongfei.progressbar.ProgressBar; +import me.tongfei.progressbar.ProgressBarStyle; import org.fusesource.jansi.Ansi; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.mvc.annotation.DeleteAction; import org.osgl.mvc.annotation.PostAction; import org.osgl.util.*; +import org.xnio.streams.WriterOutputStream; +import java.io.PrintStream; import java.lang.reflect.Modifier; import java.lang.reflect.Type; import java.net.URL; @@ -100,6 +109,7 @@ public static String get(String name) { * setup testing data */ @PostAction({"e2e/fixtures", "test/fixtures"}) + @MeasureTime(MetricInfo.ACT_TEST_HELPER + ":load-fixtures") public void loadFixtures(List fixtures) { for (String fixture : fixtures) { Job fixtureLoader = jobManager.jobById(fixture, false); @@ -119,6 +129,7 @@ public void loadFixtures(List fixtures) { * the number of records to be generated */ @PostAction({"e2e/generateTestData", "test/generateTestData"}) + @MeasureTime(MetricInfo.ACT_TEST_HELPER + ":generate-sample-data") public void generateSampleData(String modelType, @DefaultValue("100") Integer number) { E.illegalArgumentIf(number < 1); Class modelClass = null; @@ -153,6 +164,7 @@ public void generateSampleData(String modelType, @DefaultValue("100") Integer nu * setup testing data */ @DeleteAction({"e2e/fixtures", "test/fixtures"}) + @MeasureTime(MetricInfo.ACT_TEST_HELPER + ":clear-fixtures") public void clearFixtures() { List toBeDeleted = new ArrayList<>(); for (DbService svc : dbServiceManager.registeredServices()) { @@ -168,6 +180,9 @@ public void clearFixtures() { if (dao.getClass().isAnnotationPresent(NotFixture.class)) { continue; } + if (Generics.tryGetTypeParamImplementations(dao.getClass(), DaoBase.class).isEmpty()) { + continue; + } toBeDeleted.add(dao); } catch (IllegalArgumentException e) { if (e.getMessage().contains("Cannot find out Dao for model type")) { @@ -187,7 +202,7 @@ public void clearFixtures() { * Hopefully when the owner model get removed eventually and * back to the previous model, it will be good to go. */ - int count = 1000; + int count = toBeDeleted.size(); while (!toBeDeleted.isEmpty() && count-- > 0) { List list = new ArrayList<>(toBeDeleted); for (Dao dao : list) { @@ -197,11 +212,11 @@ public void clearFixtures() { try { TxScope.commit(); } catch (Exception e) { - continue; + trace(e, "error drop dao"); } toBeDeleted.remove(dao); } catch (Exception e) { - // ignore and try next dao + trace(e, "error drop dao"); } finally { TxScope.clear(); } @@ -225,18 +240,21 @@ public void run(final App app) { app.jobManager().post(SysEventId.POST_STARTED, new Runnable() { @Override public void run() { + final ProgressGauge gauge = new SimpleProgressGauge(); if (delay.get() > 0l) { app.jobManager().delay(new Runnable() { @Override public void run() { - Test.this.run(app, null, true); + Test.this.run(app, null, true, gauge); + gauge.markAsDone(); } }, delay.get(), TimeUnit.SECONDS); } else { app.jobManager().now(new Runnable() { @Override public void run() { - Test.this.run(app, null, true); + Test.this.run(app, null, true, gauge); + gauge.markAsDone(); } }); } @@ -249,7 +267,7 @@ public static boolean shallRunAutomatedTest(App app) { return $.bool(app.config().get("test.run")) || $.bool(app.config().get("e2e.run")) || "test".equalsIgnoreCase(Act.profile()) || "e2e".equalsIgnoreCase(Act.profile()); } - public List run(App app, Keyword testId, boolean shutdownApp) { + public List run(App app, Keyword testId, boolean shutdownApp, ProgressGauge gauge) { E.illegalStateIf(inProgress()); info("Start running test scenarios\n"); int exitCode = 0; @@ -268,26 +286,51 @@ public List run(App app, Keyword testId, boolean shutdownApp) { warn("No scenario defined."); list = C.list(); } else { + gauge.updateMaxHint(scenarios.size() + 1); list = new ArrayList<>(); + ProgressBar pb = null; + boolean pbStarted = false; + if (null == testId && shutdownApp && Banner.supportAnsi()) { + String label = "Testing"; + pb = new ProgressBar(label, gauge.maxHint(), 200, System.out, ProgressBarStyle.UNICODE_BLOCK); + } for (Scenario scenario : C.list(scenarios.values()).sorted(new ScenarioComparator(scenarioManager, false))) { if (null != testId && $.ne(testId, Keyword.of(scenario.name))) { continue; } + gauge.setPayload("scenario", scenario.title()); if (null != testId) { scenario.ignore = false; - } else if (scenario.ignore) { - addToList(scenario, list, scenarioManager); - continue; - } - try { - scenario.start(scenarioManager, requestTemplateManager); - } catch (Exception e) { - String message = e.getMessage(); - scenario.errorMessage = S.blank(message) ? e.getClass().getName() : message; - scenario.cause = e.getCause(); - scenario.status = TestStatus.FAIL; + } else if (!scenario.ignore) { + try { + scenario.start(scenarioManager, requestTemplateManager); + if (!scenario.status.pass()) { + gauge.setPayload("failed", true); + } + } catch (Exception e) { + gauge.setPayload("failed", true); + String message = e.getMessage(); + scenario.errorMessage = S.blank(message) ? e.getClass().getName() : message; + scenario.cause = e.getCause(); + scenario.status = TestStatus.FAIL; + } } + gauge.step(); addToList(scenario, list, scenarioManager); + if (null != pb) { + if (!pbStarted) { + pb.start(); + pbStarted = true; + } + + pb.stepTo(gauge.currentSteps()); + System.out.flush(); + } + } + if (null != pb) { + pb.stepTo(pb.getMax()); + pb.stop(); + System.out.println(); } } if (shutdownApp) { @@ -352,7 +395,7 @@ private void logIgnore(boolean ansi, String msg, Object... args) { msg = "@|faint " + msg + "|@"; msg = Ansi.ansi().render(msg).toString(); } - error(msg); + warn(msg); } private void output(Scenario scenario) { diff --git a/src/main/java/act/util/ProgressGauge.java b/src/main/java/act/util/ProgressGauge.java index 9579a795f..c2aa95d67 100644 --- a/src/main/java/act/util/ProgressGauge.java +++ b/src/main/java/act/util/ProgressGauge.java @@ -20,6 +20,8 @@ * #L% */ +import java.util.Map; + /** * Class implement this interface can track progress */ @@ -93,6 +95,23 @@ public interface ProgressGauge { */ void markAsDone(); + /** + * Set payload to the gauge. + * + * This method could be used to pass additional message to + * listener including websocket broadcast + * + * @param key the key + * @param val the value + */ + void setPayload(String key, Object val); + + /** + * Returns the payload that has been set to this gauge. + * @return the payload set to this gauge + */ + Map getPayload(); + /** * Add an listener to this gauge that monitors the progress update * @param listener the listener diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java index 0ec558271..69c38dbb1 100644 --- a/src/main/java/act/util/SimpleProgressGauge.java +++ b/src/main/java/act/util/SimpleProgressGauge.java @@ -25,7 +25,9 @@ import org.osgl.util.E; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.locks.*; public class SimpleProgressGauge extends DestroyableBase implements ProgressGauge { @@ -72,6 +74,7 @@ public void markAsDone() { private int maxHint; private int currentSteps; private String error; + private Map payload = new HashMap<>(); private transient int percent; private ProgressGauge delegate; private List listeners = new ArrayList<>(); @@ -224,6 +227,17 @@ public void markAsDone() { } } + @Override + public void setPayload(String key, Object val) { + this.payload.put(key, val); + this.triggerUpdateEvent(true); + } + + @Override + public Map getPayload() { + return this.payload; + } + private void triggerUpdateEvent() { triggerUpdateEvent(false); } @@ -264,7 +278,7 @@ public static String wsJobProgressTag(String jobId) { } private static int percentage(int currentSteps, int maxHint) { - int n = currentSteps / (maxHint / 100); + int n = currentSteps * 100 / maxHint; return (100 <= n) && (currentSteps < (maxHint - 1)) ? 99 : n; } } diff --git a/src/main/java/me/tongfei/progressbar/ProgressThread.java b/src/main/java/me/tongfei/progressbar/ProgressThread.java index e82c26e3c..208fe948b 100644 --- a/src/main/java/me/tongfei/progressbar/ProgressThread.java +++ b/src/main/java/me/tongfei/progressbar/ProgressThread.java @@ -98,7 +98,7 @@ String ratio() { } void refresh() { - consoleStream.print('\r'); + consoleStream.print("\r"); LocalDateTime currTime = LocalDateTime.now(); Duration elapsed = new Duration(progress.startTime.toDateTime(DateTimeZone.UTC), currTime.toDateTime(DateTimeZone.UTC)); diff --git a/src/main/resources/aaa.authenticate.list b/src/main/resources/aaa.authenticate.list index b32dbfa03..88255e723 100644 --- a/src/main/resources/aaa.authenticate.list +++ b/src/main/resources/aaa.authenticate.list @@ -8,4 +8,5 @@ # The following endpoints are only public on dev mode [dev]-act.apidoc. [dev]-act.Info -[dev]-act.i18n. \ No newline at end of file +[dev]-act.i18n. +[dev]-act.job. \ No newline at end of file diff --git a/src/main/resources/asset/~act/js/jsrender.js b/src/main/resources/asset/~act/js/jsrender.js new file mode 100644 index 000000000..02dfcad16 --- /dev/null +++ b/src/main/resources/asset/~act/js/jsrender.js @@ -0,0 +1,4 @@ +/*! JsRender v1.0.2: http://jsviews.com/#jsrender */ +/*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */ +!function(e,t){var n=t.jQuery;"object"==typeof exports?module.exports=n?e(t,n):function(n){if(n&&!n.fn)throw"Provide jQuery or null";return e(t,n)}:"function"==typeof define&&define.amd?define(function(){return e(t)}):e(t,!1)}(function(e,t){"use strict";function n(e,t){return function(){var n,r=this,i=r.base;return r.base=e,n=t.apply(r,arguments),r.base=i,n}}function r(e,t){return ae(t)&&(t=n(e?e._d?e:n(s,e):s,t),t._d=(e&&e._d||0)+1),t}function i(e,t){var n,i=t.props;for(n in i)!Me.test(n)||e[n]&&e[n].fix||(e[n]="convert"!==n?r(e.constructor.prototype[n],i[n]):i[n])}function o(e){return e}function s(){return""}function a(e){try{throw console.log("JsRender dbg breakpoint: "+e),"dbg breakpoint"}catch(t){}return this.base?this.baseApply(arguments):e}function d(e){this.name=(t.link?"JsViews":"JsRender")+" Error",this.message=e||this.name}function l(e,t){if(e){for(var n in t)e[n]=t[n];return e}}function p(e,t,n){return e?de(e)?p.apply(oe,e):(we=n?n[0]:we,/^(\W|_){5}$/.test(e+t+we)||S("Invalid delimiters"),he=e[0],_e=e[1],be=t[0],xe=t[1],ge.delimiters=[he+_e,be+xe,we],e="\\"+he+"(\\"+we+")?\\"+_e,t="\\"+be+"\\"+xe,re="(?:(\\w+(?=[\\/\\s\\"+be+"]))|(\\w+)?(:)|(>)|(\\*))\\s*((?:[^\\"+be+"]|\\"+be+"(?!\\"+xe+"))*?)",fe.rTag="(?:"+re+")",re=new RegExp("(?:"+e+re+"(\\/)?|\\"+he+"(\\"+we+")?\\"+_e+"(?:(?:\\/(\\w+))\\s*|!--[\\s\\S]*?--))"+t,"g"),fe.rTmpl=new RegExp("^\\s|\\s$|<.*>|([^\\\\]|^)[{}]|"+e+".*"+t),me):ge.delimiters}function u(e,t){t||e===!0||(t=e,e=void 0);var n,r,i,o,s=this,a="root"===t;if(e){if(o=t&&s.type===t&&s,!o)if(n=s.views,s._.useKey){for(r in n)if(o=t?n[r].get(e,t):n[r])break}else for(r=0,i=n.length;!o&&r1,v=f.ctx;if(n){if(f._||(p=f.index,f=f.tag),u=f,v&&v.hasOwnProperty(n)||(v=ue).hasOwnProperty(n)){if(a=v[n],"tag"===n||"tagCtx"===n||"root"===n||"parentTags"===n||f._.it===n)return a}else v=void 0;if((!ke&&f.tagCtx||f.linked)&&(a&&a._cxp||(f=f.tagCtx||ae(a)?f:(f=f.scope||f,!f.isTop&&f.ctx.tag||f),void 0!==a&&f.tagCtx&&(f=f.tagCtx.view.scope),v=f._ocps,a=v&&v.hasOwnProperty(n)&&v[n]||a,a&&a._cxp||!i&&!g||((v||(f._ocps=f._ocps||{}))[n]=a=[{_ocp:a,_vw:u,_key:n}],a._cxp={path:Te,ind:0,updateValue:function(e,n){return t.observable(a[0]).setProperty(Te,e),this}})),d=a&&a._cxp)){if(arguments.length>2)return s=a[1]?fe._ceo(a[1].deps):[Te],s.unshift(a[0]),s._cxp=d,s;if(p=d.tagElse,c=a[1]?d.tag&&d.tag.cvtArgs?d.tag.cvtArgs(p,1)[d.ind]:a[1](a[0].data,a[0],fe):a[0]._ocp,g)return a&&c!==r&&fe._ucp(n,r,f,d),f;a=c}return a&&ae(a)&&(o=function(){return a.apply(this&&this!==e?this:u,arguments)},l(o,a)),o||a}}function m(e){return e&&(e.fn?e:this.getRsc("templates",e)||le(e))}function h(e,t,n,r){var o,s,a,d,p,u="number"==typeof n&&t.tmpl.bnds[n-1];if(void 0===r&&u&&u._lr&&(r=""),void 0!==r?n=r={props:{},args:[r]}:u&&(n=u(t.data,t,fe)),u=u._bd&&u,e||u){if(s=t._lc,o=s&&s.tag,n.view=t,!o){if(o=l(new fe._tg,{_:{bnd:u,unlinked:!0,lt:n.lt},inline:!s,tagName:":",convert:e,flow:!0,tagCtx:n,tagCtxs:[n],_is:"tag"}),d=n.args.length,d>1)for(p=o.bindTo=[];d--;)p.unshift(d);s&&(s.tag=o,o.linkCtx=s),n.ctx=Q(n.ctx,(s?s.view:t).ctx),i(o,n)}o._er=r&&a,o.ctx=n.ctx||o.ctx||{},n.ctx=void 0,a=o.cvtArgs()[0],o._er=r&&a}else a=n.args[0];return a=u&&t._.onRender?t._.onRender(a,t,o):a,void 0!=a?a:""}function _(e,t){var n,r,i,o,s,a,d,l=this;if(l.tagName){if(a=l,l=(a.tagCtxs||[l])[e||0],!l)return}else a=l.tag;if(s=a.bindFrom,o=l.args,(d=a.convert)&&""+d===d&&(d="true"===d?void 0:l.view.getRsc("converters",d)||S("Unknown converter: '"+d+"'")),d&&!t&&(o=o.slice()),s){for(i=[],n=s.length;n--;)r=s[n],i.unshift(b(l,r));t&&(o=i)}if(d){if(d=d.apply(a,i||o),void 0===d)return o;if(s=s||[0],n=s.length,de(d)&&d.length===n||(d=[d],s=[0],n=1),t)o=d;else for(;n--;)r=s[n],+r===r&&(o[r]=d[n])}return o}function b(e,t){return e=e[+t===t?"args":"props"],e&&e[t]}function x(e){return this.cvtArgs(e,1)}function w(e,t){var n,r,i=this;if(""+t===t){for(;void 0===n&&i;)r=i.tmpl&&i.tmpl[e],n=r&&r[t],i=i.parent;return n||oe[e][t]}}function y(e,t,n,r,o,s){function a(e){var t=d[e];if(void 0!==t)for(t=de(t)?t:[t],m=t.length;m--;)J=t[m],isNaN(parseInt(J))||(t[m]=parseInt(J));return t||[0]}t=t||ie;var d,l,p,u,c,f,g,m,h,w,y,k,C,T,j,A,N,P,R,F,V,$,M,I,D,J,U,q,K,L,B=0,H="",W=t._lc||!1,Z=t.ctx,z=n||t.tmpl,G="number"==typeof r&&t.tmpl.bnds[r-1];for("tag"===e._is?(d=e,e=d.tagName,r=d.tagCtxs,p=d.template):(l=t.getRsc("tags",e)||S("Unknown tag: {{"+e+"}} "),p=l.template),void 0===s&&G&&(G._lr=l.lateRender&&G._lr!==!1||G._lr)&&(s=""),void 0!==s?(H+=s,r=s=[{props:{},args:[],params:{props:{}}}]):G&&(r=G(t.data,t,fe)),g=r.length;B0&&(s=n)){if(!s)if(/^\.\/[^\\:*?"<>]*$/.test(n))(a=le[e=e||n])?n=a:s=document.getElementById(n);else if(t.fn&&!fe.rTmpl.test(n))try{s=t(n,document)[0]}catch(d){}s&&("SCRIPT"!==s.tagName&&S(n+": Use script block, not "+s.tagName),i?n=s.innerHTML:(o=s.getAttribute(Be),o&&(o!==Qe?(n=le[o],delete le[o]):t.fn&&(n=t.data(s)[Qe])),o&&n||(e=e||(t.fn?Qe:n),n=A(e,s.innerHTML,r,i)),n.tmplName=e=e||o,e!==Qe&&(le[e]=n),s.setAttribute(Be,e),t.fn&&t.data(s,Qe,n))),s=void 0}else n.fn||(n=void 0);return n}var s,a,d=n=n||"";if(fe._html=pe.html,0===i&&(i=void 0,d=o(d)),i=i||(n.markup?n.bnds?l({},n):n:{}),i.tmplName=i.tmplName||e||"unnamed",r&&(i._parentTmpl=r),!d&&n.markup&&(d=o(n.markup))&&d.fn&&(d=d.markup),void 0!==d)return d.render||n.render?d.tmpls&&(a=d):(n=F(d,i),J(d.replace(Ne,"\\$&"),n)),a||(a=l(function(){return a.render.apply(a,arguments)},n),C(a)),a}function N(e,t){return ae(e)?e.call(t):e}function P(e){for(var t=[],n=0,r=e.length;nO-(U||0))){if(U=I.slice(U,O+i.length),q!==!0)if(K=s||f[m-1].bd,L=K[K.length-1],L&&L.prm){for(;L.sb&&L.sb.prm;)L=L.sb;B=L.sb={path:L.sb,bnd:L.bnd}}else K.push(B={path:K.pop()});$=_e+":"+U+" onerror=''"+be,q=v[$],q||(v[$]=!0,v[$]=q=J($,n,!0)),q!==!0&&B&&(B._cpfn=q,B.prm=c.bd,B.bnd=B.bnd||B.path&&B.path.indexOf("^")>=0)}return l?(l=!R,l?i:P+'"'):d?(d=!F,d?i:P+'"'):(b?(_[m]=O++,c=f[++m]={bd:[]},b):"")+(E?m?"":(g=I.slice(g,O),(o?(o=a=s=!1,"\b"):"\b,")+g+(g=O+i.length,u&&t.push(c.bd=[]),"\b")):C?(m&&D(e),u&&t.pop(),o="_"+w,a=x,g=O+i.length,u&&(u=c.bd=t[o]=[],u.skp=!x),w+":"):w?w.split("^").join(".").replace(fe.rPath,S)+(A?(c=f[++m]={bd:[]},h[m]=Q,A):y):y?y:V?(V=h[m]||V,h[m]=!1,c=f[--m],V+(A?(c=f[++m],h[m]=Q,A):"")):N?(h[m]||D(e),","):p?"":(l=R,d=F,'"'))}D(e)}var o,s,a,d,l,p,u=t&&t[0],c={bd:u},f={0:c},g=0,v=(n?n.links:u&&(u.links=u.links||{}))||ie.tmpl.links,m=0,h={},_={};return"@"===e[0]&&(e=e.replace(De,".")),p=(e+(n?" ":"")).replace(fe.rPrm,i),!m&&p||D(e)}function B(e,t,n){var r,i,o,s,a,d,l,p,u,c,f,g,v,m,h,_,b,x,w,y,k,C,T,j,A,N,P,R,V,$,M,E,O,I=0,S=ve.useViews||t.useViews||t.tags||t.templates||t.helpers||t.converters,J="",q={},L=e.length;for(""+t===t?(x=n?'data-link="'+t.replace(je," ").slice(1,-1)+'"':t,t=0):(x=t.tmplName||"unnamed",t.allowCode&&(q.allowCode=!0),t.debug&&(q.debug=!0),f=t.bnds,b=t.tmpls),r=0;r":s+o):(k&&(w=F(C,q),w.tmplName=x+"/"+o,w.useViews=w.useViews||S,B(k,w),S=w.useViews,b.push(w)),A||(y=o,S=S||o&&(!ce[o]||!ce[o].flow),j=J,J=""),T=e[r+1],T=T&&"else"===T[0]),V=R?";\ntry{\nret+=":"\n+",m="",h="",N&&(g||$||s&&s!==Ke||M)){if(P=new Function("data,view,j,u","// "+x+" "+ ++I+" "+o+E+"{"+a+"};"+O),P._er=R,P._tag=o,P._bd=!!g,P._lr=M,n)return P;U(P,g),_='c("'+s+'",view,',c=!0,m=_+I+",",h=")"}if(J+=N?(n?(R?"try{\n":"")+"return ":V)+(c?(c=void 0,S=u=!0,_+(P?(f[I-1]=P,I):"{"+a+"}")+")"):">"===o?(l=!0,"h("+v[0]+")"):(p=!0,"((v="+v[0]+")!=null?v:"+(n?"null)":'"")'))):(d=!0,"\n{view:view,content:false,tmpl:"+(k?b.length:"false")+","+a+"},"),y&&!T){if(J="["+J.slice(0,-1)+"]",_='t("'+y+'",view,this,',n||g){if(J=new Function("data,view,j,u"," // "+x+" "+I+" "+y+E+J+O),J._er=R,J._tag=y,g&&U(f[I-1]=J,g),J._lr=M,n)return J;m=_+I+",undefined,",h=")"}J=j+V+_+(g&&I||J)+")",g=0,y=0}R&&!T&&(S=!0,J+=";\n}catch(e){ret"+(n?"urn ":"+=")+m+"j._err(e,view,"+R+")"+h+";}"+(n?"":"ret=ret"))}J="// "+x+(q.debug?"\ndebugger;":"")+"\nvar v"+(d?",t=j._tag":"")+(u?",c=j._cnvt":"")+(l?",h=j._html":"")+(n?(i[8]?", ob":"")+";\n":',ret=""')+J+(n?"\n":";\nreturn ret;");try{J=new Function("data,view,j,u",J)}catch(Q){D("Compiled template code:\n\n"+J+'\n: "'+(Q.message||Q)+'"')}return t&&(t.fn=J,t.useViews=!!S),J}function Q(e,t){return e&&e!==t?t?l(l({},t),e):e:t&&l({},t)}function H(e,n){var r,i,o=n.map,s=o&&o.propsArr;if(!s){if(s=[],typeof e===Le||ae(e))for(r in e)i=e[r],r===se||!e.hasOwnProperty(r)||n.props.noFunctions&&t.isFunction(i)||s.push({key:r,prop:i});o&&(o.propsArr=o.options&&s)}return W(s,n)}function W(e,n){var r,i,o,s=n.tag,a=n.props,d=n.params.props,l=a.filter,p=a.sort,u=p===!0,c=parseInt(a.step),f=a.reverse?-1:1;if(!de(e))return e;if(u||p&&""+p===p?(r=e.map(function(e,t){return e=u?e:g(e,p),{i:t,v:""+e===e?e.toLowerCase():e}}),r.sort(function(e,t){return e.v>t.v?f:e.ve.length?e.length:+o,e=e.slice(i,o)),c>1){for(i=0,o=e.length,r=[];i\s]/,Ve=/[\x00`><"'&=]/g,$e=/[\x00`><\"'&=]/,Me=/^on[A-Z]|^convert(Back)?$/,Ee=/^\#\d+_`[\s\S]*\/\d+_`$/,Oe=Ve,Ie=/[&<>]/g,Se=/&(amp|gt|lt);/g,De=/\[['"]?|['"]?\]/g,Je=0,Ue={"&":"&","<":"<",">":">","\0":"�","'":"'",'"':""","`":"`","=":"="},qe={amp:"&",gt:">",lt:"<"},Ke="html",Le="object",Be="data-jsv-tmpl",Qe="jsvTmpl",He="For #index in nested block use #getIndex().",We={},Ze=e.jsrender,ze=Ze&&t&&!t.render,Ge={template:{compile:A},tag:{compile:T},viewModel:{compile:R},helper:{},converter:{}};if(oe={jsviews:Ce,sub:{rPath:/^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g,rPrm:/(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(~?[\w$.^]+)?\s*((\+\+|--)|\+|-|~(?![\w$])|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?(@)?[#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*(([)\]])(?=[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g,View:k,Err:d,tmplFn:J,parse:L,extend:l,extendCtx:Q,syntaxErr:D,onStore:{template:function(e,t){null===t?delete We[e]:e&&(We[e]=t)}},addSetting:$,settings:{allowCode:!1},advSet:s,_thp:i,_gm:r,_tg:function(){},_cnvt:h,_tag:y,_er:S,_err:I,_cp:o,_sq:function(e){return"constructor"===e&&D(""),e}},settings:{delimiters:p,advanced:function(e){return e?(l(ve,e),fe.advSet(),me):ve}},map:M},(d.prototype=new Error).constructor=d,c.depends=function(){return[this.get("item"),"index"]},f.depends="index",k.prototype={get:u,getIndex:f,ctxPrm:v,getRsc:w,_getTmpl:m,_getOb:g,_is:"view"},fe=oe.sub,me=oe.settings,!(Ze||t&&t.render)){for(ne in Ge)V(ne,Ge[ne]);if(pe=oe.converters,ue=oe.helpers,ce=oe.tags,fe._tg.prototype={baseApply:j,cvtArgs:_,bndArgs:x,ctxPrm:v},ie=fe.topView=new k,t){if(t.fn.render=Z,se=t.expando,t.observable){if(Ce!==(Ce=t.views.jsviews))throw"JsObservable requires JsRender "+Ce;l(fe,t.views.sub),oe.map=t.views.map}}else t={},te&&(e.jsrender=t),t.renderFile=t.__express=t.compile=function(){throw"Node.js: use npm jsrender, or jsrender-node.js"},t.isFunction=function(e){return"function"==typeof e},t.isArray=Array.isArray||function(e){return"[object Array]"==={}.toString.call(e)},fe._jq=function(e){e!==t&&(l(e,t),t=e,t.fn.render=Z,delete t.jsrender,se=t.expando)},t.jsrender=Ce;ge=fe.settings,ge.allowCode=!1,ae=t.isFunction,t.render=We,t.views=oe,t.templates=le=oe.templates;for(ye in ge)$(ye);(me.debugMode=function(e){return void 0===e?ge.debugMode:(ge.debugMode=e,ge.onError=e+""===e?function(){return e}:ae(e)?e:void 0,me)})(!1),ve=ge.advanced={useViews:!1,_jsv:!1},ce({"if":{render:function(e){var t=this,n=t.tagCtx,r=t.rendering.done||!e&&(n.args.length||!n.index)?"":(t.rendering.done=!0,void(t.selected=n.index));return r},contentCtx:!0,flow:!0},"for":{sortDataMap:M(W),init:function(e,t){var n,r,i,o=this,s=o.tagCtxs;for(n=s.length;n--;)r=s[n],i=r.params.props,r.argDefault=void 0===r.props.end||r.args.length>0,r.argDefault!==!1&&de(r.args[0])&&(void 0!==i.sort||i.start||i.end||i.step||i.filter||i.reverse)&&(r.props.dataMap=o.sortDataMap)},render:function(e){var t,n,r,i,o,s=this,a=s.tagCtx,d=a.argDefault===!1,l=a.props,p=d||a.args.length,u="",c=0;if(!s.rendering.done){if(t=p?e:a.view.data,d)for(d=l.reverse?"unshift":"push",i=+l.end,o=+l.step||1,t=[],r=+l.start||0;(i-r)*o>0;r+=o)t[d](r);void 0!==t&&(n=de(t),u+=a.render(t,!p||l.noIteration),c+=n?t.length:1),(s.rendering.done=c)&&(s.selected=a.index)}return u},flow:!0},props:{baseTag:"for",dataMap:M(H),init:s,flow:!0},include:{flow:!0},"*":{render:o,flow:!0},":*":{render:o,flow:!0},dbg:ue.dbg=pe.dbg=a}),pe({html:X,attr:X,encode:Y,unencode:ee,url:function(e){return void 0!=e?encodeURI(""+e):null===e?e:""}})}return ge=fe.settings,de=(t||Ze).isArray,me.delimiters("{{","}}","^"),ze&&Ze.views.sub._jq(t),t||Ze},window); +//# sourceMappingURL=jsrender.min.js.map \ No newline at end of file diff --git a/src/main/resources/asset/~act/js/jsrender.js.map b/src/main/resources/asset/~act/js/jsrender.js.map new file mode 100644 index 000000000..fd8f1e33f --- /dev/null +++ b/src/main/resources/asset/~act/js/jsrender.js.map @@ -0,0 +1,2628 @@ +// 20190405192409 +// https://raw.githubusercontent.com/BorisMoore/jsrender/master/jsrender.min.js.map + +{ + "version": 3, + "sources": [ + "jsrender.js" + ], + "names": [ + "factory", + "global", + "$", + "jQuery", + "exports", + "module", + "fn", + "define", + "amd", + "getDerivedMethod", + "baseMethod", + "method", + "ret", + "tag", + "this", + "prevBase", + "base", + "apply", + "arguments", + "getMethod", + "$isFunction", + "_d", + "noop", + "tagHandlersFromProps", + "tagCtx", + "prop", + "props", + "rHasHandlers", + "test", + "fix", + "constructor", + "prototype", + "retVal", + "val", + "dbgBreak", + "console", + "log", + "e", + "baseApply", + "JsViewsError", + "message", + "name", + "link", + "$extend", + "target", + "source", + "$viewsDelimiters", + "openChars", + "closeChars", + "$isArray", + "$views", + "linkChar", + "error", + "delimOpenChar0", + "delimOpenChar1", + "delimCloseChar0", + "delimCloseChar1", + "$subSettings", + "delimiters", + "rTag", + "$sub", + "RegExp", + "rTmpl", + "$viewsSettings", + "getView", + "inner", + "type", + "undefined", + "views", + "i", + "l", + "found", + "view", + "root", + "_", + "useKey", + "get", + "length", + "parent", + "getNestedIndex", + "index", + "getIndex", + "getPathObject", + "ob", + "path", + "ltOb", + "prevOb", + "tokens", + "split", + "lt", + "contextParameter", + "key", + "value", + "wrapped", + "deps", + "res", + "obsCtxPrm", + "tagElse", + "callView", + "newRes", + "storeView", + "isUpdate", + "isRenderCall", + "store", + "ctx", + "hasOwnProperty", + "$helpers", + "it", + "linked", + "_cxp", + "scope", + "isTop", + "_ocps", + "_ocp", + "_vw", + "_key", + "ind", + "updateValue", + "observable", + "setProperty", + "_ceo", + "unshift", + "cvtArgs", + "data", + "_ucp", + "getTemplate", + "tmpl", + "getRsc", + "$templates", + "convertVal", + "converter", + "onError", + "linkCtx", + "argsLen", + "bindTo", + "boundTag", + "bnds", + "_lr", + "args", + "_bd", + "_lc", + "_tg", + "bnd", + "unlinked", + "inline", + "tagName", + "convert", + "flow", + "tagCtxs", + "_is", + "extendCtx", + "_er", + "onRender", + "convertArgs", + "bound", + "boundArgs", + "bindFrom", + "slice", + "argOrProp", + "context", + "convertBoundArgs", + "getResource", + "resourceType", + "itemName", + "renderTag", + "parentView", + "bindToOrBindFrom", + "bindArray", + "m", + "isNaN", + "parseInt", + "topView", + "tagDef", + "template", + "tags", + "attr", + "parentTag", + "n", + "itemRet", + "tagCtxCtx", + "ctxPrm", + "initVal", + "content", + "callInit", + "mapDef", + "thisMap", + "bdArgs", + "tagDataMap", + "contentCtx", + "bindFromLength", + "bindToLength", + "linkedElement", + "defaultCtx", + "parentTmpl", + "lateRender", + "params", + "tmpls", + "render", + "renderContent", + "bndArgs", + "_getTmpl", + "init", + "_ctr", + "ths", + "arrVws", + "dataBoundOnly", + "dataMap", + "map", + "parents", + "parentTags", + "rendering", + "rndr", + "argDefault", + "linkedCtxParam", + "fromIndex", + "toIndex", + "_dfAt", + "noVws", + "HTML", + "_cp", + "cvt", + "src", + "unmap", + "tgt", + "rWrappedInViewMarker", + "links", + "renderWithViews", + "$converters", + "html", + "View", + "contentTmpl", + "parentView_", + "self_", + "self", + "isArray", + "id", + "viewId", + "scp", + "indexStr", + "push", + "splice", + "compileChildResources", + "storeName", + "storeNames", + "resources", + "jsvStores", + "compileTag", + "Tag", + "baseTag", + "compiledDef", + "depends", + "$tags", + "_parentTmpl", + "compileTmpl", + "options", + "lookupTemplate", + "currentName", + "nodeType", + "elem", + "document", + "getElementById", + "innerHTML", + "getAttribute", + "tmplAttr", + "jsvTmpl", + "tmplName", + "setAttribute", + "compiledTmpl", + "tmplOrMarkup", + "_html", + "markup", + "tmplObject", + "tmplFn", + "replace", + "rEscapeQuotes", + "getDefaultVal", + "defaultVal", + "call", + "unmapArray", + "modelArr", + "arr", + "compileViewModel", + "GetNew", + "vm", + "iterate", + "action", + "getterType", + "j", + "g", + "getters", + "getter", + "viewModels", + "JSON", + "parse", + "merge", + "viewModel", + "$expando", + "getterNames", + "mod", + "assigned", + "newModArr", + "k", + "model", + "$observable", + "refresh", + "concat", + "charAt", + "extend", + "proto", + "body", + "privField", + "set", + "Function", + "htmlTag", + "wrapMap", + "$subSettingsAdvanced", + "_wm", + "rFirstElem", + "exec", + "toLowerCase", + "div", + "trim", + "registerStore", + "storeSettings", + "theStore", + "item", + "compile", + "thisStore", + "onStore", + "OBJECT", + "getTgt", + "addSetting", + "st", + "Map", + "baseMap", + "noIteration", + "isTopRenderCall", + "prevData", + "prevIndex", + "result", + "useViews", + "setItemVar", + "newCtx", + "itemVar", + "newView", + "childView", + "itemResult", + "swapContent", + "outerOnRender", + "noLinking", + "_wrp", + "syntaxError", + "nl", + "helpers", + "contentView", + "onRenderError", + "fallback", + "Err", + "isLinkExpr", + "convertBack", + "hasElse", + "pushprecedingContent", + "shift", + "loc", + "substr", + "rNewLine", + "blockTagCheck", + "block", + "parseTag", + "all", + "bind", + "colon", + "codeTag", + "slash", + "bind2", + "closeBlock", + "late", + "openTagName", + "isLateOb", + "pathBindings", + "ctxProps", + "paramsArgs", + "paramsProps", + "paramsCtxProps", + "useTrigger", + "allowCode", + "rUnescapeQuotes", + "rTestElseIf", + "current", + "substring", + "stack", + "pop", + "parseParams", + "rBuildHash", + "onerror", + "isCtxPrm", + "keyToken", + "keyValue", + "arg", + "param", + "hasHandlers", + "newNode", + "parsedParam", + "bindings", + "astTop", + "buildCode", + "setPaths", + "pathsArr", + "paths", + "skp", + "paramStructure", + "parts", + "parseTokens", + "lftPrn0", + "lftPrn", + "operator", + "err", + "eq", + "path2", + "prn", + "comma", + "lftPrn2", + "apos", + "quot", + "rtPrn", + "rtPrnDot", + "prn2", + "space", + "full", + "parsePath", + "allPath", + "not", + "object", + "helper", + "viewProperty", + "pathTokens", + "leafToken", + "subPath", + "binds", + "named", + "bindto", + "_jsvto", + "bndCtx", + "bd", + "theOb", + "_cpfn", + "sb", + "pathStart", + "parenDepth", + "join", + "expr", + "exprFn", + "newOb", + "rtSq", + "aposed", + "quoted", + "bndStack", + "prm", + "tmplLinks", + "indexOf", + "paramIndex", + "boundName", + "rPath", + "fnCall", + "0", + "rBracketQuote", + "rPrm", + "ast", + "node", + "hasTag", + "hasEncoder", + "getsVal", + "hasCnvt", + "useCnvt", + "tmplBindings", + "boundOnErrStart", + "boundOnErrEnd", + "tagRender", + "nestedTmpls", + "nestedTmpl", + "tagAndElses", + "nextIsElse", + "oldCode", + "isElse", + "isGetVal", + "tagCtxFn", + "tagStart", + "trigger", + "retStrOpen", + "retStrClose", + "tmplBindingKey", + "templates", + "converters", + "code", + "tmplOptions", + "debug", + "debugMode", + "_tag", + "parentContext", + "getTargetProps", + "propsArr", + "noFunctions", + "isFunction", + "getTargetSorted", + "mapped", + "start", + "end", + "propParams", + "filter", + "sort", + "directSort", + "step", + "reverse", + "v", + "a", + "b", + "onFilter", + "sorted", + "paged", + "$fnRender", + "tmplElem", + "jquery", + "getCharEntity", + "ch", + "charEntities", + "charCodeAt", + "getCharFromEntity", + "match", + "token", + "charsFromEntities", + "htmlEncode", + "text", + "rIsHtml", + "rHtmlEncode", + "dataEncode", + "rDataEncode", + "dataUnencode", + "rDataUnencode", + "setGlobals", + "jsvStoreName", + "setting", + "versionNumber", + "rAttrEncode", + "&", + "<", + ">", + "\u0000", + "'", + "\"", + "`", + "=", + "amp", + "gt", + "$render", + "jsr", + "jsrender", + "jsrToJq", + "jsviews", + "sub", + "syntaxErr", + "settings", + "advSet", + "_thp", + "_gm", + "_cnvt", + "_err", + "_sq", + "advanced", + "Error", + "_getOb", + "expando", + "renderFile", + "__express", + "Array", + "obj", + "_jq", + "jq", + "_jsv", + "if", + "done", + "selected", + "for", + "sortDataMap", + "cloned", + "range", + "include", + "*", + ":*", + "dbg", + "encode", + "unencode", + "url", + "encodeURI", + "window" + ], + "mappings": ";;CAaC,SAASA,EAASC,GAElB,GAAIC,GAAID,EAAOE,MAEQ,iBAAZC,SACVC,OAAOD,QAAUF,EACdF,EAAQC,EAAQC,GAChB,SAASA,GACV,GAAIA,IAAMA,EAAEI,GACX,KAAM,wBAEP,OAAON,GAAQC,EAAQC,IAEG,kBAAXK,SAAyBA,OAAOC,IACjDD,OAAO,WACN,MAAOP,GAAQC,KAGhBD,EAAQC,GAAQ,IAKlB,SAASA,EAAQC,GACjB,YAsIA,SAASO,GAAiBC,EAAYC,GACrC,MAAO,YACN,GAAIC,GACHC,EAAMC,KACNC,EAAWF,EAAIG,IAKhB,OAHAH,GAAIG,KAAON,EACXE,EAAMD,EAAOM,MAAMJ,EAAKK,WACxBL,EAAIG,KAAOD,EACJH,GAIT,QAASO,GAAUT,EAAYC,GAc9B,MAXIS,IAAYT,KACfA,EAASF,EACNC,EAEEA,EAAWW,GACVX,EACAD,EAAiBa,EAAMZ,GAHxBY,EAIHX,GAEFA,EAAOU,IAAMX,GAAcA,EAAWW,IAAM,GAAK,GAE3CV,EAGR,QAASY,GAAqBV,EAAKW,GAClC,GAAIC,GACHC,EAAQF,EAAOE,KAChB,KAAKD,IAAQC,IACRC,GAAaC,KAAKH,IAAWZ,EAAIY,IAASZ,EAAIY,GAAMI,MACvDhB,EAAIY,GAAiB,YAATA,EAAqBN,EAAUN,EAAIiB,YAAYC,UAAUN,GAAOC,EAAMD,IAASC,EAAMD,IAOpG,QAASO,GAAOC,GACf,MAAOA,GAGR,QAASX,KACR,MAAO,GAGR,QAASY,GAASD,GAEjB,IAEC,KADAE,SAAQC,IAAI,4BAA8BH,GACpC,iBAEP,MAAOI,IACP,MAAOvB,MAAKE,KAAOF,KAAKwB,UAAUpB,WAAae,EAGhD,QAASM,GAAaC,GAGrB1B,KAAK2B,MAAQvC,EAAEwC,KAAO,UAAY,YAAc,SAChD5B,KAAK0B,QAAUA,GAAW1B,KAAK2B,KAGhC,QAASE,GAAQC,EAAQC,GACxB,GAAID,EAAQ,CACX,IAAK,GAAIH,KAAQI,GAChBD,EAAOH,GAAQI,EAAOJ,EAEvB,OAAOG,IA2BT,QAASE,GAAiBC,EAAWC,EAAYN,GAChD,MAAKK,GAGDE,GAASF,GACLD,EAAiB7B,MAAMiC,GAAQH,IAEvCI,GAAWT,EAAOA,EAAK,GAAKS,GACvB,cAAcvB,KAAKmB,EAAYC,EAAaG,KAChDC,EAAM,sBAEPC,GAAiBN,EAAU,GAC3BO,GAAiBP,EAAU,GAC3BQ,GAAkBP,EAAW,GAC7BQ,GAAkBR,EAAW,GAE7BS,GAAaC,YAAcL,GAAiBC,GAAgBC,GAAkBC,GAAiBL,IAG/FJ,EAAY,KAAOM,GAAiB,MAAQF,GAAW,OAASG,GAChEN,EAAa,KAAOO,GAAkB,KAAOC,GAG7CG,GAAO,uBAAyBJ,GAAkB,wCAC/CA,GAAkB,OAASA,GAAkB,QAAUC,GAAkB,QAG5EI,GAAKD,KAAO,MAAQA,GAAO,IAE3BA,GAAO,GAAIE,QAAO,MAAQd,EAAYY,GAAO,YAAcN,GAAiB,MAAQF,GAAW,OAASG,GAAiB,yCAA2CN,EAAY,KAKhLY,GAAKE,MAAQ,GAAID,QAAO,kCAAoCd,EAAY,KAAOC,GAGxEe,IAnCCN,GAAaC,WA0CtB,QAASM,GAAQC,EAAOC,GAClBA,GAAQD,KAAU,IAEtBC,EAAOD,EACPA,EAAQE,OAGT,IAAIC,GAAOC,EAAGC,EAAGC,EAChBC,EAAO1D,KACP2D,EAAgB,SAATP,CAGR,IAAID,GAIH,GADAM,EAAQL,GAAQM,EAAKN,OAASA,GAAQM,GACjCD,EAEJ,GADAH,EAAQI,EAAKJ,MACTI,EAAKE,EAAEC,QACV,IAAKN,IAAKD,GACT,GAAIG,EAAQL,EAAOE,EAAMC,GAAGO,IAAIX,EAAOC,GAAQE,EAAMC,GACpD,UAIF,KAAKA,EAAI,EAAGC,EAAIF,EAAMS,QAASN,GAASF,EAAIC,EAAGD,IAC9CE,EAAQL,EAAOE,EAAMC,GAAGO,IAAIX,EAAOC,GAAQE,EAAMC,OAI9C,IAAII,EAEVF,EAAQC,EAAKC,SACP,IAAIP,EACV,KAAOM,IAASD,GAEfA,EAAQC,EAAKN,OAASA,EAAOM,EAAOL,OACpCK,EAAOA,EAAKM,WAGbP,GAAQC,EAAKM,MAEd,OAAOP,IAASJ,OAGjB,QAASY,KACR,GAAIP,GAAO1D,KAAK8D,IAAI,OACpB,OAAOJ,GAAOA,EAAKQ,MAAQb,OAO5B,QAASc,KACR,MAAOnE,MAAKkE,MAUb,QAASE,GAAcC,EAAIC,EAAMC,EAAM/E,GAGtC,GAAIgF,GAAQC,EAAQjB,EACnBD,EAAI,CAML,IALa,IAATgB,IACH/E,EAAK,EACL+E,EAAOlB,QAGJiB,EAIH,IAHAG,EAASH,EAAKI,MAAM,KACpBlB,EAAIiB,EAAOV,OAEJM,GAAMd,EAAIC,EAAGD,IACnBiB,EAASH,EACTA,EAAKI,EAAOlB,GAAKc,EAAGI,EAAOlB,IAAMc,CAMnC,OAHIE,KACHA,EAAKI,GAAKJ,EAAKI,IAAMpB,EAAEC,GAEVH,SAAPgB,EACJ7E,EAAKgB,EAAO,GACZhB,EAAK,WACN,MAAO6E,GAAGlE,MAAMqE,EAAQpE,YACrBiE,EAGN,QAASO,GAAiBC,EAAKC,EAAOhB,GAErC,GAAIiB,GAASC,EAAMC,EAAKC,EAAWC,EAASC,EAAUC,EACrDC,EAAYtF,KACZuF,GAAYC,IAAgBpF,UAAU2D,OAAS,EAC/C0B,EAAQH,EAAUI,GACnB,IAAIb,EAAK,CAMR,GALKS,EAAU1B,IACduB,EAAUG,EAAUpB,MACpBoB,EAAYA,EAAUvF,KAEvBqF,EAAWE,EACPG,GAASA,EAAME,eAAed,KAASY,EAAQG,IAAUD,eAAed,IAE3E,GADAI,EAAMQ,EAAMZ,GACA,QAARA,GAAyB,WAARA,GAA4B,SAARA,GAA0B,eAARA,GAAwBS,EAAU1B,EAAEiC,KAAOhB,EACrG,MAAOI,OAGRQ,GAAQpC,MAET,MAAKmC,IAAgBF,EAAU5E,QAAU4E,EAAUQ,UAC7Cb,GAAQA,EAAIc,OAGhBT,EAAYA,EAAU5E,QAAUJ,GAAY2E,GACzCK,GACCA,EAAYA,EAAUU,OAASV,GAChCA,EAAUW,OAASX,EAAUI,IAAI3F,KAC9BuF,GACMjC,SAAR4B,GAAqBK,EAAU5E,SAElC4E,EAAYA,EAAU5E,OAAOgD,KAAKsC,OAEnCP,EAAQH,EAAUY,MAClBjB,EAAMQ,GAASA,EAAME,eAAed,IAAQY,EAAMZ,IAAQI,EACpDA,GAAOA,EAAIc,OAAUjC,IAAOyB,KAEhCE,IAAUH,EAAUY,MAAQZ,EAAUY,YAAcrB,GAClDI,IAEDkB,KAAMlB,EACNmB,IAAKhB,EACLiB,KAAMxB,IAERI,EAAIc,MACHzB,KAAM6B,GACNG,IAAK,EACLC,YAAa,SAASpF,EAAKmD,GAE1B,MADAlF,GAAEoH,WAAWvB,EAAI,IAAIwB,YAAYN,GAAMhF,GAChCnB,SAKPkF,EAAYD,GAAOA,EAAIc,MAAM,CAEhC,GAAI3F,UAAU2D,OAAS,EAKtB,MAJAiB,GAAOC,EAAI,GAAKnC,GAAK4D,KAAKzB,EAAI,GAAGD,OAASmB,IAC1CnB,EAAK2B,QAAQ1B,EAAI,IACjBD,EAAKe,KAAOb,EAELF,CAQR,IANAG,EAAUD,EAAUC,QACpBE,EAASJ,EAAI,GACVC,EAAUnF,KAAOmF,EAAUnF,IAAI6G,QAC9B1B,EAAUnF,IAAI6G,QAAQzB,EAAS,GAAGD,EAAUoB,KAC5CrB,EAAI,GAAGA,EAAI,GAAG4B,KAAM5B,EAAI,GAAInC,IAC7BmC,EAAI,GAAGkB,KACNZ,EAIH,MAHIN,IAAOI,IAAWP,GACrBhC,GAAKgE,KAAKjC,EAAKC,EAAOQ,EAAWJ,GAE3BI,CAERL,GAAMI,EAaR,MAVIJ,IAAO3E,GAAY2E,KAKtBF,EAAU,WACT,MAAOE,GAAI9E,MAAQH,MAAQA,OAASb,EAAqBa,KAAXoF,EAAiBhF,YAEhEyB,EAAQkD,EAASE,IAEXF,GAAWE,GAKpB,QAAS8B,GAAYC,GACpB,MAAOA,KAASA,EAAKxH,GAClBwH,EACAhH,KAAKiH,OAAO,YAAaD,IAASE,GAAWF,IAOjD,QAASG,GAAWC,EAAW1D,EAAMhD,EAAQ2G,GAG5C,GAAItH,GAAKuH,EAASxC,EAAOyC,EAASC,EAEjCC,EAA6B,gBAAX/G,IAAuBgD,EAAKsD,KAAKU,KAAKhH,EAAO,EAWhE,IATgB2C,SAAZgE,GAAyBI,GAAYA,EAASE,MACjDN,EAAU,IAEKhE,SAAZgE,EACH3G,EAAS2G,GAAWzG,SAAWgH,MAAOP,IAC5BI,IACV/G,EAAS+G,EAAS/D,EAAKmD,KAAMnD,EAAMZ,KAEpC2E,EAAWA,EAASI,KAAOJ,EACvBL,GAAaK,EAAU,CAI1B,GAHAH,EAAU5D,EAAKoE,IACf/H,EAAMuH,GAAWA,EAAQvH,IACzBW,EAAOgD,KAAOA,GACT3D,EAAK,CAgBT,GAfAA,EAAM8B,EAAQ,GAAIiB,IAAKiF,KACtBnE,GACCoE,IAAKP,EACLQ,UAAU,EACVtD,GAAIjE,EAAOiE,IAEZuD,QAASZ,EACTa,QAAS,IACTC,QAAShB,EACTiB,MAAM,EACN3H,OAAQA,EACR4H,SAAU5H,GACV6H,IAAK,QAENhB,EAAU7G,EAAOkH,KAAK7D,OAClBwD,EAAQ,EAEX,IADAC,EAASzH,EAAIyH,UACND,KACNC,EAAOb,QAAQY,EAGbD,KACHA,EAAQvH,IAAMA,EACdA,EAAIuH,QAAUA,GAEf5G,EAAOgF,IAAM8C,EAAU9H,EAAOgF,KAAM4B,EAAUA,EAAQ5D,KAAOA,GAAMgC,KACnEjF,EAAqBV,EAAKW,GAE3BX,EAAI0I,IAAMpB,GAAWvC,EACrB/E,EAAI2F,IAAMhF,EAAOgF,KAAO3F,EAAI2F,QAC5BhF,EAAOgF,IAAMrC,OACbyB,EAAQ/E,EAAI6G,UAAU,GACtB7G,EAAI0I,IAAMpB,GAAWvC,MAErBA,GAAQpE,EAAOkH,KAAK,EAOrB,OAHA9C,GAAQ2C,GAAY/D,EAAKE,EAAE8E,SACxBhF,EAAKE,EAAE8E,SAAS5D,EAAOpB,EAAM3D,GAC7B+E,EACazB,QAATyB,EAAqBA,EAAQ,GAGrC,QAAS6D,GAAYxD,EAASyD,GAC7B,GAAIpF,GAAGqB,EAAKgE,EAAWjB,EAAMkB,EAAU/I,EAAKqH,EAC3C1G,EAASV,IAEV,IAAIU,EAAOyH,SAGV,GAFApI,EAAMW,EACNA,GAAUX,EAAIuI,UAAY5H,IAASyE,GAAS,IACvCzE,EACJ,WAGDX,GAAMW,EAAOX,GAed,IAZA+I,EAAW/I,EAAI+I,SACflB,EAAOlH,EAAOkH,MAETR,EAAYrH,EAAIqI,UAAY,GAAKhB,IAAcA,IACnDA,EAA0B,SAAdA,EACT/D,OACC3C,EAAOgD,KAAKuD,OAAO,aAAcG,IAAc9E,EAAM,uBAAyB8E,EAAY,MAG3FA,IAAcwB,IACjBhB,EAAOA,EAAKmB,SAETD,EAAU,CAGb,IAFAD,KACArF,EAAIsF,EAAS/E,OACNP,KACNqB,EAAMiE,EAAStF,GACfqF,EAAUlC,QAAQqC,EAAUtI,EAAQmE,GAEjC+D,KACHhB,EAAOiB,GAGT,GAAIzB,EAAW,CAEd,GADAA,EAAYA,EAAUjH,MAAMJ,EAAK8I,GAAajB,GAC5BvE,SAAd+D,EACH,MAAOQ,EASR,IAPAkB,EAAWA,IAAa,GACxBtF,EAAIsF,EAAS/E,OACR5B,GAASiF,IAAcA,EAAUrD,SAAWP,IAChD4D,GAAaA,GACb0B,GAAY,GACZtF,EAAI,GAEDoF,EACHhB,EAAOR,MAEP,MAAO5D,KACNqB,EAAMiE,EAAStF,IACVqB,IAAQA,IACZ+C,EAAK/C,GAAOuC,EAAU5D,IAK1B,MAAOoE,GAGR,QAASoB,GAAUC,EAASpE,GAE3B,MADAoE,GAAUA,GAASpE,IAAQA,EAAM,OAAS,SACnCoE,GAAWA,EAAQpE,GAG3B,QAASqE,GAAiB/D,GACzB,MAAOnF,MAAK4G,QAAQzB,EAAS,GAQ9B,QAASgE,GAAYC,EAAcC,GAClC,GAAIpE,GAAKQ,EACR/B,EAAO1D,IACR,IAAI,GAAKqJ,IAAaA,EAAU,CAC/B,KAAgBhG,SAAR4B,GAAsBvB,GAC7B+B,EAAQ/B,EAAKsD,MAAQtD,EAAKsD,KAAKoC,GAC/BnE,EAAMQ,GAASA,EAAM4D,GACrB3F,EAAOA,EAAKM,MAEb,OAAOiB,IAAO7C,GAAOgH,GAAcC,IAIrC,QAASC,GAAUnB,EAASoB,EAAYvC,EAAMsB,EAAS/C,EAAU8B,GAChE,QAASmC,GAAiBpG,GACzB,GAAIqG,GAAY1J,EAAIqD,EAEpB,IAAkBC,SAAdoG,EAGH,IAFAA,EAAYtH,GAASsH,GAAaA,GAAaA,GAC/CC,EAAID,EAAU1F,OACP2F,KACN7E,EAAM4E,EAAUC,GACXC,MAAMC,SAAS/E,MACnB4E,EAAUC,GAAKE,SAAS/E,GAK3B,OAAO4E,KAAc,GAGtBF,EAAaA,GAAcM,EAC3B,IAAI9J,GAAK+J,EAAQC,EAAUC,EAAMC,EAAMC,EAAW1G,EAAGkG,EAAGS,EAAGC,EAAS1J,EAAQ2J,EAAWC,EAAQ9C,EAAQsB,EAAUyB,EAChHC,EAASC,EAAUC,EAAQC,EAAS/C,EAAMgD,EAAQhK,EAAOiK,EAAYC,EAAYjG,EAAKkG,EAAgBC,EAAcC,EAAeC,EACnI3H,EAAI,EACJzD,EAAM,GACNwH,EAAUiC,EAAWzB,MAAO,EAC5BpC,EAAM6D,EAAW7D,IACjByF,EAAanE,GAAQuC,EAAWvC,KAEhCS,EAA8B,gBAAZa,IAAwBiB,EAAWvC,KAAKU,KAAKY,EAAQ,EAsBxE,KApBoB,QAAhBH,EAAQI,KACXxI,EAAMoI,EACNA,EAAUpI,EAAIoI,QACdG,EAAUvI,EAAIuI,QACdyB,EAAWhK,EAAIgK,WAEfD,EAASP,EAAWtC,OAAO,OAAQkB,IAAY7F,EAAM,kBAAoB6F,EAAU,OACnF4B,EAAWD,EAAOC,UAEH1G,SAAZgE,GAAyBI,IAAaA,EAASE,IAAOmC,EAAOsB,YAAc3D,EAASE,OAAO,GAASF,EAASE,OAChHN,EAAU,IAEKhE,SAAZgE,GACHvH,GAAOuH,EACPiB,EAAUjB,IAAYzG,SAAWgH,QAAUyD,QAASzK,aAC1C6G,IACVa,EAAUb,EAAS8B,EAAW1C,KAAM0C,EAAYzG,KAGjDU,EAAI8E,EAAQvE,OACLR,EAAIC,EAAGD,IACb7C,EAAS4H,EAAQ/E,GACjBiH,EAAU9J,EAAOsG,OACZM,IAAYA,EAAQvH,KAAOwD,IAAM+D,EAAQvH,IAAImI,QAAUnI,EAAI0I,KAAO+B,IAAYA,IAAUA,KAGxFA,GAAWW,EAAWG,QACzB5K,EAAOsG,KAAOtG,EAAO8J,QAAUW,EAAWG,MAAMd,EAAU,IAE3D9J,EAAOwD,MAAQX,EACf7C,EAAO4J,OAAS1F,EAChBlE,EAAO6K,OAASC,EAChB9K,EAAOkG,QAAU+B,EACjBjI,EAAO+K,QAAUvC,EACjBxI,EAAOgD,KAAO6F,EACd7I,EAAOgF,IAAM8C,EAAUA,EAAU9H,EAAOgF,IAAKoE,GAAUA,EAAOpE,KAAMA,KAEjEsB,EAAOtG,EAAOE,MAAMoG,QAEvBtG,EAAOsG,KAAOuC,EAAWmC,SAAS1E,GAClCtG,EAAO8J,QAAU9J,EAAO8J,SAAW9J,EAAOsG,MAGtCjH,EA0BMuH,GAAWA,EAAQ9H,GAAGmI,MAChC8C,IAAa1K,EAAI4L,OAtBjB5L,EAAM,GAAI+J,GAAO8B,KACjBnB,IAAa1K,EAAI4L,KAEjB5L,EAAIiE,OAASkG,EAAYxE,GAAOA,EAAI3F,IACpCA,EAAIuI,QAAUA,EAEVhB,IACHvH,EAAImI,QAAS,EACbZ,EAAQvH,IAAMA,GAEfA,EAAIuH,QAAUA,GACVvH,EAAI6D,EAAEoE,IAAMP,GAAYH,EAAQ9H,KAEnCO,EAAI6D,EAAEiI,IAAMnL,EAAO2K,OAAOzK,MAAdF,QACZX,EAAI6D,EAAEe,GAAK2D,EAAQ3D,GACnB5E,EAAI6D,EAAEkI,WACI/L,EAAIgM,eACdzJ,EAAM6F,EAAU,4BAA8BA,EAAU,OAO1D0C,EAAa9K,EAAIiM,QAEjBtL,EAAOX,IAAMA,EACT8K,GAAcvC,IACjB5H,EAAOuL,IAAM3D,EAAQ/E,GAAG0I,KAEpBlM,EAAIsI,OACRgC,EAAY3J,EAAOgF,IAAMhF,EAAOgF,QAGhCsE,EAAOjK,EAAImM,QAAU7B,EAAU8B,WAAazG,GAAO8C,EAAU6B,EAAU8B,WAAYzG,EAAIyG,gBACnFjC,IACHF,EAAKE,EAAU/B,SAAW+B,GAG3BF,EAAKjK,EAAIoI,SAAWkC,EAAUtK,IAAMA,EACpCsK,EAAU3J,OAASA,EAGrB,MAAMX,EAAI0I,IAAMpB,GAAU,CAGzB,IAFA5G,EAAqBV,EAAKuI,EAAQ,IAClCvI,EAAIqM,WAAaC,KAAMtM,EAAIqM,WACtB7I,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CAKvB,GAJA7C,EAASX,EAAIW,OAAS4H,EAAQ/E,GAC9B3C,EAAQF,EAAOE,MACfb,EAAI2F,IAAMhF,EAAOgF,KAEZnC,EAAG,CAyCP,GAxCIkH,IACH1K,EAAI4L,KAAKjL,EAAQ4G,EAASvH,EAAI2F,KAC9B+E,EAAWpH,QAEP3C,EAAOkH,KAAK7D,QAAUrD,EAAO4L,cAAe,GAASvM,EAAIuM,cAAe,IAC5E5L,EAAOkH,KAAOA,GAAQlH,EAAOgD,KAAKmD,MAClCnG,EAAO2K,OAAOzD,MAAQ,UAGvBJ,EAASgC,EAAiB,UAEPnG,SAAftD,EAAIyH,SACPzH,EAAIyH,OAASA,GAGOnE,SAAjBtD,EAAI+I,SACP/I,EAAI+I,SAAWU,EAAiB,YACtBzJ,EAAIyH,SACdzH,EAAI+I,SAAW/I,EAAIyH,OAASA,GAE7BsB,EAAW/I,EAAI+I,UAAYtB,EAE3BwD,EAAexD,EAAOzD,OACtBgH,EAAiBjC,EAAS/E,OAEtBhE,EAAI6D,EAAEoE,MAAQiD,EAAgBlL,EAAIkL,iBACrClL,EAAIkL,cAAgBA,EAAgB9I,GAAS8I,GAAiBA,GAAgBA,GAE1ED,IAAiBC,EAAclH,QAClCzB,EAAM,6CAGJ2I,EAAgBlL,EAAIwM,kBACvBxM,EAAIwM,eAAiBtB,EAAgB9I,GAAS8I,GAAiBA,GAAgBA,GAE3EF,IAAmBE,EAAclH,QACpCzB,EAAM,sDAIJwG,EAIH,IAHA/I,EAAI6D,EAAE4I,aACNzM,EAAI6D,EAAE6I,WACNtC,EAAIY,EACGZ,KAGN,IAFAtF,EAAMiE,EAASqB,GACfT,EAAIsB,EACGtB,KACF7E,IAAQ2C,EAAOkC,KAClB3J,EAAI6D,EAAE4I,UAAU9C,GAAKS,EACrBpK,EAAI6D,EAAE6I,QAAQtC,GAAKT,EAMnBpC,KAGHA,EAAQ2C,KAAOlK,EAAIkK,KAAO3C,EAAQ2C,MAAQlK,EAAIkK,MAAQ3C,EAAQoF,OAE/DzC,EAAOlK,EAAIkK,KACXlK,EAAI6D,EAAE+I,MAAQ1C,GAAQA,IAAS2C,GAGhC,GADAhF,EAAO7H,EAAI6G,QAAQrD,GACfxD,EAAIwM,eAIP,IAHA3B,EAAS7K,EAAI6G,QAAQrD,EAAG,GACxBmG,EAAIqB,EACJG,EAAanL,EAAIiB,YAAYC,UAAUyE,IAChCgE,MACFY,EAASvK,EAAIwM,eAAe7C,MAC/B7E,EAAMiE,EAASY,GACfa,EAAUK,EAAOlB,GAEjBhJ,EAAOgF,IAAI4E,GAAUxH,GAAK+J,IACzB3B,GAA0B7H,SAAZkH,EAAwBW,EAAWZ,GAASC,EAC9ClH,SAAZkH,GAAyBvB,EAAUtI,EAAO2K,OAAQxG,GAClDnE,EAAOgD,KACP3D,EAAI6D,EAAEoE,MAAQjI,IAAKA,EAAK+M,IAAK/M,EAAIqI,QAAS9B,IAAKoD,EAAGvE,QAAS5B,MAK1DmH,EAAS9J,EAAMoL,SAAWnB,KAAgBjD,EAAK7D,QAAUnD,EAAMoL,WACnErB,EAAUjK,EAAOuL,IACZtB,GAAWA,EAAQoC,MAAQnF,EAAK,KAAMrC,IACtCoF,GAAWA,EAAQoC,KACtBpC,EAAQqC,QAETtC,EAAOuB,IAAIrE,EAAK,GAAIlH,EAAQiK,GAAU5K,EAAI6D,EAAEoE,KAC5C2C,EAAUjK,EAAOuL,KAElBrE,GAAQ+C,EAAQsC,MAGjB7C,EAAU/G,OACNtD,EAAIwL,SACPnB,EAAUrK,EAAIwL,OAAOpL,MAAMJ,EAAK6H,GAC5B2B,EAAWzD,QAAUsE,IAAY8C,GAAqBpM,KAAKsJ,KAK9DpD,GACCmG,UAEDnG,EAAKuE,OAASvE,EAAKxH,GAAK,WACvB,MAAO4K,IAERA,EAAUgD,EAAgBpG,EAAMuC,EAAW1C,KAAMxD,QAAW,EAAMkG,EAAYlG,OAAWA,OAAWtD,KAGjG6H,EAAK7D,SACT6D,GAAQ2B,IAEOlG,SAAZ+G,IACHU,EAAalD,EAAK,GACd7H,EAAI+K,aACPA,EAAa/K,EAAI+K,cAAe,EAAOvB,EAAaxJ,EAAI+K,WAAWA,IAEpEV,EAAU1J,EAAO6K,OAAOT,GAAY,KAAUvF,EAAWlC,OAAY,KAEtEvD,EAAMA,EACHA,GAAOsK,GAAW,IACN/G,SAAZ+G,EACC,GAAKA,EACL/G,OAELtD,EAAIqM,UAAYrM,EAAIqM,UAAUC,KAW/B,MATAtM,GAAIW,OAAS4H,EAAQ,GACrBvI,EAAI2F,IAAM3F,EAAIW,OAAOgF,IAEjB3F,EAAI6D,EAAE+I,OAAS5M,EAAImI,SAEtBpI,EAAe,SAATmK,EACHoD,GAAYC,KAAKxN,GACjB,IAEG2H,GAAY8B,EAAW3F,EAAE8E,SAE7Ba,EAAW3F,EAAE8E,SAAS5I,EAAKyJ,EAAYxJ,GACvCD,EAOJ,QAASyN,GAAKtE,EAAS7F,EAAMmG,EAAY1C,EAAMkD,EAAUlF,EAAK6D,EAAU8E,GAEvE,GAAIlK,GAAOmK,EAAkBC,EAC5BC,EAAO3N,KACP4N,EAAmB,UAATxK,CAIXuK,GAAKnD,QAAUgD,EACfG,EAAKrK,MAAQsK,QACbD,EAAK9G,KAAOA,EACZ8G,EAAK3G,KAAO+C,EACZ2D,EAAQC,EAAK/J,GACZiB,IAAK,EAELhB,OAAQ+J,EAAU,EAAI,EACtBC,GAAI,GAAKC,KACTpF,SAAUA,EACVhB,SAEDiG,EAAK7H,SAAW4C,EAChBiF,EAAKvK,KAAOA,GAAQ,OAChBuK,EAAK3J,OAASuF,IACjBoE,EAAKhK,KAAO4F,EAAW5F,MAAQgK,EAC/BrK,EAAQiG,EAAWjG,MACnBmK,EAAclE,EAAW3F,EACzB+J,EAAK1H,MAAQwH,EAAYM,IACzBJ,EAAK3H,QAAUiD,EAAQlJ,KAAOkJ,EAAQlJ,MAAQwJ,EAAW7D,IAAI3F,OAAS4N,EAAK1H,OAASsD,EAAWvD,OAAS2H,EAEpGF,EAAY5J,QAGfP,EAAMoK,EAAM7I,IAAM,IAAM4I,EAAY5J,UAAY8J,EAChDA,EAAKzJ,MAAQ8J,GACbL,EAAKxJ,SAAWF,GACNX,EAAMS,UAAY2J,EAAM7I,IAAM8I,EAAKzJ,MAAQW,GACrDvB,EAAM2K,KAAKN,GAEXrK,EAAM4K,OAAOrJ,EAAK,EAAG8I,GAItBA,EAAKjI,IAAMuD,GAAWM,EAAW7D,KAEjCiI,EAAKjI,IAAMuD,MAkBb,QAASkF,GAAsBhD,GAC9B,GAAIiD,GAAWC,EAAYC,CAC3B,KAAKF,IAAaG,IACjBF,EAAaD,EAAY,IACrBjD,EAAWkD,KACdC,EAAYnD,EAAWkD,GACvBlD,EAAWkD,MACXjM,GAAOiM,GAAYC,EAAWnD,IASjC,QAASqD,GAAW7M,EAAMmI,EAAQqB,GAIjC,QAASsD,KACR,GAAI1O,GAAMC,IACVD,GAAI6D,GACHqE,UAAU,GAEXlI,EAAImI,QAAS,EACbnI,EAAIoI,QAAUxG,EATf,GAAIqF,GAAM0H,EAAS/N,EAClBgO,EAAc,GAAI7L,IAAKiF,GAqBxB,IAVIzH,GAAYwJ,GAEfA,GACC8E,QAAS9E,EAAO8E,QAChBrD,OAAQzB,GAEC,GAAKA,IAAWA,IAC1BA,GAAUC,SAAUD,IAGjB4E,EAAU5E,EAAO4E,QAAS,CAC7B5E,EAAOzB,OAASyB,EAAOzB,KACvBqG,EAAU,GAAKA,IAAYA,EACvBvD,GAAcA,EAAWnB,KAAK0E,IAAYG,GAAMH,GACjDA,EACEA,GACJpM,EAAM,aAAewH,EAAO4E,QAAU,eAEvCC,EAAc9M,EAAQ8M,EAAaD,EAEnC,KAAK/N,IAAQmJ,GACZ6E,EAAYhO,GAAQN,EAAUqO,EAAQ/N,GAAOmJ,EAAOnJ,QAGrDgO,GAAc9M,EAAQ8M,EAAa7E,EAYpC,OARsCzG,WAAjC2D,EAAO2H,EAAY5E,YACvB4E,EAAY5E,SAAW,GAAK/C,IAASA,EAAQE,GAAWF,IAASE,GAAWF,GAASA,IAErFyH,EAAIxN,UAAY0N,GAAa3N,YAAc2N,EAAY/C,KAAO6C,EAE3DtD,IACHwD,EAAYG,YAAc3D,GAEpBwD,EAGR,QAASnN,GAAUoG,GAGlB,MAAO5H,MAAKE,KAAKC,MAAMH,KAAM4H,GAO9B,QAASmH,GAAYpN,EAAMqF,EAAMmE,EAAY6D,GAI5C,QAASC,GAAenK,GAGvB,GAAIoK,GAAalI,CACjB,IAAK,GAAKlC,IAAUA,GAAUA,EAAMqK,SAAW,IAAMC,EAAOtK,GAAQ,CACnE,IAAKsK,EACJ,GAAI,qBAAqBtO,KAAKgE,IAGzBkC,EAAOE,GAAWvF,EAAOA,GAAQmD,IACpCA,EAAQkC,EAIRoI,EAAOC,SAASC,eAAexK,OAE1B,IAAI1F,EAAEI,KAAOsD,GAAKE,MAAMlC,KAAKgE,GACnC,IACCsK,EAAOhQ,EAAG0F,EAAOuK,UAAU,GAC1B,MAAO9N,IAGP6N,IACkB,WAAjBA,EAAKjH,SACR7F,EAAMwC,EAAQ,2BAA6BsK,EAAKjH,SAE7C6G,EAEHlK,EAAQsK,EAAKG,WAIbL,EAAcE,EAAKI,aAAaC,IAC5BP,IACCA,IAAgBQ,IACnB5K,EAAQoC,GAAWgI,SACZhI,IAAWgI,IACR9P,EAAEI,KACZsF,EAAQ1F,EAAEyH,KAAKuI,GAAMM,MAGlBR,GAAgBpK,IACpBnD,EAAOA,IAASvC,EAAEI,GAAKkQ,GAAU5K,GACjCA,EAAQiK,EAAYpN,EAAMyN,EAAKG,UAAWpE,EAAY6D,IAEvDlK,EAAM6K,SAAWhO,EAAOA,GAAQuN,EAC5BvN,IAAS+N,KACZxI,GAAWvF,GAAQmD,GAEpBsK,EAAKQ,aAAaH,GAAU9N,GACxBvC,EAAEI,IACLJ,EAAEyH,KAAKuI,EAAMM,GAAS5K,KAIzBsK,EAAO/L,WACIyB,GAAMtF,KACjBsF,EAAQzB,OAGT,OAAOyB,GAGR,GAAIsK,GAAMS,EACTC,EAAe9I,EAAOA,GAAQ,EA4B/B,IA3BAlE,GAAKiN,MAAQ1C,GAAYC,KAGT,IAAZ0B,IACHA,EAAU3L,OACVyM,EAAeb,EAAea,IAK/Bd,EAAUA,IAAYhI,EAAKgJ,OACxBhJ,EAAKU,KACJ7F,KAAYmF,GACZA,MAIJgI,EAAQW,SAAWX,EAAQW,UAAYhO,GAAQ,UAC3CwJ,IACH6D,EAAQF,YAAc3D,IAIlB2E,GAAgB9I,EAAKgJ,SAAWF,EAAeb,EAAejI,EAAKgJ,UAAYF,EAAatQ,KAEhGsQ,EAAeA,EAAaE,QAER3M,SAAjByM,EAoBH,MAnBIA,GAAavE,QAAUvE,EAAKuE,OAE3BuE,EAAaxE,QAChBuE,EAAeC,IAKhB9I,EAAOiJ,EAAWH,EAAcd,GAEhCkB,EAAOJ,EAAaK,QAAQC,GAAe,QAASpJ,IAEhD6I,IACJA,EAAehO,EAAQ,WACtB,MAAOgO,GAAatE,OAAOpL,MAAM0P,EAAczP,YAC7C4G,GAEHmH,EAAsB0B,IAEhBA,EAUT,QAASQ,GAAcC,EAAYzJ,GAClC,MAAOvG,IAAYgQ,GAChBA,EAAWC,KAAK1J,GAChByJ,EAGJ,QAASE,GAAWC,GAIlB,IAHA,GAAIC,MACHnN,EAAI,EACJC,EAAIiN,EAAS1M,OACPR,EAAEC,EAAGD,IACXmN,EAAIzC,KAAKwC,EAASlN,GAAGyJ,QAEtB,OAAO0D,GAGT,QAASC,GAAiBhP,EAAMyB,GAiB/B,QAASwN,GAAOhJ,GACf5G,EAAYb,MAAMH,KAAM4H,GAGzB,QAASiJ,KACR,MAAO,IAAID,GAAOxQ,WAGnB,QAAS0Q,GAAQjK,EAAMkK,GAGtB,IAFA,GAAIC,GAAYV,EAAY3P,EAAM0D,EACjC4M,EAAI,EACEA,EAAEC,EAAGD,IACXtQ,EAAOwQ,EAAQF,GACfD,EAAa3N,OACT1C,EAAO,KAAOA,IACjBqQ,EAAarQ,EACbA,EAAOqQ,EAAWI,QAEO/N,UAArBgB,EAAKwC,EAAKlG,KAAwBqQ,GAAuD3N,UAAxCiN,EAAaU,EAAWV,cAC7EjM,EAAKgM,EAAcC,EAAYzJ,IAEhCkK,EAAO1M,EAAI2M,GAAcK,EAAWL,EAAW5N,MAAOzC,GAIxD,QAASsL,GAAIpF,GACZA,EAAOA,EAAO,KAAOA,EAClByK,KAAKC,MAAM1K,GACXA,CACH,IAAIrD,GAAG7C,EACNsQ,EAAI,EACJ5M,EAAKwC,EACL6J,IAED,IAAIvO,GAAS0E,GAAO,CAGnB,IAFAA,EAAOA,MACPrD,EAAIqD,EAAK9C,OACFkN,EAAEzN,EAAGyN,IACXP,EAAIzC,KAAKjO,KAAKiM,IAAIpF,EAAKoK,IAKxB,OAHAP,GAAInI,IAAM5G,EACV+O,EAAI1D,MAAQA,EACZ0D,EAAIc,MAAQA,EACLd,EAGR,GAAI7J,EAAM,CACTiK,EAAQjK,EAAM,SAASxC,EAAIoN,GACtBA,IACHpN,EAAKoN,EAAUxF,IAAI5H,IAEpBqM,EAAIzC,KAAK5J,KAGVA,EAAKrE,KAAKG,MAAMH,KAAM0Q,EACtB,KAAK/P,IAAQkG,GACRlG,IAAS+Q,IAAaC,EAAYhR,KACrC0D,EAAG1D,GAAQkG,EAAKlG,IAInB,MAAO0D,GAGR,QAASmN,GAAM3K,GACdA,EAAOA,EAAO,KAAOA,EAClByK,KAAKC,MAAM1K,GACXA,CACH,IAAIoK,GAAGzN,EAAGkG,EAAG/I,EAAMiR,EAAKnO,EAAOoO,EAAUxN,EAAIyN,EAC5CC,EAAI,EACJC,EAAQhS,IAET,IAAImC,GAAS6P,GAAQ,CAKpB,IAJAH,KACAC,KACAtO,EAAIqD,EAAK9C,OACT2F,EAAIsI,EAAMjO,OACHgO,EAAEvO,EAAGuO,IAAK,CAGhB,IAFA1N,EAAKwC,EAAKkL,GACVtO,GAAQ,EACHwN,EAAE,EAAGA,EAAEvH,IAAMjG,EAAOwN,IACpBY,EAASZ,KAGbW,EAAMI,EAAMf,GAERpD,IACHgE,EAASZ,GAAKxN,EAAQoK,EAAK,KAAOA,EAC/BxJ,EAAGwJ,KAAQ8D,EAAY9D,GAAM+D,EAAI/D,KAAQ+D,EAAI/D,MAASxJ,EAAGwJ,GAC1DA,EAAG+D,EAAKvN,IAGRZ,IACHmO,EAAIJ,MAAMnN,GACVyN,EAAU7D,KAAK2D,IAEfE,EAAU7D,KAAK4C,EAAG5E,IAAI5H,IAQxB,YALI4N,EACHA,EAAYD,GAAOE,QAAQJ,GAAW,GAEtCE,EAAM9D,OAAO/N,MAAM6R,GAAQ,EAAGA,EAAMjO,QAAQoO,OAAOL,KAIrDhB,EAAQjK,EAAM,SAASxC,EAAIoN,EAAWL,GACjCK,EACHO,EAAMZ,KAAUI,MAAMnN,GAEtB2N,EAAMZ,GAAQ/M,IAGhB,KAAK1D,IAAQkG,GACRlG,IAAS+Q,IAAaC,EAAYhR,KACrCqR,EAAMrR,GAAQkG,EAAKlG,IAKtB,QAASqM,KACR,GAAI3I,GAAI1D,EAAMqQ,EAAiBlM,EAC9BiN,EAAI,EACJC,EAAQhS,IAET,IAAImC,GAAS6P,GACZ,MAAOxB,GAAWwB,EAGnB,KADA3N,KACO0N,EAAEb,EAAGa,IACXpR,EAAOwQ,EAAQY,GACff,EAAa3N,OACT1C,EAAO,KAAOA,IACjBqQ,EAAarQ,EACbA,EAAOqQ,EAAWI,QAEnBtM,EAAQkN,EAAMrR,KACd0D,EAAG1D,GAAQqQ,GAAclM,GAASuM,EAAWL,EAAW5N,MACrDjB,GAAS2C,GACR0L,EAAW1L,GACXA,EAAMkI,QACPlI,CAEJ,KAAKnE,IAAQqR,GACC,QAATrR,GAAmBgR,EAAYhR,IAASA,IAAS+Q,IAAiC,MAAnB/Q,EAAKyR,OAAO,IAAeT,EAAYhR,EAAKoI,MAAM,KAASzI,GAAY0R,EAAMrR,MAC/I0D,EAAG1D,GAAQqR,EAAMrR,GAGnB,OAAO0D,GApKR,GAAId,GAAGvC,EACNqQ,EAAarR,KACbmR,EAAU/N,EAAK+N,QACfkB,EAASjP,EAAKiP,OACdxE,EAAKzK,EAAKyK,GACVyE,EAAQlT,EAAEiT,QACT9J,IAAK5G,GAAQ,UACbqL,MAAOA,EACPwE,MAAOA,GACLa,GACHzK,EAAO,GACP2K,EAAO,GACPrB,EAAIC,EAAUA,EAAQpN,OAAS,EAC/BkO,EAAc7S,EAAEoH,WAChBmL,IA2JD,KAFAf,EAAO3P,UAAYqR,EAEd/O,EAAE,EAAGA,EAAE2N,EAAG3N,KACd,SAAU6N,GACTA,EAASA,EAAOA,QAAUA,EAC1BO,EAAYP,GAAU7N,EAAE,CACxB,IAAIiP,GAAY,IAAMpB,CAEtBxJ,KAASA,EAAO,IAAM,IAAMwJ,EAC5BmB,GAAQ,QAAUC,EAAY,MAAQpB,EAAS,MAC/CkB,EAAMlB,GAAUkB,EAAMlB,IAAW,SAASjQ,GACzC,MAAKf,WAAU2D,YAGXkO,EACHA,EAAYjS,MAAMyG,YAAY2K,EAAQjQ,GAEtCnB,KAAKwS,GAAarR,GALXnB,KAAKwS,IASVP,IACHK,EAAMlB,GAAQqB,IAAMH,EAAMlB,GAAQqB,KAAO,SAAStR,GACjDnB,KAAKwS,GAAarR,KAGlBgQ,EAAQ5N,GAWZ,OARAvC,GAAc,GAAI0R,UAAS9K,EAAM2K,EAAKxJ,MAAM,OAC5C/H,EAAYC,UAAYqR,EACxBA,EAAMtR,YAAcA,EAEpB6P,EAAG5E,IAAMA,EACT4E,EAAGM,QAAUA,EACbN,EAAGwB,OAASA,EACZxB,EAAGhD,GAAKA,EACDgD,EAGR,QAASZ,GAAWD,EAAQhB,GAE3B,GAAI2D,GACHC,EAAUC,GAAqBC,QAC/B9L,GACCsE,SACA6B,SACAzF,QACAa,IAAK,WACLgD,OAAQC,EAoBV,OAjBIwD,KACHhI,EAAOnF,EAAQmF,EAAMgI,IAGtBhI,EAAKgJ,OAASA,EACThJ,EAAK2L,UAETA,EAAUI,GAAWC,KAAKhD,GAC1BhJ,EAAK2L,QAAUA,EAAUA,EAAQ,GAAGM,cAAgB,IAErDN,EAAUC,EAAQ5L,EAAK2L,SACnBA,GAAWA,IAAYC,EAAQM,MAGlClM,EAAKgJ,OAAS5Q,EAAE+T,KAAKnM,EAAKgJ,SAGpBhJ,EAUR,QAASoM,GAAchF,EAAWiF,GAYjC,QAASC,GAAS3R,EAAM4R,EAAMpI,GAO7B,GAAIqI,GAASnK,EAAUoK,EACtBC,EAAU5Q,GAAK4Q,QAAQtF,EAExB,IAAIzM,SAAeA,KAASgS,KAAWhS,EAAKwN,WAAaxN,EAAKqO,SAAWrO,EAAKiS,UAA0B,cAAdxF,GAA6BzM,EAAKwP,SAAWxP,EAAK0Q,QAAS,CAKpJ,IAAKhJ,IAAY1H,GAChB2R,EAASjK,EAAU1H,EAAK0H,GAAWkK,EAEpC,OAAOA,IAAQnR,GAqChB,MAlCIT,IAAQ,GAAKA,IAASA,IACzBwJ,EAAaoI,EACbA,EAAO5R,EACPA,EAAO0B,QAERoQ,EAAYtI,EACK,cAAdiD,EACCjD,EACCA,EAAWkD,GAAclD,EAAWkD,OACtCiF,EACHE,EAAUH,EAAcG,QAEXnQ,SAATkQ,IACHA,EAAOC,EAAU7R,EAAO8R,EAAU9R,GAClCA,EAAO0B,QAEK,OAATkQ,EAEC5R,SACI8R,GAAU9R,IAGd6R,IACHD,EAAOC,EAAQjD,KAAKkD,EAAW9R,EAAM4R,EAAMpI,EAAY,OACvDoI,EAAKhL,IAAM6F,GAERzM,IACH8R,EAAU9R,GAAQ4R,IAGhBG,GAEHA,EAAQ/R,EAAM4R,EAAMpI,EAAYqI,GAE1BD,EAGR,GAAIlF,GAAaD,EAAY,GAC7BhM,IAAOiM,GAAciF,EAYtB,QAASO,GAAWC,GACnB7Q,GAAe6Q,GAAM,SAAShP,GAC7B,MAAO1E,WAAU2D,QACbpB,GAAamR,GAAMhP,EAAO7B,IAC3BN,GAAamR,IAQlB,QAAS9H,GAAQtB,GAChB,QAASqJ,GAAIhS,EAAQiN,GACpBhP,KAAKiN,IAAMvC,EAAOkJ,OAAO7R,EAAQiN,GACjCA,EAAQ/C,IAAMjM,KAiBf,MAdIM,IAAYoK,KAEfA,GACCkJ,OAAQlJ,IAINA,EAAOsJ,UACVtJ,EAAS7I,EAAQA,KAAY6I,EAAOsJ,SAAUtJ,IAG/CA,EAAOuB,IAAM,SAASlK,EAAQiN,GAC7B,MAAO,IAAI+E,GAAIhS,EAAQiN,IAEjBtE,EAkBR,QAASc,GAAc3E,EAAMoC,EAASgL,EAAa1K,EAAY1E,EAAK6D,GACnE,GAAInF,GAAGC,EAAGzD,EAAKiH,EAAMtG,EAAQwT,EAAiBC,EAAUC,EACvD1Q,EAAO6F,EACP8K,EAAS,EAwBV,IAtBIpL,KAAY,GACfgL,EAAchL,EACdA,EAAU5F,cACO4F,KAAY0K,KAC7B1K,EAAU5F,SAGPtD,EAAMC,KAAKD,MAEdW,EAASV,KACT0D,EAAOA,GAAQhD,EAAOgD,KACtBsD,EAAOtD,EAAKgI,SAAS3L,EAAIgK,UAAYrJ,EAAOsG,MACvC5G,UAAU2D,SACd8C,EAAO9G,EAAI+K,YAAcxK,GAAYP,EAAI+K,YACtCjE,EAAO9G,EAAI+K,WAAWjE,GACtBnD,IAIJsD,EAAOhH,KAGJgH,EAAM,CAeT,IAdKuC,GAAc1C,GAAqB,SAAbA,EAAK0B,MAC/B7E,EAAOmD,GAGJnD,GAAQmD,IAASnD,IAEpBmD,EAAOnD,EAAKmD,MAGbqN,GAAmBxQ,EACnB8B,GAAeA,IAAgB0O,EAC1BxQ,KACHuF,EAAUA,OAAetF,KAAOkD,IAE7BrB,IAAgBqN,GAAqByB,UAAYtN,EAAKsN,UAAY5Q,GAAQA,IAASmG,GACvFwK,EAASjH,EAAgBpG,EAAMH,EAAMoC,EAASgL,EAAavQ,EAAMmB,EAAK6D,EAAU3I,OAC1E,CAWN,GAVI2D,GACHyQ,EAAWzQ,EAAKmD,KAChBuN,EAAY1Q,EAAKQ,MACjBR,EAAKQ,MAAQ8J,KAEbtK,EAAOmG,GACPsK,EAAWzQ,EAAKmD,KAChBnD,EAAKmD,KAAOA,EACZnD,EAAKgC,IAAMuD,GAER9G,GAAS0E,KAAUoN,EAGtB,IAAK1Q,EAAI,EAAGC,EAAIqD,EAAK9C,OAAQR,EAAIC,EAAGD,IACnCG,EAAKQ,MAAQX,EACbG,EAAKmD,KAAOA,EAAKtD,GACjB8Q,GAAUrN,EAAKxH,GAAGqH,EAAKtD,GAAIG,EAAMZ,QAGlCY,GAAKmD,KAAOA,EACZwN,GAAUrN,EAAKxH,GAAGqH,EAAMnD,EAAMZ,GAE/BY,GAAKmD,KAAOsN,EACZzQ,EAAKQ,MAAQkQ,EAEVF,IACH1O,GAAenC,QAGjB,MAAOgR,GAGR,QAASjH,GAAgBpG,EAAMH,EAAMoC,EAASgL,EAAavQ,EAAMmB,EAAK6D,EAAU3I,GAC/E,QAASwU,GAAWhB,GAEnBiB,EAAS3S,KAAYoH,GACrBuL,EAAOC,GAAWlB,EAMnB,GAAIhQ,GAAGC,EAAGkR,EAASC,EAAWC,EAAYC,EAAarH,EAAasH,EAAenF,EAAU8E,EAASD,EAAQ9T,EAAQqU,EACrHV,EAAS,EAsEV,IApEItU,IAEH4P,EAAW5P,EAAIoI,QACfzH,EAASX,EAAIW,OACbuI,EAAUA,EAAUT,EAAUS,EAASlJ,EAAI2F,KAAO3F,EAAI2F,IAElDsB,IAAStD,EAAK8G,QACjBgD,EAAcxG,IAAStD,EAAKgC,IAAIsP,KAC7BtR,EAAKgC,IAAIsP,KACT3R,OACO2D,IAAStG,EAAO8J,QACtBxD,IAASjH,EAAIgK,UAChByD,EAAc9M,EAAOsG,KACrBiC,EAAQ+L,KAAOtU,EAAO8J,SAEtBgD,EAAc9M,EAAO8J,SAAW9G,EAAK8G,QAGtCgD,EAAc9J,EAAK8G,QAGhB9J,EAAOE,MAAMgB,QAAS,IAIzBqH,EAAUA,MACVA,EAAQrH,MAAO,IAEZ6S,EAAU/T,EAAOE,MAAM6T,WACP,MAAfA,EAAQ,IACXQ,EAAY,yBAEbR,EAAUA,EAAQ1L,MAAM,KAItBrF,IACHgF,EAAWA,GAAYhF,EAAKE,EAAE8E,SAC9BqM,EAAY9L,GAAWA,EAAQrH,QAAS,EAEpCmT,GAAarR,EAAKE,EAAEsR,KACvBxM,EAAWrF,QAGZ4F,EAAUT,EAAUS,EAASvF,EAAKgC,MAG/Bb,KAAQ,IACXgQ,GAAc,EACdhQ,EAAM,GAIH6D,GAAY3I,GAAOA,EAAI6D,EAAE+I,QAC5BjE,EAAWrF,QAEZyR,EAAgBpM,EACZA,KAAa,IAEhBoM,EAAgBzR,OAChBqF,EAAWhF,EAAKE,EAAE8E,UAGnBO,EAAUjC,EAAKmO,QACZ3M,EAAUxB,EAAKmO,QAASlM,GACxBA,EAEHuL,EAASvL,EACL9G,GAAS0E,KAAUoN,EActB,IAXAS,EAAUG,EACPnR,EACSL,SAARwB,GAAqBnB,GACpB,GAAI6J,GAAKtE,EAAS,QAASvF,EAAMmD,EAAMG,EAAMnC,EAAK6D,EAAU8E,GACjEkH,EAAQ9Q,EAAEsR,GAAIH,EACVrR,GAAQA,EAAKE,EAAEC,SAElB6Q,EAAQ9Q,EAAEoE,KAAOjI,GAAOA,EAAI6D,EAAEoE,KAAOjI,EAErC2U,EAAQ3U,IAAMA,GAEVwD,EAAI,EAAGC,EAAIqD,EAAK9C,OAAQR,EAAIC,EAAGD,IAE/BkR,GACHF,EAAW1N,EAAKtD,IAEjBoR,EAAY,GAAIpH,GAAKiH,EAAQ,OAAQE,EAAS7N,EAAKtD,GAAIyD,GAAOnC,GAAO,GAAKtB,EAAGmF,EAAUgM,EAAQlK,SAC/FmK,EAAU/Q,EAAEiC,GAAK4O,EAEjBG,EAAa5N,EAAKxH,GAAGqH,EAAKtD,GAAIoR,EAAW7R,IACzCuR,GAAUK,EAAQ9Q,EAAE8E,SAAWgM,EAAQ9Q,EAAE8E,SAASkM,EAAYD,GAAaC,MAKxEH,IACHF,EAAW1N,GAEZ6N,EAAUG,EAAcnR,EAAO,GAAI6J,GAAKiH,EAAQ7E,GAAY,OAAQjM,EAAMmD,EAAMG,EAAMnC,EAAK6D,EAAU8E,GACrGkH,EAAQ9Q,EAAEiC,GAAK4O,EACfC,EAAQ3U,IAAMA,EACd2U,EAAQ9Q,EAAEsR,GAAKH,EACfV,GAAUrN,EAAKxH,GAAGqH,EAAM6N,EAAS5R,GAMlC,OAJI/C,KACH2U,EAAQvP,QAAUzE,EAAOwD,MACzBxD,EAAO0U,YAAcV,GAEfI,EAAgBA,EAAcT,EAAQK,GAAWL,EAUzD,QAASgB,GAAc9T,EAAGmC,EAAM4R,GAC/B,GAAI5T,GAAuB2B,SAAbiS,EACXhV,GAAYgV,GACXA,EAAS/E,KAAK7M,EAAKmD,KAAMtF,EAAGmC,GAC5B4R,GAAY,GACb,YAAc/T,EAAEG,SAASH,GAAK,GAKjC,OAHIoB,IAAa0E,SAA+FhE,UAAnFiS,EAAW3S,GAAa0E,QAAQkJ,KAAK7M,EAAKmD,KAAMtF,EAAG+T,GAAY5T,EAASgC,MACpGhC,EAAU4T,GAEJ5R,IAASA,EAAKoE,IAAMuF,GAAYC,KAAK5L,GAAWA,EAGxD,QAASY,GAAMZ,GACd,KAAM,IAAIoB,IAAKyS,IAAI7T,GAGpB,QAASuT,GAAYvT,GACpBY,EAAM,iBAAmBZ,GAG1B,QAASwO,GAAOF,EAAQhJ,EAAMwO,EAAYC,EAAaC,GAKtD,QAASC,GAAqBC,GAC7BA,GAASC,EACLD,GACHpL,EAAQyD,KAAK+B,EAAO8F,OAAOD,EAAKD,GAAOzF,QAAQ4F,GAAU,QAI3D,QAASC,GAAc7N,EAAS8N,GAC3B9N,IACHA,GAAW,KAEX8M,GACCgB,EACG,KAAOA,EAAQ,mBAAqB9N,EAAU,cAAgBA,EAC9D,2BAA6BA,GAAW,mBAAqB6H,IAInE,QAASkG,GAASC,EAAKC,EAAMjO,EAASf,EAAWiP,EAAO/I,EAAMgJ,EAASjL,EAAQkL,EAAOC,EAAOC,EAAYvS,IAmCpGoS,GAAWF,GAAQG,IAAUpO,GAAWkD,GAA+B,MAArBA,EAAOtC,WAAqByN,IACjFvB,EAAYkB,GAIT7I,IACH+I,EAAQ,IACRjP,EAAYwF,IAEb2J,EAAQA,GAASf,IAAeE,CAEhC,IAAIgB,GAAMC,EAAaC,EACtBC,GAAgBT,GAAQZ,SACxB5U,EAAQ,GACRgH,EAAO,GACPkP,EAAW,GACXC,EAAa,GACbC,EAAc,GACdC,EAAiB,GACjB5P,EAAU,GACV6P,EAAa,GAEbjB,GAASM,IAAUF,CAGpBlO,GAAUA,IAAYkD,EAASA,GAAU,QAASgL,GAClDV,EAAqBzR,GACrB2R,EAAM3R,EAAQiS,EAAIpS,OACduS,EACCa,GACH3M,EAAQyD,MAAM,IAAK,KAAO5C,EAAO8E,QAAQ,KAAM,UAAUA,QAAQiH,GAAiB,MAAQ,QAEjFjP,GACM,SAAZA,IACCkP,GAAYvW,KAAKuK,IACpB4J,EAAY,8CAEb4B,EAAeS,EAAQ,SACvBA,EAAQ,IAAMtH,EAAOuH,UAAUD,EAAQ,IAAKpT,GAC5CyS,EAAcW,EAAQ,KAAOA,EAAQ,IAAMrC,EAAY,eAAiBkB,GAExEmB,EAAUE,EAAMC,MAChBjN,EAAU8M,EAAQ,GAClBrB,GAAQ,GAEL5K,GAEHqM,EAAYrM,EAAO8E,QAAQ4F,GAAU,KAAMc,EAAc7P,EAAMwO,GAC7DrF,QAAQwH,GAAY,SAASxB,EAAKyB,EAASC,EAAUhT,EAAKiT,EAAUC,EAAUC,EAAKC,GA4BnF,MA3BY,UAARpT,IACHkT,EAAW,aAERE,IACHrB,EAAWA,GAAyB,MAAbqB,EAAM,IAE9BpT,EAAM,IAAMiT,EAAW,KACnBE,GACHpQ,GAAQiQ,EAAWE,EAAW,IAC9BhB,GAAc,IAAMkB,EAAQ,MAClBJ,GACVf,GAAYjS,EAAM,SAAWkT,EAAW,KAAOE,EAAQ,WAEvDhB,GAAkBpS,EAAM,IAAMoT,EAAQ,MAC5BL,EACVvQ,GAAW0Q,GAEM,YAAbD,IACHZ,GAAca,GAEE,eAAbD,IACHpB,EAAiB,UAAVuB,GAERrX,GAASiE,EAAMkT,EAAW,IAC1Bf,GAAenS,EAAM,IAAMoT,EAAQ,KACnCC,EAAcA,GAAerX,GAAaC,KAAKgX,IAEzC,KACL/O,MAAM,MAGP8N,GAAgBA,EAAa,IAChCA,EAAaY,MAGdU,GACEhQ,EACAf,KAAeqO,GAAeyC,GAAe,GAC7CjC,MACAmC,EAAYrB,IAA2B,MAAZ5O,EAAkB,WAAa,IAAK6O,EAAaC,GAC5EmB,EAAYxQ,IAAqB,MAAZO,EAAkB,QAAU,IAAKvH,EAAOkW,GAC7DzP,EACA6P,EACAR,EACAE,EACAC,GAAgB,GAElBrM,EAAQyD,KAAKkK,GACTlC,IACHuB,EAAMvJ,KAAKqJ,GACXA,EAAUa,EACVb,EAAQ,IAAMzB,EACdyB,EAAQ,IAAMX,IAELF,IACVT,EAAcS,IAAea,EAAQ,IAAMb,IAAea,EAAQ,KAAOb,EAAYa,EAAQ,IAC7FA,EAAQ,IAAMtH,EAAOuH,UAAUD,EAAQ,IAAKpT,GAC5CoT,EAAUE,EAAMC,OAEjBzB,GAAesB,GAAWb,GAC1BjM,EAAU8M,EAAQ,GAInB,GAAI/T,GAAG8Q,EAAQ8D,EAASD,EAAaG,EACpClB,EAAYxU,GAAawU,WAAanQ,GAAQA,EAAKmQ,WAC/ClU,GAAekU,aAAc,EACjCmB,KACAzC,EAAM,EACN2B,KACAhN,EAAU8N,EACVhB,GAAW,CAAC,CAACgB,EAgCd,IA9BInB,GAAanQ,EAAKuB,MACrBvB,EAAKmQ,UAAYA,GAUd3B,IACiBnS,SAAhBoS,IACHzF,EAASA,EAAOjH,MAAM,GAAI0M,EAAY1R,OAAS,GAAKtB,IAErDuN,EAASzN,GAAiByN,EAAStN,IAGpCsT,EAAcwB,EAAM,IAAMA,EAAM,GAAG,GAAGC,MAAM,IAE5CzH,EAAOG,QAAQtN,GAAMqT,GAErBP,EAAqB3F,EAAOjM,SAExB8R,EAAMyC,EAAOA,EAAOvU,OAAS,KAChCiS,EAAc,GAAKH,IAAQA,IAASA,EAAI,MAAQA,EAAI,KAAQA,EAAI,IAK7DL,EAAY,CAIf,IAHAnB,EAASkE,EAAUD,EAAQtI,EAAQwF,GACnC6C,KACA9U,EAAI+U,EAAOvU,OACJR,KACN8U,EAAS1R,QAAQ2R,EAAO/U,GAAG,GAE5BiV,GAASnE,EAAQgE,OAEjBhE,GAASkE,EAAUD,EAAQtR,EAE5B,OAAOqN,GAGR,QAASmE,GAAShZ,EAAIiZ,GACrB,GAAI5T,GAAK6T,EACRnV,EAAI,EACJC,EAAIiV,EAAS1U,MAGd,KAFAvE,EAAGwF,QACHxF,EAAGkZ,SACInV,EAAIC,EAAGD,IAAK,CAClB/D,EAAGkZ,MAAMzK,KAAKyK,EAAQD,EAASlV,GAC/B,KAAKsB,IAAO6T,GACC,WAAR7T,GAAoB6T,EAAM/S,eAAed,IAAQ6T,EAAM7T,GAAKd,SAAW2U,EAAM7T,GAAK8T,MACrFnZ,EAAGwF,KAAOxF,EAAGwF,KAAKmN,OAAOuG,EAAM7T,MAMnC,QAASuT,GAAYxQ,EAAMhH,EAAO8E,GACjC,OAAQkC,EAAKmB,MAAM,MAAQnI,EAAMmI,MAAM,MAAQrD,EAAIqD,MAAM,OAG1D,QAAS6P,GAAeC,EAAOzV,GAC9B,MAAO,QACHA,EACAA,EAAO,KACP,IACD,SAAWyV,EAAM,GAAK,gBAAkBA,EAAM,GAAK,KAClDA,EAAM,GAAK,aAAeA,EAAM,GAAK,IAAM,IAGhD,QAASnB,GAAYrM,EAAQwL,EAAc7P,EAAMwO,GAEhD,QAASsD,GAAY3C,EAAK4C,EAASC,EAAQpQ,EAAOtE,EAAM2U,EAAUC,EAAKC,EAAIC,EAAO1C,EAAM2C,EAAKC,EAAOC,EAASC,EAAMC,EAAMC,EAAOC,EAAUC,EAAMC,EAAO3V,EAAO4V,GAK7J,QAASC,GAAUC,EAASC,EAAKC,EAAQC,EAAQzW,EAAM0W,EAAcC,EAAYC,GAGhF,GAAIC,GAAqB,MAAXL,CACd,IAAIA,IACH5V,EAAOA,EAAKyE,MAAMkR,EAAIlW,QAClB,mBAAmBjD,KAAKwZ,GAAWhW,IACtC2Q,EAAY+E,GAERO,IACJP,GAAWtD,GACNlB,EAAa,GAAK,sBAAwB,OAC3C,KAEA2E,EACA,gBAAkBA,EAAS,KAC3BzW,EACC,OACA,SACDgT,EACA,iBAAmBlB,EAAa,GAAK,KAAO,uBAC5C,KAEA8E,GACCF,EACA,IAAMA,EACND,EACC,GACCzW,EAAO,GAAK,IAAMwW,IACjBG,GAAc,KACjBC,EAAYH,EAAS,GAAKzW,EAAO0W,GAAgB,GAAKF,EAAQ,KACnEF,GAAqBM,EAAY,IAAMA,EAAY,GAEnDN,EAAUC,GAA+B,cAAxBD,EAAQjR,MAAM,EAAG,GAC/BiR,EAAQjR,MAAM,GACdiR,IACAtD,GACElB,EAAa,IAAK,WAAa6D,EAAM,MAAM,KAC5C,KAGDhB,GAAU,CAEb,GADAmC,EAAkB,YAAVC,EAAuBC,EAAS7D,EAAa8D,OAAS9D,EAAa8D,WAAgBC,EAAOC,GAC9FC,EAAQP,GAAWC,EAAMA,EAAMzW,OAAO,IACzC,GAAI+W,EAAMC,MAAO,CAChB,KAAOD,EAAME,IACZF,EAAQA,EAAME,EAEXF,GAAM9S,MACT1D,EAAO,IAAMA,EAAKyE,MAAM,IAEzB+R,EAAME,GAAK1W,EACXwW,EAAM9S,IAAM8S,EAAM9S,KAAmB,MAAZ1D,EAAK,QAG/BkW,GAAMvM,KAAK3J,EAEZ2W,GAAUC,GAAchX,GAASqW,EAAU,EAAI,GAGjD,MAAOP,GAIJpR,IAAUuQ,IACb7U,EAAOsE,EAAQtE,GAEhB2U,EAAWA,GAAY,GACvBD,EAASA,GAAUD,GAAWQ,EAC9BjV,EAAOA,GAAQ8U,EAEX1C,IAASA,GAAQ,OAAO5V,KAAKgZ,EAAK5V,EAAM,OAC3CI,EAAOA,EAAKyE,MAAM,GAAGrE,MAAM,KAAKyW,KAAK,MAItC9B,EAAMA,GAAOO,GAAQ,EAErB,IAAIwB,GAAMC,EAAQb,EAAOM,EAAOQ,EAC/BC,EAAO,GAOR,IALY,MAARlC,IACHA,EAAM,UACNkC,EAAO,OAGJrC,GAAQsC,GAAWC,EAEhB,CACN,GAAIpD,GAAYsB,IAAa6B,IAAWC,GAGnCP,IACHE,EAAOH,EAAUC,EAAa,GAC1BpB,EAAK/V,OAAS,EAAIG,GAASkX,GAAQ,IAAI,CAE1C,GADAA,EAAOtB,EAAK/Q,MAAMqS,EAAMlX,EAAQiS,EAAIpS,QAChCsX,KAAW,EAId,GAHAb,EAAQE,GAAUgB,EAASR,EAAW,GAAGL,GAEzCC,EAAQN,EAAMA,EAAMzW,OAAO,GACvB+W,GAASA,EAAMa,IAAK,CACvB,KAAOb,EAAME,IAAMF,EAAME,GAAGW,KAC3Bb,EAAQA,EAAME,EAEfM,GAAQR,EAAME,IAAM1W,KAAMwW,EAAME,GAAIhT,IAAK8S,EAAM9S,SAE/CwS,GAAMvM,KAAKqN,GAAShX,KAAMkW,EAAM/C,OAGlCkC,GAAWnX,GAAiB,IAAM4Y,EAC/B,cACA3Y,GACH4Y,EAASO,EAAUjC,GACd0B,IACJO,EAAUjC,IAAY,EACtBiC,EAAUjC,GAAY0B,EAASnL,EAAOyJ,EAAU3S,GAAM,IAEnDqU,KAAW,GAAQC,IAEtBA,EAAMP,MAAQM,EACdC,EAAMK,IAAMf,EAAOC,GACnBS,EAAMtT,IAAMsT,EAAMtT,KAAOsT,EAAMhX,MAAQgX,EAAMhX,KAAKuX,QAAQ,MAAQ,GAKtE,MAAQL,IAEJA,GAAUhC,EAAOgC,EAASrF,EAAMoD,EAAU,KAC3CkC,GAEEA,GAAUhC,EAAOgC,EAAStF,EAAMoD,EAAU,MAG5CP,GACGiC,EAAUC,GAAchX,IAAS0W,EAASc,IAAWR,IAAeL,OAAS7B,GAC9E,KACAa,EACCqB,EACA,IAECY,EAAahC,EAAK/Q,MAAM+S,EAAY5X,IAAQuW,GAC3CA,EAAQsB,EAAYrB,GAAS,EAAO,MACrC,OAASoB,GAAcA,EAAa5X,EAAQiS,EAAIpS,OAAQsU,GAAYxB,EAAa5I,KAAK2M,EAAOC,OAAU,OAEzG1B,GAEE+B,GAAcjG,EAAY5J,GAASgN,GAAYxB,EAAaY,MAAOgD,EAAQ,IAAMnW,EAAMyX,EAAYnT,EAAOkT,EAAa5X,EAAQiS,EAAIpS,OACpIsU,IAAcA,EAAWuC,EAAOC,GAAKhE,EAAa4D,MAAcpC,EAASM,KAAO/P,GAAQtE,EAAO,KAC/FA,EAEEA,EAAKI,MAAM,KAAKyW,KAAK,KAAKhL,QAAQrN,GAAKkZ,MAAOjC,IAC7CV,GAECuB,EAASc,IAAWR,IAAeL,OAASoB,EAAOf,GAAcK,EAAMlC,GACxEJ,GAEFA,EAECA,EACAS,GAEGA,EAAQuC,EAAOf,IAAexB,EAAOuC,EAAOf,IAAc,EAAON,EAASc,IAAWR,GAAaxB,GAClGL,GACCuB,EAASc,IAAWR,GAAae,EAAOf,GAAcK,EAAMlC,GAC7D,KAEFC,GACE2C,EAAOf,IAAejG,EAAY5J,GAAS,KAC5C0N,EACC,IACCyC,EAAShC,EAAMiC,EAAShC,EAAM,MApF1CxE,EAAY5J,GA0Fd,GAAIoP,GAAOC,EAAQqB,EAClBN,EACAD,EAWAnH,EAVAgE,EAAWxB,GAAgBA,EAAa,GACxC+D,GAAUC,GAAIxC,GACdqD,GAAYQ,EAAGtB,GACfkB,EAAa,EACbF,GAAa5U,EAAOA,EAAKmG,MAAQkL,IAAaA,EAASlL,MAAQkL,EAASlL,aAAiBtD,GAAQ7C,KAAKmG,MAGtG+N,EAAa,EACbe,KACAhB,IAQD,OALkB,MAAd5P,EAAO,KACVA,EAASA,EAAO8E,QAAQgM,GAAe,MAExC9H,GAAUhJ,GAAUrE,EAAO,IAAM,KAAKmJ,QAAQrN,GAAKsZ,KAAMtD,IAEjDoC,GAAc7G,GAAUY,EAAY5J,GAG7C,QAASkN,GAAU8D,EAAKrV,EAAMwO,GAG7B,GAAIjS,GAAG+Y,EAAMnU,EAASf,EAAW1G,EAAQ6b,EAAQC,EAAYC,EAASC,EAASC,EAASC,EAAc/F,EAAcxL,EAAQwR,EAC3HC,EAAeC,EAAWC,EAAarN,EAAUsN,EAAYC,EAAa1S,EAASwF,EAAQmN,EAAYC,EAASC,EAAQC,EAAUC,EAClIlW,EAASmW,EAAUC,EAASrS,EAAYsS,EAAYC,EACpDC,EAAiB,EACjBtJ,EAAWzB,GAAqByB,UAAYtN,EAAKsN,UAAYtN,EAAKgD,MAAQhD,EAAK6W,WAAa7W,EAAKmO,SAAWnO,EAAK8W,WACjHC,EAAO,GACPC,KACAxa,EAAI6Y,EAAItY,MAgBT,KAdI,GAAKiD,IAASA,GACjB2I,EAAW6F,EAAa,cAAgBxO,EAAKmJ,QAAQ4F,GAAU,KAAKhN,MAAM,MAAS,IAAM/B,EACzFA,EAAO,IAEP2I,EAAW3I,EAAK2I,UAAY,UACxB3I,EAAKmQ,YACR6G,EAAY7G,WAAY,GAErBnQ,EAAKiX,QACRD,EAAYC,OAAQ,GAErBrB,EAAe5V,EAAKU,KACpBsV,EAAchW,EAAKsE,OAEf/H,EAAI,EAAGA,EAAIC,EAAGD,IAKlB,GAHA+Y,EAAOD,EAAI9Y,GAGP,GAAK+Y,IAASA,EAEjByB,GAAQ,OAASzB,EAAO,QAIxB,IADAnU,EAAUmU,EAAK,GACC,MAAZnU,EAEH4V,GAAQ,MAAQzB,EAAK,GAAK,gBACpB,CA4DN,GA3DAlV,EAAYkV,EAAK,GACjB9R,GAAWgL,GAAc8G,EAAK,GAC9B5b,EAASkY,EAAe0D,EAAK,GAAI,UAAY,KAAO1D,EAAevN,EAASiR,EAAK,IACjFmB,EAAUnB,EAAK,GACflR,EAAakR,EAAK,GACdA,EAAK,IACRoB,EAAa,yBACbC,EAAc,sCAEdD,EAAa,YACbC,EAAc,IAEf3N,EAASsM,EAAK,KAAOA,EAAK,IAAInM,QAAQiH,GAAiB,OACnDiG,EAAqB,SAAZlV,GACR0O,GACHA,EAAa5I,KAAKqO,EAAK,KAGxBjV,EAAUiV,EAAK,IAAM3Z,GAAaub,aAAc,GAAS,YACrDtB,IAAiB/F,EAAeyF,EAAK,MACxCzF,GAAgBA,GAChB+G,EAAiBhB,EAAa3O,KAAK,KAGrCqG,EAAWA,GAAYjJ,EAAO,IAAMA,EAAO,IAAMwL,GAAgB,iBAAiB/V,KAAKuK,EAAO,KAI1FiS,EAAuB,MAAZnV,GACVf,IACHe,EAAUf,IAAcwF,GAAO,IAAMxF,EAAYe,IAG9CqC,IAEHyS,EAAahN,EAAWD,EAAQgO,GAChCf,EAAWtN,SAAWA,EAAW,IAAMxH,EAEvC8U,EAAW3I,SAAW2I,EAAW3I,UAAYA,EAC7CiE,EAAU/N,EAASyS,GACnB3I,EAAW2I,EAAW3I,SACtB0I,EAAY/O,KAAKgP,IAGbI,IAEJH,EAAc/U,EACdmM,EAAWA,GAAYnM,KAAa0G,GAAM1G,KAAa0G,GAAM1G,GAASE,MAEtE+U,EAAUW,EACVA,EAAO,IAERZ,EAAad,EAAI9Y,EAAI,GACrB4Z,EAAaA,GAAgC,SAAlBA,EAAW,IAEvCK,EAAWnW,EAAU,iBAAmB,MACxCwV,EAAkB,GAClBC,EAAgB,GAEZQ,IAAazG,GAAgB4G,GAAWrW,GAAaA,IAAcwF,IAAQxB,GAAa,CAS3F,GAPAmS,EAAW,GAAI7K,UAAS,gBAAiB,MAAQ/C,EAAW,OAASiO,EAAkB,IAAMzV,EAC1FuV,EAAa,IAAMhd,EAAS,KAAOid,GACtCJ,EAAS9U,IAAMpB,EACfkW,EAASY,KAAOhW,EAChBoV,EAAS1V,MAAQgP,EACjB0G,EAAS5V,IAAMyD,EAEXoK,EACH,MAAO+H,EAGR/E,GAAS+E,EAAU1G,GACnBkG,EAAY,MAAQ3V,EAAY,UAChCuV,GAAU,EACVE,EAAkBE,EAAYa,EAAiB,IAC/Cd,EAAgB,IAgBjB,GAdAiB,GAAST,GACL9H,GAAcnO,EAAU,SAAW,IAAM,UAAYmW,IAAab,GACjEA,EAAUtZ,OAAWiR,EAAWoI,GAAU,EAAMK,GAAaQ,GAC3DX,EAAagB,EAAiB,GAAKL,EAAWK,GAChD,IAAMld,EAAS,KAAO,KACX,MAAZyH,GACEqU,GAAa,EAAM,KAAOnR,EAAO,GAAK,MACtCoR,GAAU,EAAM,OAASpR,EAAO,GAAK,cAAgBmK,EAAa,QAAU,UAG9E+G,GAAS,EAAM,oCACd/R,EAAUwS,EAAYjZ,OAAS,SAAW,IAC3CrD,EAAS,MAETwc,IAAgBC,EAAY,CAK/B,GAFAY,EAAO,IAAMA,EAAKhV,MAAM,MAAS,IACjCgU,EAAY,MAAQG,EAAc,eAC9B1H,GAAcqB,EAAc,CAU/B,GARAkH,EAAO,GAAIrL,UAAS,gBAAiB,OAAS/C,EAAW,IAAMiO,EAAiB,IAAMV,EAAcQ,EAAaK,EAC9GJ,GACHI,EAAKtV,IAAMpB,EACX0W,EAAKI,KAAOjB,EACRrG,GACH2B,EAASoE,EAAagB,EAAiB,GAAKG,EAAMlH,GAEnDkH,EAAKpW,IAAMyD,EACPoK,EACH,MAAOuI,EAERlB,GAAkBE,EAAYa,EAAiB,cAC/Cd,EAAgB,IAMjBiB,EAAOX,EAAUI,EAAWT,GAAalG,GAAgB+G,GAAkBG,GAAQ,IACnFlH,EAAe,EACfqG,EAAc,EAEX7V,IAAY8V,IACf7I,GAAW,EACXyJ,GAAQ,oBAAsBvI,EAAa,OAAS,MAAQqH,EAAkB,iBAAmBxV,EAAU,IAAMyV,EAAgB,MAAQtH,EAAa,GAAK,YAM/JuI,EAAO,MAAQpO,GACXqO,EAAYC,MAAQ,cAAgB,IACrC,WACC1B,EAAS,YAAc,KACvBG,EAAU,aAAe,KACzBF,EAAa,aAAe,KAC5BhH,GACE8G,EAAK,GACJ,OACA,IACC,MACH,WACFyB,GACCvI,EAAa,KAAO,iBAExB,KACCuI,EAAO,GAAIrL,UAAS,gBAAiBqL,GACpC,MAAOxc,GACR0T,EAAY,8BAAgC8I,EAAO,SAAWxc,EAAEG,SAASH,GAAK,KAM/E,MAJIyF,KACHA,EAAKxH,GAAKue,EACV/W,EAAKsN,WAAaA,GAEZyJ,EAQR,QAASvV,GAAUS,EAASmV,GAG3B,MAAOnV,IAAWA,IAAYmV,EAC1BA,EACAvc,EAAQA,KAAYuc,GAAgBnV,GACpCA,EACDmV,GAAiBvc,KAAYuc,GAGjC,QAASC,GAAetc,EAAQrB,GAG/B,GAAImE,GAAKlE,EACRsL,EAAMvL,EAAOuL,IACbqS,EAAWrS,GAAOA,EAAIqS,QAEvB,KAAKA,EAAU,CAEd,GADAA,WACWvc,KAAW4R,IAAUrT,GAAYyB,GAC3C,IAAK8C,IAAO9C,GACXpB,EAAOoB,EAAO8C,GACVA,IAAQ6M,KAAY3P,EAAO4D,eAAed,IAAUnE,EAAOE,MAAM2d,aAAgBnf,EAAEof,WAAW7d,IACjG2d,EAASrQ,MAAMpJ,IAAKA,EAAKlE,KAAMA,GAI9BsL,KACHA,EAAIqS,SAAWrS,EAAI+C,SAAWsP,GAGhC,MAAOG,GAAgBH,EAAU5d,GAGlC,QAAS+d,GAAgB3Z,EAAOpE,GAE/B,GAAIge,GAAQC,EAAOC,EAClB7e,EAAMW,EAAOX,IACba,EAAQF,EAAOE,MACfie,EAAane,EAAO2K,OAAOzK,MAC3Bke,EAASle,EAAMke,OACfC,EAAOne,EAAMme,KACbC,EAAaD,KAAS,EACtBE,EAAOrV,SAAShJ,EAAMqe,MACtBC,EAAUte,EAAMse,WAAe,CAEhC,KAAK/c,GAAS2C,GACb,MAAOA,EAuDR,IArDIka,GAAcD,GAAQ,GAAKA,IAASA,GAEvCL,EAAS5Z,EAAMmH,IAAI,SAASsH,EAAMhQ,GAEjC,MADAgQ,GAAOyL,EAAazL,EAAOnP,EAAcmP,EAAMwL,IACvCxb,EAAGA,EAAG4b,EAAG,GAAK5L,IAASA,EAAOA,EAAKN,cAAgBM,KAG5DmL,EAAOK,KAAK,SAASK,EAAGC,GACvB,MAAOD,GAAED,EAAIE,EAAEF,EAAID,EAAUE,EAAED,EAAIE,EAAEF,GAAKD,EAAU,IAGrDpa,EAAQ4Z,EAAOzS,IAAI,SAASsH,GAC3B,MAAOzO,GAAMyO,EAAKhQ,OAERwb,GAAQG,EAAU,KAAOnf,EAAIiM,UACxClH,EAAQA,EAAMiE,SAEXzI,GAAYye,KACfja,EAAQA,EAAMia,KAAK,WAClB,MAAOA,GAAK5e,MAAMO,EAAQN,cAGxB8e,EAAU,KAAOH,GAAQze,GAAYye,MACxCja,EAAQA,EAAMoa,WAGXpa,EAAMga,QAAUA,IACnBha,EAAQA,EAAMga,OAAOA,EAAQpe,GACzBA,EAAOX,IAAIuf,UACd5e,EAAOX,IAAIuf,SAAS5e,IAIlBme,EAAWU,SACdb,EAAUK,GAAQG,EAAU,EAAKpa,EAAQA,EAAMiE,QAC3ChJ,EAAIwf,OACPngB,EAAEoH,WAAWzG,EAAIwf,QAAQrN,QAAQwM,GAEjChe,EAAOuL,IAAIsT,OAASb,GAItBC,EAAQ/d,EAAM+d,MACdC,EAAMhe,EAAMge,KACRC,EAAWF,OAAmBtb,SAAVsb,GAAuBE,EAAWD,KAAevb,SAARub,KAChED,EAAQC,EAAM,GAEVjV,MAAMgV,IAAWhV,MAAMiV,KAC3BD,GAASA,GAAS,EAClBC,EAAcvb,SAARub,GAAqBA,EAAM9Z,EAAMf,OAASe,EAAMf,QAAU6a,EAEhE9Z,EAAQA,EAAMiE,MAAM4V,EAAOC,IAExBK,EAAO,EAAG,CAIb,IAHAN,EAAQ,EACRC,EAAM9Z,EAAMf,OACZ2a,KACOC,EAAMC,EAAKD,GAAOM,EACxBP,EAAOzQ,KAAKnJ,EAAM6Z,GAEnB7Z,GAAQ4Z,EAMT,MAJIG,GAAWW,OAASzf,EAAIyf,OAC3BvN,YAAYlS,EAAIyf,OAAOtN,QAAQpN,GAGzBA,EAWR,QAAS2a,GAAU5Y,EAAMoC,EAASgL,GACjC,GAAIyL,GAAW1f,KAAK2f,SAAW3f,KAAK,IAAMsC,EAAM,qBAC/C0E,EAAO0Y,EAASlQ,aAAaC,GAE9B,OAAOjE,GAAc+E,KAAKvJ,GAAQ5H,EAAEyH,KAAK6Y,GAAUhQ,KAAYxI,GAAWwY,GACzE7Y,EAAMoC,EAASgL,GAKjB,QAAS2L,GAAcC,GAEtB,MAAOC,IAAaD,KAAQC,GAAaD,GAAM,KAAOA,EAAGE,WAAW,GAAK,KAG1E,QAASC,GAAkBC,EAAOC,GAEjC,MAAOC,IAAkBD,IAAU,GAGpC,QAASE,GAAWC,GAEnB,MAAehd,SAARgd,EAAoBC,GAAQxf,KAAKuf,KAAU,GAAKA,GAAMlQ,QAAQoQ,GAAaX,IAAkBS,EAAO,GAG5G,QAASG,GAAWH,GAElB,MAAO,GAAKA,IAASA,EAAOA,EAAKlQ,QAAQsQ,GAAab,GAAiBS,EAGzE,QAASK,IAAaL,GAEpB,MAAO,GAAKA,IAASA,EAAOA,EAAKlQ,QAAQwQ,GAAeX,GAAqBK,EAtjF/E,GAAIO,IAAaxhB,KAAM,CAEvBA,GAAIA,GAAKA,EAAEI,GAAKJ,EAAID,EAAOE,MAE3B,IACCwhB,IAAche,GAAmBgH,GAASzH,GAAQsP,GAIlDpR,GAAa6B,GAAU+E,GAAYmG,GAAazH,GAAUiJ,GAAO/L,GAAMH,GAAckQ,GAAsB5P,GAC3GV,GAAgBC,GAAgBC,GAAiBC,GAAiBL,GAAUye,GAE5Etb,GARGub,GAAgB,SAEnB5a,GAAO,OAOP4P,GAAW,sBACXqB,GAAkB,YAClBhH,GAAgB,UAChBuH,GAAa,2EACbN,GAAc,QACdtE,GAAa,cACbiO,GAAc,iBACdV,GAAU,iBACVzf,GAAe,4BACfqM,GAAuB,0BACvBqT,GAAcS,GACdP,GAAc,SACdE,GAAgB,iBAChBxE,GAAgB,mBAChBrO,GAAS,EACTgS,IACCmB,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,KAAQ,OACRC,IAAK,QACLC,IAAK,QACLC,IAAK,QACLC,IAAK,SAENrB,IACCsB,IAAK,IACLC,GAAI,IACJ/c,GAAI,KAELiI,GAAO,OACP+G,GAAS,SACTlE,GAAW,gBACXC,GAAU,UACV1B,GAAW,8CACX2T,MAEAC,GAAMziB,EAAO0iB,SACbC,GAAUF,IAAOxiB,IAAMA,EAAEmM,OAEzBgD,IACCxE,UACCyJ,QAASzE,GAEVhP,KACCyT,QAAShF,GAEViD,WACC+B,QAAS7C,GAEVwJ,UACA/S,aA8/EF,IA1/EChF,IACC2f,QAAShB,GACTiB,KAEChG,MAAO,+GAGPI,KAAM,kPAGN7O,KAAMA,EACNgI,IAAK9T,EACLyO,OAAQA,EACRqB,MAAOmG,EACPrF,OAAQxQ,EACR2G,UAAWA,EACXyZ,UAAWhN,EACXvB,SACC3J,SAAU,SAASpI,EAAM4R,GACX,OAATA,QACIoO,IAAQhgB,GACLA,IACVggB,GAAQhgB,GAAQ4R,KAInBM,WAAYA,EACZqO,UACC/K,WAAW,GAEZgL,OAAQ3hB,EACR4hB,KAAM3hB,EACN4hB,IAAKhiB,EACL0H,IAAK,aACLua,MAAOnb,EACPgX,KAAM7U,EACNb,IAAKnG,EACLigB,KAAMlN,EACNxI,IAAK3L,EACLshB,IAAK,SAAStC,GAIb,MAHc,gBAAVA,GACHjL,EAAY,IAENiL,IAGTgC,UACCtf,WAAYZ,EACZygB,SAAU,SAAS3d,GAClB,MAAOA,IAEJjD,EAAQgR,GAAsB/N,GAC9BhC,GAAKqf,SACLlf,IAEC4P,KAGN5G,IAAKD,IA+ENvK,EAAaR,UAAY,GAAIyhB,QAAS1hB,YAAcS,EAqHrDwC,EAAe2K,QAAU,WACxB,OAAQ5O,KAAK8D,IAAI,QAAS,UAO3BK,EAASyK,QAAU,QA4mBnBrB,EAAKtM,WACJ6C,IAAKZ,EACLiB,SAAUA,EACVmG,OAAQ1F,EACRqC,OAAQkC,EACRuC,SAAU3E,EACV4b,OAAQve,EACRmE,IAAK,QA8nDNzF,GAAOV,GAAO4f,IACd/e,GAAiBb,GAAO8f,WAElBN,IAAOxiB,GAAKA,EAAEmM,QAAS,CAE5B,IAAKsV,KAAgBtS,IACpB6E,EAAcyN,GAActS,GAAUsS,IAiBvC,IAdAxT,GAAcjL,GAAO0b,WACrBlY,GAAWxD,GAAO+S,QAClBtG,GAAQzM,GAAO4H,KAEflH,GAAKiF,IAAI9G,WACRO,UAAWA,EACXoF,QAAS+B,EACT8C,QAASvC,EACToB,OAAQ1F,GAGTiF,GAAU/G,GAAK+G,QAAU,GAAI0D,GAGzBnO,GAOH,GAFAA,EAAEI,GAAG+L,OAASkU,EACd/N,GAAWtS,EAAEwjB,QACTxjB,EAAEoH,WAAY,CACjB,GAAIua,MAAmBA,GAAgB3hB,EAAEkE,MAAMye,SAE9C,KAAM,kCAAoChB,EAE3Clf,GAAQiB,GAAM1D,EAAEkE,MAAM0e,KACtB5f,GAAO6J,IAAM7M,EAAEkE,MAAM2I,SAOtB7M,MAEIwhB,KACHzhB,EAAO0iB,SAAWziB,GAKnBA,EAAEyjB,WAAazjB,EAAE0jB,UAAY1jB,EAAEoU,QAAU,WAAa,KAAM,kDAG5DpU,EAAEof,WAAa,SAASna,GACvB,MAAqB,kBAAPA,IAGfjF,EAAEwO,QAAUmV,MAAMnV,SAAW,SAASoV,GACrC,MAAmC,sBAAhB,SAAEzS,KAAKyS,IAG3BlgB,GAAKmgB,IAAM,SAASC,GACfA,IAAO9jB,IACVyC,EAAQqhB,EAAI9jB,GACZA,EAAI8jB,EACJ9jB,EAAEI,GAAG+L,OAASkU,QACPrgB,GAAEyiB,SACTnQ,GAAWtS,EAAEwjB,UAIfxjB,EAAEyiB,SAAWd,EAEdpe,IAAeG,GAAKof,SACpBvf,GAAawU,WAAY,EACzB7W,GAAclB,EAAEof,WAChBpf,EAAEmM,OAASoW,GACXviB,EAAEkE,MAAQlB,GACVhD,EAAEye,UAAY3W,GAAa9E,GAAOyb,SAElC,KAAKiD,KAAWne,IACfkR,EAAWiN,KAWX7d,GAAeib,UAAY,SAASA,GACpC,MAAqB7a,UAAd6a,EACJvb,GAAaub,WAEdvb,GAAaub,UAAYA,EACzBvb,GAAa0E,QAAU6W,EAAY,KAAOA,EACvC,WAAa,MAAOA,IACpB5d,GAAY4d,GACXA,EACA7a,OACJJ,OACA,GAEH4P,GAAuBlQ,GAAa8f,UACnCnO,UAAU,EACV6O,MAAM,GAKPtU,IACCuU,MACC7X,OAAQ,SAASpK,GAKhB,GAAIwM,GAAO3N,KACVU,EAASiN,EAAKjN,OACdZ,EAAO6N,EAAKvB,UAAUiX,OAASliB,IAAQT,EAAOkH,KAAK7D,SAAWrD,EAAOwD,OAClE,IACCyJ,EAAKvB,UAAUiX,MAAO,OACxB1V,EAAK2V,SAAW5iB,EAAOwD,OAE1B,OAAOpE,IAERgL,YAAY,EACZzC,MAAM,GAEPkb,OACCC,YAAaxX,EAAQyS,GACrB9S,KAAM,SAASxK,EAAKsiB,GACnB,GAAIjgB,GAAG9C,EAAQsW,EACdrJ,EAAO3N,KACPsI,EAAUqF,EAAKrF,OAEhB,KADA9E,EAAI8E,EAAQvE,OACLP,KACN9C,EAAS4H,EAAQ9E,GACjBwT,EAActW,EAAO2K,OAAOzK,MAC5BF,EAAO4L,WAAkCjJ,SAArB3C,EAAOE,MAAMge,KAAqBle,EAAOkH,KAAK7D,OAAS,EAEvErD,EAAO4L,cAAe,GAASnK,GAASzB,EAAOkH,KAAK,MAC9BvE,SAArB2T,EAAY+H,MAAsB/H,EAAY2H,OAAS3H,EAAY4H,KAAO5H,EAAYiI,MAAQjI,EAAY8H,QAAU9H,EAAYkI,WACpIxe,EAAOE,MAAMoL,QAAU2B,EAAK6V,cAI/BjY,OAAQ,SAASpK,GAGhB,GAAI2D,GAAyB8I,EAASrK,EAAWqb,EAAKK,EACrDtR,EAAO3N,KACPU,EAASiN,EAAKjN,OACdgjB,EAAQhjB,EAAO4L,cAAe,EAC9B1L,EAAQF,EAAOE,MACfkQ,EAAW4S,GAAShjB,EAAOkH,KAAK7D,OAChCsQ,EAAS,GACTgP,EAAO,CAER,KAAK1V,EAAKvB,UAAUiX,KAAM,CAGzB,GAFAve,EAAQgM,EAAU3P,EAAMT,EAAOgD,KAAKmD,KAEhC6c,EAKH,IAJAA,EAAQ9iB,EAAMse,QAAU,UAAY,OACpCN,GAAOhe,EAAMge,IACbK,GAAQre,EAAMqe,MAAQ,EACtBna,KACKvB,GAAK3C,EAAM+d,OAAS,GAAIC,EAAMrb,GAAK0b,EAAO,EAAG1b,GAAK0b,EACtDna,EAAM4e,GAAOngB,EAGDF,UAAVyB,IACH8I,EAAUzL,GAAS2C,GACnBuP,GAAU3T,EAAO6K,OAAOzG,GAAQgM,GAAWlQ,EAAMqT,aAGjDoP,GAAQzV,EAAU9I,EAAMf,OAAS,IAE9B4J,EAAKvB,UAAUiX,KAAOA,KACzB1V,EAAK2V,SAAW5iB,EAAOwD,OAIzB,MAAOmQ,IAERhM,MAAM,GAEPzH,OACC8N,QAAS,MACT1C,QAASA,EAAQqS,GACjB1S,KAAMnL,EACN6H,MAAM,GAEPsb,SACCtb,MAAM,GAEPub,KAECrY,OAAQrK,EACRmH,MAAM,GAEPwb,MAECtY,OAAQrK,EACRmH,MAAM,GAEPyb,IAAKle,GAASke,IAAMzW,GAAYyW,IAAM1iB,IAGvCiM,IACCC,KAAM8S,EACNnW,KAAMmW,EACN2D,OAAQvD,EACRwD,SAAUtD,GACVuD,IAAK,SAAS5D,GAEb,MAAehd,SAARgd,EAAoB6D,UAAU,GAAK7D,GAAiB,OAATA,EAAgBA,EAAO,MAY5E,MAPA1d,IAAeG,GAAKof,SACpB/f,IAAY/C,GAAGwiB,IAAKhU,QACpB3K,GAAeL,WAAW,KAAM,KAAM,KAElCkf,IACHF,GAAIte,MAAM0e,IAAIiB,IAAI7jB,GAEZA,GAAKwiB,IACTuC", + "file": "jsrender.min.js", + "sourcesContent": [ + "/*! JsRender v1.0.2: http://jsviews.com/#jsrender */\n/*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */\n/*\n * Best-of-breed templating in browser or on Node.js.\n * Does not require jQuery, or HTML DOM\n * Integrates with JsViews (http://jsviews.com/#jsviews)\n *\n * Copyright 2019, Boris Moore\n * Released under the MIT License.\n */\n\n//jshint -W018, -W041, -W120\n\n(function(factory, global) {\n\t// global var is the this object, which is window when running in the usual browser environment\n\tvar $ = global.jQuery;\n\n\tif (typeof exports === \"object\") { // CommonJS e.g. Browserify\n\t\tmodule.exports = $\n\t\t\t? factory(global, $)\n\t\t\t: function($) { // If no global jQuery, take optional jQuery passed as parameter: require('jsrender')(jQuery)\n\t\t\t\tif ($ && !$.fn) {\n\t\t\t\t\tthrow \"Provide jQuery or null\";\n\t\t\t\t}\n\t\t\t\treturn factory(global, $);\n\t\t\t};\n\t} else if (typeof define === \"function\" && define.amd) { // AMD script loader, e.g. RequireJS\n\t\tdefine(function() {\n\t\t\treturn factory(global);\n\t\t});\n\t} else { // Browser using plain + + + + + +
                                                                                                                                                                          +
                                                                                                                                                                          running tests
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          +

                                                                                                                                                                          Test Report

                                                                                                                                                                          +
                                                                                                                                                                          @(_app.name().capFirst())-@(_app.version().getVersion())
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/rythm/~test_async.html b/testapps/GHIssues/src/main/resources/rythm/~test_async.html new file mode 100644 index 000000000..c9bb1b6e2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/rythm/~test_async.html @@ -0,0 +1,225 @@ + + +@args String testId + + + + + + + + +
                                                                                                                                                                          +
                                                                                                                                                                          running tests
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          +

                                                                                                                                                                          Test Report

                                                                                                                                                                          +
                                                                                                                                                                          @(_app.name().capFirst())-@(_app.version().getVersion())
                                                                                                                                                                          +
                                                                                                                                                                          +
                                                                                                                                                                          + + + + \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml index 471b3ba8e..f510cf339 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml @@ -19,4 +19,4 @@ Scenario(1015): name: bar age: 2 invitor: - - exists: false \ No newline at end of file + - exists: true \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/928.yml b/testapps/GHIssues/src/main/resources/test/scenarios/928.yml index c79b69098..86c257e45 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/928.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/928.yml @@ -1,4 +1,5 @@ Scenario(928): + description: "`JPADao` injection error - it always inject the first `JPADao` instance" fixtures: - 928.yml interactions: From d2a7424d25bef6de530fc09333796edf03c9082f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 6 Apr 2019 05:43:29 +1100 Subject: [PATCH 413/730] fix unit test issue --- src/test/java/act/test/util/ScenarioManagerTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/act/test/util/ScenarioManagerTest.java b/src/test/java/act/test/util/ScenarioManagerTest.java index 29d37f15e..a97075a53 100644 --- a/src/test/java/act/test/util/ScenarioManagerTest.java +++ b/src/test/java/act/test/util/ScenarioManagerTest.java @@ -20,11 +20,15 @@ * #L% */ +import act.Act; +import act.metric.MetricPlugin; import act.test.*; import act.test.macro.Macro; import act.test.req_modifier.RequestModifier; import act.test.verifier.*; import org.junit.BeforeClass; +import org.mockito.Mockito; +import org.osgl.$; import org.osgl.http.H; import java.util.Map; @@ -42,6 +46,8 @@ public static void prepare() { Test.registerTypeConverters(); RequestModifier.registerModifiers(); Macro.registerActions(); + MetricPlugin metricPlugin = Mockito.mock(MetricPlugin.class); + $.setField("metricPlugin", Act.class, metricPlugin); } @org.junit.Test From 66357ce03815dff3e46eddb27610422037950433 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 6 Apr 2019 17:35:22 +1100 Subject: [PATCH 414/730] GH1105 - lots of fix in testing, ws notification, testing result presentation --- src/main/java/act/test/Interaction.java | 17 ++ src/main/java/act/test/Scenario.java | 83 +++++-- .../java/act/test/ScenarioDebugHelper.java | 26 +- src/main/java/act/test/Test.java | 30 ++- src/main/java/act/test/TestWsProgress.java | 66 +++++ .../java/act/test/util/ScenarioManager.java | 21 ++ src/main/java/act/util/ProgressGauge.java | 13 + .../java/act/util/SimpleProgressGauge.java | 20 ++ src/main/resources/aaa.authenticate.list | 3 +- src/main/resources/act.scan.list | 1 + .../resources/asset/~act/apibook/index.html | 26 +- .../asset/~act/img/external-link.png | Bin 0 -> 2236 bytes .../resources/asset/~act/img/gitee-issue.ico | Bin 0 -> 41566 bytes .../resources/asset/~act/img/gitee-issue.png | Bin 0 -> 535 bytes .../resources/asset/~act/img/github-issue.png | Bin 0 -> 5060 bytes .../resources/asset/~act/img/gitlab-issue.png | Bin 0 -> 2063 bytes .../resources/asset/~act/img/jira-issue.png | Bin 0 -> 5118 bytes .../asset/~act/img/test-failure-darker.png | Bin 0 -> 2147 bytes .../resources/asset/~act/img/test-failure.png | Bin 2147 -> 2971 bytes .../asset/~act/img/test-success-darker.png | Bin 0 -> 2147 bytes .../resources/asset/~act/img/test-success.png | Bin 2147 -> 4947 bytes src/main/resources/asset/~act/img/test.png | Bin 1822 -> 197 bytes .../resources/asset/~act/js/jquery.ext.js | 29 ++- src/main/resources/rythm/act/base.html | 2 +- .../resources/rythm/error/dev/errorPage.html | 8 +- src/main/resources/rythm/~test.html | 12 +- src/main/resources/rythm/~test_async.html | 46 ++-- testapps/GHIssues/pom.xml | 5 + .../main/java/ghissues/BaseController.java | 3 + .../GHIssues/src/main/java/ghissues/User.java | 15 ++ .../src/main/resources/conf/app.properties | 5 +- .../src/main/resources/rythm/~test_async.html | 225 ------------------ 32 files changed, 347 insertions(+), 309 deletions(-) create mode 100644 src/main/java/act/test/TestWsProgress.java create mode 100644 src/main/resources/asset/~act/img/external-link.png create mode 100644 src/main/resources/asset/~act/img/gitee-issue.ico create mode 100644 src/main/resources/asset/~act/img/gitee-issue.png create mode 100644 src/main/resources/asset/~act/img/github-issue.png create mode 100644 src/main/resources/asset/~act/img/gitlab-issue.png create mode 100644 src/main/resources/asset/~act/img/jira-issue.png create mode 100644 src/main/resources/asset/~act/img/test-failure-darker.png create mode 100644 src/main/resources/asset/~act/img/test-success-darker.png create mode 100644 testapps/GHIssues/src/main/java/ghissues/User.java delete mode 100644 testapps/GHIssues/src/main/resources/rythm/~test_async.html diff --git a/src/main/java/act/test/Interaction.java b/src/main/java/act/test/Interaction.java index e662aa20e..fc8f82545 100644 --- a/src/main/java/act/test/Interaction.java +++ b/src/main/java/act/test/Interaction.java @@ -28,6 +28,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import okhttp3.Response; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.select.Elements; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; import org.osgl.util.E; @@ -185,6 +188,20 @@ private void verifyStatus(Response resp) { // ignore } } + if (msg.contains("")) { + Document doc = Jsoup.parse(msg, S.concat("http://localhost:", Scenario.get().port(), "/")); + Elements elements = doc.select(".error-message"); + if (elements.hasText()) { + msg = elements.text(); + } else { + elements = doc.select("h1"); + if (elements.hasText()) { + msg = doc.text(); + } else { + msg = doc.title(); + } + } + } error("Status verification failure. Expected: successful, Found: %s, Error message: %s", status, msg); } catch (IOException e) { error("Status verification failure. Expected: successful, Found: %s", status); diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 88a18a684..19451a90d 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -22,6 +22,7 @@ import static act.test.TestStatus.PENDING; import static act.test.util.ErrorMessage.*; +import static act.util.ProgressGauge.PAYLOAD_MESSAGE; import static org.osgl.http.H.Header.Names.ACCEPT; import static org.osgl.http.H.Header.Names.X_REQUESTED_WITH; import static org.osgl.http.H.Method.POST; @@ -37,6 +38,7 @@ import act.test.req_modifier.RequestModifier; import act.test.util.*; import act.test.verifier.Verifier; +import act.util.ProgressGauge; import com.alibaba.fastjson.*; import okhttp3.*; import org.jsoup.Jsoup; @@ -306,6 +308,7 @@ private String verifyXmlBody(Object xmlBody) { public String refId; public String description; public String issueUrl; + public String issueUrlIcon; public boolean ignore = false; public List fixtures = new ArrayList<>(); public Object generateTestData; @@ -345,6 +348,10 @@ public String toString() { return buf.toString(); } + public int port() { + return port; + } + public String title() { S.Buffer buf = S.buffer("[").a(name).a("]"); if (S.notBlank(description)) { @@ -445,20 +452,31 @@ private Object evalFunc(String funcExpr) { return func.apply(); } - public void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager) { - start(scenarioManager, requestTemplateManager, true); + public void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, ProgressGauge gauge) { + start(scenarioManager, requestTemplateManager, true, gauge); } - private void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, boolean reset) { + private void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, boolean reset, ProgressGauge gauge) { this.scenarioManager = $.requireNotNull(scenarioManager); this.requestTemplateManager = $.requireNotNull(requestTemplateManager); this.status = PENDING; current.set(this); - validate(this); + gauge.setPayload(PAYLOAD_MESSAGE, title()); + gauge.incrMaxHint(); + try { + validate(this); + } finally { + gauge.step(); + } if (null == http) { - prepareHttp(); + gauge.incrMaxHint(); + try { + prepareHttp(); + } finally { + gauge.step(); + } } - boolean pass = (!reset || reset()) && run(); + boolean pass = (!reset || reset(gauge)) && run(gauge); this.status = TestStatus.of(pass); if (TestStatus.FAIL == this.status) { for (Interaction interaction : this.interactions) { @@ -587,9 +605,10 @@ private void prepareHttp() { .build(); } - private boolean reset() { + private boolean reset(ProgressGauge gauge) { Timer timer = metric.startTimer("reset"); try { + gauge.incrMaxHint(); errorMessage = null; clearSession(); if (depends.isEmpty()) { @@ -597,44 +616,50 @@ private boolean reset() { } return createFixtures() && generateTestData(); } finally { + gauge.step(); timer.stop(); } } - private boolean run(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager) { + private boolean run(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, ProgressGauge gauge) { if (null == this.scenarioManager) { - this.start(scenarioManager, requestTemplateManager, false); + this.start(scenarioManager, requestTemplateManager, false, gauge); return this.status.pass(); } else { - return run(); + return run(gauge); } } - private boolean run() { + private boolean run(ProgressGauge gauge) { if (status.finished()) { return status.pass(); } Timer timer = metric.startTimer("run"); try { - return runDependents() && runInteractions(); + return runDependents(gauge) && runInteractions(gauge); } finally { timer.stop(); } } - private boolean runDependents() { + private boolean runDependents(ProgressGauge gauge) { + gauge.incrMaxHintBy(depends.size()); for (String dependent : depends) { - Scenario scenario = scenarioManager.get(dependent); - errorIf(null == scenario, "Dependent not found: " + dependent); - Scenario old = current.get(); try { - if (!scenario.run(scenarioManager, requestTemplateManager)) { - errorMessage = "dependency failure: " + dependent; - return false; + Scenario scenario = scenarioManager.get(dependent); + errorIf(null == scenario, "Dependent not found: " + dependent); + Scenario old = current.get(); + try { + if (!scenario.run(scenarioManager, requestTemplateManager, gauge)) { + errorMessage = "dependency failure: " + dependent; + return false; + } + inheritFrom(scenario); + } finally { + current.set(old); } - inheritFrom(scenario); } finally { - current.set(old); + gauge.step(); } } return true; @@ -650,12 +675,18 @@ private void inheritFrom(Scenario dependent) { constants.putAll(map); } - private boolean runInteractions() { + private boolean runInteractions(ProgressGauge gauge) { + gauge.incrMaxHintBy(interactions.size()); for (Interaction interaction : interactions) { - boolean pass = run(interaction); - if (!pass) { - //errorMessage = S.fmt("interaction[%s] failure", interaction.description); - return false; + try { + gauge.setPayload(PAYLOAD_MESSAGE, interaction.description); + boolean pass = run(interaction); + if (!pass) { + //errorMessage = S.fmt("interaction[%s] failure", interaction.description); + return false; + } + } finally { + gauge.step(); } } return true; diff --git a/src/main/java/act/test/ScenarioDebugHelper.java b/src/main/java/act/test/ScenarioDebugHelper.java index c88ad4b9c..4a90639f8 100644 --- a/src/main/java/act/test/ScenarioDebugHelper.java +++ b/src/main/java/act/test/ScenarioDebugHelper.java @@ -116,16 +116,31 @@ public void prepareAuthentication(ActionContext context) { @Inject private Test test; - @GetAction({"e2e/{testId}", "test/{testId}", "tests/{testId}"}) - public Result testForm(String testId, ActionContext context) { + @GetAction({"e2e", "test", "tests"}) + public Result testForm(ActionContext context) { context.templatePath("/~test_async.html"); - return render(testId); + return render(); } - @PostAction({"e2e/{testId}", "test/{testId}", "tests/{testId}"}) + @PostAction({"e2e", "test", "tests"}) @PropertySpec("name, ignore, source, status, issueUrl, title, errorMessage, interactions.status, interactions.description, interactions.stackTrace, interactions.errorMessage") @Async - public List run(App app, Keyword testId, ActionContext context, ProgressGauge gauge) { + public List run(App app, ActionContext context, ProgressGauge gauge) { + List results = test.run(app, null, false, gauge); + boolean failure = false; + for (Scenario scenario : results) { + if (!scenario.ignore && !scenario.status.pass()) { + failure = true; + break; + } + } + context.renderArg("failure", failure); + gauge.markAsDone(); + return results; + } + + @GetAction({"e2e/{testId}", "test/{testId}", "tests/{testId}"}) + public List runTest(App app, Keyword testId, ActionContext context, ProgressGauge gauge) { if (context.accept() == H.Format.HTML) { context.templatePath("/~test.html"); } @@ -141,5 +156,4 @@ public List run(App app, Keyword testId, ActionContext context, Progre gauge.markAsDone(); return results; } - } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 1d5b0b653..2dea1685c 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -42,12 +42,18 @@ import act.test.util.*; import act.test.verifier.Verifier; import act.util.*; +import act.ws.WebSocketConnectionListener; +import act.ws.WebSocketConnectionManager; +import act.ws.WebSocketContext; +import act.ws.WsEndpoint; +import com.alibaba.fastjson.JSON; import me.tongfei.progressbar.ProgressBar; import me.tongfei.progressbar.ProgressBarStyle; import org.fusesource.jansi.Ansi; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.mvc.annotation.DeleteAction; +import org.osgl.mvc.annotation.GetAction; import org.osgl.mvc.annotation.PostAction; import org.osgl.util.*; import org.xnio.streams.WriterOutputStream; @@ -61,6 +67,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import javax.inject.Inject; +import static java.util.concurrent.TimeUnit.MILLISECONDS; + @Env.RequireMode(Act.Mode.DEV) @Stateless public class Test extends LogSupport { @@ -102,6 +110,12 @@ public static String get(String name) { @Inject private JobManager jobManager; + @NoBind + private List result; + + @NoBind + public ProgressGauge gauge; + /** * Load fixture data for testing. * @@ -267,12 +281,20 @@ public static boolean shallRunAutomatedTest(App app) { return $.bool(app.config().get("test.run")) || $.bool(app.config().get("e2e.run")) || "test".equalsIgnoreCase(Act.profile()) || "e2e".equalsIgnoreCase(Act.profile()); } + @GetAction("test/result") + @PropertySpec("name, ignore, source, status, issueUrl, issueUrlIcon, title, errorMessage, interactions.status, interactions.description, interactions.stackTrace, interactions.errorMessage") + public List result() { + return result; + } + public List run(App app, Keyword testId, boolean shutdownApp, ProgressGauge gauge) { E.illegalStateIf(inProgress()); info("Start running test scenarios\n"); int exitCode = 0; EventBus eventBus = app.eventBus(); STARTED.set(true); + this.result = C.list(); + this.gauge = gauge; try { eventBus.trigger(TestStart.INSTANCE); app.captchaManager().disable(); @@ -298,12 +320,12 @@ public List run(App app, Keyword testId, boolean shutdownApp, Progress if (null != testId && $.ne(testId, Keyword.of(scenario.name))) { continue; } - gauge.setPayload("scenario", scenario.title()); if (null != testId) { scenario.ignore = false; - } else if (!scenario.ignore) { + } + if (!scenario.ignore) { try { - scenario.start(scenarioManager, requestTemplateManager); + scenario.start(scenarioManager, requestTemplateManager, gauge); if (!scenario.status.pass()) { gauge.setPayload("failed", true); } @@ -365,11 +387,13 @@ public List run(App app, Keyword testId, boolean shutdownApp, Progress info("================================================================================"); info(""); } + this.result = list; return list; } catch (Exception e) { exitCode = -1; throw e; } finally { + this.gauge = null; STARTED.set(false); if (shutdownApp) { app.shutdown(exitCode); diff --git a/src/main/java/act/test/TestWsProgress.java b/src/main/java/act/test/TestWsProgress.java new file mode 100644 index 000000000..34a5a15e1 --- /dev/null +++ b/src/main/java/act/test/TestWsProgress.java @@ -0,0 +1,66 @@ +package act.test; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.job.JobManager; +import act.util.ProgressGauge; +import act.ws.WebSocketConnectionListener; +import act.ws.WebSocketContext; +import act.ws.WsEndpoint; +import com.alibaba.fastjson.JSON; +import org.osgl.util.E; + +import javax.inject.Inject; + +import static java.util.concurrent.TimeUnit.MILLISECONDS; + +@WsEndpoint("/~/ws/test/progress") +public class TestWsProgress implements WebSocketConnectionListener { + + @Inject + private Test test; + + @Inject + private JobManager jobManager; + + @Override + public void onConnect(final WebSocketContext context) { + E.illegalStateIfNot(Test.inProgress() || test.gauge.isDone()); + test.gauge.addListener(new ProgressGauge.Listener() { + @Override + public void onUpdate(ProgressGauge progressGauge) { + context.send(JSON.toJSONString(progressGauge)); + if (progressGauge.isDone()) { + jobManager.delay(new Runnable() { + @Override + public void run() { + context.connection().close(); + } + }, 100, MILLISECONDS); + } + } + }); + } + + @Override + public void onClose(WebSocketContext context) { + } +} diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index 53dc256c6..0a75c0ce2 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -50,6 +50,7 @@ public class ScenarioManager extends YamlLoader { private String urlContext; private String issueUrlTemplate; + private String issueUrlIcon = "external-link"; public ScenarioManager() { super("act.test"); @@ -91,6 +92,23 @@ private void configure() { AppConfig config = app.config(); urlContext = config.get("test.urlContext"); issueUrlTemplate = config.get("test.issueUrlTemplate"); + if (S.notBlank(issueUrlTemplate)) { + issueUrlIcon = inferIssueUrlIcon(issueUrlTemplate); + } + } + + private String inferIssueUrlIcon(String issueUrl) { + String issueUrlIcon = "external-link"; + if (issueUrl.contains("github")) { + issueUrlIcon = "github-issue"; + } else if (issueUrl.contains("jira") || issueUrl.contains("/browse/")) { + issueUrlIcon = "jira-issue"; + } else if (issueUrl.contains("gitlab")) { + issueUrlIcon = "gitlab-issue"; + } else if (issueUrl.contains("gitee") || issueUrl.contains("oschina")) { + issueUrlIcon = "gitee-issue"; + } + return issueUrlIcon; } private void loadDefault() { @@ -206,6 +224,9 @@ private void parseOne(String content, String fileName) { } if (S.blank(scenario.issueUrl) && S.notBlank(issueUrlTemplate)) { scenario.issueUrl = S.fmt(issueUrlTemplate, key); + scenario.issueUrlIcon = issueUrlIcon; + } else if (S.notBlank(scenario.issueUrl)) { + scenario.issueUrlIcon = inferIssueUrlIcon(scenario.issueUrl); } } } diff --git a/src/main/java/act/util/ProgressGauge.java b/src/main/java/act/util/ProgressGauge.java index c2aa95d67..aee2dd1d2 100644 --- a/src/main/java/act/util/ProgressGauge.java +++ b/src/main/java/act/util/ProgressGauge.java @@ -27,6 +27,8 @@ */ public interface ProgressGauge { + String PAYLOAD_MESSAGE = "message"; + /** * Set ID to the gauge * @@ -53,6 +55,17 @@ public interface ProgressGauge { */ void updateMaxHint(int maxHint); + /** + * Increment max hint by 1. + */ + void incrMaxHint(); + + /** + * Increment max hint by number specified + * @param number the number to be add up to max hint + */ + void incrMaxHintBy(int number); + /** * Advances the progress by one step */ diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java index 69c38dbb1..794eef420 100644 --- a/src/main/java/act/util/SimpleProgressGauge.java +++ b/src/main/java/act/util/SimpleProgressGauge.java @@ -44,6 +44,16 @@ public void updateMaxHint(int maxHint) { E.unsupport(); } + @Override + public void incrMaxHint() { + E.unsupport(); + } + + @Override + public void incrMaxHintBy(int number) { + E.unsupport(); + } + @Override public void step() { E.unsupport(); @@ -129,6 +139,16 @@ public void updateMaxHint(int maxHint) { } } + @Override + public void incrMaxHint() { + this.maxHint++; + } + + @Override + public void incrMaxHintBy(int number) { + this.maxHint += number; + } + @Override public void step() { if (null != delegate) { diff --git a/src/main/resources/aaa.authenticate.list b/src/main/resources/aaa.authenticate.list index 88255e723..7d5107ed9 100644 --- a/src/main/resources/aaa.authenticate.list +++ b/src/main/resources/aaa.authenticate.list @@ -9,4 +9,5 @@ [dev]-act.apidoc. [dev]-act.Info [dev]-act.i18n. -[dev]-act.job. \ No newline at end of file +[dev]-act.job. +[dev]-act.test. \ No newline at end of file diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index 21aefcddc..be17ced32 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -10,6 +10,7 @@ act.controller.captcha.CaptchaService act.db.DbBind act.db.util.Page act.test.Test +act.test.TestWsProgress act.test.inbox.Inbox act.test.ScenarioDebugHelper act.test.ScenarioDebugHelper$LoadFixtures diff --git a/src/main/resources/asset/~act/apibook/index.html b/src/main/resources/asset/~act/apibook/index.html index 7dc57a7f8..70e8280ca 100644 --- a/src/main/resources/asset/~act/apibook/index.html +++ b/src/main/resources/asset/~act/apibook/index.html @@ -3,8 +3,8 @@ apibook - { appName } - - + + @render(moreStyles) - - - - + + + + }
                                                                                                                                                                          diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html
                                                                                                                                                                          index 38cee2178..4bcc8ebe7 100644
                                                                                                                                                                          --- a/src/main/resources/rythm/~test.html
                                                                                                                                                                          +++ b/src/main/resources/rythm/~test.html
                                                                                                                                                                          @@ -6,17 +6,17 @@
                                                                                                                                                                           
                                                                                                                                                                             
                                                                                                                                                                             @ifNot(failure) {
                                                                                                                                                                          -  
                                                                                                                                                                          +  
                                                                                                                                                                             } else {
                                                                                                                                                                          -  
                                                                                                                                                                          +  
                                                                                                                                                                             }
                                                                                                                                                                          -  
                                                                                                                                                                          +  
                                                                                                                                                                             
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          running tests
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          -

                                                                                                                                                                          Test Report

                                                                                                                                                                          -
                                                                                                                                                                          @(_app.name().capFirst())-@(_app.version().getVersion())
                                                                                                                                                                          -
                                                                                                                                                                          -
                                                                                                                                                                          - - - - \ No newline at end of file From 85b5d76eb884010bb4165f947d4b2c4384e7c728 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 6 Apr 2019 20:53:52 +1100 Subject: [PATCH 415/730] further improvement on testing page --- pom.xml | 2 ++ src/main/java/act/test/Scenario.java | 4 ++-- src/main/java/act/test/Test.java | 8 +++++-- .../java/act/util/SimpleProgressGauge.java | 4 +++- .../resources/asset/~act/img/test-failure.ico | Bin 0 -> 10462 bytes .../resources/asset/~act/img/test-success.ico | Bin 0 -> 10462 bytes src/main/resources/asset/~act/img/test.png | Bin 197 -> 0 bytes src/main/resources/asset/~act/img/testing.ico | Bin 0 -> 104779 bytes src/main/resources/rythm/~test.html | 4 ++-- src/main/resources/rythm/~test_async.html | 22 ++++++++++++------ .../act/test/util/ScenarioManagerTest.java | 2 +- 11 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 src/main/resources/asset/~act/img/test-failure.ico create mode 100644 src/main/resources/asset/~act/img/test-success.ico delete mode 100644 src/main/resources/asset/~act/img/test.png create mode 100644 src/main/resources/asset/~act/img/testing.ico diff --git a/pom.xml b/pom.xml index c272a9583..00a503fce 100644 --- a/pom.xml +++ b/pom.xml @@ -109,6 +109,7 @@ **/*.yml **/*.yaml **/*.tag + **/*.svg rythm/** *.flf @@ -128,6 +129,7 @@ **/*.ppt **/*.pptx **/*.pdf + **/*.ico diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 19451a90d..e14233597 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -461,7 +461,7 @@ private void start(ScenarioManager scenarioManager, RequestTemplateManager reque this.requestTemplateManager = $.requireNotNull(requestTemplateManager); this.status = PENDING; current.set(this); - gauge.setPayload(PAYLOAD_MESSAGE, title()); + gauge.setPayload(Test.PG_PAYLOAD_SCENARIO, title()); gauge.incrMaxHint(); try { validate(this); @@ -679,7 +679,7 @@ private boolean runInteractions(ProgressGauge gauge) { gauge.incrMaxHintBy(interactions.size()); for (Interaction interaction : interactions) { try { - gauge.setPayload(PAYLOAD_MESSAGE, interaction.description); + gauge.setPayload(Test.PG_PAYLOAD_INTERACTION, interaction.description); boolean pass = run(interaction); if (!pass) { //errorMessage = S.fmt("interaction[%s] failure", interaction.description); diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 2dea1685c..eb1a965ef 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -73,6 +73,10 @@ @Stateless public class Test extends LogSupport { + public static final String PG_PAYLOAD_SCENARIO = "scenario"; + public static final String PG_PAYLOAD_INTERACTION = "interaction"; + public static final String PG_PAYLOAD_FAILED = "failed"; + private static final AtomicBoolean STARTED = new AtomicBoolean(false); /** @@ -327,10 +331,10 @@ public List run(App app, Keyword testId, boolean shutdownApp, Progress try { scenario.start(scenarioManager, requestTemplateManager, gauge); if (!scenario.status.pass()) { - gauge.setPayload("failed", true); + gauge.setPayload(PG_PAYLOAD_FAILED, true); } } catch (Exception e) { - gauge.setPayload("failed", true); + gauge.setPayload(PG_PAYLOAD_FAILED, true); String message = e.getMessage(); scenario.errorMessage = S.blank(message) ? e.getClass().getName() : message; scenario.cause = e.getCause(); diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java index 794eef420..594045a4e 100644 --- a/src/main/java/act/util/SimpleProgressGauge.java +++ b/src/main/java/act/util/SimpleProgressGauge.java @@ -81,6 +81,7 @@ public void markAsDone() { }; private String id; + private boolean markedAsDown; private int maxHint; private int currentSteps; private String error; @@ -242,7 +243,8 @@ public void fail(String error) { @Override public void markAsDone() { - if (!isDone()) { + if (!markedAsDown) { + markedAsDown = true; stepTo(maxHint); } } diff --git a/src/main/resources/asset/~act/img/test-failure.ico b/src/main/resources/asset/~act/img/test-failure.ico new file mode 100644 index 0000000000000000000000000000000000000000..a8a986993ec9366f9e7b15720a955efac4093a29 GIT binary patch literal 10462 zcmeHNNpBoQ6fVo4IRJ9l5g-MLEhi570}}~}Eilu|bOa$07Zec|i5uJ;VGsiTMFau^ zQG`%{8^Z+xvcs837~e=j(p_VdXbv-OzSmu4SJzZm_jI}w6wO#Yue$0j-+Q&asxf18 z_}jae;rk(WdJkjwFvdU_s@SV|sGdH%9%t;~C( zlH-TVjvxJqXGJ_HqYiCuFY;V>gxz`KPfF8PcdkN@oY;Tw(< z?J8la5f;MV_4$XuJSd6V=HI~e_y<7{E;Ir*N2%jQhk^Zk4fr#@AufM+z3^a;+1jdu z;KHpK|DP4$-|Y7I_gz2y7?@snd*RFUBxOJR1mo`q$Zrv8u*= z|Kc9#{nn%#b$`_5OFEXKRf8Sw_IOYgzb=Qd_abbV){K=p##q;jJ~jBTb~SyV`yk&% z-~45;cUo7=$FhG zqcyq8{v!6c?E3EUo^G?LcQIcw_Gz!2#$K9hOw75HMLIn1(t|}jvb_v1#)7_%@o93H zG+)Z(Nh9AMJSs7msMF(5!tQ14^>3Tn)jHxycp;t!*%GW!edr#fHWJM8?b&5JMd zc&T3aaAjM@;*0P>j+ZMWYt^0Zm6AWE+|tG`+i2ebo=o2Ax|g1j?K-9Lk;GQda}B;| zK1ghrZDUOA`;wRFxJ=GZd)szgQ*0ai_Qf~p_|^9ue2Cr77%Ri0>Xc>5VSq==$G9)s z^C;G-_p^TR@A7!ndK*q#o2nzPEON`8KJlXW@_1!E<$D=Fdf`X1t%&C0)yEvYD}7a@ z7iTTx$?CcjE*Hy0KdCa%@mi6L+Fr_+DSRN^v_`3zV56_vG?l@h$<68PVB)jY*?d7< z-nGe^+6?*8s)FSIb2lp| z))%U`w3X3K=lzUs+<_Iz;U3{YMh0iJ|Jy#;Es=Md@{+DUcskGjrt=cIyU^k~rhCgg zJZe4Ue#^?*_njv5#EJQedrK9ot&H*fR@RSb)CmTUSY;Z>+v)5H93vGA-J{xYsBPjL zwV}$Rd_v_hm2G*e&R>R??vykP1Hz{3vb{UVt27-k^m;a#I@=8EO-yI)X>A0-;12k4 zLGvXn8eh}eG4YG>#5LRJr|k==8+-dJnl8$n|7`N!hjhcn+Js%)jZ0irDAwxFCv=i8 z1@pd&ExH3R`hdIfD*99z#OF5X{@vh9Sm%79y$v?>u|)lUhVEunOjXO!b072>@2OFL z;%fRv^ubB!**Wj+l+V%~c~#sdIpK?`U&ubz`0xwb_lt5E(oH;A51)n1aw==|VYO}_ zq+c|~a^{N~OYA%RRJv}5N9kUc9$-G2)}hUh^u0-ykLhl_uCXMso2XdF^fftyC1;%2 zd6N6&@Q}%7Q+3JylJ1q(*p~EXklZI<=ihBbK1R8v@hqF;%NFEtZ;9WmuOog_Kc_iA zKS1~5l&6X_a{7M&xZ_Cbk~SU$!RFm29kaSw1ZEMaKLT;`>9c&gJ{QN-&RCo1h_MBt zL&jP}*YW>$MEk8FzF2&$9kWGHNc7vFkX{GfnvY|?yU#|gI36y5F2wN&bhtYjZ?%a2 zGE8WDi7(=vx98T|^F)vJ7m1S2C8EHSP(Gj1VJk~zz2p;eQjgF(6n3`l3LFxb#3^x0 dKeqjneoDV(9AsQ%oMhZ$8ApmVFeRT!`XA&qSepO< literal 0 HcmV?d00001 diff --git a/src/main/resources/asset/~act/img/test-success.ico b/src/main/resources/asset/~act/img/test-success.ico new file mode 100644 index 0000000000000000000000000000000000000000..63adcb609f41dee0789d1aa039419eeaac640721 GIT binary patch literal 10462 zcmeHN-K!f#6rU0$ib^VK{Qyb*?t}Pn!RI_F`XpMeieD7DW@kUr-hxOUN)v1q@vjgB zs}&L9+BUme5B_|`fPuMu?HUWFRx+owXnd#0&}xKv)8=c za`Ct!_76{tmEQ%!oUU-;ma6-h5gve;L^SEC9dC?E-A`Vkw3XDK&b=&G4ZQ z)9}MjE?G7|4*R}O{zjZV-Y8RB%h69@{J&{BF#dx#yRY69n!2ze@A4foUR4`XeM~WI zxY|>lUgx?=lQz#bueVO=Peb1^8XLz6`o3u$Z{0CT*EIJ%4vzLy+En8oPzM(n~txFL;mJko;jFZNL zv*3;!>#vReo63daC9Z$gHn}gU@o;YSWb^KKDidkIjw&-jSkAS_Vo7LFwGdX zFYKu9W5a3I#I$u&S&Q*B{^ak|{0BPoX5k|JD{{V2KBn?bsw2+MM0w~RC-qg^0}jFX zS-HrwGVEXL>YQT1|Etk8 z?loNF@glg$=gqJ^`bn6Ac3}7}%!6{1;9giJ$21>U-Ie=-zUHas67+3^b^7J(v5%O2 zMH&BXpg&2X|3n^HIRtYQ!6nd@Rc7(4)f0Rt_zn~sdA^i1PfBNN4O8BGWv>f(SP>o$zf7@^7jN3QGP&q$`mNv*d5)re zEDg^r_sZl#d6lvz0(s6ev*1k|TNW3&CVwehHp=oZ;#d}!mZQC<@St<$7rdLhE6ujE z+$)OSNI68T4^w!s}--7Xx+)?t{m~Xsf&ySP1?sHe}#B)UKdurOp%37QM zeazays%Y%l{BxH^W*wF_Ze%D95YrUIby6za)964k?dDT_+p~d5UdS}5&Z@vMh_r2 zD?$wGeKxKNF{(kSM84B{^z)vN3E3)Q62hT~tW+Yo2U(s^T!}ZC3H*Axum4 zgB9k<1JzDjpnjm%C!E8Bbtr&5)EE+8XdMw=$Z-X7)DWA5dsGKADLZW+7vUzHgSx~G qoWz506EDI|JU4M4yoEr2*ul3G>;mSVod^%v&6j~4$HjGLD literal 0 HcmV?d00001 diff --git a/src/main/resources/asset/~act/img/test.png b/src/main/resources/asset/~act/img/test.png deleted file mode 100644 index f51b8319f1058c64b181a18b1de74c7db4cf580d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar*7(PTDBQtjNRCFR8U_ zmdk>+00;jpPW86q|JsksS6!YQcAQ7?dCXl|e+AACkJ_$|D>rh|+OD;zgorXGR_$HH z#IWnY-9Rr!h9y((Ie#xzvhQo*A`v2MA|$k+ zD_dDZI{)W;PA~8O{hiL%Io07jpZhiM%slgKGw;m2^S-CcFgi>jresNmQd7pYAj6Dd z#Dx5#G7NKr$}B9z^}A{^%-#wNV``d}r*;l)7)Brv=j#;KVZQZb7(2VHd^?7zF+hi@ zLn4WlB#O%^VHlEIrl=UAyn6nrL}C{b?h?Kdz7XyZd6B++0hOe8drRGC#qQDu?{d>NIg>=i*;TdEcjWWWxtFH0!DR8%YZANVnfQ?-(= z5f7H`(*@*8qAFB)l@Q3OL_82vkPhJ+K@S-of$uqCG68%n!5;Jr2;~_B8Xf;b0xDVj zKc(V+LEp0UfG!%b8BQvoYk*Ja+q;}X#BUKN&t3}X0^k$I2gVpn=!-6FhLZ~D8sHN8 z82yKF%B5nIxlE|bDQryF0840#F@|v}iH1=jWWygzf_@fo?Mrw?z&Mpg=x@Y4hJYBO zZ|@OMhHfN(b zaf3<*WK{7kojddu4<{X_Fhq9Z8Ey(7jbs_ypxShi(PYGVbiwrwXaSk&y}yUsG5Q6wM*l# z9a#Ry)Tu>Y49S zi(+*SRvbN3II>V#m*@RHzkcIz_ju^X0!;Mw)a@Nm-Xn5IQS0MtYlTGJ8k{oddZn0D?~t@EtFJScqqdy8)Awo- zPoKvf9a%8^zm;K+p14$-vhHfD5Z9KKOdb># zRJ!3)ym+ zSM5Uq;}hrDM|B*ss&BQ3&Q(Vr{W{9_*y#w}O$jrW{Mq_@dZ~$fY*TJT8cc{U?6&?$ z=VehD%M9cr*`kL#uNId^EI@lru2#K zU9+c+@cg$F!^8KFY&MDRHl*w4|E{}@AK*1(lAl{#SHF;LZ&oDF4B2ga>_oR3_xc<# z-~at-dW(sBZTD@995OWiNr@Jt>Ik=Hu2|KukyVEw&zC#(YBepnNv+;%FQ2h>9rkEM z#F&uVcDiq)@BCX-5HnlHV`kp~JMT6hCO&Gr;=+dNuaX+hxptsna4~Ol9rvmZ6-vIW zGX3bnnhl(bT)p3JjbBD(n_^BD!Ns1N)pH7-V016lbKmr->nhDL8dc_$&xpz9wWDqN z8=snNko3jorPHwwmIkr6ABK61U)=FVl~&h-E3bCnxHhTTrT6;NE;+rozvO!LV7I1k zeA`|sv}4kQ$mjzeq1U_)*%W&DcG<}(lNJUxXw>(#;f!@rmQ6o7)^TYdyt1tNnSqgu zVwbm@`}S79HRF$-SR5X_nF-Jz(0FH^5!0q@4=MAa@0IY5mxEV-Yc~Ah{9YCd>%OXY zey@I4m)Gv5MXO&u=5M?^W?DddgYHhFMn8ETJ>sFab+aWt3k#eH_gnn^OxSi{ig{IggvU ztJ6H^$G)D!9==+4dD5hLy#@{sI2DpGDQcrf;G->x?%_|W-tAs=|G9nRU3-TItyp$& z)S8f}MHaO_R6bYWtE=&_1|H8BO#OPV;^WSb7E}yuAC}fXKBo7Z(3{Q=JoQ@GEt@!h zXjlK&?*;}8+4bnm)n@%4#`mjmVN3fG`kQChNZ(s>LguAa!Dp=ht9YdTjM%##-dB7| zyh-|ZY18iuRwdaFZZ|K?y6MN0(U(tF@f`H9w^3$`JMYqZ#6GuAsHGdx#G>EB?lwJ( z+O&NdZxvM`YWGFY!B;{YyF1ss{>r(gL&Y7VFNT$TnE1(k$11;-b<0=x^uOKG>-e;3 zX01DHUu-_R-T37XUOisBvdHEW?|wV=;E z@A^0Ee2<8_GUtN6UxSp#fnB#W_+0-%h4tYNhn4s~f3TV1%YMW6>x}KVuw?pWwSA9i6rb2)8IALjJ_ zChMPDG%Uz`u)el<&Z&^VHwpGkSP}b0wLkUU>$Yp$iPDU_UmxS%1L8&xPiySmy4gR0 z{h}_nOSvDof5XBL3tvB&>6g@{q4kM3^)uRDz0h^eyTd+zwmd%g?9dlIi!yp!dv$qy zC)R3a!J-c>UHqSwDcewwS=uC}(3}9r!T$GJSh$4T-MH?N0kiZ-U7K5tXNPAVE;IMQ zz5e^l3@s}7bF1&x)zMA%cG~%%QHuEl-JwO96ZcJ-O3|44_x!bRmJSn9!ED2Wa<4}RxqkW5=$XTLqZZ$0AB`LmS9`d_#m~`J zJC_82NVn@^=S9?APz`?sRcn>5awf zG;UV#T&DTr3C9`tzyCW|t32Ojn>Q9JY#-bE04v= zj%kZ0n)Pw(>8Uq%TJ__>-^}d{)80qkq;NSMQf)d(u@vhHzYtG+jk z4yIPI8{DeeaLXo{UAMO%5z_m>{w1Xbx#~oYEqi)h`RRVGFZSp%^M&8}mGhYuExl*& zNZz|)nvP3!#}n;dzu&fM^uMXI2F0D!ty;GFfh+5$m>-EM&~Kr`dBcl?hV_i|eRn#f z`lZn|n36XghdNF(KH4z8j%Am$qp>sBRK8i{tcgn#1B;?e^VtdA-CB2D)*@|jLapPA zYBMqGn>6#kKk!_kgvF&q1^!cZy}f3jb98?FrDJq^6fmt_$nI5iiK@EK4bB=ieqcPh zH1qvpM}NK8!E4N>%zH9x(l*aBtC~ppS?2ciIib3@oED|d>aLSIC}Fw@Gq{1#922uA?MetL>&~n1$+%Y23kz#j??sIp z{-^v7HLE{Phxy)N;)S`XPs`bT6?!dy6x(7=gO9IDA6Vh<-xM$J$Cab-UDY{vCS$Mj)wWvlB8 zj@_GhCZtf!9&=M?6*CunsP)C0a=v;xha85?U1e_|cznC~Vnb$Zz4NQh9?pMqF)pwT zQ^GmuVwZ-ti>BWHD{9Njze>4m9JZ?H(_n#ML}cUtVs3Rybsloq=tJ3h?h^}|>f41G zr|sLi-LC1m)jW0tU!kdKoM%g6}vl|fjce&)uZaaJmGv7MtE;1|-IB3`T=hxz2TQ=y&+;3B< zS-V4_q3QKPiu_SwOwgf)3)=aFwOP_h_q*Q1dqyKJo@!^bB__ty+V6B}tAekp6faip z)tn*!dS{d~EnXuowzR>ajZ-{YJ$*7Xa(w+xy0@KrZJjzdQP(cvPHfPF>qgxzJgbdQ zG8=x}-P%-7aBSe{lFaR)TV@So?7~_vEqC0(v$An=p}vKgy5CP7bGbEq`17*me7-KR zdXqS5uf6W==?^Un3XZ+L^@tJJEM00{DSc^3g8qs-%d0WlT6;CrxBCzk);!kdcy+f2 zzK&Jnjn6OfS+n!Jp8etGAL7Cc_g5(1c|m$)MgNXH%j{Xv*XZOqrrbP#<8;5TuBNqj zENOKhz3Vo;gmRr$b?Dab-I80?4t4ghcHideSghJ$`_;X#l>DPqVvPvfRL9FDU3*t4 zzO>xFC5{D|cLh@ZSX}yo?~twDFAF{#?l;l#NVTU`5~ep_zN=-2^~UMDW4oRkneh2p zt>;%ySIcPA{oE7n#z}Ubk-v)4B^*RP(A~ZGCE0i=91-H?`OGm^8IXE&s*K z%584i+5TzePs;w(591I{ec~ow0>a*o3-!4%(ICeP>h8@~4su z`Il|rQ7v@OoO=C&BNva2GCMTg+SKH!#}H4yVf9+f?rzXuTjr_<}T?745e z=lM4&PD!ru3xf0#cP2c)e7#4Eq3;r_O6&Yw3*RXcY}~!T{I)H2x$m6vM1Nk*NZ0st z7xullGjWw_OI$u3xxir4x;+wX9k` zw|;NBsM)yMJGOd{w%XmTirvU*uA`g%yRd$NS-ZLpoVL-z zxVTxAUcbXbcKvn6=352v(}50Ef-RR&99`G zKR2ryZ@yt{Vvje^F3kJ$WXC&RU5*ruy0@f|^}^c4W(4(ZduEq#-sm39R?QA7VtXs5 z?orPHcS6^1*yfu)F>2u-Q=|IVTix%_@H=y6z8kZ&wD0AZ2&Yf(`@P?})SPI)>|V#l zO?G)T+uXX|ebbasi_Oq4(5 z{JFkT_nBLF$8K<5{H=J|vvpff`8V2h!_h{oM-)r3xE%lNl;xv~=?{xlpFC#F+45cg zsody()091>rf=6PI5cSguv#b1+r9Al;P9!ZmDS#||M(vYFBvkir7^>7I57;Dht`WO33UcDktSe2{P(Pf02(dO+3&!vnAvpN&}Pos(# zlczo@-l2L#wEfphD@rtJF{aj>Aw#;={xYkEn@dV1kJC}*kIrh=aY&Ek3e}(Mlql@_ ze1=9zx>r3@Rl_M7b@uf_JS8q?&1sb9u}%TEoh{06qDXkXz~ zhGF4><-H6RIyGy5&Gg9G@y`dkIqZM#8h-P}kP6$~QUc?g@4N5cel}!x%LocH?n#*RJ)p>2mhy#J|LjO%hcyRdOB_73PDJ@=$f%Il{E-A1)c z9Ou)p;Az(g<9#;$-mN-3t^dTMCm-GSZ6Pe4pi{yyE#16V#PoIR&VLyBWmK1EWmDD- zzh)UTe(m=KA3i$z9&UMX(asSrTPi)ah#BWF)J0%+^@@)}MID{17osN~z3$=>J#g=% zO$Xc#)cwb}rBUjHB8`j;lUtA4JorTKhjA9`Jg-bk4Sv2i_W2(7z;$omZhbb>ZA$p$ zPKA>Pp9s7V;_GL5#r>V9*ZM^NHqCd;cefZhvq+B;9}_}XiFd1&~J-WyIQPCMdT^>n$&M}ij>{f&1e zOs{r#-ImOzUXvUO&rXafWIxV$bK&Gl+hSXPNE0 zw#mF9{CqsB_0xf-rUCv-tgNbDo;2vc@EryG|2p;7c8x)}?+ueiH%FU(OHZq|HloDZ zif@)>vRWpO}2z6Nz6MW{#!~He4)LFXJ!Zdb7|0%(`ZC4~$in0H2 zsLi72&{tb+589WlGqT3&2L5&SB#dd&@snGVEw`tcn!mGOWZ1IasdY{Xq4x*x@EQEL z^|6d=-ZAF=LkF!Hsx#$8?5dC9^)4Aj?a(Xu>SKBU^c70kZbk)1*h5S7IA}$>5_w4rh%_Tw;FGV&l>stD>3O~85_9%mx z@6Q~K+oXm#-*{2EYW#l#-=0`-v4LaVZiBkEZac5#)Bie|2j8(;S7y|NT>~Z;Zxk^z zV&VPLOz$h^aVvUP4IH-5(PrGhtK}-W26(@=j_%O-x?S^UPwVb1uV>INdcoETmzhF+ z*Dtg&nXGT?*z51XExNgF^J{!O^4jex?>DYU$|(6H@{^O)Ji{YM$t{$Je?3>IUnBr!KBH!Pjw5$5Yl;&0Eg;c6(>})$QMI58gRGzSb7q zz!~p`I&Nxn#sA2Pt6kk@H|jFkb5X@te|YVywSD~y�h^Yl}twv*^;5|E5Nku4U#W zm^F5F($qKgou2gQ>s-S&xu4K$OSuJ;%GtVX{W{99@cppXp8i&DU4jy(U07?m>G0BL z{fxd0nc+uAEN#qV+jWR|&A4veaI|80=Vje?hZ()D0Rl zx1;s`4om6$tmf2?1E-F5oa)?S)MRH$7%K})8*>Y5b4%-f7S=5+tXfz%F}JX3VPVl_ z_#wCd*T8M!=&@rw{p&khILjrJA~MUBmk45A z+JChXkUs*2iM1nPF5wsfFIDI`oB5uF)U2|jl>SXWTjHo}4Pg)gFSJS%@G1kKHx{BYyuk4z zJSOnlL*{YOJRylm zLRnKPWBtbbj(IeymOEBFt?w2(spv9mK=hgZ+{;!hMc;m*uyS z#+-w?-qiMemLBXSq!HF1)*kHnr0rWfb9iIvTGive0LjGunY9OLJV6@4h9?BJ4ffvI z(L$2$2w~R`dL>2;f;uwZF^rzJMNlSObVYoRg%U!_JRH7 zY0Tp(LwVMIJc~-Af>g-zV7<%fz3ar02f2?3<^*MkYa7-BNyOz*h5Z6j!p7qwUE_I7 zS>oE3o&AuVPGEIn|CtjKP-9jWu5&{0ot1?(AUopTznC*}LIP^c>cn+UNZ$KbmGh^7 z3|5u>gE+E|NeP51*DqDtzlLM~Tq*Xea{r(z`!Nq z8CK3ax-Kk3PymNNPzJBGY5_+Mu9YS1;aU5)$RUL5FP>kp_9;UGYQ*ZrwK9Zf1lYjJ zfo<{-I}f41O32ed0*`>oSiQJblrZk`?8?eGt$+aR3!Mo$*~1B_J*ykniqdFmz_!PJ zps}I?a>y^B_N;zfD?)hA#W^3_ew8APdA#VyS%e@$4PKqJ>?o>a^*c&qb#-YkALMuz!XR*oWd;9zxu?w&UzFr{^CgB;yl-jV1Q*!wBdXRS{&t zPwtq39??5h6)1t6w*=M)q=yNLj3;83NSGr-2wd6Fg??8hVJ?axaP@qn{1yWGU6K9( zFXr+f0(X9g?0bZqju{dmk?>5gmVo(;>j$p!e7>B}pMW!kk_6o>;2LEE2rCH>3H3x2!&x@3q+|vC{A_6X@)-1b3)P}PEE4PZKb90!VFuXKIDtjRHV@Fm0=4z z(kT_$N99P#EL+$uG|aGtA42^MTlmHL`NMBE4s2Z5II(dPX2tP;;)??D3sF-V0d|BR z-)YfmlM6rgCXK%&VXxYjfFJE%BBT(o#{h7Rv&f|c>Q%Y-wZtlua7Kw|w#NkOS-B8L zeAstlpOF*7-s}c})e9Tw?ht)bRf$r)Ea2Lnu!s;(VEM1ob!~z&)QuW_AVAg=0`^bx z_yZoC%Ow!d7VCK@f+EzFn6bv9J@%5yyfY|H?RI9#_)4j~HX!D#-#9nKo>o~xTZ~CI z4zl_JW9@nt|5i$KqMMqF2r}3>U_40c!!cA3Tb~e=i8(csNI0uWBtSOq3rPgKpcg!U zNMgug+2AbMxHk((kcE97bZ1vDp~?Rg)u57FgbV*uBaVAKl|zTEgnB%Gpzd!8b@CKp ze7_|?#>t>% z4!;%E%?hhe7g*0>1Ax83JVJW{){;U5^k)SE%23CBCyM@-H|E4Dks#ld@PxqHAu9#1 z3ju9aMVKGp<1zx~Pt4(830QYu5h4gH2ptIE)sh?$5FH=jpD^7Y$1)j)sdPq>VUp^V zX-MZM`gCTpAY3R64;LndM+n1{B80k05t;f)3o=azwsh_F1L2uo;XqQR*8*Xtmwx)3 zIfjr0nbc9DBOj5jEX8;!C4ikYQ~WrmpeyY;1%jd_Z3MIt&_+NT0c`}d5zt0J8v$(u zv=PuoKpO#V1hf(O1tOqNJ~SlY+!^nVHWB_M;M^{OfcH8$gZ!QaT%!zi-~lh%pe&{Ez+fKD|<-!S7lj@tx9`%+c> z7;6g%jR~+xOX`h44H7?>5KmB5AF4_Y-b;BCsu8rLx(MLCAKn?BA*iaa)GY`5hb{zp z-fI$@mLx;~-?TUqVhQT*FLlYkN48^MqRRKRB<`0c+%rQ7aRhbsOK!`>Z(n#I~!aBlKLO((?LQO&$0=|91 zybRzPWvBxWc+qA(;UWRDRB78kB(EevOAOPSg7AWn)A-_BrJaP)1bmyN%Doq4;hV8B zgx!SKgq+%&Ofs;q{avXTIlhsQlQ=%7_A3aj2&(LF5+{}L9b9X|Dgyd3CqCfJ3iHqJ zM0Lqo?2VO)8@@|CM8LP7n7i|uU_%eW5dv&e#;0g%hqdQ-puXhfdxD~IN~bn!2si`E zuY^9t+Wv*0sDIdF^d$VMglC_>2#Ur9=k7RjHzsHbRUt#M?}Y7&_>1{tBH>pfte05l z6p00RLkRekSyKsn#*+j^{a#6Ja&teU&iLw)@a+o50DCGtgZ&EUCGcS&LD6TN0BVyT z_BUjP(ggeW6BHT$c)lv7w8s3~5a$bu#$pe((bO@3aqmx%x9>j@?+C)LaLWn$gN927*##wQGd|$AM?2@PNj}afnyq5ld z1Q3(M1bJeJGv@q6oyiz^?7l#J`El&#msnyya9Pe+=9hQJ^w&6=@b0@LA+JfEcldaBXPwuEYLNcMWGiAOYYgP|I?zlG8{xw!f|eAEfHSen z>VMQXRZOhPxN#nJks!-PoMCH8@dzNk2MDs_i!-FWI2&}3!?u^igY`^H%0&S0jO2N5 zi1&-RNrgyR96{FD?4O%P{i3=C$r0xV#FLw6X(Q#Z={WJ^#k@pne_WTZN5KF{V+8DS;^|^7T+Es=fuyF%HOR9~)dJ-qC|51m&Q8$H> z0%>;OxwWFYjra}aS0$gn5~Ricl$zsGQ-*%nwoc79{LbPLTWS4|x@u|+khcu|ct>4J zjr#Me=-Ol$-ram8yeAwas3Q)LDXag{N9rK#`yLad>Bo7+??!#dVe~maF8KeRsACKq zm7t5O8-0YnQZ=^ucd}ZiOruy7G zgHVHua*M=!H+;vCUHsYdG`S_p&xjcRCqwrF`Nhf2c~^!`jE~=e>XDQ3{!JRJ3+kZN zB$ORvlF}#@E3GU;A8fEuvCjM`F1xi}QXin~u$r7`Lvpjz$(F0~8659#S-FzZ6spgS zvnMr$Q>IvX)_Q(iF!$G$DOouNd@uN#z}Lym4^d9E#8yEvbZwK^>encgcdh5f9`DA~ zeg3^$MxWp})2bp_=l!|$?m<=l$SX&YwVv&Ny!R?4uYw%#jiI)zPD$yl9LVN2HK2^F zcMsLL4StbpMb~=tfe!(5b8Zmk7fJojmSs@Az6uO!E<+E_In;69paRpC5~0jm|A931 zQ%alijbP_H0^8q`QdRt>(nW@jGs?S=?^@>9wLZH*$@>0oaCQw9D94;8X>74&zshre zeqQUd>n>UEggvuss6aXP_H18EO8-#8N zTNBrMN!=#vdz=JGjT9`y_gw6JA}KAZpuD_h$C+%Z44?RZ=H_#~BJn9B!w>kG6TT(3whaWXON-=M9!`yXf7(&B_VO`HE^`IBGQ zdh|D+)II-0AMSB!G1IjDpEO@kr%9yl{U2f>>pKHYd;a^C`ad_G|DMnokQTE>nsmd+ z@I}+^|J*qLIWHq-J+%FwXA#Ja^WUv9`hR?$d9R#eX>*yT-T%4q{%5|7{$HkCH{@BX zU#b6P{T@&i?|+?T^nYlc^`vr&f2IDvAfsl{!BrRU3(-guxOliKL&s6dKC*pBihOXgY(h!msGfnFM(G+iKzC@|8 zKeouwwL^uv)GbO{%rvS0cgpCKwJHpxqYPcIs6My8d(Wv`ze4|G?MKX|`J&3-Hifn`U3kkRnr0zC@pp= zRIjIMrD~8T%?C~Bf4uX5PLSruLN&xq*6+Yzk0!hekQO&h=>Kjq`W`-5tD*mK#uF<; z_hB{YRkcV>@Bc$G`XHX_)pZ_+^JHo9%cS}`g#1j>>_=UGCY-Y&#?pM4t40S*Wax%n zo7Jda6{4lZ4t4pN){t?s?609_2kW$TGLr%m?vpqleKVq6rkY@ksoCHSB zw)Qe?fPLO_%E}8iY4OX?{g1!rBFpyfxe!q7EpE!N1>aBSSCSRO{Af3RvxN6K(rm}x zJh#5Z9w5V(Jyf4xNm>k1m){8YTL?jx-Hy3vIL;s*O0j8RF504~Dp_$mRs|XGXC=I<>!@=sjfDqNN_TNZzDfHR9yzhkXwuD*AcD| zu;z~>N<8^J=J_F>tPTA5@$)QSUZ*3-0KRRK@-6e) zPz}>BDTds#{NN6LQzOsslsDxEV>QeMZeL5f&TDtdk^zqhl5FFay&#^_d2Or)>gUE# z(sf?CRG5@sAV{){U)DP>4OLJ#_A)q^wj$s+%XvxC=G6~*Xc(T~_7eF0EGfS+5A9S` zwIwycx2UWii1AE9UhP?fIkvDivFQ=2%L_s*0tl=f($agxSB#(uRE3OuOOWIb_Aa`4 z;6#1W`A&jOX;g-D*4!rC_kjdSG2)lKC%*jtew`aXd=tp`ft$xS%!RlOa_Jgl0P_IW z0-RytZ$jlo-($VsPvFKx+I3&z)g%fhW2O0ny0ZkFbNz0FeZIVVJ;doR4GfU9wU#?B z9*}RiCw~{h^SwOJcx;T;5_dwiu;GL?b&iUDO z6YhiA1g@X*T;qGvm4pfeO(A@%=|{*Q$m1iIXF9df#JwJwEf?Y2ppOKu&+=S83F!oReB$!pY{!A{JCHd!Dee0)Zd~}+->K~ZLMK9gm?L3BR|3{5S-;KT z`@-gNrkfY%Poy@_s03*aBCs(~CQYLDO9)K~x%oZ;y6}5Q{Oz-61Z8Yz+hAW*obbC+ ze{x*b-!fohB`tkHa<&p23AG8TTtm^{xIae`urGf}kYa{ zTatN>fPI)d0kO6rR43qB9B1#Cy8&FI40TNi;GIOkx!ZX{DuFLQCwbiSr3qU4{}HgG z>`g*WVw<1aUM1gJ5ww(j1aLn(5#kB?xi1y5?GgEczmZmepe6YtfOA6^!efFWvCdDt zc*en=;a54wBUf^rFdtw&4kP5JzLjQ6DA|hhYuK(O)kUBdiCRR!`vGb3&x^VwvS|T9 zlh3Qke2pNiqb&%&1e~4ZMSnwQ3}Gpu89}?YQxNiqs*+wj_v5?RI|Q5&s(MU7W;9^~ zVI-k4K}-2F0!7FyD+2c10zv@c4B-|5^K=>k?-S6c0IpGnI`DvZ3qe2_MzAD6rk1o3 z&_+NT0c`}d5zt0J8v$(uv=PuoKpO#V1hf&*MnD?@jf;RVUl4sRX~H!`Kws~0^7xvP z%Mg#e{!a#E>Aa66d~{1>%jWU%29Y6~j~8Ws3J{3%KQxMzQ(+cAi8B!j$p%|-0bSwZ zhefGkN%5?LFtMrW;$optz<7Z_lXZy|oRwxWx~LWk!^C_UY`b`|!gSX2tc!Hkjtp@{ zs<;^xh&+sE?G}m!h5hhLAW{^TrH&Met_1pG^+I91h?8|gC`=XmX~Nd0BcI8t7YZ|= zS@e&XBLh{OyogoQNL(+3!Tfyc5A!He5^lEHNSBkwJ~MjH{4v5>{) zGkAH}A*v^vKyWsl_ys1StPo*LC)?P(fX&;A>(QGTs2Ar&y@-5PctpJjomu%*#ssmU zyqBoGsB<%a=0%;)$wM8*n&lS{lAn3;Ao-b3XW;hFyht7LnPPq7K_beF)Qh{8lPAkX z?OA?NFL30EqM9ptTUe4R()TldKl9>vXXSsypOZKF+5Tt$iR+OMW4`6j$Nc%41Y?}A;zgI3@w3#zFcFEo zg8}^Yg1?@SKoD5P6p!qW=J1@zgsr7iz|n?cVlY9P_k`e4?S{w1R(5GE3~6P^>K#p@~6_afvK z(N2m9AY^AFeoKUJ$Ql!L2#ONgSQC~JUK6s@vytj@`x_P$(s?@@o6s+Rs@Nv{ZAmvm zc4OiO)m0|s1~nihlEyoJ&;B<7wyKMYkzm~W-w6EifVkHssFUiE@K*%B?z>dhP@Rf- zvhm&4eFEPO+;i%R0meLH%-6Y(%Fr*lO_=`=5%~7NMq?ElgE5Wo=lHr-QCR^M>rzCV zE;0W@;M;}yK$UZ1fCL@*4WTmgIyF-%!G?7NehjcKsDgTv5WejFREF5+7lJKE2z)zp zxf8?FTYU-=E>RQ4xZl_->rr_hS_ikjK0ec(%Wx zydviZgL&<-uTtfDO5)@uoTI!Tpig_q*$U5QuL<1#8z5&}um$tlE>WPZs#pt>prt%J z@cbh$Ehk2<|NG@^h;f2BgWJ|Z&bF#zD@%e-^K5`U7zgqa{w4(12b`tp$_g9Bp#SBI#ad?G7X1<&;z~k=n6xkOs;j=Nhj~YdPBFgeALs9rmsy$aBwT zr=Nc>U(Ak?Q=UTC+?ZA2)T#PX+P#k7xaE}0NC4ND1UUrq_s{xrv{8ly&z0HT>p1sR z1>u>9>;DHCLNV63{CGd5uDKt3Dy}YEhY^&$*Qx3M5at!G4)`ODa?^jVUAV?sQcmu5 zNq#BnKV;w>mus84#y?jFuGK+`j(^yIJr>tCb$y7A<$rsgFY>H^yLfHXwg1Tt|M}0sL2~rfbe{iPDh%|KA*&As0SWlxB#O zI?MyHgv*2mQuvgqQiuNy$q@eYi!yz$j6aIDQMLcY$N+qY!j+5jPeVlw%O!rUow&{k z6`;oZ2z;3iIT4yoTRSRWO~6@gPR>SNQG3>2tgp%vY{1z8D~nA7locqYU45#{Ah0@o z=~~$spl=WZtkXCPQ-;v*=nK{!HoZ+{MU@dKqs<5jx^_|-)|}iX-0zacJnnfDH5r3% z0{HJ05%XJwdTP=sNi61h{#*w;FrFGnYM{chMkMP60s6SW`zcQX_KxZzj5BWne~p73 zcsHtU-${jts?)!c;tx9#2+jmm#sPcRu>}6Uj*UO=cl@oy+@#{9Y&(IqfuCYd$KC_a z&dSV@Xk$rOO5i`saCHSxy*lPP5-S&Bj|gA6Hu0|$sXmY}j$lWqMkq$W{H>dHjk30c z@q{2kc74st#yqEv^_|2jOr@yBGQt-EYoEGO?B^E~^5ed)GTDVaK`KGj{^J>T384}p zzZ2%^p@gFZ^p~=+!23a*MPaXrIZzV`cH0rA6EI(1A>iJIZ<$%ZHOf#2o@oSIf-2V# z5~n3?1hf&*M&M@z zkVL!*HKpq?TjHU=^dRt}zc7Kn+dyrEl!{~sgqfm00ukmV{xcZyUKyglL6K_9rs*c& zPd7<75ekKdl-iOw!wi#DO4AK943VZH^@7SwQ7W(%r;L{%9H(BX{IP8twQjHWu+8^ROBfL @ifNot(failure) { - + } else { - + } @@ -123,7 +130,13 @@

                                                                                                                                                                          Test Report

                                                                                                                                                                          \ No newline at end of file From a1674e435921f41722889decc7e242ca3f4ebd2a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 12 Jul 2019 08:05:10 +1000 Subject: [PATCH 486/730] ResponseSpec - make response body verification works when stays at first level with builtin status, text, checksum etc --- src/main/java/act/test/ResponseSpec.java | 53 ++++++++++--------- .../act/test/util/ScenarioManagerTest.java | 2 + 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/main/java/act/test/ResponseSpec.java b/src/main/java/act/test/ResponseSpec.java index 67987a9bf..06896d99a 100644 --- a/src/main/java/act/test/ResponseSpec.java +++ b/src/main/java/act/test/ResponseSpec.java @@ -23,11 +23,14 @@ import act.util.AdaptiveBeanBase; import act.util.EnhancedAdaptiveMap; import com.alibaba.fastjson.JSON; +import org.osgl.$; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; import org.osgl.util.S; +import java.lang.reflect.Field; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; public class ResponseSpec extends AdaptiveBeanBase implements InteractionPart { @@ -57,27 +60,6 @@ public String toString() { } private void checkForEmpty(Interaction interaction) { - if (null != status) { - return; - } - if (null != text) { - return; - } - if (!json.isEmpty()) { - return; - } - if (!html.isEmpty()) { - return; - } - if (!headers.isEmpty()) { - return; - } - if (S.notBlank(checksum)) { - return; - } - if (S.notBlank(downloadFilename)) { - return; - } if (size() == 0) { throw new UnexpectedException("Empty response spec found in interaction[%s]", interaction); } @@ -94,7 +76,10 @@ private void checkForEmpty(Interaction interaction) { accept = accept.toLowerCase(); } } - map.remove("__type"); + List fields = $.fieldsOf(ResponseSpec.class, ResponseSpec.class, true, true); + for (Field f : fields) { + map.remove(f.getName()); + } if (accept.contains("json")) { json.putAll(map); } else if (accept.contains("html")) { @@ -103,9 +88,29 @@ private void checkForEmpty(Interaction interaction) { xml.putAll(map); } else if (accept.contains("header")) { headers.putAll(map); - } else { - throw new UnexpectedException("Empty response spec found in interaction[%s]", interaction); } + if (null != status) { + return; + } + if (null != text) { + return; + } + if (!json.isEmpty()) { + return; + } + if (!html.isEmpty()) { + return; + } + if (!headers.isEmpty()) { + return; + } + if (S.notBlank(checksum)) { + return; + } + if (S.notBlank(downloadFilename)) { + return; + } + throw new UnexpectedException("Empty response spec found in interaction[%s]", interaction); } } diff --git a/src/test/java/act/test/util/ScenarioManagerTest.java b/src/test/java/act/test/util/ScenarioManagerTest.java index a97075a53..8daf7d3d0 100644 --- a/src/test/java/act/test/util/ScenarioManagerTest.java +++ b/src/test/java/act/test/util/ScenarioManagerTest.java @@ -27,6 +27,7 @@ import act.test.req_modifier.RequestModifier; import act.test.verifier.*; import org.junit.BeforeClass; +import org.junit.Ignore; import org.mockito.Mockito; import org.osgl.$; import org.osgl.http.H; @@ -51,6 +52,7 @@ public static void prepare() { } @org.junit.Test + @Ignore // ResponseSpec now extends from AdaptiveBeanBase which require ActFramework to run up public void test() { Map map = loader.load(); no(map.isEmpty()); From f3a2bf0295892f42ef97dd148e296f7cfb11aee1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 12 Jul 2019 13:23:08 +1000 Subject: [PATCH 487/730] Scenario spec - cannot specify long value for substitution #1164 --- CHANGELOG.md | 1 + src/main/java/act/test/Scenario.java | 4 ++-- src/main/java/act/test/Test.java | 6 +++++- src/main/resources/rythm/~test.html | 4 ++++ testapps/GHIssues/src/main/resources/conf/app.properties | 2 +- .../GHIssues/src/main/resources/test/scenarios/1151.yml | 2 +- 6 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8d72f970..e1e5b965c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ **1.8.26** +* Scenario spec - cannot specify long value for substitution #1164 * LoadConfig - suppress warning messages #1163 * Act-Test - list failed scenario names in the splash page #1162 * When uploaded an empty file, the parameter injected is `null` #1160 diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index e173c63f8..757a4163a 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -200,7 +200,7 @@ private void processParamSubstitution(Map params) { entry.setValue(getLastVal(ref)); } else if (sVal.contains("${")) { sVal = processStringSubstitution(sVal); - entry.setValue(S.isInt(sVal) ? Integer.parseInt(sVal) : sVal); + entry.setValue(S.isInt(sVal) ? Long.parseLong(sVal) : sVal); } } else if (val instanceof Map) { processParamSubstitution((Map) val); @@ -221,7 +221,7 @@ private Collection processParamSubstitution(Collection params) { ret.add(getLastVal(ref)); } else if (sVal.contains("${")) { sVal = processStringSubstitution(sVal); - ret.add(S.isInt(sVal) ? Integer.parseInt(sVal) : sVal); + ret.add(S.isInt(sVal) ? Long.parseLong(sVal) : sVal); } else { ret.add(sVal); } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index cadb97ae0..290ab2231 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -392,7 +392,11 @@ public List run(App app, Keyword testId, boolean shutdownApp, Progress logError(ansi, "cause: \n" + E.stackTrace(scenario.cause)); } } else if ($.bool(scenario.ignore)) { - logIgnore(ansi, "[ignored] %s", scenario.title()); + if ("true".equalsIgnoreCase(scenario.ignore)) { + logIgnore(ansi, "[ignored] %s", scenario.title()); + } else { + logIgnore(ansi, "[ignored] %s\n\t - %s", scenario.title(), scenario.getIgnoreReason()); + } } } info("================================================================================"); diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html index 1c62b79ae..481e0dd04 100644 --- a/src/main/resources/rythm/~test.html +++ b/src/main/resources/rythm/~test.html @@ -82,9 +82,13 @@

                                                                                                                                                                          } + + @if(scenario.ignore) {
                                                                                                                                                                          • - @scenario.getIgnoreReason()
                                                                                                                                                                          + } + @if(Lang.not(scenario.ignore) && !scenario.status.pass()) { @if(scenario.source) {
                                                                                                                                                                            diff --git a/testapps/GHIssues/src/main/resources/conf/app.properties b/testapps/GHIssues/src/main/resources/conf/app.properties index 5fd39e800..757590af3 100644 --- a/testapps/GHIssues/src/main/resources/conf/app.properties +++ b/testapps/GHIssues/src/main/resources/conf/app.properties @@ -379,7 +379,7 @@ content_suffix.aware.enabled=true # `http.port` specifies the default HTTP port number # # Default value: 5460 -#http.port= +http.port=15460 # `http.port.external` specifies the default HTTP port number of # frontend HTTP server (if exists). diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1151.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1151.yml index fc60fe03f..54af5ce94 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/1151.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1151.yml @@ -7,4 +7,4 @@ Scenario(1151): json: buildNumber: - exists: true - cliPort: 5461 \ No newline at end of file + cliPort: 15461 \ No newline at end of file From 88494fd79a33080c63e5326d6995e5823480b891 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 14 Jul 2019 13:24:56 +1000 Subject: [PATCH 488/730] fix #1161 and #1166 --- CHANGELOG.md | 3 +- src/main/java/act/crypto/AppCrypto.java | 209 +++++++++++++++++- src/main/java/act/test/Scenario.java | 43 ++-- src/main/java/act/test/Test.java | 2 +- src/main/java/act/view/View.java | 6 - .../src/main/java/ghissues/Gh1161.java | 45 ++++ .../src/main/resources/test/fixtures/1161.yml | 2 + .../main/resources/test/scenarios/1161.yml | 20 ++ 8 files changed, 304 insertions(+), 26 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1161.java create mode 100644 testapps/GHIssues/src/main/resources/test/fixtures/1161.yml create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1161.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index e1e5b965c..170b9c7ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,11 @@ # ActFramework Change Log **1.8.26** - +* View plugin get initialised twice #1166 * Scenario spec - cannot specify long value for substitution #1164 * LoadConfig - suppress warning messages #1163 * Act-Test - list failed scenario names in the splash page #1162 +* Act-Test - fixture clearing issue with multiple level dependencies bug #1161 * When uploaded an empty file, the parameter injected is `null` #1160 * Test Scenario - allow specify response spec without type block #1159 * Test Scenario - allow specify ignore reason #1158 diff --git a/src/main/java/act/crypto/AppCrypto.java b/src/main/java/act/crypto/AppCrypto.java index 276a72523..d41371fc5 100644 --- a/src/main/java/act/crypto/AppCrypto.java +++ b/src/main/java/act/crypto/AppCrypto.java @@ -34,6 +34,23 @@ import java.security.MessageDigest; import java.security.SecureRandom; +/** + * Provide the crypto relevant methods for application to use: + * + * * {@link #sign(String)} + * * {@link #passwordHash(char[])} + * * {@link #passwordHash(String)} + * * {@link #verifyPassword(char[], char[])} + * * {@link #verifyPassword(char[], String)} + * * {@link #verifyPassword(String, String)} + * * {@link #encrypt(String)} + * * {@link #decrypt(String)} + * * {@link #generateToken(String, String...)} + * * {@link #generateToken(int, String, String...)} + * * {@link #generateToken(Token.Life, String, String...)} + * + * Note all methods listed above are executed with {@link act.conf.AppConfigKey#SECRET confiured application secret} + */ @Stateless public class AppCrypto { @@ -45,14 +62,34 @@ public class AppCrypto { protected AppCrypto() {} + /** + * Construct an `AppCrypto` instance with given secret. + * + * @param secret the secret to be used with all crypto relevant methods + */ public AppCrypto(String secret) { this.secret = secret.getBytes(StandardCharsets.UTF_8); } - + + /** + * Construct an `AppCrypto` instance with {@link AppConfig application config}. + * + * Note this constructor is not supposed to be called by application. + * + * @param config the application config. + */ public AppCrypto(AppConfig config) { secret = config.secret().getBytes(StandardCharsets.UTF_8); } + /** + * Returns signature of given message string. + * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * + * @param message the string to be signed. + * @return the signature of the string + */ public String sign(String message) { return Crypto.sign(message, secret); } @@ -62,6 +99,8 @@ public String sign(String message) { * {@link #passwordHash(String)} as it will fill the password char array * with `\0` once used. * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * * See This SO for more detail * @param password the password * @return the password hash @@ -74,7 +113,10 @@ public char[] passwordHash(char[] password) { } /** - * Generate crypted hash of give password + * Generate crypted hash of give password. + * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * * @param password the password * @return the password hash */ @@ -85,6 +127,15 @@ public String passwordHash(String password) { return BCrypt.hashpw(password, BCrypt.gensalt()); } + /** + * Verify a password against given hash. + * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * + * @param password the password to be verified. + * @param hash the hash used to verify the password + * @return `true` if the password can be verified with the given hash, or `false` otherwise. + */ public boolean verifyPassword(String password, String hash) { if (null == password) { return false; @@ -96,6 +147,15 @@ public boolean verifyPassword(String password, String hash) { } } + /** + * Verify a password against given hash. + * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * + * @param password the password to be verified. + * @param hash the hash used to verify the password + * @return `true` if the password can be verified with the given hash, or `false` otherwise. + */ public boolean verifyPassword(char[] password, String hash) { if (null == password) { return false; @@ -107,6 +167,15 @@ public boolean verifyPassword(char[] password, String hash) { } } + /** + * Verify a password against given hash. + * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * + * @param password the password to be verified. + * @param hash the hash used to verify the password + * @return `true` if the password can be verified with the given hash, or `false` otherwise. + */ public boolean verifyPassword(char[] password, char[] hash) { if (null == password) { return false; @@ -118,6 +187,14 @@ public boolean verifyPassword(char[] password, char[] hash) { } } + /** + * Returns encrypted message. + * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * + * @param message the message to be encrypted + * @return the encrypted message + */ public String encrypt(String message) { try { return Crypto.encryptAES(message, secret); @@ -130,6 +207,14 @@ public String encrypt(String message) { } } + /** + * Returns decrypted message. + * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * + * @param message the message to be decrypted. + * @return the decrypted message. + */ public String decrypt(String message) { try { return Crypto.decryptAES(message, secret); @@ -142,6 +227,11 @@ public String decrypt(String message) { } } + /** + * Returns checksum of the content of a given input stream. + * @param is the input stream + * @return the checksum as described above. + */ public String checksum(InputStream is) { try { MessageDigest md = MessageDigest.getInstance("SHA1"); @@ -165,26 +255,141 @@ public String checksum(InputStream is) { } } + /** + * Generate random int from a {@link SecureRandom} instance. + * @param max the bound of the random number to be returned. must be positive. + * @return a random number between `0` and `max` + */ public int generateRandomInt(int max) { return secureRandom.nextInt(max); } + /** + * Generate a random number from a {@link SecureRandom} using {@link Integer#MAX_VALUE} as the bound. + * @return a random number between `0` and {@link Integer#MAX_VALUE} + */ public int generateRandomInt() { return secureRandom.nextInt(Integer.MAX_VALUE); } + /** + * Generate an ecrypted token string. The life of the string generated is {@link Token.Life#SHORT}, i.e. 1 hour. + * + * One typical scenario that can use this method is when a new user registered with an email address, the app + * would like to send an email with a link to verify the user. Here is how to do it: + * + * Define a PostOffice that can send out email + * + * ```java + * {@literal @}Mailer + * {@literal @}TemplateContext("mail") + * public class PostOffice extends Mailer.Util { + * {@literal @}inject + * private AppCrypto crypto; + * public void sendWelcomeLetter(User user) { + * to(user.email); + * subject("Welcome to our super system"); + * from("noreply@mycom.com"); + * String token = crypto.generateToken(email); + * send(user, token); + * } + * } + * ``` + *

                                                                                                                                                                            + * Create a template file `resources/rythm/mail/sendWelcomeLetter.html`: + * + * ```html + * + * + * + * {@literal @}args User user, String token + * + * Please click the following link to verify your registration: + * + *

                                                                                                                                                                            + * http://@(_conf.host())/confirmSignUp?token=@token + *

                                                                                                                                                                            + *

                                                                                                                                                                            + * Note, this link can only be used once. + *

                                                                                                                                                                            + * + * + * ``` + *

                                                                                                                                                                            + * Then define a request handler to process new user registration + * + * ```java + * {@literal @}PostAction("signUp") + * public void handleSignUp(String email, String password, User.Dao userDao, PostOffice postOffice) { + * User user = new User(email, password); + * userDao.save(user); + * postOffice.sendWelcomeLetter(user); + * } + * ``` + *

                                                                                                                                                                            + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * + * @param id the id of the token + * @param payload other payloads of the token. + * @return an encrypted token string enbodies the `id` and `payloads`. + */ public String generateToken(String id, String... payload) { return Token.generateToken(secret, id, payload); } + /** + * Generate an ecrypted token string with life (expiry time) specified. + * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * + * @param expiration specify how long the generated string can live before expire. + * @param id the id of the token + * @param payload other payloads of the token. + * @return an encrypted token string enbodies the `id` and `payloads`. + */ public String generateToken(Token.Life expiration, String id, String ... payload) { return Token.generateToken(secret, expiration, id, payload); } + /** + * Generate an ecrypted token string with life (expiry time) specified in seconds. + * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * + * @param seconds specify how many seconds the generated string can live before expire. + * @param id the id of the token + * @param payload other payloads of the token. + * @return an encrypted token string enbodies the `id` and `payloads`. + */ public String generateToken(int seconds, String id, String ... payload) { return Token.generateToken(secret, seconds, id, payload); } + /** + * Parse a generated token string and returns a {@link Token} instance. + * + * A typical usage scenario of this method is to verify new user registration confirmation link sent + * to a welcome email. Refer to {@link #generateToken(String, String...)} + * + * ```java + * {@literal @}GetAction("confirmSignUp") + * public void confirmSignUp(String token, AppCrypto crypto, User.Dao userDao) { + * Token tk = crypto.parseToken(token); + * notFoundIfNot(tk.isValid()); + * String email = tk.id(); + * User user = userDao.findOneBy("email", email); + * notFoundIfNull(user); + * user.markAsConfirmed(); + * userDao.save(user); + * redirect("/welcome"); + * } + * ``` + * + * Note this method uses {@link act.conf.AppConfigKey#SECRET confiured application secret} + * + * @param tokenString the token string (generated wth `generateToken` call before. + * @return a `Token` instance. + */ public Token parseToken(String tokenString) { return Token.parseToken(secret, tokenString); } diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 757a4163a..9fd84be73 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -463,11 +463,15 @@ private Object evalFunc(String funcExpr) { return func.apply(); } - public void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, ProgressGauge gauge, boolean forceClearFixtures) { - start(scenarioManager, requestTemplateManager, true, gauge, forceClearFixtures); - } - - private void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, boolean reset, ProgressGauge gauge, boolean forceClearFixtures) { + /** + * Start running this scenario. + * + * @param scenarioManager scenario manager + * @param requestTemplateManager request template manager + * @param gauge progress gauge + * @param isDependent is this a dependent scenario run or direct scenario run + */ + public void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, ProgressGauge gauge, boolean isDependent) { this.scenarioManager = $.requireNotNull(scenarioManager); this.requestTemplateManager = $.requireNotNull(requestTemplateManager); this.status = PENDING; @@ -488,7 +492,15 @@ private void start(ScenarioManager scenarioManager, RequestTemplateManager reque gauge.step(); } } - boolean pass = (!reset || reset(gauge)) && run(gauge, forceClearFixtures); + boolean pass = true; + if (!isDependent) { + gauge.incrMaxHint(); + clearSession(); + pass = pass && clearFixtures(); + } + if (pass) { + pass = runDependents(gauge) && run(gauge); + } this.status = TestStatus.of(pass); if (TestStatus.FAIL == this.status) { for (Interaction interaction : this.interactions) { @@ -501,7 +513,6 @@ private void start(ScenarioManager scenarioManager, RequestTemplateManager reque } } } - public void clearSession() { if (depends.isEmpty()) { cookieStore().clear(); @@ -633,28 +644,28 @@ private boolean reset(ProgressGauge gauge) { } } - private boolean run(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, ProgressGauge gauge, boolean forceClearFixtures) { + private boolean runAsDependent(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, ProgressGauge gauge) { if (null == this.scenarioManager) { - this.start(scenarioManager, requestTemplateManager, forceClearFixtures, gauge, forceClearFixtures); + this.start(scenarioManager, requestTemplateManager, gauge, true); return this.status.pass(); } else { - return run(gauge, forceClearFixtures); + return run(gauge); } } - private boolean run(ProgressGauge gauge, boolean forceClearFixtures) { + private boolean run(ProgressGauge gauge) { if (status.finished()) { return status.pass(); } Timer timer = metric.startTimer("run"); try { - return runDependents(gauge, forceClearFixtures) && runInteractions(gauge); + return runDependents(gauge) && createFixtures() && generateTestData() && runInteractions(gauge); } finally { timer.stop(); } } - private boolean runDependents(ProgressGauge gauge, boolean forceClearFixtures) { + private boolean runDependents(ProgressGauge gauge) { List partitionSetups = scenarioManager.getPartitionSetups(partition); List allDeps = new ArrayList<>(); for (Scenario scenario : partitionSetups) { @@ -674,7 +685,7 @@ private boolean runDependents(ProgressGauge gauge, boolean forceClearFixtures) { try { Scenario old = current.get(); try { - if (!scenario.run(scenarioManager, requestTemplateManager, gauge, forceClearFixtures)) { + if (!scenario.runAsDependent(scenarioManager, requestTemplateManager, gauge)) { errorMessage = "dependency failure: " + scenario.name; return false; } @@ -705,7 +716,7 @@ private boolean runInteractions(ProgressGauge gauge) { try { gauge.setPayload(Test.PG_PAYLOAD_SCENARIO, title()); gauge.setPayload(Test.PG_PAYLOAD_INTERACTION, interaction.description); - boolean pass = run(interaction); + boolean pass = run0(interaction); if (!pass) { //errorMessage = S.fmt("interaction[%s] failure", interaction.description); return false; @@ -717,7 +728,7 @@ private boolean runInteractions(ProgressGauge gauge) { return true; } - private boolean run(Interaction interaction) { + private boolean run0(Interaction interaction) { boolean okay = interaction.run(); if (!okay) { return false; diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 290ab2231..096b34c5c 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -335,7 +335,7 @@ public List run(App app, Keyword testId, boolean shutdownApp, Progress } if ($.not(scenario.ignore)) { try { - scenario.start(scenarioManager, requestTemplateManager, gauge, !fixtureCleared); + scenario.start(scenarioManager, requestTemplateManager, gauge, false); if (!fixtureCleared && scenario.clearFixtures) { fixtureCleared = true; } diff --git a/src/main/java/act/view/View.java b/src/main/java/act/view/View.java index 20dfc378b..bebc1b605 100644 --- a/src/main/java/act/view/View.java +++ b/src/main/java/act/view/View.java @@ -48,12 +48,6 @@ public abstract class View extends AppServicePlugin { @Override protected void applyTo(final App app) { Act.viewManager().register(this); - app.jobManager().on(SysEventId.CLASS_LOADER_INITIALIZED, getClass().getSimpleName() + ":init", new Runnable() { - @Override - public void run() { - init(app); - } - }); } public boolean appliedTo(ActContext context) { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1161.java b/testapps/GHIssues/src/main/java/ghissues/Gh1161.java new file mode 100644 index 000000000..b9d100a42 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1161.java @@ -0,0 +1,45 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.db.jpa.JPADao; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.C; + +import javax.inject.Inject; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.util.Date; +import java.util.List; + +import static act.controller.Controller.Util.renderJson; + +@UrlContext("1161") +public class Gh1161 extends BaseController { + @Entity(name = "m1161") + public static class ModelB { + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Id + public Integer id; + public String name; + } + + public static class Dao extends JPADao { + + } + + @Inject + private Dao dao; + + @GetAction("{name}") + public ModelB get(String name) { + return dao.findOneBy("name", name); + } + + @PostAction("nil") + public void doNothing() {} +} diff --git a/testapps/GHIssues/src/main/resources/test/fixtures/1161.yml b/testapps/GHIssues/src/main/resources/test/fixtures/1161.yml new file mode 100644 index 000000000..feb64aad7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/fixtures/1161.yml @@ -0,0 +1,2 @@ +ghissues.Gh1161$ModelB(Green): + name: Green diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1161.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1161.yml new file mode 100644 index 000000000..6a117c7a2 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1161.yml @@ -0,0 +1,20 @@ +Scenario(1161-c): + interactions: + - request: + post: 1161/nil +Scenario(1161-b): + depends: + - 1161-c + fixtures: + - 1161.yml + interactions: + - request: + get: 1161/Green + response: + name: Green +Scenario(1161-a): + depends: + - 1161-b + interactions: + - request: + post: 1161/nil From 471dc2b68c3118d8807fd265651845fdc1410045 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 18 Jul 2019 08:05:39 +1000 Subject: [PATCH 489/730] fix #1168, #1167, #1169 --- CHANGELOG.md | 5 +- pom.xml | 4 +- src/main/java/act/controller/Controller.java | 3 +- src/main/java/act/inject/util/Sorter.java | 4 +- src/main/java/act/test/Scenario.java | 48 ++++++++++++++++---- src/main/java/act/test/Test.java | 4 +- src/main/resources/rythm/~test_async.html | 1 + 7 files changed, 53 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 170b9c7ff..4d7e5fe1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.8.26** +* Act-Test - when dependent scenario is running in a different partition it shall be run anyway even it has been finished before #1169 +* Act-Test download checksum verification might cause NPE #1168 +* Act-Test - circular dependency caused by `setup` #1167 * View plugin get initialised twice #1166 * Scenario spec - cannot specify long value for substitution #1164 * LoadConfig - suppress warning messages #1163 @@ -162,7 +165,7 @@ * Test - allow it post body for DELETE request #1024 * Annotations with ValueLoader cannot work if post with json #1016 * Routing issue with dynamic aliases and keyword matching #1022 -* Make CLI help command default to display application commands 1018# +* Make CLI help command default to display application commands #1018 * CLI - execute `conf.trace-handler -e` trigger `IllegalAccessError` #1019 **1.8.16** 09/Dec/2018 diff --git a/pom.xml b/pom.xml index f8960c617..bda0b228b 100644 --- a/pom.xml +++ b/pom.xml @@ -66,9 +66,9 @@ 3.12.1 - 1.19.5-SNAPSHOT + 1.20.0-SNAPSHOT 1.7.0 - 1.10.0 + 1.11.0-SNAPSHOT 1.10.0 1.10.0 1.9.0 diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 12a72b12d..aeb3428dd 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1911,11 +1911,12 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon return null; } Class vCls = v.getClass(); + boolean isSimpleType = $.isSimpleType(vCls); boolean shouldUseToString = $$.shouldUseToString(vCls); if (accept == H.Format.HTML && !shouldUseToString) { requireJSON = true; } - if ($.isSimpleType(vCls) || shouldUseToString) { + if (isSimpleType || shouldUseToString) { boolean isArray = vCls.isArray(); return inferPrimitiveResult(v, context, requireJSON, requireXML, isArray, shouldUseToString); } else if (v instanceof InputStream) { diff --git a/src/main/java/act/inject/util/Sorter.java b/src/main/java/act/inject/util/Sorter.java index 7820f5cbf..35cba4d3a 100644 --- a/src/main/java/act/inject/util/Sorter.java +++ b/src/main/java/act/inject/util/Sorter.java @@ -33,10 +33,10 @@ public class Sorter implements PostConstructProcessor { @Override public int compare(Object o1, Object o2) { if (o1 == null) { - return -1; + o1 = -1; } if (o2 == null) { - return 1; + o2 = 1; } if (o1 == o2 || o1.equals(o2)) { return 0; diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 9fd84be73..0c335dc8b 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -324,7 +324,7 @@ private String verifyXmlBody(Object xmlBody) { public Throwable cause; public boolean clearFixtures = true; public String urlContext; - public String partition = "__DEFAULT"; + public String partition = "_default_"; public String source; private transient Metric metric = Act.metricPlugin().metric(MetricInfo.ACT_TEST_SCENARIO); @@ -669,29 +669,42 @@ private boolean runDependents(ProgressGauge gauge) { List partitionSetups = scenarioManager.getPartitionSetups(partition); List allDeps = new ArrayList<>(); for (Scenario scenario : partitionSetups) { - if (scenario == this) { + if (scenario == this || scenario.isDependOn(this, scenarioManager)) { break; } - allDeps.add(scenario); + if (!allDeps.contains(scenario)) { + allDeps.add(scenario); + } } for (String dependent : depends) { Scenario scenario = scenarioManager.get(dependent); errorIf(null == scenario, "Dependent not found: " + dependent); - allDeps.add(scenario); + if (!allDeps.contains(scenario)) { + allDeps.add(scenario); + } } Collections.sort(allDeps, new ScenarioComparator(scenarioManager, partition)); gauge.incrMaxHintBy(allDeps.size()); - for (Scenario scenario : allDeps) { + for (Scenario depScenario : allDeps) { try { Scenario old = current.get(); + Scenario s = null == old ? this : old; + TestStatus oldStatus = null; + if (depScenario.status == TestStatus.PASS && S.neq(depScenario.partition, s.partition)) { + oldStatus = depScenario.status; + depScenario.status = PENDING; // reset scenario status if run dependents across partition + } try { - if (!scenario.runAsDependent(scenarioManager, requestTemplateManager, gauge)) { - errorMessage = "dependency failure: " + scenario.name; + if (!depScenario.runAsDependent(scenarioManager, requestTemplateManager, gauge)) { + errorMessage = "dependency failure: " + depScenario.name; return false; } - inheritFrom(scenario); + inheritFrom(depScenario); } finally { current.set(old); + if (null != oldStatus) { + depScenario.status = oldStatus; + } } } finally { gauge.step(); @@ -700,6 +713,21 @@ private boolean runDependents(ProgressGauge gauge) { return true; } + private boolean isDependOn(Scenario that, ScenarioManager scenarioManager) { + if (depends.contains(that.refId) || depends.contains(that.name)) { + return true; + } + for (String s : depends) { + Scenario scenario = scenarioManager.get(s); + if (null != scenario) { + if (scenario.isDependOn(that, scenarioManager)) { + return true; + } + } + } + return false; + } + private void inheritFrom(Scenario dependent) { lastHeaders.set(dependent.lastHeaders.get()); lastData.set(dependent.lastData.get()); @@ -763,7 +791,9 @@ void verifyDownloadChecksum(Response response, String checksumExpected) { if (null == o) { o = checksumExpected; } - String downloadChecksum = IO.checksum(response.body().byteStream()); + ResponseBody body = response.body(); + errorIf(null == body, "No download found"); + String downloadChecksum = IO.checksum(body.byteStream()); errorIfNot($.eq(downloadChecksum, o), "Download checksum not match"); } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 096b34c5c..df0ed2703 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -296,7 +296,8 @@ public Map result() { public List run(App app, Keyword testId, boolean shutdownApp, ProgressGauge gauge) { E.illegalStateIf(inProgress()); - info("Start running test scenarios\n"); + info("Start running test scenarios"); + info("---------------------------------------------------------------"); int exitCode = 0; EventBus eventBus = app.eventBus(); STARTED.set(true); @@ -334,6 +335,7 @@ public List run(App app, Keyword testId, boolean shutdownApp, Progress scenario.ignore = null; } if ($.not(scenario.ignore)) { + info("running [%s]%s", scenario.partition, scenario.name); try { scenario.start(scenarioManager, requestTemplateManager, gauge, false); if (!fixtureCleared && scenario.clearFixtures) { diff --git a/src/main/resources/rythm/~test_async.html b/src/main/resources/rythm/~test_async.html index 1beac0f29..dce6e3f0a 100644 --- a/src/main/resources/rythm/~test_async.html +++ b/src/main/resources/rythm/~test_async.html @@ -96,6 +96,7 @@ } h4.ignore { color: #aaa; + margin-bottom: 20px; } ul.interactions li { margin-bottom: 8px; From 022bc924bfa2acdb90b9605051eb919cc365a0b4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 19 Jul 2019 08:37:38 +1000 Subject: [PATCH 490/730] API doc - allow landing to specific part when open link with hash #1171 --- CHANGELOG.md | 1 + src/main/resources/asset/~act/apibook/endpoint_list.tag | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d7e5fe1d..01e0ed518 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.26** +* API doc - allow landing to specific part when open link with hash #1171 * Act-Test - when dependent scenario is running in a different partition it shall be run anyway even it has been finished before #1169 * Act-Test download checksum verification might cause NPE #1168 * Act-Test - circular dependency caused by `setup` #1167 diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index d8beace2a..441ee15e4 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -252,6 +252,12 @@ self.update() riot.store.trigger('endpoints-fetched', endpoints); self.patchPreCode() + if(window.location.hash) { + var anchor = document.getElementById(window.location.hash.substr(1)) + if (anchor) { + anchor.scrollIntoView(); + } + } }) } riot.store.on('module-selected', function(modules) { From aadae9b8ce68f12250e79b1f2c1f9a48f63d0060 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 21 Jul 2019 13:11:15 +1000 Subject: [PATCH 491/730] update osgl-tool to 1.20.0; update genie to 1.11.0 --- CHANGELOG.md | 2 ++ legacy-testapp/pom.xml | 2 +- pom.xml | 4 ++-- src/main/java/act/test/Test.java | 4 +++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01e0ed518..dcd8670da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.26** +* update osgl-tool to 1.20.0 +* update genie to 1.11.0 * API doc - allow landing to specific part when open link with hash #1171 * Act-Test - when dependent scenario is running in a different partition it shall be run anyway even it has been finished before #1169 * Act-Test download checksum verification might cause NPE #1168 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 1661deb84..6cc4fb1b5 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.24a-SNAPSHOT + 1.8.26-SNAPSHOT [0.13.0, 2.0.0) 1.7.2 testapp.TestApp diff --git a/pom.xml b/pom.xml index bda0b228b..361d0be81 100644 --- a/pom.xml +++ b/pom.xml @@ -66,9 +66,9 @@ 3.12.1 - 1.20.0-SNAPSHOT + 1.20.0 1.7.0 - 1.11.0-SNAPSHOT + 1.11.0 1.10.0 1.10.0 1.9.0 diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index df0ed2703..8037e6ee1 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -335,7 +335,9 @@ public List run(App app, Keyword testId, boolean shutdownApp, Progress scenario.ignore = null; } if ($.not(scenario.ignore)) { - info("running [%s]%s", scenario.partition, scenario.name); + if (S.neq(Act.profile(), "test")) { + info("running [%s]%s", scenario.partition, scenario.name); + } try { scenario.start(scenarioManager, requestTemplateManager, gauge, false); if (!fixtureCleared && scenario.clearFixtures) { From 68ff3e412cf12454000e21e9a935d26fa8b0c827 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 21 Jul 2019 13:12:28 +1000 Subject: [PATCH 492/730] [maven-release-plugin] prepare release act-1.8.26 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 361d0be81..011adccf1 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.26-SNAPSHOT + 1.8.26 ACT Framework The ACT full stack MVC framework From 4b905fdfb9ca0ac09c2691765473bf2fff48ed22 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 21 Jul 2019 13:12:41 +1000 Subject: [PATCH 493/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 011adccf1..b065f090a 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.26 + 1.8.27-SNAPSHOT ACT Framework The ACT full stack MVC framework From 29462ee0e6f49936e705a392413b95dda7bc04f5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 21 Jul 2019 23:15:06 +1000 Subject: [PATCH 494/730] update README, VERSION_MATRIX and NEWS --- NEWS.md | 8 ++++++++ README.md | 10 +++++----- VERSION_MATRIX.md | 40 ++++++++++++++++++++-------------------- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/NEWS.md b/NEWS.md index 607bc8d27..3f04d9542 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,12 @@
                                                                                                                                                                              +
                                                                                                                                                                            • + 21 Jul 2019 + + + act-1.8.26 released + + +
                                                                                                                                                                            • 03 Jul 2019 diff --git a/README.md b/README.md index afd72cc04..299922547 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.25.0 + 1.8.26.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.25.0 + -DarchetypeVersion=1.8.26.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.25.0 + -DarchetypeVersion=1.8.26.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.25.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.26.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.25.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.26.0 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 1d57f5f5c..055c8ec4b 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,25 +1,25 @@ # Version Matrix -| act | 1.8.16 | 1.8.17 | 1.8.18 | 1.8.19 | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | -| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.5.3 | 1.5.3 | 1.5.4 | 1.5.4 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | -| beetl | 1.4.6 | 1.4.6 | 1.4.7 | 1.4.7 | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | -| beetlsql | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | -| ebean-java7 | 1.7.5 | 1.7.5 | 1.7.5 | 1.7.5 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | -| ebean(java8) | 1.7.5 | 1.7.5 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | -| eclipselink(java8) | 1.5.5 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | -| excel | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | -| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | -| hibernate | 1.5.4 | 1.5.5 | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | -| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | -| jpa-common | 1.5.4 | 1.5.5 | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | -| morphia | 1.6.5 | 1.6.6 | 1.6.6 | 1.6.6 | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | -| mustache(java8) | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | -| social | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | -| sql-common | 1.4.4 | 1.4.4 | 1.4.4 | 1.4.4 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | -| storage(java8) | 0.13.5 | 0.13.5 | 0.13.5 | 0.13.5 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | -| thymeleaf | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | -| velocity | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | +| act | 1.8.16 | 1.8.17 | 1.8.18 | 1.8.19 | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | +| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | +| aaa | 1.5.3 | 1.5.3 | 1.5.4 | 1.5.4 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | +| beetl | 1.4.6 | 1.4.6 | 1.4.7 | 1.4.7 | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | +| beetlsql | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | +| ebean-java7 | 1.7.5 | 1.7.5 | 1.7.5 | 1.7.5 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | +| ebean(java8) | 1.7.5 | 1.7.5 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | +| eclipselink(java8) | 1.5.5 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | +| excel | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | +| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | +| hibernate | 1.5.4 | 1.5.5 | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | +| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | +| jpa-common | 1.5.4 | 1.5.5 | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | +| morphia | 1.6.5 | 1.6.6 | 1.6.6 | 1.6.6 | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | +| mustache(java8) | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | +| social | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | +| sql-common | 1.4.4 | 1.4.4 | 1.4.4 | 1.4.4 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | +| storage(java8) | 0.13.5 | 0.13.5 | 0.13.5 | 0.13.5 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | +| thymeleaf | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | +| velocity | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | ## Note From c05756d45414acf7ac2846bbe3d4a6f3b8718483 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 23 Jul 2019 08:40:49 +1000 Subject: [PATCH 495/730] fix #1175, #1176 and #1177 --- CHANGELOG.md | 5 +++++ src/main/java/act/app/App.java | 5 +++-- src/main/java/act/job/JobAnnotationProcessor.java | 10 +++++++--- src/main/java/act/job/bytecode/JobByteCodeScanner.java | 6 +++++- src/main/java/act/test/util/ScenarioManager.java | 10 +++++++--- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcd8670da..1c86f99cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # ActFramework Change Log +**1.8.27** +* `FixtureLoader` not effective after called #1177 +* NPE triggered in `requestThrottleExpireScale` after hot reload #1175 +* Act-Test - NPE encountered when scenario is parsed after scenario depend on it parsed #1176 + **1.8.26** * update osgl-tool to 1.20.0 * update genie to 1.11.0 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index d9f4ef823..e28099564 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -785,6 +785,9 @@ public void run() { initHttpConfig(); initViewManager(); + registerMetricProvider(); + config().preloadConfigurations(); + // let's any emit the dependency injector loaded event // in case some other service depend on this event. // If any DI plugin e.g. guice has emitted this event @@ -792,8 +795,6 @@ public void run() { // because once app event is consumed the event listeners // are cleared emit(DEPENDENCY_INJECTOR_PROVISIONED); - registerMetricProvider(); - config().preloadConfigurations(); initSessionManager(); emit(SINGLETON_PROVISIONED); } diff --git a/src/main/java/act/job/JobAnnotationProcessor.java b/src/main/java/act/job/JobAnnotationProcessor.java index 41ad7784a..4f94e87ba 100644 --- a/src/main/java/act/job/JobAnnotationProcessor.java +++ b/src/main/java/act/job/JobAnnotationProcessor.java @@ -63,7 +63,7 @@ public void run() { }); return; } - Job job = getOrCreateMethodJob(method); + Job job = getOrCreateMethodJob(method, anno != FixtureLoader.class); String value = info.value; if (Cron.class.isAssignableFrom(anno)) { registerCron(job, evaluateExpression(value, anno)); @@ -158,11 +158,15 @@ private boolean isAbstract(JobMethodMetaInfo method) { JobClassMetaInfo classMetaInfo = method.classInfo(); return (classMetaInfo.isAbstract()); } - + private Job getOrCreateMethodJob(JobMethodMetaInfo method) { + return getOrCreateMethodJob(method, true); + } + + private Job getOrCreateMethodJob(JobMethodMetaInfo method, boolean oneTime) { String id = method.id(); JobManager jobManager = app().jobManager(); Job job = jobManager.jobById(id, false); - return null == job ? new Job(id, app().jobManager(), new ReflectedJobInvoker<>(method, app()), true) : job; + return null == job ? new Job(id, app().jobManager(), new ReflectedJobInvoker<>(method, app()), oneTime) : job; } } diff --git a/src/main/java/act/job/bytecode/JobByteCodeScanner.java b/src/main/java/act/job/bytecode/JobByteCodeScanner.java index f5d8d8015..e05b86744 100644 --- a/src/main/java/act/job/bytecode/JobByteCodeScanner.java +++ b/src/main/java/act/job/bytecode/JobByteCodeScanner.java @@ -223,7 +223,11 @@ public void visitEnum(String name, String desc, String value) { public void visit(String name, Object value) { if ("value".equals(name)) { if (this.currentInfo.annotationType == FixtureLoader.class) { - method.id(S.string(value)); + String id = S.string(value); + if (S.blank(id)) { + id = methodName; + } + method.id(id); } else { this.currentInfo.value = value.toString(); } diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index 0bd3b6c7a..866db23df 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -83,6 +83,10 @@ public List getPartitionSetups(String partition) { public Map load() { loadDefault(); searchScenarioFolder(); + ScenarioComparator comparator = new ScenarioComparator(this, false); + for (List list : partitionSetups.values()) { + Collections.sort(list, comparator); + } Map scenarioMap = new LinkedHashMap<>(); for (Map.Entry entry : store.entrySet()) { scenarioMap.put(entry.getKey().hyphenated(), entry.getValue()); @@ -278,7 +282,7 @@ private void parseOne(String content, String fileName) { partitionSetups.put(Keyword.of(scenario.partition), list); } list.add(scenario); - Collections.sort(list, new ScenarioComparator(this, false)); + // DON"T DO THIS NOW - dependent scenario might not be loaded yet Collections.sort(list, new ScenarioComparator(this, false)); } if (S.notBlank(scenario.refId)) { this.store.put(Keyword.of(scenario.refId), scenario); From ffcd6540cfb20f0f394e0adf51296a9b90733d71 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 25 Jul 2019 22:17:55 +1000 Subject: [PATCH 496/730] ConcurrentModificationException when output to csv with PropertySpec specified #1178 --- CHANGELOG.md | 1 + src/main/java/act/data/OutputFieldsCache.java | 2 +- src/main/resources/asset/~act/apibook/endpoint_list.tag | 8 ++++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c86f99cc..abd5a8fd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.27** +* ConcurrentModificationException when output to csv with PropertySpec specified #1178 * `FixtureLoader` not effective after called #1177 * NPE triggered in `requestThrottleExpireScale` after hot reload #1175 * Act-Test - NPE encountered when scenario is parsed after scenario depend on it parsed #1176 diff --git a/src/main/java/act/data/OutputFieldsCache.java b/src/main/java/act/data/OutputFieldsCache.java index 331932881..1d7bdf820 100644 --- a/src/main/java/act/data/OutputFieldsCache.java +++ b/src/main/java/act/data/OutputFieldsCache.java @@ -97,7 +97,7 @@ List calculateOutputs(K k) { boolean excludeHasPattern = hasPattern(excluded, lsp); if (!excludeHasPattern) { List ret = new ArrayList<>(allFields); - for (S.Pair pair : ret) { + for (S.Pair pair : allFields) { for (String s : excluded) { if (pair._1.equals(s)) { ret.remove(pair); diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index 441ee15e4..d6b687f4c 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -41,7 +41,9 @@
                                                                                                                                                                              Json body example
                                                                                                                                                                              -
                                                                                                                                                                              { endpoint.sampleJsonPost }
                                                                                                                                                                              +
                                                                                                                                                                              +                { endpoint.sampleJsonPost }
                                                                                                                                                                              +            
                                                                                                                                                                              Return
                                                                                                                                                                              @@ -49,7 +51,9 @@
                                                                                                                                                                              Return value sample
                                                                                                                                                                              -
                                                                                                                                                                              { endpoint.returnSample }
                                                                                                                                                                              +
                                                                                                                                                                              +                { endpoint.returnSample }
                                                                                                                                                                              +            
                                                                                                                                                                               
                                                                                                                                                                              From 97261a309edf03f2894a81008d5c01e5fabf0ac1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 26 Jul 2019 23:38:57 +1000 Subject: [PATCH 497/730] fix #1179, #1180 and #1181 --- CHANGELOG.md | 3 +++ src/main/java/act/ActResponse.java | 18 +++++++++++++-- src/main/java/act/app/ActionContext.java | 20 ++++++++++++++++- .../java/act/controller/ResponseCache.java | 2 +- .../act/handler/builtin/ResourceGetter.java | 5 ++++- src/main/java/act/util/ActContext.java | 3 ++- src/main/java/act/xio/NetworkHandler.java | 6 +++-- .../act/xio/undertow/UndertowResponse.java | 22 ++++++++++++++++--- .../asset/~act/apibook/endpoint_list.tag | 17 ++++++++------ src/test/java/act/MockResponse.java | 2 +- src/test/java/act/route/MockResponse.java | 2 +- 11 files changed, 80 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abd5a8fd6..d65e4244f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.8.27** +* ApiDoc - add syntax highlight for JSON samples #1181 +* ResourceGetter - accessing folder that access is not allowed cause response never close #1180 +* ActionContext not released when `ResourceGetter` is handling request #1179 * ConcurrentModificationException when output to csv with PropertySpec specified #1178 * `FixtureLoader` not effective after called #1177 * NPE triggered in `requestThrottleExpireScale` after hot reload #1175 diff --git a/src/main/java/act/ActResponse.java b/src/main/java/act/ActResponse.java index 6e2073e22..b8f1915a8 100644 --- a/src/main/java/act/ActResponse.java +++ b/src/main/java/act/ActResponse.java @@ -159,16 +159,30 @@ public ActResponse beforeWritingContent() { } public ActResponse afterWritingContent() { - ActionContext ctx = context(); if (committed) { return this; } - committed = true; commit(); + ActionContext ctx = context(); MvcConfig.applyAfterCommitResultHandler(Ok.get(), ctx.req(), this); return this; } + @Override + public final void commit() { + if (isCommitted()) { + return; + } + committed = true; + doCommit(); + } + + protected abstract void doCommit(); + + protected final boolean isCommitted() { + return committed; + } + @Override protected void _setContentType(String type) { this.contentType = type; diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 3625e3775..2e5e62cde 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -1422,6 +1422,7 @@ protected void releaseResources() { ParamValueLoaderService.clearParamTree(); sessionManager = null; this.allParams = null; + this.extraParams.clear(); this.extraParams = null; this.requestParamCache = null; this.router = null; @@ -1430,9 +1431,26 @@ protected void releaseResources() { // xio impl might need this this.response = null; this.flash = null; this.session = null; - this.controllerInstances = null; this.result = null; this.uploads.clear(); + this.uploads = null; + this.request = null; + this.response = null; + this.actionPath = null; + this.urlContext = null; + this.urlPath = null; + if (null != this.pathVarNames) { + this.pathVarNames.clear(); + this.pathVarNames = null; + } + if (null != this.controllerInstances) { + this.controllerInstances.clear(); + this.controllerInstances = null; + } + this.reflectedHandlerInvoker = null; + this.handlerClass = null; + this.encodedSessionToken = null; + this.localeResolver = null; ActionContext.clearLocal(); } this.state = State.DESTROYED; diff --git a/src/main/java/act/controller/ResponseCache.java b/src/main/java/act/controller/ResponseCache.java index 22081b7fd..9656849d3 100644 --- a/src/main/java/act/controller/ResponseCache.java +++ b/src/main/java/act/controller/ResponseCache.java @@ -364,7 +364,7 @@ public H.Response writeContent(ByteBuffer buffer) { } @Override - public void commit() { + protected void doCommit() { if (null != outputCache) { outputCache.commit(); } else if (null != osCache) { diff --git a/src/main/java/act/handler/builtin/ResourceGetter.java b/src/main/java/act/handler/builtin/ResourceGetter.java index eb8a358c8..cf1106536 100644 --- a/src/main/java/act/handler/builtin/ResourceGetter.java +++ b/src/main/java/act/handler/builtin/ResourceGetter.java @@ -221,10 +221,12 @@ protected void handle(String path, ActionContext context) { loadPath = S.pathConcat(base, SEP, path); target = app.getResource(loadPath); if (null == target) { - throw NotFound.get(); + AlwaysNotFound.INSTANCE.handle(context); + return; } } if (preventFolderAccess(target, loadPath, context)) { + AlwaysForbidden.INSTANCE.handle(context); return; } ActResponse resp = context.prepareRespForResultEvaluation(); @@ -279,6 +281,7 @@ protected void handle(String path, ActionContext context) { } else { try { int n = IO.copy(target.openStream(), resp.outputStream()); + resp.afterWritingContent(); boolean smallResource = n < config.resourcePreloadSizeLimit(); if (!smallResource) { largeResource.add(path); diff --git a/src/main/java/act/util/ActContext.java b/src/main/java/act/util/ActContext.java index a06309741..ee780b504 100644 --- a/src/main/java/act/util/ActContext.java +++ b/src/main/java/act/util/ActContext.java @@ -317,7 +317,8 @@ protected void releaseResources() { this.renderArgs.clear(); this.template = null; this.app = null; - this.template = null; + this.handlerMethod = null; + this.currentMethod = null; this.listenerList.clear(); this.destroyableList.clear(); this.violations.clear(); diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index c44d6fc77..02fa268f3 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -202,9 +202,11 @@ public void run() { } if (ctx.isReadyForDestroy()) { ctx.destroy(); - // otherwise the ctx get transferred to another thread + // current has already been cleared + } else { + // the ctx get transferred to another thread + ActionContext.clearCurrent(); } - ActionContext.clearCurrent(); timer.stop(); } } diff --git a/src/main/java/act/xio/undertow/UndertowResponse.java b/src/main/java/act/xio/undertow/UndertowResponse.java index 0a00349a8..9f2b95db8 100644 --- a/src/main/java/act/xio/undertow/UndertowResponse.java +++ b/src/main/java/act/xio/undertow/UndertowResponse.java @@ -23,6 +23,7 @@ import act.ActResponse; import act.app.ActionContext; import act.conf.AppConfig; +import io.undertow.io.DefaultIoCallback; import io.undertow.io.IoCallback; import io.undertow.io.Sender; import io.undertow.server.HttpServerExchange; @@ -148,7 +149,18 @@ public UndertowResponse writeBinary(ISObject binary) { @Override public UndertowResponse send(URL url) { Resource resource = new URLResource(url, ""); - resource.serve(sender(), hse, IoCallback.END_EXCHANGE); + resource.serve(sender(), hse, new DefaultIoCallback() { + @Override + public void onComplete(HttpServerExchange exchange, Sender sender) { + super.onComplete(exchange, sender); + afterWritingContent(); + if (!blocking()) { + ActionContext context = context(); + context.destroy(); + } + } + + }); return me(); } @@ -162,6 +174,11 @@ public UndertowResponse send(File file) { public void onComplete(HttpServerExchange exchange, Sender sender) { IO.close(channel); IoCallback.END_EXCHANGE.onComplete(exchange, sender); + afterWritingContent(); + if (!blocking()) { + ActionContext context = context(); + context.destroy(); + } } @Override @@ -171,7 +188,6 @@ public void onException(HttpServerExchange exchange, Sender sender, IOException } }); endAsync = !blocking(); - afterWritingContent(); } catch (IOException e) { endAsync = false; afterWritingContent(); @@ -191,7 +207,7 @@ public Locale locale() { } @Override - public void commit() { + protected void doCommit() { if (null != this.output) { IO.close(output); } else if (null != this.outputStream) { diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index d6b687f4c..675c63885 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -41,19 +41,15 @@
                                                                                                                                                                              Json body example
                                                                                                                                                                              -
                                                                                                                                                                              -                { endpoint.sampleJsonPost }
                                                                                                                                                                              -            
                                                                                                                                                                              + +
                                                                                                                                                                              { endpoint.sampleJsonPost }
                                                                                                                                                                              Return
                                                                                                                                                                              -
                                                                                                                                                                              Return value sample
                                                                                                                                                                              -
                                                                                                                                                                              -                { endpoint.returnSample }
                                                                                                                                                                              -            
                                                                                                                                                                              +
                                                                                                                                                                               
                                                                                                                                                                              @@ -226,6 +222,11 @@ return self.endpoints.filter(x => x.description.toLowerCase().includes(self.filter) || x.id.toLowerCase().includes(self.filter) || x.path.toLowerCase().includes(self.filter)) } } + highlightjs(s) { + if (!s) return '' + s = "```json\n" + s + "\n```" + return riot.md.render(s) + } fetchEndpoints() { $.getJSON('/~/apibook/endpoints', function(endpoints) { for(var i = 0, j = endpoints.length; i < j; ++i) { @@ -238,6 +239,8 @@ } else { endpoint.richReturnDescription = '' } + endpoint.sampleJsonPost = self.highlightjs(endpoint.sampleJsonPost) + endpoint.returnSample = self.highlightjs(endpoint.returnSample) for (var pi = 0, pj = endpoint.params.length; pi < pj; ++pi) { var param = endpoint.params[pi] if (param && param.description) { diff --git a/src/test/java/act/MockResponse.java b/src/test/java/act/MockResponse.java index c71d4b68e..c788dc98f 100644 --- a/src/test/java/act/MockResponse.java +++ b/src/test/java/act/MockResponse.java @@ -84,7 +84,7 @@ public MockResponse writeContent(ByteBuffer byteBuffer) { } @Override - public void commit() { + protected void doCommit() { } diff --git a/src/test/java/act/route/MockResponse.java b/src/test/java/act/route/MockResponse.java index 5e34562af..19197e26b 100644 --- a/src/test/java/act/route/MockResponse.java +++ b/src/test/java/act/route/MockResponse.java @@ -89,7 +89,7 @@ public MockResponse writeContent(ByteBuffer buffer) { } @Override - public void commit() { + protected void doCommit() { } From 9d799abe36965cb549f563d5071a394dd664ef29 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 31 Jul 2019 06:28:32 +1000 Subject: [PATCH 498/730] fix #1182 and #1183 --- CHANGELOG.md | 4 +++- src/main/java/act/cli/CliDispatcher.java | 8 +------- .../bytecode/CommanderByteCodeScanner.java | 19 +++++++++++++++++-- .../act/cli/meta/CommanderClassMetaInfo.java | 6 +----- src/main/java/act/util/AsmTypes.java | 1 + 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d65e4244f..4cf9d3c8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.27** +* Command register - it shall not register a command on abstract class #1183 +* CommandBytecodeScanner - it needs to register command by name along with prefix #1182 * ApiDoc - add syntax highlight for JSON samples #1181 * ResourceGetter - accessing folder that access is not allowed cause response never close #1180 * ActionContext not released when `ResourceGetter` is handling request #1179 @@ -95,7 +97,7 @@ * DataPropertyRepository - StackOverflowError building property path for model with circular reference #1093 * Error encountered with customised Unique validator when working with JPA #1069 * Act-Test - add refId property to Scenario #1091 -* Add switch to disable auto hot deploy in DEV mode #1090 +* Add switch to disable auto hot reload in DEV mode #1090 * GH 1078 - Log warn message when `@Global` is found on instance method of an abstract class * API Doc - handle `@inheritDoc` tag #1089 * ReflectedInvokerHelper treated `Set` as stateless type #1088 diff --git a/src/main/java/act/cli/CliDispatcher.java b/src/main/java/act/cli/CliDispatcher.java index 2eab14442..5db971a33 100644 --- a/src/main/java/act/cli/CliDispatcher.java +++ b/src/main/java/act/cli/CliDispatcher.java @@ -67,12 +67,6 @@ public void run() { registerBuiltInHandlers(); } }); - app.jobManager().on(SysEventId.PRE_START, new Runnable() { - @Override - public void run() { - resolveCommandPrefix(); - } - }); } public CliDispatcher registerCommandHandler(String command, CommandMethodMetaInfo methodMetaInfo, CommanderClassMetaInfo classMetaInfo) { @@ -81,7 +75,7 @@ public CliDispatcher registerCommandHandler(String command, CommandMethodMetaInf if (registry.containsKey(s)) { throw E.invalidConfiguration("Command %s already registered", command); } - addToRegistry0(s, new CliHandlerProxy(classMetaInfo, methodMetaInfo, app())); + addToRegistry(s, new CliHandlerProxy(classMetaInfo, methodMetaInfo, app())); logger.debug("Command registered: %s", s); } return this; diff --git a/src/main/java/act/cli/bytecode/CommanderByteCodeScanner.java b/src/main/java/act/cli/bytecode/CommanderByteCodeScanner.java index 0eab8f5cf..b070f3363 100644 --- a/src/main/java/act/cli/bytecode/CommanderByteCodeScanner.java +++ b/src/main/java/act/cli/bytecode/CommanderByteCodeScanner.java @@ -122,6 +122,14 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { } else if ($.eq(AsmTypes.JSON_VIEW.asmType(), type)) { classInfo.view(CliView.JSON); return av; + } else if ($.eq(AsmTypes.CMD_PREFIX.asmType(), type)) { + return new AnnotationVisitor(ASM5, av) { + @Override + public void visit(String name, Object value) { + classInfo.contextPath(S.string(value)); + super.visit(name, value); + } + }; } return av; } @@ -144,8 +152,15 @@ public MethodVisitor visitMethod(int access, String name, String desc, String si @Override public void visitEnd() { - for (CommandMethodMetaInfo commandMethodMetaInfo : classInfo.commandList()) { - dispatcher.registerCommandHandler(commandMethodMetaInfo.commandName(), commandMethodMetaInfo, classInfo); + if (!classInfo.isAbstract()) { + for (CommandMethodMetaInfo commandMethodMetaInfo : classInfo.commandList()) { + String prefix = classInfo.contextPath(); + String commandName = commandMethodMetaInfo.commandName(); + if (S.notBlank(prefix)) { + commandName = S.pathConcat(prefix, '.', commandName); + } + dispatcher.registerCommandHandler(commandName, commandMethodMetaInfo, classInfo); + } } super.visitEnd(); } diff --git a/src/main/java/act/cli/meta/CommanderClassMetaInfo.java b/src/main/java/act/cli/meta/CommanderClassMetaInfo.java index 48ee29fee..77913184a 100644 --- a/src/main/java/act/cli/meta/CommanderClassMetaInfo.java +++ b/src/main/java/act/cli/meta/CommanderClassMetaInfo.java @@ -206,11 +206,7 @@ public String contextPath() { } public CommanderClassMetaInfo contextPath(String path) { - if (S.blank(path)) { - contextPath = "/"; - } else { - contextPath = path; - } + contextPath = path; return this; } diff --git a/src/main/java/act/util/AsmTypes.java b/src/main/java/act/util/AsmTypes.java index bfc5d604c..dde565520 100644 --- a/src/main/java/act/util/AsmTypes.java +++ b/src/main/java/act/util/AsmTypes.java @@ -69,6 +69,7 @@ public enum AsmTypes implements Opcodes { public static AsmType TREE_VIEW = new AsmType<>(TreeView.class); public static AsmType CSV_VIEW_DEPRECATED = new AsmType<>(act.cli.CsvView.class); public static AsmType CSV_VIEW = new AsmType<>(CsvView.class); + public static AsmType CMD_PREFIX = new AsmType<>(CommandPrefix.class); public static AsmType SUB_CLASS_FINDER = new AsmType<>(SubClassFinder.class); public static AsmType ANN_CLASS_FINDER = new AsmType<>(AnnotatedClassFinder.class); From 59d050b943ca4639e254304d1b5c1cca92cc42fa Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 3 Aug 2019 13:21:33 +1000 Subject: [PATCH 499/730] fix #1184, #1185, #1186, #1187, #1188, #1189, #1190, #1191, #1192, #1193, #1194, #1195 --- CHANGELOG.md | 12 ++ pom.xml | 4 +- src/main/java/act/app/App.java | 27 ++-- src/main/java/act/app/DevModeClassLoader.java | 2 + src/main/java/act/test/Scenario.java | 115 +++++++++++++----- .../java/act/test/ScenarioDebugHelper.java | 10 +- src/main/java/act/test/Test.java | 30 +++-- src/main/java/act/test/func/Func.java | 80 ++++++++++++ .../act/test/util/ScenarioComparator.java | 28 +---- .../java/act/test/util/ScenarioManager.java | 22 +++- .../java/act/util/FastJsonJodaDateCodec.java | 8 +- .../java/act/util/TopLevelDomainList.java | 21 ++++ src/main/java/act/xio/NetworkHandler.java | 3 + src/main/resources/rythm/~test.html | 13 +- src/main/resources/rythm/~test_async.html | 8 +- 15 files changed, 293 insertions(+), 90 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cf9d3c8d..c163e2441 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ # ActFramework Change Log **1.8.27** +* Act-Test - dependency order not maintained when setup is true #1195 +* ConcurrentModificationException on detecting file changes #1194 +* Hotreload logic - it shall save ActionContext to local before checking file changes #1193 +* TopLevelDomainList - fix NPE caused when job executing during app hotreload process #1192 +* FastJsonJodaDateCodec - allow it to deserialize timestamp (long) data #1191 +* Act-Test - add randDouble and randFloat function #1190 +* Act-Test - allow run scenarios for specific partition #1189 +* Add new `force-fixtures' to scenario #1188 +* Act-Test - display partition name in the title #1187 +* Update to osgl-tool-1.20.1 and osgl-cache-1.7.1 #1186 +* No need to invoke hotreload listener if app is not running in DEV mode #1185 +* Once add ehcache dependency `maven package` process will never end #1184 * Command register - it shall not register a command on abstract class #1183 * CommandBytecodeScanner - it needs to register command by name along with prefix #1182 * ApiDoc - add syntax highlight for JSON samples #1181 diff --git a/pom.xml b/pom.xml index b065f090a..f07cd3a84 100644 --- a/pom.xml +++ b/pom.xml @@ -66,8 +66,8 @@ 3.12.1 - 1.20.0 - 1.7.0 + 1.20.1-SNAPSHOT + 1.7.1-SNAPSHOT 1.11.0 1.10.0 1.10.0 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index e28099564..70976616b 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -599,7 +599,14 @@ public void run() { } public boolean isStarted() { - return currentState == POST_START || currentState == ACT_START; + switch (currentState) { + case POST_START: + case POST_STARTED: + case ACT_START: + return true; + default: + return false; + } } /** @@ -636,14 +643,16 @@ protected void releaseResources() { return; } info("App shutting down ...."); - for (HotReloadListener listener : hotReloadListeners) { - listener.preHotReload(); - } - if (null != classLoader && config().i18nEnabled()) { - // clear resource bundle cache for Act I18n - ResourceBundle.clearCache(classLoader); - // clear resource bundle cache for Rythm I18n - ResourceBundle.clearCache(I18N.class.getClassLoader()); + if (Act.isDev()) { + for (HotReloadListener listener : hotReloadListeners) { + listener.preHotReload(); + } + if (null != classLoader && config().i18nEnabled()) { + // clear resource bundle cache for Act I18n + ResourceBundle.clearCache(classLoader); + // clear resource bundle cache for Rythm I18n + ResourceBundle.clearCache(I18N.class.getClassLoader()); + } } for (Daemon d : daemonRegistry.values()) { diff --git a/src/main/java/act/app/DevModeClassLoader.java b/src/main/java/act/app/DevModeClassLoader.java index 54ae7e5a1..65e8e16ee 100644 --- a/src/main/java/act/app/DevModeClassLoader.java +++ b/src/main/java/act/app/DevModeClassLoader.java @@ -344,6 +344,8 @@ private byte[] bytecodeFromSource(String name, Set embeddedClassNames) { @Override public void detectChanges() { + // #1194 - prevent ConcurrentModificationException + List detectors = new ArrayList<>(this.detectors); for (FsChangeDetector detector : detectors) { detectChanges(detector); } diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 0c335dc8b..0c0e00dee 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -58,7 +58,9 @@ public class Scenario implements ScenarioPart { - private static final Logger LOGGER = LogManager.get(Test.class); + private static final Logger LOGGER = LogManager.get(Scenario.class); + + public static final String PARTITION_DEFAULT = "_default_"; private static final ThreadLocal current = new ThreadLocal<>(); @@ -315,8 +317,10 @@ private String verifyXmlBody(Object xmlBody) { public String issueUrlIcon; public String ignore; public List fixtures = new ArrayList<>(); + public List forceFixtures = new ArrayList<>(); public Object generateTestData; public List depends = new ArrayList<>(); + public Set allDepends = new HashSet<>(); public List interactions = new ArrayList<>(); public Map constants = new HashMap<>(); public TestStatus status = PENDING; @@ -324,15 +328,15 @@ private String verifyXmlBody(Object xmlBody) { public Throwable cause; public boolean clearFixtures = true; public String urlContext; - public String partition = "_default_"; + public String partition = PARTITION_DEFAULT; public String source; private transient Metric metric = Act.metricPlugin().metric(MetricInfo.ACT_TEST_SCENARIO); $.Var lastData = $.var(); $.Var lastHeaders = $.var(); - ScenarioManager scenarioManager; - RequestTemplateManager requestTemplateManager; + public ScenarioManager scenarioManager; + public RequestTemplateManager requestTemplateManager; private Map cache = new HashMap<>(); @@ -357,13 +361,20 @@ public int port() { } public String title() { - if (null == issueKey) { - return S.blank(description) ? name : description; - } - S.Buffer buf = S.buffer("[").a(issueKey).a("]"); - if (S.notBlank(description)) { - buf.a(" ").a(description); + boolean hasIssueKey = S.notBlank(issueKey); + boolean nonDefaultPartition = S.neq(PARTITION_DEFAULT, partition); + S.Buffer buf = S.buffer(); + if (hasIssueKey || nonDefaultPartition) { + buf.append("["); + if (hasIssueKey) { + buf.append(issueKey); + } + if (nonDefaultPartition) { + buf.append("«").append(partition).append("»"); + } + buf.append("]").append(" "); } + buf.append(S.blank(description) ? name : description); return buf.toString(); } @@ -396,6 +407,42 @@ public String errorMessageOf(Interaction interaction) { return interaction.errorMessage; } + public void resolveDependencies() { + if (!allDepends.isEmpty()) { + // already resolved + return; + } + for (String name : depends) { + Scenario depend = scenarioManager.get(name); + E.unexpectedIf(null == depend, "cannot find dependent scenario by name: " + name); + if (this == depend) { + LOGGER.warn("Scenario cannot depend on it self: %s", name); + continue; + } + E.unexpectedIf(this == depend, "Circular dependency found"); + allDepends.add(depend); + depend.resolveDependencies(); + E.unexpectedIf(depend.allDepends.contains(this), "Circular dependency found from %s on %s", this.name, name); + allDepends.addAll(depend.allDepends); + } + } + + public void resolveSetupDependencies() { + if (setup) { + return; + } + for (Scenario setupScenario : scenarioManager.getPartitionSetups(partition)) { + if (!setupScenario.allDepends.contains(this)) { + allDepends.add(setupScenario); + allDepends.addAll(setupScenario.allDepends); + } + } + } + + public void validate() throws UnexpectedException { + validate(this); + } + @Override public void validate(Scenario scenario) throws UnexpectedException { errorIf(S.blank(name), "Scenario name not defined"); @@ -413,6 +460,7 @@ private void processConstants() { if (sVal.startsWith("${")) { String expr = S.strip(sVal).of("${", "}"); value = eval(expr); + E.unexpectedIf(null == value, "Error evaluating constant: %s", expr); } else if (sVal.contains("${")) { value = processStringSubstitution(sVal); } @@ -466,24 +514,14 @@ private Object evalFunc(String funcExpr) { /** * Start running this scenario. * - * @param scenarioManager scenario manager - * @param requestTemplateManager request template manager * @param gauge progress gauge * @param isDependent is this a dependent scenario run or direct scenario run */ - public void start(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, ProgressGauge gauge, boolean isDependent) { - this.scenarioManager = $.requireNotNull(scenarioManager); - this.requestTemplateManager = $.requireNotNull(requestTemplateManager); + public void start(ProgressGauge gauge, boolean isDependent) { this.status = PENDING; current.set(this); gauge.clearPayload(); gauge.setPayload(Test.PG_PAYLOAD_SCENARIO, title()); - gauge.incrMaxHint(); - try { - validate(this); - } finally { - gauge.step(); - } if (null == http) { gauge.incrMaxHint(); try { @@ -554,6 +592,19 @@ Response sendRequest(RequestSpec req) throws IOException { return resp; } + private boolean createForceFixtures() { + if (forceFixtures.isEmpty()) { + return true; + } + Timer timer = metric.startTimer("create-fixtures"); + try { + RequestSpec req = RequestSpec.loadFixtures(forceFixtures); + return verify(req, "creating force fixtures"); + } finally { + timer.stop(); + } + } + private boolean createFixtures() { if (fixtures.isEmpty()) { return true; @@ -644,17 +695,17 @@ private boolean reset(ProgressGauge gauge) { } } - private boolean runAsDependent(ScenarioManager scenarioManager, RequestTemplateManager requestTemplateManager, ProgressGauge gauge) { - if (null == this.scenarioManager) { - this.start(scenarioManager, requestTemplateManager, gauge, true); - return this.status.pass(); - } else { - return run(gauge); + private boolean runAsDependent(ProgressGauge gauge) { + if (null == http) { + start(gauge, true); + return status.pass(); } + return run(gauge); } private boolean run(ProgressGauge gauge) { if (status.finished()) { + createForceFixtures(); return status.pass(); } Timer timer = metric.startTimer("run"); @@ -683,7 +734,7 @@ private boolean runDependents(ProgressGauge gauge) { allDeps.add(scenario); } } - Collections.sort(allDeps, new ScenarioComparator(scenarioManager, partition)); + Collections.sort(allDeps, new ScenarioComparator(partition)); gauge.incrMaxHintBy(allDeps.size()); for (Scenario depScenario : allDeps) { try { @@ -695,7 +746,7 @@ private boolean runDependents(ProgressGauge gauge) { depScenario.status = PENDING; // reset scenario status if run dependents across partition } try { - if (!depScenario.runAsDependent(scenarioManager, requestTemplateManager, gauge)) { + if (!depScenario.runAsDependent(gauge)) { errorMessage = "dependency failure: " + depScenario.name; return false; } @@ -1213,7 +1264,11 @@ private Object getVal(String key) { return evalFunc(key); } catch (Exception e) { if (!"last".equals(key)) { - return getVal("last", key); + try { + return getVal("last", key); + } catch (Exception e1) { + throw E.unexpected("Unable to get value by key: %s", key); + } } return null; } diff --git a/src/main/java/act/test/ScenarioDebugHelper.java b/src/main/java/act/test/ScenarioDebugHelper.java index e66eef045..bd1b0111b 100644 --- a/src/main/java/act/test/ScenarioDebugHelper.java +++ b/src/main/java/act/test/ScenarioDebugHelper.java @@ -118,16 +118,16 @@ public void prepareAuthentication(ActionContext context) { private Test test; @GetAction({"e2e", "test", "tests"}) - public Result testForm(ActionContext context) { + public Result testForm(String partition, ActionContext context) { context.templatePath("/~test_async.html"); - return render(); + return render(partition); } @PostAction({"e2e", "test", "tests"}) @PropertySpec("name, ignore, source, status, issueUrl, title, errorMessage, interactions.status, interactions.description, interactions.stackTrace, interactions.errorMessage") @Async - public List run(App app, ActionContext context, ProgressGauge gauge) { - List results = test.run(app, null, false, gauge); + public List run(App app, String partition, ActionContext context, ProgressGauge gauge) { + List results = test.run(app, null, partition, false, gauge); boolean failure = false; for (Scenario scenario : results) { if ($.not(scenario.ignore) && !scenario.status.pass()) { @@ -145,7 +145,7 @@ public List runTest(App app, Keyword testId, ActionContext context, Pr if (context.accept() == H.Format.HTML) { context.templatePath("/~test.html"); } - List results = test.run(app, testId, false, gauge); + List results = test.run(app, testId, null, false, gauge); boolean failure = false; for (Scenario scenario : results) { if ($.not(scenario.ignore) && !scenario.status.pass()) { diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 8037e6ee1..6f3671252 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -255,7 +255,7 @@ public void run() { app.jobManager().delay(new Runnable() { @Override public void run() { - Test.this.run(app, null, true, gauge); + Test.this.run(app, null, null, true, gauge); gauge.markAsDone(); } }, delay.get(), TimeUnit.SECONDS); @@ -263,7 +263,7 @@ public void run() { app.jobManager().now(new Runnable() { @Override public void run() { - Test.this.run(app, null, true, gauge); + Test.this.run(app, null, null, true, gauge); gauge.markAsDone(); } }); @@ -278,7 +278,7 @@ public static boolean shallRunAutomatedTest(App app) { } @GetAction("test/result") - @PropertySpec("error, scenarios.name, scenarios.ignoreReason, scenarios.ignore, scenarios.source, scenarios.status, " + + @PropertySpec("error, scenario.partition, scenarios.name, scenarios.ignoreReason, scenarios.ignore, scenarios.source, scenarios.status, " + "scenarios.issueUrl, scenarios.issueUrlIcon, scenarios.title, scenarios.errorMessage, " + "scenarios.interactions.status, scenarios.interactions.description, " + "scenarios.interactions.stackTrace, scenarios.interactions.errorMessage") @@ -294,7 +294,7 @@ public Map result() { return ret; } - public List run(App app, Keyword testId, boolean shutdownApp, ProgressGauge gauge) { + public List run(App app, Keyword testId, String partition, boolean shutdownApp, ProgressGauge gauge) { E.illegalStateIf(inProgress()); info("Start running test scenarios"); info("---------------------------------------------------------------"); @@ -325,12 +325,24 @@ public List run(App app, Keyword testId, boolean shutdownApp, Progress pb = new ProgressBar(label, gauge.maxHint(), 200, System.out, ProgressBarStyle.UNICODE_BLOCK); } boolean fixtureCleared = false; - Set toBeRun = C.Set(scenarios.values()); - gauge.updateMaxHint(toBeRun.size() + 1); - for (Scenario scenario : C.list(toBeRun).sorted(new ScenarioComparator(scenarioManager, false))) { + List toBeRun = new ArrayList<>(scenarios.size()); + for (Scenario scenario : scenarios.values()) { if (null != testId && $.ne(testId, Keyword.of(scenario.name))) { continue; } + if (S.notBlank(partition) && S.neq(partition, scenario.partition)) { + continue; + } + if (scenario.interactions.isEmpty()) { + continue; + } + if (!toBeRun.contains(scenario)) { + toBeRun.add(scenario); + } + } + Collections.sort(toBeRun, new ScenarioComparator(false)); + gauge.updateMaxHint(toBeRun.size() + 1); + for (Scenario scenario : toBeRun) { if (null != testId) { scenario.ignore = null; } @@ -339,7 +351,7 @@ public List run(App app, Keyword testId, boolean shutdownApp, Progress info("running [%s]%s", scenario.partition, scenario.name); } try { - scenario.start(scenarioManager, requestTemplateManager, gauge, false); + scenario.start(gauge, false); if (!fixtureCleared && scenario.clearFixtures) { fixtureCleared = true; } @@ -378,7 +390,7 @@ public List run(App app, Keyword testId, boolean shutdownApp, Progress output(scenario); } } - Collections.sort(list, new ScenarioComparator(scenarioManager, true)); + Collections.sort(list, new ScenarioComparator(true)); if (shutdownApp) { boolean ansi = Banner.supportAnsi(); String msg = ansi ? Ansi.ansi().render("@|bold FAILED/IGNORED SCENARIOS:|@").toString() : "FAILED/IGNORED SCENARIOS:"; diff --git a/src/main/java/act/test/func/Func.java b/src/main/java/act/test/func/Func.java index d31bb879c..2c3afd9ff 100644 --- a/src/main/java/act/test/func/Func.java +++ b/src/main/java/act/test/func/Func.java @@ -500,6 +500,86 @@ protected List aliases() { } } + + /** + * Generate random double value. + * + * If initVal is provided then + * - if there is 1 init val, it specify the ceiling of the random integer + * - if there are 2 values, the first is the bottom of the random val and the second is the ceiling of the val + */ + public static class RandomDouble extends Func { + @Override + public Object apply() { + int max = 0; + boolean positive = true; + int min = 0; + if (null != initVal) { + Object ceilling = initVal; + if (initVal instanceof List) { + List list = (List) initVal; + Object bottom = list.get(0); + min = $.convert(bottom).toInt(); + ceilling = list.get(1); + } + try { + max = $.convert(ceilling).toInt(); + if (max < 0) { + positive = false; + if (max > min) { + int tmp = min; + min = max; + max = tmp; + } + max = min - max; + } else { + if (max < min) { + int tmp = min; + min = max; + max = tmp; + } + max = max - min; + } + } catch (Exception e) { + warn(e, "RandomDouble func init value (max) shall be evaluated to an integer, found: " + initVal); + } + } + if (max == 0) { + max = 100; + } + double retVal = N.randDouble(); + if (!positive) { + retVal = -retVal; + } + if (retVal < min) { + retVal = retVal + min; + } + if (retVal > max) { + retVal = retVal - (max - min); + } + return retVal; + } + + @Override + protected List aliases() { + return C.list("randDbl", "randDouble", "randomDbl"); + } + } + + /** + * Generate random double value. + * + * If initVal is provided then + * - if there is 1 init val, it specify the ceiling of the random integer + * - if there are 2 values, the first is the bottom of the random val and the second is the ceiling of the val + */ + public static class RandomFloat extends RandomDouble { + @Override + protected List aliases() { + return C.list("randFloat", "randFlt", "randomFlt"); + } + } + /** * Generate random `true`, `false` */ diff --git a/src/main/java/act/test/util/ScenarioComparator.java b/src/main/java/act/test/util/ScenarioComparator.java index 37c678f64..39bd32eec 100644 --- a/src/main/java/act/test/util/ScenarioComparator.java +++ b/src/main/java/act/test/util/ScenarioComparator.java @@ -31,17 +31,14 @@ public class ScenarioComparator implements Comparator { - private ScenarioManager scenarioManager; private String finalPartition; // any test scenario fall into this partition shall be run last private boolean finished; - public ScenarioComparator(ScenarioManager manager, boolean finished) { - scenarioManager = $.requireNotNull(manager); + public ScenarioComparator(boolean finished) { this.finished = finished; } - public ScenarioComparator(ScenarioManager manager, String finalPartition) { - this.scenarioManager = $.requireNotNull(manager); + public ScenarioComparator(String finalPartition) { this.finished = false; this.finalPartition = S.requireNotBlank(finalPartition); } @@ -62,12 +59,10 @@ public int compare(Scenario o1, Scenario o2) { return 1; } } - List d1 = depends(o1, new ArrayList()); - List d2 = depends(o2, new ArrayList()); - if (d1.contains(o2)) { + if (o1.allDepends.contains(o2)) { return 1; } - if (d2.contains(o1)) { + if (o2.allDepends.contains(o1)) { return -1; } int n = o1.partition.compareTo(o2.partition); @@ -81,22 +76,7 @@ public int compare(Scenario o1, Scenario o2) { } return n; } - if (o1.setup && !o2.setup) { - return -1; - } - if (!o1.setup && o2.setup) { - return 1; - } return o1.title().compareTo(o2.title()); } - private List depends(Scenario s, List depends) { - for (String name : s.depends) { - Scenario scenario = scenarioManager.get(name); - E.unexpectedIf(null == scenario, "dependent scenario[%s] not found in scenario[%s]", name, s.name); - depends(scenario, depends); - depends.add(scenario); - } - return depends; - } } diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index 866db23df..371e29a7b 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -52,6 +52,7 @@ public class ScenarioManager extends YamlLoader { private String urlContext; private String issueUrlTemplate; private String issueUrlIcon = "external-link"; + private RequestTemplateManager requestTemplateManager; public ScenarioManager() { super("act.test"); @@ -83,14 +84,21 @@ public List getPartitionSetups(String partition) { public Map load() { loadDefault(); searchScenarioFolder(); - ScenarioComparator comparator = new ScenarioComparator(this, false); - for (List list : partitionSetups.values()) { - Collections.sort(list, comparator); - } Map scenarioMap = new LinkedHashMap<>(); for (Map.Entry entry : store.entrySet()) { scenarioMap.put(entry.getKey().hyphenated(), entry.getValue()); } + for (Scenario scenario : scenarioMap.values()) { + scenario.resolveDependencies(); + } + for (Scenario scenario : scenarioMap.values()) { + scenario.resolveSetupDependencies(); + scenario.validate(); + } + ScenarioComparator comparator = new ScenarioComparator(false); + for (List list : partitionSetups.values()) { + Collections.sort(list, comparator); + } return scenarioMap; } @@ -105,6 +113,8 @@ private void configure() { if (S.notBlank(issueUrlTemplate)) { issueUrlIcon = inferIssueUrlIcon(issueUrlTemplate); } + requestTemplateManager = new RequestTemplateManager(); + requestTemplateManager.load(); } private String inferIssueUrlIcon(String issueUrl) { @@ -213,7 +223,7 @@ private boolean isScenarioFile(String name) { } private void parseOne(String content, String fileName) { - Map map = null; + Map map; try { map = parse(content, NULL_DAO); } catch (Exception e) { @@ -227,6 +237,8 @@ private void parseOne(String content, String fileName) { for (Map.Entry entry : loaded.entrySet()) { String key = entry.getKey(); Scenario scenario = entry.getValue(); + scenario.scenarioManager = this; + scenario.requestTemplateManager = this.requestTemplateManager; scenario.name = key; boolean inferIssueKey = !scenario.noIssue && S.blank(scenario.issueKey) && S.notBlank(issueUrlTemplate); if (inferIssueKey) { diff --git a/src/main/java/act/util/FastJsonJodaDateCodec.java b/src/main/java/act/util/FastJsonJodaDateCodec.java index cfe02896c..c09f6d675 100644 --- a/src/main/java/act/util/FastJsonJodaDateCodec.java +++ b/src/main/java/act/util/FastJsonJodaDateCodec.java @@ -33,6 +33,7 @@ import com.alibaba.fastjson.serializer.ObjectSerializer; import com.alibaba.fastjson.serializer.SerializeWriter; import org.joda.time.*; +import org.osgl.$; import java.io.IOException; import java.lang.reflect.Type; @@ -91,7 +92,8 @@ public FastJsonJodaDateCodec( @SuppressWarnings("unchecked") public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { JSONLexer lexer = parser.getLexer(); - if (lexer.token() == JSONToken.LITERAL_STRING) { + int token = lexer.token(); + if (token == JSONToken.LITERAL_STRING) { String text = lexer.stringVal(); lexer.nextToken(); @@ -105,7 +107,6 @@ public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { return (T) localDateTime; } else if (type == LocalDate.class) { LocalDate localDate = localDateCodec().parse(text); - return (T) localDate; } else if (type == LocalTime.class) { LocalTime localDate = LocalTime.parse(text); @@ -124,6 +125,9 @@ public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { return (T) instant; } + } else if (token == JSONToken.LITERAL_INT) { + long l = lexer.longValue(); + return (T) $.convert(l).to((Class)type); } else { throw new UnsupportedOperationException(); } diff --git a/src/main/java/act/util/TopLevelDomainList.java b/src/main/java/act/util/TopLevelDomainList.java index 1e80c7bd8..5cffc5487 100644 --- a/src/main/java/act/util/TopLevelDomainList.java +++ b/src/main/java/act/util/TopLevelDomainList.java @@ -20,6 +20,8 @@ * #L% */ +import act.Act; +import act.app.event.SysEventId; import act.inject.util.LoadResource; import act.job.Cron; import act.job.OnAppStart; @@ -65,6 +67,15 @@ public boolean isTld(String s) { */ @PostConstruct public void filter() { + Act.app().jobManager().beforeAppStart(new Runnable() { + @Override + public void run() { + doFilter(); + } + }); + } + + private void doFilter() { if (list.get(0).startsWith("#")) { list.remove(0); } @@ -79,6 +90,16 @@ public void filter() { */ @Cron(CRON_TLD_RELOAD) public void refresh() { + if (!Act.app().isStarted()) { + // in very rare case that cron job running while app is hot-reloading + Act.app().jobManager().on(SysEventId.POST_STARTED, new Runnable() { + @Override + public void run() { + refresh(); + } + }); + return; + } try { downloadTld(); } catch (Exception e) { diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 02fa268f3..0d9ba13fc 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -99,6 +99,9 @@ public void handle(final ActionContext ctx, final NetworkDispatcher dispatcher) final boolean isDev = Act.isDev(); if (isDev && !Act.conf().hotReloadDisabled()) { try { + // important as app.checkUpdates(boolean) might trigger + // an app hotreload, which might refer to ActionContext.current() + ctx.saveLocal(); boolean updated = app.checkUpdates(false); if (updated && !app.hasBlockIssue()) { app.jobManager().post(SysEventId.POST_START, "NetworkHandler:resumeRequestHandlingAfterHotReload", new Runnable() { diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html index 481e0dd04..fcf5fa1eb 100644 --- a/src/main/resources/rythm/~test.html +++ b/src/main/resources/rythm/~test.html @@ -62,6 +62,14 @@ .open-source { display:none; } + h4 { + font-size: 14px; + font-weight: 500; + margin-bottom: 5px; + margin-top: 5px; + border-bottom: 1px dotted #888; + padding-bottom: 8px; + } h4.ignore { color: #aaa; text-decoration: line-through; @@ -73,8 +81,9 @@ @render(head) -

                                                                                                                                                                              Test Report

                                                                                                                                                                              -
                                                                                                                                                                              @(_app.name().capFirst())-@(_app.version().getVersion())
                                                                                                                                                                              +

                                                                                                                                                                              Test Report

                                                                                                                                                                              +
                                                                                                                                                                              @(_app.name())-@(_app.version().getVersion())
                                                                                                                                                                              +
                                                                                                                                                                              @for(Scenario scenario: result) {

                                                                                                                                                                              @scenario.title() @if(scenario.issueUrl) { diff --git a/src/main/resources/rythm/~test_async.html b/src/main/resources/rythm/~test_async.html index dce6e3f0a..cfa74b471 100644 --- a/src/main/resources/rythm/~test_async.html +++ b/src/main/resources/rythm/~test_async.html @@ -1,6 +1,6 @@ -@args String testId +@args String testId, String partition @@ -274,7 +274,11 @@

                                                                                                                                                                              } } } - $.postJSON('/~/test/@testId', testCallback) + @if(partition) { + $.postJSON('/~/test/@testId?partition=@partition', testCallback) + } else { + $.postJSON('/~/test/@testId', testCallback) + } \ No newline at end of file From aede75b4f616c5f8f0d4802befb4abd8a3cc533e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 27 Aug 2019 21:27:59 +1000 Subject: [PATCH 500/730] Change Content-Type header for JSON error response #1173 --- CHANGELOG.md | 1 + src/main/java/act/Act.java | 6 +++--- src/main/java/act/app/ActionContext.java | 18 +++++++++++++----- src/main/java/act/app/App.java | 3 +++ .../asset/~act/apibook/endpoint_list.tag | 5 +++-- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c163e2441..223a42c62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.27** +* Change Content-Type header for JSON error response #1173 * Act-Test - dependency order not maintained when setup is true #1195 * ConcurrentModificationException on detecting file changes #1194 * Hotreload logic - it shall save ActionContext to local before checking file changes #1193 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 67d61a586..b674391b3 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -881,7 +881,7 @@ public LocalTime convert(String s, Object hint) { } String pattern = S.string(hint); if (pattern.toLowerCase().contains("iso")) { - return ISODateTimeFormat.dateTime().parseLocalTime(s); + return ISODateTimeFormat.dateTimeParser().parseLocalTime(s); } return (DateTimeFormat.forPattern(pattern)).parseLocalTime(s); } @@ -907,7 +907,7 @@ public LocalDate convert(String s, Object hint) { } String pattern = S.string(hint); if (pattern.toLowerCase().contains("iso")) { - return ISODateTimeFormat.dateTime().parseLocalDate(s); + return ISODateTimeFormat.dateTimeParser().parseLocalDate(s); } return (DateTimeFormat.forPattern(pattern)).parseLocalDate(s); } @@ -933,7 +933,7 @@ public DateTime convert(String s, Object hint) { } String pattern = S.string(hint); if (pattern.toLowerCase().contains("iso")) { - return ISODateTimeFormat.dateTime().parseDateTime(s); + return ISODateTimeFormat.dateTimeParser().parseDateTime(s); } return (DateTimeFormat.forPattern(pattern)).parseDateTime(s); } diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 2e5e62cde..1ae518917 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -21,6 +21,7 @@ */ import static act.controller.Controller.Util.*; +import static org.osgl.http.H.Format.*; import static org.osgl.http.H.Header.Names.*; import act.*; @@ -668,7 +669,7 @@ public UserAgent userAgent() { } public boolean jsonEncoded() { - return req().contentType() == H.Format.JSON; + return req().contentType() == JSON; } public boolean xmlEncoded() { @@ -676,7 +677,7 @@ public boolean xmlEncoded() { } public boolean acceptJson() { - return accept() == H.Format.JSON; + return accept() == JSON; } public boolean acceptXML() { @@ -887,7 +888,7 @@ public Result nullValueResultIgnoreRenderArgs() { } else { if (req().method() == H.Method.POST) { H.Format accept = accept(); - if (H.Format.JSON == accept) { + if (JSON == accept) { return CREATED_JSON; } else if (H.Format.XML == accept) { return CREATED_XML; @@ -939,17 +940,24 @@ public ActionContext applyContentType(Result result) { return applyContentType(contentTypeForErrorResult(req())); } + private static boolean isErrorCompatible(H.Format fmt) { + return JSON == fmt || HTML == fmt || CSV == fmt || TXT == fmt || XML == fmt; + } + public static H.Format contentTypeForErrorResult(H.Request req) { H.Format fmt = req.accept(); if (req.isAjax()) { if (H.Format.UNKNOWN == fmt) { fmt = req.contentType(); } - if (H.Format.JSON == fmt || H.Format.XML == fmt) { + if (JSON == fmt || H.Format.XML == fmt) { return fmt; } } - return fmt.isText() ? fmt : H.Format.HTML; + if (!isErrorCompatible(fmt)) { + fmt = JSON; + } + return fmt; } public ActionContext applyContentType() { diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 70976616b..f364ff679 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -599,6 +599,9 @@ public void run() { } public boolean isStarted() { + if (null == currentState) { + return false; + } switch (currentState) { case POST_START: case POST_STARTED: diff --git a/src/main/resources/asset/~act/apibook/endpoint_list.tag b/src/main/resources/asset/~act/apibook/endpoint_list.tag index 675c63885..1cc3e86e1 100644 --- a/src/main/resources/asset/~act/apibook/endpoint_list.tag +++ b/src/main/resources/asset/~act/apibook/endpoint_list.tag @@ -44,11 +44,12 @@
                                                                                                                                                                              { endpoint.sampleJsonPost }
                                                                                                                                                                              -
                                                                                                                                                                              +
                                                                                                                                                                              Return
                                                                                                                                                                              +
                                                                                                                                                                              -
                                                                                                                                                                              Return value sample
                                                                                                                                                                              +
                                                                                                                                                                              Return value sample
                                                                                                                                                                              From 3486661f59850b36f6bbe952c9860d7a35cba484 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 11 Sep 2019 12:51:25 +1000 Subject: [PATCH 501/730] GH1198 - act test framework refactory --- legacy-testapp/pom.xml | 2 +- pom.xml | 2 +- src/main/java/act/test/Interaction.java | 32 +- src/main/java/act/test/RequestBuilder.java | 282 ++++ src/main/java/act/test/Scenario.java | 1140 +---------------- src/main/java/act/test/ScenarioPart.java | 4 +- src/main/java/act/test/Test.java | 7 +- src/main/java/act/test/TestSession.java | 817 ++++++++++++ src/main/java/act/test/macro/Macro.java | 17 +- .../java/act/test/util/ScenarioManager.java | 1 - testapps/GHIssues/.gitignore | 1 + testapps/GHIssues/pom.xml | 6 +- 12 files changed, 1181 insertions(+), 1130 deletions(-) create mode 100644 src/main/java/act/test/RequestBuilder.java create mode 100644 src/main/java/act/test/TestSession.java diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 6cc4fb1b5..eba226860 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.26-SNAPSHOT + 1.8.27a-SNAPSHOT [0.13.0, 2.0.0) 1.7.2 testapp.TestApp diff --git a/pom.xml b/pom.xml index f07cd3a84..ed92f7c09 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2 1.3.3 4.6.1 - 1.2.58 + 1.2.60 1.1.2 0.7 1.16 diff --git a/src/main/java/act/test/Interaction.java b/src/main/java/act/test/Interaction.java index 513cb203c..e9e7d6217 100644 --- a/src/main/java/act/test/Interaction.java +++ b/src/main/java/act/test/Interaction.java @@ -35,6 +35,7 @@ import org.osgl.http.H; import org.osgl.util.E; import org.osgl.util.IO; +import org.osgl.util.N; import org.osgl.util.S; import java.io.IOException; @@ -64,12 +65,12 @@ public class Interaction implements ScenarioPart { private transient Metric metric = Act.metricPlugin().metric(ACT_TEST_INTERACTION); @Override - public void validate(Scenario scenario) throws UnexpectedException { + public void validate(TestSession session) throws UnexpectedException { E.unexpectedIf(null == request, "request spec not specified in interaction[%s]", this); //E.unexpectedIf(null == response, "response spec not specified"); act.metric.Timer timer = metric.startTimer("validate"); try { - scenario.resolveRequest(request); + request.resolveParent(session.requestTemplateManager); request.validate(this); if (null != response) { response.validate(this); @@ -80,6 +81,8 @@ public void validate(Scenario scenario) throws UnexpectedException { } } + + @Override public String toString() { return description; @@ -113,9 +116,10 @@ public String causeStackTrace() { return null == cause ? null: E.stackTrace(cause); } - private void reset() { + public void reset() { errorMessage = null; cause = null; + status = PENDING; } private boolean verify() { @@ -124,7 +128,7 @@ private boolean verify() { if (S.notBlank(request.email)) { doVerifyEmail(request.email); } else { - resp = Scenario.get().sendRequest(request); + resp = TestSession.current().sendRequest(request); doVerify(resp); } return true; @@ -152,11 +156,11 @@ private void doVerify(Response resp) throws Exception { } private void doVerifyEmail(String email) throws Exception { - email = Scenario.get().processStringSubstitution(email); + email = TestSession.current().processStringSubstitution(email); Inbox inbox = Act.getInstance(Inbox.class); Inbox.Reader reader = inbox.getReader(); String content = reader.readLatest(email); - Scenario.get().verifyBody(content, response); + TestSession.current().verifyBody(content, response); } private boolean run(List macros) { @@ -171,7 +175,7 @@ private boolean run(List macros) { private boolean run(Macro macro) { try { - macro.run(Scenario.get()); + macro.run(TestSession.current()); return true; } catch (Exception e) { errorMessage = e.getMessage(); @@ -202,7 +206,7 @@ private void verifyStatus(Response resp) { } } if (msg.contains("")) { - Document doc = Jsoup.parse(msg, S.concat("http://localhost:", Scenario.get().port(), "/")); + Document doc = Jsoup.parse(msg, S.concat("http://localhost:", TestSession.current().port(), "/")); Elements elements = doc.select(".error-message"); if (elements.hasText()) { msg = elements.text(); @@ -235,25 +239,25 @@ private void verifyHeaders(Response resp) { String headerName = entry.getKey(); String headerVal = resp.header(headerName); try { - Scenario.get().verifyValue(headerName, headerVal, entry.getValue()); + TestSession.current().verifyValue(headerName, headerVal, entry.getValue()); } catch (Exception e) { error(e, S.concat("Failed verifying header[", headerName, "]: ", e.getMessage())); } } - Scenario.get().lastHeaders.set(resp.headers()); + TestSession.current().lastHeaders.set(resp.headers()); } private void verifyBody(Response rs) throws Exception { if (null != response && S.notBlank(response.checksum)) { - Scenario.get().verifyDownloadChecksum(rs, response.checksum); + TestSession.current().verifyDownloadChecksum(rs, response.checksum); if (S.notBlank(response.downloadFilename)) { - Scenario.get().verifyDownloadFilename(rs, response.downloadFilename); + TestSession.current().verifyDownloadFilename(rs, response.downloadFilename); } } else if (null != response && S.notBlank(response.downloadFilename)) { - Scenario.get().verifyDownloadFilename(rs, response.downloadFilename); + TestSession.current().verifyDownloadFilename(rs, response.downloadFilename); } else { String bodyString = S.string(rs.body().string()).trim(); - Scenario.get().verifyBody(bodyString, response); + TestSession.current().verifyBody(bodyString, response); } } diff --git a/src/main/java/act/test/RequestBuilder.java b/src/main/java/act/test/RequestBuilder.java new file mode 100644 index 000000000..7f812376e --- /dev/null +++ b/src/main/java/act/test/RequestBuilder.java @@ -0,0 +1,282 @@ +package act.test; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.handler.builtin.FileGetter; +import act.test.req_modifier.RequestModifier; +import com.alibaba.fastjson.JSON; +import okhttp3.*; +import org.osgl.$; +import org.osgl.exception.UnexpectedException; +import org.osgl.http.H; +import org.osgl.util.*; + +import java.net.URL; +import java.util.Collection; +import java.util.Map; + +import static org.osgl.http.H.Header.Names.ACCEPT; +import static org.osgl.http.H.Header.Names.X_REQUESTED_WITH; +import static org.osgl.http.H.Method.POST; + +class RequestBuilder { + + private static final RequestBody EMPTY_BODY = RequestBody.create(null, ""); + + private Request.Builder builder; + + RequestBuilder(RequestSpec requestSpec, TestSession session, int port) { + builder = new Request.Builder(); + String accept = requestSpec.accept; + if (null != accept) { + if (S.eq("json", accept, S.IGNORECASE)) { + accept = H.Format.JSON.contentType(); + } else { + H.Format format = H.Format.of(accept); + if (null == format) { + format = H.Format.resolve(accept); + } + if (H.Format.UNKNOWN == format) { + throw new UnexpectedException("Invalid accept in request spec: " + accept); + } + accept = format.contentType(); + } + builder.addHeader(ACCEPT, accept); + } + if ($.bool(requestSpec.ajax)) { + builder.addHeader(X_REQUESTED_WITH, "XMLHttpRequest"); + } + for (RequestModifier modifier : requestSpec.modifiers) { + modifier.modifyRequest(builder); + } + for (Map.Entry entry : requestSpec.headers.entrySet()) { + String headerName = entry.getKey(); + String headerVal = S.string(entry.getValue()); + if (null != session) { + if (headerVal.startsWith("last:") || headerVal.startsWith("last|")) { + String payload = headerVal.substring(5); + if (S.blank(payload)) { + payload = headerName; + } + Headers headers = session.lastHeaders.get(); + headerVal = null == headers ? null : S.string(session.lastHeaders.get().get(payload)); + } + } + if (null != headerVal) { + builder.addHeader(headerName, headerVal); + } + } + String reqUrl = requestSpec.url; + if (null != session) { + if (S.notBlank(session.scenario().urlContext) && !reqUrl.startsWith("/")) { + reqUrl = S.pathConcat(session.scenario().urlContext, '/', reqUrl); + } + } + String url = null == session ? reqUrl : session.processStringSubstitution(reqUrl); + if (!reqUrl.startsWith("http")) { + int portx = 0 != requestSpec.port ? requestSpec.port : port; + url = S.concat("http://localhost:", portx, S.ensure(url).startWith("/")); + } + boolean hasParams = !requestSpec.params.isEmpty(); + if (hasParams) { + processParamSubstitution(requestSpec.params, session); + } + boolean hasParts = !hasParams && POST == requestSpec.method && !requestSpec.parts.isEmpty(); + if (hasParts) { + processParamSubstitution(requestSpec.parts, session); + } + switch (requestSpec.method) { + case GET: + case HEAD: + if (hasParams) { + S.Buffer buf = S.buffer(url); + if (!url.contains("?")) { + buf.a("?__nil__=nil"); + } + for (Map.Entry entry : requestSpec.params.entrySet()) { + String paramName = Codec.encodeUrl(entry.getKey()); + String paramVal = Codec.encodeUrl(S.string(entry.getValue())); + buf.a("&").a(paramName).a("=").a(paramVal); + } + url = buf.toString(); + } + builder.method(requestSpec.method.name(), null); + break; + case DELETE: + case POST: + case PUT: + case PATCH: + RequestBody body = EMPTY_BODY; + String jsonBody = verifyJsonBody(requestSpec.json, session); + String xmlBody = verifyXmlBody(requestSpec.xml, session); + if (S.notBlank(jsonBody)) { + body = RequestBody.create(MediaType.parse("application/json"), jsonBody); + } else if (S.notBlank(xmlBody)) { + body = RequestBody.create(MediaType.parse("text/xml"), xmlBody); + } else if (hasParams) { + FormBody.Builder formBuilder = new FormBody.Builder(); + for (Map.Entry entry : requestSpec.params.entrySet()) { + formBuilder.add(entry.getKey(), S.string(entry.getValue())); + } + body = formBuilder.build(); + } else if (null != session && hasParts) { + MultipartBody.Builder formBuilder = new MultipartBody.Builder(); + for (Map.Entry entry : requestSpec.parts.entrySet()) { + String key = entry.getKey(); + String val = S.string(entry.getValue()); + String path = S.pathConcat("test/upload", '/', val); + URL fileUrl = Act.getResource(path); + if (null != fileUrl) { + String filePath = fileUrl.getFile(); + H.Format fileFormat = FileGetter.contentType(filePath); + byte[] content = $.convert(fileUrl).to(byte[].class); + String checksum = IO.checksum(content); + RequestBody fileBody = RequestBody.create(MediaType.parse(fileFormat.contentType()), content); + formBuilder.addFormDataPart(key, S.cut(filePath).afterLast("/"), fileBody); + session.cache("checksum-last", checksum); + session.cache("checksum-" + val, checksum); + } else { + formBuilder.addFormDataPart(key, val); + } + } + body = formBuilder.build(); + } + builder.method((requestSpec.method.name()), body); + break; + default: + throw E.unexpected("HTTP method not supported: " + requestSpec.method); + } + builder.url(url); + } + + private void processParamSubstitution(Map params, TestSession session) { + if (null == session) { + return; + } + for (Map.Entry entry : params.entrySet()) { + Object val = entry.getValue(); + if (val instanceof String) { + String sVal = (String) val; + if (sVal.startsWith("last:") || sVal.startsWith("last|")) { + String ref = sVal.substring(5); + entry.setValue(session.getLastVal(ref)); + } else if (sVal.contains("${")) { + sVal = session.processStringSubstitution(sVal); + entry.setValue(S.isInt(sVal) ? Long.parseLong(sVal) : sVal); + } + } else if (val instanceof Map) { + processParamSubstitution((Map) val, session); + } else if (val instanceof Collection) { + val = processParamSubstitution((Collection) val, session); + entry.setValue(val); + } + } + } + + private Collection processParamSubstitution(Collection params, TestSession session) { + Collection ret = Act.getInstance(params.getClass()); + for (Object val : params) { + if (val instanceof String) { + String sVal = (String) val; + if (sVal.startsWith("last:") || sVal.startsWith("last|")) { + String ref = sVal.substring(5); + if (null != session) { + ret.add(session.getLastVal(ref)); + } + } else if (sVal.contains("${")) { + if (null != session) { + sVal = session.processStringSubstitution(sVal); + } + ret.add(S.isInt(sVal) ? Long.parseLong(sVal) : sVal); + } else { + ret.add(sVal); + } + } else if (val instanceof Map) { + processParamSubstitution((Map) val, session); + ret.add(val); + } else if (val instanceof Collection) { + ret.add(processParamSubstitution((Collection) val, session)); + } else { + ret.add(val); + } + } + return ret; + } + + Request build() { + return builder.build(); + } + + private String verifyJsonBody(Object jsonBody, TestSession session) { + if (jsonBody instanceof Map) { + processParamSubstitution((Map) jsonBody, session); + } else if (jsonBody instanceof Collection) { + jsonBody = processParamSubstitution((Collection) jsonBody, session); + } + String s = null == jsonBody ? "" : (jsonBody instanceof String) ? (String) jsonBody : JSON.toJSONString(jsonBody); + if (S.blank(s)) { + return ""; + } + final String origin = s; + if (s.startsWith("resource:")) { + s = S.ensure(s.substring(9).trim()).startWith("/"); + URL url = Act.getResource(s); + E.unexpectedIf(null == url, "Cannot find JSON body: " + origin); + s = IO.read(url).toString(); + } + try { + JSON.parse(s); + } catch (Exception e) { + E.unexpected(e, "Invalid JSON body: " + origin); + } + return s; + } + + private String verifyXmlBody(Object xmlBody, TestSession session) { + JSON json = null; + if (xmlBody instanceof Map) { + processParamSubstitution((Map) xmlBody, session); + json = JSON.parseObject(JSON.toJSONString(xmlBody)); + } else if (xmlBody instanceof Collection) { + xmlBody = processParamSubstitution((Collection) xmlBody, session); + json = JSON.parseArray(JSON.toJSONString(xmlBody)); + } + String s = null == xmlBody ? "" : (xmlBody instanceof String) ? (String) xmlBody : XML.toString($.convert(json).to(org.w3c.dom.Document.class)); + if (S.blank(s)) { + return ""; + } + final String origin = s; + if (s.startsWith("resource:")) { + s = S.ensure(s.substring(9).trim()).startWith("/"); + URL url = Act.getResource(s); + E.unexpectedIf(null == url, "Cannot find JSON body: " + origin); + s = IO.read(url).toString(); + } + try { + XML.read(s); + } catch (Exception e) { + E.unexpected(e, "Invalid JSON body: " + origin); + } + return s; + } + +} diff --git a/src/main/java/act/test/Scenario.java b/src/main/java/act/test/Scenario.java index 0c0e00dee..0e8cb7e50 100644 --- a/src/main/java/act/test/Scenario.java +++ b/src/main/java/act/test/Scenario.java @@ -22,39 +22,20 @@ import static act.test.TestStatus.PENDING; import static act.test.util.ErrorMessage.*; -import static org.osgl.http.H.Header.Names.ACCEPT; -import static org.osgl.http.H.Header.Names.X_REQUESTED_WITH; -import static org.osgl.http.H.Method.POST; import act.Act; -import act.app.App; -import act.handler.builtin.FileGetter; import act.metric.Metric; import act.metric.MetricInfo; import act.metric.Timer; -import act.test.func.Func; -import act.test.req_modifier.RequestModifier; import act.test.util.*; -import act.test.verifier.Verifier; import act.util.ProgressGauge; -import com.alibaba.fastjson.*; -import okhttp3.*; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; import org.osgl.$; import org.osgl.exception.UnexpectedException; -import org.osgl.http.H; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.*; -import java.io.IOException; -import java.net.URL; import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; public class Scenario implements ScenarioPart { @@ -64,245 +45,6 @@ public class Scenario implements ScenarioPart { private static final ThreadLocal current = new ThreadLocal<>(); - private static final RequestBody EMPTY_BODY = RequestBody.create(null, ""); - - private class RequestBuilder { - - private Request.Builder builder; - - RequestBuilder(RequestSpec requestSpec) { - builder = new Request.Builder(); - String accept = requestSpec.accept; - if (null != accept) { - if (S.eq("json", accept, S.IGNORECASE)) { - accept = H.Format.JSON.contentType(); - } else { - H.Format format = H.Format.of(accept); - if (null == format) { - format = H.Format.resolve(accept); - } - if (H.Format.UNKNOWN == format) { - throw new UnexpectedException("Invalid accept in request spec: " + accept); - } - accept = format.contentType(); - } - builder.addHeader(ACCEPT, accept); - } - if ($.bool(requestSpec.ajax)) { - builder.addHeader(X_REQUESTED_WITH, "XMLHttpRequest"); - } - for (RequestModifier modifier : requestSpec.modifiers) { - modifier.modifyRequest(builder); - } - for (Map.Entry entry : requestSpec.headers.entrySet()) { - String headerName = entry.getKey(); - String headerVal = S.string(entry.getValue()); - if (headerVal.startsWith("last:") || headerVal.startsWith("last|")) { - String payload = headerVal.substring(5); - if (S.blank(payload)) { - payload = headerName; - } - Headers headers = lastHeaders.get(); - headerVal = null == headers ? null : S.string(lastHeaders.get().get(payload)); - } - if (null != headerVal) { - builder.addHeader(headerName, headerVal); - } - } - String reqUrl = requestSpec.url; - if (S.notBlank(urlContext) && !reqUrl.startsWith("/")) { - reqUrl = S.pathConcat(urlContext, '/', reqUrl); - } - String url; - if (!reqUrl.startsWith("http")) { - int portx = 0 != requestSpec.port ? requestSpec.port : port; - url = S.concat("http://localhost:", portx, S.ensure(processStringSubstitution(reqUrl)).startWith("/")); - } else { - url = processStringSubstitution(reqUrl); - } - boolean hasParams = !requestSpec.params.isEmpty(); - if (hasParams) { - processParamSubstitution(requestSpec.params); - } - boolean hasParts = !hasParams && POST == requestSpec.method && !requestSpec.parts.isEmpty(); - if (hasParts) { - processParamSubstitution(requestSpec.parts); - } - switch (requestSpec.method) { - case GET: - case HEAD: - if (hasParams) { - S.Buffer buf = S.buffer(url); - if (!url.contains("?")) { - buf.a("?__nil__=nil"); - } - for (Map.Entry entry : requestSpec.params.entrySet()) { - String paramName = Codec.encodeUrl(entry.getKey()); - String paramVal = Codec.encodeUrl(S.string(entry.getValue())); - buf.a("&").a(paramName).a("=").a(paramVal); - } - url = buf.toString(); - } - builder.method(requestSpec.method.name(), null); - break; - case DELETE: - case POST: - case PUT: - case PATCH: - RequestBody body = EMPTY_BODY; - String jsonBody = verifyJsonBody(requestSpec.json); - String xmlBody = verifyXmlBody(requestSpec.xml); - if (S.notBlank(jsonBody)) { - body = RequestBody.create(MediaType.parse("application/json"), jsonBody); - } else if (S.notBlank(xmlBody)) { - body = RequestBody.create(MediaType.parse("text/xml"), xmlBody); - } else if (hasParams) { - FormBody.Builder formBuilder = new FormBody.Builder(); - for (Map.Entry entry : requestSpec.params.entrySet()) { - formBuilder.add(entry.getKey(), S.string(entry.getValue())); - } - body = formBuilder.build(); - } else if (hasParts) { - MultipartBody.Builder formBuilder = new MultipartBody.Builder(); - for (Map.Entry entry : requestSpec.parts.entrySet()) { - String key = entry.getKey(); - String val = S.string(entry.getValue()); - String path = S.pathConcat("test/upload", '/', val); - URL fileUrl = Act.getResource(path); - if (null != fileUrl) { - String filePath = fileUrl.getFile(); - H.Format fileFormat = FileGetter.contentType(filePath); - byte[] content = $.convert(fileUrl).to(byte[].class); - String checksum = IO.checksum(content); - RequestBody fileBody = RequestBody.create(MediaType.parse(fileFormat.contentType()), content); - formBuilder.addFormDataPart(key, S.cut(filePath).afterLast("/"), fileBody); - cache("checksum-last", checksum); - cache("checksum-" + val, checksum); - } else { - formBuilder.addFormDataPart(key, val); - } - } - body = formBuilder.build(); - } - builder.method((requestSpec.method.name()), body); - break; - default: - throw E.unexpected("HTTP method not supported: " + requestSpec.method); - } - builder.url(url); - } - - private void processParamSubstitution(Map params) { - for (Map.Entry entry : params.entrySet()) { - Object val = entry.getValue(); - if (val instanceof String) { - String sVal = (String) val; - if (sVal.startsWith("last:") || sVal.startsWith("last|")) { - String ref = sVal.substring(5); - entry.setValue(getLastVal(ref)); - } else if (sVal.contains("${")) { - sVal = processStringSubstitution(sVal); - entry.setValue(S.isInt(sVal) ? Long.parseLong(sVal) : sVal); - } - } else if (val instanceof Map) { - processParamSubstitution((Map) val); - } else if (val instanceof Collection) { - val = processParamSubstitution((Collection) val); - entry.setValue(val); - } - } - } - - private Collection processParamSubstitution(Collection params) { - Collection ret = Act.getInstance(params.getClass()); - for (Object val : params) { - if (val instanceof String) { - String sVal = (String) val; - if (sVal.startsWith("last:") || sVal.startsWith("last|")) { - String ref = sVal.substring(5); - ret.add(getLastVal(ref)); - } else if (sVal.contains("${")) { - sVal = processStringSubstitution(sVal); - ret.add(S.isInt(sVal) ? Long.parseLong(sVal) : sVal); - } else { - ret.add(sVal); - } - } else if (val instanceof Map) { - processParamSubstitution((Map) val); - ret.add(val); - } else if (val instanceof Collection) { - ret.add(processParamSubstitution((Collection) val)); - } else { - ret.add(val); - } - } - return ret; - } - - Request build() { - return builder.build(); - } - - private String verifyJsonBody(Object jsonBody) { - if (jsonBody instanceof Map) { - processParamSubstitution((Map) jsonBody); - } else if (jsonBody instanceof Collection) { - jsonBody = processParamSubstitution((Collection) jsonBody); - } - String s = null == jsonBody ? "" : (jsonBody instanceof String) ? (String) jsonBody : JSON.toJSONString(jsonBody); - if (S.blank(s)) { - return ""; - } - final String origin = s; - if (s.startsWith("resource:")) { - s = S.ensure(s.substring(9).trim()).startWith("/"); - URL url = Act.getResource(s); - E.unexpectedIf(null == url, "Cannot find JSON body: " + origin); - s = IO.read(url).toString(); - } - try { - JSON.parse(s); - } catch (Exception e) { - E.unexpected(e, "Invalid JSON body: " + origin); - } - return s; - } - - private String verifyXmlBody(Object xmlBody) { - JSON json = null; - if (xmlBody instanceof Map) { - processParamSubstitution((Map) xmlBody); - json = JSON.parseObject(JSON.toJSONString(xmlBody)); - } else if (xmlBody instanceof Collection) { - xmlBody = processParamSubstitution((Collection) xmlBody); - json = JSON.parseArray(JSON.toJSONString(xmlBody)); - } - String s = null == xmlBody ? "" : (xmlBody instanceof String) ? (String) xmlBody : XML.toString($.convert(json).to(org.w3c.dom.Document.class)); - if (S.blank(s)) { - return ""; - } - final String origin = s; - if (s.startsWith("resource:")) { - s = S.ensure(s.substring(9).trim()).startWith("/"); - URL url = Act.getResource(s); - E.unexpectedIf(null == url, "Cannot find JSON body: " + origin); - s = IO.read(url).toString(); - } - try { - XML.read(s); - } catch (Exception e) { - E.unexpected(e, "Invalid JSON body: " + origin); - } - return s; - } - - } - - - private int port = 5460; - private OkHttpClient http; - private CookieStore cookieStore; - private App app; public String name; public String issueKey; public boolean noIssue; @@ -317,34 +59,25 @@ private String verifyXmlBody(Object xmlBody) { public String issueUrlIcon; public String ignore; public List fixtures = new ArrayList<>(); - public List forceFixtures = new ArrayList<>(); public Object generateTestData; public List depends = new ArrayList<>(); public Set allDepends = new HashSet<>(); public List interactions = new ArrayList<>(); public Map constants = new HashMap<>(); public TestStatus status = PENDING; - public String errorMessage; - public Throwable cause; public boolean clearFixtures = true; public String urlContext; public String partition = PARTITION_DEFAULT; public String source; private transient Metric metric = Act.metricPlugin().metric(MetricInfo.ACT_TEST_SCENARIO); - $.Var lastData = $.var(); - $.Var lastHeaders = $.var(); - public ScenarioManager scenarioManager; public RequestTemplateManager requestTemplateManager; - private Map cache = new HashMap<>(); + public String errorMessage; + public Throwable cause; public Scenario() { - app = Act.app(); - if (null != app) { - port = app.config().httpPort(); - } } @Override @@ -356,10 +89,6 @@ public String toString() { return buf.toString(); } - public int port() { - return port; - } - public String title() { boolean hasIssueKey = S.notBlank(issueKey); boolean nonDefaultPartition = S.neq(PARTITION_DEFAULT, partition); @@ -391,12 +120,12 @@ public String getIgnoreReason() { return S.eq("true", ignore, S.IGNORECASE) ? "ignored" : ignore; } - public void cache(String name, Object payload) { - cache.put(name, payload); + public String causeStackTrace() { + return null == cause ? null: E.stackTrace(cause); } - public Object cached(String name) { - return cache.get(name); + public String getStackTrace() { + return causeStackTrace(); } public TestStatus statusOf(Interaction interaction) { @@ -439,186 +168,46 @@ public void resolveSetupDependencies() { } } - public void validate() throws UnexpectedException { - validate(this); - } - @Override - public void validate(Scenario scenario) throws UnexpectedException { + public void validate(TestSession session) throws UnexpectedException { errorIf(S.blank(name), "Scenario name not defined"); for (Interaction interaction : interactions) { - interaction.validate(scenario); + interaction.validate(session); } - processConstants(); + processConstants(session); } - private void processConstants() { + public void reset() { + status = PENDING; + for (Interaction interaction : interactions) { + interaction.reset(); + } + } + + private void processConstants(TestSession session) { Map copy = new HashMap<>(constants); for (Map.Entry entry : copy.entrySet()) { Object value = entry.getValue(); String sVal = S.string(value); if (sVal.startsWith("${")) { String expr = S.strip(sVal).of("${", "}"); - value = eval(expr); + value = session.eval(expr); E.unexpectedIf(null == value, "Error evaluating constant: %s", expr); } else if (sVal.contains("${")) { - value = processStringSubstitution(sVal); + value = session.processStringSubstitution(sVal); } String key = entry.getKey(); constants.remove(key); - constants.put(S.underscore(key), value); - } - } - - private Object eval(String expr) { - if (expr.startsWith("func:")) { - return evalFunc(expr.substring(5)); - } else if (expr.contains("(")) { - return evalFunc(expr); - } - String key = S.underscore(expr); - Object o = constants.get(key); - o = null == o ? cache.get(key) : o; - return null == o ? Test.constant(key) : o; - } - - private Object evalFunc(String funcExpr) { - String funcName = funcExpr; - List vals = C.list(); - if (funcExpr.contains("(")) { - funcName = S.cut(funcExpr).beforeFirst("("); - String paramStr = S.cut(funcExpr).afterFirst("("); - paramStr = S.cut(paramStr).beforeLast(")"); - if (S.notBlank(paramStr)) { - vals = C.newList(S.fastSplit(paramStr, ",")); - for (int i = 0; i < vals.size(); ++i) { - String val = S.ensure(vals.get(i).trim()).strippedOff(S.DOUBLE_QUOTES); - val = processStringSubstitution(val); - vals.set(i, val); - } - } - } - Func func = $.convert(funcName).to(Func.class); - switch (vals.size()) { - case 0: - break; - case 1: - func.init(vals.get(0)); - break; - default: - func.init(vals); - } - return func.apply(); - } - - /** - * Start running this scenario. - * - * @param gauge progress gauge - * @param isDependent is this a dependent scenario run or direct scenario run - */ - public void start(ProgressGauge gauge, boolean isDependent) { - this.status = PENDING; - current.set(this); - gauge.clearPayload(); - gauge.setPayload(Test.PG_PAYLOAD_SCENARIO, title()); - if (null == http) { - gauge.incrMaxHint(); - try { - prepareHttp(); - } finally { - gauge.step(); - } - } - boolean pass = true; - if (!isDependent) { - gauge.incrMaxHint(); - clearSession(); - pass = pass && clearFixtures(); - } - if (pass) { - pass = runDependents(gauge) && run(gauge); - } - this.status = TestStatus.of(pass); - if (TestStatus.FAIL == this.status) { - for (Interaction interaction : this.interactions) { - if (interaction.status == TestStatus.FAIL) { - this.errorMessage = "Interaction[" + interaction.description + "] fail: " + interaction.errorMessage; - if (interaction.cause != null && !(interaction.cause instanceof ErrorMessage)) { - this.cause = interaction.cause; - } - } - } - } - } - public void clearSession() { - if (depends.isEmpty()) { - cookieStore().clear(); - } - } - - public boolean clearFixtures() { - if (!clearFixtures) { - return true; - } - Timer timer = metric.startTimer("clear-fixtures"); - try { - return verify(RequestSpec.RS_CLEAR_FIXTURE, "clearing fixtures"); - } finally { - timer.stop(); - } - } - - public String causeStackTrace() { - return null == cause ? null: E.stackTrace(cause); - } - - public String getStackTrace() { - return causeStackTrace(); - } - - void resolveRequest(RequestSpec req) { - req.resolveParent(requestTemplateManager); - } - - Response sendRequest(RequestSpec req) throws IOException { - Timer timer = metric.startTimer("build-request"); - Request httpRequest = new RequestBuilder(req).build(); - timer.stop(); - timer = metric.startTimer("send-request"); - Response resp = http.newCall(httpRequest).execute(); - timer.stop();; - lastHeaders.set(resp.headers()); - return resp; - } - - private boolean createForceFixtures() { - if (forceFixtures.isEmpty()) { - return true; - } - Timer timer = metric.startTimer("create-fixtures"); - try { - RequestSpec req = RequestSpec.loadFixtures(forceFixtures); - return verify(req, "creating force fixtures"); - } finally { - timer.stop(); + key = S.underscore(key); + constants.put(key, value); + session.constants.put(key, value); // otherwise line 194 `value = session.eval(expr)` might fail } } - private boolean createFixtures() { - if (fixtures.isEmpty()) { - return true; + private boolean generateTestData(TestSession session) { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("generate test data for " + name); } - Timer timer = metric.startTimer("create-fixtures"); - try { - RequestSpec req = RequestSpec.loadFixtures(fixtures); - return verify(req, "creating fixtures"); - } finally { - timer.stop(); - } - } - - private boolean generateTestData() { if (null == generateTestData) { return true; } @@ -629,7 +218,7 @@ private boolean generateTestData() { Map map = $.cast(generateTestData); for (Map.Entry entry : map.entrySet()) { RequestSpec req = RequestSpec.generateTestData(entry.getKey(), entry.getValue()); - ok = verify(req, "generate test data for " + entry.getKey()); + ok = session.verify(req, "generate test data for " + entry.getKey()); if (!ok) { return false; } @@ -638,7 +227,7 @@ private boolean generateTestData() { List list = $.cast(generateTestData); for (String modelType : list) { RequestSpec req = RequestSpec.generateTestData(modelType, 100); - ok = verify(req, "generate test data for " + modelType); + ok = session.verify(req, "generate test data for " + modelType); if (!ok) { return false; } @@ -650,152 +239,34 @@ private boolean generateTestData() { } } - private boolean verify(RequestSpec req, String operation) { - boolean pass = true; - Response resp = null; - try { - resp = sendRequest(req); - if (!resp.isSuccessful()) { - pass = false; - errorMessage = "Fixtures loading failure"; - } - return pass; - } catch (IOException e) { - errorMessage = "Error " + operation; - LOGGER.error(e, errorMessage); - return false; - } finally { - IO.close(resp); - } - } - - private void prepareHttp() { - long timeout = app.config().testTimeout(); - http = new OkHttpClient.Builder() - .cookieJar(cookieStore()) - .connectTimeout(timeout, TimeUnit.SECONDS) - .readTimeout(timeout, TimeUnit.SECONDS) - .writeTimeout(timeout, TimeUnit.SECONDS) - .build(); - } - - private boolean reset(ProgressGauge gauge) { - Timer timer = metric.startTimer("reset"); - try { - gauge.incrMaxHint(); - errorMessage = null; - clearSession(); - if (depends.isEmpty()) { - return clearFixtures() && createFixtures() && generateTestData(); - } - return createFixtures() && generateTestData(); - } finally { - gauge.step(); - timer.stop(); - } - } - - private boolean runAsDependent(ProgressGauge gauge) { - if (null == http) { - start(gauge, true); - return status.pass(); + boolean run(TestSession session, ProgressGauge gauge) { + boolean traceEnabled = LOGGER.isTraceEnabled(); + if (traceEnabled) { + LOGGER.trace("run " + name); } - return run(gauge); - } - - private boolean run(ProgressGauge gauge) { if (status.finished()) { - createForceFixtures(); + if (traceEnabled) { + LOGGER.trace("already finished: " + name); + } return status.pass(); } Timer timer = metric.startTimer("run"); try { - return runDependents(gauge) && createFixtures() && generateTestData() && runInteractions(gauge); + return generateTestData(session) && runInteractions(session, gauge); } finally { timer.stop(); } } - private boolean runDependents(ProgressGauge gauge) { - List partitionSetups = scenarioManager.getPartitionSetups(partition); - List allDeps = new ArrayList<>(); - for (Scenario scenario : partitionSetups) { - if (scenario == this || scenario.isDependOn(this, scenarioManager)) { - break; - } - if (!allDeps.contains(scenario)) { - allDeps.add(scenario); - } - } - for (String dependent : depends) { - Scenario scenario = scenarioManager.get(dependent); - errorIf(null == scenario, "Dependent not found: " + dependent); - if (!allDeps.contains(scenario)) { - allDeps.add(scenario); - } + private boolean runInteractions(TestSession session, ProgressGauge gauge) { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("run interactions for " + name); } - Collections.sort(allDeps, new ScenarioComparator(partition)); - gauge.incrMaxHintBy(allDeps.size()); - for (Scenario depScenario : allDeps) { - try { - Scenario old = current.get(); - Scenario s = null == old ? this : old; - TestStatus oldStatus = null; - if (depScenario.status == TestStatus.PASS && S.neq(depScenario.partition, s.partition)) { - oldStatus = depScenario.status; - depScenario.status = PENDING; // reset scenario status if run dependents across partition - } - try { - if (!depScenario.runAsDependent(gauge)) { - errorMessage = "dependency failure: " + depScenario.name; - return false; - } - inheritFrom(depScenario); - } finally { - current.set(old); - if (null != oldStatus) { - depScenario.status = oldStatus; - } - } - } finally { - gauge.step(); - } - } - return true; - } - - private boolean isDependOn(Scenario that, ScenarioManager scenarioManager) { - if (depends.contains(that.refId) || depends.contains(that.name)) { - return true; - } - for (String s : depends) { - Scenario scenario = scenarioManager.get(s); - if (null != scenario) { - if (scenario.isDependOn(that, scenarioManager)) { - return true; - } - } - } - return false; - } - - private void inheritFrom(Scenario dependent) { - lastHeaders.set(dependent.lastHeaders.get()); - lastData.set(dependent.lastData.get()); - cache.putAll(dependent.cache); - http = dependent.http; - Map map = C.newMap(dependent.constants); - map.putAll(constants); - constants.putAll(map); - } - - private boolean runInteractions(ProgressGauge gauge) { gauge.incrMaxHintBy(interactions.size()); for (Interaction interaction : interactions) { try { - gauge.setPayload(Test.PG_PAYLOAD_SCENARIO, title()); gauge.setPayload(Test.PG_PAYLOAD_INTERACTION, interaction.description); - boolean pass = run0(interaction); + boolean pass = runInteraction(session, interaction); if (!pass) { //errorMessage = S.fmt("interaction[%s] failure", interaction.description); return false; @@ -807,7 +278,10 @@ private boolean runInteractions(ProgressGauge gauge) { return true; } - private boolean run0(Interaction interaction) { + private boolean runInteraction(TestSession session, Interaction interaction) { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("run interaction for %s: %s", name, interaction.description); + } boolean okay = interaction.run(); if (!okay) { return false; @@ -815,536 +289,12 @@ private boolean run0(Interaction interaction) { for (Map.Entry entry : interaction.cache.entrySet()) { String ref = entry.getValue(); - Object value = ref.contains("${") ? processStringSubstitution(ref) : getLastVal(ref); + Object value = ref.contains("${") ? session.processStringSubstitution(ref) : session.getLastVal(ref); if (null != value) { - cache(entry.getKey(), value); + session.cache(entry.getKey(), value); } } return true; } - private synchronized CookieStore cookieStore() { - if (null == cookieStore) { - App app = Act.app(); - cookieStore = null == app ? new CookieStore() : app.getInstance(CookieStore.class); - } - return cookieStore; - } - - void verifyDownloadChecksum(Response response, String checksumExpected) { - if (checksumExpected.startsWith("${")) { - checksumExpected = S.string(evalStr(checksumExpected)); - } - Object o = cached(checksumExpected); - if (null == o) { - o = cached("checksum-last"); - } - if (null == o) { - o = checksumExpected; - } - ResponseBody body = response.body(); - errorIf(null == body, "No download found"); - String downloadChecksum = IO.checksum(body.byteStream()); - errorIfNot($.eq(downloadChecksum, o), "Download checksum not match"); - } - - void verifyDownloadFilename(Response response, String filenameExpected) { - String header = response.header("Content-Disposition"); - // header should be something like: attachment; filename="postcodes.xls" - errorIf(S.isBlank(header), "No Content-Disposition header found"); - int pos = header.indexOf('"'); - errorIf(pos < 0, "Content-Disposition header does not have filename specified: " + header); - String filename = header.substring(pos + 1); - filename = filename.substring(0, filename.length() - 1); // strip off last `"` - errorIfNot(S.eq(filenameExpected, filename), "Download filename[%s] not match expected value[%s]", filename, filenameExpected); - } - - void verifyBody(String bodyString, ResponseSpec spec) { - lastData.set(bodyString); - if (null == spec) { - if (bodyString.startsWith("[")) { - JSONArray array = JSON.parseArray(bodyString); - lastData.set(array); - } else if (bodyString.startsWith("{")) { - JSONObject obj = JSON.parseObject(bodyString); - lastData.set(obj); - } - return; - } - if (null != spec.text) { - verifyValue("body text", bodyString, spec.text); - } else if (null != spec.json && !spec.json.isEmpty()) { - if (bodyString.startsWith("[")) { - JSONArray array = JSON.parseArray(bodyString); - lastData.set(array); - verifyList("body json array", array, spec.json); - } else if (bodyString.startsWith("{")) { - JSONObject obj = JSON.parseObject(bodyString); - lastData.set(obj); - verifyJsonObject(obj, spec.json); - } else { - error("Unknown JSON string: \n%s", bodyString); - } - } else if (null != spec.xml && !spec.xml.isEmpty()) { - org.w3c.dom.Document doc = XML.read(bodyString); - JSONObject obj = $.convert(doc).to(JSONObject.class); - String xmlRoot = app.config().xmlRootTag(); - if (obj.containsKey(xmlRoot)) { - Object o = obj.get(xmlRoot); - lastData.set(o); - if (o instanceof JSONObject) { - obj = (JSONObject) o; - verifyJsonObject(obj, spec.xml); - } else if (o instanceof List) { - verifyList("body xml array", (List)o, spec.xml); - } else { - throw new UnexpectedException("Unknown root type: " + o.getClass()); - } - } else { - lastData.set(obj); - verifyJsonObject(obj, spec.xml); - } - } else if (null != spec.html && !spec.html.isEmpty()) { - lastData.set(bodyString); - Document doc = Jsoup.parse(bodyString, S.concat("http://localhost:", port, "/")); - for (Map.Entry entry : spec.html.entrySet()) { - String path = entry.getKey(); - Elements elements = doc.select(path); - verifyValue("body html path", elements, entry.getValue()); - } - } - } - - void verifyList(String name, List array, Map spec) { - for (Object obj : spec.entrySet()) { - Map.Entry entry = $.cast(obj); - Object key = entry.getKey(); - String sKey = S.string(key); - Object test = entry.getValue(); - Object value = null; - if ("me".equals(key) || "this".equals(key)) { - value = array; - } else if ("size".equals(key) || "len".equals(key) || "length".equals(key)) { - value = array.size(); - } else if ("toString".equals(key) || "string".equals(key) || "str".equals(key)) { - value = JSON.toJSONString(array); - } else if ("?".equals(key) || (sKey.toLowerCase().startsWith(""))) { - for (Object arrayElement : array) { - try { - verifyValue(name, arrayElement, test); - return; - } catch (Exception e) { - // try next one - } - } - throw error("No element matches requirement: %s", test); - } else if (S.isInt(sKey)) { - int id = Integer.parseInt(sKey); - value = array.get(id); - } else { - if (sKey.contains(".")) { - String id = S.cut(key).beforeFirst("."); - String prop = S.cut(key).afterFirst("."); - if ("?".equals(id) || "".equalsIgnoreCase(id)) { - for (Object arrayElement : array) { - if (!(arrayElement instanceof JSONObject)) { - continue; - } - try { - verifyValue(prop, ((JSONObject) arrayElement).get(prop), test); - return; - } catch (Exception e) { - // try next one - } - } - } else if (S.isInt(id)) { - int i = Integer.parseInt(id); - Object o = array.get(i); - if (o instanceof JSONObject) { - JSONObject json = (JSONObject) o; - value = json.get(prop); - } - } - } - if (null == value) { - throw error("Unknown attribute of array verification: %s", key); - } - } - verifyValue(name, value, test); - } - } - - void verifyJsonObject(JSONObject obj, Map jsonSpec) { - for (Map.Entry entry : jsonSpec.entrySet()) { - String key = entry.getKey(); - // ${sizeOf(date)} - if (key.startsWith("${")) { - // sizeOf(date)} - String s = key.substring(2); - - // sizeOf(date) - s = s.substring(0, s.length() - 1); - - // sizeOf - String funcName = s.substring(0, s.indexOf("(")); - - // date) - s = s.substring(s.indexOf("(") + 1); - // date - String varName = s.substring(0, s.length() - 1); - - Object val = $.getProperty(obj, varName); - val = evalFunc(funcName + "(" + val + ")"); - verifyValue(key, val, entry.getValue()); - } else { - Object val = $.getProperty(obj, key); - verifyValue(key, val, entry.getValue()); - } - } - } - - void verifyValue(String name, Object value, Object test) { - if (test instanceof List) { - verifyValue_(name, value, (List) test); - } else if (value instanceof List && test instanceof Map) { - verifyList(name, (List) value, (Map) test); - } else { - if (matches(value, test)) { - return; - } - if (value instanceof JSONObject) { - errorIfNot(test instanceof Map, "Cannot verify %s value [%s] against test [%s]", name, value, test); - JSONObject json = (JSONObject) value; - Map testMap = (Map) test; - for (Map.Entry entry : testMap.entrySet()) { - Object testKey = entry.getKey(); - Object testValue = entry.getValue(); - Object attr = json.get(testKey); - verifyValue(S.concat(name, ".", testKey), attr, testValue); - } - } else if (value instanceof Elements) { - if (test instanceof Map) { - verifyList(name, (Elements) value, (Map) test); - } else { - Elements elements = (Elements) value; - if (elements.isEmpty()) { - value = null; - } else { - value = elements.first(); - } - verifyValue(name, value, test); - } - } else if (value instanceof Number) { - Number found = (Number) value; - Number expected = null; - if (test instanceof Number) { - expected = (Number) test; - } else { - String s = S.string(test); - s = S.isNumeric(s) ? s : processStringSubstitution(s); - if (S.isNumeric(S.string(s))) { - expected = $.convert(s).to(Double.class); - } else { - error("Cannot verify %s value [%s] against test [%s]", name, value, test); - } - } - double delta = Math.abs(expected.doubleValue() - found.doubleValue()); - if ((delta / found.doubleValue()) > 0.001) { - error("Cannot verify %s value [%s] against test [%s]", name, value, test); - } - } else { - // try convert the test into String - String testString = $.convert(test).toString(); - boolean verified = verifyStringValue_(testString, value, test); - if (!verified) { - String processedString = processStringSubstitution(testString); - if (S.neq(processedString, testString)) { - verified = verifyStringValue_(processedString, value, test); - } - } - errorIfNot(verified, "Cannot verify %s value [%s] against test [%s]", name, value, test); - } - } - } - - private boolean verifyStringValue_(String testString, Object value, Object test) { - if (matches(testString, value)) { - return true; - } - if (null != value && ("*".equals(test) || "...".equals(test) || "".equals(test))) { - return true; - } - try { - Pattern p = Pattern.compile(testString); - return p.matcher(S.string(value)).matches(); - } catch (Exception e) { - // ignore - } - Verifier v = tryLoadVerifier(testString); - if (null != v && v.verify(value)) { - return true; - } - return false; - } - - private void verifyValue_(String name, Object value, List tests) { - // try to do the literal match - if (value instanceof List) { - List found = (List) value; - boolean ok = found.size() == tests.size(); - if (ok) { - for (int i = 0; i < found.size(); ++i) { - Object foundElement = found.get(i); - Object testElement = tests.get(i); - if (!matches(foundElement, testElement)) { - ok = false; - break; - } - } - } - if (ok) { - return; - } - } - // now try verifiers - if (value instanceof Elements) { - Elements elements = (Elements) value; - if (elements.size() > 0) { - value = elements.first(); - } else { - value = null; - } - } - for (Object test : tests) { - errorIfNot(test instanceof Map, "Cannot verify %s value [%s] against test [%s]", name, value, test); - Map map = (Map) test; - errorIfNot(map.size() == 1, "Cannot verify %s value [%s] against test [%s]", name, value, test); - Map.Entry entry = map.entrySet().iterator().next(); - Object entryValue = entry.getValue(); - if (entryValue instanceof String) { - String s = (String) entryValue; - Object processed = evalStr(s); - if (s != processed) { - entry.setValue(processed); - } - } - Verifier v = $.convert(map).to(Verifier.class); - errorIf(null == v, "Cannot verify %s value [%s] against test [%s]", name, value, test); - errorIf(!verify(v, value), "Cannot verify %s value [%s] against test [%s]", name, value, v); - } - } - - private boolean verify(Verifier test, Object value) { - if (test.verify(value)) { - return true; - } - if (value instanceof Element) { - Element e = (Element) value; - if (test.verify(e.val())) { - return true; - } - if (test.verify(e.text())) { - return true; - } - if (test.verify(e.html())) { - return true; - } - } - return false; - } - - private static boolean matches(Object a, Object b) { - if ($.eq(a, b)) { - return true; - } - if (!((b instanceof String) && (a instanceof Element))) { - return false; - } - String test = S.string(b); - Element element = (Element) a; - // try html - String html = element.html(); - if (S.eq(html, test, S.IGNORECASE)) { - return true; - } - // try text - String text = element.text(); - if (S.eq(text, test, S.IGNORECASE)) { - return true; - } - // try val - String val = element.val(); - if (S.eq(val, test, S.IGNORECASE)) { - return true; - } - return false; - } - - private Class tryLoadClass(String name) { - try { - return null != app ? app.classForName(name) : $.classForName(name); - } catch (Exception e) { - return null; - } - } - - private Verifier tryLoadVerifier(String name) { - boolean revert = false; - if (name.startsWith("!") || name.startsWith("-")) { - revert = true; - name = name.substring(1).trim(); - } else if (name.startsWith("not:")) { - revert = true; - name = name.substring(4).trim(); - } - Class c = tryLoadClass(name); - if (null != c) { - if (Verifier.class.isAssignableFrom(c)) { - final Verifier v = (Verifier) (null != app ? app.getInstance(c) : $.newInstance(c)); - return v.meOrReversed(revert); - } else { - throw new UnexpectedException("Class not supported: " + name); - } - } - return null; - } - - private Object getVal(String key, String ref) { - Object stuff = getVal(key); - if (S.blank(ref) || null == stuff) { - return stuff; - } - if (stuff instanceof String) { - String str = $.cast(stuff); - if (str.contains("<") && str.contains(">")) { - // try get html element - try { - Document doc = Jsoup.parse(str, S.concat("http://localhost:", port, "/")); - Elements elements = doc.select(ref); - if (elements.size() != 0) { - return elements.get(0).text(); - } - } catch (Exception e) { - // just ignore - } - } - } - return JSONTraverser.traverse(stuff, ref); - } - - private Object getVal(String key) { - if ("last".equals(key)) { - return lastData.get(); - } - Object o = cache.get(key); - if (null != o) { - return o; - } - if (key.contains(".")) { - String firstLevel = S.cut(key).beforeFirst("."); - Object firstLevelVal = cache.get(firstLevel); - if (null != firstLevelVal) { - try { - return $.getProperty(firstLevelVal, S.cut(key).afterFirst(".")); - } catch (Exception e) { - // ignore - } - } - } - key = S.underscore(key); - o = constants.get(key); - if (null != o) { - return o; - } - o = Test.constant(key); - if (null != o) { - return o; - } - try { - return evalFunc(key); - } catch (Exception e) { - if (!"last".equals(key)) { - try { - return getVal("last", key); - } catch (Exception e1) { - throw E.unexpected("Unable to get value by key: %s", key); - } - } - return null; - } - } - - Object evalStr(String s) { - int n = s.indexOf("${"); - if (n < 0) { - return s; - } - if (n > 0) { - return processStringSubstitution(s); - } - int z = s.indexOf("}"); - if (z < s.length() - 1) { - return processStringSubstitution(s); - } - String part = s.substring(2, z); - if (part.contains("(") && part.endsWith(")")) { - return evalFunc(part); - } else { - String key = part; - String payload = ""; - if (part.contains(":")) { - S.Binary binary = S.binarySplit(part, ':'); - key = binary.first(); - payload = binary.second(); - } - return getVal(key, payload); - } - } - - String processStringSubstitution(String s) { - int n = s.indexOf("${"); - if (n < 0) { - return s; - } - if (n == 0 && s.endsWith(")}")) { - s = s.substring(2); - s = s.substring(0, s.length() - 1); - return S.string(evalFunc(s)); - } - int a = 0; - int z = n; - S.Buffer buf = S.buffer(); - while (true) { - buf.append(s.substring(a, z)); - n = s.indexOf("}", z); - a = n; - String part = s.substring(z + 2, a); - if (part.contains("(") && part.endsWith(")")) { - buf.append(evalFunc(part)); - } else { - String key = part; - String payload = ""; - if (part.contains(":")) { - S.Binary binary = S.binarySplit(part, ':'); - key = binary.first(); - payload = binary.second(); - } - buf.append(getVal(key, payload)); - } - n = s.indexOf("${", a); - if (n < 0) { - buf.append(s.substring(a + 1)); - return buf.toString(); - } - z = n; - } - } - - private Object getLastVal(String ref) { - return getVal("last", ref); - } - - static Scenario get() { - return current.get(); - } } diff --git a/src/main/java/act/test/ScenarioPart.java b/src/main/java/act/test/ScenarioPart.java index 96180206c..fc2d52796 100644 --- a/src/main/java/act/test/ScenarioPart.java +++ b/src/main/java/act/test/ScenarioPart.java @@ -30,5 +30,7 @@ public interface ScenarioPart { * * @throws {@link UnexpectedException} if the data is not valid */ - void validate(Scenario scenario) throws UnexpectedException; + void validate(TestSession session) throws UnexpectedException; + + void reset(); } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 6f3671252..79602d716 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -324,7 +324,6 @@ public List run(App app, Keyword testId, String partition, boolean shu String label = "Testing"; pb = new ProgressBar(label, gauge.maxHint(), 200, System.out, ProgressBarStyle.UNICODE_BLOCK); } - boolean fixtureCleared = false; List toBeRun = new ArrayList<>(scenarios.size()); for (Scenario scenario : scenarios.values()) { if (null != testId && $.ne(testId, Keyword.of(scenario.name))) { @@ -351,11 +350,7 @@ public List run(App app, Keyword testId, String partition, boolean shu info("running [%s]%s", scenario.partition, scenario.name); } try { - scenario.start(gauge, false); - if (!fixtureCleared && scenario.clearFixtures) { - fixtureCleared = true; - } - gauge.setPayload(PG_PAYLOAD_FAILED, !scenario.status.pass()); + new TestSession(scenario, requestTemplateManager).run(gauge); } catch (Exception e) { gauge.setPayload(PG_PAYLOAD_FAILED, true); String message = e.getMessage(); diff --git a/src/main/java/act/test/TestSession.java b/src/main/java/act/test/TestSession.java new file mode 100644 index 000000000..f978c70aa --- /dev/null +++ b/src/main/java/act/test/TestSession.java @@ -0,0 +1,817 @@ +package act.test; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.App; +import act.metric.Metric; +import act.metric.MetricInfo; +import act.metric.Timer; +import act.test.func.Func; +import act.test.util.*; +import act.test.verifier.Verifier; +import act.util.LogSupport; +import act.util.ProgressGauge; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import okhttp3.*; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.osgl.$; +import org.osgl.exception.UnexpectedException; +import org.osgl.util.*; + +import java.io.IOException; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; + +import static act.test.Test.PG_PAYLOAD_FAILED; +import static act.test.util.ErrorMessage.errorIf; +import static act.test.util.ErrorMessage.errorIfNot; + +/** + * A single test session encapsulate a full cycle of test run including + * + * * clear fixture + * * run dependency scenarios + * * run target scenario + * + * For each scenario run it contains: + * + * * load fixtures + * * run scenario + * + */ +public class TestSession extends LogSupport { + + private static ThreadLocal current = new ThreadLocal<>(); + + static TestSession current() { + return current.get(); + } + + private boolean proceed; + private Scenario running; + private Scenario target; + private List dependencies = new ArrayList<>(); + private App app; + private int port = 5460; + private OkHttpClient http; + private CookieStore cookieStore; + private transient Metric metric = Act.metricPlugin().metric(MetricInfo.ACT_TEST_SCENARIO); + + $.Var lastData = $.var(); + $.Var lastHeaders = $.var(); + public Map constants = new HashMap<>(); + + Map cache = new HashMap<>(); + + public RequestTemplateManager requestTemplateManager; + + public TestSession(Scenario scenario, RequestTemplateManager requestTemplateManager) { + this.requestTemplateManager = requestTemplateManager; + dependencies.addAll(scenario.allDepends); + target = scenario; + app = Act.app(); + if (null != app) { + port = app.config().httpPort(); + } + } + + public void cache(String name, Object payload) { + cache.put(name, payload); + } + + public Object cached(String name) { + return cache.get(name); + } + + public int port() { + return port; + } + + public void run(ProgressGauge gauge) { + current.set(this); + prepareHttp(); + gauge.incrMaxHintBy(dependencies.size() + 2); + reset(); + gauge.step(); + proceed = runAll(gauge, dependencies); + if (proceed) { + proceed = runOne(target, gauge); + } + gauge.step(); + } + + private boolean reset() { + Collections.sort(dependencies, new ScenarioComparator(target.partition)); + for (Scenario scenario : dependencies) { + scenario.reset(); + } + target.reset(); + clearSession(); + return clearFixtures(); + } + + public void clearSession() { + cookieStore().clear(); + } + + public boolean clearFixtures() { + if (isTraceEnabled()) { + trace("clear fixture for " + target.name); + } + Timer timer = metric.startTimer("clear-fixtures"); + try { + return verify(RequestSpec.RS_CLEAR_FIXTURE, "clearing fixtures"); + } finally { + timer.stop(); + } + } + + private boolean runAll(ProgressGauge gauge, List scenarios) { + boolean proceed = true; + for (Scenario scenario : scenarios) { + proceed = proceed && runOne(scenario, gauge); + gauge.step(); + if (!proceed) { + break; + } + } + return proceed; + } + + private boolean runOne(Scenario scenario, ProgressGauge gauge) { + gauge.clearPayload(); + gauge.setPayload(Test.PG_PAYLOAD_SCENARIO, scenario.title()); + boolean okay; + try { + running = $.requireNotNull(scenario); + scenario.validate(this); + constants.putAll(running.constants); + okay = createFixtures() && scenario.run(this, gauge); + scenario.status = TestStatus.of(okay); + } catch (RuntimeException e) { + okay = false; + String message = e.getMessage(); + scenario.errorMessage = S.blank(message) ? e.getClass().getName() : message; + scenario.cause = e.getCause(); + scenario.status = TestStatus.FAIL; + } + gauge.setPayload(PG_PAYLOAD_FAILED, !scenario.status.pass()); + return okay; + } + + Response sendRequest(RequestSpec req) throws IOException { + Timer timer = metric.startTimer("build-request"); + Request httpRequest = new RequestBuilder(req, this, port).build(); + timer.stop(); + timer = metric.startTimer("send-request"); + Response resp = http.newCall(httpRequest).execute(); + timer.stop(); + lastHeaders.set(resp.headers()); + return resp; + } + + private boolean createFixtures() { + if (running.fixtures.isEmpty()) { + return true; + } + Timer timer = metric.startTimer("create-fixtures"); + try { + RequestSpec req = RequestSpec.loadFixtures(running.fixtures); + return verify(req, "creating fixtures"); + } finally { + timer.stop(); + } + } + + + void verifyDownloadChecksum(Response response, String checksumExpected) { + if (checksumExpected.startsWith("${")) { + checksumExpected = S.string(evalStr(checksumExpected)); + } + Object o = cached(checksumExpected); + if (null == o) { + o = cached("checksum-last"); + } + if (null == o) { + o = checksumExpected; + } + ResponseBody body = response.body(); + errorIf(null == body, "No download found"); + String downloadChecksum = IO.checksum(body.byteStream()); + errorIfNot($.eq(downloadChecksum, o), "Download checksum not match"); + } + + void verifyDownloadFilename(Response response, String filenameExpected) { + String header = response.header("Content-Disposition"); + // header should be something like: attachment; filename="postcodes.xls" + errorIf(S.isBlank(header), "No Content-Disposition header found"); + int pos = header.indexOf('"'); + errorIf(pos < 0, "Content-Disposition header does not have filename specified: " + header); + String filename = header.substring(pos + 1); + filename = filename.substring(0, filename.length() - 1); // strip off last `"` + errorIfNot(S.eq(filenameExpected, filename), "Download filename[%s] not match expected value[%s]", filename, filenameExpected); + } + + Scenario scenario() { + return null == running ? target : running; + } + + boolean verify(RequestSpec req, String operation) { + boolean pass = true; + Response resp = null; + try { + resp = sendRequest(req); + if (!resp.isSuccessful()) { + pass = false; + scenario().errorMessage = "Fixtures loading failure"; + } + return pass; + } catch (IOException e) { + scenario().errorMessage = "Error " + operation; + ErrorMessage.error(e, scenario().errorMessage); + return false; + } finally { + IO.close(resp); + } + } + + private void prepareHttp() { + if (isTraceEnabled()) { + trace("prepareHTTP for scenario: " + target.name); + } + long timeout = app.config().testTimeout(); + http = new OkHttpClient.Builder() + .cookieJar(cookieStore()) + .connectTimeout(timeout, TimeUnit.SECONDS) + .readTimeout(timeout, TimeUnit.SECONDS) + .writeTimeout(timeout, TimeUnit.SECONDS) + .build(); + } + + private synchronized CookieStore cookieStore() { + if (null == cookieStore) { + App app = Act.app(); + cookieStore = null == app ? new CookieStore() : app.getInstance(CookieStore.class); + } + return cookieStore; + } + + String processStringSubstitution(String s) { + int n = s.indexOf("${"); + if (n < 0) { + return s; + } + if (n == 0 && s.endsWith(")}")) { + s = s.substring(2); + s = s.substring(0, s.length() - 1); + return S.string(evalFunc(s)); + } + int a = 0; + int z = n; + S.Buffer buf = S.buffer(); + while (true) { + buf.append(s.substring(a, z)); + n = s.indexOf("}", z); + a = n; + String part = s.substring(z + 2, a); + if (part.contains("(") && part.endsWith(")")) { + buf.append(evalFunc(part)); + } else { + String key = part; + String payload = ""; + if (part.contains(":")) { + S.Binary binary = S.binarySplit(part, ':'); + key = binary.first(); + payload = binary.second(); + } + buf.append(getVal(key, payload)); + } + n = s.indexOf("${", a); + if (n < 0) { + buf.append(s.substring(a + 1)); + return buf.toString(); + } + z = n; + } + } + + Object evalFunc(String funcExpr) { + String funcName = funcExpr; + List vals = C.list(); + if (funcExpr.contains("(")) { + funcName = S.cut(funcExpr).beforeFirst("("); + String paramStr = S.cut(funcExpr).afterFirst("("); + paramStr = S.cut(paramStr).beforeLast(")"); + if (S.notBlank(paramStr)) { + vals = C.newList(S.fastSplit(paramStr, ",")); + for (int i = 0; i < vals.size(); ++i) { + String val = S.ensure(vals.get(i).trim()).strippedOff(S.DOUBLE_QUOTES); + val = processStringSubstitution(val); + vals.set(i, val); + } + } + } + Func func = $.convert(funcName).to(Func.class); + switch (vals.size()) { + case 0: + break; + case 1: + func.init(vals.get(0)); + break; + default: + func.init(vals); + } + return func.apply(); + } + + Object eval(String expr) { + if (expr.startsWith("func:")) { + return evalFunc(expr.substring(5)); + } else if (expr.contains("(")) { + return evalFunc(expr); + } + String key = S.underscore(expr); + Object o = constants.get(key); + o = null == o ? cache.get(key) : o; + o = null == o ? Test.constant(key) : o; + try { + // final try - treat it as a function + return null == o ? evalFunc(expr) : o; + } catch (IllegalArgumentException e) { + return null; + } + } + + Object evalStr(String s) { + int n = s.indexOf("${"); + if (n < 0) { + return s; + } + if (n > 0) { + return processStringSubstitution(s); + } + int z = s.indexOf("}"); + if (z < s.length() - 1) { + return processStringSubstitution(s); + } + String part = s.substring(2, z); + if (part.contains("(") && part.endsWith(")")) { + return evalFunc(part); + } else { + String key = part; + String payload = ""; + if (part.contains(":")) { + S.Binary binary = S.binarySplit(part, ':'); + key = binary.first(); + payload = binary.second(); + } + return getVal(key, payload); + } + } + + + private Object getVal(String key) { + if ("last".equals(key)) { + return lastData.get(); + } + Object o = cache.get(key); + if (null != o) { + return o; + } + if (key.contains(".")) { + String firstLevel = S.cut(key).beforeFirst("."); + Object firstLevelVal = cache.get(firstLevel); + if (null != firstLevelVal) { + try { + return $.getProperty(firstLevelVal, S.cut(key).afterFirst(".")); + } catch (Exception e) { + // ignore + } + } + } + key = S.underscore(key); + o = constants.get(key); + if (null != o) { + return o; + } + o = Test.constant(key); + if (null != o) { + return o; + } + try { + return evalFunc(key); + } catch (Exception e) { + if (!"last".equals(key)) { + try { + return getVal("last", key); + } catch (Exception e1) { + throw E.unexpected("Unable to get value by key: %s", key); + } + } + return null; + } + } + + private Object getVal(String key, String ref) { + Object stuff = getVal(key); + if (S.blank(ref) || null == stuff) { + return stuff; + } + if (stuff instanceof String) { + String str = $.cast(stuff); + if (str.contains("<") && str.contains(">")) { + // try get html element + try { + Document doc = Jsoup.parse(str, S.concat("http://localhost:", port, "/")); + Elements elements = doc.select(ref); + if (elements.size() != 0) { + return elements.get(0).text(); + } + } catch (Exception e) { + // just ignore + } + } + } + return JSONTraverser.traverse(stuff, ref); + } + + Object getLastVal(String ref) { + return getVal("last", ref); + } + + void verifyBody(String bodyString, ResponseSpec spec) { + lastData.set(bodyString); + if (null == spec) { + if (bodyString.startsWith("[")) { + JSONArray array = JSON.parseArray(bodyString); + lastData.set(array); + } else if (bodyString.startsWith("{")) { + JSONObject obj = JSON.parseObject(bodyString); + lastData.set(obj); + } + return; + } + if (null != spec.text) { + verifyValue("body text", bodyString, spec.text); + } else if (null != spec.json && !spec.json.isEmpty()) { + if (bodyString.startsWith("[")) { + JSONArray array = JSON.parseArray(bodyString); + lastData.set(array); + verifyList("body json array", array, spec.json); + } else if (bodyString.startsWith("{")) { + JSONObject obj = JSON.parseObject(bodyString); + lastData.set(obj); + verifyJsonObject(obj, spec.json); + } else { + ErrorMessage.error("Unknown JSON string: \n%s", bodyString); + } + } else if (null != spec.xml && !spec.xml.isEmpty()) { + org.w3c.dom.Document doc = XML.read(bodyString); + JSONObject obj = $.convert(doc).to(JSONObject.class); + String xmlRoot = app.config().xmlRootTag(); + if (obj.containsKey(xmlRoot)) { + Object o = obj.get(xmlRoot); + lastData.set(o); + if (o instanceof JSONObject) { + obj = (JSONObject) o; + verifyJsonObject(obj, spec.xml); + } else if (o instanceof List) { + verifyList("body xml array", (List)o, spec.xml); + } else { + throw new UnexpectedException("Unknown root type: " + o.getClass()); + } + } else { + lastData.set(obj); + verifyJsonObject(obj, spec.xml); + } + } else if (null != spec.html && !spec.html.isEmpty()) { + lastData.set(bodyString); + Document doc = Jsoup.parse(bodyString, S.concat("http://localhost:", port, "/")); + for (Map.Entry entry : spec.html.entrySet()) { + String path = entry.getKey(); + Elements elements = doc.select(path); + verifyValue("body html path", elements, entry.getValue()); + } + } + } + + void verifyList(String name, List array, Map spec) { + for (Object obj : spec.entrySet()) { + Map.Entry entry = $.cast(obj); + Object key = entry.getKey(); + String sKey = S.string(key); + Object test = entry.getValue(); + Object value = null; + if ("me".equals(key) || "this".equals(key)) { + value = array; + } else if ("size".equals(key) || "len".equals(key) || "length".equals(key)) { + value = array.size(); + } else if ("toString".equals(key) || "string".equals(key) || "str".equals(key)) { + value = JSON.toJSONString(array); + } else if ("?".equals(key) || (sKey.toLowerCase().startsWith(""))) { + for (Object arrayElement : array) { + try { + verifyValue(name, arrayElement, test); + return; + } catch (Exception e) { + // try next one + } + } + throw ErrorMessage.error("No element matches requirement: %s", test); + } else if (S.isInt(sKey)) { + int id = Integer.parseInt(sKey); + value = array.get(id); + } else { + if (sKey.contains(".")) { + String id = S.cut(key).beforeFirst("."); + String prop = S.cut(key).afterFirst("."); + if ("?".equals(id) || "".equalsIgnoreCase(id)) { + for (Object arrayElement : array) { + if (!(arrayElement instanceof JSONObject)) { + continue; + } + try { + verifyValue(prop, ((JSONObject) arrayElement).get(prop), test); + return; + } catch (Exception e) { + // try next one + } + } + } else if (S.isInt(id)) { + int i = Integer.parseInt(id); + Object o = array.get(i); + if (o instanceof JSONObject) { + JSONObject json = (JSONObject) o; + value = json.get(prop); + } + } + } + if (null == value) { + throw ErrorMessage.error("Unknown attribute of array verification: %s", key); + } + } + verifyValue(name, value, test); + } + } + + void verifyJsonObject(JSONObject obj, Map jsonSpec) { + for (Map.Entry entry : jsonSpec.entrySet()) { + String key = entry.getKey(); + // ${sizeOf(date)} + if (key.startsWith("${")) { + // sizeOf(date)} + String s = key.substring(2); + + // sizeOf(date) + s = s.substring(0, s.length() - 1); + + // sizeOf + String funcName = s.substring(0, s.indexOf("(")); + + // date) + s = s.substring(s.indexOf("(") + 1); + // date + String varName = s.substring(0, s.length() - 1); + + Object val = $.getProperty(obj, varName); + val = evalFunc(funcName + "(" + val + ")"); + verifyValue(key, val, entry.getValue()); + } else { + Object val = $.getProperty(obj, key); + verifyValue(key, val, entry.getValue()); + } + } + } + + void verifyValue(String name, Object value, Object test) { + if (test instanceof List) { + verifyValue_(name, value, (List) test); + } else if (value instanceof List && test instanceof Map) { + verifyList(name, (List) value, (Map) test); + } else { + if (matches(value, test)) { + return; + } + if (value instanceof JSONObject) { + errorIfNot(test instanceof Map, "Cannot verify %s value [%s] against test [%s]", name, value, test); + JSONObject json = (JSONObject) value; + Map testMap = (Map) test; + for (Map.Entry entry : testMap.entrySet()) { + Object testKey = entry.getKey(); + Object testValue = entry.getValue(); + Object attr = json.get(testKey); + verifyValue(S.concat(name, ".", testKey), attr, testValue); + } + } else if (value instanceof Elements) { + if (test instanceof Map) { + verifyList(name, (Elements) value, (Map) test); + } else { + Elements elements = (Elements) value; + if (elements.isEmpty()) { + value = null; + } else { + value = elements.first(); + } + verifyValue(name, value, test); + } + } else if (value instanceof Number) { + Number found = (Number) value; + Number expected = null; + if (test instanceof Number) { + expected = (Number) test; + } else { + String s = S.string(test); + s = S.isNumeric(s) ? s : processStringSubstitution(s); + if (S.isNumeric(S.string(s))) { + expected = $.convert(s).to(Double.class); + } else { + ErrorMessage.error("Cannot verify %s value [%s] against test [%s]", name, value, test); + } + } + double delta = Math.abs(expected.doubleValue() - found.doubleValue()); + if ((delta / found.doubleValue()) > 0.001) { + ErrorMessage.error("Cannot verify %s value [%s] against test [%s]", name, value, test); + } + } else { + // try convert the test into String + String testString = $.convert(test).toString(); + boolean verified = verifyStringValue_(testString, value, test); + if (!verified) { + String processedString = processStringSubstitution(testString); + if (S.neq(processedString, testString)) { + verified = verifyStringValue_(processedString, value, test); + } + } + errorIfNot(verified, "Cannot verify %s value [%s] against test [%s]", name, value, test); + } + } + } + + private boolean verifyStringValue_(String testString, Object value, Object test) { + if (matches(testString, value)) { + return true; + } + if (null != value && ("*".equals(test) || "...".equals(test) || "".equals(test))) { + return true; + } + try { + Pattern p = Pattern.compile(testString); + return p.matcher(S.string(value)).matches(); + } catch (Exception e) { + // ignore + } + Verifier v = tryLoadVerifier(testString); + if (null != v && v.verify(value)) { + return true; + } + return false; + } + + private void verifyValue_(String name, Object value, List tests) { + // try to do the literal match + if (value instanceof List) { + List found = (List) value; + boolean ok = found.size() == tests.size(); + if (ok) { + for (int i = 0; i < found.size(); ++i) { + Object foundElement = found.get(i); + Object testElement = tests.get(i); + if (!matches(foundElement, testElement)) { + ok = false; + break; + } + } + } + if (ok) { + return; + } + } + // now try verifiers + if (value instanceof Elements) { + Elements elements = (Elements) value; + if (elements.size() > 0) { + value = elements.first(); + } else { + value = null; + } + } + for (Object test : tests) { + errorIfNot(test instanceof Map, "Cannot verify %s value [%s] against test [%s]", name, value, test); + Map map = (Map) test; + errorIfNot(map.size() == 1, "Cannot verify %s value [%s] against test [%s]", name, value, test); + Map.Entry entry = map.entrySet().iterator().next(); + Object entryValue = entry.getValue(); + if (entryValue instanceof String) { + String s = (String) entryValue; + Object processed = evalStr(s); + if (s != processed) { + entry.setValue(processed); + } + } + Verifier v = $.convert(map).to(Verifier.class); + errorIf(null == v, "Cannot verify %s value [%s] against test [%s]", name, value, test); + errorIf(!verify(v, value), "Cannot verify %s value [%s] against test [%s]", name, value, v); + } + } + + private boolean verify(Verifier test, Object value) { + if (test.verify(value)) { + return true; + } + if (value instanceof Element) { + Element e = (Element) value; + if (test.verify(e.val())) { + return true; + } + if (test.verify(e.text())) { + return true; + } + if (test.verify(e.html())) { + return true; + } + } + return false; + } + + private static boolean matches(Object a, Object b) { + if ($.eq(a, b)) { + return true; + } + if (!((b instanceof String) && (a instanceof Element))) { + return false; + } + String test = S.string(b); + Element element = (Element) a; + // try html + String html = element.html(); + if (S.eq(html, test, S.IGNORECASE)) { + return true; + } + // try text + String text = element.text(); + if (S.eq(text, test, S.IGNORECASE)) { + return true; + } + // try val + String val = element.val(); + if (S.eq(val, test, S.IGNORECASE)) { + return true; + } + return false; + } + + private Class tryLoadClass(String name) { + try { + return null != app ? app.classForName(name) : $.classForName(name); + } catch (Exception e) { + return null; + } + } + + private Verifier tryLoadVerifier(String name) { + boolean revert = false; + if (name.startsWith("!") || name.startsWith("-")) { + revert = true; + name = name.substring(1).trim(); + } else if (name.startsWith("not:")) { + revert = true; + name = name.substring(4).trim(); + } + Class c = tryLoadClass(name); + if (null != c) { + if (Verifier.class.isAssignableFrom(c)) { + final Verifier v = (Verifier) (null != app ? app.getInstance(c) : $.newInstance(c)); + return v.meOrReversed(revert); + } else { + throw new UnexpectedException("Class not supported: " + name); + } + } + return null; + } + +} diff --git a/src/main/java/act/test/macro/Macro.java b/src/main/java/act/test/macro/Macro.java index 8f1a1d29a..ad237d51f 100644 --- a/src/main/java/act/test/macro/Macro.java +++ b/src/main/java/act/test/macro/Macro.java @@ -22,6 +22,7 @@ import act.Act; import act.test.Scenario; +import act.test.TestSession; import act.test.util.NamedLogic; import org.osgl.$; import org.osgl.util.*; @@ -33,7 +34,7 @@ public abstract class Macro extends NamedLogic { - public abstract void run(Scenario scenario); + public abstract void run(TestSession session); @Override protected final Class type() { @@ -43,8 +44,8 @@ protected final Class type() { public static class ClearFixture extends Macro { @Override - public void run(Scenario scenario) { - scenario.clearFixtures(); + public void run(TestSession session) { + session.clearFixtures(); } @Override @@ -55,8 +56,8 @@ protected List aliases() { public static class ClearSession extends Macro { @Override - public void run(Scenario scenario) { - scenario.clearSession(); + public void run(TestSession session) { + session.clearSession(); } } @@ -79,8 +80,8 @@ public void init(Object param) { } @Override - public void run(Scenario scenario) { - scenario.cache(resourcePath, tryRead()); + public void run(TestSession session) { + session.cache(resourcePath, tryRead()); } private String tryRead() { @@ -112,7 +113,7 @@ public void init(Object param) { } @Override - public void run(Scenario scenario) { + public void run(TestSession session) { try { Thread.sleep(time); } catch (InterruptedException e) { diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index 371e29a7b..f766c89fb 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -93,7 +93,6 @@ public Map load() { } for (Scenario scenario : scenarioMap.values()) { scenario.resolveSetupDependencies(); - scenario.validate(); } ScenarioComparator comparator = new ScenarioComparator(false); for (List list : partitionSetups.values()) { diff --git a/testapps/GHIssues/.gitignore b/testapps/GHIssues/.gitignore index 3b8194b3f..0577ee63e 100644 --- a/testapps/GHIssues/.gitignore +++ b/testapps/GHIssues/.gitignore @@ -17,3 +17,4 @@ test.trace.db act.pid .workspace *.geany +upload* \ No newline at end of file diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index adeca82b3..d87fa3486 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -5,14 +5,14 @@ 4.0.0 act-ghissues - 1.8.26.0-SNAPSHOT + 1.8.27.0-SNAPSHOT ActFramework Github Issue Reproduce App org.actframework act-starter-parent - 1.8.25.0 + 1.8.26.0 @@ -25,7 +25,7 @@ org.actframework act - 1.8.26-SNAPSHOT + 1.8.27a-SNAPSHOT org.actframework From 6153b93457817ed84d842d94d13fb9527f6984c8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 15 Sep 2019 19:17:21 +1000 Subject: [PATCH 502/730] update CHANGELOG; fix hot reload issue #1201; fix CI issue --- CHANGELOG.md | 11 +++-- legacy-testapp/pom.xml | 2 +- pom.xml | 4 +- src/main/java/act/Act.java | 24 +++++++++++ src/main/java/act/app/App.java | 18 +++++--- src/main/java/act/conf/AppConfig.java | 2 +- .../builtin/controller/HotReloading.java | 43 +++++++++++++++++++ src/main/java/act/test/Test.java | 17 +++++++- .../java/act/util/TopLevelDomainList.java | 7 +-- src/main/java/act/xio/NetworkHandler.java | 18 +++++++- .../resources/rythm/error/dev/errorPage.html | 12 ++++++ testapps/GHIssues/pom.xml | 2 +- .../src/main/resources/conf/test.properties | 1 + 13 files changed, 137 insertions(+), 24 deletions(-) create mode 100644 src/main/java/act/handler/builtin/controller/HotReloading.java create mode 100644 testapps/GHIssues/src/main/resources/conf/test.properties diff --git a/CHANGELOG.md b/CHANGELOG.md index 223a42c62..aaf8576e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ # ActFramework Change Log -**1.8.27** -* Change Content-Type header for JSON error response #1173 +**1.8.27** 15/Sep/2019 +* Hotreload error - Provider has already registered for spec: class act.aaa.AAAService #1201 +* Act-Test - Improve dependency/fixture management #1198 +* Act-Test - dependency order not maintained when setup is true #1197 * Act-Test - dependency order not maintained when setup is true #1195 * ConcurrentModificationException on detecting file changes #1194 * Hotreload logic - it shall save ActionContext to local before checking file changes #1193 @@ -21,10 +23,11 @@ * ActionContext not released when `ResourceGetter` is handling request #1179 * ConcurrentModificationException when output to csv with PropertySpec specified #1178 * `FixtureLoader` not effective after called #1177 -* NPE triggered in `requestThrottleExpireScale` after hot reload #1175 * Act-Test - NPE encountered when scenario is parsed after scenario depend on it parsed #1176 +* NPE triggered in `requestThrottleExpireScale` after hot reload #1175 +* Change Content-Type header for JSON error response #1173 -**1.8.26** +**1.8.26** 21/Jul/2019 * update osgl-tool to 1.20.0 * update genie to 1.11.0 * API doc - allow landing to specific part when open link with hash #1171 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index eba226860..783162fe3 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.27a-SNAPSHOT + 1.8.27-SNAPSHOT [0.13.0, 2.0.0) 1.7.2 testapp.TestApp diff --git a/pom.xml b/pom.xml index ed92f7c09..8cc46c387 100644 --- a/pom.xml +++ b/pom.xml @@ -66,8 +66,8 @@ 3.12.1 - 1.20.1-SNAPSHOT - 1.7.1-SNAPSHOT + 1.20.1 + 1.7.1 1.11.0 1.10.0 1.10.0 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index b674391b3..936b3e1ba 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -73,6 +73,7 @@ import java.lang.management.RuntimeMXBean; import java.lang.reflect.Method; import java.net.*; +import java.text.NumberFormat; import java.util.*; import java.util.jar.Attributes; import java.util.jar.Manifest; @@ -1322,5 +1323,28 @@ private static Genie genie() { // } public static void main(String[] args) throws Exception { + String text = "abc[[UC_FLD_APPLICATIONEFFECTIVEDATE]]xyz\t[[UC_FLD_NDV123985]]dsa[[UC_FLD_NDV123981]]adf"; + String text0 = text; + int pos = text.indexOf("[["); + int pos0 = 0; + StringBuilder buf = new StringBuilder(); + buf.append(text.substring(pos0, pos)); + while (pos >= 0) { + int bpos = text.indexOf("]]", pos); + E.illegalStateIf(bpos < 0, "Invalid template content: " + text0); + String varName = text.substring(pos + 2, bpos); + String varVal = "<<" + S.cut(varName).after("UC_FLD_") + ">>"; + buf.append(varVal); + pos0 = bpos + 2; + pos = text.indexOf("[[", bpos); + if (pos > 0) { + buf.append(text.substring(pos0, pos)); + } else { + buf.append(text.substring(pos0, text.length())); + } + } + System.out.println(text); + System.out.println(buf.toString()); + } } diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index f364ff679..002dcf118 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -81,6 +81,7 @@ import act.view.rythm.*; import act.ws.*; import org.osgl.$; +import org.osgl.Lang; import org.osgl.cache.CacheService; import org.osgl.http.HttpConfig; import org.osgl.logging.LogManager; @@ -203,7 +204,7 @@ private App() { this.appHome = RuntimeDirs.home(this); this.config = new AppConfig<>().app(this); INST = this; - $.setFieldValue("metricPlugin", Act.class, new SimpleMetricPlugin()); + Lang.setFieldValue("metricPlugin", Act.class, new SimpleMetricPlugin()); this.eventEmitted = new HashSet<>(); this.eventBus = new EventBus(this); this.jobManager = new JobManager(this); @@ -620,8 +621,8 @@ public boolean wasStarted() { return hasStarted; } - public boolean hotReloading() { - return hasStarted; + public boolean isLoading() { + return loading.get(); } public boolean isMainThread() { @@ -718,6 +719,7 @@ public synchronized void refresh() { emit(EVENT_BUS_INITIALIZED); loadConfig(); + profile(); // ensure profile get loaded emit(CONFIG_LOADED); initDataPropertyRepository(); @@ -784,6 +786,9 @@ public synchronized void refresh() { final Runnable runnable1 = new Runnable() { @Override public void run() { + if ($.bool("false")) { + $.nil(); + } initJsonDtoClassManager(); initParamValueLoaderManager(); initMailerConfigManager(); @@ -1269,14 +1274,15 @@ App register(final AppService service, boolean noDiBinder) { } appServiceRegistry.register(service); if (null != eventBus && !noDiBinder) { + final Class serviceType = service.getClass(); eventBus.bind(SysEventId.DEPENDENCY_INJECTOR_LOADED, new SysEventListenerBase() { @Override - public void on(EventObject event) throws Exception { + public void on(EventObject event) { final App app = App.this; - eventBus.emit(new DependencyInjectionBinder(app, service.getClass()) { + eventBus.emit(new DependencyInjectionBinder(app, serviceType) { @Override public Object resolve(App app) { - return app.service(service.getClass()); + return app.service(serviceType); } }); } diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index d1f471044..91f93b6de 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -3736,6 +3736,6 @@ public DateTimeStyle timeStyle() { } public void setDefaultTldReloadCron() { - raw.put(canonical(TopLevelDomainList.CRON_TLD_RELOAD), "0 2 * * * *"); + raw.put(canonical(TopLevelDomainList.CRON_TLD_RELOAD), "0 0 2 * * *"); } } diff --git a/src/main/java/act/handler/builtin/controller/HotReloading.java b/src/main/java/act/handler/builtin/controller/HotReloading.java new file mode 100644 index 000000000..f5cc5efb8 --- /dev/null +++ b/src/main/java/act/handler/builtin/controller/HotReloading.java @@ -0,0 +1,43 @@ +package act.handler.builtin.controller; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.ActionContext; +import act.handler.ExpressHandler; +import org.osgl.mvc.result.Conflict; +import org.osgl.mvc.result.NotImplemented; + +public class HotReloading extends FastRequestHandler implements ExpressHandler { + + public static HotReloading INSTANCE = new HotReloading(); + + private static Conflict conflict = new Conflict("Hot reloading in progress ..."); + + @Override + public void handle(ActionContext context) { + conflict.apply(context.req(), context.prepareRespForResultEvaluation()); + } + + @Override + public String toString() { + return "error: not implemented"; + } +} diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 79602d716..3dd11924a 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -336,7 +336,19 @@ public List run(App app, Keyword testId, String partition, boolean shu continue; } if (!toBeRun.contains(scenario)) { - toBeRun.add(scenario); + boolean shouldAdd = true; + for (Scenario other : scenarios.values()) { + if (other == scenario) { + continue; + } + if (other.allDepends.contains(scenario)) { + shouldAdd = false; + break; + } + } + if (shouldAdd) { + toBeRun.add(scenario); + } } } Collections.sort(toBeRun, new ScenarioComparator(false)); @@ -361,6 +373,9 @@ public List run(App app, Keyword testId, String partition, boolean shu } gauge.step(); addToList(scenario, list, scenarioManager); + for (Scenario dep : scenario.allDepends) { + addToList(dep, list, scenarioManager); + } if (null != pb) { if (!pbStarted) { pb.start(); diff --git a/src/main/java/act/util/TopLevelDomainList.java b/src/main/java/act/util/TopLevelDomainList.java index 5cffc5487..720f32ebb 100644 --- a/src/main/java/act/util/TopLevelDomainList.java +++ b/src/main/java/act/util/TopLevelDomainList.java @@ -67,12 +67,7 @@ public boolean isTld(String s) { */ @PostConstruct public void filter() { - Act.app().jobManager().beforeAppStart(new Runnable() { - @Override - public void run() { - doFilter(); - } - }); + doFilter(); } private void doFilter() { diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 0d9ba13fc..39c4fd4d9 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -29,6 +29,7 @@ import act.handler.RequestHandler; import act.handler.builtin.*; import act.handler.builtin.controller.FastRequestHandler; +import act.handler.builtin.controller.HotReloading; import act.handler.builtin.controller.RequestHandlerProxy; import act.handler.event.PostHandle; import act.handler.event.PreHandle; @@ -45,6 +46,11 @@ import org.osgl.util.E; import org.osgl.util.S; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + /** * A `NetworkHandler` can be registered to an {@link Network} and get invoked when * there are network event (e.g. an HTTP request) incoming @@ -58,6 +64,7 @@ public class NetworkHandler extends LogSupportedDestroyableBase { private Metric metric; private $.Func2 contentSuffixProcessor; private $.Func2 urlContextProcessor; + private ScheduledExecutorService hotReloadExecutor; public NetworkHandler(App app) { E.NPE(app); @@ -70,6 +77,9 @@ public void preHotReload() { initUrlProcessors(); } }); + if (app.isDev()) { + hotReloadExecutor = Executors.newScheduledThreadPool(2); + } } private void initUrlProcessors() { @@ -102,6 +112,10 @@ public void handle(final ActionContext ctx, final NetworkDispatcher dispatcher) // important as app.checkUpdates(boolean) might trigger // an app hotreload, which might refer to ActionContext.current() ctx.saveLocal(); + if (app.isLoading()) { + HotReloading.INSTANCE.handle(ctx); + return; + } boolean updated = app.checkUpdates(false); if (updated && !app.hasBlockIssue()) { app.jobManager().post(SysEventId.POST_START, "NetworkHandler:resumeRequestHandlingAfterHotReload", new Runnable() { diff --git a/src/main/resources/rythm/error/dev/errorPage.html b/src/main/resources/rythm/error/dev/errorPage.html index 290fdad49..654f4377c 100644 --- a/src/main/resources/rythm/error/dev/errorPage.html +++ b/src/main/resources/rythm/error/dev/errorPage.html @@ -6,8 +6,20 @@ @ifNot(_error instanceof act.util.ActError) { @section(head){ + @render(moreStyles) } +
                                                                                                                                                                              +  @_error.getLocalizedMessage()
                                                                                                                                                                              +
                                                                                                                                                                              @return } @{ diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index d87fa3486..20e3b736c 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -25,7 +25,7 @@ org.actframework act - 1.8.27a-SNAPSHOT + 1.8.27-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/resources/conf/test.properties b/testapps/GHIssues/src/main/resources/conf/test.properties new file mode 100644 index 000000000..7dfc66766 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/conf/test.properties @@ -0,0 +1 @@ +test.delay=10 \ No newline at end of file From 74983969cb9323230c9f1b98cb74d43deacfff20 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 15 Sep 2019 19:18:56 +1000 Subject: [PATCH 503/730] [maven-release-plugin] prepare release act-1.8.27 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8cc46c387..34111b145 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.27-SNAPSHOT + 1.8.27 ACT Framework The ACT full stack MVC framework From e91d596a44c34292bc073ebf9a116dfcef14428e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 15 Sep 2019 19:19:06 +1000 Subject: [PATCH 504/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 34111b145..c06fa17a9 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.27 + 1.8.28-SNAPSHOT ACT Framework The ACT full stack MVC framework From 736ff60fee828b5a50f4cf093a08832eff04e218 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 15 Sep 2019 22:25:16 +1000 Subject: [PATCH 505/730] update README and VERSION_MATRIX --- README.md | 10 +++++----- VERSION_MATRIX.md | 40 ++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 299922547..54aab2ece 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.26.0 + 1.8.27.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.26.0 + -DarchetypeVersion=1.8.27.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.26.0 + -DarchetypeVersion=1.8.27.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.26.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.27.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.26.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.27.0 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 055c8ec4b..0e8dd3599 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,25 +1,25 @@ # Version Matrix -| act | 1.8.16 | 1.8.17 | 1.8.18 | 1.8.19 | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | -| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.5.3 | 1.5.3 | 1.5.4 | 1.5.4 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | -| beetl | 1.4.6 | 1.4.6 | 1.4.7 | 1.4.7 | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | -| beetlsql | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | -| ebean-java7 | 1.7.5 | 1.7.5 | 1.7.5 | 1.7.5 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | -| ebean(java8) | 1.7.5 | 1.7.5 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | -| eclipselink(java8) | 1.5.5 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | -| excel | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | -| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | -| hibernate | 1.5.4 | 1.5.5 | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | -| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | -| jpa-common | 1.5.4 | 1.5.5 | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | -| morphia | 1.6.5 | 1.6.6 | 1.6.6 | 1.6.6 | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | -| mustache(java8) | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | -| social | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | -| sql-common | 1.4.4 | 1.4.4 | 1.4.4 | 1.4.4 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | -| storage(java8) | 0.13.5 | 0.13.5 | 0.13.5 | 0.13.5 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | -| thymeleaf | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | -| velocity | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | +| act | 1.8.18 | 1.8.19 | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | +| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | +| aaa | 1.5.4 | 1.5.4 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | +| beetl | 1.4.7 | 1.4.7 | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | +| beetlsql | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | +| ebean-java7 | 1.7.5 | 1.7.5 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | +| ebean(java8) | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | +| eclipselink(java8) | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | +| excel | 1.5.0 | 1.5.0 | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | +| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | +| hibernate | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | +| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | +| jpa-common | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | +| morphia | 1.6.6 | 1.6.6 | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | +| mustache(java8) | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | +| social | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | +| sql-common | 1.4.4 | 1.4.4 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | +| storage(java8) | 0.13.5 | 0.13.5 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | +| thymeleaf | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | +| velocity | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | ## Note From d3eba358a7b8fe167a888723bd71192ad772b0d0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 21 Sep 2019 16:07:14 +1000 Subject: [PATCH 506/730] fix #1204 --- CHANGELOG.md | 5 +++-- src/main/java/act/crypto/HMAC.java | 22 ++++++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaf8576e4..ed34b7b2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,11 @@ # ActFramework Change Log +**1.8.27** 21/Sep/2019 +* Session resolve issue for concurrent incoming requests #1204 + **1.8.27** 15/Sep/2019 * Hotreload error - Provider has already registered for spec: class act.aaa.AAAService #1201 * Act-Test - Improve dependency/fixture management #1198 -* Act-Test - dependency order not maintained when setup is true #1197 * Act-Test - dependency order not maintained when setup is true #1195 * ConcurrentModificationException on detecting file changes #1194 * Hotreload logic - it shall save ActionContext to local before checking file changes #1193 @@ -11,7 +13,6 @@ * FastJsonJodaDateCodec - allow it to deserialize timestamp (long) data #1191 * Act-Test - add randDouble and randFloat function #1190 * Act-Test - allow run scenarios for specific partition #1189 -* Add new `force-fixtures' to scenario #1188 * Act-Test - display partition name in the title #1187 * Update to osgl-tool-1.20.1 and osgl-cache-1.7.1 #1186 * No need to invoke hotreload listener if app is not running in DEV mode #1185 diff --git a/src/main/java/act/crypto/HMAC.java b/src/main/java/act/crypto/HMAC.java index eaa8b5e58..7bdf9818b 100644 --- a/src/main/java/act/crypto/HMAC.java +++ b/src/main/java/act/crypto/HMAC.java @@ -111,7 +111,7 @@ public String hash(byte[] bytes) { } protected byte[] doHash(byte[] bytes) { - return doHash(bytes, mac); + return doHash(bytes, mac()); } protected final byte[] doHash(byte[] bytes, Mac mac) { @@ -129,7 +129,7 @@ public boolean verifyHash(String content, String hash) { } protected boolean verifyHash(byte[] payload, byte[] hash) { - return verifyHash(payload, hash, mac); + return verifyHash(payload, hash, mac()); } protected final boolean verifyHash(byte[] payload, byte[] hash, Mac mac) { @@ -142,6 +142,24 @@ public boolean verifyArgo(String algoName) { return null != algorithm && S.eq(this.algoName, algorithm.jwtName()); } + private static final ThreadLocal curMac = new ThreadLocal<>(); + private Mac mac() { + Mac mac = curMac.get(); + if (null == mac) { + mac = newMac(); + curMac.set(mac); + } + return mac; + } + + private Mac newMac() { + try { + return (Mac) mac.clone(); + } catch (CloneNotSupportedException e) { + throw E.unsupport("mac not clonable"); + } + } + private static Map algoLookup; static { algoLookup = new HashMap<>(); for (Algorithm algo : Algorithm.values()) { From 81ade702045ce53e319ed2a546de23cf34deaffa Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 21 Sep 2019 17:21:03 +1000 Subject: [PATCH 507/730] update test app dependency version --- legacy-testapp/pom.xml | 2 +- testapps/GHIssues/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 783162fe3..da446c174 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.27-SNAPSHOT + 1.8.28-SNAPSHOT [0.13.0, 2.0.0) 1.7.2 testapp.TestApp diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 20e3b736c..44ea4fe90 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.26.0 + 1.8.27.0 @@ -25,7 +25,7 @@ org.actframework act - 1.8.27-SNAPSHOT + 1.8.28-SNAPSHOT org.actframework From 39f9694710d36a5f90174434fdfedf33f8c12cfe Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 21 Sep 2019 17:27:29 +1000 Subject: [PATCH 508/730] [maven-release-plugin] prepare release act-1.8.28 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c06fa17a9..c4615ab92 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.28-SNAPSHOT + 1.8.28 ACT Framework The ACT full stack MVC framework From b3ca4debe96313e1c83c554075f4c0ad121101fe Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 21 Sep 2019 17:27:39 +1000 Subject: [PATCH 509/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c4615ab92..1902cd05c 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.28 + 1.8.29-SNAPSHOT ACT Framework The ACT full stack MVC framework From 88a5814c43c298193574d59472f13da582dc0687 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 21 Sep 2019 18:45:47 +1000 Subject: [PATCH 510/730] update README and VERSION MATRIX --- README.md | 10 +++++----- VERSION_MATRIX.md | 40 ++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 54aab2ece..f623e5906 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.27.0 + 1.8.28.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.27.0 + -DarchetypeVersion=1.8.28.0 ``` To start an new project for RESTful service: @@ -38,19 +38,19 @@ mvn archetype:generate -B \ -DartifactId=helloservice \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.27.0 + -DarchetypeVersion=1.8.28.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.27.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.28.0 ``` Or ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.27.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.28.0 ``` For RESTful service project diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 0e8dd3599..7ae668711 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,25 +1,25 @@ # Version Matrix -| act | 1.8.18 | 1.8.19 | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | -| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.5.4 | 1.5.4 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | -| beetl | 1.4.7 | 1.4.7 | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | -| beetlsql | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | -| ebean-java7 | 1.7.5 | 1.7.5 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | -| ebean(java8) | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | -| eclipselink(java8) | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | -| excel | 1.5.0 | 1.5.0 | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | -| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | -| hibernate | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | -| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | -| jpa-common | 1.5.6 | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | -| morphia | 1.6.6 | 1.6.6 | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | -| mustache(java8) | 1.4.5 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | -| social | 0.12.5 | 0.12.5 | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | -| sql-common | 1.4.4 | 1.4.4 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | -| storage(java8) | 0.13.5 | 0.13.5 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | -| thymeleaf | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | -| velocity | 1.3.5 | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | +| act | 1.8.19 | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | 1.8.28 | +| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | +| aaa | 1.5.4 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | +| beetl | 1.4.7 | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | +| beetlsql | 1.5.7 | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | 1.7.1 | +| ebean-java7 | 1.7.5 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.8 | +| ebean(java8) | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.9 | +| eclipselink(java8) | 1.5.7 | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | +| excel | 1.5.0 | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.1 | +| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | +| hibernate | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | +| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | +| jpa-common | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | +| morphia | 1.6.6 | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | +| mustache(java8) | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | +| social | 0.12.5 | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | +| sql-common | 1.4.4 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | +| storage(java8) | 0.13.5 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | +| thymeleaf | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | +| velocity | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | ## Note From 40184da738a233de7fc3f9cc1b5f780c766333c0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 22 Sep 2019 09:17:23 +1000 Subject: [PATCH 511/730] fix CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed34b7b2b..7b41537f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.27** 21/Sep/2019 +**1.8.28** 21/Sep/2019 * Session resolve issue for concurrent incoming requests #1204 **1.8.27** 15/Sep/2019 From 0823884999c2953ddeaa1e14820fbff1f8752f72 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 22 Sep 2019 09:22:31 +1000 Subject: [PATCH 512/730] Update FastJSON to 1.2.61 #1205 --- CHANGELOG.md | 5 ++++- pom.xml | 2 +- .../java/act/util/FastJsonEnhancedAdaptiveMapCodec.java | 4 ++-- src/main/java/act/util/FastJsonKvCodec.java | 4 ++-- testapps/GHIssues/pom.xml | 6 +++--- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed34b7b2b..7800c2b37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log -**1.8.27** 21/Sep/2019 +**1.8.29** +* Update FastJSON to 1.2.61 #1205 + +**1.8.28** 21/Sep/2019 * Session resolve issue for concurrent incoming requests #1204 **1.8.27** 15/Sep/2019 diff --git a/pom.xml b/pom.xml index 1902cd05c..c1cb7fe88 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2 1.3.3 4.6.1 - 1.2.60 + 1.2.61 1.1.2 0.7 1.16 diff --git a/src/main/java/act/util/FastJsonEnhancedAdaptiveMapCodec.java b/src/main/java/act/util/FastJsonEnhancedAdaptiveMapCodec.java index cb8f3f0d2..0eda9b7c0 100644 --- a/src/main/java/act/util/FastJsonEnhancedAdaptiveMapCodec.java +++ b/src/main/java/act/util/FastJsonEnhancedAdaptiveMapCodec.java @@ -263,7 +263,7 @@ public void write(JSONSerializer serializer, Object object, Object fieldName, Ty List contextValueFilters = this.contextValueFilters; if ((valueFilters != null && valueFilters.size() > 0) // || (contextValueFilters != null && contextValueFilters.size() > 0)) { - value = this.processValue(serializer, null, object, entryKey, value); + value = this.processValue(serializer, null, object, entryKey, value, features); } } { @@ -271,7 +271,7 @@ public void write(JSONSerializer serializer, Object object, Object fieldName, Ty List contextValueFilters = this.contextValueFilters; if ((valueFilters != null && valueFilters.size() > 0) // || (contextValueFilters != null && contextValueFilters.size() > 0)) { - value = this.processValue(serializer, null, object, entryKey, value); + value = this.processValue(serializer, null, object, entryKey, value, features); } } diff --git a/src/main/java/act/util/FastJsonKvCodec.java b/src/main/java/act/util/FastJsonKvCodec.java index a54b59484..e64ae0a34 100644 --- a/src/main/java/act/util/FastJsonKvCodec.java +++ b/src/main/java/act/util/FastJsonKvCodec.java @@ -261,7 +261,7 @@ public void write(JSONSerializer serializer, Object object, Object fieldName, Ty List contextValueFilters = this.contextValueFilters; if ((valueFilters != null && valueFilters.size() > 0) // || (contextValueFilters != null && contextValueFilters.size() > 0)) { - value = this.processValue(serializer, null, object, entryKey, value); + value = this.processValue(serializer, null, object, entryKey, value, features); } } { @@ -269,7 +269,7 @@ public void write(JSONSerializer serializer, Object object, Object fieldName, Ty List contextValueFilters = this.contextValueFilters; if ((valueFilters != null && valueFilters.size() > 0) // || (contextValueFilters != null && contextValueFilters.size() > 0)) { - value = this.processValue(serializer, null, object, entryKey, value); + value = this.processValue(serializer, null, object, entryKey, value, features); } } diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 44ea4fe90..14bca9a52 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -5,14 +5,14 @@ 4.0.0 act-ghissues - 1.8.27.0-SNAPSHOT + 1.8.29.0-SNAPSHOT ActFramework Github Issue Reproduce App org.actframework act-starter-parent - 1.8.27.0 + 1.8.28.0 @@ -25,7 +25,7 @@ org.actframework act - 1.8.28-SNAPSHOT + 1.8.29-SNAPSHOT org.actframework From 7c7ae9170798d9ec3c1969f1277c9ce386973b46 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 28 Sep 2019 09:09:09 +1000 Subject: [PATCH 513/730] fix #1207 and #1208 --- CHANGELOG.md | 2 + .../sampledata/RandomStringProvider.java | 1 + src/main/java/act/conf/AppConfig.java | 16 ++--- .../controller/HotReloadingHandler.java | 67 +++++++++++++++++++ .../impl/ReflectedHandlerInvoker.java | 1 - .../controller => view}/HotReloading.java | 22 ++---- src/main/java/act/xio/NetworkHandler.java | 9 +-- .../resources/act/act_messages.properties | 1 + .../resources/act/act_messages_zh.properties | 1 + .../act/act_messages_zh_HK.properties | 1 + .../act/act_messages_zh_TW.properties | 1 + src/main/resources/rythm/error/dev/e409.html | 14 ++++ .../src/main/java/ghissues/Gh1206.java | 21 ++++++ 13 files changed, 128 insertions(+), 29 deletions(-) create mode 100644 src/main/java/act/handler/builtin/controller/HotReloadingHandler.java rename src/main/java/act/{handler/builtin/controller => view}/HotReloading.java (50%) create mode 100644 src/main/resources/rythm/error/dev/e409.html create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1206.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7800c2b37..8d7721f26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.29** +* Allow it auto refresh when got 409 error during hot-reloading #1207 +* "The response has already been started" error #1208 * Update FastJSON to 1.2.61 #1205 **1.8.28** 21/Sep/2019 diff --git a/src/main/java/act/apidoc/sampledata/RandomStringProvider.java b/src/main/java/act/apidoc/sampledata/RandomStringProvider.java index 021a2908b..6857fefae 100644 --- a/src/main/java/act/apidoc/sampledata/RandomStringProvider.java +++ b/src/main/java/act/apidoc/sampledata/RandomStringProvider.java @@ -25,6 +25,7 @@ import org.osgl.util.S; public class RandomStringProvider extends SampleDataProvider { + @Override public String get() { return S.random(2 + N.randInt(20)); diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 91f93b6de..ddd13fd87 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -25,6 +25,7 @@ import act.Act; import act.Constants; +import act.act_messages; import act.app.*; import act.app.conf.AppConfigurator; import act.app.event.SysEventId; @@ -112,15 +113,14 @@ public Class convert(String s) { MvcConfig.messageTranslater(new $.Transformer() { @Override public String transform(String message) { - if (Act.appConfig().i18nEnabled()) { - String translated = I18n.i18n(message); - if (message == translated) { - translated = I18n.i18n(MvcConfig.class, message); - message = translated; - } - return message; + String translated = I18n.i18n(message); + if (message == translated) { + translated = I18n.i18n(MvcConfig.class, message); + } + if (message == translated) { + translated = I18n.i18n(act_messages.class, message); } - return message; + return translated; } }); } diff --git a/src/main/java/act/handler/builtin/controller/HotReloadingHandler.java b/src/main/java/act/handler/builtin/controller/HotReloadingHandler.java new file mode 100644 index 000000000..6181c3c9f --- /dev/null +++ b/src/main/java/act/handler/builtin/controller/HotReloadingHandler.java @@ -0,0 +1,67 @@ +package act.handler.builtin.controller; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2017 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.ActionContext; +import act.app.App; +import act.handler.ExpressHandler; +import act.view.HotReloading; +import org.osgl.mvc.result.Conflict; + +import java.util.concurrent.atomic.AtomicInteger; + +public class HotReloadingHandler extends FastRequestHandler implements ExpressHandler, App.HotReloadListener { + + private static final AtomicInteger HIT_COUNTER = new AtomicInteger(0); + + public static HotReloadingHandler INSTANCE = new HotReloadingHandler(); + + private static final HotReloading HOT_RELOADING = new HotReloading(); + + private HotReloadingHandler() { + Act.app().registerHotReloadListener(this); + } + + @Override + public void preHotReload() { + HIT_COUNTER.set(1); + } + + @Override + public void handle(ActionContext context) { + // session is not initialized at the moment + // we have to use other mechanism + //Integer delay = context.session().cached(DELAY); + int delay = HIT_COUNTER.get(); + if (delay < 5) { + delay++; + HIT_COUNTER.set(delay); + } + context.renderArg("delay", delay); + HOT_RELOADING.apply(context.req(), context.prepareRespForResultEvaluation()); + } + + @Override + public String toString() { + return "error: hot-reloading"; + } +} diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 373e642c3..24ad7521d 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -231,7 +231,6 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.async = null != ReflectedInvokerHelper.getAnnotation(Async.class, method); this.isStatic = handlerMetaInfo.isStatic(); if (!this.isStatic) { - //constructorAccess = ConstructorAccess.get(controllerClass); methodAccess = MethodAccess.get(controllerClass); handlerIndex = methodAccess.getIndex(handlerMetaInfo.name(), paramTypes); } else { diff --git a/src/main/java/act/handler/builtin/controller/HotReloading.java b/src/main/java/act/view/HotReloading.java similarity index 50% rename from src/main/java/act/handler/builtin/controller/HotReloading.java rename to src/main/java/act/view/HotReloading.java index f5cc5efb8..e2a5d95ed 100644 --- a/src/main/java/act/handler/builtin/controller/HotReloading.java +++ b/src/main/java/act/view/HotReloading.java @@ -1,10 +1,10 @@ -package act.handler.builtin.controller; +package act.view; /*- * #%L * ACT Framework * %% - * Copyright (C) 2014 - 2017 ActFramework + * Copyright (C) 2014 - 2019 ActFramework * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,24 +20,14 @@ * #L% */ -import act.app.ActionContext; -import act.handler.ExpressHandler; import org.osgl.mvc.result.Conflict; -import org.osgl.mvc.result.NotImplemented; -public class HotReloading extends FastRequestHandler implements ExpressHandler { +public class HotReloading extends Conflict { - public static HotReloading INSTANCE = new HotReloading(); + private static final String MESSAGE = "e409.hot_reloading"; - private static Conflict conflict = new Conflict("Hot reloading in progress ..."); - - @Override - public void handle(ActionContext context) { - conflict.apply(context.req(), context.prepareRespForResultEvaluation()); + public HotReloading() { + super(MESSAGE); } - @Override - public String toString() { - return "error: not implemented"; - } } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 39c4fd4d9..e617c5dae 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -29,7 +29,7 @@ import act.handler.RequestHandler; import act.handler.builtin.*; import act.handler.builtin.controller.FastRequestHandler; -import act.handler.builtin.controller.HotReloading; +import act.handler.builtin.controller.HotReloadingHandler; import act.handler.builtin.controller.RequestHandlerProxy; import act.handler.event.PostHandle; import act.handler.event.PreHandle; @@ -46,10 +46,8 @@ import org.osgl.util.E; import org.osgl.util.S; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; /** * A `NetworkHandler` can be registered to an {@link Network} and get invoked when @@ -113,7 +111,7 @@ public void handle(final ActionContext ctx, final NetworkDispatcher dispatcher) // an app hotreload, which might refer to ActionContext.current() ctx.saveLocal(); if (app.isLoading()) { - HotReloading.INSTANCE.handle(ctx); + HotReloadingHandler.INSTANCE.handle(ctx); return; } boolean updated = app.checkUpdates(false); @@ -241,6 +239,9 @@ private boolean isError(Result r) { private void handleException(Exception exception, final ActionContext ctx, String errorMessage) { logger.error(exception, errorMessage); + if (ctx.resp().isClosed()) { + return; + } Result r; try { r = RequestHandlerProxy.GLOBAL_EXCEPTION_INTERCEPTOR.apply(exception, ctx); diff --git a/src/main/resources/act/act_messages.properties b/src/main/resources/act/act_messages.properties index 1db0b6f50..3b10045e4 100644 --- a/src/main/resources/act/act_messages.properties +++ b/src/main/resources/act/act_messages.properties @@ -14,6 +14,7 @@ e404.method=method e404.path=path e404.handler=handler e404.desc=NotFound 404 thrown out from source code: +e409.hot_reloading=Hot reloading in progress ... cli.restart=About to restart app. Your CLI session will be terminated. Please reconnect in a few seconds ... cli.shutdown=About to shutdown app. Your CLI session will be terminated. diff --git a/src/main/resources/act/act_messages_zh.properties b/src/main/resources/act/act_messages_zh.properties index e9ed479b0..f09ff246d 100644 --- a/src/main/resources/act/act_messages_zh.properties +++ b/src/main/resources/act/act_messages_zh.properties @@ -15,6 +15,7 @@ e404.method=\u65B9\u6CD5 e404.path=\u8DEF\u5F84 e404.handler=\u5904\u7406\u5668 e404.desc=\u7A0B\u5E8F\u629B\u51FA404\u9519\u8BEF: +e409.hot_reloading=\u7CFB\u7EDF\u70ED\u52A0\u8F7D\u4E2D \u2026\u2026 {act.validation.constraints.Email.message}=\u65E0\u6548\u7684 Email {act.validation.constraints.NotBlank.message}=\u4E0D\u80FD\u4E3A\u7A7A\u5B57\u4E32 diff --git a/src/main/resources/act/act_messages_zh_HK.properties b/src/main/resources/act/act_messages_zh_HK.properties index 3c02525b4..67fb81638 100644 --- a/src/main/resources/act/act_messages_zh_HK.properties +++ b/src/main/resources/act/act_messages_zh_HK.properties @@ -15,6 +15,7 @@ e404.method=\u65B9\u6CD5 e404.path=\u8DEF\u5F91 e404.handler=\u8655\u7406\u5668 e404.desc=\u7A0B\u5E8F\u62CB\u51FA404\u932F\u8AA4: +e409.hot_reloading=\u7CFB\u7D71\u71B1\u52A0\u8F09\u4E2D \u2026\u2026 {act.validation.constraints.Email.message}=\u7121\u6548 Email {act.validation.constraints.NotBlank.message}=\u5B57\u7B26\u4E32\u4E0D\u80FD\u7232\u7A7A diff --git a/src/main/resources/act/act_messages_zh_TW.properties b/src/main/resources/act/act_messages_zh_TW.properties index 73bf53b4f..423789908 100644 --- a/src/main/resources/act/act_messages_zh_TW.properties +++ b/src/main/resources/act/act_messages_zh_TW.properties @@ -15,6 +15,7 @@ e404.method=\u65B9\u6CD5 e404.path=\u8DEF\u5F91 e404.handler=\u8655\u7406\u5668 e404.desc=\u7A0B\u5F0F\u62CB\u51FA404\u932F\u8AA4: +e409.hot_reloading=\u7CFB\u7D71\u71B1\u52A0\u8F09\u4E2D \u2026\u2026 {act.validation.constraints.Email.message}=\u7121\u6548 Email {act.validation.constraints.NotBlank.message}=\u5B57\u7B26\u4E32\u4E0D\u80FD\u7232\u7A7A diff --git a/src/main/resources/rythm/error/dev/e409.html b/src/main/resources/rythm/error/dev/e409.html new file mode 100644 index 000000000..480fdcf1f --- /dev/null +++ b/src/main/resources/rythm/error/dev/e409.html @@ -0,0 +1,14 @@ +@import act.view.HotReloading + +@extends(errorPage) + +@if(_error instanceof HotReloading) { + +@args int delay + +@section(moreStyles){ + +} + + +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1206.java b/testapps/GHIssues/src/main/java/ghissues/Gh1206.java new file mode 100644 index 000000000..b5905ae29 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1206.java @@ -0,0 +1,21 @@ +package ghissues; + +import act.app.event.SysEventId; +import act.event.EventBus; +import act.job.OnSysEvent; + +public class Gh1206 { + + /** + * See https://github.com/actframework/actframework/issues/1206 + * + * Gocha:DO NOT declare event listener using OnSysEvent + * annotation before SINGLETON_PROVISIONED which is raised + * after DEPENDENCY_INJECTOR_PROVISIONED event + */ + @OnSysEvent(SysEventId.SINGLETON_PROVISIONED) + public void on(EventBus eventBus) { + + assert eventBus != null; + } +} From 26dacc410177bf6e5a819d92ebd6b3291e1caea5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 29 Sep 2019 21:34:17 +1000 Subject: [PATCH 514/730] Provide a default HTML page for async controller response #1209 --- CHANGELOG.md | 1 + src/main/java/act/cli/CliContext.java | 4 +- .../impl/ReflectedHandlerInvoker.java | 14 +- .../java/act/inject/genie/GenieProviders.java | 2 +- src/main/java/act/job/Job.java | 6 +- src/main/java/act/job/JobManager.java | 6 +- src/main/java/act/test/TestWsProgress.java | 3 + src/main/java/act/util/ActContext.java | 2 +- src/main/java/act/util/ProgressGauge.java | 22 +- .../java/act/util/SimpleProgressGauge.java | 35 +++- src/main/resources/rythm/act/asyncJob.html | 193 ++++++++++++++++++ src/main/resources/rythm/act/base.html | 3 +- 12 files changed, 276 insertions(+), 15 deletions(-) create mode 100644 src/main/resources/rythm/act/asyncJob.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d7721f26..f1c6f5a56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.29** +* Provide a default HTML page for async controller response #1209 * Allow it auto refresh when got 409 error during hot-reloading #1207 * "The response has already been started" error #1208 * Update FastJSON to 1.2.61 #1205 diff --git a/src/main/java/act/cli/CliContext.java b/src/main/java/act/cli/CliContext.java index f8bf494dc..84b552642 100644 --- a/src/main/java/act/cli/CliContext.java +++ b/src/main/java/act/cli/CliContext.java @@ -384,7 +384,7 @@ public void printBar(ProgressGauge progressGauge) throws Exception { Thread.sleep(1000); flush(); } - if (progressGauge.hasError()) { + if (progressGauge.isFailed()) { pb.stop(); println(progressGauge.error()); } else { @@ -410,7 +410,7 @@ public void printText(ProgressGauge progressGauge) { break; } } - if (progressGauge.hasError()) { + if (progressGauge.isFailed()) { println(progressGauge.error()); } println(); diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 24ad7521d..4563dd5a4 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -43,6 +43,7 @@ import act.inject.DependencyInjector; import act.inject.SessionVariable; import act.inject.param.*; +import act.job.Job; import act.job.JobManager; import act.job.TrackableWorker; import act.plugin.ControllerPlugin; @@ -659,9 +660,14 @@ public Result handle(final ActionContext context) { protected void run(ProgressGauge progressGauge) { try { Object o = invoke(context, controller, params); + if (null == o) { + o = "done"; + } jobManager.cacheResult(jobId, o, method); } catch (Exception e) { warn(e, "Error executing async handler: " + method); + context.progress().fail(e.getMessage()); + jobManager.cacheResult(jobId, C.Map("failed", true), method); } } }); @@ -669,7 +675,13 @@ protected void run(ProgressGauge progressGauge) { WebSocketConnectionManager wscm = app.getInstance(WebSocketConnectionManager.class); wscm.subscribe(context.session(), SimpleProgressGauge.wsJobProgressTag(jobId)); jobManager.now(jobId); - return new RenderJSON(C.Map("jobId", jobId)); + if (context.req().accept() == H.Format.HTML) { + context.templatePath("/act/asyncJob.html"); + context.renderArg("jobId", jobId); + return RenderTemplate.get(); + } else { + return new RenderJSON(C.Map("jobId", jobId, "jobResultUrl", S.concat("/~/jobs/", jobId, "/result"))); + } } try { diff --git a/src/main/java/act/inject/genie/GenieProviders.java b/src/main/java/act/inject/genie/GenieProviders.java index 27e0f359c..a90e83b2a 100644 --- a/src/main/java/act/inject/genie/GenieProviders.java +++ b/src/main/java/act/inject/genie/GenieProviders.java @@ -195,7 +195,7 @@ private Object cast(String val, BeanSpec spec, boolean isImpl) { try { return $.newInstance(val, Act.app().classLoader()); } catch (Exception e) { - throw new InjectException("Cannot cast value type[%s] to required type[%s]", val.getClass(), spec); + throw new InjectException(e, "Cannot initialize %s", val, spec); } } } diff --git a/src/main/java/act/job/Job.java b/src/main/java/act/job/Job.java index 7885e39eb..261b4c189 100644 --- a/src/main/java/act/job/Job.java +++ b/src/main/java/act/job/Job.java @@ -142,7 +142,7 @@ public void run() { private Method method; private boolean sysJob; // progress percentage - private SimpleProgressGauge progress = new SimpleProgressGauge(); + private ProgressGauge progress = new SimpleProgressGauge(); private LockableJobList parallelJobs = new LockableJobList(this); private LockableJobList followingJobs = new LockableJobList(this); private LockableJobList precedenceJobs = new LockableJobList(this); @@ -227,7 +227,7 @@ public Object apply() throws NotAppliedException, $.Break { } public void setProgressGauge(ProgressGauge progressGauge) { - progress = SimpleProgressGauge.wrap(progressGauge); + progress = progressGauge; progress.setId(getId()); progress.addListener(new ProgressGauge.Listener() { @Override @@ -238,7 +238,7 @@ public void onUpdate(ProgressGauge progressGauge) { }); } - public SimpleProgressGauge progress() { + public ProgressGauge progress() { return progress; } diff --git a/src/main/java/act/job/JobManager.java b/src/main/java/act/job/JobManager.java index 5f3a5655f..0dda237d9 100644 --- a/src/main/java/act/job/JobManager.java +++ b/src/main/java/act/job/JobManager.java @@ -154,8 +154,8 @@ public String prepare($.Function worker) { return job.id(); } - public void prepare(String jobId, $.Function worker) { - wrap(jobId, worker); + public Job prepare(String jobId, $.Function worker) { + return wrap(jobId, worker); } /** @@ -367,7 +367,7 @@ public Job forMethod(Method method) { return methodIndex.get(method); } - public SimpleProgressGauge progressGauge(String jobId) { + public ProgressGauge progressGauge(String jobId) { return jobById(jobId).progress(); } diff --git a/src/main/java/act/test/TestWsProgress.java b/src/main/java/act/test/TestWsProgress.java index dc5c0e8b8..b54f212a1 100644 --- a/src/main/java/act/test/TestWsProgress.java +++ b/src/main/java/act/test/TestWsProgress.java @@ -20,7 +20,9 @@ * #L% */ +import act.Act; import act.job.JobManager; +import act.sys.Env; import act.util.ProgressGauge; import act.ws.WebSocketConnectionListener; import act.ws.WebSocketContext; @@ -33,6 +35,7 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; +@Env.RequireMode(Act.Mode.DEV) @WsEndpoint("/~/ws/test/progress") public class TestWsProgress implements WebSocketConnectionListener { diff --git a/src/main/java/act/util/ActContext.java b/src/main/java/act/util/ActContext.java index ee780b504..0fb78e579 100644 --- a/src/main/java/act/util/ActContext.java +++ b/src/main/java/act/util/ActContext.java @@ -277,7 +277,7 @@ abstract class Base extends DestroyableBase private Locale locale; private int fieldOutputVarCount; private boolean noTemplateCache; - private volatile SimpleProgressGauge progress; + private volatile ProgressGauge progress; protected String jobId; private Method handlerMethod; private Method currentMethod; diff --git a/src/main/java/act/util/ProgressGauge.java b/src/main/java/act/util/ProgressGauge.java index 89cfcf394..e175518ff 100644 --- a/src/main/java/act/util/ProgressGauge.java +++ b/src/main/java/act/util/ProgressGauge.java @@ -20,12 +20,14 @@ * #L% */ +import act.Destroyable; + import java.util.Map; /** * Class implement this interface can track progress */ -public interface ProgressGauge { +public interface ProgressGauge extends Destroyable { String PAYLOAD_MESSAGE = "message"; @@ -127,19 +129,35 @@ public interface ProgressGauge { */ void setPayload(String key, Object val); + /** + * Returns progress percentage. + * @return progress percentage + */ + int currentProgressPercent(); + /** * Returns the payload that has been set to this gauge. * @return the payload set to this gauge */ Map getPayload(); + /** + * Mark the progress has failed with an error message + * @param error the error message + */ + void fail(String error); + /** * Return error message if any * @return error message */ String error(); - boolean hasError(); + /** + * Return if the progress has error or not + * @return `true` if the progress is failed + */ + boolean isFailed(); /** * Add an listener to this gauge that monitors the progress update diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java index 2d6ff53c8..5d4c5d92c 100644 --- a/src/main/java/act/util/SimpleProgressGauge.java +++ b/src/main/java/act/util/SimpleProgressGauge.java @@ -143,11 +143,19 @@ public void updateMaxHint(int maxHint) { @Override public void incrMaxHint() { + if (null != delegate) { + delegate.incrMaxHint(); + return; + } this.maxHint++; } @Override public void incrMaxHintBy(int number) { + if (null != delegate) { + delegate.incrMaxHintBy(number); + return; + } this.maxHint += number; } @@ -241,20 +249,34 @@ public boolean isDone() { } public void fail(String error) { + if (null != delegate) { + delegate.fail(error); + return; + } this.error = error; triggerUpdateEvent(true); } public String error() { + if (null != delegate) { + return delegate.error(); + } return error; } - public boolean hasError() { + public boolean isFailed() { + if (null != delegate) { + return delegate.isFailed(); + } return S.notBlank(error); } @Override public void markAsDone() { + if (null != delegate) { + delegate.markAsDone(); + return; + } if (!markedAsDown) { markedAsDown = true; stepTo(maxHint); @@ -263,17 +285,28 @@ public void markAsDone() { @Override public void clearPayload() { + if (null != delegate) { + delegate.clearPayload(); + return; + } this.payload.clear(); } @Override public void setPayload(String key, Object val) { + if (null != delegate) { + delegate.setPayload(key, val); + return; + } this.payload.put(key, val); this.triggerUpdateEvent(true); } @Override public Map getPayload() { + if (null != delegate) { + return delegate.getPayload(); + } return this.payload; } diff --git a/src/main/resources/rythm/act/asyncJob.html b/src/main/resources/rythm/act/asyncJob.html new file mode 100644 index 000000000..380748e5c --- /dev/null +++ b/src/main/resources/rythm/act/asyncJob.html @@ -0,0 +1,193 @@ + + +@args String jobId + + + + + + + + + +
                                                                                                                                                                              +
                                                                                                                                                                              +
                                                                                                                                                                              loading ...
                                                                                                                                                                              +
                                                                                                                                                                              +
                                                                                                                                                                              +
                                                                                                                                                                              +
                                                                                                                                                                              +
                                                                                                                                                                              +
                                                                                                                                                                                +
                                                                                                                                                                              +
                                                                                                                                                                              +
                                                                                                                                                                              +

                                                                                                                                                                              Job Result

                                                                                                                                                                              +
                                                                                                                                                                              @(_app.name().capFirst())-@(_app.version().getVersion())
                                                                                                                                                                              +
                                                                                                                                                                              
                                                                                                                                                                              +
                                                                                                                                                                              + + + \ No newline at end of file diff --git a/src/main/resources/rythm/act/base.html b/src/main/resources/rythm/act/base.html index ab7e0f1b5..7c4795e5c 100644 --- a/src/main/resources/rythm/act/base.html +++ b/src/main/resources/rythm/act/base.html @@ -6,7 +6,9 @@ –––––––––––––––––––––––––––––––––––––––––––––––––– --> @title + @if(desc) { + } @@ -14,7 +16,6 @@ - 3.12.1 - 1.20.1 + 1.21.0-SNAPSHOT 1.7.1 1.11.0 - 1.10.0 - 1.10.0 + 1.11.0-SNAPSHOT + 1.11.0-SNAPSHOT 1.9.0 1.4.0 0.0.1 - 1.11.8 + 1.11.9 1.3.0 1.1.0.Final 1.4.27.Final - 1.23 + 1.25 3.3.3
                                                                                                                                                                              diff --git a/src/main/java/act/cli/CliSession.java b/src/main/java/act/cli/CliSession.java index 1c84b6cb1..f9a59dbe7 100644 --- a/src/main/java/act/cli/CliSession.java +++ b/src/main/java/act/cli/CliSession.java @@ -38,6 +38,7 @@ import org.osgl.logging.Logger; import org.osgl.util.IO; import org.osgl.util.S; +import org.yaml.snakeyaml.Yaml; import java.io.*; import java.net.Socket; diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index aeb3428dd..e178d62bc 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -30,7 +30,10 @@ import act.util.JsonUtilConfig.JsonWriter; import act.view.*; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import org.osgl.$; +import org.osgl.Lang; import org.osgl.http.H; import org.osgl.mvc.result.*; import org.osgl.storage.ISObject; @@ -1743,13 +1746,13 @@ public static Result inferResult(Result r, ActionContext actionContext) { public static Result inferPrimitiveResult( Object v, ActionContext actionContext, boolean requireJSON, - boolean requireXML, boolean isArray, boolean shouldUseToString) { + boolean requireXML, boolean requireYAML, boolean isArray, boolean shouldUseToString) { H.Status status = actionContext.successStatus(); if (requireJSON) { if (isArray) { if (byte[].class == v.getClass()) { // otherwise it get encoded with base64 - return RenderJSON.of(JSON.toJSON(v).toString()); + return RenderJSON.of(status, JSON.toJSON(v).toString()); } return RenderJSON.of(status, v); } @@ -1768,6 +1771,8 @@ public static Result inferPrimitiveResult( return RenderJSON.of(status, C.Map("result", v)); } else if (requireXML) { return RenderXML.of(status, S.concat("", S.string(v), "")); + } else if (requireYAML) { + return RenderYAML.of(status, v); } else if (v instanceof byte[]) { H.Format fmt = actionContext.accept(); if (H.Format.UNKNOWN == fmt) { @@ -1904,6 +1909,7 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon H.Format accept = context.accept(); boolean requireJSON = (accept == H.Format.JSON) || (accept == H.Format.UNKNOWN); boolean requireXML = !requireJSON && accept == H.Format.XML; + boolean requireYAML = (!requireJSON && !requireXML) && accept == H.Format.YAML; if (null == v) { // the following code breaks before handler without returning result @@ -1918,7 +1924,7 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } if (isSimpleType || shouldUseToString) { boolean isArray = vCls.isArray(); - return inferPrimitiveResult(v, context, requireJSON, requireXML, isArray, shouldUseToString); + return inferPrimitiveResult(v, context, requireJSON, requireXML, requireYAML, isArray, shouldUseToString); } else if (v instanceof InputStream) { return inferResult((InputStream) v, context); } else if (v instanceof File) { @@ -1941,13 +1947,22 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon boolean possibleLargeResponse = context.isLargeResponse(); JsonWriter jsonWriter = new JsonWriter(v, propertySpec, false, context); return possibleLargeResponse ? RenderJSON.of(status, jsonWriter) : RenderJSON.of(status, jsonWriter.asContentProducer()); - } else if (context.acceptXML()) { + } else if (requireXML) { return new FilteredRenderXML(status, v, propertySpec, context); } else if (context.accept() == H.Format.CSV) { return RenderCSV.of(status, v, propertySpec, context); + } else if (requireYAML) { + if (null != propertySpec) { + boolean isArray = vCls.isArray(); + boolean isIterable = isArray || v instanceof Iterable; + Lang._MappingStage stage = propertySpec.applyTo(Lang.map(v), context); + Object newRetVal = isIterable ? new JSONArray() : new JSONObject(); + v = stage.to(newRetVal); + } + return RenderYAML.of(status, v); } else { boolean isArray = vCls.isArray(); - return inferPrimitiveResult(v, context, false, requireXML, isArray, shouldUseToString); + return inferPrimitiveResult(v, context, false, requireXML, requireYAML, isArray, shouldUseToString); } } } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index e617c5dae..1af88ef19 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -319,7 +319,8 @@ static class ContentSuffixSensor implements $.Func2 { private static final char[] avi = {'a', 'v'}; - private static final char[] xml = {'x', 'm'}; + private static final char[] xml = {}; + private static final char[] yml = {}; private static final char[] json = {'j', 's', 'o'}; @@ -335,6 +336,7 @@ static class ContentSuffixSensor implements $.Func2 { private static final char[] mov = {'m'}; private static final char[] xlsx = {'x', 'l', 's'}; + private static final char[] yaml = {'y'}; @Override public String apply(H.Request req, String url) throws NotAppliedException, $.Break { @@ -433,8 +435,32 @@ static String process(String url, $.Var fmtBag) { fmt = H.Format.AVI; break; case 'l': - trait = xml; - fmt = H.Format.XML; + c = url.charAt(start - 1); + switch (c) { + case 'm': + c = url.charAt(start - 2); + initPos = 3; + switch (c) { + case 'x': + trait = xml; + fmt = H.Format.XML; + break; + case 'y': + trait = yml; + fmt = H.Format.YAML; + break; + case 'a': + sepPos = 4; + trait = yaml; + fmt = H.Format.YAML; + break; + default: + return url; + } + break; + default: + return url; + } break; case 'n': sepPos = 4; From 261297de0f22445e5f601413d1c52e111685e55a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 13 Oct 2019 08:54:38 +1100 Subject: [PATCH 520/730] Incorrect XML output for iterable type #1216 --- CHANGELOG.md | 1 + src/main/java/act/cli/view/CliView.java | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55842f86f..3e27076ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.29** +* Incorrect XML output for iterable type #1216 * Support output yaml response #1215 * Create built-in CLI session history mechanism #1214 * Allow app to configure CLI progress bar style #1212 diff --git a/src/main/java/act/cli/view/CliView.java b/src/main/java/act/cli/view/CliView.java index fdc49a530..306f460de 100644 --- a/src/main/java/act/cli/view/CliView.java +++ b/src/main/java/act/cli/view/CliView.java @@ -29,6 +29,7 @@ import act.data.DataPropertyRepository; import act.db.AdaptiveRecord; import act.util.*; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.osgl.$; import org.osgl.util.*; @@ -156,13 +157,14 @@ private void buildTree(Writer writer, TreeNode node, String prefix, boolean isTr XML() { @Override public void render(Writer writer, Object result, PropertySpec.MetaInfo spec, ActContext context) { - JSONObject json; + Class mappedResultType = (result instanceof Iterable) ? JSONArray.class : JSONObject.class; + Object mappedResult; if (null != spec) { - json = spec.applyTo($.map(result), context).to(JSONObject.class); + mappedResult = spec.applyTo($.map(result), context).to(mappedResultType); } else { - json = $.map(result).to(JSONObject.class); + mappedResult = $.map(result).to(mappedResultType); } - IO.write($.convert(json).to(Document.class)).to(writer); + IO.write($.convert(mappedResult).to(Document.class)).to(writer); } }, From b1c99c7c66d7240897b1516177b651b44fe38a8c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 13 Oct 2019 10:50:36 +1100 Subject: [PATCH 521/730] add CookieTest into testapps/GHIssues project --- .../act/xio/undertow/UndertowResponse.java | 5 +++ testapps/GHIssues/pom.xml | 2 +- .../main/java/ghissues/DeleteCookieTest.java | 34 +++++++++++++++++++ .../src/main/resources/asset/js.cookie.min.js | 2 ++ .../src/main/resources/rythm/cookie_home.html | 25 ++++++++++++++ 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java create mode 100644 testapps/GHIssues/src/main/resources/asset/js.cookie.min.js create mode 100644 testapps/GHIssues/src/main/resources/rythm/cookie_home.html diff --git a/src/main/java/act/xio/undertow/UndertowResponse.java b/src/main/java/act/xio/undertow/UndertowResponse.java index 9f2b95db8..636a0a47d 100644 --- a/src/main/java/act/xio/undertow/UndertowResponse.java +++ b/src/main/java/act/xio/undertow/UndertowResponse.java @@ -73,6 +73,11 @@ public void addCookie(H.Cookie cookie) { hse.setResponseCookie(CookieConverter.osgl2undertow(cookie)); } + @Override + public void removeCookie(String name) { + + } + @Override public boolean containsHeader(String name) { return hse.getResponseHeaders().contains(HEADER_NAMES.get(name)); diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 14bca9a52..282cce485 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.28.0 + 1.8.28.1 diff --git a/testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java b/testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java new file mode 100644 index 000000000..c98268b1e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java @@ -0,0 +1,34 @@ +package ghissues; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import org.osgl.http.H; +import org.osgl.mvc.annotation.DeleteAction; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; + +import static act.controller.Controller.Util.redirect; +import static act.controller.Controller.Util.renderTemplate; + +@UrlContext("cookies") +public class DeleteCookieTest extends BaseController { + + @GetAction + public void home() { + renderTemplate("/cookie_home.html"); + } + + @PostAction + public void add(String cookieName, String cookieValue, ActionContext context) { + H.Cookie cookie = new H.Cookie(cookieName, cookieValue).httpOnly(false); + context.resp().addCookie(cookie); + redirect("/cookies"); + } + + @DeleteAction + public void delete(String cookieName, ActionContext context) { + context.resp().removeCookie(cookieName); + redirect("/cookies"); + } + +} diff --git a/testapps/GHIssues/src/main/resources/asset/js.cookie.min.js b/testapps/GHIssues/src/main/resources/asset/js.cookie.min.js new file mode 100644 index 000000000..f8d6c2dad --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/js.cookie.min.js @@ -0,0 +1,2 @@ +/*! js-cookie v3.0.0-beta.0 | MIT */ +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self,function(){var t=e.Cookies,o=e.Cookies=n();o.noConflict=function(){return e.Cookies=t,o}}())}(this,function(){"use strict";function e(){for(var e={},n=0;n + + Cookie Test Page + + + + +

                                                                                                                                                                              Cookie Test Page

                                                                                                                                                                              +
                                                                                                                                                                              + + + +
                                                                                                                                                                              +
                                                                                                                                                                              + + +
                                                                                                                                                                              +
                                                                                                                                                                              Cookies
                                                                                                                                                                              +
                                                                                                                                                                              
                                                                                                                                                                              +
                                                                                                                                                                              +
                                                                                                                                                                              +
                                                                                                                                                                              \ No newline at end of file
                                                                                                                                                                              
                                                                                                                                                                              From 8f82e0f1f6968a67adbd024687cd88a1ba59f9a3 Mon Sep 17 00:00:00 2001
                                                                                                                                                                              From: Gelin Luo 
                                                                                                                                                                              Date: Sun, 13 Oct 2019 12:52:16 +1100
                                                                                                                                                                              Subject: [PATCH 522/730] CLI table view layout broken due to multi-bytes
                                                                                                                                                                               characters #1217
                                                                                                                                                                              
                                                                                                                                                                              ---
                                                                                                                                                                               CHANGELOG.md                                   |  1 +
                                                                                                                                                                               .../ascii_table/impl/SimpleASCIITableImpl.java | 18 +++++++++++++++---
                                                                                                                                                                               .../main/java/ghissues/DeleteCookieTest.java   |  9 ++++-----
                                                                                                                                                                               3 files changed, 20 insertions(+), 8 deletions(-)
                                                                                                                                                                              
                                                                                                                                                                              diff --git a/CHANGELOG.md b/CHANGELOG.md
                                                                                                                                                                              index 3e27076ae..ec5f53c99 100644
                                                                                                                                                                              --- a/CHANGELOG.md
                                                                                                                                                                              +++ b/CHANGELOG.md
                                                                                                                                                                              @@ -1,6 +1,7 @@
                                                                                                                                                                               # ActFramework Change Log
                                                                                                                                                                               
                                                                                                                                                                               **1.8.29**
                                                                                                                                                                              +* CLI table view layout broken due to multi-bytes characters #1217
                                                                                                                                                                               * Incorrect XML output for iterable type #1216
                                                                                                                                                                               * Support output yaml response #1215
                                                                                                                                                                               * Create built-in CLI session history mechanism #1214
                                                                                                                                                                              diff --git a/src/main/java/act/cli/ascii_table/impl/SimpleASCIITableImpl.java b/src/main/java/act/cli/ascii_table/impl/SimpleASCIITableImpl.java
                                                                                                                                                                              index 9ed2d9e92..c03134d83 100644
                                                                                                                                                                              --- a/src/main/java/act/cli/ascii_table/impl/SimpleASCIITableImpl.java
                                                                                                                                                                              +++ b/src/main/java/act/cli/ascii_table/impl/SimpleASCIITableImpl.java
                                                                                                                                                                              @@ -304,14 +304,16 @@ private String getRowDataBuf(int colCount, List colMaxLenList,
                                                                                                                                                                               	}
                                                                                                                                                                               	
                                                                                                                                                                               	private String getFormattedData(int maxLength, String data, int align) {
                                                                                                                                                                              +
                                                                                                                                                                              +		int width = widthOf(data);
                                                                                                                                                                               		
                                                                                                                                                                              -		if (data.length() > maxLength) {
                                                                                                                                                                              +		if (width > maxLength) {
                                                                                                                                                                               			return data;
                                                                                                                                                                               		}
                                                                                                                                                                               		
                                                                                                                                                                               		boolean toggle = true;
                                                                                                                                                                               		
                                                                                                                                                                              -		while (data.length() < maxLength) {
                                                                                                                                                                              +		while (widthOf(data) < maxLength) {
                                                                                                                                                                               			
                                                                                                                                                                               			if (align == ALIGN_LEFT) {
                                                                                                                                                                               				data = data + " ";
                                                                                                                                                                              @@ -369,7 +371,7 @@ private String getRowLineBuf(int colCount, List colMaxLenList, String[]
                                                                                                                                                                               	private int getMaxItemLength(List colData) {
                                                                                                                                                                               		int maxLength = 0;
                                                                                                                                                                               		for (int i = 0 ; i < colData.size() ; i ++) {
                                                                                                                                                                              -			maxLength = Math.max(colData.get(i).length(), maxLength);
                                                                                                                                                                              +			maxLength = Math.max(widthOf(colData.get(i)), maxLength);
                                                                                                                                                                               		}
                                                                                                                                                                               		return maxLength;
                                                                                                                                                                               	}
                                                                                                                                                                              @@ -423,4 +425,14 @@ private List getMaxColLengths(int colCount, String[] header, String[][]
                                                                                                                                                                               		return header;
                                                                                                                                                                               	}
                                                                                                                                                                               
                                                                                                                                                                              +	private int widthOf(String s) {
                                                                                                                                                                              +		// mult-bytes char occupies 2 column in CLI, so we need to count that in
                                                                                                                                                                              +		int width = 0, len = s.length();
                                                                                                                                                                              +		for (int i = 0; i < len; ++i) {
                                                                                                                                                                              +			char c = s.charAt(i);
                                                                                                                                                                              +			width += (c > 255) ? 2 : 1;
                                                                                                                                                                              +		}
                                                                                                                                                                              +		return width;
                                                                                                                                                                              +	}
                                                                                                                                                                              +
                                                                                                                                                                               }
                                                                                                                                                                              diff --git a/testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java b/testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java
                                                                                                                                                                              index c98268b1e..b53e02282 100644
                                                                                                                                                                              --- a/testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java
                                                                                                                                                                              +++ b/testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java
                                                                                                                                                                              @@ -1,6 +1,5 @@
                                                                                                                                                                               package ghissues;
                                                                                                                                                                               
                                                                                                                                                                              -import act.app.ActionContext;
                                                                                                                                                                               import act.controller.annotation.UrlContext;
                                                                                                                                                                               import org.osgl.http.H;
                                                                                                                                                                               import org.osgl.mvc.annotation.DeleteAction;
                                                                                                                                                                              @@ -19,15 +18,15 @@ public void home() {
                                                                                                                                                                                   }
                                                                                                                                                                               
                                                                                                                                                                                   @PostAction
                                                                                                                                                                              -    public void add(String cookieName, String cookieValue, ActionContext context) {
                                                                                                                                                                              +    public void add(String cookieName, String cookieValue, H.Response resp) {
                                                                                                                                                                                       H.Cookie cookie = new H.Cookie(cookieName, cookieValue).httpOnly(false);
                                                                                                                                                                              -        context.resp().addCookie(cookie);
                                                                                                                                                                              +        resp.addCookie(cookie);
                                                                                                                                                                                       redirect("/cookies");
                                                                                                                                                                                   }
                                                                                                                                                                               
                                                                                                                                                                                   @DeleteAction
                                                                                                                                                                              -    public void delete(String cookieName, ActionContext context) {
                                                                                                                                                                              -        context.resp().removeCookie(cookieName);
                                                                                                                                                                              +    public void delete(String cookieName, H.Response resp) {
                                                                                                                                                                              +        resp.removeCookie(cookieName);
                                                                                                                                                                                       redirect("/cookies");
                                                                                                                                                                                   }
                                                                                                                                                                               
                                                                                                                                                                              
                                                                                                                                                                              From 3880fe74502dd09838327d1decd181a62e73e164 Mon Sep 17 00:00:00 2001
                                                                                                                                                                              From: Gelin Luo 
                                                                                                                                                                              Date: Sun, 13 Oct 2019 17:22:24 +1100
                                                                                                                                                                              Subject: [PATCH 523/730] `UnexpectedException: type not recognized: ? extends
                                                                                                                                                                               T` - JsonDtoPatch logic issue #1218
                                                                                                                                                                              
                                                                                                                                                                              ---
                                                                                                                                                                               CHANGELOG.md                                       |  1 +
                                                                                                                                                                               src/main/java/act/i18n/I18n.java                   |  2 +-
                                                                                                                                                                               .../java/act/inject/param/JsonDtoClassManager.java |  3 ++-
                                                                                                                                                                               src/main/java/act/inject/param/JsonDtoPatch.java   | 14 +++++++++++---
                                                                                                                                                                               4 files changed, 15 insertions(+), 5 deletions(-)
                                                                                                                                                                              
                                                                                                                                                                              diff --git a/CHANGELOG.md b/CHANGELOG.md
                                                                                                                                                                              index ec5f53c99..d0fc0329a 100644
                                                                                                                                                                              --- a/CHANGELOG.md
                                                                                                                                                                              +++ b/CHANGELOG.md
                                                                                                                                                                              @@ -1,6 +1,7 @@
                                                                                                                                                                               # ActFramework Change Log
                                                                                                                                                                               
                                                                                                                                                                               **1.8.29**
                                                                                                                                                                              +* `UnexpectedException: type not recognized: ? extends T` - JsonDtoPatch logic issue #1218
                                                                                                                                                                               * CLI table view layout broken due to multi-bytes characters #1217
                                                                                                                                                                               * Incorrect XML output for iterable type #1216
                                                                                                                                                                               * Support output yaml response #1215
                                                                                                                                                                              diff --git a/src/main/java/act/i18n/I18n.java b/src/main/java/act/i18n/I18n.java
                                                                                                                                                                              index d6cea1a62..5c80301ee 100644
                                                                                                                                                                              --- a/src/main/java/act/i18n/I18n.java
                                                                                                                                                                              +++ b/src/main/java/act/i18n/I18n.java
                                                                                                                                                                              @@ -92,7 +92,7 @@ private static String _i18n(boolean ignoreError, Locale locale, String bundleNam
                                                                                                                                                                                       try {
                                                                                                                                                                                           bundle = ResourceBundle.getBundle(bundleName, $.requireNotNull(locale), Act.app().classLoader());
                                                                                                                                                                                       } catch (MissingResourceException e) {
                                                                                                                                                                              -            if (ignoreError) {
                                                                                                                                                                              +            if (!ignoreError) {
                                                                                                                                                                                               logger.warn("Cannot find bundle: %s", bundleName);
                                                                                                                                                                                           }
                                                                                                                                                                                           bundle = null;
                                                                                                                                                                              diff --git a/src/main/java/act/inject/param/JsonDtoClassManager.java b/src/main/java/act/inject/param/JsonDtoClassManager.java
                                                                                                                                                                              index f69c22099..ae241a4df 100644
                                                                                                                                                                              --- a/src/main/java/act/inject/param/JsonDtoClassManager.java
                                                                                                                                                                              +++ b/src/main/java/act/inject/param/JsonDtoClassManager.java
                                                                                                                                                                              @@ -115,7 +115,8 @@ public boolean test(Class aClass) {
                                                                                                                                                                                   public static final $.Predicate FIELD_FILTER = new $.Predicate() {
                                                                                                                                                                                       @Override
                                                                                                                                                                                       public boolean test(Field field) {
                                                                                                                                                                              -            if (Modifier.isStatic(field.getModifiers())) {
                                                                                                                                                                              +            int mod = field.getModifiers();
                                                                                                                                                                              +            if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
                                                                                                                                                                                               return false;
                                                                                                                                                                                           }
                                                                                                                                                                                           if (ReflectedInvokerHelper.isGlobalOrStateless(field)) {
                                                                                                                                                                              diff --git a/src/main/java/act/inject/param/JsonDtoPatch.java b/src/main/java/act/inject/param/JsonDtoPatch.java
                                                                                                                                                                              index 8ddba5aa5..f2f3e1796 100644
                                                                                                                                                                              --- a/src/main/java/act/inject/param/JsonDtoPatch.java
                                                                                                                                                                              +++ b/src/main/java/act/inject/param/JsonDtoPatch.java
                                                                                                                                                                              @@ -29,6 +29,7 @@
                                                                                                                                                                               import org.osgl.util.S;
                                                                                                                                                                               
                                                                                                                                                                               import java.lang.annotation.Annotation;
                                                                                                                                                                              +import java.lang.reflect.Field;
                                                                                                                                                                               import java.util.*;
                                                                                                                                                                               import javax.persistence.Transient;
                                                                                                                                                                               
                                                                                                                                                                              @@ -54,11 +55,18 @@ private JsonDtoPatch(String name, BeanSpec spec, Set circularReference
                                                                                                                                                                                                   continue;
                                                                                                                                                                                               }
                                                                                                                                                                                               circularReferenceDetector.add(fieldSpec);
                                                                                                                                                                              -                Class fieldType = fieldSpec.rawType();
                                                                                                                                                                              -                if (fieldSpec.isTransient() || fieldSpec.hasAnnotation(Transient.class)) {
                                                                                                                                                                              +                if (fieldSpec.isTransient()
                                                                                                                                                                              +                        || fieldSpec.hasAnnotation(Transient.class)
                                                                                                                                                                              +                        || fieldSpec.hasAnnotation(NoBind.class)
                                                                                                                                                                              +                ) {
                                                                                                                                                                                                   continue;
                                                                                                                                                                                               }
                                                                                                                                                                              -                if (App.class == fieldType || Class.class == fieldType || Object.class == fieldType || Collection.class.isAssignableFrom(fieldType) || Map.class.isAssignableFrom(fieldType)) {
                                                                                                                                                                              +                Class fieldType = fieldSpec.rawType();
                                                                                                                                                                              +                if (App.class == fieldType || Class.class == fieldType || Object.class == fieldType
                                                                                                                                                                              +                        || Field.class == fieldType || ResourceBundle.class == fieldType
                                                                                                                                                                              +                        || Collection.class.isAssignableFrom(fieldType)
                                                                                                                                                                              +                        || Map.class.isAssignableFrom(fieldType)
                                                                                                                                                                              +                ) {
                                                                                                                                                                                                   continue;
                                                                                                                                                                                               }
                                                                                                                                                                                               String fieldName = fieldSpec.name();
                                                                                                                                                                              
                                                                                                                                                                              From f8c42fdd44d0f817cb9cec4023823ac4f2d85665 Mon Sep 17 00:00:00 2001
                                                                                                                                                                              From: Gelin Luo 
                                                                                                                                                                              Date: Sun, 13 Oct 2019 19:34:49 +1100
                                                                                                                                                                              Subject: [PATCH 524/730] misc improvements in SimpleProgressGauge; built-in
                                                                                                                                                                               i18n message bundles; built-in async job page and erro pages
                                                                                                                                                                              
                                                                                                                                                                              ---
                                                                                                                                                                               src/main/java/act/util/SimpleProgressGauge.java      | 2 +-
                                                                                                                                                                               src/main/resources/act/act_messages.properties       | 1 +
                                                                                                                                                                               src/main/resources/act/act_messages_zh.properties    | 3 +++
                                                                                                                                                                               src/main/resources/act/act_messages_zh_HK.properties | 3 +++
                                                                                                                                                                               src/main/resources/act/act_messages_zh_TW.properties | 3 +++
                                                                                                                                                                               src/main/resources/rythm/act/asyncJob.html           | 4 ++++
                                                                                                                                                                               src/main/resources/rythm/error/dev/errorPage.html    | 2 ++
                                                                                                                                                                               7 files changed, 17 insertions(+), 1 deletion(-)
                                                                                                                                                                              
                                                                                                                                                                              diff --git a/src/main/java/act/util/SimpleProgressGauge.java b/src/main/java/act/util/SimpleProgressGauge.java
                                                                                                                                                                              index 92dec5073..385ef60eb 100644
                                                                                                                                                                              --- a/src/main/java/act/util/SimpleProgressGauge.java
                                                                                                                                                                              +++ b/src/main/java/act/util/SimpleProgressGauge.java
                                                                                                                                                                              @@ -345,7 +345,7 @@ public static String wsJobProgressTag(String jobId) {
                                                                                                                                                                                   }
                                                                                                                                                                               
                                                                                                                                                                                   private static int percentage(int currentSteps, int maxHint) {
                                                                                                                                                                              -        int n = currentSteps * 100 / maxHint;
                                                                                                                                                                              +        int n = maxHint > 10000 ? (currentSteps / (maxHint / 100)) :  (currentSteps * 100 / maxHint);
                                                                                                                                                                                       return (100 <= n) && (currentSteps < (maxHint - 1)) ? 99 : n;
                                                                                                                                                                                   }
                                                                                                                                                                               }
                                                                                                                                                                              diff --git a/src/main/resources/act/act_messages.properties b/src/main/resources/act/act_messages.properties
                                                                                                                                                                              index 3b10045e4..33345dc55 100644
                                                                                                                                                                              --- a/src/main/resources/act/act_messages.properties
                                                                                                                                                                              +++ b/src/main/resources/act/act_messages.properties
                                                                                                                                                                              @@ -10,6 +10,7 @@ e404.cannot_find_handler_in_req=Cannot find handler for the current request in t
                                                                                                                                                                               e404.route_table=route table
                                                                                                                                                                               e404.url_context.not_match=URL context not match
                                                                                                                                                                               e404.hide=hide
                                                                                                                                                                              +e404.open=open
                                                                                                                                                                               e404.method=method
                                                                                                                                                                               e404.path=path
                                                                                                                                                                               e404.handler=handler
                                                                                                                                                                              diff --git a/src/main/resources/act/act_messages_zh.properties b/src/main/resources/act/act_messages_zh.properties
                                                                                                                                                                              index f09ff246d..65e2cc8f5 100644
                                                                                                                                                                              --- a/src/main/resources/act/act_messages_zh.properties
                                                                                                                                                                              +++ b/src/main/resources/act/act_messages_zh.properties
                                                                                                                                                                              @@ -17,6 +17,9 @@ e404.handler=\u5904\u7406\u5668
                                                                                                                                                                               e404.desc=\u7A0B\u5E8F\u629B\u51FA404\u9519\u8BEF:
                                                                                                                                                                               e409.hot_reloading=\u7CFB\u7EDF\u70ED\u52A0\u8F7D\u4E2D \u2026\u2026
                                                                                                                                                                               
                                                                                                                                                                              +cli.restart=\u5E94\u7528\u5373\u5C06\u91CD\u542F. \u60A8\u7684 CLI \u4F1A\u8BDD\u5C06\u4F1A\u88AB\u5173\u95ED. \u8BF7\u5728\u6570\u79D2\u4E4B\u540E\u91CD\u65B0\u8FDE\u63A5...
                                                                                                                                                                              +cli.shutdown=\u5E94\u7528\u5373\u5C06\u5173\u95ED. \u60A8\u7684 CLI \u4F1A\u8BDD\u5C06\u4F1A\u88AB\u7EC8\u6B62.
                                                                                                                                                                              +
                                                                                                                                                                               {act.validation.constraints.Email.message}=\u65E0\u6548\u7684 Email
                                                                                                                                                                               {act.validation.constraints.NotBlank.message}=\u4E0D\u80FD\u4E3A\u7A7A\u5B57\u4E32
                                                                                                                                                                               
                                                                                                                                                                              diff --git a/src/main/resources/act/act_messages_zh_HK.properties b/src/main/resources/act/act_messages_zh_HK.properties
                                                                                                                                                                              index 67fb81638..88977b26f 100644
                                                                                                                                                                              --- a/src/main/resources/act/act_messages_zh_HK.properties
                                                                                                                                                                              +++ b/src/main/resources/act/act_messages_zh_HK.properties
                                                                                                                                                                              @@ -17,6 +17,9 @@ e404.handler=\u8655\u7406\u5668
                                                                                                                                                                               e404.desc=\u7A0B\u5E8F\u62CB\u51FA404\u932F\u8AA4:
                                                                                                                                                                               e409.hot_reloading=\u7CFB\u7D71\u71B1\u52A0\u8F09\u4E2D \u2026\u2026
                                                                                                                                                                               
                                                                                                                                                                              +cli.restart=\u7A0B\u5E8F\u5373\u5C07\u91CD\u65B0\u5553\u52D5. \u60A8\u7684CLI\u6703\u8A71\u5C07\u7D42\u6B62\u3002 \u8ACB\u5728\u5E7E\u79D2\u9418\u5F8C\u91CD\u65B0\u9023\u63A5...
                                                                                                                                                                              +cli.shutdown=\u5373\u5C07\u95DC\u9589\u61C9\u7528\u7A0B\u5E8F\u3002 \u60A8\u7684CLI\u6703\u8A71\u5C07\u7D42\u6B62\u3002
                                                                                                                                                                              +
                                                                                                                                                                               {act.validation.constraints.Email.message}=\u7121\u6548 Email
                                                                                                                                                                               {act.validation.constraints.NotBlank.message}=\u5B57\u7B26\u4E32\u4E0D\u80FD\u7232\u7A7A
                                                                                                                                                                               
                                                                                                                                                                              diff --git a/src/main/resources/act/act_messages_zh_TW.properties b/src/main/resources/act/act_messages_zh_TW.properties
                                                                                                                                                                              index 423789908..2d02ea4d6 100644
                                                                                                                                                                              --- a/src/main/resources/act/act_messages_zh_TW.properties
                                                                                                                                                                              +++ b/src/main/resources/act/act_messages_zh_TW.properties
                                                                                                                                                                              @@ -17,6 +17,9 @@ e404.handler=\u8655\u7406\u5668
                                                                                                                                                                               e404.desc=\u7A0B\u5F0F\u62CB\u51FA404\u932F\u8AA4:
                                                                                                                                                                               e409.hot_reloading=\u7CFB\u7D71\u71B1\u52A0\u8F09\u4E2D \u2026\u2026
                                                                                                                                                                               
                                                                                                                                                                              +cli.restart=\u7A0B\u5F0F\u5373\u5C07\u91CD\u65B0\u5553\u52D5. \u60A8\u7684CLI\u6703\u8A71\u5C07\u7D42\u6B62\u3002 \u8ACB\u5728\u5E7E\u79D2\u9418\u5F8C\u91CD\u65B0\u9023\u63A5...
                                                                                                                                                                              +cli.shutdown=\u5373\u5C07\u95DC\u9589\u61C9\u7528\u7A0B\u5F0F\u3002 \u60A8\u7684CLI\u6703\u8A71\u5C07\u7D42\u6B62\u3002
                                                                                                                                                                              +
                                                                                                                                                                               {act.validation.constraints.Email.message}=\u7121\u6548 Email
                                                                                                                                                                               {act.validation.constraints.NotBlank.message}=\u5B57\u7B26\u4E32\u4E0D\u80FD\u7232\u7A7A
                                                                                                                                                                               
                                                                                                                                                                              diff --git a/src/main/resources/rythm/act/asyncJob.html b/src/main/resources/rythm/act/asyncJob.html
                                                                                                                                                                              index 3ae04b888..0703f17db 100644
                                                                                                                                                                              --- a/src/main/resources/rythm/act/asyncJob.html
                                                                                                                                                                              +++ b/src/main/resources/rythm/act/asyncJob.html
                                                                                                                                                                              @@ -183,6 +183,10 @@ 

                                                                                                                                                                              Job Result

                                                                                                                                                                              } } monitorProgress() + try { + getResult() + } catch (e) { + } \ No newline at end of file diff --git a/src/main/resources/rythm/error/dev/errorPage.html b/src/main/resources/rythm/error/dev/errorPage.html index 654f4377c..586084420 100644 --- a/src/main/resources/rythm/error/dev/errorPage.html +++ b/src/main/resources/rythm/error/dev/errorPage.html @@ -17,9 +17,11 @@ @render(moreStyles) } +@if(_error.getLocalizedMessage()) {
                                                                                                                                                                                 @_error.getLocalizedMessage()
                                                                                                                                                                               
                                                                                                                                                                              +} @return } @{ From a7816aecb5b3a3933cd9b2097502ff3fcf0b34e3 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 13 Oct 2019 21:08:27 +1100 Subject: [PATCH 525/730] do not display aync job progress gauge unless "@ReportProgress" annotation presented; minor improvement on asyncJob.html template --- .../controller/ControllerProgressGauge.java | 1 - .../controller/impl/ReflectedHandlerInvoker.java | 7 +++++-- src/main/resources/rythm/act/asyncJob.html | 16 ++++++++++++---- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/act/handler/builtin/controller/ControllerProgressGauge.java b/src/main/java/act/handler/builtin/controller/ControllerProgressGauge.java index b811a1658..687ea31c8 100644 --- a/src/main/java/act/handler/builtin/controller/ControllerProgressGauge.java +++ b/src/main/java/act/handler/builtin/controller/ControllerProgressGauge.java @@ -54,6 +54,5 @@ public void stepTo(int steps) { public void commitFinalState() { triggerUpdateEvent(true); - Act.LOGGER.info("!!!!!!!!!!!!!!!!! final state committed"); } } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 2a279203a..8ad014127 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -27,6 +27,7 @@ import act.Trace; import act.annotations.*; import act.app.*; +import act.cli.ReportProgress; import act.conf.AppConfig; import act.controller.*; import act.controller.annotation.*; @@ -135,6 +136,7 @@ public void visit(H.Format format) throws $.Break { private MissingAuthenticationHandler csrfFailureHandler; private ThrottleFilter throttleFilter; private boolean async; + private boolean reportAsyncProgress; private boolean byPassImplicityTemplateVariable; private boolean forceDataBinding; private boolean isLargeResponse; @@ -231,6 +233,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.disabled = this.disabled || !Env.matches(method); this.forceDataBinding = ReflectedInvokerHelper.isAnnotationPresent(RequireDataBind.class, method); this.async = null != ReflectedInvokerHelper.getAnnotation(Async.class, method); + this.reportAsyncProgress = null != ReflectedInvokerHelper.getAnnotation(ReportProgress.class, method); this.isStatic = handlerMetaInfo.isStatic(); if (!this.isStatic) { methodAccess = MethodAccess.get(controllerClass); @@ -684,8 +687,8 @@ protected void run(ProgressGauge progressGauge) { WebSocketConnectionManager wscm = app.getInstance(WebSocketConnectionManager.class); wscm.subscribe(context.session(), SimpleProgressGauge.wsJobProgressTag(jobId)); jobManager.now(jobId); - boolean isHtml = context.req().accept() == H.Format.HTML; - if (isHtml) { + boolean renderAsyncJobPage = reportAsyncProgress && (context.req().accept() == H.Format.HTML); + if (renderAsyncJobPage) { context.templatePath("/act/asyncJob.html"); context.renderArg("jobId", jobId); return RenderTemplate.get(); diff --git a/src/main/resources/rythm/act/asyncJob.html b/src/main/resources/rythm/act/asyncJob.html index 0703f17db..8189f671f 100644 --- a/src/main/resources/rythm/act/asyncJob.html +++ b/src/main/resources/rythm/act/asyncJob.html @@ -123,14 +123,19 @@ #result-detail { margin-top: 30px; padding: 10px; - border: 1px solid #aaa; font-family: "Envy Code R", "Fira Code", "Source Code Pro Semibold", Monaco, Courier, monospace; font-weight: bold; font-size: 13px; + border: 1px solid #666; + background-color: #666; + color: #000; + display: inline-block; + min-width: 640px; } #result-detail.error { - border-color: #ff4848; - color: #ff4848; + border-color: #ee4444; + background: transparent; + color: #ee4444; } @@ -152,7 +157,10 @@

                                                                                                                                                                              Job Result

                                                                                                                                                                              + + + + + + + + + + + + + \ No newline at end of file From cfe3f4129d8201b01a00390739b8fea9d9bb442f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 19 Oct 2019 22:13:09 +1100 Subject: [PATCH 529/730] ApiDoc - missing description for classes extends from `SimpleRestfulServiceBase` #1224 --- CHANGELOG.md | 1 + pom.xml | 1 + src/main/java/act/apidoc/ApiManager.java | 54 +++++++++-- src/main/java/act/apidoc/Endpoint.java | 5 + src/main/resources/act/act.api-book | 112 +++++++++++++++++++++++ 5 files changed, 166 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/act/act.api-book diff --git a/CHANGELOG.md b/CHANGELOG.md index f9c17d9b9..76af8bb57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.29** +* ApiDoc - missing description for classes extends from `SimpleRestfulServiceBase` #1224 * Markdown response support #1219 * $$.processStringSubstitution` issue #1223 * `@LoadResource` mechanism not doing resource filtering even `resource.filtering` is set to `true` #1222 diff --git a/pom.xml b/pom.xml index 434e088ce..c63b70c75 100644 --- a/pom.xml +++ b/pom.xml @@ -96,6 +96,7 @@ true **/*.version + **/*.api-book **/*.properties **/*.css **/*.csv diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index 2fd305773..895668533 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -33,6 +33,7 @@ import act.handler.RequestHandlerBase; import act.handler.builtin.ResourceGetter; import act.handler.builtin.controller.RequestHandlerProxy; +import act.inject.util.ResourceLoader; import act.route.RouteSource; import act.route.Router; import com.alibaba.fastjson.JSON; @@ -55,6 +56,7 @@ import java.io.File; import java.lang.reflect.Modifier; +import java.net.URL; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -135,6 +137,7 @@ public void load(App app) { return; } } + loadActAppDocs(); Router router = app.router(); AppConfig config = app.config(); Set controllerClasses = new HashSet<>(); @@ -157,6 +160,13 @@ public void load(App app) { LOGGER.info("API book compiled"); } + private void loadActAppDocs() { + URL url = ApiManager.class.getResource("/act/act.api-book"); + if (null != url) { + deserialize(IO.read(url).toString(), true); + } + } + private void serialize() { File file = new File(FILENAME); IO.write(JSON.toJSONString(moduleLookup)).to(file); @@ -167,7 +177,12 @@ private void deserialize() { if (!file.exists() || !file.canRead()) { return; } - JSONObject jsonObject = JSON.parseObject(IO.readContentAsString(file)); + deserialize(IO.readContentAsString(file), false); + } + + private void deserialize(String content, boolean actDoc) { + SortedMap> moduleLookup = actDoc ? new TreeMap>() : this.moduleLookup; + JSONObject jsonObject = JSON.parseObject(content); $.map(jsonObject).instanceFactory(new Lang.Function() { @Override public Object apply(Class aClass) throws NotAppliedException, Lang.Break { @@ -175,11 +190,19 @@ public Object apply(Class aClass) throws NotAppliedException, Lang.Break { } }).targetGenericType(new TypeReference>>() { }).to(moduleLookup); - for (List list : moduleLookup.values()) { - endpoints.addAll(list); - } - for (Endpoint endpoint : endpoints) { - endpointLookup.put(endpoint.getId(), endpoint); + if (!actDoc) { + for (List list : moduleLookup.values()) { + endpoints.addAll(list); + } + for (Endpoint endpoint : endpoints) { + endpointLookup.put(endpoint.getId(), endpoint); + } + } else { + for (List list : moduleLookup.values()) { + for (Endpoint endpoint : list) { + endpointLookup.put(endpoint.getId(), endpoint); + } + } } } @@ -325,7 +348,7 @@ private void exploreDescriptions(Set controllerClasses) { if (null != javadoc) { String desc = javadoc.getDescription().toText(); if (S.notBlank(desc)) { - endpoint.setDescription(desc); + endpoint.description = endpoint.processTypeImplSubstitution(desc); } List blockTags = javadoc.getBlockTags(); String returnDesc = null; @@ -350,6 +373,23 @@ private void exploreDescriptions(Set controllerClasses) { if (null != returnDesc) { endpoint.returnDescription = endpoint.processTypeImplSubstitution(returnDesc); } + } else { + // try check if we have Act built-in super class + Endpoint parentEndpoint = endpointLookup.get(endpoint.getParentId()); + if (null != parentEndpoint) { + endpoint.description = endpoint.processTypeImplSubstitution(parentEndpoint.description); + endpoint.returnDescription = endpoint.processTypeImplSubstitution(parentEndpoint.returnDescription); + Map parentEndpointParamLookup = new HashMap<>(); + for (ParamInfo param : parentEndpoint.params) { + parentEndpointParamLookup.put(param.getName(), param); + } + for (ParamInfo param : endpoint.params) { + ParamInfo parentParam = parentEndpointParamLookup.get(param.getName()); + if (null != parentParam) { + param.description = endpoint.processTypeImplSubstitution(parentParam.description); + } + } + } } } } diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index d3c8c9a63..c85825dc5 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -89,6 +89,8 @@ public static class ParamInfo { public List options; public String fieldKey; + private ParamInfo() {} + private ParamInfo(String bindName, BeanSpec beanSpec, String description, String fieldKey) { this.bindName = bindName; this.beanSpec = beanSpec; @@ -381,6 +383,9 @@ public Class controllerClass() { } public String processTypeImplSubstitution(String s) { + if (null == s) { + return null; + } int n = s.indexOf("${"); if (n < 0) { return s; diff --git a/src/main/resources/act/act.api-book b/src/main/resources/act/act.api-book new file mode 100644 index 000000000..91f75775d --- /dev/null +++ b/src/main/resources/act/act.api-book @@ -0,0 +1,112 @@ +{ + "SimpleRestfulServiceBase": [ + { + "controllerClass": "act.app.util.SimpleRestfulServiceBase", + "description": "List all ${MODEL_TYPE} records.", + "handler": "act.app.util.SimpleRestfulServiceBase.list", + "httpMethod": "GET", + "id": "act.app.util.SimpleRestfulServiceBase.list", + "params": [ + ], + "returnDescription": "all ${MODEL_TYPE} records", + "scheme": "HTTP", + "xid": "GETact_app_util_SimpleRestfulServiceBase_list" + }, + { + "controllerClass": "act.app.util.SimpleRestfulServiceBase", + "description": "Create a ${MODEL_TYPE} record.", + "handler": "act.app.util.SimpleRestfulServiceBase.create", + "httpMethod": "POST", + "id": "act.app.util.SimpleRestfulServiceBase.create", + "params": [ + { + "bindName": "model (body)", + "description": "the data for the new ${MODEL_TYPE} record.", + "headerVariable": false, + "name": "model (body)", + "required": false, + "sessionVariable": false, + "tooltip": "Bind name: model (body)", + "type": "Bookmark" + } + ], + "returnDescription": "the id of the new ${MODEL_TYPE} record.", + "scheme": "HTTP", + "xid": "POSTact_app_util_SimpleRestfulServiceBase_create" + }, + { + "controllerClass": "act.app.util.SimpleRestfulServiceBase", + "description": "Delete a ${MODEL_TYPE} record by id.", + "handler": "act.app.util.SimpleRestfulServiceBase.delete", + "httpMethod": "DELETE", + "id": "act.app.util.SimpleRestfulServiceBase.delete", + "params": [ + { + "bindName": "id", + "description": "the URL path variable specifies the id of the record to be deleted.", + "headerVariable": false, + "name": "id", + "required": false, + "sessionVariable": false, + "tooltip": "Bind name: id", + "type": "number" + } + ], + "scheme": "HTTP", + "xid": "DELETEact_app_util_SimpleRestfulServiceBase_delete" + }, + { + "controllerClass": "act.app.util.SimpleRestfulServiceBase", + "description": "Returns a ${MODEL_TYPE} record by id.", + "handler": "act.app.util.SimpleRestfulServiceBase.get", + "httpMethod": "GET", + "id": "act.app.util.SimpleRestfulServiceBase.get", + "params": [ + { + "bindName": "model", + "description": "a URL path variable specify the id of the record to be returned", + "headerVariable": false, + "name": "model", + "required": false, + "sessionVariable": false, + "tooltip": "Bind name: model", + "type": "String" + } + ], + "returnDescription": "a ${MODEL_TYPE} record specified by URL path variable `model`", + "scheme": "HTTP", + "xid": "GETact_app_util_SimpleRestfulServiceBase_get" + }, + { + "controllerClass": "act.app.util.SimpleRestfulServiceBase", + "description": "Update a ${MODEL_TYPE} record by id.", + "handler": "act.app.util.SimpleRestfulServiceBase.update", + "httpMethod": "PUT", + "id": "act.app.util.SimpleRestfulServiceBase.update", + "params": [ + { + "bindName": "model", + "description": "the URL path variable specifies the id of the record to be updated.", + "headerVariable": false, + "name": "model", + "required": false, + "sessionVariable": false, + "tooltip": "Bind name: model", + "type": "String" + }, + { + "bindName": "data", + "description": "the update data that will be applied to the ${MODEL_TYPE} record", + "headerVariable": false, + "name": "data", + "required": false, + "sessionVariable": false, + "tooltip": "Bind name: data", + "type": "Bookmark" + } + ], + "scheme": "HTTP", + "xid": "PUTact_app_util_SimpleRestfulServiceBase_update" + } + ] +} \ No newline at end of file From 7b70582daa155f4fe651cbc15545658817511f10 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 20 Oct 2019 20:53:29 +1100 Subject: [PATCH 530/730] fix #1226 and #1225 --- CHANGELOG.md | 2 + .../app/util/SimpleRestfulServiceBase.java | 158 ++++++++++++++++-- src/main/java/act/db/Dao.java | 11 ++ .../java/act/inject/util/ResourceLoader.java | 26 ++- src/main/resources/act/act.api-book | 31 +++- .../resources/asset/~act/js/jquery.ext.js | 4 +- src/main/resources/rythm/act/base.html | 1 + 7 files changed, 209 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76af8bb57..426610817 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.29** +* SimpleRestfulServiceBase - support filtering/pagingation/sorting #1226 +* ResourceLoader - Error loading Yaml data into List of entities #1225 * ApiDoc - missing description for classes extends from `SimpleRestfulServiceBase` #1224 * Markdown response support #1219 * $$.processStringSubstitution` issue #1223 diff --git a/src/main/java/act/app/util/SimpleRestfulServiceBase.java b/src/main/java/act/app/util/SimpleRestfulServiceBase.java index 6b54b8d05..afe768f25 100644 --- a/src/main/java/act/app/util/SimpleRestfulServiceBase.java +++ b/src/main/java/act/app/util/SimpleRestfulServiceBase.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -21,17 +21,28 @@ */ import act.Act; +import act.app.ActionContext; +import act.data.JodaDateTimeCodec; +import act.data.JodaLocalDateCodec; +import act.data.JodaLocalDateTimeCodec; +import act.data.JodaLocalTimeCodec; import act.db.*; import act.inject.param.NoBind; import act.util.PropertySpec; import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.mvc.annotation.*; +import org.osgl.mvc.util.ParamValueProvider; +import org.osgl.util.E; import org.osgl.util.Generics; +import org.osgl.util.N; +import org.osgl.util.S; import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; /** * A class template for simple RESTful service @@ -54,20 +65,61 @@ public SimpleRestfulServiceBase(DAO_TYPE dao) { } /** - * List all ${MODEL_TYPE} records. + * List ${MODEL_TYPE} records, filtered by simple query specifications optionally. * - * @return all ${MODEL_TYPE} records + * ### Filtering + * + * To list all model entities simply issue a `GET` request without any query parameters. + * + * To filter model by properties, e.g. name: issue `GET path?name=Tom`; + * + * To filter model by both name and age, use `GET path?name=Tom&age=5`; + * + * Filter with like, less than, great than etc: + * + * * `GET path?name=~Tom` - use `~` to lead the string for `LIKE` matching + * * `GET age=lt_5` - prefix with `lt_` for 'LESS THAN' matching + * * `GET age=lte_5` - prefix with `lte_` for `LESS THAN OR EQUAL TO` matching + * * `GET age=gt_5` - prefix with `gt_` for 'GREATER THAN' matching + * * `GET age=gte_5` - prefix with `gte_` for `GREATER THAN OR EQUAL TO` matching + * + * ### Pagination + * + * Use `_page` and `_pageSize` to specify the offset and limit of return scope. + * + * * `GET path?_page=1&_pageSize=20` - return records starts from 20th, the maximum number returned is 20. + * + * ### Sorting + * + * Use `_orderBy` to specify sorting orders. + * + * * `GET path?_orderBy=-score~name` - The returned list must be sorted by + * `score` (descending) and then `name` + * + * @param _page the page number - starts from `0`. + * @param _pageSize the number of items in a page - if not specified then all records filtered returned. + * @param _orderBy the sorting list, separated by `~`; if starts with `-` then sort in descending order. + * @return ${MODEL_TYPE} records as specified above. */ @GetAction - public Iterable list() { - return dao.findAll(); + public Iterable list(int _page, int _pageSize, String _orderBy) { + E.illegalArgumentIf(_page < 0, "page number is less than zero"); + E.illegalArgumentIf(_pageSize < 0, "page size is less than zero"); + Dao.Query q = filter(dao, ActionContext.current()); + if (_pageSize > 0) { + q.offset(_page * _pageSize).limit(_pageSize); + } + if (null != _orderBy) { + S.List list = S.fastSplit(_orderBy, "~"); + q.orderBy(list.toArray(new String[list.size()])); + } + return q.fetch(); } /** * Returns a ${MODEL_TYPE} record by id. * - * @param model - * a URL path variable specify the id of the record to be returned + * @param model a URL path variable specify the id of the record to be returned * @return a ${MODEL_TYPE} record specified by URL path variable `model` */ @GetAction("{model}") @@ -78,10 +130,8 @@ public MODEL_TYPE get(@DbBind MODEL_TYPE model) { /** * Create a ${MODEL_TYPE} record. * - * @param model - * the data for the new ${MODEL_TYPE} record. - * @return - * the id of the new ${MODEL_TYPE} record. + * @param model the data for the new ${MODEL_TYPE} record. + * @return the id of the new ${MODEL_TYPE} record. */ @PostAction @PropertySpec("id") @@ -92,10 +142,8 @@ public MODEL_TYPE create(MODEL_TYPE model) { /** * Update a ${MODEL_TYPE} record by id. * - * @param model - * the URL path variable specifies the id of the record to be updated. - * @param data - * the update data that will be applied to the ${MODEL_TYPE} record + * @param model the URL path variable specifies the id of the record to be updated. + * @param data the update data that will be applied to the ${MODEL_TYPE} record */ @PutAction("{model}") public void update(@DbBind MODEL_TYPE model, MODEL_TYPE data) { @@ -105,8 +153,8 @@ public void update(@DbBind MODEL_TYPE model, MODEL_TYPE data) { /** * Delete a ${MODEL_TYPE} record by id. - * @param id - * the URL path variable specifies the id of the record to be deleted. + * + * @param id the URL path variable specifies the id of the record to be deleted. */ @DeleteAction("{id}") public void delete(ID_TYPE id) { @@ -126,4 +174,78 @@ private void exploreTypes() { dao = $.cast(loader.load(spec)); } + public static Dao.Query filter(Dao dao, ParamValueProvider paramValueProvider) { + Set filterKeys = paramValueProvider.paramKeys(); + if (filterKeys.isEmpty()) { + return dao.q(); + } + JodaDateTimeCodec dateTimeCodec = Act.getInstance(JodaDateTimeCodec.class); + JodaLocalDateCodec localDateCodec = Act.getInstance(JodaLocalDateCodec.class); + JodaLocalTimeCodec localTimeCodec = Act.getInstance(JodaLocalTimeCodec.class); + JodaLocalDateTimeCodec localDateTimeCodec = Act.getInstance(JodaLocalDateTimeCodec.class); + StringBuilder filters = S.builder(); + List targets = new ArrayList(); + for (String key : filterKeys) { + if (key.startsWith("_")) { + continue; + } + String[] vals = paramValueProvider.paramVals(key); + int n = vals.length; + for (int i = 0; i < n; ++i) { + String val = vals[i]; + String op = null; + Object tgt = val; + if (val.startsWith("~")) { + op = "like"; + tgt = dao.processLikeValue(val.substring(1)); + } else if (val.contains("_")) { + String prefix = S.cut(val).beforeFirst("_"); + N.Comparator comp = N.Comparator.of(prefix); + if (null != comp) { + op = comp.name(); + if (comp == N.Comparator.EQ) { + op = null; + } + val = S.cut(val).afterFirst("_"); + } + if (N.isInt(val)) { + tgt = Integer.parseInt(val); + } else if (N.isNumeric(val)) { + tgt = Double.parseDouble(val); + } else { + // try date time + try { + tgt = dateTimeCodec.parse(val); + } catch (Exception e) { + try { + tgt = localDateCodec.parse(val); + } catch (Exception e1) { + try { + tgt = localTimeCodec.parse(val); + } catch (Exception e2) { + try { + tgt = localDateTimeCodec.parse(val); + } catch (Exception e3) { + // ignore + } + } + } + } + } + } + filters.append(key); + if (null != op) { + filters.append(" ").append(op); + } + filters.append(","); + targets.add(tgt); + } + } + if (filters.length() > 0) { + filters.deleteCharAt(filters.length() - 1); // remove last comma + return dao.q(filters.toString(), targets.toArray(new Object[targets.size()])); + } + return dao.q(); + } + } diff --git a/src/main/java/act/db/Dao.java b/src/main/java/act/db/Dao.java index 4add4a418..ab979fb5f 100644 --- a/src/main/java/act/db/Dao.java +++ b/src/main/java/act/db/Dao.java @@ -258,6 +258,17 @@ public interface Dao> { QUERY_TYPE offset(int pos); QUERY_TYPE limit(int limit); diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index 92a90b826..c68a317a5 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -354,7 +354,29 @@ private static Object _load(URL url, BeanSpec spec, Object hint) { boolean isYaml = (resourcePath.endsWith(".yml") || resourcePath.endsWith(".yaml")); if (isYaml) { Object o = new Yaml().load(readStage.toString()); - return $.map(o).targetGenericType(spec.type()).to(rawType); + if (List.class.isAssignableFrom(rawType)) { + List typeParams = spec.typeParams(); + Class listElementType = (Class) typeParams.get(0); + if (o instanceof Map) { + Map src = (Map)o; + List sink = new ArrayList(src.size()); + for (Object val : src.values()) { + sink.add($.map(val).to(listElementType)); + } + return sink; + } else if (o instanceof List) { + List src = (List) o; + List sink = new ArrayList(src.size()); + for (Object val : src) { + sink.add($.map(val).to(listElementType)); + } + return sink; + } else { + return $.map(o).targetGenericType(spec.type()).to(rawType); + } + } else { + return $.map(o).targetGenericType(spec.type()).to(rawType); + } } boolean isXml = resourcePath.endsWith(".xml"); if (isXml) { @@ -371,7 +393,7 @@ private static Object _load(URL url, BeanSpec spec, Object hint) { return readStage.toString(); } else if (List.class.equals(rawType)) { List typeParams = spec.typeParams(); - List lines = readStage.toLines(); + List lines = C.newList(readStage.toLines()); if (!typeParams.isEmpty()) { if (String.class == typeParams.get(0)) { return lines; diff --git a/src/main/resources/act/act.api-book b/src/main/resources/act/act.api-book index 91f75775d..febbe782a 100644 --- a/src/main/resources/act/act.api-book +++ b/src/main/resources/act/act.api-book @@ -2,13 +2,40 @@ "SimpleRestfulServiceBase": [ { "controllerClass": "act.app.util.SimpleRestfulServiceBase", - "description": "List all ${MODEL_TYPE} records.", + "description": "List ${MODEL_TYPE} records, filtered by simple query specifications optionally.\n\n### Filtering\n\nTo list all model entities simply issue a `GET` request without any query parameters.\n\nTo filter model by properties, e.g. name: issue `GET path?name=Tom`;\n\nTo filter model by both name and age, use `GET path?name=Tom&age=5`;\n\nFilter with like, less than, great than etc:\n\n * `GET path?name=~Tom` - use `~` to lead the string for `LIKE` matching\n * `GET age=lt_5` - prefix with `lt_` for 'LESS THAN' matching\n * `GET age=lte_5` - prefix with `lte_` for `LESS THAN OR EQUAL TO` matching\n * `GET age=gt_5` - prefix with `gt_` for 'GREATER THAN' matching\n * `GET age=gte_5` - prefix with `gte_` for `GREATER THAN OR EQUAL TO` matching\n\n### Pagination\n\nUse `_page` and `_pageSize` to specify the offset and limit of return scope.\n\n* `GET path?_page=1&_pageSize=20` - return records starts from 20th, the maximum number returned is 20.\n\n### Sorting\n\nUse `_orderBy` to specify sorting orders.\n\n* `GET path?_orderBy=-score~name` - The returned list must be sorted by\n `score` (descending) and then `name`\n", "handler": "act.app.util.SimpleRestfulServiceBase.list", "httpMethod": "GET", "id": "act.app.util.SimpleRestfulServiceBase.list", "params": [ + { + "bindName": "_page", + "description": "the page number - starts from `0`.", + "headerVariable": false, + "name": "_page", + "required": false, + "sessionVariable": false, + "type": "int" + }, + { + "bindName": "_pageSize", + "description": "the number of items in a page - if not specified then all records filtered returned.", + "headerVariable": false, + "name": "_pageSize", + "required": false, + "sessionVariable": false, + "type": "int" + }, + { + "bindName": "_orderBy", + "description": "the sorting list, separated by `~`; if starts with `-` then sort in descending order.", + "headerVariable": false, + "name": "_page", + "required": false, + "sessionVariable": false, + "type": "int" + }, ], - "returnDescription": "all ${MODEL_TYPE} records", + "returnDescription": "${MODEL_TYPE} records as specified above.", "scheme": "HTTP", "xid": "GETact_app_util_SimpleRestfulServiceBase_list" }, diff --git a/src/main/resources/asset/~act/js/jquery.ext.js b/src/main/resources/asset/~act/js/jquery.ext.js index 7cc358484..82b8f3e52 100644 --- a/src/main/resources/asset/~act/js/jquery.ext.js +++ b/src/main/resources/asset/~act/js/jquery.ext.js @@ -131,9 +131,9 @@ jQuery.each(["getJSON", "postJSON", "putJSON", "deleteJSON", "patchJSON"], funct if (method.startsWith("get")) { var hasParam = url.contains("?"); if (!hasParam) { - url = url +"?now="+ new Date().getTime(); + url = url +"?_now="+ new Date().getTime(); } else { - url = url +"&now="+ new Date().getTime(); + url = url +"&_now="+ new Date().getTime(); } } var setup = { diff --git a/src/main/resources/rythm/act/base.html b/src/main/resources/rythm/act/base.html index 7c4795e5c..6ce911d35 100644 --- a/src/main/resources/rythm/act/base.html +++ b/src/main/resources/rythm/act/base.html @@ -39,6 +39,7 @@ @render() + @render(moreScripts) From 59b981231d2d1ee97bbec4487b51fa6ce2107957 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 20 Oct 2019 21:42:01 +1100 Subject: [PATCH 531/730] Allow using query parameter `_accept` to overwrite the `Accept` HTTP header #1227 --- CHANGELOG.md | 1 + src/main/java/act/RequestImplBase.java | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 426610817..83825c9c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.29** +* Allow using query parameter `_accept` to overwrite the `Accept` HTTP header #1227 * SimpleRestfulServiceBase - support filtering/pagingation/sorting #1226 * ResourceLoader - Error loading Yaml data into List of entities #1225 * ApiDoc - missing description for classes extends from `SimpleRestfulServiceBase` #1224 diff --git a/src/main/java/act/RequestImplBase.java b/src/main/java/act/RequestImplBase.java index 0b42f68eb..e7989d11e 100644 --- a/src/main/java/act/RequestImplBase.java +++ b/src/main/java/act/RequestImplBase.java @@ -32,6 +32,7 @@ public abstract class RequestImplBase extends H.Request private AppConfig cfg; private H.Method method; private Boolean secure; + private H.Format accept; protected RequestImplBase(AppConfig config) { E.NPE(config); @@ -78,6 +79,30 @@ public H.Method method() { return method; } + @Override + public H.Format accept() { + if (null == this.accept) { + String s = paramVal("_accept"); + if (null != s) { + try { + this.accept = H.Format.of(s); + if (null == this.accept) { + this.accept = H.Format.resolve(s); + if (this.accept == H.Format.UNKNOWN) { + this.accept = null; + } + } + } catch (Exception e) { + // ignore + } + } + } + if (null == this.accept) { + this.accept = super.accept(); + } + return this.accept; + } + @Override public boolean secure() { if (null == secure) { From 9af189b2eacfb4c942026298eedac572d43ab00a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 21 Oct 2019 14:03:14 +1100 Subject: [PATCH 532/730] CORS - update default allowed headers #1228 --- CHANGELOG.md | 1 + src/main/java/act/conf/AppConfig.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83825c9c0..fd43a7915 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.29** +* CORS - update default allowed headers #1228 * Allow using query parameter `_accept` to overwrite the `Accept` HTTP header #1227 * SimpleRestfulServiceBase - support filtering/pagingation/sorting #1226 * ResourceLoader - Error loading Yaml data into List of entities #1225 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 9e1121d5f..c84a49f94 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -471,7 +471,9 @@ protected T corsHeaders(String s) { private String corsHeaders() { if (null == corsHeaders) { - corsHeaders = get(CORS_HEADERS, "Content-Type, X-HTTP-Method-Override, X-Requested-With"); + corsHeaders = get(CORS_HEADERS, + "Content-Type, X-HTTP-Method-Override, X-Requested-With, Location, " + + "Authorization, X-XSRF-Token, X-CSRF-Token, Act-Session-Expires, Content-Length"); } return corsHeaders; } From a04bd1a8f216008be453d2aa3faac765e93a81cc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 21 Oct 2019 22:17:49 +1100 Subject: [PATCH 533/730] Ehcache not working in Act since 1.8.27 #1220 --- CHANGELOG.md | 1 + pom.xml | 2 +- src/main/java/act/conf/AppConfig.java | 11 ++++++++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd43a7915..e9c984d76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.29** +* Ehcache not working in Act since 1.8.27 #1220 * CORS - update default allowed headers #1228 * Allow using query parameter `_accept` to overwrite the `Accept` HTTP header #1227 * SimpleRestfulServiceBase - support filtering/pagingation/sorting #1226 diff --git a/pom.xml b/pom.xml index c63b70c75..09b3ec745 100644 --- a/pom.xml +++ b/pom.xml @@ -67,7 +67,7 @@ 3.12.1 1.21.0-SNAPSHOT - 1.7.1 + 1.8.0-SNAPSHOT 1.11.0 1.11.0-SNAPSHOT 1.11.0-SNAPSHOT diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index c84a49f94..b0bae498c 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -3367,15 +3367,20 @@ public CacheService cacheService(String name) { cacheServiceProvider = CacheServiceProvider.Impl.valueOfIgnoreCase(obj.toString()); if (null != cacheServiceProvider) { set(AppConfigKey.CACHE_IMPL, cacheServiceProvider); - return cacheServiceProvider.get(name); + } else { + throw e; } - throw e; } if (null == cacheServiceProvider) { cacheServiceProvider = CacheServiceProvider.Impl.Auto; } } - return cacheServiceProvider.get(name); + CacheService cacheService = cacheServiceProvider.get(name); + E.illegalStateIf(cacheService.state().isShutdown(), "Cache service[%s] already shutdown.", name); + if (!cacheService.state().isStarted()) { + cacheService.startup(); + } + return cacheService; } public void resetCacheServices(CacheService sample) { From 18ab7a311a3484e7f011b085c1cd16ad5ed34ca1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 25 Oct 2019 23:05:39 +1100 Subject: [PATCH 534/730] Add commonly used cron expression constants #1229; #1228 - updates; #1220 - updates; DbService - add meta info accessor methods --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 3 ++ src/main/java/act/app/App.java | 13 ++----- src/main/java/act/conf/AppConfig.java | 34 ++++++++-------- src/main/java/act/conf/ConfAdmin.java | 9 ----- src/main/java/act/conf/CsrfConfAdmin.java | 47 +++++++++++++++++++++++ src/main/java/act/db/DbService.java | 42 ++++++++++++++++++++ src/main/java/act/job/Cron.java | 10 +++++ src/main/resources/aaa.authenticate.list | 1 + 9 files changed, 126 insertions(+), 34 deletions(-) create mode 100644 src/main/java/act/conf/CsrfConfAdmin.java diff --git a/CHANGELOG.md b/CHANGELOG.md index e9c984d76..2a2e332c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.29** +* Add commonly used cron expression constants #1229 * Ehcache not working in Act since 1.8.27 #1220 * CORS - update default allowed headers #1228 * Allow using query parameter `_accept` to overwrite the `Accept` HTTP header #1227 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 1ae518917..07c5939cd 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -317,6 +317,9 @@ public String attachmentName() { s = S.cut(s).afterLast("."); } } + if (S.blank(s)) { + s = S.cut(actionPath).afterLast("."); + } attachmentName = s; } return attachmentName + "." + accept().name(); diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 002dcf118..96cb7016c 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -1593,18 +1593,11 @@ private void initSessionManager() { } private void initCache() { - cache = cache(config().cacheName()); - cache.startup(); - if (Act.isDev()) { - config.resetCacheServices(cache); + if (isDev()) { + config().cacheServiceProvider().reset(); } + cache = cache(config().cacheName()); CacheService sessionCache = cache(config().cacheNameSession()); - if (cache != sessionCache) { - sessionCache.startup(); - if (Act.isDev()) { - sessionCache.clear(); - } - } HttpConfig.setSessionCache(sessionCache); } diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index b0bae498c..88989f9c9 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -471,9 +471,7 @@ protected T corsHeaders(String s) { private String corsHeaders() { if (null == corsHeaders) { - corsHeaders = get(CORS_HEADERS, - "Content-Type, X-HTTP-Method-Override, X-Requested-With, Location, " + - "Authorization, X-XSRF-Token, X-CSRF-Token, Act-Session-Expires, Content-Length"); + corsHeaders = get(CORS_HEADERS, ""); } return corsHeaders; } @@ -493,7 +491,9 @@ protected T corsHeadersExpose(String s) { public String corsExposeHeaders() { if (null == corsHeadersExpose) { - corsHeadersExpose = get(CORS_HEADERS_EXPOSE, corsHeaders()); + corsHeadersExpose = get(CORS_HEADERS_EXPOSE, + "Act-Session-Expires, Authorization, X-XSRF-Token, X-CSRF-Token, " + + "Location, Link, Content-Disposition, Content-Length"); } return corsHeadersExpose; } @@ -533,7 +533,9 @@ protected T corsAllowHeaders(String s) { public String corsAllowHeaders() { if (null == corsHeadersAllowed) { - corsHeadersAllowed = get(CORS_HEADERS_ALLOWED, corsHeaders()); + corsHeadersAllowed = get(CORS_HEADERS_ALLOWED, + "X-HTTP-Method-Override, X-Requested-With, " + + "Authorization, X-XSRF-Token, X-CSRF-Token"); } return corsHeadersAllowed; } @@ -3358,6 +3360,15 @@ protected T cacheService(Class provider) { } public CacheService cacheService(String name) { + CacheService cacheService = cacheServiceProvider().get(name); + E.illegalStateIf(cacheService.state().isShutdown(), "Cache service[%s] already shutdown.", name); + if (!cacheService.state().isStarted()) { + cacheService.startup(); + } + return cacheService; + } + + public CacheServiceProvider cacheServiceProvider() { if (null == cacheServiceProvider) { CacheServiceProvider.Impl.setClassLoader(app().classLoader()); try { @@ -3375,22 +3386,15 @@ public CacheService cacheService(String name) { cacheServiceProvider = CacheServiceProvider.Impl.Auto; } } - CacheService cacheService = cacheServiceProvider.get(name); - E.illegalStateIf(cacheService.state().isShutdown(), "Cache service[%s] already shutdown.", name); - if (!cacheService.state().isStarted()) { - cacheService.startup(); - } - return cacheService; + return cacheServiceProvider; } - public void resetCacheServices(CacheService sample) { + public void resetCacheServices() { if (!Act.isDev()) { return; } OsglConfig.internalCache().clear(); - if (sample instanceof SimpleCacheService) { - SimpleCacheServiceProvider.reset(); - } + } private void _mergeCacheServiceProvider(AppConfig config) { diff --git a/src/main/java/act/conf/ConfAdmin.java b/src/main/java/act/conf/ConfAdmin.java index bdbd3b04c..7ecb5c002 100644 --- a/src/main/java/act/conf/ConfAdmin.java +++ b/src/main/java/act/conf/ConfAdmin.java @@ -86,15 +86,6 @@ public List list( return list; } - @GetAction({"csrf", "xsrf"}) - public JSONObject csrfConf() { - JSONObject retVal = new JSONObject(); - retVal.put("cookieName", appConfig.csrfCookieName()); - retVal.put("headerName", appConfig.csrfHeaderName()); - retVal.put("paramName", appConfig.csrfParamName()); - return retVal; - } - @Command("act.conf.trace-handler") public void toggleTraceHandler(@Required boolean enabled) { appConfig.toggleTraceHandler(enabled); diff --git a/src/main/java/act/conf/CsrfConfAdmin.java b/src/main/java/act/conf/CsrfConfAdmin.java new file mode 100644 index 000000000..71bd60d79 --- /dev/null +++ b/src/main/java/act/conf/CsrfConfAdmin.java @@ -0,0 +1,47 @@ +package act.conf; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.controller.ExpressController; +import act.controller.annotation.UrlContext; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; + +@UrlContext("conf") +@ExpressController +public class CsrfConfAdmin { + + @Inject + private AppConfig appConfig; + + @GetAction({"csrf", "xsrf"}) + public JSONObject csrfConf() { + JSONObject retVal = new JSONObject(); + retVal.put("cookieName", appConfig.csrfCookieName()); + retVal.put("headerName", appConfig.csrfHeaderName()); + retVal.put("paramName", appConfig.csrfParamName()); + return retVal; + } + + +} diff --git a/src/main/java/act/db/DbService.java b/src/main/java/act/db/DbService.java index b12152c27..8fe541ba9 100644 --- a/src/main/java/act/db/DbService.java +++ b/src/main/java/act/db/DbService.java @@ -22,7 +22,10 @@ import act.app.App; import act.app.AppHolderBase; +import act.db.meta.EntityClassMetaInfo; +import act.db.meta.EntityFieldMetaInfo; import act.db.meta.EntityMetaInfoRepo; +import org.osgl.$; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.C; @@ -42,6 +45,8 @@ public abstract class DbService extends AppHolderBase { @Deprecated protected static final Logger _logger = LogManager.get(DbService.class); + protected EntityMetaInfoRepo entityMetaInfoRepo; + protected final Logger logger = LogManager.get(getClass()); private String id; @@ -55,6 +60,7 @@ public DbService(String id, App app) { super(app); E.NPE(id); this.id = id; + this.entityMetaInfoRepo = app().entityMetaInfoRepo().forDb(id); } /** @@ -105,6 +111,41 @@ public boolean initAsynchronously() { public abstract Class entityAnnotationType(); + public final String entityName(Class modelClass) { + return classInfo(modelClass).entityName(); + } + + protected final EntityClassMetaInfo classInfo(Class modelClass) { + return entityMetaInfoRepo.classMetaInfo(modelClass); + } + + public final String lastModifiedColumn(Class modelClass) { + EntityFieldMetaInfo fieldInfo = classInfo(modelClass).lastModifiedAtField(); + return null == fieldInfo ? null : fieldInfo.columnName(); + } + + public final String createdColumn(Class modelClass) { + EntityFieldMetaInfo fieldInfo = classInfo(modelClass).createdAtField(); + return null == fieldInfo ? null : fieldInfo.columnName(); + } + + public final String idColumn(Class modelClass) { + EntityFieldMetaInfo fieldInfo = classInfo(modelClass).idField(); + return null == fieldInfo ? null : fieldInfo.columnName(); + } + + public final Field idField(Class modelClass) { + EntityFieldMetaInfo fieldInfo = classInfo(modelClass).idField(); + return null == fieldInfo ? null : $.fieldOf(modelClass, fieldInfo.fieldName()); + } + + public final String columnName(Field field) { + return classInfo(field.getDeclaringClass()).fieldInfo(field.getName()).columnName(); + } + + + + /** * Utility method to find the ID type from Model type. Could be used by sub class on {@link #defaultDao(Class)} * method implementation @@ -126,4 +167,5 @@ protected static Class findModelIdTypeByAnnotation(Class modelType, Class< } return null; } + } diff --git a/src/main/java/act/job/Cron.java b/src/main/java/act/job/Cron.java index 54814de81..443b66372 100644 --- a/src/main/java/act/job/Cron.java +++ b/src/main/java/act/job/Cron.java @@ -43,4 +43,14 @@ * @return the job id */ String id() default ""; + + String CRON_12AM = "0 0 0 * * *"; + String CRON_MIDNIGHT = CRON_12AM; + String CRON_2AM = "0 0 2 * * *"; + String CRON_8AM = "0 0 8 * * *"; + String CRON_MORNING = CRON_8AM; + String CRON_12PM = "0 0 12 * * *"; + String CRON_NOON = CRON_12PM; + String CRON_6PM = "0 0 18 * * *"; + String CRON_10PM = "0 0 22 * * *"; } diff --git a/src/main/resources/aaa.authenticate.list b/src/main/resources/aaa.authenticate.list index 7d5107ed9..c7d559377 100644 --- a/src/main/resources/aaa.authenticate.list +++ b/src/main/resources/aaa.authenticate.list @@ -4,6 +4,7 @@ -act.i18n.EnumService -act.Zen. -act.monitor. +-act.conf.CsrfConfAdmin # The following endpoints are only public on dev mode [dev]-act.apidoc. From 287b9d6d592149caaf13e2c2ae3a9958722918e0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 27 Oct 2019 09:06:02 +1100 Subject: [PATCH 535/730] improve nonblock io logic --- src/main/java/act/app/ActionContext.java | 15 ++++++++ src/main/java/act/controller/Controller.java | 7 ++-- .../controller/RequestHandlerProxy.java | 26 ++++++++------ src/main/java/act/metric/MetricInfoTree.java | 20 +++++++++++ src/main/java/act/util/JsonUtilConfig.java | 18 ++++++++-- .../java/act/view/FilteredRenderJSON.java | 7 ++-- src/main/java/act/xio/NetworkHandler.java | 7 ++-- .../java/act/xio/undertow/NonBlockOutput.java | 33 ++++++++++++++++- .../act/xio/undertow/UndertowResponse.java | 11 ++++-- testapps/GHIssues/pom.xml | 1 + .../src/main/java/ghissues/Gh1232.java | 36 +++++++++++++++++++ 11 files changed, 154 insertions(+), 27 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1232.java diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 07c5939cd..bda675379 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -121,6 +121,8 @@ public class ActionContext extends ActContext.Base implements Des private Class handlerClass; private RouteSource routeSource; private String patchedJsonBody; + private boolean nonBlock; + public act.metric.Timer handleTimer; // see https://github.com/actframework/actframework/issues/492 public String encodedSessionToken; @@ -297,6 +299,15 @@ public ActionContext router(Router router) { return this; } + public ActionContext markAsNonBlock() { + this.nonBlock = true; + return this; + } + + public boolean isNonBlock() { + return this.nonBlock; + } + public ActionContext processedUrl(String url) { this.processedUrl = url; return this; @@ -1462,6 +1473,10 @@ protected void releaseResources() { this.handlerClass = null; this.encodedSessionToken = null; this.localeResolver = null; + if (null != this.handleTimer) { + this.handleTimer.stop(); + this.handleTimer = null; + } ActionContext.clearLocal(); } this.state = State.DESTROYED; diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 281b4ca82..b30d91e9c 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1289,7 +1289,7 @@ public static RenderJSON renderJson(Object data) { /** * Returns a {@link RenderJsonMap} result with any object. This method will - * generate a JSON object out from the {@link ActionContext#renderArgs}. + * generate a JSON object out from the {@link ActionContext#renderArgs()}. * The response is always in JSON format and ignores the HTTP `Accept` * header setting * @@ -1945,9 +1945,10 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } else if (v instanceof $.Func0) { return RenderJSON.of(status, ($.Func0) v); } - boolean possibleLargeResponse = context.isLargeResponse(); JsonWriter jsonWriter = new JsonWriter(v, propertySpec, false, context); - return possibleLargeResponse ? RenderJSON.of(status, jsonWriter) : RenderJSON.of(status, jsonWriter.asContentProducer()); + return context.isLargeResponse() ? RenderJSON.of(status, jsonWriter) : RenderJSON.of(status, jsonWriter.asContentProducer()); + //return RenderJSON.of(status, jsonWriter); + //return RenderJSON.of(status, jsonWriter.asContentProducer()); } else if (requireXML) { return new FilteredRenderXML(status, v, propertySpec, context); } else if (context.accept() == H.Format.CSV) { diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index 629d4c898..fd8e42a8c 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -237,18 +237,22 @@ public void handle(ActionContext context) { } catch (Exception e0) { logger.error(e0, "Error invoking exception handler"); } - if (null == result) { - H.Request req = context.req(); - result = ActErrorResult.of(e); - if (result.status().isServerError()) { - logger.error(e, "Server error encountered on handling request: " + req); + if (context.resp().isClosed()) { + logger.error(e, "Error committing result"); + } else { + if (null == result) { + H.Request req = context.req(); + result = ActErrorResult.of(e); + if (result.status().isServerError()) { + logger.error(e, "Server error encountered on handling request: " + req); + } + } + try { + onResult(result, context); + } catch (Exception e2) { + logger.error(e2, "error rendering exception handle result"); + onResult(ActErrorResult.of(e2), context); } - } - try { - onResult(result, context); - } catch (Exception e2) { - logger.error(e2, "error rendering exception handle result"); - onResult(ActErrorResult.of(e2), context); } } finally { try { diff --git a/src/main/java/act/metric/MetricInfoTree.java b/src/main/java/act/metric/MetricInfoTree.java index 725189ba6..74aeb5eb5 100644 --- a/src/main/java/act/metric/MetricInfoTree.java +++ b/src/main/java/act/metric/MetricInfoTree.java @@ -129,11 +129,31 @@ boolean addToParent() { public static class NodeDecorator { $.Function labelGetter; + private static final TreeNode NULL = new TreeNode() { + @Override + public String id() { + return ""; + } + + @Override + public String label() { + return ""; + } + + @Override + public List children() { + return C.list(); + } + }; + NodeDecorator($.Function labelGetter) { this.labelGetter = $.requireNotNull(labelGetter); } TreeNode decorate(final MetricInfoNode node) { + if (null == node) { + return NULL; + } return new TreeNode() { @Override diff --git a/src/main/java/act/util/JsonUtilConfig.java b/src/main/java/act/util/JsonUtilConfig.java index 8fa285459..492cac721 100644 --- a/src/main/java/act/util/JsonUtilConfig.java +++ b/src/main/java/act/util/JsonUtilConfig.java @@ -38,12 +38,14 @@ import com.alibaba.fastjson.util.TypeUtils; import org.joda.time.*; import org.osgl.$; +import org.osgl.OsglConfig; import org.osgl.exception.NotAppliedException; import org.osgl.mvc.MvcConfig; import org.osgl.storage.ISObject; import org.osgl.storage.impl.SObject; import org.osgl.util.*; +import java.io.StringWriter; import java.io.Writer; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -59,10 +61,14 @@ public static class JsonWriter extends $.Visitor { private SerializeConfig config; private DateFormat dateFormat; private boolean disableCircularReferenceDetect = true; + private boolean isLargeResponse; + private String sv; public JsonWriter(Object v, PropertySpec.MetaInfo spec, boolean format, ActContext context) { if (null == v) { this.v = "{}"; + this.isLargeResponse = false; + this.sv = (String)v; } else if (v instanceof String) { String s = S.string(v).trim(); int len = s.length(); @@ -77,6 +83,8 @@ public JsonWriter(Object v, PropertySpec.MetaInfo spec, boolean format, ActConte this.v = "{\"result\":" + s + "}"; } } + this.isLargeResponse = ((String) v).length() > OsglConfig.getThreadLocalCharBufferLimit(); + this.sv = (String) v; } else { this.v = v; AppConfig config = Act.appConfig(); @@ -100,6 +108,7 @@ public JsonWriter(Object v, PropertySpec.MetaInfo spec, boolean format, ActConte this.filters = initFilters(v, spec, context); this.features = initFeatures(format, context); this.config = initConfig(context); + this.isLargeResponse = context instanceof ActionContext && ((ActionContext) context).isLargeResponse(); } } @@ -186,9 +195,12 @@ public void visit(Writer writer) throws $.Break { return new $.Func0() { @Override public String apply() throws NotAppliedException, $.Break { - S.Buffer buf = S.buffer(); - me.visit(buf); - return buf.toString(); + if (null != me.sv) { + return sv; + } + Writer w = me.isLargeResponse ? new StringWriter() : S.buffer(); + me.visit(w); + return w.toString(); } }; } diff --git a/src/main/java/act/view/FilteredRenderJSON.java b/src/main/java/act/view/FilteredRenderJSON.java index e753bc924..24846a66e 100644 --- a/src/main/java/act/view/FilteredRenderJSON.java +++ b/src/main/java/act/view/FilteredRenderJSON.java @@ -97,12 +97,11 @@ public static FilteredRenderJSON of(final Object v, final PropertySpec.MetaInfo } else if (v instanceof $.Visitor) { touchPayload().contentWriter(($.Visitor) v); } else { - if (context.isLargeResponse() || v instanceof Iterable) { - touchPayload().contentWriter(new JsonUtilConfig.JsonWriter(v, spec, false, context)); - } else { + if (context.isNonBlock()) { touchPayload().stringContentProducer(new JsonUtilConfig.JsonWriter(v, spec, false, context).asContentProducer()); + } else { + touchPayload().contentWriter(new JsonUtilConfig.JsonWriter(v, spec, false, context)); } - touchPayload().contentWriter(new JsonUtilConfig.JsonWriter(v, spec, false, context)); } return _INSTANCE; } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 1af88ef19..98875f4c8 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -161,11 +161,14 @@ public void run() { NetworkJob job = new NetworkJob() { @Override public void run() { - Timer timer = Metric.NULL_METRIC.startTimer("null"); + Timer timer; if (metric != Metric.NULL_METRIC) { String key = S.concat(MetricInfo.HTTP_HANDLER, ":", requestHandler.toString()); timer = metric.startTimer(key); + } else { + timer = Metric.NULL_METRIC.startTimer("null"); } + ctx.handleTimer = timer; EventBus eventBus = app.eventBus(); // need to set ActionContext.current before calling ctx.skipEvents() as the later // one will call into ReflectedHandlerInvoker.init() will in turn try to @@ -222,13 +225,13 @@ public void run() { // the ctx get transferred to another thread ActionContext.clearCurrent(); } - timer.stop(); } } }; if (method.unsafe() || !requestHandler.express(ctx)) { dispatcher.dispatch(job); } else { + ctx.markAsNonBlock(); job.run(); } } diff --git a/src/main/java/act/xio/undertow/NonBlockOutput.java b/src/main/java/act/xio/undertow/NonBlockOutput.java index 138af4ed0..5f901ca7e 100644 --- a/src/main/java/act/xio/undertow/NonBlockOutput.java +++ b/src/main/java/act/xio/undertow/NonBlockOutput.java @@ -22,15 +22,38 @@ import io.undertow.io.IoCallback; import io.undertow.io.Sender; +import io.undertow.server.HttpServerExchange; import org.osgl.$; import org.osgl.util.Output; +import java.io.IOException; import java.io.OutputStream; import java.io.Writer; import java.nio.ByteBuffer; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicBoolean; class NonBlockOutput implements Output { + private final AtomicBoolean sending = new AtomicBoolean(false); + private final ConcurrentLinkedQueue pending = new ConcurrentLinkedQueue<>(); + + private IoCallback resume = new IoCallback() { + @Override + public void onComplete(HttpServerExchange exchange, Sender sender) { + ByteBuffer next = pending.poll(); + if (null == next) { + sending.set(false); + } else { + sender.send(next, this); + } + } + + @Override + public void onException(HttpServerExchange exchange, Sender sender, IOException exception) { + } + }; + private Sender sender; NonBlockOutput(Sender sender) { @@ -89,10 +112,18 @@ public Output append(byte b) { @Override public Output append(ByteBuffer buffer) { - sender.send(buffer); + send(buffer); return this; } + private void send(ByteBuffer buffer) { + if (sending.get()) { + pending.offer(buffer); + } else { + sender.send(buffer, resume); + } + } + @Override public OutputStream asOutputStream() { return Adaptors.asOutputStream(this); diff --git a/src/main/java/act/xio/undertow/UndertowResponse.java b/src/main/java/act/xio/undertow/UndertowResponse.java index 636a0a47d..49114013d 100644 --- a/src/main/java/act/xio/undertow/UndertowResponse.java +++ b/src/main/java/act/xio/undertow/UndertowResponse.java @@ -100,7 +100,7 @@ Sender sender() { @Override public UndertowResponse writeContent(String s) { beforeWritingContent(); - if ("" == s) { + if (s.length() == 0) { afterWritingContent(); } else { try { @@ -275,8 +275,13 @@ protected Writer createWriter() { @Override protected OutputStream createOutputStream() { - ensureBlocking(); - return hse.getOutputStream(); + if (blocking()) { + return hse.getOutputStream(); + } else { + endAsync = true; + final NonBlockOutput senderOutput = new NonBlockOutput(sender()); + return BufferedOutput.wrap(senderOutput).asOutputStream(); + } } @Override diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 282cce485..674bb7f01 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -38,6 +38,7 @@ org.actframework act-jpa-common + 1.7.0-SNAPSHOT diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1232.java b/testapps/GHIssues/src/main/java/ghissues/Gh1232.java new file mode 100644 index 000000000..9b221c9cf --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1232.java @@ -0,0 +1,36 @@ +package ghissues; + +import act.controller.ExpressController; +import act.controller.annotation.UrlContext; +import act.handler.NonBlock; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; +import org.osgl.util.S; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import static act.controller.Controller.Util.renderJson; + +@UrlContext("1232") +@ExpressController +public class Gh1232 extends BaseController { + + public static class Foo { + public String name; + + public Foo(String name) { + this.name = name; + } + } + + @GetAction + @NonBlock + public Foo test() { + return new Foo(S.repeat("bar").x(1000 * 100)); + } + +} From bbf9213e4dc31d253406a7dfde56ba55e9b2ed0b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 28 Oct 2019 08:25:23 +1100 Subject: [PATCH 536/730] Creating a system self healing mechanism to handle OOM caused by too many dangling connention #1234 --- CHANGELOG.md | 1 + src/main/java/act/Act.java | 4 + src/main/java/act/app/App.java | 2 + .../java/act/event/SystemPausedEvent.java | 30 +++ src/main/java/act/sys/GcHelper.java | 57 ++++++ .../act/sys/SystemAvailabilityMonitor.java | 175 ++++++++++++++++++ src/main/java/act/xio/NetworkHandler.java | 10 + .../java/act/xio/undertow/ActHttpHandler.java | 12 +- .../java/act/xio/undertow/NonBlockOutput.java | 6 +- 9 files changed, 293 insertions(+), 4 deletions(-) create mode 100644 src/main/java/act/event/SystemPausedEvent.java create mode 100644 src/main/java/act/sys/GcHelper.java create mode 100644 src/main/java/act/sys/SystemAvailabilityMonitor.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a2e332c1..befbaee75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.29** +* Creating a system self healing mechanism to handle OOM caused by too many dangling connention #1234 * Add commonly used cron expression constants #1229 * Ehcache not working in Act since 1.8.27 #1220 * CORS - update default allowed headers #1228 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 936b3e1ba..bc388bc4b 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -365,6 +365,10 @@ public void run() { }, true); } + public static void shutdown() { + shutdown(app(), 0); + } + public static void shutdown(final App app) { shutdown(app, 0); } diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 96cb7016c..7f93d9058 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -74,6 +74,7 @@ import act.route.*; import act.session.CookieSessionMapper; import act.session.SessionManager; +import act.sys.SystemAvailabilityMonitor; import act.util.*; import act.validation.Password; import act.view.ActErrorResult; @@ -1373,6 +1374,7 @@ private synchronized void startLoading() { } private synchronized void loadingDone() { + SystemAvailabilityMonitor.start(); loading.set(false); this.notifyAll(); } diff --git a/src/main/java/act/event/SystemPausedEvent.java b/src/main/java/act/event/SystemPausedEvent.java new file mode 100644 index 000000000..f7e503105 --- /dev/null +++ b/src/main/java/act/event/SystemPausedEvent.java @@ -0,0 +1,30 @@ +package act.event; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.sys.SystemAvailabilityMonitor; + +/** + * Raised when system is put into {@link SystemAvailabilityMonitor#isAvailable() paused} state + */ +public class SystemPausedEvent extends ActEvent { + public static final SystemPausedEvent INSTANCE = new SystemPausedEvent(); +} diff --git a/src/main/java/act/sys/GcHelper.java b/src/main/java/act/sys/GcHelper.java new file mode 100644 index 000000000..113688401 --- /dev/null +++ b/src/main/java/act/sys/GcHelper.java @@ -0,0 +1,57 @@ +package act.sys; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.sun.management.GarbageCollectionNotificationInfo; +import com.sun.management.GcInfo; +import org.osgl.$; + +import javax.management.Notification; +import javax.management.NotificationEmitter; +import javax.management.NotificationListener; +import javax.management.openmbean.CompositeData; +import java.lang.management.ManagementFactory; +import java.util.List; + +public class GcHelper { + + private static volatile List gcBeans; + + static { + gcBeans = ManagementFactory.getGarbageCollectorMXBeans(); + } + + public static void registerGcEventListener(final $.Visitor listener) { + for (java.lang.management.GarbageCollectorMXBean mxBean : gcBeans) { + NotificationEmitter emitter = (NotificationEmitter) mxBean; + emitter.addNotificationListener(new NotificationListener() { + @Override + public void handleNotification(Notification notification, Object handback) { + if (notification.getType().equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) { + GarbageCollectionNotificationInfo gcInfo = GarbageCollectionNotificationInfo.from((CompositeData) notification.getUserData()); + listener.visit(gcInfo.getGcInfo()); + } + } + }, null, null); + } + } + +} diff --git a/src/main/java/act/sys/SystemAvailabilityMonitor.java b/src/main/java/act/sys/SystemAvailabilityMonitor.java new file mode 100644 index 000000000..de7d668b4 --- /dev/null +++ b/src/main/java/act/sys/SystemAvailabilityMonitor.java @@ -0,0 +1,175 @@ +package act.sys; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.event.SystemPausedEvent; +import com.sun.management.GcInfo; +import org.osgl.$; +import org.osgl.Lang; +import org.osgl.logging.LogManager; +import org.osgl.logging.Logger; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +public class SystemAvailabilityMonitor extends $.Visitor implements Runnable { + + private static ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); + + private static final Logger LOGGER = LogManager.get(SystemAvailabilityMonitor.class); + + private static final AtomicBoolean available = new AtomicBoolean(true); + + private static final int CHECK_PERIOD = 200; + + // used to queue last 2s gc counters + private Deque gcCounters = new ArrayDeque<>(); + + // count for recent 200ms gc count + private AtomicInteger currentCounter = new AtomicInteger(); + + // count for recent 2s gc count + private AtomicInteger smallWindowSum = new AtomicInteger(); + + private int largeWindowOffset = 0; + + private int largeWindowCycle = 0; + + private AtomicBoolean active = new AtomicBoolean(); + + // count for recent 4s gc count + private AtomicInteger largeWindowSum = new AtomicInteger(); + + @Override + public void visit(GcInfo gcInfo) throws Lang.Break { + currentCounter.incrementAndGet(); + if (smallWindowSum.incrementAndGet() > 2) { + // there are at least 3 gc hapened within last 2s + pauseNow(); + wakeUp(); + } + largeWindowSum.incrementAndGet(); + LOGGER.debug("gc notified. gc summary: %s | %s", smallWindowSum.get(), largeWindowSum.get()); + } + + private void shiftGcCounters() { + // push current counter into 2s window + for (; ; ) { + int current = currentCounter.get(); + if (currentCounter.compareAndSet(current, 0)) { + gcCounters.addLast(new AtomicInteger(current)); + break; + } + } + // in case the window is full, we poll the first out + if (gcCounters.size() > 10) { + AtomicInteger shiftOut = gcCounters.poll(); + int n = shiftOut.get(); + if (n > 0) { + // the shift out has gc count, we need to + // deduct from the small window sum and + // add up to large window offset holder + for (; ; ) { + int current = smallWindowSum.get(); + int next = current - n; + if (smallWindowSum.compareAndSet(current, next)) { + largeWindowOffset += n; + break; + } + } + } + } + // every 4s we apply the large window offset to the large window sum + if ((++largeWindowCycle) % 20 == 0) { + largeWindowCycle = 0; + for (; ; ) { + int current = largeWindowSum.get(); + int next = current - largeWindowOffset; + if (largeWindowSum.compareAndSet(current, next)) { + largeWindowOffset = 0; + break; + } + } + } + } + + @Override + public void run() { + try { + shiftGcCounters(); + int gcSum = largeWindowSum.get(); + if (gcSum == 0) { + resumeNow(); + hibernate(); + } + if (active.get()) { + executor.schedule(this, CHECK_PERIOD, TimeUnit.MILLISECONDS); + } + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + + private void wakeUp() { + if (active.compareAndSet(false, true)) { + LOGGER.info("wake up system availability monitor"); + executor.schedule(this, CHECK_PERIOD, TimeUnit.MILLISECONDS); + } + } + + private void hibernate() { + if (active.compareAndSet(true, false)) { + LOGGER.info("system availability monitor hibernated"); + } + } + + private static boolean resumeNow() { + if (available.compareAndSet(false, true)) { + LOGGER.info("Service recovered"); + return true; + } + return false; + } + + public static boolean pauseNow() { + if (available.compareAndSet(true, false)) { + LOGGER.info("Service paused"); + Act.eventBus().trigger(SystemPausedEvent.INSTANCE); + return true; + } + return false; + } + + public static boolean isAvailable() { + return available.get(); + } + + public static void start() { + SystemAvailabilityMonitor monitor = new SystemAvailabilityMonitor(); + GcHelper.registerGcEventListener(monitor); + } +} diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 98875f4c8..0e5db40e0 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -35,6 +35,7 @@ import act.handler.event.PreHandle; import act.metric.*; import act.route.Router; +import act.sys.SystemAvailabilityMonitor; import act.util.LogSupportedDestroyableBase; import act.view.ActErrorResult; import org.osgl.$; @@ -48,6 +49,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.atomic.AtomicBoolean; /** * A `NetworkHandler` can be registered to an {@link Network} and get invoked when @@ -63,6 +65,7 @@ public class NetworkHandler extends LogSupportedDestroyableBase { private $.Func2 contentSuffixProcessor; private $.Func2 urlContextProcessor; private ScheduledExecutorService hotReloadExecutor; + private AtomicBoolean pause = new AtomicBoolean(); public NetworkHandler(App app) { E.NPE(app); @@ -80,6 +83,10 @@ public void preHotReload() { } } + public boolean paused() { + return pause.get(); + } + private void initUrlProcessors() { this.contentSuffixProcessor = app.config().contentSuffixAware() ? new ContentSuffixSensor() : DUMB_CONTENT_SUFFIX_SENSOR; String urlContext = app.config().urlContext(); @@ -209,6 +216,9 @@ public void run() { } } catch (Exception e) { handleException(e, ctx, "Error handling network request"); + } catch (OutOfMemoryError error) { + error("Out of memory"); + SystemAvailabilityMonitor.pauseNow(); } catch (Error t) { fatal(t, "Fatal Error encountered handling request: ", ctx.req()); if (Act.isProd()) { diff --git a/src/main/java/act/xio/undertow/ActHttpHandler.java b/src/main/java/act/xio/undertow/ActHttpHandler.java index b03c26a49..f190b0d8c 100644 --- a/src/main/java/act/xio/undertow/ActHttpHandler.java +++ b/src/main/java/act/xio/undertow/ActHttpHandler.java @@ -24,12 +24,15 @@ import act.app.ActionContext; import act.app.App; import act.conf.AppConfig; +import act.sys.SystemAvailabilityMonitor; import act.xio.NetworkHandler; import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; import org.osgl.http.H; import org.osgl.util.E; +import java.nio.ByteBuffer; + /** * Dispatch undertow request to Act application */ @@ -37,13 +40,20 @@ public class ActHttpHandler implements HttpHandler { private final NetworkHandler client; + private static final ByteBuffer SERVICE_UNAVAILABLE = ByteBuffer.wrap("503 Service Unavailable".getBytes()); + public ActHttpHandler(NetworkHandler client) { E.NPE(client); this.client = client; } @Override - public void handleRequest(final HttpServerExchange exchange) throws Exception { + public void handleRequest(final HttpServerExchange exchange) { + if (!SystemAvailabilityMonitor.isAvailable()) { + exchange.setStatusCode(503); + exchange.getResponseSender().send(SERVICE_UNAVAILABLE.duplicate()); + return; + } ActionContext ctx = createActionContext(exchange); client.handle(ctx, new UndertowNetworkDispatcher(exchange)); } diff --git a/src/main/java/act/xio/undertow/NonBlockOutput.java b/src/main/java/act/xio/undertow/NonBlockOutput.java index 5f901ca7e..88849ceda 100644 --- a/src/main/java/act/xio/undertow/NonBlockOutput.java +++ b/src/main/java/act/xio/undertow/NonBlockOutput.java @@ -117,10 +117,10 @@ public Output append(ByteBuffer buffer) { } private void send(ByteBuffer buffer) { - if (sending.get()) { - pending.offer(buffer); - } else { + if (sending.compareAndSet(false, true)) { sender.send(buffer, resume); + } else { + pending.offer(buffer); } } From 83791eef713af0a6ea0cbe6418b4a6e549ca880b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 28 Oct 2019 09:59:24 +1100 Subject: [PATCH 537/730] allow turn on/off self-healing service --- src/main/java/act/app/App.java | 4 +- src/main/java/act/conf/AppConfig.java | 17 ++++++ src/main/java/act/conf/AppConfigKey.java | 9 ++++ src/main/java/act/controller/Controller.java | 2 - .../java/act/xio/undertow/NonBlockOutput.java | 52 ++++++++++--------- 5 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 7f93d9058..b827e8aa1 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -1374,7 +1374,9 @@ private synchronized void startLoading() { } private synchronized void loadingDone() { - SystemAvailabilityMonitor.start(); + if (config.selfHealing()) { + SystemAvailabilityMonitor.start(); + } loading.set(false); this.notifyAll(); } diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 88989f9c9..1fc2817f0 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -2395,6 +2395,23 @@ private void _mergeSourceVersion(AppConfig conf) { } } + private Boolean selfHealing; + protected T selfHealing(boolean on) { + selfHealing = on; + return me(); + } + public boolean selfHealing() { + if (null == selfHealing) { + selfHealing = get(SYS_SELF_HEALING, false); + } + return selfHealing; + } + private void _mergeSelfHealing(AppConfig conf) { + if (!hasConfiguration(SYS_SELF_HEALING)) { + selfHealing = conf.selfHealing; + } + } + private String targetVersion = null; protected T targetVersion(JavaVersion version) { diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 0688fbba9..757f4b5a9 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -1211,6 +1211,15 @@ public T val(Map configuration) { */ SSL("ssl.enabled"), + /** + * `system.self-healing` + * + * Turn on/off System Self Healing. Refer GH1234 + * + * Default value: `false` + */ + SYS_SELF_HEALING("system.self-healing"), + /** * `target.version` specifies the java version of the compile * target code. This configuration is used only in dev mode. diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index b30d91e9c..d9e644d12 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1947,8 +1947,6 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } JsonWriter jsonWriter = new JsonWriter(v, propertySpec, false, context); return context.isLargeResponse() ? RenderJSON.of(status, jsonWriter) : RenderJSON.of(status, jsonWriter.asContentProducer()); - //return RenderJSON.of(status, jsonWriter); - //return RenderJSON.of(status, jsonWriter.asContentProducer()); } else if (requireXML) { return new FilteredRenderXML(status, v, propertySpec, context); } else if (context.accept() == H.Format.CSV) { diff --git a/src/main/java/act/xio/undertow/NonBlockOutput.java b/src/main/java/act/xio/undertow/NonBlockOutput.java index 88849ceda..cb9eaf2ed 100644 --- a/src/main/java/act/xio/undertow/NonBlockOutput.java +++ b/src/main/java/act/xio/undertow/NonBlockOutput.java @@ -38,22 +38,6 @@ class NonBlockOutput implements Output { private final AtomicBoolean sending = new AtomicBoolean(false); private final ConcurrentLinkedQueue pending = new ConcurrentLinkedQueue<>(); - private IoCallback resume = new IoCallback() { - @Override - public void onComplete(HttpServerExchange exchange, Sender sender) { - ByteBuffer next = pending.poll(); - if (null == next) { - sending.set(false); - } else { - sender.send(next, this); - } - } - - @Override - public void onException(HttpServerExchange exchange, Sender sender, IOException exception) { - } - }; - private Sender sender; NonBlockOutput(Sender sender) { @@ -116,14 +100,6 @@ public Output append(ByteBuffer buffer) { return this; } - private void send(ByteBuffer buffer) { - if (sending.compareAndSet(false, true)) { - sender.send(buffer, resume); - } else { - pending.offer(buffer); - } - } - @Override public OutputStream asOutputStream() { return Adaptors.asOutputStream(this); @@ -133,4 +109,32 @@ public OutputStream asOutputStream() { public Writer asWriter() { return Adaptors.asWriter(this); } + + private IoCallback resume = new IoCallback() { + @Override + public void onComplete(HttpServerExchange exchange, Sender sender) { + ByteBuffer next = pending.poll(); + if (null == next) { + sending.set(false); + } else { + sender.send(next, this); + } + } + + @Override + public void onException(HttpServerExchange exchange, Sender sender, IOException exception) { + } + }; + + private void send(ByteBuffer buffer) { + if (sending.compareAndSet(false, true)) { + sender.send(buffer, resume); + } else { + pending.offer(buffer); + if (sending.compareAndSet(false, true)) { + pending.poll(); + sender.send(buffer, resume); + } + } + } } From ca014e7677962cb548948eb374681fc06482999d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 29 Oct 2019 08:31:08 +1100 Subject: [PATCH 538/730] fix a bunch of issues in 1. DbService refactory; 2. ResourceLoader issue introduced with GH #1222 --- src/main/java/act/RequestImplBase.java | 25 -------- src/main/java/act/db/DbService.java | 23 ++++--- .../act/db/meta/MasterEntityMetaInfoRepo.java | 4 ++ .../java/act/inject/util/ResourceLoader.java | 13 +++- src/main/java/act/util/StringUtils.java | 28 +++------ testapps/GHIssues/pom.xml | 1 + .../src/main/java/stress_test/Client.java | 61 +++++++++++++++++++ .../src/main/resources/asset/1151.json | 2 +- .../src/main/resources/conf/1151.properties | 3 +- 9 files changed, 106 insertions(+), 54 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/stress_test/Client.java diff --git a/src/main/java/act/RequestImplBase.java b/src/main/java/act/RequestImplBase.java index e7989d11e..0b42f68eb 100644 --- a/src/main/java/act/RequestImplBase.java +++ b/src/main/java/act/RequestImplBase.java @@ -32,7 +32,6 @@ public abstract class RequestImplBase extends H.Request private AppConfig cfg; private H.Method method; private Boolean secure; - private H.Format accept; protected RequestImplBase(AppConfig config) { E.NPE(config); @@ -79,30 +78,6 @@ public H.Method method() { return method; } - @Override - public H.Format accept() { - if (null == this.accept) { - String s = paramVal("_accept"); - if (null != s) { - try { - this.accept = H.Format.of(s); - if (null == this.accept) { - this.accept = H.Format.resolve(s); - if (this.accept == H.Format.UNKNOWN) { - this.accept = null; - } - } - } catch (Exception e) { - // ignore - } - } - } - if (null == this.accept) { - this.accept = super.accept(); - } - return this.accept; - } - @Override public boolean secure() { if (null == secure) { diff --git a/src/main/java/act/db/DbService.java b/src/main/java/act/db/DbService.java index 8fe541ba9..cb4741464 100644 --- a/src/main/java/act/db/DbService.java +++ b/src/main/java/act/db/DbService.java @@ -25,6 +25,7 @@ import act.db.meta.EntityClassMetaInfo; import act.db.meta.EntityFieldMetaInfo; import act.db.meta.EntityMetaInfoRepo; +import act.db.meta.MasterEntityMetaInfoRepo; import org.osgl.$; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; @@ -45,7 +46,7 @@ public abstract class DbService extends AppHolderBase { @Deprecated protected static final Logger _logger = LogManager.get(DbService.class); - protected EntityMetaInfoRepo entityMetaInfoRepo; + private volatile EntityMetaInfoRepo entityMetaInfoRepo; protected final Logger logger = LogManager.get(getClass()); @@ -60,7 +61,6 @@ public DbService(String id, App app) { super(app); E.NPE(id); this.id = id; - this.entityMetaInfoRepo = app().entityMetaInfoRepo().forDb(id); } /** @@ -77,8 +77,7 @@ public String id() { * @return model classes talk to this datasource */ public Set entityClasses() { - EntityMetaInfoRepo repo = app().entityMetaInfoRepo().forDb(id); - return null == repo ? C.set() : repo.entityClasses(); + return entityMetaInfoRepo().entityClasses(); } @Override @@ -116,7 +115,7 @@ public final String entityName(Class modelClass) { } protected final EntityClassMetaInfo classInfo(Class modelClass) { - return entityMetaInfoRepo.classMetaInfo(modelClass); + return entityMetaInfoRepo().classMetaInfo(modelClass); } public final String lastModifiedColumn(Class modelClass) { @@ -143,9 +142,6 @@ public final String columnName(Field field) { return classInfo(field.getDeclaringClass()).fieldInfo(field.getName()).columnName(); } - - - /** * Utility method to find the ID type from Model type. Could be used by sub class on {@link #defaultDao(Class)} * method implementation @@ -168,4 +164,15 @@ protected static Class findModelIdTypeByAnnotation(Class modelType, Class< return null; } + protected EntityMetaInfoRepo entityMetaInfoRepo() { + if (null == entityMetaInfoRepo || MasterEntityMetaInfoRepo.EMPTY() == entityMetaInfoRepo) { + synchronized (this) { + if (null == entityMetaInfoRepo) { + entityMetaInfoRepo = app().entityMetaInfoRepo().forDb(id); + } + } + } + return entityMetaInfoRepo; + } + } diff --git a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java index 90b4bdec2..f44ccd669 100644 --- a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java +++ b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java @@ -201,4 +201,8 @@ public EntityMetaInfoRepo forDb(String dbId) { } return null != repo ? repo : EMPTY; } + + public static EntityMetaInfoRepo EMPTY() { + return EMPTY; + } } diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index c68a317a5..45a55bd03 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -263,12 +263,16 @@ private static Object _load(URL url, BeanSpec spec, Object hint) { IO.ReadStageBase readStage; if (Act.appConfig().resourceFiltering()) { - if (isBinary(spec)) { + if (isBinary(url, spec)) { readStage = new IO.UrlReadStage(url); } else { String content = IO.readContentAsString(url); content = $$.processStringSubstitution(content); readStage = new IO.CharSequenceReadStage(content); + MimeType mimeType = MimeType.findByFileExtension(S.fileExtension(url.getFile())); + if (null != mimeType) { + readStage.contentType(mimeType); + } } } else { readStage = new IO.UrlReadStage(url); @@ -534,6 +538,13 @@ private static URL loadResource(String path) { } } + private static boolean isBinary(URL url, BeanSpec spec) { + if (isBinary(spec)) { + return true; + } + return SObject.of(url).isBinary(); + } + public static boolean isBinary(BeanSpec spec) { Class type = spec.rawType(); if (byte[].class == type) { diff --git a/src/main/java/act/util/StringUtils.java b/src/main/java/act/util/StringUtils.java index 4dca4ba0b..dbfd6c34b 100644 --- a/src/main/java/act/util/StringUtils.java +++ b/src/main/java/act/util/StringUtils.java @@ -21,6 +21,7 @@ */ import act.Act; +import act.app.App; import com.alibaba.fastjson.JSON; import org.osgl.$; import org.osgl.util.C; @@ -36,7 +37,8 @@ class StringUtils { static $.Transformer evaluator = new $.Transformer() { @Override public String transform(String s) { - return S.string(System.getProperty(s)); + App app = Act.app(); + return S.string(null != app ? app.config().get(s) : System.getProperty(s)); } }; @@ -60,7 +62,7 @@ public static String processStringSubstitution(String s, $.Func1 buf.append(s.substring(a, z)); n = s.indexOf("}", z); a = n + 1; - String key = s.substring(z + 2, a); + String key = s.substring(z + 2, a - 1); buf.append(evaluator.apply(key)); n = s.indexOf("${", a); if (n < 0) { @@ -71,23 +73,13 @@ public static String processStringSubstitution(String s, $.Func1 } } - public static class Foo { - public String name; - } - - private static List convert(List source, Class targetType) { - List sink = new ArrayList<>(); - return $.deepCopy(source).targetGenericType(new TypeReference>() { - }).to(sink); - } - public static void main(String[] args) { - Map map = C.Map("name", "foo"); - List source = C.newList(map); - List sink = convert(source, Foo.class); - Foo foo = sink.get(0); - System.out.println(JSON.toJSONString(foo)); - + String s = "{\n" + + " \"buildNumber\": \"${1151.buildNumber}\",\n" + + " \"cliPort\": \"${cli.port}\"\n" + + "}\n"; + System.setProperty("cli.port", "5461"); + System.out.println(processStringSubstitution(s)); } diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 674bb7f01..c645dc239 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -48,6 +48,7 @@ org.actframework act-hibernate + 1.7.0-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/java/stress_test/Client.java b/testapps/GHIssues/src/main/java/stress_test/Client.java new file mode 100644 index 000000000..9ee1b1b7b --- /dev/null +++ b/testapps/GHIssues/src/main/java/stress_test/Client.java @@ -0,0 +1,61 @@ +package stress_test; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.osgl.$; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +public class Client { + + public static void main(String[] args) throws Exception { + long ts = $.ms(); + final OkHttpClient http = new OkHttpClient.Builder().build(); + final AtomicInteger backlog = new AtomicInteger(100000); + final AtomicInteger errors = new AtomicInteger(0); + final AtomicInteger exceptions = new AtomicInteger(0); + ExecutorService exec = Executors.newFixedThreadPool(100); + for (int i = 0; i < 150; ++i) { + exec.submit(new Runnable() { + @Override + public void run() { + while (backlog.getAndDecrement() > 0) { + //String url = "http://localhost:5460/x0"; + //String url = "http://localhost:8080/y"; + //String url = "http://localhost:5460/y"; + String url = "http://localhost:8080/x"; + Request request = new Request.Builder().url(url).get().build(); + try { + Response resp = http.newCall(request).execute(); +// String str = resp.body().string(); +// try { +// JSONObject json = JSON.parseObject(str); +// if (!json.getString("name").endsWith("b")) { +// errors.incrementAndGet(); +// } +// } catch (Exception e0) { +// exceptions.incrementAndGet(); +// } finally { +// resp.close(); +// } + } catch (Exception e) { + exceptions.incrementAndGet(); + } + } + } + }); + } + exec.shutdown(); + if (!exec.awaitTermination(1000, TimeUnit.SECONDS)) { + System.out.println("execution service timeout"); + } + System.out.printf("errors: %s\n", errors.get()); + System.out.printf("exceptions: %s\n", exceptions.get()); + System.out.printf("It takes %sms to finish\n", $.ms() - ts); + } + +} diff --git a/testapps/GHIssues/src/main/resources/asset/1151.json b/testapps/GHIssues/src/main/resources/asset/1151.json index 328c30d89..f0224ef82 100644 --- a/testapps/GHIssues/src/main/resources/asset/1151.json +++ b/testapps/GHIssues/src/main/resources/asset/1151.json @@ -1,5 +1,5 @@ { - "buildNumber": "${buildNumber}", + "buildNumber": "${1151.buildNumber}", "cliPort": "${cli.port}" } diff --git a/testapps/GHIssues/src/main/resources/conf/1151.properties b/testapps/GHIssues/src/main/resources/conf/1151.properties index e74fc6eb7..bcba7eba1 100644 --- a/testapps/GHIssues/src/main/resources/conf/1151.properties +++ b/testapps/GHIssues/src/main/resources/conf/1151.properties @@ -1 +1,2 @@ -resource.filtering=true \ No newline at end of file +resource.filtering=true +1151.buildNumber=1151 From 11bfa13621e9ea00704efe03f1f6977f829b918e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 30 Oct 2019 08:21:46 +1100 Subject: [PATCH 539/730] deprecate cors.headers configuration; update test apps --- VERSION_MATRIX.md | 36 +++++++++---------- legacy-testapp/pom.xml | 4 +-- .../src/main/java/testapp/TestApp.java | 6 ++-- .../test/java/testapp/endpoint/CORSTest.java | 5 ++- .../testapp/endpoint/HelloControllerTest.java | 4 +-- .../java/act/app/conf/AppConfigurator.java | 13 ++++++- src/main/java/act/conf/AppConfig.java | 36 ++++++++++++++----- src/main/java/act/conf/AppConfigKey.java | 10 ++++-- src/main/java/act/conf/Config.java | 6 +++- .../act/sys/SystemAvailabilityMonitor.java | 4 +-- testapps/GHIssues/pom.xml | 9 +---- .../src/main/java/stress_test/Client.java | 6 ++-- 12 files changed, 88 insertions(+), 51 deletions(-) diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 3aa72a8f6..0771ee3f4 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,25 +1,25 @@ # Version Matrix -| act | 1.8.19 | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | 1.8.28 | +| act | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | | --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.5.4 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | -| beetl | 1.4.7 | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | -| beetlsql | 1.5.7 | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | 1.7.1 | -| ebean-java7 | 1.7.5 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.9 | -| ebean(java8) | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.10 | -| eclipselink(java8) | 1.5.7 | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | -| excel | 1.5.0 | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.2 | -| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | -| hibernate | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | +| aaa | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | 1.6.1 | +| beetl | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | 1.6.2 | +| beetlsql | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | +| ebean-java7 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | +| ebean(java8) | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.10 | 1.7.10 | +| eclipselink(java8) | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.6.1 | +| excel | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.2 | 1.7.2 | +| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.3.7 | +| hibernate | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.6.1 | | jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | -| jpa-common | 1.5.6 | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | -| morphia | 1.6.6 | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.3 | -| mustache(java8) | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | -| social | 0.12.5 | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | -| sql-common | 1.4.4 | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.1 | -| storage(java8) | 0.13.5 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | -| thymeleaf | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | -| velocity | 1.3.5 | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | +| jpa-common | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.6.1 | +| morphia | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.3 | 1.7.3 | +| mustache(java8) | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | +| social | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | +| sql-common | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.1 | 1.5.1 | +| storage(java8) | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | 0.14.0 | +| thymeleaf | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | +| velocity | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.3.7 | ## Note diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index da446c174..4b805ff18 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,9 +73,9 @@ UTF-8 UTF-8 - 1.8.28-SNAPSHOT + 1.8.29-SNAPSHOT [0.13.0, 2.0.0) - 1.7.2 + 1.8.0-SNAPSHOT testapp.TestApp diff --git a/legacy-testapp/src/main/java/testapp/TestApp.java b/legacy-testapp/src/main/java/testapp/TestApp.java index 7f9355a54..1523b0a32 100644 --- a/legacy-testapp/src/main/java/testapp/TestApp.java +++ b/legacy-testapp/src/main/java/testapp/TestApp.java @@ -15,7 +15,8 @@ public class TestApp extends AppConfigurator { public static class GLOBAL_CORS { public static final String ALLOW_ORIGIN = "google.com"; - public static final String ALLOW_EXPOSE_HEADER = "X-Header-One"; + public static final String ALLOW_HEADER = "X-Header-One"; + public static final String EXPOSE_HEADER = "X-Header-Two"; public static final String MAX_AGE = "100"; } @@ -26,7 +27,8 @@ public void configure() { sessionMapper(new CookieAndHeaderSessionMapper(app().config())); cors() .allowOrigin(ALLOW_ORIGIN) - .allowAndExposeHeaders(ALLOW_EXPOSE_HEADER) + .allowHeaders(ALLOW_HEADER) + .exposeHeaders(EXPOSE_HEADER) .maxAge(Integer.parseInt(MAX_AGE)); } diff --git a/legacy-testapp/src/test/java/testapp/endpoint/CORSTest.java b/legacy-testapp/src/test/java/testapp/endpoint/CORSTest.java index 603de2b39..66cff7f1d 100644 --- a/legacy-testapp/src/test/java/testapp/endpoint/CORSTest.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/CORSTest.java @@ -3,8 +3,7 @@ import org.junit.Test; import static org.osgl.http.H.Header.Names.*; -import static testapp.TestApp.GLOBAL_CORS.ALLOW_EXPOSE_HEADER; -import static testapp.TestApp.GLOBAL_CORS.MAX_AGE; +import static testapp.TestApp.GLOBAL_CORS.*; public class CORSTest extends EndpointTester { @@ -15,7 +14,7 @@ public void testFoo() throws Exception { checkHeader(ACCESS_CONTROL_ALLOW_HEADERS, CORSTestBed.ALLOW_HEADERS); checkHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET"); checkHeader(ACCESS_CONTROL_MAX_AGE, MAX_AGE); - checkHeader(ACCESS_CONTROL_EXPOSE_HEADERS, ALLOW_EXPOSE_HEADER); + checkHeader(ACCESS_CONTROL_EXPOSE_HEADERS, EXPOSE_HEADER); } @Test diff --git a/legacy-testapp/src/test/java/testapp/endpoint/HelloControllerTest.java b/legacy-testapp/src/test/java/testapp/endpoint/HelloControllerTest.java index 0f5c8d670..22bc47b11 100644 --- a/legacy-testapp/src/test/java/testapp/endpoint/HelloControllerTest.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/HelloControllerTest.java @@ -62,8 +62,8 @@ public void testGlobalCORS() throws Exception { private void verifyGlobalCORS() throws Exception { checkHeader(ACCESS_CONTROL_ALLOW_ORIGIN, ALLOW_ORIGIN); if (reqBuilder.method() == H.Method.OPTIONS) { - checkHeader(ACCESS_CONTROL_ALLOW_HEADERS, ALLOW_EXPOSE_HEADER); - checkHeader(ACCESS_CONTROL_EXPOSE_HEADERS, ALLOW_EXPOSE_HEADER); + checkHeader(ACCESS_CONTROL_ALLOW_HEADERS, ALLOW_HEADER); + checkHeader(ACCESS_CONTROL_EXPOSE_HEADERS, EXPOSE_HEADER); checkHeader(ACCESS_CONTROL_MAX_AGE, MAX_AGE); checkHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET"); } diff --git a/src/main/java/act/app/conf/AppConfigurator.java b/src/main/java/act/app/conf/AppConfigurator.java index 4204967e4..67d9ae469 100644 --- a/src/main/java/act/app/conf/AppConfigurator.java +++ b/src/main/java/act/app/conf/AppConfigurator.java @@ -228,8 +228,19 @@ public CorsSetting exposeHeaders(String ... headers) { return this; } + /** + * This method is deprecated. Please use + * * {@link #allowHeaders(String...)} and + * * {@link #exposeHeaders(String...)} + * + * @param headers + * @return + */ + @Deprecated public CorsSetting allowAndExposeHeaders(String ... headers) { - headersBoth.addAll(C.listOf(headers)); + List headerList = C.listOf(headers); + headersAllowed.addAll(headerList); + headersExpose.addAll(headerList); return this; } diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 1fc2817f0..f7bb74456 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -28,6 +28,7 @@ import act.act_messages; import act.app.*; import act.app.conf.AppConfigurator; +import act.app.event.AppConfigLoaded; import act.app.event.SysEventId; import act.app.util.NamedPort; import act.cli.CliOverHttpAuthority; @@ -37,6 +38,7 @@ import act.data.DateTimeType; import act.db.util.SequenceNumberGenerator; import act.db.util._SequenceNumberGenerator; +import act.event.SysEventListenerBase; import act.handler.*; import act.handler.event.ResultEvent; import act.i18n.I18n; @@ -136,7 +138,6 @@ public String transform(String message) { */ public AppConfig(Map configuration) { super(configuration); - routerRegexMacroLookup = new RouterRegexMacroLookup(this); } public AppConfig() { @@ -147,6 +148,12 @@ public AppConfig app(App app) { E.NPE(app); this.app = app; AppConfigKey.onApp(app); + app.eventBus().bind(SysEventId.CONFIG_LOADED, new SysEventListenerBase() { + @Override + public void on(AppConfigLoaded event) throws Exception { + routerRegexMacroLookup = new RouterRegexMacroLookup(AppConfig.this); + } + }); return this; } @@ -464,6 +471,7 @@ private void _mergeCorsOrigin(AppConfig conf) { private String corsHeaders; + @Deprecated protected T corsHeaders(String s) { this.corsHeaders = s; return me(); @@ -491,9 +499,15 @@ protected T corsHeadersExpose(String s) { public String corsExposeHeaders() { if (null == corsHeadersExpose) { - corsHeadersExpose = get(CORS_HEADERS_EXPOSE, - "Act-Session-Expires, Authorization, X-XSRF-Token, X-CSRF-Token, " + - "Location, Link, Content-Disposition, Content-Length"); + corsHeadersExpose = get(CORS_HEADERS_EXPOSE,""); + if (S.blank(corsHeadersExpose)) { + corsHeadersExpose = corsHeaders(); + if (S.notBlank(corsHeadersExpose)) { + warn("`cors.headers` is deprecated. Please use `cors.headers.expose` instead"); + } else { + corsHeadersExpose = "Act-Session-Expires, Authorization, X-XSRF-Token, X-CSRF-Token, Location, Link, Content-Disposition, Content-Length"; + } + } } return corsHeadersExpose; } @@ -527,15 +541,21 @@ private void _mergeCorsOptionCheck(AppConfig conf) { private String corsHeadersAllowed; protected T corsAllowHeaders(String s) { - this.corsHeadersExpose = s; + this.corsHeadersAllowed = s; return me(); } public String corsAllowHeaders() { if (null == corsHeadersAllowed) { - corsHeadersAllowed = get(CORS_HEADERS_ALLOWED, - "X-HTTP-Method-Override, X-Requested-With, " + - "Authorization, X-XSRF-Token, X-CSRF-Token"); + corsHeadersAllowed = get(CORS_HEADERS_ALLOWED, ""); + if (S.isBlank(corsHeadersAllowed)) { + corsHeadersAllowed = corsHeaders(); + if (S.notBlank(corsHeadersAllowed)) { + warn("`cors.headers` is deprecated. Please use `cors.headers.allowed` instead"); + } else { + corsHeadersAllowed = "X-HTTP-Method-Override, X-Requested-With, Authorization, X-XSRF-Token, X-CSRF-Token"; + } + } } return corsHeadersAllowed; } diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 757f4b5a9..2d6a3e085 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -313,8 +313,14 @@ public enum AppConfigKey implements ConfigKey { * {@code act.cors.headers} specifies both `Access-Control-Expose-Headers` * and `Access-Control-Allow-Headers` * + * This configuration is deprecated, it is replaced by + * + * * {@link #CORS_HEADERS_EXPOSE} + * * {@link #CORS_HEADERS_ALLOWED} + * * Default value: `Content-Type, X-HTTP-Method-Override` */ + @Deprecated CORS_HEADERS("cors.headers"), /** @@ -322,7 +328,7 @@ public enum AppConfigKey implements ConfigKey { * Note this setting will overwrite the setting of {@link #CORS_HEADERS} if * it is set * - * Default value: empty + * Default value: `Act-Session-Expires, Authorization, X-XSRF-Token, X-CSRF-Token, Location, Link, Content-Disposition, Content-Length` */ CORS_HEADERS_EXPOSE("cors.headers.expose"), @@ -331,7 +337,7 @@ public enum AppConfigKey implements ConfigKey { * Note this setting will overwrite the setting of {@link #CORS_HEADERS} if * it is set * - * Default value: empty + * Default value: `X-HTTP-Method-Override, X-Requested-With, Authorization, X-XSRF-Token, X-CSRF-Token` */ CORS_HEADERS_ALLOWED("cors.headers.allowed"), diff --git a/src/main/java/act/conf/Config.java b/src/main/java/act/conf/Config.java index 836bb5e40..a7c3eb50b 100644 --- a/src/main/java/act/conf/Config.java +++ b/src/main/java/act/conf/Config.java @@ -84,7 +84,11 @@ public T get(ConfigKey key, T def) { if (o == NULL) { return null; } else { - return (T) o; + if (null != def) { + return (T) $.convert(o).to(def.getClass()); + } else { + return (T) o; + } } } diff --git a/src/main/java/act/sys/SystemAvailabilityMonitor.java b/src/main/java/act/sys/SystemAvailabilityMonitor.java index de7d668b4..bc293b422 100644 --- a/src/main/java/act/sys/SystemAvailabilityMonitor.java +++ b/src/main/java/act/sys/SystemAvailabilityMonitor.java @@ -67,8 +67,8 @@ public class SystemAvailabilityMonitor extends $.Visitor implements Runn @Override public void visit(GcInfo gcInfo) throws Lang.Break { currentCounter.incrementAndGet(); - if (smallWindowSum.incrementAndGet() > 2) { - // there are at least 3 gc hapened within last 2s + if (smallWindowSum.incrementAndGet() > 10) { + // there are at least 11 gc happened within last 2s pauseNow(); wakeUp(); } diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index c645dc239..37e405ef0 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.28.1 + 1.8.29.0-SNAPSHOT @@ -25,7 +25,6 @@ org.actframework act - 1.8.29-SNAPSHOT org.actframework @@ -35,11 +34,6 @@ com.zaxxer HikariCP - - org.actframework - act-jpa-common - 1.7.0-SNAPSHOT - @@ -48,7 +42,6 @@ org.actframework act-hibernate - 1.7.0-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/java/stress_test/Client.java b/testapps/GHIssues/src/main/java/stress_test/Client.java index 9ee1b1b7b..dab0eb5e9 100644 --- a/testapps/GHIssues/src/main/java/stress_test/Client.java +++ b/testapps/GHIssues/src/main/java/stress_test/Client.java @@ -1,5 +1,7 @@ package stress_test; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -24,10 +26,10 @@ public static void main(String[] args) throws Exception { @Override public void run() { while (backlog.getAndDecrement() > 0) { - //String url = "http://localhost:5460/x0"; + String url = "http://localhost:5460/y"; //String url = "http://localhost:8080/y"; //String url = "http://localhost:5460/y"; - String url = "http://localhost:8080/x"; + //String url = "http://localhost:8080/x"; Request request = new Request.Builder().url(url).get().build(); try { Response resp = http.newCall(request).execute(); From 70fb5991f2dd0e34fdf3b187c4e985e4d9f02ad4 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 30 Oct 2019 08:36:48 +1100 Subject: [PATCH 540/730] fix ut issue --- src/main/java/act/conf/AppConfig.java | 2 ++ src/test/java/act/TestServerBootstrapClassLoader.java | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index f7bb74456..cb45e3595 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -140,8 +140,10 @@ public AppConfig(Map configuration) { super(configuration); } + // for unit test public AppConfig() { this((Map) System.getProperties()); + this.routerRegexMacroLookup = new RouterRegexMacroLookup(this); } public AppConfig app(App app) { diff --git a/src/test/java/act/TestServerBootstrapClassLoader.java b/src/test/java/act/TestServerBootstrapClassLoader.java index 32d6cb650..427adda1b 100644 --- a/src/test/java/act/TestServerBootstrapClassLoader.java +++ b/src/test/java/act/TestServerBootstrapClassLoader.java @@ -51,6 +51,10 @@ protected byte[] tryLoadResource(String name) { @Override protected URL findResource(String name) { - return Thread.currentThread().getContextClassLoader().getResource(name); + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + if (cl == this) { + cl = Act.class.getClassLoader(); + } + return cl.getResource(name); } } From ce46f7645b494d644074f850a759231557b718d7 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 3 Nov 2019 08:47:30 +1100 Subject: [PATCH 541/730] fix #1235 and #1236 --- CHANGELOG.md | 2 + pom.xml | 2 +- src/main/java/act/apidoc/Endpoint.java | 12 +++- src/main/java/act/apidoc/SampleData.java | 15 +++- .../java/act/apidoc/SampleDataProvider.java | 7 +- src/main/java/act/controller/Controller.java | 9 ++- src/main/java/act/view/QrCodeView.java | 72 +++++++++++++++++++ .../src/main/java/ghissues/Gh1236.java | 36 ++++++++++ 8 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 src/main/java/act/view/QrCodeView.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1236.java diff --git a/CHANGELOG.md b/CHANGELOG.md index befbaee75..2ead53eab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.29** +* Allow app to specify sample data provider for any field #1236 +* Enable render QRCode using pseudo accept parameter #1235 * Creating a system self healing mechanism to handle OOM caused by too many dangling connention #1234 * Add commonly used cron expression constants #1229 * Ehcache not working in Act since 1.8.27 #1220 diff --git a/pom.xml b/pom.xml index 09b3ec745..f26c3d8ce 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ 1.1.0.Final 1.4.27.Final 1.25 - 3.3.3 + 3.4.0 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index c85825dc5..8ecf2a40b 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -659,6 +659,10 @@ private String generateSampleQuery(BeanSpec spec, Map typeParamLo return bindName + "="; } if (null != stringValueResolver(type)) { + SampleData.ProvidedBy annoProvided = spec.getAnnotation(SampleData.ProvidedBy.class); + if (null != annoProvided) { + return bindName + "=" + Act.getInstance(annoProvided.value()).get(); + } SampleData.Category anno = spec.getAnnotation(SampleData.Category.class); SampleDataCategory category = null != anno ? anno.value() : null; return bindName + "=" + sampleDataProviderManager.getSampleData(category, bindName, String.class); @@ -721,9 +725,13 @@ public static Object generateSampleData( return null; } } - SampleData.Category anno = spec.getAnnotation(SampleData.Category.class); - SampleDataCategory category = null != anno ? anno.value() : null; Class classType = spec.rawType(); + SampleData.ProvidedBy annoProvided = spec.getAnnotation(SampleData.ProvidedBy.class); + if (null != annoProvided) { + return Act.getInstance(annoProvided.value()).get(); + } + SampleData.Category annoCateogry = spec.getAnnotation(SampleData.Category.class); + SampleDataCategory category = null != annoCateogry ? annoCateogry.value() : null; SampleDataProviderManager sampleDataProviderManager = Act.app().sampleDataProviderManager(); Object o = sampleDataProviderManager.getSampleData(category, name, classType, false); if (null != o) { diff --git a/src/main/java/act/apidoc/SampleData.java b/src/main/java/act/apidoc/SampleData.java index 9f755f3dc..1e75b20ed 100644 --- a/src/main/java/act/apidoc/SampleData.java +++ b/src/main/java/act/apidoc/SampleData.java @@ -20,6 +20,7 @@ * #L% */ +import javax.inject.Provider; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -32,7 +33,17 @@ public abstract class SampleData { private SampleData() {} /** - * Marked on an implementation class of {@link SampleDataProvider} + * Mark on a field specify the {@link SampleDataProvider} that + * should be used to generate sample data for the field been marked + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.FIELD) + public @interface ProvidedBy { + Class value(); + } + + /** + * Mark on an implementation class of {@link SampleDataProvider} * to specify the sample data category the provider applied */ @Retention(RetentionPolicy.RUNTIME) @@ -42,7 +53,7 @@ private SampleData() {} } /** - * Marked on an implementation class of {@link SampleDataProvider} + * Mark on an implementation class of {@link SampleDataProvider} * to specify the sample data locale the provider applied */ @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/act/apidoc/SampleDataProvider.java b/src/main/java/act/apidoc/SampleDataProvider.java index f58efcf60..bb9cbfc75 100644 --- a/src/main/java/act/apidoc/SampleDataProvider.java +++ b/src/main/java/act/apidoc/SampleDataProvider.java @@ -23,10 +23,11 @@ import act.util.LogSupport; import org.osgl.util.Generics; +import javax.inject.Provider; import java.lang.reflect.Type; import java.util.List; -public abstract class SampleDataProvider extends LogSupport { +public abstract class SampleDataProvider extends LogSupport implements Provider { private Class targetType; @@ -34,6 +35,10 @@ public SampleDataProvider() { exploreType(); } + /** + * Return the sample data + * @return the sample data + */ public abstract T get(); public Class targetType() { diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index d9e644d12..dbc77b445 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -32,6 +32,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.google.zxing.BarcodeFormat; import org.osgl.$; import org.osgl.Lang; import org.osgl.http.H; @@ -1781,8 +1782,13 @@ public static Result inferPrimitiveResult( return new RenderBinary((byte[]) v); } else { H.Format fmt = actionContext.accept(); + String fmtName = fmt.name(); String s = v instanceof String ? (String) v : $$.toString(v, shouldUseToString); - if (fmt.isText()) { + if (S.eq(fmtName, "qrcode")) { + return new ZXingResult(s, BarcodeFormat.QR_CODE); + } else if (S.eq(fmtName, "barcode")) { + return new ZXingResult(s, BarcodeFormat.CODE_128); + } else if (fmt.isText()) { return RenderText.of(status, fmt, s); } DirectRender dr = Act.viewManager().loadDirectRender(actionContext); @@ -1857,6 +1863,7 @@ public static Result inferResult(File file, ActionContext actionContext) { } public static Result inferResult(ISObject sobj, ActionContext context) { + H.Format.of("qrcode"); if (context.acceptJson()) { return RenderJSON.of(context.successStatus(), sobj.asString()); } else { diff --git a/src/main/java/act/view/QrCodeView.java b/src/main/java/act/view/QrCodeView.java new file mode 100644 index 000000000..16642862d --- /dev/null +++ b/src/main/java/act/view/QrCodeView.java @@ -0,0 +1,72 @@ +package act.view; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.ActionContext; +import com.google.zxing.BarcodeFormat; +import org.osgl.http.H; +import org.osgl.util.S; + +public class QrCodeView extends View { + + private static class Render implements DirectRender { + + private BarcodeFormat fmt; + + Render(BarcodeFormat fmt) { + this.fmt = fmt; + } + + @Override + public void render(Object result, ActionContext context) { + new ZXingResult(S.string(result), fmt).applyMessage(context.req(), context.resp()); + } + } + + private static final Render QR_RENDER = new Render(BarcodeFormat.QR_CODE); + private static final Render BARCODE_RENDER = new Render(BarcodeFormat.CODE_128); + + @Override + public String name() { + return "qrcode"; + } + + @Override + protected Template loadTemplate(String resourcePath) { + return null; + } + + @Override + protected Template loadInlineTemplate(String content) { + return null; + } + + @Override + public DirectRender directRenderFor(H.Format acceptType) { + if (S.eq(acceptType.name(), "qrcode", S.IGNORECASE)) { + return QR_RENDER; + } else if (S.eq(acceptType.name(), "barcode", S.IGNORECASE)) { + return BARCODE_RENDER; + } + return null; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1236.java b/testapps/GHIssues/src/main/java/ghissues/Gh1236.java new file mode 100644 index 000000000..33a92baf5 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1236.java @@ -0,0 +1,36 @@ +package ghissues; + +import act.apidoc.SampleData; +import act.apidoc.SampleDataProvider; +import act.controller.ExpressController; +import act.controller.annotation.UrlContext; +import act.handler.NonBlock; +import org.osgl.$; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.S; + +@UrlContext("1236") +@ExpressController +public class Gh1236 extends BaseController { + + private static class FooNameProvider extends SampleDataProvider { + @Override + public String get() { + return $.random("foo", "bar", "zee"); + } + } + + public static class Foo { + @SampleData.ProvidedBy(FooNameProvider.class) + public String name; + } + + /** + * Return `Foo` + */ + @GetAction + public Foo test() { + return new Foo(); + } + +} From 2777991f2cd1cf7ffe7d41ce8a4d89f654b06f7a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 3 Nov 2019 12:20:46 +1100 Subject: [PATCH 542/730] SimpleRestfulServiceBase - allow developer to inject logic #1237 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/Endpoint.java | 50 +++++--- src/main/java/act/apidoc/SampleData.java | 36 +++++- .../app/util/SimpleRestfulServiceBase.java | 116 +++++++++++++++--- src/main/java/act/test/Test.java | 33 ++--- .../src/main/java/ghissues/Gh1236.java | 31 ++++- 6 files changed, 208 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ead53eab..671769fc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.29** +* SimpleRestfulServiceBase - allow developer to inject logic #1237 * Allow app to specify sample data provider for any field #1236 * Enable render QRCode using pseudo accept parameter #1235 * Creating a system self healing mechanism to handle OOM caused by too many dangling connention #1234 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 8ecf2a40b..d5127bfdf 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -503,10 +503,9 @@ private void exploreParamInfo(Method method, Map typeParamLookup, continue; } Object sample; - if (null != info.defaultValue) { + sample = generateSampleData(info.beanSpec, typeParamLookup, new HashSet(), new ArrayList(), false); + if (null == sample && null != info.defaultValue) { sample = resolver.resolve(info.defaultValue, info.beanSpec.rawType()); - } else { - sample = generateSampleData(info.beanSpec, typeParamLookup, new HashSet(), new ArrayList(), false); } if (H.Method.GET == this.httpMethod) { String query = generateSampleQuery(info.beanSpec.withoutName(), typeParamLookup, info.bindName, new HashSet(), C.newList()); @@ -659,13 +658,7 @@ private String generateSampleQuery(BeanSpec spec, Map typeParamLo return bindName + "="; } if (null != stringValueResolver(type)) { - SampleData.ProvidedBy annoProvided = spec.getAnnotation(SampleData.ProvidedBy.class); - if (null != annoProvided) { - return bindName + "=" + Act.getInstance(annoProvided.value()).get(); - } - SampleData.Category anno = spec.getAnnotation(SampleData.Category.class); - SampleDataCategory category = null != anno ? anno.value() : null; - return bindName + "=" + sampleDataProviderManager.getSampleData(category, bindName, String.class); + return bindName + "=" + sampleDataFromAnnotation(spec, bindName); } List queryPairs = new ArrayList<>(); List fields = $.fieldsOf(type); @@ -682,6 +675,29 @@ private String generateSampleQuery(BeanSpec spec, Map typeParamLo return S.join(queryPairs).by("&").get(); } + private static Object sampleDataFromAnnotation(BeanSpec spec, String bindName) { + SampleData.ProvidedBy annoProvided = spec.getAnnotation(SampleData.ProvidedBy.class); + if (null != annoProvided) { + return Act.getInstance(annoProvided.value()).get(); + } + SampleData.StringList annoStrList = spec.getAnnotation(SampleData.StringList.class); + if (null != annoStrList) { + return $.random(annoStrList.value()); + } + SampleData.IntList annoIntList = spec.getAnnotation(SampleData.IntList.class); + if (null != annoIntList) { + int[] ia = annoIntList.value(); + return $.random(ia); + } + SampleData.DoubleList annoDblList = spec.getAnnotation(SampleData.DoubleList.class); + if (null != annoDblList) { + return $.random(annoDblList.value()); + } + SampleData.Category anno = spec.getAnnotation(SampleData.Category.class); + SampleDataCategory category = null != anno ? anno.value() : null; + return Act.getInstance(SampleDataProviderManager.class).getSampleData(category, bindName, spec.rawType()); + } + private static boolean isCollection(Type type) { if (type instanceof Class) { Class clazz = $.cast(type); @@ -725,18 +741,14 @@ public static Object generateSampleData( return null; } } - Class classType = spec.rawType(); - SampleData.ProvidedBy annoProvided = spec.getAnnotation(SampleData.ProvidedBy.class); - if (null != annoProvided) { - return Act.getInstance(annoProvided.value()).get(); - } - SampleData.Category annoCateogry = spec.getAnnotation(SampleData.Category.class); - SampleDataCategory category = null != annoCateogry ? annoCateogry.value() : null; - SampleDataProviderManager sampleDataProviderManager = Act.app().sampleDataProviderManager(); - Object o = sampleDataProviderManager.getSampleData(category, name, classType, false); + Object o = sampleDataFromAnnotation(spec, name); if (null != o) { return o; } + Class classType = spec.rawType(); + SampleDataProviderManager sampleDataProviderManager = Act.getInstance(SampleDataProviderManager.class); + SampleData.Category anno = spec.getAnnotation(SampleData.Category.class); + SampleDataCategory category = null != anno ? anno.value() : null; try { if (void.class == classType || Void.class == classType || Result.class.isAssignableFrom(classType)) { return null; diff --git a/src/main/java/act/apidoc/SampleData.java b/src/main/java/act/apidoc/SampleData.java index 1e75b20ed..4262d0877 100644 --- a/src/main/java/act/apidoc/SampleData.java +++ b/src/main/java/act/apidoc/SampleData.java @@ -37,17 +37,47 @@ private SampleData() {} * should be used to generate sample data for the field been marked */ @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) + @Target({ElementType.FIELD, ElementType.PARAMETER}) public @interface ProvidedBy { Class value(); } + /** + * Mark on a field specify the list of string that + * can be randomly choosen as sample data for the field + */ + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.FIELD, ElementType.PARAMETER}) + public @interface StringList { + String[] value(); + } + + /** + * Mark on a field specify the list of integer that + * can be randomly choosen as sample data for the field + */ + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.FIELD, ElementType.PARAMETER}) + public @interface IntList { + int[] value(); + } + + /** + * Mark on a field specify the list of double that + * can be randomly choosen as sample data for the field + */ + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.FIELD, ElementType.PARAMETER}) + public @interface DoubleList { + double[] value(); + } + /** * Mark on an implementation class of {@link SampleDataProvider} * to specify the sample data category the provider applied */ @Retention(RetentionPolicy.RUNTIME) - @Target({ElementType.TYPE, ElementType.FIELD}) + @Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER}) public @interface Category { SampleDataCategory value(); } @@ -57,7 +87,7 @@ private SampleData() {} * to specify the sample data locale the provider applied */ @Retention(RetentionPolicy.RUNTIME) - @Target({ElementType.TYPE, ElementType.FIELD}) + @Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER}) public @interface Locale { String value(); } diff --git a/src/main/java/act/app/util/SimpleRestfulServiceBase.java b/src/main/java/act/app/util/SimpleRestfulServiceBase.java index afe768f25..a6ba35b9d 100644 --- a/src/main/java/act/app/util/SimpleRestfulServiceBase.java +++ b/src/main/java/act/app/util/SimpleRestfulServiceBase.java @@ -38,6 +38,7 @@ import org.osgl.util.N; import org.osgl.util.S; +import javax.validation.constraints.NotNull; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; @@ -64,6 +65,79 @@ public SimpleRestfulServiceBase(DAO_TYPE dao) { this.dao = $.requireNotNull(dao); } + /** + * Sub type can override this method to update the query `q` to ensure + * the returned data list is only accessible to the current login user. + * + * The default implementation return directly. + * + * @param q the query object to filter entities been listed. + */ + protected void onListingEntities(Dao.Query q) {} + + /** + * Sub type can override this method to ensure the entity returned is allowed + * as per current login user credential. + * + * In case permission is not allowed, it shall throw out + * {@link org.osgl.mvc.result.Forbidden}. + * + * The default implementation return directly. + * + * @param entity the entity returned. + */ + protected void onGettingEntity(MODEL_TYPE entity) {} + + /** + * Sub type can override this method to ensure creating specified + * model entity is allowed as per current login user credential. + * + * In case permission is not allowed, it shall throw out + * {@link org.osgl.mvc.result.Forbidden}. + * + * It could also add logic to further processing the new entity + * before it is persisted. E.g. associate the entity to the + * current login user via `email` field etc. + * + * The default implementation return directly. + * + * @param entity the entity returned. + */ + protected void onCreatingEntity(MODEL_TYPE entity) {} + + /** + * Sub type can override this method to ensure updating specified + * model entity is allowed as per current login user credential. + * + * In case permission is not allowed, it shall throw out + * {@link org.osgl.mvc.result.Forbidden}. + * + * It could also inject customized updating logic here, e.g. + * if the updating is not coming from a full fledged updating + * data structure, but a simple string, like `description`, + * then sub type implementation could get the query + * parameter from `ActionContext.current().req()` instance and + * finish the updating operation. + * + * The default implementation return directly. + * + * @param entity the entity returned. + */ + protected void onUpdatingEntity(MODEL_TYPE entity) {} + + /** + * Sub type can override this method to ensure deleting specified + * model entity is allowed as per current login user credential. + * + * In case permission is not allowed, it shall throw out + * {@link org.osgl.mvc.result.Forbidden}. + * + * The default implementation return directly. + * + * @param entity the entity returned. + */ + protected void onDeletingEntity(MODEL_TYPE entity) {} + /** * List ${MODEL_TYPE} records, filtered by simple query specifications optionally. * @@ -106,6 +180,7 @@ public Iterable list(int _page, int _pageSize, String _orderBy) { E.illegalArgumentIf(_page < 0, "page number is less than zero"); E.illegalArgumentIf(_pageSize < 0, "page size is less than zero"); Dao.Query q = filter(dao, ActionContext.current()); + onListingEntities(q); if (_pageSize > 0) { q.offset(_page * _pageSize).limit(_pageSize); } @@ -119,46 +194,55 @@ public Iterable list(int _page, int _pageSize, String _orderBy) { /** * Returns a ${MODEL_TYPE} record by id. * - * @param model a URL path variable specify the id of the record to be returned + * @param entity a URL path variable specify the id of the record to be returned * @return a ${MODEL_TYPE} record specified by URL path variable `model` */ - @GetAction("{model}") - public MODEL_TYPE get(@DbBind MODEL_TYPE model) { - return model; + @GetAction("{entity}") + public MODEL_TYPE get(@DbBind MODEL_TYPE entity) { + onGettingEntity(entity); + return entity; } /** * Create a ${MODEL_TYPE} record. * - * @param model the data for the new ${MODEL_TYPE} record. + * @param entity the data for the new ${MODEL_TYPE} record. * @return the id of the new ${MODEL_TYPE} record. */ @PostAction @PropertySpec("id") - public MODEL_TYPE create(MODEL_TYPE model) { - return dao.save(model); + public MODEL_TYPE create(MODEL_TYPE entity) { + onCreatingEntity(entity); + return dao.save(entity); } /** * Update a ${MODEL_TYPE} record by id. * - * @param model the URL path variable specifies the id of the record to be updated. + * @param entity the URL path variable specifies the id of the record to be updated. * @param data the update data that will be applied to the ${MODEL_TYPE} record */ - @PutAction("{model}") - public void update(@DbBind MODEL_TYPE model, MODEL_TYPE data) { - $.merge(data).filter("-id").to(model); - dao.save(model); + @PutAction("{entity}") + public void update(@DbBind @NotNull MODEL_TYPE entity, MODEL_TYPE data) { + onUpdatingEntity(entity); + if (null != data) { + // we need to check if data is null or not as there are cases that + // updating is done by specifying a few query parameter, e.g. + // `description`, `age` etc. + $.merge(data).filter("-id").to(entity); + } + dao.save(entity); } /** * Delete a ${MODEL_TYPE} record by id. * - * @param id the URL path variable specifies the id of the record to be deleted. + * @param entity the URL path variable specifies the id of the record to be deleted. */ - @DeleteAction("{id}") - public void delete(ID_TYPE id) { - dao.deleteById(id); + @DeleteAction("{entity}") + public void delete(@DbBind @NotNull MODEL_TYPE entity) { + onDeletingEntity(entity); + dao.delete(entity); } private void exploreTypes() { diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 3dd11924a..eb906561b 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -324,7 +324,7 @@ public List run(App app, Keyword testId, String partition, boolean shu String label = "Testing"; pb = new ProgressBar(label, gauge.maxHint(), 200, System.out, ProgressBarStyle.UNICODE_BLOCK); } - List toBeRun = new ArrayList<>(scenarios.size()); + List candidates = new ArrayList<>(scenarios.size()); for (Scenario scenario : scenarios.values()) { if (null != testId && $.ne(testId, Keyword.of(scenario.name))) { continue; @@ -335,25 +335,26 @@ public List run(App app, Keyword testId, String partition, boolean shu if (scenario.interactions.isEmpty()) { continue; } - if (!toBeRun.contains(scenario)) { - boolean shouldAdd = true; - for (Scenario other : scenarios.values()) { - if (other == scenario) { - continue; - } - if (other.allDepends.contains(scenario)) { - shouldAdd = false; - break; - } + if (!candidates.contains(scenario)) { + candidates.add(scenario); + } + } + // some scenarios might be run multiple times as they are dependencies. + List toBeRemoved = new ArrayList<>(candidates.size()); + for (Scenario scenario : candidates) { + for (Scenario other : candidates) { + if (other == scenario) { + continue; } - if (shouldAdd) { - toBeRun.add(scenario); + if (other.allDepends.contains(scenario)) { + toBeRemoved.add(scenario); } } } - Collections.sort(toBeRun, new ScenarioComparator(false)); - gauge.updateMaxHint(toBeRun.size() + 1); - for (Scenario scenario : toBeRun) { + candidates.removeAll(toBeRemoved); + Collections.sort(candidates, new ScenarioComparator(false)); + gauge.updateMaxHint(candidates.size() + 1); + for (Scenario scenario : candidates) { if (null != testId) { scenario.ignore = null; } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1236.java b/testapps/GHIssues/src/main/java/ghissues/Gh1236.java index 33a92baf5..6c8b66ce7 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh1236.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1236.java @@ -7,13 +7,21 @@ import act.handler.NonBlock; import org.osgl.$; import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; import org.osgl.util.S; +import javax.inject.Provider; + +/** + * Note there is no automate test for this issue. + * + * One must go to http://localhost:15460/~/api to check if the API + * sample data has been generated correctly + */ @UrlContext("1236") -@ExpressController public class Gh1236 extends BaseController { - private static class FooNameProvider extends SampleDataProvider { + private static class FooNameProvider implements Provider { @Override public String get() { return $.random("foo", "bar", "zee"); @@ -23,14 +31,27 @@ public String get() { public static class Foo { @SampleData.ProvidedBy(FooNameProvider.class) public String name; + + @SampleData.StringList({"a", "b", "c"}) + public String s; + + @SampleData.IntList({1, 2, 3}) + public int i; + + @SampleData.DoubleList({13.0d, 23.7d, 37.3d}) + public double d; } /** * Return `Foo` */ - @GetAction - public Foo test() { - return new Foo(); + @PostAction + public Foo test( + Foo foo, + @SampleData.ProvidedBy(FooNameProvider.class) String bar, + @SampleData.IntList({1, 2, 3, 5, 8}) int n + ) { + return foo; } } From 3f496411a317150a3bda7f88dd771a0c08e78df0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 3 Nov 2019 17:58:44 +1100 Subject: [PATCH 543/730] update osgl dependency SNAPSHOT version to release version; prepare for 1.8.29 release --- CHANGELOG.md | 2 +- pom.xml | 16 +++++----- testapps/GHIssues/pom.xml | 9 ++++-- .../src/main/java/ghissues/Gh830.java | 30 ------------------- 4 files changed, 15 insertions(+), 42 deletions(-) delete mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh830.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 671769fc7..e41299cf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.29** +**1.8.29** 03/Nov/2019 * SimpleRestfulServiceBase - allow developer to inject logic #1237 * Allow app to specify sample data provider for any field #1236 * Enable render QRCode using pseudo accept parameter #1235 diff --git a/pom.xml b/pom.xml index f26c3d8ce..56f08d713 100644 --- a/pom.xml +++ b/pom.xml @@ -66,20 +66,20 @@ 3.12.1 - 1.21.0-SNAPSHOT - 1.8.0-SNAPSHOT - 1.11.0 - 1.11.0-SNAPSHOT - 1.11.0-SNAPSHOT - 1.9.0 - 1.4.0 + 1.21.0 + 1.8.0 + 1.12.0 + 1.11.0 + 1.11.0 + 1.10.0 + 1.5.0 0.0.1 1.11.9 1.3.0 1.1.0.Final 1.4.27.Final 1.25 - 3.4.0 + 3.3.3
                                                                                                                                                                              diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 37e405ef0..f76681956 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.29.0-SNAPSHOT + 1.8.29.0 @@ -28,11 +28,11 @@
                                                                                                                                                                              org.actframework - act-excel + act-excel-java7 com.zaxxer - HikariCP + HikariCP-java7 @@ -47,11 +47,14 @@ org.actframework act-storage
                                                                                                                                                                              + + org.actframework act-aaa diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh830.java b/testapps/GHIssues/src/main/java/ghissues/Gh830.java deleted file mode 100644 index 197705412..000000000 --- a/testapps/GHIssues/src/main/java/ghissues/Gh830.java +++ /dev/null @@ -1,30 +0,0 @@ -package ghissues; - -import act.controller.annotation.UrlContext; -import cn.hutool.http.HttpUtil; -import org.osgl.mvc.annotation.PostAction; - -import java.util.HashMap; -import java.util.Map; - -@UrlContext("830") -public class Gh830 extends BaseController { - - @PostAction("svc/{url}") - public String server(String url,String dataJson) { - info("data: " + dataJson); - info("url: " + url); - return url; - } - - @PostAction("client/{url}") - public String client(String url, String dataJson) { - Map map = new HashMap(); - map.put("dataJson", dataJson); - String post = HttpUtil.post("http://localhost:5460/830/svc/" + url, map); - info("response from server: " + post); - return post; - } - - -} From fc12d905f010c0ee2b925a70ec9584c1a182140e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 3 Nov 2019 20:17:32 +1100 Subject: [PATCH 544/730] fix Config issue with type casting --- pom.xml.releaseBackup | 365 ++++++++++++++++++++++++++ src/main/java/act/conf/Config.java | 2 +- src/main/java/act/test/func/Func.java | 35 ++- testapps/GHIssues/pom.xml | 2 +- 4 files changed, 399 insertions(+), 5 deletions(-) create mode 100644 pom.xml.releaseBackup diff --git a/pom.xml.releaseBackup b/pom.xml.releaseBackup new file mode 100644 index 000000000..56f08d713 --- /dev/null +++ b/pom.xml.releaseBackup @@ -0,0 +1,365 @@ + + + + + 4.0.0 + + org.actframework + act + jar + 1.8.29-SNAPSHOT + + ACT Framework + The ACT full stack MVC framework + http://actframework.org/ + 2014 + + + org.osgl + parent + 1.0.0-BETA-5 + + + + ActFramework + http://actframework.org + + + + git@github.com:actframework/actframework.git + + 1.4 + 0.7.2 + 2.0.2-beta + + 5.0.5 + 1.2 + 1.3.3 + 4.6.1 + 1.2.62 + 1.1.2 + 0.7 + 1.16 + 2.4.0 + 1 + 1.5.0-b01 + 0.0.8 + 2.14.6 + 1.0.0.Final + 2.10.1 + 1.12.1 + + + 3.12.1 + + 1.21.0 + 1.8.0 + 1.12.0 + 1.11.0 + 1.11.0 + 1.10.0 + 1.5.0 + 0.0.1 + 1.11.9 + 1.3.0 + 1.1.0.Final + 1.4.27.Final + 1.25 + 3.3.3 + + + + scm:git:${scm.url} + scm:git:${scm.url} + ${scm.url} + + + + ${project.artifactId}-${project.version} + + + src/main/resources + true + + **/*.version + **/*.api-book + **/*.properties + **/*.css + **/*.csv + **/*.html + **/*.js + **/*.json + **/*.list + **/*.tag + **/*.txt + **/*.xml + **/*.yml + **/*.yaml + **/*.tag + **/*.svg + rythm/** + *.flf + + + + src/main/resources + false + + **/*.gif + **/*.png + **/*.jpg + **/*.jpeg + **/*.doc + **/*.docx + **/*.xls + **/*.xlsx + **/*.ppt + **/*.pptx + **/*.pdf + **/*.ico + + + + + + + + + org.easytesting + fest-assert + ${fest-assert.version} + test + + + + com.auth0 + java-jwt + 3.8.0 + test + + + + com.google.code.maven-play-plugin.org.playframework + play + 1.4.0 + test + + + + + org.mockito + mockito-core + 2.0.2-beta + test + + + + com.carrotsearch + junit-benchmarks + ${junit-benchmarks.version} + test + + + + javax.validation + validation-api + ${validation-api.version} + + + + javax.mail + mail + ${javax.mail.version} + + + + org.jclarion + image4j + ${image4j.version} + + + + javax.enterprise + cdi-api + ${cdi-api.version} + + + + com.github.javaparser + javaparser-core + ${javaparser.version} + + + + com.google.zxing + javase + ${zxing.javase.version} + + + com.github.jai-imageio + jai-imageio-core + + + + + + org.fusesource.jansi + jansi + ${jansi.version} + + + + com.github.lalyos + jfiglet + ${jfiglet.version} + + + + org.jsoup + jsoup + ${jsoup.version} + + + + com.github.bingoohuang + patchca + ${patcha.version} + + + + org.actframework + act-asm + ${act-asm.version} + + + + org.apache.bval + org.apache.bval.bundle + ${bval.version} + + + + com.alibaba + fastjson + ${fastjson.version} + + + + io.undertow + undertow-core + ${undertow.version} + + + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + + + + jline + jline + ${jline.version} + + + + org.eclipse.jdt.core.compiler + ecj + ${ecj.version} + + + + com.esotericsoftware + reflectasm + ${reflectasm.version} + + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + + + + joda-time + joda-time + ${joda-time.version} + + + + org.yaml + snakeyaml + ${snakeyaml.version} + + + + org.osgl + genie + ${osgl-genie.version} + + + + org.osgl + osgl-tool + ${osgl-tool.version} + + + + org.osgl + osgl-cache + ${osgl-cache.version} + + + + org.osgl + osgl-mvc + ${osgl-mvc.version} + + + + org.osgl + osgl-http + ${osgl-http.version} + + + + org.osgl + osgl-storage + ${osgl-storage.version} + + + + org.osgl + osgl-tool-ext + ${osgl-tool-ext.version} + + + + org.rythmengine + rythm-engine + ${rythmengine.version} + + + + org.hibernate.javax.persistence + hibernate-jpa-2.1-api + ${jpa.version} + + + + + diff --git a/src/main/java/act/conf/Config.java b/src/main/java/act/conf/Config.java index a7c3eb50b..7df5187a2 100644 --- a/src/main/java/act/conf/Config.java +++ b/src/main/java/act/conf/Config.java @@ -84,7 +84,7 @@ public T get(ConfigKey key, T def) { if (o == NULL) { return null; } else { - if (null != def) { + if (null != def && $.isSimpleType(o.getClass())) { return (T) $.convert(o).to(def.getClass()); } else { return (T) o; diff --git a/src/main/java/act/test/func/Func.java b/src/main/java/act/test/func/Func.java index 2c3afd9ff..e92256edc 100644 --- a/src/main/java/act/test/func/Func.java +++ b/src/main/java/act/test/func/Func.java @@ -26,6 +26,8 @@ import act.test.verifier.DateTimeVerifier; import org.joda.time.DateTime; import org.joda.time.LocalDate; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; import org.osgl.$; import org.osgl.exception.UnexpectedException; import org.osgl.util.*; @@ -33,6 +35,7 @@ import org.rythmengine.utils.Time; import java.lang.reflect.Array; +import java.text.DateFormat; import java.util.Collection; import java.util.List; @@ -85,20 +88,46 @@ public Object apply() { } } - public static class Today extends Func { + public static abstract class _Date extends Func { + + private DateTimeFormatter fmt; + + protected abstract LocalDate getDate(); + + @Override + public void init(Object param) { + String pattern = S.string(param); + fmt = DateTimeFormat.forPattern(pattern); + } + @Override public Object apply() { + LocalDate date = getDate(); + return null == fmt ? date : fmt.print(date); + } + } + + public static class Today extends _Date { + @Override + public LocalDate getDate() { return LocalDate.now(); } } - public static class Tomorrow extends Func { + public static class Tomorrow extends _Date { @Override - public Object apply() { + public LocalDate getDate() { return LocalDate.now().plusDays(1); } } + public static class Yesterday extends _Date { + @Override + public LocalDate getDate() { + return LocalDate.now().minusDays(1); + } + } + public static class GetTime extends Func { private Integer deltaInSeconds; diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index f76681956..0ca7b8189 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.29.0 + 1.8.29.0-SNAPSHOT From 0aadb28b98305b3587c5cff75da5bdd0826349cb Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 3 Nov 2019 20:19:01 +1100 Subject: [PATCH 545/730] [maven-release-plugin] prepare release act-1.8.29 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 56f08d713..97dbc2934 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.29-SNAPSHOT + 1.8.29 ACT Framework The ACT full stack MVC framework From 3ffc7d862f0f5846593879fb762f5f1430943f4b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 3 Nov 2019 20:19:13 +1100 Subject: [PATCH 546/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 97dbc2934..cde25eebe 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.29 + 1.8.30-SNAPSHOT ACT Framework The ACT full stack MVC framework From 13a4324c1992833682637801be9f680013130299 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 4 Nov 2019 07:54:58 +1100 Subject: [PATCH 547/730] update README and VERSION_MATRIX --- README.md | 2 +- VERSION_MATRIX.md | 35 ++-- pom.xml.releaseBackup | 365 ------------------------------------------ 3 files changed, 19 insertions(+), 383 deletions(-) delete mode 100644 pom.xml.releaseBackup diff --git a/README.md b/README.md index f623e5906..c611bd0b6 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.28.0 + 1.8.29.0 ``` diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 0771ee3f4..53556643a 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -2,24 +2,25 @@ | act | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | | --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | 1.6.1 | -| beetl | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | 1.6.2 | +| aaa | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | +| beetl | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | | beetlsql | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | -| ebean-java7 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | -| ebean(java8) | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.10 | 1.7.10 | -| eclipselink(java8) | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.6.1 | -| excel | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.2 | 1.7.2 | -| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.3.7 | -| hibernate | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.6.1 | -| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | -| jpa-common | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.6.1 | -| morphia | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.3 | 1.7.3 | -| mustache(java8) | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | -| social | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | -| sql-common | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.1 | 1.5.1 | -| storage(java8) | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | 0.14.0 | -| thymeleaf | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | -| velocity | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.3.7 | +| ebean-java7 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | +| ebean(java8) | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | +| eclipselink(java8) | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | +| excel-java7 | | | | | | | | | 1.8.0 | +| excel | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | +| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | +| hibernate | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | +| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | +| jpa-common | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | +| morphia | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | +| mustache(java8) | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.5.0 | +| social | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | +| sql-common | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.1 | 1.6.0 | +| storage(java8) | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | 0.15.0 | +| thymeleaf | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.4.0 | +| velocity | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | ## Note diff --git a/pom.xml.releaseBackup b/pom.xml.releaseBackup deleted file mode 100644 index 56f08d713..000000000 --- a/pom.xml.releaseBackup +++ /dev/null @@ -1,365 +0,0 @@ - - - - - 4.0.0 - - org.actframework - act - jar - 1.8.29-SNAPSHOT - - ACT Framework - The ACT full stack MVC framework - http://actframework.org/ - 2014 - - - org.osgl - parent - 1.0.0-BETA-5 - - - - ActFramework - http://actframework.org - - - - git@github.com:actframework/actframework.git - - 1.4 - 0.7.2 - 2.0.2-beta - - 5.0.5 - 1.2 - 1.3.3 - 4.6.1 - 1.2.62 - 1.1.2 - 0.7 - 1.16 - 2.4.0 - 1 - 1.5.0-b01 - 0.0.8 - 2.14.6 - 1.0.0.Final - 2.10.1 - 1.12.1 - - - 3.12.1 - - 1.21.0 - 1.8.0 - 1.12.0 - 1.11.0 - 1.11.0 - 1.10.0 - 1.5.0 - 0.0.1 - 1.11.9 - 1.3.0 - 1.1.0.Final - 1.4.27.Final - 1.25 - 3.3.3 - - - - scm:git:${scm.url} - scm:git:${scm.url} - ${scm.url} - - - - ${project.artifactId}-${project.version} - - - src/main/resources - true - - **/*.version - **/*.api-book - **/*.properties - **/*.css - **/*.csv - **/*.html - **/*.js - **/*.json - **/*.list - **/*.tag - **/*.txt - **/*.xml - **/*.yml - **/*.yaml - **/*.tag - **/*.svg - rythm/** - *.flf - - - - src/main/resources - false - - **/*.gif - **/*.png - **/*.jpg - **/*.jpeg - **/*.doc - **/*.docx - **/*.xls - **/*.xlsx - **/*.ppt - **/*.pptx - **/*.pdf - **/*.ico - - - - - - - - - org.easytesting - fest-assert - ${fest-assert.version} - test - - - - com.auth0 - java-jwt - 3.8.0 - test - - - - com.google.code.maven-play-plugin.org.playframework - play - 1.4.0 - test - - - - - org.mockito - mockito-core - 2.0.2-beta - test - - - - com.carrotsearch - junit-benchmarks - ${junit-benchmarks.version} - test - - - - javax.validation - validation-api - ${validation-api.version} - - - - javax.mail - mail - ${javax.mail.version} - - - - org.jclarion - image4j - ${image4j.version} - - - - javax.enterprise - cdi-api - ${cdi-api.version} - - - - com.github.javaparser - javaparser-core - ${javaparser.version} - - - - com.google.zxing - javase - ${zxing.javase.version} - - - com.github.jai-imageio - jai-imageio-core - - - - - - org.fusesource.jansi - jansi - ${jansi.version} - - - - com.github.lalyos - jfiglet - ${jfiglet.version} - - - - org.jsoup - jsoup - ${jsoup.version} - - - - com.github.bingoohuang - patchca - ${patcha.version} - - - - org.actframework - act-asm - ${act-asm.version} - - - - org.apache.bval - org.apache.bval.bundle - ${bval.version} - - - - com.alibaba - fastjson - ${fastjson.version} - - - - io.undertow - undertow-core - ${undertow.version} - - - - com.squareup.okhttp3 - okhttp - ${okhttp.version} - - - - jline - jline - ${jline.version} - - - - org.eclipse.jdt.core.compiler - ecj - ${ecj.version} - - - - com.esotericsoftware - reflectasm - ${reflectasm.version} - - - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - - - joda-time - joda-time - ${joda-time.version} - - - - org.yaml - snakeyaml - ${snakeyaml.version} - - - - org.osgl - genie - ${osgl-genie.version} - - - - org.osgl - osgl-tool - ${osgl-tool.version} - - - - org.osgl - osgl-cache - ${osgl-cache.version} - - - - org.osgl - osgl-mvc - ${osgl-mvc.version} - - - - org.osgl - osgl-http - ${osgl-http.version} - - - - org.osgl - osgl-storage - ${osgl-storage.version} - - - - org.osgl - osgl-tool-ext - ${osgl-tool-ext.version} - - - - org.rythmengine - rythm-engine - ${rythmengine.version} - - - - org.hibernate.javax.persistence - hibernate-jpa-2.1-api - ${jpa.version} - - - - - From 4aff0615f8fee80b30e5f30cd74bbbad3b4980d7 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 4 Nov 2019 21:50:55 +1100 Subject: [PATCH 548/730] update README; add ARCHETYPES.md --- ARCHETYPES.md | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 21 ++---------- 2 files changed, 91 insertions(+), 19 deletions(-) create mode 100644 ARCHETYPES.md diff --git a/ARCHETYPES.md b/ARCHETYPES.md new file mode 100644 index 000000000..8c6da9bd6 --- /dev/null +++ b/ARCHETYPES.md @@ -0,0 +1,89 @@ +# ActFramework Maven Archetypes + +## Hello World App + +A simple app that renders a home page with "Hello World". This application has end to end test cases provided. + +#### Copy/Paste and Go! + +``` +mvn archetype:generate -B \ + -DgroupId=com.mycom.helloworld \ + -DartifactId=helloworld \ + -DarchetypeGroupId=org.actframework \ + -DarchetypeArtifactId=archetype-quickstart \ + -DarchetypeVersion=1.8.29.0 +``` + +#### Create Project interactively + +``` +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.28.0 +``` + +## Hello Service + +A Simple RESTful service scaffolding. This application has end to end test cases provided. + +#### Copy/Paste and Go! + +``` +mvn archetype:generate -B \ + -DgroupId=com.mycom.helloworld \ + -DartifactId=helloworld \ + -DarchetypeGroupId=org.actframework \ + -DarchetypeArtifactId=archetype-simple-restful-service \ + -DarchetypeVersion=1.8.29.0 +``` + +#### Create Project interactively + +``` +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.28.0 +``` + +## Bookmark + +A full fledged RESTful service that managed bookmarks for multiple users. This app uses +[act-aaa](https://github.com/actframework/act-aaa-plugin) to provide authentication/authorization support. This app also +leverage act-test framework for full covered end to end API level test. + +#### Copy/Paste and Go! + +``` +mvn archetype:generate -B \ + -DgroupId=com.mycom.bookmark \ + -DartifactId=bookmark \ + -DarchetypeGroupId=org.actframework \ + -DarchetypeArtifactId=archetype-bookmark \ + -DarchetypeVersion=1.8.29.0 +``` + +#### Create Project interactively + +``` +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-bookmark -DarchetypeVersion=1.8.28.0 +``` + +## Chatroom + +A simple chatroom app that built on top of Websocket. This app also demonstrate how to do i18n in an Act application. + +#### Copy/Paste and Go! + +``` +mvn archetype:generate -B \ + -DgroupId=com.mycom.chatroom \ + -DartifactId=chatroom \ + -DarchetypeGroupId=org.actframework \ + -DarchetypeArtifactId=archetype-chatroom \ + -DarchetypeVersion=1.8.29.0 +``` + +#### Create Project interactively + +``` +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-chatroom -DarchetypeVersion=1.8.28.0 +``` + + diff --git a/README.md b/README.md index c611bd0b6..87c544f73 100644 --- a/README.md +++ b/README.md @@ -27,18 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.28.0 -``` - -To start an new project for RESTful service: - -``` -mvn archetype:generate -B \ - -DgroupId=com.mycom.helloservice \ - -DartifactId=helloservice \ - -DarchetypeGroupId=org.actframework \ - -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.28.0 + -DarchetypeVersion=1.8.29.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: @@ -47,13 +36,7 @@ mvn archetype:generate -B \ mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.28.0 ``` -Or - -``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.28.0 -``` - -For RESTful service project +**Note** There are more ActFramework application archetypes for use. Please get them [here](ARCHETYPES.md). ## Features From 30bc317915e4982d58b276fdbbfa6ce6228f4bd0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 5 Nov 2019 15:45:14 +1100 Subject: [PATCH 549/730] fix route benchmark test app issue --- src/main/java/act/app/App.java | 1 + src/main/java/act/conf/AppConfig.java | 16 ++++++---- src/test/java/act/ActTestBase.java | 4 +++ src/test/java/benchmark/RouterBenchmark.java | 32 ++++++++++++-------- src/test/resources/routes | 4 +-- 5 files changed, 36 insertions(+), 21 deletions(-) diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index b827e8aa1..3526facbc 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -216,6 +216,7 @@ private App() { this.singletonRegistry.register(SingletonRegistry.class, this.singletonRegistry); this.singletonRegistry.register(SessionManager.class, this.sessionManager); this.singletonRegistry.register(CookieSessionMapper.class, new CookieSessionMapper(this.config)); + this.idGenerator = new IdGenerator(); } protected App(File appBase, Version version, ProjectLayout layout) { diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index cb45e3595..6d6e2b1a1 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -38,6 +38,7 @@ import act.data.DateTimeType; import act.db.util.SequenceNumberGenerator; import act.db.util._SequenceNumberGenerator; +import act.event.EventBus; import act.event.SysEventListenerBase; import act.handler.*; import act.handler.event.ResultEvent; @@ -150,12 +151,15 @@ public AppConfig app(App app) { E.NPE(app); this.app = app; AppConfigKey.onApp(app); - app.eventBus().bind(SysEventId.CONFIG_LOADED, new SysEventListenerBase() { - @Override - public void on(AppConfigLoaded event) throws Exception { - routerRegexMacroLookup = new RouterRegexMacroLookup(AppConfig.this); - } - }); + EventBus eventBus = app.eventBus(); + if (null != eventBus) { + eventBus.bind(SysEventId.CONFIG_LOADED, new SysEventListenerBase() { + @Override + public void on(AppConfigLoaded event) throws Exception { + routerRegexMacroLookup = new RouterRegexMacroLookup(AppConfig.this); + } + }); + } // else - must be in routing benchmark unit test return this; } diff --git a/src/test/java/act/ActTestBase.java b/src/test/java/act/ActTestBase.java index 3c92a4948..ca02b897b 100644 --- a/src/test/java/act/ActTestBase.java +++ b/src/test/java/act/ActTestBase.java @@ -35,6 +35,7 @@ import act.route.Router; import act.session.SessionManager; import act.util.ClassNames; +import act.util.IdGenerator; import org.junit.Ignore; import org.junit.runner.JUnitCore; import org.mockito.Matchers; @@ -89,9 +90,11 @@ public static File root() { protected H.Request mockReq; protected ActResponse mockResp; protected CacheService mockCacheService; + protected IdGenerator idGenerator; protected void setup() throws Exception { initActMetricPlugin(); + idGenerator = new IdGenerator(); mockApp = mock(App.class); Field f = App.class.getDeclaredField("INST"); f.setAccessible(true); @@ -111,6 +114,7 @@ protected void setup() throws Exception { when(mockApp.config()).thenReturn(mockAppConfig); when(mockApp.router()).thenReturn(mockRouter); when(mockApp.router(Matchers.same(""))).thenReturn(mockRouter); + when(mockApp.cuid()).thenReturn(idGenerator.genId()); mockCacheService = mock(CacheService.class); when(mockApp.getInstance(any(Class.class))).thenAnswer(new Answer() { @Override diff --git a/src/test/java/benchmark/RouterBenchmark.java b/src/test/java/benchmark/RouterBenchmark.java index 27a095580..9ec501882 100644 --- a/src/test/java/benchmark/RouterBenchmark.java +++ b/src/test/java/benchmark/RouterBenchmark.java @@ -34,6 +34,7 @@ import act.handler.builtin.AlwaysNotFound; import act.plugin.GenericPluginManager; import act.route.*; +import act.util.IdGenerator; import com.carrotsearch.junitbenchmarks.BenchmarkOptions; import org.junit.BeforeClass; import org.junit.Test; @@ -51,9 +52,14 @@ import java.net.URL; import java.util.Map; -@BenchmarkOptions(warmupRounds = 1, benchmarkRounds = 100 * 100) +@BenchmarkOptions(warmupRounds = 1, benchmarkRounds = 20) public class RouterBenchmark extends BenchmarkBase { + private static String r24s = S.random(24); + private static String r21s = S.random(21); + private static int r20n = N.randInt(20); + private static String r8s = S.random(); + private static Router router; private static RouteTableRouterBuilder builder; private ActionContext ctx; @@ -61,7 +67,7 @@ public class RouterBenchmark extends BenchmarkBase { private static App app; @BeforeClass - public static void prepare() { + public static void prepare() throws Exception { try { Field f = Act.class.getDeclaredField("pluginManager"); f.setAccessible(true); @@ -120,32 +126,32 @@ void play(String method, String url, Object... args) { @Test public void osgl_InvokeBadUrl() { - runTest(true, true, GET, "/badUrl/whatever/%s/abc/136", S.random()); + runTest(true, true, GET, "/badUrl/whatever/%s/abc/136", r8s); } @Test public void play_InvokeBadUrl() { - runTest(false, true, GET, "/badUrl/whatever/%s/abc/136", S.random()); + runTest(false, true, GET, "/badUrl/whatever/%s/abc/136", r8s); } @Test public void osgl_HitAtBeginning() { - runTest(true, GET, "/yemian/%s/", S.random()); + runTest(true, GET, "/yemian/%s/", r8s); } @Test public void play_HitAtBeginning() { - runTest(false, GET, "/yemian/%s/", S.random()); + runTest(false, GET, "/yemian/%s/", r8s); } @Test public void osgl_HitAtEnding() { - runTest(true, GET, "/adm/weixinyingyong/%s/", S.random()); + runTest(true, GET, "/adm/weixinyingyong/%s/", r8s); } @Test public void play_HitAtEnding() { - runTest(false, GET, "/adm/weixinyingyong/%s/", S.random()); + runTest(false, GET, "/adm/weixinyingyong/%s/", r8s); } @Test @@ -170,23 +176,23 @@ public void play_longStaticUrl() { @Test public void osgl_longDynamicUrl() { - runTest(true, POST, "/shuju/tuiguang/%s/mubiao/%s/yemian/%s/remove", S.random(24), S.random(24), N.randInt(20)); + runTest(true, POST, "/shuju/tuiguang/%s/mubiao/%s/yemian/%s/remove", r24s, r24s, r20n); } @Test public void play_longDynamicUrl() { - runTest(false, POST, "/shuju/tuiguang/%s/mubiao/%s/yemian/%s/remove", S.random(24), S.random(24), N.randInt(20)); + runTest(false, POST, "/shuju/tuiguang/%s/mubiao/%s/yemian/%s/remove", r24s, r24s, r20n); } @Test public void osgl_badUrl2() { - runTest(true, true, POST, "/shuju/tuiguang/%s/mubiao/%s/yemian/%s/remove", S.random(24), S.random(21), N.randInt(20)); + runTest(true, true, POST, "/shuju/tuiguang/%s/mubiao/%s/yemian/%s/remove", r24s, r21s, r20n); } @Test public void play_badUrl2() { - runTest(false, true, POST, "/shuju/tuiguang/%s/mubiao/%s/yemian/%s/remove", S.random(24), S.random(21), N.randInt(20)); + runTest(false, true, POST, "/shuju/tuiguang/%s/mubiao/%s/yemian/%s/remove", r24s, r21s, r20n); } private void runTest(boolean osgl, H.Method method, String url, Object... fmtArgs) { @@ -195,7 +201,7 @@ private void runTest(boolean osgl, H.Method method, String url, Object... fmtArg private void runTest(boolean osgl, boolean notFoundExpected, H.Method method, String url, Object... fmtArgs) { url = S.fmt(url, fmtArgs); - final int loop = 1000 * 100; + final int loop = 100 * 100; if (osgl) { for (int i = 0; i < loop; ++i) { try { diff --git a/src/test/resources/routes b/src/test/resources/routes index 1d1ed3a1e..811d3c601 100755 --- a/src/test/resources/routes +++ b/src/test/resources/routes @@ -10,7 +10,7 @@ GET /toupiao CMYingyong.toupiao GET /tandcdialog CMYingyong.tAndCDialog * /weixinyingyong/{yingyongId}/ WeixinAppFuwuqi.jiazai * /zhuangzai/yingyong/{yingyongId}/ WeixinAppFuwuqi.jiazai -POST /tuiguang/{tuiguangId}/ CMYingyong.tijiao +POST /tuiguang/{tuiguangId}/x CMYingyong.tijiao POST /tuiguang/{tuiguangId}/vote CMYingyong.toupiaoJilu POST /yemian/{yemianId}/fasongyoujian CMYingyong.fasongyoujian POST /shangchuang CMYingyong.wenjianShangChuan @@ -27,7 +27,7 @@ GET /ushangchuanger CMYingyong.ushangchuanger GET /tutu123/token CMYingyong.tutu123Token # Ziyuan Guanliyuan -GET / ziyuan.Guanliqi.zhuye +GET /z ziyuan.Guanliqi.zhuye GET /cm ziyuan.Guanliqi.zhuye GET /dn/new ziyuan.Guanliqi.createZiyuan POST /dn/new ziyuan.Guanliqi.createZiyuan From 2ba4cc1d0ecc52d25944cbc89d2077d0c6b9fbf3 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 9 Nov 2019 10:41:20 +1100 Subject: [PATCH 550/730] act/base.html template - allow customized app.css file --- src/main/resources/asset/css/app.css | 0 src/main/resources/rythm/act/base.html | 2 ++ src/test/java/benchmark/RouterBenchmark.java | 9 ++++----- testapps/GHIssues/pom.xml | 2 -- 4 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/asset/css/app.css diff --git a/src/main/resources/asset/css/app.css b/src/main/resources/asset/css/app.css new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/resources/rythm/act/base.html b/src/main/resources/rythm/act/base.html index 6ce911d35..11ba5aaf7 100644 --- a/src/main/resources/rythm/act/base.html +++ b/src/main/resources/rythm/act/base.html @@ -22,6 +22,8 @@ –––––––––––––––––––––––––––––––––––––––––––––––––– --> + + @render(moreStyles) org.actframework act-aaa From 8cd1e19d4fc28d889d94fc47de88654bacb91cb5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 9 Nov 2019 11:59:44 +1100 Subject: [PATCH 551/730] `__path` param value needs to be sanitized #1241 --- CHANGELOG.md | 3 +++ src/main/java/act/app/ActionContext.java | 22 +++++++++++++++++++ .../java/act/handler/builtin/FileGetter.java | 4 +--- .../java/act/handler/builtin/RedirectDir.java | 2 +- .../act/handler/builtin/ResourceGetter.java | 4 ++-- .../act/inject/param/PartialPathLoader.java | 6 ++++- testapps/GHIssues/pom.xml | 3 ++- .../src/main/java/ghissues/Gh1241.java | 21 ++++++++++++++++++ .../GHIssues/src/main/resources/routes.conf | 2 +- .../main/resources/test/scenarios/1241.yml | 10 +++++++++ 10 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1241.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1241.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index e41299cf7..f705cb784 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # ActFramework Change Log +**1.8.30** +* `__path` param value needs to be sanitized #1241 + **1.8.29** 03/Nov/2019 * SimpleRestfulServiceBase - allow developer to inject logic #1237 * Allow app to specify sample data provider for any field #1236 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index bda675379..363246b5e 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -26,6 +26,7 @@ import act.*; import act.conf.AppConfig; +import act.controller.ParamNames; import act.controller.ResponseCache; import act.controller.captcha.CaptchaViolation; import act.data.MapUtil; @@ -774,6 +775,27 @@ public Set paramNames() { return paramKeys(); } + /** + * Returns the param value associated with `__path`, i.e. calling to + * {@link #paramVal(String)} with `__path` as param name. + * + * However, this method will do sanity check on the value returned, in case + * there are `..` found in the value, an `IllegalArgumentException` will + * be thrown out. This is to prevent the insecure direct object reference + * attack. + * + * @return the param value of `__path` + * @throws IllegalArgumentException when the value contains string `..` + */ + public String __pathParamVal() { + String s = paramVal(ParamNames.PATH); + if (null == s) { + return s; + } + E.illegalArgumentIf(s.contains(".."), "`..` found in path which is not allowed"); + return s; + } + @Override public String paramVal(String name) { String val = _paramVal(name); diff --git a/src/main/java/act/handler/builtin/FileGetter.java b/src/main/java/act/handler/builtin/FileGetter.java index d076b301f..10a541a0e 100644 --- a/src/main/java/act/handler/builtin/FileGetter.java +++ b/src/main/java/act/handler/builtin/FileGetter.java @@ -23,7 +23,6 @@ import act.ActResponse; import act.app.ActionContext; import act.app.App; -import act.controller.ParamNames; import act.handler.builtin.controller.FastRequestHandler; import org.osgl.$; import org.osgl.http.H; @@ -32,7 +31,6 @@ import org.osgl.util.S; import java.io.File; -import java.util.Arrays; public class FileGetter extends FastRequestHandler { @@ -79,7 +77,7 @@ public void handle(ActionContext context) { File file = base; H.Format fmt; if (base.isDirectory()) { - String path = context.paramVal(ParamNames.PATH); + String path = context.__pathParamVal(); if (S.blank(path)) { AlwaysForbidden.INSTANCE.handle(context); return; diff --git a/src/main/java/act/handler/builtin/RedirectDir.java b/src/main/java/act/handler/builtin/RedirectDir.java index 55296130c..f9025b785 100644 --- a/src/main/java/act/handler/builtin/RedirectDir.java +++ b/src/main/java/act/handler/builtin/RedirectDir.java @@ -43,7 +43,7 @@ public void handle(ActionContext context) { } else { resp.status(H.Status.MOVED_PERMANENTLY); } - String path = context.paramVal(ParamNames.PATH); + String path = context.__pathParamVal(); resp.header(H.Header.Names.LOCATION, url + path); } diff --git a/src/main/java/act/handler/builtin/ResourceGetter.java b/src/main/java/act/handler/builtin/ResourceGetter.java index a7e966712..635c3c768 100644 --- a/src/main/java/act/handler/builtin/ResourceGetter.java +++ b/src/main/java/act/handler/builtin/ResourceGetter.java @@ -107,7 +107,7 @@ public boolean express(ActionContext context) { if (preloaded || null != delegate) { return true; } - String path = context.paramVal(ParamNames.PATH); + String path = context.__pathParamVal(); return Act.isProd() && (cachedBuffers.containsKey(path) || cachedFailures.containsKey(path) @@ -136,7 +136,7 @@ public void handle(ActionContext context) { } protected String path(ActionContext context) { - return context.paramVal(ParamNames.PATH); + return context.__pathParamVal(); } protected void handle(String path, ActionContext context) { diff --git a/src/main/java/act/inject/param/PartialPathLoader.java b/src/main/java/act/inject/param/PartialPathLoader.java index db8d3d0e1..0da0813f5 100644 --- a/src/main/java/act/inject/param/PartialPathLoader.java +++ b/src/main/java/act/inject/param/PartialPathLoader.java @@ -20,8 +20,10 @@ * #L% */ +import act.app.ActionContext; import act.controller.ParamNames; import act.util.ActContext; +import org.osgl.util.E; public class PartialPathLoader extends ParamValueLoader.NonCacheable { @@ -33,7 +35,9 @@ public PartialPathLoader(String bindName) { @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { - return context.paramVal(ParamNames.PATH); + E.illegalStateIfNot(context instanceof ActionContext, "Not in an HTTP request context"); + ActionContext actionContext = (ActionContext) context; + return actionContext.__pathParamVal(); } @Override diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 5c9be99ec..1898d9388 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.29.0-SNAPSHOT + 1.8.29.0 @@ -25,6 +25,7 @@ org.actframework act + 1.8.30-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1241.java b/testapps/GHIssues/src/main/java/ghissues/Gh1241.java new file mode 100644 index 000000000..ed7111610 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1241.java @@ -0,0 +1,21 @@ +package ghissues; + +import act.Act; +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import act.handler.builtin.FileGetter; +import act.util.Stateless; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1241") +@Stateless +public class Gh1241 extends BaseController { + + private FileGetter fileGetter = new FileGetter("/", Act.app()); + + @GetAction + public void load(ActionContext context) { + fileGetter.handle(context); + } + +} diff --git a/testapps/GHIssues/src/main/resources/routes.conf b/testapps/GHIssues/src/main/resources/routes.conf index d9a34c0dc..5e9e4e7bd 100644 --- a/testapps/GHIssues/src/main/resources/routes.conf +++ b/testapps/GHIssues/src/main/resources/routes.conf @@ -1,3 +1,3 @@ GET /gh%20887 echo:887 -GET /925 ghissues.Gh925$Sub.test \ No newline at end of file +GET /925 ghissues.Gh925$Sub.test diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1241.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1241.yml new file mode 100644 index 000000000..778a088ef --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1241.yml @@ -0,0 +1,10 @@ +Scenario(1241): + description: "`__path` param value needs to be sanitized" + interactions: + - description: test + request: + get: 1241 + params: + __path: ../../pom.xml + response: + status: 400 From d7d103297db5970c555e4d535c0aee2f9f59e339 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 10 Nov 2019 09:36:51 +1100 Subject: [PATCH 552/730] Act-Test - add an `entityId()` function #1240 --- CHANGELOG.md | 1 + .../act/db/meta/MasterEntityMetaInfoRepo.java | 4 + src/main/java/act/test/func/EntityId.java | 85 +++++++++++++++++++ .../src/main/java/ghissues/Gh1240.java | 29 +++++++ .../main/resources/test/scenarios/1240.yml | 10 +++ 5 files changed, 129 insertions(+) create mode 100644 src/main/java/act/test/func/EntityId.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1240.java create mode 100644 testapps/GHIssues/src/main/resources/test/scenarios/1240.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index f705cb784..aef16b39a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ **1.8.30** * `__path` param value needs to be sanitized #1241 +* Act-Test - add an `entityId()` function #1240 **1.8.29** 03/Nov/2019 * SimpleRestfulServiceBase - allow developer to inject logic #1237 diff --git a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java index f44ccd669..a055ce1e5 100644 --- a/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java +++ b/src/main/java/act/db/meta/MasterEntityMetaInfoRepo.java @@ -202,6 +202,10 @@ public EntityMetaInfoRepo forDb(String dbId) { return null != repo ? repo : EMPTY; } + public Iterable allRepos() { + return regions.values(); + } + public static EntityMetaInfoRepo EMPTY() { return EMPTY; } diff --git a/src/main/java/act/test/func/EntityId.java b/src/main/java/act/test/func/EntityId.java new file mode 100644 index 000000000..d43b36c72 --- /dev/null +++ b/src/main/java/act/test/func/EntityId.java @@ -0,0 +1,85 @@ +package act.test.func; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.App; +import act.db.meta.EntityClassMetaInfo; +import act.db.meta.EntityFieldMetaInfo; +import act.db.meta.EntityMetaInfoRepo; +import org.osgl.$; +import org.osgl.util.E; +import org.osgl.util.N; +import org.osgl.util.S; + +public class EntityId extends Func { + + private Class idFieldClass; + private boolean isPrimitive; + + @Override + public void init(Object param) { + Class type = null; + try { + type = Act.classForName(S.string(param)); + } catch (Exception e) { + throw new IllegalArgumentException("Class name expected. Found: " + param); + } + App app = Act.app(); + EntityFieldMetaInfo fieldMetaInfo = null; + for (EntityMetaInfoRepo repo : app.entityMetaInfoRepo().allRepos()) { + EntityClassMetaInfo metaInfo = repo.classMetaInfo(type); + if (null != metaInfo) { + fieldMetaInfo = metaInfo.idField(); + } + } + E.illegalArgumentIf(null == fieldMetaInfo, "Cannot find ID field of class: " + type); + String fieldName = fieldMetaInfo.fieldName(); + idFieldClass = $.fieldOf(type, fieldName).getType(); + isPrimitive = $.isPrimitiveType(idFieldClass); + } + + @Override + public Object apply() { + if (isPrimitive) { + if (idFieldClass == int.class) { + return N.randInt(); + } else if (idFieldClass == char.class) { + return N.randInt(30, 50); + } else if (idFieldClass == short.class) { + return N.randInt(0, 100); + } else if (idFieldClass == byte.class) { + return N.randInt(0, 60); + } else if (idFieldClass == long.class) { + return N.randLong(); + } else if (idFieldClass == boolean.class) { + return $.random(true, false); + } else if (idFieldClass == float.class) { + return N.randFloat(); + } else if (idFieldClass == double.class) { + return N.randDouble(); + } + return N.randInt(); + } + return Act.getInstance(idFieldClass); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1240.java b/testapps/GHIssues/src/main/java/ghissues/Gh1240.java new file mode 100644 index 000000000..938eef525 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1240.java @@ -0,0 +1,29 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.SimpleBean; +import org.osgl.$; +import org.osgl.mvc.annotation.PostAction; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@UrlContext("1240") +public class Gh1240 extends BaseController { + + @Entity(name = "foo1240") + @Table(name = "foo1240") + public static class Foo implements SimpleBean { + @Id + public int id; + + public String name; + } + + @PostAction + public Foo create(Foo foo) { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1240.yml b/testapps/GHIssues/src/main/resources/test/scenarios/1240.yml new file mode 100644 index 000000000..cf1f94d84 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/test/scenarios/1240.yml @@ -0,0 +1,10 @@ +Scenario(1240): + interactions: + - description: Act-Test - add an `entityId()` function + request: + post: 1240 + json: + id: ${entityId(ghissues.Gh1240$Foo)} + response: + id: + - exists: true From 1d680a8628a74c60efd8a3b9f74ac5edaa0ea740 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 16 Nov 2019 22:18:51 +1100 Subject: [PATCH 553/730] work on #1244 and #1245 --- CHANGELOG.md | 2 + pom.xml | 2 +- src/main/java/act/Act.java | 6 + src/main/java/act/cli/view/CliView.java | 4 +- src/main/java/act/controller/Controller.java | 21 +- src/main/java/act/util/DataTable.java | 496 ++++++++++++++++++ src/main/java/act/util/PropertySpec.java | 5 +- .../asset/~act/css/act_data_table.css | 22 + src/main/resources/rythm/~table.html | 53 ++ src/main/resources/rythm/~table_page.html | 17 + src/test/java/act/util/DataTableTest.java | 66 +++ 11 files changed, 689 insertions(+), 5 deletions(-) create mode 100644 src/main/java/act/util/DataTable.java create mode 100644 src/main/resources/asset/~act/css/act_data_table.css create mode 100644 src/main/resources/rythm/~table.html create mode 100644 src/main/resources/rythm/~table_page.html create mode 100644 src/test/java/act/util/DataTableTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index aef16b39a..d44564328 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.30** +* Support `htmltable` pseudo Accept type #1244 +* Allow it specify particular part of returned data in response using `_jsonPath` parameter #1245 * `__path` param value needs to be sanitized #1241 * Act-Test - add an `entityId()` function #1240 diff --git a/pom.xml b/pom.xml index cde25eebe..85995d440 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 3.12.1 - 1.21.0 + 1.21.1-SNAPSHOT 1.8.0 1.12.0 1.11.0 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index bc388bc4b..00c810734 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -318,6 +318,7 @@ public static T registeredPlugin(Class type) { public static void startup(AppDescriptor descriptor) { long start = descriptor.getStart(); processEnvironment(descriptor); + registerMimeTypes(); registerTypeConverters(); loadConfig(); Banner.print(descriptor); @@ -858,6 +859,11 @@ private static void processEnvironment(AppDescriptor descriptor) { } } + public static void registerMimeTypes() { + MimeType.findByContentType("text/html").createAlias("htmltable"); + MimeType.findByContentType("text/plain").createAlias("texttable"); + } + public static void registerTypeConverters() { TypeConverterRegistry.INSTANCE.register(new $.TypeConverter() { @Override diff --git a/src/main/java/act/cli/view/CliView.java b/src/main/java/act/cli/view/CliView.java index 306f460de..b15f227e7 100644 --- a/src/main/java/act/cli/view/CliView.java +++ b/src/main/java/act/cli/view/CliView.java @@ -336,7 +336,9 @@ public void print(Object result, PropertySpec.MetaInfo spec, CliContext context) protected List toList(Object result) { List dataList; - if (result instanceof Iterable) { + if (result instanceof List) { + return (List) result; + } else if (result instanceof Iterable) { dataList = C.list((Iterable) result); } else if (result instanceof Iterator) { dataList = C.list((Iterator) result); diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index dbc77b445..21a1a395b 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -32,6 +32,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONPath; import com.google.zxing.BarcodeFormat; import org.osgl.$; import org.osgl.Lang; @@ -1783,12 +1784,24 @@ public static Result inferPrimitiveResult( } else { H.Format fmt = actionContext.accept(); String fmtName = fmt.name(); - String s = v instanceof String ? (String) v : $$.toString(v, shouldUseToString); + String s = fmt.isText() ? (v instanceof String ? (String) v : $$.toString(v, shouldUseToString)) : null; if (S.eq(fmtName, "qrcode")) { return new ZXingResult(s, BarcodeFormat.QR_CODE); } else if (S.eq(fmtName, "barcode")) { return new ZXingResult(s, BarcodeFormat.CODE_128); - } else if (fmt.isText()) { + } else if (S.eq(fmtName, "htmltable")) { + boolean fullPage = $.bool(actionContext.paramVal("_fullPage")); + actionContext.templatePath(fullPage ? "/~table_page.html" : "/~table.html"); + DataTable dataTable = new DataTable(v); + if (1 == dataTable.rowCount()) { + dataTable = dataTable.transpose(); + } + actionContext.renderArg("table", dataTable); + if (fullPage) { + actionContext.renderArg("title", "Data table - " + actionContext.handlerMethod().getName()); + } + return RenderTemplate.get(); + } else if (null != s) { return RenderText.of(status, fmt, s); } DirectRender dr = Act.viewManager().loadDirectRender(actionContext); @@ -1923,6 +1936,10 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon //return requireJSON ? RenderJSON.of("{}") : requireXML ? RenderXML.of("") : null; return null; } + String jsonPath = context.paramVal("_jsonPath"); + if (null != jsonPath) { + v = JSONPath.eval(v, jsonPath); + } Class vCls = v.getClass(); boolean isSimpleType = $.isSimpleType(vCls); boolean shouldUseToString = $$.shouldUseToString(vCls); diff --git a/src/main/java/act/util/DataTable.java b/src/main/java/act/util/DataTable.java new file mode 100644 index 000000000..e0bc66631 --- /dev/null +++ b/src/main/java/act/util/DataTable.java @@ -0,0 +1,496 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.annotations.Label; +import org.osgl.$; +import org.osgl.util.*; + +import java.lang.reflect.*; +import java.util.*; + +/** + * A `DataTable` contains a list of heading (column labels) plus + * a list of data rows. + *

                                                                                                                                                                              + * The sequence of data fields in each data row matches the corresponding + * sequence of field labels in heading list. + *

                                                                                                                                                                              + * **Note** + * 1. `DataTable` does data processing in memory, it is not suitable + * for huge amount of data. + * 2. `DataTable` does not suit big sparse matrix unless heading is + * provided with {@link PropertySpec} or the row data type is a concrete + * POJO. In case sparse matrix row is supplied with {@link Map} or + * {@link org.osgl.util.AdaptiveMap}, `DataTable` will try to probe at + * most 10 first rows to find out the heading fields(keys). Thus if + * the first 10 rows has missing columns, they will not be able to output + */ +public class DataTable implements Iterable { + + public static final String KEY_FIELD = "_field"; + + private List colKeys; + private Iterable rows; + private int rowCount; + private boolean isMap; + private boolean isAdaptiveMap; + private boolean isTranspose; + private Object firstRow; + private Set rightAlignCols; + // key: col key; val: label + private Map labelLookup; + // key: label, val: col key + private Map reverseLabelLookup; + + // the transpose table of this table + private transient volatile DataTable transpose; + + // used to build transpose table + private DataTable() { + } + + /** + * Construct a `DataTable` with data. + *

                                                                                                                                                                              + * This constructor will call `{@link ThreadLocal#get()}` on + * {@link PropertySpec#currentSpec} to get the current + * PropertySpec meta info. + * + * @param data the data used to populate the data table + */ + public DataTable(Object data) { + init(data, PropertySpec.currentSpec.get()); + } + + /** + * Construct a `DataTable` with data and {@link PropertySpec.MetaInfo column spec}. + * + * @param data the data used to populate the data table + * @param colSpec the {@link PropertySpec.MetaInfo} specifies column headings + */ + public DataTable(Object data, PropertySpec.MetaInfo colSpec) { + init(data, colSpec); + } + + /** + * Return number of rows in the data table. + *

                                                                                                                                                                              + * If {@link #rows} is an iterable and cannot be cast to a collection, then + * it returns `-1`, meaning row number cannot be count. + * + * @return the number of rows in the table + */ + public int rowCount() { + return rowCount; + } + + /** + * Return number of columns in the data table. + * + * @return the number of columns. + */ + public int colCount() { + return colKeys.size(); + } + + /** + * Return {@link Iterator} of {@link #rows}. + * + * @return the row iterator. + */ + @Override + public Iterator iterator() { + return rows.iterator(); + } + + /** + * Get the heading row. + * + * @return the heading row + */ + public List heading() { + if (isTranspose) { + return colKeys; + } + List heading = new ArrayList<>(); + for (String colKey : colKeys) { + String label = labelLookup.get(colKey); + heading.add(null != label ? label : colKey); + } + return heading; + } + + /** + * Get column value on a row by col index. + * + * @param row the row object + * @param colIndex the column index + * @return the value of the column on the row + */ + public Object val(Object row, int colIndex) { + String colKey = colKeys.get(colIndex); + return $.getProperty(row, colKey); + } + + /** + * Get column value on a row by label. + * + * @param row the row object + * @param label the column label + * @return the value of the column on the row + */ + public Object val(Object row, String label) { + String colKey = label; + if (!isTranspose) { + colKey = reverseLabelLookup.get(label); + if (null == colKey) { + colKey = label; + } + } + return $.getProperty(row, colKey); + } + + /** + * Get a transpose table of this table. + * + * @return a transpose table of this table. + */ + public DataTable transpose() { + if (null == transpose) { + synchronized (this) { + if (null == transpose) { + transpose = buildTranspose(); + } + } + } + return transpose; + } + + /** + * Check if a label is right aligned column. + * @param label the label to check + * @return `true` if the column of the label should be right aligned. + */ + public boolean isRightAligned(String label) { + if (isTranspose) { + return false; + } + String key = reverseLabelLookup.get(label); + if (null == key) { + key = label; + } + return rightAlignCols.contains(key); + } + + /** + * Reports if this data table is a transposed table. + * + * @return `true` if this table is transposed, or `false` otherwise. + */ + public boolean isTransposed() { + return isTranspose; + } + + private DataTable buildTranspose() { + E.illegalArgumentIf(rowCount < 0, "transpose table not applied to table does not have row count."); + DataTable transpose = new DataTable(); + transpose = isTranspose() ? buildReverseTranspose(transpose) : buildTranspose(transpose); + transpose.labelLookup = this.labelLookup; + transpose.reverseLabelLookup = this.reverseLabelLookup; + transpose.isTranspose = !this.isTranspose; + return transpose; + } + + private DataTable buildReverseTranspose(DataTable target) { + target.colKeys = buildReverseTransposeColKeys(); + target.rowCount = this.colKeys.size() - 1; + target.rows = buildReverseTransposeRows(target.rowCount); + return target; + } + + private DataTable buildTranspose(DataTable target) { + target.colKeys = buildTransposeColKeys(); + target.rowCount = this.colKeys.size(); + target.rows = buildTransposeRows(); + return target; + } + + private List buildReverseTransposeColKeys() { + List colKeys = new ArrayList<>(this.rowCount); + for (Object row : rows) { + colKeys.add(S.string($.getProperty(row, KEY_FIELD))); + } + return colKeys; + } + + private List buildTransposeColKeys() { + List colKeys = new ArrayList<>(this.rowCount + 1); + colKeys.add(KEY_FIELD); + for (int i = 0; i < this.rowCount; ++i) { + colKeys.add("_r" + i); + } + return colKeys; + } + + private Map buildTransposeRow(String colKey) { + Map row = new HashMap<>(this.rowCount + 1); + String label = labelLookup.get(colKey); + if (null == label) { + label = colKey; + } + row.put(KEY_FIELD, label); + int rowId = 0; + for (Object data : this.rows) { + row.put("_r" + rowId++, $.getProperty(data, colKey)); + } + return row; + } + + private Iterable buildTransposeRows() { + List> rows = new ArrayList<>(); + for (String key : colKeys) { + rows.add(buildTransposeRow(key)); + } + return rows; + } + + private Iterable buildReverseTransposeRows(int targetRowCount) { + List> rows = new ArrayList<>(targetRowCount); + for (int i = 0; i < targetRowCount; ++i) { + String key = "_r" + i; + rows.add(buildReverseTransposeRow(key)); + } + return rows; + } + + private Map buildReverseTransposeRow(String key) { + Map row = new HashMap<>(); + for (Object data : this.rows) { + String targetKey = $.getProperty(data, KEY_FIELD); + Object targetVal = $.getProperty(data, key); + row.put(targetKey, targetVal); + } + return row; + } + + private boolean isTranspose() { + return isTranspose; + } + + private void init(Object data, PropertySpec.MetaInfo colSpec) { + initRightAlignCols(); + initRows(data); + initHeading(data, colSpec); + } + + private void initRightAlignCols() { + this.rightAlignCols = new HashSet<>(); + } + + private void initRows(Object data) { + if (data instanceof Collection) { + Collection col = $.cast(data); + rowCount = col.size(); + rows = col; + } else if (data instanceof Iterable) { + rows = $.cast(data); + rowCount = -1; + } else { + rows = C.list(data); + rowCount = 1; + firstRow = data; + } + if (rowCount > 0) { + firstRow = rows.iterator().next(); + } + if (null != firstRow) { + isMap = firstRow instanceof Map; + isAdaptiveMap = !isMap && firstRow instanceof AdaptiveMap; + } + } + + // pre-condition - `initRows(Object)` method must be called to setup the context + // for exploring output fields in case heading is not specified with `PropertySpec` + private void initHeading(Object data, PropertySpec.MetaInfo colSpec) { + Set excludes = C.Set(); + if (null != colSpec) { + ActContext context = ActContext.Base.currentContext(); + setLabelLookup(colSpec.labelMapping(context)); + excludes = colSpec.excludedFields(context); + if ($.not(excludes)) { + colKeys = colSpec.outputFields(context); + if ($.bool(colKeys)) { + return; + } + } + } + if (null == labelLookup) { + setLabelLookup(C.Map()); + } + // explore data rows to probe fields + E.illegalArgumentIf(0 == rowCount, "Unable to probe table heading: no data found"); + int max = Math.min(rowCount, 10); // probe at most 10 rows of data for labels + SortedSet keys; + if (isPojo()) { + keys = keysOf(firstRow); + } else { + keys = new TreeSet<>(); + for (Object row : rows) { + if (--max < 0) break; + if (isMap) { + keys.addAll(keysOf((Map) row)); + } else if (isAdaptiveMap) { + keys.addAll(keysOf(((AdaptiveMap) row).asMap())); + } else { + assert false; + } + } + } + keys.removeAll(excludes); + colKeys = C.list(keys); + } + + private boolean isNumeric(Object v) { + if (null == v) { + return false; + } + if (v instanceof Number) { + return true; + } + if (v instanceof $.Var) { + v = (($.Var) v).get(); + return isNumeric(v); + } + if (v instanceof Const) { + v = ((Const) v).get(); + return isNumeric(v); + } + return false; + } + + private Set keysOf(Map row) { + Set set = new HashSet<>(); + for (Map.Entry entry: row.entrySet()) { + String key = S.string(entry.getKey()); + set.add(key); + if (rightAlignCols.contains(key)) { + continue; + } + Object v = entry.getValue(); + if (isNumeric(v)) { + rightAlignCols.add(key); + } + } + return set; + } + + private boolean isNumeric(Class type, Type genericType) { + if (isNumeric(type)) { + return true; + } + if ($.Var.class.isAssignableFrom(type) || Const.class.isAssignableFrom(type)) { + if (genericType instanceof ParameterizedType) { + ParameterizedType pt = $.cast(genericType); + Type[] tArgs = pt.getActualTypeArguments(); + if (null != tArgs && tArgs.length > 0) { + Type t = tArgs[0]; + if (t instanceof Class) { + return isNumeric((Class) t); + } + } + } + } + return false; + } + + private boolean isNumeric(Class ft) { + if ($.isSimpleType(ft)) { + ft = $.wrapperClassOf(ft); + } + return Number.class.isAssignableFrom(ft); + } + + private SortedSet keysOf(Object pojo) { + Class type = pojo.getClass(); + SortedSet keys = new TreeSet<>(); + // Check all public fields + for (Field f : type.getFields()) { + String fn = f.getName(); + keys.add(fn); + if (!labelLookup.containsKey(fn)) { + Label label = f.getAnnotation(Label.class); + if (null != label) { + labelLookup.put(fn, label.value()); + } + } + Class ft = f.getType(); + Type gft = f.getGenericType(); + if (isNumeric(ft, gft)) { + rightAlignCols.add(fn); + } + } + // Check all getters + for (Method m : type.getMethods()) { + if (Modifier.isStatic(m.getModifiers())) { + continue; + } + if (m.getParameterTypes().length > 0) { + continue; + } + if (m.getReturnType().equals(Void.class)) { + continue; + } + String mn = m.getName(); + if (S.eq("getClass", mn)) { + continue; + } + if (mn.length() < 4 || !mn.startsWith("get") || !Character.isUpperCase(mn.charAt(3))) { + continue; + } + S.Buffer buf = S.buffer(Character.toLowerCase(mn.charAt(3))); + buf.a(mn.substring(4)); + String key = buf.toString(); + keys.add(key); + if (!labelLookup.containsKey(key)) { + Label label = m.getAnnotation(Label.class); + if (null != label) { + labelLookup.put(key, label.value()); + } + } + Class mt = m.getReturnType(); + Type gmt = m.getGenericReturnType(); + if (isNumeric(mt, gmt)) { + rightAlignCols.add(key); + } + } + return keys; + } + + private boolean isPojo() { + return !isMap && !isAdaptiveMap; + } + + private void setLabelLookup(Map lookup) { + this.labelLookup = lookup; + this.reverseLabelLookup = lookup.isEmpty() ? C.Map() : C.Map(lookup).flipped(); + } +} diff --git a/src/main/java/act/util/PropertySpec.java b/src/main/java/act/util/PropertySpec.java index 69a5e7b4f..b2ef78d56 100644 --- a/src/main/java/act/util/PropertySpec.java +++ b/src/main/java/act/util/PropertySpec.java @@ -277,7 +277,7 @@ public Map labelMapping() { } public Map labelMapping(ActContext context) { - return C.Map(spec(context).labels()); + return null == context ? labelMapping() : C.Map(spec(context).labels()); } public Set excludedFields(ActContext context) { @@ -320,6 +320,9 @@ private Spec httpSpec() { } private Spec spec(ActContext context) { + if (null == context) { + return common; + } if (context instanceof ActionContext) { return null == http || http.isEmpty() ? common : http; } else if (context instanceof CliContext) { diff --git a/src/main/resources/asset/~act/css/act_data_table.css b/src/main/resources/asset/~act/css/act_data_table.css new file mode 100644 index 000000000..f7786eb69 --- /dev/null +++ b/src/main/resources/asset/~act/css/act_data_table.css @@ -0,0 +1,22 @@ +table.act_data_table { + border-collapse: collapse; + font-size: 11pt; +} +table.act_data_table th { + background-color: #007; + padding: 5px; + color: #efefef; + border-color: #efefef; +} +table.act_data_table, table.act_data_table th, table.act_data_table td { + border: 1px solid #007; +} +table.act_data_table td { + padding: 5px; +} +.act_data_table_right { + text-align: right +} +.act_data_table_left { + text-align: left +} \ No newline at end of file diff --git a/src/main/resources/rythm/~table.html b/src/main/resources/rythm/~table.html new file mode 100644 index 000000000..ff21efeac --- /dev/null +++ b/src/main/resources/rythm/~table.html @@ -0,0 +1,53 @@ + +@import act.util.DataTable, org.osgl.Lang +@args DataTable table + + + + @for(table.heading()) { + + } + + + + @def boolean isUrl(Object v) { + if (null == v) {return false;} + if (!(v instanceof String) && !(v instanceof Appendable)) { + return false; + } + String s = v.toString(); + return s.startsWith("http://") || s.startsWith("https://"); + } + @def String toString(Object v) { + if (null == v) return ""; + if (!Lang.isSimpleType(v.getClass())) { + return "
                                                                                                                                                                              " + com.alibaba.fastjson.JSON.toJSONString(v, true) + "
                                                                                                                                                                              "; + } + return v.toString(); + } + @for(Object row: table) { + + @for(String label: table.heading()) { + + } + + } + +
                                                                                                                                                                              @_
                                                                                                                                                                              + @{ + Object v = table.val(row, label) + } + @if(isUrl(v)) { + @v + } else { + @toString(v).raw() + } +
                                                                                                                                                                              \ No newline at end of file diff --git a/src/main/resources/rythm/~table_page.html b/src/main/resources/rythm/~table_page.html new file mode 100644 index 000000000..00bfa1f45 --- /dev/null +++ b/src/main/resources/rythm/~table_page.html @@ -0,0 +1,17 @@ + +@import act.util.DataTable +@args DataTable table, String title + + + @if(title) { + @title + } + + + +@if(title) { +

                                                                                                                                                                              @title

                                                                                                                                                                              +} +@invoke("~table.html", table) + + diff --git a/src/test/java/act/util/DataTableTest.java b/src/test/java/act/util/DataTableTest.java new file mode 100644 index 000000000..56f739ae8 --- /dev/null +++ b/src/test/java/act/util/DataTableTest.java @@ -0,0 +1,66 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.junit.Test; +import org.osgl.util.N; +import org.osgl.util.S; +import osgl.ut.TestBase; + +public class DataTableTest extends TestBase { + + public static class Foo { + public String name; + public int count; + + public Foo(String name, int count) { + this.name = name; + this.count = count; + } + } + + private static Foo randomFoo() { + String name = S.random(); + int count = N.randInt(); + return new Foo(name, count); + } + + @Test + public void testPojoDataTable() { + Foo foo = randomFoo(); + DataTable fooTable = new DataTable(foo); + eq(2, fooTable.colCount()); + eq(1, fooTable.rowCount()); + Object row = fooTable.iterator().next(); + eq(foo.name, fooTable.val(row, 1)); + eq(foo.count, fooTable.val(row, 0)); + eq(foo.name, fooTable.val(row, "name")); + eq(foo.count, fooTable.val(row, "count")); + + DataTable oofTable = fooTable.transpose(); + eq(2, oofTable.colCount()); + eq(2, oofTable.rowCount()); + row = oofTable.iterator().next(); + eq("count", oofTable.val(row, 0)); + eq(foo.count, oofTable.val(row, "_r0")); + } + +} From a141e7f03515e393b9738b5e36b7f4f2713acb83 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 17 Nov 2019 11:51:59 +1100 Subject: [PATCH 554/730] WIP --- pom.xml | 2 +- src/main/java/act/Act.java | 3 +- src/main/java/act/app/ActionContext.java | 23 ++--- src/main/java/act/controller/Controller.java | 83 +++++++++++-------- .../controller/HotReloadingHandler.java | 2 + .../impl/ReflectedHandlerInvoker.java | 6 +- src/main/java/act/mail/MailerConfig.java | 5 +- src/main/java/act/test/RequestBuilder.java | 2 +- .../java/act/test/ScenarioDebugHelper.java | 2 +- .../java/act/util/ActErrorPageRender.java | 16 ++-- src/main/java/act/util/DataTable.java | 5 ++ src/main/java/act/view/RenderAny.java | 11 +-- src/main/java/act/ws/SecureTicketHandler.java | 4 +- src/main/java/act/xio/NetworkHandler.java | 2 +- src/main/resources/rythm/~table.html | 7 +- .../src/main/resources/test/scenarios/809.yml | 2 + 16 files changed, 104 insertions(+), 71 deletions(-) diff --git a/pom.xml b/pom.xml index 85995d440..71bee2634 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ 1.21.1-SNAPSHOT 1.8.0 1.12.0 - 1.11.0 + 1.11.1-SNAPSHOT 1.11.0 1.10.0 1.5.0 diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 00c810734..63181f8a6 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -860,8 +860,7 @@ private static void processEnvironment(AppDescriptor descriptor) { } public static void registerMimeTypes() { - MimeType.findByContentType("text/html").createAlias("htmltable"); - MimeType.findByContentType("text/plain").createAlias("texttable"); + MimeType.findByContentType("text/html").createAlias(DataTable.HTML_TABLE); } public static void registerTypeConverters() { diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 363246b5e..148697866 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -26,6 +26,7 @@ import act.*; import act.conf.AppConfig; +import act.controller.Controller; import act.controller.ParamNames; import act.controller.ResponseCache; import act.controller.captcha.CaptchaViolation; @@ -684,19 +685,19 @@ public UserAgent userAgent() { } public boolean jsonEncoded() { - return req().contentType() == JSON; + return req().contentType().isSameTypeWith(JSON); } public boolean xmlEncoded() { - return req().contentType() == H.Format.XML; + return req().contentType().isSameTypeWith(XML); } public boolean acceptJson() { - return accept() == JSON; + return accept().isSameTypeWith(JSON); } public boolean acceptXML() { - return accept() == H.Format.XML; + return accept().isSameTypeWith(XML); } public boolean isAjax() { @@ -924,9 +925,9 @@ public Result nullValueResultIgnoreRenderArgs() { } else { if (req().method() == H.Method.POST) { H.Format accept = accept(); - if (JSON == accept) { + if (accept.isSameTypeWith(JSON)) { return CREATED_JSON; - } else if (H.Format.XML == accept) { + } else if (accept.isSameTypeWith(XML)) { return CREATED_XML; } else { return CREATED; @@ -977,16 +978,16 @@ public ActionContext applyContentType(Result result) { } private static boolean isErrorCompatible(H.Format fmt) { - return JSON == fmt || HTML == fmt || CSV == fmt || TXT == fmt || XML == fmt; + return fmt.isSameTypeWithAny(JSON, HTML, CSV, TXT, XML); } public static H.Format contentTypeForErrorResult(H.Request req) { H.Format fmt = req.accept(); if (req.isAjax()) { - if (H.Format.UNKNOWN == fmt) { + if (fmt.isSameTypeWith(UNKNOWN)) { fmt = req.contentType(); } - if (JSON == fmt || H.Format.XML == fmt) { + if (fmt.isSameTypeWithAny(XML, JSON)) { return fmt; } } @@ -999,13 +1000,13 @@ public static H.Format contentTypeForErrorResult(H.Request req) { public ActionContext applyContentType() { ActResponse resp = resp(); H.Format lastContentType = resp.lastContentType(); - if (null != lastContentType && $.ne(H.Format.UNKNOWN, lastContentType)) { + if (null != lastContentType && !lastContentType.isSameTypeWith(UNKNOWN)) { resp.commitContentType(); return this; } H.Request req = req(); H.Format fmt = req.accept(); - if (H.Format.UNKNOWN == fmt) { + if (fmt.isSameTypeWith(UNKNOWN)) { fmt = req.contentType(); } applyContentType(fmt); diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 21a1a395b..fb33eeda0 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -47,6 +47,7 @@ import java.io.InputStream; import java.lang.annotation.*; import java.net.URL; +import java.util.Iterator; import java.util.Map; import javax.inject.Inject; @@ -61,6 +62,8 @@ @Target(ElementType.TYPE) public @interface Controller { + H.Format FMT_HTML_TABLE = H.Format.of(DataTable.HTML_TABLE); + /** * Indicate the context path for all action methods declared * in this controller. @@ -102,9 +105,9 @@ class Util { */ public static Result ok() { H.Format accept = ActionContext.current().accept(); - if (H.Format.JSON == accept) { + if (accept.isSameTypeWith(H.Format.JSON)) { return OK_JSON; - } else if (H.Format.XML == accept) { + } else if (accept.isSameTypeWith(H.Format.XML)) { return OK_XML; } return OK; @@ -1748,7 +1751,8 @@ public static Result inferResult(Result r, ActionContext actionContext) { public static Result inferPrimitiveResult( Object v, ActionContext actionContext, boolean requireJSON, - boolean requireXML, boolean requireYAML, boolean isArray, boolean shouldUseToString) { + boolean requireXML, boolean requireYAML, boolean isArray, + boolean shouldUseToString) { H.Status status = actionContext.successStatus(); if (requireJSON) { if (isArray) { @@ -1777,32 +1781,19 @@ public static Result inferPrimitiveResult( return RenderYAML.of(status, v); } else if (v instanceof byte[]) { H.Format fmt = actionContext.accept(); - if (H.Format.UNKNOWN == fmt) { + if (H.Format.UNKNOWN.isSameTypeWith(fmt)) { actionContext.resp().contentType("application/octet-stream"); } return new RenderBinary((byte[]) v); } else { H.Format fmt = actionContext.accept(); String fmtName = fmt.name(); - String s = fmt.isText() ? (v instanceof String ? (String) v : $$.toString(v, shouldUseToString)) : null; if (S.eq(fmtName, "qrcode")) { - return new ZXingResult(s, BarcodeFormat.QR_CODE); + return new ZXingResult(v2s(v, shouldUseToString), BarcodeFormat.QR_CODE); } else if (S.eq(fmtName, "barcode")) { - return new ZXingResult(s, BarcodeFormat.CODE_128); - } else if (S.eq(fmtName, "htmltable")) { - boolean fullPage = $.bool(actionContext.paramVal("_fullPage")); - actionContext.templatePath(fullPage ? "/~table_page.html" : "/~table.html"); - DataTable dataTable = new DataTable(v); - if (1 == dataTable.rowCount()) { - dataTable = dataTable.transpose(); - } - actionContext.renderArg("table", dataTable); - if (fullPage) { - actionContext.renderArg("title", "Data table - " + actionContext.handlerMethod().getName()); - } - return RenderTemplate.get(); - } else if (null != s) { - return RenderText.of(status, fmt, s); + return new ZXingResult(v2s(v, shouldUseToString), BarcodeFormat.CODE_128); + } else if (fmt.isText()) { + return RenderText.of(status, fmt, v2s(v, shouldUseToString)); } DirectRender dr = Act.viewManager().loadDirectRender(actionContext); if (null == dr) { @@ -1812,6 +1803,10 @@ public static Result inferPrimitiveResult( } } + private static String v2s(Object v, boolean shouldUseToString) { + return (v instanceof String ? (String) v : $$.toString(v, shouldUseToString)); + } + public static Result inferResult(Map map, ActionContext actionContext) { if (actionContext.acceptJson()) { return RenderJSON.of(actionContext.successStatus(), map); @@ -1927,9 +1922,9 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } H.Format accept = context.accept(); - boolean requireJSON = (accept == H.Format.JSON) || (accept == H.Format.UNKNOWN); - boolean requireXML = !requireJSON && accept == H.Format.XML; - boolean requireYAML = (!requireJSON && !requireXML) && accept == H.Format.YAML; + boolean requireJSON = accept.isSameTypeWithAny(H.Format.JSON, H.Format.UNKNOWN); + boolean requireXML = !requireJSON && accept.isSameTypeWith(H.Format.XML); + boolean requireYAML = (!requireJSON && !requireXML) && accept.isSameTypeWith(H.Format.YAML); if (null == v) { // the following code breaks before handler without returning result @@ -1940,10 +1935,10 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon if (null != jsonPath) { v = JSONPath.eval(v, jsonPath); } - Class vCls = v.getClass(); + Class vCls = v.getClass(); boolean isSimpleType = $.isSimpleType(vCls); boolean shouldUseToString = $$.shouldUseToString(vCls); - if (accept == H.Format.HTML && !shouldUseToString) { + if (H.Format.HTML.isSameTypeWith(accept) && !shouldUseToString) { requireJSON = true; context.resp().contentType(H.Format.JSON); } @@ -1958,10 +1953,9 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon return inferResult((ISObject) v, context); } else { PropertySpec.MetaInfo propertySpec = PropertySpec.MetaInfo.withCurrent(meta, context); - if (requireJSON || H.Format.UNKNOWN == context.req().accept()) { - boolean isIterable = v instanceof Iterable; - if (isIterable) { - v = new FastJsonIterable((Iterable) v); + if (requireJSON || H.Format.UNKNOWN.isSameTypeWith(accept)) { + if (v instanceof Iterable) { + v = new FastJsonIterable<>((Iterable) v); } // no need to check string case as it is already checked above if (v instanceof $.Visitor) { @@ -1973,7 +1967,7 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon return context.isLargeResponse() ? RenderJSON.of(status, jsonWriter) : RenderJSON.of(status, jsonWriter.asContentProducer()); } else if (requireXML) { return new FilteredRenderXML(status, v, propertySpec, context); - } else if (context.accept() == H.Format.CSV) { + } else if (context.accept().isSameTypeWith(H.Format.CSV)) { return RenderCSV.of(status, v, propertySpec, context); } else if (requireYAML) { if (null != propertySpec) { @@ -1984,9 +1978,32 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon v = stage.to(newRetVal); } return RenderYAML.of(status, v); + } else if (FMT_HTML_TABLE == accept) { + boolean fullPage = $.not(context.paramVal("_snippet")); + context.templatePath(fullPage ? "/~table_page.html" : "/~table.html"); + DataTable dataTable = new DataTable(v, propertySpec); + if (1 == dataTable.rowCount()) { + dataTable = dataTable.transpose(); + } + context.renderArg("table", dataTable); + if (fullPage) { + context.renderArg("title", "Data table - " + context.handlerMethod().getName()); + } + req.accept(H.Format.HTML); + return RenderTemplate.get(); } else { - boolean isArray = vCls.isArray(); - return inferPrimitiveResult(v, context, false, requireXML, requireYAML, isArray, shouldUseToString); + DirectRender dr = Act.viewManager().loadDirectRender(context); + if (null != dr) { + return new DirectRenderResult(dr, v); + } + // fall back to JSON + if (v instanceof $.Visitor) { + return RenderJSON.of(status, ($.Visitor) v); + } else if (v instanceof $.Func0) { + return RenderJSON.of(status, ($.Func0) v); + } + JsonWriter jsonWriter = new JsonWriter(v, propertySpec, false, context); + return context.isLargeResponse() ? RenderJSON.of(status, jsonWriter) : RenderJSON.of(status, jsonWriter.asContentProducer()); } } } diff --git a/src/main/java/act/handler/builtin/controller/HotReloadingHandler.java b/src/main/java/act/handler/builtin/controller/HotReloadingHandler.java index 6181c3c9f..19f688e1a 100644 --- a/src/main/java/act/handler/builtin/controller/HotReloadingHandler.java +++ b/src/main/java/act/handler/builtin/controller/HotReloadingHandler.java @@ -25,6 +25,7 @@ import act.app.App; import act.handler.ExpressHandler; import act.view.HotReloading; +import org.osgl.http.H; import org.osgl.mvc.result.Conflict; import java.util.concurrent.atomic.AtomicInteger; @@ -57,6 +58,7 @@ public void handle(ActionContext context) { HIT_COUNTER.set(delay); } context.renderArg("delay", delay); + context.accept(H.Format.HTML); HOT_RELOADING.apply(context.req(), context.prepareRespForResultEvaluation()); } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 8ad014127..455f2be91 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -620,7 +620,7 @@ public Result handle(final ActionContext context) { } else { String payload; H.Format accept = context.accept(); - boolean requireXML = accept == H.Format.XML; + boolean requireXML = accept.isSameTypeWith(H.Format.XML); JSONObject json = $.deepCopy(retVal).to(JSONObject.class); if (requireXML) { Document doc = $.convert(json).to(Document.class); @@ -648,7 +648,7 @@ public Result handle(final ActionContext context) { * 1) this is an ajax call * 2) the accept content type is **NOT** html */ - boolean failOnViolation = context.isAjax() || context.accept() != H.Format.HTML; + boolean failOnViolation = context.isAjax() || !context.accept().isSameTypeWith(H.Format.HTML); if (failOnViolation) { String msg = context.violationMessage(";"); @@ -687,7 +687,7 @@ protected void run(ProgressGauge progressGauge) { WebSocketConnectionManager wscm = app.getInstance(WebSocketConnectionManager.class); wscm.subscribe(context.session(), SimpleProgressGauge.wsJobProgressTag(jobId)); jobManager.now(jobId); - boolean renderAsyncJobPage = reportAsyncProgress && (context.req().accept() == H.Format.HTML); + boolean renderAsyncJobPage = reportAsyncProgress && (context.req().accept().isSameTypeWith(H.Format.HTML)); if (renderAsyncJobPage) { context.templatePath("/act/asyncJob.html"); context.renderArg("jobId", jobId); diff --git a/src/main/java/act/mail/MailerConfig.java b/src/main/java/act/mail/MailerConfig.java index 45045958b..bb7771710 100644 --- a/src/main/java/act/mail/MailerConfig.java +++ b/src/main/java/act/mail/MailerConfig.java @@ -35,6 +35,9 @@ import javax.mail.internet.InternetAddress; import java.util.*; +import static org.osgl.http.H.Format.HTML; +import static org.osgl.http.H.Format.TXT; + public class MailerConfig extends AppHolderBase { public static final String FROM = "from"; @@ -210,7 +213,7 @@ private H.Format getContentTypeConfig(Map properties) { } try { H.Format fmt = H.Format.valueOf(s); - if (H.Format.HTML == fmt || H.Format.TXT == fmt) { + if (fmt.isSameTypeWithAny(HTML, TXT)) { return fmt; } throw E.invalidConfiguration("Content type not supported by mailer: %s", fmt); diff --git a/src/main/java/act/test/RequestBuilder.java b/src/main/java/act/test/RequestBuilder.java index 7f812376e..11bd0f07a 100644 --- a/src/main/java/act/test/RequestBuilder.java +++ b/src/main/java/act/test/RequestBuilder.java @@ -55,7 +55,7 @@ class RequestBuilder { if (null == format) { format = H.Format.resolve(accept); } - if (H.Format.UNKNOWN == format) { + if (H.Format.UNKNOWN.isSameTypeWith(format)) { throw new UnexpectedException("Invalid accept in request spec: " + accept); } accept = format.contentType(); diff --git a/src/main/java/act/test/ScenarioDebugHelper.java b/src/main/java/act/test/ScenarioDebugHelper.java index bd1b0111b..50a8e74b8 100644 --- a/src/main/java/act/test/ScenarioDebugHelper.java +++ b/src/main/java/act/test/ScenarioDebugHelper.java @@ -142,7 +142,7 @@ public List run(App app, String partition, ActionContext context, Prog @GetAction({"e2e/{testId}", "test/{testId}", "tests/{testId}"}) public List runTest(App app, Keyword testId, ActionContext context, ProgressGauge gauge) { - if (context.accept() == H.Format.HTML) { + if (context.accept().isSameTypeWith(H.Format.HTML)) { context.templatePath("/~test.html"); } List results = test.run(app, testId, null, false, gauge); diff --git a/src/main/java/act/util/ActErrorPageRender.java b/src/main/java/act/util/ActErrorPageRender.java index f67356229..3fdcaa001 100644 --- a/src/main/java/act/util/ActErrorPageRender.java +++ b/src/main/java/act/util/ActErrorPageRender.java @@ -24,6 +24,7 @@ import act.Act; import act.app.ActionContext; +import act.controller.Controller; import act.view.Template; import act.view.ViewManager; import org.osgl.$; @@ -67,15 +68,15 @@ protected String renderTemplate(ErrorResult error, H.Format format) { errorMsg = translated; } H.Format accept = context.accept(); - if (H.Format.JSON == accept) { + if (H.Format.JSON.isSameTypeWith(accept)) { return jsonContent(error, errorCode, errorMsg); - } else if (HTML == accept) { + } else if (HTML.isSameTypeWith(accept)) { String header = S.concat("HTTP/1.1 ", Integer.toString(statusCode), " ", errorMsg); return S.concat("" , header , "

                                                                                                                                                                              " , header, "

                                                                                                                                                                              "); - } else if (H.Format.XML == accept) { + } else if (H.Format.XML.isSameTypeWith(accept)) { S.Buffer sb = S.buffer(); sb.append(""); if (null != errorCode) { @@ -83,13 +84,13 @@ protected String renderTemplate(ErrorResult error, H.Format format) { } sb.append("").append(errorMsg).append(""); return sb.toString(); - } else if (CSV == accept) { + } else if (CSV.isSameTypeWith(accept)) { if (null == errorCode) { return S.concat("message\n", errorMsg); } else { return S.concat("code,message\n", Integer.toString(errorCode), ",", errorMsg); } - } else if (H.Format.TXT == accept) { + } else if (H.Format.TXT.isSameTypeWith(accept)) { return null == errorCode ? errorMsg : S.concat(Integer.toString(errorCode), " ", errorMsg); } else { // Unknown accept format @@ -113,10 +114,7 @@ private void fixRequestAcceptFormat(ActionContext context) { } private boolean isAcceptGoodForErrorPage(H.Format fmt) { - return (HTML == fmt - || CSV == fmt - || H.Format.JSON == fmt - || XML == fmt); + return fmt.isSameTypeWithAny(HTML, CSV, JSON, XML); } private String jsonContent(ErrorResult error, Integer errorCode, String errorMsg) { diff --git a/src/main/java/act/util/DataTable.java b/src/main/java/act/util/DataTable.java index e0bc66631..6120b23ab 100644 --- a/src/main/java/act/util/DataTable.java +++ b/src/main/java/act/util/DataTable.java @@ -46,6 +46,8 @@ */ public class DataTable implements Iterable { + public static final String HTML_TABLE = "htmltable"; + public static final String KEY_FIELD = "_field"; private List colKeys; @@ -351,6 +353,9 @@ private void initHeading(Object data, PropertySpec.MetaInfo colSpec) { int max = Math.min(rowCount, 10); // probe at most 10 rows of data for labels SortedSet keys; if (isPojo()) { + if (null == firstRow) { + firstRow = rows.iterator().next(); + } keys = keysOf(firstRow); } else { keys = new TreeSet<>(); diff --git a/src/main/java/act/view/RenderAny.java b/src/main/java/act/view/RenderAny.java index 857e7479b..04d2a561a 100644 --- a/src/main/java/act/view/RenderAny.java +++ b/src/main/java/act/view/RenderAny.java @@ -24,6 +24,7 @@ import act.ActResponse; import act.app.ActionContext; +import act.controller.Controller; import org.osgl.http.H; import org.osgl.mvc.result.*; import org.osgl.storage.ISObject; @@ -67,7 +68,7 @@ public void apply(ActionContext context) { return; } H.Format fmt = context.accept(); - if (fmt == UNKNOWN) { + if (fmt.isSameTypeWith(UNKNOWN)) { H.Request req = context.req(); if (req.userAgent().isIE9Down()) { fmt = HTML; @@ -84,7 +85,7 @@ public void apply(ActionContext context) { } } Result result = null; - if (JSON == fmt) { + if (JSON.isSameTypeWith(fmt)) { List varNames = context.__appRenderArgNames(); Map map = new HashMap<>(context.renderArgs()); if (null != varNames && !varNames.isEmpty()) { @@ -93,7 +94,7 @@ public void apply(ActionContext context) { } } result = new RenderJSON(map); - } else if (XML == fmt) { + } else if (XML.isSameTypeWith(fmt)) { List varNames = context.__appRenderArgNames(); Map map = new HashMap<>(); if (null != varNames && !varNames.isEmpty()) { @@ -102,13 +103,13 @@ public void apply(ActionContext context) { } } result = new FilteredRenderXML(map, null, context); - } else if (HTML == fmt || TXT == fmt || CSV == fmt) { + } else if (fmt.isSameTypeWithAny(HTML, TXT, CSV)) { if (!ignoreMissingTemplate) { throw E.unsupport("Template[%s] not found", context.templatePath()); } context.nullValueResultIgnoreRenderArgs().apply(context.req(), context.prepareRespForResultEvaluation()); return; - } else if (PDF == fmt || XLS == fmt || XLSX == fmt || DOC == fmt || DOCX == fmt) { + } else if (fmt.isSameTypeWithAny(PDF, XLS, XLSX, DOC, DOCX)) { List varNames = context.__appRenderArgNames(); if (null != varNames && !varNames.isEmpty()) { Object firstVar = context.renderArg(varNames.get(0)); diff --git a/src/main/java/act/ws/SecureTicketHandler.java b/src/main/java/act/ws/SecureTicketHandler.java index cc951134c..a3a6fbdd6 100644 --- a/src/main/java/act/ws/SecureTicketHandler.java +++ b/src/main/java/act/ws/SecureTicketHandler.java @@ -55,10 +55,10 @@ public void handle(ActionContext context) { H.Response resp = context.prepareRespForResultEvaluation(); resp.contentType(accept.contentType()); String content; - if (H.Format.JSON == accept) { + if (H.Format.JSON.isSameTypeWith(accept)) { Map map = C.Map("ticket", ticket); content = JSON.toJSONString(map); - } else if (H.Format.XML == accept) { + } else if (H.Format.XML.isSameTypeWith(accept)) { content = S.concat("", ticket.toString(), ""); } else { content = ticket.toString(); diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 0e5db40e0..a452f5d99 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -204,7 +204,7 @@ public void run() { } H.Format fmt = req.accept(); - if (H.Format.UNKNOWN == fmt) { + if (H.Format.UNKNOWN.isSameTypeWith(fmt)) { fmt = req.contentType(); } diff --git a/src/main/resources/rythm/~table.html b/src/main/resources/rythm/~table.html index ff21efeac..76f16ee28 100644 --- a/src/main/resources/rythm/~table.html +++ b/src/main/resources/rythm/~table.html @@ -18,6 +18,11 @@ String s = v.toString(); return s.startsWith("http://") || s.startsWith("https://"); } + @def String addHtmlTableAccept(Object v) { + if (null == v) return ""; + String url = v.toString(); + return url + (url.contains("?") ? "&" : "?") + "_accept=htmltable"; + } @def String toString(Object v) { if (null == v) return ""; if (!Lang.isSimpleType(v.getClass())) { @@ -41,7 +46,7 @@ Object v = table.val(row, label) } @if(isUrl(v)) { - @v + @v } else { @toString(v).raw() } diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/809.yml b/testapps/GHIssues/src/main/resources/test/scenarios/809.yml index f036e32fd..c51dce010 100644 --- a/testapps/GHIssues/src/main/resources/test/scenarios/809.yml +++ b/testapps/GHIssues/src/main/resources/test/scenarios/809.yml @@ -4,6 +4,8 @@ Scenario(809): - description: Test request: get: 809 + headers: + accept: text/html response: html: h1: GH809 From 7b55355f5f3846d47cf9832eb695efaca915177b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 17 Nov 2019 21:03:46 +1100 Subject: [PATCH 555/730] DataTable - keep enhancement --- legacy-testapp/pom.xml | 4 ++-- src/main/java/act/Act.java | 2 +- .../java/act/app/util/SimpleRestfulServiceBase.java | 9 +++++++++ src/main/java/act/controller/Controller.java | 11 ++++++++++- .../controller/impl/ReflectedHandlerInvoker.java | 2 +- src/main/java/act/util/DataTable.java | 7 ++++++- src/main/resources/asset/~act/css/act_data_table.css | 7 ++++++- src/main/resources/rythm/~table.html | 6 ++++-- testapps/GHIssues/src/main/java/ghissues/Gh1104.java | 2 +- 9 files changed, 40 insertions(+), 10 deletions(-) diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 4b805ff18..34b7a3645 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,9 +73,9 @@ UTF-8 UTF-8 - 1.8.29-SNAPSHOT + 1.8.30-SNAPSHOT [0.13.0, 2.0.0) - 1.8.0-SNAPSHOT + 1.8.1-SNAPSHOT testapp.TestApp diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 63181f8a6..5cff9266d 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -860,7 +860,7 @@ private static void processEnvironment(AppDescriptor descriptor) { } public static void registerMimeTypes() { - MimeType.findByContentType("text/html").createAlias(DataTable.HTML_TABLE); + MimeType.registerMimeType(DataTable.HTML_TABLE, "text/x-html-table"); } public static void registerTypeConverters() { diff --git a/src/main/java/act/app/util/SimpleRestfulServiceBase.java b/src/main/java/act/app/util/SimpleRestfulServiceBase.java index a6ba35b9d..ed9b4f5bd 100644 --- a/src/main/java/act/app/util/SimpleRestfulServiceBase.java +++ b/src/main/java/act/app/util/SimpleRestfulServiceBase.java @@ -65,6 +65,13 @@ public SimpleRestfulServiceBase(DAO_TYPE dao) { this.dao = $.requireNotNull(dao); } + @Before + public void setPropertySpec(String _propSpec) { + if ($.bool(_propSpec)) { + PropertySpec.current.set(_propSpec); + } + } + /** * Sub type can override this method to update the query `q` to ensure * the returned data list is only accessible to the current login user. @@ -176,6 +183,7 @@ protected void onDeletingEntity(MODEL_TYPE entity) {} * @return ${MODEL_TYPE} records as specified above. */ @GetAction + @PropertySpec("-idAsStr,-v") public Iterable list(int _page, int _pageSize, String _orderBy) { E.illegalArgumentIf(_page < 0, "page number is less than zero"); E.illegalArgumentIf(_pageSize < 0, "page size is less than zero"); @@ -198,6 +206,7 @@ public Iterable list(int _page, int _pageSize, String _orderBy) { * @return a ${MODEL_TYPE} record specified by URL path variable `model` */ @GetAction("{entity}") + @PropertySpec("-idAsStr,-v") public MODEL_TYPE get(@DbBind MODEL_TYPE entity) { onGettingEntity(entity); return entity; diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index fb33eeda0..bc62d471d 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1987,7 +1987,16 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } context.renderArg("table", dataTable); if (fullPage) { - context.renderArg("title", "Data table - " + context.handlerMethod().getName()); + String s = context.actionPath(); + if (s.contains(".")) { + String methodName = S.cut(s).afterLast("."); + String className = S.cut(s).beforeLast("."); + if (className.contains(".")) { + className = S.cut(className).afterLast("."); + } + s = S.concat(className, ".", methodName); + } + context.renderArg("title", s); } req.accept(H.Format.HTML); return RenderTemplate.get(); diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 455f2be91..b7f878978 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -890,7 +890,7 @@ private Class[] paramTypes(App app) { } private void processForceResponse(ActionContext actionContext) { - if (null != forceResponseContentType) { + if (null != forceResponseContentType && $.not(actionContext.paramVal("_accept"))) { actionContext.accept(forceResponseContentType); } if (null != forceResponseStatus) { diff --git a/src/main/java/act/util/DataTable.java b/src/main/java/act/util/DataTable.java index 6120b23ab..f053171ce 100644 --- a/src/main/java/act/util/DataTable.java +++ b/src/main/java/act/util/DataTable.java @@ -314,6 +314,11 @@ private void initRows(Object data) { rowCount = col.size(); rows = col; } else if (data instanceof Iterable) { + Iterable iterable = $.cast(data); + if (iterable.iterator() == iterable) { + initRows(C.list(iterable)); + return; + } rows = $.cast(data); rowCount = -1; } else { @@ -346,7 +351,7 @@ private void initHeading(Object data, PropertySpec.MetaInfo colSpec) { } } if (null == labelLookup) { - setLabelLookup(C.Map()); + setLabelLookup(C.newMap()); } // explore data rows to probe fields E.illegalArgumentIf(0 == rowCount, "Unable to probe table heading: no data found"); diff --git a/src/main/resources/asset/~act/css/act_data_table.css b/src/main/resources/asset/~act/css/act_data_table.css index f7786eb69..fa436d08b 100644 --- a/src/main/resources/asset/~act/css/act_data_table.css +++ b/src/main/resources/asset/~act/css/act_data_table.css @@ -1,6 +1,7 @@ table.act_data_table { border-collapse: collapse; font-size: 11pt; + font-family: cousine, "Droid Sans Mono Dotted", "Envy Code R", "Fira Code", Monaco, monospaced; } table.act_data_table th { background-color: #007; @@ -19,4 +20,8 @@ table.act_data_table td { } .act_data_table_left { text-align: left -} \ No newline at end of file +} +table.act_data_table pre { + margin: 0; + font-family: cousine, "Droid Sans Mono Dotted", "Envy Code R", "Fira Code", Monaco, monospaced; +} diff --git a/src/main/resources/rythm/~table.html b/src/main/resources/rythm/~table.html index 76f16ee28..980c8d52c 100644 --- a/src/main/resources/rythm/~table.html +++ b/src/main/resources/rythm/~table.html @@ -1,5 +1,5 @@ -@import act.util.DataTable, org.osgl.Lang +@import act.util.DataTable, org.osgl.Lang, org.osgl.util.S @args DataTable table @@ -26,7 +26,9 @@ @def String toString(Object v) { if (null == v) return ""; if (!Lang.isSimpleType(v.getClass())) { - return "
                                                                                                                                                                              " + com.alibaba.fastjson.JSON.toJSONString(v, true) + "
                                                                                                                                                                              "; + String s = com.alibaba.fastjson.JSON.toJSONString(v, true); + s = S.strip(s).of(S.DOUBLE_QUOTES); + return "
                                                                                                                                                                              " + s + "
                                                                                                                                                                              "; } return v.toString(); } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1104.java b/testapps/GHIssues/src/main/java/ghissues/Gh1104.java index 5ac107fa4..d4de7ece5 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh1104.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1104.java @@ -12,7 +12,7 @@ import java.util.Map; @UrlContext("1104") -@JsonView +//@JsonView @SuppressWarnings("unused") public class Gh1104 extends BaseController { From 0f2be476c72df4b8b4fd059a7ff58ee50abee025 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 17 Nov 2019 21:52:07 +1100 Subject: [PATCH 556/730] DataTable - fix issue - labelLookup map is readonly --- src/main/java/act/controller/Controller.java | 2 +- src/main/java/act/util/DataTable.java | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index bc62d471d..06da3b383 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1978,7 +1978,7 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon v = stage.to(newRetVal); } return RenderYAML.of(status, v); - } else if (FMT_HTML_TABLE == accept) { + } else if (FMT_HTML_TABLE.isSameTypeWith(accept)) { boolean fullPage = $.not(context.paramVal("_snippet")); context.templatePath(fullPage ? "/~table_page.html" : "/~table.html"); DataTable dataTable = new DataTable(v, propertySpec); diff --git a/src/main/java/act/util/DataTable.java b/src/main/java/act/util/DataTable.java index f053171ce..5f3ead694 100644 --- a/src/main/java/act/util/DataTable.java +++ b/src/main/java/act/util/DataTable.java @@ -59,9 +59,9 @@ public class DataTable implements Iterable { private Object firstRow; private Set rightAlignCols; // key: col key; val: label - private Map labelLookup; + private C.Map labelLookup; // key: label, val: col key - private Map reverseLabelLookup; + private C.Map reverseLabelLookup; // the transpose table of this table private transient volatile DataTable transpose; @@ -449,7 +449,7 @@ private SortedSet keysOf(Object pojo) { if (!labelLookup.containsKey(fn)) { Label label = f.getAnnotation(Label.class); if (null != label) { - labelLookup.put(fn, label.value()); + addLabelLookup(fn, label.value()); } } Class ft = f.getType(); @@ -483,7 +483,7 @@ private SortedSet keysOf(Object pojo) { if (!labelLookup.containsKey(key)) { Label label = m.getAnnotation(Label.class); if (null != label) { - labelLookup.put(key, label.value()); + addLabelLookup(key, label.value()); } } Class mt = m.getReturnType(); @@ -500,7 +500,12 @@ private boolean isPojo() { } private void setLabelLookup(Map lookup) { - this.labelLookup = lookup; - this.reverseLabelLookup = lookup.isEmpty() ? C.Map() : C.Map(lookup).flipped(); + this.labelLookup = C.newMap(lookup); + this.reverseLabelLookup = this.labelLookup.flipped(); + } + + private void addLabelLookup(String colKey, String label) { + this.labelLookup.put(colKey, label); + this.reverseLabelLookup.put(label, colKey); } } From b4f9583b5851622c671e729848d2a50cbe33c212 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 19 Nov 2019 21:10:17 +1100 Subject: [PATCH 557/730] fix #1246, #1247 and #1248 --- CHANGELOG.md | 6 +++++- src/main/java/act/apidoc/Endpoint.java | 10 ++++------ .../apidoc/sampledata/DobStringProvider.java | 20 ++++++++++++------- .../app/util/SimpleRestfulServiceBase.java | 15 +++++++++++++- src/main/java/act/controller/Controller.java | 5 ++++- .../java/act/data/JodaDateTimeCodecBase.java | 7 +++++++ src/main/java/act/util/DataTable.java | 9 ++++++--- 7 files changed, 53 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d44564328..a90aa904c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,12 @@ # ActFramework Change Log **1.8.30** -* Support `htmltable` pseudo Accept type #1244 +* SimpleRestfulServiceBase - property spec enhancements #1248 +* Param binding - allow specify `now` in `DefaultValue` for Date types #1247 +* API doc - DOB sample data generator generates invalid date string #1246 * Allow it specify particular part of returned data in response using `_jsonPath` parameter #1245 +* Support `htmltable` pseudo Accept type #1244 +* Ehcache 在 热重载时 无法找到 EhCacheServiceProvider 的 _reset 方法。 #1243 * `__path` param value needs to be sanitized #1241 * Act-Test - add an `entityId()` function #1240 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index d5127bfdf..436e80a06 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -155,15 +155,13 @@ public String getDefaultValue() { private String checkDefaultValue(BeanSpec spec) { DefaultValue def = spec.getAnnotation(DefaultValue.class); + String defStr = ""; if (null != def) { - return def.value(); + defStr = def.value(); } Class type = spec.rawType(); - if (type.isPrimitive()) { - Object o = Act.app().resolverManager().resolve("", type); - return null != o ? o.toString() : null; - } - return null; + Object o = Act.app().resolverManager().resolve(defStr, type); + return S.string(o); } private boolean checkRequired(BeanSpec spec) { diff --git a/src/main/java/act/apidoc/sampledata/DobStringProvider.java b/src/main/java/act/apidoc/sampledata/DobStringProvider.java index 0c39de837..f777e64e7 100644 --- a/src/main/java/act/apidoc/sampledata/DobStringProvider.java +++ b/src/main/java/act/apidoc/sampledata/DobStringProvider.java @@ -34,18 +34,24 @@ public class DobStringProvider extends SampleDataProvider { @Override public String get() { - return S.join("-", randYear(), randMon(), randDoM()); + int y = randYear(); + int m = randMon(); + int d = randDoM(); + if (m == 2 && d > 28) { + d = 28; + } + return S.concat(y, "-", m, "-", d); } - private String randYear() { - return S.string($.random(IntRange.of(1940, 2018))); + private int randYear() { + return $.random(IntRange.of(1940, 2018)); } - private String randMon() { - return S.string($.random(IntRange.of(1, 13))); + private int randMon() { + return $.random(IntRange.of(1, 13)); } - private String randDoM() { - return S.string($.random(IntRange.of(1, 31))); + private int randDoM() { + return $.random(IntRange.of(1, 29)); } } diff --git a/src/main/java/act/app/util/SimpleRestfulServiceBase.java b/src/main/java/act/app/util/SimpleRestfulServiceBase.java index ed9b4f5bd..3ea5d8400 100644 --- a/src/main/java/act/app/util/SimpleRestfulServiceBase.java +++ b/src/main/java/act/app/util/SimpleRestfulServiceBase.java @@ -57,6 +57,9 @@ @NoBind protected DAO_TYPE dao; + @NoBind + private boolean disableDynamicPropSpec; + public SimpleRestfulServiceBase() { exploreTypes(); } @@ -65,9 +68,19 @@ public SimpleRestfulServiceBase(DAO_TYPE dao) { this.dao = $.requireNotNull(dao); } + protected SimpleRestfulServiceBase(boolean disableDynamicPropSpec) { + exploreTypes(); + this.disableDynamicPropSpec = disableDynamicPropSpec; + } + + protected SimpleRestfulServiceBase(DAO_TYPE dao, boolean disableDynamicPropSpec) { + this.dao = $.requireNotNull(dao); + this.disableDynamicPropSpec = disableDynamicPropSpec; + } + @Before public void setPropertySpec(String _propSpec) { - if ($.bool(_propSpec)) { + if (!disableDynamicPropSpec && $.bool(_propSpec)) { PropertySpec.current.set(_propSpec); } } diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 06da3b383..934e5cdea 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -2050,7 +2050,10 @@ private static H.Status successStatus() { /** * Controller class extends this class automatically get `ActionContext` injected - * as a field + * as a field. + * + * Note this will make the controller be no longer a Singleton because the `context` + * field is not stateless. */ class Base extends Util { @Inject diff --git a/src/main/java/act/data/JodaDateTimeCodecBase.java b/src/main/java/act/data/JodaDateTimeCodecBase.java index bfd50a7c9..40310f8f2 100644 --- a/src/main/java/act/data/JodaDateTimeCodecBase.java +++ b/src/main/java/act/data/JodaDateTimeCodecBase.java @@ -111,6 +111,13 @@ public final T resolve(String value) { if (S.blank(value)) { return null; } + if ("now".equalsIgnoreCase(value) + || "today".equalsIgnoreCase(value) + || "现在".equalsIgnoreCase(value) + || "今天".equalsIgnoreCase(value) + ) { + return now(); + } // for #691 int len = value.length(); if (9 == len || 10 == len) { diff --git a/src/main/java/act/util/DataTable.java b/src/main/java/act/util/DataTable.java index 5f3ead694..431dc2c34 100644 --- a/src/main/java/act/util/DataTable.java +++ b/src/main/java/act/util/DataTable.java @@ -339,6 +339,7 @@ private void initRows(Object data) { // for exploring output fields in case heading is not specified with `PropertySpec` private void initHeading(Object data, PropertySpec.MetaInfo colSpec) { Set excludes = C.Set(); + boolean headingLoaded = false; if (null != colSpec) { ActContext context = ActContext.Base.currentContext(); setLabelLookup(colSpec.labelMapping(context)); @@ -346,7 +347,7 @@ private void initHeading(Object data, PropertySpec.MetaInfo colSpec) { if ($.not(excludes)) { colKeys = colSpec.outputFields(context); if ($.bool(colKeys)) { - return; + headingLoaded = true; } } } @@ -375,8 +376,10 @@ private void initHeading(Object data, PropertySpec.MetaInfo colSpec) { } } } - keys.removeAll(excludes); - colKeys = C.list(keys); + if (!headingLoaded) { + keys.removeAll(excludes); + colKeys = C.list(keys); + } } private boolean isNumeric(Object v) { From 425f22b808c4c1f38d478b5b0cdcc4e1d33e3085 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 20 Nov 2019 21:23:34 +1100 Subject: [PATCH 558/730] API Doc - Return sample for array is not correct #1250 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/Endpoint.java | 61 ++++++++++++------- .../act/inject/param/CollectionLoader.java | 4 ++ 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a90aa904c..01f225087 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.30** +* API Doc - Return sample for array is not correct #1250 * SimpleRestfulServiceBase - property spec enhancements #1248 * Param binding - allow specify `now` in `DefaultValue` for Date types #1247 * API doc - DOB sample data generator generates invalid date string #1246 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 436e80a06..dbe100ade 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -583,6 +583,10 @@ private boolean isLoginUser(Annotation[] annos) { return false; } + private boolean isValidJson(String s) { + return S.is(s).wrappedWith(S.BRACES) || S.is(s).wrappedWith(S.BRACKETS); + } + private String generateSampleJson(BeanSpec spec, Map typeParamLookup, boolean isReturn) { Class type = spec.rawType(); if (Result.class.isAssignableFrom(type) || void.class == type) { @@ -595,7 +599,7 @@ private String generateSampleJson(BeanSpec spec, Map typeParamLoo if (returnSampleObject instanceof Map && ((Map) returnSampleObject).isEmpty()) { return null; } - if ($.isSimpleType(type)) { + if (!type.isArray() && $.isSimpleType(type) && (String.class != type || !isValidJson(S.string(returnSampleObject)))) { returnSampleObject = C.Map("result", returnSampleObject); } SerializeFilter[] filters = new SerializeFilter[null == fastJsonPropertyPreFilter ? 0 : 1]; @@ -756,9 +760,8 @@ public static Object generateSampleData( } try { if (classType.isEnum()) { - Object[] ea = classType.getEnumConstants(); - int len = ea.length; - return 0 < len ? ea[N.randInt(len)] : null; + Class> ec = $.cast(classType); + return $.random(ec); } else if (Locale.class == classType) { return (Act.appConfig().locale()); } else if (String.class == classType || Keyword.class == classType) { @@ -768,17 +771,35 @@ public static Object generateSampleData( } return Keyword.class == classType ? Keyword.of(mockValue) : mockValue; } else if (classType.isArray()) { - Object sample = Array.newInstance(classType.getComponentType(), 2); - Array.set(sample, 0, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); - Array.set(sample, 1, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); + int len = 2 + N.randInt(5); + Object sample = Array.newInstance(classType.getComponentType(), len); + for (int i = 0; i < len; ++i) { + Array.set(sample, i, generateSampleData(BeanSpec.of(classType.getComponentType(), Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); + } return sample; } else if ($.isSimpleType(classType)) { - if (Enum.class == classType) { - return ""; - } if (!classType.isPrimitive()) { classType = $.primitiveTypeOf(classType); } + if (String.class == classType) { + return S.random(); + } else if (int.class == classType) { + return N.randInt(10000); + } else if (char.class == classType) { + return 48 + N.randInt(41); + } else if (short.class == classType) { + return N.randInt(256); + } else if (byte.class == classType) { + return N.randInt(128); + } else if (long.class == classType) { + return N.randLong(); + } else if (float.class == classType) { + return N.randFloat(); + } else if (double.class == classType) { + return N.randDouble(); + } else if (boolean.class == classType) { + return $.random(true, false); + } return StringValueResolver.predefined().get(classType).resolve(null); } else if (LocalDateTime.class.isAssignableFrom(classType)) { return sampleDataProviderManager.getSampleData(category, name, LocalDateTime.class); @@ -810,16 +831,12 @@ public static Object generateSampleData( if (Object.class == valType) { return null; } - Object key1 = "foo"; - Object key2 = "bar"; - if (keyType != String.class) { - key1 = generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); - key2 = generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); + int len = 2 + N.randInt(5); + for (int i = 0; i < len; ++i) { + Object key = String.class == keyType ? S.random() : generateSampleData(BeanSpec.of(keyType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); + Object val = generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn);; + map.put(key, val); } - Object val1 = generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); - Object val2 = generateSampleData(BeanSpec.of(valType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn); - map.put(key1, val1); - map.put(key2, val2); } return map; } else if (Iterable.class.isAssignableFrom(classType)) { @@ -832,8 +849,10 @@ public static Object generateSampleData( return null; } else { Type componentType = typeParams.get(0); - col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); - col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); + int len = 2 + N.randInt(5); + for (int i = 0; i < len; ++i) { + col.add(generateSampleData(BeanSpec.of(componentType, null, Act.injector(), typeParamLookup), typeParamLookup, C.newSet(typeChain), C.newList(nameChain), fastJsonPropertyPreFilter, isReturn)); + } } return col; } diff --git a/src/main/java/act/inject/param/CollectionLoader.java b/src/main/java/act/inject/param/CollectionLoader.java index 654095bdd..a0c0d4bff 100644 --- a/src/main/java/act/inject/param/CollectionLoader.java +++ b/src/main/java/act/inject/param/CollectionLoader.java @@ -168,6 +168,10 @@ private void resolveInto(Collection collection, String value, ActContext context if (S.blank(value)) { return; } + // processing string like `[6000, 10000]` + if (value.startsWith("[") && value.endsWith("]")) { + value = S.strip(value, S.BRACKETS); + } // support multiple path variables like /foo/id1,id2 String[] sa = value.split("[,;]+"); boolean isChar = this.isChar; From bfc33efc4dcb07dd9aa264841177766415251b09 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 21 Nov 2019 22:17:40 +1100 Subject: [PATCH 559/730] Act-Test - Allow it to load test files from src/test/resources folder #1249 --- CHANGELOG.md | 1 + src/main/java/act/app/App.java | 4 ++ src/main/java/act/test/Test.java | 1 + .../act/test/util/RequestTemplateManager.java | 2 +- .../java/act/test/util/ScenarioManager.java | 22 +++--- src/main/java/act/test/util/YamlLoader.java | 70 +++++++++++++++++-- src/main/java/act/view/RenderAny.java | 16 +---- 7 files changed, 84 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01f225087..aa0e23541 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.30** +* Act-Test - Allow it to load test files from src/test/resources folder #1249 * API Doc - Return sample for array is not correct #1250 * SimpleRestfulServiceBase - property spec enhancements #1248 * Param binding - allow specify `now` in `DefaultValue` for Date types #1247 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 3526facbc..d6f05727e 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -967,6 +967,10 @@ public File resource(String path) { return new File(this.layout().resource(appBase), path); } + public File testResource(String path) { + return new File(this.layout.testResource(appBase), path); + } + public SampleDataProviderManager sampleDataProviderManager() { return sampleDataProviderManager; } diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index eb906561b..819468691 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -298,6 +298,7 @@ public List run(App app, Keyword testId, String partition, boolean shu E.illegalStateIf(inProgress()); info("Start running test scenarios"); info("---------------------------------------------------------------"); + YamlLoader.resetWarned(); int exitCode = 0; EventBus eventBus = app.eventBus(); STARTED.set(true); diff --git a/src/main/java/act/test/util/RequestTemplateManager.java b/src/main/java/act/test/util/RequestTemplateManager.java index a99b32b25..a1fb2424b 100644 --- a/src/main/java/act/test/util/RequestTemplateManager.java +++ b/src/main/java/act/test/util/RequestTemplateManager.java @@ -42,7 +42,7 @@ public class RequestTemplateManager extends YamlLoader { public RequestTemplateManager() { super("act.test"); - setFixtureFolder("/test/"); + setFixtureFolder("/", "/test/"); } public void load() { diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index f766c89fb..e23142a65 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -56,7 +56,7 @@ public class ScenarioManager extends YamlLoader { public ScenarioManager() { super("act.test"); - setFixtureFolder("/test"); + setFixtureFolder("/", "/test"); configure(); } @@ -64,7 +64,7 @@ public ScenarioManager(String modelPackage, String... modelPackages) { super(); addModelPackages("act.test"); addModelPackages(modelPackage, modelPackages); - setFixtureFolder("/test"); + setFixtureFolder("/", "/test"); configure(); } @@ -131,23 +131,21 @@ private String inferIssueUrlIcon(String issueUrl) { } private void loadDefault() { - URL url = Act.getResource(patchResourceName("scenarios.yml")); - if (null != url) { - String content = IO.readContentAsString(url); - parseOne(content, url.getFile()); + File file = getFile("scenarios.yml"); + if (null != file) { + parseOne(IO.readContentAsString(file), file.getName()); } } private void searchScenarioFolder() { App app = Act.app(); - if (null != app) { + if (false && null != app) { searchWhenInAppContext(app); } else { - URL url = Act.getResource("/test/scenarios"); - if (null != url) { - File file = new File(url.getFile()); - if (file.exists()) { - loadFromScenarioDir(file); + File folder = getFile("scenarios"); + if (null != folder) { + if (folder.exists()) { + loadFromScenarioDir(folder); } } } diff --git a/src/main/java/act/test/util/YamlLoader.java b/src/main/java/act/test/util/YamlLoader.java index 9e1027c23..ed87c2414 100644 --- a/src/main/java/act/test/util/YamlLoader.java +++ b/src/main/java/act/test/util/YamlLoader.java @@ -38,6 +38,7 @@ import org.osgl.util.S; import org.yaml.snakeyaml.Yaml; +import java.io.File; import java.net.URL; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; @@ -50,7 +51,9 @@ public class YamlLoader extends LogSupport { private List modelPackages = new ArrayList<>(); - private String fixtureFolder = "/test/fixtures/"; + protected String fixtureFolder = "/fixtures/"; + + protected String legacyFixtureFolder = "/test/fixtures"; public YamlLoader() { resetModelPackages(); @@ -269,15 +272,42 @@ private void resolveConstants(Map entityValue) { } } - protected String getResourceAsString(String name) { + protected File getFile(String name) { + App app = Act.app(); + E.illegalStateIf(null == app, "App instance not found"); + // try new location first + File file = app.testResource(patchResourceName(name)); + if (file.exists()) { + return file; + } + file = app.resource(patchResourceNameWithLegacyFixtureFolder(name)); + return file.exists() ? file : null; + } + + protected URL loadResource(String name) { URL url = Act.getResource(patchResourceName(name)); - return null == url ? null : IO.read(url).toString(); + if (null == url && null != legacyFixtureFolder) { + url = Act.getResource(patchResourceNameWithLegacyFixtureFolder(name)); + if (null != url) { + warn("You are using legacy folder: %s; it is recommend to move your resource to new folder: %s", legacyFixtureFolder, fixtureFolder); + } + } + return url; + } + + protected String getResourceAsString(String name) { + File file = getFile(name); + return null == file ? null : IO.readContentAsString(file); } protected String patchResourceName(String name) { return S.ensure(name).startWith(fixtureFolder); } + protected String patchResourceNameWithLegacyFixtureFolder(String name) { + return S.ensure(name).startWith(legacyFixtureFolder); + } + private Class loadModelType(String type) { if (type.contains(".") || $.isPrimitiveType(type)) { return classForName(type); @@ -293,10 +323,38 @@ private Class loadModelType(String type) { throw new UnexpectedException("Cannot load type: %s", type); } - protected void setFixtureFolder(String fixtureFolder) { + private static final ThreadLocal warned = new ThreadLocal() { + @Override + protected Boolean initialValue() { + return false; + } + }; + + public static void resetWarned() { + warned.set(false); + } + + protected void setFixtureFolder(String fixtureFolder, String legacyFixtureFolder) { if (S.notBlank(fixtureFolder)) { this.fixtureFolder = S.ensure(S.ensure(fixtureFolder.trim()).startWith("/")).endWith("/"); } + if (S.notBlank(legacyFixtureFolder)) { + this.legacyFixtureFolder = S.ensure(S.ensure(legacyFixtureFolder.trim()).startWith("/")).endWith("/"); + } + if (warned.get()) { + return; + } + warned.set(true); + App app = Act.app(); + if (null != app) { + if (S.blank(fixtureFolder) || !app.testResource(fixtureFolder).exists()) { + if (S.notBlank(legacyFixtureFolder) && app.resource(legacyFixtureFolder).exists()) { + Act.LOGGER.warn("Legacy test resource detected: src/main/resources/test. It recommend to migrate to new place: src/test/resources"); + } else { + Act.LOGGER.warn("No test resource found"); + } + } + } } protected void resetModelPackages() { @@ -399,7 +457,9 @@ private void loadConfig() { addModelPackage(modelPackages); } String fixtureFolder = config.get("test.fixture-folder"); - setFixtureFolder(fixtureFolder); + if (S.notBlank(fixtureFolder)) { + setFixtureFolder(fixtureFolder, null); + } } } diff --git a/src/main/java/act/view/RenderAny.java b/src/main/java/act/view/RenderAny.java index 04d2a561a..d8efb56b3 100644 --- a/src/main/java/act/view/RenderAny.java +++ b/src/main/java/act/view/RenderAny.java @@ -69,20 +69,8 @@ public void apply(ActionContext context) { } H.Format fmt = context.accept(); if (fmt.isSameTypeWith(UNKNOWN)) { - H.Request req = context.req(); - if (req.userAgent().isIE9Down()) { - fmt = HTML; - } else { - H.Method method = req.method(); - String methodInfo = S.concat(method.name(), " method to "); - String acceptHeader = req.header(H.Header.Names.ACCEPT); - throw E.unsupport(S.concat( - "Unknown accept content type(", - acceptHeader, - "): ", - methodInfo, - req.url())); - } + // let's guess the request needs HTML + fmt = HTML; } Result result = null; if (JSON.isSameTypeWith(fmt)) { From d923714679b1cdae0111a8ffbf9d80493c9e54ef Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 22 Nov 2019 06:10:04 +1100 Subject: [PATCH 560/730] fix unit testing issue caused by #1249 change --- src/main/java/act/test/util/YamlLoader.java | 13 +++++++++++-- src/test/java/act/test/util/YamlLoaderTest.java | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/act/test/util/YamlLoader.java b/src/main/java/act/test/util/YamlLoader.java index ed87c2414..f3abd5aa7 100644 --- a/src/main/java/act/test/util/YamlLoader.java +++ b/src/main/java/act/test/util/YamlLoader.java @@ -53,7 +53,7 @@ public class YamlLoader extends LogSupport { protected String fixtureFolder = "/fixtures/"; - protected String legacyFixtureFolder = "/test/fixtures"; + protected String legacyFixtureFolder = "/test/fixtures/"; public YamlLoader() { resetModelPackages(); @@ -274,6 +274,10 @@ private void resolveConstants(Map entityValue) { protected File getFile(String name) { App app = Act.app(); + if (null == app) { + // must doing unit testing + return null; + } E.illegalStateIf(null == app, "App instance not found"); // try new location first File file = app.testResource(patchResourceName(name)); @@ -297,7 +301,12 @@ protected URL loadResource(String name) { protected String getResourceAsString(String name) { File file = getFile(name); - return null == file ? null : IO.readContentAsString(file); + if (null != file) { + return IO.readContentAsString(file); + } + // unit testing! that's why we are here + URL url = loadResource(name); + return null == url ? null : IO.readContentAsString(url); } protected String patchResourceName(String name) { diff --git a/src/test/java/act/test/util/YamlLoaderTest.java b/src/test/java/act/test/util/YamlLoaderTest.java index 70cb9603c..f9a14b916 100644 --- a/src/test/java/act/test/util/YamlLoaderTest.java +++ b/src/test/java/act/test/util/YamlLoaderTest.java @@ -26,6 +26,7 @@ import act.test.model.User; import org.joda.time.DateTime; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import java.util.Map; From 625afa2d54f4913afeed38efa8db9b4fa459fbb5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 22 Nov 2019 16:28:49 +1100 Subject: [PATCH 561/730] App failed to start without error stack #1252 --- CHANGELOG.md | 1 + src/main/java/act/i18n/I18n.java | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa0e23541..7f332f6de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.30** +* App failed to start without error stack #1252 * Act-Test - Allow it to load test files from src/test/resources folder #1249 * API Doc - Return sample for array is not correct #1250 * SimpleRestfulServiceBase - property spec enhancements #1248 diff --git a/src/main/java/act/i18n/I18n.java b/src/main/java/act/i18n/I18n.java index 5c80301ee..0377ffa34 100644 --- a/src/main/java/act/i18n/I18n.java +++ b/src/main/java/act/i18n/I18n.java @@ -90,7 +90,15 @@ private static String _i18n(boolean ignoreError, Locale locale, String bundleNam ResourceBundle bundle; String msg = msgId; try { - bundle = ResourceBundle.getBundle(bundleName, $.requireNotNull(locale), Act.app().classLoader()); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (null == classLoader) { + classLoader = I18n.class.getClassLoader(); + } + App app = Act.app(); + if (null != app && null != app.classLoader()) { + classLoader = app.classLoader(); + } + bundle = ResourceBundle.getBundle(bundleName, $.requireNotNull(locale), classLoader); } catch (MissingResourceException e) { if (!ignoreError) { logger.warn("Cannot find bundle: %s", bundleName); From 919f530726ea4e1184cf5c4e4845dc2b1a125176 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 23 Nov 2019 21:17:14 +1100 Subject: [PATCH 562/730] migrate testapps/GHIssues project test resource files to new home --- pom.xml | 4 ++-- testapps/GHIssues/src/main/resources/test/upload/test.txt | 1 - .../{main/resources/test => test/resources}/fixtures/1161.yml | 0 .../{main/resources/test => test/resources}/fixtures/928.yml | 0 .../resources/test => test/resources}/scenarios/1001.yml | 0 .../resources/test => test/resources}/scenarios/1005.yml | 0 .../resources/test => test/resources}/scenarios/1015.yml | 0 .../resources/test => test/resources}/scenarios/1016.yml | 0 .../resources/test => test/resources}/scenarios/1022.yml | 0 .../resources/test => test/resources}/scenarios/1026.yml | 0 .../resources/test => test/resources}/scenarios/1049.yml | 0 .../resources/test => test/resources}/scenarios/1058.yml | 0 .../resources/test => test/resources}/scenarios/1061.yml | 0 .../resources/test => test/resources}/scenarios/1064.yml | 0 .../resources/test => test/resources}/scenarios/1069.yml | 0 .../resources/test => test/resources}/scenarios/1073.yml | 0 .../resources/test => test/resources}/scenarios/1078.yml | 0 .../resources/test => test/resources}/scenarios/1083.yml | 0 .../resources/test => test/resources}/scenarios/1093.yml | 0 .../resources/test => test/resources}/scenarios/1104.yml | 0 .../resources/test => test/resources}/scenarios/1116.yml | 0 .../resources/test => test/resources}/scenarios/1127.yml | 0 .../resources/test => test/resources}/scenarios/1128.yml | 0 .../resources/test => test/resources}/scenarios/1130.yml | 0 .../resources/test => test/resources}/scenarios/1138.yml | 0 .../resources/test => test/resources}/scenarios/1141.yml | 0 .../resources/test => test/resources}/scenarios/1145.yml | 0 .../resources/test => test/resources}/scenarios/1146.yml | 0 .../resources/test => test/resources}/scenarios/1147.yml | 0 .../resources/test => test/resources}/scenarios/1151.yml | 0 .../resources/test => test/resources}/scenarios/1161.yml | 0 .../resources/test => test/resources}/scenarios/1211.yml | 0 .../resources/test => test/resources}/scenarios/1240.yml | 0 .../resources/test => test/resources}/scenarios/1241.yml | 0 .../{main/resources/test => test/resources}/scenarios/784.yml | 0 .../{main/resources/test => test/resources}/scenarios/786.yml | 0 .../test => test/resources}/scenarios/787-left-as-blank.yml | 0 .../{main/resources/test => test/resources}/scenarios/790.yml | 0 .../{main/resources/test => test/resources}/scenarios/796.yml | 0 .../{main/resources/test => test/resources}/scenarios/797.yml | 0 .../{main/resources/test => test/resources}/scenarios/798.yml | 0 .../{main/resources/test => test/resources}/scenarios/809.yml | 0 .../{main/resources/test => test/resources}/scenarios/819.yml | 0 .../{main/resources/test => test/resources}/scenarios/820.yml | 0 .../{main/resources/test => test/resources}/scenarios/821.yml | 0 .../{main/resources/test => test/resources}/scenarios/823.yml | 0 .../{main/resources/test => test/resources}/scenarios/829.yml | 0 .../{main/resources/test => test/resources}/scenarios/835.yml | 0 .../{main/resources/test => test/resources}/scenarios/841.yml | 0 .../{main/resources/test => test/resources}/scenarios/844.yml | 0 .../{main/resources/test => test/resources}/scenarios/852.yml | 0 .../{main/resources/test => test/resources}/scenarios/857.yml | 0 .../{main/resources/test => test/resources}/scenarios/860.yml | 0 .../{main/resources/test => test/resources}/scenarios/862.yml | 0 .../{main/resources/test => test/resources}/scenarios/866.yml | 0 .../{main/resources/test => test/resources}/scenarios/869.yml | 0 .../{main/resources/test => test/resources}/scenarios/870.yml | 0 .../{main/resources/test => test/resources}/scenarios/871.yml | 0 .../{main/resources/test => test/resources}/scenarios/878.yml | 0 .../{main/resources/test => test/resources}/scenarios/887.yml | 0 .../{main/resources/test => test/resources}/scenarios/905.yml | 0 .../{main/resources/test => test/resources}/scenarios/906.yml | 0 .../{main/resources/test => test/resources}/scenarios/907.yml | 0 .../{main/resources/test => test/resources}/scenarios/908.yml | 0 .../{main/resources/test => test/resources}/scenarios/911.yml | 0 .../{main/resources/test => test/resources}/scenarios/922.yml | 0 .../{main/resources/test => test/resources}/scenarios/925.yml | 0 .../{main/resources/test => test/resources}/scenarios/928.yml | 0 .../{main/resources/test => test/resources}/scenarios/937.yml | 0 .../{main/resources/test => test/resources}/scenarios/946.yml | 0 .../{main/resources/test => test/resources}/scenarios/958.yml | 0 .../{main/resources/test => test/resources}/scenarios/967.yml | 0 .../{main/resources/test => test/resources}/scenarios/976.yml | 0 .../{main/resources/test => test/resources}/scenarios/985.yml | 0 .../{main/resources/test => test/resources}/scenarios/990.yml | 0 .../test => test/resources}/scenarios/osgl-tool-181.yml | 0 76 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 testapps/GHIssues/src/main/resources/test/upload/test.txt rename testapps/GHIssues/src/{main/resources/test => test/resources}/fixtures/1161.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/fixtures/928.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1001.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1005.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1015.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1016.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1022.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1026.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1049.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1058.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1061.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1064.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1069.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1073.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1078.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1083.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1093.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1104.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1116.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1127.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1128.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1130.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1138.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1141.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1145.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1146.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1147.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1151.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1161.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1211.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1240.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/1241.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/784.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/786.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/787-left-as-blank.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/790.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/796.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/797.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/798.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/809.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/819.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/820.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/821.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/823.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/829.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/835.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/841.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/844.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/852.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/857.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/860.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/862.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/866.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/869.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/870.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/871.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/878.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/887.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/905.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/906.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/907.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/908.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/911.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/922.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/925.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/928.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/937.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/946.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/958.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/967.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/976.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/985.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/990.yml (100%) rename testapps/GHIssues/src/{main/resources/test => test/resources}/scenarios/osgl-tool-181.yml (100%) diff --git a/pom.xml b/pom.xml index 71bee2634..f933128af 100644 --- a/pom.xml +++ b/pom.xml @@ -66,10 +66,10 @@ 3.12.1 - 1.21.1-SNAPSHOT + 1.22.1 1.8.0 1.12.0 - 1.11.1-SNAPSHOT + 1.12.0 1.11.0 1.10.0 1.5.0 diff --git a/testapps/GHIssues/src/main/resources/test/upload/test.txt b/testapps/GHIssues/src/main/resources/test/upload/test.txt deleted file mode 100644 index f2ba8f84a..000000000 --- a/testapps/GHIssues/src/main/resources/test/upload/test.txt +++ /dev/null @@ -1 +0,0 @@ -abc \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/test/fixtures/1161.yml b/testapps/GHIssues/src/test/resources/fixtures/1161.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/fixtures/1161.yml rename to testapps/GHIssues/src/test/resources/fixtures/1161.yml diff --git a/testapps/GHIssues/src/main/resources/test/fixtures/928.yml b/testapps/GHIssues/src/test/resources/fixtures/928.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/fixtures/928.yml rename to testapps/GHIssues/src/test/resources/fixtures/928.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1001.yml b/testapps/GHIssues/src/test/resources/scenarios/1001.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1001.yml rename to testapps/GHIssues/src/test/resources/scenarios/1001.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1005.yml b/testapps/GHIssues/src/test/resources/scenarios/1005.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1005.yml rename to testapps/GHIssues/src/test/resources/scenarios/1005.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1015.yml b/testapps/GHIssues/src/test/resources/scenarios/1015.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1015.yml rename to testapps/GHIssues/src/test/resources/scenarios/1015.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1016.yml b/testapps/GHIssues/src/test/resources/scenarios/1016.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1016.yml rename to testapps/GHIssues/src/test/resources/scenarios/1016.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1022.yml b/testapps/GHIssues/src/test/resources/scenarios/1022.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1022.yml rename to testapps/GHIssues/src/test/resources/scenarios/1022.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1026.yml b/testapps/GHIssues/src/test/resources/scenarios/1026.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1026.yml rename to testapps/GHIssues/src/test/resources/scenarios/1026.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1049.yml b/testapps/GHIssues/src/test/resources/scenarios/1049.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1049.yml rename to testapps/GHIssues/src/test/resources/scenarios/1049.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1058.yml b/testapps/GHIssues/src/test/resources/scenarios/1058.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1058.yml rename to testapps/GHIssues/src/test/resources/scenarios/1058.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1061.yml b/testapps/GHIssues/src/test/resources/scenarios/1061.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1061.yml rename to testapps/GHIssues/src/test/resources/scenarios/1061.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1064.yml b/testapps/GHIssues/src/test/resources/scenarios/1064.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1064.yml rename to testapps/GHIssues/src/test/resources/scenarios/1064.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1069.yml b/testapps/GHIssues/src/test/resources/scenarios/1069.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1069.yml rename to testapps/GHIssues/src/test/resources/scenarios/1069.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1073.yml b/testapps/GHIssues/src/test/resources/scenarios/1073.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1073.yml rename to testapps/GHIssues/src/test/resources/scenarios/1073.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1078.yml b/testapps/GHIssues/src/test/resources/scenarios/1078.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1078.yml rename to testapps/GHIssues/src/test/resources/scenarios/1078.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1083.yml b/testapps/GHIssues/src/test/resources/scenarios/1083.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1083.yml rename to testapps/GHIssues/src/test/resources/scenarios/1083.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1093.yml b/testapps/GHIssues/src/test/resources/scenarios/1093.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1093.yml rename to testapps/GHIssues/src/test/resources/scenarios/1093.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1104.yml b/testapps/GHIssues/src/test/resources/scenarios/1104.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1104.yml rename to testapps/GHIssues/src/test/resources/scenarios/1104.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1116.yml b/testapps/GHIssues/src/test/resources/scenarios/1116.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1116.yml rename to testapps/GHIssues/src/test/resources/scenarios/1116.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1127.yml b/testapps/GHIssues/src/test/resources/scenarios/1127.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1127.yml rename to testapps/GHIssues/src/test/resources/scenarios/1127.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1128.yml b/testapps/GHIssues/src/test/resources/scenarios/1128.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1128.yml rename to testapps/GHIssues/src/test/resources/scenarios/1128.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1130.yml b/testapps/GHIssues/src/test/resources/scenarios/1130.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1130.yml rename to testapps/GHIssues/src/test/resources/scenarios/1130.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1138.yml b/testapps/GHIssues/src/test/resources/scenarios/1138.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1138.yml rename to testapps/GHIssues/src/test/resources/scenarios/1138.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1141.yml b/testapps/GHIssues/src/test/resources/scenarios/1141.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1141.yml rename to testapps/GHIssues/src/test/resources/scenarios/1141.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1145.yml b/testapps/GHIssues/src/test/resources/scenarios/1145.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1145.yml rename to testapps/GHIssues/src/test/resources/scenarios/1145.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1146.yml b/testapps/GHIssues/src/test/resources/scenarios/1146.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1146.yml rename to testapps/GHIssues/src/test/resources/scenarios/1146.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1147.yml b/testapps/GHIssues/src/test/resources/scenarios/1147.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1147.yml rename to testapps/GHIssues/src/test/resources/scenarios/1147.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1151.yml b/testapps/GHIssues/src/test/resources/scenarios/1151.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1151.yml rename to testapps/GHIssues/src/test/resources/scenarios/1151.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1161.yml b/testapps/GHIssues/src/test/resources/scenarios/1161.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1161.yml rename to testapps/GHIssues/src/test/resources/scenarios/1161.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1211.yml b/testapps/GHIssues/src/test/resources/scenarios/1211.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1211.yml rename to testapps/GHIssues/src/test/resources/scenarios/1211.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1240.yml b/testapps/GHIssues/src/test/resources/scenarios/1240.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1240.yml rename to testapps/GHIssues/src/test/resources/scenarios/1240.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/1241.yml b/testapps/GHIssues/src/test/resources/scenarios/1241.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/1241.yml rename to testapps/GHIssues/src/test/resources/scenarios/1241.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/784.yml b/testapps/GHIssues/src/test/resources/scenarios/784.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/784.yml rename to testapps/GHIssues/src/test/resources/scenarios/784.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/786.yml b/testapps/GHIssues/src/test/resources/scenarios/786.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/786.yml rename to testapps/GHIssues/src/test/resources/scenarios/786.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/787-left-as-blank.yml b/testapps/GHIssues/src/test/resources/scenarios/787-left-as-blank.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/787-left-as-blank.yml rename to testapps/GHIssues/src/test/resources/scenarios/787-left-as-blank.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/790.yml b/testapps/GHIssues/src/test/resources/scenarios/790.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/790.yml rename to testapps/GHIssues/src/test/resources/scenarios/790.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/796.yml b/testapps/GHIssues/src/test/resources/scenarios/796.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/796.yml rename to testapps/GHIssues/src/test/resources/scenarios/796.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/797.yml b/testapps/GHIssues/src/test/resources/scenarios/797.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/797.yml rename to testapps/GHIssues/src/test/resources/scenarios/797.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/798.yml b/testapps/GHIssues/src/test/resources/scenarios/798.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/798.yml rename to testapps/GHIssues/src/test/resources/scenarios/798.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/809.yml b/testapps/GHIssues/src/test/resources/scenarios/809.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/809.yml rename to testapps/GHIssues/src/test/resources/scenarios/809.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/819.yml b/testapps/GHIssues/src/test/resources/scenarios/819.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/819.yml rename to testapps/GHIssues/src/test/resources/scenarios/819.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/820.yml b/testapps/GHIssues/src/test/resources/scenarios/820.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/820.yml rename to testapps/GHIssues/src/test/resources/scenarios/820.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/821.yml b/testapps/GHIssues/src/test/resources/scenarios/821.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/821.yml rename to testapps/GHIssues/src/test/resources/scenarios/821.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/823.yml b/testapps/GHIssues/src/test/resources/scenarios/823.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/823.yml rename to testapps/GHIssues/src/test/resources/scenarios/823.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/829.yml b/testapps/GHIssues/src/test/resources/scenarios/829.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/829.yml rename to testapps/GHIssues/src/test/resources/scenarios/829.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/835.yml b/testapps/GHIssues/src/test/resources/scenarios/835.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/835.yml rename to testapps/GHIssues/src/test/resources/scenarios/835.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/841.yml b/testapps/GHIssues/src/test/resources/scenarios/841.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/841.yml rename to testapps/GHIssues/src/test/resources/scenarios/841.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/844.yml b/testapps/GHIssues/src/test/resources/scenarios/844.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/844.yml rename to testapps/GHIssues/src/test/resources/scenarios/844.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/852.yml b/testapps/GHIssues/src/test/resources/scenarios/852.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/852.yml rename to testapps/GHIssues/src/test/resources/scenarios/852.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/857.yml b/testapps/GHIssues/src/test/resources/scenarios/857.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/857.yml rename to testapps/GHIssues/src/test/resources/scenarios/857.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/860.yml b/testapps/GHIssues/src/test/resources/scenarios/860.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/860.yml rename to testapps/GHIssues/src/test/resources/scenarios/860.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/862.yml b/testapps/GHIssues/src/test/resources/scenarios/862.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/862.yml rename to testapps/GHIssues/src/test/resources/scenarios/862.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/866.yml b/testapps/GHIssues/src/test/resources/scenarios/866.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/866.yml rename to testapps/GHIssues/src/test/resources/scenarios/866.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/869.yml b/testapps/GHIssues/src/test/resources/scenarios/869.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/869.yml rename to testapps/GHIssues/src/test/resources/scenarios/869.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/870.yml b/testapps/GHIssues/src/test/resources/scenarios/870.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/870.yml rename to testapps/GHIssues/src/test/resources/scenarios/870.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/871.yml b/testapps/GHIssues/src/test/resources/scenarios/871.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/871.yml rename to testapps/GHIssues/src/test/resources/scenarios/871.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/878.yml b/testapps/GHIssues/src/test/resources/scenarios/878.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/878.yml rename to testapps/GHIssues/src/test/resources/scenarios/878.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/887.yml b/testapps/GHIssues/src/test/resources/scenarios/887.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/887.yml rename to testapps/GHIssues/src/test/resources/scenarios/887.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/905.yml b/testapps/GHIssues/src/test/resources/scenarios/905.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/905.yml rename to testapps/GHIssues/src/test/resources/scenarios/905.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/906.yml b/testapps/GHIssues/src/test/resources/scenarios/906.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/906.yml rename to testapps/GHIssues/src/test/resources/scenarios/906.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/907.yml b/testapps/GHIssues/src/test/resources/scenarios/907.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/907.yml rename to testapps/GHIssues/src/test/resources/scenarios/907.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/908.yml b/testapps/GHIssues/src/test/resources/scenarios/908.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/908.yml rename to testapps/GHIssues/src/test/resources/scenarios/908.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/911.yml b/testapps/GHIssues/src/test/resources/scenarios/911.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/911.yml rename to testapps/GHIssues/src/test/resources/scenarios/911.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/922.yml b/testapps/GHIssues/src/test/resources/scenarios/922.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/922.yml rename to testapps/GHIssues/src/test/resources/scenarios/922.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/925.yml b/testapps/GHIssues/src/test/resources/scenarios/925.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/925.yml rename to testapps/GHIssues/src/test/resources/scenarios/925.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/928.yml b/testapps/GHIssues/src/test/resources/scenarios/928.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/928.yml rename to testapps/GHIssues/src/test/resources/scenarios/928.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/937.yml b/testapps/GHIssues/src/test/resources/scenarios/937.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/937.yml rename to testapps/GHIssues/src/test/resources/scenarios/937.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/946.yml b/testapps/GHIssues/src/test/resources/scenarios/946.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/946.yml rename to testapps/GHIssues/src/test/resources/scenarios/946.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/958.yml b/testapps/GHIssues/src/test/resources/scenarios/958.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/958.yml rename to testapps/GHIssues/src/test/resources/scenarios/958.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/967.yml b/testapps/GHIssues/src/test/resources/scenarios/967.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/967.yml rename to testapps/GHIssues/src/test/resources/scenarios/967.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/976.yml b/testapps/GHIssues/src/test/resources/scenarios/976.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/976.yml rename to testapps/GHIssues/src/test/resources/scenarios/976.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/985.yml b/testapps/GHIssues/src/test/resources/scenarios/985.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/985.yml rename to testapps/GHIssues/src/test/resources/scenarios/985.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/990.yml b/testapps/GHIssues/src/test/resources/scenarios/990.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/990.yml rename to testapps/GHIssues/src/test/resources/scenarios/990.yml diff --git a/testapps/GHIssues/src/main/resources/test/scenarios/osgl-tool-181.yml b/testapps/GHIssues/src/test/resources/scenarios/osgl-tool-181.yml similarity index 100% rename from testapps/GHIssues/src/main/resources/test/scenarios/osgl-tool-181.yml rename to testapps/GHIssues/src/test/resources/scenarios/osgl-tool-181.yml From f7519c6aa1c53aea220706765392421b5c9fc91a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 23 Nov 2019 21:33:18 +1100 Subject: [PATCH 563/730] prepare to release 1.8.30 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f332f6de..5c17db4ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.30** +**1.8.30** 23/Nov/2019 * App failed to start without error stack #1252 * Act-Test - Allow it to load test files from src/test/resources folder #1249 * API Doc - Return sample for array is not correct #1250 From 0e34b8cdf4d3a084783800199177efdae1a320b6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 23 Nov 2019 21:34:14 +1100 Subject: [PATCH 564/730] update VERSION MATRIX --- VERSION_MATRIX.md | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 53556643a..9234da515 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,26 +1,26 @@ # Version Matrix -| act | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | -| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | -| beetl | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | -| beetlsql | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | -| ebean-java7 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | -| ebean(java8) | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | -| eclipselink(java8) | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | -| excel-java7 | | | | | | | | | 1.8.0 | -| excel | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | -| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | -| hibernate | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | -| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | -| jpa-common | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | -| morphia | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | -| mustache(java8) | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.5.0 | -| social | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | -| sql-common | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.1 | 1.6.0 | -| storage(java8) | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | 0.15.0 | -| thymeleaf | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.4.0 | -| velocity | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | +| act | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | 1.8.30 | +| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | +| aaa | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | +| beetl | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | +| beetlsql | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | 1.8.0 | +| ebean-java7 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | 1.8.0 | +| ebean(java8) | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | 1.8.0 | +| eclipselink(java8) | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | +| excel-java7 | | | | | | | | | 1.8.0 | 1.8.0 | +| excel | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | +| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | +| hibernate | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | +| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | 1.1.0 | +| jpa-common | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | +| morphia | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | 1.8.1 | +| mustache(java8) | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | +| social | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | 0.13.0 | +| sql-common | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.1 | 1.6.0 | 1.6.0 | +| storage(java8) | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | 0.15.0 | 0.15.0 | +| thymeleaf | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.4.0 | 1.4.0 | +| velocity | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | ## Note From 1f5b7087b0a9433afe5ba2a357ed275c2259d415 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 23 Nov 2019 21:36:13 +1100 Subject: [PATCH 565/730] [maven-release-plugin] prepare release act-1.8.30 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f933128af..eaad694aa 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.30-SNAPSHOT + 1.8.30 ACT Framework The ACT full stack MVC framework From 1fd372f50b9ff711e381c995e3557c92a09b457f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 23 Nov 2019 21:36:25 +1100 Subject: [PATCH 566/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eaad694aa..8d7a9c722 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.30 + 1.8.31-SNAPSHOT ACT Framework The ACT full stack MVC framework From fdfd047453e44d36641140d3a7befc5083cc3382 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 24 Nov 2019 08:22:06 +1100 Subject: [PATCH 567/730] update README, NEWS, ARCHETYPE doc for act-1.8.30 --- ARCHETYPES.md | 16 ++++++++-------- NEWS.md | 36 ++++++++++++++++-------------------- README.md | 4 ++-- 3 files changed, 26 insertions(+), 30 deletions(-) diff --git a/ARCHETYPES.md b/ARCHETYPES.md index 8c6da9bd6..fd6e030b3 100644 --- a/ARCHETYPES.md +++ b/ARCHETYPES.md @@ -12,13 +12,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.29.0 + -DarchetypeVersion=1.8.30.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.28.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.30.0 ``` ## Hello Service @@ -33,13 +33,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.29.0 + -DarchetypeVersion=1.8.30.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.28.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.30.0 ``` ## Bookmark @@ -56,13 +56,13 @@ mvn archetype:generate -B \ -DartifactId=bookmark \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-bookmark \ - -DarchetypeVersion=1.8.29.0 + -DarchetypeVersion=1.8.30.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-bookmark -DarchetypeVersion=1.8.28.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-bookmark -DarchetypeVersion=1.8.30.0 ``` ## Chatroom @@ -77,13 +77,13 @@ mvn archetype:generate -B \ -DartifactId=chatroom \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-chatroom \ - -DarchetypeVersion=1.8.29.0 + -DarchetypeVersion=1.8.30.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-chatroom -DarchetypeVersion=1.8.28.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-chatroom -DarchetypeVersion=1.8.30.0 ``` diff --git a/NEWS.md b/NEWS.md index 3f04d9542..53ac54d51 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,46 +1,42 @@
                                                                                                                                                                              • - 21 Jul 2019 + 24 Nov 2019 - - act-1.8.26 released + + act-1.8.30 released
                                                                                                                                                                              • - 03 Jul 2019 + 04 Nov 2019 - - act-1.8.25 released + + act-1.8.29 released
                                                                                                                                                                              • - 23 Jun 2019 + 22 Sep 2019 - - act-1.8.24 released + + act-1.8.28 released
                                                                                                                                                                              • - 17 Jun 2019 + 21 Sep 2019 - act-morphia-1.7.2 released with big improvement on aggregation framework - -
                                                                                                                                                                              • -
                                                                                                                                                                              • - 17 Jun 2019 - - - act-1.8.23 released along with lots of plugin updates + + act-1.8.27 released
                                                                                                                                                                              • - 21 May 2019 + 21 Jul 2019 - act-1.8.22 released + + act-1.8.26 released +
                                                                                                                                                                              • diff --git a/README.md b/README.md index 87c544f73..b1abb1c9e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.29.0 + 1.8.30.0 ``` @@ -27,7 +27,7 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.29.0 + -DarchetypeVersion=1.8.30.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: From d504aa3fdda05660a1f7034b235a2aad20fcf27e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 24 Nov 2019 11:29:51 +1100 Subject: [PATCH 568/730] hotfix to 1.8.30 - upload file specified in test senario file not found after migrate test resource to `src/test/resources` --- ARCHETYPES.md | 16 +++--- CHANGELOG.md | 3 + NEWS.md | 2 +- README.md | 6 +- VERSION_MATRIX.md | 42 +++++++------- pom.xml | 2 +- src/main/java/act/test/RequestBuilder.java | 27 ++++++--- src/main/java/act/test/Test.java | 19 ++++++- .../java/act/test/util/ScenarioManager.java | 56 ++----------------- testapps/GHIssues/pom.xml | 4 +- 10 files changed, 79 insertions(+), 98 deletions(-) diff --git a/ARCHETYPES.md b/ARCHETYPES.md index fd6e030b3..4901aee35 100644 --- a/ARCHETYPES.md +++ b/ARCHETYPES.md @@ -12,13 +12,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.30.0 + -DarchetypeVersion=1.8.30.1 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.30.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.30.1 ``` ## Hello Service @@ -33,13 +33,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.30.0 + -DarchetypeVersion=1.8.30.1 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.30.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.30.1 ``` ## Bookmark @@ -56,13 +56,13 @@ mvn archetype:generate -B \ -DartifactId=bookmark \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-bookmark \ - -DarchetypeVersion=1.8.30.0 + -DarchetypeVersion=1.8.30.1 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-bookmark -DarchetypeVersion=1.8.30.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-bookmark -DarchetypeVersion=1.8.30.1 ``` ## Chatroom @@ -77,13 +77,13 @@ mvn archetype:generate -B \ -DartifactId=chatroom \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-chatroom \ - -DarchetypeVersion=1.8.30.0 + -DarchetypeVersion=1.8.30.1 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-chatroom -DarchetypeVersion=1.8.30.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-chatroom -DarchetypeVersion=1.8.30.1 ``` diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c17db4ea..cde4773bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # ActFramework Change Log +**1.8.30a** 24/Nov/2019 +* Fix issue - the upload file not found after moving testing resources to `src/test/resources` + **1.8.30** 23/Nov/2019 * App failed to start without error stack #1252 * Act-Test - Allow it to load test files from src/test/resources folder #1249 diff --git a/NEWS.md b/NEWS.md index 53ac54d51..4b061b40f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,7 +3,7 @@ 24 Nov 2019 - act-1.8.30 released + act-1.8.30a released
                                                                                                                                                                              • diff --git a/README.md b/README.md index b1abb1c9e..0682dc421 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.30.0 + 1.8.30.1 ``` @@ -27,13 +27,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.30.0 + -DarchetypeVersion=1.8.30.1 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.28.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.30.1 ``` **Note** There are more ActFramework application archetypes for use. Please get them [here](ARCHETYPES.md). diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 9234da515..dbade9044 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,26 +1,26 @@ # Version Matrix -| act | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | 1.8.30 | -| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | -| aaa | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | -| beetl | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | -| beetlsql | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | 1.8.0 | -| ebean-java7 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | 1.8.0 | -| ebean(java8) | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | 1.8.0 | -| eclipselink(java8) | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | -| excel-java7 | | | | | | | | | 1.8.0 | 1.8.0 | -| excel | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | -| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | -| hibernate | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | -| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | 1.1.0 | -| jpa-common | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | -| morphia | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | 1.8.1 | -| mustache(java8) | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | -| social | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | 0.13.0 | -| sql-common | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.1 | 1.6.0 | 1.6.0 | -| storage(java8) | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | 0.15.0 | 0.15.0 | -| thymeleaf | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.4.0 | 1.4.0 | -| velocity | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | +| act | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | 1.8.30a | +| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | -----: | +| aaa | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | +| beetl | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | +| beetlsql | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | 1.8.0 | +| ebean-java7 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | 1.8.0 | +| ebean(java8) | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | 1.8.0 | +| eclipselink(java8) | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | +| excel-java7 | | | | | | | | | 1.8.0 | 1.8.0 | +| excel | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | +| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | +| hibernate | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | +| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | 1.1.0 | +| jpa-common | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | +| morphia | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | 1.8.1 | +| mustache(java8) | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | +| social | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | 0.13.0 | +| sql-common | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.1 | 1.6.0 | 1.6.0 | +| storage(java8) | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | 0.15.0 | 0.15.0 | +| thymeleaf | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.4.0 | 1.4.0 | +| velocity | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | ## Note diff --git a/pom.xml b/pom.xml index 8d7a9c722..1ebe04bf9 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.31-SNAPSHOT + 1.8.30a-SNAPSHOT ACT Framework The ACT full stack MVC framework diff --git a/src/main/java/act/test/RequestBuilder.java b/src/main/java/act/test/RequestBuilder.java index 11bd0f07a..7abd91881 100644 --- a/src/main/java/act/test/RequestBuilder.java +++ b/src/main/java/act/test/RequestBuilder.java @@ -30,6 +30,7 @@ import org.osgl.http.H; import org.osgl.util.*; +import java.io.File; import java.net.URL; import java.util.Collection; import java.util.Map; @@ -143,15 +144,27 @@ class RequestBuilder { for (Map.Entry entry : requestSpec.parts.entrySet()) { String key = entry.getKey(); String val = S.string(entry.getValue()); - String path = S.pathConcat("test/upload", '/', val); - URL fileUrl = Act.getResource(path); - if (null != fileUrl) { - String filePath = fileUrl.getFile(); - H.Format fileFormat = FileGetter.contentType(filePath); - byte[] content = $.convert(fileUrl).to(byte[].class); + byte[] content = null; + H.Format fileFormat = null; + String path = S.pathConcat("upload", '/', val); + File uploadFile = Act.app().testResource(path); + if (uploadFile.exists()) { + fileFormat = FileGetter.contentType(path); + content = IO.readContent(uploadFile); + } else { + path = S.pathConcat("test/upload", '/', val); + URL fileUrl = Act.getResource(path); + if (null != fileUrl) { + String filePath = fileUrl.getFile(); + fileFormat = FileGetter.contentType(filePath); + content = $.convert(fileUrl).to(byte[].class); + } + } + if (null != content) { String checksum = IO.checksum(content); RequestBody fileBody = RequestBody.create(MediaType.parse(fileFormat.contentType()), content); - formBuilder.addFormDataPart(key, S.cut(filePath).afterLast("/"), fileBody); + String attachmentName = val.contains("/") ? S.cut(val).afterLast("/") : val; + formBuilder.addFormDataPart(key, attachmentName, fileBody); session.cache("checksum-last", checksum); session.cache("checksum-" + val, checksum); } else { diff --git a/src/main/java/act/test/Test.java b/src/main/java/act/test/Test.java index 819468691..e16b87e3b 100644 --- a/src/main/java/act/test/Test.java +++ b/src/main/java/act/test/Test.java @@ -54,6 +54,7 @@ import javax.inject.Inject; import javax.persistence.MappedSuperclass; +import java.io.File; import java.lang.reflect.Modifier; import java.lang.reflect.Type; import java.net.URL; @@ -77,14 +78,25 @@ public class Test extends LogSupport { private static String lastEmailId; public static class ConstantPool { + private static Map pool = new HashMap<>(); + static { load(); } + private static void load() { - URL url = Act.getResource("test/constants.properties"); - if (null != url) { - Properties p = IO.loadProperties(url); + Properties p = null; + File file = Act.app().testResource("constants.properties"); + if (file.exists()) { + p = IO.loadProperties(file); + } else { + URL url = Act.getResource("test/constants.properties"); + if (null != url) { + p = IO.loadProperties(url); + } + } + if (null != p) { for (Map.Entry entry : p.entrySet()) { String key = S.string(entry.getKey()); key = S.underscore(key); @@ -92,6 +104,7 @@ private static void load() { } } } + public static String get(String name) { return pool.get(S.underscore(name)); } diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index e23142a65..dd705badd 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -138,43 +138,14 @@ private void loadDefault() { } private void searchScenarioFolder() { - App app = Act.app(); - if (false && null != app) { - searchWhenInAppContext(app); - } else { - File folder = getFile("scenarios"); - if (null != folder) { - if (folder.exists()) { - loadFromScenarioDir(folder); - } - } - } - } - - private void searchWhenInAppContext(App app) { - File resource = RuntimeDirs.resource(app); - if (resource.exists()) { - loadFromDir(resource); - } else { - String appJarFile = System.getProperty(Act.PROP_APP_JAR_FILE); - if (null != appJarFile) { - File jarFile = new File(appJarFile); - loadFromJar(jarFile); + File folder = getFile("scenarios"); + if (null != folder) { + if (folder.exists()) { + loadFromScenarioDir(folder); } } } - private void loadFromDir(File resourceDir) { - if (!resourceDir.exists()) { - return; - } - File scenariosDir = new File(resourceDir, "test/scenarios"); - if (!scenariosDir.exists()) { - return; - } - loadFromScenarioDir(scenariosDir); - } - private void loadFromScenarioDir(File scenariosDir) { File[] ymlFiles = scenariosDir.listFiles(new FilenameFilter() { @Override @@ -200,25 +171,6 @@ public boolean accept(File dir, String name) { } } - private void loadFromJar(File jarFile) { - try (JarFile jar = new JarFile(jarFile)) { - for (JarEntry entry : C.enumerable(jar.entries())) { - String name = entry.getName(); - if (isScenarioFile(name)) { - InputStream is = jar.getInputStream(entry); - String content = IO.readContentAsString(is); - parseOne(content, null); - } - } - } catch (IOException e) { - warn(e, "Error loading scenario from jar file"); - } - } - - private boolean isScenarioFile(String name) { - return name.startsWith("test/scenarios/") && name.endsWith(".yml"); - } - private void parseOne(String content, String fileName) { Map map; try { diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 1898d9388..a1e3786ce 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.29.0 + 1.8.30.0 @@ -25,7 +25,7 @@ org.actframework act - 1.8.30-SNAPSHOT + 1.8.30a-SNAPSHOT org.actframework From 933626ffb86f02213c766bda1c8c5d606cc7fb6a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 24 Nov 2019 11:32:24 +1100 Subject: [PATCH 569/730] [maven-release-plugin] prepare release act-1.8.30a --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ebe04bf9..6a34cbf4e 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.30a-SNAPSHOT + 1.8.30a ACT Framework The ACT full stack MVC framework From cb8d63af714246dafd7aed20ede651e0aaa48b22 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 24 Nov 2019 11:32:34 +1100 Subject: [PATCH 570/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6a34cbf4e..8d7a9c722 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.30a + 1.8.31-SNAPSHOT ACT Framework The ACT full stack MVC framework From e602741faa6dadc1dc3a1d8a0ffd76652ba6e527 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 25 Nov 2019 20:22:48 +1100 Subject: [PATCH 571/730] update CHANGELOG - #1247 is still there - take it out --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cde4773bd..44687b254 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,6 @@ * Act-Test - Allow it to load test files from src/test/resources folder #1249 * API Doc - Return sample for array is not correct #1250 * SimpleRestfulServiceBase - property spec enhancements #1248 -* Param binding - allow specify `now` in `DefaultValue` for Date types #1247 * API doc - DOB sample data generator generates invalid date string #1246 * Allow it specify particular part of returned data in response using `_jsonPath` parameter #1245 * Support `htmltable` pseudo Accept type #1244 From 81f7bd1ee778d5f90f42bd4d10a3e412fbd004d9 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 22 Dec 2019 22:11:16 +1100 Subject: [PATCH 572/730] batch commit for 1.8.31 issues: 1247, 1253, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1264, 1266, 1267 --- CHANGELOG.md | 14 ++++ pom.xml | 14 ++-- src/main/java/act/Act.java | 14 +++- src/main/java/act/MimeTypeExtensions.java | 29 ++++++++ src/main/java/act/apidoc/Endpoint.java | 16 ++--- src/main/java/act/app/ActionContext.java | 11 +++ src/main/java/act/cli/CliCmdInfo.java | 47 ++++++++++++ src/main/java/act/cli/CliDispatcher.java | 54 ++++++++++++-- src/main/java/act/cli/builtin/Help.java | 65 +++++++++++------ src/main/java/act/conf/AppConfig.java | 49 +++++++------ src/main/java/act/conf/ConfLoader.java | 1 + src/main/java/act/controller/Controller.java | 71 +++++++++++++------ src/main/java/act/data/DateTimeType.java | 2 +- .../impl/ReflectedHandlerInvoker.java | 7 +- .../java/act/handler/event/ResultEvent.java | 40 +++++++++-- .../inject/param/ScopedParamValueLoader.java | 9 +++ src/main/java/act/job/Every.java | 9 +++ src/main/java/act/util/ActError.java | 33 +++++++-- .../java/act/util/ActErrorPageRender.java | 2 + src/main/java/act/util/DataTable.java | 22 +++++- src/main/java/act/util/PropertySpec.java | 20 ++++++ src/main/java/act/view/ActErrorResult.java | 6 +- src/main/java/act/xio/NetworkHandler.java | 15 ++-- .../act/xio/WebSocketConnectionHandler.java | 19 +++-- .../resources/asset/~act/js/jquery.ext.js | 16 ++--- src/main/resources/rythm/~table.html | 4 +- testapps/GHIssues/pom.xml | 4 +- .../src/main/java/ghissues/Gh1104.java | 1 - .../src/main/java/ghissues/Gh1260.java | 19 +++++ .../src/test/resources/scenarios/1260.yml | 10 +++ 30 files changed, 490 insertions(+), 133 deletions(-) create mode 100644 src/main/java/act/MimeTypeExtensions.java create mode 100644 src/main/java/act/cli/CliCmdInfo.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1260.java create mode 100644 testapps/GHIssues/src/test/resources/scenarios/1260.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 44687b254..9e33ea2d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # ActFramework Change Log +**1.8.31** +* ParamValueBinder - allow bind to ActionContext renderArgs #1267 +* CLI - add shortcut into the command help list #1266 +* No response on certain error scenario #1264 +* Support JSON path #1262 +* html-table rendering issue with a list of String #1261 +* IE 9 browser,got a strange error! #1260 +* ApiDoc bug: JPA Entity field #1259 +* XML Data bind to JSONObject issue #1258 +* API Doc - sample query data issue with array type #1257 +* JSON Error message should escape `"` #1256 +* `LoadResource` - error injecting into `C.Map` typed field #1253 +* Param binding - allow specify `now` in `DefaultValue` for Date types #1247 + **1.8.30a** 24/Nov/2019 * Fix issue - the upload file not found after moving testing resources to `src/test/resources` diff --git a/pom.xml b/pom.xml index 8d7a9c722..ab4221a2e 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 5.0.5 1.2 1.3.3 - 4.6.1 + 3.20.0 1.2.62 1.1.2 0.7 @@ -66,10 +66,10 @@ 3.12.1 - 1.22.1 + 1.22.2-SNAPSHOT 1.8.0 1.12.0 - 1.12.0 + 1.13.0-SNAPSHOT 1.11.0 1.10.0 1.5.0 @@ -277,7 +277,7 @@ - org.eclipse.jdt.core.compiler + org.eclipse.jdt ecj ${ecj.version} @@ -352,6 +352,12 @@ org.rythmengine rythm-engine ${rythmengine.version} + + + org.eclipse.jdt.core.compiler + ecj + + diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 5cff9266d..17dd024e5 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -860,7 +860,19 @@ private static void processEnvironment(AppDescriptor descriptor) { } public static void registerMimeTypes() { - MimeType.registerMimeType(DataTable.HTML_TABLE, "text/x-html-table"); + registerMimeType(MimeTypeExtensions.HTML_TABLE, "text/x-html-table"); + registerMimeType(MimeTypeExtensions.STRING_LIST, "text/x-string-list"); + } + + private static void registerMimeType(Keyword keyword, String contentType) { + registerMimeType(keyword.javaVariable().toLowerCase(), contentType); + registerMimeType(keyword.javaVariable(), contentType); + registerMimeType(keyword.dashed(), contentType); + registerMimeType(keyword.underscore(), contentType); + } + + private static void registerMimeType(String name, String contentType) { + MimeType.registerMimeType(name, contentType); } public static void registerTypeConverters() { diff --git a/src/main/java/act/MimeTypeExtensions.java b/src/main/java/act/MimeTypeExtensions.java new file mode 100644 index 000000000..11df19f0e --- /dev/null +++ b/src/main/java/act/MimeTypeExtensions.java @@ -0,0 +1,29 @@ +package act; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.util.DataTable; +import org.osgl.util.Keyword; + +public class MimeTypeExtensions { + public static final Keyword HTML_TABLE = DataTable.HTML_TABLE; + public static final Keyword STRING_LIST = Keyword.of("string-list"); +} diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index dbe100ade..2ca6ac662 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -161,7 +161,7 @@ private String checkDefaultValue(BeanSpec spec) { } Class type = spec.rawType(); Object o = Act.app().resolverManager().resolve(defStr, type); - return S.string(o); + return $.toString2(o); } private boolean checkRequired(BeanSpec spec) { @@ -618,13 +618,6 @@ private String generateSampleQuery(BeanSpec spec, Map typeParamLo if (S.notBlank(specName)) { nameChain.add(specName); } - if ($.isSimpleType(type)) { - Object o = generateSampleData(spec, typeParamLookup, typeChain, nameChain, false); - if (null == o) { - return ""; - } - return bindName + "=" + o; - } if (type.isArray()) { // TODO handle datetime component type Class elementType = type.getComponentType(); @@ -659,6 +652,13 @@ private String generateSampleQuery(BeanSpec spec, Map typeParamLo } else if (ReadableInstant.class.isAssignableFrom(type)) { return bindName + "="; } + if ($.isSimpleType(type)) { + Object o = generateSampleData(spec, typeParamLookup, typeChain, nameChain, false); + if (null == o) { + return ""; + } + return bindName + "=" + o; + } if (null != stringValueResolver(type)) { return bindName + "=" + sampleDataFromAnnotation(spec, bindName); } diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 148697866..2f2c7d0cd 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -1315,6 +1315,17 @@ public void login(Object userIdentifier) { app().eventBus().trigger(new LoginEvent(userIdentifier.toString())); } + /** + * Return the logged in user. + * + * Note this API returns the string set to context with {@link #login(Object)} call. + * + * @return the logged in user + */ + public String loginUser() { + return session.get(config().sessionKeyUsername()); + } + /** * Login the user and redirect back to original URL * diff --git a/src/main/java/act/cli/CliCmdInfo.java b/src/main/java/act/cli/CliCmdInfo.java new file mode 100644 index 000000000..858563a7f --- /dev/null +++ b/src/main/java/act/cli/CliCmdInfo.java @@ -0,0 +1,47 @@ +package act.cli; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.S; + +public class CliCmdInfo implements Comparable { + + public String name; + public String shortcut; + public String help = ""; + + public String nameAndShortcut() { + return S.buffer(name).a("(").a(shortcut).a(")").toString(); + } + + public int nameAndShortcutLen() { + return nameAndShortcut().length(); + } + + public int helpLen() { + return help.length(); + } + + @Override + public int compareTo(CliCmdInfo o) { + return name.compareTo(o.name); + } +} diff --git a/src/main/java/act/cli/CliDispatcher.java b/src/main/java/act/cli/CliDispatcher.java index 5db971a33..a74d168be 100644 --- a/src/main/java/act/cli/CliDispatcher.java +++ b/src/main/java/act/cli/CliDispatcher.java @@ -23,7 +23,6 @@ import act.Act; import act.app.App; import act.app.AppServiceBase; -import act.app.event.SysEventId; import act.cli.builtin.Exit; import act.cli.builtin.Help; import act.cli.builtin.IterateCursor; @@ -39,10 +38,7 @@ import org.osgl.util.Keyword; import org.osgl.util.S; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Dispatch console command to CLI command handler @@ -123,12 +119,54 @@ public List applicationCommands() { return commands(false, true); } + public SortedSet commandInfoList(boolean sys, boolean app) { + SortedSet list = new TreeSet<>(); + boolean all = !sys && !app; + for (Map.Entry entry : registry.entrySet()) { + Keyword keyword = entry.getKey(); + String s = rawNameRepo.get(keyword); + boolean isSysCmd = s.startsWith("act."); + if (isSysCmd && !sys && !all) { + continue; + } + if (!isSysCmd && !app && !all) { + continue; + } + CliHandler h = entry.getValue(); + CliCmdInfo info = new CliCmdInfo(); + info.help = h.commandLine()._2; + info.name = s; + List shortcuts = shortCuts(h); + if (null != shortcuts && !shortcuts.isEmpty()) { + info.shortcut = shortcuts.get(0); + } else { + info.shortcut = info.name; + } + if (info.shortcut.length() > s.length()) { + info.shortcut = s; + } + if (info.shortcut.startsWith("act.")) { + info.shortcut = info.shortcut.substring(4); + } + list.add(info); + } + return list; + } + + public List commandsWithShortcut(boolean sys, boolean app) { + return commands0(sys, app, true); + } + /** * Returns all commands in alphabetic order * * @return the list of commands */ public List commands(boolean sys, boolean app) { + return commands0(sys, app, false); + } + + private List commands0(boolean sys, boolean app, boolean withShortcut) { C.List list = C.newList(); Act.Mode mode = Act.mode(); boolean all = !sys && !app; @@ -143,6 +181,12 @@ public List commands(boolean sys, boolean app) { } CliHandler h = registry.get(keyword); if (h.appliedIn(mode)) { + if (withShortcut) { + List shortcuts = shortCuts(h); + if (null != shortcuts && !shortcuts.isEmpty()) { + s = s + " | " + shortcuts.get(0); + } + } list.add(s); } } diff --git a/src/main/java/act/cli/builtin/Help.java b/src/main/java/act/cli/builtin/Help.java index 8f1c92d8f..d8a84956c 100644 --- a/src/main/java/act/cli/builtin/Help.java +++ b/src/main/java/act/cli/builtin/Help.java @@ -22,17 +22,22 @@ import static org.osgl.$.T2; +import act.cli.CliCmdInfo; import act.cli.CliContext; import act.cli.CliDispatcher; import act.cli.util.CommandLineParser; +import act.cli.view.CliView; import act.handler.CliHandler; import act.handler.CliHandlerBase; +import act.util.PropertySpec; import org.fusesource.jansi.Ansi; import org.osgl.util.C; import org.osgl.util.S; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.SortedSet; public class Help extends CliHandlerBase { @@ -40,7 +45,11 @@ public class Help extends CliHandlerBase { private static int maxWidth = 0; + private PropertySpec.MetaInfo metaInfo; + private Help() { + metaInfo = new PropertySpec.MetaInfo(); + metaInfo.onCli("name,shortcut,help"); } @Override @@ -56,6 +65,7 @@ public void handle(CliContext context) { CommandLineParser parser = context.commandLine(); boolean sys = parser.getBoolean("-s", "--system"); boolean all = parser.getBoolean("-a", "--all"); + boolean tableList = parser.getBoolean("-t", "--table"); String q = parser.getString("-q", "--filter"); boolean app = true; if (all) { @@ -65,49 +75,61 @@ public void handle(CliContext context) { } CliDispatcher dispatcher = context.app().cliDispatcher(); - List sysCommands = dispatcher.commands(true, false); - List appCommands = dispatcher.commands(false, true); - int maxLen; - if (sys && !app) { - maxLen = calMaxCmdLen(sysCommands); - } else if (app && !sys) { - maxLen = calMaxCmdLen(appCommands); - } else { - maxLen = calMaxCmdLen(C.list(sysCommands).append(appCommands)); + SortedSet sysCommands = dispatcher.commandInfoList(true, false); + SortedSet appCommands = dispatcher.commandInfoList(false, true); + + int maxLen = -1; + if (!tableList) { + if (sys && !app) { + maxLen = calMaxCmdLen(sysCommands); + } else if (app && !sys) { + maxLen = calMaxCmdLen(appCommands); + } else { + maxLen = calMaxCmdLen(C.list(sysCommands).append(appCommands)); + } } - String fmt = "%-" + (maxLen + 4) + "s - %s"; + String fmt = maxLen < 0 ? null : "%-" + (maxLen + 4) + "s - %s"; + if (sys) { - list("@|bold System commands|@", fmt, sysCommands, dispatcher, context, q); + list("@|bold System commands|@", sysCommands, context, q, fmt); } if (app) { if (sys) { context.println(""); } - list("@|bold Application commands|@", fmt, appCommands, dispatcher, context, q); + list("@|bold Application commands|@", appCommands, context, q, fmt); } } - private void list(String label, String fmt, List commands, CliDispatcher dispatcher, CliContext context, String q) { + private void list(String label, Collection commands, CliContext context, String q, String fmt) { List lines = new ArrayList<>(); lines.add(label.toUpperCase()); - lines.add(""); q = S.string(q).trim(); boolean hasFilter = S.notEmpty(q); - for (String cmd : commands) { + List toBeDisplayed = new ArrayList<>(); + for (CliCmdInfo info : commands) { + String cmd = info.name; if (hasFilter && !(cmd.toLowerCase().contains(q) || cmd.matches(q))) { continue; } - CliHandler handler = dispatcher.handler(cmd); - T2 commandLine = handler.commandLine(); - lines.add(S.fmt(fmt, cmd, commandLine._2)); + if (null == fmt) { + toBeDisplayed.add(info); + } else { + lines.add(S.fmt(fmt, info.nameAndShortcut(), info.help)); + } } context.println(Ansi.ansi().render(S.join("\n", lines)).toString()); + + if (null == fmt) { + // display table list + context.println(CliView.TABLE.render(toBeDisplayed, metaInfo, context)); + } } - private int calMaxCmdLen(List commands) { + private int calMaxCmdLen(Collection commands) { int max = 0; - for (String c : commands) { - max = Math.max(max, c.length()); + for (CliCmdInfo info : commands) { + max = Math.max(max, info.nameAndShortcutLen()); } return max; } @@ -178,6 +200,7 @@ public List> options() { List> retList = new ArrayList<>(); retList.add(T2("-s --system", "list system commands")); retList.add(T2("-a --app", "list application commands")); + retList.add(T2("-t --table", "show command list in table")); return retList; } diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 6d6e2b1a1..91f5acb9b 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -58,8 +58,6 @@ import org.osgl.*; import org.osgl.cache.CacheService; import org.osgl.cache.CacheServiceProvider; -import org.osgl.cache.impl.SimpleCacheService; -import org.osgl.cache.impl.SimpleCacheServiceProvider; import org.osgl.exception.ConfigurationException; import org.osgl.exception.NotAppliedException; import org.osgl.http.H; @@ -2216,11 +2214,7 @@ private void _mergeDatePattern(AppConfig conf) { public String localizedDatePattern(Locale locale) { String s = localizedDatePatterns.get(locale); if (null == s) { - if (locale.equals(locale())) { - s = datePattern(); - } else { - s = getLocalizedDateTimePattern(locale, DateTimeType.DATE); - } + s = getLocalizedDateTimePattern(locale, DateTimeType.DATE); localizedDatePatterns.put(locale, s); } return s; @@ -2292,11 +2286,7 @@ private void _mergeTimePattern(AppConfig conf) { public String localizedTimePattern(Locale locale) { String s = localizedTimePattern.get(locale); if (null == s) { - if (locale.equals(locale())) { - s = timePattern(); - } else { - s = getLocalizedDateTimePattern(locale, DateTimeType.TIME); - } + s = getLocalizedDateTimePattern(locale, DateTimeType.TIME); localizedTimePattern.put(locale, s); } return s; @@ -2366,28 +2356,28 @@ private void _mergeDateTimeFmt(AppConfig conf) { public String localizedDateTimePattern(Locale locale) { String s = localizedDateTimePatterns.get(locale); if (null == s) { - if (locale.equals(locale())) { - s = dateTimePattern(); - } else { - s = getLocalizedDateTimePattern(locale, DateTimeType.DATE_TIME); - } + s = getLocalizedDateTimePattern(locale, DateTimeType.DATE_TIME); localizedDateTimePatterns.put(locale, s); } return s; } + private boolean isLocaleMatchesDefault(Locale locale) { + return locale().equals(locale) || baseLocale.equals(locale); + } private Locale locale = null; + private Locale baseLocale = null; protected T locale(Locale locale) { - E.NPE(locale); + this.baseLocale = baseLocaleOf(locale); this.locale = locale; return me(); } public Locale locale() { if (null == locale) { - locale = get(LOCALE, Locale.getDefault()); + locale(get(LOCALE, Locale.getDefault())); } return locale; } @@ -2395,9 +2385,14 @@ public Locale locale() { private void _mergeLocale(AppConfig conf) { if (!hasConfiguration(LOCALE)) { locale = conf.locale; + baseLocale = conf.baseLocale; } } + private Locale baseLocaleOf(Locale locale) { + return new Locale.Builder().setLanguage(locale.getLanguage()).build(); + } + private String sourceVersion = null; protected T sourceVersion(JavaVersion version) { @@ -3755,13 +3750,17 @@ private String getLocalizedDateTimePattern(Locale locale, DateTimeType dateTimeT } } if (null == s) { - DateTimeStyle style = dateTimeStyle(); - if (dateTimeType == DateTimeType.DATE) { - style = dateStyle(); - } else if (dateTimeType == DateTimeType.TIME) { - style = timeStyle(); + if (isLocaleMatchesDefault(locale)) { + s = dateTimeType.defaultPattern(this); + } else { + DateTimeStyle style = dateTimeStyle(); + if (dateTimeType == DateTimeType.DATE) { + style = dateStyle(); + } else if (dateTimeType == DateTimeType.TIME) { + style = timeStyle(); + } + s = dateTimeType.defaultPattern(style, locale); } - s = dateTimeType.defaultPattern(style, locale); } else { if (S.eq("long", s, S.IGNORECASE)) { s = dateTimeType.defaultPattern(DateTimeStyle.LONG, locale); diff --git a/src/main/java/act/conf/ConfLoader.java b/src/main/java/act/conf/ConfLoader.java index 5b63cf4ba..f79d21cc2 100644 --- a/src/main/java/act/conf/ConfLoader.java +++ b/src/main/java/act/conf/ConfLoader.java @@ -50,6 +50,7 @@ public T load() { rawConf.putAll((Map) sysProps); rawConf = processConf(rawConf); + processScanPackage(rawConf); return create(rawConf); } diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 934e5cdea..e07f6f9c3 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -21,13 +21,17 @@ */ import act.Act; +import act.MimeTypeExtensions; import act.app.ActionContext; import act.conf.AppConfigKey; import act.controller.meta.HandlerMethodMetaInfo; import act.data.Versioned; import act.route.Router; -import act.util.*; +import act.util.$$; +import act.util.DataTable; +import act.util.FastJsonIterable; import act.util.JsonUtilConfig.JsonWriter; +import act.util.PropertySpec; import act.view.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -40,16 +44,17 @@ import org.osgl.mvc.result.*; import org.osgl.storage.ISObject; import org.osgl.util.*; -import org.osgl.util.Output; +import javax.inject.Inject; import java.awt.image.BufferedImage; import java.io.File; import java.io.InputStream; -import java.lang.annotation.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.net.URL; -import java.util.Iterator; import java.util.Map; -import javax.inject.Inject; /** * Mark a class as Controller, which contains at least one of the following: @@ -62,7 +67,8 @@ @Target(ElementType.TYPE) public @interface Controller { - H.Format FMT_HTML_TABLE = H.Format.of(DataTable.HTML_TABLE); + H.Format FMT_HTML_TABLE = H.Format.of(MimeTypeExtensions.HTML_TABLE.dashed()); + H.Format FMT_STRING_LIST = H.Format.of(MimeTypeExtensions.STRING_LIST.dashed()); /** * Indicate the context path for all action methods declared @@ -1931,12 +1937,27 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon //return requireJSON ? RenderJSON.of("{}") : requireXML ? RenderXML.of("") : null; return null; } - String jsonPath = context.paramVal("_jsonPath"); - if (null != jsonPath) { - v = JSONPath.eval(v, jsonPath); - } Class vCls = v.getClass(); boolean isSimpleType = $.isSimpleType(vCls); + if (!isSimpleType) { + String jsonPath = context.paramVal("_jsonPath"); + if (null != jsonPath) { + String filter = null; + if (null != context.propertySpec()) { + filter = context.propertySpec().raw(context); + } + JSONObject json; + if (S.notBlank(filter)) { + json = $.deepCopy(v).filter(filter).to(JSONObject.class); + } else { + json = $.deepCopy(v).to(JSONObject.class); + } + v = JSONPath.eval(json, jsonPath); + } + if (null == v) { + return null; + } + } boolean shouldUseToString = $$.shouldUseToString(vCls); if (H.Format.HTML.isSameTypeWith(accept) && !shouldUseToString) { requireJSON = true; @@ -2000,20 +2021,26 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } req.accept(H.Format.HTML); return RenderTemplate.get(); - } else { - DirectRender dr = Act.viewManager().loadDirectRender(context); - if (null != dr) { - return new DirectRenderResult(dr, v); - } - // fall back to JSON - if (v instanceof $.Visitor) { - return RenderJSON.of(status, ($.Visitor) v); - } else if (v instanceof $.Func0) { - return RenderJSON.of(status, ($.Func0) v); + } else if (FMT_STRING_LIST.isSameTypeWith(accept)) { + if (v instanceof Iterable) { + Iterable itr = $.cast(v); + String s = S.join("\n", itr); + return RenderText.of(s); } - JsonWriter jsonWriter = new JsonWriter(v, propertySpec, false, context); - return context.isLargeResponse() ? RenderJSON.of(status, jsonWriter) : RenderJSON.of(status, jsonWriter.asContentProducer()); + // otherwise - leave it to default handling + } + DirectRender dr = Act.viewManager().loadDirectRender(context); + if (null != dr) { + return new DirectRenderResult(dr, v); + } + // fall back to JSON + if (v instanceof $.Visitor) { + return RenderJSON.of(status, ($.Visitor) v); + } else if (v instanceof $.Func0) { + return RenderJSON.of(status, ($.Func0) v); } + JsonWriter jsonWriter = new JsonWriter(v, propertySpec, false, context); + return context.isLargeResponse() ? RenderJSON.of(status, jsonWriter) : RenderJSON.of(status, jsonWriter.asContentProducer()); } } diff --git a/src/main/java/act/data/DateTimeType.java b/src/main/java/act/data/DateTimeType.java index a55e03a2f..6b9a8fb13 100644 --- a/src/main/java/act/data/DateTimeType.java +++ b/src/main/java/act/data/DateTimeType.java @@ -187,7 +187,7 @@ public String sanitizePattern(String dateTimePattern) { public abstract String defaultPattern(AppConfig config, Locale locale); - protected abstract String defaultPattern(AppConfig config); + public abstract String defaultPattern(AppConfig config); protected abstract String defaultLongPattern(Locale locale); protected abstract String defaultMediumPattern(Locale locale); diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index b7f878978..bc07fbef9 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -184,11 +184,8 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.xmlRootTag = config.xmlRootTag(); Class[] paramTypes = paramTypes(app); - try { - method = controllerClass.getMethod(handlerMetaInfo.name(), paramTypes); - } catch (NoSuchMethodException e) { - throw E.unexpected(e); - } + method = $.getMethod(controllerClass, handlerMetaInfo.name(), paramTypes); + E.unexpectedIf(null == method, "Unable to locate handler method: " + handlerMetaInfo.name()); this.returnType = Generics.getReturnType(method, controllerClass); this.returnString = this.returnType == String.class; Integer priority = handler.priority(); diff --git a/src/main/java/act/handler/event/ResultEvent.java b/src/main/java/act/handler/event/ResultEvent.java index 49829d467..0e402d2e6 100644 --- a/src/main/java/act/handler/event/ResultEvent.java +++ b/src/main/java/act/handler/event/ResultEvent.java @@ -20,12 +20,14 @@ * #L% */ +import act.Act; import act.app.ActionContext; import act.event.ActEvent; import act.event.SystemEvent; import org.osgl.$; import org.osgl.exception.NotAppliedException; import org.osgl.http.H; +import org.osgl.mvc.result.ErrorResult; import org.osgl.mvc.result.Result; public abstract class ResultEvent extends ActEvent implements SystemEvent { @@ -57,9 +59,23 @@ public H.Response response() { @Override public Void apply(Result result, H.Request request, H.Response response) throws NotAppliedException, $.Break { ActionContext context = request.context(); - context.applyCorsSpec().applyContentSecurityPolicy().applyContentType(result); - if (!context.skipEvents()) { - context.app().eventBus().emit(new BeforeResultCommit(result, request, response)); + try { + context.applyCorsSpec().applyContentSecurityPolicy().applyContentType(result); + if (!context.skipEvents()) { + context.app().eventBus().emit(new BeforeResultCommit(result, request, response)); + } + } catch (RuntimeException e) { + if (Act.isProd()) { + throw e; + } + if (!(result instanceof ErrorResult)) { + throw e; + } + // it might happens in rare case + // refer https://github.com/actframework/actframework/issues/1264 + // however we don't need to raise it or log it as it + // is already logged in somewhere else + // we just want to ensure the error page can be generated. } return null; } @@ -72,8 +88,22 @@ public Void apply(Result result, H.Request request, H.Response response) t public Void apply(Result result, H.Request request, H.Response response) throws NotAppliedException, $.Break { ActionContext context = request.context(); context.logAccess(response); - if (!context.skipEvents()) { - context.app().eventBus().emit(new AfterResultCommit(result, request, response)); + try { + if (!context.skipEvents()) { + context.app().eventBus().emit(new AfterResultCommit(result, request, response)); + } + } catch (RuntimeException e) { + if (Act.isProd()) { + throw e; + } + if (!(result instanceof ErrorResult)) { + throw e; + } + // it might happens in rare case + // refer https://github.com/actframework/actframework/issues/1264 + // however we don't need to raise it or log it as it + // is already logged in somewhere else + // we just want to ensure the error page can be generated. } return null; } diff --git a/src/main/java/act/inject/param/ScopedParamValueLoader.java b/src/main/java/act/inject/param/ScopedParamValueLoader.java index 77fc9c7cd..cf2b2d594 100644 --- a/src/main/java/act/inject/param/ScopedParamValueLoader.java +++ b/src/main/java/act/inject/param/ScopedParamValueLoader.java @@ -20,9 +20,11 @@ * #L% */ +import act.app.ActionContext; import act.inject.genie.RequestScope; import act.inject.genie.SessionScope; import act.util.ActContext; +import org.osgl.$; import org.osgl.inject.BeanSpec; class ScopedParamValueLoader implements ParamValueLoader { @@ -49,6 +51,13 @@ private ScopedParamValueLoader(ScopedParamValueLoader parent, Class runtimeType) @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { + if (context instanceof ActionContext) { + ActionContext ac = $.cast(context); + Object renderArg = ac.renderArg(realLoader.bindName()); + if (null != renderArg) { + return renderArg; + } + } if (supportCaching) { Object cached = scopeCache.get(key); boolean isSession = SessionScope.INSTANCE == scopeCache; diff --git a/src/main/java/act/job/Every.java b/src/main/java/act/job/Every.java index 38fe3f287..3dc5df634 100644 --- a/src/main/java/act/job/Every.java +++ b/src/main/java/act/job/Every.java @@ -70,4 +70,13 @@ */ boolean startImmediately() default true; + String EVERY_1_SECOND = "1s"; + String EVERY_5_SECONDS = "5s"; + String EVERY_1_MINUTE = "1mn"; + String EVERY_5_MINUTES = "5mn"; + String EVERY_1_HOUR = "1h"; + String EVERY_5_HOURS = "5h"; + String EVERY_1_DAY = "1d"; + String EVERY_5_DAYS = "5d"; + } diff --git a/src/main/java/act/util/ActError.java b/src/main/java/act/util/ActError.java index 79e511426..0a2d95344 100644 --- a/src/main/java/act/util/ActError.java +++ b/src/main/java/act/util/ActError.java @@ -81,7 +81,12 @@ public static SourceInfo loadSourceInfo(Throwable cause, Class errorClass) { @@ -114,9 +119,27 @@ private static SourceInfo _loadSourceInfo(StackTraceElement[] sa, Class clz = Act.classForName(className); + for (Method m : clz.getMethods()) { + if (methodName.equals(m.getName())) { + return loadSourceInfo(m); + } + } + for (Method m : clz.getDeclaredMethods()) { + if (methodName.equals(m.getName())) { + return loadSourceInfo(m); + } + } + } } return loadSourceInfo(caller, errorClass); } else if (ctx instanceof CliContext) { @@ -133,7 +156,7 @@ private static SourceInfo _loadSourceInfo(StackTraceElement[] sa, Class errorClass) { - return _loadSourceInfo(new RuntimeException().getStackTrace(), errorClass); + return loadSourceInfo(new RuntimeException(), errorClass); } public static List stackTraceOf(ActError error) { diff --git a/src/main/java/act/util/ActErrorPageRender.java b/src/main/java/act/util/ActErrorPageRender.java index 3fdcaa001..63c85a529 100644 --- a/src/main/java/act/util/ActErrorPageRender.java +++ b/src/main/java/act/util/ActErrorPageRender.java @@ -27,6 +27,7 @@ import act.controller.Controller; import act.view.Template; import act.view.ViewManager; +import org.apache.commons.lang3.StringEscapeUtils; import org.osgl.$; import org.osgl.http.H; import org.osgl.mvc.ErrorPageRenderer; @@ -122,6 +123,7 @@ private String jsonContent(ErrorResult error, Integer errorCode, String errorMsg if (null != payload) { return com.alibaba.fastjson.JSON.toJSONString(payload); } + errorMsg = StringEscapeUtils.escapeJson(errorMsg); if (null == errorCode) { return S.concat("{\"ts\":", $.ms(), ",\"message\":\"", errorMsg, "\"}"); } else { diff --git a/src/main/java/act/util/DataTable.java b/src/main/java/act/util/DataTable.java index 431dc2c34..e71117790 100644 --- a/src/main/java/act/util/DataTable.java +++ b/src/main/java/act/util/DataTable.java @@ -46,10 +46,16 @@ */ public class DataTable implements Iterable { - public static final String HTML_TABLE = "htmltable"; + public static final Keyword HTML_TABLE = Keyword.of("html-table"); public static final String KEY_FIELD = "_field"; + /** + * A pseudo column key for the entire data object + * - used with data table of {@link org.osgl.Lang#isSimpleType(Class) simple types}. + */ + public static final String KEY_THIS = "_this_"; + private List colKeys; private Iterable rows; private int rowCount; @@ -134,7 +140,14 @@ public List heading() { return colKeys; } List heading = new ArrayList<>(); + String idLabel = labelLookup.get("id"); + if (null != idLabel) { + heading.add(idLabel); + } for (String colKey : colKeys) { + if ("id".equals(colKey)) { + continue; + } String label = labelLookup.get(colKey); heading.add(null != label ? label : colKey); } @@ -161,6 +174,9 @@ public Object val(Object row, int colIndex) { * @return the value of the column on the row */ public Object val(Object row, String label) { + if (KEY_THIS == label) { + return row; + } String colKey = label; if (!isTranspose) { colKey = reverseLabelLookup.get(label); @@ -445,6 +461,10 @@ private boolean isNumeric(Class ft) { private SortedSet keysOf(Object pojo) { Class type = pojo.getClass(); SortedSet keys = new TreeSet<>(); + if ($.isSimpleType(type)) { + keys.add(KEY_THIS); + return keys; + } // Check all public fields for (Field f : type.getFields()) { String fn = f.getName(); diff --git a/src/main/java/act/util/PropertySpec.java b/src/main/java/act/util/PropertySpec.java index b2ef78d56..a548ab840 100644 --- a/src/main/java/act/util/PropertySpec.java +++ b/src/main/java/act/util/PropertySpec.java @@ -187,15 +187,22 @@ private static Spec newSpec() { private Spec cli = newSpec(); private Spec http = newSpec(); + private String commonRaw; + private String cliRaw; + private String httpRaw; + public void onValue(String value) { + commonRaw = value; _on(value, common); } public void onCli(String value) { + cliRaw = value; _on(value, cli); } public void onHttp(String value) { + httpRaw = value; _on(value, http); } @@ -232,6 +239,19 @@ public List outputFields() { return C.list(common.outputs()); } + public String raw(ActContext context) { + if (null == context) { + return commonRaw; + } else if (context instanceof ActionContext) { + return S.blank(httpRaw) ? commonRaw : httpRaw; + } else if (context instanceof CliContext) { + return S.blank(cliRaw) ? commonRaw : cliRaw; + } else { + // mail context is unlikely to happen + throw new IllegalStateException("context not applied: " + context); + } + } + public List outputFields(ActContext context) { Spec spec = spec(context); return null == spec ? C.list() : spec.outputs(); diff --git a/src/main/java/act/view/ActErrorResult.java b/src/main/java/act/view/ActErrorResult.java index ffb83e0b4..49750cad0 100644 --- a/src/main/java/act/view/ActErrorResult.java +++ b/src/main/java/act/view/ActErrorResult.java @@ -188,9 +188,9 @@ public Result transform(Throwable throwable) { return ActBadRequest.create(throwable); } }; - x.put(IllegalArgumentException.class, badRequest); - x.put(InvalidRangeException.class, badRequest); - x.put(IndexOutOfBoundsException.class, badRequest); +// x.put(IllegalArgumentException.class, badRequest); +// x.put(InvalidRangeException.class, badRequest); +// x.put(IndexOutOfBoundsException.class, badRequest); x.put(ValidationException.class, badRequest); x.put(BindException.class, badRequest); } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index a452f5d99..e9dc29fe9 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -238,11 +238,15 @@ public void run() { } } }; - if (method.unsafe() || !requestHandler.express(ctx)) { - dispatcher.dispatch(job); - } else { - ctx.markAsNonBlock(); - job.run(); + try { + if (method.unsafe() || !requestHandler.express(ctx)) { + dispatcher.dispatch(job); + } else { + ctx.markAsNonBlock(); + job.run(); + } + } catch (RuntimeException e) { + handleException(e, ctx, "Error handling network request"); } } @@ -267,6 +271,7 @@ private void handleException(Exception exception, final ActionContext ctx, Strin } else if (r instanceof ErrorResult) { r = ActErrorResult.of(r); } + ctx.setResult(r); if (null == ctx.handler()) { ctx.handler(FastRequestHandler.dumbHandler(ctx)); } diff --git a/src/main/java/act/xio/WebSocketConnectionHandler.java b/src/main/java/act/xio/WebSocketConnectionHandler.java index aedfc382c..305d56af0 100644 --- a/src/main/java/act/xio/WebSocketConnectionHandler.java +++ b/src/main/java/act/xio/WebSocketConnectionHandler.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -97,13 +97,10 @@ public WebSocketConnectionHandler(ActionMethodMetaInfo methodInfo, WebSocketConn paramTypes = paramTypes(app); - try { - this.method = handlerClass.getMethod(methodInfo.name(), paramTypes); - this.isWsHandler = null != this.method.getAnnotation(WsAction.class); - this.disabled = this.disabled || !Env.matches(method); - } catch (NoSuchMethodException e) { - throw E.unexpected(e); - } + this.method = $.getMethod(handlerClass, methodInfo.name(), paramTypes); + E.unexpectedIf(null == method, "Unable to locate handler method: " + methodInfo.name()); + this.isWsHandler = null != this.method.getAnnotation(WsAction.class); + this.disabled = this.disabled || !Env.matches(method); if (!isWsHandler || disabled) { return; @@ -181,6 +178,7 @@ protected void setConnectionListener(WebSocketConnectionListener connectionListe /** * Called by implementation class once websocket connection established * at networking layer. + * * @param context the websocket context */ protected final void _onConnect(WebSocketContext context) { @@ -207,6 +205,7 @@ public String toString() { /** * This method is used by {@link act.handler.builtin.controller.RequestHandlerProxy} * to check if a handler is WS handler or GET handler + * * @return `true` if this is a real WS handler */ public boolean isWsHandler() { @@ -343,7 +342,7 @@ private String singleJsonFieldName(WebSocketContext context) { return singleJsonFieldName; } Set set = context.paramKeys(); - for (BeanSpec spec: paramSpecs) { + for (BeanSpec spec : paramSpecs) { String name = spec.name(); if (!set.contains(name)) { return name; diff --git a/src/main/resources/asset/~act/js/jquery.ext.js b/src/main/resources/asset/~act/js/jquery.ext.js index 82b8f3e52..7872f6096 100644 --- a/src/main/resources/asset/~act/js/jquery.ext.js +++ b/src/main/resources/asset/~act/js/jquery.ext.js @@ -128,14 +128,14 @@ jQuery.each(["getJSON", "postJSON", "putJSON", "deleteJSON", "patchJSON"], funct if (!hasParam) url = url + "?_method=" + method.replace("JSON", ""); submitMethod = "post"; } - if (method.startsWith("get")) { - var hasParam = url.contains("?"); - if (!hasParam) { - url = url +"?_now="+ new Date().getTime(); - } else { - url = url +"&_now="+ new Date().getTime(); - } - } +// if (method.startsWith("get")) { +// var hasParam = url.contains("?"); +// if (!hasParam) { +// url = url +"?_now="+ new Date().getTime(); +// } else { +// url = url +"&_now="+ new Date().getTime(); +// } +// } var setup = { url: url, type: submitMethod.replace("JSON", ""), diff --git a/src/main/resources/rythm/~table.html b/src/main/resources/rythm/~table.html index 980c8d52c..3356105fa 100644 --- a/src/main/resources/rythm/~table.html +++ b/src/main/resources/rythm/~table.html @@ -5,7 +5,7 @@
                                                                                                                                                                              @for(table.heading()) { - + } @@ -49,6 +49,8 @@ } @if(isUrl(v)) { @v + } else if (null == v || "".equals(v.toString().trim())) { +   } else { @toString(v).raw() } diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index a1e3786ce..fe5de65f8 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.30.0 + 1.8.30.1 @@ -25,7 +25,7 @@ org.actframework act - 1.8.30a-SNAPSHOT + 1.8.31-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1104.java b/testapps/GHIssues/src/main/java/ghissues/Gh1104.java index d4de7ece5..a02aad872 100644 --- a/testapps/GHIssues/src/main/java/ghissues/Gh1104.java +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1104.java @@ -12,7 +12,6 @@ import java.util.Map; @UrlContext("1104") -//@JsonView @SuppressWarnings("unused") public class Gh1104 extends BaseController { diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1260.java b/testapps/GHIssues/src/main/java/ghissues/Gh1260.java new file mode 100644 index 000000000..2278a39ec --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1260.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1260") +public class Gh1260 extends BaseController { + + @GetAction + public String test() { + return "Hello World"; + } + + @GetAction("2") + public String test2() { + return "

                                                                                                                                                                              Hello World

                                                                                                                                                                              "; + } + +} diff --git a/testapps/GHIssues/src/test/resources/scenarios/1260.yml b/testapps/GHIssues/src/test/resources/scenarios/1260.yml new file mode 100644 index 000000000..e2ee4b0bd --- /dev/null +++ b/testapps/GHIssues/src/test/resources/scenarios/1260.yml @@ -0,0 +1,10 @@ +Scenario(1260): + description: "IE 9 browser,got a strange error" + interactions: + - description: test + request: + headers: + accept: "application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, imagepeg, application/x-ms-xbap, */*" + get: 1260 + response: + text: Hello World From 9ec12a1f4ef6b38a175319e5080fec09c44c0d0f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 30 Dec 2019 22:27:28 +1100 Subject: [PATCH 573/730] Enable turn off QRCode/BarCode rendering based on Accept header #1269 --- CHANGELOG.md | 1 + .../act/annotations/AllowQrCodeRendering.java | 34 ++++++++++ src/main/java/act/app/ActionContext.java | 23 ++++--- src/main/java/act/controller/Controller.java | 21 +++++-- .../impl/ReflectedHandlerInvoker.java | 7 +++ src/main/java/act/view/QrCodeView.java | 2 +- .../src/main/java/ghissues/Gh1269.java | 21 +++++++ .../src/main/java/stress_test/Client.java | 63 ------------------- .../src/test/resources/scenarios/1269.yml | 17 +++++ 9 files changed, 112 insertions(+), 77 deletions(-) create mode 100644 src/main/java/act/annotations/AllowQrCodeRendering.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1269.java delete mode 100644 testapps/GHIssues/src/main/java/stress_test/Client.java create mode 100644 testapps/GHIssues/src/test/resources/scenarios/1269.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e33ea2d3..22abd89fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.31** +* Enable turn off QRCode/BarCode rendering based on Accept header #1269 * ParamValueBinder - allow bind to ActionContext renderArgs #1267 * CLI - add shortcut into the command help list #1266 * No response on certain error scenario #1264 diff --git a/src/main/java/act/annotations/AllowQrCodeRendering.java b/src/main/java/act/annotations/AllowQrCodeRendering.java new file mode 100644 index 000000000..af3b29c73 --- /dev/null +++ b/src/main/java/act/annotations/AllowQrCodeRendering.java @@ -0,0 +1,34 @@ +package act.annotations; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Mark on a request handler that is subject to QR/Bar code rendering. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface AllowQrCodeRendering { +} diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 2f2c7d0cd..975e61dfa 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -100,6 +100,7 @@ public class ActionContext extends ActContext.Base implements Des private $.Visitor templateChangeListener; private H.Status forceResponseStatus; private boolean cacheEnabled; + private boolean allowQrCodeRendering; private MissingAuthenticationHandler forceMissingAuthenticationHandler; private MissingAuthenticationHandler forceCsrfCheckingFailureHandler; private String urlContext; @@ -540,9 +541,9 @@ public UrlPath urlPath() { * the url argument */ public void forward(String url, Object... args) { - E.illegalArgumentIfNot(url.startsWith("/"), "forward URL must starts with single '/'"); - E.illegalArgumentIf(url.startsWith("//"), "forward URL must starts with single `/`"); - E.unexpectedIfNot(H.Method.GET == req().method(), "forward only support on HTTP GET request"); + badRequestIfNot(url.startsWith("/"), "forward URL must starts with single '/'"); + badRequestIf(url.startsWith("//"), "forward URL must starts with single `/`"); + badRequestIfNot(H.Method.GET == req().method(), "forward only support on HTTP GET request"); uploads.clear(); extraParams.clear(); bodyParams = null; @@ -639,7 +640,7 @@ public ActionContext setHasTemplate(boolean b) { } public ActionContext enableCache() { - E.illegalArgumentIf(this.cacheEnabled, "cache already enabled in the action context"); + E.illegalStateIf(this.cacheEnabled, "cache already enabled in the action context"); this.cacheEnabled = true; this.response = new ResponseCache(response); return this; @@ -653,6 +654,14 @@ public boolean isAllowIgnoreParamNamespace() { return allowIgnoreParamNamespace; } + public void markAllowQrCodeRendering() { + allowQrCodeRendering = true; + } + + public boolean allowQrCodeRendering() { + return allowQrCodeRendering; + } + public void allowIgnoreParamNamespace() { allowIgnoreParamNamespace = true; } @@ -781,19 +790,19 @@ public Set paramNames() { * {@link #paramVal(String)} with `__path` as param name. * * However, this method will do sanity check on the value returned, in case - * there are `..` found in the value, an `IllegalArgumentException` will + * there are `..` found in the value, an `BadRequest` will * be thrown out. This is to prevent the insecure direct object reference * attack. * * @return the param value of `__path` - * @throws IllegalArgumentException when the value contains string `..` + * @throws org.osgl.mvc.result.BadRequest when the value contains string `..` */ public String __pathParamVal() { String s = paramVal(ParamNames.PATH); if (null == s) { return s; } - E.illegalArgumentIf(s.contains(".."), "`..` found in path which is not allowed"); + badRequestIf(s.contains(".."), "`..` found in path which is not allowed"); return s; } diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index e07f6f9c3..3448c7887 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1794,13 +1794,23 @@ public static Result inferPrimitiveResult( } else { H.Format fmt = actionContext.accept(); String fmtName = fmt.name(); - if (S.eq(fmtName, "qrcode")) { - return new ZXingResult(v2s(v, shouldUseToString), BarcodeFormat.QR_CODE); - } else if (S.eq(fmtName, "barcode")) { - return new ZXingResult(v2s(v, shouldUseToString), BarcodeFormat.CODE_128); - } else if (fmt.isText()) { + boolean allowQrCodeRendering = actionContext.allowQrCodeRendering(); + if (!allowQrCodeRendering) { + if (S.eq(fmtName, "qrcode") || S.eq(fmtName, "barcode")) { + fmt = H.Format.TXT; + actionContext.req().accept(fmt); + } + } + if (fmt.isText()) { return RenderText.of(status, fmt, v2s(v, shouldUseToString)); } +// if (S.eq(fmtName, "qrcode")) { +// return new ZXingResult(v2s(v, shouldUseToString), BarcodeFormat.QR_CODE); +// } else if (S.eq(fmtName, "barcode")) { +// return new ZXingResult(v2s(v, shouldUseToString), BarcodeFormat.CODE_128); +// } else if (fmt.isText()) { +// return RenderText.of(status, fmt, v2s(v, shouldUseToString)); +// } DirectRender dr = Act.viewManager().loadDirectRender(actionContext); if (null == dr) { throw E.unexpected("Cannot apply text result to format: %s", fmt); @@ -1877,7 +1887,6 @@ public static Result inferResult(File file, ActionContext actionContext) { } public static Result inferResult(ISObject sobj, ActionContext context) { - H.Format.of("qrcode"); if (context.acceptJson()) { return RenderJSON.of(context.successStatus(), sobj.asString()); } else { diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index bc07fbef9..5ff92be7e 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -171,6 +171,8 @@ public void visit(H.Format format) throws $.Break { private List dtoPatches = new ArrayList<>(); private boolean hasDtoPatches; private Class returnType; + // see https://github.com/actframework/actframework/issues/1269 + private boolean allowQrCodeRendering; private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; @@ -238,6 +240,7 @@ private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { } else { method.setAccessible(true); } + this.allowQrCodeRendering = ReflectedInvokerHelper.isAnnotationPresent(AllowQrCodeRendering.class, method); if (!isBuiltIn && handlerMetaInfo.hasReturn() && null == ReflectedInvokerHelper.getAnnotation(NoReturnValueAdvice.class, method)) { ReturnValueAdvisor advisor = getAnnotation(ReturnValueAdvisor.class); @@ -542,6 +545,10 @@ public Result handle(final ActionContext context) { context.downloadFileName(downloadFilename); } + if (allowQrCodeRendering) { + context.markAllowQrCodeRendering(); + } + context.setReflectedHandlerInvoker(this); if (!context.skipEvents()) { app.eventBus().emit(new ReflectedHandlerInvokerInvoke(this, context)); diff --git a/src/main/java/act/view/QrCodeView.java b/src/main/java/act/view/QrCodeView.java index 16642862d..55f950ba5 100644 --- a/src/main/java/act/view/QrCodeView.java +++ b/src/main/java/act/view/QrCodeView.java @@ -37,7 +37,7 @@ private static class Render implements DirectRender { @Override public void render(Object result, ActionContext context) { - new ZXingResult(S.string(result), fmt).applyMessage(context.req(), context.resp()); + new ZXingResult(S.string(result), fmt).apply(context.req(), context.resp()); } } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1269.java b/testapps/GHIssues/src/main/java/ghissues/Gh1269.java new file mode 100644 index 000000000..5adac9fe7 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1269.java @@ -0,0 +1,21 @@ +package ghissues; + +import act.annotations.AllowQrCodeRendering; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1269") +public class Gh1269 extends BaseController { + + @GetAction("allowQrCode") + @AllowQrCodeRendering + public String allowQrCode() { + return "gh1269"; + } + + @GetAction("notAllowQrCode") + public String notAllowQrCode() { + return "gh1269"; + } + +} diff --git a/testapps/GHIssues/src/main/java/stress_test/Client.java b/testapps/GHIssues/src/main/java/stress_test/Client.java deleted file mode 100644 index dab0eb5e9..000000000 --- a/testapps/GHIssues/src/main/java/stress_test/Client.java +++ /dev/null @@ -1,63 +0,0 @@ -package stress_test; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import org.osgl.$; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -public class Client { - - public static void main(String[] args) throws Exception { - long ts = $.ms(); - final OkHttpClient http = new OkHttpClient.Builder().build(); - final AtomicInteger backlog = new AtomicInteger(100000); - final AtomicInteger errors = new AtomicInteger(0); - final AtomicInteger exceptions = new AtomicInteger(0); - ExecutorService exec = Executors.newFixedThreadPool(100); - for (int i = 0; i < 150; ++i) { - exec.submit(new Runnable() { - @Override - public void run() { - while (backlog.getAndDecrement() > 0) { - String url = "http://localhost:5460/y"; - //String url = "http://localhost:8080/y"; - //String url = "http://localhost:5460/y"; - //String url = "http://localhost:8080/x"; - Request request = new Request.Builder().url(url).get().build(); - try { - Response resp = http.newCall(request).execute(); -// String str = resp.body().string(); -// try { -// JSONObject json = JSON.parseObject(str); -// if (!json.getString("name").endsWith("b")) { -// errors.incrementAndGet(); -// } -// } catch (Exception e0) { -// exceptions.incrementAndGet(); -// } finally { -// resp.close(); -// } - } catch (Exception e) { - exceptions.incrementAndGet(); - } - } - } - }); - } - exec.shutdown(); - if (!exec.awaitTermination(1000, TimeUnit.SECONDS)) { - System.out.println("execution service timeout"); - } - System.out.printf("errors: %s\n", errors.get()); - System.out.printf("exceptions: %s\n", exceptions.get()); - System.out.printf("It takes %sms to finish\n", $.ms() - ts); - } - -} diff --git a/testapps/GHIssues/src/test/resources/scenarios/1269.yml b/testapps/GHIssues/src/test/resources/scenarios/1269.yml new file mode 100644 index 000000000..1036f0e39 --- /dev/null +++ b/testapps/GHIssues/src/test/resources/scenarios/1269.yml @@ -0,0 +1,17 @@ +Scenario(1269): + description: "Enable turn off QRCode/BarCode rendering based on Accept header" + urlContext: 1269 + interactions: + - description: test allow qrcode method + request: + get: allowQrCode?_accept=qrcode + response: + headers: + Content-Type: image/png + - description: test not allow qrcode method + request: + get: notAllowQrCode?_accept=qrcode + response: + headers: + Content-Type: text/plain + text: gh1269 From 09f85755bd88ef8ade713f2c2b9abb454ed3d66d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 31 Dec 2019 09:32:57 +1100 Subject: [PATCH 574/730] CI test case for GH1267 --- .../src/main/java/ghissues/Gh1267.java | 23 +++++++++++++++++++ .../src/test/resources/scenarios/1267.yml | 8 +++++++ 2 files changed, 31 insertions(+) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1267.java create mode 100644 testapps/GHIssues/src/test/resources/scenarios/1267.yml diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1267.java b/testapps/GHIssues/src/main/java/ghissues/Gh1267.java new file mode 100644 index 000000000..1a1581955 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1267.java @@ -0,0 +1,23 @@ +package ghissues; + +import act.annotations.AllowQrCodeRendering; +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.Before; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.S; + +@UrlContext("1267") +public class Gh1267 extends BaseController { + + @Before + public void before(String name, String host, ActionContext context) { + context.renderArg("email", S.pathConcat(name, '@', host)); + } + + @GetAction + public String checkBind(String email) { + return email; + } + +} diff --git a/testapps/GHIssues/src/test/resources/scenarios/1267.yml b/testapps/GHIssues/src/test/resources/scenarios/1267.yml new file mode 100644 index 000000000..c8df091f4 --- /dev/null +++ b/testapps/GHIssues/src/test/resources/scenarios/1267.yml @@ -0,0 +1,8 @@ +Scenario(1267): + description: "ParamValueBinder - allow bind to ActionContext renderArgs" + interactions: + - description: test bind to render args + request: + get: 1267?name=someone&host=somewhere.com + response: + result: someone@somewhere.com From 034b094c7032f62ef028b45fc4abb94ea711bed2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 31 Dec 2019 09:38:35 +1100 Subject: [PATCH 575/730] Disable WARN message on TopLevelDomainList download error when act is running in a non-internet environment #1265 --- CHANGELOG.md | 1 + src/main/java/act/util/TopLevelDomainList.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22abd89fe..1dbd03327 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * Enable turn off QRCode/BarCode rendering based on Accept header #1269 * ParamValueBinder - allow bind to ActionContext renderArgs #1267 * CLI - add shortcut into the command help list #1266 +* Disable WARN message on TopLevelDomainList download error when act is running in a non-internet environment #1265 * No response on certain error scenario #1264 * Support JSON path #1262 * html-table rendering issue with a list of String #1261 diff --git a/src/main/java/act/util/TopLevelDomainList.java b/src/main/java/act/util/TopLevelDomainList.java index 720f32ebb..e3909d5ef 100644 --- a/src/main/java/act/util/TopLevelDomainList.java +++ b/src/main/java/act/util/TopLevelDomainList.java @@ -32,6 +32,7 @@ import javax.annotation.PostConstruct; import javax.inject.Singleton; +import java.net.UnknownHostException; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -97,6 +98,8 @@ public void run() { } try { downloadTld(); + } catch (UnknownHostException e) { + // ignore - refer to https://github.com/actframework/actframework/issues/1265 } catch (Exception e) { warn(e, "error download TLD list file"); } From 6dcfcaa9783e010da5dd4c90e08a4066553c62bb Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 1 Jan 2020 13:03:15 +1100 Subject: [PATCH 576/730] fix #1270 and #1271 --- CHANGELOG.md | 2 + pom.xml | 4 +- .../java/act/apidoc/ISampleDataCategory.java | 46 +++ src/main/java/act/apidoc/SampleData.java | 377 +++++++++++++++++- .../java/act/apidoc/SampleDataCategory.java | 3 +- .../act/apidoc/SampleDataCategoryManager.java | 57 +++ .../java/act/apidoc/SampleDataProvider.java | 4 + .../act/apidoc/SampleDataProviderManager.java | 18 +- .../test/func/SampleDataProviderAdaptor.java | 14 +- src/main/java/act/test/verifier/In.java | 47 +++ testapps/GHIssues/pom.xml | 1 + .../main/java/ghissues/BaseController.java | 1 - .../src/main/java/ghissues/Gh1262.java | 49 +++ .../src/test/resources/scenarios/1262.yml | 21 + 14 files changed, 619 insertions(+), 25 deletions(-) create mode 100644 src/main/java/act/apidoc/ISampleDataCategory.java create mode 100644 src/main/java/act/apidoc/SampleDataCategoryManager.java create mode 100644 src/main/java/act/test/verifier/In.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1262.java create mode 100644 testapps/GHIssues/src/test/resources/scenarios/1262.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dbd03327..e70b31430 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.31** +* Act-Test - Add `In` verifier #1271 +* Create an API to allow developer generate random data #1270 * Enable turn off QRCode/BarCode rendering based on Accept header #1269 * ParamValueBinder - allow bind to ActionContext renderArgs #1267 * CLI - add shortcut into the command help list #1266 diff --git a/pom.xml b/pom.xml index ab4221a2e..9b08814fe 100644 --- a/pom.xml +++ b/pom.xml @@ -66,9 +66,9 @@ 3.12.1 - 1.22.2-SNAPSHOT + 1.23.0-SNAPSHOT 1.8.0 - 1.12.0 + 1.13.0-SNAPSHOT 1.13.0-SNAPSHOT 1.11.0 1.10.0 diff --git a/src/main/java/act/apidoc/ISampleDataCategory.java b/src/main/java/act/apidoc/ISampleDataCategory.java new file mode 100644 index 000000000..00c018f0b --- /dev/null +++ b/src/main/java/act/apidoc/ISampleDataCategory.java @@ -0,0 +1,46 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.util.Set; + +/** + * Identify a sample data category + */ +public interface ISampleDataCategory { + /** + * Returns the name of the sample data category. + * + * Note the name of the sample data category must be unique. + * + * @return the name of the category. + */ + String name(); + + /** + * Returns a set of category aliases. + * + * Note the alias of a sample data category must not be the alias of another sample data category + * + * @return the aliases of the category. + */ + Set aliases(); +} diff --git a/src/main/java/act/apidoc/SampleData.java b/src/main/java/act/apidoc/SampleData.java index 4262d0877..f39e8c61a 100644 --- a/src/main/java/act/apidoc/SampleData.java +++ b/src/main/java/act/apidoc/SampleData.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -20,17 +20,30 @@ * #L% */ +import act.Act; +import act.app.App; +import act.inject.param.NoBind; +import act.inject.param.ParamValueLoaderService; +import act.util.Global; +import act.util.Stateless; +import org.osgl.$; +import org.osgl.OsglConfig; +import org.osgl.inject.BeanSpec; +import org.osgl.inject.Injector; +import org.osgl.util.*; + +import javax.inject.Named; import javax.inject.Provider; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; +import java.lang.reflect.*; +import java.util.*; /** * Namespace */ public abstract class SampleData { - private SampleData() {} + private SampleData() { + } /** * Mark on a field specify the {@link SampleDataProvider} that @@ -92,4 +105,354 @@ private SampleData() {} String value(); } + /** + * Generate sample data for class `type`. + *

                                                                                                                                                                              + * Note do not use this method to generate collection or map type. Instead use + * * {@link #generateList(Class, String)} for List type data + * * {@link #generateSet(Class, String)} for Set type data + * * {@link #generateMap(Class, Class, String)} for Map type data + * + * @param type the class of the sample data to be generated + * @param the generic type of the class + * @return the sample data been generated + */ + public static T generate(Class type) { + return generate(type, type.getSimpleName()); + } + + public static T generate(Type type) { + BeanSpec spec = BeanSpec.of(type, Act.injector()); + return generate(spec, (ISampleDataCategory) null); + } + + public static T generate(Type type, String name) { + return generate(BeanSpec.of(type, Act.injector()), SampleDataCategoryManager.get(name)); + } + + public static T generate(Type type, ISampleDataCategory category) { + return generate(BeanSpec.of(type, Act.injector()), category); + } + + /** + * Generate sample data for class `type`. + *

                                                                                                                                                                              + * Note do not use this method to generate collection or map type. Instead use + * * {@link #generateList(Class, String)} for List type data + * * {@link #generateSet(Class, String)} for Set type data + * * {@link #generateMap(Class, Class, String)} for Map type data + * + * @param type the class of the sample data to be generated + * @param name the name of the data, e.g. username, firstName ... + * @param the generic type of the class + * @return the sample data been generated + */ + public static T generate(Class type, String name) { + return generate(type, SampleDataCategoryManager.get(name)); + } + + /** + * Generate sample data for class `type`. + *

                                                                                                                                                                              + * Note do not use this method to generate collection or map type. Instead use + * * {@link #generateList(Class, String)} for List type data + * * {@link #generateSet(Class, String)} for Set type data + * * {@link #generateMap(Class, Class, String)} for Map type data + * + * @param type the class of the sample data to be generated + * @param category optional, the sample data category to be used + * @param the generic type of the class + * @return the sample data been generated + */ + public static T generate(Class type, ISampleDataCategory category) { + return (T) generate(BeanSpec.of(type, Act.injector()), category); + } + + public static T generate(BeanSpec spec, ISampleDataCategory category) { + Map typeParamLookup = C.Map(); + Class type = spec.rawType(); + if (type.getGenericSuperclass() instanceof ParameterizedType) { + typeParamLookup = Generics.buildTypeParamImplLookup(type); + } + return generate(spec, category, typeParamLookup, new HashSet(), new LinkedList()); + } + + private static T generate( + BeanSpec spec, + ISampleDataCategory category, + Map typeParamLookup, + Set typeChain, + Deque nameChain + ) { + try { + SampleDataProviderManager sampleDataProviderManager = Act.getInstance(SampleDataProviderManager.class); + Class type = spec.rawType(); + Class sampleDataType = type; + if (Keyword.class == type) { + sampleDataType = String.class; + } + Object result = sampleDataProviderManager.getSampleData(category, null, sampleDataType); + if (null != result) { + return $.convert(result).to(type); + } + if (spec.isSimpleType()) { + return (T) generateRandomSimpleTypedValue(spec); + } else if (spec.isArray()) { + BeanSpec elementSpec = spec.componentSpec(); + List list = generateList(elementSpec, category, typeParamLookup, typeChain, nameChain); + Object[] array = (Object[]) Array.newInstance(elementSpec.rawType(), list.size()); + return (T) list.toArray(array); + } else if (spec.isList()) { + BeanSpec elementSpec = spec.componentSpec(); + return (T) generateList(elementSpec, category, typeParamLookup, typeChain, nameChain); + } else if (spec.isSet()) { + BeanSpec elementSpec = spec.componentSpec(); + return (T) generateSet(elementSpec, category, typeParamLookup, typeChain, nameChain); + } else { + return (T) generateSamplePojo(spec, typeParamLookup, typeChain, nameChain); + } + } catch (Exception e) { + Act.LOGGER.warn(e, "Error generating sample data for " + spec); + return null; + } + } + + public static List generateList(Class elementType, String name) { + return generateList(elementType, SampleDataCategoryManager.get(name)); + } + + public static List generateList(BeanSpec elementSpec, String name) { + return generateList(elementSpec, SampleDataCategoryManager.get(name)); + } + + public static List generateList(Class elementType, ISampleDataCategory category) { + return generateList(BeanSpec.of(elementType, Act.injector()), category); + } + + public static List generateList(BeanSpec elementSpec, ISampleDataCategory category) { + Class elementType = elementSpec.rawType(); + Map typeParamLookup = C.Map(); + if (elementType.getGenericSuperclass() instanceof ParameterizedType) { + typeParamLookup = Generics.buildTypeParamImplLookup(elementType); + } + return generateList(elementSpec, category, typeParamLookup, new HashSet(), new LinkedList()); + } + + private static List generateList( + BeanSpec elementSpec, + ISampleDataCategory category, + Map typeParamLookup, + Set typeChain, + Deque nameChain + ) { + return generateCollection(elementSpec, new ArrayList(), category, typeParamLookup, typeChain, nameChain); + } + + public static Set generateSet(Class elementType, String name) { + return generateSet(elementType, SampleDataCategoryManager.get(name)); + } + + public static Set generateSet(BeanSpec elementSpec, String name) { + return generateSet(elementSpec, SampleDataCategoryManager.get(name)); + } + + public static Set generateSet(Class elementType, ISampleDataCategory category) { + return generateSet(BeanSpec.of(elementType, Act.injector()), category); + } + + public static Set generateSet(BeanSpec elementSpec, ISampleDataCategory category) { + Class elementType = elementSpec.rawType(); + Map typeParamLookup = C.Map(); + if (elementType.getGenericSuperclass() instanceof ParameterizedType) { + typeParamLookup = Generics.buildTypeParamImplLookup(elementType); + } + return generateSet(elementSpec, category, typeParamLookup, new HashSet(), new LinkedList()); + } + + private static Set generateSet( + BeanSpec elementSpec, + ISampleDataCategory category, + Map typeParamLookup, + Set typeChain, + Deque nameChain + ) { + return generateCollection(elementSpec, new HashSet(), category, typeParamLookup, typeChain, nameChain); + } + + public static Map generateMap(Class keyType, Class valType, String name) { + return generateMap(keyType, valType, SampleDataCategoryManager.get(name)); + } + + public static Map generateMap(Class keyType, Class valType, ISampleDataCategory category) { + Map map = new HashMap<>(); + int sz = N.randInt(4, 10); + for (int i = 0; i < sz; ++i) { + K key = generate(keyType, category); + V val = generate(valType, category); + map.put(key, val); + } + return map; + } + + private static Object generateRandomSimpleTypedValue(BeanSpec spec) { + Class classType = spec.rawType(); + if (classType.isEnum()) { + Class> ec = $.cast(classType); + return $.random(ec); + } else if (String.class == classType) { + return S.random(); + } else if (int.class == classType) { + return N.randInt(10000); + } else if (char.class == classType) { + return 48 + N.randInt(41); + } else if (short.class == classType) { + return N.randInt(256); + } else if (byte.class == classType) { + return N.randInt(128); + } else if (long.class == classType) { + return N.randLong(); + } else if (float.class == classType) { + return N.randFloat(); + } else if (double.class == classType) { + return N.randDouble(); + } else if (boolean.class == classType) { + return $.random(true, false); + } else if (java.util.Locale.class == classType) { + return (Act.appConfig().locale()); + } + return StringValueResolver.predefined().get(classType).resolve(null); + } + + private static Object generateSamplePojo(BeanSpec pojoSpec, Map typeParamLookup, Set typeChain, Deque nameChain) { + if (typeChain.contains(pojoSpec.type())) { + return null; + } + typeChain.add(pojoSpec.type()); + try { + Class beanClass = pojoSpec.rawType(); + Object bean; + try { + bean = Act.getInstance(beanClass); + } catch (Exception e) { + bean = new HashMap<>(); + } + for (Method m : beanClass.getMethods()) { + if (BeanSpec.isGetter(m)) { + Object retVal = generateSampleReturnData(m, typeParamLookup, typeChain, nameChain); + try { + $.setProperty(bean, retVal, m.getName().substring(3)); + } catch (Exception e) { + // there is setter but no getter + // ignore it + } + } + } + for (Field f : beanClass.getFields()) { + if (Modifier.isStatic(f.getModifiers())) { + continue; + } + Object fieldVal = generateSampleFieldData(f, typeParamLookup, typeChain, nameChain); + $.setProperty(bean, fieldVal, f.getName()); + } + return bean; + } finally { + typeChain.remove(pojoSpec.type()); + } + } + + private static Object generateSampleReturnData( + Method method, + Map typeParamLookup, + Set typeChain, + Deque nameChain + ) { + if (!BeanSpec.isGetter(method)) { + return null; + } + String lastName = nameChain.peekFirst(); + String name = method.getName(); + nameChain.push(name); + if ("name".equalsIgnoreCase(name)) { + name = lastName; + } + try { + ISampleDataCategory category = categoryOf(method, name); + return generate(BeanSpec.of(method.getGenericReturnType(), Act.injector(), typeParamLookup), category, typeParamLookup, typeChain, nameChain); + } finally { + nameChain.pop(); + } + } + + private static Object generateSampleFieldData( + Field field, + Map typeParamLookup, + Set typeChain, + Deque nameChain + ) { + String lastName = nameChain.peekFirst(); + String name = field.getName(); + nameChain.push(name); + if ("name".equalsIgnoreCase(name)) { + name = lastName; + } + try { + ISampleDataCategory category = categoryOf(field, name); + return generate(BeanSpec.of(field, Act.injector(), typeParamLookup), category, typeParamLookup, typeChain, nameChain); + } finally { + nameChain.pop(); + } + } + + private static > C generateCollection( + BeanSpec elementSpec, + C collection, + ISampleDataCategory category, + Map typeParamLookup, + Set typeChain, + Deque nameChain + ) { + int sz = N.randInt(2, 5); + if (!nameChain.isEmpty()) { + String lastName = nameChain.pop(); + nameChain.push(S.singularize(lastName)); + } + for (int i = 0; i < sz; ++i) { + collection.add((T) generate(elementSpec, category, typeParamLookup, typeChain, nameChain)); + } + return collection; + } + + private static boolean shouldWaive(Method getter, Class implementClass) { + int modifiers = getter.getModifiers(); + if (Modifier.isTransient(modifiers) || Modifier.isStatic(modifiers)) { + return true; + } + String fieldName = getter.getName().substring(3); + Class entityType = Generics.getReturnType(getter, implementClass); + return ParamValueLoaderService.noBind(entityType) + || getter.isAnnotationPresent(NoBind.class) + || getter.isAnnotationPresent(Stateless.class) + || getter.isAnnotationPresent(Global.class) + || ParamValueLoaderService.isInBlackList(fieldName) + || Object.class.equals(entityType) + || Class.class.equals(entityType) + || OsglConfig.globalMappingFilter_shouldIgnore(fieldName); + } + + private static ISampleDataCategory categoryOf(AnnotatedElement annotatedElement, String name) { + SampleData.Category anno = annotatedElement.getAnnotation(SampleData.Category.class); + if (null != anno) { + return anno.value(); + } + SampleDataCategoryManager categoryManager = Act.getInstance(SampleDataCategoryManager.class); + Named named = annotatedElement.getAnnotation(Named.class); + if (null != named) { + ISampleDataCategory category = categoryManager.getCategory(named.value()); + if (null != category) { + return category; + } + } + return categoryManager.getCategory(name); + } + } diff --git a/src/main/java/act/apidoc/SampleDataCategory.java b/src/main/java/act/apidoc/SampleDataCategory.java index d5b402e34..217ec3b6d 100644 --- a/src/main/java/act/apidoc/SampleDataCategory.java +++ b/src/main/java/act/apidoc/SampleDataCategory.java @@ -28,7 +28,7 @@ import java.util.Map; import java.util.Set; -public enum SampleDataCategory { +public enum SampleDataCategory implements ISampleDataCategory { FIRST_NAME("given name", "forename", "firstname", "fname"), LAST_NAME("surname", "family name", "lname", "lastname"), FULL_NAME("fullname"), @@ -60,6 +60,7 @@ public enum SampleDataCategory { this.aliases = C.setOf(aliases); } + @Override public Set aliases() { return aliases; } diff --git a/src/main/java/act/apidoc/SampleDataCategoryManager.java b/src/main/java/act/apidoc/SampleDataCategoryManager.java new file mode 100644 index 000000000..44e74aab9 --- /dev/null +++ b/src/main/java/act/apidoc/SampleDataCategoryManager.java @@ -0,0 +1,57 @@ +package act.apidoc; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import org.osgl.inject.annotation.MapKey; +import org.osgl.util.E; +import org.osgl.util.Keyword; +import org.osgl.util.S; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.Map; + +@Singleton +public class SampleDataCategoryManager { + + @Inject + @MapKey("name") + private Map registry; + + public void register(ISampleDataCategory category) { + String name = category.name(); + E.illegalArgumentIf(registry.containsKey(name), "Sample data category[%s] already registered", name); + registry.put(Keyword.of(name), category); + } + + public ISampleDataCategory getCategory(String name) { + return registry.get(Keyword.of(name)); + } + + public static ISampleDataCategory get(String name) { + if (S.blank(name)) { + return null; + } + return Act.getInstance(SampleDataCategoryManager.class).getCategory(name); + } + +} diff --git a/src/main/java/act/apidoc/SampleDataProvider.java b/src/main/java/act/apidoc/SampleDataProvider.java index bb9cbfc75..ec25ef058 100644 --- a/src/main/java/act/apidoc/SampleDataProvider.java +++ b/src/main/java/act/apidoc/SampleDataProvider.java @@ -45,6 +45,10 @@ public Class targetType() { return targetType; } + public ISampleDataCategory category() { + return null; + } + private void exploreType() { List types = Generics.typeParamImplementations(getClass(), SampleDataProvider.class); if (types.size() != 1) { diff --git a/src/main/java/act/apidoc/SampleDataProviderManager.java b/src/main/java/act/apidoc/SampleDataProviderManager.java index 5d3a1d387..a4bf41e23 100644 --- a/src/main/java/act/apidoc/SampleDataProviderManager.java +++ b/src/main/java/act/apidoc/SampleDataProviderManager.java @@ -33,16 +33,16 @@ public class SampleDataProviderManager extends AppServiceBase T getSampleData(SampleDataCategory category, String fieldName, Class type) { + public T getSampleData(ISampleDataCategory category, String fieldName, Class type) { return getSampleData(category, fieldName, type, true); } - public T getSampleData(SampleDataCategory category, String fieldName, Class type, boolean useBroaderKey) { + public T getSampleData(ISampleDataCategory category, String fieldName, Class type, boolean useBroaderKey) { return getSampleData(category, fieldName, null, type, useBroaderKey); } - public T getSampleData(SampleDataCategory category, String fieldName, Locale locale, Class type) { + public T getSampleData(ISampleDataCategory category, String fieldName, Locale locale, Class type) { return getSampleData(category, fieldName, locale, type, true); } - public T getSampleData(SampleDataCategory category, String fieldName, Locale locale, Class type, boolean useBroaderKey) { + public T getSampleData(ISampleDataCategory category, String fieldName, Locale locale, Class type, boolean useBroaderKey) { Key key = new Key(type, categoryOf(category, fieldName), locale); return getSampleData(key, useBroaderKey); } @@ -179,7 +179,7 @@ private SampleDataProvider getProviderFromBroderKeyRepo(Key key) { return provider; } - static SampleDataCategory categoryOf(SampleDataCategory category, String name) { + static ISampleDataCategory categoryOf(ISampleDataCategory category, String name) { return null != category ? category : SampleDataCategory.of(name); } } diff --git a/src/main/java/act/test/func/SampleDataProviderAdaptor.java b/src/main/java/act/test/func/SampleDataProviderAdaptor.java index 21b562af4..5424b7b64 100644 --- a/src/main/java/act/test/func/SampleDataProviderAdaptor.java +++ b/src/main/java/act/test/func/SampleDataProviderAdaptor.java @@ -21,6 +21,7 @@ */ import act.Act; +import act.apidoc.ISampleDataCategory; import act.apidoc.SampleData; import act.apidoc.SampleDataCategory; import act.apidoc.SampleDataProvider; @@ -42,7 +43,7 @@ public abstract class SampleDataProviderAdaptor extends Func implements Cloneabl private SampleDataProviderAdaptor() {} - private SampleDataProviderAdaptor(SampleDataProvider provider, SampleDataCategory category) { + private SampleDataProviderAdaptor(SampleDataProvider provider, ISampleDataCategory category) { this.provider = provider; this.name = "rand-" + category.name(); this.aliases = new ArrayList<>(); @@ -69,11 +70,14 @@ protected List aliases() { @SubClassFinder public static void found(SampleDataProvider provider) { - SampleData.Category anno = provider.getClass().getAnnotation(SampleData.Category.class); - if (null == anno) { - return; + ISampleDataCategory category = provider.category(); + if (null == category) { + SampleData.Category anno = provider.getClass().getAnnotation(SampleData.Category.class); + if (null == anno) { + return; + } + category = anno.value(); } - SampleDataCategory category = anno.value(); if (category == SampleDataCategory.DOB) { Class targetType = provider.targetType(); // just need to support one Date type diff --git a/src/main/java/act/test/verifier/In.java b/src/main/java/act/test/verifier/In.java new file mode 100644 index 000000000..6cbfd46be --- /dev/null +++ b/src/main/java/act/test/verifier/In.java @@ -0,0 +1,47 @@ +package act.test.verifier; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.E; +import org.osgl.util.S; + +import java.util.List; + +public class In extends Verifier { + + private List list; + + @Override + public void init(Object param) { + E.npeIf(null == param); + String s = param.toString(); + list = S.split(s, S.COMMON_SEP); + } + + @Override + public boolean verify(Object value) { + if (null == value) { + return false; + } + String s = value.toString(); + return list.contains(s); + } +} diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index fe5de65f8..27defa70f 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -57,6 +57,7 @@ org.actframework act-aaa + 1.7.2-SNAPSHOT diff --git a/testapps/GHIssues/src/main/java/ghissues/BaseController.java b/testapps/GHIssues/src/main/java/ghissues/BaseController.java index d90446974..8c46c9e92 100644 --- a/testapps/GHIssues/src/main/java/ghissues/BaseController.java +++ b/testapps/GHIssues/src/main/java/ghissues/BaseController.java @@ -2,7 +2,6 @@ import act.handler.NoReturnValueAdvice; import act.util.LogSupport; -import org.osgl.aaa.NoAuthenticate; import org.osgl.aaa.NoAuthentication; @NoReturnValueAdvice diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1262.java b/testapps/GHIssues/src/main/java/ghissues/Gh1262.java new file mode 100644 index 000000000..fb764938d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1262.java @@ -0,0 +1,49 @@ +package ghissues; + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.controller.annotation.UrlContext; +import act.util.Stateless; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Singleton; +import java.util.List; + +@UrlContext("1262") +@Stateless +public class Gh1262 extends BaseController { + + public static class Address { + public String street; + public String postcode; + } + + public static class Permission { + public String name; + } + + public static class Privilege { + public int level; + } + + public static class Role { + public String name; + public List permissions; + public Privilege privilege; + } + + public static class User { + @SampleData.Category(SampleDataCategory.USERNAME) + public String name; + public Address address; + public List roles; + } + + private User user = SampleData.generate(User.class, "user"); + + @GetAction + public User get() { + return user; + } + +} diff --git a/testapps/GHIssues/src/test/resources/scenarios/1262.yml b/testapps/GHIssues/src/test/resources/scenarios/1262.yml new file mode 100644 index 000000000..53ea47759 --- /dev/null +++ b/testapps/GHIssues/src/test/resources/scenarios/1262.yml @@ -0,0 +1,21 @@ +Scenario(1262): + description: "Support JSON path #1262" + interactions: + - description: test 1 + request: + get: 1262?_jsonPath=$.roles.name + response: + json: + size: + - gt: 0 + ?: + - in: guest,account_manager,user,user-manager,order-manager + - description: test 2 + request: + get: 1262?_jsonPath=$.roles.privilege.level + response: + json: + size: + - gt: 0 + ?: + - gt: 0 From d88c3a7687eb8cb4f18c1d2285aad526dd95dabd Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 1 Jan 2020 21:52:45 +1100 Subject: [PATCH 577/730] Param binding - allow specify `now` in `DefaultValue` for Date types #1247 --- src/main/java/act/app/App.java | 1 + src/main/java/act/data/DateResolverBase.java | 17 +++++++++- .../java/act/data/JodaDateTimeCodecBase.java | 16 +++++---- src/main/java/act/test/TestSession.java | 2 +- src/main/java/act/test/util/NamedLogic.java | 4 +-- src/main/java/act/util/$$.java | 33 ++++++++++--------- .../src/main/java/ghissues/Gh1247.java | 30 +++++++++++++++++ .../src/test/resources/scenarios/1247.yml | 27 +++++++++++++++ 8 files changed, 104 insertions(+), 26 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1247.java create mode 100644 testapps/GHIssues/src/test/resources/scenarios/1247.yml diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index d6f05727e..89fca27cc 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -831,6 +831,7 @@ public void run() { } emit(PRE_START); emit(STATELESS_PROVISIONED); + $$.init(); emit(START); if (isProd() || !wasStarted()) { debug("App[%s] loaded in %sms", name(), $.ms() - ms); diff --git a/src/main/java/act/data/DateResolverBase.java b/src/main/java/act/data/DateResolverBase.java index 01b78ba1e..1776c2c37 100644 --- a/src/main/java/act/data/DateResolverBase.java +++ b/src/main/java/act/data/DateResolverBase.java @@ -22,8 +22,10 @@ import act.conf.AppConfig; import act.util.ActContext; +import org.osgl.$; import org.osgl.logging.L; import org.osgl.logging.Logger; +import org.osgl.mvc.result.BadRequest; import org.osgl.util.S; import org.osgl.util.StringValueResolver; @@ -68,9 +70,22 @@ public final T resolve(String value) { if (S.blank(value)) { return null; } + if ("now".equalsIgnoreCase(value) + || "today".equalsIgnoreCase(value) + || "现在".equalsIgnoreCase(value) + || "今天".equalsIgnoreCase(value) + ) { + return cast(new Date()); + } + // for #691 Date date = parse(value); + if (null == date && S.isIntOrLong(value)) { + long epoc = Long.parseLong(value); + date = $.convert(epoc).to(Date.class); + return cast(date); + } if (null == date) { - return null; + throw new BadRequest("Invalid date time format: " + value); } return cast(date); } diff --git a/src/main/java/act/data/JodaDateTimeCodecBase.java b/src/main/java/act/data/JodaDateTimeCodecBase.java index 40310f8f2..ac7ac9a65 100644 --- a/src/main/java/act/data/JodaDateTimeCodecBase.java +++ b/src/main/java/act/data/JodaDateTimeCodecBase.java @@ -29,6 +29,7 @@ import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.osgl.$; +import org.osgl.mvc.result.BadRequest; import org.osgl.util.*; import java.lang.annotation.Annotation; @@ -119,14 +120,15 @@ public final T resolve(String value) { return now(); } // for #691 - int len = value.length(); - if (9 == len || 10 == len) { - if (S.isIntOrLong(value)) { - long epoc = Long.parseLong(value); - return (T) $.convert(epoc).to(dateTimeType); - } + T retVal = parse(formatter(), value); + if (null == retVal && S.isIntOrLong(value)) { + long epoc = Long.parseLong(value); + return (T) $.convert(epoc).to(dateTimeType); + } + if (null == retVal) { + throw new BadRequest("Invalid date time format: " + value); } - return parse(formatter(), value); + return retVal; } public final String toJSONString(T o) { diff --git a/src/main/java/act/test/TestSession.java b/src/main/java/act/test/TestSession.java index f978c70aa..9863eaf9c 100644 --- a/src/main/java/act/test/TestSession.java +++ b/src/main/java/act/test/TestSession.java @@ -798,7 +798,7 @@ private Verifier tryLoadVerifier(String name) { if (name.startsWith("!") || name.startsWith("-")) { revert = true; name = name.substring(1).trim(); - } else if (name.startsWith("not:")) { + } else if (name.startsWith("not:") || name.startsWith("not ")) { revert = true; name = name.substring(4).trim(); } diff --git a/src/main/java/act/test/util/NamedLogic.java b/src/main/java/act/test/util/NamedLogic.java index e77e8dfeb..169a204af 100644 --- a/src/main/java/act/test/util/NamedLogic.java +++ b/src/main/java/act/test/util/NamedLogic.java @@ -135,7 +135,7 @@ public T convert(LinkedHashMap o) { if (key.startsWith("!") || key.startsWith("-")) { revert = true; key = key.substring(1).trim(); - } else if (key.startsWith("not:")) { + } else if (key.startsWith("not:") || key.startsWith("not ")) { revert = true; key = key.substring(4).trim(); } @@ -167,7 +167,7 @@ public T convert(String o) { if (key.startsWith("!") || key.startsWith("-")) { revert = true; key = key.substring(1).trim(); - } else if (key.startsWith("not:")) { + } else if (key.startsWith("not:") || key.startsWith("not ")) { revert = true; key = key.substring(4).trim(); } diff --git a/src/main/java/act/util/$$.java b/src/main/java/act/util/$$.java index 52110d8b7..fa1f2d9d4 100644 --- a/src/main/java/act/util/$$.java +++ b/src/main/java/act/util/$$.java @@ -22,6 +22,7 @@ import act.Act; import act.data.*; +import act.job.OnAppStart; import com.alibaba.fastjson.JSON; import org.joda.time.*; import org.osgl.$; @@ -38,26 +39,12 @@ public class $$ { private static Set dateTimeTypes = $.cast(C.set(Date.class, java.sql.Date.class, DateTime.class, LocalDate.class, LocalTime.class, LocalDateTime.class, Time.class)); - private static Map codecs = $.cast(C.Map( - DateTime.class, Act.getInstance(JodaDateTimeCodec.class), - LocalDateTime.class, Act.getInstance(JodaLocalDateTimeCodec.class), - LocalDate.class, Act.getInstance(JodaLocalDateCodec.class), - LocalTime.class, Act.getInstance(JodaLocalTimeCodec.class) - )); + private static Map codecs; public static boolean isDateTimeType(Class type) { return dateTimeTypes.contains(type); } - static { - StringUtils.evaluator = new $.Transformer() { - @Override - public String transform(String s) { - return S.string(Act.appConfig().getIgnoreCase(s)); - } - }; - } - public static String toString(Object v, boolean directToString) { if (directToString) { ValueObject.Codec codec = codecs.get(v.getClass()); @@ -86,4 +73,20 @@ public static String processStringSubstitution(String s, $.Func1 return StringUtils.processStringSubstitution(s, evaluator); } + @OnAppStart + public static void init() { + StringUtils.evaluator = new $.Transformer() { + @Override + public String transform(String s) { + return S.string(Act.appConfig().getIgnoreCase(s)); + } + }; + codecs = $.cast(C.Map( + DateTime.class, Act.getInstance(JodaDateTimeCodec.class), + LocalDateTime.class, Act.getInstance(JodaLocalDateTimeCodec.class), + LocalDate.class, Act.getInstance(JodaLocalDateCodec.class), + LocalTime.class, Act.getInstance(JodaLocalTimeCodec.class) + )); + } + } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1247.java b/testapps/GHIssues/src/main/java/ghissues/Gh1247.java new file mode 100644 index 000000000..240dc4600 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1247.java @@ -0,0 +1,30 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.inject.DefaultValue; +import org.joda.time.DateTime; +import org.joda.time.LocalDate; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Date; + +@UrlContext("1247") +public class Gh1247 extends BaseController { + + @GetAction("joda-localdate") + public LocalDate testLocalDate(@DefaultValue("now") LocalDate date) { + return date; + } + + @GetAction("joda-datetime") + public DateTime testDateTime(@DefaultValue("now") DateTime dateTime) { + return dateTime; + } + + @GetAction("jdk-date") + public Date testDate(@DefaultValue("now") Date date) { + return date; + } + +} diff --git a/testapps/GHIssues/src/test/resources/scenarios/1247.yml b/testapps/GHIssues/src/test/resources/scenarios/1247.yml new file mode 100644 index 000000000..af107c74e --- /dev/null +++ b/testapps/GHIssues/src/test/resources/scenarios/1247.yml @@ -0,0 +1,27 @@ +Scenario(1247): + description: "Param binding - allow specify `now` in `DefaultValue` for Date types" + urlContext: 1247 + constants: + yesterday: ${yesterday()} + interactions: + - description: test bind to Joda date time + request: + get: joda-datetime + response: + result: + - after: ${yesterday} + - not after: ${now} + - description: test bind to Joda local date + request: + get: joda-localdate + response: + result: + - after: ${yesterday} + - not after: ${now} + - description: test bind to JDK date + request: + get: jdk-date + response: + result: + - after: ${yesterday} + - not after: ${now} From 933742e8c103ae742175a3346770d9965b2a249d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 1 Jan 2020 22:14:12 +1100 Subject: [PATCH 578/730] `LoadResource` - error injecting into `C.Map` typed field #1253 --- .../java/act/inject/util/ResourceLoader.java | 2 +- .../src/main/java/ghissues/Gh1253.java | 19 +++++++++++++++++++ .../GHIssues/src/main/resources/1253.mapping | 1 + .../src/test/resources/scenarios/1253.yml | 7 +++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1253.java create mode 100644 testapps/GHIssues/src/main/resources/1253.mapping create mode 100644 testapps/GHIssues/src/test/resources/scenarios/1253.yml diff --git a/src/main/java/act/inject/util/ResourceLoader.java b/src/main/java/act/inject/util/ResourceLoader.java index 45a55bd03..7240bbf2a 100644 --- a/src/main/java/act/inject/util/ResourceLoader.java +++ b/src/main/java/act/inject/util/ResourceLoader.java @@ -442,7 +442,7 @@ private static Object _load(URL url, BeanSpec spec, Object hint) { } else { throw new UnexpectedException("Unable to load resource into Map: " + resourcePath); } - Map map = new HashMap<>(); + Map map = (Map)Act.getInstance(spec.rawType()); List mapTypeParams = spec.typeParams(); Class keyType = String.class; Class valType = String.class; diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1253.java b/testapps/GHIssues/src/main/java/ghissues/Gh1253.java new file mode 100644 index 000000000..b465543b3 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1253.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +@UrlContext("1253") +public class Gh1253 extends BaseController { + + @LoadResource("1253.mapping") + private C.Map mapping; + + @GetAction + public C.Map get() { + return mapping; + } + +} diff --git a/testapps/GHIssues/src/main/resources/1253.mapping b/testapps/GHIssues/src/main/resources/1253.mapping new file mode 100644 index 000000000..c9f0304f6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/1253.mapping @@ -0,0 +1 @@ +foo=bar \ No newline at end of file diff --git a/testapps/GHIssues/src/test/resources/scenarios/1253.yml b/testapps/GHIssues/src/test/resources/scenarios/1253.yml new file mode 100644 index 000000000..919ce34bf --- /dev/null +++ b/testapps/GHIssues/src/test/resources/scenarios/1253.yml @@ -0,0 +1,7 @@ +Scenario(1253): + description: "`LoadResource` - error injecting into `C.Map` typed field" + interactions: + - request: + get: 1253 + response: + foo: bar \ No newline at end of file From 89bbecce2d9581a6b45dbac8f6ec9e9da649ce1d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 1 Jan 2020 22:20:27 +1100 Subject: [PATCH 579/730] Act should log error stack upon `IllegalArgumentException` explicitly and respond 500 status #1254 --- CHANGELOG.md | 1 + .../GHIssues/src/main/java/ghissues/Gh1254.java | 16 ++++++++++++++++ .../src/test/resources/scenarios/1254.yml | 7 +++++++ 3 files changed, 24 insertions(+) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1254.java create mode 100644 testapps/GHIssues/src/test/resources/scenarios/1254.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index e70b31430..410d87f66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * XML Data bind to JSONObject issue #1258 * API Doc - sample query data issue with array type #1257 * JSON Error message should escape `"` #1256 +* Act should log error stack upon `IllegalArgumentException` explicitly and respond 500 status #1254 * `LoadResource` - error injecting into `C.Map` typed field #1253 * Param binding - allow specify `now` in `DefaultValue` for Date types #1247 diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1254.java b/testapps/GHIssues/src/main/java/ghissues/Gh1254.java new file mode 100644 index 000000000..d513c4dab --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1254.java @@ -0,0 +1,16 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +@UrlContext("1254") +public class Gh1254 extends BaseController { + + @GetAction + public String get() { + throw new IllegalArgumentException(); + } + +} diff --git a/testapps/GHIssues/src/test/resources/scenarios/1254.yml b/testapps/GHIssues/src/test/resources/scenarios/1254.yml new file mode 100644 index 000000000..15a989249 --- /dev/null +++ b/testapps/GHIssues/src/test/resources/scenarios/1254.yml @@ -0,0 +1,7 @@ +Scenario(1254): + description: "Act should throw IllegalArgumentException explicitly although feed `400 bad request` back" + interactions: + - request: + get: 1254 + response: + status: 500 \ No newline at end of file From 073fbcc18ab595c5739276eb70a6cdc7f2eaf611 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 2 Jan 2020 07:58:10 +1100 Subject: [PATCH 580/730] add testapp for GH1255; Improve IllegalArgumentException handling in request handling logic --- src/main/java/act/apidoc/SampleData.java | 10 + .../controller/RequestHandlerProxy.java | 15 +- .../act/xio/WebSocketConnectionHandler.java | 1 + testapps/GH1255/.gitignore | 19 + testapps/GH1255/pom.xml | 33 + testapps/GH1255/run_dev | 3 + testapps/GH1255/run_dev.bat | 2 + testapps/GH1255/run_e2e | 3 + testapps/GH1255/run_e2e.bat | 2 + testapps/GH1255/run_prod | 10 + .../GH1255/src/main/java/test/AppEntry.java | 23 + .../src/main/resources/conf/app.properties | 801 ++++++++++++++++++ .../main/resources/conf/prod/app.properties | 5 + .../main/resources/conf/uat/app.properties | 5 + .../GH1255/src/main/resources/logback.xml | 115 +++ .../src/main/resources/messages.properties | 1 + .../src/test/resources/scenarios/test.yml | 11 + .../src/main/java/ghissues/Gh1257.java | 11 + .../src/main/java/ghissues/Gh1261.java | 15 + 19 files changed, 1081 insertions(+), 4 deletions(-) create mode 100644 testapps/GH1255/.gitignore create mode 100644 testapps/GH1255/pom.xml create mode 100755 testapps/GH1255/run_dev create mode 100755 testapps/GH1255/run_dev.bat create mode 100755 testapps/GH1255/run_e2e create mode 100755 testapps/GH1255/run_e2e.bat create mode 100755 testapps/GH1255/run_prod create mode 100644 testapps/GH1255/src/main/java/test/AppEntry.java create mode 100644 testapps/GH1255/src/main/resources/conf/app.properties create mode 100644 testapps/GH1255/src/main/resources/conf/prod/app.properties create mode 100644 testapps/GH1255/src/main/resources/conf/uat/app.properties create mode 100644 testapps/GH1255/src/main/resources/logback.xml create mode 100644 testapps/GH1255/src/main/resources/messages.properties create mode 100644 testapps/GH1255/src/test/resources/scenarios/test.yml create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1257.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1261.java diff --git a/src/main/java/act/apidoc/SampleData.java b/src/main/java/act/apidoc/SampleData.java index f39e8c61a..bfa67a12e 100644 --- a/src/main/java/act/apidoc/SampleData.java +++ b/src/main/java/act/apidoc/SampleData.java @@ -217,6 +217,11 @@ private static T generate( } } + public static List generateList(Class elementType) { + ISampleDataCategory category = null; + return generateList(elementType, category); + } + public static List generateList(Class elementType, String name) { return generateList(elementType, SampleDataCategoryManager.get(name)); } @@ -248,6 +253,11 @@ private static List generateList( return generateCollection(elementSpec, new ArrayList(), category, typeParamLookup, typeChain, nameChain); } + public static Set generateSet(Class elementType) { + ISampleDataCategory category = null; + return generateSet(elementType, category); + } + public static Set generateSet(Class elementType, String name) { return generateSet(elementType, SampleDataCategoryManager.get(name)); } diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index fd8e42a8c..30854828a 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -35,6 +35,7 @@ import act.security.CORS; import act.security.CSRF; import act.util.*; +import act.view.ActBadRequest; import act.view.ActErrorResult; import act.view.RenderAny; import act.xio.WebSocketConnectionHandler; @@ -241,10 +242,16 @@ public void handle(ActionContext context) { logger.error(e, "Error committing result"); } else { if (null == result) { - H.Request req = context.req(); - result = ActErrorResult.of(e); - if (result.status().isServerError()) { - logger.error(e, "Server error encountered on handling request: " + req); + if (e instanceof IllegalArgumentException) { + String errorMsg = e.getLocalizedMessage(); + logger.warn(e, errorMsg); + result = ActBadRequest.create(e, errorMsg); + } else { + H.Request req = context.req(); + result = ActErrorResult.of(e); + if (result.status().isServerError()) { + logger.error(e, "Server error encountered on handling request: " + req); + } } } try { diff --git a/src/main/java/act/xio/WebSocketConnectionHandler.java b/src/main/java/act/xio/WebSocketConnectionHandler.java index 305d56af0..b1a694c30 100644 --- a/src/main/java/act/xio/WebSocketConnectionHandler.java +++ b/src/main/java/act/xio/WebSocketConnectionHandler.java @@ -29,6 +29,7 @@ import act.handler.RequestHandlerBase; import act.inject.param.*; import act.sys.Env; +import act.view.ActBadRequest; import act.ws.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONException; diff --git a/testapps/GH1255/.gitignore b/testapps/GH1255/.gitignore new file mode 100644 index 000000000..3b8194b3f --- /dev/null +++ b/testapps/GH1255/.gitignore @@ -0,0 +1,19 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany diff --git a/testapps/GH1255/pom.xml b/testapps/GH1255/pom.xml new file mode 100644 index 000000000..af6954932 --- /dev/null +++ b/testapps/GH1255/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + gh1255-test + 1.8.31 + + ActFramework Test App for Github Issue 1255 + + + org.actframework + act-starter-parent + 1.8.30.1 + + + + + 1.8 + test.AppEntry + + + + + + org.actframework + act + 1.8.31-SNAPSHOT + + + + diff --git a/testapps/GH1255/run_dev b/testapps/GH1255/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH1255/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH1255/run_dev.bat b/testapps/GH1255/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH1255/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH1255/run_e2e b/testapps/GH1255/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH1255/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH1255/run_e2e.bat b/testapps/GH1255/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH1255/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH1255/run_prod b/testapps/GH1255/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH1255/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH1255/src/main/java/test/AppEntry.java b/testapps/GH1255/src/main/java/test/AppEntry.java new file mode 100644 index 000000000..3e6c9bda9 --- /dev/null +++ b/testapps/GH1255/src/main/java/test/AppEntry.java @@ -0,0 +1,23 @@ +package test; + +import act.Act; +import act.controller.Controller; +import act.util.JsonView; +import org.joda.time.LocalDate; +import org.osgl.mvc.annotation.GetAction; + +@SuppressWarnings("unused") +@JsonView +public class AppEntry extends Controller.Util { + + @GetAction + public LocalDate test(LocalDate date) { + return date; + } + + + public static void main(String[] args) throws Exception { + Act.start(); + } + +} diff --git a/testapps/GH1255/src/main/resources/conf/app.properties b/testapps/GH1255/src/main/resources/conf/app.properties new file mode 100644 index 000000000..1e146d868 --- /dev/null +++ b/testapps/GH1255/src/main/resources/conf/app.properties @@ -0,0 +1,801 @@ +i18n=true +############################################## +# Application configuration +# act-1.8.8-RC12-SNAPSHOT +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +fmt.date=dd:MM:yyyy + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy\u5E74MM\u6708dd\u65E5 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy\u5E74MM\u6708dd\u65E5 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=xcgXKMICkvZ3k3uLj2AIiarXjLt2Lr6nHzvkBs9o1a9eKyspfvSd1eKYYSYNAhu8 + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH1255/src/main/resources/conf/prod/app.properties b/testapps/GH1255/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..5f0017b9a --- /dev/null +++ b/testapps/GH1255/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC12-SNAPSHOT +############################################## +act.secret=clypiSZ9qOFMZ8JgAdutcvPctiPYRhC4HFkjcvwhf9j3YQrAUxAx9cUL0FzmnlRB \ No newline at end of file diff --git a/testapps/GH1255/src/main/resources/conf/uat/app.properties b/testapps/GH1255/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..844739167 --- /dev/null +++ b/testapps/GH1255/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC12-SNAPSHOT +############################################## +act.secret=AkrRnS5yuyq98LmEBRwoQom9nCIj8oLlXEKRUjXiBlbjPc0phCf7VL3yJOJqjjbC \ No newline at end of file diff --git a/testapps/GH1255/src/main/resources/logback.xml b/testapps/GH1255/src/main/resources/logback.xml new file mode 100644 index 000000000..83909e662 --- /dev/null +++ b/testapps/GH1255/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH1255/src/main/resources/messages.properties b/testapps/GH1255/src/main/resources/messages.properties new file mode 100644 index 000000000..853b8995a --- /dev/null +++ b/testapps/GH1255/src/main/resources/messages.properties @@ -0,0 +1 @@ +osgl.result.unauthorized=Please login \ No newline at end of file diff --git a/testapps/GH1255/src/test/resources/scenarios/test.yml b/testapps/GH1255/src/test/resources/scenarios/test.yml new file mode 100644 index 000000000..5e3ef819d --- /dev/null +++ b/testapps/GH1255/src/test/resources/scenarios/test.yml @@ -0,0 +1,11 @@ +Scenario(1255): + description: "I18n - date format setting not effective" + interactions: + - description: test + request: + headers: + Accept-Language: en + get: ?date=12:12:2019 + response: + result: + - before: ${today} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1257.java b/testapps/GHIssues/src/main/java/ghissues/Gh1257.java new file mode 100644 index 000000000..bc5d241d1 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1257.java @@ -0,0 +1,11 @@ +package ghissues; + +import org.osgl.mvc.annotation.GetAction; + +public class Gh1257 extends BaseController { + + @GetAction("1257") + public void test(int[] data) { + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1261.java b/testapps/GHIssues/src/main/java/ghissues/Gh1261.java new file mode 100644 index 000000000..2f629006c --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1261.java @@ -0,0 +1,15 @@ +package ghissues; + +import act.apidoc.SampleData; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; + +public class Gh1261 extends BaseController { + + @GetAction("1261") + public List test() { + return SampleData.generateList(String.class); + } + +} From 7de25f5aa36bd74d29ed66c9d53b1099a72de40d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 2 Jan 2020 08:07:27 +1100 Subject: [PATCH 581/730] update legacy test app act version --- legacy-testapp/pom.xml | 2 +- testapps/GHIssues/src/test/resources/scenarios/1254.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 34b7a3645..d31231a71 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,7 +73,7 @@ UTF-8 UTF-8 - 1.8.30-SNAPSHOT + 1.8.31-SNAPSHOT [0.13.0, 2.0.0) 1.8.1-SNAPSHOT testapp.TestApp diff --git a/testapps/GHIssues/src/test/resources/scenarios/1254.yml b/testapps/GHIssues/src/test/resources/scenarios/1254.yml index 15a989249..64f56eb07 100644 --- a/testapps/GHIssues/src/test/resources/scenarios/1254.yml +++ b/testapps/GHIssues/src/test/resources/scenarios/1254.yml @@ -4,4 +4,4 @@ Scenario(1254): - request: get: 1254 response: - status: 500 \ No newline at end of file + status: 400 \ No newline at end of file From 91054926f34bfb77590ddf425e07dd2f2b40afc2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 2 Jan 2020 18:37:19 +1100 Subject: [PATCH 582/730] downgrade ecj version to 3.12.3 to support Java 7 --- pom.xml | 2 +- testapps/GHIssues/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9b08814fe..ff4e74fb4 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 5.0.5 1.2 1.3.3 - 3.20.0 + 3.12.3 1.2.62 1.1.2 0.7 diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 27defa70f..b88f47a5b 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.30.1 + 1.8.31.0-SNAPSHOT From fa2871e072c0c3ef4685ff1e30bf0a99d8415117 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 2 Jan 2020 21:51:24 +1100 Subject: [PATCH 583/730] update osgl libraries to release version; update CHANGELOG --- CHANGELOG.md | 2 +- pom.xml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 410d87f66..0b1ee644b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -**1.8.31** +**1.8.31** 02/Jan/2020 * Act-Test - Add `In` verifier #1271 * Create an API to allow developer generate random data #1270 * Enable turn off QRCode/BarCode rendering based on Accept header #1269 diff --git a/pom.xml b/pom.xml index ff4e74fb4..0ad6bc781 100644 --- a/pom.xml +++ b/pom.xml @@ -66,11 +66,11 @@ 3.12.1 - 1.23.0-SNAPSHOT + 1.23.0 1.8.0 - 1.13.0-SNAPSHOT - 1.13.0-SNAPSHOT - 1.11.0 + 1.13.0 + 1.13.0 + 1.13.0 1.10.0 1.5.0 0.0.1 From 77c3288f0d242c14f4062eaf47896cf607915487 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 2 Jan 2020 21:52:38 +1100 Subject: [PATCH 584/730] [maven-release-plugin] prepare release act-1.8.31 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0ad6bc781..eeb7ffe7f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.31-SNAPSHOT + 1.8.31 ACT Framework The ACT full stack MVC framework From 0dfb3effd0132d93dd5c707e7a8af6a334dc705e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 2 Jan 2020 21:52:52 +1100 Subject: [PATCH 585/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eeb7ffe7f..bd17e246f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.31 + 1.8.32-SNAPSHOT ACT Framework The ACT full stack MVC framework From cf882b88720978a72ca4cae5b21da5fb3fbd427c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 2 Jan 2020 23:03:26 +1100 Subject: [PATCH 586/730] update VERSION_MATRIX, README etc --- ARCHETYPES.md | 16 ++++++++-------- NEWS.md | 8 ++++++++ README.md | 6 +++--- VERSION_MATRIX.md | 42 +++++++++++++++++++++--------------------- 4 files changed, 40 insertions(+), 32 deletions(-) diff --git a/ARCHETYPES.md b/ARCHETYPES.md index 4901aee35..4f34bc404 100644 --- a/ARCHETYPES.md +++ b/ARCHETYPES.md @@ -12,13 +12,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.30.1 + -DarchetypeVersion=1.8.31.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.30.1 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.31.0 ``` ## Hello Service @@ -33,13 +33,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.30.1 + -DarchetypeVersion=1.8.31.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.30.1 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.31.0 ``` ## Bookmark @@ -56,13 +56,13 @@ mvn archetype:generate -B \ -DartifactId=bookmark \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-bookmark \ - -DarchetypeVersion=1.8.30.1 + -DarchetypeVersion=1.8.31.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-bookmark -DarchetypeVersion=1.8.30.1 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-bookmark -DarchetypeVersion=1.8.31.0 ``` ## Chatroom @@ -77,13 +77,13 @@ mvn archetype:generate -B \ -DartifactId=chatroom \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-chatroom \ - -DarchetypeVersion=1.8.30.1 + -DarchetypeVersion=1.8.31.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-chatroom -DarchetypeVersion=1.8.30.1 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-chatroom -DarchetypeVersion=1.8.31.0 ``` diff --git a/NEWS.md b/NEWS.md index 4b061b40f..295f0dbf8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,12 @@

                                                                                                                                                                                +
                                                                                                                                                                              • + 02 Jan 2020 + + + act-1.8.31 released + + +
                                                                                                                                                                              • 24 Nov 2019 diff --git a/README.md b/README.md index 0682dc421..8fe5a93fe 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.30.1 + 1.8.31.0 ``` @@ -27,13 +27,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.30.1 + -DarchetypeVersion=1.8.31.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.30.1 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.31.0 ``` **Note** There are more ActFramework application archetypes for use. Please get them [here](ARCHETYPES.md). diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index dbade9044..38e56022c 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,26 +1,26 @@ # Version Matrix -| act | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | 1.8.30a | -| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | -----: | -| aaa | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | -| beetl | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | -| beetlsql | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | 1.8.0 | -| ebean-java7 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | 1.8.0 | -| ebean(java8) | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | 1.8.0 | -| eclipselink(java8) | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | -| excel-java7 | | | | | | | | | 1.8.0 | 1.8.0 | -| excel | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | -| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | -| hibernate | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | -| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | 1.1.0 | -| jpa-common | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | -| morphia | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | 1.8.1 | -| mustache(java8) | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | -| social | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | 0.13.0 | -| sql-common | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.1 | 1.6.0 | 1.6.0 | -| storage(java8) | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | 0.15.0 | 0.15.0 | -| thymeleaf | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.4.0 | 1.4.0 | -| velocity | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | +| act | 1.8.20 | 1.8.22 | 1.8.23 | 1.8.24 | 1.8.25 | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | 1.8.30a | 1.8.31 | +| --- | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | -----: | -----: | +| aaa | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.5.5 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.3 | +| beetl | 1.4.8 | 1.5.1 | 1.5.2 | 1.5.3 | 1.5.4 | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.1 | +| beetlsql | 1.5.8 | 1.5.9 | 1.5.10 | 1.5.11 | 1.6.0 | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | 1.8.0 | 1.8.1 | +| ebean-java7 | 1.7.6 | 1.7.6 | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | 1.8.0 | 1.8.0 | +| ebean(java8) | 1.7.7 | 1.7.7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | 1.8.0 | 1.8.0 | +| eclipselink(java8) | 1.5.8 | 1.5.8 | 1.5.9 | 1.5.9 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | +| excel-java7 | | | | | | | | | 1.8.0 | 1.8.0 | 1.8.1 | +| excel | 1.6.0 | 1.6.1 | 1.6.2 | 1.6.2 | 1.6.2 | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | 1.8.1 | +| freemarker | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | +| hibernate | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | +| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | 1.1.0 | 1.1.0 | +| jpa-common | 1.5.7 | 1.5.7 | 1.5.8 | 1.5.8 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | +| morphia | 1.6.7 | 1.6.7 | 1.7.1 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | 1.8.1 | 1.8.2 | +| mustache(java8) | 1.4.5 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | +| social | 0.12.5 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | 0.13.0 | 0.13.0 | +| sql-common | 1.4.5 | 1.4.5 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.1 | 1.6.0 | 1.6.0 | 1.6.0 | +| storage(java8) | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.13.6 | 0.14.0 | 0.14.0 | 0.14.0 | 0.15.0 | 0.15.0 | 0.15.0 | +| thymeleaf | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.4.0 | 1.4.0 | 1.4.0 | +| velocity | 1.3.5 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | ## Note From 767adee54c977a6ed51f4e1ec76604ea06f6a7dc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 16 Jan 2020 08:08:17 +1100 Subject: [PATCH 587/730] File upload generated file name might contains double `.` result in file cannot be accessed #1282 --- CHANGELOG.md | 13 ++++++++----- src/main/java/act/app/ActionContext.java | 4 ++-- src/main/java/act/xio/NetworkHandler.java | 6 ++++++ src/main/java/ascii/Image2ascii.java | 13 ++----------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b1ee644b..9d97bf3f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # ActFramework Change Log +**1.8.32** +* File upload generated file name might contains double `.` result in file cannot be accessed #1282 + **1.8.31** 02/Jan/2020 * Act-Test - Add `In` verifier #1271 * Create an API to allow developer generate random data #1270 @@ -1169,21 +1172,21 @@ * ActiveRecord -> AdaptiveRecord * Performance tuning: enable nonblocking IO -0.3.0 +**0.3.0** 10/Oct/2016 * Catch up update to osgl-mvc 0.6.0: Bind annotation now support specifying multiple Binder implementations -0.2.0 +**0.2.0** 20/Sep/2016 * Make act be java 1.6 compatible * Big refactoring on * dependency injection now on Genie * param loading mechanism * render arg enhancement now support method call with params, and field -0.1.3 +**0.1.3** 19/Jun/2016 * testapp to implement integration test of ActFramework -0.1.2 +**0.1.2** 11/Apr/2016 * misc bug fixes -0.1.1 +**0.1.1** 21/Feb/2016 * baseline version diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 975e61dfa..6ac27e2e9 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -790,7 +790,7 @@ public Set paramNames() { * {@link #paramVal(String)} with `__path` as param name. * * However, this method will do sanity check on the value returned, in case - * there are `..` found in the value, an `BadRequest` will + * there are `../` found in the value, an `BadRequest` will * be thrown out. This is to prevent the insecure direct object reference * attack. * @@ -802,7 +802,7 @@ public String __pathParamVal() { if (null == s) { return s; } - badRequestIf(s.contains(".."), "`..` found in path which is not allowed"); + badRequestIf(s.contains("../"), "`../` found in path which is not allowed"); return s; } diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index e9dc29fe9..7eaf4a5f9 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -245,6 +245,8 @@ public void run() { ctx.markAsNonBlock(); job.run(); } + } catch (Result r) { + handleErrorResult(r, ctx); } catch (RuntimeException e) { handleException(e, ctx, "Error handling network request"); } @@ -271,6 +273,10 @@ private void handleException(Exception exception, final ActionContext ctx, Strin } else if (r instanceof ErrorResult) { r = ActErrorResult.of(r); } + handleErrorResult(r, ctx); + } + + private void handleErrorResult(Result r, final ActionContext ctx) { ctx.setResult(r); if (null == ctx.handler()) { ctx.handler(FastRequestHandler.dumbHandler(ctx)); diff --git a/src/main/java/ascii/Image2ascii.java b/src/main/java/ascii/Image2ascii.java index dd8c45314..683575aae 100644 --- a/src/main/java/ascii/Image2ascii.java +++ b/src/main/java/ascii/Image2ascii.java @@ -24,6 +24,7 @@ import org.osgl.$; import org.osgl.util.E; import org.osgl.util.IO; +import org.osgl.util.Keyword; import javax.imageio.ImageIO; import java.awt.*; @@ -188,15 +189,5 @@ private static BufferedImage read(URL imageSource, boolean isIcon) throws Except } } - public static void main(String[] args) throws Exception { - Image2ascii convert = new Image2ascii(); - java.util.List images = ICODecoder.read(new File("/home/luog/favicon.ico")); - String s = convert.convert(images.get(0), true); - if (images.size() > 0) { - for (int i = 0; i < images.size(); ++i) { - ImageIO.write(images.get(i), "png", new File("/home/luog/f" + i + ".png")); - } - } - IO.writeContent(s, new File("/home/luog/a.txt")); - } + } From 337a5e32b5badc2e02bbeefa2f8bfa772fa2f42b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 25 Jan 2020 09:25:05 +1100 Subject: [PATCH 588/730] Exception handling controller with field class without generic parameter specified #1286 --- CHANGELOG.md | 1 + pom.xml | 2 +- testapps/GHIssues/pom.xml | 4 +-- .../src/main/java/ghissues/Gh1286.java | 28 +++++++++++++++++++ .../src/test/resources/scenarios/1286.yml | 9 ++++++ 5 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1286.java create mode 100644 testapps/GHIssues/src/test/resources/scenarios/1286.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d97bf3f0..e22ac2633 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.32** +* Exception handling controller with field class without generic parameter specified #1286 * File upload generated file name might contains double `.` result in file cannot be accessed #1282 **1.8.31** 02/Jan/2020 diff --git a/pom.xml b/pom.xml index bd17e246f..0ecfb63df 100644 --- a/pom.xml +++ b/pom.xml @@ -68,7 +68,7 @@ 1.23.0 1.8.0 - 1.13.0 + 1.13.1-SNAPSHOT 1.13.0 1.13.0 1.10.0 diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index b88f47a5b..b4c2b7fe6 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.8.31.0-SNAPSHOT + 1.8.31.0 @@ -25,7 +25,7 @@ org.actframework act - 1.8.31-SNAPSHOT + 1.8.32-SNAPSHOT org.actframework diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1286.java b/testapps/GHIssues/src/main/java/ghissues/Gh1286.java new file mode 100644 index 000000000..99b19f41f --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1286.java @@ -0,0 +1,28 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +/** + * Run app and check if there are exception stack during API doc generation + */ +@UrlContext("1286") +public class Gh1286 extends BaseController { + public static class TestResp { + public Integer code; + public T result; + + public TestResp(Integer code, T result) { + this.code = code; + this.result = result; + } + } + + public TestResp resp = new TestResp(1, "Hello"); + + @GetAction + public TestResp test() { + return resp; + } + +} diff --git a/testapps/GHIssues/src/test/resources/scenarios/1286.yml b/testapps/GHIssues/src/test/resources/scenarios/1286.yml new file mode 100644 index 000000000..5c7b957eb --- /dev/null +++ b/testapps/GHIssues/src/test/resources/scenarios/1286.yml @@ -0,0 +1,9 @@ +Scenario(1286): + description: Exception handling controller with field class without generic parameter specified #1286 + interactions: + - description: Test + request: + get: 1286 + response: + code: 1 + result: Hello From cba3713afc0da097d6da8bf5bfc5c60eb5b4eee6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 25 Jan 2020 16:57:49 +1100 Subject: [PATCH 589/730] API doc - URL path variable in POST endpoint info is incorrect #1284 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/ApiManager.java | 4 +- src/main/java/act/apidoc/Endpoint.java | 46 +++++++++++++------ src/main/java/act/route/Router.java | 6 ++- .../src/main/java/ghissues/Gh1284.java | 11 +++++ 5 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1284.java diff --git a/CHANGELOG.md b/CHANGELOG.md index e22ac2633..cb8216f10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.32** +* API doc - URL path variable in POST endpoint info is incorrect #1284 * Exception handling controller with field class without generic parameter specified #1286 * File upload generated file name might contains double `.` result in file cannot be accessed #1282 diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index 895668533..b6b7f6b08 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -224,10 +224,10 @@ private void load(Router router, NamedPort port, AppConfig config, final Set varNames, RequestHandler handler) { ctx.routeSource(routeSource); if (showEndpoint(path, handler)) { - Endpoint endpoint = new Endpoint(portNumber, method, path, handler); + Endpoint endpoint = new Endpoint(portNumber, method, path, varNames, handler); endpoints.add(endpoint); endpointLookup.put(endpoint.getId(), endpoint); if (isDev) { diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 2ca6ac662..cab12e600 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -88,10 +88,12 @@ public static class ParamInfo { public boolean headerVariable; public List options; public String fieldKey; + public boolean body; + public boolean pathVar; private ParamInfo() {} - private ParamInfo(String bindName, BeanSpec beanSpec, String description, String fieldKey) { + private ParamInfo(String bindName, BeanSpec beanSpec, String description, String fieldKey, boolean pathVar, boolean body) { this.bindName = bindName; this.beanSpec = beanSpec; this.description = description; @@ -101,6 +103,8 @@ private ParamInfo(String bindName, BeanSpec beanSpec, String description, String this.headerVariable = checkHeaderVariable(beanSpec); this.options = checkOptions(beanSpec); this.fieldKey = fieldKey; + this.pathVar = pathVar; + this.body = body; } public String getName() { @@ -108,18 +112,25 @@ public String getName() { return bindName + "[S]"; } else if (headerVariable) { return bindName + "[H]"; + } else if (pathVar) { + return bindName + "[U]"; + } else if (body) { + return bindName + "[B]"; } - return bindName; + return bindName + "[Q]"; } public String getTooltip() { if (sessionVariable) { - return "Session variable: " + bindName; + return "Session variable"; } else if (headerVariable) { - return "Header variable: " + bindName; - } else { - return "Bind name: " + bindName; + return "Header variable"; + } else if (pathVar) { + return "URL path variable"; + } else if (body) { + return "JSON body or post form field"; } + return "Query parameter"; } public String getType() { @@ -247,6 +258,8 @@ public enum Scheme { private Map typeLookups; + private List urlPathVarNames; + public String returnSample; public transient Object returnSampleObject; @@ -266,13 +279,14 @@ public enum Scheme { private Endpoint() {} - Endpoint(int port, H.Method httpMethod, String path, RequestHandler handler) { + Endpoint(int port, H.Method httpMethod, String path, List urlPathVarNames, RequestHandler handler) { AppConfig conf = Act.appConfig(); this.httpMethod = $.requireNotNull(httpMethod); String urlContext = conf.urlContext(); this.path = null == urlContext || path.startsWith("/~/") ? $.requireNotNull(path) : S.concat(urlContext, $.requireNotNull(path)); this.handler = handler.toString(); this.port = port; + this.urlPathVarNames = urlPathVarNames; this.sampleDataProviderManager = Act.app().sampleDataProviderManager(); explore(handler); } @@ -496,7 +510,7 @@ private void exploreParamInfo(Method method, Map typeParamLookup, ParamInfo info = paramInfo(type, typeParamLookup, annos, injector, null, null, body); if (null != info) { params.add(info); - if (path.contains("{" + info.getName() + "}")) { + if (info.pathVar) { // no sample data for URL path variable continue; } @@ -552,7 +566,10 @@ private void exploreParamInfo(Class controller, Map typeParamL } } - private ParamInfo paramInfo(Type type, Map typeParamLookup, Annotation[] annos, DependencyInjector injector, String name, String fieldKey, boolean body) { + private ParamInfo paramInfo( + Type type, Map typeParamLookup, Annotation[] annos, + DependencyInjector injector, String name, String fieldKey, boolean body + ) { if (isLoginUser(annos)) { return null; } @@ -560,18 +577,19 @@ private ParamInfo paramInfo(Type type, Map typeParamLookup, Annot if (ParamValueLoaderService.providedButNotDbBind(spec, injector)) { return null; } + if (org.osgl.util.S.blank(name)) { + name = spec.name(); + } + boolean pathVar = urlPathVarNames.contains(name); if (ParamValueLoaderService.hasDbBind(spec.allAnnotations())) { - if (org.osgl.util.S.blank(name)) { - name = spec.name(); - } - return new ParamInfo(name, BeanSpec.of(String.class, injector, typeParamLookup), name + " id", fieldKey); + return new ParamInfo(name, BeanSpec.of(String.class, injector, typeParamLookup), name + " id", fieldKey, pathVar, body); } String description = ""; Description descAnno = spec.getAnnotation(Description.class); if (null != descAnno) { description = descAnno.value(); } - return new ParamInfo(body ? spec.name() + " (body)" : spec.name(), spec, description, fieldKey); + return new ParamInfo(name, spec, description, fieldKey, pathVar, body); } private boolean isLoginUser(Annotation[] annos) { diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 063edbc59..f67771854 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -71,10 +71,12 @@ public interface Visitor { * the URL path * @param source * the route source + * @param varNames + * the URL path variable name list * @param handler * the handler */ - void visit(H.Method method, String path, RouteSource source, RequestHandler handler); + void visit(H.Method method, String path, RouteSource source, List varNames, RequestHandler handler); } public static final String IGNORE_NOTATION = "..."; @@ -218,7 +220,7 @@ private void visit(Node node, H.Method method, Visitor visitor) { if (handler instanceof ContextualHandler) { handler = ((ContextualHandler) handler).realHandler(); } - visitor.visit(method, node.path(), node.routeSource, handler); + visitor.visit(method, node.path(), node.routeSource, node.varNames, handler); } for (TreeNode child : node.children()) { visit((Node)child, method, visitor); diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1284.java b/testapps/GHIssues/src/main/java/ghissues/Gh1284.java new file mode 100644 index 000000000..025369166 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1284.java @@ -0,0 +1,11 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1284") +public class Gh1284 extends BaseController { + @PostAction("{id}") + public void testPost(String id) { + } +} From c5b0aa1251fc46c0a814447d1624b415b199e38f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 25 Jan 2020 19:29:43 +1100 Subject: [PATCH 590/730] Async endpoint result page style needs to be updated #1285 --- CHANGELOG.md | 1 + src/main/resources/rythm/act/asyncJob.html | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb8216f10..ac6c02580 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.32** +* Async endpoint result page style needs to be updated #1285 * API doc - URL path variable in POST endpoint info is incorrect #1284 * Exception handling controller with field class without generic parameter specified #1286 * File upload generated file name might contains double `.` result in file cannot be accessed #1282 diff --git a/src/main/resources/rythm/act/asyncJob.html b/src/main/resources/rythm/act/asyncJob.html index 8189f671f..d3ec82bea 100644 --- a/src/main/resources/rythm/act/asyncJob.html +++ b/src/main/resources/rythm/act/asyncJob.html @@ -126,11 +126,12 @@ font-family: "Envy Code R", "Fira Code", "Source Code Pro Semibold", Monaco, Courier, monospace; font-weight: bold; font-size: 13px; - border: 1px solid #666; - background-color: #666; - color: #000; + border: 1px solid #444; + background-color: #444; + color: #fff; display: inline-block; min-width: 640px; + line-height: 1.5em; } #result-detail.error { border-color: #ee4444; From 77b7f39d3d37b037870751f0ac2d2b7bb9c16eaa Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 27 Jan 2020 11:35:20 +1100 Subject: [PATCH 591/730] async request handling - render report using cached accept type #1287 --- CHANGELOG.md | 1 + pom.xml | 2 +- .../impl/ReflectedHandlerInvoker.java | 30 ++++++++++++++----- .../asset/~act/css/act_data_table.css | 17 +++++++++-- src/main/resources/rythm/act/asyncJob.html | 10 +++++-- src/main/resources/rythm/~table.html | 4 ++- 6 files changed, 50 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac6c02580..e0d77a5a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.32** +* async request handling - render report using cached accept type #1287 * Async endpoint result page style needs to be updated #1285 * API doc - URL path variable in POST endpoint info is incorrect #1284 * Exception handling controller with field class without generic parameter specified #1286 diff --git a/pom.xml b/pom.xml index 0ecfb63df..44de922f1 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ 1.23.0 1.8.0 1.13.1-SNAPSHOT - 1.13.0 + 1.13.1-SNAPSHOT 1.13.0 1.10.0 1.5.0 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 5ff92be7e..31f721108 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -613,7 +613,6 @@ public Result handle(final ActionContext context) { Map violations = context.violations(); if (HANDLING == context.state() && !violations.isEmpty()) { - if (null != validateViolationAdvice) { Result r = null; try { @@ -691,15 +690,30 @@ protected void run(ProgressGauge progressGauge) { WebSocketConnectionManager wscm = app.getInstance(WebSocketConnectionManager.class); wscm.subscribe(context.session(), SimpleProgressGauge.wsJobProgressTag(jobId)); jobManager.now(jobId); - boolean renderAsyncJobPage = reportAsyncProgress && (context.req().accept().isSameTypeWith(H.Format.HTML)); - if (renderAsyncJobPage) { - context.templatePath("/act/asyncJob.html"); - context.renderArg("jobId", jobId); - return RenderTemplate.get(); - } else { + /* + * We need to decide how to render the response here: + * 1. if it require json, then return json response directly + * 2. otherwise we want to check the {@link H.Request#rawAccept()}, + * 2.1 in case raw accept is HTML then cache current accept and render Async status page, once done render + * result page using cached accept + * 2.2 in case raw accept is not HTML then cache current accept and render JSON response + */ + H.Format wantedAccept = null; + boolean renderJson = !reportAsyncProgress; + if (!renderJson) { + H.Request req = context.req(); + wantedAccept = req.accept(); + renderJson = wantedAccept.isSameTypeWith(H.Format.JSON) || !req.rawAccept().isSameTypeWith(H.Format.HTML); + } + if (renderJson) { String resultUrl = context.router().fullUrl("/~/jobs/%s/result", jobId); - return new RenderJSON(C.Map("jobId", jobId, "resultUrl", resultUrl)); + return new RenderJSON(C.Map("jobId", jobId, "resultUrl", resultUrl)); } + context.renderArg("targetAccept", wantedAccept.name()); + context.accept(H.Format.HTML); + context.templatePath("/act/asyncJob.html"); + context.renderArg("jobId", jobId); + return RenderTemplate.get(); } try { diff --git a/src/main/resources/asset/~act/css/act_data_table.css b/src/main/resources/asset/~act/css/act_data_table.css index fa436d08b..b1899c962 100644 --- a/src/main/resources/asset/~act/css/act_data_table.css +++ b/src/main/resources/asset/~act/css/act_data_table.css @@ -3,13 +3,26 @@ table.act_data_table { font-size: 11pt; font-family: cousine, "Droid Sans Mono Dotted", "Envy Code R", "Fira Code", Monaco, monospaced; } -table.act_data_table th { +table.act_data_table th, table.act_data_table td.act_data_table_label { background-color: #007; padding: 5px; color: #efefef; border-color: #efefef; + font-weight: bold; } -table.act_data_table, table.act_data_table th, table.act_data_table td { +table.act_data_table th:first-child { + border-left-color: #007; +} +table.act_data_table th:last-child { + border-right-color: #007; +} +table.act_data_table tbody tr:first-child td.act_data_table_label { + border-top-color: #007; +} +table.act_data_table tbody tr:last-child td.act_data_table_label { + border-bottom-color: #007; +} +table.act_data_table, table.act_data_table td { border: 1px solid #007; } table.act_data_table td { diff --git a/src/main/resources/rythm/act/asyncJob.html b/src/main/resources/rythm/act/asyncJob.html index d3ec82bea..bc5076f57 100644 --- a/src/main/resources/rythm/act/asyncJob.html +++ b/src/main/resources/rythm/act/asyncJob.html @@ -1,6 +1,6 @@ -@args String jobId +@args String jobId, String targetAccept Job Result $('#in-progress').hide() if (fail) { $('#result-detail').addClass('error') + $('#job-result').show() + } else { + @if("json".equalsIgnoreCase(targetAccept) || "html".equalsIgnoreCase(targetAccept)) { + $('#job-result').show() + } else { + location.href="/~/jobs/@jobId/result?_accept=@targetAccept" + } } - $('#job-result').show() }) } function monitorProgress() { diff --git a/src/main/resources/rythm/~table.html b/src/main/resources/rythm/~table.html index 3356105fa..6a49d3c57 100644 --- a/src/main/resources/rythm/~table.html +++ b/src/main/resources/rythm/~table.html @@ -2,6 +2,7 @@ @import act.util.DataTable, org.osgl.Lang, org.osgl.util.S @args DataTable table
                                                                                                                                                                              @_@(_.equals("_this_") ? "data" : _)
                                                                                                                                                                              + @if(!table.isTransposed()) { @for(table.heading()) { @@ -9,6 +10,7 @@ } + } @def boolean isUrl(Object v) { if (null == v) {return false;} @@ -37,7 +39,7 @@ @for(String label: table.heading()) { -@if(title) { -

                                                                                                                                                                              @title

                                                                                                                                                                              -} @invoke("~table.html", table) From 9ceb6c0c54d431078bf2e171282dc8b4d25df157 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 15 Feb 2020 22:07:46 +1100 Subject: [PATCH 593/730] fix #1294 and #1293 --- CHANGELOG.md | 2 + src/main/java/act/conf/AppConfig.java | 19 ++++++- src/main/java/act/conf/AppConfigKey.java | 10 ++++ .../controller/ControllerProgressGauge.java | 3 ++ .../java/act/session/DefaultSessionCodec.java | 10 ++++ .../act/session/HeaderTokenSessionMapper.java | 13 ++--- .../act/session/JsonWebTokenSessionCodec.java | 10 ++++ src/main/java/act/session/SessionCodec.java | 8 +++ src/main/java/act/session/SessionManager.java | 4 ++ .../act/session/ShortLifeTokenGenerator.java | 50 +++++++++++++++++++ src/main/java/act/test/RequestBuilder.java | 12 +++++ .../act/xio/undertow/UndertowRequest.java | 5 +- src/main/resources/aaa.authenticate.list | 1 + src/main/resources/act.scan.list | 1 + 14 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 src/main/java/act/session/ShortLifeTokenGenerator.java diff --git a/CHANGELOG.md b/CHANGELOG.md index ad3f17147..0032eab0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.32** +* Act-Test - it shall send session header token from last headers automatically #1294 +* Allow it use request parameter to pass session token #1293 * API Doc - improve sample data generation for `ISObject` type #1289 * HTML table view - make table header sticky at the top #1290 * async request handling - render report using cached accept type #1287 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 91f5acb9b..b1361f872 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -3069,7 +3069,7 @@ protected T sessionHeader(String header) { public String sessionHeader() { if (!sessionHeaderSet) { - sessionHeader = get(SESSION_HEADER, null); + sessionHeader = get(SESSION_HEADER, S.pathConcat(sessionHeaderPrefix(), '-', "Session")); sessionHeaderSet = true; } return sessionHeader; @@ -3117,6 +3117,23 @@ private void _mergeSessionHeaderPayloadPrefix(AppConfig config) { } } + private String sessionQueryParamName; + protected T sessionQueryParamName(String paramName) { + sessionQueryParamName = paramName; + return me(); + } + public String getSessionQueryParamName() { + if (null == sessionQueryParamName) { + sessionQueryParamName = get(SESSION_QUERY_PARAM_NAME, sessionHeader()); + } + return sessionQueryParamName; + } + private void _mergeSessionQueryParamName(AppConfig config) { + if (!hasConfiguration(SESSION_QUERY_PARAM_NAME)) { + sessionQueryParamName = config.sessionQueryParamName; + } + } + private Boolean sessionSecure = null; protected T sessionSecure(boolean secure) { diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 2d6a3e085..052f5b526 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -1160,6 +1160,16 @@ public T val(Map configuration) { // TODO: change it to `header.session` SESSION_HEADER("session.header"), + /** + * `session.query.param.name` - specify the name of the query parameter + * used to specify session token. + * + * Refer: https://github.com/actframework/actframework/issues/1293 + * + * Default value: the value of {@link #SESSION_HEADER} + */ + SESSION_QUERY_PARAM_NAME("session.query.param.name"), + /** * `session.header.prefix`, specify the prefix of session * header. diff --git a/src/main/java/act/handler/builtin/controller/ControllerProgressGauge.java b/src/main/java/act/handler/builtin/controller/ControllerProgressGauge.java index 687ea31c8..aad55a275 100644 --- a/src/main/java/act/handler/builtin/controller/ControllerProgressGauge.java +++ b/src/main/java/act/handler/builtin/controller/ControllerProgressGauge.java @@ -53,6 +53,9 @@ public void stepTo(int steps) { } public void commitFinalState() { + if (null == this.error) { + markAsDone(); + } triggerUpdateEvent(true); } } diff --git a/src/main/java/act/session/DefaultSessionCodec.java b/src/main/java/act/session/DefaultSessionCodec.java index e3c8d9246..eaefcd063 100644 --- a/src/main/java/act/session/DefaultSessionCodec.java +++ b/src/main/java/act/session/DefaultSessionCodec.java @@ -76,6 +76,16 @@ public String encodeSession(H.Session session) { return dissolveIntoCookieContent(session, true); } + @Override + public String encodeSession(H.Session session, int ttlInMillis) { + if (null == session || session.isEmpty()) { + return null; + } + session.id(); // ensure session ID is generated + session.put(KEY_EXPIRATION, $.ms() + ttlInMillis); + return dissolveIntoCookieContent(session, true); + } + @Override public String encodeFlash(H.Flash flash) { if (null == flash || flash.isEmpty()) { diff --git a/src/main/java/act/session/HeaderTokenSessionMapper.java b/src/main/java/act/session/HeaderTokenSessionMapper.java index b9af1a53e..db725525a 100644 --- a/src/main/java/act/session/HeaderTokenSessionMapper.java +++ b/src/main/java/act/session/HeaderTokenSessionMapper.java @@ -36,6 +36,7 @@ public class HeaderTokenSessionMapper implements SessionMapper { public static final String DEF_HEADER_PREFIX = "X-Act-"; public static final String DEF_PAYLOAD_PREFIX = ""; private String sessionHeader; + private String sessionQueryParamName; private String flashHeader; private String sessionPayloadPrefix; private boolean hasSessionPayloadPrefix; @@ -43,13 +44,9 @@ public class HeaderTokenSessionMapper implements SessionMapper { @Inject public HeaderTokenSessionMapper(AppConfig config) { - String prefix = config.sessionHeaderPrefix(); - String headerPrefix = S.blank(prefix) ? DEF_HEADER_PREFIX : prefix; sessionHeader = config.sessionHeader(); - if (null == sessionHeader) { - sessionHeader = S.pathConcat(headerPrefix, '-', "Session"); - } - flashHeader = S.pathConcat(headerPrefix, '-', "Flash"); + flashHeader = S.pathConcat(config.sessionHeaderPrefix(), '-', "Flash"); + sessionQueryParamName = config.getSessionQueryParamName(); sessionPayloadPrefix = config.sessionHeaderPayloadPrefix(); hasSessionPayloadPrefix = S.notBlank(sessionPayloadPrefix); expirationMapper = new ExpirationMapper(config); @@ -76,6 +73,10 @@ public void write(String session, String flash, H.Response response) { @Override public String readSession(H.Request request) { String payload = request.header(sessionHeader); + if (null == payload) { + // try query parameter + payload = request.paramVal(sessionQueryParamName); + } return null == payload ? null : hasSessionPayloadPrefix ? S.afterFirst(payload, sessionPayloadPrefix) : payload; } diff --git a/src/main/java/act/session/JsonWebTokenSessionCodec.java b/src/main/java/act/session/JsonWebTokenSessionCodec.java index 5f46a2219..483a5bc41 100644 --- a/src/main/java/act/session/JsonWebTokenSessionCodec.java +++ b/src/main/java/act/session/JsonWebTokenSessionCodec.java @@ -70,6 +70,16 @@ public String encodeSession(H.Session session) { return populateToken(jwt.newToken(), session).toString(jwt); } + @Override + public String encodeSession(H.Session session, int ttlInMillis) { + if (null == session || session.isEmpty()) { + return null; + } + session.id(); // ensure session ID is generated + session.put(KEY_EXPIRATION, $.ms() + ttlInMillis); + return populateToken(jwt.newToken(), session).toString(jwt); + } + @Override public String encodeFlash(H.Flash flash) { if (null == flash || flash.isEmpty()) { diff --git a/src/main/java/act/session/SessionCodec.java b/src/main/java/act/session/SessionCodec.java index 51272fbe4..621c2efbf 100644 --- a/src/main/java/act/session/SessionCodec.java +++ b/src/main/java/act/session/SessionCodec.java @@ -35,6 +35,14 @@ public interface SessionCodec { */ String encodeSession(H.Session session); + /** + * Encode a session into a string using specified expiry in seconds + * @param session the session to be encoded. + * @param ttlInSeconds time to live in seconds + * @return the encoded session + */ + String encodeSession(H.Session session, int ttlInSeconds); + /** * Encode a flash into a string * @param flash diff --git a/src/main/java/act/session/SessionManager.java b/src/main/java/act/session/SessionManager.java index 5c6ee6566..97976d25d 100644 --- a/src/main/java/act/session/SessionManager.java +++ b/src/main/java/act/session/SessionManager.java @@ -92,4 +92,8 @@ public void dissolveState(H.Session session, H.Flash flash, H.Response response) mapper.write(encodedSession, encodedFlash, response); } + public String generateSessionToken(H.Session session, int ttlInSeconds) { + return codec.encodeSession(session, ttlInSeconds); + } + } diff --git a/src/main/java/act/session/ShortLifeTokenGenerator.java b/src/main/java/act/session/ShortLifeTokenGenerator.java new file mode 100644 index 000000000..00a3a3d86 --- /dev/null +++ b/src/main/java/act/session/ShortLifeTokenGenerator.java @@ -0,0 +1,50 @@ +package act.session; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2020 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.inject.DefaultValue; +import org.osgl.http.H; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class ShortLifeTokenGenerator { + + @Inject + SessionManager sm; + + /** + * Generate a short life session token. + * + * Refer: https://github.com/actframework/actframework/issues/1293 + * + * @param ttlInSeconds token ttl in seconds, default value: 60 + * @param session injected session object of current request context + * @return the session token with specified expiry time. + */ + @GetAction("~session-token~") + public String getToken(@DefaultValue("60") int ttlInSeconds, H.Session session) { + return sm.generateSessionToken(session, ttlInSeconds); + } + +} diff --git a/src/main/java/act/test/RequestBuilder.java b/src/main/java/act/test/RequestBuilder.java index 7abd91881..efb053488 100644 --- a/src/main/java/act/test/RequestBuilder.java +++ b/src/main/java/act/test/RequestBuilder.java @@ -21,6 +21,7 @@ */ import act.Act; +import act.conf.AppConfig; import act.handler.builtin.FileGetter; import act.test.req_modifier.RequestModifier; import com.alibaba.fastjson.JSON; @@ -33,6 +34,7 @@ import java.io.File; import java.net.URL; import java.util.Collection; +import java.util.List; import java.util.Map; import static org.osgl.http.H.Header.Names.ACCEPT; @@ -69,6 +71,16 @@ class RequestBuilder { for (RequestModifier modifier : requestSpec.modifiers) { modifier.modifyRequest(builder); } + if (null != session) { + Headers lastHeaders = session.lastHeaders.get(); + if (null != lastHeaders) { + String sessionHeader = Act.appConfig().sessionHeader(); + String val = lastHeaders.get(sessionHeader); + if (S.notBlank(val)) { + builder.addHeader(sessionHeader, val); + } + } + } for (Map.Entry entry : requestSpec.headers.entrySet()) { String headerName = entry.getKey(); String headerVal = S.string(entry.getValue()); diff --git a/src/main/java/act/xio/undertow/UndertowRequest.java b/src/main/java/act/xio/undertow/UndertowRequest.java index 5e104bf37..55bff3280 100644 --- a/src/main/java/act/xio/undertow/UndertowRequest.java +++ b/src/main/java/act/xio/undertow/UndertowRequest.java @@ -70,6 +70,7 @@ public class UndertowRequest extends RequestImplBase { private Map> queryParamsByKeyword; private boolean keywordMatching; private Map headerCache = new HashMap<>(); + private static final String NULL_HEADER_VAL = "_NULL_"; public UndertowRequest(HttpServerExchange exchange, AppConfig config) { super(config); @@ -117,9 +118,9 @@ public String header(String name) { if (null == val) { val = hse.getRequestHeaders().get(key, 0); } - headerCache.put(key, val); + headerCache.put(key, null == val ? NULL_HEADER_VAL : val); } - return val; + return NULL_HEADER_VAL == val ? null : val; } private String headerQueryKey(String header) { diff --git a/src/main/resources/aaa.authenticate.list b/src/main/resources/aaa.authenticate.list index c7d559377..46efb8c82 100644 --- a/src/main/resources/aaa.authenticate.list +++ b/src/main/resources/aaa.authenticate.list @@ -5,6 +5,7 @@ -act.Zen. -act.monitor. -act.conf.CsrfConfAdmin +-act.session.ShortLifeTokenGenerator # The following endpoints are only public on dev mode [dev]-act.apidoc. diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index ca443e1f6..af334ca69 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -37,6 +37,7 @@ act.util.TypeConverterRegister act.validation.ValidationPlugin act.Zen act.apidoc.Endpoint.Service +act.session.ShortLifeTokenGenerator org.osgl.util.FastJsonKvCodec act.ws.WebSocketAdminConsole act.ws.WebSocketConnectionListener$Manager$Finder From deb879bf2a1a900ae125f465f5004405303b212a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 18 Feb 2020 07:37:13 +1100 Subject: [PATCH 594/730] Render attachment or inline response when request handler return `File` or `ISObject` type based on its content type #1296 --- CHANGELOG.md | 2 + pom.xml | 6 +- src/main/java/act/controller/Controller.java | 63 ++++++++++++++++---- src/main/java/act/inject/ActProviders.java | 7 ++- src/main/java/act/route/Router.java | 10 +++- src/main/java/act/view/ActErrorResult.java | 22 ++++++- src/main/resources/act.jar.black.list | 1 + 7 files changed, 90 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0032eab0d..914357691 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,11 @@ # ActFramework Change Log **1.8.32** +* Render attachment or inline response when request handler return `File` or `ISObject` type based on its content type #1296 * Act-Test - it shall send session header token from last headers automatically #1294 * Allow it use request parameter to pass session token #1293 * API Doc - improve sample data generation for `ISObject` type #1289 +* Add jackson into jar black list. Refer: #1288 * HTML table view - make table header sticky at the top #1290 * async request handling - render report using cached accept type #1287 * Async endpoint result page style needs to be updated #1285 diff --git a/pom.xml b/pom.xml index 44de922f1..8a3ff5d52 100644 --- a/pom.xml +++ b/pom.xml @@ -66,12 +66,12 @@ 3.12.1 - 1.23.0 + 1.24.0-SNAPSHOT 1.8.0 1.13.1-SNAPSHOT 1.13.1-SNAPSHOT - 1.13.0 - 1.10.0 + 1.13.1-SNAPSHOT + 1.11.0-SNAPSHOT 1.5.0 0.0.1 1.11.9 diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index 3448c7887..f5913a71d 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -40,6 +40,7 @@ import com.google.zxing.BarcodeFormat; import org.osgl.$; import org.osgl.Lang; +import org.osgl.exception.UnexpectedIOException; import org.osgl.http.H; import org.osgl.mvc.result.*; import org.osgl.storage.ISObject; @@ -1367,8 +1368,15 @@ public static RenderXML renderXml(String msg, Object... args) { * the {@link ISObject} instance * @return the result */ - public static RenderBinary binary(ISObject sobj) { - return new RenderBinary(sobj.asInputStream(), sobj.getAttribute(ISObject.ATTR_FILE_NAME), sobj.getAttribute(ISObject.ATTR_CONTENT_TYPE), true); + public static Result binary(ISObject sobj) { + if (null == sobj) { + return ActNotFound.get(); + } + InputStream is = sobj.asInputStream(); + if (null == is) { + return ActNotFound.get(); + } + return new RenderBinary(is, sobj.getAttribute(ISObject.ATTR_FILE_NAME), sobj.getAttribute(ISObject.ATTR_CONTENT_TYPE), true); } /** @@ -1378,7 +1386,7 @@ public static RenderBinary binary(ISObject sobj) { * the {@link ISObject} instance * @return the result */ - public static RenderBinary renderBinary(ISObject sobj) { + public static Result renderBinary(ISObject sobj) { return binary(sobj); } @@ -1389,8 +1397,15 @@ public static RenderBinary renderBinary(ISObject sobj) { * @param sobj * the {@link ISObject} instance */ - public static RenderBinary download(ISObject sobj) { - return new RenderBinary(sobj.asInputStream(), sobj.getAttribute(ISObject.ATTR_FILE_NAME), sobj.getAttribute(ISObject.ATTR_CONTENT_TYPE), false); + public static Result download(ISObject sobj) { + if (null == sobj) { + return ActNotFound.get(); + } + InputStream is = sobj.asInputStream(); + if (null == is) { + return ActNotFound.get(); + } + return new RenderBinary(is, sobj.getAttribute(ISObject.ATTR_FILE_NAME), sobj.getAttribute(ISObject.ATTR_CONTENT_TYPE), false); } /** @@ -1401,8 +1416,14 @@ public static RenderBinary download(ISObject sobj) { * the file to be rendered * @return a result */ - public static RenderBinary binary(File file) { - return new RenderBinary(file); + public static Result binary(File file) { + if (null == file || !file.exists()) { + return ActNotFound.get(); + } + if (!file.canRead()) { + return ActConflict.create("File not readable: %s", file.getPath()); + } + return new RenderBinary(file).status(ActionContext.current().successStatus()); } /** @@ -1412,7 +1433,7 @@ public static RenderBinary binary(File file) { * the file to be rendered * @return a result */ - public static RenderBinary renderBinary(File file) { + public static Result renderBinary(File file) { return binary(file); } @@ -1879,18 +1900,36 @@ public static Result inferResult(File file, ActionContext actionContext) { if (!file.canRead()) { return forbidden(); } - if (actionContext.acceptJson()) { + MimeType type = MimeType.findByName(S.fileExtension(file.getName())); + boolean isText = null != type && type.hasTrait(MimeType.Trait.text); + boolean isImage = null != type && type.hasTrait(MimeType.Trait.image); + if (isText && actionContext.acceptJson()) { return RenderJSON.of(actionContext.successStatus(), IO.readContentAsString(file)); } else { - return new RenderBinary(file).status(actionContext.successStatus()); + if (isText || isImage) { + return new RenderBinary(file).status(actionContext.successStatus()); + } else { + return new RenderBinary(file, ActionContext.current().attachmentName(file), false).status(actionContext.successStatus()); + } } } public static Result inferResult(ISObject sobj, ActionContext context) { - if (context.acceptJson()) { + if (null == sobj) { + return notFound(); + } + String contentType = sobj.getContentType(); + MimeType type = null != contentType ? MimeType.findByContentType(contentType) : null; + boolean isText = null != type && type.hasTrait(MimeType.Trait.text); + boolean isImage = null != type && type.hasTrait(MimeType.Trait.image); + if (isText && context.acceptJson()) { return RenderJSON.of(context.successStatus(), sobj.asString()); } else { - return binary(sobj).status(context.successStatus()); + if (isText || isImage) { + return binary(sobj).status(context.successStatus()); + } else { + return download(sobj).status(context.successStatus()); + } } } diff --git a/src/main/java/act/inject/ActProviders.java b/src/main/java/act/inject/ActProviders.java index 5230b81d8..f2274971b 100644 --- a/src/main/java/act/inject/ActProviders.java +++ b/src/main/java/act/inject/ActProviders.java @@ -265,7 +265,12 @@ public DbService get() { public static final NamedProvider NAMED_DB_SERVICE_PROVIDER = new NamedProvider() { @Override public DbService get(String name) { - return app().dbServiceManager().dbService(name); + DbServiceManager mgr = app().dbServiceManager(); + DbService svc = mgr.dbService(name); + if (null == svc && ("svc".equalsIgnoreCase(name) || "dbService".equalsIgnoreCase(name) || "dbSvc".equalsIgnoreCase(name) || "service".equalsIgnoreCase(name))) { + return mgr.dbService(DB.DEFAULT); + } + return svc; } }; diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index f67771854..3fc33e2bf 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -798,7 +798,10 @@ private Node search(Node rootNode, Iterator path, ActionContext context) } else { S.Buffer sb = S.buffer(); while (path.hasNext()) { - sb.append('/').append(path.next()); + if (!sb.isEmpty()) { + sb.append('/'); + } + sb.append(path.next()); } context.param(ParamNames.PATH, sb.toString()); } @@ -806,7 +809,10 @@ private Node search(Node rootNode, Iterator path, ActionContext context) } else if (node.ignoreRestParts()) { S.Buffer sb = S.buffer(); while (path.hasNext()) { - sb.append('/').append(path.next()); + if (!sb.isEmpty()) { + sb.append('/'); + } + sb.append(path.next()); } context.param(ParamNames.PATH, sb.toString()); break; diff --git a/src/main/java/act/view/ActErrorResult.java b/src/main/java/act/view/ActErrorResult.java index 49750cad0..a935cd1e9 100644 --- a/src/main/java/act/view/ActErrorResult.java +++ b/src/main/java/act/view/ActErrorResult.java @@ -31,9 +31,7 @@ import act.exception.BindException; import act.util.ActError; import org.osgl.$; -import org.osgl.exception.InvalidRangeException; -import org.osgl.exception.ToBeImplemented; -import org.osgl.exception.UnsupportedException; +import org.osgl.exception.*; import org.osgl.http.H; import org.osgl.mvc.annotation.ResponseStatus; import org.osgl.mvc.result.ErrorResult; @@ -165,12 +163,14 @@ protected void populateSourceInfo(AsmContext context) { $.Function unsupported = new $.Transformer() { @Override public Result transform(Throwable throwable) { + Act.LOGGER.warn(throwable, "Error:"); return ActNotImplemented.create(throwable); } }; x.put(ToBeImplemented.class, new $.Transformer() { @Override public Result transform(Throwable throwable) { + Act.LOGGER.warn(throwable, "Error:"); return ActToBeImplemented.create(); } }); @@ -179,12 +179,28 @@ public Result transform(Throwable throwable) { x.put(IllegalStateException.class, new $.Transformer() { @Override public Result transform(Throwable throwable) { + Act.LOGGER.warn(throwable, "Error:"); return ActConflict.create(throwable); } }); + x.put(ResourceNotFoundException.class, new $.Transformer() { + @Override + public Result transform(Throwable throwable) { + Act.LOGGER.warn(throwable, "Error:"); + return ActNotFound.create(throwable); + } + }); + x.put(AccessDeniedException.class, new $.Transformer() { + @Override + public Result transform(Throwable throwable) { + Act.LOGGER.warn(throwable, "Error:"); + return ActForbidden.create(throwable); + } + }); $.Transformer badRequest = new $.Transformer() { @Override public Result transform(Throwable throwable) { + Act.LOGGER.warn(throwable, "Error:"); return ActBadRequest.create(throwable); } }; diff --git a/src/main/resources/act.jar.black.list b/src/main/resources/act.jar.black.list index 5a5beecd1..ae29206f2 100644 --- a/src/main/resources/act.jar.black.list +++ b/src/main/resources/act.jar.black.list @@ -11,6 +11,7 @@ guava hamcrest idea_rt image4j +jackson jansi java javaparser From d43bc667130a43b25f9d1075411984a383c7c9f0 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 18 Feb 2020 07:40:00 +1100 Subject: [PATCH 595/730] fix RouterTest UT failure --- src/test/java/act/route/RouterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/act/route/RouterTest.java b/src/test/java/act/route/RouterTest.java index 7748c3b0e..bbccb7093 100644 --- a/src/test/java/act/route/RouterTest.java +++ b/src/test/java/act/route/RouterTest.java @@ -258,7 +258,7 @@ public void searchPartialUrl() { router.addMapping(GET, "/public", staticDirHandler); router.getInvoker(GET, "/public/foo/bar.txt", ctx).handle(ctx); verify(staticDirHandler).handle(ctx); - verify(ctx).param(ParamNames.PATH, "/foo/bar.txt"); + verify(ctx).param(ParamNames.PATH, "foo/bar.txt"); } @Test From e038dadba9c9210cbc0f48fb6f36205d7070df35 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 18 Feb 2020 07:54:37 +1100 Subject: [PATCH 596/730] display PDF type content inline by default --- src/main/java/act/controller/Controller.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index f5913a71d..cf730d886 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -1902,11 +1902,11 @@ public static Result inferResult(File file, ActionContext actionContext) { } MimeType type = MimeType.findByName(S.fileExtension(file.getName())); boolean isText = null != type && type.hasTrait(MimeType.Trait.text); - boolean isImage = null != type && type.hasTrait(MimeType.Trait.image); + boolean isImageOrPdf = null != type && (type.hasTrait(MimeType.Trait.image) || type.hasTrait(MimeType.Trait.pdf)); if (isText && actionContext.acceptJson()) { return RenderJSON.of(actionContext.successStatus(), IO.readContentAsString(file)); } else { - if (isText || isImage) { + if (isText || isImageOrPdf) { return new RenderBinary(file).status(actionContext.successStatus()); } else { return new RenderBinary(file, ActionContext.current().attachmentName(file), false).status(actionContext.successStatus()); @@ -1921,11 +1921,11 @@ public static Result inferResult(ISObject sobj, ActionContext context) { String contentType = sobj.getContentType(); MimeType type = null != contentType ? MimeType.findByContentType(contentType) : null; boolean isText = null != type && type.hasTrait(MimeType.Trait.text); - boolean isImage = null != type && type.hasTrait(MimeType.Trait.image); + boolean isImageOrPdf = null != type && (type.hasTrait(MimeType.Trait.image) || type.hasTrait(MimeType.Trait.pdf)); if (isText && context.acceptJson()) { return RenderJSON.of(context.successStatus(), sobj.asString()); } else { - if (isText || isImage) { + if (isText || isImageOrPdf) { return binary(sobj).status(context.successStatus()); } else { return download(sobj).status(context.successStatus()); From ec7e226c293b96a0b9d40cc06e45681294d55c41 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 18 Feb 2020 21:06:34 +1100 Subject: [PATCH 597/730] fix #1297 register cmd handler as get requester; #1298 render iterable data using html-table format when requesting from browser; #1299 fix html table column order issue with proper spec --- CHANGELOG.md | 3 ++ src/main/java/act/app/App.java | 14 +++++--- src/main/java/act/cli/CliDispatcher.java | 13 ++++++++ src/main/java/act/cli/Command.java | 2 +- src/main/java/act/conf/AppConfig.java | 8 +++-- src/main/java/act/conf/ConfAdmin.java | 5 ++- src/main/java/act/controller/Controller.java | 11 +++++-- .../bytecode/ControllerByteCodeScanner.java | 33 +++++++++++++++---- .../meta/ControllerClassMetaInfo.java | 4 ++- src/main/java/act/route/Router.java | 3 ++ src/main/java/act/util/DataTable.java | 14 +++++--- .../java/act/util/ReflectedInvokerHelper.java | 4 ++- 12 files changed, 85 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 914357691..e53ecb6fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.8.32** +* When it rendering data in HTML table, the column heading does not follow `PropertySpec` specification #1299 +* When requesting data from browser directly render the data using HTML table format if it is an `Iterable` #1298 +* Automatically register all CLI command handler as Get request handler to CLI over HTTP port #1297 * Render attachment or inline response when request handler return `File` or `ISObject` type based on its content type #1296 * Act-Test - it shall send session header token from last headers automatically #1294 * Allow it use request parameter to pass session token #1293 diff --git a/src/main/java/act/app/App.java b/src/main/java/act/app/App.java index 89fca27cc..0861450da 100644 --- a/src/main/java/act/app/App.java +++ b/src/main/java/act/app/App.java @@ -415,7 +415,15 @@ public Router router() { } public Router sysRouter() { - return router(AppConfig.PORT_SYS); + return router(Router.PORT_SYS); + } + + public Router cliOverHttpRouter() { + return router(Router.PORT_CLI_OVER_HTTP); + } + + public Router adminRouter() { + return router(Router.PORT_ADMIN); } public Router router(String name) { @@ -1762,10 +1770,6 @@ private void loadBuiltInRoutes() { router.addContext("act.", "/~"); router.addMapping(GET, "/~/ticket", secureTicketHandler, RouteSource.BUILD_IN); } - if (config.cliOverHttp()) { - Router router = router(AppConfig.PORT_CLI_OVER_HTTP); - router.addMapping(GET, "/asset/", new ResourceGetter("asset"), RouteSource.BUILD_IN); - } } private void initClassLoader() { diff --git a/src/main/java/act/cli/CliDispatcher.java b/src/main/java/act/cli/CliDispatcher.java index a74d168be..d58459df2 100644 --- a/src/main/java/act/cli/CliDispatcher.java +++ b/src/main/java/act/cli/CliDispatcher.java @@ -30,7 +30,9 @@ import act.cli.meta.CommanderClassMetaInfo; import act.handler.CliHandler; import act.handler.builtin.cli.CliHandlerProxy; +import act.route.Router; import org.osgl.$; +import org.osgl.http.H; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.C; @@ -55,8 +57,11 @@ public class CliDispatcher extends AppServiceBase { private Map> nameMap = new HashMap<>(); private Map> shortCutMap = new HashMap<>(); + private Router cmdRouter; + public CliDispatcher(App app) { super(app); + cmdRouter = app.cliOverHttpRouter(); app.jobManager().now(new Runnable() { @Override public void run() { @@ -72,6 +77,7 @@ public CliDispatcher registerCommandHandler(String command, CommandMethodMetaInf throw E.invalidConfiguration("Command %s already registered", command); } addToRegistry(s, new CliHandlerProxy(classMetaInfo, methodMetaInfo, app())); + addRouterMapping(s, methodMetaInfo); logger.debug("Command registered: %s", s); } return this; @@ -232,6 +238,13 @@ private void addToRegistry(String name, CliHandler handler) { registerShortCut(name, handler); } + private void addRouterMapping(String name, CommandMethodMetaInfo methodMetaInfo) { + if (null != cmdRouter) { + String urlPath = S.concat("/~/cmd/~", name, "~"); + cmdRouter.addMapping(H.Method.GET, urlPath, methodMetaInfo.fullName()); + } + } + private void resolveCommandPrefix() { Map temp = new HashMap<>(registry); registry.clear(); diff --git a/src/main/java/act/cli/Command.java b/src/main/java/act/cli/Command.java index 58e29fa84..657bb9709 100644 --- a/src/main/java/act/cli/Command.java +++ b/src/main/java/act/cli/Command.java @@ -30,7 +30,7 @@ /** * Mark a class method as a console command */ -@Retention(RetentionPolicy.CLASS) +@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Command { /** diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index b1361f872..863013285 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -44,6 +44,7 @@ import act.handler.event.ResultEvent; import act.i18n.I18n; import act.internal.util.StrBufRetentionLimitCalculator; +import act.route.Router; import act.security.CSRFProtector; import act.session.*; import act.util.*; @@ -87,8 +88,9 @@ public class AppConfig extends Config impleme public static final String CONF_FILE_NAME = "app.conf"; public static final String CSRF_TOKEN_NAME = "__csrf__"; - public static final String PORT_CLI_OVER_HTTP = "__admin__"; - public static final String PORT_SYS = "__sys__"; + public static final String PORT_CLI_OVER_HTTP = Router.PORT_CLI_OVER_HTTP; + public static final String PORT_ADMIN = Router.PORT_ADMIN; + public static final String PORT_SYS = Router.PORT_SYS; private App app; @@ -818,7 +820,7 @@ protected T cliOverHttp(boolean enabled) { public boolean cliOverHttp() { if (null == cliOverHttp) { - cliOverHttp = get(CLI_OVER_HTTP, false); + cliOverHttp = get(CLI_OVER_HTTP, true); } return cliOverHttp; } diff --git a/src/main/java/act/conf/ConfAdmin.java b/src/main/java/act/conf/ConfAdmin.java index 7ecb5c002..7c9e5e71b 100644 --- a/src/main/java/act/conf/ConfAdmin.java +++ b/src/main/java/act/conf/ConfAdmin.java @@ -40,7 +40,6 @@ @UrlContext("conf") @Singleton @ExpressController -@Port({Router.PORT_DEFAULT, AppConfig.PORT_SYS}) public class ConfAdmin { @Inject @@ -86,12 +85,12 @@ public List list( return list; } - @Command("act.conf.trace-handler") + @Command(name = "act.conf.trace-handler", help = "disable enable TraceHandler") public void toggleTraceHandler(@Required boolean enabled) { appConfig.toggleTraceHandler(enabled); } - @Command("act.conf.trace-request") + @Command(name = "act.conf.trace-request", help = "disable enable request trace") public void toggleTraceRequest(@Required boolean enabled) { appConfig.toggleTraceRequest(enabled); } diff --git a/src/main/java/act/controller/Controller.java b/src/main/java/act/controller/Controller.java index cf730d886..6750886e0 100644 --- a/src/main/java/act/controller/Controller.java +++ b/src/main/java/act/controller/Controller.java @@ -2007,9 +2007,14 @@ public static Result inferResult(HandlerMethodMetaInfo meta, Object v, ActionCon } } boolean shouldUseToString = $$.shouldUseToString(vCls); - if (H.Format.HTML.isSameTypeWith(accept) && !shouldUseToString) { - requireJSON = true; - context.resp().contentType(H.Format.JSON); + if (!shouldUseToString && H.Format.HTML.isSameTypeWith(accept)) { + if (v instanceof Iterable) { + // for iterable raw html view make it default to HTML table + accept = H.Format.of("html-table"); + } else { + requireJSON = true; + context.resp().contentType(H.Format.JSON); + } } if (isSimpleType || shouldUseToString) { boolean isArray = vCls.isArray(); diff --git a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java index bd2909eb7..466658154 100644 --- a/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java +++ b/src/main/java/act/controller/bytecode/ControllerByteCodeScanner.java @@ -26,6 +26,7 @@ import act.asm.*; import act.asm.signature.SignatureReader; import act.asm.signature.SignatureVisitor; +import act.cli.Command; import act.conf.AppConfig; import act.controller.Controller; import act.controller.annotation.Port; @@ -106,12 +107,13 @@ private ControllerClassMetaInfoManager classInfoBase() { private class _ByteCodeVisitor extends ByteCodeVisitor { private String[] ports = {}; private Set methodNames = new HashSet<>(); + private Set methodNamesOfCli = new HashSet<>(); - private void checkMethodName(String methodName) { - if (methodNames.contains(methodName)) { + private void checkMethodName(String methodName, boolean cli) { + Set set = cli ? methodNamesOfCli : methodNames; + if (!set.add(methodName)) { throw AsmException.of("Duplicate action/interceptor method name found: %s", methodName); } - methodNames.add(methodName); } @Override @@ -338,6 +340,7 @@ private class ActionMethodVisitor extends MethodVisitor implements Opcodes { private String methodName; private String desc; private String signature; + private boolean isCmd; private boolean isStatic; private boolean requireScan; private boolean disableJsonCircularRefDetect; @@ -395,7 +398,8 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { return eav; } if (ControllerClassMetaInfo.isActionAnnotation(c)) { - checkMethodName(methodName); + isCmd = Command.class == c; + checkMethodName(methodName, isCmd); markRequireScan(); methodInfo = new ActionMethodMetaInfo(classInfo); classInfo.addAction((ActionMethodMetaInfo) methodInfo); @@ -406,7 +410,7 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { } else if (ControllerClassMetaInfo.isUrlContextAnnotation(c)) { return new MethodUrlContextAnnotationVisitor(av, ControllerClassMetaInfo.isUrlContextAnnotationSupportAbsolutePath(c)); } else if (ControllerClassMetaInfo.isInterceptorAnnotation(c)) { - checkMethodName(methodName); + checkMethodName(methodName, false); markRequireScan(); InterceptorAnnotationVisitor visitor = new InterceptorAnnotationVisitor(av, c); methodInfo = visitor.info; @@ -746,6 +750,15 @@ public ActionAnnotationVisitor(AnnotationVisitor av, H.Method method, boolean is this.noDefPath = noDefPath; } + // For @Command cli over http only + @Override + public void visit(String name, Object value) { + if ("value".equals(name) || "name".equals(name)) { + paths.add((String) value); + } + super.visit(name, value); + } + @Override public AnnotationVisitor visitArray(String name) { AnnotationVisitor av = super.visitArray(name); @@ -791,10 +804,16 @@ public void visitEnd() { } /* - * Note we need to schedule route registration after all app code scanned because we need the + * Note + * + * 1. we need to schedule route registration after all app code scanned because we need the * parent context information be set on class meta info, which is done after controller scanning + * + * 2. cmd handler will get add to router when registered to CliDispatcher */ - app().jobManager().on(SysEventId.APP_CODE_SCANNED, "ActionAnnotationVisitor:registerRoute-" + registerRouteTaskCounter.getAndIncrement(), new RouteRegister(envMatched, httpMethods, paths, methodName, routers, classInfo, classInfo.isAbstract() && !isStatic, isVirtual)); + if (!isCmd) { + app().jobManager().on(SysEventId.APP_CODE_SCANNED, "ActionAnnotationVisitor:registerRoute-" + registerRouteTaskCounter.getAndIncrement(), new RouteRegister(envMatched, httpMethods, paths, methodName, routers, classInfo, classInfo.isAbstract() && !isStatic, isVirtual)); + } } } diff --git a/src/main/java/act/controller/meta/ControllerClassMetaInfo.java b/src/main/java/act/controller/meta/ControllerClassMetaInfo.java index 2df329f89..964abd81d 100644 --- a/src/main/java/act/controller/meta/ControllerClassMetaInfo.java +++ b/src/main/java/act/controller/meta/ControllerClassMetaInfo.java @@ -26,6 +26,7 @@ import act.app.App; import act.app.AppClassLoader; import act.asm.Type; +import act.cli.Command; import act.controller.annotation.UrlContext; import act.handler.builtin.controller.ControllerAction; import act.handler.builtin.controller.Handler; @@ -515,7 +516,8 @@ public static void registerUrlContextAnnotation(ControllerPlugin.PathAnnotationS PutAction.class, H.Method.PUT, DeleteAction.class, H.Method.DELETE, PatchAction.class, H.Method.PATCH, - WsAction.class, H.Method.GET + WsAction.class, H.Method.GET, + Command.class, H.Method.GET ); private static final Set> NO_DEF_PATH_ACTIONS = new HashSet<>(); diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 3fc33e2bf..b437812be 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -56,6 +56,9 @@ public class Router extends AppHolderBase implements TreeNode { public static final String PORT_DEFAULT = "default"; + public static final String PORT_CLI_OVER_HTTP = "__cli__"; + public static final String PORT_ADMIN = "__admin__"; + public static final String PORT_SYS = "__sys__"; /** * A visitor can be passed to the router to traverse diff --git a/src/main/java/act/util/DataTable.java b/src/main/java/act/util/DataTable.java index e71117790..6a0ab5e6d 100644 --- a/src/main/java/act/util/DataTable.java +++ b/src/main/java/act/util/DataTable.java @@ -143,6 +143,8 @@ public List heading() { String idLabel = labelLookup.get("id"); if (null != idLabel) { heading.add(idLabel); + } else { + heading.add("ID"); } for (String colKey : colKeys) { if ("id".equals(colKey)) { @@ -356,7 +358,8 @@ private void initRows(Object data) { private void initHeading(Object data, PropertySpec.MetaInfo colSpec) { Set excludes = C.Set(); boolean headingLoaded = false; - if (null != colSpec) { + boolean colSpecPresented = null != colSpec; + if (colSpecPresented) { ActContext context = ActContext.Base.currentContext(); setLabelLookup(colSpec.labelMapping(context)); excludes = colSpec.excludedFields(context); @@ -366,6 +369,7 @@ private void initHeading(Object data, PropertySpec.MetaInfo colSpec) { headingLoaded = true; } } + colSpecPresented = $.bool(colKeys) || $.bool(excludes); } if (null == labelLookup) { setLabelLookup(C.newMap()); @@ -373,12 +377,12 @@ private void initHeading(Object data, PropertySpec.MetaInfo colSpec) { // explore data rows to probe fields E.illegalArgumentIf(0 == rowCount, "Unable to probe table heading: no data found"); int max = Math.min(rowCount, 10); // probe at most 10 rows of data for labels - SortedSet keys; + Set keys; if (isPojo()) { if (null == firstRow) { firstRow = rows.iterator().next(); } - keys = keysOf(firstRow); + keys = keysOf(firstRow, colSpecPresented); } else { keys = new TreeSet<>(); for (Object row : rows) { @@ -458,9 +462,9 @@ private boolean isNumeric(Class ft) { return Number.class.isAssignableFrom(ft); } - private SortedSet keysOf(Object pojo) { + private Set keysOf(Object pojo, boolean propSpecPresented) { Class type = pojo.getClass(); - SortedSet keys = new TreeSet<>(); + Set keys = propSpecPresented ? new LinkedHashSet() : new TreeSet(); if ($.isSimpleType(type)) { keys.add(KEY_THIS); return keys; diff --git a/src/main/java/act/util/ReflectedInvokerHelper.java b/src/main/java/act/util/ReflectedInvokerHelper.java index 546d327b6..459980bcc 100644 --- a/src/main/java/act/util/ReflectedInvokerHelper.java +++ b/src/main/java/act/util/ReflectedInvokerHelper.java @@ -23,6 +23,7 @@ import act.Act; import act.apidoc.ApiManager; import act.app.*; +import act.cli.Command; import act.inject.util.LoadConfig; import act.inject.util.LoadResource; import act.job.JobContext; @@ -69,7 +70,8 @@ public static Object tryGetSingleton(Class invokerClass, App app) { private static Set> ACTION_ANNO_TYPES = C.set( Action.class, GetAction.class, PostAction.class, PutAction.class, DeleteAction.class, PatchAction.class, WsAction.class, - Catch.class, Before.class, After.class, Finally.class + Catch.class, Before.class, After.class, Finally.class, + Command.class ); private static Map requestHandlerMethodParamAnnotationCache; From e9bf00d1925b3ca18f862dba06c00e6759cc42d6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 18 Feb 2020 21:15:03 +1100 Subject: [PATCH 598/730] Act-Test create sample data provider for `id` field #1300 --- CHANGELOG.md | 1 + .../java/act/apidoc/SampleDataCategory.java | 1 + .../act/apidoc/sampledata/IdIntProvider.java | 42 +++++++++++++++++++ .../act/apidoc/sampledata/IdLongProvider.java | 41 ++++++++++++++++++ .../apidoc/sampledata/IdStringProvider.java | 37 ++++++++++++++++ src/main/java/act/util/DataTable.java | 2 +- 6 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 src/main/java/act/apidoc/sampledata/IdIntProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/IdLongProvider.java create mode 100644 src/main/java/act/apidoc/sampledata/IdStringProvider.java diff --git a/CHANGELOG.md b/CHANGELOG.md index e53ecb6fe..132ba324c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.32** +* Act-Test create sample data provider for `id` field #1300 * When it rendering data in HTML table, the column heading does not follow `PropertySpec` specification #1299 * When requesting data from browser directly render the data using HTML table format if it is an `Iterable` #1298 * Automatically register all CLI command handler as Get request handler to CLI over HTTP port #1297 diff --git a/src/main/java/act/apidoc/SampleDataCategory.java b/src/main/java/act/apidoc/SampleDataCategory.java index 217ec3b6d..2fe2cd442 100644 --- a/src/main/java/act/apidoc/SampleDataCategory.java +++ b/src/main/java/act/apidoc/SampleDataCategory.java @@ -29,6 +29,7 @@ import java.util.Set; public enum SampleDataCategory implements ISampleDataCategory { + ID("id", "no"), FIRST_NAME("given name", "forename", "firstname", "fname"), LAST_NAME("surname", "family name", "lname", "lastname"), FULL_NAME("fullname"), diff --git a/src/main/java/act/apidoc/sampledata/IdIntProvider.java b/src/main/java/act/apidoc/sampledata/IdIntProvider.java new file mode 100644 index 000000000..1deba06c8 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/IdIntProvider.java @@ -0,0 +1,42 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2020 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; + +import javax.inject.Singleton; +import java.util.concurrent.atomic.AtomicInteger; + +@Singleton +@SampleData.Category(SampleDataCategory.ID) +public class IdIntProvider extends SampleDataProvider { + + private final AtomicInteger _id = new AtomicInteger(); + + @Override + public Integer get() { + return _id.incrementAndGet(); + } + +} diff --git a/src/main/java/act/apidoc/sampledata/IdLongProvider.java b/src/main/java/act/apidoc/sampledata/IdLongProvider.java new file mode 100644 index 000000000..48ff35618 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/IdLongProvider.java @@ -0,0 +1,41 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2020 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; + +import javax.inject.Singleton; +import java.util.concurrent.atomic.AtomicLong; + +@Singleton +@SampleData.Category(SampleDataCategory.ID) +public class IdLongProvider extends SampleDataProvider { + + private final AtomicLong _id = new AtomicLong(); + + @Override + public Long get() { + return _id.incrementAndGet(); + } + +} diff --git a/src/main/java/act/apidoc/sampledata/IdStringProvider.java b/src/main/java/act/apidoc/sampledata/IdStringProvider.java new file mode 100644 index 000000000..c14296120 --- /dev/null +++ b/src/main/java/act/apidoc/sampledata/IdStringProvider.java @@ -0,0 +1,37 @@ +package act.apidoc.sampledata; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2020 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.apidoc.SampleDataProvider; + +import javax.inject.Singleton; + +@Singleton +@SampleData.Category(SampleDataCategory.ID) +public class IdStringProvider extends SampleDataProvider { + @Override + public String get() { + return Act.cuid(); + } +} diff --git a/src/main/java/act/util/DataTable.java b/src/main/java/act/util/DataTable.java index 6a0ab5e6d..30bbba170 100644 --- a/src/main/java/act/util/DataTable.java +++ b/src/main/java/act/util/DataTable.java @@ -144,7 +144,7 @@ public List heading() { if (null != idLabel) { heading.add(idLabel); } else { - heading.add("ID"); + heading.add("id"); } for (String colKey : colKeys) { if ("id".equals(colKey)) { From 52de4cd8082c85ff818d5483eccb977764599f3e Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 18 Feb 2020 21:32:47 +1100 Subject: [PATCH 599/730] Act-Test - allow specify collection size when generating List/Set random collection #1301 --- CHANGELOG.md | 1 + src/main/java/act/apidoc/SampleData.java | 77 +++++++++++++++++++----- 2 files changed, 63 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 132ba324c..ca99761f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.32** +* Act-Test - allow specify collection size when generating List/Set random collection #1301 * Act-Test create sample data provider for `id` field #1300 * When it rendering data in HTML table, the column heading does not follow `PropertySpec` specification #1299 * When requesting data from browser directly render the data using HTML table format if it is an `Iterable` #1298 diff --git a/src/main/java/act/apidoc/SampleData.java b/src/main/java/act/apidoc/SampleData.java index 833bb396f..b5b2fe743 100644 --- a/src/main/java/act/apidoc/SampleData.java +++ b/src/main/java/act/apidoc/SampleData.java @@ -202,15 +202,15 @@ private static T generate( return (T) generateRandomSimpleTypedValue(spec); } else if (spec.isArray()) { BeanSpec elementSpec = spec.componentSpec(); - List list = generateList(elementSpec, category, typeParamLookup, typeChain, nameChain); + List list = generateList(elementSpec, category, typeParamLookup, typeChain, nameChain, randCollectionSize()); Object[] array = (Object[]) Array.newInstance(elementSpec.rawType(), list.size()); return (T) list.toArray(array); } else if (spec.isList()) { BeanSpec elementSpec = spec.componentSpec(); - return (T) generateList(elementSpec, category, typeParamLookup, typeChain, nameChain); + return (T) generateList(elementSpec, category, typeParamLookup, typeChain, nameChain, randCollectionSize()); } else if (spec.isSet()) { BeanSpec elementSpec = spec.componentSpec(); - return (T) generateSet(elementSpec, category, typeParamLookup, typeChain, nameChain); + return (T) generateSet(elementSpec, category, typeParamLookup, typeChain, nameChain, randCollectionSize()); } else if (File.class.isAssignableFrom(spec.rawType())) { return (T) new File("/path/to/upload/file"); } else if (ISObject.class.isAssignableFrom(spec.rawType())) { @@ -229,25 +229,46 @@ public static List generateList(Class elementType) { return generateList(elementType, category); } + public static List generateList(Class elementType, int sz) { + ISampleDataCategory category = null; + return generateList(elementType, category, sz); + } + public static List generateList(Class elementType, String name) { return generateList(elementType, SampleDataCategoryManager.get(name)); } + public static List generateList(Class elementType, String name, int sz) { + return generateList(elementType, SampleDataCategoryManager.get(name), sz); + } + public static List generateList(BeanSpec elementSpec, String name) { return generateList(elementSpec, SampleDataCategoryManager.get(name)); } + public static List generateList(BeanSpec elementSpec, String name, int sz) { + return generateList(elementSpec, SampleDataCategoryManager.get(name), sz); + } + public static List generateList(Class elementType, ISampleDataCategory category) { return generateList(BeanSpec.of(elementType, Act.injector()), category); } + public static List generateList(Class elementType, ISampleDataCategory category, int sz) { + return generateList(BeanSpec.of(elementType, Act.injector()), category, sz); + } + public static List generateList(BeanSpec elementSpec, ISampleDataCategory category) { + return generateList(elementSpec, category, randCollectionSize()); + } + + public static List generateList(BeanSpec elementSpec, ISampleDataCategory category, int sz) { Class elementType = elementSpec.rawType(); Map typeParamLookup = C.Map(); if (elementType.getGenericSuperclass() instanceof ParameterizedType) { typeParamLookup = Generics.buildTypeParamImplLookup(elementType); } - return generateList(elementSpec, category, typeParamLookup, new HashSet(), new LinkedList()); + return generateList(elementSpec, category, typeParamLookup, new HashSet(), new LinkedList(), sz); } private static List generateList( @@ -255,35 +276,56 @@ private static List generateList( ISampleDataCategory category, Map typeParamLookup, Set typeChain, - Deque nameChain + Deque nameChain, + int sz ) { - return generateCollection(elementSpec, new ArrayList(), category, typeParamLookup, typeChain, nameChain); + return generateCollection(elementSpec, new ArrayList(), category, typeParamLookup, typeChain, nameChain, sz); } public static Set generateSet(Class elementType) { + return generateSet(elementType, randCollectionSize()); + } + + public static Set generateSet(Class elementType, int sz) { ISampleDataCategory category = null; - return generateSet(elementType, category); + return generateSet(elementType, category, sz); } public static Set generateSet(Class elementType, String name) { - return generateSet(elementType, SampleDataCategoryManager.get(name)); + return generateSet(elementType, name, randCollectionSize()); + } + + public static Set generateSet(Class elementType, String name, int sz) { + return generateSet(elementType, SampleDataCategoryManager.get(name), sz); } public static Set generateSet(BeanSpec elementSpec, String name) { - return generateSet(elementSpec, SampleDataCategoryManager.get(name)); + return generateSet(elementSpec, name, randCollectionSize()); + } + + public static Set generateSet(BeanSpec elementSpec, String name, int sz) { + return generateSet(elementSpec, SampleDataCategoryManager.get(name), sz); } public static Set generateSet(Class elementType, ISampleDataCategory category) { - return generateSet(BeanSpec.of(elementType, Act.injector()), category); + return generateSet(elementType, category, randCollectionSize()); + } + + public static Set generateSet(Class elementType, ISampleDataCategory category, int sz) { + return generateSet(BeanSpec.of(elementType, Act.injector()), category, sz); } public static Set generateSet(BeanSpec elementSpec, ISampleDataCategory category) { + return generateSet(elementSpec, category, randCollectionSize()); + } + + public static Set generateSet(BeanSpec elementSpec, ISampleDataCategory category, int sz) { Class elementType = elementSpec.rawType(); Map typeParamLookup = C.Map(); if (elementType.getGenericSuperclass() instanceof ParameterizedType) { typeParamLookup = Generics.buildTypeParamImplLookup(elementType); } - return generateSet(elementSpec, category, typeParamLookup, new HashSet(), new LinkedList()); + return generateSet(elementSpec, category, typeParamLookup, new HashSet(), new LinkedList(), sz); } private static Set generateSet( @@ -291,9 +333,10 @@ private static Set generateSet( ISampleDataCategory category, Map typeParamLookup, Set typeChain, - Deque nameChain + Deque nameChain, + int sz ) { - return generateCollection(elementSpec, new HashSet(), category, typeParamLookup, typeChain, nameChain); + return generateCollection(elementSpec, new HashSet(), category, typeParamLookup, typeChain, nameChain, sz); } public static Map generateMap(Class keyType, Class valType, String name) { @@ -426,9 +469,9 @@ private static > C generateCollection( ISampleDataCategory category, Map typeParamLookup, Set typeChain, - Deque nameChain + Deque nameChain, + int sz ) { - int sz = N.randInt(2, 5); if (!nameChain.isEmpty()) { String lastName = nameChain.pop(); nameChain.push(S.singularize(lastName)); @@ -471,5 +514,9 @@ private static ISampleDataCategory categoryOf(AnnotatedElement annotatedElement, } return categoryManager.getCategory(name); } + + private static int randCollectionSize() { + return N.randInt(3, 7); + } } From 3a27666b29f965749de712cd7847b925ce81043f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Thu, 27 Feb 2020 15:42:08 +1100 Subject: [PATCH 600/730] =?UTF-8?q?Allow=20access=20CLI=20over=20HTTP=20#1?= =?UTF-8?q?30=EF=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + pom.xml | 2 +- src/main/java/act/SysUtilAdmin.java | 6 +- src/main/java/act/apidoc/SampleData.java | 33 +++- src/main/java/act/cli/CliCmdInfo.java | 5 + src/main/java/act/cli/CliDispatcher.java | 40 ++++- src/main/java/act/cli/builtin/Help.java | 2 +- src/main/java/act/conf/AppConfig.java | 17 +++ src/main/java/act/conf/AppConfigKey.java | 8 + .../act/controller/builtin/CliOverHttp.java | 6 +- .../java/act/controller/builtin/HelpPage.java | 144 ++++++++++++++++++ .../handler/builtin/cli/CliHandlerProxy.java | 5 + .../impl/ReflectedHandlerInvoker.java | 23 ++- .../java/act/inject/HeaderValueLoader.java | 45 ++++++ src/main/java/act/inject/HeaderVariable.java | 5 + .../java/act/inject/SessionValueLoader.java | 45 ++++++ src/main/java/act/inject/SessionVariable.java | 4 + .../inject/param/ParamValueLoaderService.java | 7 +- src/main/java/act/job/JobAdmin.java | 2 +- src/main/java/act/util/DataTable.java | 16 +- src/main/resources/act.scan.list | 1 + .../asset/~act/css/act_data_table.css | 3 + src/main/resources/rythm/~cmd_help.html | 95 ++++++++++++ src/main/resources/rythm/~cmd_index.html | 42 +++++ src/main/resources/rythm/~table.html | 9 +- src/main/resources/rythm/~table_page.html | 4 +- 26 files changed, 545 insertions(+), 25 deletions(-) create mode 100644 src/main/java/act/controller/builtin/HelpPage.java create mode 100644 src/main/java/act/inject/HeaderValueLoader.java create mode 100644 src/main/java/act/inject/SessionValueLoader.java create mode 100644 src/main/resources/rythm/~cmd_help.html create mode 100644 src/main/resources/rythm/~cmd_index.html diff --git a/CHANGELOG.md b/CHANGELOG.md index ca99761f1..414bd8bd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.32** +* Allow access CLI over HTTP #1305 * Act-Test - allow specify collection size when generating List/Set random collection #1301 * Act-Test create sample data provider for `id` field #1300 * When it rendering data in HTML table, the column heading does not follow `PropertySpec` specification #1299 diff --git a/pom.xml b/pom.xml index 8a3ff5d52..8496caa92 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ 1.2.62 1.1.2 0.7 - 1.16 + 1.18 2.4.0 1 1.5.0-b01 diff --git a/src/main/java/act/SysUtilAdmin.java b/src/main/java/act/SysUtilAdmin.java index 5fc4aba63..63564975a 100644 --- a/src/main/java/act/SysUtilAdmin.java +++ b/src/main/java/act/SysUtilAdmin.java @@ -139,7 +139,7 @@ public void gc(CliContext context) { @Command(name = "act.pwd", help = "Print name of the current working directory") public String pwd() { - return pwd(context).getAbsolutePath(); + return _pwd(context).getAbsolutePath(); } @Command(name = "act.ls, act.dir, act.ll", help = "List files in the current working directory") @@ -246,10 +246,10 @@ private File getFile(String path) { } private File curDir() { - return pwd(context); + return _pwd(context); } - private static File pwd(CliContext context) { + private static File _pwd(CliContext context) { return context.curDir(); } diff --git a/src/main/java/act/apidoc/SampleData.java b/src/main/java/act/apidoc/SampleData.java index b5b2fe743..69f3af215 100644 --- a/src/main/java/act/apidoc/SampleData.java +++ b/src/main/java/act/apidoc/SampleData.java @@ -40,6 +40,7 @@ import java.lang.annotation.*; import java.lang.reflect.*; import java.util.*; +import java.util.concurrent.DelayQueue; /** * Namespace @@ -211,6 +212,15 @@ private static T generate( } else if (spec.isSet()) { BeanSpec elementSpec = spec.componentSpec(); return (T) generateSet(elementSpec, category, typeParamLookup, typeChain, nameChain, randCollectionSize()); + } else if (spec.isMap()) { + List typeParams = spec.typeParams(); + if (typeParams.size() < 2) { + return (T) Act.getInstance(spec.rawType()); + } + BeanSpec keySpec = spec.componentSpec(); + BeanSpec valSpec = BeanSpec.of(typeParams.get(0), Act.injector()); + Map map = (Map) Act.getInstance(spec.rawType()); + return (T) generateMap(keySpec, valSpec, map, typeParamLookup, typeChain, nameChain, randCollectionSize()); } else if (File.class.isAssignableFrom(spec.rawType())) { return (T) new File("/path/to/upload/file"); } else if (ISObject.class.isAssignableFrom(spec.rawType())) { @@ -354,6 +364,27 @@ public static Map generateMap(Class keyType, Class valType, I return map; } + private static Map generateMap( + BeanSpec keySpec, + BeanSpec valSpec, + Map map, + Map typeParamLookup, + Set typeChain, + Deque nameChain, + int sz + ) { + if (!nameChain.isEmpty()) { + String lastName = nameChain.pop(); + nameChain.push(S.singularize(lastName)); + } + for (int i = 0; i < sz; ++i) { + K k = generate(keySpec, null, typeParamLookup, typeChain, nameChain); + V v = generate(valSpec, null, typeParamLookup, typeChain, nameChain); + map.put(k, v); + } + return map; + } + private static Object generateRandomSimpleTypedValue(BeanSpec spec) { Class classType = spec.rawType(); if (classType.isEnum()) { @@ -516,7 +547,7 @@ private static ISampleDataCategory categoryOf(AnnotatedElement annotatedElement, } private static int randCollectionSize() { - return N.randInt(3, 7); + return N.randInt(3, 17); } } diff --git a/src/main/java/act/cli/CliCmdInfo.java b/src/main/java/act/cli/CliCmdInfo.java index 858563a7f..6ade44cdb 100644 --- a/src/main/java/act/cli/CliCmdInfo.java +++ b/src/main/java/act/cli/CliCmdInfo.java @@ -22,11 +22,16 @@ import org.osgl.util.S; +import java.util.Map; + public class CliCmdInfo implements Comparable { public String name; public String shortcut; public String help = ""; + public Map params; + public boolean hasReturnValue; + public boolean requireCliContext; public String nameAndShortcut() { return S.buffer(name).a("(").a(shortcut).a(")").toString(); diff --git a/src/main/java/act/cli/CliDispatcher.java b/src/main/java/act/cli/CliDispatcher.java index d58459df2..64db7bbae 100644 --- a/src/main/java/act/cli/CliDispatcher.java +++ b/src/main/java/act/cli/CliDispatcher.java @@ -58,16 +58,52 @@ public class CliDispatcher extends AppServiceBase { private Map> shortCutMap = new HashMap<>(); private Router cmdRouter; + private Router defRouter; public CliDispatcher(App app) { super(app); cmdRouter = app.cliOverHttpRouter(); + if (app.isDev()) { + defRouter = app.router(); + } app.jobManager().now(new Runnable() { @Override public void run() { registerBuiltInHandlers(); } }); + app.jobManager().beforeAppStart(new Runnable() { + @Override + public void run() { + for (Map.Entry entry : registry.entrySet()) { + Keyword keyword = entry.getKey(); + CliHandler handler = entry.getValue(); + if (handler instanceof CliHandlerProxy) { + CliHandlerProxy proxy = $.cast((handler)); + CommandMethodMetaInfo methodMetaInfo = proxy.methodMetaInfo(); + String handlerName = methodMetaInfo.fullName(); + Set variations = new TreeSet<>(); + variations.add(keyword.kebabCase()); + variations.add(keyword.snakeCase()); + variations.add(keyword.javaVariable()); + variations.add(keyword.dotted()); + for (String s : variations) { + S.Buffer buf = S.buffer(); + if (!handlerName.startsWith("act.")) { + buf.a("/~/cmd/run/"); + } else { + buf.a("/cmd/run/"); + } + String urlPath = buf.a(s).toString(); + cmdRouter.addMapping(H.Method.GET, urlPath, handlerName); + if (null != defRouter) { + defRouter.addMapping(H.Method.GET, urlPath, handlerName); + } + } + } + } + } + }); } public CliDispatcher registerCommandHandler(String command, CommandMethodMetaInfo methodMetaInfo, CommanderClassMetaInfo classMetaInfo) { @@ -77,7 +113,6 @@ public CliDispatcher registerCommandHandler(String command, CommandMethodMetaInf throw E.invalidConfiguration("Command %s already registered", command); } addToRegistry(s, new CliHandlerProxy(classMetaInfo, methodMetaInfo, app())); - addRouterMapping(s, methodMetaInfo); logger.debug("Command registered: %s", s); } return this; @@ -240,7 +275,8 @@ private void addToRegistry(String name, CliHandler handler) { private void addRouterMapping(String name, CommandMethodMetaInfo methodMetaInfo) { if (null != cmdRouter) { - String urlPath = S.concat("/~/cmd/~", name, "~"); + String handlerName = methodMetaInfo.fullName(); + String urlPath = S.concat("~/cmd/run/", name); cmdRouter.addMapping(H.Method.GET, urlPath, methodMetaInfo.fullName()); } } diff --git a/src/main/java/act/cli/builtin/Help.java b/src/main/java/act/cli/builtin/Help.java index d8a84956c..719a085f8 100644 --- a/src/main/java/act/cli/builtin/Help.java +++ b/src/main/java/act/cli/builtin/Help.java @@ -170,7 +170,7 @@ public boolean showHelp(String command, CliContext context) { if (names.size() > 1) { lines.add(""); - lines.add("@|Aliases|@: " + S.join(", ", C.list(names).tail())); + lines.add("@|bold Aliases|@: " + S.join(", ", C.list(names).tail())); } List shortCuts = dispatcher.shortCuts(handler); diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 863013285..d4a321880 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -1509,6 +1509,23 @@ private void _mergeLocaleCookieName(AppConfig conf) { } } + private Boolean mockServer; + protected T mockServer(boolean enabled) { + mockServer = enabled; + return me(); + } + public boolean mockServer() { + if (null == mockServer) { + mockServer = get(MOCK_SERVER_ENABLED, app.isDev()); + } + return mockServer; + } + private void _mergeMockServer(AppConfig config) { + if (!hasConfiguration(MOCK_SERVER_ENABLED)) { + mockServer = config.mockServer; + } + } + Integer ipEffectiveBytes; protected T ipEffectiveBytes(int n) { diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index 052f5b526..f5e267699 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -782,6 +782,14 @@ public T val(Map configuration) { */ METRIC_ENABLED("metric.enabled"), + /** + * `mock-server.enabled` + * Turn on/off mock data to API endpoint + * + * Default value: `true` when run in Dev mode, `false` otherwise + */ + MOCK_SERVER_ENABLED("mock-server.enabled"), + /** * {@code act.modules} * diff --git a/src/main/java/act/controller/builtin/CliOverHttp.java b/src/main/java/act/controller/builtin/CliOverHttp.java index 6b486987e..c76b6fe88 100644 --- a/src/main/java/act/controller/builtin/CliOverHttp.java +++ b/src/main/java/act/controller/builtin/CliOverHttp.java @@ -27,6 +27,8 @@ import act.cli.CliOverHttpContext; import act.conf.AppConfig; import act.controller.Controller; +import act.controller.annotation.Port; +import act.controller.annotation.UrlContext; import act.handler.CliHandler; import org.osgl.http.H; import org.osgl.mvc.annotation.Before; @@ -45,7 +47,9 @@ /** * Handles CLI over http requests */ -@Controller(port = AppConfig.PORT_CLI_OVER_HTTP) +@Deprecated +@UrlContext("cli") +@Port(AppConfig.PORT_CLI_OVER_HTTP) public class CliOverHttp { private static final int MRU_LIMIT = 8; diff --git a/src/main/java/act/controller/builtin/HelpPage.java b/src/main/java/act/controller/builtin/HelpPage.java new file mode 100644 index 000000000..d45767075 --- /dev/null +++ b/src/main/java/act/controller/builtin/HelpPage.java @@ -0,0 +1,144 @@ +package act.controller.builtin; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2020 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.App; +import act.cli.*; +import act.conf.AppConfig; +import act.controller.annotation.Port; +import act.controller.annotation.UrlContext; +import act.handler.CliHandler; +import act.handler.builtin.cli.CliHandlerProxy; +import act.util.Stateless; +import org.osgl.$; +import org.osgl.mvc.annotation.Before; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.E; +import org.osgl.util.S; + +import javax.inject.Inject; +import javax.inject.Named; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeMap; + +import static act.controller.Controller.Util.*; + +/** + * Display CLI help page + */ +@UrlContext("cmd") +@Stateless +@Port({AppConfig.PORT_CLI_OVER_HTTP, "default"}) +public class HelpPage { + + @Inject + private CliDispatcher dispatcher; + + @Before + public void ensureNonDevMode(App app) { + notFoundIf(app.isProd()); + } + + @GetAction + public void index() { + SortedSet sysCommands = dispatcher.commandInfoList(true, false); + SortedSet appCommands = dispatcher.commandInfoList(false, true); + render("~cmd_index.html", sysCommands, appCommands); + } + + @GetAction("{cmdName}") + public void help(String cmdName) { + CliHandler handler = dispatcher.handler(cmdName); + notFoundIfNull(handler); + CliCmdInfo cmd = getCmdInfo(handler); + notFoundIfNull(cmd); + cmd.name = cmdName; + render("~cmd_help.html", cmd); + } + + private CliCmdInfo getCmdInfo(CliHandler handler) { + if (handler instanceof CliHandlerProxy) { + return getCmdInfo((CliHandlerProxy) handler); + } else { + return null; + } + } + + private CliCmdInfo getCmdInfo(CliHandlerProxy proxy) { + CliCmdInfo info = new CliCmdInfo(); + info.help = proxy.commandLine().right(); + info.params = getCmdParamInfo(proxy); + return info; + } + + private Map getCmdParamInfo(CliHandlerProxy proxy) { + CommandExecutor executor = proxy.executor(); + Class host = $.getProperty(executor, "commanderClass"); + Method method = $.getProperty(executor, "method"); + Map map = new TreeMap<>(); + Class[] paramTypes = method.getParameterTypes(); + Annotation[][] paramAnns = method.getParameterAnnotations(); + for (int i = 0; i < paramTypes.length; ++i) { + Class pt = paramTypes[i]; + Named named = _getAnno(paramAnns, i, Named.class); + E.unexpectedIf(null == named, "Cannot find name of the param: %s.%s(%s|%s)", host.getSimpleName(), method.getName(), i, pt.getSimpleName()); + String pn = named.value(); + Required required = _getAnno(paramAnns, i, Required.class); + if (null != required) { + map.put(pn, helpOf(required)); + } else { + Optional optional = _getAnno(paramAnns, i, Optional.class); + if (null != optional) { + String help = helpOf(optional); + map.put(pn, help); + } else { + map.put(pn, "no help"); + } + } + } + return map; + } + + private static String helpOf(Required required) { + String help = required.help(); + return S.blank(help) ? required.value() : help; + } + + private static String helpOf(Optional optional) { + String help = optional.help(); + return S.blank(help) ? optional.value() : help; + } + + private T _getAnno(Annotation[][] paramAnnotations, int paramIndex, Class annoType) { + Annotation[] pas = paramAnnotations[paramIndex]; + for (int j = 0; j < pas.length; ++j) { + Annotation pa = pas[j]; + if (annoType.isAssignableFrom(pa.annotationType())) { + return (T) pa; + } + } + return null; + } + +} diff --git a/src/main/java/act/handler/builtin/cli/CliHandlerProxy.java b/src/main/java/act/handler/builtin/cli/CliHandlerProxy.java index 76bbaa66b..6dc98d5c0 100644 --- a/src/main/java/act/handler/builtin/cli/CliHandlerProxy.java +++ b/src/main/java/act/handler/builtin/cli/CliHandlerProxy.java @@ -110,6 +110,11 @@ public void handle(CliContext context) { return methodMetaInfo.options(classMetaInfo, app.classLoader()); } + public CommandExecutor executor() { + ensureAgentsReady(); + return executor; + } + @SuppressWarnings("unchecked") private void onResult(Object result, CliContext context) throws Exception { if (null == result) { diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 644e8b40b..c0d85807a 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -22,10 +22,12 @@ import static act.app.ActionContext.State.HANDLING; import static act.app.ActionContext.State.INTERCEPTING; +import static org.osgl.util.Generics.buildTypeParamImplLookup; import act.Act; import act.Trace; import act.annotations.*; +import act.apidoc.SampleData; import act.app.*; import act.cli.ReportProgress; import act.conf.AppConfig; @@ -62,6 +64,7 @@ import org.osgl.$; import org.osgl.Lang; import org.osgl.exception.NotAppliedException; +import org.osgl.exception.ToBeImplemented; import org.osgl.http.H; import org.osgl.inject.BeanSpec; import org.osgl.mvc.annotation.*; @@ -87,6 +90,7 @@ public class ReflectedHandlerInvoker extends Lo implements ActionHandlerInvoker, AfterInterceptorInvoker, ExceptionInterceptorInvoker { private static final Object[] DUMP_PARAMS = new Object[0]; + private boolean mock; private App app; private AppConfig config; private ControllerClassMetaInfo controller; @@ -177,6 +181,7 @@ public void visit(H.Format format) throws $.Break { private ReflectedHandlerInvoker(M handlerMetaInfo, App app) { this.app = app; this.config = app.config(); + this.mock = config.mockServer(); this.handler = handlerMetaInfo; this.controller = handlerMetaInfo.classInfo(); this.controllerClass = app.classForName(controller.className()); @@ -1083,6 +1088,14 @@ private void initOutputVariables() { } } + private Object mockReturn() { + if (returnType == Void.class || returnType == void.class) { + return null; + } + BeanSpec returnSpec = BeanSpec.of(method.getGenericReturnType(), Act.injector()); + return SampleData.generate(returnSpec, null); + } + private Result invoke(M handlerMetaInfo, ActionContext context, Object controller, Object[] params) { Object retVal; String invocationInfo = null; @@ -1105,7 +1118,15 @@ private Result invoke(M handlerMetaInfo, ActionContext context, Object controlle private Object invoke(ActionContext context, Object controller, Object[] params) { Object retVal; - retVal = null == methodAccess ? $.invokeStatic(method, params) : methodAccess.invoke(controller, handlerIndex, params); + try { + retVal = null == methodAccess ? $.invokeStatic(method, params) : methodAccess.invoke(controller, handlerIndex, params); + } catch (ToBeImplemented e) { + if (mock) { + retVal = mockReturn(); + } else { + throw e; + } + } if (returnString && context.acceptJson()) { retVal = null == retVal ? null : ensureValidJson(S.string(retVal)); } diff --git a/src/main/java/act/inject/HeaderValueLoader.java b/src/main/java/act/inject/HeaderValueLoader.java new file mode 100644 index 000000000..cce492415 --- /dev/null +++ b/src/main/java/act/inject/HeaderValueLoader.java @@ -0,0 +1,45 @@ +package act.inject; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2020 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.ActionContext; +import org.osgl.inject.BeanSpec; +import org.osgl.inject.ValueLoader; +import org.osgl.util.E; + +import java.util.Map; + +public class HeaderValueLoader implements ValueLoader { + + private String headerName; + + @Override + public void init(Map map, BeanSpec beanSpec) { + this.headerName = (String) map.get("value"); + } + + @Override + public String get() { + ActionContext ctx = ActionContext.current(); + E.illegalStateIf(null == ctx, "Not in request handling context"); + return ctx.req().header(headerName); + } +} diff --git a/src/main/java/act/inject/HeaderVariable.java b/src/main/java/act/inject/HeaderVariable.java index b3d4178dc..ea411cde5 100644 --- a/src/main/java/act/inject/HeaderVariable.java +++ b/src/main/java/act/inject/HeaderVariable.java @@ -20,6 +20,9 @@ * #L% */ +import org.osgl.inject.annotation.InjectTag; +import org.osgl.inject.annotation.LoadValue; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -29,6 +32,8 @@ * Indicate binding from a {@link org.osgl.http.H.Header} to a controller field or action handler * parameter */ +@InjectTag +@LoadValue(HeaderValueLoader.class) @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER, ElementType.FIELD}) public @interface HeaderVariable { diff --git a/src/main/java/act/inject/SessionValueLoader.java b/src/main/java/act/inject/SessionValueLoader.java new file mode 100644 index 000000000..dcc7980ab --- /dev/null +++ b/src/main/java/act/inject/SessionValueLoader.java @@ -0,0 +1,45 @@ +package act.inject; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2020 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.ActionContext; +import org.osgl.inject.BeanSpec; +import org.osgl.inject.ValueLoader; +import org.osgl.util.E; + +import java.util.Map; + +public class SessionValueLoader implements ValueLoader { + + private String sessionKey; + + @Override + public void init(Map map, BeanSpec beanSpec) { + this.sessionKey = (String) map.get("value"); + } + + @Override + public String get() { + ActionContext ctx = ActionContext.current(); + E.illegalStateIf(null == ctx, "Not in request handling context"); + return ctx.session(sessionKey); + } +} diff --git a/src/main/java/act/inject/SessionVariable.java b/src/main/java/act/inject/SessionVariable.java index c33999fba..22aecf078 100644 --- a/src/main/java/act/inject/SessionVariable.java +++ b/src/main/java/act/inject/SessionVariable.java @@ -21,6 +21,8 @@ */ import act.cli.CliSession; +import org.osgl.inject.annotation.InjectTag; +import org.osgl.inject.annotation.LoadValue; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -36,6 +38,8 @@ * parameter */ @Qualifier +@InjectTag +@LoadValue(SessionValueLoader.class) @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER, ElementType.FIELD}) public @interface SessionVariable { diff --git a/src/main/java/act/inject/param/ParamValueLoaderService.java b/src/main/java/act/inject/param/ParamValueLoaderService.java index 1423b3159..4feb53192 100644 --- a/src/main/java/act/inject/param/ParamValueLoaderService.java +++ b/src/main/java/act/inject/param/ParamValueLoaderService.java @@ -125,7 +125,7 @@ protected void releaseResources() { noBindCache.clear(); } - public Object loadHostBean(Class beanClass, ActContext ctx) { + public ParamValueLoader hostBeanLoader(Class beanClass) { ParamValueLoader loader = classRegistry.get(beanClass); if (null == loader) { ParamValueLoader newLoader = findBeanLoader(beanClass); @@ -134,6 +134,11 @@ public Object loadHostBean(Class beanClass, ActContext ctx) { loader = newLoader; } } + return loader; + } + + public Object loadHostBean(Class beanClass, ActContext ctx) { + ParamValueLoader loader = hostBeanLoader(beanClass); return loader.load(null, ctx, false); } diff --git a/src/main/java/act/job/JobAdmin.java b/src/main/java/act/job/JobAdmin.java index 0d8c425a9..bbd7a469e 100644 --- a/src/main/java/act/job/JobAdmin.java +++ b/src/main/java/act/job/JobAdmin.java @@ -64,7 +64,7 @@ public int compare(Job o1, Job o2) { @Command(value = "act.job.list,act.job,act.jobs", help = "List jobs") @PropertySpec(Job.BRIEF_VIEW) @TableView - public List listJobs(@Optional(lead = "-q") final String q, JobManager jobManager) { + public List listJobs(@Optional(lead = "-q", help = "search string") final String q, JobManager jobManager) { C.List jobs = jobManager.jobs().append(jobManager.virtualJobs()).unique(_UNIQ_JOB_FILTER); if (S.notBlank(q)) { jobs = jobs.filter(new $.Predicate() { diff --git a/src/main/java/act/util/DataTable.java b/src/main/java/act/util/DataTable.java index 30bbba170..6f1291df6 100644 --- a/src/main/java/act/util/DataTable.java +++ b/src/main/java/act/util/DataTable.java @@ -140,16 +140,16 @@ public List heading() { return colKeys; } List heading = new ArrayList<>(); - String idLabel = labelLookup.get("id"); - if (null != idLabel) { - heading.add(idLabel); - } else { - heading.add("id"); + List colKeys = new ArrayList(this.colKeys); + if (colKeys.remove("id")) { + String idLabel = labelLookup.get("id"); + if (null != idLabel) { + heading.add(idLabel); + } else { + heading.add("id"); + } } for (String colKey : colKeys) { - if ("id".equals(colKey)) { - continue; - } String label = labelLookup.get(colKey); heading.add(null != label ? label : colKey); } diff --git a/src/main/resources/act.scan.list b/src/main/resources/act.scan.list index af334ca69..2f5dcfcb8 100644 --- a/src/main/resources/act.scan.list +++ b/src/main/resources/act.scan.list @@ -7,6 +7,7 @@ act.app.util.SimpleRestfulServiceBase act.app.conf.AppConfigPlugin act.controller.builtin.CliOverHttp act.controller.captcha.CaptchaService +act.controller.builtin.HelpPage act.db.DbBind act.db.util.Page act.test.Test diff --git a/src/main/resources/asset/~act/css/act_data_table.css b/src/main/resources/asset/~act/css/act_data_table.css index ba423c73d..a05ff0667 100644 --- a/src/main/resources/asset/~act/css/act_data_table.css +++ b/src/main/resources/asset/~act/css/act_data_table.css @@ -28,6 +28,9 @@ table.act_data_table, table.act_data_table td { } table.act_data_table td { padding: 5px; + max-width: 500px; + text-overflow: ellipsis; + overflow-x: hidden; } .act_data_table_right { text-align: right diff --git a/src/main/resources/rythm/~cmd_help.html b/src/main/resources/rythm/~cmd_help.html new file mode 100644 index 000000000..26e257601 --- /dev/null +++ b/src/main/resources/rythm/~cmd_help.html @@ -0,0 +1,95 @@ + +@import act.cli.* +@args CliCmdInfo cmd + + + CLI Help - @cmd.name + + + + + +

                                                                                                                                                                              CLI Help - @cmd.name

                                                                                                                                                                              +
                                                                                                                                                                              + @cmd.help +
                                                                                                                                                                              +

                                                                                                                                                                              Parameters

                                                                                                                                                                              +
                                                                                                                                                                                + @for(String param: cmd.params.keySet()) { +
                                                                                                                                                                              • + + +
                                                                                                                                                                              • + } +
                                                                                                                                                                              +Run +  +Index + + + diff --git a/src/main/resources/rythm/~cmd_index.html b/src/main/resources/rythm/~cmd_index.html new file mode 100644 index 000000000..8a11156ab --- /dev/null +++ b/src/main/resources/rythm/~cmd_index.html @@ -0,0 +1,42 @@ + +@import act.cli.* +@args Set appCommands, Set sysCommands + + + CLI Help + + + + +@def listCommands(Set cmds) { +
                                                                                                                                                                              Date: Sun, 9 Feb 2020 21:32:27 +1100 Subject: [PATCH 592/730] API doc - improve sample data generation for ISObject type #1289; HTML table view - make table header sticky at the top #1290 --- CHANGELOG.md | 2 + src/main/java/act/apidoc/ApiManager.java | 8 ++++ src/main/java/act/apidoc/Endpoint.java | 34 ++++++++++----- src/main/java/act/apidoc/SampleData.java | 7 +++ .../impl/ReflectedHandlerInvoker.java | 4 ++ .../java/act/util/FastJsonFileSerializer.java | 43 +++++++++++++++++++ .../act/util/FastJsonSObjectSerializer.java | 43 +++++++++++++++++++ src/main/java/act/util/LogSupport.java | 4 ++ .../asset/~act/css/act_data_table.css | 5 +++ src/main/resources/rythm/~table_page.html | 3 -- 10 files changed, 139 insertions(+), 14 deletions(-) create mode 100644 src/main/java/act/util/FastJsonFileSerializer.java create mode 100644 src/main/java/act/util/FastJsonSObjectSerializer.java diff --git a/CHANGELOG.md b/CHANGELOG.md index e0d77a5a7..ad3f17147 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # ActFramework Change Log **1.8.32** +* API Doc - improve sample data generation for `ISObject` type #1289 +* HTML table view - make table header sticky at the top #1290 * async request handling - render report using cached accept type #1287 * Async endpoint result page style needs to be updated #1285 * API doc - URL path variable in POST endpoint info is incorrect #1284 diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index b6b7f6b08..1bfd2a5c6 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -36,8 +36,11 @@ import act.inject.util.ResourceLoader; import act.route.RouteSource; import act.route.Router; +import act.util.FastJsonFileSerializer; +import act.util.FastJsonSObjectSerializer; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializeConfig; import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.NamedNode; @@ -52,6 +55,8 @@ import org.osgl.http.H; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; +import org.osgl.storage.ISObject; +import org.osgl.storage.impl.SObject; import org.osgl.util.*; import java.io.File; @@ -143,6 +148,9 @@ public void load(App app) { Set controllerClasses = new HashSet<>(); ApiDocCompileContext ctx = new ApiDocCompileContext(); ctx.saveCurrent(); + SerializeConfig fjConfig = SerializeConfig.globalInstance; + Class stringSObjectType = SObject.of("").getClass(); + fjConfig.put(stringSObjectType, new FastJsonSObjectSerializer()); try { load(router, null, config, controllerClasses, ctx); for (NamedPort port : app.config().namedPorts()) { diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index cab12e600..02250d99c 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -58,7 +58,7 @@ import org.osgl.storage.impl.SObject; import org.osgl.util.*; -import java.beans.Transient; +import java.io.File; import java.lang.annotation.Annotation; import java.lang.reflect.*; import java.math.BigDecimal; @@ -83,6 +83,7 @@ public static class ParamInfo { public String type; public String description; public String defaultValue; + public H.Method httpMethod; public boolean required; public boolean sessionVariable; public boolean headerVariable; @@ -93,9 +94,10 @@ public static class ParamInfo { private ParamInfo() {} - private ParamInfo(String bindName, BeanSpec beanSpec, String description, String fieldKey, boolean pathVar, boolean body) { + private ParamInfo(H.Method httpMethod, String bindName, BeanSpec beanSpec, String description, String fieldKey, boolean pathVar, boolean body) { this.bindName = bindName; this.beanSpec = beanSpec; + this.httpMethod = httpMethod; this.description = description; this.defaultValue = checkDefaultValue(beanSpec); this.required = checkRequired(beanSpec); @@ -114,10 +116,12 @@ public String getName() { return bindName + "[H]"; } else if (pathVar) { return bindName + "[U]"; + } else if (httpMethod == H.Method.GET) { + return bindName + "[Q]"; } else if (body) { return bindName + "[B]"; } - return bindName + "[Q]"; + return bindName; } public String getTooltip() { @@ -171,8 +175,12 @@ private String checkDefaultValue(BeanSpec spec) { defStr = def.value(); } Class type = spec.rawType(); - Object o = Act.app().resolverManager().resolve(defStr, type); - return $.toString2(o); + try { + Object o = Act.app().resolverManager().resolve(defStr, type); + return $.toString2(o); + } catch (Exception e) { + return ""; + } } private boolean checkRequired(BeanSpec spec) { @@ -468,7 +476,7 @@ private void explore(RequestHandler handler) { Module methodModule = method.getAnnotation(Module.class); this.module = null == methodModule ? classModuleText : methodModule.value(); boolean payloadMethod = H.Method.POST == httpMethod || H.Method.PUT == httpMethod || H.Method.PATCH == httpMethod; - boolean body = payloadMethod && null != invoker.singleJsonFieldName(); + boolean body = payloadMethod && (null != invoker.singleJsonFieldName() || invoker.fieldsAndParamsCount() - urlPathVarNames.size() == 1); exploreParamInfo(method, typeParamLookup, body); if (!Modifier.isStatic(method.getModifiers())) { exploreParamInfo(controllerClass, typeParamLookup, body); @@ -537,7 +545,9 @@ private void exploreParamInfo(Method method, Map typeParamLookup, if (null != payload && $.isSimpleType(payload.getClass())) { payload = sampleData; } - sampleJsonPost = null == payload ? null : JSON.toJSONString(payload, true); + if (null != payload) { + sampleJsonPost = JSON.toJSONString(payload, true); + } } if (!sampleQuery.isEmpty()) { this.sampleQuery = S.join("&", sampleQuery); @@ -582,14 +592,14 @@ private ParamInfo paramInfo( } boolean pathVar = urlPathVarNames.contains(name); if (ParamValueLoaderService.hasDbBind(spec.allAnnotations())) { - return new ParamInfo(name, BeanSpec.of(String.class, injector, typeParamLookup), name + " id", fieldKey, pathVar, body); + return new ParamInfo(httpMethod, name, BeanSpec.of(String.class, injector, typeParamLookup), name + " id", fieldKey, pathVar, body); } String description = ""; Description descAnno = spec.getAnnotation(Description.class); if (null != descAnno) { description = descAnno.value(); } - return new ParamInfo(name, spec, description, fieldKey, pathVar, body); + return new ParamInfo(httpMethod, name, spec, description, fieldKey, pathVar, body); } private boolean isLoginUser(Annotation[] annos) { @@ -833,8 +843,10 @@ public static Object generateSampleData( return BigDecimal.valueOf(1.1); } else if (BigInteger.class == classType) { return BigInteger.valueOf(1); - } else if (ISObject.class.isAssignableFrom(classType)) { - return SObject.of("blob data"); + } else if (File.class == classType) { + return new File("/path/to/upload/file"); + } else if (ISObject.class.isAssignableFrom(classType) || SObject.class.isAssignableFrom(classType)) { + return SObject.of("/path/to/upload/file", ""); } else if (Map.class.isAssignableFrom(classType)) { Map map = $.cast(Act.getInstance(classType)); List typeParams = spec.typeParams(); diff --git a/src/main/java/act/apidoc/SampleData.java b/src/main/java/act/apidoc/SampleData.java index bfa67a12e..833bb396f 100644 --- a/src/main/java/act/apidoc/SampleData.java +++ b/src/main/java/act/apidoc/SampleData.java @@ -30,10 +30,13 @@ import org.osgl.OsglConfig; import org.osgl.inject.BeanSpec; import org.osgl.inject.Injector; +import org.osgl.storage.ISObject; +import org.osgl.storage.impl.SObject; import org.osgl.util.*; import javax.inject.Named; import javax.inject.Provider; +import java.io.File; import java.lang.annotation.*; import java.lang.reflect.*; import java.util.*; @@ -208,6 +211,10 @@ private static T generate( } else if (spec.isSet()) { BeanSpec elementSpec = spec.componentSpec(); return (T) generateSet(elementSpec, category, typeParamLookup, typeChain, nameChain); + } else if (File.class.isAssignableFrom(spec.rawType())) { + return (T) new File("/path/to/upload/file"); + } else if (ISObject.class.isAssignableFrom(spec.rawType())) { + return (T) SObject.of("/path/to/upload/file", ""); } else { return (T) generateSamplePojo(spec, typeParamLookup, typeChain, nameChain); } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 31f721108..644e8b40b 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -780,6 +780,10 @@ public String singleJsonFieldName() { return singleJsonFieldName; } + public int fieldsAndParamsCount() { + return fieldsAndParamsCount; + } + private void cacheJsonDto(ActContext context, JsonDto dto) { context.attribute(JsonDto.CTX_ATTR_KEY, dto); } diff --git a/src/main/java/act/util/FastJsonFileSerializer.java b/src/main/java/act/util/FastJsonFileSerializer.java new file mode 100644 index 000000000..a19e89103 --- /dev/null +++ b/src/main/java/act/util/FastJsonFileSerializer.java @@ -0,0 +1,43 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2020 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.alibaba.fastjson.serializer.JSONSerializer; +import com.alibaba.fastjson.serializer.ObjectSerializer; +import com.alibaba.fastjson.serializer.SerializeWriter; +import org.osgl.util.S; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Type; + +public class FastJsonFileSerializer implements ObjectSerializer { + @Override + public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { + SerializeWriter out = serializer.out; + if (object instanceof File) { + File file = (File) object; + out.write(S.fmt("File[%s]", file.getPath())); + return; + } + throw new UnsupportedOperationException("Object type not supported: " + object.getClass()); + } +} diff --git a/src/main/java/act/util/FastJsonSObjectSerializer.java b/src/main/java/act/util/FastJsonSObjectSerializer.java new file mode 100644 index 000000000..776c0e323 --- /dev/null +++ b/src/main/java/act/util/FastJsonSObjectSerializer.java @@ -0,0 +1,43 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2020 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.alibaba.fastjson.serializer.JSONSerializer; +import com.alibaba.fastjson.serializer.ObjectSerializer; +import com.alibaba.fastjson.serializer.SerializeWriter; +import org.osgl.storage.ISObject; +import org.osgl.util.S; + +import java.io.IOException; +import java.lang.reflect.Type; + +public class FastJsonSObjectSerializer implements ObjectSerializer { + @Override + public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { + SerializeWriter out = serializer.out; + if (object instanceof ISObject) { + ISObject sobj = (ISObject) object; + out.write(S.fmt("ISObject[%s]", sobj.getKey())); + return; + } + throw new UnsupportedOperationException("Object type not supported: " + object.getClass()); + } +} diff --git a/src/main/java/act/util/LogSupport.java b/src/main/java/act/util/LogSupport.java index 644e002d2..274cf82c0 100644 --- a/src/main/java/act/util/LogSupport.java +++ b/src/main/java/act/util/LogSupport.java @@ -43,6 +43,10 @@ public LogSupport() { logger = LogManager.get(getClass()); } + public final Logger logger() { + return logger; + } + /** * Print a line of 80 `=` chars */ diff --git a/src/main/resources/asset/~act/css/act_data_table.css b/src/main/resources/asset/~act/css/act_data_table.css index b1899c962..ba423c73d 100644 --- a/src/main/resources/asset/~act/css/act_data_table.css +++ b/src/main/resources/asset/~act/css/act_data_table.css @@ -2,6 +2,7 @@ table.act_data_table { border-collapse: collapse; font-size: 11pt; font-family: cousine, "Droid Sans Mono Dotted", "Envy Code R", "Fira Code", Monaco, monospaced; + position: relative; } table.act_data_table th, table.act_data_table td.act_data_table_label { background-color: #007; @@ -38,3 +39,7 @@ table.act_data_table pre { margin: 0; font-family: cousine, "Droid Sans Mono Dotted", "Envy Code R", "Fira Code", Monaco, monospaced; } +table.act_data_table th { + position: sticky; + top: 0 +} diff --git a/src/main/resources/rythm/~table_page.html b/src/main/resources/rythm/~table_page.html index 00bfa1f45..bae3e4c52 100644 --- a/src/main/resources/rythm/~table_page.html +++ b/src/main/resources/rythm/~table_page.html @@ -9,9 +9,6 @@
                                                                                                                                                                              + + + + + + + + + @for(CliCmdInfo cmd: cmds) { + + + + + + } + +
                                                                                                                                                                              NameShortcutHelp
                                                                                                                                                                              + @cmd.name + @cmd.shortcut@cmd.help
                                                                                                                                                                              +} + +@if(appCommands) { +

                                                                                                                                                                              App Commands

                                                                                                                                                                              +@listCommands(appCommands) +} + +

                                                                                                                                                                              System Commands

                                                                                                                                                                              +@listCommands(sysCommands) + + diff --git a/src/main/resources/rythm/~table.html b/src/main/resources/rythm/~table.html index 6a49d3c57..c767b10a3 100644 --- a/src/main/resources/rythm/~table.html +++ b/src/main/resources/rythm/~table.html @@ -37,6 +37,9 @@ @for(Object row: table) { @for(String label: table.heading()) { + @{ + Object v = table.val(row, label) + } - @{ - Object v = table.val(row, label) + @if(toString(v).length() > 50) { + title="@toString(v).raw()" } + > @if(isUrl(v)) { @v } else if (null == v || "".equals(v.toString().trim())) { diff --git a/src/main/resources/rythm/~table_page.html b/src/main/resources/rythm/~table_page.html index bae3e4c52..11d7762cb 100644 --- a/src/main/resources/rythm/~table_page.html +++ b/src/main/resources/rythm/~table_page.html @@ -8,7 +8,7 @@ } - + @invoke("~table.html", table) - + From 1a403822917f190635f121566fba5adfde75ef35 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 28 Feb 2020 07:25:48 +1100 Subject: [PATCH 601/730] ConcurrentModificationException calling eventBus.triggerAsync #1308; improve on #1305 --- CHANGELOG.md | 1 + src/main/java/act/cli/CliCmdInfo.java | 7 +++++++ src/main/java/act/controller/builtin/HelpPage.java | 3 ++- src/main/java/act/event/EventBus.java | 2 +- src/main/resources/rythm/~cmd_help.html | 4 ++-- src/main/resources/rythm/~cmd_index.html | 2 +- 6 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 414bd8bd0..9dc757e63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log **1.8.32** +* ConcurrentModificationException calling eventBus.triggerAsync #1308 * Allow access CLI over HTTP #1305 * Act-Test - allow specify collection size when generating List/Set random collection #1301 * Act-Test create sample data provider for `id` field #1300 diff --git a/src/main/java/act/cli/CliCmdInfo.java b/src/main/java/act/cli/CliCmdInfo.java index 6ade44cdb..ba66caf89 100644 --- a/src/main/java/act/cli/CliCmdInfo.java +++ b/src/main/java/act/cli/CliCmdInfo.java @@ -20,6 +20,7 @@ * #L% */ +import org.osgl.util.Keyword; import org.osgl.util.S; import java.util.Map; @@ -45,8 +46,14 @@ public int helpLen() { return help.length(); } + public String httpName() { + return Keyword.of(name).kebabCase(); + } + @Override public int compareTo(CliCmdInfo o) { return name.compareTo(o.name); } + + } diff --git a/src/main/java/act/controller/builtin/HelpPage.java b/src/main/java/act/controller/builtin/HelpPage.java index d45767075..314194f47 100644 --- a/src/main/java/act/controller/builtin/HelpPage.java +++ b/src/main/java/act/controller/builtin/HelpPage.java @@ -32,6 +32,7 @@ import org.osgl.mvc.annotation.Before; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.E; +import org.osgl.util.Keyword; import org.osgl.util.S; import javax.inject.Inject; @@ -73,7 +74,7 @@ public void help(String cmdName) { notFoundIfNull(handler); CliCmdInfo cmd = getCmdInfo(handler); notFoundIfNull(cmd); - cmd.name = cmdName; + cmd.name = Keyword.of(cmdName).kebabCase(); render("~cmd_help.html", cmd); } diff --git a/src/main/java/act/event/EventBus.java b/src/main/java/act/event/EventBus.java index ee1b936c0..425a64462 100644 --- a/src/main/java/act/event/EventBus.java +++ b/src/main/java/act/event/EventBus.java @@ -1361,7 +1361,7 @@ private void _emit(Key key, ConcurrentMap> listen } final Object[] args = key.args; JobManager jobManager = async ? app().jobManager() : null; - for (final SimpleEventListener listener: list) { + for (final SimpleEventListener listener: C.list(list)) { if (async) { jobManager.now(new Runnable() { @Override diff --git a/src/main/resources/rythm/~cmd_help.html b/src/main/resources/rythm/~cmd_help.html index 26e257601..e9559f17b 100644 --- a/src/main/resources/rythm/~cmd_help.html +++ b/src/main/resources/rythm/~cmd_help.html @@ -75,12 +75,12 @@

                                                                                                                                                                              Parameters

                                                                                                                                                                              } -Run +Run   Index @@ -67,27 +75,29 @@

                                                                                                                                                                              CLI Help - @cmd.name

                                                                                                                                                                              @cmd.help

                                                                                                                                                                              Parameters

                                                                                                                                                                              +
                                                                                                                                                                                @for(String param: cmd.params.keySet()) {
                                                                                                                                                                              • + @if(cmd.isMultiLines(param)) { + + } else { + }
                                                                                                                                                                              • }
                                                                                                                                                                              -Run -  +
                                                                                                                                                                              Index +  + +
                                                                                                                                                                              Result
                                                                                                                                                                              + From 2e3f03be6f24977551fa9f8dfc3f79aecd5e6a8d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 1 Apr 2020 12:37:53 +1100 Subject: [PATCH 627/730] Invalid warning msg: "empty index encountered" #1322 --- CHANGELOG.md | 1 + src/main/java/act/inject/param/ParamTree.java | 4 +++- .../src/main/java/ghissues/Gh1322.java | 22 +++++++++++++++++++ .../src/main/resources/rythm/1322/form.html | 14 ++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1322.java create mode 100644 testapps/GHIssues/src/main/resources/rythm/1322/form.html diff --git a/CHANGELOG.md b/CHANGELOG.md index a81e5afcd..4b55ac52b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log ##1.8.33** +* Invalid warning msg: "empty index encountered" #1322 * CLI over HTTP - allow specify big string which require textarea as input #1321 * Add helper endpoint in dev mode to get Java System Properties #1320 * FileBinder - When running command from CLI over HTTP, bind to new File #1319 diff --git a/src/main/java/act/inject/param/ParamTree.java b/src/main/java/act/inject/param/ParamTree.java index 18931cfe0..80f090bb1 100644 --- a/src/main/java/act/inject/param/ParamTree.java +++ b/src/main/java/act/inject/param/ParamTree.java @@ -164,7 +164,9 @@ private static String[] parseRawParamKey(String rawKey) { } } - addTokenToList(list, token); + if (!token.isEmpty()) { + addTokenToList(list, token); + } return list.toArray(new String[list.size()]); } diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1322.java b/testapps/GHIssues/src/main/java/ghissues/Gh1322.java new file mode 100644 index 000000000..75b829f35 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1322.java @@ -0,0 +1,22 @@ +package ghissues; + +import act.controller.annotation.TemplateContext; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1322") +@TemplateContext("1322") +public class Gh1322 extends BaseController { + + public static class Foo { + public int bar; + } + + @GetAction + public void form() { + } + + @PostAction + public Foo test(Foo foo) {return foo;} +} diff --git a/testapps/GHIssues/src/main/resources/rythm/1322/form.html b/testapps/GHIssues/src/main/resources/rythm/1322/form.html new file mode 100644 index 000000000..996d71c93 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/rythm/1322/form.html @@ -0,0 +1,14 @@ + + +
                                                                                                                                                                              + + +
                                                                                                                                                                              + +
                                                                                                                                                                              + + +
                                                                                                                                                                              + + + \ No newline at end of file From fa713b18a19a42ecd40614d32161c953e09b477c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 1 Apr 2020 22:17:40 +1100 Subject: [PATCH 628/730] remove unused code --- src/main/java/act/xio/undertow/UndertowRequest.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/act/xio/undertow/UndertowRequest.java b/src/main/java/act/xio/undertow/UndertowRequest.java index 55bff3280..4283e96c1 100644 --- a/src/main/java/act/xio/undertow/UndertowRequest.java +++ b/src/main/java/act/xio/undertow/UndertowRequest.java @@ -264,10 +264,4 @@ private Deque queryParamVals(String name) { return keywordMatching ? queryParamsByKeyword.get(Keyword.of(name)) : queryParams.get(name); } - public static void main(String[] args) { - HttpString a = HEADER_NAMES.get("X-Forwarded-For"); - HttpString b = HEADER_NAMES.get("x-forwarded-for"); - System.out.println(a.equals(b)); - } - } From 218031195cce271d34d88e6ae5366cb7824e6e5f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Wed, 1 Apr 2020 22:22:42 +1100 Subject: [PATCH 629/730] update osgl-tool to 1.24.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 432d8f4b7..735bbf9a5 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 3.12.1 - 1.24.0 + 1.24.1-SNAPSHOT 1.8.0 1.13.1 1.13.1 From c9d8ed2882ff991e2ab2ed0db78bb516116bbb6d Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 12 Apr 2020 09:29:08 +1000 Subject: [PATCH 630/730] It needs to expose CORS control headers to all kind of requests #1325 --- CHANGELOG.md | 1 + src/main/java/act/app/ActionContext.java | 4 ++-- src/main/java/act/security/CORS.java | 12 ++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b55ac52b..4fb53293e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log ##1.8.33** +* It needs to expose CORS control headers to all kind of requests #1325 * Invalid warning msg: "empty index encountered" #1322 * CLI over HTTP - allow specify big string which require textarea as input #1321 * Add helper endpoint in dev mode to get Java System Properties #1320 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index 1a1a7faeb..eb7440c8d 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -1106,10 +1106,10 @@ private void applyGlobalCorsSetting() { } H.Response r = response; r.addHeaderIfNotAdded(ACCESS_CONTROL_ALLOW_ORIGIN, conf.corsAllowOrigin()); + r.addHeaderIfNotAdded(ACCESS_CONTROL_ALLOW_CREDENTIALS, S.string(conf.corsAllowCredentials())); + r.addHeaderIfNotAdded(ACCESS_CONTROL_EXPOSE_HEADERS, conf.corsExposeHeaders()); if (request.method() == H.Method.OPTIONS || !conf.corsOptionCheck()) { r.addHeaderIfNotAdded(ACCESS_CONTROL_ALLOW_HEADERS, conf.corsAllowHeaders()); - r.addHeaderIfNotAdded(ACCESS_CONTROL_ALLOW_CREDENTIALS, S.string(conf.corsAllowCredentials())); - r.addHeaderIfNotAdded(ACCESS_CONTROL_EXPOSE_HEADERS, conf.corsExposeHeaders()); r.addHeaderIfNotAdded(ACCESS_CONTROL_MAX_AGE, S.string(conf.corsMaxAge())); } } diff --git a/src/main/java/act/security/CORS.java b/src/main/java/act/security/CORS.java index 6fc9685d1..60bb88899 100644 --- a/src/main/java/act/security/CORS.java +++ b/src/main/java/act/security/CORS.java @@ -273,16 +273,16 @@ public void applyTo(ActionContext context) throws $.Break { if (null != origin) { r.addHeaderIfNotAdded(ACCESS_CONTROL_ALLOW_ORIGIN, origin); } + if (null != exposeHeaders) { + r.addHeaderIfNotAdded(ACCESS_CONTROL_EXPOSE_HEADERS, exposeHeaders); + } + if (null != allowCredentials) { + r.addHeaderIfNotAdded(ACCESS_CONTROL_ALLOW_CREDENTIALS, S.string(allowCredentials)); + } if (context.isOptionsMethod()) { if (null != methods) { r.addHeaderIfNotAdded(ACCESS_CONTROL_ALLOW_METHODS, methods); } - if (null != exposeHeaders) { - r.addHeaderIfNotAdded(ACCESS_CONTROL_EXPOSE_HEADERS, exposeHeaders); - } - if (null != allowCredentials) { - r.addHeaderIfNotAdded(ACCESS_CONTROL_ALLOW_CREDENTIALS, S.string(allowCredentials)); - } if (null != allowHeaders) { r.addHeaderIfNotAdded(ACCESS_CONTROL_ALLOW_HEADERS, allowHeaders); } From 96cef64b54ac39050c9b64a0bd793090ab6e5b96 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 21 Apr 2020 17:12:20 +1000 Subject: [PATCH 631/730] Improve http cache support #1328 --- CHANGELOG.md | 3 ++ pom.xml | 2 +- src/main/java/act/app/ActionContext.java | 4 ++ src/main/java/act/conf/AppConfig.java | 8 +++- .../act/controller/CacheSupportMetaInfo.java | 22 +++++++++-- .../java/act/controller/builtin/HelpPage.java | 4 +- .../controller/RequestHandlerProxy.java | 39 ++++++++++++------- .../impl/ReflectedHandlerInvoker.java | 8 +++- src/main/java/act/route/Router.java | 2 +- src/main/java/act/util/CacheFor.java | 31 ++++++++++++++- .../act/xio/undertow/UndertowRequest.java | 4 +- testapps/GHIssues/pom.xml | 2 +- 12 files changed, 101 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fb53293e..82da42729 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log ##1.8.33** +* Session cache shall be cleared after app hot reload #1330 - update osgl-http to 1.13.2 +* Improve http cache support #1328 +* Add profile to default session cookie name #1326 * It needs to expose CORS control headers to all kind of requests #1325 * Invalid warning msg: "empty index encountered" #1322 * CLI over HTTP - allow specify big string which require textarea as input #1321 diff --git a/pom.xml b/pom.xml index 735bbf9a5..416483617 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ 1.24.1-SNAPSHOT 1.8.0 1.13.1 - 1.13.1 + 1.13.2-SNAPSHOT 1.13.1 1.11.0 1.5.0 diff --git a/src/main/java/act/app/ActionContext.java b/src/main/java/act/app/ActionContext.java index eb7440c8d..0d7f7e031 100644 --- a/src/main/java/act/app/ActionContext.java +++ b/src/main/java/act/app/ActionContext.java @@ -476,6 +476,10 @@ public ActionContext calcResultHashForEtag(Object o) { return this; } + public int resultHashForEtag() { + return resultHash; + } + public void applyResultHashToEtag() { if (resultHash > Integer.MIN_VALUE) { resp().addHeaderIfNotAdded(ETAG, S.string(resultHash)); diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index c01d6551f..c79089364 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -2991,7 +2991,13 @@ protected T cookiePrefix(String prefix) { private String cookiePrefix() { if (null == cookiePrefix) { - cookiePrefix = get(COOKIE_PREFIX, S.concat(app().shortId(), "-")); + String profile = Act.profile(); + S.Buffer buf = S.buffer(app().shortId()); + if (null != buf && S.neq("prod", profile, S.IGNORECASE)) { + buf.a("-").a(profile); + } + buf.a("-"); + cookiePrefix = get(COOKIE_PREFIX, buf.toString()); cookiePrefix = cookiePrefix.trim().toLowerCase(); set(COOKIE_PREFIX, cookiePrefix); } diff --git a/src/main/java/act/controller/CacheSupportMetaInfo.java b/src/main/java/act/controller/CacheSupportMetaInfo.java index 5b119caf1..a3d14d38f 100644 --- a/src/main/java/act/controller/CacheSupportMetaInfo.java +++ b/src/main/java/act/controller/CacheSupportMetaInfo.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -32,8 +32,11 @@ public class CacheSupportMetaInfo { public boolean supportPost; public boolean usePrivate; public boolean noCacheControl; + public boolean etagOnly; + public boolean noCache; - private CacheSupportMetaInfo() {} + private CacheSupportMetaInfo() { + } public String cacheKey(ActionContext context) { return keyGenerator.apply(context); @@ -43,7 +46,16 @@ public static CacheSupportMetaInfo disabled() { return new CacheSupportMetaInfo(); } - public static CacheSupportMetaInfo enabled($.Function keyGenerator, String cacheForId, int ttl, boolean supportPost, boolean usePrivate, boolean noCacheControl) { + public static CacheSupportMetaInfo enabled( + $.Function keyGenerator, + String cacheForId, + int ttl, + boolean supportPost, + boolean usePrivate, + boolean noCacheControl, + boolean etagOnly, + boolean noCache + ) { CacheSupportMetaInfo meta = new CacheSupportMetaInfo(); meta.enabled = true; meta.id = cacheForId; @@ -52,6 +64,8 @@ public static CacheSupportMetaInfo enabled($.Function key meta.usePrivate = usePrivate; meta.keyGenerator = $.requireNotNull(keyGenerator); meta.noCacheControl = noCacheControl; + meta.etagOnly = etagOnly; + meta.noCache = noCache; return meta; } } diff --git a/src/main/java/act/controller/builtin/HelpPage.java b/src/main/java/act/controller/builtin/HelpPage.java index 48ec3589b..b26c6f0cd 100644 --- a/src/main/java/act/controller/builtin/HelpPage.java +++ b/src/main/java/act/controller/builtin/HelpPage.java @@ -112,7 +112,7 @@ private Map getCmdParamInfo(CliHandlerProxy proxy, Set m if (null != required) { map.put(pn, helpOf(required)); } else { - Optional optional = _getAnno(paramAnns, i, Optional.class); + act.cli.Optional optional = _getAnno(paramAnns, i, act.cli.Optional.class); if (null != optional) { String help = helpOf(optional); map.put(pn, help); @@ -129,7 +129,7 @@ private static String helpOf(Required required) { return S.blank(help) ? required.value() : help; } - private static String helpOf(Optional optional) { + private static String helpOf(act.cli.Optional optional) { String help = optional.help(); return S.blank(help) ? optional.value() : help; } diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index 30854828a..cfc8e0257 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -189,18 +189,20 @@ public void handle(ActionContext context) { boolean supportCache = this.supportCache && method == GET || (cacheSupport.supportPost && method == POST); String cacheKey = null; if (supportCache) { - cacheKey = cacheSupport.cacheKey(context); - ResponseCache cached = this.cache.get(cacheKey); - if (null != cached && cached.isValid()) { - String etag = cached.etag(); - if (null != etag && context.req().etagMatches(etag)) { - NotModified.of(etag).apply(context.req(), context.resp()); - } else { - cached.applyTo(context.prepareRespForResultEvaluation()); + context.enableCache(); + if (!this.cacheSupport.etagOnly) { + cacheKey = cacheSupport.cacheKey(context); + ResponseCache cached = this.cache.get(cacheKey); + if (null != cached && cached.isValid()) { + String etag = cached.etag(); + if (null != etag && context.req().etagMatches(etag)) { + NotModified.of(etag).apply(context.req(), context.resp()); + } else { + cached.applyTo(context.prepareRespForResultEvaluation()); + } + return; } - return; } - context.enableCache(); } saveActionPath(context); setHandlerClass(context); @@ -222,13 +224,24 @@ public void handle(ActionContext context) { result = context.nullValueResult(); } if (supportCache) { - String s = cacheSupport.usePrivate ? "private, max-age=" : "public, max-age="; if (!cacheSupport.noCacheControl) { - context.resp().addHeaderIfNotAdded(H.Header.Names.CACHE_CONTROL, s + cacheSupport.ttl); + S.Buffer buf = S.buffer(); + if (cacheSupport.usePrivate) { + buf.append("private "); + } + if (cacheSupport.noCache || cacheSupport.etagOnly) { + buf.append("no-cache "); + } + buf.append("max-age="); + context.resp().addHeaderIfNotAdded(H.Header.Names.CACHE_CONTROL, buf.append(cacheSupport.ttl).toString()); + } + String newEtag = S.string(context.resultHashForEtag()); + if (context.req().etagMatches(newEtag)) { + result = NotModified.of(newEtag); } } onResult(result, context); - if (supportCache) { + if (supportCache && !cacheSupport.etagOnly) { this.cache.put(cacheKey, context.resp(), cacheSupport.ttl); cacheKeys.add(cacheKey); } diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index 349faada1..c43222ef6 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -992,7 +992,9 @@ private void initCacheParams(AppConfig config) { cacheFor.value(), cacheFor.supportPost(), cacheFor.usePrivate(), - cacheFor.noCacheControl() + cacheFor.noCacheControl(), + cacheFor.eTagOnly(), + cacheFor.noCache() ); } @@ -1145,7 +1147,9 @@ private Object invoke(ActionContext context, Object controller, Object[] params) if (returnString && context.acceptJson()) { retVal = null == retVal ? null : ensureValidJson(S.string(retVal)); } - context.calcResultHashForEtag(retVal); + if (null != retVal) { + context.calcResultHashForEtag(retVal); + } return retVal; } diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index f2f23f5d1..fd1d78e70 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -596,7 +596,7 @@ public String urlBase() { * the internal network, thus assume we do not have secure http channel on top * of that */ - boolean secure = null != portId && config.httpSecure(); + boolean secure = null == portId && config.httpSecure(); String scheme = secure ? "https" : "http"; String domain = config.host(); diff --git a/src/main/java/act/util/CacheFor.java b/src/main/java/act/util/CacheFor.java index 19041df29..f3ce3c066 100644 --- a/src/main/java/act/util/CacheFor.java +++ b/src/main/java/act/util/CacheFor.java @@ -53,7 +53,7 @@ /** * Specify the keys to extract parameter/post variables to build the final - * cache key + * cache key. * * If not supplied then framework will try to iterate through all query * parameters to build the cache key @@ -64,7 +64,9 @@ /** * In some edge case (e.g. facebook post to app to get the landing page) POST - * is treated as GET, we should allow cache the result in that case + * is treated as GET, we should allow cache the result in that case. + * + * default value: `false` * * @return `true` if enable cache on POST request */ @@ -72,16 +74,41 @@ /** * Specify it shall use `private` for `Cache-Control` + * + * default value: `false`. + * * @return */ boolean usePrivate() default false; /** * Suppress `Cache-Control` header setting. + * + * default value: `false` + * * @return */ boolean noCacheControl() default false; + /** + * Indicate Do not cache result into local server cache + * + * This is useful when the result is coming from an external + * system that might or might not change. In which case we + * really just want to calculate the result's etag and compare + * it with request's `If-None-Match` header. + * + * Default value is `false`. + */ + boolean eTagOnly() default false; + + /** + * Set `no-cache` to `Cache-Control` header. + * + * Default value: the value of {@link #eTagOnly()} + */ + boolean noCache() default false; + @Singleton class Manager extends LogSupportedDestroyableBase { diff --git a/src/main/java/act/xio/undertow/UndertowRequest.java b/src/main/java/act/xio/undertow/UndertowRequest.java index 4283e96c1..868455d30 100644 --- a/src/main/java/act/xio/undertow/UndertowRequest.java +++ b/src/main/java/act/xio/undertow/UndertowRequest.java @@ -59,7 +59,9 @@ public class UndertowRequest extends RequestImplBase { HEADER_NAMES.get("Proxy-Client-Ip"), HEADER_NAMES.get("Wl-Proxy-Client-Ip"), HEADER_NAMES.get("HTTP_CLIENT_IP"), - HEADER_NAMES.get("HTTP_X_FORWARDED_FOR") + HEADER_NAMES.get("HTTP_X_FORWARDED_FOR"), + HEADER_NAMES.get("If-None-Match"), + HEADER_NAMES.get("If-Match") ); private String path; diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index d0a658d7d..5f51d20fa 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -5,7 +5,7 @@ 4.0.0 act-ghissues - 1.8.29.0-SNAPSHOT + 1.8.33.0-SNAPSHOT ActFramework Github Issue Reproduce App From a7ff1e3a9d7bc95f5e5802224714671821249b30 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 24 Apr 2020 06:17:13 +1000 Subject: [PATCH 632/730] `EnhancedAdaptiveMap.asMap(EnhancedAdaptiveMap)` generated `Map` shall implement hashCode and equals methods #1333 --- CHANGELOG.md | 1 + src/main/java/act/util/EnhancedAdaptiveMap.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82da42729..c847acaef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log ##1.8.33** +* `EnhancedAdaptiveMap.asMap(EnhancedAdaptiveMap)` generated `Map` shall implement hashCode and equals methods #1333 * Session cache shall be cleared after app hot reload #1330 - update osgl-http to 1.13.2 * Improve http cache support #1328 * Add profile to default session cookie name #1326 diff --git a/src/main/java/act/util/EnhancedAdaptiveMap.java b/src/main/java/act/util/EnhancedAdaptiveMap.java index 501063dcb..653e9c49c 100644 --- a/src/main/java/act/util/EnhancedAdaptiveMap.java +++ b/src/main/java/act/util/EnhancedAdaptiveMap.java @@ -205,7 +205,8 @@ public static Set> entrySet(EnhancedAdaptiveMap ar, $. public static Map asMap(final EnhancedAdaptiveMap ar) { final Map kv = ar.internalMap(); // TODO: should we check the field value on size, remove, containsXxx etc methods? - return new Map() { + return new AbstractMap() { + @Override public int size() { return ar.size(); From d82fe3fc862da61f684bfebd64942d371039ed91 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Fri, 24 Apr 2020 06:48:01 +1000 Subject: [PATCH 633/730] minor adjust data table style: font --- src/main/resources/asset/~act/css/act_data_table.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/asset/~act/css/act_data_table.css b/src/main/resources/asset/~act/css/act_data_table.css index a05ff0667..370fa296e 100644 --- a/src/main/resources/asset/~act/css/act_data_table.css +++ b/src/main/resources/asset/~act/css/act_data_table.css @@ -1,7 +1,7 @@ table.act_data_table { border-collapse: collapse; - font-size: 11pt; - font-family: cousine, "Droid Sans Mono Dotted", "Envy Code R", "Fira Code", Monaco, monospaced; + font-size: 10pt; + font-family: "Droid Sans Mono Dotted", "Envy Code R", "Fira Code", Monaco, monospaced; position: relative; } table.act_data_table th, table.act_data_table td.act_data_table_label { From fcb8229824599d9c4ea72c73303bc1d2364a3017 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Tue, 5 May 2020 22:02:34 +1000 Subject: [PATCH 634/730] Param value loader framework - allow inject another controller class #1336 --- CHANGELOG.md | 1 + pom.xml | 2 +- .../impl/ReflectedHandlerInvoker.java | 4 ++- ...ValueLoader.java => BoundValueLoader.java} | 10 +++++-- .../act/inject/param/CliArgumentLoader.java | 5 ++++ .../inject/param/CliVarArgumentLoader.java | 6 +++++ .../act/inject/param/CollectionLoader.java | 5 ++++ .../java/act/inject/param/FieldLoader.java | 3 ++- .../act/inject/param/HeaderValueLoader.java | 5 ++++ .../java/act/inject/param/JsonDtoPatch.java | 5 ++++ .../inject/param/JsonParamValueLoader.java | 12 +++++++-- src/main/java/act/inject/param/MapLoader.java | 5 ++++ .../java/act/inject/param/OptionLoader.java | 5 ++++ .../act/inject/param/ParamValueLoader.java | 6 +++++ .../inject/param/ParamValueLoaderService.java | 26 ++++++++++++++++--- .../act/inject/param/PartialPathLoader.java | 6 +++++ .../java/act/inject/param/PojoLoader.java | 6 +++++ .../act/inject/param/ProvidedValueLoader.java | 6 +++++ .../inject/param/ScopedParamValueLoader.java | 6 +++++ .../act/inject/param/SessionValueLoader.java | 5 ++++ .../param/StringValueResolverValueLoader.java | 6 +++++ src/main/java/act/job/Every.java | 5 +--- src/main/java/act/job/InvokeAfter.java | 1 + .../asset/~act/css/act_data_table.css | 2 +- src/main/resources/rythm/~table.html | 9 ++++--- 25 files changed, 134 insertions(+), 18 deletions(-) rename src/main/java/act/inject/param/{BoundedValueLoader.java => BoundValueLoader.java} (82%) diff --git a/CHANGELOG.md b/CHANGELOG.md index c847acaef..ff312ea0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log ##1.8.33** +* Param value loader framework - allow inject another controller class #1336 * `EnhancedAdaptiveMap.asMap(EnhancedAdaptiveMap)` generated `Map` shall implement hashCode and equals methods #1333 * Session cache shall be cleared after app hot reload #1330 - update osgl-http to 1.13.2 * Improve http cache support #1328 diff --git a/pom.xml b/pom.xml index 416483617..7b6f9d529 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,7 @@ 1.8.0 1.13.1 1.13.2-SNAPSHOT - 1.13.1 + 1.13.2-SNAPSHOT 1.11.0 1.5.0 0.0.1 diff --git a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java index c43222ef6..4dd3a5d61 100644 --- a/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java +++ b/src/main/java/act/handler/builtin/controller/impl/ReflectedHandlerInvoker.java @@ -839,7 +839,9 @@ private void patchDtoBeans(JsonDto dto) { if (hasDtoPatches) { for (JsonDtoPatch patch : dtoPatches) { Object bean = dto.get(patch.name()); - patch.applyChildren(bean); + if (null != bean) { + patch.applyChildren(bean); + } } } } diff --git a/src/main/java/act/inject/param/BoundedValueLoader.java b/src/main/java/act/inject/param/BoundValueLoader.java similarity index 82% rename from src/main/java/act/inject/param/BoundedValueLoader.java rename to src/main/java/act/inject/param/BoundValueLoader.java index 650ca41bc..99e63d76e 100644 --- a/src/main/java/act/inject/param/BoundedValueLoader.java +++ b/src/main/java/act/inject/param/BoundValueLoader.java @@ -22,20 +22,26 @@ import act.util.ActContext; import org.osgl.mvc.util.Binder; +import org.osgl.util.S; /** * Use {@link org.osgl.mvc.util.Binder} to load param value */ -class BoundedValueLoader extends ParamValueLoader.Cacheable { +class BoundValueLoader extends ParamValueLoader.Cacheable { private Binder binder; private String bindModel; - BoundedValueLoader(Binder binder, String model) { + BoundValueLoader(Binder binder, String model) { this.binder = binder; this.bindModel = model; } + @Override + public String toString() { + return S.concat("bound value loader[", bindModel, "]"); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { return binder.resolve(bean, bindModel, context); diff --git a/src/main/java/act/inject/param/CliArgumentLoader.java b/src/main/java/act/inject/param/CliArgumentLoader.java index 161e02016..37993e612 100644 --- a/src/main/java/act/inject/param/CliArgumentLoader.java +++ b/src/main/java/act/inject/param/CliArgumentLoader.java @@ -34,6 +34,11 @@ class CliArgumentLoader extends CliParamValueLoader { CliContext.ParsingContextBuilder.foundArgument(defVal); } + @Override + public String toString() { + return S.concat("cli argument loader[", bindName(), "]"); + } + @Override public Object load(Object cached, ActContext context, boolean noDefaultValue) { CliContext ctx = (CliContext) context; diff --git a/src/main/java/act/inject/param/CliVarArgumentLoader.java b/src/main/java/act/inject/param/CliVarArgumentLoader.java index 9700ba090..789672601 100644 --- a/src/main/java/act/inject/param/CliVarArgumentLoader.java +++ b/src/main/java/act/inject/param/CliVarArgumentLoader.java @@ -24,6 +24,7 @@ import act.cli.util.CommandLineParser; import act.util.ActContext; import org.osgl.inject.util.ArrayLoader; +import org.osgl.util.S; import org.osgl.util.StringValueResolver; import java.util.ArrayList; @@ -40,6 +41,11 @@ class CliVarArgumentLoader extends CliParamValueLoader { CliContext.ParsingContextBuilder.foundArgument(null); } + @Override + public String toString() { + return S.concat("cli var arg loader[", bindName(), "]"); + } + @Override public Object load(Object cached, ActContext context, boolean noDefaultValue) { CliContext ctx = (CliContext) context; diff --git a/src/main/java/act/inject/param/CollectionLoader.java b/src/main/java/act/inject/param/CollectionLoader.java index a0c0d4bff..ed37ad274 100644 --- a/src/main/java/act/inject/param/CollectionLoader.java +++ b/src/main/java/act/inject/param/CollectionLoader.java @@ -75,6 +75,11 @@ class CollectionLoader extends ParamValueLoader.JsonBodySupported { // } } + @Override + public String toString() { + return S.concat("collection loader[", bindName(), "]"); + } + @Override public String bindName() { return key.toString(); diff --git a/src/main/java/act/inject/param/FieldLoader.java b/src/main/java/act/inject/param/FieldLoader.java index e28b146dd..7ef8c94a3 100644 --- a/src/main/java/act/inject/param/FieldLoader.java +++ b/src/main/java/act/inject/param/FieldLoader.java @@ -27,6 +27,7 @@ import org.osgl.$; import org.osgl.Lang; import org.osgl.inject.InjectException; +import org.osgl.util.S; import java.lang.reflect.Field; @@ -100,6 +101,6 @@ public void applyTo($.Func0 beanSource, ActContext context) { @Override public String toString() { - return "FieldLoader[" + field.getName() + "]"; + return S.concat("field loader|", loader); } } diff --git a/src/main/java/act/inject/param/HeaderValueLoader.java b/src/main/java/act/inject/param/HeaderValueLoader.java index cc248f8b8..4eca3e7c1 100644 --- a/src/main/java/act/inject/param/HeaderValueLoader.java +++ b/src/main/java/act/inject/param/HeaderValueLoader.java @@ -68,6 +68,11 @@ public HeaderValueLoader(String name, BeanSpec beanSpec) { } } + @Override + public String toString() { + return S.concat("header loader[", bindName(), "]"); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (context instanceof ActionContext) { diff --git a/src/main/java/act/inject/param/JsonDtoPatch.java b/src/main/java/act/inject/param/JsonDtoPatch.java index f2f3e1796..3e7f1bce6 100644 --- a/src/main/java/act/inject/param/JsonDtoPatch.java +++ b/src/main/java/act/inject/param/JsonDtoPatch.java @@ -83,6 +83,11 @@ public String name() { return name; } + @Override + public String toString() { + return name(); + } + public void applyChildren(Object host) { for (JsonDtoPatch child : fieldsPatches) { child.apply(host); diff --git a/src/main/java/act/inject/param/JsonParamValueLoader.java b/src/main/java/act/inject/param/JsonParamValueLoader.java index a134abf41..60460f0ca 100644 --- a/src/main/java/act/inject/param/JsonParamValueLoader.java +++ b/src/main/java/act/inject/param/JsonParamValueLoader.java @@ -20,6 +20,7 @@ * #L% */ +import act.Act; import act.app.ActionContext; import act.app.App; import act.app.data.StringValueResolverManager; @@ -29,6 +30,7 @@ import com.alibaba.fastjson.JSONObject; import org.osgl.$; import org.osgl.inject.BeanSpec; +import org.osgl.util.S; import java.lang.reflect.Array; import java.util.Collection; @@ -47,12 +49,13 @@ public Object get() { private ParamValueLoader fallBack; private BeanSpec spec; private Provider defValProvider; + private boolean notController; JsonParamValueLoader(ParamValueLoader fallBack, BeanSpec spec, DependencyInjector injector) { this.fallBack = $.requireNotNull(fallBack); this.spec = $.requireNotNull(spec); this.defValProvider = findDefValProvider(spec, injector); - ActionContext ctx = ActionContext.current(); + this.notController = null == Act.app().classLoader().controllerClassMetaInfo(spec.rawType().getName()); } private JsonParamValueLoader(JsonParamValueLoader parent, Class runtimeType) { @@ -61,12 +64,17 @@ private JsonParamValueLoader(JsonParamValueLoader parent, Class runtimeType) { this.defValProvider = parent.defValProvider; } + @Override + public String toString() { + return S.concat("json param|", fallBack); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (context instanceof ActionContext && ((ActionContext)context).isPathVar(spec.name())) { return fallBack.load(bean, context, noDefaultValue); } - JsonDto dto = context.attribute(JsonDto.CTX_ATTR_KEY); + JsonDto dto = notController ? (JsonDto) context.attribute(JsonDto.CTX_ATTR_KEY) : null; if (null == dto) { return this.fallBack.load(bean, context, noDefaultValue); } else { diff --git a/src/main/java/act/inject/param/MapLoader.java b/src/main/java/act/inject/param/MapLoader.java index 79ab30064..58f4598a7 100644 --- a/src/main/java/act/inject/param/MapLoader.java +++ b/src/main/java/act/inject/param/MapLoader.java @@ -88,6 +88,11 @@ class MapLoader extends ParamValueLoader.JsonBodySupported { } } + @Override + public String toString() { + return S.concat("map loader[", bindName(), "]"); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { ParamTree tree = ParamValueLoaderService.ensureParamTree(context); diff --git a/src/main/java/act/inject/param/OptionLoader.java b/src/main/java/act/inject/param/OptionLoader.java index 3e40ff587..902a70814 100644 --- a/src/main/java/act/inject/param/OptionLoader.java +++ b/src/main/java/act/inject/param/OptionLoader.java @@ -100,6 +100,11 @@ class OptionLoader extends CliParamValueLoader { } } + @Override + public String toString() { + return S.concat("cli option loader[", this.bindName, "]"); + } + @Override public Object load(Object cachedBean, ActContext context, boolean noDefaultValue) { CliContext ctx = (CliContext) context; diff --git a/src/main/java/act/inject/param/ParamValueLoader.java b/src/main/java/act/inject/param/ParamValueLoader.java index f3e0d35ef..7a9741275 100644 --- a/src/main/java/act/inject/param/ParamValueLoader.java +++ b/src/main/java/act/inject/param/ParamValueLoader.java @@ -23,6 +23,7 @@ import act.cli.CliContext; import act.util.*; import org.osgl.util.E; +import org.osgl.util.S; /** * Responsible for providing the value to a method parameter @@ -34,6 +35,11 @@ public interface ParamValueLoader { public Object load(Object bean, ActContext context, boolean noDefaultValue) { return null; } + + @Override + public String toString() { + return S.concat("nil loader[", bindName(), "]"); + } }; /** diff --git a/src/main/java/act/inject/param/ParamValueLoaderService.java b/src/main/java/act/inject/param/ParamValueLoaderService.java index 4feb53192..6b7701494 100644 --- a/src/main/java/act/inject/param/ParamValueLoaderService.java +++ b/src/main/java/act/inject/param/ParamValueLoaderService.java @@ -69,6 +69,11 @@ public abstract class ParamValueLoaderService extends LogSupportedDestroyableBas public Object load(Object bean, ActContext context, boolean noDefaultValue) { return ((ActionContext) context).result(); } + + @Override + public String toString() { + return S.concat("result loader[", bindName(), "]"); + } }; private static class ThrowableLoader extends ParamValueLoader.NonCacheable { @@ -78,6 +83,11 @@ public ThrowableLoader(Class throwableType) { this.throwableType = throwableType; } + @Override + public String toString() { + return S.concat("throwable loader[", bindName(), "|", throwableType.getSimpleName(), "]"); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { Object o = context.attribute(ActionContext.ATTR_EXCEPTION); @@ -226,6 +236,11 @@ protected ParamValueLoader findBeanLoader(final Class beanClass) { final boolean hasField = !loaders.isEmpty(); final $.Var hasValidateConstraint = $.var(); ParamValueLoader loader = new ParamValueLoader.NonCacheable() { + @Override + public String toString() { + return S.concat("findBeanLoader[", bindName(), "]"); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (null == bean) { @@ -421,6 +436,11 @@ public Object load(Object bean, ActContext ctx, boolean noDefaultValue) { } return anno; } + + @Override + public String toString() { + return S.concat("findHandlerMethodAnnotation[", bindName(), "]"); + } }; } @@ -439,7 +459,7 @@ protected final ParamValueLoader binder(BeanSpec spec, String bindName) { for (Class binderClass : bind.value()) { Binder binder = injector.get(binderClass); if (rawType.isAssignableFrom(binder.targetType())) { - loader = new BoundedValueLoader(binder, bindName); + loader = new BoundValueLoader(binder, bindName); break; } } @@ -454,7 +474,7 @@ protected final ParamValueLoader binder(BeanSpec spec, String bindName) { Binder binder = injector.get(binderClass); binder.attributes($.evaluate(a)); if (rawType.isAssignableFrom(binder.targetType())) { - loader = new BoundedValueLoader(binder, bindName); + loader = new BoundValueLoader(binder, bindName); break; } } @@ -464,7 +484,7 @@ protected final ParamValueLoader binder(BeanSpec spec, String bindName) { if (null == loader) { Binder binder = binderManager.binder(rawType); if (null != binder) { - loader = new BoundedValueLoader(binder, bindName); + loader = new BoundValueLoader(binder, bindName); } } return loader; diff --git a/src/main/java/act/inject/param/PartialPathLoader.java b/src/main/java/act/inject/param/PartialPathLoader.java index 0da0813f5..615ec7cf8 100644 --- a/src/main/java/act/inject/param/PartialPathLoader.java +++ b/src/main/java/act/inject/param/PartialPathLoader.java @@ -24,6 +24,7 @@ import act.controller.ParamNames; import act.util.ActContext; import org.osgl.util.E; +import org.osgl.util.S; public class PartialPathLoader extends ParamValueLoader.NonCacheable { @@ -33,6 +34,11 @@ public PartialPathLoader(String bindName) { this.bindName = bindName; } + @Override + public String toString() { + return S.concat("partial path loader[", bindName(), "]"); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { E.illegalStateIfNot(context instanceof ActionContext, "Not in an HTTP request context"); diff --git a/src/main/java/act/inject/param/PojoLoader.java b/src/main/java/act/inject/param/PojoLoader.java index b2df9e882..3161b59b5 100644 --- a/src/main/java/act/inject/param/PojoLoader.java +++ b/src/main/java/act/inject/param/PojoLoader.java @@ -27,6 +27,7 @@ import org.osgl.$; import org.osgl.inject.BeanSpec; import org.osgl.inject.InjectException; +import org.osgl.util.S; import java.lang.reflect.Field; import java.util.*; @@ -49,6 +50,11 @@ public PojoLoader(ParamKey key, BeanSpec spec, ParamValueLoaderService service) this.fieldLoaders = fieldLoaders(key, spec); } + @Override + public String toString() { + return S.concat("pojo loader [", bindName(), "|", spec.rawType().getSimpleName(), "]"); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { final $.Var beanBag = $.var(bean); diff --git a/src/main/java/act/inject/param/ProvidedValueLoader.java b/src/main/java/act/inject/param/ProvidedValueLoader.java index 28f76173b..8e41c3621 100644 --- a/src/main/java/act/inject/param/ProvidedValueLoader.java +++ b/src/main/java/act/inject/param/ProvidedValueLoader.java @@ -27,6 +27,7 @@ import act.inject.genie.GenieInjector; import act.util.*; import org.osgl.inject.BeanSpec; +import org.osgl.util.S; import java.util.concurrent.ConcurrentMap; import javax.enterprise.context.ApplicationScoped; @@ -48,6 +49,11 @@ private ProvidedValueLoader(BeanSpec beanSpec, DependencyInjector injector) { this.injector = injector; } + @Override + public String toString() { + return S.concat("provided loader[", bindName(), "|", beanSpec.rawType().getSimpleName(), "]"); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (null != singleton) { diff --git a/src/main/java/act/inject/param/ScopedParamValueLoader.java b/src/main/java/act/inject/param/ScopedParamValueLoader.java index cf2b2d594..b2fdb0d99 100644 --- a/src/main/java/act/inject/param/ScopedParamValueLoader.java +++ b/src/main/java/act/inject/param/ScopedParamValueLoader.java @@ -26,6 +26,7 @@ import act.util.ActContext; import org.osgl.$; import org.osgl.inject.BeanSpec; +import org.osgl.util.S; class ScopedParamValueLoader implements ParamValueLoader { private ParamValueLoader realLoader; @@ -49,6 +50,11 @@ private ScopedParamValueLoader(ScopedParamValueLoader parent, Class runtimeType) this.supportCaching = parent.supportCaching; } + @Override + public String toString() { + return S.concat("scoped|", realLoader); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (context instanceof ActionContext) { diff --git a/src/main/java/act/inject/param/SessionValueLoader.java b/src/main/java/act/inject/param/SessionValueLoader.java index 7f63ee9ed..e33c55ad6 100644 --- a/src/main/java/act/inject/param/SessionValueLoader.java +++ b/src/main/java/act/inject/param/SessionValueLoader.java @@ -49,6 +49,11 @@ public SessionValueLoader(String name, BeanSpec beanSpec) { } } + @Override + public String toString() { + return S.concat("session value loader[", bindName(), "]"); + } + @Override public Object load(Object bean, ActContext context, boolean noDefaultValue) { if (context instanceof ActionContext) { diff --git a/src/main/java/act/inject/param/StringValueResolverValueLoader.java b/src/main/java/act/inject/param/StringValueResolverValueLoader.java index fd154a6c5..a2c631401 100644 --- a/src/main/java/act/inject/param/StringValueResolverValueLoader.java +++ b/src/main/java/act/inject/param/StringValueResolverValueLoader.java @@ -25,6 +25,7 @@ import act.util.ActContext; import org.osgl.inject.BeanSpec; import org.osgl.util.E; +import org.osgl.util.S; import org.osgl.util.StringValueResolver; import java.util.concurrent.ConcurrentHashMap; @@ -49,6 +50,11 @@ private StringValueResolverValueLoader(StringValueResolverValueLoader me, Class< super(me, runtimeType, resolver, defVal); } + @Override + public String toString() { + return S.concat("string resolver loader[", bindName(), "]"); + } + @Override public ParamValueLoader wrapWithRuntimeType(final Class type) { final StringValueResolverValueLoader me = this; diff --git a/src/main/java/act/job/Every.java b/src/main/java/act/job/Every.java index 3dc5df634..7c25a797d 100644 --- a/src/main/java/act/job/Every.java +++ b/src/main/java/act/job/Every.java @@ -20,10 +20,7 @@ * #L% */ -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * Mark a method to be a job called at fixed duration. The difference between diff --git a/src/main/java/act/job/InvokeAfter.java b/src/main/java/act/job/InvokeAfter.java index acfaa0281..f0f21197c 100644 --- a/src/main/java/act/job/InvokeAfter.java +++ b/src/main/java/act/job/InvokeAfter.java @@ -32,6 +32,7 @@ @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface InvokeAfter { + /** * Specifies the ID of the Job that will be invoked prior to the invocation * of the annotated method diff --git a/src/main/resources/asset/~act/css/act_data_table.css b/src/main/resources/asset/~act/css/act_data_table.css index 370fa296e..54330c038 100644 --- a/src/main/resources/asset/~act/css/act_data_table.css +++ b/src/main/resources/asset/~act/css/act_data_table.css @@ -1,4 +1,4 @@ -table.act_data_table { + table.act_data_table { border-collapse: collapse; font-size: 10pt; font-family: "Droid Sans Mono Dotted", "Envy Code R", "Fira Code", Monaco, monospaced; diff --git a/src/main/resources/rythm/~table.html b/src/main/resources/rythm/~table.html index c767b10a3..6e9ceb1fc 100644 --- a/src/main/resources/rythm/~table.html +++ b/src/main/resources/rythm/~table.html @@ -25,15 +25,18 @@ String url = v.toString(); return url + (url.contains("?") ? "&" : "?") + "_accept=htmltable"; } - @def String toString(Object v) { + @def String toString(Object v, boolean withPre) { if (null == v) return ""; if (!Lang.isSimpleType(v.getClass())) { String s = com.alibaba.fastjson.JSON.toJSONString(v, true); s = S.strip(s).of(S.DOUBLE_QUOTES); - return "
                                                                                                                                                                              " + s + "
                                                                                                                                                                              "; + return withPre ? "
                                                                                                                                                                              " + s + "
                                                                                                                                                                              " : s; } return v.toString(); } + @def String toString(Object v) { + return toString(v, true); + } @for(Object row: table) { @for(String label: table.heading()) { @@ -49,7 +52,7 @@ class="act_data_table_left" } @if(toString(v).length() > 50) { - title="@toString(v).raw()" + title="@toString(v, false)" } > @if(isUrl(v)) { From a0e00c4d58cc824622b43c245f97475df929bdd1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 23 May 2020 22:31:23 +1000 Subject: [PATCH 635/730] data table enhancement --- src/main/java/act/util/DataTable.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/act/util/DataTable.java b/src/main/java/act/util/DataTable.java index 6f1291df6..e02aa599e 100644 --- a/src/main/java/act/util/DataTable.java +++ b/src/main/java/act/util/DataTable.java @@ -337,6 +337,7 @@ private void initRows(Object data) { initRows(C.list(iterable)); return; } + firstRow = iterable.iterator().hasNext() ? iterable.iterator().next() : null; rows = $.cast(data); rowCount = -1; } else { @@ -385,6 +386,9 @@ private void initHeading(Object data, PropertySpec.MetaInfo colSpec) { keys = keysOf(firstRow, colSpecPresented); } else { keys = new TreeSet<>(); + if (max < 0) { + max = 10; + } for (Object row : rows) { if (--max < 0) break; if (isMap) { @@ -471,6 +475,9 @@ private Set keysOf(Object pojo, boolean propSpecPresented) { } // Check all public fields for (Field f : type.getFields()) { + if (Modifier.isStatic(f.getModifiers())) { + continue; + } String fn = f.getName(); keys.add(fn); if (!labelLookup.containsKey(fn)) { From af61bbf0f45f7ff1574c57547f4d2ece91c54efc Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 24 May 2020 21:21:52 +1000 Subject: [PATCH 636/730] Scenario manager - support loading test scenario files from child folders recursively #1337 --- CHANGELOG.md | 1 + src/main/java/act/test/TestSession.java | 17 ++++------ .../java/act/test/util/ScenarioManager.java | 34 ++++++++++--------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff312ea0a..27b767676 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log ##1.8.33** +* Scenario manager - support loading test scenario files from child folders recursively #1337 * Param value loader framework - allow inject another controller class #1336 * `EnhancedAdaptiveMap.asMap(EnhancedAdaptiveMap)` generated `Map` shall implement hashCode and equals methods #1333 * Session cache shall be cleared after app hot reload #1330 - update osgl-http to 1.13.2 diff --git a/src/main/java/act/test/TestSession.java b/src/main/java/act/test/TestSession.java index 9863eaf9c..4635dcc12 100644 --- a/src/main/java/act/test/TestSession.java +++ b/src/main/java/act/test/TestSession.java @@ -414,26 +414,23 @@ private Object getVal(String key) { } } } - key = S.underscore(key); - o = constants.get(key); + String underscoredKey = S.underscore(key); + o = constants.get(underscoredKey); if (null != o) { return o; } - o = Test.constant(key); + o = Test.constant(underscoredKey); if (null != o) { return o; } try { return evalFunc(key); } catch (Exception e) { - if (!"last".equals(key)) { - try { - return getVal("last", key); - } catch (Exception e1) { - throw E.unexpected("Unable to get value by key: %s", key); - } + try { + return getLastVal(key); + } catch (Exception e1) { + throw E.unexpected("Unable to get value by key: %s", key); } - return null; } } diff --git a/src/main/java/act/test/util/ScenarioManager.java b/src/main/java/act/test/util/ScenarioManager.java index dd705badd..8b3601b97 100644 --- a/src/main/java/act/test/util/ScenarioManager.java +++ b/src/main/java/act/test/util/ScenarioManager.java @@ -147,26 +147,28 @@ private void searchScenarioFolder() { } private void loadFromScenarioDir(File scenariosDir) { - File[] ymlFiles = scenariosDir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.endsWith(".yml"); - } - }); + File[] ymlFiles = scenariosDir.listFiles(); if (null == ymlFiles) { return; } for (File file : ymlFiles) { - String content = IO.read(file).toString(); - if (S.blank(content)) { - warn("Empty yaml file found: " + file.getPath()); - continue; - } - try { - parseOne(content, file.getAbsolutePath()); - } catch (RuntimeException e) { - error(e, "Error parsing scenario file: %s", file.getName()); - throw e; + if (file.isDirectory()) { + loadFromScenarioDir(file); + } else { + String fileName = file.getName(); + if (fileName.endsWith(".yml") || fileName.endsWith(".yaml")) { + String content = IO.read(file).toString(); + if (S.blank(content)) { + warn("Empty yaml file found: " + file.getPath()); + continue; + } + try { + parseOne(content, file.getAbsolutePath()); + } catch (RuntimeException e) { + error(e, "Error parsing scenario file: %s", file.getName()); + throw e; + } + } } } } From edf0ea145f30e20829b7baa66fa1e677869427e8 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 31 May 2020 22:38:03 +1000 Subject: [PATCH 637/730] FastJSON vulnerability fix --- pom.xml | 2 +- src/main/java/act/conf/AppConfig.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7b6f9d529..0fdee9304 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2 1.3.3 3.12.3 - 1.2.67 + 1.2.68 1.1.2 0.7 1.18 diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index c79089364..4c42be437 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -57,6 +57,7 @@ import act.ws.UsernameSecureTicketCodec; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.ParserConfig; import me.tongfei.progressbar.ProgressBarStyle; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -134,6 +135,8 @@ public String transform(String message) { return translated; } }); + // Refer https://cloud.tencent.com/announce/detail/1112 + ParserConfig.getGlobalInstance().setSafeMode(true); } private RouterRegexMacroLookup routerRegexMacroLookup; From 5d406a981481236071188f987a0f8aff9db3565c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Mon, 1 Jun 2020 13:03:55 +1000 Subject: [PATCH 638/730] update fastjson to 1.2.70 - sec update --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0fdee9304..681260eed 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2 1.3.3 3.12.3 - 1.2.68 + 1.2.70 1.1.2 0.7 1.18 From b226b72ea0692c95254bc48a154011333ffb4af7 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 07:14:46 +1000 Subject: [PATCH 639/730] rework on #1284; fix #1313 --- CHANGELOG.md | 3 ++ pom.xml | 2 +- src/main/java/act/apidoc/ApiManager.java | 4 +- src/main/java/act/apidoc/Endpoint.java | 4 +- src/main/java/act/conf/AppConfig.java | 27 +++++++++++ src/main/java/act/conf/AppConfigKey.java | 10 ++++- .../java/act/conf/ExtendedAppConfLoader.java | 45 +++++++++++++++++++ src/main/java/act/route/Router.java | 19 +++++++- 8 files changed, 106 insertions(+), 8 deletions(-) create mode 100644 src/main/java/act/conf/ExtendedAppConfLoader.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 27b767676..e4d9d7899 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log ##1.8.33** +* In case Route mapping exception occurred, it shall display the relevant source file and highlight the place where mapping failed #1313 +* update fastjson to 1.2.71 +* API doc - URL path variable in POST endpoint info is incorrect #1284 * Scenario manager - support loading test scenario files from child folders recursively #1337 * Param value loader framework - allow inject another controller class #1336 * `EnhancedAdaptiveMap.asMap(EnhancedAdaptiveMap)` generated `Map` shall implement hashCode and equals methods #1333 diff --git a/pom.xml b/pom.xml index 681260eed..f6256939b 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2 1.3.3 3.12.3 - 1.2.70 + 1.2.71 1.1.2 0.7 1.18 diff --git a/src/main/java/act/apidoc/ApiManager.java b/src/main/java/act/apidoc/ApiManager.java index 1bfd2a5c6..1383bd864 100644 --- a/src/main/java/act/apidoc/ApiManager.java +++ b/src/main/java/act/apidoc/ApiManager.java @@ -232,10 +232,10 @@ private void load(Router router, NamedPort port, AppConfig config, final Set varNames, RequestHandler handler) { + public void visit(H.Method method, String path, RouteSource routeSource, Set varNames, RequestHandler handler) { ctx.routeSource(routeSource); if (showEndpoint(path, handler)) { - Endpoint endpoint = new Endpoint(portNumber, method, path, varNames, handler); + Endpoint endpoint = new Endpoint(portNumber, method, path,varNames, handler); endpoints.add(endpoint); endpointLookup.put(endpoint.getId(), endpoint); if (isDev) { diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index 02250d99c..bbadd9fb4 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -266,7 +266,7 @@ public enum Scheme { private Map typeLookups; - private List urlPathVarNames; + private Set urlPathVarNames; public String returnSample; @@ -287,7 +287,7 @@ public enum Scheme { private Endpoint() {} - Endpoint(int port, H.Method httpMethod, String path, List urlPathVarNames, RequestHandler handler) { + Endpoint(int port, H.Method httpMethod, String path, Set urlPathVarNames, RequestHandler handler) { AppConfig conf = Act.appConfig(); this.httpMethod = $.requireNotNull(httpMethod); String urlContext = conf.urlContext(); diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 4c42be437..0555f5f31 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -150,6 +150,7 @@ public String transform(String message) { public AppConfig(Map configuration) { super(configuration); loadFromConfServer(); + raw.putAll(extendedConfigurations()); } // for unit test @@ -494,6 +495,32 @@ private void _mergeReCaptchaSecret(AppConfig config) { } } + private Map extendedConfigurations; + + protected T extendedConfigurations(Map conf) { + this.extendedConfigurations = conf; + return me(); + } + + private Map extendedConfigurations() { + if (null == extendedConfigurations) { + try { + Object confLoader = get(CONF_LOADER, new ExtendedAppConfLoader.DumbLoader()); + this.extendedConfigurations = $.invokeVirtual(confLoader, "loadConfigurations"); + } catch (Exception e) { + warn(e, "Error loading extended configurations"); + this.extendedConfigurations = C.Map(); + } + } + return extendedConfigurations; + } + + private void _mergeExtendedAppConfLoader(AppConfig conf) { + if (!hasConfiguration(CONF_LOADER)) { + extendedConfigurations = conf.extendedConfigurations; + } + } + private String confId; protected T confId(String key) { diff --git a/src/main/java/act/conf/AppConfigKey.java b/src/main/java/act/conf/AppConfigKey.java index f8a70d8fd..b52bfc36c 100644 --- a/src/main/java/act/conf/AppConfigKey.java +++ b/src/main/java/act/conf/AppConfigKey.java @@ -281,10 +281,18 @@ public enum AppConfigKey implements ConfigKey { * * Note the endpoint must be a full URL * - * Default value: null + * Default value: `null` */ CONF_SERVER_ENDPOINT("conf-server.endpoint"), + /** + * `conf-loader.impl` specify customized application configuration loader. + * it should be a class name of an implementation of {@link ExtendedAppConfLoader}. + * + * Default value: `null` + */ + CONF_LOADER("conf-loader.impl"), + /** * `conf.id` set the configuration id - could be used to fetch configuration from configuration server * diff --git a/src/main/java/act/conf/ExtendedAppConfLoader.java b/src/main/java/act/conf/ExtendedAppConfLoader.java new file mode 100644 index 000000000..a693f61a8 --- /dev/null +++ b/src/main/java/act/conf/ExtendedAppConfLoader.java @@ -0,0 +1,45 @@ +package act.conf; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2020 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.osgl.util.C; + +import java.util.Map; + +/** + * Allow application to define customized application configuration loading logic + */ +public interface ExtendedAppConfLoader { + /** + * Implement class shall overwrite this method and return + * application configurations. + * + * @return application configurations + */ + Map loadConfigurations(); + + static class DumbLoader implements ExtendedAppConfLoader { + @Override + public Map loadConfigurations() { + return C.Map(); + } + } +} diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index fd1d78e70..297dc2e69 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -80,7 +80,7 @@ public interface Visitor { * @param handler * the handler */ - void visit(H.Method method, String path, RouteSource source, List varNames, RequestHandler handler); + void visit(H.Method method, String path, RouteSource source, Set varNames, RequestHandler handler); } public static final String IGNORE_NOTATION = "..."; @@ -231,7 +231,7 @@ private void visit(Node node, H.Method method, Visitor visitor) { if (handler instanceof ContextualHandler) { handler = ((ContextualHandler) handler).realHandler(); } - visitor.visit(method, node.path(), node.routeSource, node.varNames, handler); + visitor.visit(method, node.path(), node.routeSource, node.allVarNames(), handler); } for (TreeNode child : node.children()) { visit((Node)child, method, visitor); @@ -1226,6 +1226,21 @@ protected void releaseResources() { staticChildren.clear(); } + /** + * Returns all URL path variable names including var name of parent/ancestors + * @return + */ + public Set allVarNames() { + Set set = new HashSet<>(); + set.addAll(varNames); + Node cur = parent; + while (cur != root) { + set.addAll(cur.varNames); + cur = cur.parent; + } + return set; + } + Node childByMetaInfoExactMatching(String name) { Node node = staticChildren.get(name); if (null != node) { From d1b6d8c6397d0d49d3fc4b7e3aac5305ead4f5e6 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 07:20:24 +1000 Subject: [PATCH 640/730] Add profile to default session cookie name #1326 --- src/main/java/act/conf/AppConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 0555f5f31..9e2eca836 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -3023,7 +3023,7 @@ private String cookiePrefix() { if (null == cookiePrefix) { String profile = Act.profile(); S.Buffer buf = S.buffer(app().shortId()); - if (null != buf && S.neq("prod", profile, S.IGNORECASE)) { + if (S.neq("prod", profile, S.IGNORECASE)) { buf.a("-").a(profile); } buf.a("-"); From ecd00700282224cc64d807f45a31f21bddfb5926 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 08:51:42 +1000 Subject: [PATCH 641/730] Missing fields exporting AdaptiveRecords in csv format #1340 --- CHANGELOG.md | 1 + src/main/java/act/cli/view/CliView.java | 6 ++- .../java/act/data/DataPropertyRepository.java | 4 +- src/main/java/act/data/OutputFieldsCache.java | 41 ++++++++++++++++-- .../src/main/java/ghissues/Gh1340.java | 43 +++++++++++++++++++ .../src/test/resources/scenarios/1340.yml | 23 ++++++++++ 6 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1340.java create mode 100644 testapps/GHIssues/src/test/resources/scenarios/1340.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index e4d9d7899..626e26886 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log ##1.8.33** +* Missing fields exporting AdaptiveRecords in csv format #1340 * In case Route mapping exception occurred, it shall display the relevant source file and highlight the place where mapping failed #1313 * update fastjson to 1.2.71 * API doc - URL path variable in POST endpoint info is incorrect #1284 diff --git a/src/main/java/act/cli/view/CliView.java b/src/main/java/act/cli/view/CliView.java index b15f227e7..e9e654544 100644 --- a/src/main/java/act/cli/view/CliView.java +++ b/src/main/java/act/cli/view/CliView.java @@ -88,7 +88,7 @@ public void render(Writer writer, Object result, PropertySpec.MetaInfo spec, Act } } DataPropertyRepository repo = context.app().service(DataPropertyRepository.class); - List outputFields = repo.outputFields(spec, componentType, context); + List outputFields = repo.outputFields(spec, componentType, dataList.get(0), context); if (outputFields.isEmpty()) { outputFields = C.list(S.pair("this as Item", "this as Item")); } @@ -245,7 +245,7 @@ public void remove() { spec = new PropertySpec.MetaInfo(); spec.onValue("-not_exists"); } - List outputFields = repo.outputFields(spec, componentType, context); + List outputFields = repo.outputFields(spec, componentType, firstElement, context); if (outputFields.isEmpty()) { return; } @@ -279,6 +279,8 @@ private String getProperty(Object data, S.Pair prop) { } else { if (data instanceof AdaptiveMap) { return escape(S.string(((AdaptiveMap) data).getValue(prop._1))); + } else if (data instanceof Map) { + return escape(S.string(((Map) data).get(prop._1))); } return escape($.getProperty(data, prop._1)); } diff --git a/src/main/java/act/data/DataPropertyRepository.java b/src/main/java/act/data/DataPropertyRepository.java index 23ebafddc..a03af58d7 100644 --- a/src/main/java/act/data/DataPropertyRepository.java +++ b/src/main/java/act/data/DataPropertyRepository.java @@ -88,8 +88,8 @@ public synchronized List propertyListOf(Class c) { return ls; } - public List outputFields(PropertySpec.MetaInfo spec, Class componentClass, ActContext context) { - return outputFieldsCache.getOutputFields(spec, componentClass, context); + public List outputFields(PropertySpec.MetaInfo spec, Class componentClass, Object firstElement, ActContext context) { + return outputFieldsCache.getOutputFields(spec, componentClass, firstElement, context); } private List propertyListOf(Class c, Set> circularReferenceDetector, Map typeImplLookup) { diff --git a/src/main/java/act/data/OutputFieldsCache.java b/src/main/java/act/data/OutputFieldsCache.java index 1d7bdf820..de130b56a 100644 --- a/src/main/java/act/data/OutputFieldsCache.java +++ b/src/main/java/act/data/OutputFieldsCache.java @@ -28,6 +28,7 @@ import org.osgl.util.AdaptiveMap; import org.osgl.util.C; import org.osgl.util.S; +import org.osgl.util.Str; import java.util.*; import java.util.regex.Pattern; @@ -70,17 +71,17 @@ public boolean equals(Object obj) { private Map> cache = new HashMap<>(); - public List getOutputFields(PropertySpec.MetaInfo spec, Class componentClass, ActContext context) { + public List getOutputFields(PropertySpec.MetaInfo spec, Class componentClass, Object firstElement, ActContext context) { K k = new K(spec.excludedFields(context), spec.outputFieldsAndLabel(context), componentClass); List outputs = cache.get(k); if (null == outputs) { - outputs = calculateOutputs(k); + outputs = calculateOutputs(k, firstElement); cache.put(k, outputs); } return outputs; } - List calculateOutputs(K k) { + List calculateOutputs(K k, Object firstElement) { Class type = k.componentType; if ($.isSimpleType(type) && k.excluded.isEmpty() && k.outputs.isEmpty()) { return C.list(); @@ -90,6 +91,40 @@ List calculateOutputs(K k) { Set excluded = k.excluded; DataPropertyRepository repo = App.instance().service(DataPropertyRepository.class); List allFields = repo.propertyListOf(k.componentType); + if (AdaptiveMap.class.isInstance(firstElement)) { + Set mapped = new HashSet<>(); + for (S.Pair pair : allFields) { + mapped.add(pair._1); + } + AdaptiveMap am = $.cast(firstElement); + Map map = am.internalMap(); + for (Object o : map.keySet()) { + String key = S.string(o); + if (!mapped.contains(key)) { + allFields.add(S.pair(key, key)); + } + } + } else if (Map.class.isInstance(firstElement)) { + Set mapped = new HashSet<>(); + List toBeRemoved = new ArrayList<>(); + for (S.Pair pair : allFields) { + if ("empty".equalsIgnoreCase(pair._1)) { + toBeRemoved.add(pair); + } else if ("innerMap.empty".equalsIgnoreCase(pair._1)) { + toBeRemoved.add(pair); + } else { + mapped.add(pair._1); + } + } + allFields.removeAll(toBeRemoved); + Map map = $.cast(firstElement); + for (Object o : map.keySet()) { + String key = S.string(o); + if (!mapped.contains(key)) { + allFields.add(S.pair(key, key)); + } + } + } if (hasPattern || outputs.isEmpty()) { if (!excluded.isEmpty()) { List finalOutputs; diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1340.java b/testapps/GHIssues/src/main/java/ghissues/Gh1340.java new file mode 100644 index 000000000..bebb12fac --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1340.java @@ -0,0 +1,43 @@ +package ghissues; + +import act.data.annotation.Data; +import act.util.AdaptiveBeanBase; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; + +import java.util.ArrayList; +import java.util.List; + +public class Gh1340 extends BaseController { + + public static class MyData extends AdaptiveBeanBase { + static MyData of(String key, Object val) { + MyData myData = new MyData(); + myData.putValue(key, val); + return myData; + } + } + + @GetAction("1340/adaptiveMap") + public List test() { + List list = new ArrayList<>(); + list.add(MyData.of("name", "foo").putValue("num", 2)); + list.add(MyData.of("name", "bar").putValue("num", 3)); + return list; + } + + @GetAction("1340/map") + public List testMap() { + List list = new ArrayList<>(); + JSONObject json = new JSONObject(); + json.put("name", "foo"); + json.put("num", 3); + list.add(json); + json = new JSONObject(); + json.put("name", "bar"); + json.put("num", 2); + list.add(json); + return list; + } + +} diff --git a/testapps/GHIssues/src/test/resources/scenarios/1340.yml b/testapps/GHIssues/src/test/resources/scenarios/1340.yml new file mode 100644 index 000000000..1b54e67d4 --- /dev/null +++ b/testapps/GHIssues/src/test/resources/scenarios/1340.yml @@ -0,0 +1,23 @@ +Scenario(1340): + description: "Missing fields exporting AdaptiveRecords in csv format" + interactions: + - description: Test + request: + get: 1340/adaptiveMap + accept: text/csv + response: + text: + - contains: foo + - contains: 2 + - contains: bar + - contains: 3 + - description: Test Map + request: + get: 1340/map + accept: text/csv + response: + text: + - contains: foo + - contains: 2 + - contains: bar + - contains: 3 From 896c6a7ad6eb289c0491e572247ed3c17de24521 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 13:12:14 +1000 Subject: [PATCH 642/730] Update to osgl-tool 1.25.0 --- CHANGELOG.md | 1 + legacy-testapp/pom.xml | 4 ++-- pom.xml | 15 ++++++------- src/main/java/act/conf/AppConfig.java | 8 +++++-- src/main/java/act/test/TestSession.java | 18 +++++++++++----- testapps/GHIssues/pom.xml | 21 +++++++++++++++++++ .../src/test/resources/scenarios/797.yml | 5 ++--- 7 files changed, 53 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 626e26886..d66c45c7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # ActFramework Change Log ##1.8.33** +* Update to osgl-tool 1.25.0 * Missing fields exporting AdaptiveRecords in csv format #1340 * In case Route mapping exception occurred, it shall display the relevant source file and highlight the place where mapping failed #1313 * update fastjson to 1.2.71 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 7297e971d..ced61c91f 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -73,9 +73,9 @@ UTF-8 UTF-8 - 1.8.32-SNAPSHOT + 1.8.33-SNAPSHOT [0.13.0, 2.0.0) - 1.8.1-SNAPSHOT + 1.9.1-SNAPSHOT testapp.TestApp diff --git a/pom.xml b/pom.xml index f6256939b..7fa504114 100644 --- a/pom.xml +++ b/pom.xml @@ -66,13 +66,13 @@ 3.12.1 - 1.24.1-SNAPSHOT - 1.8.0 - 1.13.1 - 1.13.2-SNAPSHOT - 1.13.2-SNAPSHOT - 1.11.0 - 1.5.0 + 1.25.0 + 1.8.1 + 1.13.2 + 1.13.2 + 1.13.2 + 1.11.1 + 1.5.1 0.0.1 1.11.9 1.3.0 @@ -366,6 +366,7 @@ ${jpa.version} + diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index 9e2eca836..ad58b1ae0 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -2561,7 +2561,11 @@ protected T sourceVersion(JavaVersion version) { public String sourceVersion() { if (null == sourceVersion) { - sourceVersion = get(AppConfigKey.SOURCE_VERSION, "1." + $.JAVA_VERSION); + sourceVersion = get(AppConfigKey.SOURCE_VERSION, null); + if (null == sourceVersion) { + int javaVersion = Math.min(8, $.JAVA_VERSION); + sourceVersion = "1." + javaVersion; + } if (sourceVersion.startsWith("1.")) { sourceVersion = sourceVersion.substring(0, 3); } @@ -2601,7 +2605,7 @@ protected T targetVersion(JavaVersion version) { public String targetVersion() { if (null == targetVersion) { - targetVersion = get(TARGET_VERSION, "1." + $.JAVA_VERSION); + targetVersion = get(TARGET_VERSION, sourceVersion()); if (targetVersion.startsWith("1.")) { targetVersion = targetVersion.substring(0, 3); } diff --git a/src/main/java/act/test/TestSession.java b/src/main/java/act/test/TestSession.java index 4635dcc12..3fcbddb71 100644 --- a/src/main/java/act/test/TestSession.java +++ b/src/main/java/act/test/TestSession.java @@ -328,11 +328,16 @@ Object evalFunc(String funcExpr) { String paramStr = S.cut(funcExpr).afterFirst("("); paramStr = S.cut(paramStr).beforeLast(")"); if (S.notBlank(paramStr)) { - vals = C.newList(S.fastSplit(paramStr, ",")); - for (int i = 0; i < vals.size(); ++i) { - String val = S.ensure(vals.get(i).trim()).strippedOff(S.DOUBLE_QUOTES); - val = processStringSubstitution(val); - vals.set(i, val); + if (S.is(paramStr).wrappedWith(S.DOUBLE_QUOTES) || S.is(paramStr).wrappedWith(S.SINGLE_QUOTES)) { + paramStr = paramStr.substring(1, paramStr.length() - 1); + vals = C.list(paramStr); + } else { + vals = C.newList(S.fastSplit(paramStr, ",")); + for (int i = 0; i < vals.size(); ++i) { + String val = S.ensure(vals.get(i).trim()).strippedOff(S.DOUBLE_QUOTES); + val = processStringSubstitution(val); + vals.set(i, val); + } } } } @@ -596,6 +601,9 @@ void verifyJsonObject(JSONObject obj, Map jsonSpec) { String varName = s.substring(0, s.length() - 1); Object val = $.getProperty(obj, varName); + if (val instanceof CharSequence) { + val = S.wrap(val).with(S.DOUBLE_QUOTES); + } val = evalFunc(funcName + "(" + val + ")"); verifyValue(key, val, entry.getValue()); } else { diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 5f51d20fa..2ea087a80 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -59,6 +59,27 @@ act-aaa 1.7.2-SNAPSHOT + + + diff --git a/testapps/GHIssues/src/test/resources/scenarios/797.yml b/testapps/GHIssues/src/test/resources/scenarios/797.yml index 07480b311..281b3fc06 100644 --- a/testapps/GHIssues/src/test/resources/scenarios/797.yml +++ b/testapps/GHIssues/src/test/resources/scenarios/797.yml @@ -5,6 +5,5 @@ Scenario(797): request: get: 797 response: - json: - ${sizeOf(date)}: - - gt: 15 + ${sizeOf(date)}: + - gt: 15 From a1f21930562d96d47b36702370aff21bcb7833f3 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 13:26:39 +1000 Subject: [PATCH 643/730] [maven-release-plugin] prepare release act-1.8.33 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7fa504114..c4c03c4f0 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.33-SNAPSHOT + 1.8.33 ACT Framework The ACT full stack MVC framework @@ -46,7 +46,7 @@ 0.7.2 2.0.2-beta - 5.0.6-SNAPSHOT + 5.0.6 1.2 1.3.3 3.12.3 From a758a26d69138ed03ccc300cf60a902c371b35a2 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 13:26:50 +1000 Subject: [PATCH 644/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c4c03c4f0..047fd6896 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.33 + 1.8.34-SNAPSHOT ACT Framework The ACT full stack MVC framework From 6e8a96512951b4db74daf12b5de108bc0fd83010 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 15:37:15 +1000 Subject: [PATCH 645/730] in case there are blocking issue let blocking issue handler handle request before hotreloading handler - dev mode only --- CHANGELOG.md | 2 +- VERSION_MATRIX.md | 42 +++++++++++------------ pom.xml | 2 +- src/main/java/act/xio/NetworkHandler.java | 5 +++ 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d66c45c7d..25e13cd98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -##1.8.33** +##1.8.33a** * Update to osgl-tool 1.25.0 * Missing fields exporting AdaptiveRecords in csv format #1340 * In case Route mapping exception occurred, it shall display the relevant source file and highlight the place where mapping failed #1313 diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 7220984d8..08e2cf6d8 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,26 +1,26 @@ # Version Matrix -| act | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | 1.8.30a | 1.8.31 | 1.8.32 | -| --- | ----: | ----: | ----: | ----: | -----: | -----: | -----: | -| aaa | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.3 | 1.8.0 | -| beetl | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.1 | 1.7.2 | -| beetlsql | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | 1.8.0 | 1.8.1 | 1.8.2 | -| ebean-java7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | -| ebean(java8) | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | -| eclipselink(java8) | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | -| excel-java7 | | | | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | -| excel | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | -| freemarker | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | -| hibernate | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | -| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | -| jpa-common | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | -| morphia | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | 1.8.1 | 1.8.2 | 1.9.0 | -| mustache(java8) | 1.4.6 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | -| social | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | 0.13.0 | 0.13.0 | 0.13.0 | -| sql-common | 1.5.0 | 1.5.0 | 1.5.1 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | -| storage(java8) | 0.14.0 | 0.14.0 | 0.14.0 | 0.15.0 | 0.15.0 | 0.15.0 | 0.16.0 | -| thymeleaf | 1.3.6 | 1.3.6 | 1.3.6 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | -| velocity | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.1 | +| act | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | 1.8.30a | 1.8.31 | 1.8.32 | 1.8.33 | +| --- | ----: | ----: | ----: | ----: | -----: | -----: | -----: | -----: | +| aaa | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.3 | 1.8.0 | 1.8.0 | +| beetl | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.1 | 1.7.2 | 1.7.2 | +| beetlsql | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | 1.8.0 | 1.8.1 | 1.8.2 | 1.8.2 | +| ebean-java7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | +| ebean(java8) | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | +| eclipselink(java8) | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | +| excel-java7 | | | | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | 1.9.1 | +| excel | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | 1.9.1 | +| freemarker | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | +| hibernate | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | +| jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | +| jpa-common | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | +| morphia | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | 1.8.1 | 1.8.2 | 1.9.0 | 1.9.0 | +| mustache(java8) | 1.4.6 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | +| social | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | 0.13.0 | 0.13.0 | 0.13.0 | 0.13.0 | +| sql-common | 1.5.0 | 1.5.0 | 1.5.1 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | +| storage(java8) | 0.14.0 | 0.14.0 | 0.14.0 | 0.15.0 | 0.15.0 | 0.15.0 | 0.16.0 | 0.16.0 | +| thymeleaf | 1.3.6 | 1.3.6 | 1.3.6 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | +| velocity | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.1 | 1.4.1 | ## Note diff --git a/pom.xml b/pom.xml index 047fd6896..2f9bf4598 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.34-SNAPSHOT + 1.8.33a-SNAPSHOT ACT Framework The ACT full stack MVC framework diff --git a/src/main/java/act/xio/NetworkHandler.java b/src/main/java/act/xio/NetworkHandler.java index 7eaf4a5f9..d96a3e0fe 100644 --- a/src/main/java/act/xio/NetworkHandler.java +++ b/src/main/java/act/xio/NetworkHandler.java @@ -117,6 +117,11 @@ public void handle(final ActionContext ctx, final NetworkDispatcher dispatcher) // important as app.checkUpdates(boolean) might trigger // an app hotreload, which might refer to ActionContext.current() ctx.saveLocal(); + RequestHandler blockIssueHandler = app.blockIssueHandler(); + if (null != blockIssueHandler) { + blockIssueHandler.handle(ctx); + return; + } if (app.isLoading()) { HotReloadingHandler.INSTANCE.handle(ctx); return; From 1d8830c907a003a24f910354123c3852a1822081 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 15:38:28 +1000 Subject: [PATCH 646/730] [maven-release-plugin] prepare release act-1.8.33a --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2f9bf4598..1beee3c69 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.33a-SNAPSHOT + 1.8.33a ACT Framework The ACT full stack MVC framework From 1ac3cfbe1c265e24dc5c7efcf2632f10351fb051 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 15:38:40 +1000 Subject: [PATCH 647/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1beee3c69..992e747b4 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.33a + 1.8.34a-SNAPSHOT ACT Framework The ACT full stack MVC framework From 11ebb21c1f23c17ae68086dfc733e92ef32b20d3 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 16:19:11 +1000 Subject: [PATCH 648/730] fix NPE at Router.Node.allVarNames() --- CHANGELOG.md | 2 +- VERSION_MATRIX.md | 8 ++++---- src/main/java/act/route/Router.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25e13cd98..e9d400210 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # ActFramework Change Log -##1.8.33a** +##1.8.33b** * Update to osgl-tool 1.25.0 * Missing fields exporting AdaptiveRecords in csv format #1340 * In case Route mapping exception occurred, it shall display the relevant source file and highlight the place where mapping failed #1313 diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 08e2cf6d8..1dceecbee 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -2,15 +2,15 @@ | act | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | 1.8.30a | 1.8.31 | 1.8.32 | 1.8.33 | | --- | ----: | ----: | ----: | ----: | -----: | -----: | -----: | -----: | -| aaa | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.3 | 1.8.0 | 1.8.0 | -| beetl | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.1 | 1.7.2 | 1.7.2 | +| aaa | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.3 | 1.8.0 | 1.9.0 | +| beetl | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | | beetlsql | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | 1.8.0 | 1.8.1 | 1.8.2 | 1.8.2 | | ebean-java7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | | ebean(java8) | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | | eclipselink(java8) | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | | excel-java7 | | | | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | 1.9.1 | -| excel | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | 1.9.1 | -| freemarker | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | +| excel | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | 1.9.2 | +| freemarker | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.1 | | hibernate | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | | jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | | jpa-common | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 297dc2e69..32f76e958 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -1234,7 +1234,7 @@ public Set allVarNames() { Set set = new HashSet<>(); set.addAll(varNames); Node cur = parent; - while (cur != root) { + while (cur != root && cur != null) { set.addAll(cur.varNames); cur = cur.parent; } From 4d74b21bd61d34decf4c1cf23d3b65c9f3cac90c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 16:20:48 +1000 Subject: [PATCH 649/730] [maven-release-plugin] prepare release act-1.8.33b --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 992e747b4..fa73374f9 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.34a-SNAPSHOT + 1.8.33b ACT Framework The ACT full stack MVC framework From 895dc9f530bddfeaa4a02f17e771eda4c24c0719 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 16:21:00 +1000 Subject: [PATCH 650/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fa73374f9..742d687f7 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.33b + 1.8.34b-SNAPSHOT ACT Framework The ACT full stack MVC framework From ebc8851bb291f13a23f3b2d8d5213957ca175f04 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 18:11:56 +1000 Subject: [PATCH 651/730] update VERSION_MATRIX --- VERSION_MATRIX.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index 1dceecbee..df7e725fc 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,22 +1,22 @@ # Version Matrix -| act | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | 1.8.30a | 1.8.31 | 1.8.32 | 1.8.33 | +| act | 1.8.26 | 1.8.27 | 1.8.28 | 1.8.29 | 1.8.30a | 1.8.31 | 1.8.32 | 1.8.33b | | --- | ----: | ----: | ----: | ----: | -----: | -----: | -----: | -----: | -| aaa | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.3 | 1.8.0 | 1.9.0 | +| aaa | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.3 | 1.8.0 | 1.9.1 | | beetl | 1.6.0 | 1.6.1 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | | beetlsql | 1.7.0 | 1.7.1 | 1.7.1 | 1.8.0 | 1.8.0 | 1.8.1 | 1.8.2 | 1.8.2 | | ebean-java7 | 1.7.8 | 1.7.8 | 1.7.9 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | | ebean(java8) | 1.7.9 | 1.7.9 | 1.7.10 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | | eclipselink(java8) | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | -| excel-java7 | | | | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | 1.9.1 | +| excel-java7 | | | | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | end | | excel | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | 1.9.2 | | freemarker | 1.3.6 | 1.3.7 | 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.1 | | hibernate | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | | jax-rs(java8) | 1.0.5 | 1.0.5 | 1.0.5 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | | jpa-common | 1.6.0 | 1.6.0 | 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | -| morphia | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | 1.8.1 | 1.8.2 | 1.9.0 | 1.9.0 | +| morphia | 1.7.2 | 1.7.2 | 1.7.3 | 1.8.0 | 1.8.1 | 1.8.2 | 1.9.0 | 1.10.0 | | mustache(java8) | 1.4.6 | 1.4.6 | 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | -| social | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | 0.13.0 | 0.13.0 | 0.13.0 | 0.13.0 | +| social | 0.12.6 | 0.12.6 | 0.12.6 | 0.13.0 | 0.13.0 | 0.13.0 | 0.13.0 | 0.14.0 | | sql-common | 1.5.0 | 1.5.0 | 1.5.1 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | | storage(java8) | 0.14.0 | 0.14.0 | 0.14.0 | 0.15.0 | 0.15.0 | 0.15.0 | 0.16.0 | 0.16.0 | | thymeleaf | 1.3.6 | 1.3.6 | 1.3.6 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | From 846db2bc1f9dfb446ea8adf7e28421f30c8c9234 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 18:51:25 +1000 Subject: [PATCH 652/730] update README and NEWS --- NEWS.md | 8 ++++++++ README.md | 9 +++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/NEWS.md b/NEWS.md index 5f2aa7a44..e12cab951 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,12 @@
                                                                                                                                                                                +
                                                                                                                                                                              • + 27 Jun 2020 + + + act-1.8.33 released + + +
                                                                                                                                                                              • 04 Mar 2020 diff --git a/README.md b/README.md index 1e5e3acea..4847f2e79 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # ACT Framework -[![Join the chat at https://gitter.im/actframework/actframework](https://badges.gitter.im/actframework/actframework.svg)](https://gitter.im/actframework/actframework?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![APL v2](https://img.shields.io/badge/license-Apache%202-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.html) [![Maven Central](https://img.shields.io/maven-central/v/org.actframework/act.svg)](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.actframework%22%20AND%20a%3A%22act%22) [![Build Status](https://travis-ci.org/actframework/actframework.svg?branch=1.4)](https://travis-ci.org/actframework/actframework) [![Javadocs](http://www.javadoc.io/badge/org.actframework/act.svg?color=blue)](http://www.javadoc.io/doc/org.actframework/act) [![Feature Requests](http://feathub.com/actframework/actframework?format=svg)](http://feathub.com/actframework/actframework) +[![Join the chat at https://gitter.im/actframework/actframework](https://badges.gitter.im/actframework/actframework.svg)](https://gitter.im/actframework/actframework?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Get Support on StackOverflow](https://img.shields.io/stackexchange/stackoverflow/t/actframework.svg)](https://stackoverflow.com/questions/tagged/actframework) ## Install @@ -15,7 +16,7 @@ Add `act-starter-parent` into into your pom.xml file org.actframework act-starter-parent - 1.8.32.0 + 1.8.33.0 ``` @@ -27,13 +28,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.32.0 + -DarchetypeVersion=1.8.33.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.32.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.33.0 ``` **Note** There are more ActFramework application archetypes for use. Please get them [here](ARCHETYPES.md). From d109d9b7c69261c4c80705f7df0a45ad0bc2d20c Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 27 Jun 2020 18:52:23 +1000 Subject: [PATCH 653/730] update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4847f2e79..dcf869de0 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ [![Maven Central](https://img.shields.io/maven-central/v/org.actframework/act.svg)](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.actframework%22%20AND%20a%3A%22act%22) [![Build Status](https://travis-ci.org/actframework/actframework.svg?branch=1.4)](https://travis-ci.org/actframework/actframework) [![Javadocs](http://www.javadoc.io/badge/org.actframework/act.svg?color=blue)](http://www.javadoc.io/doc/org.actframework/act) -[![Feature Requests](http://feathub.com/actframework/actframework?format=svg)](http://feathub.com/actframework/actframework) [![Join the chat at https://gitter.im/actframework/actframework](https://badges.gitter.im/actframework/actframework.svg)](https://gitter.im/actframework/actframework?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Get Support on StackOverflow](https://img.shields.io/stackexchange/stackoverflow/t/actframework.svg)](https://stackoverflow.com/questions/tagged/actframework) +[![Feature Requests](http://feathub.com/actframework/actframework?format=svg)](http://feathub.com/actframework/actframework) ## Install From 33b17d7de1b680e42c1855062f13ec842eea5030 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Jun 2020 08:14:53 +1000 Subject: [PATCH 654/730] update ARCHETYPES.md --- ARCHETYPES.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ARCHETYPES.md b/ARCHETYPES.md index 575d2f92b..a6603669f 100644 --- a/ARCHETYPES.md +++ b/ARCHETYPES.md @@ -12,13 +12,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.32.0 + -DarchetypeVersion=1.8.33.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.32.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.33.0 ``` ## Hello Service @@ -33,13 +33,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.32.0 + -DarchetypeVersion=1.8.33.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.32.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.33.0 ``` ## Bookmark @@ -56,13 +56,13 @@ mvn archetype:generate -B \ -DartifactId=bookmark \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-bookmark \ - -DarchetypeVersion=1.8.32.0 + -DarchetypeVersion=1.8.33.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-bookmark -DarchetypeVersion=1.8.32.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-bookmark -DarchetypeVersion=1.8.33.0 ``` ## Chatroom @@ -77,13 +77,13 @@ mvn archetype:generate -B \ -DartifactId=chatroom \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-chatroom \ - -DarchetypeVersion=1.8.32.0 + -DarchetypeVersion=1.8.33.0 ``` #### Create Project interactively ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-chatroom -DarchetypeVersion=1.8.32.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-chatroom -DarchetypeVersion=1.8.33.0 ``` From 1ce7b7d0a23ef619ad23ac067f446d1822b355e1 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Jun 2020 14:03:05 +1000 Subject: [PATCH 655/730] Support running act app in Java9 or above #1342 --- CHANGELOG.md | 5 ++- pom.xml | 29 +++++++++--- .../app/FullStackAppBootstrapClassLoader.java | 6 ++- src/main/java/act/conf/AppConfig.java | 45 ++++++++++++++----- .../java/act/inject/genie/GenieInjector.java | 4 +- src/main/java/act/route/Router.java | 7 ++- src/main/java/act/view/RenderTemplate.java | 10 +++-- src/main/java/act/view/Template.java | 1 + src/main/java/act/view/View.java | 2 +- 9 files changed, 79 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9d400210..8d9ac5b6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log -##1.8.33b** +**1.9.0** 28/Jun/2020 +* Support running act app in Java9 or above #1342 + +**1.8.33b** 27/Jun/2020 * Update to osgl-tool 1.25.0 * Missing fields exporting AdaptiveRecords in csv format #1340 * In case Route mapping exception occurred, it shall display the relevant source file and highlight the place where mapping failed #1313 diff --git a/pom.xml b/pom.xml index 742d687f7..88cd90ad6 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.34b-SNAPSHOT + 1.9.0-SNAPSHOT ACT Framework The ACT full stack MVC framework @@ -49,7 +49,7 @@ 5.0.6 1.2 1.3.3 - 3.12.3 + 3.22.0 1.2.71 1.1.2 0.7 @@ -60,11 +60,10 @@ 0.0.8 2.14.6 1.0.0.Final - 2.10.1 + 2.10.6 1.12.1 - - 3.12.1 + 4.7.2 1.25.0 1.8.1 @@ -77,9 +76,14 @@ 1.11.9 1.3.0 1.1.0.Final - 1.4.28.Final + 2.1.3.Final 1.25 - 3.3.3 + 3.4.0 + + + 2.3.1 + 1.3.2 + @@ -366,6 +370,17 @@ ${jpa.version} + + javax.xml.bind + jaxb-api + ${jaxb.version} + + + + javax.annotation + javax.annotation-api + ${javax.annotation-api.version} + diff --git a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java index fcf7dbed1..658cbc360 100644 --- a/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java +++ b/src/main/java/act/boot/app/FullStackAppBootstrapClassLoader.java @@ -106,7 +106,7 @@ public List> pluginClasses() { LOGGER.trace("classInfoRegistry not recovered, start searching through libBC (with total %s classes)", libBCSize()); } for (String className : C.list(libBC.keySet())) { - if (className.endsWith(".module-info")) { + if (className.endsWith("module-info") || className.startsWith("META-INF.versions.")) { continue; } try { @@ -202,6 +202,10 @@ protected long jarsChecksum() { ignores += ("," + appIgnores); } blackList.addAll(S.fastSplit(ignores, ",")); + if ($.JAVA_VERSION < 9) { + blackList.add("jaxb-"); + blackList.add("javax.annotation-"); + } return new $.Predicate() { @Override public boolean test(File file) { diff --git a/src/main/java/act/conf/AppConfig.java b/src/main/java/act/conf/AppConfig.java index ad58b1ae0..147a93a66 100644 --- a/src/main/java/act/conf/AppConfig.java +++ b/src/main/java/act/conf/AppConfig.java @@ -2561,14 +2561,24 @@ protected T sourceVersion(JavaVersion version) { public String sourceVersion() { if (null == sourceVersion) { - sourceVersion = get(AppConfigKey.SOURCE_VERSION, null); - if (null == sourceVersion) { - int javaVersion = Math.min(8, $.JAVA_VERSION); - sourceVersion = "1." + javaVersion; - } - if (sourceVersion.startsWith("1.")) { - sourceVersion = sourceVersion.substring(0, 3); - } + sourceVersion = get(SOURCE_VERSION, S.string($.JAVA_VERSION)); +// sourceVersion = get(AppConfigKey.SOURCE_VERSION, null); +// if (null == sourceVersion) { +// int n = $.JAVA_VERSION; +// if (n > 8) { +// warn("ActFramework support compiling source code up to Java 8 only"); +// n = 8; +// } +// sourceVersion = S.string(n); +// } else { +// if (sourceVersion.contains("1.")) { +// sourceVersion = sourceVersion.substring(2); +// } +// if (Integer.parseInt(sourceVersion) > 8) { +// warn("ActFramework support compiling source code up to Java 8 only"); +// sourceVersion = "8"; +// } +// } } return sourceVersion; } @@ -2605,9 +2615,22 @@ protected T targetVersion(JavaVersion version) { public String targetVersion() { if (null == targetVersion) { - targetVersion = get(TARGET_VERSION, sourceVersion()); - if (targetVersion.startsWith("1.")) { - targetVersion = targetVersion.substring(0, 3); + targetVersion = get(TARGET_VERSION, null); + if (null == targetVersion) { + int n = $.JAVA_VERSION; + if (n > 8) { + warn("ActFramework support compiling source code up to Java 8 only"); + n = 8; + } + targetVersion = S.string(n); + } else { + if (targetVersion.contains("1.")) { + targetVersion = targetVersion.substring(2); + } + if (Integer.parseInt(targetVersion) > 8) { + warn("ActFramework support compiling source code up to Java 8 only"); + targetVersion = "8"; + } } } return targetVersion; diff --git a/src/main/java/act/inject/genie/GenieInjector.java b/src/main/java/act/inject/genie/GenieInjector.java index 088a1c879..fade5ec50 100644 --- a/src/main/java/act/inject/genie/GenieInjector.java +++ b/src/main/java/act/inject/genie/GenieInjector.java @@ -45,7 +45,7 @@ public class GenieInjector extends DependencyInjectorBase { - private static final Module SCOPE_MODULE = new Module() { + private static final org.osgl.inject.Module SCOPE_MODULE = new org.osgl.inject.Module() { @Override protected void configure() { bind(ScopeCache.SessionScope.class).to(new SessionScope()); @@ -238,7 +238,7 @@ public Genie get() { } @SubClassFinder(callOn = SysEventId.DEPENDENCY_INJECTOR_INITIALIZED) - public static void foundModule(Class moduleClass) { + public static void foundModule(Class moduleClass) { addModuleClass(moduleClass); } diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index 32f76e958..d78ad18c1 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -1227,12 +1227,11 @@ protected void releaseResources() { } /** - * Returns all URL path variable names including var name of parent/ancestors - * @return + * Returns all URL path variable names including var name of parent/ancestors. + * @return all URL path variable names as described above */ public Set allVarNames() { - Set set = new HashSet<>(); - set.addAll(varNames); + Set set = new HashSet<>(varNames); Node cur = parent; while (cur != root && cur != null) { set.addAll(cur.varNames); diff --git a/src/main/java/act/view/RenderTemplate.java b/src/main/java/act/view/RenderTemplate.java index 1c9ccc883..1b970d725 100644 --- a/src/main/java/act/view/RenderTemplate.java +++ b/src/main/java/act/view/RenderTemplate.java @@ -75,14 +75,18 @@ public void apply(ActionContext context) { applyStatus(context.resp()); H.Request req = context.req(); H.Response resp = context.prepareRespForResultEvaluation(); - setContentType(req, resp); + setContentType(req, resp, t); applyBeforeCommitHandler(req, resp); t.merge(context); applyAfterCommitHandler(req, resp); } - protected void setContentType(H.Request req, H.Response resp) { - String s = req.accept().contentType(); + protected void setContentType(H.Request req, H.Response resp, Template template) { + H.Format fmt = req.accept(); + if (fmt == H.Format.UNKNOWN) { + fmt = H.Format.HTML; + } + String s = fmt.contentType(); String encoding = resp.characterEncoding(); if(S.notBlank(encoding)) { s = S.concat(s, "; charset=", encoding); diff --git a/src/main/java/act/view/Template.java b/src/main/java/act/view/Template.java index 5eb453a72..2e97ad048 100644 --- a/src/main/java/act/view/Template.java +++ b/src/main/java/act/view/Template.java @@ -54,4 +54,5 @@ public interface Template { String render(MailerContext context); boolean supportCache(); + } diff --git a/src/main/java/act/view/View.java b/src/main/java/act/view/View.java index bebc1b605..6b0573a0b 100644 --- a/src/main/java/act/view/View.java +++ b/src/main/java/act/view/View.java @@ -52,7 +52,7 @@ protected void applyTo(final App app) { public boolean appliedTo(ActContext context) { H.Format format = context.accept(); - return format.isText(); + return format.isText() || H.Format.UNKNOWN == format; } /** From 8b0240d7fbbe8322fcb04bf7551eb4546003b51f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sun, 28 Jun 2020 17:24:53 +1000 Subject: [PATCH 656/730] fix #1341, #1342, #1344 --- CHANGELOG.md | 2 ++ legacy-testapp/pom.xml | 4 +++- .../main/java/testapp/endpoint/Arguments.java | 2 +- .../src/main/java/testapp/sbean/SimpleModel.java | 2 -- pom.xml | 5 ++++- .../builtin/controller/RequestHandlerProxy.java | 3 --- src/main/java/act/util/ClassNode.java | 4 ++++ src/main/java/act/util/SimpleBean.java | 2 +- testapps/GHIssues/pom.xml | 16 ++++++++++------ 9 files changed, 25 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d9ac5b6b..ccece90b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ # ActFramework Change Log **1.9.0** 28/Jun/2020 +* The error triggered during rendering response get warned twice #1341 * Support running act app in Java9 or above #1342 +* SimpleBean bytecode enhancer caused "java.lang.ClassFormatError: Interface cannot have a method named " issue #1344 **1.8.33b** 27/Jun/2020 * Update to osgl-tool 1.25.0 diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index ced61c91f..d601c3a99 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -18,6 +18,8 @@ ******************************************** * version history ******************************************** +1.9.0 + - update to ActFramework 1.9.x 1.8.0 - update to ActFramework 1.8.x @@ -73,7 +75,7 @@ UTF-8 UTF-8 - 1.8.33-SNAPSHOT + 1.9.0-SNAPSHOT [0.13.0, 2.0.0) 1.9.1-SNAPSHOT testapp.TestApp diff --git a/legacy-testapp/src/main/java/testapp/endpoint/Arguments.java b/legacy-testapp/src/main/java/testapp/endpoint/Arguments.java index d15889bf8..2bebcf0fe 100644 --- a/legacy-testapp/src/main/java/testapp/endpoint/Arguments.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/Arguments.java @@ -1,8 +1,8 @@ package testapp.endpoint; import act.cli.Command; -import act.cli.JsonView; import act.cli.Optional; +import act.util.JsonView; import org.osgl.util.C; import java.util.List; diff --git a/legacy-testapp/src/main/java/testapp/sbean/SimpleModel.java b/legacy-testapp/src/main/java/testapp/sbean/SimpleModel.java index 8fcc28c38..947fc7a09 100644 --- a/legacy-testapp/src/main/java/testapp/sbean/SimpleModel.java +++ b/legacy-testapp/src/main/java/testapp/sbean/SimpleModel.java @@ -3,9 +3,7 @@ import act.util.SimpleBean; public interface SimpleModel extends SimpleBean { - class SomeModel implements SimpleModel { public SomeModel(boolean flag) {} } - } diff --git a/pom.xml b/pom.xml index 88cd90ad6..8d608c07e 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,10 @@ 1.1.2 0.7 1.18 + + 2.4.0 + 1 1.5.0-b01 0.0.8 @@ -77,7 +80,7 @@ 1.3.0 1.1.0.Final 2.1.3.Final - 1.25 + 1.26 3.4.0 diff --git a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java index cfc8e0257..e3305b398 100644 --- a/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java +++ b/src/main/java/act/handler/builtin/controller/RequestHandlerProxy.java @@ -262,9 +262,6 @@ public void handle(ActionContext context) { } else { H.Request req = context.req(); result = ActErrorResult.of(e); - if (result.status().isServerError()) { - logger.error(e, "Server error encountered on handling request: " + req); - } } } try { diff --git a/src/main/java/act/util/ClassNode.java b/src/main/java/act/util/ClassNode.java index a8cfdae9d..2855db692 100644 --- a/src/main/java/act/util/ClassNode.java +++ b/src/main/java/act/util/ClassNode.java @@ -84,6 +84,10 @@ public boolean isPublic() { return Modifier.isPublic(modifiers); } + public boolean isInterface() { + return Modifier.isInterface(modifiers); + } + public boolean isAbstract() { return Modifier.isAbstract(modifiers) || Modifier.isInterface(modifiers); } diff --git a/src/main/java/act/util/SimpleBean.java b/src/main/java/act/util/SimpleBean.java index 0a2bf72b2..0beda8944 100644 --- a/src/main/java/act/util/SimpleBean.java +++ b/src/main/java/act/util/SimpleBean.java @@ -159,7 +159,7 @@ private boolean isSimpleBean(String className) { if (null == node) { return false; } - return node.hasInterface(INTF_SIMPLE_BEAN); + return !node.isInterface() && node.hasInterface(INTF_SIMPLE_BEAN); } public MetaInfo get(String className) { diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 2ea087a80..b89abe6a2 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -5,14 +5,14 @@ 4.0.0 act-ghissues - 1.8.33.0-SNAPSHOT + 1.9.0-SNAPSHOT ActFramework Github Issue Reproduce App org.actframework act-starter-parent - 1.8.32.0 + 1.8.33.0 @@ -22,18 +22,23 @@ + + org.osgl + aaa-core + 1.10.0 + org.actframework act - 1.8.33-SNAPSHOT + 1.9.0-SNAPSHOT org.actframework - act-excel-java7 + act-excel com.zaxxer - HikariCP-java7 + HikariCP @@ -57,7 +62,6 @@ org.actframework act-aaa - 1.7.2-SNAPSHOT + 1.8 + test.AppEntry + + + + + + org.actframework + act + 1.9.1-SNAPSHOT + + + + diff --git a/testapps/GH1364/run_dev b/testapps/GH1364/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GH1364/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH1364/run_dev.bat b/testapps/GH1364/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GH1364/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GH1364/run_e2e b/testapps/GH1364/run_e2e new file mode 100755 index 000000000..39a6606d6 --- /dev/null +++ b/testapps/GH1364/run_e2e @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH1364/run_e2e.bat b/testapps/GH1364/run_e2e.bat new file mode 100755 index 000000000..ea9f51de7 --- /dev/null +++ b/testapps/GH1364/run_e2e.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:e2e \ No newline at end of file diff --git a/testapps/GH1364/run_prod b/testapps/GH1364/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GH1364/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GH1364/src/main/java/test/AppEntry.java b/testapps/GH1364/src/main/java/test/AppEntry.java new file mode 100644 index 000000000..ce1b9385b --- /dev/null +++ b/testapps/GH1364/src/main/java/test/AppEntry.java @@ -0,0 +1,24 @@ +package test; + +import act.Act; +import act.controller.Controller; +import act.util.JsonView; +import org.joda.time.LocalDate; +import org.osgl.mvc.annotation.GetAction; + + +@SuppressWarnings("unused") +@JsonView +public class AppEntry extends Controller.Util { + + @GetAction + public LocalDate test(LocalDate date) { + return date; + } + + + public static void main(String[] args) throws Exception { + Act.start(); + } + +} diff --git a/testapps/GH1364/src/main/resources/conf/app.properties b/testapps/GH1364/src/main/resources/conf/app.properties new file mode 100644 index 000000000..1e146d868 --- /dev/null +++ b/testapps/GH1364/src/main/resources/conf/app.properties @@ -0,0 +1,801 @@ +i18n=true +############################################## +# Application configuration +# act-1.8.8-RC12-SNAPSHOT +############################################## + +# When `api_doc` is enabled it can navigate to +# http://localhost:5460/~/apidoc +# for API Document. +# +# API doc is enabled by default +# +# uncomment to disable API doc +#api_doc=false + +# When `api_doc.built_in.hide` is enabled the API document +# will not display built-in endpoints, e.g. +# `/~/info` +# +# built-in endpoints is visible in API doc by default +# +# uncomment to hide built-in endpoints in API doc +#api_doc.built_in.hide=true + +# `basic_authentication` is not used by actframework +# core, however plugins like `act-aaa-plugin` use +# this configuration to check if HTTP basic +# authentication is allowed. +# +# basic authentication is disabled by default +# +# uncomment to enable basic authentication +#basic_authentication=true + +# When `built_in_req_handler` is disabled it will +# not be able to access framework built-in endpoints +# including `/~/info`, `/~/version` etc. +# However the following built-in endpoints is still +# available: +# * GET /~/job/{id}/progress - required by runtime application +# * GET /~/api/book/** - only available in dev mode +# +# built-in endpoints is enabled by default +# +# uncomment to disable built endpoints +#built_in_req_handler=false + +# Configure the cache implementation used by ActFramework. +# The cache class specified must implement +# `org.osgl.cache.CacheServiceProvider` interface. +# +# If not specified cache implementation is determined by +# osgl-cache library automatically depending on the +# libraries available in the following order: +# 1. Memcached service +# 2. EhCache service +# 3. OSGL implemented Simple Cache service based on concurrent hash map +# +# uncomment to set your own cache implementation +#cache.impl= + +# By default @CacheFor annotation is not effective in `dev` mode. +# the `cacheFor.dev` configuration can be used to turn on +# @CacheFor in `dev` mode. +# +# uncomment to enable @CacheFor annotation in `dev` mode +#cacheFor.dev=true + +# CLI service listens to local ip addresses to provide telent +# access for command line access to the running app. +# +# CLI service is enabled by default +# +# uncomment to disable CLI service +#cli=false + +# By default CLI port is `5461` +# +# uncomment to set CLI port +#cli.port= + +# `cli.page.size.json` specifies the number of records to display +# per page for CLI JSON view. +# +# Default CLI JSON view page size is 10 records +# +# uncomment to set CLI JSON view page size +#cli.page.size.json= + +# `cli.page.size.table` specifies the number of records to display +# per page for CLI tabular view. +# +# Default CLI table view page size is 22 records +# +# uncomment to set CLI table view page size +#cli.page.size.table= + +# `cli.session.ttl` specifies the number of seconds a CLI +# session will be terminated without interaction. +# +# The default CLI session ttl is 300 seconds, i.e. 5 minutes +# +# uncomment to set CLI session ttl +#cli.session.ttl + +# `cli.session.max.int` specifies the maximum concurrent CLI session +# +# The default limits is 3 +# +# uncomment to set CLI session max +#cli.session.max.int + +# `cookie.prefix` specifies the session/flash cookie prefix. +# +# The default cookie prefix is the `shortId` of the application. +# +# uncomment to customize session/flash cookie prefix. +#cookie.prefix= + +# When `cors` is enabled ActFramework will automatically populate the +# CORS relevant headers in HTTP response. +# +# When `cors` is disabled all other `cors` relevant settings is not effective. +# +# By default `CORS` is disabled +# +# uncomment to enable CORS support +#cors=true + + +# `cors.origin` set the `Access-Control-Allow-Origin` response header. +# +# Default CORS origin header value is `*` +#cors.origin= + +# `cors.headers` set the `Access-Control-Expose-Headers` response header. +# +# Default value is `Content-Type, X-HTTP-Method-Override` +#cors.headers= + +# `cors.headers.expose` set the `Access-Control-Expose-Headers` response header. +# +# Default value is empty. +#cors.headers.expose= + +# `cors.headers.allowed` set the `Access-Control-Allow-Headers` response header. +# +# Default value is empty. +#cors.headers.allowed= + +# `cors.max_age` set the `Access-Control-Max-Age` response header +# +# Default value is `30*60` i.e. 30 minutes +#cors.max_age + +# `cors.allow_credentials.enabled` set the `Access-Control-Allow-Credential` response header +# +# By default this setting is disabled +# +# Uncomment the set `Access-Control-Allow-Credential` to `true` +#cors.allow_credentials=true + +# If `content_suffix.aware` is enabled the framework adjust Request `Accept` +# header based on URL suffix. +# +# E.g. `/customer/123/json` will match the route `/customer/123` +# and set the `Accept` header of the incoming request to `application/json` +# +# By default `content_suffix.aware` is disabled. +# +# Uncomment to enable `content_suffix.aware.enabled` +#content_suffix.aware.enabled=true + +# `csp` set the `Content-Security-Policy` response header value. +# +# By default `csp` is not set. +#csp= + +# `csrf` turn on/off the CSRF protection. +# See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) +# +# By default `csrf` protection is disabled +# +# uncomment to turn on CSRF protection. +#csrf=true + +# `csrf.param_name` specifies the http request param name +# used to convey the csrf token. +# +# Default value: `__csrf__` +#csrf.param_name + +# `csrf.header.name` specifies name of the http request header +# used to convey the csrf token sent from AJAX client. +# +# Default value: `X-Xsrf-Token` +#csrf.header_name= + +# `csrf.cookie_name` specify the name of the cookie used to +# convey the csrf token generated on the server for the first GET +# request coming from a client. +# +# Default value: `XSRF-TOKEN` +#csrf.cookie_name + +# `csrf.protector` specifies the implementation of `act.security.CSRFProtector`. +# +# Default protector implementation is `HMAC` +# +# uncomment to set csrf protector implementation +#csrf.protector=RANDOM|className + +# `db.seq_gen` specifies the implementation of `act.db.util._SequenceNumberGenerator` +# +# Default value is `null` or an implementation specified by db plugin +#db.seq_gen= + +# `dsp.token` specifies the name of "double submission protect token" +# +# Default value: `act_dsp_token` +#dsp.token= + +# `enum.resolving.exact_match` specify whether it shall resolve enum value +# in exact matching way or Keyword based variation way. +# +# Keyword based variation matching explain: +# +# Suppose we have an enum defination: `enum TestEnum {FOO_BAR} +# All the following string variations can be resolved to `TestEnum.FOO_BAR`: +# +# * FOO_BAR +# * Foo-Bar +# * Foo.Bar +# * foo-bar +# * foo_bar +# * FooBar +# * fooBar +# +# Default value is `false` meaning enum type value resolving is +# non-exact matching +# +# uncomment to make Enum type parameter resolving be exact matching +#enum.resolving.exact_match=false + +# `fmt.date` specifies the pattern for Date type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Note custom pattern shall not contain any symbol for time, e.g. `H` or `m` +# Default value: `medium` +fmt.date=dd:MM:yyyy + +# `fmt..date` specifies the pattern for Date type for specific locale +# +# It can specify date formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date` +#fmt.zh_cn.date=yyyy\u5E74MM\u6708dd\u65E5 + + +# `fmt.data_time` specifies the pattern for DataTime type value resolving. +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `EEE yyyy MMM dd` +# +# Default value: `medium` +#fmt.date_time= + +# `fmt..date_time` specifies the pattern for DateTime type for specific locale +# +# It can specify date_time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.date_time` +#fmt.zh_cn.date_time=yyyy\u5E74MM\u6708dd\u65E5 HH:mm + +# `fmt.time` specifies the pattern for Time type value resolving +# +# The setting can be any one of +# - long +# - medium +# - short +# - custom pattern, e.g. `HHmmss` +# +# Note custom pattern shall not contain any symbol for date, e.g. `y` or `M` +# Default value: `medium` +#fmt.time= + +# `fmt..time` specifies the pattern for Time type for specific locale. +# +# It can specify time formats for multiple locales +# +# Default value: `medium` +# see also: `fmt.time` +#fmt.zh_cn.time=HH:mm + +# `handler.csrf_check_failure` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when CSRF checking failed. +# +# Default value is the setting of `handler.missing_authentication` +#handler.csrf_check_failure= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an non-AJAX request. +# +# Default value is `act.util.RedirectToLoginUrl` if login URL is in the route table. +# otherwise it is `act.util.ReturnUnauthorized` +#handler.missing_authentication= + +# `handler.missing_authentication` specifies the implemetation of `MissingAuthenticationHandler` +# to be called when authentication is failed on an AJAX request. +# +# Default value is the setting of `handler.missing_authentication` +#handler.missing_authentication.ajax= + +# `handler.unknown_http_method` specifies the handler implementation to be called +# when ActFramework found the HTTP method of an incoming request is not supported +# +# Default value is `UnknownHttpMethodProcessor.METHOD_NOT_ALLOWED`, i.e. +# respond `405 Method Not Allowed` response. +#handler.unknown_http_method= + +# `act.header.overwrite` turn on/off HTTP HEADER overwrite. +# +# Once this config is turned on, then it can overwrite header +# with HTTP Query parameter or HTTP post form field. The naming +# convention of the param/field is: +# +# ``` +# act_header_ +# ``` +# +# For example, if it needs to overwrite `Content-Type`, use +# `act_header_content_type` as the query parameter name. +# +# Default value: `false` +#header.overwrite=true + + +# `header.session.expiration` specifies name of the HTTP response header to be +# used to convey the JWT/session cookie expiration time. +# +# Default value is `Act-Session-Expires` +#header.session.expiration= + +# `host` specifies the hostname of the application. +# +# This setting is often used to concatentate full URL including host +# in email template. +# +# Default value: `localhost` +#host= + +# `http.external_server` specify if the app is running behind a frontend +# http server, e.g. nginx. +# +# Default value: `true` when running in `prod` mode or `false` when running in `dev` mode +#http.external_server=true|false + +# `http.params.max` specifies the maximum number of http parameters. +# +# This setting can be to prevent the hash collision DOS attack. +# +# Default value: 128 +#http.params.max= + +# `http.port` specifies the default HTTP port number +# +# Default value: 5460 +#http.port= + +# `http.port.external` specifies the default HTTP port number of +# frontend HTTP server (if exists). +# +# Default value: 80 +#http.port.external= + +# `http.port.external.secure` specifies the default HTTPS port number of +# the frontend HTTP server (if exists) +# +# Default value: 443 +#http.port.external.secure= + +# `http.secure` specifies whether the default http port is running in +# an secure HTTP channel +# +# Default value: `true` when running in `prod` mode or `false` in `dev` mode +#http.secure=true|false + +# `https.port` specify the https port - only effect +# when `ssl` is enabled. +# +# Default value: `5443` +#https.port= + +# `i18n` turn on/off i18n support in ActFramework. +# +# Default value: false +#i18n=true|false + +# `i18n.locale.param_name` specifies the param name to set client locale +# in http request +# +# Default value: `act_locale` +#i18n.locale.param_name= + +# `i18n.locale.cookie_name` specifies the name for the locale cookie +# +# Default value: `act_locale` +#i18n.locale.cookie_name= + +# `idgen.node_id.provider` specifies the implementation of +# `act.util.IdGenerator.NodeIdProvider` which is called when generating the +# CUID (Custer Unique Identifier) +# +# Default value: `act.util.IdGenerator.NodeIdProvider.IpProvider` +#idgen.node_id.provider= + +# `idgen.node_id.effective_ip_bytes.size` specifies how many bytes in the ip address +# will be used to calculate node ID. Usually in a cluster environment, the ip address will +# be different at only (last) one byte or (last) two bytes, in which case it could set this +# configuration to `1` or `2`. When the configuration is set to `4` then it means all 4 IP +# bytes will be used to calculate the node ID +# +# Default value: 4 +#idgen.node_id.effective_ip_bytes.size=1|2|3|4 + +# `idgen.start_id.provider` specifies the `act.util.IdGenerator.StartIdProvider` +# implementation which is called when generating the CUID +# +# Default value: `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# which read/write the file specified by `idgen.start_id.file` setting in +# the project dir. +#idgen.start_id.provider= + +# `idgen.start_id.file` specifies the start id persistent file. +# This setting is used by `act.util.IdGenerator.StartIdProvider.DefaultStartIdProvider` +# +# Default value: `.act.id-app` +#idgen.start_id.file= + +# `idgen.seq_id.provider` specifies the `act.util.IdGenerator.SequenceProvider` +# implementation which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SequenceProvider.AtomicLongSeq` +#idgen.seq_id.provider= + +# `idgen.encoder` specifies the `act.util.IdGenerator.LongEncoder` implementation +# which is called when generating the CUID. +# +# Default value: `act.util.IdGenerator.SafeLongEncoder` which generates URL +# safe and slighty longer string for long value encoding. +#idgen.encoder=act.util.IdGenerator.SafeLongEncoder|act.util.IdGenerator.UnsafeLongEncoder + +# `job.pool.size` specifies the maximum number of threads +# can exists in the application's job manager's thread pool +# +# Default value: 10 +#job.pool.size= + +# `jwt` enable/disable JWT support. +# This is actually a combination of the following settings: +# * session.codec=act.session.JsonWebTokenSessionCodec +# * session.header.payload.prefix="Bearer " # note the space after `Bearer` +# * session.header=Authorization +#jwt=true|false + +# `jwt.algo` specifies the algorithm used to encrypt/decrypt JWT. +# +# Default value: SHA256 +#jwt.algo=SHA256|SHA384|SHA512 + +# `jwt.issuer` specify `iss` payload of JWT +# +# Default value: the setting of `cookie.prefix` +#jwt.issuer= + +# `locale` specifies the application default locale +# +# Default value: the result of calling `java.util.Locale#getDefault()` +#locale= + +# `metric` turn on/off internal metrics. +# +# Default value: true +#metric=true|false + +# `modules` declare additional app base (for multi-module maven projects) +#modules= + +# `namedPorts` specifies a list of port names this +# application listen to. These are additional ports other than +# the default `http.port` setting. +# +# Default value: null +#namedPorts=admin:8888;ipc:8899;... + +# `password.spec` specify default password spec which is used to +# validate user password. +# +# Default value: +# * dev mode: `a[3,]`, meaning require lower case letter and min length is 3 characters. +# * prod mode: `aA0[6,]`, meaning require lower case letter, uppercase letter, digit and min length is 6 characters. +# +# Developer can also specify a `Password.Validator` implementation +# class for this configuration, in which case, the framework will instantiate the user +# specified validator instead of `act.validation.PasswordSpec` as the default +# password validator. +# +#password.spec= + +# `ping.path` specify the ping path. +# If this setting is specified, then when session resolving, system +# will check if the current URL matches the setting. If matched +# then session cookie expiration time will not be changed. Otherwise +# the expiration time will refresh +# +# Default value: `null` +#ping.path= + +# `req.throttle` specifies the maximum number of requests +# that can be handled per second from the same ip address +# when `@Throttled` annotation is presented without `value` +# specified on a request handler method. +# +# Default value: 2 +#req.throttle= + +# `req.throttle.expire.scale` turn on/off request throttle +# expiry time increment. +# +# Default value: `false` +#req.throttle.expire.scale=true|false + +# `render.json.content_type.ie` specify whether the content type +# of JSON response on request initiated from an IE browser. +# +# Note early IE browser does not support the `application/json` content type. +# +# Default value: `null` +#render.json.content_type.ie= + +# `resolver.template_path` specifies the class that extends +# `TemplatePathResolver`. Application developer could use this +# configuration to add some flexibility to +# template path resolving logic, e.g. different home +# for different locale or different home for different device +# type etc +# +# Defautl value: `TemplatePathResolver` +#resolver.template_path + +# `resource.preload.size.limit` Specifies the maximum number of bytes of +# a resource that can be preload into memory. Specify the setting to +# `0` or negative value disable resource preload feature. +# +# Default value: `1024 * 10`, i.e. 10KB +#resource.preload.size.limit= + +# `scan_package` specify the app package in which all classes is subject +# to bytecode processing, e.g enhancement and injection. +# +# By default ActFramework will infer the scan package +# from the app entry class which contains the main method +# starting act. +# +#scan_package= + +# `act.secret` Specifies the secret key the application used to do general +# encrypt/decrypt/sign etc +# +# Note application must set this configuration to secure the communication +act.secret=xcgXKMICkvZ3k3uLj2AIiarXjLt2Lr6nHzvkBs9o1a9eKyspfvSd1eKYYSYNAhu8 + +# `secret.rotate` turn on app secret rotation for session/flash +# token signing and encrypt. This feature makes it even harder +# to crack as secret changes regularly. +# +# Default value: false +#secret.rotate=true|false + +# `secret.rotate.period` set the secret rotate period in terms of minute. +# +# **Note** the number of minute must be a factor of 60. Any number that +# is not the factor of 60 then it will be up rounded: +# +# * 1 -> 1 +# * 2 -> 2 +# * 3 -> 4 +# * 4 -> 4 +# * 5 -> 5 +# * 6 -> 6 +# * 7 -> 10 +# * 8 -> 10 +# * 33 -> 30 +# * 50 -> 60 +# +# the rotation period less than hour will be count from the beginning of +# the current hour. +# +# If the number minutes exceeds 60, then it must be a factor of 60 * 24. Any +# number if not will be rounded: +# +# * 65 -> 60 +# * 60 * 3 -> 60 * 3 +# * 60 * 5 -> 60 * 6 +# * 60 * 7 -> 60 * 6 +# * 60 * 10 -> 60 * 12 (half day) +# +# if the number of minutes equals of exceeds 120, the rotation period will +# be counted from the beginning of the day. +# +# The maximum period is `60 * 24`, i.e. 24 hours. Any setting exceed that number +# will be cut off down to 24 hours. +# +# Default value: `30` minutes, ie. half an hour +#secret.rotate.period= + +# `server.header` specifies the server header to be output to the response +# +# Default value: `act/${act-version}` +#server.header= + +#`session.outputExpiration.enabled` turn on/off expiration output to +# response header. +# +# This setting only effective when it is using token to +# map session payload. +# +# Default value: `true` +#session.outputExpiration=true|false + +# `session.ttl` specifies the session duration in seconds. +# If user failed to interact with server for amount of time that +# exceeds the setting then the session will be destroyed +# +# Default value: `60 * 30` i.e half an hour +#session.ttl= + +# `session.persistent` specify whether the system +# should treat session cookie as persistent cookie. If this setting +# is enabled, then the user's session will not be destroyed after +# browser closed. +# +# Refer to http://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie +# +# Default value: `false` +#session.persistent=true|false + +# `session.encrypted` specify whether the system should +# encrypt the key/value pairs in the session cookie. Enable session +# encryption will greatly improve the security but with the cost +# of additional CPU usage and a little bit longer time on request +# processing. +# +# Default value: `false` +#session.encrypted=true|false + +# `session.key.username` specifies the session key for username +# +# Default value: `username` +#session.key.username= + +# `session.mapper` specifies the implementation of `act.session.SessionMapper` +# Predefined session mappers: +# * `act.session.CookieSessionMapper` - map session data to session cookie +# * `act.session.HeaderTokenSessionMapper` - map session data to header token +# * `act.session.CookieAndHeaderSessionMapper` - map session data to both cookie and header +# +# Default value:`act.session.CookieSessionMapper` +#session.mapper= + +# `session.codec` specifies the implementation of `act.session.SessionCodec` +# Predefined session codec: +# * `act.session.DefaultSessionCodec` +# * `act.session.JsonWebTokenSessionCodec` +# +# Default value: `act.session.DefaultSessionCodec` when `jwt` is `false` +# or `act.session.JsonWebTokenSessionCodec` when `jwt` is `true` +#session.codec= + +# `session.header` - specify the session header name. +# +# Effective only when `act.session.SessionMapper` is `act.session.HeaderTokenSessionMapper` +# +# Default value: X-Act-Session when `jwt` is `false` +# or `Authorization` when `jwt` is `true` +#session.header= + +# `session.header.payload.prefix` set the session payload prefix, e.g. `Bearer ` +# +# Default value: `null` when `jwt` is `false` +# or `Bearer ` when `jwt` is `true` +#session.header.payload.prefix= + +# `session.secure` specifies whether the session cookie should +# be set as secure. Enable secure session will cause session cookie only +# effective in https connection. Literally this will enforce the web site to run +# default by https. +# +# Default value: `true` +# +# **Note** when {@link Act Act server} is running in {@link Act.Mode#DEV mode} +# session http only will be disabled without regarding to the `session.secure.enabled` +# setting +#session.secure=true|false + +# `source.version` specifies the java version +# of the src code. This configuration is used only +# in dev mode. +# +# Default value: 1.7 +#source.version= + +# `ssl` turn on/off SSL support. +# +# Default value: `false` +# +# **Note** this is experimental feature +#ssl=true|false + +# `target.version` specifies the java version of the compile +# target code. This configuration is used only in dev mode. +# +# Default value: 1.7 +#target.version= + +# `template.home` specifies where the view templates resides. +# If not specified then will use the {@link View#name() view name +# in lower case} as the template home if that view is used. +# +# Default value: the result of `View.name()` +#template.home= + +# `threadlocal_buf.limit` set the maximum buffer size of thread local instance +# of `org.osgl.util.S.Buffer` and `org.osgl.util.ByteArrayBuffer`. If the buffer +# size exceeds the limit, the thread local instance will be dropped and new +# instance will be created as the thread local instance. +# +# Default value: 1024 * 8 (i.e. 8k) +#threadlocal_buf.limit= + +# `trace.handler` turn on/off handle invocation calls. +# +# When this configuration is turned on, every call to the +# action handler/job handler/mail sender method will be logged. +# +# Default value: `false` +#trace.handler=true|false + +# `trace.request` turn on/off incoming request log +# +# When this configuration is turned on, every incoming request +# will be logged +# +# default value: `false` +#trace.request=true|false + +# `upload.in_memory.threshold` +# +# If file upload content length is less than this configuration then +# the file will not get written into disk, instead it will get cached +# into a in memory byte array +# +# Default value: `1024 * 10` +#upload.in_memory.threshold + +# `url.context` specifies the app global URL context. +# +# If this configuration is specified then all route configured will +# be attached to the configured context path. +# +# Default value: `null` +#url.context= + +# `url.login` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} +# +# Default value: `/login` +#url.login= + +# `url.login.ajax` specifies the login URL which is used +# by {@link act.util.RedirectToLoginUrl} when request is AJAX +# +# Default value: the value of `url.login` setting +#url.login.ajax + +# `view.default` specifies the default view solution. If there +# are multiple views registered and default view are available, then +# it will be used at priority to load the templates +# +# Default value: `rythm` +#view.default= diff --git a/testapps/GH1364/src/main/resources/conf/prod/app.properties b/testapps/GH1364/src/main/resources/conf/prod/app.properties new file mode 100644 index 000000000..5f0017b9a --- /dev/null +++ b/testapps/GH1364/src/main/resources/conf/prod/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for prod profile +# act-1.8.8-RC12-SNAPSHOT +############################################## +act.secret=clypiSZ9qOFMZ8JgAdutcvPctiPYRhC4HFkjcvwhf9j3YQrAUxAx9cUL0FzmnlRB \ No newline at end of file diff --git a/testapps/GH1364/src/main/resources/conf/uat/app.properties b/testapps/GH1364/src/main/resources/conf/uat/app.properties new file mode 100644 index 000000000..844739167 --- /dev/null +++ b/testapps/GH1364/src/main/resources/conf/uat/app.properties @@ -0,0 +1,5 @@ +############################################## +# Application configuration for uat profile +# act-1.8.8-RC12-SNAPSHOT +############################################## +act.secret=AkrRnS5yuyq98LmEBRwoQom9nCIj8oLlXEKRUjXiBlbjPc0phCf7VL3yJOJqjjbC \ No newline at end of file diff --git a/testapps/GH1364/src/main/resources/logback.xml b/testapps/GH1364/src/main/resources/logback.xml new file mode 100644 index 000000000..83909e662 --- /dev/null +++ b/testapps/GH1364/src/main/resources/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + e2e.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH1364/src/main/resources/messages.properties b/testapps/GH1364/src/main/resources/messages.properties new file mode 100644 index 000000000..853b8995a --- /dev/null +++ b/testapps/GH1364/src/main/resources/messages.properties @@ -0,0 +1 @@ +osgl.result.unauthorized=Please login \ No newline at end of file diff --git a/testapps/GH1364/src/test/resources/scenarios/test.yml b/testapps/GH1364/src/test/resources/scenarios/test.yml new file mode 100644 index 000000000..5e3ef819d --- /dev/null +++ b/testapps/GH1364/src/test/resources/scenarios/test.yml @@ -0,0 +1,11 @@ +Scenario(1255): + description: "I18n - date format setting not effective" + interactions: + - description: test + request: + headers: + Accept-Language: en + get: ?date=12:12:2019 + response: + result: + - before: ${today} \ No newline at end of file diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index 49175fd25..3b167701c 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -12,7 +12,7 @@ org.actframework act-starter-parent - 1.9.0.1 + 1.9.0.2 @@ -57,13 +57,19 @@ cn.hutool hutool-all - [4.1.12,) + 5.5.4 org.actframework act-aaa + + com.warrenstrange + googleauth + 1.5.0 + + From c7d13524edfb50de8ee19d713f91e63c708d7c66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 01:46:09 +0000 Subject: [PATCH 704/730] Bump fastjson from 1.2.75 to 1.2.83 Bumps [fastjson](https://github.com/alibaba/fastjson) from 1.2.75 to 1.2.83. - [Release notes](https://github.com/alibaba/fastjson/releases) - [Commits](https://github.com/alibaba/fastjson/compare/1.2.75...1.2.83) --- updated-dependencies: - dependency-name: com.alibaba:fastjson dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index abf61e323..2c9d028fc 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2 1.3.3 3.22.0 - 1.2.75 + 1.2.83 1.1.2 0.7 1.18 From 244321ac1f8f7f5da8d422d92283c6d573a3ac77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Sep 2022 22:58:09 +0000 Subject: [PATCH 705/730] Bump jsoup from 1.14.2 to 1.15.3 Bumps [jsoup](https://github.com/jhy/jsoup) from 1.14.2 to 1.15.3. - [Release notes](https://github.com/jhy/jsoup/releases) - [Changelog](https://github.com/jhy/jsoup/blob/master/CHANGES) - [Commits](https://github.com/jhy/jsoup/compare/jsoup-1.14.2...jsoup-1.15.3) --- updated-dependencies: - dependency-name: org.jsoup:jsoup dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index abf61e323..c0dd92855 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ 2.14.6 1.0.0.Final 2.10.6 - 1.14.2 + 1.15.3 4.7.2 From 2e90cdca0352755c26aa80bacf144c22c9cb3a76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Sep 2022 03:35:07 +0000 Subject: [PATCH 706/730] Bump snakeyaml from 1.26 to 1.31 in /legacy-testapp Bumps [snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) from 1.26 to 1.31. - [Commits](https://bitbucket.org/snakeyaml/snakeyaml/branches/compare/snakeyaml-1.31..snakeyaml-1.26) --- updated-dependencies: - dependency-name: org.yaml:snakeyaml dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- legacy-testapp/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 1036b988a..9c9ea1402 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -210,7 +210,7 @@ org.yaml snakeyaml - 1.26 + 1.31 From 4a26c6e1bd6f60af5e8271e9f70286271cf50ecd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Sep 2022 03:35:09 +0000 Subject: [PATCH 707/730] Bump snakeyaml from 1.26 to 1.31 Bumps [snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) from 1.26 to 1.31. - [Commits](https://bitbucket.org/snakeyaml/snakeyaml/branches/compare/snakeyaml-1.31..snakeyaml-1.26) --- updated-dependencies: - dependency-name: org.yaml:snakeyaml dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index abf61e323..89e5295cd 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 1.3.1 1.1.0.Final 2.1.6.Final - 1.26 + 1.31 3.4.0 From 9b15871bb32327a31d83855d4234baa2bc635abf Mon Sep 17 00:00:00 2001 From: Jonathan Leitschuh Date: Sat, 19 Nov 2022 02:07:53 +0000 Subject: [PATCH 708/730] vuln-fix: Temporary File Information Disclosure This fixes temporary file information disclosure vulnerability due to the use of the vulnerable `File.createTempFile()` method. The vulnerability is fixed by using the `Files.createTempFile()` method which sets the correct posix permissions. Weakness: CWE-377: Insecure Temporary File Severity: Medium CVSSS: 5.5 Detection: CodeQL & OpenRewrite (https://public.moderne.io/recipes/org.openrewrite.java.security.SecureTempFileCreation) Reported-by: Jonathan Leitschuh Signed-off-by: Jonathan Leitschuh Bug-tracker: https://github.com/JLLeitschuh/security-research/issues/18 Co-authored-by: Moderne --- src/main/java/act/app/AppClassLoader.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index 67afa07c4..d1a841b45 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -51,6 +51,7 @@ import java.io.*; import java.lang.annotation.Annotation; import java.net.*; +import java.nio.file.Files; import java.util.*; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; @@ -514,7 +515,7 @@ private Class loadAppClass(String name, boolean resolve) throws ClassNotFound } return c; } catch (VerifyError e) { - File f = File.createTempFile(name, ".class"); + File f = Files.createTempFile(name, ".class").toFile(); IO.write(baNew, f); throw e; } From a7af84968c0a811af5cfbdeea06f9dce1ac66846 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Nov 2022 20:21:28 +0000 Subject: [PATCH 709/730] Bump undertow-core from 2.1.6.Final to 2.2.19.Final Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.1.6.Final to 2.2.19.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.1.6.Final...2.2.19.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a4252884b..8ef7f4bf3 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ 1.11.9 1.3.1 1.1.0.Final - 2.1.6.Final + 2.2.19.Final 1.31 3.4.0 From f0704ecb403af1d5fe6ae58d615d97505ca68a41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Aug 2021 21:00:28 +0000 Subject: [PATCH 710/730] Bump jsoup from 1.12.1 to 1.14.2 Bumps [jsoup](https://github.com/jhy/jsoup) from 1.12.1 to 1.14.2. - [Release notes](https://github.com/jhy/jsoup/releases) - [Changelog](https://github.com/jhy/jsoup/blob/master/CHANGES) - [Commits](https://github.com/jhy/jsoup/compare/jsoup-1.12.1...jsoup-1.14.2) --- updated-dependencies: - dependency-name: org.jsoup:jsoup dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7491bce11..ca8d30488 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ 2.14.6 1.0.0.Final 2.10.6 - 1.12.1 + 1.14.2 4.7.2 From 2581faa1f89776bd9f08d8e6911857c0b9c2b68a Mon Sep 17 00:00:00 2001 From: benstone Date: Mon, 28 Jun 2021 21:38:29 +0800 Subject: [PATCH 711/730] fix index error when process string substitution --- src/main/java/act/test/TestSession.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/act/test/TestSession.java b/src/main/java/act/test/TestSession.java index 918c27b62..9f19c7786 100644 --- a/src/main/java/act/test/TestSession.java +++ b/src/main/java/act/test/TestSession.java @@ -312,8 +312,9 @@ String processStringSubstitution(String s) { buf.append(getVal(key, payload)); } n = s.indexOf("${", a); + a++; if (n < 0) { - buf.append(s.substring(a + 1)); + buf.append(s.substring(a)); return buf.toString(); } z = n; From 032d4efec125a684dd0b8b891e8bc2604607cc6b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Aug 2021 22:52:32 +0000 Subject: [PATCH 712/730] Bump undertow-core from 2.1.3.Final to 2.1.6.Final Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.1.3.Final to 2.1.6.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.1.3.Final...2.1.6.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ca8d30488..1224ebf23 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ 1.11.9 1.3.1 1.1.0.Final - 2.1.3.Final + 2.1.6.Final 1.26 3.4.0 From 40e0127e86a188363d5f7f1d6ed84ab07289eae7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Jun 2021 22:03:45 +0000 Subject: [PATCH 713/730] Bump snakeyaml from 1.17 to 1.26 in /legacy-testapp Bumps [snakeyaml](https://bitbucket.org/asomov/snakeyaml) from 1.17 to 1.26. - [Commits](https://bitbucket.org/asomov/snakeyaml/branches/compare/snakeyaml-1.26..v1.17) --- updated-dependencies: - dependency-name: org.yaml:snakeyaml dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- legacy-testapp/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 336b6a7c4..1036b988a 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -210,7 +210,7 @@ org.yaml snakeyaml - 1.17 + 1.26 From 0fbe8fc722cb207a819630b150e22a37db06e253 Mon Sep 17 00:00:00 2001 From: Jonathan Leitschuh Date: Sat, 19 Nov 2022 02:07:53 +0000 Subject: [PATCH 714/730] vuln-fix: Temporary File Information Disclosure This fixes temporary file information disclosure vulnerability due to the use of the vulnerable `File.createTempFile()` method. The vulnerability is fixed by using the `Files.createTempFile()` method which sets the correct posix permissions. Weakness: CWE-377: Insecure Temporary File Severity: Medium CVSSS: 5.5 Detection: CodeQL & OpenRewrite (https://public.moderne.io/recipes/org.openrewrite.java.security.SecureTempFileCreation) Reported-by: Jonathan Leitschuh Signed-off-by: Jonathan Leitschuh Bug-tracker: https://github.com/JLLeitschuh/security-research/issues/18 Co-authored-by: Moderne --- src/main/java/act/app/AppClassLoader.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index 67afa07c4..d1a841b45 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -51,6 +51,7 @@ import java.io.*; import java.lang.annotation.Annotation; import java.net.*; +import java.nio.file.Files; import java.util.*; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; @@ -514,7 +515,7 @@ private Class loadAppClass(String name, boolean resolve) throws ClassNotFound } return c; } catch (VerifyError e) { - File f = File.createTempFile(name, ".class"); + File f = Files.createTempFile(name, ".class").toFile(); IO.write(baNew, f); throw e; } From 686e89eacfe8872a5a8557a3c36965cc492147e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Sep 2022 03:35:09 +0000 Subject: [PATCH 715/730] Bump snakeyaml from 1.26 to 1.31 Bumps [snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) from 1.26 to 1.31. - [Commits](https://bitbucket.org/snakeyaml/snakeyaml/branches/compare/snakeyaml-1.31..snakeyaml-1.26) --- updated-dependencies: - dependency-name: org.yaml:snakeyaml dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1224ebf23..4c2e8a436 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 1.3.1 1.1.0.Final 2.1.6.Final - 1.26 + 1.31 3.4.0 From 92001dda8cd0890c00b7ac36d4aee844a432e5a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Sep 2022 03:35:07 +0000 Subject: [PATCH 716/730] Bump snakeyaml from 1.26 to 1.31 in /legacy-testapp Bumps [snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) from 1.26 to 1.31. - [Commits](https://bitbucket.org/snakeyaml/snakeyaml/branches/compare/snakeyaml-1.31..snakeyaml-1.26) --- updated-dependencies: - dependency-name: org.yaml:snakeyaml dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- legacy-testapp/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 1036b988a..9c9ea1402 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -210,7 +210,7 @@ org.yaml snakeyaml - 1.26 + 1.31 From 8d51b646b4fbd5ccc18cf86309bfb3ad2cad3f9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Sep 2022 22:58:09 +0000 Subject: [PATCH 717/730] Bump jsoup from 1.14.2 to 1.15.3 Bumps [jsoup](https://github.com/jhy/jsoup) from 1.14.2 to 1.15.3. - [Release notes](https://github.com/jhy/jsoup/releases) - [Changelog](https://github.com/jhy/jsoup/blob/master/CHANGES) - [Commits](https://github.com/jhy/jsoup/compare/jsoup-1.14.2...jsoup-1.15.3) --- updated-dependencies: - dependency-name: org.jsoup:jsoup dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4c2e8a436..761ff2c70 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ 2.14.6 1.0.0.Final 2.10.6 - 1.14.2 + 1.15.3 4.7.2 From b922637aebb182ff09a5365f4be4cf84e84bfd99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Nov 2022 20:21:28 +0000 Subject: [PATCH 718/730] Bump undertow-core from 2.1.6.Final to 2.2.19.Final Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.1.6.Final to 2.2.19.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.1.6.Final...2.2.19.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 761ff2c70..bdc0a86c9 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ 1.11.9 1.3.1 1.1.0.Final - 2.1.6.Final + 2.2.19.Final 1.31 3.4.0 From 1b50ebd45227076306187bdab762742631f95219 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 01:46:09 +0000 Subject: [PATCH 719/730] Bump fastjson from 1.2.75 to 1.2.83 Bumps [fastjson](https://github.com/alibaba/fastjson) from 1.2.75 to 1.2.83. - [Release notes](https://github.com/alibaba/fastjson/releases) - [Commits](https://github.com/alibaba/fastjson/compare/1.2.75...1.2.83) --- updated-dependencies: - dependency-name: com.alibaba:fastjson dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bdc0a86c9..1062be863 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2 1.3.3 3.22.0 - 1.2.75 + 1.2.83 1.1.2 0.7 1.18 From ce255015ecf11d2409a5f07a0acd93f3d780aac9 Mon Sep 17 00:00:00 2001 From: Benstone Zhang Date: Mon, 10 May 2021 19:45:36 +0800 Subject: [PATCH 720/730] fix #1392: GetTimeTest failed for non-english locale Default DateTime formats are only for english locale. --- src/main/java/act/test/verifier/DateTimeVerifier.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/act/test/verifier/DateTimeVerifier.java b/src/main/java/act/test/verifier/DateTimeVerifier.java index 87a85c3ca..2ea835221 100644 --- a/src/main/java/act/test/verifier/DateTimeVerifier.java +++ b/src/main/java/act/test/verifier/DateTimeVerifier.java @@ -31,6 +31,7 @@ import java.text.DateFormat; import java.util.Date; +import java.util.Locale; public abstract class DateTimeVerifier extends Verifier { @@ -112,12 +113,12 @@ private static Long tryWithFormat(String s, String pattern, String... otherPatte if (null != l) { return l; } - l = tryWithFormat(s, DateTimeFormat.forPattern(pattern)); + l = tryWithFormat(s, DateTimeFormat.forPattern(pattern).withLocale(Locale.ENGLISH)); if (null != l) { return l; } for (String op : otherPatterns) { - l = tryWithFormat(s, DateTimeFormat.forPattern(op)); + l = tryWithFormat(s, DateTimeFormat.forPattern(op).withLocale(Locale.ENGLISH)); if (null != l) { return l; } From 3745329d4274e62c6997a09ece3356a49ef60d32 Mon Sep 17 00:00:00 2001 From: Benstone Zhang Date: Mon, 10 May 2021 19:08:34 +0800 Subject: [PATCH 721/730] fix bug of url.context not show in e404 page Make act.route.Router.ensureUrlContext as public, then we can patch the path string in e404 template. --- src/main/java/act/route/Router.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/act/route/Router.java b/src/main/java/act/route/Router.java index a099c4b41..0f91867a2 100644 --- a/src/main/java/act/route/Router.java +++ b/src/main/java/act/route/Router.java @@ -620,7 +620,7 @@ public String urlBase(ActionContext context) { } } - private String ensureUrlContext(String path) { + public String ensureUrlContext(String path) { String urlContext = appConfig.urlContext(); if (null == urlContext || path.startsWith(urlContext)) { if ("/".equals(path)) { From 0f802d3fa0157c554bec0840cbdeadb7a7b2ea9e Mon Sep 17 00:00:00 2001 From: Benstone Zhang Date: Mon, 10 May 2021 19:11:30 +0800 Subject: [PATCH 722/730] fix bug of url.context not show in e404 page add url.context prefix to all path --- src/main/resources/rythm/error/dev/e404.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/resources/rythm/error/dev/e404.html b/src/main/resources/rythm/error/dev/e404.html index 74a20bd07..a0bea81f5 100644 --- a/src/main/resources/rythm/error/dev/e404.html +++ b/src/main/resources/rythm/error/dev/e404.html @@ -54,10 +54,13 @@ @r.method() + @{ + String path = _action.router().ensureUrlContext(r.path()); + } @if (r.method() == "GET") { - @r.path() + @path } else { - @r.path() + @path } @r.compactHandler() From 3231c87ea8dc33484b705ceee22390c879f58ebb Mon Sep 17 00:00:00 2001 From: benstone Date: Tue, 11 May 2021 15:15:49 +0800 Subject: [PATCH 723/730] update title of td to make all the paths are consistent --- src/main/resources/rythm/error/dev/e404.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/rythm/error/dev/e404.html b/src/main/resources/rythm/error/dev/e404.html index a0bea81f5..e38875eec 100644 --- a/src/main/resources/rythm/error/dev/e404.html +++ b/src/main/resources/rythm/error/dev/e404.html @@ -53,10 +53,10 @@ @def tr(RouteInfo r, String parity) { @r.method() - - @{ - String path = _action.router().ensureUrlContext(r.path()); - } + @{ + String path = _action.router().ensureUrlContext(r.path()); + } + @if (r.method() == "GET") { @path } else { From 716a67d0b6b33c6f6b47ed303eab40b0ea9560ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Oct 2020 10:38:04 +0000 Subject: [PATCH 724/730] Bump junit from 4.11 to 4.13.1 in /legacy-testapp Bumps [junit](https://github.com/junit-team/junit4) from 4.11 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.11.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.11...r4.13.1) Signed-off-by: dependabot[bot] --- legacy-testapp/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 9c9ea1402..39ebf2069 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -178,7 +178,7 @@ junit junit - 4.11 + 4.13.1 test From 881214acf15d4e2329ae81a28fd7d1525159db5f Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 26 Nov 2022 13:35:24 +1100 Subject: [PATCH 725/730] fix #1427, #1407, #1399 --- CHANGELOG.md | 3 ++ README.md | 2 +- legacy-testapp/pom.xml | 2 +- legacy-testapp/run.sh | 2 +- pom.xml | 4 +-- src/main/java/act/apidoc/Endpoint.java | 20 ++++++++++--- src/main/java/act/app/AppClassLoader.java | 3 +- .../meta/InterceptorMethodMetaInfo.java | 5 ++-- src/main/java/act/test/RequestBuilder.java | 2 +- src/main/java/act/test/TestSession.java | 3 +- .../xio/undertow/UndertowCookieAdaptor.java | 27 +++++++++++++++++ testapps/GHIssues/pom.xml | 10 ------- .../src/main/java/ghissues/Gh1407.java | 30 +++++++++++++++++++ .../src/main/java/ghissues/gh532/Foo.java | 7 +++++ .../main/java/ghissues/gh532/FooService.java | 12 ++++++++ .../src/test/resources/scenarios/1407.yml | 8 +++++ 16 files changed, 114 insertions(+), 26 deletions(-) create mode 100644 testapps/GHIssues/src/main/java/ghissues/Gh1407.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh532/Foo.java create mode 100644 testapps/GHIssues/src/main/java/ghissues/gh532/FooService.java create mode 100644 testapps/GHIssues/src/test/resources/scenarios/1407.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 22188c973..72727dccd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # ActFramework Change Log **1.9.2** +* Act-test: It shall not prepend url context when specified url starts from `http` #1427 +* packaging project stuck when ehcache has been added into project dependency #1399 +* @Before priority BUG #1407 * Add "The Wall of Coding Wisdoms" into default Zen list #1388 * Response content type get overridden - case 2 #1387 * Response content type get overridden #1386 diff --git a/README.md b/README.md index 30433616a..a91dde081 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId - **[Powerful view architecture with multiple render engine support](http://actframework.org/doc/templating.md)** -- **[An unbelievable automate testing framework that never presented in any other MVC frameworks](https://thinking.studio/blog/declarative-testing-with-act-framework/)** +- **[An unbelievable automate testing framework that never presented in any other MVC frameworks](https://www.youtube.com/watch?v=_UyfsdY4pSU&t=783s)** - **Commonly used tools** diff --git a/legacy-testapp/pom.xml b/legacy-testapp/pom.xml index 39ebf2069..3f646430e 100644 --- a/legacy-testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -75,7 +75,7 @@ UTF-8 UTF-8 - 1.9.1-SNAPSHOT + 1.9.2-SNAPSHOT [0.16.0, 2.0.0) 1.10.0 testapp.TestApp diff --git a/legacy-testapp/run.sh b/legacy-testapp/run.sh index aadf7eecf..12820c4b8 100755 --- a/legacy-testapp/run.sh +++ b/legacy-testapp/run.sh @@ -1,5 +1,5 @@ #!/bin/sh -mvn2 clean package +mvn -Dmaven.test.skip=true clean package cd target/dist unzip *.zip ./start & diff --git a/pom.xml b/pom.xml index 1062be863..dbaac77d6 100644 --- a/pom.xml +++ b/pom.xml @@ -68,8 +68,8 @@ 4.7.2 - 1.26.2 - 1.8.1 + 1.30.0 + 1.8.2 1.13.2 1.13.4 1.13.3 diff --git a/src/main/java/act/apidoc/Endpoint.java b/src/main/java/act/apidoc/Endpoint.java index bbadd9fb4..529254785 100644 --- a/src/main/java/act/apidoc/Endpoint.java +++ b/src/main/java/act/apidoc/Endpoint.java @@ -467,7 +467,7 @@ private void explore(RequestHandler handler) { } catch (Exception e) { // so we don't have an overwritten method, that's fine, just ignore the exception } - Map typeParamLookup = C.Map(); + Map typeParamLookup = C.newMap(); if (controllerClass.getGenericSuperclass() instanceof ParameterizedType) { typeParamLookup = Generics.buildTypeParamImplLookup(controllerClass); } @@ -528,9 +528,13 @@ private void exploreParamInfo(Method method, Map typeParamLookup, sample = resolver.resolve(info.defaultValue, info.beanSpec.rawType()); } if (H.Method.GET == this.httpMethod) { - String query = generateSampleQuery(info.beanSpec.withoutName(), typeParamLookup, info.bindName, new HashSet(), C.newList()); - if (S.notBlank(query)) { - sampleQuery.add(query); + try { + String query = generateSampleQuery(info.beanSpec.withoutName(), typeParamLookup, info.bindName, new HashSet(), C.newList()); + if (S.notBlank(query)) { + sampleQuery.add(query); + } + } catch (Exception e) { + LOGGER.warn("error generating sample query for method: %s", info.beanSpec); } } else { sampleData.put(info.bindName, sample); @@ -642,6 +646,8 @@ private String generateSampleJson(BeanSpec spec, Map typeParamLoo private String generateSampleQuery(BeanSpec spec, Map typeParamLookup, String bindName, Set typeChain, List nameChain) { Class type = spec.rawType(); + typeParamLookup = new HashMap<>(typeParamLookup); + Generics.buildTypeParamImplLookup(type, typeParamLookup); String specName = spec.name(); if (S.notBlank(specName)) { nameChain.add(specName); @@ -776,6 +782,12 @@ public static Object generateSampleData( return o; } Class classType = spec.rawType(); + if (type instanceof ParameterizedType) { + ParameterizedType ptype = (ParameterizedType) type; + Type[] actualTypeArguments = ptype.getActualTypeArguments(); + TypeVariable[] typeVariables = classType.getTypeParameters(); + Generics.buildTypeParamImplLookup("", actualTypeArguments, typeVariables, typeParamLookup); + } SampleDataProviderManager sampleDataProviderManager = Act.getInstance(SampleDataProviderManager.class); SampleData.Category anno = spec.getAnnotation(SampleData.Category.class); SampleDataCategory category = null != anno ? anno.value() : null; diff --git a/src/main/java/act/app/AppClassLoader.java b/src/main/java/act/app/AppClassLoader.java index d1a841b45..0daa65919 100644 --- a/src/main/java/act/app/AppClassLoader.java +++ b/src/main/java/act/app/AppClassLoader.java @@ -51,7 +51,6 @@ import java.io.*; import java.lang.annotation.Annotation; import java.net.*; -import java.nio.file.Files; import java.util.*; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; @@ -515,7 +514,7 @@ private Class loadAppClass(String name, boolean resolve) throws ClassNotFound } return c; } catch (VerifyError e) { - File f = Files.createTempFile(name, ".class").toFile(); + File f = java.nio.file.Files.createTempFile(name, ".class").toFile(); IO.write(baNew, f); throw e; } diff --git a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java index d80a9762e..2ccefedc3 100644 --- a/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java +++ b/src/main/java/act/controller/meta/InterceptorMethodMetaInfo.java @@ -22,6 +22,7 @@ import act.Constants; import act.handler.builtin.controller.Handler; +import org.osgl.mvc.annotation.Before; import org.osgl.util.C; import org.osgl.util.S; @@ -35,7 +36,7 @@ public class InterceptorMethodMetaInfo extends HandlerMethodMetaInfo whiteList = C.newSet(); private Set blackList = C.newSet(); - private Integer priority; + private int priority = 0; protected InterceptorMethodMetaInfo(InterceptorMethodMetaInfo copy, ControllerClassMetaInfo clsInfo) { super(copy, clsInfo); @@ -119,7 +120,7 @@ public String toString() { @Override protected S.Buffer toStrBuffer(S.Buffer sb) { S.Buffer prependix = S.newBuffer(); - if (null != priority) { + if (0 != priority) { prependix.append("p[") .append(priority).append("] "); } diff --git a/src/main/java/act/test/RequestBuilder.java b/src/main/java/act/test/RequestBuilder.java index 3cdcf3bf0..f7f813da4 100644 --- a/src/main/java/act/test/RequestBuilder.java +++ b/src/main/java/act/test/RequestBuilder.java @@ -100,7 +100,7 @@ class RequestBuilder { } String reqUrl = requestSpec.url; if (null != session) { - if (S.notBlank(session.scenario().urlContext) && !reqUrl.startsWith("/")) { + if (S.notBlank(session.scenario().urlContext) && !reqUrl.startsWith("/") && !reqUrl.startsWith("http")) { reqUrl = S.pathConcat(session.scenario().urlContext, '/', reqUrl); } } diff --git a/src/main/java/act/test/TestSession.java b/src/main/java/act/test/TestSession.java index 9f19c7786..918c27b62 100644 --- a/src/main/java/act/test/TestSession.java +++ b/src/main/java/act/test/TestSession.java @@ -312,9 +312,8 @@ String processStringSubstitution(String s) { buf.append(getVal(key, payload)); } n = s.indexOf("${", a); - a++; if (n < 0) { - buf.append(s.substring(a)); + buf.append(s.substring(a + 1)); return buf.toString(); } z = n; diff --git a/src/main/java/act/xio/undertow/UndertowCookieAdaptor.java b/src/main/java/act/xio/undertow/UndertowCookieAdaptor.java index 9d6ddb677..227c5f0a7 100644 --- a/src/main/java/act/xio/undertow/UndertowCookieAdaptor.java +++ b/src/main/java/act/xio/undertow/UndertowCookieAdaptor.java @@ -150,4 +150,31 @@ public Cookie setComment(String comment) { hc.comment(comment); return this; } + + // TODO - remove this method when we moved to Java 8 + @Override + public int compareTo(final Object other) { + final Cookie o = (Cookie) other; + int retVal = 0; + + // compare names + if (getName() == null && o.getName() != null) return -1; + if (getName() != null && o.getName() == null) return 1; + retVal = (getName() == null && o.getName() == null) ? 0 : getName().compareTo(o.getName()); + if (retVal != 0) return retVal; + + // compare paths + if (getPath() == null && o.getPath() != null) return -1; + if (getPath() != null && o.getPath() == null) return 1; + retVal = (getPath() == null && o.getPath() == null) ? 0 : getPath().compareTo(o.getPath()); + if (retVal != 0) return retVal; + + // compare domains + if (getDomain() == null && o.getDomain() != null) return -1; + if (getDomain() != null && o.getDomain() == null) return 1; + retVal = (getDomain() == null && o.getDomain() == null) ? 0 : getDomain().compareTo(o.getDomain()); + if (retVal != 0) return retVal; + + return 0; // equal + } } diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml index ac0551c40..d9ba8cb88 100644 --- a/testapps/GHIssues/pom.xml +++ b/testapps/GHIssues/pom.xml @@ -22,16 +22,6 @@ - - org.osgl - osgl-tool - 1.26.2 - - - org.osgl - aaa-core - 1.10.0 - org.actframework act diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1407.java b/testapps/GHIssues/src/main/java/ghissues/Gh1407.java new file mode 100644 index 000000000..2c34df78e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1407.java @@ -0,0 +1,30 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.Before; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1407") +public class Gh1407 extends BaseController { + + @Before + public String before0() { + return "before0"; + } + + @Before(priority = -1) + public String before1() { + return "before1"; + } + + @Before(priority = 1) + public String before2() { + return "before2"; + } + + @GetAction + public String service() { + return "service"; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh532/Foo.java b/testapps/GHIssues/src/main/java/ghissues/gh532/Foo.java new file mode 100644 index 000000000..29bf8b152 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh532/Foo.java @@ -0,0 +1,7 @@ +package ghissues.gh532; + +import java.util.List; + +public class Foo { + public List items; +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh532/FooService.java b/testapps/GHIssues/src/main/java/ghissues/gh532/FooService.java new file mode 100644 index 000000000..27be2f294 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh532/FooService.java @@ -0,0 +1,12 @@ +package ghissues.gh532; + +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("532") +public class FooService extends BaseController { + @GetAction + public void test(Foo foo) { + } +} diff --git a/testapps/GHIssues/src/test/resources/scenarios/1407.yml b/testapps/GHIssues/src/test/resources/scenarios/1407.yml new file mode 100644 index 000000000..5945d9f23 --- /dev/null +++ b/testapps/GHIssues/src/test/resources/scenarios/1407.yml @@ -0,0 +1,8 @@ +Scenario(1407): + description: "@Before priority BUG" + interactions: + - description: test + request: + get: 1407 + response: + result: before1 From 4503c8a08753bb39575673a9d79d6b24aeaaa80a Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 26 Nov 2022 13:38:45 +1100 Subject: [PATCH 726/730] update CHANGELOG for 1.9.2 --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72727dccd..d199ba896 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ **1.9.2** * Act-test: It shall not prepend url context when specified url starts from `http` #1427 +* 716a67d0 2020-10-13 | Bump junit from 4.11 to 4.13.1 in /legacy-testapp [dependabot[bot]] +* 3231c87e 2021-05-11 | update title of td to make all the paths are consistent [benstone] +* 3745329d 2021-05-10 | fix bug of url.context not show in e404 page [Benstone Zhang] +* ce255015 2021-05-10 | fix #1392: GetTimeTest failed for non-english locale [Benstone Zhang] +* 1b50ebd4 2022-06-17 | Bump fastjson from 1.2.75 to 1.2.83 [dependabot[bot]] +* b922637a 2022-11-25 | Bump undertow-core from 2.1.6.Final to 2.2.19.Final [dependabot[bot]] +* 8d51b646 2022-09-01 | Bump jsoup from 1.14.2 to 1.15.3 [dependabot[bot]] +* 92001dda 2022-09-15 | Bump snakeyaml from 1.26 to 1.31 in /legacy-testapp [dependabot[bot]] +* 686e89ea 2022-09-15 | Bump snakeyaml from 1.26 to 1.31 [dependabot[bot]] +* 0fbe8fc7 2022-11-19 | vuln-fix: Temporary File Information Disclosure [Jonathan Leitschuh] +* 40e0127e 2021-06-04 | Bump snakeyaml from 1.17 to 1.26 in /legacy-testapp [dependabot[bot]] +* 032d4efe 2021-08-24 | Bump undertow-core from 2.1.3.Final to 2.1.6.Final [dependabot[bot]] +* 2581faa1 2021-06-28 | fix index error when process string substitution [benstone] +* f0704ecb 2021-08-23 | Bump jsoup from 1.12.1 to 1.14.2 [dependabot[bot]] * packaging project stuck when ehcache has been added into project dependency #1399 * @Before priority BUG #1407 * Add "The Wall of Coding Wisdoms" into default Zen list #1388 From c4fe6d1b00ad0c5c81f62122e94dd090c761a288 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 26 Nov 2022 14:25:43 +1100 Subject: [PATCH 727/730] [maven-release-plugin] prepare release act-1.9.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dbaac77d6..f78117b31 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.9.2-SNAPSHOT + 1.9.2 ACT Framework The ACT full stack MVC framework From bdc2ada4bb730dd77c38f2ca7dbeffaa38f52903 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 26 Nov 2022 14:25:49 +1100 Subject: [PATCH 728/730] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f78117b31..ab3ee4f18 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.9.2 + 1.9.3-SNAPSHOT ACT Framework The ACT full stack MVC framework From 8d3e1334a9b8564337a6f785f703bb50aaedb9a5 Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 26 Nov 2022 14:50:43 +1100 Subject: [PATCH 729/730] merge from 1.9 --- README.md | 4 ++-- src/main/java/act/test/TestSession.java | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0572976eb..133551e0d 100644 --- a/README.md +++ b/README.md @@ -10,14 +10,14 @@ ## Install -Add `act-starter-parent` into into your pom.xml file +Add `act-starter-parent` into your pom.xml file ```xml org.actframework act-starter-parent 1.9.1.0 - A + ``` Or use maven archetype to start a new project: diff --git a/src/main/java/act/test/TestSession.java b/src/main/java/act/test/TestSession.java index 9f19c7786..918c27b62 100644 --- a/src/main/java/act/test/TestSession.java +++ b/src/main/java/act/test/TestSession.java @@ -312,9 +312,8 @@ String processStringSubstitution(String s) { buf.append(getVal(key, payload)); } n = s.indexOf("${", a); - a++; if (n < 0) { - buf.append(s.substring(a)); + buf.append(s.substring(a + 1)); return buf.toString(); } z = n; From b3a0b97f4354054bbe6d71d29eaadb5cf483dc3b Mon Sep 17 00:00:00 2001 From: Gelin Luo Date: Sat, 26 Nov 2022 17:30:33 +1100 Subject: [PATCH 730/730] Update README for act-1.9.2 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 133551e0d..4fe0c13eb 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Add `act-starter-parent` into your pom.xml file org.actframework act-starter-parent - 1.9.1.0 + 1.9.2.0 ``` @@ -28,13 +28,13 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.9.1.0 + -DarchetypeVersion=1.9.2.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.9.1.0 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.9.2.0 ``` **Note** There are more ActFramework application archetypes for use. Please get them [here](ARCHETYPES.md).